blob: 4aa49e11ac7f543f117a06ee76624f13d0a7929d [file] [log] [blame]
// Copyright (c) 2016, 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.
/**
* @assertion If f is asynchronous then, when f terminates, any open stream
* subscriptions associated with any asynchronous for loops or yield-each
* statements executing within f are canceled, in the order of their nesting,
* innermost first.
*
* @description Check that stream subscriptions, associated with
* asynchronous for loops, are cancelled in innermost first order, when f is
* terminated by throwing an exception. f is asynchronous generator.
* @author a.semenov@unipro.ru
* @issue 42220
*/
import 'dart:async';
import '../../../Utils/expect.dart';
import 'stream_utils.dart' as StreamUtils;
Stream makeStream(Iterable iterable, int id, List log) {
return StreamUtils.makeStream(iterable, beforeCancel: () { log.add(id); });
}
Stream f(List log, int skip) async* {
int i = 0;
await for (var s in makeStream(['a', 'b', 'c', 'd'], i++, log)) {
await for (var s in makeStream(['a', 'b', 'c', 'd' ], i++, log)) {
await for (var s in makeStream(['a', 'b', 'c', 'd'], i++, log)) {
await for (var s in makeStream(['a', 'b', 'c', 'd'], i++, log)) {
await for (var s in makeStream(['a', 'b', 'c', 'd'], i++, log)) {
skip--;
if (skip == 0) {
throw 'finish';
}
yield s;
}
}
}
}
}
}
Future test(int skip) async {
List log = [];
f(log, skip).listen(
(_) { },
onError: (e) {
Expect.equals('finish', e);
Expect.listEquals([4, 3, 2, 1, 0], log);
}
);
}
main() {
asyncStart();
Future.wait(
[test(1), test(2), test(3)]
).then(
(_) => asyncEnd()
);
}