OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. All rights reserved. | 1 // Copyright (c) 2014, the Dart project authors. All rights reserved. |
2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
3 // Redistribution and use in source and binary forms, with or without | 3 // Redistribution and use in source and binary forms, with or without |
4 // modification, are permitted provided that the following conditions are | 4 // modification, are permitted provided that the following conditions are |
5 // met: | 5 // met: |
6 // | 6 // |
7 // * Redistributions of source code must retain the above copyright | 7 // * Redistributions of source code must retain the above copyright |
8 // notice, this list of conditions and the following disclaimer. | 8 // notice, this list of conditions and the following disclaimer. |
9 // * Redistributions in binary form must reproduce the above | 9 // * Redistributions in binary form must reproduce the above |
10 // copyright notice, this list of conditions and the following | 10 // copyright notice, this list of conditions and the following |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 testEscape("foo bar baz", new RegExp(r"\s")); | 43 testEscape("foo bar baz", new RegExp(r"\s")); |
44 testEscape("foo\tbar\tbaz", new RegExp(r"\s")); | 44 testEscape("foo\tbar\tbaz", new RegExp(r"\s")); |
45 testEscape("foo-bar-baz", new RegExp(r"\u002D")); | 45 testEscape("foo-bar-baz", new RegExp(r"\u002D")); |
46 | 46 |
47 // Test containing null char in regexp. | 47 // Test containing null char in regexp. |
48 var s = '[' + new String.fromCharCode(0) + ']'; | 48 var s = '[' + new String.fromCharCode(0) + ']'; |
49 var re = new RegExp(s); | 49 var re = new RegExp(s); |
50 assertEquals(re.allMatches(s).length, 1); | 50 assertEquals(re.allMatches(s).length, 1); |
51 assertEquals(re.stringMatch(s), new String.fromCharCode(0)); | 51 assertEquals(re.stringMatch(s), new String.fromCharCode(0)); |
52 | 52 |
53 final _vmFrame = new RegExp( | 53 final _vmFrame = new RegExp(r'^#\d+\s+(\S.*) \((.+?):(\d+)(?::(\d+))?\)$'); |
54 r'^#\d+\s+(\S.*) \((.+?):(\d+)(?::(\d+))?\)$'); | |
55 final _traceLine = | 54 final _traceLine = |
56 "#0 Trace.Trace.parse (package:stack_trace/src/trace.dart:130:7)"; | 55 "#0 Trace.Trace.parse (package:stack_trace/src/trace.dart:130:7)"; |
57 Expect.equals(_vmFrame.firstMatch(_traceLine).group(0), _traceLine); | 56 Expect.equals(_vmFrame.firstMatch(_traceLine).group(0), _traceLine); |
58 | 57 |
59 // Test the UTF16 case insensitive comparison. | 58 // Test the UTF16 case insensitive comparison. |
60 re = new RegExp(r"x(a)\1x", caseSensitive: false); | 59 re = new RegExp(r"x(a)\1x", caseSensitive: false); |
61 Expect.equals(re.firstMatch("xaAx\u1234").group(0), "xaAx"); | 60 Expect.equals(re.firstMatch("xaAx\u1234").group(0), "xaAx"); |
62 | 61 |
63 // Test strings containing all line separators | 62 // Test strings containing all line separators |
64 s = 'aA\nbB\rcC\r\ndD\u2028eE\u2029fF'; | 63 s = 'aA\nbB\rcC\r\ndD\u2028eE\u2029fF'; |
65 // any non-newline character at the beginning of a line | 64 // any non-newline character at the beginning of a line |
66 re = new RegExp(r"^.", multiLine: true); | 65 re = new RegExp(r"^.", multiLine: true); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 assertEquals(result[1][0], 'B'); | 103 assertEquals(result[1][0], 'B'); |
105 assertEquals(result[2][0], 'C'); | 104 assertEquals(result[2][0], 'C'); |
106 assertEquals(result[3][0], '\r'); | 105 assertEquals(result[3][0], '\r'); |
107 assertEquals(result[4][0], 'D'); | 106 assertEquals(result[4][0], 'D'); |
108 assertEquals(result[5][0], 'E'); | 107 assertEquals(result[5][0], 'E'); |
109 assertEquals(result[6][0], 'F'); | 108 assertEquals(result[6][0], 'F'); |
110 | 109 |
111 // Some tests from the Mozilla tests, where our behavior used to differ | 110 // Some tests from the Mozilla tests, where our behavior used to differ |
112 // from SpiderMonkey. | 111 // from SpiderMonkey. |
113 // From ecma_3/RegExp/regress-334158.js | 112 // From ecma_3/RegExp/regress-334158.js |
114 assertTrue( "\x01" .contains(new RegExp(r"\ca"))); | 113 assertTrue("\x01".contains(new RegExp(r"\ca"))); |
115 assertFalse( "\\ca" .contains(new RegExp(r"\ca"))); | 114 assertFalse("\\ca".contains(new RegExp(r"\ca"))); |
116 assertFalse( "ca" .contains(new RegExp(r"\ca"))); | 115 assertFalse("ca".contains(new RegExp(r"\ca"))); |
117 assertTrue( "\\ca" .contains(new RegExp(r"\c[a/]"))); | 116 assertTrue("\\ca".contains(new RegExp(r"\c[a/]"))); |
118 assertTrue( "\\c/" .contains(new RegExp(r"\c[a/]"))); | 117 assertTrue("\\c/".contains(new RegExp(r"\c[a/]"))); |
119 | 118 |
120 // Test \c in character class | 119 // Test \c in character class |
121 re = r"^[\cM]$"; | 120 re = r"^[\cM]$"; |
122 assertTrue("\r".contains(new RegExp(re))); | 121 assertTrue("\r".contains(new RegExp(re))); |
123 assertFalse("M".contains(new RegExp(re))); | 122 assertFalse("M".contains(new RegExp(re))); |
124 assertFalse("c".contains(new RegExp(re))); | 123 assertFalse("c".contains(new RegExp(re))); |
125 assertFalse("\\".contains(new RegExp(re))); | 124 assertFalse("\\".contains(new RegExp(re))); |
126 assertFalse("\x03".contains(new RegExp(re))); // I.e., read as \cc | 125 assertFalse("\x03".contains(new RegExp(re))); // I.e., read as \cc |
127 | 126 |
128 re = r"^[\c]]$"; | 127 re = r"^[\c]]$"; |
129 assertTrue("c]".contains(new RegExp(re))); | 128 assertTrue("c]".contains(new RegExp(re))); |
130 assertTrue("\\]".contains(new RegExp(re))); | 129 assertTrue("\\]".contains(new RegExp(re))); |
131 assertFalse("\x1d".contains(new RegExp(re))); // ']' & 0x1f | 130 assertFalse("\x1d".contains(new RegExp(re))); // ']' & 0x1f |
132 assertFalse("\x03]".contains(new RegExp(re))); // I.e., read as \cc | 131 assertFalse("\x03]".contains(new RegExp(re))); // I.e., read as \cc |
133 | 132 |
134 // Digit control characters are masked in character classes. | 133 // Digit control characters are masked in character classes. |
135 re = r"^[\c1]$"; | 134 re = r"^[\c1]$"; |
136 assertTrue("\x11".contains(new RegExp(re))); | 135 assertTrue("\x11".contains(new RegExp(re))); |
137 assertFalse("\\".contains(new RegExp(re))); | 136 assertFalse("\\".contains(new RegExp(re))); |
138 assertFalse("c".contains(new RegExp(re))); | 137 assertFalse("c".contains(new RegExp(re))); |
139 assertFalse("1".contains(new RegExp(re))); | 138 assertFalse("1".contains(new RegExp(re))); |
140 | 139 |
141 // Underscore control character is masked in character classes. | 140 // Underscore control character is masked in character classes. |
142 re = r"^[\c_]$"; | 141 re = r"^[\c_]$"; |
143 assertTrue("\x1f".contains(new RegExp(re))); | 142 assertTrue("\x1f".contains(new RegExp(re))); |
144 assertFalse("\\".contains(new RegExp(re))); | 143 assertFalse("\\".contains(new RegExp(re))); |
145 assertFalse("c".contains(new RegExp(re))); | 144 assertFalse("c".contains(new RegExp(re))); |
146 assertFalse("_".contains(new RegExp(re))); | 145 assertFalse("_".contains(new RegExp(re))); |
147 | 146 |
148 re = r"^[\c$]$"; // Other characters are interpreted literally. | 147 re = r"^[\c$]$"; // Other characters are interpreted literally. |
149 assertFalse("\x04".contains(new RegExp(re))); | 148 assertFalse("\x04".contains(new RegExp(re))); |
150 assertTrue("\\".contains(new RegExp(re))); | 149 assertTrue("\\".contains(new RegExp(re))); |
151 assertTrue("c".contains(new RegExp(re))); | 150 assertTrue("c".contains(new RegExp(re))); |
152 assertTrue(r"$".contains(new RegExp(re))); | 151 assertTrue(r"$".contains(new RegExp(re))); |
153 | 152 |
154 assertTrue("Z[\\cde".contains(new RegExp(r"^[Z-\c-e]*$"))); | 153 assertTrue("Z[\\cde".contains(new RegExp(r"^[Z-\c-e]*$"))); |
155 | 154 |
156 // Test that we handle \s and \S correctly on special Unicode characters. | 155 // Test that we handle \s and \S correctly on special Unicode characters. |
157 re = r"\s"; | 156 re = r"\s"; |
158 assertTrue("\u2028".contains(new RegExp(re))); | 157 assertTrue("\u2028".contains(new RegExp(re))); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 re = r"\d+$"; | 276 re = r"\d+$"; |
278 assertFalse("123\nasdf".contains(new RegExp(re))); | 277 assertFalse("123\nasdf".contains(new RegExp(re))); |
279 re = new RegExp(r"\d+$", multiLine: true); | 278 re = new RegExp(r"\d+$", multiLine: true); |
280 assertTrue("123\nasdf".contains(re)); | 279 assertTrue("123\nasdf".contains(re)); |
281 | 280 |
282 // Test that empty matches are handled correctly for multiline global | 281 // Test that empty matches are handled correctly for multiline global |
283 // regexps. | 282 // regexps. |
284 re = new RegExp(r"^(.*)", multiLine: true); | 283 re = new RegExp(r"^(.*)", multiLine: true); |
285 assertEquals(3, re.allMatches("a\n\rb").length); | 284 assertEquals(3, re.allMatches("a\n\rb").length); |
286 assertEquals("*a\n*b\r*c\n*\r*d\r*\n*e", | 285 assertEquals("*a\n*b\r*c\n*\r*d\r*\n*e", |
287 "a\nb\rc\n\rd\r\ne".replaceAllMapped( | 286 "a\nb\rc\n\rd\r\ne".replaceAllMapped(re, (Match m) => "*${m.group(1)}")); |
288 re, (Match m) => "*${m.group(1)}")); | |
289 | 287 |
290 // Test that empty matches advance one character | 288 // Test that empty matches advance one character |
291 re = new RegExp(""); | 289 re = new RegExp(""); |
292 assertEquals("xAx", "A".replaceAll(re, "x")); | 290 assertEquals("xAx", "A".replaceAll(re, "x")); |
293 assertEquals(3, new String.fromCharCode(161).replaceAll(re, "x").length); | 291 assertEquals(3, new String.fromCharCode(161).replaceAll(re, "x").length); |
294 | 292 |
295 // Check for lazy RegExp literal creation | 293 // Check for lazy RegExp literal creation |
296 lazyLiteral(doit) { | 294 lazyLiteral(doit) { |
297 if (doit) return "".replaceAll( | 295 if (doit) |
298 new RegExp(r"foo(", caseSensitive: false), ""); | 296 return "".replaceAll(new RegExp(r"foo(", caseSensitive: false), ""); |
299 return true; | 297 return true; |
300 } | 298 } |
301 | 299 |
302 assertTrue(lazyLiteral(false)); | 300 assertTrue(lazyLiteral(false)); |
303 assertThrows(() => lazyLiteral(true)); | 301 assertThrows(() => lazyLiteral(true)); |
304 | 302 |
305 // Check $01 and $10 | 303 // Check $01 and $10 |
306 re = new RegExp("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)"); | 304 re = new RegExp("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)"); |
307 assertEquals("t", "123456789t".replaceAllMapped( | 305 assertEquals( |
308 re, (Match m) => m.group(10))); | 306 "t", "123456789t".replaceAllMapped(re, (Match m) => m.group(10))); |
309 assertEquals("15", "123456789t".replaceAllMapped( | 307 assertEquals( |
310 re, (Match m) => "${m.group(1)}5")); | 308 "15", "123456789t".replaceAllMapped(re, (Match m) => "${m.group(1)}5")); |
311 assertEquals("1", "123456789t".replaceAllMapped( | 309 assertEquals("1", "123456789t".replaceAllMapped(re, (Match m) => m.group(1))); |
312 re, (Match m) => m.group(1))); | |
313 | 310 |
314 assertFalse("football".contains(new RegExp(r"()foo$\1")), "football1"); | 311 assertFalse("football".contains(new RegExp(r"()foo$\1")), "football1"); |
315 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football2"); | 312 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football2"); |
316 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football3"); | 313 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football3"); |
317 assertTrue("foo".contains(new RegExp(r"()foo$\1")), "football4"); | 314 assertTrue("foo".contains(new RegExp(r"()foo$\1")), "football4"); |
318 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football5"); | 315 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football5"); |
319 assertTrue("foo".contains(new RegExp(r"()foo$(?!bar)")), "football6"); | 316 assertTrue("foo".contains(new RegExp(r"()foo$(?!bar)")), "football6"); |
320 assertFalse("football".contains(new RegExp(r"(x?)foo$\1")), "football7"); | 317 assertFalse("football".contains(new RegExp(r"(x?)foo$\1")), "football7"); |
321 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football8"); | 318 assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football8"); |
322 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football9"); | 319 assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football9"); |
323 assertTrue("foo".contains(new RegExp(r"(x?)foo$\1")), "football10"); | 320 assertTrue("foo".contains(new RegExp(r"(x?)foo$\1")), "football10"); |
324 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football11"); | 321 assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football11"); |
325 assertTrue("foo".contains(new RegExp(r"foo$(?!bar)")), "football12"); | 322 assertTrue("foo".contains(new RegExp(r"foo$(?!bar)")), "football12"); |
326 | 323 |
327 // Check that the back reference has two successors. See | 324 // Check that the back reference has two successors. See |
328 // BackReferenceNode::PropagateForward. | 325 // BackReferenceNode::PropagateForward. |
329 assertFalse('foo'.contains(new RegExp(r"f(o)\b\1"))); | 326 assertFalse('foo'.contains(new RegExp(r"f(o)\b\1"))); |
330 assertTrue('foo'.contains(new RegExp(r"f(o)\B\1"))); | 327 assertTrue('foo'.contains(new RegExp(r"f(o)\B\1"))); |
331 | 328 |
332 // Back-reference, ignore case: | 329 // Back-reference, ignore case: |
333 // ASCII | 330 // ASCII |
334 assertEquals("a", new RegExp(r"x(a)\1x", caseSensitive: false) | 331 assertEquals( |
335 .firstMatch("xaAx").group(1), "backref-ASCII"); | 332 "a", |
336 assertFalse("xaaaaa".contains(new RegExp(r"x(...)\1", | 333 new RegExp(r"x(a)\1x", caseSensitive: false).firstMatch("xaAx").group(1), |
337 caseSensitive: false)), | 334 "backref-ASCII"); |
| 335 assertFalse("xaaaaa".contains(new RegExp(r"x(...)\1", caseSensitive: false)), |
338 "backref-ASCII-short"); | 336 "backref-ASCII-short"); |
339 assertTrue("xx".contains(new RegExp(r"x((?:))\1\1x", caseSensitive: false)), | 337 assertTrue("xx".contains(new RegExp(r"x((?:))\1\1x", caseSensitive: false)), |
340 "backref-ASCII-empty"); | 338 "backref-ASCII-empty"); |
341 assertTrue("xabcx".contains( | 339 assertTrue( |
342 new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)), | 340 "xabcx".contains(new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)), |
343 "backref-ASCII-uncaptured"); | 341 "backref-ASCII-uncaptured"); |
344 assertTrue("xabcABCx".contains( | 342 assertTrue( |
345 new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)), | 343 "xabcABCx" |
| 344 .contains(new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)), |
346 "backref-ASCII-backtrack"); | 345 "backref-ASCII-backtrack"); |
347 assertEquals("aBc", new RegExp(r"x(...)\1\1x", caseSensitive: false) | 346 assertEquals( |
348 .firstMatch("xaBcAbCABCx").group(1), "backref-ASCII-twice"); | 347 "aBc", |
| 348 new RegExp(r"x(...)\1\1x", caseSensitive: false) |
| 349 .firstMatch("xaBcAbCABCx") |
| 350 .group(1), |
| 351 "backref-ASCII-twice"); |
349 | 352 |
350 for (var i = 0; i < 128; i++) { | 353 for (var i = 0; i < 128; i++) { |
351 var testName = "backref-ASCII-char-$i,,${i^0x20}"; | 354 var testName = "backref-ASCII-char-$i,,${i^0x20}"; |
352 var test = new String.fromCharCodes([i, i ^ 0x20]) | 355 var test = new String.fromCharCodes([i, i ^ 0x20]) |
353 .contains(new RegExp(r"^(.)\1$", caseSensitive: false)); | 356 .contains(new RegExp(r"^(.)\1$", caseSensitive: false)); |
354 if (('A'.codeUnitAt(0) <= i && i <= 'Z'.codeUnitAt(0)) || | 357 if (('A'.codeUnitAt(0) <= i && i <= 'Z'.codeUnitAt(0)) || |
355 ('a'.codeUnitAt(0) <= i && i <= 'z'.codeUnitAt(0))) { | 358 ('a'.codeUnitAt(0) <= i && i <= 'z'.codeUnitAt(0))) { |
356 assertTrue(test, testName); | 359 assertTrue(test, testName); |
357 } else { | 360 } else { |
358 assertFalse(test, testName); | 361 assertFalse(test, testName); |
359 } | 362 } |
360 } | 363 } |
361 | 364 |
362 assertFalse('foo'.contains(new RegExp(r"f(o)$\1")), | 365 assertFalse('foo'.contains(new RegExp(r"f(o)$\1")), "backref detects at_end"); |
363 "backref detects at_end"); | |
364 | 366 |
365 // Check decimal escapes doesn't overflow. | 367 // Check decimal escapes doesn't overflow. |
366 // (Note: \214 is interpreted as octal). | 368 // (Note: \214 is interpreted as octal). |
367 assertEquals("\x8c7483648", new RegExp(r"\2147483648") | 369 assertEquals( |
368 .firstMatch("\x8c7483648").group(0), "Overflow decimal escape"); | 370 "\x8c7483648", |
| 371 new RegExp(r"\2147483648").firstMatch("\x8c7483648").group(0), |
| 372 "Overflow decimal escape"); |
369 | 373 |
370 // Check numbers in quantifiers doesn't overflow and doesn't throw on | 374 // Check numbers in quantifiers doesn't overflow and doesn't throw on |
371 // too large numbers. | 375 // too large numbers. |
372 assertFalse('b'.contains( | 376 assertFalse( |
373 new RegExp(r"a{111111111111111111111111111111111111111111111}")), | 377 'b'.contains( |
374 "overlarge1"); | 378 new RegExp(r"a{111111111111111111111111111111111111111111111}")), |
375 assertFalse('b'.contains( | 379 "overlarge1"); |
376 new RegExp(r"a{999999999999999999999999999999999999999999999}")), | 380 assertFalse( |
377 "overlarge2"); | 381 'b'.contains( |
378 assertFalse('b'.contains( | 382 new RegExp(r"a{999999999999999999999999999999999999999999999}")), |
379 new RegExp(r"a{1,111111111111111111111111111111111111111111111}")), | 383 "overlarge2"); |
380 "overlarge3"); | 384 assertFalse( |
381 assertFalse('b'.contains( | 385 'b'.contains( |
382 new RegExp(r"a{1,999999999999999999999999999999999999999999999}")), | 386 new RegExp(r"a{1,111111111111111111111111111111111111111111111}")), |
383 "overlarge4"); | 387 "overlarge3"); |
384 assertFalse('b'.contains(new RegExp(r"a{2147483648}")), | 388 assertFalse( |
385 "overlarge5"); | 389 'b'.contains( |
386 assertFalse('b'.contains(new RegExp(r"a{21474836471}")), | 390 new RegExp(r"a{1,999999999999999999999999999999999999999999999}")), |
387 "overlarge6"); | 391 "overlarge4"); |
388 assertFalse('b'.contains(new RegExp(r"a{1,2147483648}")), | 392 assertFalse('b'.contains(new RegExp(r"a{2147483648}")), "overlarge5"); |
389 "overlarge7"); | 393 assertFalse('b'.contains(new RegExp(r"a{21474836471}")), "overlarge6"); |
390 assertFalse('b'.contains(new RegExp(r"a{1,21474836471}")), | 394 assertFalse('b'.contains(new RegExp(r"a{1,2147483648}")), "overlarge7"); |
391 "overlarge8"); | 395 assertFalse('b'.contains(new RegExp(r"a{1,21474836471}")), "overlarge8"); |
392 assertFalse('b'.contains(new RegExp(r"a{2147483648,2147483648}")), | 396 assertFalse( |
393 "overlarge9"); | 397 'b'.contains(new RegExp(r"a{2147483648,2147483648}")), "overlarge9"); |
394 assertFalse('b'.contains(new RegExp(r"a{21474836471,21474836471}")), | 398 assertFalse( |
395 "overlarge10"); | 399 'b'.contains(new RegExp(r"a{21474836471,21474836471}")), "overlarge10"); |
396 assertFalse('b'.contains(new RegExp(r"a{2147483647}")), | 400 assertFalse('b'.contains(new RegExp(r"a{2147483647}")), "overlarge11"); |
397 "overlarge11"); | 401 assertFalse('b'.contains(new RegExp(r"a{1,2147483647}")), "overlarge12"); |
398 assertFalse('b'.contains(new RegExp(r"a{1,2147483647}")), | 402 assertTrue('a'.contains(new RegExp(r"a{1,2147483647}")), "overlarge13"); |
399 "overlarge12"); | 403 assertFalse( |
400 assertTrue('a'.contains(new RegExp(r"a{1,2147483647}")), | 404 'a'.contains(new RegExp(r"a{2147483647,2147483647}")), "overlarge14"); |
401 "overlarge13"); | |
402 assertFalse('a'.contains(new RegExp(r"a{2147483647,2147483647}")), | |
403 "overlarge14"); | |
404 | 405 |
405 // Check that we don't read past the end of the string. | 406 // Check that we don't read past the end of the string. |
406 assertFalse('b'.contains(new RegExp(r"f"))); | 407 assertFalse('b'.contains(new RegExp(r"f"))); |
407 assertFalse('x'.contains(new RegExp(r"[abc]f"))); | 408 assertFalse('x'.contains(new RegExp(r"[abc]f"))); |
408 assertFalse('xa'.contains(new RegExp(r"[abc]f"))); | 409 assertFalse('xa'.contains(new RegExp(r"[abc]f"))); |
409 assertFalse('x'.contains(new RegExp(r"[abc]<"))); | 410 assertFalse('x'.contains(new RegExp(r"[abc]<"))); |
410 assertFalse('xa'.contains(new RegExp(r"[abc]<"))); | 411 assertFalse('xa'.contains(new RegExp(r"[abc]<"))); |
411 assertFalse('b'.contains(new RegExp(r"f", caseSensitive: false))); | 412 assertFalse('b'.contains(new RegExp(r"f", caseSensitive: false))); |
412 assertFalse('x'.contains(new RegExp(r"[abc]f", caseSensitive: false))); | 413 assertFalse('x'.contains(new RegExp(r"[abc]f", caseSensitive: false))); |
413 assertFalse('xa'.contains(new RegExp(r"[abc]f", caseSensitive: false))); | 414 assertFalse('xa'.contains(new RegExp(r"[abc]f", caseSensitive: false))); |
414 assertFalse('x'.contains(new RegExp(r"[abc]<", caseSensitive: false))); | 415 assertFalse('x'.contains(new RegExp(r"[abc]<", caseSensitive: false))); |
415 assertFalse('xa'.contains(new RegExp(r"[abc]<", caseSensitive: false))); | 416 assertFalse('xa'.contains(new RegExp(r"[abc]<", caseSensitive: false))); |
416 assertFalse('x'.contains(new RegExp(r"f[abc]"))); | 417 assertFalse('x'.contains(new RegExp(r"f[abc]"))); |
417 assertFalse('xa'.contains(new RegExp(r"f[abc]"))); | 418 assertFalse('xa'.contains(new RegExp(r"f[abc]"))); |
418 assertFalse('x'.contains(new RegExp(r"<[abc]"))); | 419 assertFalse('x'.contains(new RegExp(r"<[abc]"))); |
419 assertFalse('xa'.contains(new RegExp(r"<[abc]"))); | 420 assertFalse('xa'.contains(new RegExp(r"<[abc]"))); |
420 assertFalse('x'.contains(new RegExp(r"f[abc]", caseSensitive: false))); | 421 assertFalse('x'.contains(new RegExp(r"f[abc]", caseSensitive: false))); |
421 assertFalse('xa'.contains(new RegExp(r"f[abc]", caseSensitive: false))); | 422 assertFalse('xa'.contains(new RegExp(r"f[abc]", caseSensitive: false))); |
422 assertFalse('x'.contains(new RegExp(r"<[abc]", caseSensitive: false))); | 423 assertFalse('x'.contains(new RegExp(r"<[abc]", caseSensitive: false))); |
423 assertFalse('xa'.contains(new RegExp(r"<[abc]", caseSensitive: false))); | 424 assertFalse('xa'.contains(new RegExp(r"<[abc]", caseSensitive: false))); |
424 | 425 |
425 // Test that merging of quick test masks gets it right. | 426 // Test that merging of quick test masks gets it right. |
426 assertFalse('x7%%y'.contains(new RegExp(r"x([0-7]%%x|[0-6]%%y)")), 'qt'); | 427 assertFalse('x7%%y'.contains(new RegExp(r"x([0-7]%%x|[0-6]%%y)")), 'qt'); |
427 assertFalse('xy7%%%y'.contains( | 428 assertFalse( |
428 new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt2'); | 429 'xy7%%%y' |
429 assertFalse('xy%%%y'.contains( | 430 .contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), |
430 new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt3'); | 431 'qt2'); |
431 assertFalse('xy7%%%y'.contains( | 432 assertFalse( |
432 new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt4'); | 433 'xy%%%y' |
433 assertFalse('xy%%%y'.contains( | 434 .contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), |
434 new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt5'); | 435 'qt3'); |
435 assertFalse('xy7%%%y'.contains( | 436 assertFalse( |
436 new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt6'); | 437 'xy7%%%y'.contains(new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt4'); |
437 assertFalse('xy7%%%y'.contains( | 438 assertFalse( |
438 new RegExp(r"xy([0-7]%%%x|[0-6]%%%y)")), 'qt7'); | 439 'xy%%%y' |
439 assertFalse('x7%%%y'.contains(new RegExp(r"x([0-7]%%%x|[0-6]%%%y)")), | 440 .contains(new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), |
440 'qt8'); | 441 'qt5'); |
441 | 442 assertFalse( |
| 443 'xy7%%%y'.contains(new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt6'); |
| 444 assertFalse( |
| 445 'xy7%%%y'.contains(new RegExp(r"xy([0-7]%%%x|[0-6]%%%y)")), 'qt7'); |
| 446 assertFalse('x7%%%y'.contains(new RegExp(r"x([0-7]%%%x|[0-6]%%%y)")), 'qt8'); |
442 | 447 |
443 // Don't hang on this one. | 448 // Don't hang on this one. |
444 "".contains(new RegExp(r"[^\xfe-\xff]*")); | 449 "".contains(new RegExp(r"[^\xfe-\xff]*")); |
445 | 450 |
446 var longbuffer = new StringBuffer("a"); | 451 var longbuffer = new StringBuffer("a"); |
447 for (var i = 0; i < 100000; i++) { | 452 for (var i = 0; i < 100000; i++) { |
448 longbuffer.write("a?"); | 453 longbuffer.write("a?"); |
449 } | 454 } |
450 var long = longbuffer.toString(); | 455 var long = longbuffer.toString(); |
451 | 456 |
452 // Don't crash on this one, but maybe throw an exception. | 457 // Don't crash on this one, but maybe throw an exception. |
453 try { | 458 try { |
454 new RegExp(long).allMatches("a"); | 459 new RegExp(long).allMatches("a"); |
455 } catch (e) { | 460 } catch (e) { |
456 assertTrue(e.toString().indexOf("Stack overflow") >= 0, "overflow"); | 461 assertTrue(e.toString().indexOf("Stack overflow") >= 0, "overflow"); |
457 } | 462 } |
458 | 463 |
459 | |
460 // Test boundary-checks. | 464 // Test boundary-checks. |
461 void assertRegExpTest(re, input, test) { | 465 void assertRegExpTest(re, input, test) { |
462 assertEquals(test, input.contains( | 466 assertEquals( |
463 new RegExp(re)), "test:" + re + ":" + input); | 467 test, input.contains(new RegExp(re)), "test:" + re + ":" + input); |
464 } | 468 } |
465 | 469 |
466 assertRegExpTest(r"b\b", "b", true); | 470 assertRegExpTest(r"b\b", "b", true); |
467 assertRegExpTest(r"b\b$", "b", true); | 471 assertRegExpTest(r"b\b$", "b", true); |
468 assertRegExpTest(r"\bb", "b", true); | 472 assertRegExpTest(r"\bb", "b", true); |
469 assertRegExpTest(r"^\bb", "b", true); | 473 assertRegExpTest(r"^\bb", "b", true); |
470 assertRegExpTest(r",\b", ",", false); | 474 assertRegExpTest(r",\b", ",", false); |
471 assertRegExpTest(r",\b$", ",", false); | 475 assertRegExpTest(r",\b$", ",", false); |
472 assertRegExpTest(r"\b,", ",", false); | 476 assertRegExpTest(r"\b,", ",", false); |
473 assertRegExpTest(r"^\b,", ",", false); | 477 assertRegExpTest(r"^\b,", ",", false); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 assertThrows(() => new RegExp('(?!*)')); | 589 assertThrows(() => new RegExp('(?!*)')); |
586 | 590 |
587 // Test trimmed regular expression for RegExp.test(). | 591 // Test trimmed regular expression for RegExp.test(). |
588 assertTrue("abc".contains(new RegExp(r".*abc"))); | 592 assertTrue("abc".contains(new RegExp(r".*abc"))); |
589 assertFalse("q".contains(new RegExp(r".*\d+"))); | 593 assertFalse("q".contains(new RegExp(r".*\d+"))); |
590 | 594 |
591 // Tests skipped from V8: | 595 // Tests skipped from V8: |
592 // Test that RegExp.prototype.toString() throws TypeError for | 596 // Test that RegExp.prototype.toString() throws TypeError for |
593 // incompatible receivers (ES5 section 15.10.6 and 15.10.6.4). | 597 // incompatible receivers (ES5 section 15.10.6 and 15.10.6.4). |
594 } | 598 } |
OLD | NEW |