|
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: 08 November 2003 |
|
9 * SUMMARY: |expr()| should cause a TypeError if |typeof expr| != 'function' |
|
10 * |
|
11 * See http://bugzilla.mozilla.org/show_bug.cgi?id=224956 |
|
12 * |
|
13 */ |
|
14 //----------------------------------------------------------------------------- |
|
15 var UBound = 0; |
|
16 var BUGNUMBER = 224956; |
|
17 var summary = "|expr()| should cause TypeError if |typeof expr| != 'function'"; |
|
18 var TEST_PASSED = 'TypeError'; |
|
19 var TEST_FAILED = 'Generated an error, but NOT a TypeError! '; |
|
20 var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; |
|
21 var CHECK_PASSED = 'Should not generate an error'; |
|
22 var CHECK_FAILED = 'Generated an error!'; |
|
23 var status = ''; |
|
24 var statusitems = []; |
|
25 var actual = ''; |
|
26 var actualvalues = []; |
|
27 var expect= ''; |
|
28 var expectedvalues = []; |
|
29 var x; |
|
30 |
|
31 |
|
32 /* |
|
33 * All the following contain invalid uses of the call operator () |
|
34 * and should generate TypeErrors. That's what we're testing for. |
|
35 * |
|
36 * To save writing try...catch over and over, we hide all the |
|
37 * errors inside eval strings, and let testThis() catch them. |
|
38 */ |
|
39 status = inSection(1); |
|
40 x = 'abc'; |
|
41 testThis('x()'); |
|
42 |
|
43 status = inSection(2); |
|
44 testThis('"abc"()'); |
|
45 |
|
46 status = inSection(3); |
|
47 x = new Date(); |
|
48 testThis('x()'); |
|
49 |
|
50 status = inSection(4); |
|
51 testThis('Date(12345)()'); |
|
52 |
|
53 status = inSection(5); |
|
54 x = Number(1); |
|
55 testThis('x()'); |
|
56 |
|
57 status = inSection(6); |
|
58 testThis('1()'); |
|
59 |
|
60 status = inSection(7); |
|
61 x = void(0); |
|
62 testThis('x()'); |
|
63 |
|
64 status = inSection(8); |
|
65 testThis('void(0)()'); |
|
66 |
|
67 status = inSection(9); |
|
68 x = Math; |
|
69 testThis('x()'); |
|
70 |
|
71 status = inSection(10); |
|
72 testThis('Math()'); |
|
73 |
|
74 status = inSection(11); |
|
75 x = Array(5); |
|
76 testThis('x()'); |
|
77 |
|
78 status = inSection(12); |
|
79 testThis('[1,2,3,4,5]()'); |
|
80 |
|
81 status = inSection(13); |
|
82 x = [1,2,3].splice(1,2); |
|
83 testThis('x()'); |
|
84 |
|
85 |
|
86 /* |
|
87 * Same as above, but with non-empty call parentheses |
|
88 */ |
|
89 status = inSection(14); |
|
90 x = 'abc'; |
|
91 testThis('x(1)'); |
|
92 |
|
93 status = inSection(15); |
|
94 testThis('"abc"(1)'); |
|
95 |
|
96 status = inSection(16); |
|
97 x = new Date(); |
|
98 testThis('x(1)'); |
|
99 |
|
100 status = inSection(17); |
|
101 testThis('Date(12345)(1)'); |
|
102 |
|
103 status = inSection(18); |
|
104 x = Number(1); |
|
105 testThis('x(1)'); |
|
106 |
|
107 status = inSection(19); |
|
108 testThis('1(1)'); |
|
109 |
|
110 status = inSection(20); |
|
111 x = void(0); |
|
112 testThis('x(1)'); |
|
113 |
|
114 status = inSection(21); |
|
115 testThis('void(0)(1)'); |
|
116 |
|
117 status = inSection(22); |
|
118 x = Math; |
|
119 testThis('x(1)'); |
|
120 |
|
121 status = inSection(23); |
|
122 testThis('Math(1)'); |
|
123 |
|
124 status = inSection(24); |
|
125 x = Array(5); |
|
126 testThis('x(1)'); |
|
127 |
|
128 status = inSection(25); |
|
129 testThis('[1,2,3,4,5](1)'); |
|
130 |
|
131 status = inSection(26); |
|
132 x = [1,2,3].splice(1,2); |
|
133 testThis('x(1)'); |
|
134 |
|
135 |
|
136 /* |
|
137 * Expression from website in original bug report above - |
|
138 */ |
|
139 status = inSection(27); |
|
140 var A = 1, C=2, Y=3, T=4, I=5; |
|
141 testThis('(((C/A-0.3)/0.2)+((Y/A-3)/4)+((T/A)/0.05)+((0.095-I/A)/0.4))(100/6)'); |
|
142 |
|
143 |
|
144 status = inSection(28); |
|
145 x = /a()/; |
|
146 testThis('x("abc")'); |
|
147 |
|
148 status = inSection(29); |
|
149 x = /a()/gi; |
|
150 testThis('x("abc")'); |
|
151 |
|
152 status = inSection(30); |
|
153 x = RegExp('a()'); |
|
154 testThis('x("abc")'); |
|
155 |
|
156 status = inSection(31); |
|
157 x = new RegExp('a()', 'gi'); |
|
158 testThis('x("")'); |
|
159 |
|
160 |
|
161 /* |
|
162 * Functions have |typeof| == 'function'. |
|
163 * |
|
164 * Therefore these expressions should not cause any errors. |
|
165 * Note we use checkThis() instead of testThis() |
|
166 * |
|
167 */ |
|
168 status = inSection(32); |
|
169 x = function (y) {return y+1;}; |
|
170 checkThis('x("abc")'); |
|
171 |
|
172 status = inSection(33); |
|
173 checkThis('(function (y) {return y+1;})("abc")'); |
|
174 |
|
175 status = inSection(34); |
|
176 function f(y) { function g() {return y;}; return g();}; |
|
177 checkThis('f("abc")'); |
|
178 |
|
179 |
|
180 |
|
181 //----------------------------------------------------------------------------- |
|
182 test(); |
|
183 //----------------------------------------------------------------------------- |
|
184 |
|
185 |
|
186 |
|
187 |
|
188 /* |
|
189 * |expr()| should generate a TypeError if |expr| is not a function |
|
190 */ |
|
191 function testThis(sInvalidSyntax) |
|
192 { |
|
193 expect = TEST_PASSED; |
|
194 actual = TEST_FAILED_BADLY; |
|
195 |
|
196 try |
|
197 { |
|
198 eval(sInvalidSyntax); |
|
199 } |
|
200 catch(e) |
|
201 { |
|
202 if (e instanceof TypeError) |
|
203 actual = TEST_PASSED; |
|
204 else |
|
205 actual = TEST_FAILED + e; |
|
206 } |
|
207 |
|
208 statusitems[UBound] = status; |
|
209 expectedvalues[UBound] = expect; |
|
210 actualvalues[UBound] = actual; |
|
211 UBound++; |
|
212 } |
|
213 |
|
214 |
|
215 /* |
|
216 * Valid syntax shouldn't generate any errors |
|
217 */ |
|
218 function checkThis(sValidSyntax) |
|
219 { |
|
220 expect = CHECK_PASSED; |
|
221 actual = CHECK_PASSED; |
|
222 |
|
223 try |
|
224 { |
|
225 eval(sValidSyntax); |
|
226 } |
|
227 catch(e) |
|
228 { |
|
229 actual = CHECK_FAILED; |
|
230 } |
|
231 |
|
232 statusitems[UBound] = status; |
|
233 expectedvalues[UBound] = expect; |
|
234 actualvalues[UBound] = actual; |
|
235 UBound++; |
|
236 } |
|
237 |
|
238 |
|
239 function test() |
|
240 { |
|
241 enterFunc('test'); |
|
242 printBugNumber(BUGNUMBER); |
|
243 printStatus(summary); |
|
244 |
|
245 for (var i=0; i<UBound; i++) |
|
246 { |
|
247 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); |
|
248 } |
|
249 |
|
250 exitFunc ('test'); |
|
251 } |