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