// 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());
}