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

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);
    });
  }
}
