1425bb815Sopenharmony_ci// Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci// 3425bb815Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci// you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci// You may obtain a copy of the License at 6425bb815Sopenharmony_ci// 7425bb815Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci// 9425bb815Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci// See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci// limitations under the License. 14425bb815Sopenharmony_ci 15425bb815Sopenharmony_cifunction CheckSyntaxError (str) 16425bb815Sopenharmony_ci{ 17425bb815Sopenharmony_ci try { 18425bb815Sopenharmony_ci eval (str); 19425bb815Sopenharmony_ci assert (false); 20425bb815Sopenharmony_ci } catch (e) { 21425bb815Sopenharmony_ci assert (e instanceof SyntaxError); 22425bb815Sopenharmony_ci } 23425bb815Sopenharmony_ci 24425bb815Sopenharmony_ci /* force the pre-scanner */ 25425bb815Sopenharmony_ci try { 26425bb815Sopenharmony_ci eval ('switch (1) { default: ' + str + '}'); 27425bb815Sopenharmony_ci assert (false); 28425bb815Sopenharmony_ci } catch (e) { 29425bb815Sopenharmony_ci assert (e instanceof SyntaxError); 30425bb815Sopenharmony_ci } 31425bb815Sopenharmony_ci} 32425bb815Sopenharmony_ci 33425bb815Sopenharmony_ciCheckSyntaxError ('function x (a, b, ...c, d) {}'); 34425bb815Sopenharmony_ciCheckSyntaxError ('function x (... c = 5) {}'); 35425bb815Sopenharmony_ciCheckSyntaxError ('function x (...) {}'); 36425bb815Sopenharmony_ciCheckSyntaxError ('function x (a, a, ...a) {}'); 37425bb815Sopenharmony_ciCheckSyntaxError ('"use strict" function x (...arguments) {}'); 38425bb815Sopenharmony_ciCheckSyntaxError ('var o = { set e (...args) { } }'); 39425bb815Sopenharmony_ci 40425bb815Sopenharmony_cirest_params = ['hello', true, 7, {}, [], function () {}]; 41425bb815Sopenharmony_ci 42425bb815Sopenharmony_cifunction f (x, y, ...a) { 43425bb815Sopenharmony_ci for (var i = 0; i < a.length; i++) { 44425bb815Sopenharmony_ci assert (a[i] == rest_params[i]); 45425bb815Sopenharmony_ci } 46425bb815Sopenharmony_ci return (x + y) * a.length; 47425bb815Sopenharmony_ci} 48425bb815Sopenharmony_ci 49425bb815Sopenharmony_ciassert (f (1, 2, rest_params[0], rest_params[1], rest_params[2]) === 9); 50425bb815Sopenharmony_ciassert (f.length === 2); 51425bb815Sopenharmony_ci 52425bb815Sopenharmony_cifunction g (...a) { 53425bb815Sopenharmony_ci return a.reduce (function (accumulator, currentValue) { return accumulator + currentValue }); 54425bb815Sopenharmony_ci} 55425bb815Sopenharmony_ci 56425bb815Sopenharmony_ciassert (g (1, 2, 3, 4) === 10); 57425bb815Sopenharmony_ci 58425bb815Sopenharmony_cifunction h (...arguments) { 59425bb815Sopenharmony_ci return arguments.length; 60425bb815Sopenharmony_ci} 61425bb815Sopenharmony_ci 62425bb815Sopenharmony_ciassert (h (1, 2, 3, 4) === 4); 63425bb815Sopenharmony_ci 64425bb815Sopenharmony_cifunction f2 (a = 1, b = 1, c = 1, ...d) { 65425bb815Sopenharmony_ci assert (JSON.stringify (d) === '[]'); 66425bb815Sopenharmony_ci return a + b + c; 67425bb815Sopenharmony_ci} 68425bb815Sopenharmony_ci 69425bb815Sopenharmony_ciassert (f2 () === 3); 70425bb815Sopenharmony_ciassert (f2 (2) === 4); 71425bb815Sopenharmony_ciassert (f2 (2, 3) === 6); 72425bb815Sopenharmony_ciassert (f2 (2, 3, 4) === 9); 73425bb815Sopenharmony_ci 74425bb815Sopenharmony_cifunction g2 (a = 5, b = a + 1, ...c) { 75425bb815Sopenharmony_ci return a + b + c.length; 76425bb815Sopenharmony_ci} 77425bb815Sopenharmony_ci 78425bb815Sopenharmony_ciassert (g2 () === 11); 79425bb815Sopenharmony_ciassert (g2 (1) === 3); 80425bb815Sopenharmony_ciassert (g2 (1, 2) === 3); 81425bb815Sopenharmony_ciassert (g2 (1, 2, 3) === 4); 82425bb815Sopenharmony_ci 83425bb815Sopenharmony_cifunction args(a, ...b) 84425bb815Sopenharmony_ci{ 85425bb815Sopenharmony_ci assert(a === 1); 86425bb815Sopenharmony_ci assert(arguments[0] === 1); 87425bb815Sopenharmony_ci 88425bb815Sopenharmony_ci a = 5; 89425bb815Sopenharmony_ci 90425bb815Sopenharmony_ci assert(a === 5); 91425bb815Sopenharmony_ci assert(arguments[0] === 1); 92425bb815Sopenharmony_ci 93425bb815Sopenharmony_ci assert(arguments[1] === 2); 94425bb815Sopenharmony_ci assert(b[0] === 2) 95425bb815Sopenharmony_ci} 96425bb815Sopenharmony_ciargs(1, 2); 97