blob: aaffb92a95ecb0c6677993c4a72695ad65d7d319 [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.
part of observable_tests;
testObservableList() {
test('ObservableList', () {
final arr = new ObservableList<int>();
// Add some initial data before listening
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(1);
arr.add(3);
arr.add(4);
expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
// Add a listener that saves the events
EventSummary res = null;
arr.addChangeListener((summary) {
expect(res, isNull);
res = summary;
expect(res, isNotNull);
});
// execute some code with readonly operations only
expect(res, isNull);
bool called = false;
EventBatch.wrap((e) {
expect(arr, hasLength(6));
expect(arr[0], equals(1));
// TODO(sigmund): why we need write startIndex? it should be optional.
expect(arr.indexOf(4, 0), equals(5));
expect(arr.indexOf(1, 0), equals(0));
expect(arr.indexOf(1, 1), equals(3));
// TODO(rnystrom): Get rid of second arg when lastIndexOf has default.
expect(arr.lastIndexOf(1, arr.length - 1), equals(3));
expect(arr.last, equals(4));
final copy = new List<int>();
arr.forEach((i) {
copy.add(i);
});
expect(copy, orderedEquals([1, 2, 3, 1, 3, 4]));
called = true;
})(null);
expect(called, isTrue);
expect(res, isNull); // no change from read-only operators
// execute some code with mutations
expect(res, isNull);
called = false;
expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
EventBatch.wrap((e) {
arr.add(5); // 1 2 3 1 3 4(5)
arr.add(6); // 1 2 3 1 3 4 5(6)
arr[1] = arr[arr.length - 1]; // 1(6)3 1 3 4 5 6
arr.add(7); // 1 6 3 1 3 4 5 6(7)
arr[5] = arr[8]; // 1 6 3 1 3(7)5 6 7
arr.add(42); // 1 6 3 1 3 7 5 6 7(42)
expect(arr.removeAt(3), equals(1)); // 1 6 3( )3 7 5 6 7 42
expect(arr.removeFirstElement(3), isTrue); // 1 6( ) 3 7 5 6 7 42
expect(arr.removeLast(), equals(42)); // 1 6 3 7 5 6 7( )
expect(arr.removeAllElements(6), equals(2)); // 1( ) 3 7 5( )7
called = true;
})(null);
expect(called, isTrue);
expect(res, isNotNull);
expect(res.events, hasLength(11));
validateInsert(res.events[0], arr, null, 6, 5);
validateInsert(res.events[1], arr, null, 7, 6);
validateUpdate(res.events[2], arr, null, 1, 6, 2);
validateInsert(res.events[3], arr, null, 8, 7);
validateUpdate(res.events[4], arr, null, 5, 7, 4);
validateInsert(res.events[5], arr, null, 9, 42);
validateRemove(res.events[6], arr, null, 3, 1);
validateRemove(res.events[7], arr, null, 2, 3);
validateRemove(res.events[8], arr, null, 7, 42);
validateRemove(res.events[9], arr, null, 1, 6);
validateRemove(res.events[10], arr, null, 4, 6);
expect(arr, orderedEquals([1, 3, 7, 5, 7]));
res = null;
expect(res, isNull);
called = false;
// execute global mutations like sort and clear
EventBatch.wrap((e) {
arr.add(1);
arr.add(4);
arr.add(10);
arr.add(9);
arr.sort((int a, int b) {
return a - b;
});
called = true;
})(null);
expect(called, isTrue);
expect(res, isNotNull);
expect(res.events.length, equals(5));
validateInsert(res.events[0], arr, null, 5, 1);
validateInsert(res.events[1], arr, null, 6, 4);
validateInsert(res.events[2], arr, null, 7, 10);
validateInsert(res.events[3], arr, null, 8, 9);
validateGlobal(res.events[4], arr);
expect(arr, orderedEquals([1, 1, 3, 4, 5, 7, 7, 9, 10]));
res = null;
expect(res, isNull);
called = false;
EventBatch.wrap((e) {
arr.clear();
called = true;
})(null);
expect(called, isTrue);
expect(res, isNotNull);
expect(res.events, hasLength(1));
validateGlobal(res.events[0], arr);
expect(arr, orderedEquals([]));
});
}