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