summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Iterator/prototype/some
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/Iterator/prototype/some')
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js26
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js23
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/descriptor.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js16
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js15
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/length.js17
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/name.js13
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js22
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/proxy.js44
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js11
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js14
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js9
-rw-r--r--js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js25
14 files changed, 270 insertions, 0 deletions
diff --git a/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
new file mode 100644
index 0000000000..f81f660916
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/check-fn-after-getting-iterator.js
@@ -0,0 +1,26 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class TestIterator extends Iterator {
+ next() {
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new TestIterator(), handlerProxy);
+assertThrowsInstanceOf(() => iter.some(1), TypeError);
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
new file mode 100644
index 0000000000..5bebdb06ea
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/coerce-result-to-boolean.js
@@ -0,0 +1,23 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = (value) => value;
+assertEq([true].values().some(fn), true);
+assertEq([1].values().some(fn), true);
+assertEq([[]].values().some(fn), true);
+assertEq([{}].values().some(fn), true);
+assertEq(['test'].values().some(fn), true);
+
+assertEq([false].values().some(fn), false);
+assertEq([0].values().some(fn), false);
+assertEq([''].values().some(fn), false);
+assertEq([null].values().some(fn), false);
+assertEq([undefined].values().some(fn), false);
+assertEq([NaN].values().some(fn), false);
+assertEq([-0].values().some(fn), false);
+assertEq([0n].values().some(fn), false);
+
+const htmlDDA = createIsHTMLDDA();
+assertEq([htmlDDA].values().some(fn), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/descriptor.js b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
new file mode 100644
index 0000000000..dfafc4aa5f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/descriptor.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ Descriptor property of Iterator.prototype.some
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype, 'some');
+assertEq(typeof propDesc.value, 'function');
+assertEq(propDesc.writable, true);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
new file mode 100644
index 0000000000..ba68c6e7c1
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/error-from-correct-realm.js
@@ -0,0 +1,16 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const otherGlobal = newGlobal({newCompartment: true});
+assertEq(TypeError !== otherGlobal.TypeError, true);
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.some(), TypeError);
+assertThrowsInstanceOf(
+ otherGlobal.Iterator.prototype.some.bind(iter),
+ otherGlobal.TypeError,
+ 'TypeError comes from the realm of the method.',
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
new file mode 100644
index 0000000000..52be15391f
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-not-callable-throws.js
@@ -0,0 +1,15 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [].values();
+
+assertThrowsInstanceOf(() => iter.some(), TypeError);
+assertThrowsInstanceOf(() => iter.some(undefined), TypeError);
+assertThrowsInstanceOf(() => iter.some(null), TypeError);
+assertThrowsInstanceOf(() => iter.some(0), TypeError);
+assertThrowsInstanceOf(() => iter.some(false), TypeError);
+assertThrowsInstanceOf(() => iter.some(''), TypeError);
+assertThrowsInstanceOf(() => iter.some(Symbol('')), TypeError);
+assertThrowsInstanceOf(() => iter.some({}), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
new file mode 100644
index 0000000000..bbe751e175
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/fn-throws-close-iterator.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ return { done: this.closed };
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => { throw new Error(); };
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/length.js b/js/src/tests/non262/Iterator/prototype/some/length.js
new file mode 100644
index 0000000000..c9d1f986f6
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/length.js
@@ -0,0 +1,17 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ The `length` property of Iterator.prototype.some.
+info: |
+ ES7 section 17: Unless otherwise specified, the length property of a built-in
+ Function object has the attributes { [[Writable]]: false, [[Enumerable]]:
+ false, [[Configurable]]: true }.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'length');
+assertEq(propDesc.value, 1);
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/name.js b/js/src/tests/non262/Iterator/prototype/some/name.js
new file mode 100644
index 0000000000..679e75460c
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/name.js
@@ -0,0 +1,13 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+/*---
+ `name` property of Iterator.prototype.some.
+---*/
+
+const propDesc = Reflect.getOwnPropertyDescriptor(Iterator.prototype.some, 'name');
+assertEq(propDesc.value, 'some');
+assertEq(propDesc.writable, false);
+assertEq(propDesc.enumerable, false);
+assertEq(propDesc.configurable, true);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..4bdf372908
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/next-throws-iterator-not-closed.js
@@ -0,0 +1,22 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestIterator extends Iterator {
+ next() {
+ throw new Error();
+ }
+
+ closed = false;
+ return() {
+ this.closed = true;
+ }
+}
+
+const fn = () => {};
+const iter = new TestIterator();
+
+assertEq(iter.closed, false);
+assertThrowsInstanceOf(() => iter.some(fn), Error);
+assertEq(iter.closed, false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/proxy.js b/js/src/tests/non262/Iterator/prototype/some/proxy.js
new file mode 100644
index 0000000000..a444a2d5cb
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/proxy.js
@@ -0,0 +1,44 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+//
+// This test checks that %Iterator.prototype%.some only gets the `next` method off of the
+// iterator once, and never accesses the @@iterator property.
+const log = [];
+const handlerProxy = new Proxy({}, {
+ get: (target, key, receiver) => (...args) => {
+ log.push(`${key}: ${args[1]?.toString()}`);
+ return Reflect[key](...args);
+ },
+});
+
+class Counter extends Iterator {
+ value = 0;
+ next() {
+ const value = this.value;
+ if (value < 2) {
+ this.value = value + 1;
+ return {done: false, value};
+ }
+ return {done: true};
+ }
+}
+
+const iter = new Proxy(new Counter(), handlerProxy);
+assertEq(iter.some(x => x % 2 == 1), true);
+
+assertEq(
+ log.join('\n'),
+ `get: some
+get: next
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: value
+set: value
+getOwnPropertyDescriptor: value
+defineProperty: value
+get: return`
+);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
new file mode 100644
index 0000000000..00fab94245
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/return-false-if-none-match.js
@@ -0,0 +1,11 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 3, 5].values();
+const fn = (value) => value % 2 == 0;
+
+assertEq(iter.some(fn), false);
+
+assertEq([].values().some(x => x), false);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
new file mode 100644
index 0000000000..4f0d67bf09
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/short-circuit-on-true.js
@@ -0,0 +1,14 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const iter = [1, 2, 3].values();
+const log = [];
+const fn = (value) => {
+ log.push(value.toString());
+ return value % 2 == 0;
+};
+
+assertEq(iter.some(fn), true);
+assertEq(log.join(','), '1,2');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
new file mode 100644
index 0000000000..0659ec037e
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/this-not-iterator-throws.js
@@ -0,0 +1,9 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+const fn = x => x;
+assertThrowsInstanceOf(Iterator.prototype.some.bind(undefined, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.some.bind({}, fn), TypeError);
+assertThrowsInstanceOf(Iterator.prototype.some.bind({next: 0}, fn), TypeError);
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);
diff --git a/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
new file mode 100644
index 0000000000..87bf5df033
--- /dev/null
+++ b/js/src/tests/non262/Iterator/prototype/some/value-throws-iterator-not-closed.js
@@ -0,0 +1,25 @@
+// |reftest| skip-if(!this.hasOwnProperty('Iterator')) -- Iterator is not enabled unconditionally
+
+class TestError extends Error {}
+class TestIterator extends Iterator {
+ next() {
+ return new Proxy({done: false}, {get: (target, key, receiver) => {
+ if (key === 'value')
+ throw new TestError();
+ return 0;
+ }});
+ }
+
+ closed = false;
+ return() {
+ closed = true;
+ }
+}
+
+const iterator = new TestIterator();
+assertEq(iterator.closed, false, 'iterator starts unclosed');
+assertThrowsInstanceOf(() => iterator.some(x => x), TestError);
+assertEq(iterator.closed, false, 'iterator remains unclosed');
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);