@@ -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
211240test ( "instanceof Set without creating set" , ( ) => {
0 commit comments