Add tests for recursively calling IteratorHelper generators

This commit is contained in:
André Bargull 2023-06-28 16:46:05 +02:00 committed by Philip Chimento
parent 8a7b686502
commit e273cd470a
5 changed files with 216 additions and 0 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);