Index: tests/lib/async/future_foreach_test.dart |
diff --git a/tests/lib/async/future_foreach_test.dart b/tests/lib/async/future_foreach_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7416b9411d1c56414d0cd4983225f857cfd71759 |
--- /dev/null |
+++ b/tests/lib/async/future_foreach_test.dart |
@@ -0,0 +1,111 @@ |
+// 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. |
+ |
+library future_foreach_test; |
+ |
+import 'package:async_helper/async_helper.dart'; |
+import "package:expect/expect.dart"; |
+import 'dart:async'; |
+ |
+main() { |
+ asyncStart(); |
+ |
+ testForeach(<int>[]); |
+ testForeach(<int>[0]); |
+ testForeach(<int>[0, 1, 2, 3]); |
+ |
+ testForeachIterableThrows( |
+ new Iterable<int>.generate(5, (i) => i < 4 ? i : throw "ERROR"), |
+ 4, |
+ "ERROR"); |
+ |
+ testForeachFunctionThrows(new Iterable<int>.generate(5, (x) => x), 4); |
+ |
+ asyncEnd(); |
+} |
+ |
+void testForeach(Iterable<int> elements) { |
+ for (var delay in [0, 1, 2]) { |
+ asyncStart(); |
+ int length = elements.length; |
+ int count = 0; |
+ int nesting = 0; |
+ Future.forEach<int>(elements, (int value) { |
+ Expect.isTrue(nesting == 0, "overlapping calls detected"); |
+ if (delay == 0) return "something-$delay"; |
+ nesting++; |
+ var future; |
+ if (delay == 1) { |
+ future = new Future(() => null); |
+ } else { |
+ future = new Future.microtask(() => null); |
+ } |
+ return future.then<String>((_) { |
+ Expect.equals(1, nesting); |
+ nesting--; |
+ return "something-$delay"; |
+ }); |
+ }).then((_) { |
+ asyncEnd(); |
+ }).catchError((e) { |
+ Expect.fail("Throws: $e"); |
+ }); |
+ } |
+} |
+ |
+void testForeachIterableThrows(Iterable<int> elements, n, error) { |
+ for (var delay in [0, 1, 2]) { |
+ asyncStart(); |
+ int count = 0; |
+ Future.forEach<int>(elements, (_) { |
+ count++; |
+ Expect.isTrue(n >= 0); |
+ switch (delay) { |
+ case 1: |
+ return new Future<String>(() {}); |
+ case 2: |
+ return new Future<String>.microtask(() {}); |
+ } |
+ }).then((_) { |
+ Expect.fail("Did not throw"); |
+ }, onError: (e) { |
+ Expect.equals(n, count); |
+ Expect.equals(error, e); |
+ asyncEnd(); |
+ }); |
+ } |
+} |
+ |
+void testForeachFunctionThrows(Iterable<int> elements, n) { |
+ for (var delay in [0, 1, 2]) { |
+ asyncStart(); |
+ Future.forEach<int>(elements, (v) { |
+ if (v == n) { |
+ switch (delay) { |
+ case 0: |
+ throw "ERROR"; |
+ case 1: |
+ return new Future<String>(() { |
+ throw "ERROR"; |
+ }); |
+ case 2: |
+ return new Future<String>.microtask(() { |
+ throw "ERROR"; |
+ }); |
+ } |
+ } |
+ switch (delay) { |
+ case 1: |
+ return new Future(() {}); |
+ case 2: |
+ return new Future.microtask(() {}); |
+ } |
+ }).then((_) { |
+ Expect.fail("Did not throw"); |
+ }, onError: (e) { |
+ Expect.equals("ERROR", e); |
+ asyncEnd(); |
+ }); |
+ } |
+} |