|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 /* |
|
7 * |
|
8 * Date: 11 Feb 2002 |
|
9 * SUMMARY: Testing functions having duplicate formal parameter names |
|
10 * |
|
11 * SpiderMonkey was crashing on each case below if the parameters had |
|
12 * the same name. But duplicate parameter names are permitted by ECMA; |
|
13 * see ECMA-262 3rd Edition Final Section 10.1.3 |
|
14 * |
|
15 * NOTE: Rhino does not have toSource() and uneval(); they are non-ECMA |
|
16 * extensions to the language. So we include a test for them at the beginning - |
|
17 */ |
|
18 //----------------------------------------------------------------------------- |
|
19 var UBound = 0; |
|
20 var BUGNUMBER = '(none)'; |
|
21 var summary = 'Testing functions having duplicate formal parameter names'; |
|
22 var status = ''; |
|
23 var statusitems = []; |
|
24 var actual = ''; |
|
25 var actualvalues = []; |
|
26 var expect= ''; |
|
27 var expectedvalues = []; |
|
28 var OBJ = new Object(); |
|
29 var OBJ_TYPE = OBJ.toString(); |
|
30 |
|
31 /* |
|
32 * Exit if the implementation doesn't support toSource() or uneval(), |
|
33 * since these are non-ECMA extensions to the language - |
|
34 */ |
|
35 try |
|
36 { |
|
37 if (!OBJ.toSource || !uneval(OBJ)) |
|
38 quit(); |
|
39 } |
|
40 catch(e) |
|
41 { |
|
42 quit(); |
|
43 } |
|
44 |
|
45 |
|
46 /* |
|
47 * OK, now begin the test. Just checking that we don't crash on these - |
|
48 */ |
|
49 function f1(x,x,x,x) |
|
50 { |
|
51 var ret = eval(arguments.toSource()); |
|
52 return ret.toString(); |
|
53 } |
|
54 status = inSection(1); |
|
55 actual = f1(1,2,3,4); |
|
56 expect = OBJ_TYPE; |
|
57 addThis(); |
|
58 |
|
59 |
|
60 /* |
|
61 * Same thing, but preface |arguments| with the function name |
|
62 */ |
|
63 function f2(x,x,x,x) |
|
64 { |
|
65 var ret = eval(f2.arguments.toSource()); |
|
66 return ret.toString(); |
|
67 } |
|
68 status = inSection(2); |
|
69 actual = f2(1,2,3,4); |
|
70 expect = OBJ_TYPE; |
|
71 addThis(); |
|
72 |
|
73 |
|
74 function f3(x,x,x,x) |
|
75 { |
|
76 var ret = eval(uneval(arguments)); |
|
77 return ret.toString(); |
|
78 } |
|
79 status = inSection(3); |
|
80 actual = f3(1,2,3,4); |
|
81 expect = OBJ_TYPE; |
|
82 addThis(); |
|
83 |
|
84 |
|
85 /* |
|
86 * Same thing, but preface |arguments| with the function name |
|
87 */ |
|
88 function f4(x,x,x,x) |
|
89 { |
|
90 var ret = eval(uneval(f4.arguments)); |
|
91 return ret.toString(); |
|
92 } |
|
93 status = inSection(4); |
|
94 actual = f4(1,2,3,4); |
|
95 expect = OBJ_TYPE; |
|
96 addThis(); |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 //----------------------------------------------------------------------------- |
|
102 test(); |
|
103 //----------------------------------------------------------------------------- |
|
104 |
|
105 |
|
106 |
|
107 function addThis() |
|
108 { |
|
109 statusitems[UBound] = status; |
|
110 actualvalues[UBound] = actual; |
|
111 expectedvalues[UBound] = expect; |
|
112 UBound++; |
|
113 } |
|
114 |
|
115 |
|
116 function test() |
|
117 { |
|
118 enterFunc('test'); |
|
119 printBugNumber(BUGNUMBER); |
|
120 printStatus(summary); |
|
121 |
|
122 for (var i=0; i<UBound; i++) |
|
123 { |
|
124 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); |
|
125 } |
|
126 |
|
127 exitFunc ('test'); |
|
128 } |