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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 assertEquals("a", /(?<$𐒤>a)/u.exec("bab").groups.$𐒤); | 89 assertEquals("a", /(?<$𐒤>a)/u.exec("bab").groups.$𐒤); |
90 assertEquals("a", /(?<_\u200C>a)/u.exec("bab").groups._\u200C); | 90 assertEquals("a", /(?<_\u200C>a)/u.exec("bab").groups._\u200C); |
91 assertEquals("a", /(?<_\u200D>a)/u.exec("bab").groups._\u200D); | 91 assertEquals("a", /(?<_\u200D>a)/u.exec("bab").groups._\u200D); |
92 assertEquals("a", /(?<ಠ_ಠ>a)/u.exec("bab").groups.ಠ_ಠ); | 92 assertEquals("a", /(?<ಠ_ಠ>a)/u.exec("bab").groups.ಠ_ಠ); |
93 assertThrows('/(?<❤>a)/u', SyntaxError); | 93 assertThrows('/(?<❤>a)/u', SyntaxError); |
94 assertThrows('/(?<𐒤>a)/u', SyntaxError); // ID_Continue but not ID_Start. | 94 assertThrows('/(?<𐒤>a)/u', SyntaxError); // ID_Continue but not ID_Start. |
95 | 95 |
96 // The '__proto__' property on the groups object. | 96 // The '__proto__' property on the groups object. |
97 assertEquals(undefined, /(?<a>.)/u.exec("a").groups.__proto__); | 97 assertEquals(undefined, /(?<a>.)/u.exec("a").groups.__proto__); |
98 assertEquals("a", /(?<__proto__>a)/u.exec("a").groups.__proto__); | 98 assertEquals("a", /(?<__proto__>a)/u.exec("a").groups.__proto__); |
99 | |
100 // @@replace with a callable replacement argument (no named captures). | |
101 { | |
102 let result = "abcd".replace(/(.)(.)/u, (match, fst, snd, offset, str) => { | |
103 assertEquals("ab", match); | |
104 assertEquals("a", fst); | |
105 assertEquals("b", snd); | |
106 assertEquals(0, offset); | |
107 assertEquals("abcd", str); | |
108 return `${snd}${fst}`; | |
109 }); | |
110 assertEquals("bacd", result); | |
111 } | |
112 | |
113 // @@replace with a callable replacement argument (global, named captures). | |
114 { | |
115 let i = 0; | |
116 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/gu, | |
117 (match, fst, snd, groups, offset, str) => { | |
118 if (i == 0) { | |
119 assertEquals("ab", match); | |
120 assertEquals("a", groups.fst); | |
121 assertEquals("b", groups.snd); | |
122 assertEquals("a", fst); | |
123 assertEquals("b", snd); | |
124 assertEquals(0, offset); | |
125 assertEquals("abcd", str); | |
126 } else if (i == 1) { | |
127 assertEquals("cd", match); | |
128 assertEquals("c", groups.fst); | |
129 assertEquals("d", groups.snd); | |
130 assertEquals("c", fst); | |
131 assertEquals("d", snd); | |
132 assertEquals(2, offset); | |
133 assertEquals("abcd", str); | |
134 } else { | |
135 assertUnreachable(); | |
136 } | |
137 i++; | |
138 return `${groups.snd}${groups.fst}`; | |
139 }); | |
140 assertEquals("badc", result); | |
141 } | |
142 | |
143 // @@replace with a callable replacement argument (non-global, named captures). | |
144 { | |
145 let result = "abcd".replace(/(?<fst>.)(?<snd>.)/u, | |
146 (match, fst, snd, groups, offset, str) => { | |
147 assertEquals("ab", match); | |
148 assertEquals("a", groups.fst); | |
149 assertEquals("b", groups.snd); | |
150 assertEquals("a", fst); | |
151 assertEquals("b", snd); | |
152 assertEquals(0, offset); | |
153 assertEquals("abcd", str); | |
154 return `${groups.snd}${groups.fst}`; | |
155 }); | |
156 assertEquals("bacd", result); | |
157 } | |
158 | |
159 function toSlowMode(re) { | |
160 re.exec = (str) => RegExp.prototype.exec.call(re, str); | |
161 return re; | |
162 } | |
163 | |
164 // @@replace with a callable replacement argument (slow, global, | |
165 // named captures). | |
166 { | |
167 let i = 0; | |
168 let re = toSlowMode(/(?<fst>.)(?<snd>.)/gu); | |
169 let result = "abcd".replace(re, (match, fst, snd, groups, offset, str) => { | |
170 if (i == 0) { | |
171 assertEquals("ab", match); | |
172 assertEquals("a", groups.fst); | |
173 assertEquals("b", groups.snd); | |
174 assertEquals("a", fst); | |
175 assertEquals("b", snd); | |
176 assertEquals(0, offset); | |
177 assertEquals("abcd", str); | |
178 } else if (i == 1) { | |
179 assertEquals("cd", match); | |
180 assertEquals("c", groups.fst); | |
181 assertEquals("d", groups.snd); | |
182 assertEquals("c", fst); | |
183 assertEquals("d", snd); | |
184 assertEquals(2, offset); | |
185 assertEquals("abcd", str); | |
186 } else { | |
187 assertUnreachable(); | |
188 } | |
189 i++; | |
190 return `${groups.snd}${groups.fst}`; | |
191 }); | |
192 assertEquals("badc", result); | |
193 } | |
194 | |
195 // @@replace with a callable replacement argument (slow, non-global, | |
196 // named captures). | |
197 { | |
198 let re = toSlowMode(/(?<fst>.)(?<snd>.)/u); | |
199 let result = "abcd".replace(re, (match, fst, snd, groups, offset, str) => { | |
200 assertEquals("ab", match); | |
201 assertEquals("a", groups.fst); | |
202 assertEquals("b", groups.snd); | |
203 assertEquals("a", fst); | |
204 assertEquals("b", snd); | |
205 assertEquals(0, offset); | |
206 assertEquals("abcd", str); | |
207 return `${groups.snd}${groups.fst}`; | |
208 }); | |
209 assertEquals("bacd", result); | |
210 } | |
Yang
2017/03/23 14:58:22
Not directly related to this CL. Could we have som
jgruber
2017/03/24 14:06:46
Acknowledged.
| |
OLD | NEW |