// 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<int> log = [];
  int i = 0;

  L4:
  await for (String s in makeStream(['a0', 'b0'], i++, log)) {
    L3:
    await for (String s in makeStream(['a1', 'b1'], i++, log)) {
      L2:
      await for (String s in makeStream(['a2', 'b2'], i++, log)) {
        L1:
        await for (String s in makeStream(['a3', 'b3'], i++, log)) {
          L0:
          await for (String s in makeStream(['a4', 'b4'], i++, log)) {
            continue L0;
          }
          continue L1;
        }
        continue L2;
      }
      continue L3;
    }
    continue L4;
  }
  Expect.listEquals([], log);
}

Future test2() async {
  List<int> log = [];
  int i = 0;

  L0:
  await for (String s in makeStream(['a0', 'b0'], i++, log)) {
    L1:
    await for (String s in makeStream(['a1', 'b1'], i++, log)) {
      L2:
      await for (String s in makeStream(['a2', 'b2'], i++, log)) {
        L3:
        await for (String s in makeStream(['a3', 'b3'], i++, log)) {
          L4:
          await for (String s in makeStream(['a4', 'b4'], i++, log)) {
            continue L4;
          }
          await for (String s in makeStream(['a5', 'b5'], i++, log)) {
            continue L2;
          }
        }
        await for (String s in makeStream(['a6', 'b6'], i++, log)) {
          await for (String s in makeStream(['a7', 'b7'], i++, log)) {
            continue L1;
          }
        }
      }
    }
    continue L0;
  }
  Expect.listEquals([
      5, 3, 8, 6, 12, 10, 15, 13, 20, 18, 23, 21, 27, 25, 30, 28
    ], log);
}

Future test3() async {
  List<int> log = [];
  int i = 0;

  L0:
  await for (String s in makeStream(['a0', 'b0'], i++, log)) {
    L1:
    await for (String s in makeStream(['a1', 'b1'], i++, log)) {
      continue L0;
      L2:
      await for (String s in makeStream(['a2', 'b2'], i++, log)) {
        L3:
        await for (String s in makeStream(['a3', 'b3'], i++, log)) {
          L4:
          await for (String s in makeStream(['a4', 'b4'], i++, log)) {
            continue L4;
          }
          await for (String s in makeStream(['a5', 'b5'], i++, log)) {
            continue L3;
          }
        }
        await for (String s in makeStream(['a6', 'b6'], i++, log)) {
          await for (String s in makeStream(['a7', 'b7'], i++, log)) {
            continue L1;
          }
        }
      }
    }
    continue L0;
  }
  Expect.listEquals([1, 2], log);
}

Future test4() async {
  List<int> log = [];
  int i = 0;

  await for (String s in makeStream(['a0', 'b0'], i++, log)) {
    await for (String s in makeStream(['a1', 'b1'], i++, log)) {
      L1:
      await for (String s in makeStream(['a2', 'b2'], i++, log)) {
        await for (String s in makeStream(['a3', 'b3'], i++, log)) {
          continue L1;
        }
      }
      L2:
      await for (String s in makeStream(['a4', 'b4'], i++, log)) {
        await for (String s in makeStream(['a5', 'b5'], i++, log)) {
          continue L2;
        }
      }
    }
  }
  Expect.listEquals([
      3, 4, 6, 7, 9, 10, 12, 13, 16, 17, 19, 20, 22, 23, 25, 26
    ], log);
}

main() {
  asyncStart();
  Future.wait([test1(), test2(), test3(), test4()]).then((v) => asyncEnd());
}
