| // 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 "package:expect/variations.dart" as v; | 
 | 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.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"); | 
 |  | 
 |   // Note: this is the last expectation because, when `!v.checkedParameters` | 
 |   // this ends up modifying [l1]. | 
 |   final e = Expect.throwsWhen( | 
 |     v.checkedParameters, | 
 |     () => l1.removeAt(null), | 
 |     "index is null", | 
 |   ); | 
 |   if (e != null) { | 
 |     Expect.equals( | 
 |       !v.unsoundNullSafety, | 
 |       e is TypeError, | 
 |       "TypeError expected in sound null safety", | 
 |     ); | 
 |     Expect.equals( | 
 |       v.unsoundNullSafety, | 
 |       e is ArgumentError, | 
 |       "ArgumentError expected in unsound null safety", | 
 |     ); | 
 |   } | 
 | } | 
 |  | 
 | 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"); | 
 | } |