summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/object/values-entries-typedarray.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/object/values-entries-typedarray.js')
-rw-r--r--js/src/tests/non262/object/values-entries-typedarray.js53
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);