Skip to content

Commit 2bd60e8

Browse files
committed
Add tests for Set iterator mutation and exhaustion behavior
1 parent a7c06f1 commit 2bd60e8

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

test/unit/builtins/set.spec.ts

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,46 @@ describe.each(iterationMethods)("set.%s() preserves insertion order", iterationM
195195
});
196196
});
197197

198-
test("set iterator persists after delete", () => {
199-
util.testFunction`
200-
const set1 = new Set<string | number>();
201-
set1.add(42);
202-
set1.add("forty two");
198+
describe.each(iterationMethods)("set.%s() handles mutation", iterationMethod => {
199+
test("iterator persists after delete", () => {
200+
util.testFunction`
201+
const set1 = new Set<string | number>();
202+
set1.add(42);
203+
set1.add("forty two");
203204
204-
const iterator1 = set1.values();
205-
set1.delete(42);
205+
const iterator1 = set1.${iterationMethod}();
206+
set1.delete(42);
206207
207-
return iterator1.next().value;
208-
`.expectToMatchJsResult();
208+
return iterator1.next().value;
209+
`.expectToMatchJsResult();
210+
});
211+
212+
test("iterator with delete and add between iterations", () => {
213+
util.testFunction`
214+
const set = new Set([1, 2, 3]);
215+
const iter = set.${iterationMethod}();
216+
iter.next(); // 1
217+
set.delete(2);
218+
set.add(4);
219+
const results: IteratorResult<any>[] = [];
220+
let r = iter.next();
221+
while (!r.done) { results.push({ done: r.done, value: r.value }); r = iter.next(); }
222+
return results;
223+
`.expectToMatchJsResult();
224+
});
225+
226+
test("iterator does not restart after exhaustion", () => {
227+
util.testFunction`
228+
const set = new Set([1, 2]);
229+
const iter = set.${iterationMethod}();
230+
const results: boolean[] = [];
231+
results.push(iter.next().done!);
232+
results.push(iter.next().done!);
233+
results.push(iter.next().done!); // should be done
234+
results.push(iter.next().done!); // should still be done, not restart
235+
return results;
236+
`.expectToMatchJsResult();
237+
});
209238
});
210239

211240
test("instanceof Set without creating set", () => {

0 commit comments

Comments
 (0)