blob: 47813abc5e7b794a5543e7db075730a92d52b829 [file] [log] [blame]
// Copyright (c) 2018, 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() async {
asyncStart();
// Normal operations.
{
Stream<int> f() async* {
yield 1;
yield 2;
yield 3;
}
Expect.listEquals([1, 2, 3], await f().toList(), "basic1");
}
{
Stream<int> f() async* {
yield 1;
yield 2;
yield 3;
}
var log = [];
var completer = Completer();
f().listen(log.add,
onError: (e) {
// Shouldn't be reached.
completer.complete(new Future.sync(() {
Expect.fail("$e");
}));
},
onDone: () => completer.complete(null));
await completer.future;
Expect.listEquals([1, 2, 3], log, "basic2");
}
{
var log = [];
Stream<int> f() async* {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
}
await f().forEach((e) {
log.add("+$e");
});
Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic3");
}
{
var log = [];
Stream<int> f() async* {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
}
await for (var e in f()) {
log.add("+$e");
}
Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic4");
}
// async
{
Stream<int> f() async* {
yield 1;
await Future(() {});
yield 2;
await Future(() {});
yield 3;
}
Expect.listEquals([1, 2, 3], await f().toList(), "async");
}
// Yield*
{
Stream<int> f(int n) async* {
yield n;
if (n == 0) return;
yield* f(n - 1);
yield n;
}
Expect.listEquals([3, 2, 1, 0, 1, 2, 3], await f(3).toList(), "yield*");
}
// Errors
{
var log = [];
Stream<int> f() async* {
yield 1;
throw "error";
}
await f().handleError((e) {
log.add(e);
}).forEach(log.add);
Expect.listEquals([1, "error"], log, "error");
}
{
var log = [];
Stream<int> f() async* {
yield 1;
yield* Future<int>.error("error").asStream(); // Emits error as error.
yield 3;
}
await f().handleError((e) {
log.add(e);
}).forEach(log.add);
Expect.listEquals([1, "error", 3], log, "error2");
}
// Pause is checked after delivering event.
{
var log = [];
Stream<int> f() async* {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
}
var completer = Completer();
var s;
s = f().listen((e) {
log.add("+$e");
s.pause(Future(() {}));
log.add("++$e");
}, onError: (e) {
completer.complete(new Future.sync(() {
Expect.fail("$e");
}));
}, onDone: () => completer.complete(null));
await completer.future;
Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "pause");
}
// Await for-loop pauses between events.
{
var log = [];
Stream<int> f() async* {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
}
await for (var e in f()) {
log.add("+$e");
await Future(() {}); // One timer tick.
log.add("++$e");
}
Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "looppause");
}
// Await for-loop break works immediately.
{
var log = [];
Stream<int> f() async* {
try {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
log.add("-3");
yield 3;
} finally {
log.add("x");
}
}
await for (var e in f()) {
log.add("+$e");
await Future(() {}); // One timer tick, pauses function at yield.
log.add("++$e");
if (e == 2) break;
}
Expect.listEquals(
["-1", "+1", "++1", "-2", "+2", "++2", "x"], log, "loop-pause-break");
}
asyncEnd();
}