// Copyright (c) 2013, 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

import "package:expect/expect.dart";

main() {
  void test(expectedList, generatedIterable) {
    Expect.equals(expectedList.length, generatedIterable.length);
    Expect.listEquals(expectedList, generatedIterable.toList());
  }

  test([], new Iterable.generate(0));
  test([0], new Iterable.generate(1));
  test([0, 1, 2, 3, 4], new Iterable.generate(5));
  test(["0", "1", "2", "3", "4"], new Iterable.generate(5, (x) => "$x"));
  test([2, 3, 4, 5, 6], new Iterable.generate(7).skip(2));
  test([0, 1, 2, 3, 4], new Iterable.generate(7).take(5));
  test([], new Iterable.generate(5).skip(6));
  test([], new Iterable.generate(5).take(0));
  test([], new Iterable.generate(5).take(3).skip(3));
  test([], new Iterable.generate(5).skip(6).take(0));

  // Test types.

  Iterable<int> it = new Iterable<int>.generate(5);
  Expect.isTrue(it is Iterable<int>);
  Expect.isTrue(it.iterator is Iterator<int>);
  Expect.isTrue(it is! Iterable<String>);
  Expect.isTrue(it.iterator is! Iterator<String>);
  test([0, 1, 2, 3, 4], it);

  Iterable<String> st = new Iterable<String>.generate(5, (x) => "$x");
  Expect.isTrue(st is Iterable<String>);
  Expect.isTrue(st.iterator is Iterator<String>);
  Expect.isFalse(st is Iterable<int>);
  Expect.isFalse(st.iterator is Iterator<int>);
  test(["0", "1", "2", "3", "4"], st);

  Expect.throws(() => new Iterable<String>.generate(5));

  // Omitted generator function means `(int x) => x`, and the type parameters
  // must then be compatible with `int`.
  // Check that we catch invalid type parameters.

  // Valid types:
  Iterable<int> iter1 = new Iterable<int>.generate(5);
  Expect.equals(2, iter1.elementAt(2));
  Iterable<num> iter2 = new Iterable<num>.generate(5);
  Expect.equals(2, iter2.elementAt(2));
  Iterable<Object> iter3 = new Iterable<Object>.generate(5);
  Expect.equals(2, iter3.elementAt(2));
  Iterable<dynamic> iter4 = new Iterable<dynamic>.generate(5);
  Expect.equals(2, iter4.elementAt(2));

  // Invalid types:
  Expect.throws(() => new Iterable<String>.generate(5));
  Expect.throws(() => new Iterable<Null>.generate(5).elementAt(2));   //# 01: ok
  Expect.throws(() => new Iterable<bool>.generate(5));

  // Regression: https://github.com/dart-lang/sdk/issues/26358
  var count = 0;
  var iter = new Iterable.generate(5, (v) {
    count++;
    return v;
  });
  Expect.equals(0, count);
  Expect.equals(2, iter.elementAt(2)); // Doesn't compute the earlier values.
  Expect.equals(1, count);
  Expect.equals(2, iter.skip(2).first); // Doesn't compute the skipped values.
  Expect.equals(2, count);
}
