Bug 1892041 - Part 2: Update test262. r=spidermonkey-reviewers,dminor
[gecko.git] / js / src / tests / test262 / built-ins / Set / prototype / symmetricDifference / set-like-class-order.js
blob5b904810a9d663e78b64e18c80a3ce5381bb0e85
1 // |reftest| skip -- set-methods is not supported
2 // Copyright (C) 2023 Anthony Frehner and Kevin Gibbons. All rights reserved.
3 // This code is governed by the BSD license found in the LICENSE file.
4 /*---
5 esid: sec-set.prototype.symmetricdifference
6 description: Set.prototype.symmetricDifference calls a Set-like class's methods in order
7 features: [set-methods]
8 includes: [compareArray.js]
9 ---*/
11 let observedOrder = [];
13 function observableIterator() {
14   let values = ["a", "b", "c"];
15   let index = 0;
16   return {
17     get next() {
18       observedOrder.push("getting next");
19       return function () {
20         observedOrder.push("calling next");
21         return {
22           get done() {
23             observedOrder.push("getting done");
24             return index >= values.length;
25           },
26           get value() {
27             observedOrder.push("getting value");
28             return values[index++];
29           },
30         };
31       };
32     },
33   };
36 class MySetLike {
37   get size() {
38     observedOrder.push("getting size");
39     return {
40       valueOf: function () {
41         observedOrder.push("ToNumber(size)");
42         return 2;
43       },
44     };
45   }
46   get has() {
47     observedOrder.push("getting has");
48     return function () {
49       throw new Test262Error("Set.prototype.symmetricDifference should not invoke .has on its argument");
50     };
51   }
52   get keys() {
53     observedOrder.push("getting keys");
54     return function () {
55       observedOrder.push("calling keys");
56       return observableIterator();
57     };
58   }
61 // this is smaller than argument
63   observedOrder = [];
65   const s1 = new Set(["a", "d"]);
66   const s2 = new MySetLike();
67   const combined = s1.symmetricDifference(s2);
69   const expectedOrder = [
70     "getting size",
71     "ToNumber(size)",
72     "getting has",
73     "getting keys",
74     "calling keys",
75     "getting next",
76     // first iteration, has value
77     "calling next",
78     "getting done",
79     "getting value",
80     // second iteration, has value
81     "calling next",
82     "getting done",
83     "getting value",
84     // third iteration, has value
85     "calling next",
86     "getting done",
87     "getting value",
88     // fourth iteration, no value; ends
89     "calling next",
90     "getting done",
91   ];
93   assert.compareArray([...combined], ["d", "b", "c"]);
94   assert.compareArray(observedOrder, expectedOrder);
97 // this is same size as argument
99   observedOrder = [];
101   const s1 = new Set(["a", "b", "d"]);
102   const s2 = new MySetLike();
103   const combined = s1.symmetricDifference(s2);
105   const expectedOrder = [
106     "getting size",
107     "ToNumber(size)",
108     "getting has",
109     "getting keys",
110     "calling keys",
111     "getting next",
112     // first iteration, has value
113     "calling next",
114     "getting done",
115     "getting value",
116     // second iteration, has value
117     "calling next",
118     "getting done",
119     "getting value",
120     // third iteration, has value
121     "calling next",
122     "getting done",
123     "getting value",
124     // fourth iteration, no value; ends
125     "calling next",
126     "getting done",
127   ];
129   assert.compareArray([...combined], ["d", "c"]);
130   assert.compareArray(observedOrder, expectedOrder);
133 // this is larger than argument
135   observedOrder = [];
137   const s1 = new Set(["a", "b", "d", "e"]);
138   const s2 = new MySetLike();
139   const combined = s1.symmetricDifference(s2);
141   const expectedOrder = [
142     "getting size",
143     "ToNumber(size)",
144     "getting has",
145     "getting keys",
146     "calling keys",
147     "getting next",
148     // first iteration, has value
149     "calling next",
150     "getting done",
151     "getting value",
152     // second iteration, has value
153     "calling next",
154     "getting done",
155     "getting value",
156     // third iteration, has value
157     "calling next",
158     "getting done",
159     "getting value",
160     // fourth iteration, no value; ends
161     "calling next",
162     "getting done",
163   ];
165   assert.compareArray([...combined], ["d", "e", "c"]);
166   assert.compareArray(observedOrder, expectedOrder);
169 reportCompare(0, 0);