| // Copyright (c) 2013, 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. |
| |
| // Test the StreamSubscription.cancel return Future. |
| library stream_subscription_cancel; |
| |
| import 'dart:async'; |
| |
| import 'package:async_helper/async_minitest.dart'; |
| |
| void main() { |
| test('subscription.cancel', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| expect(controller.stream.listen(null).cancel().then((_) => done), |
| completion(equals(true))); |
| |
| Timer.run(() { |
| done = true; |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel after close', () { |
| var completer = new Completer(); |
| StreamController controller = new StreamController(onCancel: () { |
| completer.complete(); |
| return completer.future; |
| }); |
| |
| controller.close(); |
| |
| var completer2 = new Completer(); |
| var sub; |
| void onDone() { |
| sub.cancel().then(completer2.complete); |
| } |
| |
| sub = controller.stream.listen(null, onDone: onDone); |
| expect(completer.future, completes); |
| expect(completer2.future, completes); |
| }); |
| |
| test('subscription.cancel after error', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| controller.addError("error"); |
| |
| bool done = false; |
| |
| var subscription; |
| var doneCompleter = new Completer(); |
| void onError(e) { |
| subscription.cancel().then((_) => doneCompleter.complete(done)); |
| done = true; |
| completer.complete(); |
| } |
| |
| subscription = controller.stream.listen(null, onError: onError); |
| expect(doneCompleter.future, completion(equals(true))); |
| }); |
| |
| test('subscription.cancel after error (cancelOnError)', () { |
| bool called = false; |
| StreamController controller = new StreamController(onCancel: () { |
| called = true; |
| }); |
| |
| controller.addError("error"); |
| |
| var doneCompleter = new Completer(); |
| void onError(e) { |
| expect(called, equals(true)); |
| doneCompleter.complete(true); |
| } |
| |
| controller.stream.listen(null, onError: onError, cancelOnError: true); |
| expect(doneCompleter.future, completion(equals(true))); |
| }); |
| |
| test('subscription.cancel before error (cancelOnError)', () { |
| var doneCompleter = new Completer(); |
| StreamController controller = new StreamController(onCancel: () { |
| doneCompleter.complete(true); |
| }); |
| |
| controller.addError("error"); |
| |
| void onError(e) { |
| fail("onError is unexpected"); |
| } |
| |
| controller.stream |
| .listen(null, onError: onError, cancelOnError: true) |
| .cancel(); |
| expect(doneCompleter.future, completion(equals(true))); |
| }); |
| |
| test('subscription.cancel on error (cancelOnError)', () { |
| bool called = false; |
| StreamController controller = new StreamController(onCancel: () { |
| expect(called, isFalse); |
| called = true; |
| }); |
| |
| controller.addError("error"); |
| |
| var doneCompleter = new Completer(); |
| var sub; |
| void onError(e) { |
| expect(called, equals(true)); |
| sub.cancel(); |
| doneCompleter.complete(true); |
| } |
| |
| sub = controller.stream.listen(null, onError: onError, cancelOnError: true); |
| expect(doneCompleter.future, completion(equals(true))); |
| }); |
| |
| test('subscription.cancel before done', () { |
| var doneCompleter = new Completer(); |
| StreamController controller = new StreamController(onCancel: () { |
| doneCompleter.complete(true); |
| }); |
| |
| controller.close(); |
| |
| void onDone() { |
| fail("onDone is unexpected"); |
| } |
| |
| controller.stream.listen(null, onDone: onDone).cancel(); |
| expect(doneCompleter.future, completion(equals(true))); |
| }); |
| |
| test('subscription.cancel through map', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.map((x) => x).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through asyncMap', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.asyncMap((x) => x).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through asyncExpand', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.asyncExpand((x) => x).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through handleError', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.handleError((x) => x).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through skip', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.skip(1).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through take', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.take(1).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through skipWhile', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.skipWhile((x) => true).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through takeWhile', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.takeWhile((x) => true).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through timeOut', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var duration = const Duration(hours: 5); |
| var future = controller.stream.timeout(duration).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through transform', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var transformer = new StreamTransformer.fromHandlers(handleData: (x, y) {}); |
| var future = controller.stream.transform(transformer).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| |
| test('subscription.cancel through where', () { |
| var completer = new Completer(); |
| StreamController controller = |
| new StreamController(onCancel: () => completer.future); |
| |
| bool done = false; |
| var future = controller.stream.where((x) => true).listen(null).cancel(); |
| |
| expect(future.then((_) => done = true), completion(equals(true))); |
| |
| Timer.run(() { |
| expect(done, isFalse); |
| completer.complete(); |
| }); |
| }); |
| } |