blob: 1c1877da56e40ec7f8193fe5543479064615c9c3 [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
let suite = InspectorTest.createSyncSuite("ArrayUtilities");
suite.addTestCase({
name: "Array.prototype.lowerBound",
test() {
// Index: 0 1 2 3 4 5 6 7 8 9
let arr = [0, 1, 2, 2, 2, 2, 2, 2, 6, 7];
InspectorTest.expectEqual(arr.lowerBound(-100), 0, "lowerBound of a value before the first value should produce the first index.");
InspectorTest.expectEqual(arr.lowerBound(0), 0, "lowerBound of a value in the list should return the value's index.");
InspectorTest.expectEqual(arr.lowerBound(1), 1, "lowerBound of a value in the list should return the value's index.");
InspectorTest.expectEqual(arr.lowerBound(7), 9, "lowerBound of a value in the list should return the value's index.");
InspectorTest.expectEqual(arr.lowerBound(2), 2, "lowerBound of a duplicate value in the list should return the value's first index.");
InspectorTest.expectEqual(arr.lowerBound(5), 8, "lowerBound of a value in a gap in the list should return the index where the value would be.");
InspectorTest.expectEqual(arr.lowerBound(100), arr.length, "lowerBound of a value after the last value should produce the index after the last index (length).");
let objs = [{size: 100}, {size: 200}, {size: 300}];
let comparator = (value, object) => value - object.size;
InspectorTest.expectEqual(objs.lowerBound(150, comparator), 1, "lowerBound with a comparator should invoke the comparator with the search value and a value in the list.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.upperBound",
test() {
// Index: 0 1 2 3 4 5 6 7 8 9
let arr = [0, 1, 2, 2, 2, 2, 2, 2, 6, 7];
InspectorTest.expectEqual(arr.upperBound(-100), 0, "upperBound of a value before the first value should produce the first index.");
InspectorTest.expectEqual(arr.upperBound(0), 1, "upperBound of a value in the list should return the next index after the value.");
InspectorTest.expectEqual(arr.upperBound(1), 2, "upperBound of a value in the list should return the next index after the value.");
InspectorTest.expectEqual(arr.upperBound(7), 10, "upperBound of a value in the list should return the next index after the value.");
InspectorTest.expectEqual(arr.upperBound(2), 8, "upperBound of a duplicate value in the list should return the next index after the value's last index.");
InspectorTest.expectEqual(arr.upperBound(5), 8, "upperBound of a value in a gap in the list should return the index where the value would be.");
InspectorTest.expectEqual(arr.upperBound(100), arr.length, "upperBound of a value after the last value should produce the index after the last index (length).");
let objs = [{size: 100}, {size: 200}, {size: 300}];
let comparator = (value, object) => value - object.size;
InspectorTest.expectEqual(objs.upperBound(150, comparator), 1, "upperBound with a comparator should invoke the comparator with the search value and a value in the list.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.binaryIndexOf",
test() {
// Index: 0 1 2 3 4 5 6 7 8 9
let arr = [0, 1, 2, 2, 2, 2, 2, 2, 6, 7];
let defaultComparator = (a, b) => a - b;
InspectorTest.expectEqual(arr.binaryIndexOf(-100, defaultComparator), -1, "binaryIndexOf of a value not in the list should be -1.");
InspectorTest.expectEqual(arr.binaryIndexOf(100, defaultComparator), -1, "binaryIndexOf of a value not in the list should be -1.");
InspectorTest.expectEqual(arr.binaryIndexOf(0, defaultComparator), arr.lowerBound(0), "binaryIndexOf of a value in the list should return the index of the value.");
InspectorTest.expectEqual(arr.binaryIndexOf(2, defaultComparator), arr.lowerBound(2), "binaryIndexOf of a duplicate value in the list should return the first index of the value.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.partition",
test() {
let arr1 = [1, 2, 3, 4];
let [even, odd] = arr1.partition((x) => x % 2 === 0);
InspectorTest.expectEqual(even.length + odd.length, arr1.length, "partition should not lose any elements.");
InspectorTest.expectThat(Array.shallowEqual(even, [2, 4]) && Array.shallowEqual(odd, [1, 3]), "partition should keep the order of elements in the sublists.");
let arr2 = [1, 1, -1, -2, 5, -2, -6, 0];
let [positive, negative] = arr2.partition((x) => x >= 0);
InspectorTest.expectThat(Array.shallowEqual(positive, [1, 1, 5, 0]) && Array.shallowEqual(negative, [-1, -2, -2, -6]), "partition should handle duplicates.");
let arr3 = [1, 2];
let [full, empty] = arr3.partition((x) => true);
InspectorTest.expectThat(Array.shallowEqual(full, [1, 2]) && !empty.length, "partition should produce an empty list for the negative side.");
[empty, full] = arr3.partition((x) => false);
InspectorTest.expectThat(Array.shallowEqual(full, [1, 2]) && !empty.length, "partition should produce an empty list for the positive side.");
return true;
}
});
suite.addTestCase({
name: "Array.isTypedArray",
test() {
InspectorTest.expectFalse(Array.isTypedArray(null), "isTypedArray of non-array.");
InspectorTest.expectFalse(Array.isTypedArray([]), "isTypedArray of non-typed-array should be false.");
InspectorTest.expectThat(Array.isTypedArray(new Int8Array), "isTypedArray of Int8Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Int16Array), "isTypedArray of Int16Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Int32Array), "isTypedArray of Int32Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Uint8Array), "isTypedArray of Uint8Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Uint8ClampedArray), "isTypedArray of Uint8ClampedArray should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Uint16Array), "isTypedArray of Uint16Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Uint32Array), "isTypedArray of Uint32Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Float32Array), "isTypedArray of Float32Array should be true.");
InspectorTest.expectThat(Array.isTypedArray(new Float64Array), "isTypedArray of Float64Array should be true.");
return true;
}
});
suite.addTestCase({
name: "Array.shallowEqual",
test() {
InspectorTest.expectThat(Array.shallowEqual([], []), "shallowEqual of empty arrays should be true.");
let arr1 = [1, 2, 3, 4];
InspectorTest.expectThat(Array.shallowEqual(arr1, arr1), "shallowEqual of an array with itself should be true.");
let arr2 = [1, 2, 3, 4];
InspectorTest.expectThat(Array.shallowEqual(arr1, arr2), "shallowEqual of equal arrays should be true.");
InspectorTest.expectThat(Array.shallowEqual(arr2, arr1), "shallowEqual of equal arrays should be true.");
let arr3 = [1, 2, 3, 4, 5];
InspectorTest.expectFalse(Array.shallowEqual(arr1, arr3), "shallowEqual of unequal arrays should be false.");
InspectorTest.expectFalse(Array.shallowEqual(arr3, arr1), "shallowEqual of unequal arrays should be false.");
InspectorTest.expectFalse(Array.shallowEqual([], null), "shallowEqual of an array and null should be false.");
InspectorTest.expectFalse(Array.shallowEqual([], 1.23), "shallowEqual of an array and non-array should be false.");
let typedArray1 = Int8Array.from(arr1);
InspectorTest.expectThat(Array.shallowEqual(typedArray1, arr1), "shallowEqual of a typed-array and it's array counterpart should be true.");
InspectorTest.expectThat(Array.shallowEqual(typedArray1, typedArray1), "shallowEqual of a typed-array with itself should be true.");
let typedArray2 = Int8Array.from(arr2);
InspectorTest.expectThat(Array.shallowEqual(typedArray1, arr2), "shallowEqual of equal typed-array and it's array counterpart should be true.");
InspectorTest.expectThat(Array.shallowEqual(typedArray1, typedArray2), "shallowEqual of equal typed-arrays should be true.");
InspectorTest.expectThat(Array.shallowEqual(typedArray2, arr1), "shallowEqual of equal typed-array and it's array counterpart should be true.");
InspectorTest.expectThat(Array.shallowEqual(typedArray2, typedArray1), "shallowEqual of equal typed-arrays should be true.");
let typedArray3 = Int8Array.from(arr3);
InspectorTest.expectFalse(Array.shallowEqual(typedArray1, arr3), "shallowEqual of unequal typed-array and it's array counterpart should be false.");
InspectorTest.expectFalse(Array.shallowEqual(typedArray1, typedArray3), "shallowEqual of unequal typed-arrays should be false.");
InspectorTest.expectFalse(Array.shallowEqual(typedArray3, arr1), "shallowEqual of unequal typed-array and it's array counterpart should be false.");
InspectorTest.expectFalse(Array.shallowEqual(typedArray3, typedArray1), "shallowEqual of unequal typed-arrays should be false.");
InspectorTest.expectFalse(Array.shallowEqual(new Int8Array, null), "shallowEqual of a typed-array and null should be false.");
InspectorTest.expectFalse(Array.shallowEqual(new Int8Array, 1.23), "shallowEqual of a typed-array and non-array should be false.");
let str = "abc";
InspectorTest.expectFalse(Array.shallowEqual(str, str), "shallowEqual of a non-array with itself should be false.");
InspectorTest.expectFalse(Array.shallowEqual({}, {}), "shallowEqual of non-arrays should be false.");
return true;
}
});
suite.addTestCase({
name: "Array.diffArrays",
test() {
function diff(initial, current) {
let actual = [];
Array.diffArrays(initial, current, (value, changed) => {
actual.push([value, changed]);
});
InspectorTest.log(JSON.stringify(initial) + ", " + JSON.stringify(current) + " => " + JSON.stringify(actual));
}
diff(["a"], []);
diff([], ["a"]);
diff(["a"], ["b"]);
diff(["a"], ["a"]);
diff(["a"], ["a", "b"]);
diff(["a"], ["b", "a"]);
diff(["a", "b"], ["a"]);
diff(["b", "a"], ["a"]);
diff(["b", "a"], ["a", "c"]);
diff(["b", "a"], ["a", "c"]);
diff(["b", "a"], ["a", "b"]);
diff(["a", "b", "c"], ["a", "d", "c"]);
diff(["a", "b", "c"], ["c", "b", "a"]);
InspectorTest.log("\nRepeating items:");
diff(["a"], ["a", "a"]);
diff(["a", "a"], ["a"]);
diff(["a", "a"], ["a", "a"]);
diff(["b", "a", "b"], ["a", "b", "a"]);
diff(["a", "b", "b", "c"], ["c", "b", "b", "b", "a"]);
diff(["a", "b", "b", "b", "c"], ["c", "b", "b", "a"]);
diff(["a", "a", "b", "b", "c", "c"], ["b", "b", "c", "c", "a", "a"]);
return true;
}
});
suite.addTestCase({
name: "Array.prototype.lastValue",
test() {
let object1 = {};
let object2 = {};
InspectorTest.expectEqual([object1, object2].lastValue, object2, "lastValue of a nonempty array should be the last value.")
InspectorTest.expectEqual([].lastValue, undefined, "lastValue of an empty array should be undefined.")
return true;
}
});
suite.addTestCase({
name: "Array.prototype.adjacencies",
test() {
function logAdjacencies(array) {
InspectorTest.log(JSON.stringify(array) + " => " + JSON.stringify(Array.from(array.adjacencies())));
}
logAdjacencies([]);
logAdjacencies([1]);
logAdjacencies([1, 2]);
logAdjacencies([1, 2, 3]);
logAdjacencies([1, 2, 3, 4]);
return true;
}
});
suite.addTestCase({
name: "Array.prototype.groupBy",
test() {
function log(input, output) {
InspectorTest.log(JSON.stringify(input) + " => " + JSON.stringify(output));
}
let arr = [0, 1, 0, 1, 1, 0, 1, 1, 1, 0];
let isOne = (x) => { return x === 1 };
log(arr, arr.groupBy(isOne, 1));
log(arr, arr.groupBy(isOne, 2));
log(arr, arr.groupBy(isOne, 3));
log(arr, arr.groupBy(isOne, 4));
let arr2 = [0, 1, 0, 1, 1, 0, 1, 1, 1];
log(arr2, arr2.groupBy(isOne, 1));
log(arr2, arr2.groupBy(isOne, 2));
log(arr2, arr2.groupBy(isOne, 3));
log(arr2, arr2.groupBy(isOne, 4));
return true;
}
});
suite.addTestCase({
name: "Array.prototype.remove",
test() {
let arr1 = [1, 2, 3, 1];
InspectorTest.expectThat(arr1.remove(1), "remove should return true when removing a value that exists.");
InspectorTest.expectShallowEqual(arr1, [2, 3, 1], "remove should only remove the first matching value.");
let arr2 = ["1", "2", 3, 1];
InspectorTest.expectThat(arr2.remove("1"), "remove should return true when removing a value that exists.");
InspectorTest.expectFalse(arr2.remove(2), "remove should return false when removing a value that does not exist.");
InspectorTest.expectShallowEqual(arr2, ["2", 3, 1], "remove should only remove values that strictly match.");
let arr3 = [1, 2, 3];
InspectorTest.expectFalse(arr3.remove("1"), "remove should return false when removing a value that does not exist.");
InspectorTest.expectFalse(arr3.remove(4), "remove should return false when removing a value that does not exist.");
InspectorTest.expectShallowEqual(arr3, [1, 2, 3], "remove should not affect the array if the value does not exist.");
}
});
suite.addTestCase({
name: "Array.prototype.removeAll",
test() {
let arr1 = [1, 2, 3, 1];
arr1.removeAll(1);
InspectorTest.expectShallowEqual(arr1, [2, 3], "removeAll should remove all matching values.");
let arr2 = ["1", "2", 3, 1];
arr2.removeAll("1");
arr2.removeAll(2);
InspectorTest.expectShallowEqual(arr2, ["2", 3, 1], "removeAll should only remove values that strictly match.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.toggleIncludes",
test() {
let arr1 = [1, 2, 3];
arr1.toggleIncludes(3, true);
InspectorTest.expectShallowEqual(arr1, [1, 2, 3], "toggleIncludes of an existing item with force true should have no effect.");
let arr2 = [1, 2, 3];
arr2.toggleIncludes(3, false);
InspectorTest.expectShallowEqual(arr2, [1, 2], "toggleIncludes of an existing item with force false should remove the item.");
let arr3 = [1, 2, 3];
arr3.toggleIncludes(4, true);
InspectorTest.expectShallowEqual(arr3, [1, 2, 3, 4], "toggleIncludes of a nonexistent item with force true should add the item.");
let arr4 = [1, 2, 3];
arr4.toggleIncludes(4, false);
InspectorTest.expectShallowEqual(arr4, [1, 2, 3], "toggleIncludes of a nonexistent item with force false should have no effect.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.insertAtIndex",
test() {
let arr1 = [1, 2, 3];
arr1.insertAtIndex("x");
InspectorTest.expectShallowEqual(arr1, ["x", 1, 2, 3], "insertAtIndex with index unspecified should insert at the beginning.");
let arr2 = [1, 2, 3];
arr2.insertAtIndex("x", 0);
InspectorTest.expectShallowEqual(arr2, ["x", 1, 2, 3], "insertAtIndex with index zero should insert at the beginning.");
let arr3 = [1, 2, 3];
arr3.insertAtIndex("x", 2);
InspectorTest.expectShallowEqual(arr3, [1, 2, "x", 3], "insertAtIndex with 0 < index < length should insert at the correct location.");
let arr4 = [1, 2, 3];
arr4.insertAtIndex("x", -1);
InspectorTest.expectShallowEqual(arr4, [1, 2, "x", 3], "insertAtIndex with negative index should insert from the end.");
let arr5 = [1, 2, 3];
arr5.insertAtIndex("x", 100);
InspectorTest.expectShallowEqual(arr5, [1, 2, 3, "x"], "insertAtIndex with index greater than array length should insert at the end.");
return true;
}
});
suite.addTestCase({
name: "Array.prototype.pushAll",
test() {
function test(iterable) {
let array = [1, 2];
function stringify(object)
{
let string = JSON.stringify(object, function(key, value) {
if (value instanceof Node)
return "<" + value.localName + ">";
return value;
});
return string.replace(/"(<[^>]*>)"/g, "$1");
}
let before = stringify(array);
array.pushAll(iterable);
let after = stringify(array);
InspectorTest.log(before + " => " + after);
}
InspectorTest.log("Array:");
test(["a1", "a2"]);
InspectorTest.newline();
InspectorTest.log("Set:");
const set = new Set(["s1", "s2"]);
test(set);
test(set.entries());
test(set.keys());
test(set.values());
InspectorTest.newline();
InspectorTest.log("Map:");
const map = new Map([["m1k", "m1v"], ["m2k", "m2v"]]);
test(map);
test(map.entries());
test(map.keys());
test(map.values());
InspectorTest.newline();
InspectorTest.log("Object:");
const object = {
o1k: "o1v",
o2k: "o2v",
};
test(Object.entries(object));
test(Object.keys(object));
test(Object.values(object));
InspectorTest.newline();
InspectorTest.log("Generator:");
function* generator() {
yield "g1";
yield "g2";
}
test(generator());
InspectorTest.newline();
InspectorTest.log("Node:");
const node = document.createElement("div");
node.appendChild(document.createElement("n1"));
node.appendChild(document.createElement("n2"));
test(node.children);
test(node.querySelectorAll("*"));
InspectorTest.newline();
InspectorTest.log("Object (doesn't have [Symbol.iterator]):");
InspectorTest.expectException(() => {
test(object);
});
},
});
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onLoad="runTest()">
</body>
</html>