mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 23:51:47 +00:00
ba84855c0a
Change-Id: I4d60b650a2146c1d9be0fd0c5f98eac85f9e2eb1 Reviewed-on: https://dart-review.googlesource.com/16333 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Ben Konyi <bkonyi@google.com>
100 lines
2.6 KiB
Dart
100 lines
2.6 KiB
Dart
// Copyright (c) 2015, 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";
|
|
|
|
Stream<int> subStream(p) async* {
|
|
yield p;
|
|
yield p + 1;
|
|
}
|
|
|
|
Stream foo(Completer<bool> finalized) async* {
|
|
int i = 0;
|
|
try {
|
|
while (true) {
|
|
yield "outer";
|
|
yield* subStream(i);
|
|
i++;
|
|
}
|
|
} finally {
|
|
// See that we did not run too many iterations.
|
|
Expect.isTrue(i < 10);
|
|
// Canceling the stream-subscription should run the finalizer.
|
|
finalized.complete(true);
|
|
}
|
|
}
|
|
|
|
foo2(Stream subStream) async* {
|
|
yield* subStream;
|
|
}
|
|
|
|
test() async {
|
|
Expect.listEquals([0, 1], await (subStream(0).toList()));
|
|
Completer<bool> finalized = new Completer<bool>();
|
|
Expect.listEquals(["outer", 0, 1, "outer", 1, 2, "outer", 2],
|
|
await (foo(finalized).take(8).toList()));
|
|
Expect.isTrue(await (finalized.future));
|
|
|
|
finalized = new Completer<bool>();
|
|
// Canceling the stream while it is yield*-ing from the sub-stream.
|
|
Expect.listEquals(["outer", 0, 1, "outer", 1, 2, "outer"],
|
|
await (foo(finalized).take(7).toList()));
|
|
Expect.isTrue(await (finalized.future));
|
|
finalized = new Completer<bool>();
|
|
|
|
Completer<bool> pausedCompleter = new Completer<bool>();
|
|
Completer<bool> resumedCompleter = new Completer<bool>();
|
|
Completer<bool> canceledCompleter = new Completer<bool>();
|
|
|
|
StreamController controller;
|
|
int i = 0;
|
|
addNext() {
|
|
if (i >= 10) return;
|
|
controller.add(i);
|
|
i++;
|
|
if (!controller.isPaused) {
|
|
scheduleMicrotask(addNext);
|
|
}
|
|
}
|
|
|
|
controller = new StreamController(onListen: () {
|
|
scheduleMicrotask(addNext);
|
|
}, onPause: () {
|
|
pausedCompleter.complete(true);
|
|
}, onResume: () {
|
|
resumedCompleter.complete(true);
|
|
scheduleMicrotask(addNext);
|
|
}, onCancel: () {
|
|
canceledCompleter.complete(true);
|
|
});
|
|
|
|
StreamSubscription subscription;
|
|
// Test that the yield*'ed stream is paused and resumed.
|
|
subscription = foo2(controller.stream).listen((event) {
|
|
if (event == 2) {
|
|
subscription.pause();
|
|
scheduleMicrotask(() {
|
|
subscription.resume();
|
|
});
|
|
}
|
|
if (event == 5) {
|
|
subscription.cancel();
|
|
}
|
|
});
|
|
// Test that the yield*'ed streamSubscription is paused, resumed and canceled
|
|
// by the async* stream.
|
|
Expect.isTrue(await pausedCompleter.future);
|
|
Expect.isTrue(await resumedCompleter.future);
|
|
Expect.isTrue(await canceledCompleter.future);
|
|
}
|
|
|
|
main() {
|
|
asyncStart();
|
|
test().then((_) {
|
|
asyncEnd();
|
|
});
|
|
}
|