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

import "dart:collection";

import "package:test/test.dart";

import "package:collection/collection.dart";

/// Iterable like [base] except that it throws when value equals [errorValue].
Iterable iterError(Iterable base, int errorValue) {
  return base.map((x) => x == errorValue ? throw "BAD" : x);
}

main() {
  test("Basic", () {
    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Uneven length 1", () {
    expect(new IterableZip([[1, 2, 3, 99, 100], [4, 5, 6], [7, 8, 9]]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Uneven length 2", () {
    expect(new IterableZip([[1, 2, 3], [4, 5, 6, 99, 100], [7, 8, 9]]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Uneven length 3", () {
    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9, 99, 100]]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Uneven length 3", () {
    expect(new IterableZip([[1, 2, 3, 98], [4, 5, 6], [7, 8, 9, 99, 100]]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Empty 1", () {
    expect(new IterableZip([[], [4, 5, 6], [7, 8, 9]]), equals([]));
  });

  test("Empty 2", () {
    expect(new IterableZip([[1, 2, 3], [], [7, 8, 9]]), equals([]));
  });

  test("Empty 3", () {
    expect(new IterableZip([[1, 2, 3], [4, 5, 6], []]), equals([]));
  });

  test("Empty source", () {
    expect(new IterableZip([]), equals([]));
  });

  test("Single Source", () {
    expect(new IterableZip([[1, 2, 3]]), equals([[1], [2], [3]]));
  });

  test("Not-lists", () {
    // Use other iterables than list literals.
    Iterable it1 = [1, 2, 3, 4, 5, 6].where((x) => x < 4);
    Set it2 = new LinkedHashSet()..add(4)..add(5)..add(6);
    Iterable it3 = (new LinkedHashMap()..[7] = 0 ..[8] = 0 ..[9] = 0).keys;
    Iterable<Iterable> allIts =
        new Iterable.generate(3, (i) => [it1, it2, it3][i]);
    expect(new IterableZip(allIts),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });

  test("Error 1", () {
    expect(() => new IterableZip([iterError([1, 2, 3], 2),
                                  [4, 5, 6],
                                  [7, 8, 9]]).toList(),
           throwsA(equals("BAD")));
  });

  test("Error 2", () {
    expect(() => new IterableZip([[1, 2, 3],
                                  iterError([4, 5, 6], 5),
                                  [7, 8, 9]]).toList(),
           throwsA(equals("BAD")));
  });

  test("Error 3", () {
    expect(() => new IterableZip([[1, 2, 3],
                                  [4, 5, 6],
                                  iterError([7, 8, 9], 8)]).toList(),
           throwsA(equals("BAD")));
  });

  test("Error at end", () {
    expect(() => new IterableZip([[1, 2, 3],
                                  iterError([4, 5, 6], 6),
                                  [7, 8, 9]]).toList(),
           throwsA(equals("BAD")));
  });

  test("Error before first end", () {
    expect(() => new IterableZip([iterError([1, 2, 3, 4], 4),
                                  [4, 5, 6],
                                  [7, 8, 9]]).toList(),
           throwsA(equals("BAD")));
  });

  test("Error after first end", () {
    expect(new IterableZip([[1, 2, 3],
                            [4, 5, 6],
                            iterError([7, 8, 9, 10], 10)]),
           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
  });
}
