blob: 80f716c4aef9cd1060519449b1e30912f1ad91e5 [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.
// @dart = 2.9
// Test that stream cancellation is checked immediately after delivering the
// event, and before continuing after the yield.
import "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
main() async {
asyncStart();
var log = [];
Stream<int> f() async* {
try {
log.add("-1");
yield 1;
log.add("-2");
yield 2;
} finally {
log.add("x");
}
}
var completer = Completer();
var s;
s = f().listen((e) {
log.add("+$e");
// The `cancel` operation makes all `yield` operations act as returns.
// It should make the `finally` block in `f` log an "x",
// and nothing else.
completer.complete(s.cancel());
}, onError: (e) {
// Should never be reached, but if it does, we'll make the await
// below terminate.
completer.complete(new Future.sync(() {
Expect.fail("$e");
}));
}, onDone: () {
completer.complete(null);
});
await completer.future;
Expect.listEquals(["-1", "+1", "x"], log, "cancel");
asyncEnd();
}