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

// TODO(jmesserly): this is a copy of the language test of the same name,
// we can remove this copy when we're running against those tests.
import "package:expect/expect.dart";

Iterable<int> foo1() sync* {
  yield 1;
}

Iterable<int> foo2(p) sync* {
  bool t = false;
  yield null;
  while (true) {
    a:
    for (int i = 0; i < p; i++) {
      if (!t) {
        for (int j = 0; j < 3; j++) {
          yield -1;
          t = true;
          break a;
        }
      }
      yield i;
    }
  }
}

// p is copied to all Iterators from the Iterable returned by foo3.
// Also each iterator will have its own i.
Iterable<int> foo3(int p) sync* {
  int i = 0;
  i++;
  p++;
  yield p + i;
}

void testCapturingInSyncStar() {
  int localL0 = 0;

  nested1(int paramL1) sync* {
    int localL1 = 0;
    localL0 += 10;
    paramL1 += 100;

    nested2(int paramL2) sync* {
      int localL2 = 0;
      localL0 += 1000;
      paramL1 += 10000;
      localL1 += 100000;
      paramL2 += 1000000;
      localL2 += 10000000;

      yield localL0 + paramL1 + localL1 + paramL2 + localL2;
    }

    yield nested2(0);
  }

  Iterable t1 = nested1(0);

  Iterator it11 = t1.iterator;
  Iterator it12 = t1.iterator;
  it11.moveNext();
  it12.moveNext();

  Iterable t2 = it11.current;
  Iterable t3 = it12.current;
  Iterator it21 = t2.iterator;
  Iterator it22 = t2.iterator;
  Iterator it31 = t3.iterator;
  Iterator it32 = t3.iterator;

  it21.moveNext();
  it22.moveNext();
  it31.moveNext();
  it32.moveNext();

  Expect.equals(11111120, it21.current);
  Expect.equals(11222120, it22.current);
  Expect.equals(11113120, it31.current);
  Expect.equals(11224120, it32.current);
}

main() {
  Expect.listEquals([1], foo1().toList());
  Expect.listEquals(
      [null, -1, 0, 1, 2, 3, 0, 1, 2, 3], foo2(4).take(10).toList());
  Iterable t = foo3(0);
  Iterator it1 = t.iterator;
  Iterator it2 = t.iterator; //# copyParameters: ok
  it1.moveNext();
  it2.moveNext(); //# copyParameters: continued
  Expect.equals(2, it1.current);
  // TODO(sigurdm): Check up on the spec here.
  Expect.equals(2, it2.current); // //# copyParameters: continued
  Expect.isFalse(it1.moveNext());
  // Test that two `moveNext()` calls are fine.
  Expect.isFalse(it1.moveNext());
  Expect.isFalse(it2.moveNext()); //# copyParameters: continued
  Expect.isFalse(it2.moveNext()); //# copyParameters: continued

  testCapturingInSyncStar(); //# capturing: ok
}
