From 4887c76a6df5c0b0df4791399f7d5df50fbaa4ff Mon Sep 17 00:00:00 2001 From: Kevin Gibbons Date: Sat, 14 Dec 2024 21:07:24 -0800 Subject: [PATCH] add tests for "iterator helpers close receiver on argument validation failure" --- .../argument-validation-closes-underlying.js | 46 +++++++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 34 ++++++++++++++ .../argument-validation-closes-underlying.js | 46 +++++++++++++++++++ 10 files changed, 364 insertions(+) create mode 100644 test/built-ins/Iterator/prototype/drop/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/every/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/filter/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/find/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/flatMap/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/forEach/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/map/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/reduce/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/some/argument-validation-closes-underlying.js create mode 100644 test/built-ins/Iterator/prototype/take/argument-validation-closes-underlying.js diff --git a/test/built-ins/Iterator/prototype/drop/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/drop/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..9fa85f7c261 --- /dev/null +++ b/test/built-ins/Iterator/prototype/drop/argument-validation-closes-underlying.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.drop +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.drop ( limit ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(RangeError, function() { + closable.drop(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(RangeError, function() { + closable.drop(NaN); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(RangeError, function() { + closable.drop(-1); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(Test262Error, function() { + closable.drop({ get valueOf() { throw new Test262Error(); }}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/every/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/every/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..3a4b198c851 --- /dev/null +++ b/test/built-ins/Iterator/prototype/every/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.every +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.every ( predicate ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.every(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.every({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/filter/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/filter/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..d80f4f5be70 --- /dev/null +++ b/test/built-ins/Iterator/prototype/filter/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.filter +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.filter ( predicate ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.filter(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.filter({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/find/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/find/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..c2a0ec5473f --- /dev/null +++ b/test/built-ins/Iterator/prototype/find/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.find +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.find ( predicate ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.find(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.find({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/flatMap/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/flatMap/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..38bece1e0cc --- /dev/null +++ b/test/built-ins/Iterator/prototype/flatMap/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.flatMap +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.flatMap ( mapper ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.flatMap(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.flatMap({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/forEach/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/forEach/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..49dcac48923 --- /dev/null +++ b/test/built-ins/Iterator/prototype/forEach/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.forEach +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.forEach ( predicate ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.forEach(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.forEach({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/map/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/map/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..c0a3ee1f04b --- /dev/null +++ b/test/built-ins/Iterator/prototype/map/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.map +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.map ( mapper ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.map(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.map({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/reduce/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/reduce/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..61b35a32583 --- /dev/null +++ b/test/built-ins/Iterator/prototype/reduce/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.reduce +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.reduce ( reducer, [ initialValue ] ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.reduce(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.reduce({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/some/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/some/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..fef1d13672c --- /dev/null +++ b/test/built-ins/Iterator/prototype/some/argument-validation-closes-underlying.js @@ -0,0 +1,34 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.some +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.some ( predicate ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(TypeError, function() { + closable.some(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(TypeError, function() { + closable.some({}); +}); +assert.sameValue(closed, true); diff --git a/test/built-ins/Iterator/prototype/take/argument-validation-closes-underlying.js b/test/built-ins/Iterator/prototype/take/argument-validation-closes-underlying.js new file mode 100644 index 00000000000..ba3c0e1f5c0 --- /dev/null +++ b/test/built-ins/Iterator/prototype/take/argument-validation-closes-underlying.js @@ -0,0 +1,46 @@ +// Copyright (C) 2024 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.take +description: > + Underlying iterator is closed when argument validation fails +info: | + %Iterator.prototype%.take ( limit ) + +features: [iterator-helpers] +flags: [] +---*/ + +let closed = false; +let closable = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + }, +}; + +assert.throws(RangeError, function() { + closable.take(); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(RangeError, function() { + closable.take(NaN); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(RangeError, function() { + closable.take(-1); +}); +assert.sameValue(closed, true); + +closed = false; +assert.throws(Test262Error, function() { + closable.take({ get valueOf() { throw new Test262Error(); }}); +}); +assert.sameValue(closed, true);