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