diff --git a/tests/lib/lib.status b/tests/lib/lib.status index ccddbc62aa8..0547c4c0214 100644 --- a/tests/lib/lib.status +++ b/tests/lib/lib.status @@ -182,7 +182,6 @@ async/stream_periodic4_test: RuntimeError # Timer interface not supported; Issue async/stream_periodic5_test: RuntimeError # Timer interface not supported; Issue 7728. async/stream_periodic6_test: RuntimeError # Timer interface not supported; Issue 7728. async/run_zoned7_test: RuntimeError # Timer interface not supported: Issue 7728. -async/catch_errors22_test: RuntimeError # Timer interface not supported: Issue 7728. async/timer_isActive_test: RuntimeError # Timer interface not supported: Issue 7728. async/zone_empty_description2_test: RuntimeError # Timer interface not supported: Issue 7728. async/zone_create_timer2_test: RuntimeError # Timer interface not supported: Issue 7728. @@ -191,10 +190,6 @@ async/catch_errors12_test: Fail # Timer interface not supported: Issue 7728. async/catch_errors13_test: Fail # Timer interface not supported: Issue 7728. async/catch_errors14_test: Fail # Timer interface not supported: Issue 7728. async/catch_errors15_test: Fail # Timer interface not supported: Issue 7728. -async/catch_errors18_test: Fail # Timer interface not supported: Issue 7728. -async/catch_errors19_test: Fail # Timer interface not supported: Issue 7728. -async/catch_errors20_test: Fail # Timer interface not supported: Issue 7728. -async/catch_errors28_test: Fail # Timer interface not supported: Issue 7728. async/catch_errors8_test: Fail # Timer interface not supported: Issue 7728. async/run_zoned8_test: Fail # Timer interface not supported: Issue 7728. async/zone_bind_test: Fail # Timer interface not supported: Issue 7728. diff --git a/tests/lib_2/async/catch_errors.dart b/tests/lib_2/async/catch_errors.dart new file mode 100644 index 00000000000..925ce2c2f26 --- /dev/null +++ b/tests/lib_2/async/catch_errors.dart @@ -0,0 +1,55 @@ +library catch_errors; + +import 'dart:async'; + +Stream catchErrors(void body()) { + StreamController controller; + + bool onError(e, st) { + controller.add(e); + return true; + } + + void onListen() { + runZoned(body, onError: onError); + } + + controller = new StreamController(onListen: onListen); + return controller.stream; +} + +runZonedScheduleMicrotask(body(), + {void onScheduleMicrotask(void callback()), Function onError}) { + if (onScheduleMicrotask == null) { + return runZoned(body, onError: onError); + } + HandleUncaughtErrorHandler errorHandler; + if (onError != null) { + errorHandler = (Zone self, ZoneDelegate parent, Zone zone, error, + StackTrace stackTrace) { + try { + return self.parent.runUnary(onError, error); + } catch (e, s) { + if (identical(e, error)) { + return parent.handleUncaughtError(zone, error, stackTrace); + } else { + return parent.handleUncaughtError(zone, e, s); + } + } + }; + } + ScheduleMicrotaskHandler asyncHandler; + if (onScheduleMicrotask != null) { + asyncHandler = (Zone self, ZoneDelegate parent, Zone zone, f()) { + self.parent.runUnary(onScheduleMicrotask, () => zone.runGuarded(f)); + }; + } + ZoneSpecification specification = new ZoneSpecification( + handleUncaughtError: errorHandler, scheduleMicrotask: asyncHandler); + Zone zone = Zone.current.fork(specification: specification); + if (onError != null) { + return zone.runGuarded(body); + } else { + return zone.run(body); + } +} diff --git a/tests/lib/async/catch_errors18_test.dart b/tests/lib_2/async/catch_errors18_test.dart similarity index 100% rename from tests/lib/async/catch_errors18_test.dart rename to tests/lib_2/async/catch_errors18_test.dart diff --git a/tests/lib/async/catch_errors19_test.dart b/tests/lib_2/async/catch_errors19_test.dart similarity index 100% rename from tests/lib/async/catch_errors19_test.dart rename to tests/lib_2/async/catch_errors19_test.dart diff --git a/tests/lib/async/catch_errors20_test.dart b/tests/lib_2/async/catch_errors20_test.dart similarity index 100% rename from tests/lib/async/catch_errors20_test.dart rename to tests/lib_2/async/catch_errors20_test.dart diff --git a/tests/lib/async/catch_errors21_test.dart b/tests/lib_2/async/catch_errors21_test.dart similarity index 100% rename from tests/lib/async/catch_errors21_test.dart rename to tests/lib_2/async/catch_errors21_test.dart diff --git a/tests/lib/async/catch_errors22_test.dart b/tests/lib_2/async/catch_errors22_test.dart similarity index 100% rename from tests/lib/async/catch_errors22_test.dart rename to tests/lib_2/async/catch_errors22_test.dart diff --git a/tests/lib/async/catch_errors23_test.dart b/tests/lib_2/async/catch_errors23_test.dart similarity index 100% rename from tests/lib/async/catch_errors23_test.dart rename to tests/lib_2/async/catch_errors23_test.dart diff --git a/tests/lib/async/catch_errors24_test.dart b/tests/lib_2/async/catch_errors24_test.dart similarity index 100% rename from tests/lib/async/catch_errors24_test.dart rename to tests/lib_2/async/catch_errors24_test.dart diff --git a/tests/lib/async/catch_errors25_test.dart b/tests/lib_2/async/catch_errors25_test.dart similarity index 100% rename from tests/lib/async/catch_errors25_test.dart rename to tests/lib_2/async/catch_errors25_test.dart diff --git a/tests/lib/async/catch_errors26_test.dart b/tests/lib_2/async/catch_errors26_test.dart similarity index 100% rename from tests/lib/async/catch_errors26_test.dart rename to tests/lib_2/async/catch_errors26_test.dart diff --git a/tests/lib/async/catch_errors27_test.dart b/tests/lib_2/async/catch_errors27_test.dart similarity index 100% rename from tests/lib/async/catch_errors27_test.dart rename to tests/lib_2/async/catch_errors27_test.dart diff --git a/tests/lib/async/catch_errors28_test.dart b/tests/lib_2/async/catch_errors28_test.dart similarity index 100% rename from tests/lib/async/catch_errors28_test.dart rename to tests/lib_2/async/catch_errors28_test.dart diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status new file mode 100644 index 00000000000..e4355f294eb --- /dev/null +++ b/tests/lib_2/lib_2_dart2js.status @@ -0,0 +1,10 @@ +# Copyright (c) 2017, 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. + +[ $compiler == dart2js && $runtime == jsshell ] +async/catch_errors22_test: RuntimeError # Timer interface not supported: Issue 7728. +async/catch_errors18_test: Fail # Timer interface not supported: Issue 7728. +async/catch_errors19_test: Fail # Timer interface not supported: Issue 7728. +async/catch_errors20_test: Fail # Timer interface not supported: Issue 7728. +async/catch_errors28_test: Fail # Timer interface not supported: Issue 7728. diff --git a/tests/lib_strong/async/catch_errors18_test.dart b/tests/lib_strong/async/catch_errors18_test.dart deleted file mode 100644 index 2e640137335..00000000000 --- a/tests/lib_strong/async/catch_errors18_test.dart +++ /dev/null @@ -1,42 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - Stream stream = - new Stream.periodic(const Duration(milliseconds: 20), (x) => x); - // Test that errors of periodic streams are caught. - catchErrors(() { - var subscription; - subscription = stream.listen((x) { - if (x == 5) { - events.add("cancel"); - subscription.cancel(); - done.complete(true); - return; - } - events.add(x); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([0, 1, 2, 3, 4, "cancel"], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors19_test.dart b/tests/lib_strong/async/catch_errors19_test.dart deleted file mode 100644 index f5b37a1b2b9..00000000000 --- a/tests/lib_strong/async/catch_errors19_test.dart +++ /dev/null @@ -1,42 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - Stream stream = - new Stream.periodic(const Duration(milliseconds: 20), (x) => x); - // Test that asynchronous callbacks in the done-handler of streams (here - // the `catchErrors`-stream) keep a zone alive. - catchErrors(() { - var subscription; - subscription = stream.take(5).listen((x) { - events.add(x); - }, onDone: () { - new Future.delayed(const Duration(milliseconds: 30), () { - events.add(499); - done.complete(true); - }); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([0, 1, 2, 3, 4, 499], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors20_test.dart b/tests/lib_strong/async/catch_errors20_test.dart deleted file mode 100644 index c3ca08e926e..00000000000 --- a/tests/lib_strong/async/catch_errors20_test.dart +++ /dev/null @@ -1,45 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - // Test that nested stream (from `catchErrors`) that is delayed by a future - // is waited for. - catchErrors(() { - catchErrors(() { - new Future.error(499); - new Future.delayed(const Duration(milliseconds: 20), () { - events.add(42); - done.complete(true); - }); - }).listen(events.add, onDone: () { - events.add("done"); - }); - throw "foo"; - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "outer: foo", - 499, - 42, - ], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors21_test.dart b/tests/lib_strong/async/catch_errors21_test.dart deleted file mode 100644 index 11db23b6001..00000000000 --- a/tests/lib_strong/async/catch_errors21_test.dart +++ /dev/null @@ -1,55 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - var controller = new StreamController(); - // Test that stream errors, as a result of bad user-code (`map`) are correctly - // caught by `catchErrors`. Note that the values are added outside both - // `catchErrors`, but since the `listen` happens in the most nested - // `catchErrors` it is caught there. - catchErrors(() { - catchErrors(() { - controller.stream.map((x) { - throw x; - }).listen((x) { - // Should not happen. - events.add("bad: $x"); - }); - }).listen((x) { - events.add("caught: $x"); - if (x == 4) done.complete(true); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "caught: 1", - "caught: 2", - "caught: 3", - "caught: 4", - ], events); - asyncEnd(); - }); - }); - - [1, 2, 3, 4].forEach(controller.add); - controller.close(); -} diff --git a/tests/lib_strong/async/catch_errors22_test.dart b/tests/lib_strong/async/catch_errors22_test.dart deleted file mode 100644 index 8f810e70737..00000000000 --- a/tests/lib_strong/async/catch_errors22_test.dart +++ /dev/null @@ -1,48 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - - var events = []; - bool onDoneWasCalled = false; - var controller = new StreamController(); - // Test that streams that are never closed keep the `catchError` alive. - catchErrors(() { - catchErrors(() { - controller.stream.map((x) { - throw x; - }).listen((x) { - // Should not happen. - events.add("bad: $x"); - }); - }).listen((x) { - events.add("caught: $x"); - }, onDone: () { - events.add("done"); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - onDoneWasCalled = true; - }); - - [1, 2, 3, 4].forEach(controller.add); - - new Timer(const Duration(milliseconds: 20), () { - Expect.isFalse(onDoneWasCalled); - Expect.listEquals([ - "caught: 1", - "caught: 2", - "caught: 3", - "caught: 4", - ], events); - asyncEnd(); - }); -} diff --git a/tests/lib_strong/async/catch_errors23_test.dart b/tests/lib_strong/async/catch_errors23_test.dart deleted file mode 100644 index 92967c980be..00000000000 --- a/tests/lib_strong/async/catch_errors23_test.dart +++ /dev/null @@ -1,79 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - StreamController controller; - Stream stream; - // Test that errors are not traversing zone boundaries. - // Note that the first listener of `asBroadcastStream` determines in which - // zone the subscription lives. - catchErrors(() { - catchErrors(() { - controller = new StreamController(); - - // Assign to "global" `stream`. - stream = controller.stream.map((x) { - events.add("map $x"); - return x + 100; - }).transform( - new StreamTransformer.fromHandlers(handleError: (e, st, sink) { - sink.add("error $e"); - })).asBroadcastStream(); - - // Listen to `stream` in the inner zone. - stream.listen((x) { - events.add("stream $x"); - }); - }) - .listen((x) { - events.add(x); - }) - .asFuture() - .then((_) { - Expect.fail("Unexpected callback"); - }); - - // Listen to `stream` in the outer zone. - stream.listen((x) { - events.add("stream2 $x"); - }); - - // Feed the controller from the outer zone. - controller.add(1); - // `addError` does not count as zone-traversal. It should be caught by - // the inner error handler. - controller.addError("inner error"); - new Future.error("caught by outer"); - controller.close(); - }).listen((x) { - events.add("outer: $x"); - if (x == "caught by outer") done.complete(true); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "map 1", - "stream 101", - "stream2 101", - "stream error inner error", - "stream2 error inner error", - "outer: caught by outer", - ], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors24_test.dart b/tests/lib_strong/async/catch_errors24_test.dart deleted file mode 100644 index 9b388a2732c..00000000000 --- a/tests/lib_strong/async/catch_errors24_test.dart +++ /dev/null @@ -1,79 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - StreamController controller; - Stream stream; - // Test that the first listen on a `asBroadcastStream` determines the - // zone the subscription lives in. In this case the outer listen happens first - // and the error reaches `handleError`. - catchErrors(() { - catchErrors(() { - controller = new StreamController(); - - // Assign to the "global" `stream`. - stream = controller.stream.map((x) { - events.add("map $x"); - return x + 100; - }).transform( - new StreamTransformer.fromHandlers(handleError: (e, st, sink) { - sink.add("error $e"); - })).asBroadcastStream(); - - // Listen to the `stream` in the inner zone (but wait in a microtask). - scheduleMicrotask(() { - stream.listen((x) { - events.add("stream $x"); - if (x == "error 2") done.complete(true); - }); - }); - }) - .listen((x) { - events.add(x); - }) - .asFuture() - .then((_) { - Expect.fail("Unexpected callback"); - }); - - // Listen to `stream` from the outer zone. - stream.listen((x) { - events.add("stream2 $x"); - }); - - // Feed the controller, but wait in a microtask. - scheduleMicrotask(() { - controller.add(1); - controller.addError(2); - controller.close(); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to complete. - Timer.run(() { - Expect.listEquals([ - "map 1", - "stream2 101", - "stream 101", - "stream2 error 2", - "stream error 2", - ], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors25_test.dart b/tests/lib_strong/async/catch_errors25_test.dart deleted file mode 100644 index 8de05403b2f..00000000000 --- a/tests/lib_strong/async/catch_errors25_test.dart +++ /dev/null @@ -1,36 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - StreamController controller; - // Test multiple subscribers of an asBroadcastStream inside the same - // `catchErrors`. - catchErrors(() { - var stream = new Stream.fromIterable([1, 2]).asBroadcastStream(); - stream.listen(events.add); - stream.listen(events.add); - done.complete(stream.listen(null).asFuture()); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([1, 1, 2, 2], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors26_test.dart b/tests/lib_strong/async/catch_errors26_test.dart deleted file mode 100644 index 0d2ea86b316..00000000000 --- a/tests/lib_strong/async/catch_errors26_test.dart +++ /dev/null @@ -1,74 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - StreamController controller; - Stream stream; - // Test `StreamController.broadcast` streams. - catchErrors(() { - catchErrors(() { - controller = new StreamController.broadcast(); - - // Listen to the stream from the inner zone. - controller.stream.map((x) { - events.add("map $x"); - return x + 100; - }).transform( - new StreamTransformer.fromHandlers(handleError: (e, st, sink) { - sink.add("error $e"); - })).listen((x) { - events.add("stream $x"); - }); - }) - .listen((x) { - events.add(x); - }) - .asFuture() - .then((_) { - Expect.fail("Unexpected callback"); - }); - - // Listen to the stream from the outer zone. - controller.stream.listen((x) { - events.add("stream2 $x"); - }, onError: (x) { - events.add("stream2 error $x"); - }); - - // Feed the controller. - controller.add(1); - controller.addError("inner stream"); - new Future.error("outer error"); - controller.close(); - }).listen((x) { - events.add("outer: $x"); - if (x == "outer error") done.complete(true); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "map 1", - "stream 101", - "stream2 1", - "stream error inner stream", - "stream2 error inner stream", - "outer: outer error", - ], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors27_test.dart b/tests/lib_strong/async/catch_errors27_test.dart deleted file mode 100644 index 19229470188..00000000000 --- a/tests/lib_strong/async/catch_errors27_test.dart +++ /dev/null @@ -1,79 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - StreamController controller; - Stream stream; - // Test that streams live in the zone they have been listened too. - // It doesn't matter how many zone-boundaries the stream traverses. What - // counts is the zone where `listen` was invoked. - catchErrors(() { - catchErrors(() { - controller = new StreamController(); - - // Assignment to "global" `stream`. - stream = controller.stream.map((x) { - events.add("map $x"); - return x + 100; - }).asBroadcastStream(); - - // Consume stream in the nested zone. - stream.transform( - new StreamTransformer.fromHandlers(handleError: (e, st, sink) { - sink.add("error $e"); - })).listen((x) { - events.add("stream $x"); - }); - - // Feed the controller in the nested zone. - scheduleMicrotask(() { - controller.add(1); - controller.addError(2); - controller.close(); - new Future.error("done"); - }); - }) - .listen((x) { - events.add("listen: $x"); - if (x == "done") done.complete(true); - }) - .asFuture() - .then((_) { - Expect.fail("Unexpected callback"); - }); - - // Listen to stream in outer zone. - stream.listen((x) { - events.add("stream2 $x"); - }); - }).listen((x) { - events.add("outer: $x"); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "map 1", - "stream 101", - "stream2 101", - "stream error 2", - "listen: done", - "outer: 2", - ], events); - asyncEnd(); - }); - }); -} diff --git a/tests/lib_strong/async/catch_errors28_test.dart b/tests/lib_strong/async/catch_errors28_test.dart deleted file mode 100644 index eae954ad37d..00000000000 --- a/tests/lib_strong/async/catch_errors28_test.dart +++ /dev/null @@ -1,49 +0,0 @@ -// 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. - -import 'package:async_helper/async_helper.dart'; -import "package:expect/expect.dart"; -import 'dart:async'; -import 'catch_errors.dart'; - -main() { - asyncStart(); - Completer done = new Completer(); - - var events = []; - // Test that periodic Timers are handled correctly by `catchErrors`. - catchErrors(() { - int counter = 0; - new Timer.periodic(const Duration(milliseconds: 50), (timer) { - if (counter == 5) { - timer.cancel(); - done.complete(true); - } - counter++; - events.add(counter); - }); - }).listen((x) { - events.add(x); - }, onDone: () { - Expect.fail("Unexpected callback"); - }); - - done.future.whenComplete(() { - // Give handlers time to run. - Timer.run(() { - Expect.listEquals([ - "main exit", - 1, - 2, - 3, - 4, - 5, - 6, - ], events); - asyncEnd(); - }); - }); - - events.add("main exit"); -}