// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
module Tests {
"use strict";
var List = WinJS.Binding.List;
var post = function post (v) {
return WinJS.Utilities.Scheduler.schedulePromiseNormal().
then(function () { return v; });
};
var errorHandler = function errorHandler (msg) {
try {
LiveUnit.Assert.fail('There was an unhandled error in your test: ' + msg);
} catch (ex) { }
};
var assertSequenceEquals = function assertSequenceEquals (a, b) {
LiveUnit.Assert.areEqual(a.length, b.length);
var i, len;
for (i = 0, len = a.length; i < len; i++) {
LiveUnit.Assert.isTrue(a[i] === b[i], "Element at index '" + i + "' expected to be the same");
}
};
// @TODO, currently assertSameAsList doesn't corectly handle sparse lists.
//
var ListListener = WinJS.Class.define(
function ListListener(list, valueOf) {
this._valueOf = valueOf || function (v) { return v; };
this._notificationCounts = {
itemchanged: 0,
iteminserted: 0,
itemmoved: 0,
itemremoved: 0,
length: 0,
reload: 0
};
this._list = list;
this._list.addEventListener("itemchanged", this._listItemChanged.bind(this));
this._list.addEventListener("iteminserted", this._listItemInserted.bind(this));
this._list.addEventListener("itemmoved", this._listItemMoved.bind(this));
this._list.addEventListener("itemremoved", this._listItemRemoved.bind(this));
this._list.addEventListener("reload", this._listReload.bind(this));
this._initialize();
this._list.bind("length", this._listLengthChanged.bind(this));
this.assertLengthChangedCount(1);
}, {
_data: null,
_keys: null,
_lengthChangeCount: 0,
_notificationCounts: null,
_initialize: function () {
var data = [];
var keys = [];
var i, len;
for (i = 0, len = this._list.length; i < len; i++) {
var itemData, itemKey;
var item = this._list.getItem(i);
if (item) {
itemData = this._list.getAt(i);
itemKey = this._list._getKey(i);
LiveUnit.Assert.areEqual(itemKey, item.key);
LiveUnit.Assert.areEqual(itemKey, this._list.getItemFromKey(itemKey).key);
LiveUnit.Assert.isTrue(itemData === item.data);
LiveUnit.Assert.isTrue(itemData === this._list.getItemFromKey(itemKey).data);
}
data.push(itemData);
keys.push(itemKey);
}
this._data = data;
this._keys = keys;
},
_listLengthChanged: function (newValue) {
this.notificationCounts.length++;
this._lengthChangeCount++;
this._length = newValue;
LiveUnit.Assert.areEqual(this._data.length, this._length, "length notification should come after data has been updated");
},
_listItemChanged: function (event) {
this.notificationCounts.itemchanged++;
var key = event.detail.key;
var index = event.detail.index;
var oldValue = event.detail.oldValue;
var newValue = event.detail.newValue;
LiveUnit.Assert.isTrue(this._data[index] === oldValue, "The value we knew about for this index should be the same as the oldValue input to itemchanged");
if (this._keys[index] === undefined) {
// Sparse slots are indicated by having undefined keys
LiveUnit.Assert.fail("Filling sparse slots should look like a remove/add not a change");
}
LiveUnit.Assert.areEqual(this._keys[index], key, "The key we knew about for this index should be the same as the key input to itemchanged");
this._keys[index] = key;
this._data[index] = newValue;
},
_listItemInserted: function (event) {
this.notificationCounts.iteminserted++;
var key = event.detail.key;
var index = event.detail.index;
var value = event.detail.value;
// sparse slots are indicated by undefined keys
if (key !== undefined) {
LiveUnit.Assert.areEqual(-1, this._keys.indexOf(key), "The key for the new item should not already be in the collection in iteminserted");
}
if (index < this._data.length) {
this._data.splice(index, 0, value);
this._keys.splice(index, 0, key);
} else {
this._data[index] = value;
this._keys[index] = key;
}
},
_listItemMoved: function (event) {
this.notificationCounts.itemmoved++;
var key = event.detail.key;
var value = event.detail.value;
var oldIndex = event.detail.oldIndex;
var newIndex = event.detail.newIndex;
this._data.splice(oldIndex, 1);
this._keys.splice(oldIndex, 1);
this._data.splice(newIndex, 0, value);
this._keys.splice(newIndex, 0, key);
},
_listItemRemoved: function (event) {
this.notificationCounts.itemremoved++;
var key = event.detail.key;
var index = event.detail.index;
var value = event.detail.value;
// Sparse slots are indicated by having undefined keys
if (key !== undefined) {
LiveUnit.Assert.areEqual(this._keys.indexOf(key), index, "The known index of the key should be the same as the specified index for itemremoved");
}
LiveUnit.Assert.isTrue(this._data[index] === value, "The value we knew about for this index should be the same as the value to be removed in itemremoved");
this._data.splice(index, 1);
this._keys.splice(index, 1);
},
_listReload: function () {
this.notificationCounts.reload++;
this._initialize();
},
notificationCounts: {
get: function () { return this._notificationCounts; }
},
keys: {
get: function () { return this._keys; }
},
data: {
get: function () { return this._data; }
},
assertLengthChangedCount: function (expectedCount) {
LiveUnit.Assert.areEqual(expectedCount, this._lengthChangeCount, "Unexpected number of notifications for length changed");
},
assertSameAsArray: function (array) {
LiveUnit.Assert.areEqual(array.length, this.data.length);
var i, len;
for (i = 0, len = this.data.length; i < len; i++) {
LiveUnit.Assert.isTrue(this._valueOf(array[i]) === this._valueOf(this.data[i]), "Element '" + i + "' in ListListener [" + this.data.map(this._valueOf).join(",") + "] should be the same as the element in the array [" + array.map(this._valueOf).join(",") + "]");
}
this.assertSameAsList();
},
assertSameAsList: function () {
LiveUnit.Assert.areEqual(this.keys.length, this.data.length);
LiveUnit.Assert.areEqual(this._list.length, this.data.length);
var valueOf = this._valueOf;
var i, len;
for (i = 0, len = this.data.length; i < len; i++) {
var data = this.data[i];
var key = this.keys[i];
var item = this._list.getItem(i);
if (item) {
LiveUnit.Assert.areEqual(key, this._list._getKey(i));
LiveUnit.Assert.areEqual(key, item.key);
LiveUnit.Assert.areEqual(key, this._list.getItemFromKey(key).key);
LiveUnit.Assert.isTrue(valueOf(data) === valueOf(this._list.getAt(i)));
LiveUnit.Assert.isTrue(valueOf(data) === valueOf(item.data));
LiveUnit.Assert.isTrue(valueOf(data) === valueOf(this._list.getItemFromKey(key).data));
} else {
LiveUnit.Assert.areEqual(undefined, key);
LiveUnit.Assert.areEqual(key, this._list._getKey(i));
LiveUnit.Assert.areEqual(valueOf(undefined), valueOf(data));
LiveUnit.Assert.areEqual(valueOf(data), valueOf(this._list.getAt(i)));
}
}
}
}
);
function verifyListContent (list, arr, checked = false) {
var listArray = list._getArray();
LiveUnit.Assert.isTrue(listArray instanceof Array);
for (var i = 0; i < list.length; i++) {
if (checked) {
if (!list.getAt(i) !== !arr[i]) {
return false;
}
if (!listArray[i] !== !arr[i]) {
return false;
}
}
else {
if (list.getAt(i) !== arr[i]) {
return false;
}
if (listArray[i] !== arr[i]) {
return false;
}
}
}
return list.length === arr.length;
}
function verifyBindableList (list, arr) {
if (list.length !== arr.length) {
return false;
}
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; j++) {
var elem = keys[j];
if (obj[elem] !== list.getAt(i)[elem]) {
return false;
}
}
}
return true;
}
function checkArrayContent (arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
function createAnArrayOfObjects (n) {
var arr = [];
for (var i = 0; i < n ; i++) {
arr[i] = createAnObject(i);
}
return arr;
}
function createAnObject (i) {
var arr;
if (i % 2 === 0) {
arr = { a: i };
}
else {
arr = { a: i, b: { c: i * 2 } };
}
return arr;
}
function verifySortedArr(sorted, arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== sorted.getAt(i).a) {
return false;
}
}
return true;
}
function verifySorted(list, asc = false) {
for (var i = 0; i < list.length - 1; i++) {
if (asc) {
if (list.getAt(i) > list.getAt(i + 1)) {
return false;
}
}
else {
if (list.getAt(i) < list.getAt(i + 1))
return false;
}
}
return true;
}
function specialPrime(num) {
num = Math.abs(num);
if (num === 0 || num === 1) {
return false;
}
for (var i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {
return false;
}
}
return true;
}
function testWithDifferentOptions(testFunction) {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
testFunction(options[i]);
}
}
export class ListTest {
testBasic() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.length);
LiveUnit.Assert.areEqual(1, list.getAt(0));
LiveUnit.Assert.areEqual(2, list.getAt(1));
LiveUnit.Assert.areEqual(3, list.getAt(2));
listener.assertSameAsArray([1, 2, 3]);
}
testListWithFalsyValue() {
var list = new List([0]);
LiveUnit.Assert.areEqual(0, list.getAt(0));
}
testPush() {
var list = new List();
var listener = new ListListener(list);
list.push(1);
listener.assertSameAsArray([1]);
list.push(2);
listener.assertSameAsArray([1, 2]);
list.push(3, 4);
listener.assertSameAsArray([1, 2, 3, 4]);
list.push();
listener.assertSameAsArray([1, 2, 3, 4]);
LiveUnit.Assert.areEqual(4, list.length);
}
testPop() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.pop());
listener.assertSameAsArray([1, 2]);
LiveUnit.Assert.areEqual(2, list.pop());
listener.assertSameAsArray([1]);
LiveUnit.Assert.areEqual(1, list.pop());
listener.assertSameAsArray([]);
LiveUnit.Assert.areEqual(0, list.length);
}
testUnshift() {
var list = new List();
var listener = new ListListener(list);
list.unshift(1);
listener.assertSameAsArray([1]);
list.unshift(2);
listener.assertSameAsArray([2, 1]);
list.unshift(3, 4);
listener.assertSameAsArray([3, 4, 2, 1]);
list.unshift();
listener.assertSameAsArray([3, 4, 2, 1]);
LiveUnit.Assert.areEqual(4, list.length);
}
testShift() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(1, list.shift());
listener.assertSameAsArray([2, 3]);
LiveUnit.Assert.areEqual(2, list.shift());
listener.assertSameAsArray([3]);
LiveUnit.Assert.areEqual(3, list.shift());
listener.assertSameAsArray([]);
LiveUnit.Assert.areEqual(0, list.length);
}
testReverse() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
list.reverse();
listener.assertSameAsArray([3, 2, 1]);
list.reverse();
listener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, 4]);
list.reverse();
listener.assertSameAsArray([4, 3, 2, 1]);
}
testSort() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
list.sort();
listener.assertSameAsArray([1, 2, 3]);
list.sort(function (l, r) { return r - l; });
listener.assertSameAsArray([3, 2, 1]);
list.push(5);
listener.assertSameAsArray([3, 2, 1, 5]);
list.sort(function (l, r) { return l - r; });
listener.assertSameAsArray([1, 2, 3, 5]);
list.sort(function (l, r) { return r - l; });
listener.assertSameAsArray([5, 3, 2, 1]);
var l = list.sort();
LiveUnit.Assert.areEqual(l, list);
listener.assertSameAsArray([1, 2, 3, 5]);
}
testSplice() {
var list = new List();
var listener = new ListListener(list);
list.splice(0, 0, 1);
listener.assertSameAsArray([1]);
list.splice(0, 0, 2, 3, 4);
listener.assertSameAsArray([2, 3, 4, 1]);
list.splice(1, 0, 5, 6);
listener.assertSameAsArray([2, 5, 6, 3, 4, 1]);
list.splice(1, 2, 7, 8);
listener.assertSameAsArray([2, 7, 8, 3, 4, 1]);
list.splice(10, 0, 9, 10);
listener.assertSameAsArray([2, 7, 8, 3, 4, 1, 9, 10]);
}
testConcat() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
var result = list.concat([4, 5]);
assertSequenceEquals([1, 2, 3, 4, 5], result);
assertSequenceEquals([1, 2, 3], list.concat());
listener.assertSameAsArray([1, 2, 3]);
list.pop();
list.pop();
list.pop();
listener.assertSameAsArray([]);
var result2 = list.concat([6, 7]);
assertSequenceEquals([6, 7], result2);
assertSequenceEquals([], list.concat());
}
testJoin() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
LiveUnit.Assert.areEqual("1,2,3", list.join(","));
LiveUnit.Assert.areEqual("1, 2, 3", list.join(", "));
LiveUnit.Assert.areEqual("1,2,3", list.join());
LiveUnit.Assert.areEqual("11213", list.join("1"));
LiveUnit.Assert.areEqual("1---2---3", list.join("---"));
list.length = 0;
listener.assertSameAsArray([]);
LiveUnit.Assert.areEqual("", list.join(","));
LiveUnit.Assert.areEqual("", list.join());
LiveUnit.Assert.areEqual("", list.join("1"));
LiveUnit.Assert.areEqual("", list.join("---"));
}
testSlice() {
var list = new List();
var listener = new ListListener(list);
assertSequenceEquals([], list.slice(-1));
assertSequenceEquals([], list.slice(0));
assertSequenceEquals([], list.slice(1));
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
assertSequenceEquals([2], list.slice(-1));
assertSequenceEquals([1, 2], list.slice(0));
assertSequenceEquals([2], list.slice(1));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
assertSequenceEquals([3], list.slice(-1));
assertSequenceEquals([1, 2, 3], list.slice(0));
assertSequenceEquals([2, 3], list.slice(1));
assertSequenceEquals([], list.slice(-1, 2));
assertSequenceEquals([2], list.slice(-2, -1));
assertSequenceEquals([], list.slice(-2, -2));
assertSequenceEquals([], list.slice(-2, -3));
assertSequenceEquals([], list.slice(-6, -8));
assertSequenceEquals([1, 2], list.slice(0, 2));
assertSequenceEquals([2], list.slice(1, 2));
}
testIndexOf() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
LiveUnit.Assert.areEqual(1, list.indexOf(2));
LiveUnit.Assert.areEqual(-1, list.indexOf(5));
LiveUnit.Assert.areEqual(-1, list.indexOf(2, 2));
LiveUnit.Assert.areEqual(-1, list.indexOf(2, -1));
LiveUnit.Assert.areEqual(1, list.indexOf(2, -2));
list.push(2);
LiveUnit.Assert.areEqual(1, list.indexOf(2));
LiveUnit.Assert.areEqual(-1, list.indexOf(5));
LiveUnit.Assert.areEqual(3, list.indexOf(2, 2));
}
testIndexOfKeyWhereRequestedKeyIsNextKeyToBeAssigned() {
var list = new List([0, 1, 2, 3, 4]);
LiveUnit.Assert.areEqual(-1, list.indexOfKey("5"));
LiveUnit.Assert.areEqual(-1, list.indexOfKey("6")); //key that does not exist
}
testLastIndexOf() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(5));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(2, 0));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, -1));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, -2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(2, -3));
list.push(2);
LiveUnit.Assert.areEqual(3, list.lastIndexOf(2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(5));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, 2));
}
testForEach() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
var a = [1, 2, 3]
listener.assertSameAsArray(a);
var pos = 0;
list.forEach(function (item, index) {
LiveUnit.Assert.areEqual(pos, index);
LiveUnit.Assert.areEqual(a[index], item);
LiveUnit.Assert.areEqual(a[index], list.getAt(index));
pos++;
});
LiveUnit.Assert.areEqual(pos, a.length);
list.setAt(3, 10);
a = [1, 2, 3, 10];
// With a sparse array we don't get called for all the empty slots
var count = 0;
list.forEach(function (item, index) {
count++;
LiveUnit.Assert.areEqual(a[index], item);
LiveUnit.Assert.areEqual(a[index], list.getAt(index));
});
LiveUnit.Assert.areEqual(count, 4);
}
// @TODO, test that the thisObject parameter is used correctly
// @TODO, test that the callback arguments are passed correctly
testEvery() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.setAt(3, 7);
listener.assertSameAsArray([1, 2, 3, 7]);
var count = 0;
LiveUnit.Assert.isTrue(list.every(function (item) { count++; return typeof item === "number"; }));
LiveUnit.Assert.areEqual(4, count);
list.length = 0;
listener.assertSameAsArray([]);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.push("hello");
listener.assertSameAsArray(["hello"]);
LiveUnit.Assert.isFalse(list.every(function (item) { return typeof item === "number"; }));
list.push(7);
listener.assertSameAsArray(["hello", 7]);
LiveUnit.Assert.isFalse(list.every(function (item) { return typeof item === "number"; }));
}
// @TODO, test map
testMap() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
var result = list.map(function (item) { return item * 2; });
assertSequenceEquals([2, 4, 6], result);
}
// @TODO, test that the thisObject parameter is used correctly
// @TODO, test that the callback arguments are passed correctly
testSome() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
LiveUnit.Assert.isTrue(list.some(function (item) { return typeof item === "number"; }));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
LiveUnit.Assert.isTrue(list.some(function (item) { return typeof item === "number"; }));
list.pop();
list.pop();
list.pop();
listener.assertSameAsArray([]);
LiveUnit.Assert.isFalse(list.some(function (item) { return typeof item === "number"; }));
list.push("hello");
listener.assertSameAsArray(["hello"]);
LiveUnit.Assert.isFalse(list.some(function (item) { return typeof item === "number"; }));
list.setAt(1, 7);
listener.assertSameAsArray(["hello", 7]);
var count = 0;
LiveUnit.Assert.isTrue(list.some(function (item) { count++; return typeof item === "number"; }));
LiveUnit.Assert.areEqual(2, count);
}
testReduce() {
var list = new List();
var listener = new ListListener(list);
list.push("Hello ", "my ", "friend ");
listener.assertSameAsArray(["Hello ", "my ", "friend "]);
LiveUnit.Assert.areEqual("Hello my friend ", list.reduce(function (n, m) { return n + m; }, ""));
}
testReduceRight() {
var list = new List();
var listener = new ListListener(list);
list.push("Hello ", "my ", "friend ");
listener.assertSameAsArray(["Hello ", "my ", "friend "]);
LiveUnit.Assert.areEqual("friend my Hello ", list.reduceRight(function (n, m) { return n + m; }, ""));
}
testLength() {
var list = new List();
var listener = new ListListener(list);
// You can set the length property to truncate an array at any time. When you extend an array by
// changing its length property, the number of actual elements does not increase; for example,
// if you set length to 3 when it is currently 2, the array still contains only 2 elements.
list.length = 12;
LiveUnit.Assert.areEqual(0, list.length);
var count = 0;
list.forEach(function () { count++; });
LiveUnit.Assert.areEqual(0, count);
list.length = 0;
LiveUnit.Assert.areEqual(0, list.length);
// Note that the ListListener doesn't work perfectly against sparse arrays and the reason is that the
// List doesn't communicate things like length change, it communicates element addition/modification/removal
// which should be enough information to be faithful except when there are trailing empty slots in the array
listener.assertSameAsArray([]);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.length);
listener.assertSameAsArray([1, 2, 3]);
list.length = 10;
LiveUnit.Assert.areEqual(3, list.length);
list.length = 1;
LiveUnit.Assert.areEqual(1, list.length);
listener.assertSameAsArray([1]);
}
testSet() {
var list = new List();
var listener = new ListListener(list);
list.setAt(0, 1);
listener.assertSameAsArray([1]);
list.setAt(1, 2);
listener.assertSameAsArray([1, 2]);
list.setAt(0, 3);
listener.assertSameAsArray([3, 2]);
list.setAt(2, 4);
listener.assertSameAsArray([3, 2, 4]);
list.setAt(3, 5);
listener.assertSameAsArray([3, 2, 4, 5]);
list.setAt(2, 6);
listener.assertSameAsArray([3, 2, 6, 5]);
}
testMove() {
var list = new List();
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
list.move(0, 1);
listener.assertSameAsArray([2, 1, 3]);
}
testInitializeWithData() {
var list = new List([1, 2, 3]);
var listener = new ListListener(list);
listener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, 4]);
list.setAt(0, 5);
listener.assertSameAsArray([5, 2, 3, 4]);
}
testListBaseGetKey() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [0, 1, 2, 3, 4];
var list = new List(arr, options[i]);
LiveUnit.Assert.areEqual("0", list._getKey(0), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual("1", list._getKey(1), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual("2", list._getKey(2), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual("3", list._getKey(3), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual("4", list._getKey(4), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(undefined, list._getKey(5), "making sure we are getting the correct element");
list.move(0, 3); //[ 1, 2, 3, 0, 4]
list.move(1, 3); //[ 1, 3, 0, 2, 4]
list.move(4, 0); //[ 4, 1, 3, 0, 2]
LiveUnit.Assert.areEqual("4", list._getKey(0), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual("1", list._getKey(1), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual("3", list._getKey(2), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual("0", list._getKey(3), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual("2", list._getKey(4), "making sure we are getting the correct element after move");
list.length = 10;
list.push(10);
list.move(0, 4); //[1, 3, 0, 2, 4, 10]
LiveUnit.Assert.areEqual("1", list._getKey(0), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual("4", list._getKey(4), "making sure we are getting the correct element after move");
}
}
testListBaseGetFromKey() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [1, 2, undefined, 3, 4, 5];
var list = new List(arr, options[i]);
var check = function () {
LiveUnit.Assert.areEqual(1, list._getFromKey("0"), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(2, list._getFromKey("1"), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(undefined, list._getFromKey("2"), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(3, list._getFromKey("3"), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(4, list._getFromKey("4"), "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(5, list._getFromKey("5"), "making sure we are getting the correct element");
}
check();
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "making sure that the list content did not change");
list.sort(function (l, r) { return r - l; });
check();
}
}
testSparseArrayIsNotSupported() {
var arr = [-1, 20, "string", , , 3, 10, 5, 1];
var options:any = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
var expected = [-1, 20, "string", 3, 10, 5, 1];
for (var i = 0; i < options.length; i++) {
try {
var list = new List(arr, options[i]);
LiveUnit.Assert.areEqual(7, list.length, "making sure that sparseness is not supported");
LiveUnit.Assert.isTrue(verifyListContent(list, expected));
} catch (exception) {
LiveUnit.Assert.isTrue(options[i].proxy, "making sure exception is thrown when proxy is enabled");
}
}
}
testListBaseforEach() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [-1, 20, "string", 3, 10, 5, 1];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
var result = [];
var j = 0;
list.forEach(function (elem) { result[j++] = elem; });
//listener.assertSameAsArray(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
j = 0;
for (var index = 0; index < arr.length; index++) {
if (arr[index]) {
LiveUnit.Assert.areEqual(arr[index], result[j++], "checking the correctness of the array");
}
}
}
}
testListBaseSome() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = ["1", "2", "3", "4", 1, "5"];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
LiveUnit.Assert.isTrue(list.some(function (elem) { return typeof elem === "number"; }));
LiveUnit.Assert.isTrue(!list.some(function (elem) { return typeof elem === "object"; }));
listener.assertSameAsArray(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
testListBaseMap() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = ["1", "2", "3", "4", "5"];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
var result = list.map(function (elem) { return parseInt(elem, 10); });
for (var i = 1; i < 5; i++) {
LiveUnit.Assert.areEqual(i, result[i - 1], "check the correctness of the array content");
}
listener.assertSameAsArray(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(!verifyListContent(list, result));
}
}
testListBaseReduce() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [58, 52, 64, 2, 16, 23, 64, 27, 20, 11];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
var reduceToSum = function(p, v) { return p + v };
LiveUnit.Assert.areEqual(arr.reduce(reduceToSum), list.reduce(reduceToSum));
listener.assertSameAsArray(arr);
var list2 = new List(["a", "b", "c", "d"]);
LiveUnit.Assert.areEqual(list2.join(), list2.reduce(function (p, v) { return p + "," + v; }));
}
}
testListBaseReduceRight() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [58, 52, 64, 2, 16, 23, 64, 27, 20, 11];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
var reduceToSum = function (p, v) { return p + v };
LiveUnit.Assert.areEqual(arr.reduceRight(reduceToSum, 2), list.reduceRight(reduceToSum, 2));
LiveUnit.Assert.areEqual(arr.reduceRight(reduceToSum), list.reduceRight(reduceToSum));
listener.assertSameAsArray(arr);
var arr2 = ["a", "b", "c", "d"];
var list2 = new List(arr2);
LiveUnit.Assert.areEqual(arr2.reverse().join(), list2.reduceRight(function (p, v) { return p + "," + v; }));
}
}
testListBaseEvery() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = ["1", "2", "3", "4", 1, "5"];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
LiveUnit.Assert.isTrue(!list.every(function (elem) { return typeof elem === "number"; }));
LiveUnit.Assert.isTrue(!list.every(function (elem) { return typeof elem === "object"; }));
listener.assertSameAsArray(arr);
var arr = [false, "", undefined, 0, NaN];
var list = new List(arr, options[i]);
LiveUnit.Assert.isTrue(list.every(function (elem) { return !elem; }));
}
}
testListBaseJoin() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [-1, 20, "string", 3, 10, 5, 1];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
LiveUnit.Assert.areEqual(arr.join(), list.join(), "array join returns the same value as list join");
LiveUnit.Assert.areEqual(arr.join("#"), list.join("#"), "array join returns the same value as list join");
listener.assertSameAsArray(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
testListBaseSlice() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 9];
var list = new List(arr, options[i]);
var listener = new ListListener(list);
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(0), arr), "slicing all the elements");
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(0, 1), [0]), "slicing the first element");
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(7, 10), [7, 9]), "slicing elements from the end");
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(0, 100), arr), "slicing all the elements");
list.slice(-3);
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(-2), [7, 9]), "slicing elements from the end");
LiveUnit.Assert.isTrue(checkArrayContent(list.slice(3, 2), []), "slicing with the end index less than the start index");
listener.assertSameAsArray(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
testListGetItemFromKey() {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [0, 1, 2, 3, 4];
var list = new List(arr, options[i]);
var check = function check () {
LiveUnit.Assert.areEqual(0, list.getItemFromKey("0").data, "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(1, list.getItemFromKey("1").data, "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(2, list.getItemFromKey("2").data, "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(3, list.getItemFromKey("3").data, "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(4, list.getItemFromKey("4").data, "making sure we are getting the correct element");
LiveUnit.Assert.areEqual(undefined, list.getItemFromKey("5"), "making sure we are getting the correct element");
}
check();
list.move(0, 3); //[ 1, 2, 3, 0, 4]
list.move(1, 3); //[ 1, 3, 0, 2, 4]
list.move(4, 0); //[ 4, 1, 3, 0, 2]
check();
list.length = 10;
list.push(10);
list.move(0, 4); //[ 1, 3, 0, 2, 4]
LiveUnit.Assert.areEqual(undefined, list.getItemFromKey("9"), "making sure we are getting the correct element after move");
LiveUnit.Assert.areEqual(undefined, list.getItemFromKey("8"), "making sure we are getting the correct element after move");
check();
}
}
testListSpliceFromKey() {
var options:any = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr, options[i]);
var check = function check (s, n) {
for (var i = s; i < n; i++) {
LiveUnit.Assert.areEqual(i, list.getItemFromKey(i.toString()).data, "check the correctness");
}
}
check(0, 10);
var key = list._getKey(0);
var keyOf8 = list._getKey(8);
list.move(0, 3); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list.move(1, 3); //[1, 3, 0, 2, 4, 5, 6, 7, 8, 9]
list.move(4, 0); //[4, 1, 3, 0, 2, 5, 6, 7, 8, 9]
check(0, 10);
var temp = list._spliceFromKey(key, 3);
LiveUnit.Assert.isTrue(checkArrayContent(temp, [0, 2, 5]));
var temp = list._spliceFromKey(keyOf8, 10);
LiveUnit.Assert.isTrue(checkArrayContent(temp, [8, 9]));
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
}
testIndexOfDifferentScenarios() {
var options:any = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var list = new List([], options[i]);
LiveUnit.Assert.areEqual(-1, list.indexOf(0, -1), "non existing item");
LiveUnit.Assert.areEqual(-1, list.indexOf(0), "non existing item");
var arr = [-1, -2, 100, 0, 9, -1, 7, 6, 5, 4];
list = new List(arr, options[i]);
LiveUnit.Assert.areEqual(0, list.indexOf(-1, -1 * list.length), "search for existing item with -ve index");
LiveUnit.Assert.areEqual(1, list.indexOf(-2, 1), "search for existing item");
LiveUnit.Assert.areEqual(-1, list.indexOf(-2, 100), "search for existing item with wrong starting index");
LiveUnit.Assert.areEqual(-1, list.indexOf(-200), "search for non existing item ");
//search in scrambled array key list
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.areEqual(3, list.indexOf(0), "search for second item ");
LiveUnit.Assert.areEqual(list.length - 1, list.indexOf(100), "search for last item ");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
var emptySlotList = new List(arr);
var l = emptySlotList.length;
emptySlotList.splice(99, 0, 200);
LiveUnit.Assert.areEqual(l, emptySlotList.indexOf(200), "search for last element of the list");
LiveUnit.Assert.areEqual(-1, emptySlotList.indexOf(undefined), "search for last element of the list");
LiveUnit.Assert.areEqual(200, emptySlotList.getAt(10), "make sure undefined existes");
LiveUnit.Assert.areEqual(undefined, emptySlotList.getAt(11), "make sure undefined existes");
}
}
testLastIndexOfDifferentScenarios() {
var options:any = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var list = new List([], options[i]);
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(0, -1), "non existing item");
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(0), "non existing item");
var arr = [-1, -2, 100, 0, 9, 5, 7, 6, 5, 4];
list = new List(arr, options[i]);
LiveUnit.Assert.areEqual(0, list.lastIndexOf(-1, list.length), "search for existing item with -ve index");
LiveUnit.Assert.areEqual(1, list.lastIndexOf(-2, 1), "search for existing item");
LiveUnit.Assert.areEqual(2, list.lastIndexOf(100), "search for existing item with wrong starting index");
LiveUnit.Assert.areEqual(5, list.indexOf(5), "search for existing item with wrong starting index");
LiveUnit.Assert.areEqual(8, list.lastIndexOf(5), "search for existing item with wrong starting index");
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(-200), "search for non existing item ");
//search in scrambled array key list
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.areEqual(2, list.lastIndexOf(0), "search for second item ");
LiveUnit.Assert.areEqual(list.length - 1, list.lastIndexOf(100), "search for last item ");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
var emptySlotList = new List(arr);
var l = emptySlotList.length;
emptySlotList.splice(99, 0, 200);
LiveUnit.Assert.areEqual(l, emptySlotList.lastIndexOf(200), "search for last element of the list");
LiveUnit.Assert.areEqual(-1, emptySlotList.lastIndexOf(undefined), "search for last element of the list");
LiveUnit.Assert.areEqual(200, emptySlotList.getAt(10), "make sure undefined existes");
LiveUnit.Assert.areEqual(undefined, emptySlotList.getAt(11), "make sure undefined existes");
}
}
testSettingTheLength() {
var list = new List([10, 20, 30, 40]);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 30, 40]));
list.splice(2, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 40]));
list.splice(2, 0, 100);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 100, 40]));
list.length = 3;
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 100]));
}
testSameReferenceObtained() {
var list = new List([0, 1, 2, 3]);
LiveUnit.Assert.isTrue(verifyListContent(list, [0, 1, 2, 3]));
var hit = 0;
if (list.getItem(1) === list.getItem(1)) {
hit = 1;
}
LiveUnit.Assert.areEqual(1, hit, "the obtained references are incorrect");
}
testLazyPopulate() {
var list = new List([1, 2], { proxy: true });
var x = list.getItem(1);
var y = list.getItem(1);
var hit = 0;
if (x === y) {
hit = 1;
}
LiveUnit.Assert.areEqual(1, hit, "the obtained references are incorrect with lazyPopulate");
}
testGetAtInDifferentScenarios() {
var list = new List([1, 2, 3]);
list.length = 10;
LiveUnit.Assert.areEqual(3, list.length, "list expansion is not correct");
LiveUnit.Assert.areEqual(1, list.getAt(0), "getAt(0) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getAt(5), "getAt(5) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getAt(-1), "getAt(-1) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getAt(100), "getAt(100) returned wrong value");
var listBindable = new List([1, 2, 3], { binding: true });
listBindable.length = 10;
LiveUnit.Assert.areEqual(3, listBindable.length, "list expansion is not correct with binding");
LiveUnit.Assert.areEqual(1, listBindable.getAt(0), "getAt(0) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getAt(5), "getAt(5) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getAt(-1), "getAt(-1) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getAt(100), "getAt(100) returned wrong value with binding");
}
testGetItemInDifferentScenarios() {
var list = new List([1, 2, 3]);
list.length = 10;
LiveUnit.Assert.areEqual(3, list.length, "list expansion is not correct");
LiveUnit.Assert.areEqual(1, list.getItem(0).data, "getItem(0) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getItem(5), "getItem(5) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getItem(-1), "getItem(-1) returned wrong value");
LiveUnit.Assert.areEqual(undefined, list.getItem(100), "getItem(100) returned wrong value");
var listBindable = new List([1, 2, 3]);
listBindable.length = 10;
LiveUnit.Assert.areEqual(3, listBindable.length, "list expansion is not correct");
LiveUnit.Assert.areEqual(1, listBindable.getItem(0).data, "getItem(0) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getItem(5), "getItem(5) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getItem(-1), "getItem(-1) returned wrong value with binding");
LiveUnit.Assert.areEqual(undefined, listBindable.getItem(100), "getItem(100) returned wrong value with binding");
}
testShiftDifferentScenarios() {
var options:any = [undefined, { binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [-1, 0, 1, 2, 3];
var list = new List(options[i]);
LiveUnit.Assert.isTrue(verifyListContent(list, []));
LiveUnit.Assert.areEqual(undefined, list.shift(), "Making sure that no element is shifted");
list = new List(arr, options[i]);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
for (var j = 0; j < arr.length; j++) {
LiveUnit.Assert.areEqual(arr[j], list.shift(), "making sure shift is working correctly");
LiveUnit.Assert.areEqual(arr.length - j - 1, list.length);
LiveUnit.Assert.areEqual(5, arr.length);
}
}
}
testUnshiftDifferentScenarios() {
var options = [undefined, { binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [];
var list = new List(arr, options[i]);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, []));
LiveUnit.Assert.areEqual(0, list.unshift(), "Making sure that no element is unshifted");
LiveUnit.Assert.areEqual(1, list.unshift(0), "Making sure that one element is unshifted");
LiveUnit.Assert.areEqual(2, list.unshift(1), "Making sure that one element is unshifted");
LiveUnit.Assert.areEqual(7, list.unshift(2, 3, 4, 5, 6), "Making sure that more than one element is unshifted");
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4, 5, 6, 1, 0]));
LiveUnit.Assert.areEqual(13, list.unshift("", null, NaN, undefined, false, 0), "unshifting falsy values");
LiveUnit.Assert.areEqual(0, arr.length);
}
}
testUnshiftDifferentScenariosWithProxy() {
var options = [{ proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [];
var list = new List(arr, options[i]);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, []));
LiveUnit.Assert.areEqual(0, list.unshift(), "Making sure that no element is unshifted");
LiveUnit.Assert.areEqual(1, list.unshift(0), "Making sure that one element is unshifted");
LiveUnit.Assert.areEqual(2, list.unshift(1), "Making sure that one element is unshifted");
LiveUnit.Assert.areEqual(7, list.unshift(2, 3, 4, 5, 6), "Making sure that more than one element is unshifted");
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4, 5, 6, 1, 0]));
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.areEqual(13, list.unshift("", null, NaN, undefined, false, 0), "unshifting falsy values");
LiveUnit.Assert.areEqual(13, arr.length);
}
}
testPopDifferentScenarios() {
var options:any = [undefined, { binding: true }, { proxy: true }, { binding: true, proxy: true }];
for (var i = 0; i < options.length; i++) {
var arr = [-1, 0, 1, 2];
var temp = [-1, 0, 1, 2];
var list = new List(arr, options[i]);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
for (var j = temp.length - 1; j >= 0; j--) {
var elem = list.pop();
LiveUnit.Assert.areEqual(temp[j], elem, "making sure of correct pop");
LiveUnit.Assert.areEqual(j, list.length);
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
}
}
testPopAfterSorting() {
var arr = [10, 4, 9, 100, -1, 20, 0];
var temp = [-1, 0, 4, 9, 10, 20, 100];
var sortedArr = new List(arr);
sortedArr.sort(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(sortedArr, temp));
for (var j = temp.length - 1; j >= 0; j--) {
var elem = sortedArr.pop();
LiveUnit.Assert.areEqual(temp[j], elem, "making sure of correct pop in scrambled key array");
LiveUnit.Assert.areEqual(j, sortedArr.length);
}
}
testDeleteAnElementBeforeBeingAddedToKeys() {
var list = new List([1, 2], { proxy: true });
list.splice(0, 1);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(2, list.getAt(0));
}
testSetLengthToNegativeValue() {
var hitCatch = false;
var list = new List([1, 2], { proxy: true });
try {
list.length = -1;
} catch (e) {
LiveUnit.Assert.areEqual("List length must be assigned a finite positive number", e.message);
hitCatch = true;
}
LiveUnit.Assert.isTrue(hitCatch);
LiveUnit.Assert.areEqual(2, list.length, "wrong value for length due to setting it to negative value");
LiveUnit.Assert.areEqual(1, list.getAt(0), "array is messed after setting the length to negative value");
LiveUnit.Assert.areEqual(2, list.getAt(1), "array is messed after setting the length to negative value");
}
testGetItemFromKeyBeforeSettingKeys() {
var list = new List([1, 2], { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2]));
var y = list.getItemFromKey("1");
LiveUnit.Assert.areEqual(2, y.data);
}
testRemoveElementBeforeSettingKeys() {
//removing an element when the keys are not set and getting the next key element
var list = new List([1, 2], { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2]));
list.splice(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2]));
var y = list.getItemFromKey("1");
LiveUnit.Assert.areEqual(2, y.data);
}
testIndexOfWithNonExistingKey() {
var list = new List();
var k = list.indexOfKey("2");
LiveUnit.Assert.areEqual(-1, k, "wrong value of index returned for non existing key");
}
testInvalidGetterScenarios() {
var list = new List([10, 20, 30, 40]);
list.splice(2, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 40]));
list.splice(2, 0, 100);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 100, 40]));
var t = list.getItemFromKey("2");
LiveUnit.Assert.isTrue(!t);
t = list.getItemFromKey("-1");
LiveUnit.Assert.isTrue(!t);
t = list.getItemFromKey("100");
LiveUnit.Assert.isTrue(!t);
t = list.getItem(-1);
LiveUnit.Assert.isTrue(!t);
}
testReverseWithoutProxy() {
var arr = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.reverse();
LiveUnit.Assert.isTrue(verifyListContent(list, [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1]));
LiveUnit.Assert.areEqual(-1, arr[0]);
LiveUnit.Assert.areEqual(9, arr[arr.length - 1]);
}
testReverseEmptyList() {
var list = new List();
LiveUnit.Assert.isTrue(verifyListContent(list, []));
list.reverse();
LiveUnit.Assert.isTrue(verifyListContent(list, []));
}
testReverseWithProxy() {
var arr = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.reverse();
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1]));
}
testReverseWithSparseArrayNoProxy() {
var arr = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.length = 15;
list.reverse();
LiveUnit.Assert.isTrue(verifyListContent(list, [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1]));
LiveUnit.Assert.areEqual(-1, arr[0]);
LiveUnit.Assert.areEqual(9, arr[arr.length - 1]);
}
testReverseWithSparseArrayAndProxy() {
var arr = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.length = 15;
list.reverse();
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1]));
}
testFalsyValues() {
var arr = ["", false, NaN, 0, null];
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr, true));
}
testIndexOfFunctions() {
var list = new List([10, 20, 30, 40]);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 20, 30, 40]));
list.splice(2, 1);
list.splice(2, 0, 100);
var k = list.indexOfKey("5"); //result in 2
LiveUnit.Assert.areEqual(2, k, "invalid value returned from indexOfKey");
var l = list.indexOf(100); //result in 2
LiveUnit.Assert.areEqual(2, l, "invalid value returned from indexOfKey");
}
testShiftSpecialCaseSimpleScenario() {
var list = new List();
var x = list.shift();
LiveUnit.Assert.areEqual(undefined, list.shift(), "making sure that shift returns undefined");
}
testLastIndexOfSpecialCaseSimpleScenario() {
var arr = [1, 2, 3];
var list = new List(arr);
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, 1), "making sure lastIndexOf works as ES5 arrays");
}
testGetItemFromKeySimpleScenario() {
var arr = [1, 2, 3, 4];
var list = new List(arr);
LiveUnit.Assert.areEqual(undefined, list.getItemFromKey("5"), "making sure that getItemFromKey is working fine");
}
testNonExistingKeys() {
var list = new List();
var k = list.indexOfKey("2"); //should be -1
LiveUnit.Assert.areEqual(-1, k, "invalid key should return -1");
var k2 = list.indexOf(2); //should be -1
LiveUnit.Assert.areEqual(-1, k2, "invalid key should return -1");
var k3 = list.indexOf(2, -1); //should be -1
LiveUnit.Assert.areEqual(-1, k3, "invalid key should return -1");
}
testSortEmptyList() {
var list = new List();
LiveUnit.Assert.isTrue(verifyListContent(list, []));
list.sort(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(verifyListContent(list, []));
}
testSortArrayOfIntegersWithoutProxy() {
var arr = [2, 3, 4, 1, -1, 0, 5, 10, 11, 9];
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 0, 1, 2, 3, 4, 5, 9, 10, 11]));
list.sort(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [11, 10, 9, 5, 4, 3, 2, 1, 0, -1]));
}
testSortArrayOfIntegersWithProxy() {
var arr = [2, 3, 4, 1, -1, 0, 5, 10, 11, 9];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 0, 1, 2, 3, 4, 5, 9, 10, 11]));
list.sort(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [11, 10, 9, 5, 4, 3, 2, 1, 0, -1]));
}
testSortArrayOfIntegersWithoutProxyWithBinding() {
var arr = [2, 3, 4, 1, -1, 0, 5, 10, 11, 9];
var list = new List(arr, { binding: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 0, 1, 2, 3, 4, 5, 9, 10, 11]));
list.sort(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [11, 10, 9, 5, 4, 3, 2, 1, 0, -1]));
}
testSortArrayOfIntegersWithProxyWithBinding() {
var arr = [2, 3, 4, 1, -1, 0, 5, 10, 11, 9];
var list = new List(arr, { proxy: true, binding: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.sort(function (l, r) { return l - r });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 0, 1, 2, 3, 4, 5, 9, 10, 11]));
list.sort(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [11, 10, 9, 5, 4, 3, 2, 1, 0, -1]));
}
testSortArrayOfObjects() {
var arr = createAnArrayOfObjects(11);
arr[4].a = -1;
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.sort(function (l, r) { return l.a - r.a });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.areEqual(-1, list.getAt(0).a, "sorting failed");
LiveUnit.Assert.areEqual(10, list.getAt(list.length - 1).a, "sorting failed");
list.sort(function (l, r) { return r.a - l.a });
LiveUnit.Assert.isTrue(!verifyListContent(list, arr));
LiveUnit.Assert.areEqual(10, list.getAt(0).a, "sorting failed");
LiveUnit.Assert.areEqual(-1, list.getAt(list.length - 1).a, "sorting failed");
}
testSetAtDifferentScenarios() {
var arr = [1, 2, 3];
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.setAt(0, 4);
LiveUnit.Assert.areEqual(4, list.getAt(0), "Value is not set correctly at element 0");
LiveUnit.Assert.isTrue(verifyListContent(list, [4, 2, 3]));
}
testSetAtDifferentScenariosWithProxy() {
var arr = [1, 2, 3];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.setAt(0, 4);
LiveUnit.Assert.areEqual(4, list.getAt(0), "Value is not set correctly at element 0");
LiveUnit.Assert.isTrue(verifyListContent(list, [4, 2, 3]));
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
testSetAtWithAnArrayOfObjectsAndBinding() {
var arr = [{ a: "zero" }, { a: "one" }, { a: "two" }, { a: "three" }, { a: "four" }];
var list = new List(arr, { binding: true });
list.setAt(0, { a: "newElement" });
LiveUnit.Assert.areEqual("newElement", list.getAt(0).a, "set with binding is not working correctly");
list.setAt(5, { a: "newElementAt5" });
LiveUnit.Assert.areEqual("newElementAt5", list.getAt(5).a, "set with binding is not working correctly");
LiveUnit.Assert.areEqual(undefined, arr[5], "set with binding is not working correctly");
}
testSetAtWithAnArrayOfObjectsAndBindingAndProxy() {
var arr = [{ a: "zero" }, { a: "one" }, { a: "two" }, { a: "three" }, { a: "four" }];
var list = new List(arr, { binding: true, proxy: true });
list.setAt(0, { a: "newElement" });
LiveUnit.Assert.areEqual("newElement", list.getAt(0).a, "set with binding is not working correctly");
LiveUnit.Assert.areEqual("newElement", list.getAt(0).a, "set with binding is not working correctly");
list.setAt(5, { a: "newElementAt5" });
LiveUnit.Assert.areEqual("newElementAt5", list.getAt(5).a, "set with binding is not working correctly");
LiveUnit.Assert.areEqual("newElementAt5", arr[5].a, "set with binding is not working correctly");
}
testRemoveElementsUsingSpliceDifferentScenarios() {
var options = [undefined, { binding: true }]
for (var j = 0; j < options.length; j++) {
var arr = [1, 2, 3, 4];
arr[4] = 5;
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.areEqual(1, arr[0]);
LiveUnit.Assert.areEqual(4, arr[3]);
list.splice(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4, 5]), "deleting the first element");
LiveUnit.Assert.areEqual(1, arr[0]);
LiveUnit.Assert.areEqual(4, arr[3]);
list.splice(3, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4]), "deleting the third element");
LiveUnit.Assert.areEqual(1, arr[0]);
LiveUnit.Assert.areEqual(4, arr[3]);
list.splice(-1, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3]), "deleting non existing element");
LiveUnit.Assert.areEqual(1, arr[0]);
list.splice(list.length * 2, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3]), "deleting non existing element");
list.splice(0, 2);
LiveUnit.Assert.isTrue(verifyListContent(list, []), "deleting all the elements of the array");
LiveUnit.Assert.areEqual(1, arr[0]);
LiveUnit.Assert.areEqual(4, arr[3]);
var arr = [1, 2, 3, 4];
list = new List(arr);
list.splice(4, 2);
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "deleting non existing content");
list.splice(0, 100);
LiveUnit.Assert.isTrue(verifyListContent(list, []), "deleting elements more than the length of the arra");
LiveUnit.Assert.areEqual(1, arr[0]);
LiveUnit.Assert.areEqual(4, arr[3]);
}
}
testDeleteUsingSpliceDifferentScenariosWithProxy() {
var options = [{ proxy: true }, { proxy: true, binding: true }];
for (var j = 0; j < options.length; j++) {
var arr = [1, 2, 3, 4];
arr[4] = 5;
var list = new List(arr, options[j]);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4, 5]), "deleting the first element");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(3, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 4]), "deleting the third element");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(-1, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3]), "deleting non existing element");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(list.length * 2, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3]), "deleting non existing element");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(0, 2);
LiveUnit.Assert.isTrue(verifyListContent(list, []), "deleting all the elements of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
var arr = [1, 2, 3, 4];
list = new List(arr, options[j]);
list.splice(4, 2);
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "deleting non existing content");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(0, 100);
LiveUnit.Assert.isTrue(verifyListContent(list, []), "deleting elements more than the length of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
}
testAddingElementsUsingSplice() {
var options = [undefined, { binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [];
var list = new List(arr, options[i]);
list.splice(0, 0, 1, 2, 3, 4, 5);
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]), "adding elements more than the length of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(0, 0, 10);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 5]), "adding an element to the begining of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(list.length - 1, 0, 100, 200);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 100, 200, 5]), "adding an element at the last position of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(list.length * 10, 0, -1, 0);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an element to a non existing element of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(-100, 0, "first");
LiveUnit.Assert.isTrue(verifyListContent(list, ["first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an element to a non existing element of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(0, 0, undefined);
LiveUnit.Assert.isTrue(verifyListContent(list, [undefined, "first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an undefined element to the beginign of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
list.splice(0, 0, false, "", null, NaN);
LiveUnit.Assert.isTrue(verifyListContent(list, [false, "", null, NaN, undefined, "first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0], true), "adding falsy elements to the beginign of the array");
LiveUnit.Assert.areEqual(0, arr.length, "making sure that the array length is not changed");
}
}
testAddingElementsUsingSpliceWithProxy() {
var options = [{ proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [];
var list = new List(arr, options[i]);
list.splice(0, 0, 1, 2, 3, 4, 5);
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]), "adding elements more than the length of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(0, 0, 10);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 5]), "adding an element to the begining of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(list.length - 1, 0, 100, 200);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 100, 200, 5]), "adding an element at the last position of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(list.length * 10, 0, -1, 0);
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an element to a non existing element of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(-100, 0, "first");
LiveUnit.Assert.isTrue(verifyListContent(list, ["first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an element to a non existing element of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(0, 0, undefined);
LiveUnit.Assert.isTrue(verifyListContent(list, [undefined, "first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0]), "adding an undefined element to the beginign of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr), "adding elements more than the length of the array");
list.splice(0, 0, false, "", null, NaN);
LiveUnit.Assert.isTrue(verifyListContent(list, [false, "", null, NaN, undefined, "first", 10, 1, 2, 3, 4, 100, 200, 5, -1, 0], true), "adding falsy elements to the beginign of the array");
LiveUnit.Assert.isTrue(verifyListContent(list, arr, true), "adding elements more than the length of the array");
}
}
testMove1() {
var list = new List();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
list.push(5);
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
list.move(0, 10);
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
var x = list.indexOf(1); //expected list.length - 1
LiveUnit.Assert.areEqual(0, x, "element should have moved to the end of the list");
}
testMoveWithProxy() {
var arr = [1, 2, 3, 4];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.move(0, 10);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4]));
var x = list.indexOf(1);
LiveUnit.Assert.areEqual(0, x, "element should have moved to the end of the list");
}
testMove3() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.splice(3, 1);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 5, 6, 7, 8, 9]));
list.move(0, 3);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 3, 5, 1, 6, 7, 8, 9]));
var x = list.indexOf(1); //expected === 3
LiveUnit.Assert.areEqual(3, x, "incorrect value due to the move function")
}
testMoveNonExistingToNonExisting() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.move(-1, 100);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.move(100, 2);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
}
testMoveObjects() {
var arr = createAnArrayOfObjects(10);
var list = new List(arr, { proxy: true });
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.move(0, 5);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.areEqual(1, list.getAt(0).a, "Wrong element at index 0");
LiveUnit.Assert.areEqual(0, list.getAt(5).a, "Wrong element at index 0");
}
testMoveObjectsWithoutProxy() {
var arr = createAnArrayOfObjects(10);
var list = new List(arr);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
list.move(0, 5);
LiveUnit.Assert.areEqual(1, list.getAt(0).a, "Wrong element at index 0");
LiveUnit.Assert.areEqual(0, list.getAt(5).a, "Wrong element at index 0");
}
testGetAtWithBindingAndProxy() {
var arr = [{ a: "zero" }, { a: "one" }, { a: "two" }, { a: "three" }, { a: "four" }];
var list = new List(arr, { binding: true, proxy: true });
LiveUnit.Assert.isTrue(verifyBindableList(list, arr));
list.getAt(0).a = "updated";
LiveUnit.Assert.isTrue(verifyBindableList(list, arr));
LiveUnit.Assert.areEqual("updated", list.getAt(0).a, "binding is not working correctly");
list.push({ a: "five" });
LiveUnit.Assert.areEqual(6, arr.length, "length of the array should change");
LiveUnit.Assert.areEqual(6, list.length, "length of the list should change");
list.getAt(5).a = "newElement";
LiveUnit.Assert.areEqual("newElement", list.getAt(5).a, "element should have changed");
LiveUnit.Assert.areEqual("newElement", arr[5].a, "element should have changed");
}
testGetAtWithBindingAndNoProxy() {
var arr = [{ a: "zero" }, { a: "one" }, { a: "two" }, { a: "three" }, { a: "four" }];
var list = new List(arr, { binding: true });
LiveUnit.Assert.isTrue(verifyBindableList(list, arr));
list.getAt(0).a = "updated";
LiveUnit.Assert.areEqual("updated", list.getAt(0).a, "binding is not working correctly");
LiveUnit.Assert.areEqual("updated", arr[0].a, "binding is not working correctly");
list.push({ a: "five" });
LiveUnit.Assert.areEqual(5, arr.length, "length of the array should not change");
LiveUnit.Assert.areEqual(6, list.length, "length of the list should change");
list.getAt(5).a = "newElement";
LiveUnit.Assert.areEqual("newElement", list.getAt(5).a, "element should have changed");
LiveUnit.Assert.areEqual(undefined, arr[5], "element should not exist in the array");
}
testGroupingGroups() {
var list = new WinJS.Binding.List();
for (var i = 0; i < 100; i++) {
list.push(i);
}
var tensGroupKey = function (item) { return "" + ((item / 10) | 0); };
var tens = list.createGrouped(tensGroupKey, tensGroupKey);
var lowHighGroupKey = function (item) { return item < 5 ? "low" : "high"; };
var lowHigh = tens.groups.createGrouped(lowHighGroupKey, lowHighGroupKey);
// We should make sure to clone all the relevant properties all along...
var item = lowHigh.getItem(0);
LiveUnit.Assert.isNotNull(item.groupSize);
LiveUnit.Assert.isNotNull(item.firstItemIndexHint);
LiveUnit.Assert.isNotNull(item.firstItemKey);
}
};
export class ListProxy {
testSparse() {
var data = [1, , 2];
var exception;
try {
var list = new List(data, { proxy: true });
} catch (e) {
exception = e;
}
LiveUnit.Assert.isNotNull(exception);
}
testBasic() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.length);
LiveUnit.Assert.areEqual(1, list.getAt(0));
LiveUnit.Assert.areEqual(2, list.getAt(1));
LiveUnit.Assert.areEqual(3, list.getAt(2));
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
}
testPush() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1);
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
list.push(2);
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
list.push(3, 4);
listener.assertSameAsArray([1, 2, 3, 4]);
listener.assertSameAsArray(data);
list.push();
listener.assertSameAsArray([1, 2, 3, 4]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(4, list.length);
}
testPop() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.pop());
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(2, list.pop());
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(1, list.pop());
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(0, list.length);
}
testUnshift() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.unshift(1);
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
list.unshift(2);
listener.assertSameAsArray([2, 1]);
listener.assertSameAsArray(data);
list.unshift(3, 4);
listener.assertSameAsArray([3, 4, 2, 1]);
listener.assertSameAsArray(data);
list.unshift();
listener.assertSameAsArray([3, 4, 2, 1]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(4, list.length);
}
testShift() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(1, list.shift());
listener.assertSameAsArray([2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(2, list.shift());
listener.assertSameAsArray([3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(3, list.shift());
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(0, list.length);
}
testReverse() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.reverse();
listener.assertSameAsArray([3, 2, 1]);
listener.assertSameAsArray(data);
list.reverse();
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.push(4);
listener.assertSameAsArray([1, 2, 3, 4]);
listener.assertSameAsArray(data);
list.reverse();
listener.assertSameAsArray([4, 3, 2, 1]);
listener.assertSameAsArray(data);
}
testSort() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.sort();
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.sort(function (l, r) { return r - l; });
listener.assertSameAsArray([3, 2, 1]);
listener.assertSameAsArray(data);
list.push(5);
listener.assertSameAsArray([3, 2, 1, 5]);
listener.assertSameAsArray(data);
list.sort(function (l, r) { return l - r; });
listener.assertSameAsArray([1, 2, 3, 5]);
listener.assertSameAsArray(data);
list.sort(function (l, r) { return r - l; });
listener.assertSameAsArray([5, 3, 2, 1]);
listener.assertSameAsArray(data);
list.sort();
listener.assertSameAsArray([1, 2, 3, 5]);
listener.assertSameAsArray(data);
}
testSplice() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.splice(0, 0, 1);
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
list.splice(0, 0, 2, 3, 4);
listener.assertSameAsArray([2, 3, 4, 1]);
listener.assertSameAsArray(data);
list.splice(1, 0, 5, 6);
listener.assertSameAsArray([2, 5, 6, 3, 4, 1]);
listener.assertSameAsArray(data);
list.splice(1, 2, 7, 8);
listener.assertSameAsArray([2, 7, 8, 3, 4, 1]);
listener.assertSameAsArray(data);
list.splice(10, 0, 9, 10);
listener.assertSameAsArray([2, 7, 8, 3, 4, 1, 9, 10]);
listener.assertSameAsArray(data);
}
testConcat() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
var result = list.concat([4, 5]);
assertSequenceEquals([1, 2, 3, 4, 5], result);
assertSequenceEquals([1, 2, 3], list.concat());
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.pop();
list.pop();
list.pop();
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
var result2 = list.concat([6, 7]);
assertSequenceEquals([6, 7], result2);
assertSequenceEquals([], list.concat());
}
testJoin() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual("1,2,3", list.join(","));
LiveUnit.Assert.areEqual("1, 2, 3", list.join(", "));
LiveUnit.Assert.areEqual("1,2,3", list.join());
LiveUnit.Assert.areEqual("11213", list.join("1"));
LiveUnit.Assert.areEqual("1---2---3", list.join("---"));
list.length = 0;
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual("", list.join(","));
LiveUnit.Assert.areEqual("", list.join());
LiveUnit.Assert.areEqual("", list.join("1"));
LiveUnit.Assert.areEqual("", list.join("---"));
}
testSlice() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
assertSequenceEquals([], list.slice(-1));
assertSequenceEquals([], list.slice(0));
assertSequenceEquals([], list.slice(1));
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
assertSequenceEquals([2], list.slice(-1));
assertSequenceEquals([1, 2], list.slice(0));
assertSequenceEquals([2], list.slice(1));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
assertSequenceEquals([3], list.slice(-1));
assertSequenceEquals([1, 2, 3], list.slice(0));
assertSequenceEquals([2, 3], list.slice(1));
assertSequenceEquals([], list.slice(-1, 2));
assertSequenceEquals([2], list.slice(-2, -1));
assertSequenceEquals([], list.slice(-2, -2));
assertSequenceEquals([], list.slice(-2, -3));
assertSequenceEquals([], list.slice(-6, -8));
assertSequenceEquals([1, 2], list.slice(0, 2));
assertSequenceEquals([2], list.slice(1, 2));
}
testIndexOf() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(1, list.indexOf(2));
LiveUnit.Assert.areEqual(-1, list.indexOf(5));
LiveUnit.Assert.areEqual(-1, list.indexOf(2, 2));
LiveUnit.Assert.areEqual(-1, list.indexOf(2, -1));
LiveUnit.Assert.areEqual(1, list.indexOf(2, -2));
list.push(2);
LiveUnit.Assert.areEqual(1, list.indexOf(2));
LiveUnit.Assert.areEqual(-1, list.indexOf(5));
LiveUnit.Assert.areEqual(3, list.indexOf(2, 2));
}
testLastIndexOf() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(5));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(2, 0));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, -1));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, -2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(2, -3));
list.push(2);
LiveUnit.Assert.areEqual(3, list.lastIndexOf(2));
LiveUnit.Assert.areEqual(-1, list.lastIndexOf(5));
LiveUnit.Assert.areEqual(1, list.lastIndexOf(2, 2));
}
testFilterNotify(complete) {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
var filtered = list.createFiltered(function (item) { return typeof item === "number"; });
var filteredListener = new ListListener(filtered);
WinJS.Promise.wrap().then(function () {
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
}).then(post).then(function () {
listener.assertLengthChangedCount(2);
filteredListener.assertLengthChangedCount(2);
list.push("hello");
listener.assertSameAsArray([1, 2, 3, "hello"]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
}).then(post).then(function () {
listener.assertLengthChangedCount(3);
filteredListener.assertLengthChangedCount(2);
list.push(4);
listener.assertSameAsArray([1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
}).then(post).then(function () {
listener.assertLengthChangedCount(4);
filteredListener.assertLengthChangedCount(3);
list.unshift("begin");
listener.assertSameAsArray(["begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
}).then(post).then(function () {
listener.assertLengthChangedCount(5);
filteredListener.assertLengthChangedCount(3);
list.unshift(0);
listener.assertSameAsArray([0, "begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
}).then(post).then(function () {
listener.assertLengthChangedCount(6);
filteredListener.assertLengthChangedCount(4);
list.splice(2, 0, 0.5);
listener.assertSameAsArray([0, "begin", 0.5, 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5, 1, 2, 3, 4]);
list.length = 3;
listener.assertSameAsArray([0, "begin", 0.5]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5]);
}).then(post).then(function () {
listener.assertLengthChangedCount(7);
filteredListener.assertLengthChangedCount(5);
list.setAt(3, 56);
listener.assertSameAsArray([0, "begin", 0.5, 56]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5, 56]);
}).then(post).then(null, errorHandler).then(complete);
}
testFilter() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
var filtered = list.createFiltered(function (item) { return typeof item === "number"; });
var filteredListener = new ListListener(filtered);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push("hello");
listener.assertSameAsArray([1, 2, 3, "hello"]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift("begin");
listener.assertSameAsArray(["begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift(0);
listener.assertSameAsArray([0, "begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.splice(2, 0, 0.5);
listener.assertSameAsArray([0, "begin", 0.5, 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5, 1, 2, 3, 4]);
list.length = 3;
listener.assertSameAsArray([0, "begin", 0.5]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5]);
list.setAt(3, 56);
listener.assertSameAsArray([0, "begin", 0.5, 56]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 0.5, 56]);
}
testFilter2() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
var filtered = list.createFiltered(function (item) { return item.toString().length === 1; });
var filteredListener = new ListListener(filtered);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push("hello");
listener.assertSameAsArray([1, 2, 3, "hello"]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift("begin");
listener.assertSameAsArray(["begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift(0);
listener.assertSameAsArray([0, "begin", 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.splice(2, 0, 0.5);
listener.assertSameAsArray([0, "begin", 0.5, 1, 2, 3, "hello", 4]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.length = 3;
listener.assertSameAsArray([0, "begin", 0.5]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0]);
list.setAt(3, 56);
listener.assertSameAsArray([0, "begin", 0.5, 56]);
listener.assertSameAsArray(data);
filteredListener.assertSameAsArray([0]);
}
testForEach() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
var a = [1, 2, 3]
listener.assertSameAsArray(a);
listener.assertSameAsArray(data);
var pos = 0;
list.forEach(function (item, index) {
LiveUnit.Assert.areEqual(pos, index);
LiveUnit.Assert.areEqual(a[index], item);
LiveUnit.Assert.areEqual(a[index], list.getAt(index));
pos++;
});
LiveUnit.Assert.areEqual(pos, a.length);
}
// @TODO, test that the thisObject parameter is used correctly
// @TODO, test that the callback arguments are passed correctly
testEvery() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.setAt(3, 7);
listener.assertSameAsArray([1, 2, 3, 7]);
listener.assertSameAsArray(data);
var count = 0;
LiveUnit.Assert.isTrue(list.every(function (item) { count++; return typeof item === "number"; }));
LiveUnit.Assert.areEqual(4, count);
list.length = 0;
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isTrue(list.every(function (item) { return typeof item === "number"; }));
list.push("hello");
listener.assertSameAsArray(["hello"]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isFalse(list.every(function (item) { return typeof item === "number"; }));
list.push(7);
listener.assertSameAsArray(["hello", 7]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isFalse(list.every(function (item) { return typeof item === "number"; }));
}
testMap() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
var result = list.map(function (item) { return item * 2; });
assertSequenceEquals([2, 4, 6], result);
}
// @TODO, test that the thisObject parameter is used correctly
// @TODO, test that the callback arguments are passed correctly
testSome() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2);
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isTrue(list.some(function (item) { return typeof item === "number"; }));
list.push(3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isTrue(list.some(function (item) { return typeof item === "number"; }));
list.pop();
list.pop();
list.pop();
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isFalse(list.some(function (item) { return typeof item === "number"; }));
list.push("hello");
listener.assertSameAsArray(["hello"]);
listener.assertSameAsArray(data);
LiveUnit.Assert.isFalse(list.some(function (item) { return typeof item === "number"; }));
list.setAt(1, 7);
listener.assertSameAsArray(["hello", 7]);
listener.assertSameAsArray(data);
var count = 0;
LiveUnit.Assert.isTrue(list.some(function (item) { count++; return typeof item === "number"; }));
LiveUnit.Assert.areEqual(2, count);
}
testReduce() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push("Hello ", "my ", "friend ");
listener.assertSameAsArray(["Hello ", "my ", "friend "]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual("Hello my friend ", list.reduce(function (n, m) { return n + m; }, ""));
}
testReduceRight() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push("Hello ", "my ", "friend ");
listener.assertSameAsArray(["Hello ", "my ", "friend "]);
listener.assertSameAsArray(data);
LiveUnit.Assert.areEqual("friend my Hello ", list.reduceRight(function (n, m) { return n + m; }, ""));
}
testGrouped() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
function (num) {
return (num % 2 === 0) ? "even" : "odd";
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
list.push(1, 2, 3, 4);
listener.assertSameAsArray([1, 2, 3, 4]);
listener.assertSameAsArray(data);
groupedListener.assertSameAsArray([2, 4, 1, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
list.splice(2, 0, 5);
listener.assertSameAsArray([1, 2, 5, 3, 4]);
listener.assertSameAsArray(data);
groupedListener.assertSameAsArray([2, 4, 1, 5, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
list.splice(1, 1);
list.splice(3, 1);
listener.assertSameAsArray([1, 5, 3]);
listener.assertSameAsArray(data);
groupedListener.assertSameAsArray([1, 5, 3]);
groupsListener.assertSameAsArray(["odd"]);
list.push(2);
listener.assertSameAsArray([1, 5, 3, 2]);
listener.assertSameAsArray(data);
groupedListener.assertSameAsArray([2, 1, 5, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
}
testLength() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
// You can set the length property to truncate an array at any time. When you extend an array by
// changing its length property, the number of actual elements does not increase; for example,
// if you set length to 3 when it is currently 2, the array still contains only 2 elements.
list.length = 12;
LiveUnit.Assert.areEqual(0, list.length);
LiveUnit.Assert.areEqual(0, data.length);
var count = 0;
list.forEach(function () { count++; });
LiveUnit.Assert.areEqual(0, count);
list.length = 0;
LiveUnit.Assert.areEqual(0, list.length);
// Note that the ListListener doesn't work perfectly against sparse arrays and the reason is that the
// List doesn't communicate things like length change, it communicates element addition/modification/removal
// which should be enough information to be faithful except when there are trailing empty slots in the array
listener.assertSameAsArray([]);
listener.assertSameAsArray(data);
list.push(1, 2, 3);
LiveUnit.Assert.areEqual(3, list.length);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.length = 10;
LiveUnit.Assert.areEqual(3, list.length);
list.length = 1;
LiveUnit.Assert.areEqual(1, list.length);
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
}
testSet() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.setAt(0, 1);
listener.assertSameAsArray([1]);
listener.assertSameAsArray(data);
list.setAt(1, 2);
listener.assertSameAsArray([1, 2]);
listener.assertSameAsArray(data);
list.setAt(0, 3);
listener.assertSameAsArray([3, 2]);
listener.assertSameAsArray(data);
list.setAt(2, 4);
listener.assertSameAsArray([3, 2, 4]);
listener.assertSameAsArray(data);
list.setAt(3, 5);
listener.assertSameAsArray([3, 2, 4, 5]);
listener.assertSameAsArray(data);
list.setAt(2, 6);
listener.assertSameAsArray([3, 2, 6, 5]);
listener.assertSameAsArray(data);
}
testMove() {
var data = [];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.move(0, 1);
listener.assertSameAsArray([2, 1, 3]);
listener.assertSameAsArray(data);
}
testInitializeWithData() {
var data = [1, 2, 3];
var list = new List(data, { proxy: true });
var listener = new ListListener(list);
listener.assertSameAsArray([1, 2, 3]);
listener.assertSameAsArray(data);
list.push(4);
listener.assertSameAsArray([1, 2, 3, 4]);
listener.assertSameAsArray(data);
list.setAt(0, 5);
listener.assertSameAsArray([5, 2, 3, 4]);
listener.assertSameAsArray(data);
}
testIndexOfKeyOnEmptyList() {
var list = new List();
LiveUnit.Assert.areEqual(-1, list.indexOf("2"));
}
testListBaseFilter = function () {
var options = [undefined, { binding: true }, { proxy: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [1, "string1", 2, "string2", 3, 4, 5, "string3"];
var list = new List(arr, options[i]);
var even = list.filter(function (n) { return n % 2 === 0 });
var odd = list.filter(function (n) { return n % 2 === 1});
var string = list.filter(function (n) { return typeof n === "string"; });
var undefinedArr = list.filter(function (n) { return n === undefined });
LiveUnit.Assert.isTrue(checkArrayContent(even, [2, 4]));
LiveUnit.Assert.isTrue(checkArrayContent(odd, [1, 3, 5]));
LiveUnit.Assert.isTrue(checkArrayContent(string, ["string1", "string2", "string3"]));
LiveUnit.Assert.areEqual(0, undefinedArr.length);
LiveUnit.Assert.isTrue(verifyListContent(list, arr));
LiveUnit.Assert.areEqual(8, list.length);
var falsyArr = [1, 2, NaN, 3, "", undefined, false, 3];
var falsyList = new List(falsyArr, options[i]);
var falsy = falsyList.filter(function (l) { return !l; });
LiveUnit.Assert.areEqual(4, falsy.length, "making sure that the length of the falsy array is correct");
LiveUnit.Assert.areEqual(8, falsyList.length, "making sure that the length of the falsy list is correct");
}
}
};
export class ListProjections {
testPopFromEmptyGrouped() {
var list = new List();
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
// reverse sort the groups
function (l, r) {
return l < r ? 1 : l === r ? 0 : -1;
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
list.pop();
}
testDispose() {
var list = new List();
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedListener = new ListListener(sorted);
var reverse = list.createSorted(function (l, r) { return r - l; });
var reverseListener = new ListListener(reverse);
list.push(1, 3, 4, 2, 6, 5);
listener.assertSameAsArray([1, 3, 4, 2, 6, 5]);
sortedListener.assertSameAsArray([1, 2, 3, 4, 5, 6]);
reverseListener.assertSameAsArray([6, 5, 4, 3, 2, 1]);
list.splice(3, 0, 7);
sortedListener.assertSameAsArray([1, 2, 3, 4, 5, 6, 7]);
reverseListener.assertSameAsArray([7, 6, 5, 4, 3, 2, 1]);
var reloadCount = sortedListener.notificationCounts.reload;
sorted.dispose();
sortedListener.assertSameAsArray([]);
LiveUnit.Assert.areEqual(reloadCount + 1, sortedListener.notificationCounts.reload);
list.splice(3, 0, 8);
sortedListener.assertSameAsArray([]);
reverseListener.assertSameAsArray([8, 7, 6, 5, 4, 3, 2, 1]);
}
testSorted() {
var list = new List();
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedListener = new ListListener(sorted);
var reverse = list.createSorted(function (l, r) { return r - l; });
var reverseListener = new ListListener(reverse);
list.push(1, 3, 4, 2, 6, 5);
listener.assertSameAsArray([1, 3, 4, 2, 6, 5]);
sortedListener.assertSameAsArray([1, 2, 3, 4, 5, 6]);
reverseListener.assertSameAsArray([6, 5, 4, 3, 2, 1]);
list.splice(3, 0, 7);
sortedListener.assertSameAsArray([1, 2, 3, 4, 5, 6, 7]);
reverseListener.assertSameAsArray([7, 6, 5, 4, 3, 2, 1]);
}
testSortedSimple() {
var list = new List();
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedListener = new ListListener(sorted);
list.push(1, 3, 2);
listener.assertSameAsArray([1, 3, 2]);
sortedListener.assertSameAsArray([1, 2, 3]);
}
testSortedAtCreation() {
var list = new List([1, 3, 4, 2, 6, 5]);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedListener = new ListListener(sorted);
var reverse = list.createSorted(function (l, r) { return r - l; });
var reverseListener = new ListListener(reverse);
listener.assertSameAsArray([1, 3, 4, 2, 6, 5]);
sortedListener.assertSameAsArray([1, 2, 3, 4, 5, 6]);
reverseListener.assertSameAsArray([6, 5, 4, 3, 2, 1]);
}
testSortedRemove() {
var list = new List();
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedListener = new ListListener(sorted);
list.push(1, 3, 2);
listener.assertSameAsArray([1, 3, 2]);
sortedListener.assertSameAsArray([1, 2, 3]);
// note that here we're editing through the projection and seeing it
// reflected in the underlying list
sorted.splice(1, 1);
listener.assertSameAsArray([1, 3]);
sortedListener.assertSameAsArray([1, 3]);
list.splice(0, 1);
listener.assertSameAsArray([3]);
sortedListener.assertSameAsArray([3]);
}
testGrouped() {
var list = new List();
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
function (num) {
return (num % 2 === 0) ? "even" : "odd";
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
list.push(1, 2, 3, 4);
listener.assertSameAsArray([1, 2, 3, 4]);
groupedListener.assertSameAsArray([2, 4, 1, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
list.splice(2, 0, 5);
listener.assertSameAsArray([1, 2, 5, 3, 4]);
groupedListener.assertSameAsArray([2, 4, 1, 5, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
list.splice(1, 1);
list.splice(3, 1);
listener.assertSameAsArray([1, 5, 3]);
groupedListener.assertSameAsArray([1, 5, 3]);
groupsListener.assertSameAsArray(["odd"]);
list.push(2);
listener.assertSameAsArray([1, 5, 3, 2]);
groupedListener.assertSameAsArray([2, 1, 5, 3]);
groupsListener.assertSameAsArray(["even", "odd"]);
}
testGroupSorted() {
var list = new List();
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
function (num) {
return (num % 2 === 0) ? "even" : "odd";
},
// reverse sort the groups
function (l, r) {
return l < r ? 1 : l === r ? 0 : -1;
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
list.push(1, 2, 3, 4);
listener.assertSameAsArray([1, 2, 3, 4]);
groupedListener.assertSameAsArray([1, 3, 2, 4]);
groupsListener.assertSameAsArray(["odd", "even"]);
list.splice(2, 0, 5);
listener.assertSameAsArray([1, 2, 5, 3, 4]);
groupedListener.assertSameAsArray([1, 5, 3, 2, 4]);
groupsListener.assertSameAsArray(["odd", "even"]);
list.splice(1, 1);
list.splice(3, 1);
listener.assertSameAsArray([1, 5, 3]);
groupedListener.assertSameAsArray([1, 5, 3]);
groupsListener.assertSameAsArray(["odd"]);
list.push(2);
listener.assertSameAsArray([1, 5, 3, 2]);
groupedListener.assertSameAsArray([1, 5, 3, 2]);
groupsListener.assertSameAsArray(["odd", "even"]);
}
testFilter() {
var list = new List();
var listener = new ListListener(list);
var filtered = list.createFiltered(function (item) { return typeof item === "number"; });
var filteredListener = new ListListener(filtered);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push("hello");
listener.assertSameAsArray([1, 2, 3, "hello"]);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift("begin");
listener.assertSameAsArray(["begin", 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift(0);
listener.assertSameAsArray([0, "begin", 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.splice(2, 0, 0.5);
listener.assertSameAsArray([0, "begin", 0.5, 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([0, 0.5, 1, 2, 3, 4]);
list.length = 3;
listener.assertSameAsArray([0, "begin", 0.5]);
filteredListener.assertSameAsArray([0, 0.5]);
list.setAt(3, 56);
listener.assertSameAsArray([0, "begin", 0.5, 56]);
filteredListener.assertSameAsArray([0, 0.5, 56]);
}
testFilter2() {
var list = new List();
var listener = new ListListener(list);
var filtered = list.createFiltered(function (item) { return item.toString().length === 1; });
var filteredListener = new ListListener(filtered);
list.push(1, 2, 3);
listener.assertSameAsArray([1, 2, 3]);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push("hello");
listener.assertSameAsArray([1, 2, 3, "hello"]);
filteredListener.assertSameAsArray([1, 2, 3]);
list.push(4);
listener.assertSameAsArray([1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift("begin");
listener.assertSameAsArray(["begin", 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([1, 2, 3, 4]);
list.unshift(0);
listener.assertSameAsArray([0, "begin", 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.splice(2, 0, 0.5);
listener.assertSameAsArray([0, "begin", 0.5, 1, 2, 3, "hello", 4]);
filteredListener.assertSameAsArray([0, 1, 2, 3, 4]);
list.length = 3;
listener.assertSameAsArray([0, "begin", 0.5]);
filteredListener.assertSameAsArray([0]);
list.setAt(3, 56);
listener.assertSameAsArray([0, "begin", 0.5, 56]);
filteredListener.assertSameAsArray([0]);
list.splice(0, 1);
listener.assertSameAsArray(["begin", 0.5, 56]);
filteredListener.assertSameAsArray([]);
}
testBindingIntegrationFilter(complete) {
var list = new List(null, { binding: true });
list.push({ a: 1 });
var item = list.getItem(0);
item.data.bind("a", function () {
list._notifyMutatedFromKey(item.key);
});
var filtered = list.createFiltered(function (o) { return typeof o.a === "number"; });
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
list.getAt(0).a = "some string";
WinJS.Utilities.Scheduler.schedulePromiseNormal()
.then(function () {
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
list.getAt(0).a = 12;
})
.then(post)
.then(function () {
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
filtered.getAt(0).a = "another string";
})
.then(post)
.then(function () {
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
})
.then(null, errorHandler)
.then(complete);
}
testManualBindingIntegrationFilter(complete) {
var list = new List<{a:any}>();
var filtered = list.createFiltered(function (o) { return typeof o.a === "number"; });
var listListener = new ListListener(list);
var filteredListener = new ListListener(filtered);
list.push({ a: 1 });
WinJS.Promise.wrap().
then(post).then(function () {
listListener.assertLengthChangedCount(2);
filteredListener.assertLengthChangedCount(2);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
}).then(post).then(function () {
list.getAt(0).a = "some string";
list.notifyMutated(0);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
}).then(post).then(function () {
listListener.assertLengthChangedCount(2);
filteredListener.assertLengthChangedCount(3);
list.getAt(0).a = 12;
list.notifyMutated(0);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
}).then(post).then(function () {
listListener.assertLengthChangedCount(2);
filteredListener.assertLengthChangedCount(4);
filtered.getAt(0).a = "another string";
filtered.notifyMutated(0);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
}).then(null, errorHandler).then(complete);
}
testChangedFilter() {
var list = new List<{a:any}>();
list.push({ a: 1 });
var filtered = list.createFiltered(function (o) { return typeof o.a === "number"; });
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
list.setAt(0, { a: "some string" });
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
list.setAt(0, { a: 12 });
list.notifyMutated(0);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(1, filtered.length);
filtered.setAt(0, { a: "another string" });
list.notifyMutated(0);
LiveUnit.Assert.areEqual(1, list.length);
LiveUnit.Assert.areEqual(0, filtered.length);
}
testMovedFilter() {
var list = new List();
var listener = new ListListener(list);
list.push(0, 1, 2);
var filtered = list.createFiltered(function (o) { return typeof o === "number"; });
var filteredListener = new ListListener(filtered);
listener.assertSameAsArray([0, 1, 2]);
filteredListener.assertSameAsArray([0, 1, 2]);
list.move(0, 1);
listener.assertSameAsArray([1, 0, 2]);
filteredListener.assertSameAsArray([1, 0, 2]);
}
// This is a bit of a problem for grouping because we don't know what the old
// group key was. Maybe grouping just shouldn't support mutation, or at least
// not mutation that changes the group of something?
//
testManualBindingIntegrationGrouped() {
var list = new List<{a:any}>();
list.push({ a: 1 });
var grouped = list.createGrouped(
function (o) {
return typeof o.a;
},
function (o) {
return typeof o.a;
}
);
var groupsListener = new ListListener(grouped.groups);
groupsListener.assertSameAsArray(["number"]);
list.getAt(0).a = "some string";
list.notifyMutated(0);
groupsListener.assertSameAsArray(["string"]);
list.getAt(0).a = 12;
list.notifyMutated(0);
groupsListener.assertSameAsArray(["number"]);
grouped.getAt(0).a = "another string";
list.notifyMutated(0);
groupsListener.assertSameAsArray(["string"]);
}
testChangedGrouped() {
var list = new List<{a:any}>();
list.push({ a: 1 });
var grouped = list.createGrouped(
function (o) {
return typeof o.a;
},
function (o) {
return typeof o.a;
}
);
var groupsListener = new ListListener(grouped.groups);
groupsListener.assertSameAsArray(["number"]);
list.setAt(0, { a: "some string" });
groupsListener.assertSameAsArray(["string"]);
list.setAt(0, { a: 12 });
groupsListener.assertSameAsArray(["number"]);
grouped.setAt(0, { a: "another string" });
groupsListener.assertSameAsArray(["string"]);
}
testChangedGroupedWithoutChangingGroups() {
var list = new List<{a:any}>();
list.push({ a: 1 });
var grouped = list.createGrouped(
function (o) {
return "one";
},
function (o) {
return o.a;
}
);
var groupsListener = new ListListener(grouped.groups);
groupsListener.assertSameAsArray([1]);
list.setAt(0, { a: "some string" });
groupsListener.assertSameAsArray(["some string"]);
list.setAt(0, { a: 12 });
groupsListener.assertSameAsArray([12]);
grouped.setAt(0, { a: "another string" });
groupsListener.assertSameAsArray(["another string"]);
}
testMovedGrouped() {
var list = new List();
var listener = new ListListener(list);
list.push(0, 1, 2);
var grouped = list.createGrouped(
function (o) {
return typeof o;
},
function (o) {
return typeof o;
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupsListener.assertSameAsArray(["number"]);
groupedListener.assertSameAsArray([0, 1, 2]);
listener.assertSameAsArray([0, 1, 2]);
list.move(0, 1);
listener.assertSameAsArray([1, 0, 2]);
groupedListener.assertSameAsArray([1, 0, 2]);
groupsListener.assertSameAsArray(["number"]);
}
testManualBindingIntegrationSorted() {
var list = new List<{a:number}>();
list.push({ a: 1 }, { a: 2 });
var sorted = list.createSorted(function (l, r) { return r.a - l.a; });
LiveUnit.Assert.areEqual(2, sorted.getAt(0).a);
LiveUnit.Assert.isTrue(list.getAt(1) === sorted.getAt(0));
LiveUnit.Assert.areEqual(1, sorted.getAt(1).a);
LiveUnit.Assert.isTrue(list.getAt(0) === sorted.getAt(1));
list.getAt(0).a = 3;
list.notifyMutated(0);
LiveUnit.Assert.areEqual(3, sorted.getAt(0).a);
LiveUnit.Assert.isTrue(list.getAt(0) === sorted.getAt(0));
LiveUnit.Assert.areEqual(2, sorted.getAt(1).a);
LiveUnit.Assert.isTrue(list.getAt(1) === sorted.getAt(1));
sorted.getAt(0).a = 0;
sorted.notifyMutated(0);
LiveUnit.Assert.areEqual(2, sorted.getAt(0).a);
LiveUnit.Assert.isTrue(list.getAt(1) === sorted.getAt(0));
LiveUnit.Assert.areEqual(0, sorted.getAt(1).a);
LiveUnit.Assert.isTrue(list.getAt(0) === sorted.getAt(1));
}
testChangedSorted() {
var list = new List();
var listener = new ListListener(list);
list.push(2, 1, 3);
var sorted = list.createSorted(function (l, r) { return r - l; });
var sortedListener = new ListListener(sorted);
listener.assertSameAsArray([2, 1, 3]);
sortedListener.assertSameAsArray([3, 2, 1]);
list.setAt(0, 7);
listener.assertSameAsArray([7, 1, 3]);
sortedListener.assertSameAsArray([7, 3, 1]);
sorted.setAt(0, 8);
listener.assertSameAsArray([8, 1, 3]);
sortedListener.assertSameAsArray([8, 3, 1]);
sorted.setAt(0, 2);
listener.assertSameAsArray([2, 1, 3]);
sortedListener.assertSameAsArray([3, 2, 1]);
}
testMovedSorted() {
var list = new List();
var listener = new ListListener(list);
list.push(0, 1, 2);
var sorted = list.createSorted(function (l, r) { return r - l; });
var sortedListener = new ListListener(sorted);
listener.assertSameAsArray([0, 1, 2]);
sortedListener.assertSameAsArray([2, 1, 0]);
list.move(0, 1);
listener.assertSameAsArray([1, 0, 2]);
sortedListener.assertSameAsArray([2, 1, 0]);
}
testBindingWithSortedProjection() {
var data = [{ a: 1, b: 2 }, { a: 2, b: 3 }, { a: -1, b: 3 }, { a: 0, b: 4 }];
var list = new List(data, { binding: true });
var sorted = list.createSorted(function (l, r) { return l.a - r.a; });
function verifySorted(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== sorted.getAt(i).a) {
return false;
}
}
return true;
}
LiveUnit.Assert.isTrue(verifySorted([-1, 0, 1, 2]), "sorting is not correct");
sorted.getAt(0).a = 4;
sorted.notifyMutated(0);
LiveUnit.Assert.isTrue(verifySorted([0, 1, 2, 4]), "sorting is not correct");
sorted.push({ a: 0, b: 3 });
LiveUnit.Assert.isTrue(verifySorted([0, 0, 1, 2, 4]), "sorting is not correct");
LiveUnit.Assert.areEqual(4, sorted.getAt(0).b, "incorrect placement of an element");
}
testPushInFilteredList() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var eListener = new ListListener(evenFiltered);
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var oListener = new ListListener(oddFiltered);
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var peListener = new ListListener(positiveEvenFiltered);
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var neListener = new ListListener(negativeEvenFiltered);
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var poListener = new ListListener(positiveOddFiltered);
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var noListener = new ListListener(negativeOddFiltered);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
negativeOddFiltered.push(0, -20, 21, 20, -21);
noListener.assertSameAsArray([-1, -3, -5, -21]);
}
testListFilter() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
LiveUnit.Assert.areEqual(12, list.length, "list lenght is not correct");
LiveUnit.Assert.areEqual(6, evenFiltered.length, "list lenght is not correct");
LiveUnit.Assert.areEqual(6, oddFiltered.length, "list lenght is not correct");
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
LiveUnit.Assert.areEqual(3, positiveEvenFiltered.length, "positive even Filtered list lenght is not correct");
LiveUnit.Assert.areEqual(2, negativeEvenFiltered.length, "negative even Filtered list lenght is not correct");
LiveUnit.Assert.areEqual(3, positiveOddFiltered.length, "positive odd Filtered list lenght is not correct");
LiveUnit.Assert.areEqual(3, negativeOddFiltered.length, "negative odd Filtered list lenght is not correct");
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
peListener.assertSameAsArray([2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
list.push(0, -100, 100, 101, -101);
LiveUnit.Assert.areEqual(17, list.length, "list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(9, evenFiltered.length, "list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(8, oddFiltered.length, "list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(4, positiveEvenFiltered.length, "positive even Filtered list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(3, negativeEvenFiltered.length, "negative even Filtered list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(4, positiveOddFiltered.length, "positive odd Filtered list lenght is not correct after pushing new elements");
LiveUnit.Assert.areEqual(4, negativeOddFiltered.length, "negative odd Filtered list lenght is not correct after pushing new elements");
listener.assertSameAsArray([-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6, 0, -100, 100, 101, -101]);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6, 0, -100, 100]);
peListener.assertSameAsArray([2, 4, 6, 100]);
neListener.assertSameAsArray([-2, -4, -100]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5, 101, -101]);
poListener.assertSameAsArray([1, 3, 5, 101]);
noListener.assertSameAsArray([-1, -3, -5, -101]);
list.setAt(0, 0);
LiveUnit.Assert.areEqual(17, list.length, "list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(10, evenFiltered.length, "list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(7, oddFiltered.length, "list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(4, positiveEvenFiltered.length, "positive even Filtered list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(3, negativeEvenFiltered.length, "negative even Filtered list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(4, positiveOddFiltered.length, "positive odd Filtered list lenght is not correct after setting the value of existing elements");
LiveUnit.Assert.areEqual(3, negativeOddFiltered.length, "negative odd Filtered list lenght is not correct after setting the value of existing elements");
listener.assertSameAsArray([0, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6, 0, -100, 100, 101, -101]);
eListener.assertSameAsArray([0, -2, -4, 0, 2, 4, 6, 0, -100, 100]);
peListener.assertSameAsArray([2, 4, 6, 100]);
neListener.assertSameAsArray([-2, -4, -100]);
oListener.assertSameAsArray([-3, -5, 1, 3, 5, 101, -101]);
poListener.assertSameAsArray([1, 3, 5, 101]);
noListener.assertSameAsArray([-3, -5, -101]);
var result = [0, -2, 4, -4, -5, 0, 1, 2, 3, 4, 5, 6, 0, -100, 100, 101, -101];
negativeOddFiltered.setAt(0, 4);
listener.assertSameAsArray(result);
eListener.assertSameAsArray([0, -2, 4, -4, 0, 2, 4, 6, 0, -100, 100]);
peListener.assertSameAsArray([4, 2, 4, 6, 100]);
neListener.assertSameAsArray([-2, -4, -100]);
oListener.assertSameAsArray([-5, 1, 3, 5, 101, -101]);
poListener.assertSameAsArray([1, 3, 5, 101]);
noListener.assertSameAsArray([-5, -101]);
negativeOddFiltered.push(0, -20, 21, 20, -21);//negativeOddFiltered, [-5, -101, 0, -20, 21, 20, -21]
result.push(0, -20, 21, 20, -21);
listener.assertSameAsArray(result);
positiveOddFiltered.push(22, 0, -23, 23, -22);
result.push(22, 0, -23, 23, -22);
listener.assertSameAsArray(result);
negativeEvenFiltered.push(24, 0, -24, -25, 25);
result.push(24, 0, -24, -25, 25);
listener.assertSameAsArray(result);
positiveEvenFiltered.push(-26, 27, 0, -27, 27);
result.push(-26, 27, 0, -27, 27);
listener.assertSameAsArray(result);
eListener.assertSameAsArray([0, -2, 4, -4, 0, 2, 4, 6, 0, -100, 100, 0, -20, 20, 22, 0, -22, 24, 0, -24, -26, 0]);
peListener.assertSameAsArray([4, 2, 4, 6, 100, 20, 22, 24]);
neListener.assertSameAsArray([-2, -4, -100, -20, -22, -24, -26]);
oListener.assertSameAsArray([-5, 1, 3, 5, 101, -101, 21, -21, -23, 23, -25, 25, 27, -27, 27]);
poListener.assertSameAsArray([1, 3, 5, 101, 21, 23, 25, 27, 27]);
noListener.assertSameAsArray([-5, -101, -21, -23, -25, -27]);
}
testListFilterSetAt() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
peListener.assertSameAsArray([2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
negativeOddFiltered.setAt(0, 5); // [5, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6]
positiveOddFiltered.setAt(0, 101); // [101, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6]
oddFiltered.setAt(oddFiltered.length - 1, 201); // [101, -2, -3, -4, -5, 0, 1, 2, 3, 4, 201, 6]
evenFiltered.setAt(2, 2); // [101, -2, -3, -4, -5, 2, 1, 2, 3, 4, 201, 6]
positiveEvenFiltered.setAt(0, -2); // [101, -2, -3, -4, -5, -2, 1, 2, 3, 4, 201, 6]
negativeEvenFiltered.setAt(1, 3); // [101, -2, -3, 3, -5, -2, 1, 2, 3, 4, 201, 6]
var result = [101, -2, -3, 3, -5, -2, 1, 2, 3, 4, 201, 6];
listener.assertSameAsArray(result);
eListener.assertSameAsArray([-2, -2, 2, 4, 6]);
peListener.assertSameAsArray([2, 4, 6]);
neListener.assertSameAsArray([-2, -2]);
oListener.assertSameAsArray([101, -3, 3, -5, 1, 3, 201]);
poListener.assertSameAsArray([101, 3, 1, 3, 201]);
noListener.assertSameAsArray([-3, -5]);
}
testSpliceDifferentScenariosFilteredProjection() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
list.splice(0, 1);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-3, -5]);
evenFiltered.splice(0, 1);
positiveEvenFiltered.splice(0, 1);
negativeEvenFiltered.splice(0, 0, -10);
oddFiltered.splice(2, 1);
positiveOddFiltered.splice(10, 0, 11);
listener.assertSameAsArray([-3, -10, -4, -5, 0, 3, 4, 5, 11, 6]);
eListener.assertSameAsArray([-10, -4, 0, 4, 6]);
neListener.assertSameAsArray([-10, -4]);
peListener.assertSameAsArray([4, 6]);
oListener.assertSameAsArray([-3, -5, 3, 5, 11]);
poListener.assertSameAsArray([3, 5, 11]);
noListener.assertSameAsArray([-3, -5]);
}
testFilteredListInvalidScenarios() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
LiveUnit.Assert.areEqual(-1, negativeOddFiltered.indexOf(4), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, positiveEvenFiltered.indexOf(-4), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, negativeEvenFiltered.indexOf(4), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, positiveOddFiltered.indexOf(-5), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, evenFiltered.indexOf(5), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, oddFiltered.indexOf(4), "testing Invalid value");
LiveUnit.Assert.areEqual(-1, list.indexOf(10), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, negativeOddFiltered.getItem(list.length), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, positiveEvenFiltered.getItem(-4), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, negativeEvenFiltered.getItem(list.length), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, positiveOddFiltered.getItem(-5), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, evenFiltered.getItem(list.length), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, oddFiltered.getItem(list.length), "testing Invalid value");
LiveUnit.Assert.areEqual(undefined, list.getItem(list.length), "testing Invalid value");
}
testFilterIndexOfKey() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
for (var i = 0; i < list.length; i++) {
LiveUnit.Assert.areEqual(i, list.indexOfKey(i.toString()), "wrong index of key");
}
var obj = [evenFiltered, oddFiltered, positiveEvenFiltered, negativeEvenFiltered, positiveOddFiltered, negativeOddFiltered];
for (var i = 0; i < obj.length; i++) {
var count = 0;
for (var j = 0; j < list.length; j++) {
var flag = ((obj[i].indexOfKey(j.toString()) !== undefined) && (obj[i].indexOfKey(j.toString()) !== -1));
if (flag) {
LiveUnit.Assert.areEqual(list.getItemFromKey(j.toString()), obj[i].getItemFromKey(j.toString()), "wrong index of key");
count++;
}
else {
LiveUnit.Assert.areEqual(-1, obj[i].indexOf(list.getItemFromKey(j.toString()).data), "element is not there");
}
}
LiveUnit.Assert.areEqual(count, obj[i].length, "All keys are not tested correctly");
}
}
testFilteredListGetItem() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
var obj:any[] = [list, evenFiltered, oddFiltered, positiveEvenFiltered, negativeEvenFiltered, positiveOddFiltered, negativeOddFiltered];
for (var i = 0; i < obj.length; i++) {
for (var j = 0; j < obj[i].length; j++) {
LiveUnit.Assert.areEqual(obj[i].getAt(j), obj[i].getItem(j).data, "testing getItem");
}
}
}
testListFilterDispose() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
var oReloadCount = oListener.notificationCounts.reload;
var poReloadCount = poListener.notificationCounts.reload;
var noReloadCount = noListener.notificationCounts.reload;
oddFiltered.dispose();
LiveUnit.Assert.areEqual(oReloadCount + 1, oListener.notificationCounts.reload);
LiveUnit.Assert.areEqual(poReloadCount + 1, poListener.notificationCounts.reload);
LiveUnit.Assert.areEqual(noReloadCount + 1, noListener.notificationCounts.reload);
oListener.assertSameAsArray([]);
poListener.assertSameAsArray([]);
noListener.assertSameAsArray([]);
list.push(1);
oListener.assertSameAsArray([]);
poListener.assertSameAsArray([]);
noListener.assertSameAsArray([]);
}
testListFilterWithProxy() {
var options = [undefined, { proxy: true }];
var data = [-2, -4, 0, 2, 4, 6, -1, -3, -5, 1, 3, 5];
for (var i = 0; i < options.length; i++) {
var list = new List(data, options[i]);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
list.push(0);
evenFiltered.push(4);
oddFiltered.push(1);
positiveEvenFiltered.push(2);
negativeEvenFiltered.push(-2);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6, 0, 4, 2, -2]);
neListener.assertSameAsArray([-2, -4, -2]);
peListener.assertSameAsArray([2, 4, 6, 4, 2]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5, 1]);
poListener.assertSameAsArray([1, 3, 5, 1]);
noListener.assertSameAsArray([-1, -3, -5]);
}
}
testFilterWithMutationOfFilterProperty() {
var list = new List<{value:string}>();
var sorted = list.createSorted(function (l, r) {
return l.value.localeCompare(r.value);
});
var filtered = sorted.createFiltered(function (item) {
return item.value[0] === "b";
});
var filteredListener = new ListListener(filtered, function (v) { return v.value; });
list.push({ value: "a" });
list.push({ value: "b55" });
list.push({ value: "c" });
filteredListener.assertSameAsArray([{ value: "b55" }]);
var item = list.getAt(0);
item.value = "b0";
list.notifyMutated(0);
list.push({ value: "b99" });
list.push({ value: "b44" });
filteredListener.assertSameAsArray([{ value: "b0" }, { value: "b44" }, { value: "b55" }, { value: "b99" }]);
list.splice(0, 1);
filteredListener.assertSameAsArray([{ value: "b44" }, { value: "b55" }, { value: "b99" }]);
list.unshift({ value: "b22" });
filteredListener.assertSameAsArray([{ value: "b22" }, { value: "b44" }, { value: "b55" }, { value: "b99" }]);
}
testMoveElementsToEndOfListInFilteredProjection() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
negativeOddFiltered.move(0, 2);
oListener.assertSameAsArray([-3, -5, -1, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-3, -5, -1]);
}
testMoveElementFilteredProjection() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
list.move(0, list.length - 1);
oListener.assertSameAsArray([-3, -5, 1, 3, 5, -1]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-3, -5, -1]);
}
testMoveElementstoBeginingInFilteredProjection() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
negativeOddFiltered.move(2, 0);
listener.assertSameAsArray([-5, -1, -2, -3, -4, 0, 1, 2, 3, 4, 5, 6]);
oListener.assertSameAsArray([-5, -1, -3, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-5, -1, -3]);
oddFiltered.move(1, 4);
listener.assertSameAsArray([-5, -2, -3, -4, 0, 1, 2, 3, -1, 4, 5, 6]);
oListener.assertSameAsArray([-5, -3, 1, 3, -1, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-5, -3, -1]);
oddFiltered.move(2, 5);
listener.assertSameAsArray([-5, -2, -3, -4, 0, 2, 3, -1, 4, 5, 1, 6]);
oListener.assertSameAsArray([-5, -3, 3, -1, 5, 1]);
poListener.assertSameAsArray([3, 5, 1]);
noListener.assertSameAsArray([-5, -3, -1]);
}
testListFilterMutationScenarios() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
list.move(0, list.length - 1);
list.move(0, list.length - 2);
list.unshift(21, 22, -21, -22);
listener.assertSameAsArray([21, 22, -21, -22, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6, -2, -1]);
eListener.assertSameAsArray([22, -22, -4, 0, 2, 4, 6, -2]);
neListener.assertSameAsArray([-22, -4, -2]);
peListener.assertSameAsArray([22, 2, 4, 6]);
oListener.assertSameAsArray([21, -21, -3, -5, 1, 3, 5, -1]);
poListener.assertSameAsArray([21, 1, 3, 5]);
noListener.assertSameAsArray([-21, -3, -5, -1]);
//test different mutations -pop - splice
var increment = function (value, index) { list.setAt(index, list.getAt(index) + 1); }
list.forEach(increment);
listener.assertSameAsArray([22, 23, -20, -21, -2, -3, -4, 1, 2, 3, 4, 5, 6, 7, -1, 0]);
eListener.assertSameAsArray([22, -20, -2, -4, 2, 4, 6, 0]);
neListener.assertSameAsArray([-20, -2, -4]);
peListener.assertSameAsArray([22, 2, 4, 6]);
oListener.assertSameAsArray([23, -21, -3, 1, 3, 5, 7, -1]);
poListener.assertSameAsArray([23, 1, 3, 5, 7]);
noListener.assertSameAsArray([-21, -3, -1]);
var reverse = function(value, index) { oddFiltered.setAt(index, -value); }
oddFiltered.forEach(reverse);
listener.assertSameAsArray([22, -23, -20, 21, -2, 3, -4, -1, 2, -3, 4, -5, 6, -7, 1, 0]);
eListener.assertSameAsArray([22, -20, -2, -4, 2, 4, 6, 0]);
peListener.assertSameAsArray([22, 2, 4, 6]);
neListener.assertSameAsArray([-20, -2, -4]);
oListener.assertSameAsArray([-23, 21, 3, -1, -3, -5, -7, 1]);
noListener.assertSameAsArray([-23, -1, -3, -5, -7]);
poListener.assertSameAsArray([21, 3, 1]);
}
testListFilterSplice() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var result = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
list.splice(2, 0, 7);
result.splice(2, 0, 7);
listener.assertSameAsArray(result);//[-1, -2, 7, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6]
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, 7, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([7, 1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
}
testListFilteredPop() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var listener = new ListListener(list);
var eListener = new ListListener(evenFiltered);
var oListener = new ListListener(oddFiltered);
var peListener = new ListListener(positiveEvenFiltered);
var neListener = new ListListener(negativeEvenFiltered);
var poListener = new ListListener(positiveOddFiltered);
var noListener = new ListListener(negativeOddFiltered);
list.push(0);
data.push(0);
listener.assertSameAsArray(data);
eListener.assertSameAsArray([-2, -4, 0, 2, 4, 6, 0]);
neListener.assertSameAsArray([-2, -4]);
peListener.assertSameAsArray([2, 4, 6]);
oListener.assertSameAsArray([-1, -3, -5, 1, 3, 5]);
poListener.assertSameAsArray([1, 3, 5]);
noListener.assertSameAsArray([-1, -3, -5]);
LiveUnit.Assert.areEqual(6, positiveEvenFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(-4, negativeEvenFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(5, oddFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(3, positiveOddFiltered.pop(), "pop from pisitve Even filter");
}
testSortedListProjection() {
var options = [undefined, { proxy: true }, { binding: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [1, 2, 3, 0, -1, -4, 10, 12, 7, 56];
var list = new List(data, options[i]);
var asc = list.createSorted(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(asc, [-4, -1, 0, 1, 2, 3, 7, 10, 12, 56]));
}
}
testBindingWithSortedProjection2() {
var data = [{ a: 1, b: 2 }, { a: 2, b: 3 }, { a: -1, b: 3 }, { a: 0, b: 4 }];
var list = new List(data, { binding: true });
var sorted = list.createSorted(function (l, r) { return l.a - r.a; });
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [-1, 0, 1, 2]), "sorting is not correct");
sorted.getAt(0).a = 4;
sorted.notifyMutated(0);
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [0, 1, 2, 4]), "sorting is not correct");
// This element is expected to be inserted to the right of the other 0.
sorted.push({ a: 0, b: 3 });
list.push({ a: 5, b: 3 });
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [0, 0, 1, 2, 4, 5]), "sorting is not correct");
LiveUnit.Assert.areEqual(4, sorted.getAt(0).b, "incorrect placement of an element");
LiveUnit.Assert.areEqual(3, sorted.getAt(1).b, "incorrect placement of an element");
}
testSortedListWithProxy() {
var data:any = [{ a: 1, b: 2 }, { a: 2, b: 3 }, { a: -1, b: 3 }, { a: 0, b: 4 }];
var list = new List(data, { proxy: true });
var sorted = list.createSorted(function (l, r) { return l.a - r.a; });
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [-1, 0, 1, 2]), "sorting is not correct");
sorted.getAt(0).a = 4;
sorted.notifyMutated(0);
data.getAt = function (i) { return data[i]; }
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [0, 1, 2, 4]), "sorting is not correct");
sorted.push({ a: 0, b: 3 });
list.push({ a: 5, b: 3 });
LiveUnit.Assert.isTrue(verifySortedArr(sorted, [0, 0, 1, 2, 4, 5]), "sorting is not correct");
LiveUnit.Assert.isTrue(verifySortedArr(data, [1, 2, 4, 0, 0, 5]), "sorting is not correct");
}
//should add more testig for push and pop after fixing the bug
testBaseMutatorFunctionInSortedProjection = function () {
var options:any = [undefined, { proxy: true }, { binding: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-2, -1, 3, 4, 0, 10, 2];
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 2, 3, 4, 10]));
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [10, 4, 3, 2, 0, -1, -2]));
aSortedListener.assertSameAsArray([-2, -1, 0, 2, 3, 4, 10]);
dSortedListener.assertSameAsArray([10, 4, 3, 2, 0, -1, -2]);
descSorted.push(ascSorted.pop());
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 2, 3, 4, 10]));
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [10, 4, 3, 2, 0, -1, -2]));
aSortedListener.assertSameAsArray([-2, -1, 0, 2, 3, 4, 10]);
dSortedListener.assertSameAsArray([10, 4, 3, 2, 0, -1, -2]);
LiveUnit.Assert.areEqual(10, ascSorted.pop(), "correct pop check");
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 2, 3, 4]));
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [4, 3, 2, 0, -1, -2]));
aSortedListener.assertSameAsArray([-2, -1, 0, 2, 3, 4]);
dSortedListener.assertSameAsArray([4, 3, 2, 0, -1, -2]);
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(checkArrayContent(data, [-2, -1, 3, 4, 0, 2]));
}
}
}
testBaseMutatorMutationFunctionsInSortedProjection() {
var options:any = [undefined, { proxy: true }, { binding: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-2, -1, 3, 4, 0, 10, 2];
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 2, 3, 4, 10]));
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [10, 4, 3, 2, 0, -1, -2]));
aSortedListener.assertSameAsArray([-2, -1, 0, 2, 3, 4, 10])
dSortedListener.assertSameAsArray([10, 4, 3, 2, 0, -1, -2]);
var size = ascSorted.unshift(-4, -3, -2, 12);
LiveUnit.Assert.areEqual(11, size, "checking unshift in ascending array");
size = descSorted.unshift(5, 33, -32, 22);
LiveUnit.Assert.areEqual(15, size, "checking unshift in descending array");
aSortedListener.assertSameAsArray([-32, -4, -3, -2, -2, -1, 0, 2, 3, 4, 5, 10, 12, 22, 33])
dSortedListener.assertSameAsArray([33, 22, 12, 10, 5, 4, 3, 2, 0, -1, -2, -2, -3, -4, -32]);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-32, -4, -3, -2, -2, -1, 0, 2, 3, 4, 5, 10, 12, 22, 33]));
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [33, 22, 12, 10, 5, 4, 3, 2, 0, -1, -2, -2, -3, -4, -32]));
if (options[i] && options[i].proxy) {
LiveUnit.Assert.areEqual(list.length, data.length, "checking the length of the main array and the main list");
}
LiveUnit.Assert.areEqual(-32, ascSorted.shift(), "testing shifting in ascending sorting");
LiveUnit.Assert.areEqual(33, descSorted.shift(), "testing shifting in descending sorting");
LiveUnit.Assert.areEqual(13, descSorted.length, "checking length after unshifting");
LiveUnit.Assert.areEqual(13, ascSorted.length, "checking length after unshifting");
for (var j = 0; j < 13; j++) {
var elem = ascSorted.getAt(0);
LiveUnit.Assert.areEqual(elem, ascSorted.shift(), "testing shifting in ascending sorting");
}
LiveUnit.Assert.areEqual(0, descSorted.length, "checking length after unshifting");
LiveUnit.Assert.areEqual(0, ascSorted.length, "checking length after unshifting");
}
}
testDisposeInSortedProjection() {
var options:any = [undefined, { proxy: true }, { binding: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [4, 3, 2, 5, -1, 0, 10];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
aSortedListener.assertSameAsArray([-1, 0, 2, 3, 4, 5, 10]);
dSortedListener.assertSameAsArray([10, 5, 4, 3, 2, 0, -1])
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-1, 0, 2, 3, 4, 5, 10]), "verifying correct list asc order");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [10, 5, 4, 3, 2, 0, -1]), "verifying correct list desc order");
var reloadCount = aSortedListener.notificationCounts.reload;
ascSorted.dispose();
LiveUnit.Assert.areEqual(reloadCount + 1, aSortedListener.notificationCounts.reload);
aSortedListener.assertSameAsArray([]);
list.push(-100);
aSortedListener.assertSameAsArray([]);
LiveUnit.Assert.areEqual(-100, descSorted.getAt(descSorted.length - 1), "error! cannot get the correct element");
LiveUnit.Assert.areEqual(8, list.length, "making sure length is correct");
LiveUnit.Assert.areEqual(0, ascSorted.length);
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data, true), "making sure that the list proxy is working correctly");
}
}
}
testGetItemFromSortedProjection() {
var options = [undefined, { proxy: true }, { binding: true }, { proxy: true, binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [4, 3, 2, 5, -1, 0, 10];
var asc = function (l, r) { return l - r; };
var desc = function (l, r) { return r - l; };
var ascSortedArray = data.concat().sort(asc);
var descSortedArray = data.concat().sort(desc);
var list = new List(data, options[i]);
var listener = new ListListener(list);
var ascSorted = list.createSorted(asc);
var descSorted = list.createSorted(desc)
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
for (var i = 0; i < ascSorted.length; i++) {
LiveUnit.Assert.areEqual(ascSortedArray[i], ascSorted.getItem(i).data, "making sure of correct content");
}
for (var i = 0; i < descSorted.length; i++) {
LiveUnit.Assert.areEqual(descSortedArray[i], descSorted.getItem(i).data, "making sure of correct content");
}
}
}
testStableSortAndInsertInSortedProjection() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [{ a: 1, b: 2 }, { a: 1, b: 3 }, { a: 0, b: 4 }, { a: -1, b: -1 }, { a: 2, b: 3 }];
var list = new List(data, options[i]);
var sortedArr = list.createSorted(function (l, r) { return l.a - r.a; });
var listener = new ListListener(list);
var aSortedListener = new ListListener(sortedArr);
LiveUnit.Assert.isTrue(verifySortedArr(sortedArr, [-1, 0, 1, 1, 2]), "sorting is not correct");
LiveUnit.Assert.isTrue(sortedArr.getAt(2).a === sortedArr.getAt(3).a && sortedArr.getAt(2).b < sortedArr.getAt(3).b);
//Expected: [{ a: -1, b: -1 }, { a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 2, b: 3 }];
sortedArr.push({ a: 1, b: 10 });
//Expected: [{ a: -1, b: -1 }, { a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 1, b: 10 }, { a: 2, b: 3 }];
LiveUnit.Assert.isTrue(sortedArr.getAt(4).a === 1 && sortedArr.getAt(4).b === 10);
sortedArr.getAt(0).a = 1;
sortedArr.notifyMutated(0);
//Expected: [{ a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 1, b: -1 }, { a: 1, b: 10 }, { a: 2, b: 3 }];
LiveUnit.Assert.isTrue(sortedArr.getAt(1).a === sortedArr.getAt(2).a && sortedArr.getAt(1).b < sortedArr.getAt(2).b);
LiveUnit.Assert.isTrue(sortedArr.getAt(2).a === sortedArr.getAt(3).a && sortedArr.getAt(2).b > sortedArr.getAt(3).b);
}
}
testStableSortAndInsertInSortedProjectionUsingMainList() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [{ a: 1, b: 2 }, { a: 1, b: 3 }, { a: 0, b: 4 }, { a: -1, b: -1 }, { a: 2, b: 3 }];
var list = new List(data, options[i]);
var sortedArr = list.createSorted(function (l, r) { return l.a - r.a; });
var listener = new ListListener(list);
var aSortedListener = new ListListener(sortedArr);
LiveUnit.Assert.isTrue(verifySortedArr(sortedArr, [-1, 0, 1, 1, 2]), "sorting is not correct");
LiveUnit.Assert.isTrue(sortedArr.getAt(2).a === sortedArr.getAt(3).a && sortedArr.getAt(2).b < sortedArr.getAt(3).b);
//Expected: [{ a: -1, b: -1 }, { a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 2, b: 3 }];
sortedArr.push({ a: 1, b: 10 });
//Expected: [{ a: -1, b: -1 }, { a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 1, b: 10 }, { a: 2, b: 3 }];
LiveUnit.Assert.isTrue(sortedArr.getAt(4).a === 1 && sortedArr.getAt(4).b === 10);
list.getAt(3).a = 1;
list.notifyMutated(3);
//Expected: [{ a: 0, b: 4 }, { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 1, b: -1 }, { a: 1, b: 10 }, { a: 2, b: 3 }];
LiveUnit.Assert.isTrue(sortedArr.getAt(1).a === sortedArr.getAt(2).a && sortedArr.getAt(1).b < sortedArr.getAt(2).b);
LiveUnit.Assert.isTrue(sortedArr.getAt(2).a === sortedArr.getAt(3).a && sortedArr.getAt(2).b > sortedArr.getAt(3).b);
}
}
testMoveInSortedProjection() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 0, 1, 2, 3, -2, 10];
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
var listener = new ListListener(list);
list.move(0, 3);
listener.assertSameAsArray([0, 1, 2, -1, 3, -2, 10]);
aSortedListener.assertSameAsArray([-2, -1, 0, 1, 2, 3, 10]);
dSortedListener.assertSameAsArray([10, 3, 2, 1, 0, -1, -2]);
LiveUnit.Assert.isTrue(verifyListContent(list, [0, 1, 2, -1, 3, -2, 10]), "moving an element in the main list");
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 1, 2, 3, 10]), "testing splice in ascending list");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [10, 3, 2, 1, 0, -1, -2]), "testing splice in ascending list");
ascSorted.move(0, 1);
var arr = [ascSorted, descSorted];
for (var ind = 0; ind < arr.length; ind++) {
var sortedArr = arr[ind];
var param;
for (var from = 0; from < sortedArr.length; from++) {
for (var to = 0; to < sortedArr.length; to++) {
sortedArr.move(from, to);
if (ind === 0) {
param = "asc";
}
LiveUnit.Assert.isTrue(verifySorted(ascSorted, param), "making sure that the array is still sorted");
}
}
}
aSortedListener.assertSameAsArray([-2, -1, 0, 1, 2, 3, 10]);
dSortedListener.assertSameAsArray([10, 3, 2, 1, 0, -1, -2]);
list.move(0, 100);
LiveUnit.Assert.isTrue(verifySorted(ascSorted, true), "making sure that the array is still sorted");
LiveUnit.Assert.isTrue(verifySorted(descSorted), "making sure that the array is still sorted");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "testing splice in ascending list");
}
}
}
testBaseMutatorMutationFunctionsInSortedProjection2() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 0, 1, 2, 3, -2, 10];
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var listener = new ListListener(list);
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
ascSorted.splice(100, 0, 12);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-2, -1, 0, 1, 2, 3, 10, 12]), "testing splice in ascending list");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [12, 10, 3, 2, 1, 0, -1, -2]), "testing splice in ascending list");
ascSorted.splice(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-1, 0, 1, 2, 3, 10, 12]), "testing splice in ascending list");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [12, 10, 3, 2, 1, 0, -1]), "testing splice in ascending list");
ascSorted.splice(4, 0, -5);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-5, -1, 0, 1, 2, 3, 10, 12]), "testing splice in ascending list");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [12, 10, 3, 2, 1, 0, -1, -5]), "testing splice in ascending list");
descSorted.splice(5, 0, 8);
LiveUnit.Assert.isTrue(verifyListContent(ascSorted, [-5, -1, 0, 1, 2, 3, 8, 10, 12]), "testing splice in ascending list");
LiveUnit.Assert.isTrue(verifyListContent(descSorted, [12, 10, 8, 3, 2, 1, 0, -1, -5]), "testing splice in ascending list");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "testing splice in ascending list");
}
}
}
//setAt
testProjectionFunctionsInSortedProjection() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 0, 1, 2, 3, -2, 10];
data.sort(function (l, r) { return l - r; });
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var listener = new ListListener(list);
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
var arr = [-1, 0, 1, 2, 3, -2, 10];
arr.sort(function (l, r) { return l - r });
for (var j = 0; j < arr.length; j++) {
LiveUnit.Assert.areEqual(j, ascSorted.indexOf(arr[j]), "making sure indexOf elements are set correctly");
}
arr.sort(function (l, r) { return r - l; });
for (var j = 0; j < arr.length; j++) {
LiveUnit.Assert.areEqual(j, descSorted.indexOf(arr[j]), "making sure indexOf elements are set correctly");
}
LiveUnit.Assert.areEqual(-1, descSorted.indexOf(100), "checking for non existing element");
LiveUnit.Assert.areEqual(-1, ascSorted.indexOf(-100), "checking for non existing element");
for (j = 0; j < ascSorted.length / 2; j++) {
var key1 = (ascSorted)._getKey(ascSorted.length - j - 1);
var key2 = (ascSorted)._getKey(j);
var ind1 = ascSorted.indexOfKey(key1);
var ind2 = ascSorted.indexOfKey(key2);
var elem = ascSorted.getAt(ind1);
ascSorted.setAt(ind1, ascSorted.getItemFromKey(key2).data);
ascSorted.setAt(ind2, elem);
LiveUnit.Assert.isTrue(verifySorted(ascSorted, true));
LiveUnit.Assert.isTrue(verifySorted(descSorted));
}
}
}
testIndexOfKeyInSortedProjection() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var list = new List(options[i]);
list.push(-1, 0, 1, 2, 3, -2, 10);
var ascSorted = list.createSorted(function (l, r) { return l - r; });
var descSorted = list.createSorted(function (l, r) { return r - l; });
var listener = new ListListener(list);
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
var arr = [-1, 0, 1, 2, 3, -2, 10];
arr.sort(function (l, r) { return l - r });
for (var j = 0; j < arr.length; j++) {
LiveUnit.Assert.areEqual(j, ascSorted.indexOf(arr[j]), "making sure indexOf elements are set correctly");
}
arr.sort(function (l, r) { return r - l; });
for (var j = 0; j < arr.length; j++) {
LiveUnit.Assert.areEqual(j, descSorted.indexOf(arr[j]), "making sure indexOf elements are set correctly");
}
LiveUnit.Assert.areEqual(1, ascSorted.indexOfKey("1"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 1, descSorted.indexOfKey("1"), "checking indexOfKey");
LiveUnit.Assert.areEqual(2, ascSorted.indexOfKey("2"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 2, descSorted.indexOfKey("2"), "checking indexOfKey");
LiveUnit.Assert.areEqual(3, ascSorted.indexOfKey("3"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 3, descSorted.indexOfKey("3"), "checking indexOfKey");
LiveUnit.Assert.areEqual(4, ascSorted.indexOfKey("4"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 4, descSorted.indexOfKey("4"), "checking indexOfKey");
LiveUnit.Assert.areEqual(5, ascSorted.indexOfKey("5"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 5, descSorted.indexOfKey("5"), "checking indexOfKey");
LiveUnit.Assert.areEqual(0, ascSorted.indexOfKey("6"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 0, descSorted.indexOfKey("6"), "checking indexOfKey");
LiveUnit.Assert.areEqual(6, ascSorted.indexOfKey("7"), "checking indexOfKey");
LiveUnit.Assert.areEqual(descSorted.length - 1 - 6, descSorted.indexOfKey("7"), "checking indexOfKey");
}
}
testNotifyMutatedInSortedProjection() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [{ a: -1 }, { a: 0 }, { a: 1 }, { a: 2 }, { a: 3 }, { a: -4 }, { a: 10 }];
var list = new List(data, options[i]);
var ascSorted = list.createSorted(function (l, r) { return l.a - r.a; });
var descSorted = list.createSorted(function (l, r) { return r.a - l.a; });
var aSortedListener = new ListListener(ascSorted);
var dSortedListener = new ListListener(descSorted);
LiveUnit.Assert.isTrue(verifySortedArr(ascSorted, [-4, -1, 0, 1, 2, 3, 10]), "making sure that array is sorted ascendingly");
LiveUnit.Assert.isTrue(verifySortedArr(descSorted, [10, 3, 2, 1, 0, -1, -4]), "making sure that array is sorted descendingly");
list.getAt(0).a = -5;
LiveUnit.Assert.isTrue(verifySortedArr(ascSorted, [-4, -5, 0, 1, 2, 3, 10]), "making sure that array is sorted ascendingly");
LiveUnit.Assert.isTrue(verifySortedArr(descSorted, [10, 3, 2, 1, 0, -5, -4]), "making sure that array is sorted descendingly");
list.notifyMutated(0);
LiveUnit.Assert.isTrue(verifySortedArr(ascSorted, [-5, -4, 0, 1, 2, 3, 10]), "making sure that array is sorted ascendingly");
LiveUnit.Assert.isTrue(verifySortedArr(descSorted, [10, 3, 2, 1, 0, -4, -5]), "making sure that array is sorted descendingly");
}
}
testBaseFunctionsInSortedProjection() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var arr = [-1, 8, 0, 4, 10, 22, 26, 27, -10];
var asc = arr.concat();
var desc = arr.concat();
var ascSorter = function (l, r) { return l - r; };
var descSorter = function (l, r) { return r - l; }
var list = new List(arr, options[i]);
var ascSorted = list.createSorted(ascSorter);
var descSorted = list.createSorted(descSorter);
asc.sort(ascSorter);
desc.sort(descSorter);
var listener = new ListListener(list);
var aListener = new ListListener(ascSorted);
var dListener = new ListListener(descSorted);
LiveUnit.Assert.areEqual(asc.join(), ascSorted.join(), "ascending sorting join");
LiveUnit.Assert.areEqual(desc.join(), descSorted.join(), "ascending sorting join");
var checkLastOrIndexOf = function checkLastOrIndexOf (arr, list, nonExisting, indexOf = false) {
for (var i = 0; i < arr.length; i++) {
if (indexOf) {
if (i !== list.indexOf(arr[i])) {
return false;
}
}
else {
if (i !== list.lastIndexOf(arr[i])) {
return false;
}
}
}
if (indexOf) {
return ((list.indexOf(nonExisting) === -1) && (list.indexOf(nonExisting) === -1));
}
else {
return ((list.lastIndexOf(nonExisting) === -1) && (list.lastIndexOf(nonExisting) === -1));
}
};
var even = function even (num) { return Math.abs(num) % 2 === 0; };
var odd = function odd (num) { return Math.abs(num) % 2 === 1; };
LiveUnit.Assert.isTrue(checkLastOrIndexOf(asc, ascSorted, 100, true), "checking index of ascending");
LiveUnit.Assert.isTrue(checkLastOrIndexOf(desc, descSorted, 100, true), "checking index of descending");
LiveUnit.Assert.isTrue(checkLastOrIndexOf(asc, ascSorted, 200), "checking last index of ascending");
LiveUnit.Assert.isTrue(checkLastOrIndexOf(desc, descSorted, 200), "checking last index of descending");
LiveUnit.Assert.areEqual(true, ascSorted.some(even));
LiveUnit.Assert.areEqual(true, descSorted.some(even));
LiveUnit.Assert.areEqual(false, ascSorted.some(specialPrime));
LiveUnit.Assert.areEqual(false, descSorted.some(specialPrime));
LiveUnit.Assert.areEqual(0, ascSorted.filter(specialPrime).length, "testing filter in ascendingly sorted projection");
LiveUnit.Assert.areEqual(0, descSorted.filter(specialPrime).length, "testing filter in descendingly sorted projection");
LiveUnit.Assert.areEqual(7, ascSorted.filter(even).length, "testing filter in ascendingly sorted projection");
LiveUnit.Assert.areEqual(7, descSorted.filter(even).length, "testing filter in descendingly sorted projection");
var addFunction = function addFunction (n, m) { return n + m; };
LiveUnit.Assert.areEqual(arr.reduce(addFunction), ascSorted.reduce(addFunction), "checking reduce in sorted projection")
LiveUnit.Assert.areEqual(arr.reduceRight(addFunction, 10), descSorted.reduceRight(addFunction, 10), "checking reduceRight in sorted projection")
}
}
testBaseListFunctionsInFilteredProjections() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data, options[i]);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
var even = function (num) { return Math.abs(num) % 2 === 0; };
var odd = function (num) { return Math.abs(num) % 2 === 1; };
var negative = function (num) { return num < 0; };
var positive = function (num) { return num > 0; }
var evenArr = data.filter(even);
var oddArr = data.filter(odd);
var peArr = evenArr.filter(positive);
var neArr = evenArr.filter(negative);
var poArr = oddArr.filter(positive);
var noArr = oddArr.filter(negative);
LiveUnit.Assert.areEqual(evenArr.join(), evenFiltered.join(), "check join for filteredProjections");
LiveUnit.Assert.areEqual(peArr.join(), positiveEvenFiltered.join(), "check join for filteredProjections");
LiveUnit.Assert.areEqual(poArr.join(), positiveOddFiltered.join(), "check join for filteredProjections");
LiveUnit.Assert.areEqual(noArr.join(), negativeOddFiltered.join(), "check join for filteredProjections");
var addFunction = function addFunction (n, m) { return n + m; };
LiveUnit.Assert.areEqual(oddArr.reduce(addFunction), oddFiltered.reduce(addFunction), "check reduce for filteredProjections");
var checkLastOrIndexOf = function checkLastOrIndexOf (arr, list, nonExisting, indexOf?) {
for (var i = 0; i < arr.length; i++) {
if (indexOf) {
if (i !== list.indexOf(arr[i])) {
return false;
}
}
else {
if (i !== list.lastIndexOf(arr[i])) {
return false;
}
}
}
if (indexOf) {
return ((list.indexOf(nonExisting) === -1) && (list.indexOf(nonExisting) === -1));
}
else {
return ((list.lastIndexOf(nonExisting) === -1) && (list.lastIndexOf(nonExisting) === -1));
}
};
LiveUnit.Assert.isTrue(checkLastOrIndexOf(poArr, positiveOddFiltered, 1000, true), "checking indexOf in Filtered Arrays");
LiveUnit.Assert.isTrue(checkLastOrIndexOf(neArr, negativeEvenFiltered, 1000), "check lastIndexOf in filtered arrays");
}
}
testGroupedGroupsMainFunctionality() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, -1, 0, 1, -3, 101, 253, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) {
return (specialPrime(num)) ? "prime" : "nonPrime";
},
function (num) {
return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" };
}
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([-1, 0, 1, 253, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual("nonPrime", groupsListener.data[0].a, "checking the first group");
LiveUnit.Assert.areEqual("prime", groupsListener.data[1].a, "checking the second group ");
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the second group ");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getItem(0).data.a, "check getItem");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getItem(0).key, "check getItem");
LiveUnit.Assert.areEqual("prime", grouped.groups.getItem(1).data.a, "check getItem");
LiveUnit.Assert.areEqual("prime", grouped.groups.getItem(1).key, "check getItem");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getItem(2), "check getItem");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getItemFromKey("nonPrime").data.a, "check getItemFromKey");
LiveUnit.Assert.areEqual("prime", grouped.groups.getItemFromKey("prime").data.a, "check getItemFromKey");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getItemFromKey("nonExisting"), "check non existing key using getItemFromKey");
LiveUnit.Assert.areEqual(1, grouped.groups.indexOfKey("prime"), "getting the correct index from key");
LiveUnit.Assert.areEqual(0, grouped.groups.indexOfKey("nonPrime"), "getting the correct index from key");
LiveUnit.Assert.areEqual(-1, grouped.groups.indexOfKey("non_Existing_Key"), "getting the index from non existing key");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "checking getAt");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(1).a, "checking getAt");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(2), "checking non existing item using getAt");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(-1), "checking non existing item using getAt");
}
}
//push
testGroupSortedPushFunctionality() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual(grouped.length, grouped.push(), "pushing nothing");
grouped.push(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 1, 4, 6, 8, 9, 10, 7, 2, -3, 101, -11, 2, 3, 5, 7]), "verifying list content");
}
}
//Stil Missing: unshift, move, getItemFromKey, spliceFromKey, notifyMutated, baseFunctionality
testGroupSortedSetAt() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
grouped.setAt(0, 5);
groupedListener.assertSameAsArray([-1, 0, 1, 7, 2, 5, -3, 101, -11]);
grouped.setAt(grouped.length - 1, 10);
groupedListener.assertSameAsArray([-1, 0, 1, 10, 7, 2, 5, -3, 101]);
grouped.setAt(4, -20);
groupedListener.assertSameAsArray([-20, -1, 0, 1, 10, 2, 5, -3, 101]);
}
}
testShiftGroupSorted() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that the first item changed");
LiveUnit.Assert.areEqual(253, grouped.shift(), "testing shift");
LiveUnit.Assert.areEqual(-1, grouped.shift(), "testing shift");
LiveUnit.Assert.areEqual(0, grouped.shift(), "testing shift");
LiveUnit.Assert.areEqual(1, grouped.shift(), "testing shift");
groupedListener.assertSameAsArray([7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure that only one group is remaining");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(0).a, "making sure that the first item changed");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(1), "making sure that only one group exists");
}
}
testSpliceGroupSorted() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that the first item changed");
grouped.splice(0, 4);
groupedListener.assertSameAsArray([7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure that only one group is remaining");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(0).a, "making sure that the first item changed");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(1), "making sure that only one group exists");
grouped.splice(10, 0, 1);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure that only one group is remaining");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that the first item changed");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(1).a, "making sure that the second group is added");
groupedListener.assertSameAsArray([1, 7, 2, -3, 101, -11]);
grouped.splice(0, 0, 8);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure that only one group is remaining");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that the first item changed");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(1).a, "making sure that the second group is added");
groupedListener.assertSameAsArray([8, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.isTrue(verifyListContent(grouped, [8, 1, 7, 2, -3, 101, -11]));
grouped.splice(0, grouped.length);
LiveUnit.Assert.areEqual(0, grouped.groups.length, "making sure that no groups are remaining");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(0), "making sure that no groups are remaining");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(1), "making sure that that no groups are remaining");
groupedListener.assertSameAsArray([]);
grouped.splice(0, 0, 1);
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure that no groups are remaining");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that one group is created");
LiveUnit.Assert.areEqual(undefined, grouped.groups.getAt(1), "making sure that that no second group exists");
groupedListener.assertSameAsArray([1]);
LiveUnit.Assert.areEqual(list.length, 1);
LiveUnit.Assert.areEqual(list.getAt(0), 1);
grouped.splice(0, 0, 2);
grouped.splice(0, 0, 3);
grouped.splice(0, 0, 4);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure that no groups are remaining");
LiveUnit.Assert.areEqual("nonPrime", grouped.groups.getAt(0).a, "making sure that first group is created");
LiveUnit.Assert.areEqual("prime", grouped.groups.getAt(1).a, "making sure that that the second group is created");
groupedListener.assertSameAsArray([4, 1, 2, 3]);
LiveUnit.Assert.areEqual(list.length, 4);
var expected = [2, 3, 4, 1];
list.forEach(function (item, index) {
LiveUnit.Assert.areEqual(expected[index], item);
});
}
}
testGroupSortedPopFunctionality() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual(-11, grouped.pop(), "test pop");
LiveUnit.Assert.areEqual(101, grouped.pop(), "test pop");
LiveUnit.Assert.areEqual(-3, grouped.pop(), "test pop");
LiveUnit.Assert.areEqual(2, grouped.pop(), "test pop");
groupedListener.assertSameAsArray([253, -1, 0, 1, 7]);
}
}
testUnShiftInGroupSortedList() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
LiveUnit.Assert.areEqual(16, grouped.unshift(5, 6, 8, 9, 13, 15, 21), "unshifting a bunch of elements");
LiveUnit.Assert.areEqual(16, grouped.unshift(), "unshifting no element");
groupedListener.assertSameAsArray([6, 8, 9, 15, 21, 253, -1, 0, 1, 7, 2, 5, 13, -3, 101, -11]);
list.length = 0;
LiveUnit.Assert.areEqual(0, grouped.groups.length, "no groups are there");
LiveUnit.Assert.areEqual(0, grouped.length, "no elements are there");
LiveUnit.Assert.areEqual(0, grouped.unshift(), "unshifting no element");
LiveUnit.Assert.areEqual(1, grouped.unshift(5), "unshifting one element");
LiveUnit.Assert.areEqual(2, grouped.unshift(2), "shifting one element");
LiveUnit.Assert.areEqual(1, grouped.groups.length, "shifting one element");
groupedListener.assertSameAsArray([2, 5]);
LiveUnit.Assert.areEqual(3, grouped.unshift(6), "shifting one element");
LiveUnit.Assert.areEqual(2, grouped.groups.length, "shifting one element");
groupedListener.assertSameAsArray([6, 2, 5]);
}
}
testMoveInGroupSortedList() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
grouped.move(0, 1);
groupedListener.assertSameAsArray([-1, 253, 0, 1, 7, 2, -3, 101, -11]);
grouped.splice(1, 0, -4);
groupedListener.assertSameAsArray([-1, -4, 253, 0, 1, 7, 2, -3, 101, -11]);
grouped.move(0, 1);
groupedListener.assertSameAsArray([-4, -1, 253, 0, 1, 7, 2, -3, 101, -11]);
grouped.splice(1, 0, 17);
groupedListener.assertSameAsArray([-4, -1, 253, 0, 1, 7, 2, 17, -3, 101, -11]);
grouped.move(5, 1);
groupedListener.assertSameAsArray([-4, -1, 253, 0, 1, 2, 17, 7, -3, 101, -11]);
grouped.move(grouped.length - 1, grouped.length - 2);
groupedListener.assertSameAsArray([-4, -1, 253, 0, 1, 2, 17, 7, -3, -11, 101]);
}
}
testGetItemFromKeyGroupSortedList() {
var options = [undefined, { binding: true }];
for (var i = 0; i < options.length; i++) {
//var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var data = [253, -1, 0, 1, 7, 2, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
var shuffleList = function () {
for (var i = 1; i < grouped.length; i++) {
grouped.move(0, i);
}
}
var checkCorrectness = function () {
for (var ind = 0; ind < list.length; ind++) {
LiveUnit.Assert.areEqual(data[ind], grouped.getItemFromKey(ind + '').data, "checking getItemFromKey");
}
}
checkCorrectness();
shuffleList();
checkCorrectness();
}
}
testBaseFunctionsInSortedProjectionScenarios() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
}
}
testGroupListPushThroughList() {
var options = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
groupedListener.assertSameAsArray([253, -1, 0, 1, 7, 2, -3, 101, -11]);
list.push(17);
list.push(4);
groupedListener.assertSameAsArray([253, -1, 0, 1, 4, 7, 2, -3, 101, -11, 17]);
}
}
testGroupListPopThroughList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
var result = [253, -1, 0, 1, 7, 2, -3, 101, -11];
groupedListener.assertSameAsArray(result);
LiveUnit.Assert.areEqual(-11, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 7, 2, -3, 101]));
LiveUnit.Assert.areEqual(101, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 7, 2, -3]));
LiveUnit.Assert.areEqual(-3, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 7, 2]));
LiveUnit.Assert.areEqual(1, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 7, 2]));
LiveUnit.Assert.areEqual(0, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 7, 2]));
LiveUnit.Assert.areEqual(-1, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, 7, 2]));
LiveUnit.Assert.areEqual(253, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [7, 2]));
LiveUnit.Assert.areEqual(2, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [7]));
LiveUnit.Assert.areEqual(7, list.pop(), "testing pop");
LiveUnit.Assert.isTrue(verifyListContent(grouped, []));
LiveUnit.Assert.areEqual(0, grouped.length, "checking the length of groupedList");
LiveUnit.Assert.areEqual(0, list.length, "checking the length of List");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
}
}
testGroupedProjectionShiftMethodUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [7, 2, 253, -1, 0, 1, -3, 101, -11];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
var result = [253, -1, 0, 1, 7, 2, -3, 101, -11];
groupedListener.assertSameAsArray(result);
LiveUnit.Assert.areEqual(7, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 2, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(253, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-1, 0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(-1, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(0, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [1, -3, 101, -11]));
LiveUnit.Assert.areEqual(1, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-3, 101, -11]));
LiveUnit.Assert.areEqual(-3, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [101, -11]));
LiveUnit.Assert.areEqual(101, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-11]));
LiveUnit.Assert.areEqual(-11, list.shift(), "testing shift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, []));
LiveUnit.Assert.areEqual(0, grouped.length, "Testing grouped length");
LiveUnit.Assert.areEqual(0, list.length, "Testing list length");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
}
}
testGroupedProjectionUnShiftMethodUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var grouped = list.createGrouped(
function (num) { return (specialPrime(num)) ? "prime" : "nonPrime"; },
function (num) { return (specialPrime(num)) ? { a: "prime" } : { a: "nonPrime" }; }
);
var groupedListener = new ListListener(grouped);
var groupsListener = new ListListener(grouped.groups);
LiveUnit.Assert.areEqual(0, grouped.groups.length, "making sure the number of groups is zero");
LiveUnit.Assert.areEqual(0, grouped.length, "making sure that no elements are added to the list");
LiveUnit.Assert.areEqual(1, list.unshift(-11), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-11]));
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure the number of groups is one");
LiveUnit.Assert.areEqual(2, list.unshift(101), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [101, -11]));
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure the number of groups is one");
LiveUnit.Assert.areEqual(3, list.unshift(-3), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-3, 101, -11]));
LiveUnit.Assert.areEqual(1, grouped.groups.length, "making sure the number of groups is one");
LiveUnit.Assert.areEqual(4, list.unshift(1), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [1, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(5, list.unshift(0), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(6, list.unshift(-1), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [-1, 0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(7, list.unshift(253), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(8, list.unshift(2), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 2, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(9, list.unshift(7), "testing unshift");
LiveUnit.Assert.isTrue(verifyListContent(grouped, [253, -1, 0, 1, 7, 2, -3, 101, -11]));
LiveUnit.Assert.areEqual(2, grouped.groups.length, "making sure the number of groups is two");
LiveUnit.Assert.areEqual(9, grouped.length, "Testing grouped length");
LiveUnit.Assert.areEqual(9, list.length, "Testing list length");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
}
}
testPushOnSortedListUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 10, 9, -2, 4, 3, 2];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 2, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3, 2]), "verifying list content");
list.push(-5);
list.push(-4);
list.push(11);
list.push(5);
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3, 2, -5, -4, 11, 5]), "verifying list content");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-5, -4, -2, -1, 2, 3, 4, 5, 9, 10, 11]), "making sure of sortedList");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
}
}
testPopOnSortedListUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 10, 9, -2, 4, 3, 2];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 2, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(2, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3]), "verifying list content");
LiveUnit.Assert.areEqual(3, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4]), "verifying list content");
LiveUnit.Assert.areEqual(4, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2]), "verifying list content");
LiveUnit.Assert.areEqual(-2, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-1, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9]), "verifying list content");
LiveUnit.Assert.areEqual(9, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-1, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10]), "verifying list content");
LiveUnit.Assert.areEqual(10, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-1]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1]), "verifying list content");
LiveUnit.Assert.areEqual(-1, list.pop(), "checking the value of the poped element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, []), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, []), "verifying list content");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
else {
LiveUnit.Assert.areEqual(7, data.length, "making sure that the original array is not affected");
}
}
}
testUnshiftOnSortedListUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 10, 9, -2, 4, 3, 2];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 2, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3, 2]), "verifying list content");
list.unshift(-5);
list.unshift(-4);
list.unshift(11);
list.unshift(5);
LiveUnit.Assert.isTrue(verifyListContent(list, [5, 11, -4, -5, -1, 10, 9, -2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-5, -4, -2, -1, 2, 3, 4, 5, 9, 10, 11]), "making sure of sortedList");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
}
}
testShiftOnSortedListUsingMainList() {
var options:any = [undefined, { proxy: true }, { proxy: true, binding: true }, { binding: true }];
for (var i = 0; i < options.length; i++) {
var data = [-1, 10, 9, -2, 4, 3, 2];
var list = new List(data, options[i]);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, -1, 2, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-1, 10, 9, -2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(-1, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, 2, 3, 4, 9, 10]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [10, 9, -2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(10, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, 2, 3, 4, 9]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [9, -2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(9, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-2, 2, 3, 4]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [-2, 4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(-2, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [2, 3, 4]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [4, 3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(4, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [2, 3]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [3, 2]), "verifying list content");
LiveUnit.Assert.areEqual(3, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, [2]), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, [2]), "verifying list content");
LiveUnit.Assert.areEqual(2, list.shift(), "checking the value of the shifted element");
LiveUnit.Assert.isTrue(verifyListContent(sorted, []), "making sure of sortedList");
LiveUnit.Assert.isTrue(verifyListContent(list, []), "verifying list content");
if (options[i] && options[i].proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "making sure that proxy is working fine");
}
else {
LiveUnit.Assert.areEqual(7, data.length, "making sure that the original array is not affected");
}
}
}
testCreatingFilteredListOfSortedList() {
function testScenario(options) {
var data = [-1, 10, -4, -10, 9, -2, 4, 3, 2];
var list = new List(data, options);
var listener = new ListListener(list);
var sorted = list.createSorted(function (l, r) { return l - r; });
var sortedNegativeNumber = sorted.createFiltered(function (num) { return num < 0 });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -4, -2, -1, 2, 3, 4, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -4, -2, -1]));
sortedNegativeNumber.push(5);
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -4, -2, -1, 2, 3, 4, 5, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -4, -2, -1]));
sortedNegativeNumber.push(-4);
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -4, -4, -2, -1, 2, 3, 4, 5, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -4, -4, -2, -1]));
var sortedNegativeLessThanMinusTwo = sortedNegativeNumber.createFiltered(function (num) { return num < -2; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -4, -4, -2, -1, 2, 3, 4, 5, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -4, -4, -2, -1]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeLessThanMinusTwo, [-10, -4, -4]));
var sortedDescending = sortedNegativeLessThanMinusTwo.createSorted(function (l, r) { return r - l; });
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -4, -4, -2, -1, 2, 3, 4, 5, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -4, -4, -2, -1]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeLessThanMinusTwo, [-10, -4, -4]));
LiveUnit.Assert.isTrue(verifyListContent(sortedDescending, [-4, -4, -10]));
list.push(23);
list.push(-5);
list.push(-2.5);
list.push(0);
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-10, -5, -4, -4, -2.5, -2, -1, 0, 2, 3, 4, 5, 9, 10, 23]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-10, -5, -4, -4, -2.5, -2, -1]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeLessThanMinusTwo, [-10, -5, -4, -4, -2.5]));
LiveUnit.Assert.isTrue(verifyListContent(sortedDescending, [-2.5, -4, -4, -5, -10]));
sortedDescending.push(11);
sortedDescending.push(-1);
sortedDescending.push(-8);
sortedDescending.push(-25);
sortedDescending.push(25);
LiveUnit.Assert.isTrue(verifyListContent(sorted, [-25, -10, -8, -5, -4, -4, -2.5, -2, -1, -1, 0, 2, 3, 4, 5, 9, 10, 11, 23, 25]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeNumber, [-25, -10, -8, -5, -4, -4, -2.5, -2, -1, -1]));
LiveUnit.Assert.isTrue(verifyListContent(sortedNegativeLessThanMinusTwo, [-25, -10, -8, -5, -4, -4, -2.5]));
LiveUnit.Assert.isTrue(verifyListContent(sortedDescending, [-2.5, -4, -4, -5, -8, -10, -25]));
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data));
}
else {
LiveUnit.Assert.areEqual(9, data.length, "checking the array length ");
}
}
testWithDifferentOptions(testScenario);
}
testDifferentMutationsOnFiltersOfGroups() {
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"];
var list = new List(data, options);
var mainGroupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
};
var groupedList = list.createGrouped(mainGroupSelector, mainGroupSelector);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"]));
var groupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "string": -1, "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", "four", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
list.move(10, 13);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "two", "three", "four", "one"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["two", "three", "four", "one", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1])); //Bug Here
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testCreateFiltersOutOfGroupedSortedProjection() {
function testScenario(options) {
var data = [1, 2, 3, 4, 5, 6, 7, 8, 15, 12];
var list = new List(data, options);
var groupedList = list.createGrouped(
function (num) { return (num % 2 === 0) ? "even" : "odd"; },
function (num) { return (num % 2 === 0) ? "even" : "odd"; }
);
var filtered = groupedList.createFiltered(function (num) { return !specialPrime(num); });
var sorted = filtered.createSorted(function (l, r) { return l - r });
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [2, 4, 6, 8, 12, 1, 3, 5, 7, 15]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [4, 6, 8, 12, 1, 15]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [1, 4, 6, 8, 12, 15]));
sorted.push(17);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [2, 4, 6, 8, 12, 1, 3, 5, 7, 15, 17]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [4, 6, 8, 12, 1, 15]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [1, 4, 6, 8, 12, 15]));
list.push(19);
LiveUnit.Assert.isTrue(verifyListContent(filtered, [4, 6, 8, 12, 1, 15]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [1, 4, 6, 8, 12, 15]));
list.push(10);
LiveUnit.Assert.isTrue(verifyListContent(filtered, [4, 6, 8, 12, 10, 1, 15]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [1, 4, 6, 8, 10, 12, 15]));
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking that the proxy content is correct");
}
}
testWithDifferentOptions(testScenario);
}
testGroupsOfGroups() {
function testScenario(options) {
var data = [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5];
var list = new List(data, options);
var groupedList = list.createGrouped(
function (num) { return (Math.abs(num) % 2 === 0) ? "even" : "odd"; },
function (num) { return (Math.abs(num) === 0) ? "even" : "odd"; }
);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
var groupSelector = function (num) {
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
LiveUnit.Assert.areEqual(4, groupOfGroup.groups.length, "checking the length of the group of group");
list.pop();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, 1, 3, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3]));
groupOfGroup.move(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [2, 0, 4, -4, -2, 1, 3, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 2, 0, 4, -3, -1, 1, 3]));
groupOfGroup.splice(3, 2);
LiveUnit.Assert.areEqual(7, list.length, "validating list length")
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [2, 0, 4, -3, -1, 1, 3]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [2, 0, 4, 1, 3, -3, -1]));
LiveUnit.Assert.areEqual(3, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(2, groupedList.groups.length, "checking the length of the group of group");
groupOfGroup.splice(0, 3);
LiveUnit.Assert.areEqual(4, list.length, "validating list length")
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-3, -1, 1, 3]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [1, 3, -3, -1]));
LiveUnit.Assert.areEqual(2, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(1, groupedList.groups.length, "checking the length of the group of group");
groupOfGroup.splice(0, 4);
LiveUnit.Assert.areEqual(0, list.length, "validating list length")
LiveUnit.Assert.isTrue(verifyListContent(groupedList, []));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, []));
LiveUnit.Assert.areEqual(0, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(0, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testGroupsOfGroupsMutationThroughMainList() {
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5];
var list = new List(data, options);
var groupedList = list.createGrouped(
function (num) {
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
},
function (num) {
return (Math.abs(num) === 0) ? "even" : "odd";
}
);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
var groupSelector = function (num) {
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
LiveUnit.Assert.areEqual(4, groupOfGroup.groups.length, "checking the length of the group of group");
list.pop();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, 1, 3, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3]));
list.pop();
list.pop();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1]));
LiveUnit.Assert.areEqual(3, groupOfGroup.groups.length, "checking the group length");
LiveUnit.Assert.areEqual(2, groupedList.groups.length, "checking the group length");
list.pop();
list.pop();
LiveUnit.Assert.isTrue(verifyListContent(list, [-4, -2, 0, 2, 4]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4]));
LiveUnit.Assert.areEqual(2, groupOfGroup.groups.length, "checking the group length");
LiveUnit.Assert.areEqual(1, groupedList.groups.length, "checking the group length");
list.pop();
list.pop();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, -4, -2]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0]));
LiveUnit.Assert.areEqual(2, groupOfGroup.groups.length, "checking the group length");
LiveUnit.Assert.areEqual(1, groupedList.groups.length, "checking the group length");
list.pop();
list.pop();
list.pop();
LiveUnit.Assert.areEqual(0, list.length, "validating list length")
LiveUnit.Assert.areEqual(0, groupOfGroup.length, "validating groupOfGroup length")
LiveUnit.Assert.areEqual(0, groupedList.length, "validating groupedList length")
LiveUnit.Assert.isTrue(verifyListContent(groupedList, []));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, []));
LiveUnit.Assert.areEqual(0, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(0, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testMoveMutationsOnGroupsOfGroups() {
//Neeed to add more move functions
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"];
var list = new List(data, options);
var mainGroupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
};
var groupedList = list.createGrouped(mainGroupSelector, mainGroupSelector);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"]));
var groupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "string": -1, "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", "four", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three", "four"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
list.move(10, 13);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "two", "three", "four", "one"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["two", "three", "four", "one", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testUnshiftMutationsOnGroupsOfGroups() {
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5];
var list = new List(data, options);
var mainGroupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
};
var groupedList = list.createGrouped(mainGroupSelector, mainGroupSelector);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
var groupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "string": -1, "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, [0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5]));
LiveUnit.Assert.areEqual(4, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(2, groupedList.groups.length, "checking the length of the group of group");
list.unshift("five", "four", "three");
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["five", "four", "three", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "five", "four", "three"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testShiftMutationsOnGroupsOfGroups() {
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"];
var list = new List(data, options);
var mainGroupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
};
var groupedList = list.createGrouped(mainGroupSelector, mainGroupSelector);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"]));
var groupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "string": -1, "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
list.shift();
list.shift();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", 0, 2, 4, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"]));
LiveUnit.Assert.areEqual(4, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
list.shift();
list.shift();
list.shift();
list.shift();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", 1, 3, 5, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-1, 1, 3, 5, "one", "two", "three"]));
LiveUnit.Assert.areEqual(3, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(2, groupedList.groups.length, "checking the length of the group of group");
list.shift();
list.shift();
list.shift();
list.shift();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three"]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, ["one", "two", "three"]));
LiveUnit.Assert.areEqual(1, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(1, groupedList.groups.length, "checking the length of the group of group");
list.shift();
list.shift();
list.shift();
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, []));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, []));
LiveUnit.Assert.areEqual(0, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(0, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testSetAtOnGroupsOfGroups() {
function testScenario(options) {
var data = [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"];
var list = new List(data, options);
var mainGroupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
return (Math.abs(num) % 2 === 0) ? "even" : "odd";
};
var groupedList = list.createGrouped(mainGroupSelector, mainGroupSelector);
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"]));
var groupSelector = function (num) {
if (typeof num === "string") {
return "string";
}
if (num >= 0) {
return (num % 2 === 0) ? "positiveEven" : "positiveOdd";
}
else if (num < 0) {
return (Math.abs(num) % 2 === 0) ? "negativeEven" : "negativeOdd";
}
};
var sorter = function (a, b) {
var arr = { "string": -1, "positiveEven": 0, "negativeEven": 1, "positiveOdd": 2, "negativeOdd": 3 };
return arr[a] - arr[b];
};
var groupOfGroup = groupedList.createGrouped(groupSelector, groupSelector, sorter);
var filter = groupOfGroup.createFiltered(function (e) { return typeof e === "string"; });
LiveUnit.Assert.isTrue(verifyListContent(filter, ["one", "two", "three"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["one", "two", "three", 0, 2, 4, -4, -2, 1, 3, 5, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, "one", "two", "three"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
filter.setAt(0, 1);
LiveUnit.Assert.isTrue(verifyListContent(filter, ["two", "three"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["two", "three", 0, 2, 4, -4, -2, 1, 3, 5, 1, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 0, 2, 4, -3, -1, 1, 3, 5, 1, "two", "three"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
groupedList.setAt(0, -groupedList.getAt(0));
groupedList.setAt(1, -groupedList.getAt(1));
groupedList.setAt(2, "zero");
LiveUnit.Assert.isTrue(verifyListContent(filter, ["zero", "two", "three"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["zero", "two", "three", 4, 2, 2, 4, 1, 3, 5, 1, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [4, 2, 2, 4, -3, -1, 1, 3, 5, 1, "zero", "two", "three"]));
LiveUnit.Assert.areEqual(4, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
groupedList.setAt(0, -groupedList.getAt(0));
groupedList.setAt(1, -groupedList.getAt(1));
LiveUnit.Assert.isTrue(verifyListContent(filter, ["zero", "two", "three"]));
LiveUnit.Assert.isTrue(verifyListContent(groupOfGroup, ["zero", "two", "three", 2, 4, -4, -2, 1, 3, 5, 1, -3, -1]));
LiveUnit.Assert.isTrue(verifyListContent(groupedList, [-4, -2, 2, 4, -3, -1, 1, 3, 5, 1, "zero", "two", "three"]));
LiveUnit.Assert.areEqual(5, groupOfGroup.groups.length, "checking the length of the group of group");
LiveUnit.Assert.areEqual(3, groupedList.groups.length, "checking the length of the group of group");
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data), "checking the list content");
}
}
testWithDifferentOptions(testScenario);
}
testListFilterWithProxyEmptyArray() {
function testScenario(options) {
var data = [];
var list = new List(data, options);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
evenFiltered.push(0);
LiveUnit.Assert.isTrue(verifyListContent(list, [0]));
if (options && options.proxy) {
LiveUnit.Assert.isTrue(verifyListContent(list, data));
}
}
testWithDifferentOptions(testScenario);
}
testBindingInListWithMultipleProjectionsLayer(complete) {
var data = [{ index: 3, content: { groupKey: "three" } }, { index: 1, content: { groupKey: "one" } }, { index: 4, content: { groupKey: "four" } },
{ index: 2, content: { groupKey: "two" } }, { index: 5, content: { groupKey: "five" } }, { index: 6, content: { groupKey: "six" } }];
var list = new List(data, { binding: true });
var hit = 0;
var sorted = list.createSorted(function (l, r) { return l.index - r.index; });
var sortedListener = new ListListener(sorted);
var compareFunction = function (obj) { return (typeof obj.content.groupKey === "string") ? "string" : "nonString"; };
var group = sorted.createGrouped(compareFunction, compareFunction);
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.isTrue(verifyIndex(group, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(1, group.groups.length);
for (var i = 0; i < list.length; i++) {
list.getAt(i).content.bind("groupKey", onChange);
}
function onChange() {
hit++;
}
function verifyIndex(list, arr) {
for (var i = 0; i < list.length; i++) {
if (arr[i] !== list.getAt(i).index) {
return false;
}
}
return arr.length === list.length;
}
hit = 0;
sorted.getAt(3).content.groupKey = 12;
WinJS.Utilities.Scheduler.schedulePromiseNormal()
.then(function () {
sortedListener.assertLengthChangedCount(1);
sorted.notifyMutated(3);
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(2, group.groups.length);
LiveUnit.Assert.isTrue(verifyIndex(group, [4, 1, 2, 3, 5, 6]));
LiveUnit.Assert.areEqual(1, hit, "making sure that the binding is working fine");
})
.then(function () {
sortedListener.assertLengthChangedCount(1);
})
.then(null, errorHandler)
.then(complete);
}
testBindingInListCallingAllListeners(complete) {
var data = [{ index: 3, content: { groupKey: "three" } }, { index: 1, content: { groupKey: "one" } }, { index: 4, content: { groupKey: "four" } },
{ index: 2, content: { groupKey: "two" } }, { index: 5, content: { groupKey: "five" } }, { index: 6, content: { groupKey: "six" } }];
var list = new List(data, { binding: true });
var hit = 0;
var sorted = list.createSorted(function (l, r) { return l.index - r.index; });
var compareFunction = function (obj) { return (typeof obj.content.groupKey === "string") ? "string" : "nonString"; };
var group = sorted.createGrouped(compareFunction, compareFunction);
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.isTrue(verifyIndex(group, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(1, group.groups.length);
var i;
for (i = 0; i < list.length; i++) {
list.getAt(i).content.bind("groupKey", onChange);
}
function onChange() {
hit++;
}
function verifyIndex(list, arr) {
for (var i = 0; i < list.length; i++) {
if (arr[i] !== list.getAt(i).index) {
return false;
}
}
return arr.length === list.length;
}
var p = [];
hit = 0;
for (i = 0; i < sorted.length; i++) {
p[i] = sorted.getAt(i).content.updateProperty("groupKey", i);
}
WinJS.Promise.join(p)
.then(function () {
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(1, group.groups.length);
LiveUnit.Assert.areEqual(6, hit, "making sure that the binding is working fine");
})
.then(null, errorHandler)
.then(complete);
}
testBindingInListCallingAllListenersAndUpdatingAll(complete) {
var data = [{ index: 3, content: { groupKey: "three" } }, { index: 1, content: { groupKey: "one" } }, { index: 4, content: { groupKey: "four" } },
{ index: 2, content: { groupKey: "two" } }, { index: 5, content: { groupKey: "five" } }, { index: 6, content: { groupKey: "six" } }];
var list = new List(data, { binding: true });
var hit = 0;
var sorted = list.createSorted(function (l, r) { return l.index - r.index; });
var compareFunction = function (obj) { return (typeof obj.content.groupKey === "string") ? "string" : "nonString"; };
var group = sorted.createGrouped(compareFunction, compareFunction);
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.isTrue(verifyIndex(group, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(1, group.groups.length);
var i;
for (i = 0; i < list.length; i++) {
list.getAt(i).content.bind("groupKey", onChange);
}
function onChange() {
hit++;
}
function verifyIndex(list, arr) {
for (var i = 0; i < list.length; i++) {
if (arr[i] !== list.getAt(i).index) {
return false;
}
}
return arr.length === list.length;
}
var p = [];
hit = 0;
for (i = 0; i < sorted.length; i++) {
p[i] = sorted.getAt(i).content.updateProperty("groupKey", i);
sorted.notifyMutated(i);
}
WinJS.Promise.join(p).then(function () {
LiveUnit.Assert.isTrue(verifyIndex(sorted, [1, 2, 3, 4, 5, 6]));
LiveUnit.Assert.areEqual(1, group.groups.length);
LiveUnit.Assert.areEqual(6, hit, "making sure that the binding is working fine");
complete();
});
}
testFilteredPop() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
list.push(0);
data.push(0);
LiveUnit.Assert.isTrue(verifyListContent(list, data));
LiveUnit.Assert.isTrue(verifyListContent(evenFiltered, [-2, -4, 0, 2, 4, 6, 0]));
LiveUnit.Assert.isTrue(verifyListContent(positiveEvenFiltered, [2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(negativeEvenFiltered, [-2, -4]));
LiveUnit.Assert.isTrue(verifyListContent(oddFiltered, [-1, -3, -5, 1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(positiveOddFiltered, [1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(negativeOddFiltered, [-1, -3, -5]));
LiveUnit.Assert.areEqual(6, positiveEvenFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(-4, negativeEvenFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(5, oddFiltered.pop(), "pop from pisitve Even filter");
LiveUnit.Assert.areEqual(3, positiveOddFiltered.pop(), "pop from pisitve Even filter");
}
testBindingWithObjectContainingDifferentTypes(complete) {
var data = [{ data: [1, 2, 3, 4] }, { data: new Date() }, { data: 1 }, { data: 3 }];
var list = new List(data, { binding: true });
var listener = new ListListener(list);
for (var i = 0; i < list.length; i++) {
list.getAt(i).bind("data", onChange);
}
function onChange() {
hit++;
}
var hit = 0;
list.getAt(0).data = [3, 4, 5];
list.getAt(1).data = 10;
list.getAt(2).data = 1;
list.getAt(3).data = 2;
WinJS.Utilities.Scheduler.schedulePromiseNormal()
.then(function () {
LiveUnit.Assert.areEqual(3, hit);
})
.then(null, errorHandler)
.then(complete);
}
testSetLengthOfFiltered() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var filtered = list.createFiltered(function (num) { return (num % 2) === 1; });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(5, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7, 9]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(4, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7]));
filtered.length = 2;
LiveUnit.Assert.areEqual(5, list.length, "testing list.length");
LiveUnit.Assert.areEqual(2, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3]));
}
testSetLengthOfSortedProjection() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var sorted = list.createSorted(function (l, r) { return r - l; });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(10, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(7, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [7, 6, 5, 4, 3, 2, 1]));
sorted.length = 2;
LiveUnit.Assert.areEqual(2, list.length, "testing list.length");
LiveUnit.Assert.areEqual(2, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [7, 6]));
}
testSetLengthOfGroupSortedProjection() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
function grouping(num) { return (num % 2 === 0) ? "even" : "odd"; };
var grouped = list.createGrouped(grouping, grouping);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(10, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(10, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 6, 8, 10, 1, 3, 5, 7, 9, ]));
list.length = 5;
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(5, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(5, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 1, 3, 5]));
grouped.length = 2;
LiveUnit.Assert.areEqual(1, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(2, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(2, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 4]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4]));
}
testSetLengthOfFilteredToZero() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var filtered = list.createFiltered(function (num) { return (num % 2 === 1); });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(5, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7, 9]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(4, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7]));
filtered.length = 0;
LiveUnit.Assert.areEqual(3, list.length, "testing list.length");
LiveUnit.Assert.areEqual(0, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, []));
}
testSetLengthOfSortedProjectionToZero() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var sorted = list.createSorted(function (l, r) { return r - l; });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(10, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(7, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [7, 6, 5, 4, 3, 2, 1]));
sorted.length = 0;
LiveUnit.Assert.areEqual(0, list.length, "testing list.length");
LiveUnit.Assert.areEqual(0, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, []));
LiveUnit.Assert.isTrue(verifyListContent(sorted, []));
}
testSetLengthOfGroupSortedProjectionToZero() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
function grouping(num) { return (num % 2 === 0) ? "even" : "odd"; };
var grouped = list.createGrouped(grouping, grouping);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(10, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(10, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 6, 8, 10, 1, 3, 5, 7, 9, ]));
list.length = 5;
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(5, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(5, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 1, 3, 5]));
grouped.length = 0;
LiveUnit.Assert.areEqual(0, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(0, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(0, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, []));
LiveUnit.Assert.isTrue(verifyListContent(grouped, []));
}
testSetLengthOfFilteredToNegative() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var filtered = list.createFiltered(function (num) { return (num % 2 === 1); });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(5, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7, 9]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(4, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7]));
var hitCatch = false;
try {
filtered.length = -1;
} catch (e) {
hitCatch = true;
}
LiveUnit.Assert.isTrue(hitCatch);
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(4, filtered.length, "testing filtered.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(filtered, [1, 3, 5, 7]));
}
testSetLengthOfSortedProjectionToNegative() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
var sorted = list.createSorted(function (l, r) { return r - l; });
LiveUnit.Assert.areEqual(10, list.length, "testing list.length");
LiveUnit.Assert.areEqual(10, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]));
list.length = 7;
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(7, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [7, 6, 5, 4, 3, 2, 1]));
var hitCatch = false;
try {
sorted.length = -1;
} catch (e) {
hitCatch = true;
}
LiveUnit.Assert.isTrue(hitCatch);
LiveUnit.Assert.areEqual(7, list.length, "testing list.length");
LiveUnit.Assert.areEqual(7, sorted.length, "testing sorted.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7]));
LiveUnit.Assert.isTrue(verifyListContent(sorted, [7, 6, 5, 4, 3, 2, 1]));
}
testSetLengthOfGroupSortedProjectionToNegative() {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var list = new List(arr);
function grouping(num) { return (num % 2 === 0) ? "even" : "odd"; };
var grouped = list.createGrouped(grouping, grouping);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(10, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(10, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 6, 8, 10, 1, 3, 5, 7, 9, ]));
list.length = 5;
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(5, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(5, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 1, 3, 5]));
var hitCatch = false;
try {
grouped.length = -1;
} catch (e) {
hitCatch = true;
}
LiveUnit.Assert.isTrue(hitCatch);
LiveUnit.Assert.areEqual(2, grouped.groups.length, "checking the number of groups");
LiveUnit.Assert.areEqual(5, grouped.length, "checking grouped.length");
LiveUnit.Assert.areEqual(5, list.length, "checking list.length");
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 2, 3, 4, 5]));
LiveUnit.Assert.isTrue(verifyListContent(grouped, [2, 4, 1, 3, 5]));
}
testSpliceAtGroupSortedInsertInWrongGroup() {
var list = new List([1, 2, 3, 4, 5, 6, 7, 8, 9]);
var compare = function (num) { return (num % 2 === 0) ? "even" : "odd"; };
var sorter = function (l, r) { return l.length - r.length; }
var grouped = list.createGrouped(compare, compare, sorter);
grouped.splice(0, 0, 4);
LiveUnit.Assert.isTrue(verifyListContent(list, [1, 3, 5, 7, 9, 4, 2, 4, 6, 8], true));
}
testMoveElementsInFilteredProjection() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
LiveUnit.Assert.isTrue(verifyListContent(list, data));
LiveUnit.Assert.isTrue(verifyListContent(evenFiltered, [-2, -4, 0, 2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(positiveEvenFiltered, [2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(negativeEvenFiltered, [-2, -4]));
LiveUnit.Assert.isTrue(verifyListContent(oddFiltered, [-1, -3, -5, 1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(positiveOddFiltered, [1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(negativeOddFiltered, [-1, -3, -5]));
negativeOddFiltered.move(0, negativeOddFiltered.length - 1);
LiveUnit.Assert.isTrue(verifyListContent(negativeOddFiltered, [-3, -5, -1]));
LiveUnit.Assert.isTrue(verifyListContent(oddFiltered, [-3, -5, -1, 1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(positiveOddFiltered, [1, 3, 5]));
}
testMoveElementsInFilteredProjectionUsingTheMainList() {
var data = [-1, -2, -3, -4, -5, 0, 1, 2, 3, 4, 5, 6];
var list = new List(data);
var listener = new ListListener(list);
var evenFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 0; });
var oddFiltered = list.createFiltered(function (item) { return Math.abs(item) % 2 === 1; });
var positiveEvenFiltered = evenFiltered.createFiltered(function (item) { return item > 0; });
var negativeEvenFiltered = evenFiltered.createFiltered(function (item) { return item < 0; });
var positiveOddFiltered = oddFiltered.createFiltered(function (item) { return item > 0; });
var negativeOddFiltered = oddFiltered.createFiltered(function (item) { return item < 0; });
LiveUnit.Assert.isTrue(verifyListContent(list, data));
LiveUnit.Assert.isTrue(verifyListContent(evenFiltered, [-2, -4, 0, 2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(positiveEvenFiltered, [2, 4, 6]));
LiveUnit.Assert.isTrue(verifyListContent(negativeEvenFiltered, [-2, -4]));
LiveUnit.Assert.isTrue(verifyListContent(oddFiltered, [-1, -3, -5, 1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(positiveOddFiltered, [1, 3, 5]));
LiveUnit.Assert.isTrue(verifyListContent(negativeOddFiltered, [-1, -3, -5]));
list.move(0, list.length - 1);
LiveUnit.Assert.isTrue(verifyListContent(negativeOddFiltered, [-3, -5, -1]));
LiveUnit.Assert.isTrue(verifyListContent(oddFiltered, [-3, -5, 1, 3, 5, -1]));
LiveUnit.Assert.isTrue(verifyListContent(positiveOddFiltered, [1, 3, 5]));
}
testMutatingGroupedItems() {
var fruits = [];
fruits.push({ group: { key: "1" }, title: "Banana" });
fruits.push({ group: { key: "2" }, title: "Peach" });
fruits.push({ group: { key: "1" }, title: "Blueberry" });
fruits.push({ group: { key: "2" }, title: "Plum" });
function groupKeySelector(item) {
return item.group.key;
}
function groupDataSelector(item) {
return {
title: item.group.key,
}
}
var list = new WinJS.Binding.List(fruits);
var groupedItems = list.createGrouped(groupKeySelector, groupDataSelector);
LiveUnit.Assert.areEqual("Banana,Blueberry,Peach,Plum", groupedItems.map(function (item) { return item.title; }).join());
groupedItems.getAt(0).group.key = "2";
groupedItems.notifyMutated(0);
LiveUnit.Assert.areEqual("Blueberry,Banana,Peach,Plum", groupedItems.map(function (item) { return item.title; }).join());
}
testBindingAsWithBindingList() {
var obj = {
str: 'string',
integer: 1,
myList: new WinJS.Binding.List()
};
var observable = WinJS.Binding.as(obj);
observable.myList.push(10);
LiveUnit.Assert.areEqual(10, observable.myList.getAt(0), "testing the first element of the list in observable");
}
testBindingWithClassDefine() {
var someClass = WinJS.Class.define(
function () {
this._list = new WinJS.Binding.List();
this._variable = 0;
},
{
list: {
get: function () { return this._list; },
set : function (l) {this._list = l;}
},
variable: {
get: function () { return this._variable; },
set: function (v) {
this._variable = v;
}
}
}
);
var obj = new someClass();
obj.list.push(10);
LiveUnit.Assert.areEqual(10, obj.list.getAt(0), "checking the binding list in class define");
LiveUnit.Assert.areEqual(0, obj.variable, "making sure that the other variable is still correct");
var l = new List([3, 4, 5]);
obj.list = l;
obj.variable = 10;
LiveUnit.Assert.areEqual(3, obj.list.getAt(0), "checking the binding list after setting the whole list");
LiveUnit.Assert.areEqual(3, obj.list.length, "checking the length of the list after setting the whole list");
LiveUnit.Assert.areEqual(10, obj.variable, "making sure that the other variable is still correct");
}
};
}
LiveUnit.registerTestClass("Tests.ListTest");
LiveUnit.registerTestClass("Tests.ListProxy");
LiveUnit.registerTestClass("Tests.ListProjections");