// 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.

// @dart = 2.9

/// @assertion  Furthermore, let ak be the set of asynchronous for loops and
/// yield-each statements enclosing sb 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 various mixes of synchronous and asynchronous for loops
/// with single break statement.
///
/// @author a.semenov@unipro.ru

import 'dart:async';
import '../../../Utils/expect.dart';

StreamController<String> newStreamControllerString(int id, List<int> log) {
  StreamController<String> sc = new StreamController<String>();
  sc.add('a' + id.toString());
  sc.add('b' + id.toString());
  sc.onCancel = () {
    log.add(id);
  };
  return sc;
}

Future test1() async {
  List<int> log = [];

  L:
  await for (String s in newStreamControllerString(0, log).stream) {
    for (String s in ['a','b']) {
      break L;
    }
  }
  Expect.listEquals([0], log);
}

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

  L:
  for (String s in ['a','b']) {
    await for (String s in newStreamControllerString(0, log).stream) {
      break L;
    }
  }
  Expect.listEquals([0], log);
}

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

  for (String s in ['a','b']) {
    L:
    await for (String s in newStreamControllerString(i++, log).stream) {
      break L;
    }
  }
  Expect.listEquals([0, 1], log);
}

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

  L:
  await for (String s in newStreamControllerString(2, log).stream) {
    for (String s in ['a', 'b']) {
      await for (String s in newStreamControllerString(1, log).stream) {
        for (String s in ['a', 'b']) {
          await for (String s in newStreamControllerString(0, log).stream) {
            break L;
          }
        }
      }
    }
  }
  Expect.listEquals([0, 1, 2], log);
}

Future test5() async {
  List<int> log = [];

  L:
  for (String s in ['a', 'b']) {
    await for (String s in newStreamControllerString(1, log).stream) {
      for (String s in ['a', 'b']) {
        await for (String s in newStreamControllerString(0, log).stream) {
          for (String s in ['a', 'b']) {
            break L;
          }
        }
      }
    }
  }
  Expect.listEquals([0, 1], log);
}

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

  for (String s in ['a', 'b']) {
    L:
    await for (String s in newStreamControllerString(i++, log).stream) {
      for (String s in ['a', 'b']) {
        await for (String s in newStreamControllerString(i++, log).stream) {
          for (String s in ['a', 'b']) {
            break L;
          }
        }
      }
    }
  }
  Expect.listEquals([1, 0, 3, 2], log);
}

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

  for (String s in ['a', 'b']) {
    var streamController = newStreamControllerString(i++, log);
    await for (String s in streamController.stream) {
      L:
      for (String s in ['a', 'b']) {
        await for (String s in newStreamControllerString(i++, log).stream) {
          for (String s in ['a', 'b']) {
            break L;
          }
        }
      }
      if (s.startsWith('b')) {
        streamController.close();
      }
    }
  }
  Expect.listEquals([1, 2, 0, 4, 5, 3], log);
}

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

  var streamController = newStreamControllerString(i++, log);
  await for (String s in streamController.stream) {
    for (String s in ['a', 'b']) {
      L:
      await for (String s in newStreamControllerString(i++, log).stream) {
        for (String s in ['a', 'b']) {
          await for (String s in newStreamControllerString(i++, log).stream) {
            break L;
          }
        }
      }
    }
    if (s.startsWith('b')) {
      streamController.close();
    }
  }
  Expect.listEquals([2, 1, 4, 3, 6, 5, 8, 7, 0], log);
}

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