Checkpoint before integration and package validation. Assisted-by: SurmAgent:unknown [read] [edit] [bash]
81 lines
1.9 KiB
JavaScript
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);
|