diff options
Diffstat (limited to 'js/src/tests/test262/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js')
-rw-r--r-- | js/src/tests/test262/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js b/js/src/tests/test262/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js new file mode 100644 index 0000000000..f75783bbed --- /dev/null +++ b/js/src/tests/test262/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js @@ -0,0 +1,52 @@ +// |reftest| skip -- set-methods is not supported +// Copyright (C) 2023 Anthony Frehner and Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-set.prototype.symmetricdifference +description: Set.prototype.symmetricDifference maintains values even when a custom Set-like class mutates the receiver +features: [set-methods] +includes: [compareArray.js] +---*/ + +const baseSet = new Set(["a", "b", "c", "d", "e"]); + +function mutatingIterator() { + let index = 0; + let values = ["x", "b", "c", "c"]; + return { + next() { + if (index === 0) { + baseSet.delete("b"); + baseSet.delete("c"); + baseSet.add("b"); + baseSet.add("d"); + } + return { + done: index >= values.length, + value: values[index++], + }; + }, + }; +} + +const evilSetLike = { + size: 4, + get has() { + baseSet.add("q"); + return function () { + throw new Test262Error("Set.prototype.symmetricDifference should not invoke .has on its argument"); + }; + }, + keys() { + return mutatingIterator(); + }, +}; + +const combined = baseSet.symmetricDifference(evilSetLike); +const expectedCombined = ["a", "c", "d", "e", "q", "x"]; +assert.compareArray([...combined], expectedCombined); + +const expectedNewBase = ["a", "d", "e", "q", "b"]; +assert.compareArray([...baseSet], expectedNewBase); + +reportCompare(0, 0); |