Skip to content

Commit

Permalink
Add tests for recursively calling IteratorHelper generators
Browse files Browse the repository at this point in the history
  • Loading branch information
anba authored and ptomato committed Aug 24, 2023
1 parent 8a7b686 commit 7990cd5
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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);
Original file line number Diff line number Diff line change
@@ -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);
Original file line number Diff line number Diff line change
@@ -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);
Original file line number Diff line number Diff line change
@@ -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);
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 7990cd5

Please sign in to comment.