// 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 "package:expect/expect.dart";
import "dart:collection";

test(List list, int index, Iterable iterable) {
  List copy = list.toList();
  list.setAll(index, iterable);
  Expect.equals(copy.length, list.length);
  for (int i = 0; i < index; i++) {
    Expect.equals(copy[i], list[i]);
  }
  List iterableList = iterable.toList();
  for (int i = 0; i < iterableList.length; i++) {
    Expect.equals(iterableList[i], list[i + index]);
  }
  for (int i = index + iterableList.length; i < copy.length; i++) {
    Expect.equals(copy[i], list[i]);
  }
}

class MyList extends ListBase {
  List list;
  MyList(this.list);
  get length => list.length;
  set length(value) {
    list.length = value;
  }

  operator [](index) => list[index];
  operator []=(index, val) {
    list[index] = val;
  }

  toString() => list.toString();
}

main() {
  test([1, 2, 3], 0, [4, 5]);
  test([1, 2, 3], 1, [4, 5]);
  test([1, 2, 3], 2, [4]);
  test([1, 2, 3], 3, []);
  test([1, 2, 3], 0, [4, 5].map((x) => x));
  test([1, 2, 3], 1, [4, 5].map((x) => x));
  test([1, 2, 3], 2, [4].map((x) => x));
  test([1, 2, 3], 3, [].map((x) => x));
  test([1, 2, 3], 0, const [4, 5]);
  test([1, 2, 3], 1, const [4, 5]);
  test([1, 2, 3], 2, const [4]);
  test([1, 2, 3], 3, const []);
  test([1, 2, 3], 0, new Iterable.generate(2, (x) => x + 4));
  test([1, 2, 3], 1, new Iterable.generate(2, (x) => x + 4));
  test([1, 2, 3], 2, new Iterable.generate(1, (x) => x + 4));
  test([1, 2, 3], 3, new Iterable.generate(0, (x) => x + 4));
  test([1, 2, 3].toList(growable: false), 0, [4, 5]);
  test([1, 2, 3].toList(growable: false), 1, [4, 5]);
  test([1, 2, 3].toList(growable: false), 2, [4]);
  test([1, 2, 3].toList(growable: false), 3, []);
  test([1, 2, 3].toList(growable: false), 0, [4, 5].map((x) => x));
  test([1, 2, 3].toList(growable: false), 1, [4, 5].map((x) => x));
  test([1, 2, 3].toList(growable: false), 2, [4].map((x) => x));
  test([1, 2, 3].toList(growable: false), 3, [].map((x) => x));
  test([1, 2, 3].toList(growable: false), 0, const [4, 5]);
  test([1, 2, 3].toList(growable: false), 1, const [4, 5]);
  test([1, 2, 3].toList(growable: false), 2, const [4]);
  test([1, 2, 3].toList(growable: false), 3, const []);
  test([1, 2, 3].toList(growable: false), 0,
      new Iterable.generate(2, (x) => x + 4));
  test([1, 2, 3].toList(growable: false), 1,
      new Iterable.generate(2, (x) => x + 4));
  test([1, 2, 3].toList(growable: false), 2,
      new Iterable.generate(1, (x) => x + 4));
  test([1, 2, 3].toList(growable: false), 3,
      new Iterable.generate(0, (x) => x + 4));
  test(new MyList([1, 2, 3]), 0, [4, 5]);
  test(new MyList([1, 2, 3]), 1, [4, 5]);
  test(new MyList([1, 2, 3]), 2, [4]);
  test(new MyList([1, 2, 3]), 3, []);
  test(new MyList([1, 2, 3]), 0, [4, 5].map((x) => x));
  test(new MyList([1, 2, 3]), 1, [4, 5].map((x) => x));
  test(new MyList([1, 2, 3]), 2, [4].map((x) => x));
  test(new MyList([1, 2, 3]), 3, [].map((x) => x));

  Expect.throwsRangeError(() => test([1, 2, 3], -1, [4, 5]));
  Expect.throwsRangeError(
      () => test([1, 2, 3].toList(growable: false), -1, [4, 5]));
  Expect.throwsRangeError(() => test([1, 2, 3], 1, [4, 5, 6]));
  Expect.throwsRangeError(
      () => test([1, 2, 3].toList(growable: false), 1, [4, 5, 6]));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), -1, [4, 5]));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), 1, [4, 5, 6]));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 0, [4, 5]));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], -1, [4, 5]));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 1, [4, 5, 6]));
}
