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