| Index: test/with_close_guarantee_test.dart
|
| diff --git a/test/with_close_guarantee_test.dart b/test/with_close_guarantee_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..caf48cf1cdc68e5ac591d1b53f9166547de4d4eb
|
| --- /dev/null
|
| +++ b/test/with_close_guarantee_test.dart
|
| @@ -0,0 +1,66 @@
|
| +// 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:async/async.dart';
|
| +import 'package:stream_channel/stream_channel.dart';
|
| +import 'package:test/test.dart';
|
| +
|
| +import 'utils.dart';
|
| +
|
| +final _delayTransformer = new StreamTransformer.fromHandlers(
|
| + handleData: (data, sink) => new Future.microtask(() => sink.add(data)),
|
| + handleDone: (sink) => new Future.microtask(() => sink.close()));
|
| +
|
| +final _delaySinkTransformer =
|
| + new StreamSinkTransformer.fromStreamTransformer(_delayTransformer);
|
| +
|
| +void main() {
|
| + var controller;
|
| + var channel;
|
| + setUp(() {
|
| + controller = new StreamChannelController();
|
| +
|
| + // Add a bunch of layers of asynchronous dispatch between the channel and
|
| + // the underlying controllers.
|
| + var stream = controller.foreign.stream;
|
| + var sink = controller.foreign.sink;
|
| + for (var i = 0; i < 10; i++) {
|
| + stream = stream.transform(_delayTransformer);
|
| + sink = _delaySinkTransformer.bind(sink);
|
| + }
|
| +
|
| + channel = new StreamChannel.withCloseGuarantee(stream, sink);
|
| + });
|
| +
|
| + test("closing the event sink causes the stream to close before it emits any "
|
| + "more events", () async {
|
| + controller.local.sink.add(1);
|
| + controller.local.sink.add(2);
|
| + controller.local.sink.add(3);
|
| +
|
| + expect(channel.stream.listen(expectAsync((event) {
|
| + if (event == 2) channel.sink.close();
|
| + }, count: 2)).asFuture(), completes);
|
| +
|
| + await pumpEventQueue();
|
| + });
|
| +
|
| + test("closing the event sink before events are emitted causes the stream to "
|
| + "close immediately", () async {
|
| + channel.sink.close();
|
| + channel.stream.listen(
|
| + expectAsync((_) {}, count: 0),
|
| + onError: expectAsync((_, __) {}, count: 0),
|
| + onDone: expectAsync(() {}));
|
| +
|
| + controller.local.sink.add(1);
|
| + controller.local.sink.add(2);
|
| + controller.local.sink.add(3);
|
| + controller.local.sink.close();
|
| +
|
| + await pumpEventQueue();
|
| + });
|
| +}
|
|
|