// 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 "dart:async"; import "package:expect/expect.dart"; import 'package:async_helper/async_helper.dart'; main() { asyncStart(); testValues(); testErrors(); testMixed(); testOrdering(); testEmpty(); testPrecompleted(); asyncEnd(); } void testValues() { asyncStart(); var cs = new List.generate(3, (_) => new Completer()); var stream = new Stream.fromFutures(cs.map((x) => x.future)); var result = stream.toList(); result.then((list) { Expect.listEquals([1, 2, 3], list); asyncEnd(); }); cs[1].complete(1); cs[2].complete(2); cs[0].complete(3); } void testErrors() { asyncStart(); var cs = new List.generate(3, (_) => new Completer()); var stream = new Stream.fromFutures(cs.map((x) => x.future)); int counter = 0; stream.listen((_) { Expect.fail("unexpected value"); }, onError: (e) { Expect.equals(++counter, e); }, onDone: () { Expect.equals(3, counter); asyncEnd(); }); cs[1].completeError(1); cs[2].completeError(2); cs[0].completeError(3); } void testMixed() { asyncStart(); var cs = new List.generate(3, (_) => new Completer()); var stream = new Stream.fromFutures(cs.map((x) => x.future)); int counter = 0; stream.listen((v) { Expect.isTrue(counter == 0 || counter == 2); Expect.equals(++counter, v); }, onError: (e) { Expect.equals(++counter, 2); Expect.equals(2, e); }, onDone: () { Expect.equals(3, counter); asyncEnd(); }); cs[1].complete(1); cs[2].completeError(2); cs[0].complete(3); } void testOrdering() { // The output is in completion order, not affected by the input future order. test(n1, n2, n3) { asyncStart(); var cs = new List.generate(3, (_) => new Completer()); var stream = new Stream.fromFutures(cs.map((x) => x.future)); var result = stream.toList(); result.then((list) { Expect.listEquals([1, 2, 3], list); asyncEnd(); }); cs[n1].complete(1); cs[n2].complete(2); cs[n3].complete(3); } test(0, 1, 2); test(0, 2, 1); test(1, 0, 2); test(1, 2, 0); test(2, 0, 1); test(2, 1, 0); } void testEmpty() { asyncStart(); var stream = new Stream.fromFutures([]); stream.listen((_) { Expect.fail("unexpected value"); }, onError: (e) { Expect.fail("unexpected error"); }, onDone: () { asyncEnd(); }); } void testPrecompleted() { asyncStart(); var stream = new Stream.fromFutures( new Iterable.generate(3, (v) => new Future.value(v + 1))); var expected = new Set.from([1, 2, 3]); stream.listen((v) { Expect.isTrue(expected.contains(v)); expected.remove(v); }, onDone: () { Expect.isTrue(expected.isEmpty); asyncEnd(); }); }