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

// Simple test program for sync* generator functions.

// VMOptions=--optimization_counter_threshold=10 --no-background_compilation

import "package:expect/expect.dart";

sum10() sync* {
  var s = 0;
  for (var k = 1; k <= 10; k++) {
    s += k;
    yield s;
  }
}

class Range {
  int start, end;
  Range(this.start, this.end);
  elements() sync* {
    var e = start;
    while (e <= end) yield e++;
  }

  get yield sync* {  // yield is a legal member name here.
    var e = start;
    while (e <= end) yield e++;
  }
}

get sync sync* {  // sync is a legal identifier.
  yield "sync";
}

einsZwei() sync* {
  yield 1;
  yield* [2, 3];
  yield* [];
  yield 5;
  yield [6];
}

dreiVier() sync* {
  // Throws type error: yielded object is not an iterable.
  yield* 3; /// 01: static type warning
}

main() {
  for (int i = 0; i < 10; i++) {
    var sums = sum10();
    print(sums);
    Expect.isTrue(sums is Iterable);
    Expect.equals(10, sums.length);
    Expect.equals(1, sums.first);
    Expect.equals(55, sums.last);
    var q = "";
    for (var n in sums.take(3)) {
      q += "$n ";
    }
    Expect.equals("1 3 6 ", q);

    var r = new Range(10, 12);
    var elems1 = r.elements();
    print(elems1);
    var elems2 = r.yield;
    print(elems2);
    // Walk the elements of each iterable and compare them.
    var i = elems1.iterator;
    Expect.isTrue(i is Iterator);
    elems2.forEach((e) {
      Expect.isTrue(i.moveNext());
      Expect.equals(e, i.current);
    });

    print(sync);
    Expect.equals("sync", sync.single);

    print(einsZwei());
    Expect.equals("(1, 2, 3, 5, [6])", einsZwei().toString());

    Expect.throws(() => dreiVier().toString()); /// 01: continued
  }
}
