blob: d6f5e428f8299c9a575698b417cf0b930f26ced1 [file] [log] [blame]
// 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.
/// @assertion If sE is an asynchronous for loop, let ak be the set of
/// asynchronous for loops and yield-each statements enclosing sc that are
/// enclosed in sE , 1 ≤ k ≤ m, where ak is enclosed in ak+1 . The stream
/// subscriptions associated with aj are canceled, 1 ≤ j ≤ m, innermost first,
/// so that aj is canceled before aj+1 .
///
/// @description Check that continue statement do not cancel streams associated
/// with sE and with asynchronous loops, that enclose sE
///
/// @issue 25247
/// @issue 25234
/// @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 test1() async {
List log = [];
int i = 0;
await for (String s in makeStream(['a', 'b'], i++, log)) {
L:
await for (String s in makeStream(['a', 'b'], i++, log)) {
continue L;
}
}
Expect.listEquals([], log);
}
Future test2() async {
List log = [];
int i = 0;
await for (String s in makeStream(['a', 'b'], i++, log)) {
await for (String s in makeStream(['a', 'b'], i++, log)) {
L:
await for (String s in makeStream(['a', 'b'], i++, log)) {
await for (String s in makeStream(['a', 'b'], i++, log)) {
await for (String s in makeStream(['a', 'b'], i++, log)) {
continue L;
}
}
}
}
}
Expect.listEquals([
4, 3, 6, 5, 9, 8, 11, 10, 15, 14, 17, 16, 20, 19, 22, 21
], log);
}
main() {
asyncStart();
Future.wait([test1(), test2()]).then((v) => asyncEnd());
}