mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 03:34:08 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			143 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright 2015 the V8 project authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| (function testRestIndex() {
 | |
|   assertEquals(5, ((...args) => args.length)(1,2,3,4,5));
 | |
|   assertEquals(4, ((a, ...args) => args.length)(1,2,3,4,5));
 | |
|   assertEquals(3, ((a, b, ...args) => args.length)(1,2,3,4,5));
 | |
|   assertEquals(2, ((a, b, c, ...args) => args.length)(1,2,3,4,5));
 | |
|   assertEquals(1, ((a, b, c, d, ...args) => args.length)(1,2,3,4,5));
 | |
|   assertEquals(0, ((a, b, c, d, e, ...args) => args.length)(1,2,3,4,5));
 | |
| })();
 | |
| 
 | |
| // strictTest and sloppyTest should be called with descending natural
 | |
| // numbers, as in:
 | |
| //
 | |
| //   strictTest(6,5,4,3,2,1)
 | |
| //
 | |
| var strictTest = (function() {
 | |
|   "use strict";
 | |
|   return (a, b, ...c) => {
 | |
|     assertEquals(Array, c.constructor);
 | |
|     assertTrue(Array.isArray(c));
 | |
| 
 | |
|     var expectedLength = (a === undefined) ? 0 : a - 2;
 | |
|     assertEquals(expectedLength, c.length);
 | |
| 
 | |
|     for (var i = 2; i < a; ++i) {
 | |
|       assertEquals(c[i - 2], a - i);
 | |
|     }
 | |
|   };
 | |
| })();
 | |
| 
 | |
| var sloppyTest = (a, b, ...c) => {
 | |
|   assertEquals(Array, c.constructor);
 | |
|   assertTrue(Array.isArray(c));
 | |
| 
 | |
|   var expectedLength = (a === undefined) ? 0 : a - 2;
 | |
|   assertEquals(expectedLength, c.length);
 | |
| 
 | |
|   for (var i = 2; i < a; ++i) {
 | |
|     assertEquals(c[i - 2], a - i);
 | |
|   }
 | |
| };
 | |
| 
 | |
| 
 | |
| var O = {
 | |
|   strict: strictTest,
 | |
|   sloppy: sloppyTest
 | |
| };
 | |
| 
 | |
| (function testStrictRestParamArity() {
 | |
|   assertEquals(2, strictTest.length);
 | |
|   assertEquals(2, O.strict.length);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamsStrictMode() {
 | |
|   strictTest();
 | |
|   strictTest(2, 1);
 | |
|   strictTest(6, 5, 4, 3, 2, 1);
 | |
|   strictTest(3, 2, 1);
 | |
|   O.strict();
 | |
|   O.strict(2, 1);
 | |
|   O.strict(6, 5, 4, 3, 2, 1);
 | |
|   O.strict(3, 2, 1);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamsStrictModeApply() {
 | |
|   strictTest.apply(null, []);
 | |
|   strictTest.apply(null, [2, 1]);
 | |
|   strictTest.apply(null, [6, 5, 4, 3, 2, 1]);
 | |
|   strictTest.apply(null, [3, 2, 1]);
 | |
|   O.strict.apply(O, []);
 | |
|   O.strict.apply(O, [2, 1]);
 | |
|   O.strict.apply(O, [6, 5, 4, 3, 2, 1]);
 | |
|   O.strict.apply(O, [3, 2, 1]);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamsStrictModeCall() {
 | |
|   strictTest.call(null);
 | |
|   strictTest.call(null, 2, 1);
 | |
|   strictTest.call(null, 6, 5, 4, 3, 2, 1);
 | |
|   strictTest.call(null, 3, 2, 1);
 | |
|   O.strict.call(O);
 | |
|   O.strict.call(O, 2, 1);
 | |
|   O.strict.call(O, 6, 5, 4, 3, 2, 1);
 | |
|   O.strict.call(O, 3, 2, 1);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testsloppyRestParamArity() {
 | |
|   assertEquals(2, sloppyTest.length);
 | |
|   assertEquals(2, O.sloppy.length);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamsSloppyMode() {
 | |
|   sloppyTest();
 | |
|   sloppyTest(2, 1);
 | |
|   sloppyTest(6, 5, 4, 3, 2, 1);
 | |
|   sloppyTest(3, 2, 1);
 | |
|   O.sloppy();
 | |
|   O.sloppy(2, 1);
 | |
|   O.sloppy(6, 5, 4, 3, 2, 1);
 | |
|   O.sloppy(3, 2, 1);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamssloppyModeApply() {
 | |
|   sloppyTest.apply(null, []);
 | |
|   sloppyTest.apply(null, [2, 1]);
 | |
|   sloppyTest.apply(null, [6, 5, 4, 3, 2, 1]);
 | |
|   sloppyTest.apply(null, [3, 2, 1]);
 | |
|   O.sloppy.apply(O, []);
 | |
|   O.sloppy.apply(O, [2, 1]);
 | |
|   O.sloppy.apply(O, [6, 5, 4, 3, 2, 1]);
 | |
|   O.sloppy.apply(O, [3, 2, 1]);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testRestParamssloppyModeCall() {
 | |
|   sloppyTest.call(null);
 | |
|   sloppyTest.call(null, 2, 1);
 | |
|   sloppyTest.call(null, 6, 5, 4, 3, 2, 1);
 | |
|   sloppyTest.call(null, 3, 2, 1);
 | |
|   O.sloppy.call(O);
 | |
|   O.sloppy.call(O, 2, 1);
 | |
|   O.sloppy.call(O, 6, 5, 4, 3, 2, 1);
 | |
|   O.sloppy.call(O, 3, 2, 1);
 | |
| })();
 | |
| 
 | |
| 
 | |
| (function testUnmappedArguments() {
 | |
|   // Normal functions make their arguments object unmapped, but arrow
 | |
|   // functions don't have an arguments object anyway.  Check that the
 | |
|   // right thing happens for arguments in arrow functions with rest
 | |
|   // parameters.
 | |
|   assertSame(arguments, ((...rest) => arguments)());
 | |
| })();
 |