blob: 932d4caba15a0b3903c891ca1bc24f13cb55c754 [file] [log] [blame]
// 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 "dart:collection";
import "package:expect/expect.dart";
void main() {
testFixedLengthList(new List(4));
// ListBase implementation of List.
testFixedLengthList(new MyFixedList(new List(4)));
testGrowableList(new List());
testGrowableList([]);
testGrowableList(new MyList([]));
}
void expectValues(list, val1, val2, val3, val4) {
Expect.isFalse(list.isEmpty);
Expect.equals(4, list.length);
Expect.equals(list[0], val1);
Expect.equals(list[1], val2);
Expect.equals(list[2], val3);
Expect.equals(list[3], val4);
}
void testClosures(List list) {
testMap(val) {return val * 2 + 10; }
List mapped = list.map(testMap).toList();
Expect.equals(mapped.length, list.length);
for (var i = 0; i < list.length; i++) {
Expect.equals(mapped[i], list[i]*2 + 10);
}
testFilter(val) { return val == 3; }
Iterable filtered = list.where(testFilter);
Expect.equals(filtered.length, 1);
testEvery(val) { return val != 11; }
bool test = list.every(testEvery);
Expect.isTrue(test);
testSome(val) { return val == 1; }
test = list.any(testSome);
Expect.isTrue(test);
testSomeFirst(val) { return val == 0; }
test = list.any(testSomeFirst);
Expect.isTrue(test);
testSomeLast(val) { return val == (list.length - 1); }
test = list.any(testSomeLast);
Expect.isTrue(test);
}
void testFixedLengthList(List list) {
Expect.equals(list.length, 4);
list[0] = 4;
expectValues(list, 4, null, null, null);
String val = "fisk";
list[1] = val;
expectValues(list, 4, val, null, null);
double d = 2.0;
list[3] = d;
expectValues(list, 4, val, null, d);
for (int i = 0; i < list.length; i++) {
list[i] = i;
}
for (int i = 0; i < 4; i++) {
Expect.equals(i, list[i]);
Expect.equals(i, list.indexOf(i));
Expect.equals(i, list.lastIndexOf(i));
}
Expect.equals(-1, list.indexOf(100));
Expect.equals(-1, list.lastIndexOf(100));
list[2] = new Yes();
Expect.equals(2, list.indexOf(100));
Expect.equals(2, list.lastIndexOf(100));
list[3] = new Yes();
Expect.equals(2, list.indexOf(100));
Expect.equals(3, list.lastIndexOf(100));
list[2] = 2;
Expect.equals(3, list.indexOf(100));
Expect.equals(3, list.lastIndexOf(100));
list[3] = 3;
Expect.equals(-1, list.indexOf(100));
Expect.equals(-1, list.lastIndexOf(100));
testClosures(list);
Expect.throws(list.clear, (e) => e is UnsupportedError);
}
void testGrowableList(List list) {
Expect.isTrue(list.isEmpty);
Expect.equals(list.length, 0);
list.add(4);
Expect.equals(1, list.length);
Expect.isTrue(!list.isEmpty);
Expect.equals(list.length, 1);
Expect.equals(list.length, 1);
Expect.equals(list.removeLast(), 4);
for (int i = 0; i < 10; i++) {
list.add(i);
}
Expect.equals(list.length, 10);
for (int i = 0; i < 10; i++) {
Expect.equals(i, list[i]);
Expect.equals(i, list.indexOf(i));
Expect.equals(i, list.lastIndexOf(i));
}
Expect.equals(-1, list.indexOf(100));
Expect.equals(-1, list.lastIndexOf(100));
list[2] = new Yes();
Expect.equals(2, list.indexOf(100));
Expect.equals(2, list.lastIndexOf(100));
list[3] = new Yes();
Expect.equals(2, list.indexOf(100));
Expect.equals(3, list.lastIndexOf(100));
list[2] = 2;
Expect.equals(3, list.indexOf(100));
Expect.equals(3, list.lastIndexOf(100));
list[3] = 3;
Expect.equals(-1, list.indexOf(100));
Expect.equals(-1, list.lastIndexOf(100));
testClosures(list);
Expect.equals(9, list.removeLast());
list.clear();
Expect.equals(0, list.length);
Expect.isTrue(list.isEmpty);
}
class Yes {
operator ==(var other) => true;
}
class MyList<E> extends ListBase<E> {
List<E> _source;
MyList(this._source);
int get length => _source.length;
void set length(int length) { _source.length = length; }
E operator[](int index) => _source[index];
void operator[]=(int index, E value) { _source[index] = value; }
}
class MyFixedList<E> extends ListBase<E> {
List<E> _source;
MyFixedList(this._source);
int get length => _source.length;
void set length(int length) { throw new UnsupportedError("Fixed length!"); }
E operator[](int index) => _source[index];
void operator[]=(int index, E value) { _source[index] = value; }
}