comparison src/testdir/test_regexp_latin.vim @ 18898:ad9e9e92ad55 v8.2.0010

patch 8.2.0010: test64 is old style Commit: https://github.com/vim/vim/commit/f9cb05c14753d984f002c0c090688f8510147e6b Author: Bram Moolenaar <Bram@vim.org> Date: Sun Dec 15 13:39:22 2019 +0100 patch 8.2.0010: test64 is old style Problem: Test64 is old style. Solution: Convert to new style test. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5363)
author Bram Moolenaar <Bram@vim.org>
date Sun, 15 Dec 2019 13:45:04 +0100
parents fec4416adb80
children 2a017e9dc6da
comparison
equal deleted inserted replaced
18897:e96a45cb70d2 18898:ad9e9e92ad55
139 " this used to be very slow, not it should be about a second 139 " this used to be very slow, not it should be about a second
140 set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179} 140 set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
141 call assert_inrange(0.01, 10.0, reltimefloat(reltime(start))) 141 call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
142 set spc= 142 set spc=
143 endfunc 143 endfunc
144
145 " Tests for regexp patterns without multi-byte support.
146 func Test_regexp_single_line_pat()
147 " tl is a List of Lists with:
148 " regexp engine
149 " regexp pattern
150 " text to test the pattern on
151 " expected match (optional)
152 " expected submatch 1 (optional)
153 " expected submatch 2 (optional)
154 " etc.
155 " When there is no match use only the first two items.
156 let tl = []
157
158 call add(tl, [2, 'ab', 'aab', 'ab'])
159 call add(tl, [2, 'b', 'abcdef', 'b'])
160 call add(tl, [2, 'bc*', 'abccccdef', 'bcccc'])
161 call add(tl, [2, 'bc\{-}', 'abccccdef', 'b'])
162 call add(tl, [2, 'bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd'])
163 call add(tl, [2, 'bc*', 'abbdef', 'b'])
164 call add(tl, [2, 'c*', 'ccc', 'ccc'])
165 call add(tl, [2, 'bc*', 'abdef', 'b'])
166 call add(tl, [2, 'c*', 'abdef', ''])
167 call add(tl, [2, 'bc\+', 'abccccdef', 'bcccc'])
168 call add(tl, [2, 'bc\+', 'abdef']) " no match
169
170 " operator \|
171 call add(tl, [2, 'a\|ab', 'cabd', 'a']) " alternation is ordered
172
173 call add(tl, [2, 'c\?', 'ccb', 'c'])
174 call add(tl, [2, 'bc\?', 'abd', 'b'])
175 call add(tl, [2, 'bc\?', 'abccd', 'bc'])
176
177 call add(tl, [2, '\va{1}', 'ab', 'a'])
178
179 call add(tl, [2, '\va{2}', 'aa', 'aa'])
180 call add(tl, [2, '\va{2}', 'caad', 'aa'])
181 call add(tl, [2, '\va{2}', 'aba'])
182 call add(tl, [2, '\va{2}', 'ab'])
183 call add(tl, [2, '\va{2}', 'abaa', 'aa'])
184 call add(tl, [2, '\va{2}', 'aaa', 'aa'])
185
186 call add(tl, [2, '\vb{1}', 'abca', 'b'])
187 call add(tl, [2, '\vba{2}', 'abaa', 'baa'])
188 call add(tl, [2, '\vba{3}', 'aabaac'])
189
190 call add(tl, [2, '\v(ab){1}', 'ab', 'ab', 'ab'])
191 call add(tl, [2, '\v(ab){1}', 'dabc', 'ab', 'ab'])
192 call add(tl, [2, '\v(ab){1}', 'acb'])
193
194 call add(tl, [2, '\v(ab){0,2}', 'acb', "", ""])
195 call add(tl, [2, '\v(ab){0,2}', 'ab', 'ab', 'ab'])
196 call add(tl, [2, '\v(ab){1,2}', 'ab', 'ab', 'ab'])
197 call add(tl, [2, '\v(ab){1,2}', 'ababc', 'abab', 'ab'])
198 call add(tl, [2, '\v(ab){2,4}', 'ababcab', 'abab', 'ab'])
199 call add(tl, [2, '\v(ab){2,4}', 'abcababa', 'abab', 'ab'])
200
201 call add(tl, [2, '\v(ab){2}', 'abab', 'abab', 'ab'])
202 call add(tl, [2, '\v(ab){2}', 'cdababe', 'abab', 'ab'])
203 call add(tl, [2, '\v(ab){2}', 'abac'])
204 call add(tl, [2, '\v(ab){2}', 'abacabab', 'abab', 'ab'])
205 call add(tl, [2, '\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab'])
206 call add(tl, [2, '\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab'])
207
208 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
209 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
210 call add(tl, [2, '\v(a{2}){1}', 'aaac', 'aa', 'aa'])
211 call add(tl, [2, '\v(a{2}){1}', 'daaac', 'aa', 'aa'])
212 call add(tl, [2, '\v(a{1}){2}', 'daaac', 'aa', 'a'])
213 call add(tl, [2, '\v(a{1}){2}', 'aaa', 'aa', 'a'])
214 call add(tl, [2, '\v(a{2})+', 'adaac', 'aa', 'aa'])
215 call add(tl, [2, '\v(a{2})+', 'aa', 'aa', 'aa'])
216 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
217 call add(tl, [2, '\v(a{1}){2}', 'aa', 'aa', 'a'])
218 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
219 call add(tl, [2, '\v(a{2}){2}', 'aaaa', 'aaaa', 'aa'])
220 call add(tl, [2, '\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa'])
221
222 call add(tl, [2, '\v(a+){2}', 'dadaac', 'aa', 'a'])
223 call add(tl, [2, '\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa'])
224
225 call add(tl, [2, '\v(a{1,2}){2}', 'daaac', 'aaa', 'a'])
226 call add(tl, [2, '\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a'])
227 call add(tl, [2, '\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa'])
228 call add(tl, [2, '\v(a{1,3}){3}', 'daac'])
229 call add(tl, [2, '\v(a{1,2}){2}', 'dac'])
230 call add(tl, [2, '\v(a+)+', 'daac', 'aa', 'aa'])
231 call add(tl, [2, '\v(a+)+', 'aaa', 'aaa', 'aaa'])
232 call add(tl, [2, '\v(a+){1,2}', 'aaa', 'aaa', 'aaa'])
233 call add(tl, [2, '\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a'])
234 call add(tl, [2, '\v(a{3})+', 'daaaac', 'aaa', 'aaa'])
235 call add(tl, [2, '\v(a|b|c)+', 'aacb', 'aacb', 'b'])
236 call add(tl, [2, '\v(a|b|c){2}', 'abcb', 'ab', 'b'])
237 call add(tl, [2, '\v(abc){2}', 'abcabd', ])
238 call add(tl, [2, '\v(abc){2}', 'abdabcabc','abcabc', 'abc'])
239
240 call add(tl, [2, 'a*', 'cc', ''])
241 call add(tl, [2, '\v(a*)+', 'cc', ''])
242 call add(tl, [2, '\v((ab)+)+', 'ab', 'ab', 'ab', 'ab'])
243 call add(tl, [2, '\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab'])
244 call add(tl, [2, '\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab'])
245 call add(tl, [2, '\v(a{0,2})+', 'cc', ''])
246 call add(tl, [2, '\v(a*)+', '', ''])
247 call add(tl, [2, '\v((a*)+)+', '', ''])
248 call add(tl, [2, '\v((ab)*)+', '', ''])
249 call add(tl, [2, '\va{1,3}', 'aab', 'aa'])
250 call add(tl, [2, '\va{2,3}', 'abaa', 'aa'])
251
252 call add(tl, [2, '\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
253 call add(tl, [2, '\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb'])
254 call add(tl, [2, '\va{2}|b{2}', 'abab'])
255 call add(tl, [2, '\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a'])
256 call add(tl, [2, '\vab{2,3}c', 'aabbccccccccccccc', 'abbc'])
257 call add(tl, [2, '\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc'])
258 call add(tl, [2, '\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde'])
259 call add(tl, [2, '\va(bc){2}d', 'aabcbfbc' ])
260 call add(tl, [2, '\va*a{2}', 'a', ])
261 call add(tl, [2, '\va*a{2}', 'aa', 'aa' ])
262 call add(tl, [2, '\va*a{2}', 'aaa', 'aaa' ])
263 call add(tl, [2, '\va*a{2}', 'bbbabcc', ])
264 call add(tl, [2, '\va*b*|a*c*', 'a', 'a'])
265 call add(tl, [2, '\va{1}b{1}|a{1}b{1}', ''])
266
267 " submatches
268 call add(tl, [2, '\v(a)', 'ab', 'a', 'a'])
269 call add(tl, [2, '\v(a)(b)', 'ab', 'ab', 'a', 'b'])
270 call add(tl, [2, '\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c'])
271 call add(tl, [2, '\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b'])
272 call add(tl, [2, '\v(a)|(b)', 'ab', 'a', 'a'])
273
274 call add(tl, [2, '\v(a*)+', 'aaaa', 'aaaa', ''])
275 call add(tl, [2, 'x', 'abcdef'])
276
277 "
278 " Simple tests
279 "
280
281 " Search single groups
282 call add(tl, [2, 'ab', 'aab', 'ab'])
283 call add(tl, [2, 'ab', 'baced'])
284 call add(tl, [2, 'ab', ' ab ', 'ab'])
285
286 " Search multi-modifiers
287 call add(tl, [2, 'x*', 'xcd', 'x'])
288 call add(tl, [2, 'x*', 'xxxxxxxxxxxxxxxxsofijiojgf', 'xxxxxxxxxxxxxxxx'])
289 " empty match is good
290 call add(tl, [2, 'x*', 'abcdoij', ''])
291 " no match here
292 call add(tl, [2, 'x\+', 'abcdoin'])
293 call add(tl, [2, 'x\+', 'abcdeoijdfxxiuhfij', 'xx'])
294 call add(tl, [2, 'x\+', 'xxxxx', 'xxxxx'])
295 call add(tl, [2, 'x\+', 'abc x siufhiush xxxxxxxxx', 'x'])
296 call add(tl, [2, 'x\=', 'x sdfoij', 'x'])
297 call add(tl, [2, 'x\=', 'abc sfoij', '']) " empty match is good
298 call add(tl, [2, 'x\=', 'xxxxxxxxx c', 'x'])
299 call add(tl, [2, 'x\?', 'x sdfoij', 'x'])
300 " empty match is good
301 call add(tl, [2, 'x\?', 'abc sfoij', ''])
302 call add(tl, [2, 'x\?', 'xxxxxxxxxx c', 'x'])
303
304 call add(tl, [2, 'a\{0,0}', 'abcdfdoij', ''])
305 " same thing as 'a?'
306 call add(tl, [2, 'a\{0,1}', 'asiubid axxxaaa', 'a'])
307 " same thing as 'a\{0,1}'
308 call add(tl, [2, 'a\{1,0}', 'asiubid axxxaaa', 'a'])
309 call add(tl, [2, 'a\{3,6}', 'aa siofuh'])
310 call add(tl, [2, 'a\{3,6}', 'aaaaa asfoij afaa', 'aaaaa'])
311 call add(tl, [2, 'a\{3,6}', 'aaaaaaaa', 'aaaaaa'])
312 call add(tl, [2, 'a\{0}', 'asoiuj', ''])
313 call add(tl, [2, 'a\{2}', 'aaaa', 'aa'])
314 call add(tl, [2, 'a\{2}', 'iuash fiusahfliusah fiushfilushfi uhsaifuh askfj nasfvius afg aaaa sfiuhuhiushf', 'aa'])
315 call add(tl, [2, 'a\{2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
316 " same thing as 'a*'
317 call add(tl, [2, 'a\{0,}', 'oij sdigfusnf', ''])
318 call add(tl, [2, 'a\{0,}', 'aaaaa aa', 'aaaaa'])
319 call add(tl, [2, 'a\{2,}', 'sdfiougjdsafg'])
320 call add(tl, [2, 'a\{2,}', 'aaaaasfoij ', 'aaaaa'])
321 call add(tl, [2, 'a\{5,}', 'xxaaaaxxx '])
322 call add(tl, [2, 'a\{5,}', 'xxaaaaaxxx ', 'aaaaa'])
323 call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
324 call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
325 call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
326 " leading star as normal char when \{} follows
327 call add(tl, [2, '^*\{4,}$', '***'])
328 call add(tl, [2, '^*\{4,}$', '****', '****'])
329 call add(tl, [2, '^*\{4,}$', '*****', '*****'])
330 " same thing as 'a*'
331 call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
332 call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
333
334 call add(tl, [2, 'a\{-0,0}', 'abcdfdoij', ''])
335 " anti-greedy version of 'a?'
336 call add(tl, [2, 'a\{-0,1}', 'asiubid axxxaaa', ''])
337 call add(tl, [2, 'a\{-3,6}', 'aa siofuh'])
338 call add(tl, [2, 'a\{-3,6}', 'aaaaa asfoij afaa', 'aaa'])
339 call add(tl, [2, 'a\{-3,6}', 'aaaaaaaa', 'aaa'])
340 call add(tl, [2, 'a\{-0}', 'asoiuj', ''])
341 call add(tl, [2, 'a\{-2}', 'aaaa', 'aa'])
342 call add(tl, [2, 'a\{-2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
343 call add(tl, [2, 'a\{-0,}', 'oij sdigfusnf', ''])
344 call add(tl, [2, 'a\{-0,}', 'aaaaa aa', ''])
345 call add(tl, [2, 'a\{-2,}', 'sdfiougjdsafg'])
346 call add(tl, [2, 'a\{-2,}', 'aaaaasfoij ', 'aa'])
347 call add(tl, [2, 'a\{-,0}', 'oidfguih iuhi hiu aaaa', ''])
348 call add(tl, [2, 'a\{-,5}', 'abcd', ''])
349 call add(tl, [2, 'a\{-,5}', 'aaaaaaaaaa', ''])
350 " anti-greedy version of 'a*'
351 call add(tl, [2, 'a\{-}', 'bbbcddiuhfcd', ''])
352 call add(tl, [2, 'a\{-}', 'aaaaioudfh coisf jda', ''])
353
354 " Test groups of characters and submatches
355 call add(tl, [2, '\(abc\)*', 'abcabcabc', 'abcabcabc', 'abc'])
356 call add(tl, [2, '\(ab\)\+', 'abababaaaaa', 'ababab', 'ab'])
357 call add(tl, [2, '\(abaaaaa\)*cd', 'cd', 'cd', ''])
358 call add(tl, [2, '\(test1\)\? \(test2\)\?', 'test1 test3', 'test1 ', 'test1', ''])
359 call add(tl, [2, '\(test1\)\= \(test2\) \(test4443\)\=', ' test2 test4443 yupiiiiiiiiiii', ' test2 test4443', '', 'test2', 'test4443'])
360 call add(tl, [2, '\(\(sub1\) hello \(sub 2\)\)', 'asterix sub1 hello sub 2 obelix', 'sub1 hello sub 2', 'sub1 hello sub 2', 'sub1', 'sub 2'])
361 call add(tl, [2, '\(\(\(yyxxzz\)\)\)', 'abcdddsfiusfyyzzxxyyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz'])
362 call add(tl, [2, '\v((ab)+|c+)+', 'abcccaba', 'abcccab', 'ab', 'ab'])
363 call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
364 call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
365 call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
366 call add(tl, [2, '\p*', 'aá ', 'aá '])
367
368 " Test greedy-ness and lazy-ness
369 call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
370 call add(tl, [2, 'a\{-2,7}x','aaaaaaaaax', 'aaaaaaax'])
371 call add(tl, [2, 'a\{2,7}','aaaaaaaaaaaaaaaaaaaa', 'aaaaaaa'])
372 call add(tl, [2, 'a\{2,7}x','aaaaaaaaax', 'aaaaaaax'])
373 call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
374 call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa',''])
375 call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
376 call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
377 call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
378 call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
379 call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
380 call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
381
382 " Test Character classes
383 call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
384
385 " Test collections and character range []
386 call add(tl, [2, '\v[a]', 'abcd', 'a'])
387 call add(tl, [2, 'a[bcd]', 'abcd', 'ab'])
388 call add(tl, [2, 'a[b-d]', 'acbd', 'ac'])
389 call add(tl, [2, '[a-d][e-f][x-x]d', 'cexdxx', 'cexd'])
390 call add(tl, [2, '\v[[:alpha:]]+', 'abcdefghijklmnopqrstuvwxyz6','abcdefghijklmnopqrstuvwxyz'])
391 call add(tl, [2, '[[:alpha:]\+]', '6x8','x'])
392 call add(tl, [2, '[^abc]\+','abcabcabc'])
393 call add(tl, [2, '[^abc]','defghiasijvoinasoiunbvb','d'])
394 call add(tl, [2, '[^abc]\+','ddddddda','ddddddd'])
395 call add(tl, [2, '[^a-d]\+','aaaAAAZIHFNCddd','AAAZIHFNC'])
396 call add(tl, [2, '[a-f]*','iiiiiiii',''])
397 call add(tl, [2, '[a-f]*','abcdefgh','abcdef'])
398 call add(tl, [2, '[^a-f]\+','abcdefgh','gh'])
399 call add(tl, [2, '[a-c]\{-3,6}','abcabc','abc'])
400 call add(tl, [2, '[^[:alpha:]]\+','abcccadfoij7787ysf287yrnccdu','7787'])
401 call add(tl, [2, '[-a]', '-', '-'])
402 call add(tl, [2, '[a-]', '-', '-'])
403 call add(tl, [2, '[a-f]*\c','ABCDEFGH','ABCDEF'])
404 call add(tl, [2, '[abc][xyz]\c','-af-AF-BY--','BY'])
405 " filename regexp
406 call add(tl, [2, '[-./[:alnum:]_~]\+', 'log13.file', 'log13.file'])
407 " special chars
408 call add(tl, [2, '[\]\^\-\\]\+', '\^\\\-\---^', '\^\\\-\---^'])
409 " collation elem
410 call add(tl, [2, '[[.a.]]\+', 'aa', 'aa'])
411 " middle of regexp
412 call add(tl, [2, 'abc[0-9]*ddd', 'siuhabc ii'])
413 call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
414 call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
415 call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
416 call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
417 call add(tl, [2, '\_f', " \na ", "\n"])
418 call add(tl, [2, '\_f\+', " \na ", "\na"])
419 call add(tl, [2, '[0-9A-Za-z-_.]\+', " @0_a.A-{ ", "0_a.A-"])
420
421 " Test start/end of line, start/end of file
422 call add(tl, [2, '^a.', "a_\nb ", "a_"])
423 call add(tl, [2, '^a.', "b a \na_"])
424 call add(tl, [2, '.a$', " a\n "])
425 call add(tl, [2, '.a$', " a b\n_a", "_a"])
426 call add(tl, [2, '\%^a.', "a a\na", "a "])
427 call add(tl, [2, '\%^a', " a \na "])
428 call add(tl, [2, '.a\%$', " a\n "])
429 call add(tl, [2, '.a\%$', " a\n_a", "_a"])
430
431 " Test recognition of character classes
432 call add(tl, [2, '[0-7]\+', 'x0123456789x', '01234567'])
433 call add(tl, [2, '[^0-7]\+', '0a;X+% 897', 'a;X+% 89'])
434 call add(tl, [2, '[0-9]\+', 'x0123456789x', '0123456789'])
435 call add(tl, [2, '[^0-9]\+', '0a;X+% 9', 'a;X+% '])
436 call add(tl, [2, '[0-9a-fA-F]\+', 'x0189abcdefg', '0189abcdef'])
437 call add(tl, [2, '[^0-9A-Fa-f]\+', '0189g;X+% ab', 'g;X+% '])
438 call add(tl, [2, '[a-z_A-Z0-9]\+', ';+aso_SfOij ', 'aso_SfOij'])
439 call add(tl, [2, '[^a-z_A-Z0-9]\+', 'aSo_;+% sfOij', ';+% '])
440 call add(tl, [2, '[a-z_A-Z]\+', '0abyz_ABYZ;', 'abyz_ABYZ'])
441 call add(tl, [2, '[^a-z_A-Z]\+', 'abAB_09;+% yzYZ', '09;+% '])
442 call add(tl, [2, '[a-z]\+', '0abcxyz1', 'abcxyz'])
443 call add(tl, [2, '[a-z]\+', 'AabxyzZ', 'abxyz'])
444 call add(tl, [2, '[^a-z]\+', 'a;X09+% x', ';X09+% '])
445 call add(tl, [2, '[^a-z]\+', 'abX0;%yz', 'X0;%'])
446 call add(tl, [2, '[a-zA-Z]\+', '0abABxzXZ9', 'abABxzXZ'])
447 call add(tl, [2, '[^a-zA-Z]\+', 'ab09_;+ XZ', '09_;+ '])
448 call add(tl, [2, '[A-Z]\+', 'aABXYZz', 'ABXYZ'])
449 call add(tl, [2, '[^A-Z]\+', 'ABx0;%YZ', 'x0;%'])
450 call add(tl, [2, '[a-z]\+\c', '0abxyzABXYZ;', 'abxyzABXYZ'])
451 call add(tl, [2, '[A-Z]\+\c', '0abABxzXZ9', 'abABxzXZ'])
452 call add(tl, [2, '\c[^a-z]\+', 'ab09_;+ XZ', '09_;+ '])
453 call add(tl, [2, '\c[^A-Z]\+', 'ab09_;+ XZ', '09_;+ '])
454 call add(tl, [2, '\C[^A-Z]\+', 'ABCOIJDEOIFNSD jsfoij sa', ' jsfoij sa'])
455
456 " Tests for \z features
457 " match ends at \ze
458 call add(tl, [2, 'xx \ze test', 'xx '])
459 call add(tl, [2, 'abc\zeend', 'oij abcend', 'abc'])
460 call add(tl, [2, 'aa\zebb\|aaxx', ' aabb ', 'aa'])
461 call add(tl, [2, 'aa\zebb\|aaxx', ' aaxx ', 'aaxx'])
462 call add(tl, [2, 'aabb\|aa\zebb', ' aabb ', 'aabb'])
463 call add(tl, [2, 'aa\zebb\|aaebb', ' aabb ', 'aa'])
464 " match starts at \zs
465 call add(tl, [2, 'abc\zsdd', 'ddabcddxyzt', 'dd'])
466 call add(tl, [2, 'aa \zsax', ' ax'])
467 call add(tl, [2, 'abc \zsmatch\ze abc', 'abc abc abc match abc abc', 'match'])
468 call add(tl, [2, '\v(a \zsif .*){2}', 'a if then a if last', 'if last', 'a if last'])
469 call add(tl, [2, '\>\zs.', 'aword. ', '.'])
470 call add(tl, [2, '\s\+\ze\[/\|\s\zs\s\+', 'is [a t', ' '])
471
472 " Tests for \@= and \& features
473 call add(tl, [2, 'abc\@=', 'abc', 'ab'])
474 call add(tl, [2, 'abc\@=cd', 'abcd', 'abcd'])
475 call add(tl, [2, 'abc\@=', 'ababc', 'ab'])
476 " will never match, no matter the input text
477 call add(tl, [2, 'abcd\@=e', 'abcd'])
478 " will never match
479 call add(tl, [2, 'abcd\@=e', 'any text in here ... '])
480 call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
481 call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
482 call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
483 call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
484 call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
485 call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
486 call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
487 call add(tl, [2, 'foo\(bar\)\@!', 'foobar'])
488 call add(tl, [2, 'foo\(bar\)\@!', 'foo bar', 'foo'])
489 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if then else'])
490 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if else ', 'if else ', ' '])
491 call add(tl, [2, '\(foo\)\@!bar', 'foobar', 'bar'])
492 call add(tl, [2, '\(foo\)\@!...bar', 'foobar'])
493 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' bar foo '])
494 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
495 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
496 call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
497 call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
498 call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
499 call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
500
501 " Combining different tests and features
502 call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])
503 call add(tl, [2, '', 'abcd', ''])
504 call add(tl, [2, '\v(())', 'any possible text', ''])
505 call add(tl, [2, '\v%(ab(xyz)c)', ' abxyzc ', 'abxyzc', 'xyz'])
506 call add(tl, [2, '\v(test|)empty', 'tesempty', 'empty', ''])
507 call add(tl, [2, '\v(a|aa)(a|aa)', 'aaa', 'aa', 'a', 'a'])
508
509 " \%u and friends
510 call add(tl, [2, '\%d32', 'yes no', ' '])
511 call add(tl, [2, '\%o40', 'yes no', ' '])
512 call add(tl, [2, '\%x20', 'yes no', ' '])
513 call add(tl, [2, '\%u0020', 'yes no', ' '])
514 call add(tl, [2, '\%U00000020', 'yes no', ' '])
515 call add(tl, [2, '\%d0', "yes\x0ano", "\x0a"])
516
517 "" \%[abc]
518 call add(tl, [2, 'foo\%[bar]', 'fobar'])
519 call add(tl, [2, 'foo\%[bar]', 'foobar', 'foobar'])
520 call add(tl, [2, 'foo\%[bar]', 'fooxx', 'foo'])
521 call add(tl, [2, 'foo\%[bar]', 'foobxx', 'foob'])
522 call add(tl, [2, 'foo\%[bar]', 'foobaxx', 'fooba'])
523 call add(tl, [2, 'foo\%[bar]', 'foobarxx', 'foobar'])
524 call add(tl, [2, 'foo\%[bar]x', 'foobxx', 'foobx'])
525 call add(tl, [2, 'foo\%[bar]x', 'foobarxx', 'foobarx'])
526 call add(tl, [2, '\%[bar]x', 'barxx', 'barx'])
527 call add(tl, [2, '\%[bar]x', 'bxx', 'bx'])
528 call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
529 call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
530 call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
531 call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
532
533 " Alternatives, must use first longest match
534 call add(tl, [2, 'goo\|go', 'google', 'goo'])
535 call add(tl, [2, '\<goo\|\<go', 'google', 'goo'])
536 call add(tl, [2, '\<goo\|go', 'google', 'goo'])
537
538 " Back references
539 call add(tl, [2, '\(\i\+\) \1', ' abc abc', 'abc abc', 'abc'])
540 call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
541 call add(tl, [2, '\(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9', 'xabcddefghiabcddefghix', 'abcddefghiabcddefghi', 'a', 'b', 'c', 'dd', 'e', 'f', 'g', 'h', 'i'])
542 call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', ''])
543 call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a'])
544 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.com', 'foo.bat/foo.com', 'bat'])
545 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.bat'])
546 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<=$', 'foo.bat/foo.bat', 'foo.bat/foo.bat', 'bat', 'bat'])
547 call add(tl, [2, '\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', '2013-06-27${0}', '${0}', '0'])
548 call add(tl, [2, '^\(a*\)\1$', 'aaaaaaaa', 'aaaaaaaa', 'aaaa'])
549 call add(tl, [2, '^\(a\{-2,}\)\1\+$', 'aaaaaaaaa', 'aaaaaaaaa', 'aaa'])
550
551 " Look-behind with limit
552 call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
553 call add(tl, [2, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
554 call add(tl, [2, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
555 call add(tl, [2, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
556 call add(tl, [2, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
557 call add(tl, [2, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
558 call add(tl, [2, '\(foo\)\@<!bar.', 'xx foobar1 xbar2 xx', 'bar2'])
559
560 " look-behind match in front of a zero-width item
561 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" test header'])
562 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" Last Changed: 1970', '1970'])
563 call add(tl, [2, '\(foo\)\@<=\>', 'foobar'])
564 call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo'])
565 call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo'])
566
567 " complicated look-behind match
568 call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
569 call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
570
571 "" \@>
572 call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
573 call add(tl, [2, '\(a*\)\@>b', 'aaab', 'aaab', 'aaa'])
574 call add(tl, [2, '^\(.\{-}b\)\@>.', ' abcbd', ' abc', ' ab'])
575 call add(tl, [2, '\(.\{-}\)\(\)\@>$', 'abc', 'abc', 'abc', ''])
576 " TODO: BT engine does not restore submatch after failure
577 call add(tl, [1, '\(a*\)\@>a\|a\+', 'aaaa', 'aaaa'])
578
579 " "\_" prepended negated collection matches EOL
580 call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
581 call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
582
583 " Requiring lots of states.
584 call add(tl, [2, '[0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12}', " 12345678-1234-1234-1234-123456789012 ", "12345678-1234-1234-1234-123456789012", "1234-"])
585
586 " Skip adding state twice
587 call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO'])
588
589 " Test \%V atom
590 call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt'])
591
592 " Run the tests
593 for t in tl
594 let re = t[0]
595 let pat = t[1]
596 let text = t[2]
597 let matchidx = 3
598 for engine in [0, 1, 2]
599 if engine == 2 && re == 0 || engine == 1 && re == 1
600 continue
601 endif
602 let &regexpengine = engine
603 try
604 let l = matchlist(text, pat)
605 catch
606 call assert_report('Error ' . engine . ': pat: \"' . pat
607 \ . '\", text: \"' . text . '\", caused an exception: \"'
608 \ . v:exception . '\"')
609 endtry
610 " check the match itself
611 if len(l) == 0 && len(t) > matchidx
612 call assert_report('Error ' . engine . ': pat: \"' . pat
613 \ . '\", text: \"' . text . '\", did not match, expected: \"'
614 \ . t[matchidx] . '\"')
615 elseif len(l) > 0 && len(t) == matchidx
616 call assert_report('Error ' . engine . ': pat: \"' . pat
617 \ . '\", text: \"' . text . '\", match: \"' . l[0]
618 \ . '\", expected no match')
619 elseif len(t) > matchidx && l[0] != t[matchidx]
620 call assert_report('Error ' . engine . ': pat: \"' . pat
621 \ . '\", text: \"' . text . '\", match: \"' . l[0]
622 \ . '\", expected: \"' . t[matchidx] . '\"')
623 else
624 " Test passed
625 endif
626
627 " check all the nine submatches
628 if len(l) > 0
629 for i in range(1, 9)
630 if len(t) <= matchidx + i
631 let e = ''
632 else
633 let e = t[matchidx + i]
634 endif
635 if l[i] != e
636 call assert_report('Error ' . engine . ': pat: \"' . pat
637 \ . '\", text: \"' . text . '\", submatch ' . i . ': \"'
638 \ . l[i] . '\", expected: \"' . e . '\"')
639 endif
640 endfor
641 unlet i
642 endif
643 endfor
644 endfor
645
646 unlet t tl e l
647 endfunc
648
649 " Tests for multi-line regexp patterns without multi-byte support.
650 func Test_regexp_multiline_pat()
651 let tl = []
652
653 " back references
654 call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']])
655 call add(tl, [2, '\v.*\/(.*)\n.*\/\1$', ['./Dir1/Dir2/zyxwvuts.txt', './Dir1/Dir2/abcdefgh.bat', '', './Dir1/Dir2/file1.txt', './OtherDir1/OtherDir2/file1.txt'], ['./Dir1/Dir2/zyxwvuts.txt', './Dir1/Dir2/abcdefgh.bat', '', 'XX']])
656
657 " line breaks
658 call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']])
659
660 " Check that \_[0-9] matching EOL does not break a following \>
661 call add(tl, [2, '\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\>', ['', 'localnet/192.168.0.1', ''], ['', 'localnet/XX', '']])
662
663 " Check a pattern with a line break and ^ and $
664 call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']])
665
666 call add(tl, [2, '\(^.\+\n\)\1', [' dog', ' dog', 'asdf'], ['XXasdf']])
667
668 " Run the multi-line tests
669 for t in tl
670 let re = t[0]
671 let pat = t[1]
672 let before = t[2]
673 let after = t[3]
674 for engine in [0, 1, 2]
675 if engine == 2 && re == 0 || engine == 1 && re ==1
676 continue
677 endif
678 let &regexpengine = engine
679 new
680 call setline(1, before)
681 exe '%s/' . pat . '/XX/'
682 let result = getline(1, '$')
683 q!
684 if result != after
685 call assert_report('Error: pat: \"' . pat . '\", text: \"'
686 \ . string(before) . '\", expected: \"' . string(after)
687 \ . '\", got: \"' . string(result) . '\"')
688 else
689 " Test passed
690 endif
691 endfor
692 endfor
693 unlet t tl
694 endfunc
695
696 " Check that using a pattern on two lines doesn't get messed up by using
697 " matchstr() with \ze in between.
698 func Test_matchstr_with_ze()
699 new
700 call append(0, ['Substitute here:', '<T="">Ta 5</Title>',
701 \ '<T="">Ac 7</Title>'])
702 call cursor(1, 1)
703 set re=0
704
705 .+1,.+2s/""/\='"' . matchstr(getline("."), '\d\+\ze<') . '"'
706 call assert_equal(['Substitute here:', '<T="5">Ta 5</Title>',
707 \ '<T="7">Ac 7</Title>', ''], getline(1, '$'))
708
709 bwipe!
710 endfunc
711
712 " Check a pattern with a look beind crossing a line boundary
713 func Test_lookbehind_across_line()
714 new
715 call append(0, ['Behind:', 'asdfasd<yyy', 'xxstart1', 'asdfasd<yy',
716 \ 'xxxstart2', 'asdfasd<yy', 'xxstart3'])
717 call cursor(1, 1)
718 call search('\(<\_[xy]\+\)\@3<=start')
719 call assert_equal([0, 7, 3, 0], getpos('.'))
720 bwipe!
721 endfunc
722
723 " Check matching Visual area
724 func Test_matching_visual_area()
725 new
726 call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand',
727 \ 'oooxofor foroxooo', 'oooxofor foroxooo'])
728 call cursor(1, 1)
729 exe "normal jfxvfx:s/\\%Ve/E/g\<CR>"
730 exe "normal jV:s/\\%Va/A/g\<CR>"
731 exe "normal jfx\<C-V>fxj:s/\\%Vo/O/g\<CR>"
732 call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd',
733 \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$'))
734 bwipe!
735 endfunc
736
737 " Check matching marks
738 func Test_matching_marks()
739 new
740 call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas',
741 \ 'dfsadfEasdf', '', '', '', '', ''])
742 call cursor(4, 1)
743 exe "normal jfSmsfEme:.-4,.+6s/.\\%>'s.*\\%<'e../here/\<CR>"
744 exe "normal jfSmsj0fEme:.-4,.+6s/.\\%>'s\\_.*\\%<'e../again/\<CR>"
745 call assert_equal(['', '', '', 'Marks:', 'asdfhereasdf', 'asdfagainasdf',
746 \ '', '', '', '', '', ''], getline(1, '$'))
747 bwipe!
748 endfunc
749
750 " Check patterns matching cursor position.
751 func s:curpos_test()
752 new
753 call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo',
754 \ "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_',
755 \ ' xxxxxxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx'])
756 call setpos('.', [0, 1, 0, 0])
757 s/\%>3c.//g
758 call setpos('.', [0, 2, 4, 0])
759 s/\%#.*$//g
760 call setpos('.', [0, 3, 0, 0])
761 s/\%<3c./_/g
762 %s/\%4l\%>5c./_/g
763 %s/\%6l\%>25v./_/g
764 %s/\%>6l\%3c./!/g
765 %s/\%>7l\%12c./?/g
766 %s/\%>7l\%<9l\%>5v\%<8v./#/g
767 $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
768 call assert_equal(['ffo', 'bob', '__ooooo', 'koooo__', 'moooooo',
769 \ ' f__', 'ab!babababababfoo',
770 \ 'ba!ab##abab?bafoo', '**!*****_',
771 \ ' ! xxx?xxxxxxxx xxxx xxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxx xxxxx xxxxxxx xx xxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxx xxxxxxxxx xx xxxxxx xx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxx xxx xxxx xxx xxx xxxxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxxxxxxx xx xxxxx xxx xxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxxxx x xxxxxxxxx xx xxxxxx xxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxx xxxx xxx xxxxxx xxxxx xxxxx xx xxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxx xxxxxxxxx xxxxxx xxxxxx xxxxx xxx xxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxx xx xxxxxxxx xxx xxxxxxxxxxx xxxxx'],
772 \ getline(1, '$'))
773 bwipe!
774 endfunc
775
776 func Test_matching_curpos()
777 set re=0
778 call s:curpos_test()
779 set re=1
780 call s:curpos_test()
781 set re=2
782 call s:curpos_test()
783 set re&
784 endfunc
785
786 " Test for matching the start and end of a buffer
787 func Test_start_end_of_buffer_match()
788 new
789 call setline(1, repeat(['vim edit'], 20))
790 /\%^
791 call assert_equal([0, 1, 1, 0], getpos('.'))
792 exe "normal 50%/\\%^..\<CR>"
793 call assert_equal([0, 1, 1, 0], getpos('.'))
794 exe "normal 50%/\\%$\<CR>"
795 call assert_equal([0, 20, 8, 0], getpos('.'))
796 exe "normal 6gg/..\\%$\<CR>"
797 call assert_equal([0, 20, 7, 0], getpos('.'))
798 bwipe!
799 endfunc
800
801 " Check for detecting error
802 func Test_regexp_error()
803 set regexpengine=2
804 call assert_fails("call matchlist('x x', ' \\ze*')", 'E888:')
805 call assert_fails("call matchlist('x x', ' \\zs*')", 'E888:')
806 set re&
807 endfunc
808
809 " vim: shiftwidth=2 sts=2 expandtab