Forward DelegatingStream.typed to Stream.cast (#54)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8f4d63..0807821 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.6
+
+* Add further support for Dart 2.0 library changes to `Stream`.
+
 ## 2.0.5
 
 * Fix Dart 2.0 [runtime cast errors][sdk#27223] in `StreamQueue`.
diff --git a/lib/src/delegate/stream.dart b/lib/src/delegate/stream.dart
index d08b4ab..116d11f 100644
--- a/lib/src/delegate/stream.dart
+++ b/lib/src/delegate/stream.dart
@@ -4,8 +4,6 @@
 
 import 'dart:async';
 
-import '../typed/stream.dart';
-
 /// Simple delegating wrapper around a [Stream].
 ///
 /// Subclasses can override individual methods, or use this to expose only the
@@ -23,6 +21,5 @@
   /// original generic type, by asserting that its events are instances of `T`
   /// whenever they're provided. If they're not, the stream throws a
   /// [CastError].
-  static Stream<T> typed<T>(Stream stream) =>
-      stream is Stream<T> ? stream : new TypeSafeStream<T>(stream);
+  static Stream<T> typed<T>(Stream stream) => stream.cast();
 }
diff --git a/lib/src/typed/stream.dart b/lib/src/typed/stream.dart
deleted file mode 100644
index b3b0513..0000000
--- a/lib/src/typed/stream.dart
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:collection/collection.dart';
-
-import '../utils.dart';
-import 'stream_subscription.dart';
-import '../delegate/event_sink.dart';
-
-class TypeSafeStream<T> extends Stream<T> {
-  final Stream _stream;
-
-  Future<T> get first async => (await _stream.first) as T;
-  Future<T> get last async => (await _stream.last) as T;
-  Future<T> get single async => (await _stream.single) as T;
-
-  bool get isBroadcast => _stream.isBroadcast;
-  Future<bool> get isEmpty => _stream.isEmpty;
-  Future<int> get length => _stream.length;
-
-  TypeSafeStream(this._stream);
-
-  Stream<T> asBroadcastStream(
-      {void onListen(StreamSubscription<T> subscription),
-      void onCancel(StreamSubscription<T> subscription)}) {
-    return new TypeSafeStream<T>(_stream.asBroadcastStream(
-        onListen: onListen == null
-            ? null
-            : (subscription) =>
-                onListen(new TypeSafeStreamSubscription<T>(subscription)),
-        onCancel: onCancel == null
-            ? null
-            : (subscription) =>
-                onCancel(new TypeSafeStreamSubscription<T>(subscription))));
-  }
-
-  Stream<E> asyncExpand<E>(Stream<E> convert(T event)) =>
-      _stream.asyncExpand(_validateType(convert));
-
-  Stream<E> asyncMap<E>(convert(T event)) =>
-      _stream.asyncMap(_validateType(convert));
-
-  Stream<T> distinct([bool equals(T previous, T next)]) =>
-      new TypeSafeStream<T>(_stream.distinct(equals == null
-          ? null
-          : (previous, next) => equals(previous as T, next as T)));
-
-  Future<E> drain<E>([E futureValue]) => _stream.drain(futureValue);
-
-  Stream<S> expand<S>(Iterable<S> convert(T value)) =>
-      _stream.expand(_validateType(convert));
-
-  Future<T> firstWhere(bool test(T element),
-          {Object defaultValue(), T orElse()}) =>
-      _stream.firstWhere(_validateType(test),
-          defaultValue: defaultValue, orElse: orElse);
-
-  Future<T> lastWhere(bool test(T element),
-          {Object defaultValue(), T orElse()}) =>
-      _stream.lastWhere(_validateType(test),
-          defaultValue: defaultValue, orElse: orElse);
-
-  Future<T> singleWhere(bool test(T element), {T orElse()}) async =>
-      await _stream.singleWhere(_validateType(test), orElse: orElse);
-
-  Future<S> fold<S>(S initialValue, S combine(S previous, T element)) =>
-      _stream.fold(
-          initialValue, (previous, element) => combine(previous, element as T));
-
-  Future forEach(void action(T element)) =>
-      _stream.forEach(_validateType(action));
-
-  Stream<T> handleError(Function onError, {bool test(error)}) =>
-      new TypeSafeStream<T>(_stream.handleError(onError, test: test));
-
-  StreamSubscription<T> listen(void onData(T value),
-          {Function onError, void onDone(), bool cancelOnError}) =>
-      new TypeSafeStreamSubscription<T>(_stream.listen(_validateType(onData),
-          onError: onError, onDone: onDone, cancelOnError: cancelOnError));
-
-  Stream<S> map<S>(S convert(T event)) => _stream.map(_validateType(convert));
-
-  // Don't forward to `_stream.pipe` because we want the consumer to see the
-  // type-asserted stream.
-  Future pipe(StreamConsumer<T> consumer) =>
-      consumer.addStream(this).then((_) => consumer.close());
-
-  Future<T> reduce(T combine(T previous, T element)) async {
-    var result = await _stream
-        .reduce((previous, element) => combine(previous as T, element as T));
-    return result as T;
-  }
-
-  Stream<T> skipWhile(bool test(T element)) =>
-      new TypeSafeStream<T>(_stream.skipWhile(_validateType(test)));
-
-  Stream<T> takeWhile(bool test(T element)) =>
-      new TypeSafeStream<T>(_stream.takeWhile(_validateType(test)));
-
-  Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)}) =>
-      new TypeSafeStream<T>(_stream.timeout(timeLimit,
-          onTimeout: (sink) => onTimeout(DelegatingEventSink.typed(sink))));
-
-  Future<List<T>> toList() async =>
-      DelegatingList.typed<T>(await _stream.toList());
-
-  Future<Set<T>> toSet() async => DelegatingSet.typed<T>(await _stream.toSet());
-
-  // Don't forward to `_stream.transform` because we want the transformer to see
-  // the type-asserted stream.
-  Stream<S> transform<S>(StreamTransformer<T, S> transformer) =>
-      transformer.bind(this);
-
-  Stream<T> where(bool test(T element)) =>
-      new TypeSafeStream<T>(_stream.where(_validateType(test)));
-
-  Future<bool> every(bool test(T element)) =>
-      _stream.every(_validateType(test));
-
-  Future<bool> any(bool test(T element)) => _stream.any(_validateType(test));
-  Stream<T> skip(int count) => new TypeSafeStream<T>(_stream.skip(count));
-  Stream<T> take(int count) => new TypeSafeStream<T>(_stream.take(count));
-  Future<T> elementAt(int index) async => (await _stream.elementAt(index)) as T;
-  Future<bool> contains(Object needle) => _stream.contains(needle);
-  Future<String> join([String separator = ""]) => _stream.join(separator);
-  String toString() => _stream.toString();
-
-  /// Returns a version of [function] that asserts that its argument is an
-  /// instance of `T`.
-  UnaryFunction<dynamic, S> _validateType<S>(S function(T value)) =>
-      function == null ? null : (value) => function(value as T);
-}
diff --git a/pubspec.yaml b/pubspec.yaml
index e163e4c..e8dafaa 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: async
-version: 2.0.5
+version: 2.0.6
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:async' library.
 homepage: https://www.github.com/dart-lang/async
