Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Side by Side Diff: test/mjsunit/harmony/spread-call.js

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

Powered by Google App Engine
This is Rietveld 408576698