Source code

Revision control

Copy as Markdown

Other Tools

function assertSameEntries(actual, expected) {
assertEq(actual.length, expected.length);
for (let i = 0; i < expected.length; ++i)
assertEqArray(actual[i], expected[i]);
}
function throwsTypeError(fn) {
try {
fn();
} catch (e) {
assertEq(e instanceof TypeError, true);
return true;
}
return false;
}
// Non-standard: Accessing elements of detached array buffers should throw, but
// this is currently not implemented.
const ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS = (() => {
let ta = new Int32Array(10);
detachArrayBuffer(ta.buffer);
let throws = throwsTypeError(() => ta[0]);
// Ensure [[Get]] and [[GetOwnProperty]] return consistent results.
assertEq(throwsTypeError(() => Object.getOwnPropertyDescriptor(ta, 0)), throws);
return throws;
})();
function maybeThrowOnDetached(fn, returnValue) {
if (ACCESS_ON_DETACHED_ARRAY_BUFFER_THROWS) {
assertThrowsInstanceOf(fn, TypeError);
return returnValue;
}
return fn();
}
// Ensure Object.keys/values/entries work correctly on typed arrays.
for (let len of [0, 1, 10]) {
let array = new Array(len).fill(1);
let ta = new Int32Array(array);
assertEqArray(Object.keys(ta), Object.keys(array));
assertEqArray(Object.values(ta), Object.values(array));
assertSameEntries(Object.entries(ta), Object.entries(array));
detachArrayBuffer(ta.buffer);
assertEqArray(maybeThrowOnDetached(() => Object.keys(ta), []), []);
assertEqArray(maybeThrowOnDetached(() => Object.values(ta), []), []);
assertSameEntries(maybeThrowOnDetached(() => Object.entries(ta), []), []);
}
if (typeof reportCompare === "function")
reportCompare(true, true);