update tests for tc39/proposal-iterator-includes#15
diff --git a/test/built-ins/Iterator/prototype/includes/argument-effect-order.js b/test/built-ins/Iterator/prototype/includes/argument-effect-order.js index b9d4fcb..47544a1 100644 --- a/test/built-ins/Iterator/prototype/includes/argument-effect-order.js +++ b/test/built-ins/Iterator/prototype/includes/argument-effect-order.js
@@ -14,7 +14,15 @@ 5. Else if skippedElements is not one of +Infinity, -Infinity, or an integral Number, a. Let error be ThrowCompletion(a newly created TypeError object). b. Return ? IteratorClose(iterated, error). - 9. Set iterated to ? GetIteratorDirect(O). + 6. Else, let toSkip be skippedElements. + 7. If toSkip < -0F, then + a. Let error be ThrowCompletion(a newly created RangeError object). + b. Return ? IteratorClose(iterated, error). + 8. If toSkip is finite and toSkip > F(2**53 - 1), then + a. Let error be ThrowCompletion(a newly created RangeError object). + b. Return ? IteratorClose(iterated, error). + 9. Let skipped be +0F. + 10. Set iterated to ? GetIteratorDirect(O). includes: [compareArray.js] features: [iterator-includes] @@ -49,6 +57,29 @@ effects = []; +assert.throws(RangeError, function() { + Iterator.prototype.includes.call( + { + get next() { + effects.push('get next'); + return function() { + return { done: true, value: undefined }; + }; + }, + return() { + effects.push('return'); + return {}; + }, + }, + 0, + Number.MAX_SAFE_INTEGER + 1 + ); +}); + +assert.compareArray(effects, ['return']); + +effects = []; + Iterator.prototype.includes.call( { get next() {
diff --git a/test/built-ins/Iterator/prototype/includes/argument-validation-failure-closes-underlying.js b/test/built-ins/Iterator/prototype/includes/argument-validation-failure-closes-underlying.js index 36ca088..9402d06 100644 --- a/test/built-ins/Iterator/prototype/includes/argument-validation-failure-closes-underlying.js +++ b/test/built-ins/Iterator/prototype/includes/argument-validation-failure-closes-underlying.js
@@ -22,7 +22,13 @@ assert.throws(RangeError, function() { closable.includes(null, -2); }); -assert.sameValue(closed, true, 'iterator closed when skippedElements validation produces a RangeError'); +assert.sameValue(closed, true, 'iterator closed for negative skippedElements'); + +closed = false; +assert.throws(RangeError, function() { + closable.includes(null, Number.MAX_SAFE_INTEGER + 1); +}); +assert.sameValue(closed, true, 'iterator closed for too-large skippedElements'); closed = false; assert.throws(TypeError, function() {
diff --git a/test/built-ins/Iterator/prototype/includes/skipped-elements-large-integral.js b/test/built-ins/Iterator/prototype/includes/skipped-elements-max-safe-integer.js similarity index 63% rename from test/built-ins/Iterator/prototype/includes/skipped-elements-large-integral.js rename to test/built-ins/Iterator/prototype/includes/skipped-elements-max-safe-integer.js index 1e90b70..5cd01eb 100644 --- a/test/built-ins/Iterator/prototype/includes/skipped-elements-large-integral.js +++ b/test/built-ins/Iterator/prototype/includes/skipped-elements-max-safe-integer.js
@@ -3,17 +3,18 @@ /*--- esid: sec-iterator.prototype.includes description: > - Large integral Number skippedElements values (above Number.MAX_SAFE_INTEGER) are accepted + skippedElements of Number.MAX_SAFE_INTEGER is accepted features: [iterator-includes] ---*/ let returnCalls = 0; -let counter = 0; +let nextCalls = 0; let iter = { __proto__: Iterator.prototype, next() { - if (counter < 10) { - return { done: false, value: counter++ }; + ++nextCalls; + if (nextCalls === 1) { + return { done: false, value: 0 }; } return { done: true, value: undefined }; }, @@ -23,5 +24,6 @@ }, }; -assert.sameValue(iter.includes(1, 2 ** 53 + 4), false); +assert.sameValue(iter.includes(0, Number.MAX_SAFE_INTEGER), false); assert.sameValue(returnCalls, 0); +assert.sameValue(nextCalls, 2);
diff --git a/test/built-ins/Iterator/prototype/includes/skipped-elements-too-large-rangeerror.js b/test/built-ins/Iterator/prototype/includes/skipped-elements-too-large-rangeerror.js new file mode 100644 index 0000000..6996982 --- /dev/null +++ b/test/built-ins/Iterator/prototype/includes/skipped-elements-too-large-rangeerror.js
@@ -0,0 +1,31 @@ +// Copyright (C) 2026 Michael Ficarra. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iterator.prototype.includes +description: > + Finite skippedElements values greater than Number.MAX_SAFE_INTEGER throw RangeError and close the iterator +features: [iterator-includes] +---*/ + +function assertRangeErrorAndClosed(skippedElements, label) { + let closed = false; + let iterator = { + __proto__: Iterator.prototype, + get next() { + throw new Test262Error('next should not be read'); + }, + return() { + closed = true; + return {}; + }, + }; + + assert.throws(RangeError, function() { + iterator.includes(0, skippedElements); + }, label + ': throws RangeError'); + + assert.sameValue(closed, true, label + ': iterator closed'); +} + +assertRangeErrorAndClosed(Number.MAX_SAFE_INTEGER + 1, 'Number.MAX_SAFE_INTEGER + 1'); +assertRangeErrorAndClosed(Number.MAX_SAFE_INTEGER + 3, 'Number.MAX_SAFE_INTEGER + 3');