// 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([]); testForeach([0]); testForeach([0, 1, 2, 3]); testForeachIterableThrows( new Iterable.generate(5, (i) => i < 4 ? i : throw "ERROR"), 4, "ERROR"); testForeachFunctionThrows(new Iterable.generate(5, (x) => x), 4); asyncEnd(); } void testForeach(Iterable elements) { for (var delay in [0, 1, 2]) { asyncStart(); int length = elements.length; int count = 0; int nesting = 0; Future.forEach(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((_) { Expect.equals(1, nesting); nesting--; return "something-$delay"; }); }).then((_) { asyncEnd(); }).catchError((e) { Expect.fail("Throws: $e"); }); } } void testForeachIterableThrows(Iterable elements, n, error) { for (var delay in [0, 1, 2]) { asyncStart(); int count = 0; Future.forEach(elements, (_) { count++; Expect.isTrue(n >= 0); switch (delay) { case 1: return new Future(() {}); case 2: return new Future.microtask(() {}); } return new Future.value(); }).then((_) { Expect.fail("Did not throw"); }, onError: (e) { Expect.equals(n, count); Expect.equals(error, e); asyncEnd(); }); } } void testForeachFunctionThrows(Iterable elements, n) { for (var delay in [0, 1, 2]) { asyncStart(); Future.forEach(elements, (v) { if (v == n) { switch (delay) { case 0: throw "ERROR"; case 1: return new Future(() { throw "ERROR"; }); case 2: return new Future.microtask(() { throw "ERROR"; }); } } switch (delay) { case 1: return new Future(() {}); case 2: return new Future.microtask(() {}); } return new Future.value(); }).then((_) { Expect.fail("Did not throw"); }, onError: (e) { Expect.equals("ERROR", e); asyncEnd(); }); } }