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_civar f = new Function ('');
16425bb815Sopenharmony_ciassert (f () === undefined);
17425bb815Sopenharmony_ci
18425bb815Sopenharmony_civar f = new Function ('"use strict"; f = undefined;');
19425bb815Sopenharmony_ciassert (f () === undefined && f === undefined);
20425bb815Sopenharmony_ci
21425bb815Sopenharmony_civar f = new Function ('"use strict"; q = undefined;');
22425bb815Sopenharmony_citry
23425bb815Sopenharmony_ci{
24425bb815Sopenharmony_ci  f ();
25425bb815Sopenharmony_ci  assert (false);
26425bb815Sopenharmony_ci}
27425bb815Sopenharmony_cicatch (e)
28425bb815Sopenharmony_ci{
29425bb815Sopenharmony_ci  assert (e instanceof ReferenceError);
30425bb815Sopenharmony_ci}
31425bb815Sopenharmony_ci
32425bb815Sopenharmony_civar singleArgFunction = new Function ('arg', 'return arg');
33425bb815Sopenharmony_ci
34425bb815Sopenharmony_ciassert (singleArgFunction (5) === 5);
35425bb815Sopenharmony_ci
36425bb815Sopenharmony_cifor (i = 1; i < 10; i ++)
37425bb815Sopenharmony_ci{
38425bb815Sopenharmony_ci  var f = new Function ('a', 'b', 'var q = a; b++; function f (k) {return q + k + b++;}; return f;');
39425bb815Sopenharmony_ci
40425bb815Sopenharmony_ci  var fns = new Array ();
41425bb815Sopenharmony_ci
42425bb815Sopenharmony_ci  for (var n = 0; n < 10; n++)
43425bb815Sopenharmony_ci  {
44425bb815Sopenharmony_ci    var r = f (1, 7);
45425bb815Sopenharmony_ci    fns[n] = r;
46425bb815Sopenharmony_ci
47425bb815Sopenharmony_ci    var check_value = 10;
48425bb815Sopenharmony_ci
49425bb815Sopenharmony_ci    for (var m = 0; m < 100; m++)
50425bb815Sopenharmony_ci    {
51425bb815Sopenharmony_ci      var value = r (1);
52425bb815Sopenharmony_ci      assert (check_value++ === value);
53425bb815Sopenharmony_ci    }
54425bb815Sopenharmony_ci  }
55425bb815Sopenharmony_ci
56425bb815Sopenharmony_ci  var check_value = 109;
57425bb815Sopenharmony_ci  for (var n = 0; n < 11; n++)
58425bb815Sopenharmony_ci  {
59425bb815Sopenharmony_ci    for (var m = 0; m < 10; m++)
60425bb815Sopenharmony_ci    {
61425bb815Sopenharmony_ci      var value = fns [m] (m * n);
62425bb815Sopenharmony_ci      assert (value == check_value + m * n);
63425bb815Sopenharmony_ci    }
64425bb815Sopenharmony_ci
65425bb815Sopenharmony_ci    check_value++;
66425bb815Sopenharmony_ci  }
67425bb815Sopenharmony_ci}
68425bb815Sopenharmony_ci
69425bb815Sopenharmony_civar f = new Function ("a,b", "c", "return a + b + c;");
70425bb815Sopenharmony_ciassert (f (1,2,3) === 6);
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_cif = new Function ("a,b", "c,d", "return a + b + c + d;");
73425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10);
74425bb815Sopenharmony_ci
75425bb815Sopenharmony_cif = new Function ("a" , "b", "c,d", "return a + b + c + d;");
76425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10);
77425bb815Sopenharmony_ci
78425bb815Sopenharmony_civar f = new Function (" a\t ,  b", "\u0020c", "return a + b + c;");
79425bb815Sopenharmony_ciassert (f (1,2,3) === 6);
80425bb815Sopenharmony_ci
81425bb815Sopenharmony_cif = new Function ("a, \n b  \u0020", "c \t, d\n", "return a + b + c + d;");
82425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10);
83425bb815Sopenharmony_ci
84425bb815Sopenharmony_cif = new Function (" a\t" , "\nb ", " \u0020c , d ", "return a + b + c + d;");
85425bb815Sopenharmony_ciassert (f (1,2,3,4) === 10);
86425bb815Sopenharmony_ci
87425bb815Sopenharmony_citry
88425bb815Sopenharmony_ci{
89425bb815Sopenharmony_ci  new Function ({
90425bb815Sopenharmony_ci    toString : function () {
91425bb815Sopenharmony_ci      throw new TypeError();
92425bb815Sopenharmony_ci    },
93425bb815Sopenharmony_ci    valueOf : function () {
94425bb815Sopenharmony_ci      throw new TypeError();
95425bb815Sopenharmony_ci    }
96425bb815Sopenharmony_ci  });
97425bb815Sopenharmony_ci
98425bb815Sopenharmony_ci  assert (false);
99425bb815Sopenharmony_ci}
100425bb815Sopenharmony_cicatch (e)
101425bb815Sopenharmony_ci{
102425bb815Sopenharmony_ci  assert (e instanceof TypeError);
103425bb815Sopenharmony_ci}
104425bb815Sopenharmony_ci
105425bb815Sopenharmony_civar p = { toString : function() { throw 1; } };
106425bb815Sopenharmony_civar body = { toString : function() { throw "body"; } };
107425bb815Sopenharmony_ci
108425bb815Sopenharmony_citry
109425bb815Sopenharmony_ci{
110425bb815Sopenharmony_ci  new Function (p, body);
111425bb815Sopenharmony_ci  // Should not be reached.
112425bb815Sopenharmony_ci  assert (false);
113425bb815Sopenharmony_ci}
114425bb815Sopenharmony_cicatch (e)
115425bb815Sopenharmony_ci{
116425bb815Sopenharmony_ci  assert (e === 1);
117425bb815Sopenharmony_ci}
118425bb815Sopenharmony_ci
119425bb815Sopenharmony_ci// Check SyntaxError handling
120425bb815Sopenharmony_citry
121425bb815Sopenharmony_ci{
122425bb815Sopenharmony_ci  new Function ('var var;');
123425bb815Sopenharmony_ci  assert (false);
124425bb815Sopenharmony_ci}
125425bb815Sopenharmony_cicatch (e)
126425bb815Sopenharmony_ci{
127425bb815Sopenharmony_ci  assert (e instanceof SyntaxError);
128425bb815Sopenharmony_ci}
129425bb815Sopenharmony_ci
130425bb815Sopenharmony_citry
131425bb815Sopenharmony_ci{
132425bb815Sopenharmony_ci  new Function ('a;b', 'return;');
133425bb815Sopenharmony_ci  assert (false);
134425bb815Sopenharmony_ci}
135425bb815Sopenharmony_cicatch (e)
136425bb815Sopenharmony_ci{
137425bb815Sopenharmony_ci  assert (e instanceof SyntaxError);
138425bb815Sopenharmony_ci}
139