Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: tests/language/regex/regexp_test.dart

Issue 539153002: Port and integrate the irregexp engine from V8 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import "package:expect/expect.dart";
6
7 void testEscape(str, regex) {
8 assertEquals("foo:bar:baz", str.split(regex).join(":"));
9 }
10
11 void assertEquals(actual, expected, [message]) => Expect.equals(actual, expected , message);
ricow1 2014/09/05 05:47:40 long line
jgruber1 2014/09/05 06:17:26 Done.
12 void assertTrue(actual, [message]) => Expect.isTrue(actual, message);
13 void assertFalse(actual, [message]) => Expect.isFalse(actual, message);
14 void assertThrows(fn) => Expect.throws(fn);
15
16 void main() {
17 testEscape("foo\nbar\nbaz", new RegExp(r"\n"));
18 testEscape("foo bar baz", new RegExp(r"\s"));
19 testEscape("foo\tbar\tbaz", new RegExp(r"\s"));
20 testEscape("foo-bar-baz", new RegExp(r"\u002D"));
21
22 // Test containing null char in regexp.
23 var s = '[' + new String.fromCharCode(0) + ']';
24 var re = new RegExp(s);
25 assertEquals(re.allMatches(s).length, 1);
26 assertEquals(re.stringMatch(s), new String.fromCharCode(0));
27
28 // Test strings containing all line separators
29 s = 'aA\nbB\rcC\r\ndD\u2028eE\u2029fF';
30 re = new RegExp(r"^.", multiLine: true); // any non-newline character at the b eginning of a line
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
31 var result = re.allMatches(s).toList();
32 assertEquals(result.length, 6);
33 assertEquals(result[0][0], 'a');
34 assertEquals(result[1][0], 'b');
35 assertEquals(result[2][0], 'c');
36 assertEquals(result[3][0], 'd');
37 assertEquals(result[4][0], 'e');
38 assertEquals(result[5][0], 'f');
39
40 re = new RegExp(r".$", multiLine: true); // any non-newline character at the e nd of a line
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
41 result = re.allMatches(s).toList();
42 assertEquals(result.length, 6);
43 assertEquals(result[0][0], 'A');
44 assertEquals(result[1][0], 'B');
45 assertEquals(result[2][0], 'C');
46 assertEquals(result[3][0], 'D');
47 assertEquals(result[4][0], 'E');
48 assertEquals(result[5][0], 'F');
49
50 re = new RegExp(r"^[^]", multiLine: true); // *any* character at the beginning of a line
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
51 result = re.allMatches(s).toList();
52 assertEquals(result.length, 7);
53 assertEquals(result[0][0], 'a');
54 assertEquals(result[1][0], 'b');
55 assertEquals(result[2][0], 'c');
56 assertEquals(result[3][0], '\n');
57 assertEquals(result[4][0], 'd');
58 assertEquals(result[5][0], 'e');
59 assertEquals(result[6][0], 'f');
60
61 re = new RegExp(r"[^]$", multiLine: true); // *any* character at the end of a line
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:25 Done.
62 result = re.allMatches(s).toList();
63 assertEquals(result.length, 7);
64 assertEquals(result[0][0], 'A');
65 assertEquals(result[1][0], 'B');
66 assertEquals(result[2][0], 'C');
67 assertEquals(result[3][0], '\r');
68 assertEquals(result[4][0], 'D');
69 assertEquals(result[5][0], 'E');
70 assertEquals(result[6][0], 'F');
71
72 // Some tests from the Mozilla tests, where our behavior used to differ from
73 // SpiderMonkey.
74 // From ecma_3/RegExp/regress-334158.js
75 assertTrue( "\x01" .contains(new RegExp(r"\ca")));
76 assertFalse( "\\ca" .contains(new RegExp(r"\ca")));
77 assertFalse( "ca" .contains(new RegExp(r"\ca")));
78 assertTrue( "\\ca" .contains(new RegExp(r"\c[a/]")));
79 assertTrue( "\\c/" .contains(new RegExp(r"\c[a/]")));
80
81 // Test \c in character class
82 re = r"^[\cM]$";
83 assertTrue("\r".contains(new RegExp(re)));
84 assertFalse("M".contains(new RegExp(re)));
85 assertFalse("c".contains(new RegExp(re)));
86 assertFalse("\\".contains(new RegExp(re)));
87 assertFalse("\x03".contains(new RegExp(re))); // I.e., read as \cc
88
89 re = r"^[\c]]$";
90 assertTrue("c]".contains(new RegExp(re)));
91 assertTrue("\\]".contains(new RegExp(re)));
92 assertFalse("\x1d".contains(new RegExp(re))); // ']' & 0x1f
93 assertFalse("\x03]".contains(new RegExp(re))); // I.e., read as \cc
94
95 re = r"^[\c1]$"; // Digit control characters are masked in character classes.
96 assertTrue("\x11".contains(new RegExp(re)));
97 assertFalse("\\".contains(new RegExp(re)));
98 assertFalse("c".contains(new RegExp(re)));
99 assertFalse("1".contains(new RegExp(re)));
100
101 re = r"^[\c_]$"; // Underscore control character is masked in character class es.
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
102 assertTrue("\x1f".contains(new RegExp(re)));
103 assertFalse("\\".contains(new RegExp(re)));
104 assertFalse("c".contains(new RegExp(re)));
105 assertFalse("_".contains(new RegExp(re)));
106
107 re = r"^[\c$]$"; // Other characters are interpreted literally.
108 assertFalse("\x04".contains(new RegExp(re)));
109 assertTrue("\\".contains(new RegExp(re)));
110 assertTrue("c".contains(new RegExp(re)));
111 assertTrue(r"$".contains(new RegExp(re)));
112
113 assertTrue("Z[\\cde".contains(new RegExp(r"^[Z-\c-e]*$")));
114
115 // Test that we handle \s and \S correctly on special Unicode characters.
116 re = r"\s";
117 assertTrue("\u2028".contains(new RegExp(re)));
118 assertTrue("\u2029".contains(new RegExp(re)));
119 assertTrue("\uFEFF".contains(new RegExp(re)));
120
121 re = r"\S";
122 assertFalse("\u2028".contains(new RegExp(re)));
123 assertFalse("\u2029".contains(new RegExp(re)));
124 assertFalse("\uFEFF".contains(new RegExp(re)));
125
126 // Test that we handle \s and \S correctly inside some bizarre
127 // character classes.
128 re = r"[\s-:]";
129 assertTrue('-'.contains(new RegExp(re)));
130 assertTrue(':'.contains(new RegExp(re)));
131 assertTrue(' '.contains(new RegExp(re)));
132 assertTrue('\t'.contains(new RegExp(re)));
133 assertTrue('\n'.contains(new RegExp(re)));
134 assertFalse('a'.contains(new RegExp(re)));
135 assertFalse('Z'.contains(new RegExp(re)));
136
137 re = r"[\S-:]";
138 assertTrue('-'.contains(new RegExp(re)));
139 assertTrue(':'.contains(new RegExp(re)));
140 assertFalse(' '.contains(new RegExp(re)));
141 assertFalse('\t'.contains(new RegExp(re)));
142 assertFalse('\n'.contains(new RegExp(re)));
143 assertTrue('a'.contains(new RegExp(re)));
144 assertTrue('Z'.contains(new RegExp(re)));
145
146 re = r"[^\s-:]";
147 assertFalse('-'.contains(new RegExp(re)));
148 assertFalse(':'.contains(new RegExp(re)));
149 assertFalse(' '.contains(new RegExp(re)));
150 assertFalse('\t'.contains(new RegExp(re)));
151 assertFalse('\n'.contains(new RegExp(re)));
152 assertTrue('a'.contains(new RegExp(re)));
153 assertTrue('Z'.contains(new RegExp(re)));
154
155 re = r"[^\S-:]";
156 assertFalse('-'.contains(new RegExp(re)));
157 assertFalse(':'.contains(new RegExp(re)));
158 assertTrue(' '.contains(new RegExp(re)));
159 assertTrue('\t'.contains(new RegExp(re)));
160 assertTrue('\n'.contains(new RegExp(re)));
161 assertFalse('a'.contains(new RegExp(re)));
162 assertFalse('Z'.contains(new RegExp(re)));
163
164 re = r"[\s]";
165 assertFalse('-'.contains(new RegExp(re)));
166 assertFalse(':'.contains(new RegExp(re)));
167 assertTrue(' '.contains(new RegExp(re)));
168 assertTrue('\t'.contains(new RegExp(re)));
169 assertTrue('\n'.contains(new RegExp(re)));
170 assertFalse('a'.contains(new RegExp(re)));
171 assertFalse('Z'.contains(new RegExp(re)));
172
173 re = r"[^\s]";
174 assertTrue('-'.contains(new RegExp(re)));
175 assertTrue(':'.contains(new RegExp(re)));
176 assertFalse(' '.contains(new RegExp(re)));
177 assertFalse('\t'.contains(new RegExp(re)));
178 assertFalse('\n'.contains(new RegExp(re)));
179 assertTrue('a'.contains(new RegExp(re)));
180 assertTrue('Z'.contains(new RegExp(re)));
181
182 re = r"[\S]";
183 assertTrue('-'.contains(new RegExp(re)));
184 assertTrue(':'.contains(new RegExp(re)));
185 assertFalse(' '.contains(new RegExp(re)));
186 assertFalse('\t'.contains(new RegExp(re)));
187 assertFalse('\n'.contains(new RegExp(re)));
188 assertTrue('a'.contains(new RegExp(re)));
189 assertTrue('Z'.contains(new RegExp(re)));
190
191 re = r"[^\S]";
192 assertFalse('-'.contains(new RegExp(re)));
193 assertFalse(':'.contains(new RegExp(re)));
194 assertTrue(' '.contains(new RegExp(re)));
195 assertTrue('\t'.contains(new RegExp(re)));
196 assertTrue('\n'.contains(new RegExp(re)));
197 assertFalse('a'.contains(new RegExp(re)));
198 assertFalse('Z'.contains(new RegExp(re)));
199
200 re = r"[\s\S]";
201 assertTrue('-'.contains(new RegExp(re)));
202 assertTrue(':'.contains(new RegExp(re)));
203 assertTrue(' '.contains(new RegExp(re)));
204 assertTrue('\t'.contains(new RegExp(re)));
205 assertTrue('\n'.contains(new RegExp(re)));
206 assertTrue('a'.contains(new RegExp(re)));
207 assertTrue('Z'.contains(new RegExp(re)));
208
209 re = r"[^\s\S]";
210 assertFalse('-'.contains(new RegExp(re)));
211 assertFalse(':'.contains(new RegExp(re)));
212 assertFalse(' '.contains(new RegExp(re)));
213 assertFalse('\t'.contains(new RegExp(re)));
214 assertFalse('\n'.contains(new RegExp(re)));
215 assertFalse('a'.contains(new RegExp(re)));
216 assertFalse('Z'.contains(new RegExp(re)));
217
218 // First - is treated as range operator, second as literal minus.
219 // This follows the specification in parsing, but doesn't throw on
220 // the \s at the beginning of the range.
221 re = r"[\s-0-9]";
222 assertTrue(' '.contains(new RegExp(re)));
223 assertTrue('\xA0'.contains(new RegExp(re)));
224 assertTrue('-'.contains(new RegExp(re)));
225 assertTrue('0'.contains(new RegExp(re)));
226 assertTrue('9'.contains(new RegExp(re)));
227 assertFalse('1'.contains(new RegExp(re)));
228
229 // Test beginning and end of line assertions with or without the
230 // multiline flag.
231 re = r"^\d+";
232 assertFalse("asdf\n123".contains(new RegExp(re)));
233 re = new RegExp(r"^\d+", multiLine: true);
234 assertTrue("asdf\n123".contains(re));
235
236 re = r"\d+$";
237 assertFalse("123\nasdf".contains(new RegExp(re)));
238 re = new RegExp(r"\d+$", multiLine: true);
239 assertTrue("123\nasdf".contains(re));
240
241 // Test that empty matches are handled correctly for multiline global
242 // regexps.
243 re = new RegExp(r"^(.*)", multiLine: true);
244 assertEquals(3, re.allMatches("a\n\rb").length);
245 assertEquals("*a\n*b\r*c\n*\r*d\r*\n*e",
246 "a\nb\rc\n\rd\r\ne".replaceAllMapped(re, (Match m) => "*${m.group(1)}"));
247
248 // Test that empty matches advance one character
249 re = new RegExp("");
250 assertEquals("xAx", "A".replaceAll(re, "x"));
251 assertEquals(3, new String.fromCharCode(161).replaceAll(re, "x").length);
252
253 // Check for lazy RegExp literal creation
254 void lazyLiteral(doit) {
255 if (doit) return "".replaceAll(new RegExp(r"foo(", caseSensitive: false), "" );
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
256 return true;
257 }
258
259 assertTrue(lazyLiteral(false));
260 assertThrows(() => lazyLiteral(true));
261
262 // Check $01 and $10
263 re = new RegExp("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)");
264 assertEquals("t", "123456789t".replaceAllMapped(re, (Match m) => m.group(10))) ;
ricow1 2014/09/05 05:47:41 long line
ricow1 2014/09/05 05:47:41 long line
jgruber1 2014/09/05 06:17:26 Done.
jgruber1 2014/09/05 06:17:26 Done.
265 assertEquals("15", "123456789t".replaceAllMapped(re, (Match m) => "${m.group(1 )}5"));
ricow1 2014/09/05 05:47:40 long line
jgruber1 2014/09/05 06:17:26 Done.
266 assertEquals("1", "123456789t".replaceAllMapped(re, (Match m) => m.group(1)));
267
268 assertFalse("football".contains(new RegExp(r"()foo$\1")), "football1");
269 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football2");
270 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football3");
271 assertTrue("foo".contains(new RegExp(r"()foo$\1")), "football4");
272 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football5");
273 assertTrue("foo".contains(new RegExp(r"()foo$(?!bar)")), "football6");
274 assertFalse("football".contains(new RegExp(r"(x?)foo$\1")), "football7");
275 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football8");
276 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football9");
277 assertTrue("foo".contains(new RegExp(r"(x?)foo$\1")), "football10");
278 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football11");
279 assertTrue("foo".contains(new RegExp(r"foo$(?!bar)")), "football12");
280
281 // Check that the back reference has two successors. See
282 // BackReferenceNode::PropagateForward.
283 assertFalse('foo'.contains(new RegExp(r"f(o)\b\1")));
284 assertTrue('foo'.contains(new RegExp(r"f(o)\B\1")));
285
286 // Back-reference, ignore case:
287 // ASCII
288 assertEquals("a", new RegExp(r"x(a)\1x", caseSensitive: false).firstMatch("xaA x").group(1), "backref-ASCII");
ricow1 2014/09/05 05:47:41 long line + a lot below
jgruber1 2014/09/05 06:17:25 Done.
289 assertFalse("xaaaaa".contains(new RegExp(r"x(...)\1", caseSensitive: false)), "backref-ASCII-short");
290 assertTrue("xx".contains(new RegExp(r"x((?:))\1\1x", caseSensitive: false)), " backref-ASCII-empty");
291 assertTrue("xabcx".contains(new RegExp(r"x(?:...|(...))\1x", caseSensitive: fa lse)), "backref-ASCII-uncaptured");
292 assertTrue("xabcABCx".contains(new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)), "backref-ASCII-backtrack");
293 assertEquals("aBc",
294 new RegExp(r"x(...)\1\1x", caseSensitive: false).firstMatch("xaBc AbCABCx").group(1),
295 "backref-ASCII-twice");
296
297 for (var i = 0; i < 128; i++) {
298 var testName = "backref-ASCII-char-$i,,${i^0x20}";
299 var test = new String.fromCharCodes([i, i ^ 0x20]).contains(new RegExp(r"^(. )\1$", caseSensitive: false));
300 if (('A'.codeUnitAt(0) <= i && i <= 'Z'.codeUnitAt(0)) ||
301 ('a'.codeUnitAt(0) <= i && i <= 'z'.codeUnitAt(0))) {
302 assertTrue(test, testName);
303 } else {
304 assertFalse(test, testName);
305 }
306 }
307
308 assertFalse('foo'.contains(new RegExp(r"f(o)$\1")), "backref detects at_end");
309
310 // Check decimal escapes doesn't overflow.
311 // (Note: \214 is interpreted as octal).
312 assertEquals("\x8c7483648",
313 new RegExp(r"\2147483648").firstMatch("\x8c7483648").group(0 ),
314 "Overflow decimal escape");
315
316 // Check numbers in quantifiers doesn't overflow and doesn't throw on
317 // too large numbers.
318 assertFalse('b'.contains(new RegExp(r"a{11111111111111111111111111111111111111 1111111}")),
319 "overlarge1");
320 assertFalse('b'.contains(new RegExp(r"a{99999999999999999999999999999999999999 9999999}")),
321 "overlarge2");
322 assertFalse('b'.contains(new RegExp(r"a{1,111111111111111111111111111111111111 111111111}")),
323 "overlarge3");
324 assertFalse('b'.contains(new RegExp(r"a{1,999999999999999999999999999999999999 999999999}")),
325 "overlarge4");
326 assertFalse('b'.contains(new RegExp(r"a{2147483648}")),
327 "overlarge5");
328 assertFalse('b'.contains(new RegExp(r"a{21474836471}")),
329 "overlarge6");
330 assertFalse('b'.contains(new RegExp(r"a{1,2147483648}")),
331 "overlarge7");
332 assertFalse('b'.contains(new RegExp(r"a{1,21474836471}")),
333 "overlarge8");
334 assertFalse('b'.contains(new RegExp(r"a{2147483648,2147483648}")),
335 "overlarge9");
336 assertFalse('b'.contains(new RegExp(r"a{21474836471,21474836471}")),
337 "overlarge10");
338 assertFalse('b'.contains(new RegExp(r"a{2147483647}")),
339 "overlarge11");
340 assertFalse('b'.contains(new RegExp(r"a{1,2147483647}")),
341 "overlarge12");
342 assertTrue('a'.contains(new RegExp(r"a{1,2147483647}")),
343 "overlarge13");
344 assertFalse('a'.contains(new RegExp(r"a{2147483647,2147483647}")),
345 "overlarge14");
346
347 // Check that we don't read past the end of the string.
348 assertFalse('b'.contains(new RegExp(r"f")));
349 assertFalse('x'.contains(new RegExp(r"[abc]f")));
350 assertFalse('xa'.contains(new RegExp(r"[abc]f")));
351 assertFalse('x'.contains(new RegExp(r"[abc]<")));
352 assertFalse('xa'.contains(new RegExp(r"[abc]<")));
353 assertFalse('b'.contains(new RegExp(r"f", caseSensitive: false)));
354 assertFalse('x'.contains(new RegExp(r"[abc]f", caseSensitive: false)));
355 assertFalse('xa'.contains(new RegExp(r"[abc]f", caseSensitive: false)));
356 assertFalse('x'.contains(new RegExp(r"[abc]<", caseSensitive: false)));
357 assertFalse('xa'.contains(new RegExp(r"[abc]<", caseSensitive: false)));
358 assertFalse('x'.contains(new RegExp(r"f[abc]")));
359 assertFalse('xa'.contains(new RegExp(r"f[abc]")));
360 assertFalse('x'.contains(new RegExp(r"<[abc]")));
361 assertFalse('xa'.contains(new RegExp(r"<[abc]")));
362 assertFalse('x'.contains(new RegExp(r"f[abc]", caseSensitive: false)));
363 assertFalse('xa'.contains(new RegExp(r"f[abc]", caseSensitive: false)));
364 assertFalse('x'.contains(new RegExp(r"<[abc]", caseSensitive: false)));
365 assertFalse('xa'.contains(new RegExp(r"<[abc]", caseSensitive: false)));
366
367 // Test that merging of quick test masks gets it right.
368 assertFalse('x7%%y'.contains(new RegExp(r"x([0-7]%%x|[0-6]%%y)")), 'qt');
369 assertFalse('xy7%%%y'.contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjas ldkas)")), 'qt2');
370 assertFalse('xy%%%y'.contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasl dkas)")), 'qt3');
371 assertFalse('xy7%%%y'.contains(new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'q t4');
372 assertFalse('xy%%%y'.contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasl dkas)")), 'qt5');
373 assertFalse('xy7%%%y'.contains(new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'q t6');
374 assertFalse('xy7%%%y'.contains(new RegExp(r"xy([0-7]%%%x|[0-6]%%%y)")), 'qt7') ;
375 assertFalse('x7%%%y'.contains(new RegExp(r"x([0-7]%%%x|[0-6]%%%y)")), 'qt8');
376
377
378 // Don't hang on this one.
379 "".contains(new RegExp(r"[^\xfe-\xff]*"));
380
381 var longbuffer = new StringBuffer("a");
382 for (var i = 0; i < 100000; i++) {
383 longbuffer.write("a?");
384 }
385 var long = longbuffer.toString();
386
387 // Don't crash on this one, but maybe throw an exception.
388 try {
389 new RegExp(long).allMatches("a");
390 } catch (e) {
391 assertTrue(String(e).indexOf("Stack overflow") >= 0, "overflow");
392 }
393
394
395 // Test boundary-checks.
396 void assertRegExpTest(re, input, test) {
397 assertEquals(test, input.contains(new RegExp(re)), "test:" + re + ":" + inpu t);
398 }
399
400 assertRegExpTest(r"b\b", "b", true);
401 assertRegExpTest(r"b\b$", "b", true);
402 assertRegExpTest(r"\bb", "b", true);
403 assertRegExpTest(r"^\bb", "b", true);
404 assertRegExpTest(r",\b", ",", false);
405 assertRegExpTest(r",\b$", ",", false);
406 assertRegExpTest(r"\b,", ",", false);
407 assertRegExpTest(r"^\b,", ",", false);
408
409 assertRegExpTest(r"b\B", "b", false);
410 assertRegExpTest(r"b\B$", "b", false);
411 assertRegExpTest(r"\Bb", "b", false);
412 assertRegExpTest(r"^\Bb", "b", false);
413 assertRegExpTest(r",\B", ",", true);
414 assertRegExpTest(r",\B$", ",", true);
415 assertRegExpTest(r"\B,", ",", true);
416 assertRegExpTest(r"^\B,", ",", true);
417
418 assertRegExpTest(r"b\b", "b,", true);
419 assertRegExpTest(r"b\b", "ba", false);
420 assertRegExpTest(r"b\B", "b,", false);
421 assertRegExpTest(r"b\B", "ba", true);
422
423 assertRegExpTest(r"b\Bb", "bb", true);
424 assertRegExpTest(r"b\bb", "bb", false);
425
426 assertRegExpTest(r"b\b[,b]", "bb", false);
427 assertRegExpTest(r"b\B[,b]", "bb", true);
428 assertRegExpTest(r"b\b[,b]", "b,", true);
429 assertRegExpTest(r"b\B[,b]", "b,", false);
430
431 assertRegExpTest(r"[,b]\bb", "bb", false);
432 assertRegExpTest(r"[,b]\Bb", "bb", true);
433 assertRegExpTest(r"[,b]\bb", ",b", true);
434 assertRegExpTest(r"[,b]\Bb", ",b", false);
435
436 assertRegExpTest(r"[,b]\b[,b]", "bb", false);
437 assertRegExpTest(r"[,b]\B[,b]", "bb", true);
438 assertRegExpTest(r"[,b]\b[,b]", ",b", true);
439 assertRegExpTest(r"[,b]\B[,b]", ",b", false);
440 assertRegExpTest(r"[,b]\b[,b]", "b,", true);
441 assertRegExpTest(r"[,b]\B[,b]", "b,", false);
442
443 // Skipped tests from V8:
444
445 // Test that caching of result doesn't share result objects.
446 // More iterations increases the chance of hitting a GC.
447
448 // Test that we perform the spec required conversions in the correct order.
449
450 // Check that properties of RegExp have the correct permissions.
451
452 // Check that end-anchored regexps are optimized correctly.
453 re = r"(?:a|bc)g$";
454 assertTrue("ag".contains(new RegExp(re)));
455 assertTrue("bcg".contains(new RegExp(re)));
456 assertTrue("abcg".contains(new RegExp(re)));
457 assertTrue("zimbag".contains(new RegExp(re)));
458 assertTrue("zimbcg".contains(new RegExp(re)));
459
460 assertFalse("g".contains(new RegExp(re)));
461 assertFalse("".contains(new RegExp(re)));
462
463 // Global regexp (non-zero start).
464 re = r"(?:a|bc)g$";
465 assertTrue("ag".contains(new RegExp(re)));
466 // Near start of string.
467 assertTrue(new RegExp(re).allMatches("zimbag", 1).isNotEmpty);
468 // At end of string.
469 assertTrue(new RegExp(re).allMatches("zimbag", 6).isEmpty);
470 5; // Near end of string.
471 assertTrue(new RegExp(re).allMatches("zimbag", 5).isEmpty);
472 assertTrue(new RegExp(re).allMatches("zimbag", 4).isNotEmpty);
473
474 // Anchored at both ends.
475 re = r"^(?:a|bc)g$";
476 assertTrue("ag".contains(new RegExp(re)));
477 assertTrue(new RegExp(re).allMatches("ag", 1).isEmpty);
478 assertTrue(new RegExp(re).allMatches("zag", 1).isEmpty);
479
480 // Long max_length of RegExp.
481 re = r"VeryLongRegExp!{1,1000}$";
482 assertTrue("BahoolaVeryLongRegExp!!!!!!".contains(new RegExp(re)));
483 assertFalse("VeryLongRegExp".contains(new RegExp(re)));
484 assertFalse("!".contains(new RegExp(re)));
485
486 // End anchor inside disjunction.
487 re = r"(?:a$|bc$)";
488 assertTrue("a".contains(new RegExp(re)));
489 assertTrue("bc".contains(new RegExp(re)));
490 assertTrue("abc".contains(new RegExp(re)));
491 assertTrue("zimzamzumba".contains(new RegExp(re)));
492 assertTrue("zimzamzumbc".contains(new RegExp(re)));
493 assertFalse("c".contains(new RegExp(re)));
494 assertFalse("".contains(new RegExp(re)));
495
496 // Only partially anchored.
497 re = r"(?:a|bc$)";
498 assertTrue("a".contains(new RegExp(re)));
499 assertTrue("bc".contains(new RegExp(re)));
500 assertEquals("a", new RegExp(re).firstMatch("abc").group(0));
501 assertEquals(4, new RegExp(re).firstMatch("zimzamzumba").start);
502 assertEquals("bc", new RegExp(re).firstMatch("zimzomzumbc").group(0));
503 assertFalse("c".contains(new RegExp(re)));
504 assertFalse("".contains(new RegExp(re)));
505
506 // Valid syntax in ES5.
507 re = new RegExp("(?:x)*");
508 re = new RegExp("(x)*");
509
510 // Syntax extension relative to ES5, for matching JSC (and ES3).
511 // Shouldn't throw.
512 re = new RegExp("(?=x)*");
513 re = new RegExp("(?!x)*");
514
515 // Should throw. Shouldn't hit asserts in debug mode.
516 assertThrows(() => new RegExp('(*)'));
517 assertThrows(() => new RegExp('(?:*)'));
518 assertThrows(() => new RegExp('(?=*)'));
519 assertThrows(() => new RegExp('(?!*)'));
520
521 // Test trimmed regular expression for RegExp.test().
522 assertTrue("abc".contains(new RegExp(r".*abc")));
523 assertFalse("q".contains(new RegExp(r".*\d+")));
524
525 // Tests skipped from V8:
526 // Test that RegExp.prototype.toString() throws TypeError for
527 // incompatible receivers (ES5 section 15.10.6 and 15.10.6.4).
528 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698