2 * Any copyright is dedicated to the Public Domain.
3 * http://creativecommons.org/licenses/publicdomain/
6 var gTestfile = 'strict-arguments.js';
7 var BUGNUMBER = 516255;
9 "ES5 strict mode: arguments objects of strict mode functions must copy " +
12 print(BUGNUMBER + ": " + summary);
18 function arrayEvery(arr, fun)
20 return Array.prototype.every.call(arr, fun);
23 function arraysEqual(a1, a2)
25 return a1.length === a2.length &&
26 arrayEvery(a1, function(v, i) { return v === a2[i]; });
30 /************************
31 * NON-STRICT ARGUMENTS *
32 ************************/
36 function noargs() { return arguments; }
38 assertEq(arraysEqual(noargs(), []), true);
39 assertEq(arraysEqual(noargs(1), [1]), true);
40 assertEq(arraysEqual(noargs(2, obj, 8), [2, obj, 8]), true);
42 function args(a) { return arguments; }
44 assertEq(arraysEqual(args(), []), true);
45 assertEq(arraysEqual(args(1), [1]), true);
46 assertEq(arraysEqual(args(1, obj), [1, obj]), true);
47 assertEq(arraysEqual(args("foopy"), ["foopy"]), true);
55 assertEq(arraysEqual(assign(1), [17]), true);
57 function getLaterAssign(a)
64 assertEq(arraysEqual(getLaterAssign(1), [17]), true);
66 function assignElementGetParameter(a)
72 assertEq(assignElementGetParameter(42), 17);
74 function assignParameterGetElement(a)
80 assertEq(assignParameterGetElement(42), 17);
87 function strictNoargs()
93 assertEq(arraysEqual(strictNoargs(), []), true);
94 assertEq(arraysEqual(strictNoargs(1), [1]), true);
95 assertEq(arraysEqual(strictNoargs(1, obj), [1, obj]), true);
97 function strictArgs(a)
103 assertEq(arraysEqual(strictArgs(), []), true);
104 assertEq(arraysEqual(strictArgs(1), [1]), true);
105 assertEq(arraysEqual(strictArgs(1, obj), [1, obj]), true);
107 function strictAssign(a)
114 assertEq(arraysEqual(strictAssign(), []), true);
115 assertEq(arraysEqual(strictAssign(1), [1]), true);
116 assertEq(arraysEqual(strictAssign(1, obj), [1, obj]), true);
119 function strictAssignAfter(a)
127 assertEq(arraysEqual(strictAssignAfter(), []), true);
128 assertEq(arraysEqual(strictAssignAfter(17), [17]), true);
129 assertEq(arraysEqual(strictAssignAfter(obj), [obj]), true);
131 function strictMaybeAssignOuterParam(p)
134 function inner() { p = 17; }
138 assertEq(arraysEqual(strictMaybeAssignOuterParam(), []), true);
139 assertEq(arraysEqual(strictMaybeAssignOuterParam(42), [42]), true);
140 assertEq(arraysEqual(strictMaybeAssignOuterParam(obj), [obj]), true);
142 function strictAssignOuterParam(p)
145 function inner() { p = 17; }
150 assertEq(arraysEqual(strictAssignOuterParam(), []), true);
151 assertEq(arraysEqual(strictAssignOuterParam(17), [17]), true);
152 assertEq(arraysEqual(strictAssignOuterParam(obj), [obj]), true);
154 function strictAssignOuterParamPSYCH(p)
157 function inner(p) { p = 17; }
162 assertEq(arraysEqual(strictAssignOuterParamPSYCH(), []), true);
163 assertEq(arraysEqual(strictAssignOuterParamPSYCH(17), [17]), true);
164 assertEq(arraysEqual(strictAssignOuterParamPSYCH(obj), [obj]), true);
166 function strictEval(code, p)
173 assertEq(arraysEqual(strictEval("1", 2), ["1", 2]), true);
174 assertEq(arraysEqual(strictEval("arguments"), ["arguments"]), true);
175 assertEq(arraysEqual(strictEval("p = 2"), ["p = 2"]), true);
176 assertEq(arraysEqual(strictEval("p = 2", 17), ["p = 2", 17]), true);
177 assertEq(arraysEqual(strictEval("arguments[0] = 17"), [17]), true);
178 assertEq(arraysEqual(strictEval("arguments[0] = 17", 42), [17, 42]), true);
180 function strictMaybeNestedEval(code, p)
183 function inner() { eval(code); }
187 assertEq(arraysEqual(strictMaybeNestedEval("1", 2), ["1", 2]), true);
188 assertEq(arraysEqual(strictMaybeNestedEval("arguments"), ["arguments"]), true);
189 assertEq(arraysEqual(strictMaybeNestedEval("p = 2"), ["p = 2"]), true);
190 assertEq(arraysEqual(strictMaybeNestedEval("p = 2", 17), ["p = 2", 17]), true);
192 function strictNestedEval(code, p)
195 function inner() { eval(code); }
200 assertEq(arraysEqual(strictNestedEval("1", 2), ["1", 2]), true);
201 assertEq(arraysEqual(strictNestedEval("arguments"), ["arguments"]), true);
202 assertEq(arraysEqual(strictNestedEval("p = 2"), ["p = 2"]), true);
203 assertEq(arraysEqual(strictNestedEval("p = 2", 17), ["p = 2", 17]), true);
204 assertEq(arraysEqual(strictNestedEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
205 assertEq(arraysEqual(strictNestedEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
207 function strictAssignArguments(a)
214 assertEq(strictAssignArguments(), undefined);
215 assertEq(strictAssignArguments(obj), obj);
216 assertEq(strictAssignArguments(17), 17);
218 function strictAssignParameterGetElement(a)
225 assertEq(strictAssignParameterGetElement(42), 42);
227 function strictNestedAssignShadowVar(p)
233 function innermost() { p = 1776; return 12; }
239 assertEq(arraysEqual(strictNestedAssignShadowVar(), []), true);
240 assertEq(arraysEqual(strictNestedAssignShadowVar(99), [99]), true);
241 assertEq(arraysEqual(strictNestedAssignShadowVar(""), [""]), true);
242 assertEq(arraysEqual(strictNestedAssignShadowVar(obj), [obj]), true);
244 function strictNestedAssignShadowCatch(p)
254 var f = function innermost() { p = 1776; return 12; };
261 assertEq(arraysEqual(strictNestedAssignShadowCatch(), []), true);
262 assertEq(arraysEqual(strictNestedAssignShadowCatch(99), [99]), true);
263 assertEq(arraysEqual(strictNestedAssignShadowCatch(""), [""]), true);
264 assertEq(arraysEqual(strictNestedAssignShadowCatch(obj), [obj]), true);
266 function strictNestedAssignShadowCatchCall(p)
276 var f = function innermost() { p = 1776; return 12; };
284 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(), []), true);
285 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(99), [99]), true);
286 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(""), [""]), true);
287 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(obj), [obj]), true);
289 function strictNestedAssignShadowFunction(p)
300 assertEq(arraysEqual(strictNestedAssignShadowFunction(), []), true);
301 assertEq(arraysEqual(strictNestedAssignShadowFunction(99), [99]), true);
302 assertEq(arraysEqual(strictNestedAssignShadowFunction(""), [""]), true);
303 assertEq(arraysEqual(strictNestedAssignShadowFunction(obj), [obj]), true);
305 function strictNestedAssignShadowFunctionCall(p)
316 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(), []), true);
317 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(99), [99]), true);
318 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(""), [""]), true);
319 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(obj), [obj]), true);
321 function strictNestedShadowAndMaybeEval(code, p)
324 function inner(p) { eval(code); }
328 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("1", 2), ["1", 2]), true);
329 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments"), ["arguments"]), true);
330 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2"), ["p = 2"]), true);
331 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2", 17), ["p = 2", 17]), true);
332 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
333 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
335 function strictNestedShadowAndEval(code, p)
338 function inner(p) { eval(code); }
342 assertEq(arraysEqual(strictNestedShadowAndEval("1", 2), ["1", 2]), true);
343 assertEq(arraysEqual(strictNestedShadowAndEval("arguments"), ["arguments"]), true);
344 assertEq(arraysEqual(strictNestedShadowAndEval("p = 2"), ["p = 2"]), true);
345 assertEq(arraysEqual(strictNestedShadowAndEval("p = 2", 17), ["p = 2", 17]), true);
346 assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
347 assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
349 function strictEvalContainsMutation(code)
355 assertEq(arraysEqual(strictEvalContainsMutation("code = 17; arguments"), ["code = 17; arguments"]), true);
356 assertEq(arraysEqual(strictEvalContainsMutation("arguments[0] = 17; arguments"), [17]), true);
357 assertEq(strictEvalContainsMutation("arguments[0] = 17; code"), "arguments[0] = 17; code");
359 function strictNestedAssignShadowFunctionName(p)
364 function p() { p = 1776; }
371 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(), []), true);
372 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(99), [99]), true);
373 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(""), [""]), true);
374 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(obj), [obj]), true);
377 /******************************************************************************/
379 if (typeof reportCompare === "function")
380 reportCompare(true, true);
382 print("All tests passed!");