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

// @dart = 2.9

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