diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/tests/non262/object/values-entries-typedarray.js | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/js/src/tests/non262/object/values-entries-typedarray.js b/js/src/tests/non262/object/values-entries-typedarray.js new file mode 100644 index 0000000000..b0ac5a51bb --- /dev/null +++ b/js/src/tests/non262/object/values-entries-typedarray.js @@ -0,0 +1,53 @@ +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); |