From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../AsyncIterator/prototype/every/async-writes.js | 20 ++++++++++ .../every/check-fn-after-getting-iterator.js | 30 ++++++++++++++ .../prototype/every/coerce-result-to-boolean.js | 29 ++++++++++++++ .../AsyncIterator/prototype/every/descriptor.js | 10 +++++ .../prototype/every/error-from-correct-realm.js | 21 ++++++++++ .../prototype/every/fn-not-callable-throws.js | 26 ++++++++++++ .../prototype/every/fn-throws-close-iterator.js | 24 +++++++++++ .../prototype/every/interleaving-calls.js | 24 +++++++++++ .../non262/AsyncIterator/prototype/every/length.js | 17 ++++++++ .../non262/AsyncIterator/prototype/every/name.js | 13 ++++++ .../every/next-throws-iterator-not-closed.js | 24 +++++++++++ .../non262/AsyncIterator/prototype/every/proxy.js | 46 ++++++++++++++++++++++ .../prototype/every/return-true-if-all-match.js | 16 ++++++++ .../prototype/every/short-circuit-on-false.js | 21 ++++++++++ .../prototype/every/this-not-iterator-throws.js | 22 +++++++++++ .../every/value-throws-iterator-not-closed.js | 28 +++++++++++++ 16 files changed, 371 insertions(+) create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/length.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/name.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/proxy.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js create mode 100644 js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js (limited to 'js/src/tests/non262/AsyncIterator/prototype/every') diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js new file mode 100644 index 0000000000..655dfd2624 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/async-writes.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +let x = {a: () => true}; + +async function* gen() { + yield x.a(); + yield x.a(); +} + +gen().every(() => true).then( + () => assertEq(true, false, 'expected error'), + err => assertEq(err instanceof Error, true), +); + +x.a = () => { + throw Error(); +}; + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js new file mode 100644 index 0000000000..ee147ab14b --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/check-fn-after-getting-iterator.js @@ -0,0 +1,30 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) +const log = []; +const handlerProxy = new Proxy({}, { + get: (target, key, receiver) => (...args) => { + log.push(`${key}: ${args[1]?.toString()}`); + return Reflect[key](...args); + }, +}); + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({done: true}); + } +} + +async function* gen() { + yield 1; +} + +const iter = new Proxy(new TestIterator(), handlerProxy); +iter.every(1).then(() => assertEq(true, false, 'expected error'), err => assertEq(err instanceof TypeError, true)); + +assertEq( + log.join('\n'), + `get: every +get: next` +); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js new file mode 100644 index 0000000000..35c40d235e --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/coerce-result-to-boolean.js @@ -0,0 +1,29 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +async function* gen(value) { + yield value; +} +const fn = x => x; +function check(value, expected) { + gen(value).every(fn).then(result => assertEq(result, expected)); +} + +check(true, true); +check(1, true); +check([], true); +check({}, true); +check('test', true); + +check(false, false); +check(0, false); +check('', false); +check(null, false); +check(undefined, false); +check(NaN, false); +check(-0, false); +check(0n, false); +check(createIsHTMLDDA(), false); +check(Promise.resolve(false), false); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js new file mode 100644 index 0000000000..180085cefe --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/descriptor.js @@ -0,0 +1,10 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype, 'every'); +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/AsyncIterator/prototype/every/error-from-correct-realm.js b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js new file mode 100644 index 0000000000..2ff93254ce --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/error-from-correct-realm.js @@ -0,0 +1,21 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +const otherGlobal = newGlobal({newCompartment: true}); +assertEq(TypeError !== otherGlobal.TypeError, true); + +async function *gen() {} + +gen().every().then(() => assertEq(true, false, 'expected error'), err => { + assertEq(err instanceof TypeError, true); +}); + +otherGlobal.AsyncIterator.prototype.every.call(gen()).then(() => assertEq(true, false, 'expected error'), err => { + assertEq( + err instanceof otherGlobal.TypeError, + true, + 'TypeError comes from the realm of the method.', + ); +}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js new file mode 100644 index 0000000000..025c46dfdf --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-not-callable-throws.js @@ -0,0 +1,26 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +async function *gen() { + yield 1; +} + +function check(fn) { + gen().every(fn).then(() => { + throw new Error('every should have thrown'); + }, + (err) => { + assertEq(err instanceof TypeError, true); + }); +} + +check(); +check(undefined); +check(null); +check(0); +check(false); +check(''); +check(Symbol('')); +check({}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js new file mode 100644 index 0000000000..2a18d2ab45 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/fn-throws-close-iterator.js @@ -0,0 +1,24 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ done: this.closed }); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => { throw new Error(); }; +const iter = new TestIterator(); + +assertEq(iter.closed, false); +iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => { + assertEq(err instanceof Error, true); + assertEq(iter.closed, true); +}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js new file mode 100644 index 0000000000..8aacdb4316 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/interleaving-calls.js @@ -0,0 +1,24 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +const log = []; +async function* gen(n) { + log.push(`${n}`); + yield 1; + log.push(`${n}`); + yield 2; +} + +Promise.all([gen(1).every(() => true), gen(2).every(() => true)]).then( + () => { + assertEq( + log.join(' '), + '1 2 1 2', + ); + }, + err => { + throw err; + } +); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/length.js b/js/src/tests/non262/AsyncIterator/prototype/every/length.js new file mode 100644 index 0000000000..58d7942018 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/length.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) +/*--- + The `length` property of AsyncIterator.prototype.every. +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(AsyncIterator.prototype.every, '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/AsyncIterator/prototype/every/name.js b/js/src/tests/non262/AsyncIterator/prototype/every/name.js new file mode 100644 index 0000000000..086bfb13a6 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/name.js @@ -0,0 +1,13 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) +/*--- + `name` property of AsyncIterator.prototype.every. +---*/ + +const propDesc = Reflect.getOwnPropertyDescriptor(AsyncIterator.prototype.every, 'name'); +assertEq(propDesc.value, 'every'); +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/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js new file mode 100644 index 0000000000..98cc850a07 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/next-throws-iterator-not-closed.js @@ -0,0 +1,24 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +class TestIterator extends AsyncIterator { + next() { + throw new Error(); + } + + closed = false; + return() { + this.closed = true; + } +} + +const fn = () => {}; +const iter = new TestIterator(); + +assertEq(iter.closed, false); +iter.every(fn).then(() => assertEq(true, false, 'expected error'), err => { + assertEq(err instanceof Error, true); + assertEq(iter.closed, false); +}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js new file mode 100644 index 0000000000..628f143e27 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/proxy.js @@ -0,0 +1,46 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) +// +// This test checks that %AsyncIterator.prototype%.every only gets the `next` method off of the +// iterator once, and never accesses the @@asyncIterator 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 AsyncIterator { + value = 0; + next() { + const value = this.value; + if (value < 2) { + this.value = value + 1; + return Promise.resolve({done: false, value}); + } + return Promise.resolve({done: true}); + } +} + +const iter = new Proxy(new Counter(), handlerProxy); +iter.every(x => x % 2 == 0).then(value => { + assertEq(value, false) + + assertEq( + log.join('\n'), + `get: every +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/AsyncIterator/prototype/every/return-true-if-all-match.js b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js new file mode 100644 index 0000000000..01d0f75d58 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/return-true-if-all-match.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +async function* gen() { + yield 1; + yield 3; + yield 5; +} +const fn = x => x % 2 == 1; + +gen().every(fn).then(result => assertEq(result, true)); + +async function* empty() {} +empty().every(x => x).then(result => assertEq(result, true)); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js new file mode 100644 index 0000000000..7b2c74d513 --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/short-circuit-on-false.js @@ -0,0 +1,21 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +async function* gen() { + yield 1; + yield 2; + yield 3; +} + +const log = []; +const fn = value => { + log.push(value.toString()); + return value % 2 == 1; +}; + +gen().every(fn).then(result => { + assertEq(result, false); + assertEq(log.join(','), '1,2'); +}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js new file mode 100644 index 0000000000..ed576c32ec --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/this-not-iterator-throws.js @@ -0,0 +1,22 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +const fn = x => x; + +function check(x) { + AsyncIterator.prototype.every.call(x, fn).then( + () => { + throw new Error('check should have been rejected'); + }, + err => { + assertEq(err instanceof TypeError, true); + } + ); +} + +check(); +check(undefined); +check({}); +check({next: 0}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); diff --git a/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js new file mode 100644 index 0000000000..423a85ca7b --- /dev/null +++ b/js/src/tests/non262/AsyncIterator/prototype/every/value-throws-iterator-not-closed.js @@ -0,0 +1,28 @@ +// |reftest| skip-if(!this.hasOwnProperty('AsyncIterator')) + +class TestError extends Error {} +class TestIterator extends AsyncIterator { + next() { + return Promise.resolve({ + done: false, + get value() { + throw new TestError(); + } + }); + } + + closed = false; + return() { + closed = true; + } +} + +const iterator = new TestIterator(); +assertEq(iterator.closed, false, 'iterator starts unclosed'); +iterator.every(x => x).then(() => assertEq(true, false, 'expected error'), err => { + assertEq(err instanceof TestError, true); + assertEq(iterator.closed, false, 'iterator remains unclosed'); +}); + +if (typeof reportCompare === 'function') + reportCompare(0, 0); -- cgit v1.2.3