| Index: test/future_group_test.dart
|
| diff --git a/test/future_group_test.dart b/test/future_group_test.dart
|
| index f53508059209dd8f970a4fdb0e9b454089204991..09ea29a0abd0a364fce633b92c92c9d6dc5835de 100644
|
| --- a/test/future_group_test.dart
|
| +++ b/test/future_group_test.dart
|
| @@ -7,6 +7,8 @@ import 'dart:async';
|
| import 'package:async/src/future_group.dart';
|
| import 'package:test/test.dart';
|
|
|
| +import 'utils.dart';
|
| +
|
| void main() {
|
| var futureGroup;
|
| setUp(() {
|
| @@ -18,7 +20,7 @@ void main() {
|
| var completed = false;
|
| futureGroup.future.then((_) => completed = true);
|
|
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
| expect(completed, isFalse);
|
| });
|
|
|
| @@ -31,18 +33,18 @@ void main() {
|
| group("with a future that already completed", () {
|
| test("never completes if nothing happens", () async {
|
| futureGroup.add(new Future.value());
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
|
|
| var completed = false;
|
| futureGroup.future.then((_) => completed = true);
|
|
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
| expect(completed, isFalse);
|
| });
|
|
|
| test("completes once it's closed", () async {
|
| futureGroup.add(new Future.value());
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
|
|
| expect(futureGroup.future, completes);
|
| futureGroup.close();
|
| @@ -61,7 +63,6 @@ void main() {
|
| });
|
|
|
| test("completes once all contained futures complete", () async {
|
| - var futureGroup = new FutureGroup();
|
| var completer1 = new Completer();
|
| var completer2 = new Completer();
|
| var completer3 = new Completer();
|
| @@ -75,20 +76,19 @@ void main() {
|
| futureGroup.future.then((_) => completed = true);
|
|
|
| completer1.complete();
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
| expect(completed, isFalse);
|
|
|
| completer2.complete();
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
| expect(completed, isFalse);
|
|
|
| completer3.complete();
|
| - await new Future.delayed(Duration.ZERO);
|
| + await flushMicrotasks();
|
| expect(completed, isTrue);
|
| });
|
|
|
| test("completes to the values of the futures in order of addition", () {
|
| - var futureGroup = new FutureGroup();
|
| var completer1 = new Completer();
|
| var completer2 = new Completer();
|
| var completer3 = new Completer();
|
| @@ -108,7 +108,6 @@ void main() {
|
|
|
| test("completes to the first error to be emitted, even if it's not closed",
|
| () {
|
| - var futureGroup = new FutureGroup();
|
| var completer1 = new Completer();
|
| var completer2 = new Completer();
|
| var completer3 = new Completer();
|
| @@ -121,4 +120,101 @@ void main() {
|
| completer1.completeError("error 1");
|
| expect(futureGroup.future, throwsA("error 2"));
|
| });
|
| +
|
| + group("onIdle:", () {
|
| + test("emits an event when the last pending future completes", () async {
|
| + var idle = false;
|
| + futureGroup.onIdle.listen((_) => idle = true);
|
| +
|
| + var completer1 = new Completer();
|
| + var completer2 = new Completer();
|
| + var completer3 = new Completer();
|
| +
|
| + futureGroup.add(completer1.future);
|
| + futureGroup.add(completer2.future);
|
| + futureGroup.add(completer3.future);
|
| +
|
| + await flushMicrotasks();
|
| + expect(idle, isFalse);
|
| + expect(futureGroup.isIdle, isFalse);
|
| +
|
| + completer1.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isFalse);
|
| + expect(futureGroup.isIdle, isFalse);
|
| +
|
| + completer2.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isFalse);
|
| + expect(futureGroup.isIdle, isFalse);
|
| +
|
| + completer3.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isTrue);
|
| + expect(futureGroup.isIdle, isTrue);
|
| + });
|
| +
|
| + test("emits an event each time it becomes idle", () async {
|
| + var idle = false;
|
| + futureGroup.onIdle.listen((_) => idle = true);
|
| +
|
| + var completer = new Completer();
|
| + futureGroup.add(completer.future);
|
| +
|
| + completer.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isTrue);
|
| + expect(futureGroup.isIdle, isTrue);
|
| +
|
| + idle = false;
|
| + completer = new Completer();
|
| + futureGroup.add(completer.future);
|
| +
|
| + await flushMicrotasks();
|
| + expect(idle, isFalse);
|
| + expect(futureGroup.isIdle, isFalse);
|
| +
|
| + completer.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isTrue);
|
| + expect(futureGroup.isIdle, isTrue);
|
| + });
|
| +
|
| + test("emits an event when the group closes", () async {
|
| + // It's important that the order of events here stays consistent over
|
| + // time, since code may rely on it in subtle ways.
|
| + var idle = false;
|
| + var onIdleDone = false;
|
| + var futureFired = false;
|
| +
|
| + futureGroup.onIdle.listen(expectAsync((_) {
|
| + expect(futureFired, isFalse);
|
| + idle = true;
|
| + }), onDone: expectAsync(() {
|
| + expect(idle, isTrue);
|
| + expect(futureFired, isFalse);
|
| + onIdleDone = true;
|
| + }));
|
| +
|
| + futureGroup.future.then(expectAsync((_) {
|
| + expect(idle, isTrue);
|
| + expect(onIdleDone, isTrue);
|
| + futureFired = true;
|
| + }));
|
| +
|
| + var completer = new Completer();
|
| + futureGroup.add(completer.future);
|
| + futureGroup.close();
|
| +
|
| + await flushMicrotasks();
|
| + expect(idle, isFalse);
|
| + expect(futureGroup.isIdle, isFalse);
|
| +
|
| + completer.complete();
|
| + await flushMicrotasks();
|
| + expect(idle, isTrue);
|
| + expect(futureGroup.isIdle, isTrue);
|
| + expect(futureFired, isTrue);
|
| + });
|
| + });
|
| }
|
|
|