blob: fe46405bf923481b193f9b0ddd819535604a96f5 [file] [log] [blame]
// Copyright (c) 2011, 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 Let s1,...,sn be those try statements that are both enclosed in
/// sE and that enclose sc, and that have a finally clause. Lastly, let fj be
/// the finally clause of sj, 1 <= j <= n. Executing sc first executes f1,...,fn
/// in innermost-clause-first order. Then, if sE is a case clause, control is
/// transferred to the case clause. Otherwise, sE is necessarily a loop and
/// execution resumes after the last statement in the loop body.
///
/// @description Checks that the execution of "continue L;" statement transfers
/// control to the innermost enclosing asynchronous for-in statement with the
/// appropriate label and that all finally clauses between them are executed
/// in the innermost-clause-first order.
///
/// @author a.semenov@unipro.ru
import '../../../Utils/expect.dart';
import 'stream_utils.dart' as StreamUtils;
test() async {
List log = [];
int i = 0;
L:
await for (String s in StreamUtils.makeStream(['a', 'b'])) {
try {
try {
try {
log.add(s);
continue L;
log.add("The code after continue should not be executed");
} finally {
log.add(i++);
}
log.add("The code after continue should not be executed");
} finally {
log.add(i++);
}
log.add("The code after continue should not be executed");
} finally {
log.add(i++);
}
log.add("The code after continue should not be executed");
};
Expect.listEquals(['a', 0, 1, 2, 'b', 3, 4, 5], log);
}
main() {
asyncStart();
test().then((_) => asyncEnd());
}