Files
sausage/userland/qjs/source/tests/bug1693.js
T
surma d44f1d9677 Build separate native and WASI pipelines with shared multicall names
Checkpoint before integration and package validation.

Assisted-by: SurmAgent:unknown [read] [edit] [bash]
2026-11-12 09:36:27 +00:00

81 lines
1.9 KiB
JavaScript

// https://github.com/quickjs-ng/quickjs/issues/1693
import { assert, assertThrows } from "./assert.js";
class NextGetterError extends Error {}
assertThrows(NextGetterError, () => Iterator.from({
[Symbol.iterator]() {
return {
get next() {
throw new NextGetterError();
},
};
},
}));
let nextGets = 0;
let nextCalls = 0;
const inner = {
get next() {
nextGets++;
return function () {
nextCalls++;
return { value: nextCalls, done: nextCalls > 2 };
};
},
};
const wrapped = Iterator.from({
[Symbol.iterator]() {
return inner;
},
});
assert(wrapped === inner, false);
assert(wrapped instanceof Iterator, true);
assert(nextGets, 1);
assert(wrapped.next().value, 1);
assert(wrapped.next().value, 2);
assert(wrapped.next().done, true);
assert(nextGets, 1);
assert(nextCalls, 3);
class RedirectingIterator extends Iterator {
next() {
return { done: true };
}
[Symbol.iterator]() {
return inner;
}
}
const redirected = Iterator.from(new RedirectingIterator());
assert(redirected instanceof Iterator, true);
assert(redirected === inner, false);
assert(redirected instanceof RedirectingIterator, false);
assert(nextGets, 2);
let instanceNextGets = 0;
let instanceIteratorGets = 0;
let instanceIteratorCalls = 0;
class ExistingIterator extends Iterator {
get [Symbol.iterator]() {
instanceIteratorGets++;
return function () {
instanceIteratorCalls++;
return this;
};
}
get next() {
instanceNextGets++;
return function () {
return { done: true };
};
}
}
const existing = new ExistingIterator();
assert(Iterator.from(existing) === existing, true);
assert(instanceIteratorGets, 1);
assert(instanceIteratorCalls, 1);
assert(instanceNextGets, 1);