blob: 05e17741d6862886be52ea2abe502bb798716fe8 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5(function testSpreadCallsStrict() {
6 "use strict"
7 function countArgs() { return arguments.length; }
8
9 // Test this argument
10 function returnThis() { return this; }
11 assertEquals(void 0, returnThis(..."test"));
12
13 // Test argument counting with different iterables
14 assertEquals(0, countArgs(...""));
15 assertEquals(4, countArgs(..."test"));
16 assertEquals(4, countArgs(..."tes", ..."t"));
17 assertEquals(4, countArgs("t", ..."es", "t"));
18 assertEquals(4, countArgs("tes", ..."t!!"));
19
20 assertEquals(1, countArgs(...[1]));
21 assertEquals(2, countArgs(...[1, 2]));
22 assertEquals(3, countArgs(...[1, 2, 3]));
23 assertEquals(4, countArgs(...[1, 2, 3, 4]));
24 assertEquals(5, countArgs(...[1, 2, 3, 4, 5]));
25 assertEquals(6, countArgs(...[1, 2, 3, 4, 5, 6]));
26
27 assertEquals(1, countArgs(...new Set([1])));
28 assertEquals(2, countArgs(...new Set([1, 2])));
29 assertEquals(3, countArgs(...new Set([1, 2, 3])));
30 assertEquals(4, countArgs(...new Set([1, 2, 3, 4])));
31 assertEquals(5, countArgs(...new Set([1, 2, 3, 4, 5])));
32 assertEquals(6, countArgs(...new Set([1, 2, 3, 4, 5, 6])));
33
34 assertEquals(3, countArgs(...(function*(){ yield 1; yield 2; yield 3; })()));
35
36 // Test values
37 function sum() {
38 var sum = arguments[0];
39 for (var i = 1; i < arguments.length; ++i) {
40 sum += arguments[i];
41 }
42 return sum;
43 }
44
45 assertEquals(void 0, sum(...""));
46 assertEquals(void 0, sum(...[]));
47 assertEquals(void 0, sum(...new Set));
48 assertEquals(void 0, sum(...(function*() { })()));
49
50 assertEquals("test", sum(..."test"));
51 assertEquals(10, sum(...[1, 2, 3, 4]));
52 assertEquals(10, sum(...[1, 2, 3], 4));
53 assertEquals(10, sum(1, ...[2, 3], 4));
54 assertEquals(10, sum(1, ...[2, 3], ...[4]));
55 assertEquals(10, sum(1, 2, ...[3, 4]));
56 assertEquals(10, sum(...new Set([1, 2, 3, 4])));
57 assertEquals(10, sum(...(function*() {
58 yield 1;
59 yield 2;
60 yield 3;
61 yield 4;
62 })()));
63
64 // nested spreads
65 function makeArray() {
66 var result = [];
67 for (var i = 0; i < arguments.length; ++i) {
68 result.push(arguments[i]);
69 }
70 return result;
71 }
72 assertEquals(10, sum(...makeArray(...[1, 2, 3, 4])));
73 assertEquals("test!!!", sum(...makeArray(..."test!!!")));
74
75 // Interleaved spread/unspread args
76 assertEquals(36, sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8));
77 assertEquals(45, sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8, ...[9]));
78
79 // Methods
80 var O = {
81 returnThis: returnThis,
82 countArgs: countArgs,
83 sum: sum,
84 makeArray: makeArray,
85
86 nested: {
87 returnThis: returnThis,
88 countArgs: countArgs,
89 sum: sum,
90 makeArray: makeArray
91 }
92 };
93
94 // Test this argument
95 assertEquals(O, O.returnThis(..."test"));
96 assertEquals(O, O["returnThis"](..."test"));
97 assertEquals(O.nested, O.nested.returnThis(..."test"));
98 assertEquals(O.nested, O.nested["returnThis"](..."test"));
99
100 // Test argument counting with different iterables
101 assertEquals(0, O.countArgs(...""));
102 assertEquals(4, O.countArgs(..."test"));
103 assertEquals(4, O.countArgs(..."tes", ..."t"));
104 assertEquals(4, O.countArgs("t", ..."es", "t"));
105 assertEquals(4, O.countArgs("tes", ..."t!!"));
106
107 assertEquals(1, O.countArgs(...[1]));
108 assertEquals(2, O.countArgs(...[1, 2]));
109 assertEquals(3, O.countArgs(...[1, 2, 3]));
110 assertEquals(4, O.countArgs(...[1, 2, 3, 4]));
111 assertEquals(5, O.countArgs(...[1, 2, 3, 4, 5]));
112 assertEquals(6, O.countArgs(...[1, 2, 3, 4, 5, 6]));
113
114 assertEquals(1, O.countArgs(...new Set([1])));
115 assertEquals(2, O.countArgs(...new Set([1, 2])));
116 assertEquals(3, O.countArgs(...new Set([1, 2, 3])));
117 assertEquals(4, O.countArgs(...new Set([1, 2, 3, 4])));
118 assertEquals(5, O.countArgs(...new Set([1, 2, 3, 4, 5])));
119 assertEquals(6, O.countArgs(...new Set([1, 2, 3, 4, 5, 6])));
120
121 assertEquals(3, O.countArgs(
122 ...(function*(){ yield 1; yield 2; yield 3; })()));
123
124 // Test values
125 assertEquals(void 0, O.sum(...""));
126 assertEquals(void 0, O.sum(...[]));
127 assertEquals(void 0, O.sum(...new Set));
128 assertEquals(void 0, O.sum(...(function*() { })()));
129
130 assertEquals("test", O.sum(..."test"));
131 assertEquals(10, O.sum(...[1, 2, 3, 4]));
132 assertEquals(10, O.sum(...[1, 2, 3], 4));
133 assertEquals(10, O.sum(1, ...[2, 3], 4));
134 assertEquals(10, O.sum(1, ...[2, 3], ...[4]));
135 assertEquals(10, O.sum(1, 2, ...[3, 4]));
136 assertEquals(10, O.sum(...new Set([1, 2, 3, 4])));
137 assertEquals(10, O.sum(...(function*() {
138 yield 1;
139 yield 2;
140 yield 3;
141 yield 4;
142 })()));
143
144 // nested spreads
145 assertEquals(10, O.sum(...O.makeArray(...[1, 2, 3, 4])));
146 assertEquals("test!!!", O.sum(...O.makeArray(..."test!!!")));
147
148 // Interleaved spread/unspread args
149 assertEquals(36, O.sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8));
150 assertEquals(45, O.sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8, ...[9]));
151})();
152
153
154(function testSpreadCallsSloppy() {
155 // Test this argument
156 function returnThis() { return this; }
157 assertEquals(this, returnThis(..."test"));
158
159 function countArgs() { return arguments.length; }
160
161 // Test argument counting with different iterables
162 assertEquals(0, countArgs(...""));
163 assertEquals(4, countArgs(..."test"));
164 assertEquals(4, countArgs(..."tes", ..."t"));
165 assertEquals(4, countArgs("t", ..."es", "t"));
166 assertEquals(4, countArgs("tes", ..."t!!"));
167
168 assertEquals(1, countArgs(...[1]));
169 assertEquals(2, countArgs(...[1, 2]));
170 assertEquals(3, countArgs(...[1, 2, 3]));
171 assertEquals(4, countArgs(...[1, 2, 3, 4]));
172 assertEquals(5, countArgs(...[1, 2, 3, 4, 5]));
173 assertEquals(6, countArgs(...[1, 2, 3, 4, 5, 6]));
174
175 assertEquals(1, countArgs(...new Set([1])));
176 assertEquals(2, countArgs(...new Set([1, 2])));
177 assertEquals(3, countArgs(...new Set([1, 2, 3])));
178 assertEquals(4, countArgs(...new Set([1, 2, 3, 4])));
179 assertEquals(5, countArgs(...new Set([1, 2, 3, 4, 5])));
180 assertEquals(6, countArgs(...new Set([1, 2, 3, 4, 5, 6])));
181
182 assertEquals(3, countArgs(...(function*(){
183 yield 1;
184 yield 2;
185 yield 3;
186 })()));
187
188 // Test values
189 function sum() {
190 var sum = arguments[0];
191 for (var i = 1; i < arguments.length; ++i) {
192 sum += arguments[i];
193 }
194 return sum;
195 }
196
197 assertEquals(void 0, sum(...""));
198 assertEquals(void 0, sum(...[]));
199 assertEquals(void 0, sum(...new Set));
200 assertEquals(void 0, sum(...(function*() { })()));
201
202 assertEquals("test", sum(..."test"));
203 assertEquals(10, sum(...[1, 2, 3, 4]));
204 assertEquals(10, sum(...[1, 2, 3], 4));
205 assertEquals(10, sum(1, ...[2, 3], 4));
206 assertEquals(10, sum(1, ...[2, 3], ...[4]));
207 assertEquals(10, sum(1, 2, ...[3, 4]));
208 assertEquals(10, sum(...new Set([1, 2, 3, 4])));
209 assertEquals(10, sum(...(function*() {
210 yield 1;
211 yield 2;
212 yield 3;
213 yield 4;
214 })()));
215
216 // nested spreads
217 function makeArray() {
218 var result = [];
219 for (var i = 0; i < arguments.length; ++i) {
220 result.push(arguments[i]);
221 }
222 return result;
223 }
224 assertEquals(10, sum(...makeArray(...[1, 2, 3, 4])));
225 assertEquals("test!!!", sum(...makeArray(..."test!!!")));
226
227 // Interleaved spread/unspread args
228 assertEquals(36, sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8));
229 assertEquals(45, sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8, ...[9]));
230
231 // Methods
232 var O = {
233 returnThis: returnThis,
234 countArgs: countArgs,
235 sum: sum,
236 makeArray: makeArray,
237
238 nested: {
239 returnThis: returnThis,
240 countArgs: countArgs,
241 sum: sum,
242 makeArray: makeArray
243 }
244 };
245
246 // Test this argument
247 assertEquals(O, O.returnThis(..."test"));
248 assertEquals(O, O["returnThis"](..."test"));
249 assertEquals(O.nested, O.nested.returnThis(..."test"));
250 assertEquals(O.nested, O.nested["returnThis"](..."test"));
251
252 // Test argument counting with different iterables
253 assertEquals(0, O.countArgs(...""));
254 assertEquals(4, O.countArgs(..."test"));
255 assertEquals(4, O.countArgs(..."tes", ..."t"));
256 assertEquals(4, O.countArgs("t", ..."es", "t"));
257 assertEquals(4, O.countArgs("tes", ..."t!!"));
258
259 assertEquals(1, O.countArgs(...[1]));
260 assertEquals(2, O.countArgs(...[1, 2]));
261 assertEquals(3, O.countArgs(...[1, 2, 3]));
262 assertEquals(4, O.countArgs(...[1, 2, 3, 4]));
263 assertEquals(5, O.countArgs(...[1, 2, 3, 4, 5]));
264 assertEquals(6, O.countArgs(...[1, 2, 3, 4, 5, 6]));
265
266 assertEquals(1, O.countArgs(...new Set([1])));
267 assertEquals(2, O.countArgs(...new Set([1, 2])));
268 assertEquals(3, O.countArgs(...new Set([1, 2, 3])));
269 assertEquals(4, O.countArgs(...new Set([1, 2, 3, 4])));
270 assertEquals(5, O.countArgs(...new Set([1, 2, 3, 4, 5])));
271 assertEquals(6, O.countArgs(...new Set([1, 2, 3, 4, 5, 6])));
272
273 assertEquals(3, O.countArgs(...(function*(){
274 yield 1;
275 yield 2;
276 yield 3;
277 })()));
278
279 // Test values
280 assertEquals(void 0, O.sum(...""));
281 assertEquals(void 0, O.sum(...[]));
282 assertEquals(void 0, O.sum(...new Set));
283 assertEquals(void 0, O.sum(...(function*() { })()));
284
285 assertEquals("test", O.sum(..."test"));
286 assertEquals(10, O.sum(...[1, 2, 3, 4]));
287 assertEquals(10, O.sum(...[1, 2, 3], 4));
288 assertEquals(10, O.sum(1, ...[2, 3], 4));
289 assertEquals(10, O.sum(1, ...[2, 3], ...[4]));
290 assertEquals(10, O.sum(1, 2, ...[3, 4]));
291 assertEquals(10, O.sum(...new Set([1, 2, 3, 4])));
292 assertEquals(10, O.sum(...(function*() {
293 yield 1;
294 yield 2;
295 yield 3;
296 yield 4;
297 })()));
298
299 // nested spreads
300 assertEquals(10, O.sum(...O.makeArray(...[1, 2, 3, 4])));
301 assertEquals("test!!!", O.sum(...O.makeArray(..."test!!!")));
302
303 // Interleaved spread/unspread args
304 assertEquals(36, O.sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8));
305 assertEquals(45, O.sum(0, ...[1], 2, 3, ...[4, 5], 6, 7, 8, ...[9]));
306})();
307
308
309(function testSpreadEvaluationOrder() {
310 "use strict";
311 var log = "";
312 function* gen() { log += "X"; yield 0; log += "Y"; }
313 function a() { log += "A"; }
314 function b() { log += "B"; return gen(); }
315 function* c() { log += 'C1'; yield 1; log += 'C2'; }
316 function d() { log += "D"; }
317 function e() { log += "E"; }
318 function fn() {
319 var args = [];
320 for (var i = 0; i < arguments.length; ++i) args.push(arguments[i]);
321 return args;
322 }
323
324 var result = fn(a(), ...b(), d());
325 assertEquals([undefined, 0, undefined], result);
326 assertEquals("ABXYD", log);
327
328 log = "";
329 result = fn(...b(), d());
330 assertEquals([0, undefined], result);
331 assertEquals("BXYD", log);
332
333 log = "";
334 result = fn(a(), ...b());
335 assertEquals([undefined, 0], result);
336 assertEquals("ABXY", log);
337
338 log = "";
339 result = fn(a(), ...b(), ...c(), d(), e());
340 assertEquals([undefined, 0, 1, undefined, undefined], result);
341 assertEquals("ABXYC1C2DE", log);
342
343 log = "";
344 result = fn(a(), ...b(), ...c(), d(), e(), ...b(), ...c());
345 assertEquals([undefined, 0, 1, undefined, undefined, 0, 1], result);
346 assertEquals("ABXYC1C2DEBXYC1C2", log);
347})();
348
349
350(function testCustomArrayPrototypeIterator() {
351 var origIterator =
352 Object.getOwnPropertyDescriptor(Array.prototype, Symbol.iterator);
353 Object.defineProperty(Array.prototype, Symbol.iterator, {
354 value: function*() {
355 yield 1;
356 yield 2;
357 yield 3;
358 },
359 configurable: true
360 });
361 function returnCountStrict() { 'use strict'; return arguments.length; }
362 function returnCountSloppy() { return arguments.length; }
363
364 assertEquals(3, returnCountStrict(...[1]));
365 assertEquals(4, returnCountStrict(1, ...[2]));
366 assertEquals(5, returnCountStrict(1, ...[2], 3));
367 assertEquals(3, returnCountSloppy(...[1]));
368 assertEquals(4, returnCountSloppy(1, ...[2]));
369 assertEquals(5, returnCountSloppy(1, ...[2], 3));
370
371 Object.defineProperty(Array.prototype, Symbol.iterator, origIterator);
372})();