diff --git a/test/built-ins/Iterator/prototype/drop/throws-typeerror-when-generator-is-running.js b/test/built-ins/Iterator/prototype/drop/throws-typeerror-when-generator-is-running.js new file mode 100644 index 0000000000..a6418dc314 --- /dev/null +++ b/test/built-ins/Iterator/prototype/drop/throws-typeerror-when-generator-is-running.js @@ -0,0 +1,39 @@ +// Copyright (C) 2023 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.drop +description: > + Throws a TypeError when the closure generator is already running. +info: | + %IteratorHelperPrototype%.next ( ) + 1. Return ? GeneratorResume(this value, undefined, "Iterator Helper"). + + 27.5.3.3 GeneratorResume ( generator, value, generatorBrand ) + 1. Let state be ? GeneratorValidate(generator, generatorBrand). + ... + + 27.5.3.2 GeneratorValidate ( generator, generatorBrand ) + ... + 6. If state is executing, throw a TypeError exception. + ... + +features: [iterator-helpers] +---*/ + +var enterCount = 0; + +class TestIterator extends Iterator { + next() { + enterCount++; + iter.next(); + return {done: false}; + } +} + +var iter = new TestIterator().drop(100); + +assert.throws(TypeError, function() { + iter.next(); +}); + +assert.sameValue(enterCount, 1); diff --git a/test/built-ins/Iterator/prototype/filter/throws-typeerror-when-generator-is-running.js b/test/built-ins/Iterator/prototype/filter/throws-typeerror-when-generator-is-running.js new file mode 100644 index 0000000000..6d89c8e90a --- /dev/null +++ b/test/built-ins/Iterator/prototype/filter/throws-typeerror-when-generator-is-running.js @@ -0,0 +1,46 @@ +// Copyright (C) 2023 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.filter +description: > + Throws a TypeError when the closure generator is already running. +info: | + %IteratorHelperPrototype%.next ( ) + 1. Return ? GeneratorResume(this value, undefined, "Iterator Helper"). + + 27.5.3.3 GeneratorResume ( generator, value, generatorBrand ) + 1. Let state be ? GeneratorValidate(generator, generatorBrand). + ... + + 27.5.3.2 GeneratorValidate ( generator, generatorBrand ) + ... + 6. If state is executing, throw a TypeError exception. + ... + +features: [iterator-helpers] +---*/ + +var loopCount = 0; + +function* g() { + while (true) { + loopCount++; + yield; + } +} + +var enterCount = 0; + +function predicate() { + enterCount++; + iter.next(); +} + +var iter = g().filter(predicate); + +assert.throws(TypeError, function() { + iter.next(); +}); + +assert.sameValue(loopCount, 1); +assert.sameValue(enterCount, 1); diff --git a/test/built-ins/Iterator/prototype/flatMap/throws-typeerror-when-generator-is-running.js b/test/built-ins/Iterator/prototype/flatMap/throws-typeerror-when-generator-is-running.js new file mode 100644 index 0000000000..106ae33b1e --- /dev/null +++ b/test/built-ins/Iterator/prototype/flatMap/throws-typeerror-when-generator-is-running.js @@ -0,0 +1,46 @@ +// Copyright (C) 2023 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.flatmap +description: > + Throws a TypeError when the closure generator is already running. +info: | + %IteratorHelperPrototype%.next ( ) + 1. Return ? GeneratorResume(this value, undefined, "Iterator Helper"). + + 27.5.3.3 GeneratorResume ( generator, value, generatorBrand ) + 1. Let state be ? GeneratorValidate(generator, generatorBrand). + ... + + 27.5.3.2 GeneratorValidate ( generator, generatorBrand ) + ... + 6. If state is executing, throw a TypeError exception. + ... + +features: [iterator-helpers] +---*/ + +var loopCount = 0; + +function* g() { + while (true) { + loopCount++; + yield; + } +} + +var enterCount = 0; + +function mapper() { + enterCount++; + iter.next(); +} + +var iter = g().flatMap(mapper); + +assert.throws(TypeError, function() { + iter.next(); +}); + +assert.sameValue(loopCount, 1); +assert.sameValue(enterCount, 1); diff --git a/test/built-ins/Iterator/prototype/map/throws-typeerror-when-generator-is-running.js b/test/built-ins/Iterator/prototype/map/throws-typeerror-when-generator-is-running.js new file mode 100644 index 0000000000..4050a77f31 --- /dev/null +++ b/test/built-ins/Iterator/prototype/map/throws-typeerror-when-generator-is-running.js @@ -0,0 +1,46 @@ +// Copyright (C) 2023 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.map +description: > + Throws a TypeError when the closure generator is already running. +info: | + %IteratorHelperPrototype%.next ( ) + 1. Return ? GeneratorResume(this value, undefined, "Iterator Helper"). + + 27.5.3.3 GeneratorResume ( generator, value, generatorBrand ) + 1. Let state be ? GeneratorValidate(generator, generatorBrand). + ... + + 27.5.3.2 GeneratorValidate ( generator, generatorBrand ) + ... + 6. If state is executing, throw a TypeError exception. + ... + +features: [iterator-helpers] +---*/ + +var loopCount = 0; + +function* g() { + while (true) { + loopCount++; + yield; + } +} + +var enterCount = 0; + +function mapper() { + enterCount++; + iter.next(); +} + +var iter = g().map(mapper); + +assert.throws(TypeError, function() { + iter.next(); +}); + +assert.sameValue(loopCount, 1); +assert.sameValue(enterCount, 1); diff --git a/test/built-ins/Iterator/prototype/take/throws-typeerror-when-generator-is-running.js b/test/built-ins/Iterator/prototype/take/throws-typeerror-when-generator-is-running.js new file mode 100644 index 0000000000..a83f1eeb70 --- /dev/null +++ b/test/built-ins/Iterator/prototype/take/throws-typeerror-when-generator-is-running.js @@ -0,0 +1,39 @@ +// Copyright (C) 2023 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteratorprototype.take +description: > + Throws a TypeError when the closure generator is already running. +info: | + %IteratorHelperPrototype%.next ( ) + 1. Return ? GeneratorResume(this value, undefined, "Iterator Helper"). + + 27.5.3.3 GeneratorResume ( generator, value, generatorBrand ) + 1. Let state be ? GeneratorValidate(generator, generatorBrand). + ... + + 27.5.3.2 GeneratorValidate ( generator, generatorBrand ) + ... + 6. If state is executing, throw a TypeError exception. + ... + +features: [iterator-helpers] +---*/ + +var enterCount = 0; + +class TestIterator extends Iterator { + next() { + enterCount++; + iter.next(); + return {done: false}; + } +} + +var iter = new TestIterator().take(100); + +assert.throws(TypeError, function() { + iter.next(); +}); + +assert.sameValue(enterCount, 1);