| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --harmony-regexp-named-captures | 5 // Flags: --harmony-regexp-named-captures |
| 6 | 6 |
| 7 // Malformed named captures. | 7 // Malformed named captures. |
| 8 assertThrows("/(?<>a)/u"); // Empty name. | 8 assertThrows("/(?<>a)/u"); // Empty name. |
| 9 assertThrows("/(?<aa)/u"); // Unterminated name. | 9 assertThrows("/(?<aa)/u"); // Unterminated name. |
| 10 assertThrows("/(?<42a>a)/u"); // Name starting with digits. | 10 assertThrows("/(?<42a>a)/u"); // Name starting with digits. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 { | 101 { |
| 102 let result = "abcd".replace(/(.)(.)/u, (match, fst, snd, offset, str) => { | 102 let result = "abcd".replace(/(.)(.)/u, (match, fst, snd, offset, str) => { |
| 103 assertEquals("ab", match); | 103 assertEquals("ab", match); |
| 104 assertEquals("a", fst); | 104 assertEquals("a", fst); |
| 105 assertEquals("b", snd); | 105 assertEquals("b", snd); |
| 106 assertEquals(0, offset); | 106 assertEquals(0, offset); |
| 107 assertEquals("abcd", str); | 107 assertEquals("abcd", str); |
| 108 return `${snd}${fst}`; | 108 return `${snd}${fst}`; |
| 109 }); | 109 }); |
| 110 assertEquals("bacd", result); | 110 assertEquals("bacd", result); |
| 111 |
| 112 assertEquals("undefinedbcd", "abcd".replace(/(.)|(.)/u, |
| 113 (match, fst, snd, offset, str) => snd)); |
| 111 } | 114 } |
| 112 | 115 |
| 113 // @@replace with a callable replacement argument (global, named captures). | 116 // @@replace with a callable replacement argument (global, named captures). |
| 114 { | 117 { |
| 115 let i = 0; | 118 let i = 0; |
| 116 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/gu, | 119 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/gu, |
| 117 (match, fst, snd, offset, str, groups) => { | 120 (match, fst, snd, offset, str, groups) => { |
| 118 if (i == 0) { | 121 if (i == 0) { |
| 119 assertEquals("ab", match); | 122 assertEquals("ab", match); |
| 120 assertEquals("a", groups.fst); | 123 assertEquals("a", groups.fst); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 131 assertEquals("d", snd); | 134 assertEquals("d", snd); |
| 132 assertEquals(2, offset); | 135 assertEquals(2, offset); |
| 133 assertEquals("abcd", str); | 136 assertEquals("abcd", str); |
| 134 } else { | 137 } else { |
| 135 assertUnreachable(); | 138 assertUnreachable(); |
| 136 } | 139 } |
| 137 i++; | 140 i++; |
| 138 return `${groups.snd}${groups.fst}`; | 141 return `${groups.snd}${groups.fst}`; |
| 139 }); | 142 }); |
| 140 assertEquals("badc", result); | 143 assertEquals("badc", result); |
| 144 |
| 145 assertEquals("undefinedundefinedundefinedundefined", |
| 146 "abcd".replace(/(?<fst>.)|(?<snd>.)/gu, |
| 147 (match, fst, snd, offset, str, groups) => groups.snd)); |
| 141 } | 148 } |
| 142 | 149 |
| 143 // @@replace with a callable replacement argument (non-global, named captures). | 150 // @@replace with a callable replacement argument (non-global, named captures). |
| 144 { | 151 { |
| 145 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/u, | 152 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/u, |
| 146 (match, fst, snd, offset, str, groups) => { | 153 (match, fst, snd, offset, str, groups) => { |
| 147 assertEquals("ab", match); | 154 assertEquals("ab", match); |
| 148 assertEquals("a", groups.fst); | 155 assertEquals("a", groups.fst); |
| 149 assertEquals("b", groups.snd); | 156 assertEquals("b", groups.snd); |
| 150 assertEquals("a", fst); | 157 assertEquals("a", fst); |
| 151 assertEquals("b", snd); | 158 assertEquals("b", snd); |
| 152 assertEquals(0, offset); | 159 assertEquals(0, offset); |
| 153 assertEquals("abcd", str); | 160 assertEquals("abcd", str); |
| 154 return `${groups.snd}${groups.fst}`; | 161 return `${groups.snd}${groups.fst}`; |
| 155 }); | 162 }); |
| 156 assertEquals("bacd", result); | 163 assertEquals("bacd", result); |
| 164 |
| 165 assertEquals("undefinedbcd", |
| 166 "abcd".replace(/(?<fst>.)|(?<snd>.)/u, |
| 167 (match, fst, snd, offset, str, groups) => groups.snd)); |
| 157 } | 168 } |
| 158 | 169 |
| 159 function toSlowMode(re) { | 170 function toSlowMode(re) { |
| 160 re.exec = (str) => RegExp.prototype.exec.call(re, str); | 171 re.exec = (str) => RegExp.prototype.exec.call(re, str); |
| 161 return re; | 172 return re; |
| 162 } | 173 } |
| 163 | 174 |
| 164 // @@replace with a callable replacement argument (slow, global, | 175 // @@replace with a callable replacement argument (slow, global, |
| 165 // named captures). | 176 // named captures). |
| 166 { | 177 { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 183 assertEquals("d", snd); | 194 assertEquals("d", snd); |
| 184 assertEquals(2, offset); | 195 assertEquals(2, offset); |
| 185 assertEquals("abcd", str); | 196 assertEquals("abcd", str); |
| 186 } else { | 197 } else { |
| 187 assertUnreachable(); | 198 assertUnreachable(); |
| 188 } | 199 } |
| 189 i++; | 200 i++; |
| 190 return `${groups.snd}${groups.fst}`; | 201 return `${groups.snd}${groups.fst}`; |
| 191 }); | 202 }); |
| 192 assertEquals("badc", result); | 203 assertEquals("badc", result); |
| 204 |
| 205 assertEquals("undefinedundefinedundefinedundefined", |
| 206 "abcd".replace(toSlowMode(/(?<fst>.)|(?<snd>.)/gu), |
| 207 (match, fst, snd, offset, str, groups) => groups.snd)); |
| 193 } | 208 } |
| 194 | 209 |
| 195 // @@replace with a callable replacement argument (slow, non-global, | 210 // @@replace with a callable replacement argument (slow, non-global, |
| 196 // named captures). | 211 // named captures). |
| 197 { | 212 { |
| 198 let re = toSlowMode(/(?<fst>.)(?<snd>.)/u); | 213 let re = toSlowMode(/(?<fst>.)(?<snd>.)/u); |
| 199 let result = "abcd".replace(re, (match, fst, snd, offset, str, groups) => { | 214 let result = "abcd".replace(re, (match, fst, snd, offset, str, groups) => { |
| 200 assertEquals("ab", match); | 215 assertEquals("ab", match); |
| 201 assertEquals("a", groups.fst); | 216 assertEquals("a", groups.fst); |
| 202 assertEquals("b", groups.snd); | 217 assertEquals("b", groups.snd); |
| 203 assertEquals("a", fst); | 218 assertEquals("a", fst); |
| 204 assertEquals("b", snd); | 219 assertEquals("b", snd); |
| 205 assertEquals(0, offset); | 220 assertEquals(0, offset); |
| 206 assertEquals("abcd", str); | 221 assertEquals("abcd", str); |
| 207 return `${groups.snd}${groups.fst}`; | 222 return `${groups.snd}${groups.fst}`; |
| 208 }); | 223 }); |
| 209 assertEquals("bacd", result); | 224 assertEquals("bacd", result); |
| 225 |
| 226 assertEquals("undefinedbcd", |
| 227 "abcd".replace(toSlowMode(/(?<fst>.)|(?<snd>.)/u), |
| 228 (match, fst, snd, offset, str, groups) => groups.snd)); |
| 210 } | 229 } |
| 211 | 230 |
| 212 // @@replace with a string replacement argument (no named captures). | 231 // @@replace with a string replacement argument (no named captures). |
| 213 { | 232 { |
| 214 let re = /(.)(.)/u; | 233 let re = /(.)(.)/u; |
| 215 assertEquals("$<snd>$<fst>cd", "abcd".replace(re, "$<snd>$<fst>")); | 234 assertEquals("$<snd>$<fst>cd", "abcd".replace(re, "$<snd>$<fst>")); |
| 216 assertEquals("bacd", "abcd".replace(re, "$2$1")); | 235 assertEquals("bacd", "abcd".replace(re, "$2$1")); |
| 217 assertEquals("$<sndcd", "abcd".replace(re, "$<snd")); | 236 assertEquals("$<sndcd", "abcd".replace(re, "$<snd")); |
| 218 assertEquals("$<42a>cd", "abcd".replace(re, "$<42$1>")); | 237 assertEquals("$<42a>cd", "abcd".replace(re, "$<42$1>")); |
| 219 assertEquals("$<thd>cd", "abcd".replace(re, "$<thd>")); | 238 assertEquals("$<thd>cd", "abcd".replace(re, "$<thd>")); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 // named captures). | 276 // named captures). |
| 258 { | 277 { |
| 259 let re = toSlowMode(/(?<fst>.)(?<snd>.)/u); | 278 let re = toSlowMode(/(?<fst>.)(?<snd>.)/u); |
| 260 assertEquals("bacd", "abcd".replace(re, "$<snd>$<fst>")); | 279 assertEquals("bacd", "abcd".replace(re, "$<snd>$<fst>")); |
| 261 assertEquals("bacd", "abcd".replace(re, "$2$1")); | 280 assertEquals("bacd", "abcd".replace(re, "$2$1")); |
| 262 assertThrows(() => "abcd".replace(re, "$<snd"), SyntaxError); | 281 assertThrows(() => "abcd".replace(re, "$<snd"), SyntaxError); |
| 263 assertEquals("cd", "abcd".replace(re, "$<42$1>")); | 282 assertEquals("cd", "abcd".replace(re, "$<42$1>")); |
| 264 assertEquals("cd", "abcd".replace(re, "$<thd>")); | 283 assertEquals("cd", "abcd".replace(re, "$<thd>")); |
| 265 assertEquals("cd", "abcd".replace(re, "$<$1>")); | 284 assertEquals("cd", "abcd".replace(re, "$<$1>")); |
| 266 } | 285 } |
| OLD | NEW |