123 lines
5.8 KiB
JavaScript
123 lines
5.8 KiB
JavaScript
//@ requireOptions("--useArrayFindLastMethod=true")
|
|
description("Tests for Array.prototype.findLastIndex");
|
|
|
|
shouldBe("Array.prototype.findLastIndex.length", "1");
|
|
shouldBe("Array.prototype.findLastIndex.name", "'findLastIndex'");
|
|
|
|
function passUndefined(element, index, array) {
|
|
return typeof element === "undefined";
|
|
}
|
|
function passZero(element, index, array) {
|
|
return element === 0;
|
|
}
|
|
function passNull(element, index, array) {
|
|
return element === null;
|
|
}
|
|
function passFalse(element, index, array) {
|
|
return element === false;
|
|
}
|
|
function passEmptyString(element, index, array) {
|
|
return element === "";
|
|
}
|
|
function passEven(a) {
|
|
return !(a & 1);
|
|
}
|
|
function passAfter5(element, index) {
|
|
return index >= 5;
|
|
}
|
|
function toObject(array) {
|
|
var result = {};
|
|
result.length = array.length;
|
|
for (var i in array)
|
|
result[i] = array[i];
|
|
result.findLastIndex = Array.prototype.findLastIndex;
|
|
return result;
|
|
}
|
|
function findItemAddedDuringSearch(element, index, array) {
|
|
if (index === array.length - 1)
|
|
array.unshift(array.length);
|
|
return (index === array.length - 1);
|
|
}
|
|
function findItemRemovedDuringSearch(element, index, array) {
|
|
if (index === 0)
|
|
array.shift();
|
|
return (index === 0 && array[0] === element);
|
|
}
|
|
var arrayWithHoles = [];
|
|
arrayWithHoles[1] = 0;
|
|
arrayWithHoles[3] = null;
|
|
arrayWithHoles[5] = false;
|
|
arrayWithHoles[7] = "";
|
|
function numberOfCallbacksInFindIndexInArrayWithHoles() {
|
|
var count = 0;
|
|
arrayWithHoles.find(function(element, index, array) {
|
|
debug("find callback called with index " + index);
|
|
count++;
|
|
});
|
|
return count;
|
|
}
|
|
|
|
shouldBe("[undefined, 0, null, false, ''].findLastIndex(passUndefined)", "0");
|
|
shouldBe("[undefined, 0, null, false, ''].findLastIndex(passZero)", "1");
|
|
shouldBe("[undefined, 0, null, false, ''].findLastIndex(passNull)", "2");
|
|
shouldBe("[undefined, 0, null, false, ''].findLastIndex(passFalse)", "3");
|
|
shouldBe("[undefined, 0, null, false, ''].findLastIndex(passEmptyString)", "4");
|
|
shouldBe("[0,1,2,3,4,5,6,7,8,9].findLastIndex(passEven)", "8");
|
|
shouldBe("[0,1,2,3,4,5,6,7,8,9].findLastIndex(passAfter5)", "9");
|
|
shouldBe("[0, null, false, ''].findLastIndex(passUndefined)", "-1");
|
|
shouldBe("[undefined, 0, false, ''].findLastIndex(passNull)", "-1");
|
|
shouldBe("[undefined, 0, null, ''].findLastIndex(passFalse)", "-1");
|
|
shouldBe("[undefined, 0, null, false].findLastIndex(passEmptyString)", "-1");
|
|
shouldBe("[1,3,5,7,9].findLastIndex(passEven)", "-1");
|
|
shouldBe("[0,1,2,3,4].findLastIndex(passAfter5)", "-1");
|
|
shouldBe("[undefined, null, false, ''].findLastIndex(passZero)", "-1");
|
|
|
|
debug("Array with holes");
|
|
shouldBe("(new Array(20)).findLastIndex(passUndefined)", "19");
|
|
shouldBe("arrayWithHoles.findLastIndex(passUndefined)", "6");
|
|
shouldBe("arrayWithHoles.findLastIndex(passZero)", "1");
|
|
shouldBe("arrayWithHoles.findLastIndex(passNull)", "3");
|
|
shouldBe("arrayWithHoles.findLastIndex(passFalse)", "5");
|
|
shouldBe("arrayWithHoles.findLastIndex(passEmptyString)", "7");
|
|
shouldBe("arrayWithHoles.findLastIndex(passAfter5)", "7");
|
|
arrayWithHoles[6] = {};
|
|
shouldBe("arrayWithHoles.findLastIndex(passUndefined)", "4");
|
|
|
|
debug("Generic Object");
|
|
shouldBe("toObject([undefined, 0, null, false, '']).findLastIndex(passUndefined)", "0");
|
|
shouldBe("toObject([undefined, 0, null, false, '']).findLastIndex(passZero)", "1");
|
|
shouldBe("toObject([undefined, 0, null, false, '']).findLastIndex(passNull)", "2");
|
|
shouldBe("toObject([undefined, 0, null, false, '']).findLastIndex(passFalse)", "3");
|
|
shouldBe("toObject([undefined, 0, null, false, '']).findLastIndex(passEmptyString)", "4");
|
|
shouldBe("toObject([0, null, false, '']).findLastIndex(passUndefined)", "-1");
|
|
shouldBe("toObject([undefined, 0, false, '']).findLastIndex(passNull)", "-1");
|
|
shouldBe("toObject([undefined, 0, null, '']).findLastIndex(passFalse)", "-1");
|
|
shouldBe("toObject([undefined, 0, null, false]).findLastIndex(passEmptyString)", "-1");
|
|
shouldBe("toObject([undefined, null, false, '']).findLastIndex(passZero)", "-1");
|
|
shouldBe("toObject(new Array(20)).findLastIndex(passUndefined)", "19");
|
|
|
|
debug("Array-like object with invalid lengths");
|
|
var throwError = function throwError() {
|
|
throw new Error("should not reach here");
|
|
};
|
|
shouldBe("var obj = { 0: 1, 1: 2, 2: 3, length: 0 }; Array.prototype.findLastIndex.call(obj, throwError)", "-1");
|
|
shouldBe("var obj = { 0: 1, 1: 2, 2: 3, length: -0 }; Array.prototype.findLastIndex.call(obj, throwError)", "-1");
|
|
shouldBe("var obj = { 0: 1, 1: 2, 2: 3, length: -3 }; Array.prototype.findLastIndex.call(obj, throwError)", "-1");
|
|
|
|
debug("Modification during search");
|
|
shouldBe("[0,1,2,3,4,5,6,7,8,9].findLastIndex(findItemAddedDuringSearch)", "-1");
|
|
shouldBe("[0,1,2,3,4,5,6,7,8,9].findLastIndex(findItemRemovedDuringSearch)", "-1");
|
|
|
|
debug("Exceptions");
|
|
shouldThrow("Array.prototype.findLastIndex.call(undefined, function() {})", "'TypeError: Array.prototype.findLastIndex requires that |this| not be null or undefined'");
|
|
shouldThrow("Array.prototype.findLastIndex.call(null, function() {})", "'TypeError: Array.prototype.findLastIndex requires that |this| not be null or undefined'");
|
|
shouldThrow("[].findLastIndex(1)", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
shouldThrow("[].findLastIndex('hello')", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
shouldThrow("[].findLastIndex([])", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
shouldThrow("[].findLastIndex({})", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
shouldThrow("[].findLastIndex(null)", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
shouldThrow("[].findLastIndex(undefined)", "'TypeError: Array.prototype.findLastIndex callback must be a function'");
|
|
|
|
debug("Callbacks in the expected order and *not* skipping holes");
|
|
shouldBe("numberOfCallbacksInFindIndexInArrayWithHoles()", "8");
|