blob: c6714caf6fa26d0c9d3eeacd65beb1f193347615 [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 subscription, associated with asynchronous
/// for loop, is cancelled, when f is terminated by return. f is asynchronous
/// function.
/// @author a.semenov@unipro.ru
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); });
}
Future f(Stream stream, int skip) async {
await for (var s in stream) {
skip--;
if (skip == 0) {
return;
}
}
}
Future test(int skip) async {
List log = [];
Stream stream = makeStream(['a', 'b', 'c', 'd', 'e', 'f'], 1, log);
await f(stream, skip);
Expect.listEquals([1], log);
}
main() {
asyncStart();
Future.wait(
[test(1), test(2), test(3), test(4), test(5)]
).then(
(_) => asyncEnd()
);
}