// 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) {
  bool checkedMode = false;
  assert(checkedMode = true);

  // Index must be integer and in range.
  Expect.throws(() {
    l1.removeAt(-1);
  }, (e) => e is RangeError, "negative");
  Expect.throws(() {
    l1.removeAt(5);
  }, (e) => e is RangeError, "too large");
  Expect.throws(() {
    l1.removeAt(null);
  }, (e) => e is ArgumentError, "too large");
  Expect.throws(() {
    l1.removeAt("1");
  }, (e) => (checkedMode ? e is TypeError : e is ArgumentError), "string");
  Expect.throws(() {
    l1.removeAt(1.5);
  }, (e) => (checkedMode ? e is TypeError : e is ArgumentError), "double");

  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(5);
  for (var i = 0; i < 5; i++) l2[i] = i;
  Expect.throws(() {
    l2.removeAt(2);
  }, (e) => e is UnsupportedError, "fixed-length");

  // Unmodifiable list.
  var l3 = const [0, 1, 2, 3, 4];
  Expect.throws(() {
    l3.removeAt(2);
  }, (e) => e is UnsupportedError, "unmodifiable");

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