| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Flags: --harmony-unicode-regexps --harmony-regexp-lookbehind | |
| 6 | |
| 7 function execl(expectation, regexp, subject) { | |
| 8 if (regexp instanceof String) regexp = new RegExp(regexp, "u"); | |
| 9 assertEquals(expectation, regexp.exec(subject)); | |
| 10 } | |
| 11 | |
| 12 function execs(expectation, regexp_source, subject) { | |
| 13 execl(expectation, new RegExp(regexp_source, "u"), subject); | |
| 14 } | |
| 15 | |
| 16 // Character ranges. | |
| 17 execl(["A"], /[A-D]/u, "A"); | |
| 18 execs(["A"], "[A-D]", "A"); | |
| 19 execl(["ABCD"], /[A-D]+/u, "ZABCDEF"); | |
| 20 execs(["ABCD"], "[A-D]+", "ZABCDEF"); | |
| 21 | |
| 22 execl(["\u{12345}"], /[\u1234-\u{12345}]/u, "\u{12345}"); | |
| 23 execs(["\u{12345}"], "[\u1234-\u{12345}]", "\u{12345}"); | |
| 24 execl(null, /[^\u1234-\u{12345}]/u, "\u{12345}"); | |
| 25 execs(null, "[^\u1234-\u{12345}]", "\u{12345}"); | |
| 26 | |
| 27 execl(["\u{1234}"], /[\u1234-\u{12345}]/u, "\u{1234}"); | |
| 28 execs(["\u{1234}"], "[\u1234-\u{12345}]", "\u{1234}"); | |
| 29 execl(null, /[^\u1234-\u{12345}]/u, "\u{1234}"); | |
| 30 execs(null, "[^\u1234-\u{12345}]", "\u{1234}"); | |
| 31 | |
| 32 execl(null, /[\u1234-\u{12345}]/u, "\u{1233}"); | |
| 33 execs(null, "[\u1234-\u{12345}]", "\u{1233}"); | |
| 34 execl(["\u{1233}"], /[^\u1234-\u{12345}]/u, "\u{1233}"); | |
| 35 execs(["\u{1233}"], "[^\u1234-\u{12345}]", "\u{1233}"); | |
| 36 | |
| 37 execl(["\u{12346}"], /[^\u1234-\u{12345}]/u, "\u{12346}"); | |
| 38 execs(["\u{12346}"], "[^\u1234-\u{12345}]", "\u{12346}"); | |
| 39 execl(null, /[\u1234-\u{12345}]/u, "\u{12346}"); | |
| 40 execs(null, "[\u1234-\u{12345}]", "\u{12346}"); | |
| 41 | |
| 42 execl(["\u{12342}"], /[\u{12340}-\u{12345}]/u, "\u{12342}"); | |
| 43 execs(["\u{12342}"], "[\u{12340}-\u{12345}]", "\u{12342}"); | |
| 44 execl(null, /[^\u{12340}-\u{12345}]/u, "\u{12342}"); | |
| 45 execs(null, "[^\u{12340}-\u{12345}]", "\u{12342}"); | |
| 46 | |
| 47 execl(["\u{ffff}"], /[\u{ff80}-\u{12345}]/u, "\u{ffff}"); | |
| 48 execs(["\u{ffff}"], "[\u{ff80}-\u{12345}]", "\u{ffff}"); | |
| 49 execl(null, /[^\u{ff80}-\u{12345}]/u, "\u{ffff}"); | |
| 50 execs(null, "[^\u{ff80}-\u{12345}]", "\u{ffff}"); | |
| 51 | |
| 52 // Lone surrogate | |
| 53 execl(["\ud800"], /[^\u{ff80}-\u{12345}]/u, "\uff99\u{d800}A"); | |
| 54 execs(["\udc00"], "[^\u{ff80}-\u{12345}]", "\uff99\u{dc00}A"); | |
| 55 execl(["\udc01"], /[\u0100-\u{10ffff}]/u, "A\udc01"); | |
| 56 execl(["\udc03"], /[\udc01-\udc03]/u, "\ud801\udc02\udc03"); | |
| 57 execl(["\ud801"], /[\ud801-\ud803]/u, "\ud802\udc01\ud801"); | |
| 58 | |
| 59 // Paired sorrogate. | |
| 60 execl(null, /[^\u{ff80}-\u{12345}]/u, "\u{d800}\u{dc00}"); | |
| 61 execs(null, "[^\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}"); | |
| 62 execl(["\ud800\udc00"], /[\u{ff80}-\u{12345}]/u, "\u{d800}\u{dc00}"); | |
| 63 execs(["\ud800\udc00"], "[\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}"); | |
| 64 execl(["foo\u{10e6d}bar"], /foo\ud803\ude6dbar/u, "foo\u{10e6d}bar"); | |
| 65 | |
| 66 // Lone surrogates | |
| 67 execl(["\ud801\ud801"], /\ud801+/u, "\ud801\udc01\ud801\ud801"); | |
| 68 execl(["\udc01\udc01"], /\udc01+/u, "\ud801\ud801\udc01\udc01\udc01"); | |
| 69 | |
| 70 execl(["\udc02\udc03A"], /\W\WA/u, "\ud801\udc01A\udc02\udc03A"); | |
| 71 execl(["\ud801\ud802"], /\ud801./u, "\ud801\udc01\ud801\ud802"); | |
| 72 execl(["\udc02\udc03A"], /[\ud800-\udfff][\ud800-\udfff]A/u, | |
| 73 "\ud801\udc01A\udc02\udc03A"); | |
| 74 | |
| 75 // Character classes | |
| 76 execl(null, /\w/u, "\ud801\udc01"); | |
| 77 execl(["\ud801"], /[^\w]/, "\ud801\udc01"); | |
| 78 execl(["\ud801\udc01"], /[^\w]/u, "\ud801\udc01"); | |
| 79 execl(["\ud801"], /\W/, "\ud801\udc01"); | |
| 80 execl(["\ud801\udc01"], /\W/u, "\ud801\udc01"); | |
| 81 | |
| 82 execl(["\ud800X"], /.X/u, "\ud800XaX"); | |
| 83 execl(["aX"], /.(?<!\ud800)X/u, "\ud800XaX"); | |
| 84 execl(["aX"], /.(?<![\ud800-\ud900])X/u, "\ud800XaX"); | |
| 85 | |
| 86 execl(null, /[]/u, "\u1234"); | |
| 87 execl(["0abc"], /[^]abc/u, "0abc"); | |
| 88 execl(["\u1234abc"], /[^]abc/u, "\u1234abc"); | |
| 89 execl(["\u{12345}abc"], /[^]abc/u, "\u{12345}abc"); | |
| 90 | |
| 91 // Backward matches of lone surrogates. | |
| 92 execl(["B", "\ud803A"], /(?<=([\ud800-\ud900]A))B/u, | |
| 93 "\ud801\udc00AB\udc00AB\ud802\ud803AB"); | |
| 94 execl(["B", "\udc00A"], /(?<=([\ud800-\u{10300}]A))B/u, | |
| 95 "\ud801\udc00AB\udc00AB\ud802\ud803AB"); | |
| 96 execl(["B", "\udc11A"], /(?<=([\udc00-\udd00]A))B/u, | |
| 97 "\ud801\udc00AB\udc11AB\ud802\ud803AB"); | |
| 98 execl(["X", "\ud800C"], /(?<=(\ud800\w))X/u, | |
| 99 "\ud800\udc00AX\udc11BX\ud800\ud800CX"); | |
| 100 execl(["C", "\ud800\ud800"], /(?<=(\ud800.))\w/u, | |
| 101 "\ud800\udc00AX\udc11BX\ud800\ud800CX"); | |
| 102 execl(["X", "\udc01C"], /(?<=(\udc01\w))X/u, | |
| 103 "\ud800\udc01AX\udc11BX\udc01\udc01CX"); | |
| 104 execl(["C", "\udc01\udc01"], /(?<=(\udc01.))./u, | |
| 105 "\ud800\udc01AX\udc11BX\udc01\udc01CX"); | |
| 106 | |
| 107 | |
| 108 var L = "\ud800"; | |
| 109 var T = "\udc00"; | |
| 110 var X = "X"; | |
| 111 | |
| 112 // Test string contains only match. | |
| 113 function testw(expect, src, subject) { | |
| 114 var re = new RegExp("^" + src + "$", "u"); | |
| 115 assertEquals(expect, re.test(subject)); | |
| 116 } | |
| 117 | |
| 118 // Test string starts with match. | |
| 119 function tests(expect, src, subject) { | |
| 120 var re = new RegExp("^" + src, "u"); | |
| 121 assertEquals(expect, re.test(subject)); | |
| 122 } | |
| 123 | |
| 124 testw(true, X, X); | |
| 125 testw(true, L, L); | |
| 126 testw(true, T, T); | |
| 127 testw(true, L + T, L + T); | |
| 128 testw(true, T + L, T + L); | |
| 129 testw(false, T, L + T); | |
| 130 testw(false, L, L + T); | |
| 131 testw(true, ".(?<=" + L + ")", L); | |
| 132 testw(true, ".(?<=" + T + ")", T); | |
| 133 testw(true, ".(?<=" + L + T + ")", L + T); | |
| 134 testw(true, ".(?<=" + L + T + ")", L + T); | |
| 135 tests(true, ".(?<=" + T + ")", T + L); | |
| 136 tests(false, ".(?<=" + L + ")", L + T); | |
| 137 tests(false, ".(?<=" + T + ")", L + T); | |
| 138 tests(true, "..(?<=" + T + ")", T + T + L); | |
| 139 tests(true, "..(?<=" + T + ")", X + T + L); | |
| 140 tests(true, "...(?<=" + L + ")", X + T + L); | |
| 141 tests(false, "...(?<=" + T + ")", X + L + T) | |
| 142 tests(true, "..(?<=" + L + T + ")", X + L + T) | |
| 143 tests(true, "..(?<=" + L + T + "(?<=" + L + T + "))", X + L + T); | |
| 144 tests(false, "..(?<=" + L + "(" + T + "))", X + L + T); | |
| 145 tests(false, ".*" + L, X + L + T); | |
| 146 tests(true, ".*" + L, X + L + L + T); | |
| 147 tests(false, ".*" + L, X + L + T + L + T); | |
| 148 tests(false, ".*" + T, X + L + T + L + T); | |
| 149 tests(true, ".*" + T, X + L + T + T + L + T); | |
| OLD | NEW |