// Copyright (c) 2012, 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 "dart:collection" show Queue;
import "dart:typed_data" show Uint8List, Float32List;
import "package:expect/expect.dart";

main() {
  // testIterable takes an iterable and a list expected to be equal to
  // the iterable's toList result, including the type parameter of the list.
  testIterable(<dynamic>[], <dynamic>[]);
  testIterable(<int>[], <int>[]);
  testIterable(<String>[], <String>[]);
  testIterable([1, 2, 3], [1, 2, 3]);
  testIterable(<int>[1, 2, 3], <int>[1, 2, 3]);
  testIterable(const [1, 2], [1, 2]);
  testIterable(const <int>[1, 2], <int>[1, 2]);
  testIterable(<dynamic, dynamic>{"x": 1, "y": 1}.keys, <dynamic>["x", "y"]);
  testIterable(<String, int>{"x": 1, "y": 1}.keys, <String>["x", "y"]);
  testIterable(<dynamic, dynamic>{"x": 2, "y": 3}.values, <dynamic>[2, 3]);
  testIterable(<String, int>{"x": 2, "y": 3}.values, <int>[2, 3]);
  testIterable(new Iterable.generate(3), [0, 1, 2]);
  testIterable(new Iterable<int>.generate(3), <int>[0, 1, 2]);
  testIterable(
      new Iterable<String>.generate(3, (x) => "$x"), <String>["0", "1", "2"]);
  testIterable(new Set.from([1, 2, 3]), [1, 2, 3]);
  testIterable(new Set<int>.from([1, 2, 3]), <int>[1, 2, 3]);
  testIterable(new Queue.from([1, 2, 3]), [1, 2, 3]);
  testIterable(new Queue<int>.from(<int>[1, 2, 3]), <int>[1, 2, 3]);
  testIterable(new Uint8List.fromList(<int>[1, 2, 3]), //    //# 01: ok
      <int>[1, 2, 3]); //                                    //# 01: continued
  testIterable(new Float32List.fromList([1.0, 2.0, 3.0]), // //# 01: continued
      <double>[1.0, 2.0, 3.0]); //                           //# 01: continued
  testIterable("abc".codeUnits, <int>[97, 98, 99]); //       //# 01: continued
  testIterable("abc".runes, <int>[97, 98, 99]);
}

testIterable(Iterable iterable, List expected, [int depth = 0]) {
  print(" " * depth + "${iterable.runtimeType} vs ${expected.runtimeType}");
  test(iterable, expected);
  test(iterable, expected, growable: true);
  test(iterable, expected, growable: false);
  if (depth < 2) {
    depth++;
    testIterable(iterable.map((x) => x), new List.from(expected), depth);
    testIterable(iterable.where((x) => true), expected, depth);
    testIterable(iterable.expand((x) => [x]), new List.from(expected), depth);
    testIterable(iterable.map((x) => x), new List.from(expected), depth);
    testIterable(iterable.skipWhile((x) => false), expected, depth);
    testIterable(iterable.takeWhile((x) => true), expected, depth);
    testIterable(iterable.skip(0), expected, depth);
    testIterable(iterable.take(expected.length * 2), expected, depth);
    testIterable(iterable.toSet(), expected, depth);
  }
}

test(Iterable iterable, List expected, {bool growable: true}) {
  var list = iterable.toList(growable: growable);
  Expect.listEquals(expected, list);
  Expect.equals(expected is List<int>, list is List<int>, "int");
  Expect.equals(expected is List<double>, list is List<double>, "double");
  Expect.equals(expected is List<String>, list is List<String>, "str");
  if (growable) {
    int length = list.length;
    list.add(null);
    Expect.equals(length + 1, list.length);
  } else {
    Expect.throws(() {
      list.add(null);
    });
  }
}
