blob: 09b6a9e03187ebb1dabd7b103ad47d3eb1a7e838 [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 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 Test various enclosing combinations of asynchronous loops and
* switch statement with several continue statements
*
* @issue 24935
* @issue 25234
* @issue 25310
* @issue 42585
* @issue 42587
* @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<int> log = [];
int i = 0;
switch (i) {
case 0:
await for (String s in makeStream(['a', 'b'], i++, log)) {
continue L;
}
break;
L: case 1:
break;
}
Expect.listEquals([0], log);
}
Future test2() async {
List<int> log = [];
int i = 0;
L:
await for (String s in makeStream(['a0', 'b0'], i++, log)) {
switch (s) {
case 'a0':
continue;
case 'b0':
continue L;
}
}
Expect.listEquals([], log);
}
Future test3() async {
List<int> log = [];
int i = 0;
switch (i) {
case 0:
await for (String s in makeStream(['a', 'b'], i++, log)) {
await for (String s in makeStream(['a', 'b'], i++, log)) {
continue L;
}
}
break;
L: case 2:
await for (String s in makeStream(['a', 'b'], i++, log)) {
await for (String s in makeStream(['a', 'b'], i++, log)) {
continue M;
}
}
break;
M: default:
break;
}
Expect.listEquals([1, 0, 3, 2], log); // crash here due to issue 24935
}
Future test4() async {
List<int> log = [];
int i = 0;
switch (i) {
case 0:
await for (String s in makeStream(['a0', 'b0'], i++, log)) {
await for (String s in makeStream(['a1', 'b1'], i++, log)) {
switch (s) {
case 'a1':
continue;
case 'b1':
continue L;
}
}
}
break;
L:
case 2:
break;
}
Expect.listEquals([1, 0], log);
}
Future test5() async {
List<int> log = [];
int i = 0;
L:
await for (String s in makeStream(['a0', 'b0'], i++, log)) {
switch (s) {
case 'a0':
await for (String s in makeStream(['a1', 'b1', 'c1'], i++, log)) {
switch (s) {
case 'a1':
continue;
case 'b1':
continue M; // issue 25310
}
}
break;
M:
case 'b0':
break;
}
}
Expect.listEquals([1], log);
}
Future test6() async {
List<int> log = [];
int i = 0;
L:
await for (String s in makeStream(['a0', 'b0'], i++, log)) {
switch (s) {
case 'a0':
await for (String s in makeStream(['a1', 'b1', 'c1'], i++, log)) {
switch (s) {
case 'a1':
continue;
case 'b1':
continue M; // issue 25310
}
}
break;
M:
case 'b0':
print("M");
await for (String s in makeStream(['a2', 'b2'], i++, log)) {
List list = ['a'+i.toString(), 'b'+i.toString(), 'c'+i.toString()];
K:
await for (String s in makeStream(list, i++, log)) {
switch (s) {
case 'a3':
continue;
case 'b3':
continue K;
case 'b4':
continue L;
}
}
}
break;
}
}
Expect.listEquals([1, 4, 2], log);
}
main() {
asyncStart();
Future.wait(
[test1(), test2(), test3(), test4(), test5(), test6()]
).then((v) => asyncEnd());
}