// Copyright (c) 2011, 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';

class MyList extends ListBase {
  List list;
  MyList(this.list);

  get length => list.length;
  set length(val) {
    list.length = val;
  }

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

  String toString() => "[" + join(", ") + "]";
}

// l1 must be a modifiable list with 5 elements from 0 to 4.
void testModifiableList(l1) {
  // Index must be integer and in range.
  Expect.throwsRangeError(() => l1.removeAt(-1), "negative");
  Expect.throwsRangeError(() => l1.removeAt(5), "too large");
  Expect.throws(() => l1.removeAt(null),
      // With sound null safety a TypeError is thrown.
      // Without sound null safety an ArgumentError is thrown.
      (e) => e is TypeError || e is ArgumentError, "is null");

  Expect.equals(2, l1.removeAt(2), "l1-remove2");
  Expect.equals(1, l1[1], "l1-1[1]");

  Expect.equals(3, l1[2], "l1-1[2]");
  Expect.equals(4, l1[3], "l1-1[3]");
  Expect.equals(4, l1.length, "length-1");

  Expect.equals(0, l1.removeAt(0), "l1-remove0");
  Expect.equals(1, l1[0], "l1-2[0]");
  Expect.equals(3, l1[1], "l1-2[1]");
  Expect.equals(4, l1[2], "l1-2[2]");
  Expect.equals(3, l1.length, "length-2");
}

void main() {
  // Normal modifiable list.
  testModifiableList([0, 1, 2, 3, 4]);
  testModifiableList(new MyList([0, 1, 2, 3, 4]));

  // Fixed size list.
  var l2 = new List<int?>.filled(5, null);
  for (var i = 0; i < 5; i++) l2[i] = i;
  Expect.throwsUnsupportedError(() => l2.removeAt(2), "fixed-length");

  // Unmodifiable list.
  var l3 = const [0, 1, 2, 3, 4];
  Expect.throwsUnsupportedError(() => l3.removeAt(2), "unmodifiable");

  // Empty list is not special.
  var l4 = [];
  Expect.throwsRangeError(() => l4.removeAt(0), "empty");
}
