import { assert, assertThrows } from "./assert.js";
function test_symbol_iterator_reentry() {
let it;
let calls = 0;
const evil = {
[Symbol.iterator]() {
calls++;
assertThrows(TypeError, () => it.return());
return [][Symbol.iterator]();
},
};
it = Iterator.concat(evil);
const result = it.next();
assert(calls, 1);
assert(result.done, true);
assert(result.value, undefined);
}
function test_next_getter_reentry() {
let it;
let calls = 0;
const evil = {
[Symbol.iterator]() {
return {
get next() {
calls++;
assertThrows(TypeError, () => it.return());
return () => ({ done: true, value: 1 });
},
};
},
};
it = Iterator.concat(evil);
const result = it.next();
assert(calls, 1);
assert(result.done, true);
assert(result.value, undefined);
}
function test_value_getter_reentry() {
let it;
let calls = 0;
const evil = {
[Symbol.iterator]() {
return {
next() {
return {
done: false,
get value() {
calls++;
assertThrows(TypeError, () => it.return());
return 1;
},
};
},
};
},
};
it = Iterator.concat(evil);
const result = it.next();
assert(calls, 1);
assert(result.done, false);
assert(result.value, 1);
}
test_symbol_iterator_reentry();
test_next_getter_reentry();
test_value_getter_reentry();