| import 'dart:async'; | |
| import 'common/test_helper.dart'; | |
| Stream<int> _throwingStream1(String exceptionToThrow) async* { | |
| for (var i = 0; i < 10; i++) { | |
| yield i; | |
| } | |
| throw exceptionToThrow; // LINE_A | |
| } | |
| Stream<int> _throwingStream2(String exceptionToThrow) async* { | |
| await for (var e in _throwingStream1(exceptionToThrow)) /* LINE_AA */ { | |
| yield e; | |
| } | |
| } | |
| Stream<int> _throwingStream3(String exceptionToThrow) async* { | |
| yield* _throwingStream1(exceptionToThrow); // LINE_AB | |
| } | |
| final streamFactories = [ | |
| _throwingStream1, | |
| _throwingStream2, | |
| _throwingStream3, | |
| ]; | |
| Future<void> testeeMain({ | |
| bool shouldTestUncaught = true, | |
| }) async { | |
| int testCaseId = 0; | |
| for (var makeStream in streamFactories) { | |
| await testStreamCaught(() => makeStream('Caught#${testCaseId++}')); | |
| } | |
| if (shouldTestUncaught) { | |
| int testCaseId = 0; | |
| for (var makeStream in streamFactories) { | |
| await testStreamUncaught(() => makeStream('Uncaught#${testCaseId++}')); | |
| } | |
| } | |
| } | |
| Future<void> testStreamCaught(Stream<int> Function() makeStream) async { | |
| final c = Completer<void>(); | |
| makeStream().listen( | |
| (_) {}, | |
| onError: (_) { | |
| // Ignore | |
| }, | |
| onDone: () { | |
| c.complete(); | |
| }, | |
| ); | |
| await c.future; | |
| try { | |
| await makeStream().toList(); | |
| } catch (_) {} | |
| try { | |
| await makeStream().last; | |
| } catch (_) {} | |
| try { | |
| await for (var _ in makeStream()) {} | |
| } catch (_) {} | |
| } | |
| Future<void> runExpectingUncaughtError(Future<void> Function() test) async { | |
| final done = Completer(); | |
| Zone.current.fork( | |
| specification: ZoneSpecification( | |
| handleUncaughtError: (self, parent, zone, error, stackTrace) { | |
| done.complete(); | |
| }, | |
| ), | |
| ).runGuarded(test); | |
| await done.future; | |
| } | |
| Future<void> testStreamUncaught(Stream<int> Function() makeStream) async { | |
| await runExpectingUncaughtError(() async { | |
| makeStream().listen((_) {}); | |
| }); | |
| await runExpectingUncaughtError(() async { | |
| await makeStream().toList(); // LINE_B | |
| }); | |
| await runExpectingUncaughtError(() async { | |
| await makeStream().last; // LINE_C | |
| }); | |
| } | |
| Future<void> main([List<String> args = const <String>[]]) { | |
| return startServiceTest(testeeConcurrent: testeeMain); | |
| } |