diff --git a/test/typed_wrapper/stream_test.dart b/test/typed_wrapper/stream_test.dart
deleted file mode 100644
index 61d3ff4..0000000
--- a/test/typed_wrapper/stream_test.dart
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@Skip("Re-enable this when test can run DDC (test#414).")
-
-import 'dart:async';
-
-import "package:async/src/typed/stream.dart";
-import "package:test/test.dart";
-
-import '../utils.dart';
-
-void main() {
-  group("with valid types, forwards", () {
-    var controller;
-    var wrapper;
-    var emptyWrapper;
-    var singleWrapper;
-    var errorWrapper;
-    setUp(() {
-      controller = new StreamController<Object>()
-        ..add(1)
-        ..add(2)
-        ..add(3)
-        ..add(4)
-        ..add(5)
-        ..close();
-
-      // TODO(nweiz): Use public methods when test#414 is fixed and we can run
-      // this on DDC.
-      wrapper = new TypeSafeStream<int>(controller.stream);
-      emptyWrapper = new TypeSafeStream<int>(new Stream<Object>.empty());
-      singleWrapper =
-          new TypeSafeStream<int>(new Stream<Object>.fromIterable([1]));
-      errorWrapper = new TypeSafeStream<int>(
-          new Stream<Object>.fromFuture(new Future.error("oh no")));
-    });
-
-    test("first", () {
-      expect(wrapper.first, completion(equals(1)));
-      expect(emptyWrapper.first, throwsStateError);
-    });
-
-    test("last", () {
-      expect(wrapper.last, completion(equals(5)));
-      expect(emptyWrapper.last, throwsStateError);
-    });
-
-    test("single", () {
-      expect(wrapper.single, throwsStateError);
-      expect(singleWrapper.single, completion(equals(1)));
-    });
-
-    test("isBroadcast", () {
-      expect(wrapper.isBroadcast, isFalse);
-      var broadcastWrapper = new TypeSafeStream<int>(
-          new Stream<Object>.empty().asBroadcastStream());
-      expect(broadcastWrapper.isBroadcast, isTrue);
-    });
-
-    test("isEmpty", () {
-      expect(wrapper.isEmpty, completion(isFalse));
-      expect(emptyWrapper.isEmpty, completion(isTrue));
-    });
-
-    test("length", () {
-      expect(wrapper.length, completion(equals(5)));
-      expect(emptyWrapper.length, completion(equals(0)));
-    });
-
-    group("asBroadcastStream()", () {
-      test("with no parameters", () {
-        var broadcast = wrapper.asBroadcastStream();
-        expect(broadcast.toList(), completion(equals([1, 2, 3, 4, 5])));
-        expect(broadcast.toList(), completion(equals([1, 2, 3, 4, 5])));
-      });
-
-      test("with onListen", () {
-        var broadcast =
-            wrapper.asBroadcastStream(onListen: expectAsync1((subscription) {
-          expect(subscription, new isInstanceOf<StreamSubscription<int>>());
-          subscription.pause();
-        }));
-
-        broadcast.listen(null);
-        expect(controller.isPaused, isTrue);
-      });
-
-      test("with onCancel", () {
-        var broadcast =
-            wrapper.asBroadcastStream(onCancel: expectAsync1((subscription) {
-          expect(subscription, new isInstanceOf<StreamSubscription<int>>());
-          subscription.pause();
-        }));
-
-        broadcast.listen(null).cancel();
-        expect(controller.isPaused, isTrue);
-      });
-    });
-
-    test("asyncExpand()", () {
-      expect(
-          wrapper.asyncExpand((i) => new Stream.fromIterable([i, i])).toList(),
-          completion(equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])));
-    });
-
-    test("asyncMap()", () {
-      expect(wrapper.asyncMap((i) => new Future.value(i * 2)).toList(),
-          completion(equals([2, 4, 6, 8, 10])));
-    });
-
-    group("distinct()", () {
-      test("without equals", () {
-        expect(
-            wrapper.distinct().toList(), completion(equals([1, 2, 3, 4, 5])));
-
-        expect(
-            new TypeSafeStream<int>(
-                    new Stream<Object>.fromIterable([1, 1, 2, 2, 3, 3]))
-                .distinct()
-                .toList(),
-            completion(equals([1, 2, 3])));
-      });
-
-      test("with equals", () {
-        expect(wrapper.distinct((i1, i2) => (i1 ~/ 2 == i2 ~/ 2)).toList(),
-            completion(equals([1, 2, 4])));
-      });
-    });
-
-    group("drain()", () {
-      test("without a value", () {
-        expect(wrapper.drain(), completes);
-        expect(() => wrapper.drain(), throwsStateError);
-      });
-
-      test("with a value", () {
-        expect(wrapper.drain(12), completion(equals(12)));
-      });
-    });
-
-    test("expand()", () {
-      expect(wrapper.expand((i) => [i, i]).toList(),
-          completion(equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])));
-    });
-
-    group("firstWhere()", () {
-      test("finding a value", () {
-        expect(wrapper.firstWhere((i) => i > 3), completion(equals(4)));
-      });
-
-      test("finding no value", () {
-        expect(wrapper.firstWhere((i) => i > 5), throwsStateError);
-      });
-
-      test("with a default value", () {
-        expect(wrapper.firstWhere((i) => i > 5, defaultValue: () => "value"),
-            completion(equals("value")));
-      });
-    });
-
-    group("lastWhere()", () {
-      test("finding a value", () {
-        expect(wrapper.lastWhere((i) => i < 3), completion(equals(2)));
-      });
-
-      test("finding no value", () {
-        expect(wrapper.lastWhere((i) => i > 5), throwsStateError);
-      });
-
-      test("with a default value", () {
-        expect(wrapper.lastWhere((i) => i > 5, defaultValue: () => "value"),
-            completion(equals("value")));
-      });
-    });
-
-    group("singleWhere()", () {
-      test("finding a single value", () {
-        expect(wrapper.singleWhere((i) => i == 3), completion(equals(3)));
-      });
-
-      test("finding no value", () {
-        expect(wrapper.singleWhere((i) => i == 6), throwsStateError);
-      });
-
-      test("finding multiple values", () {
-        expect(wrapper.singleWhere((i) => i.isOdd), throwsStateError);
-      });
-    });
-
-    test("fold()", () {
-      expect(wrapper.fold("foo", (previous, i) => previous + i.toString()),
-          completion(equals("foo12345")));
-    });
-
-    test("forEach()", () async {
-      emptyWrapper.forEach(expectAsync1((_) {}, count: 0));
-
-      var results = [];
-      await wrapper.forEach(results.add);
-      expect(results, equals([1, 2, 3, 4, 5]));
-    });
-
-    group("handleError()", () {
-      test("without a test", () {
-        expect(
-            errorWrapper.handleError(expectAsync1((error) {
-              expect(error, equals("oh no"));
-            })).toList(),
-            completion(isEmpty));
-      });
-
-      test("with a matching test", () {
-        expect(
-            errorWrapper.handleError(expectAsync1((error) {
-              expect(error, equals("oh no"));
-            }), test: expectAsync1((error) {
-              expect(error, equals("oh no"));
-              return true;
-            })).toList(),
-            completion(isEmpty));
-      });
-
-      test("with a matching test", () {
-        expect(
-            errorWrapper.handleError(expectAsync1((_) {}, count: 0),
-                test: expectAsync1((error) {
-              expect(error, equals("oh no"));
-              return false;
-            })).toList(),
-            throwsA("oh no"));
-      });
-    });
-
-    group("listen()", () {
-      test("with a callback", () {
-        var subscription;
-        subscription = wrapper.listen(expectAsync1((data) {
-          expect(data, equals(1));
-
-          subscription.onData(expectAsync1((data) {
-            expect(data, equals(2));
-            subscription.cancel();
-          }));
-        }));
-      });
-
-      test("with a null callback", () {
-        expect(wrapper.listen(null).asFuture(), completes);
-      });
-    });
-
-    test("map()", () {
-      expect(wrapper.map((i) => i * 2).toList(),
-          completion(equals([2, 4, 6, 8, 10])));
-    });
-
-    test("pipe()", () {
-      var consumer = new StreamController();
-      expect(wrapper.pipe(consumer), completes);
-      expect(consumer.stream.toList(), completion(equals([1, 2, 3, 4, 5])));
-    });
-
-    test("reduce()", () {
-      expect(wrapper.reduce((value, i) => value + i), completion(equals(15)));
-      expect(emptyWrapper.reduce((value, i) => value + i), throwsStateError);
-    });
-
-    test("skipWhile()", () {
-      expect(wrapper.skipWhile((i) => i < 3).toList(),
-          completion(equals([3, 4, 5])));
-    });
-
-    test("takeWhile()", () {
-      expect(
-          wrapper.takeWhile((i) => i < 3).toList(), completion(equals([1, 2])));
-    });
-
-    test("toSet()", () {
-      expect(wrapper.toSet(), completion(unorderedEquals([1, 2, 3, 4, 5])));
-      expect(
-          new TypeSafeStream<int>(
-              new Stream<Object>.fromIterable([1, 1, 2, 2, 3, 3])).toSet(),
-          completion(unorderedEquals([1, 2, 3])));
-    });
-
-    test("transform()", () {
-      var transformer = new StreamTransformer<int, String>.fromHandlers(
-          handleData: (data, sink) {
-        sink.add(data.toString());
-      });
-
-      expect(wrapper.transform(transformer).toList(),
-          completion(equals(["1", "2", "3", "4", "5"])));
-    });
-
-    test("where()", () {
-      expect(wrapper.where((i) => i.isOdd).toList(),
-          completion(equals([1, 3, 5])));
-    });
-
-    group("any()", () {
-      test("with matches", () {
-        expect(wrapper.any((i) => i > 3), completion(isTrue));
-      });
-
-      test("without matches", () {
-        expect(wrapper.any((i) => i > 5), completion(isFalse));
-      });
-    });
-
-    group("every()", () {
-      test("with all matches", () {
-        expect(wrapper.every((i) => i < 6), completion(isTrue));
-      });
-
-      test("with some non-matches", () {
-        expect(wrapper.every((i) => i > 3), completion(isFalse));
-      });
-    });
-
-    group("skip()", () {
-      test("with a valid index", () {
-        expect(wrapper.skip(3).toList(), completion(equals([4, 5])));
-      });
-
-      test("with a longer index than length", () {
-        expect(wrapper.skip(6).toList(), completion(isEmpty));
-      });
-
-      test("with a negative index", () {
-        expect(() => wrapper.skip(-1), throwsArgumentError);
-      });
-    });
-
-    group("take()", () {
-      test("with a valid index", () {
-        expect(wrapper.take(3).toList(), completion(equals([1, 2, 3])));
-      });
-
-      test("with a longer index than length", () {
-        expect(wrapper.take(6).toList(), completion(equals([1, 2, 3, 4, 5])));
-      });
-
-      test("with a negative index", () {
-        expect(wrapper.take(-1).toList(), completion(isEmpty));
-      });
-    });
-
-    group("elementAt()", () {
-      test("with a valid index", () {
-        expect(wrapper.elementAt(3), completion(equals(4)));
-      });
-
-      test("with too high an index", () {
-        expect(wrapper.elementAt(6), throwsRangeError);
-      });
-
-      test("with a negative index", () {
-        expect(wrapper.elementAt(-1), throwsArgumentError);
-      });
-    });
-
-    group("contains()", () {
-      test("with an element", () {
-        expect(wrapper.contains(2), completion(isTrue));
-      });
-
-      test("with a non-element", () {
-        expect(wrapper.contains(6), completion(isFalse));
-      });
-
-      test("with a non-element of a different type", () {
-        expect(wrapper.contains("foo"), completion(isFalse));
-      });
-    });
-
-    group("join()", () {
-      test("without a separator", () {
-        expect(wrapper.join(), completion(equals("12345")));
-      });
-
-      test("with a separator", () {
-        expect(wrapper.join(" "), completion(equals("1 2 3 4 5")));
-      });
-    });
-
-    test("toString()", () {
-      expect(wrapper.toString(), contains("Stream"));
-    });
-  });
-
-  group("with invalid types", () {
-    var wrapper;
-    var singleWrapper;
-    setUp(() {
-      wrapper = new TypeSafeStream<int>(
-          new Stream<Object>.fromIterable(["foo", "bar", "baz"]));
-      singleWrapper =
-          new TypeSafeStream<int>(new Stream<Object>.fromIterable(["foo"]));
-    });
-
-    group("throws a CastError for", () {
-      test("first", () {
-        expect(wrapper.first, throwsCastError);
-      });
-
-      test("last", () {
-        expect(wrapper.last, throwsCastError);
-      });
-
-      test("single", () {
-        expect(singleWrapper.single, throwsCastError);
-      });
-
-      test("asBroadcastStream()", () {
-        var broadcast = wrapper.asBroadcastStream();
-        expect(broadcast.first, throwsCastError);
-      });
-
-      test("asyncExpand()", () {
-        expect(wrapper.asyncExpand(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("asyncMap()", () {
-        expect(wrapper.asyncMap(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      group("distinct()", () {
-        test("without equals", () {
-          expect(wrapper.distinct().first, throwsCastError);
-        });
-
-        test("with equals", () {
-          expect(wrapper.distinct(expectAsync2((_, __) {}, count: 0)).first,
-              throwsCastError);
-        });
-      });
-
-      test("expand()", () {
-        expect(wrapper.expand(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("firstWhere()", () {
-        expect(wrapper.firstWhere(expectAsync1((_) {}, count: 0)),
-            throwsCastError);
-      });
-
-      test("lastWhere()", () {
-        expect(
-            wrapper.lastWhere(expectAsync1((_) {}, count: 0)), throwsCastError);
-      });
-
-      test("singleWhere()", () {
-        expect(wrapper.singleWhere(expectAsync1((_) {}, count: 0)),
-            throwsCastError);
-      });
-
-      test("fold()", () {
-        expect(wrapper.fold("foo", expectAsync2((_, __) {}, count: 0)),
-            throwsCastError);
-      });
-
-      test("forEach()", () async {
-        expect(
-            wrapper.forEach(expectAsync1((_) {}, count: 0)), throwsCastError);
-      });
-
-      test("handleError()", () {
-        expect(wrapper.handleError(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("listen()", () {
-        expect(() => wrapper.take(1).listen(expectAsync1((_) {}, count: 0)),
-            throwsZonedCastError);
-      });
-
-      test("map()", () {
-        expect(
-            wrapper.map(expectAsync1((_) {}, count: 0)).first, throwsCastError);
-      });
-
-      test("reduce()", () {
-        expect(wrapper.reduce(expectAsync2((_, __) {}, count: 0)),
-            throwsCastError);
-      });
-
-      test("skipWhile()", () {
-        expect(wrapper.skipWhile(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("takeWhile()", () {
-        expect(wrapper.takeWhile(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("toList()", () async {
-        var list = await wrapper.toList();
-        expect(() => list.first, throwsCastError);
-      });
-
-      test("toSet()", () async {
-        var asSet = await wrapper.toSet();
-        expect(() => asSet.first, throwsCastError);
-      });
-
-      test("where()", () {
-        expect(wrapper.where(expectAsync1((_) {}, count: 0)).first,
-            throwsCastError);
-      });
-
-      test("any()", () {
-        expect(wrapper.any(expectAsync1((_) {}, count: 0)), throwsCastError);
-      });
-
-      test("every()", () {
-        expect(wrapper.every(expectAsync1((_) {}, count: 0)), throwsCastError);
-      });
-
-      test("skip()", () {
-        expect(wrapper.skip(1).first, throwsCastError);
-      });
-
-      test("take()", () {
-        expect(wrapper.take(1).first, throwsCastError);
-      });
-
-      test("elementAt()", () {
-        expect(wrapper.elementAt(1), throwsCastError);
-      });
-    });
-
-    group("doesn't throw a CastError for", () {
-      test("single", () {
-        expect(wrapper.single, throwsStateError);
-      });
-
-      test("length", () {
-        expect(wrapper.length, completion(equals(3)));
-      });
-
-      test("isBroadcast", () {
-        expect(wrapper.isBroadcast, isFalse);
-      });
-
-      test("isEmpty", () {
-        expect(wrapper.isEmpty, completion(isFalse));
-      });
-
-      group("drain()", () {
-        test("without a value", () {
-          expect(wrapper.drain(), completes);
-          expect(() => wrapper.drain(), throwsStateError);
-        });
-
-        test("with a value", () {
-          expect(wrapper.drain(12), completion(equals(12)));
-        });
-      });
-
-      test("skip()", () {
-        expect(() => wrapper.skip(-1), throwsArgumentError);
-      });
-
-      group("elementAt()", () {
-        test("with too high an index", () {
-          expect(wrapper.elementAt(6), throwsRangeError);
-        });
-
-        test("with a negative index", () {
-          expect(wrapper.elementAt(-1), throwsArgumentError);
-        });
-      });
-
-      group("contains()", () {
-        test("with an element", () {
-          expect(wrapper.contains("foo"), completion(isTrue));
-        });
-
-        test("with a non-element", () {
-          expect(wrapper.contains("qux"), completion(isFalse));
-        });
-
-        test("with a non-element of a different type", () {
-          expect(wrapper.contains(1), completion(isFalse));
-        });
-      });
-
-      group("join()", () {
-        test("without a separator", () {
-          expect(wrapper.join(), completion(equals("foobarbaz")));
-        });
-
-        test("with a separator", () {
-          expect(wrapper.join(" "), completion(equals("foo bar baz")));
-        });
-      });
-
-      test("toString()", () {
-        expect(wrapper.toString(), contains("Stream"));
-      });
-    });
-  });
-}