// 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 start, int end, [fillValue]) {
  List copy = list.toList();
  list.fillRange(start, end, fillValue);
  Expect.equals(copy.length, list.length);
  for (int i = 0; i < start; i++) {
    Expect.equals(copy[i], list[i]);
  }
  for (int i = start; i < end; i++) {
    Expect.equals(fillValue, list[i]);
  }
  for (int i = end; i < list.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, 1);
  test([1, 2, 3], 0, 1, 99);
  test([1, 2, 3], 1, 1);
  test([1, 2, 3], 1, 1, 499);
  test([1, 2, 3], 3, 3);
  test([1, 2, 3], 3, 3, 499);
  test([1, 2, 3].toList(growable: false), 0, 1);
  test([1, 2, 3].toList(growable: false), 0, 1, 99);
  test([1, 2, 3].toList(growable: false), 1, 1);
  test([1, 2, 3].toList(growable: false), 1, 1, 499);
  test([1, 2, 3].toList(growable: false), 3, 3);
  test([1, 2, 3].toList(growable: false), 3, 3, 499);
  test(new MyList([1, 2, 3]), 0, 1);
  test(new MyList([1, 2, 3]), 0, 1, 99);
  test(new MyList([1, 2, 3]), 1, 1);
  test(new MyList([1, 2, 3]), 1, 1, 499);
  test(new MyList([1, 2, 3]), 3, 3);
  test(new MyList([1, 2, 3]), 3, 3, 499);

  Expect.throwsRangeError(() => test([1, 2, 3], -1, 0));
  Expect.throwsRangeError(() => test([1, 2, 3], 2, 1));
  Expect.throwsRangeError(() => test([1, 2, 3], 0, -1));
  Expect.throwsRangeError(() => test([1, 2, 3], 1, 4));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), -1, 0));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), 2, 1));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), 0, -1));
  Expect.throwsRangeError(() => test(new MyList([1, 2, 3]), 1, 4));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 2, 3));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], -1, 0));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 2, 1));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 0, -1));
  Expect.throwsUnsupportedError(() => test(const [1, 2, 3], 1, 4));
}
