]> git.saurik.com Git - apple/javascriptcore.git/blob - tests/mozilla/ecma_3/RegExp/regress-188206.js
JavaScriptCore-1097.13.tar.gz
[apple/javascriptcore.git] / tests / mozilla / ecma_3 / RegExp / regress-188206.js
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: NPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Netscape Public License
5 * Version 1.1 (the "License"); you may not use this file except in
6 * compliance with the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/NPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is JavaScript Engine testing utilities.
15 *
16 * The Initial Developer of the Original Code is Netscape Communications Corp.
17 * Portions created by the Initial Developer are Copyright (C) 2003
18 * the Initial Developer. All Rights Reserved.
19 *
20 * Contributor(s): scole@planetweb.com, pschwartau@netscape.com
21 *
22 * Alternatively, the contents of this file may be used under the terms of
23 * either the GNU General Public License Version 2 or later (the "GPL"), or
24 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25 * in which case the provisions of the GPL or the LGPL are applicable instead
26 * of those above. If you wish to allow use of your version of this file only
27 * under the terms of either the GPL or the LGPL, and not to allow others to
28 * use your version of this file under the terms of the NPL, indicate your
29 * decision by deleting the provisions above and replace them with the notice
30 * and other provisions required by the GPL or the LGPL. If you do not delete
31 * the provisions above, a recipient may use your version of this file under
32 * the terms of any one of the NPL, the GPL or the LGPL.
33 *
34 * ***** END LICENSE BLOCK *****
35 *
36 *
37 * Date: 21 January 2003
38 * SUMMARY: Invalid use of regexp quantifiers should generate SyntaxErrors
39 *
40 * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206
41 * and http://bugzilla.mozilla.org/show_bug.cgi?id=85721#c48 etc.
42 * and http://bugzilla.mozilla.org/show_bug.cgi?id=190685
43 * and http://bugzilla.mozilla.org/show_bug.cgi?id=197451
44 */
45 //-----------------------------------------------------------------------------
46 var UBound = 0;
47 var bug = 188206;
48 var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
49 var TEST_PASSED = 'SyntaxError';
50 var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
51 var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
52 var CHECK_PASSED = 'Should not generate an error';
53 var CHECK_FAILED = 'Generated an error!';
54 var status = '';
55 var statusitems = [];
56 var actual = '';
57 var actualvalues = [];
58 var expect= '';
59 var expectedvalues = [];
60
61
62 /*
63 * All the following are invalid uses of regexp quantifiers and
64 * should generate SyntaxErrors. That's what we're testing for.
65 *
66 * To allow the test to compile and run, we have to hide the errors
67 * inside eval strings, and check they are caught at run-time -
68 *
69 */
70 status = inSection(1);
71 testThis(' /a**/ ');
72
73 status = inSection(2);
74 testThis(' /a***/ ');
75
76 status = inSection(3);
77 testThis(' /a++/ ');
78
79 status = inSection(4);
80 testThis(' /a+++/ ');
81
82 /*
83 * The ? quantifier, unlike * or +, may appear twice in succession.
84 * Thus we need at least three in a row to provoke a SyntaxError -
85 */
86
87 status = inSection(5);
88 testThis(' /a???/ ');
89
90 status = inSection(6);
91 testThis(' /a????/ ');
92
93
94 /*
95 * Now do some weird things on the left side of the regexps -
96 */
97 status = inSection(7);
98 testThis(' /*a/ ');
99
100 status = inSection(8);
101 testThis(' /**a/ ');
102
103 status = inSection(9);
104 testThis(' /+a/ ');
105
106 status = inSection(10);
107 testThis(' /++a/ ');
108
109 status = inSection(11);
110 testThis(' /?a/ ');
111
112 status = inSection(12);
113 testThis(' /??a/ ');
114
115
116 /*
117 * Misusing the {DecmalDigits} quantifier - according to ECMA,
118 * but not according to Perl.
119 *
120 * ECMA-262 Edition 3 prohibits the use of unescaped braces in
121 * regexp patterns, unless they form part of a quantifier.
122 *
123 * Hovever, Perl does not prohibit this. If not used as part
124 * of a quantifer, Perl treats braces literally.
125 *
126 * We decided to follow Perl on this for backward compatibility.
127 * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685.
128 *
129 * Therefore NONE of the following ECMA violations should generate
130 * a SyntaxError. Note we use checkThis() instead of testThis().
131 */
132 status = inSection(13);
133 checkThis(' /a*{/ ');
134
135 status = inSection(14);
136 checkThis(' /a{}/ ');
137
138 status = inSection(15);
139 checkThis(' /{a/ ');
140
141 status = inSection(16);
142 checkThis(' /}a/ ');
143
144 status = inSection(17);
145 checkThis(' /x{abc}/ ');
146
147 status = inSection(18);
148 checkThis(' /{{0}/ ');
149
150 status = inSection(19);
151 checkThis(' /{{1}/ ');
152
153 status = inSection(20);
154 checkThis(' /x{{0}/ ');
155
156 status = inSection(21);
157 checkThis(' /x{{1}/ ');
158
159 status = inSection(22);
160 checkThis(' /x{{0}}/ ');
161
162 status = inSection(23);
163 checkThis(' /x{{1}}/ ');
164
165 status = inSection(24);
166 checkThis(' /x{{0}}/ ');
167
168 status = inSection(25);
169 checkThis(' /x{{1}}/ ');
170
171 status = inSection(26);
172 checkThis(' /x{{0}}/ ');
173
174 status = inSection(27);
175 checkThis(' /x{{1}}/ ');
176
177
178 /*
179 * Misusing the {DecmalDigits} quantifier - according to BOTH ECMA and Perl.
180 *
181 * Just as with the * and + quantifiers above, can't have two {DecmalDigits}
182 * quantifiers in succession - it's a SyntaxError.
183 */
184 status = inSection(28);
185 testThis(' /x{1}{1}/ ');
186
187 status = inSection(29);
188 testThis(' /x{1,}{1}/ ');
189
190 status = inSection(30);
191 testThis(' /x{1,2}{1}/ ');
192
193 status = inSection(31);
194 testThis(' /x{1}{1,}/ ');
195
196 status = inSection(32);
197 testThis(' /x{1,}{1,}/ ');
198
199 status = inSection(33);
200 testThis(' /x{1,2}{1,}/ ');
201
202 status = inSection(34);
203 testThis(' /x{1}{1,2}/ ');
204
205 status = inSection(35);
206 testThis(' /x{1,}{1,2}/ ');
207
208 status = inSection(36);
209 testThis(' /x{1,2}{1,2}/ ');
210
211
212
213 //-----------------------------------------------------------------------------
214 test();
215 //-----------------------------------------------------------------------------
216
217
218
219 /*
220 * Invalid syntax should generate a SyntaxError
221 */
222 function testThis(sInvalidSyntax)
223 {
224 expect = TEST_PASSED;
225 actual = TEST_FAILED_BADLY;
226
227 try
228 {
229 eval(sInvalidSyntax);
230 }
231 catch(e)
232 {
233 if (e instanceof SyntaxError)
234 actual = TEST_PASSED;
235 else
236 actual = TEST_FAILED;
237 }
238
239 statusitems[UBound] = status;
240 expectedvalues[UBound] = expect;
241 actualvalues[UBound] = actual;
242 UBound++;
243 }
244
245
246 /*
247 * Allowed syntax shouldn't generate any errors
248 */
249 function checkThis(sAllowedSyntax)
250 {
251 expect = CHECK_PASSED;
252 actual = CHECK_PASSED;
253
254 try
255 {
256 eval(sAllowedSyntax);
257 }
258 catch(e)
259 {
260 actual = CHECK_FAILED;
261 }
262
263 statusitems[UBound] = status;
264 expectedvalues[UBound] = expect;
265 actualvalues[UBound] = actual;
266 UBound++;
267 }
268
269
270 function test()
271 {
272 enterFunc('test');
273 printBugNumber(bug);
274 printStatus(summary);
275
276 for (var i=0; i<UBound; i++)
277 {
278 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
279 }
280
281 exitFunc ('test');
282 }