Source code

Revision control

Copy as Markdown

Other Tools

// |reftest|
const startIndices = [
-10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 10,
];
const deleteCounts = [
0, 1, 2, 3, 4, 5, 10,
];
const insertCounts = [
0, 1, 2, 3, 4, 5, 10,
];
const itemsList = insertCounts.map(count => {
return new Array(count).fill(0);
});
const arrays = [
// Dense no holes.
[],
[1],
[1,2],
[1,2,3],
[1,2,3,4],
[1,2,3,4,5,6,7,8],
// Dense trailing holes.
[,],
[1,,],
[1,2,,],
[1,2,3,,],
[1,2,3,4,,],
[1,2,3,4,5,6,7,8,,],
// Dense leading holes.
[,],
[,1],
[,1,2],
[,1,2,3],
[,1,2,3,4],
[,1,2,3,4,5,6,7,8],
// Dense with holes.
[1,,3],
[1,2,,4],
[1,,3,,5,6,,8],
];
const objects = arrays.map(array => {
let obj = {
length: array.length,
};
for (let i = 0; i < array.length; ++i) {
if (i in array) {
obj[i] = array[i];
}
}
return obj;
});
const objectsWithLargerDenseInitializedLength = arrays.map(array => {
let obj = {
length: array.length,
};
for (let i = 0; i < array.length; ++i) {
if (i in array) {
obj[i] = array[i];
}
}
// Add some extra dense elements after |length|.
for (let i = 0; i < 5; ++i) {
obj[array.length + i] = "extra";
}
return obj;
});
const thisValues = [
...arrays,
...objects,
...objectsWithLargerDenseInitializedLength,
];
for (let thisValue of thisValues) {
for (let startIndex of startIndices) {
for (let deleteCount of deleteCounts) {
for (let items of itemsList) {
let res = Array.prototype.toSpliced.call(thisValue, startIndex, deleteCount, ...items);
// Array.prototype.toSpliced(), steps 3-6.
let actualStart;
if (startIndex < 0) {
actualStart = Math.max(thisValue.length + startIndex, 0);
} else {
actualStart = Math.min(startIndex, thisValue.length);
}
// Array.prototype.toSpliced(), step 10.
let actualDeleteCount = Math.min(Math.max(0, deleteCount), thisValue.length - actualStart);
let newLength = thisValue.length + items.length - actualDeleteCount;
assertEq(res.length, newLength);
for (let i = 0; i < actualStart; ++i) {
assertEq(Object.hasOwn(res, i), true);
assertEq(res[i], thisValue[i]);
}
for (let i = 0; i < items.length; ++i) {
assertEq(Object.hasOwn(res, actualStart + i), true);
assertEq(res[actualStart + i], items[i]);
}
for (let i = 0; i < newLength - actualStart - items.length; ++i) {
assertEq(Object.hasOwn(res, actualStart + items.length + i), true);
assertEq(res[actualStart + items.length + i],
thisValue[actualStart + actualDeleteCount + i]);
}
}
}
}
}
if (typeof reportCompare === "function")
reportCompare(0, 0);