blob: 15ab84c4612b39fa10eb91f7604c342f499154cb [file] [log] [blame]
Bram Moolenaar22e42152016-04-03 14:02:02 +02001" Tests for regexp in latin1 encoding
2set encoding=latin1
3scriptencoding latin1
4
Bram Moolenaar5feabe02020-01-30 18:24:53 +01005source check.vim
6
Bram Moolenaar22e42152016-04-03 14:02:02 +02007func s:equivalence_test()
8 let str = "AÀÁÂÃÄÅ B C D EÈÉÊË F G H IÌÍÎÏ J K L M NÑ OÒÓÔÕÖØ P Q R S T UÙÚÛÜ V W X YÝ Z aàáâãäå b c d eèéêë f g h iìíîï j k l m nñ oòóôõöø p q r s t uùúûü v w x yýÿ z"
9 let groups = split(str)
10 for group1 in groups
11 for c in split(group1, '\zs')
12 " next statement confirms that equivalence class matches every
13 " character in group
14 call assert_match('^[[=' . c . '=]]*$', group1)
15 for group2 in groups
16 if group2 != group1
17 " next statement converts that equivalence class doesn't match
18 " a character in any other group
19 call assert_equal(-1, match(group2, '[[=' . c . '=]]'))
20 endif
21 endfor
22 endfor
23 endfor
24endfunc
25
26func Test_equivalence_re1()
27 set re=1
28 call s:equivalence_test()
29endfunc
30
31func Test_equivalence_re2()
32 set re=2
33 call s:equivalence_test()
34endfunc
Bram Moolenaarf5a39442016-08-16 21:04:41 +020035
36func Test_recursive_substitute()
37 new
38 s/^/\=execute("s#^##gn")
39 " check we are now not in the sandbox
40 call setwinvar(1, 'myvar', 1)
41 bwipe!
42endfunc
Bram Moolenaard5638832016-09-09 17:59:50 +020043
44func Test_nested_backrefs()
45 " Check example in change.txt.
46 new
47 for re in range(0, 2)
48 exe 'set re=' . re
49 call setline(1, 'aa ab x')
50 1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/
51 call assert_equal('-aa ab - -ab - -x-', getline(1))
52
53 call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', ''))
54 endfor
55 bwipe!
56 set re=0
57endfunc
Bram Moolenaar16b35782016-09-09 20:29:50 +020058
59func Test_eow_with_optional()
60 let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', '']
61 for re in range(0, 2)
62 exe 'set re=' . re
63 let actual = matchlist('abc def', '\(abc\>\)\?\s*\(def\)')
64 call assert_equal(expected, actual)
65 endfor
66endfunc
Bram Moolenaar1ef9bbe2017-06-17 20:08:20 +020067
68func Test_backref()
69 new
70 call setline(1, ['one', 'two', 'three', 'four', 'five'])
71 call assert_equal(3, search('\%#=1\(e\)\1'))
72 call assert_equal(3, search('\%#=2\(e\)\1'))
73 call assert_fails('call search("\\%#=1\\(e\\1\\)")', 'E65:')
74 call assert_fails('call search("\\%#=2\\(e\\1\\)")', 'E65:')
75 bwipe!
76endfunc
Bram Moolenaar6057ed42019-01-14 23:19:29 +010077
78func Test_multi_failure()
79 set re=1
80 call assert_fails('/a**', 'E61:')
81 call assert_fails('/a*\+', 'E62:')
82 call assert_fails('/a\{a}', 'E554:')
83 set re=2
84 call assert_fails('/a**', 'E871:')
85 call assert_fails('/a*\+', 'E871:')
86 call assert_fails('/a\{a}', 'E870:')
87 set re=0
88endfunc
Bram Moolenaar5567ad42019-02-12 23:05:46 +010089
90func Test_recursive_addstate()
91 " This will call addstate() recursively until it runs into the limit.
92 let lnum = search('\v((){328}){389}')
93 call assert_equal(0, lnum)
94endfunc
Bram Moolenaar15bbd6e2019-02-13 20:31:50 +010095
96func Test_out_of_memory()
97 new
98 s/^/,n
99 " This will be slow...
100 call assert_fails('call search("\\v((n||<)+);")', 'E363:')
101endfunc
Bram Moolenaar985079c2019-02-16 17:07:47 +0100102
103func Test_get_equi_class()
104 new
105 " Incomplete equivalence class caused invalid memory access
106 s/^/[[=
107 call assert_equal(1, search(getline(1)))
Bram Moolenaarf1b57ab2019-02-17 13:53:34 +0100108 s/.*/[[.
109 call assert_equal(1, search(getline(1)))
Bram Moolenaar985079c2019-02-16 17:07:47 +0100110endfunc
Bram Moolenaar8bfd9462019-02-16 18:07:57 +0100111
112func Test_rex_init()
113 set noincsearch
114 set re=1
115 new
116 setlocal iskeyword=a-z
117 call setline(1, ['abc', 'ABC'])
118 call assert_equal(1, search('[[:keyword:]]'))
119 new
120 setlocal iskeyword=A-Z
121 call setline(1, ['abc', 'ABC'])
122 call assert_equal(2, search('[[:keyword:]]'))
123 bwipe!
124 bwipe!
125 set re=0
126endfunc
Bram Moolenaara5483442019-02-17 20:17:02 +0100127
128func Test_range_with_newline()
129 new
130 call setline(1, "a")
131 call assert_equal(0, search("[ -*\\n- ]"))
132 call assert_equal(0, search("[ -*\\t-\\n]"))
133 bwipe!
134endfunc
Bram Moolenaar38f08e72019-02-20 22:04:32 +0100135
136func Test_pattern_compile_speed()
Bram Moolenaar5feabe02020-01-30 18:24:53 +0100137 CheckOption spellcapcheck
138 CheckFunction reltimefloat
139
Bram Moolenaar38f08e72019-02-20 22:04:32 +0100140 let start = reltime()
141 " this used to be very slow, not it should be about a second
142 set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
143 call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
144 set spc=
145endfunc
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100146
147" Tests for regexp patterns without multi-byte support.
148func Test_regexp_single_line_pat()
149 " tl is a List of Lists with:
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200150 " regexp engines to test
151 " 0 - test with 'regexpengine' values 0 and 1
152 " 1 - test with 'regexpengine' values 0 and 2
153 " 2 - test with 'regexpengine' values 0, 1 and 2
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100154 " regexp pattern
155 " text to test the pattern on
156 " expected match (optional)
157 " expected submatch 1 (optional)
158 " expected submatch 2 (optional)
159 " etc.
160 " When there is no match use only the first two items.
161 let tl = []
162
163 call add(tl, [2, 'ab', 'aab', 'ab'])
164 call add(tl, [2, 'b', 'abcdef', 'b'])
165 call add(tl, [2, 'bc*', 'abccccdef', 'bcccc'])
166 call add(tl, [2, 'bc\{-}', 'abccccdef', 'b'])
167 call add(tl, [2, 'bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd'])
168 call add(tl, [2, 'bc*', 'abbdef', 'b'])
169 call add(tl, [2, 'c*', 'ccc', 'ccc'])
170 call add(tl, [2, 'bc*', 'abdef', 'b'])
171 call add(tl, [2, 'c*', 'abdef', ''])
172 call add(tl, [2, 'bc\+', 'abccccdef', 'bcccc'])
173 call add(tl, [2, 'bc\+', 'abdef']) " no match
Bram Moolenaar004a6782020-04-11 17:09:31 +0200174 " match escape character in a string
175 call add(tl, [2, '.\e.', "one\<Esc>two", "e\<Esc>t"])
176 " match backspace character in a string
177 call add(tl, [2, '.\b.', "one\<C-H>two", "e\<C-H>t"])
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200178 " match newline character in a string
179 call add(tl, [2, 'o\nb', "foo\nbar", "o\nb"])
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100180
181 " operator \|
182 call add(tl, [2, 'a\|ab', 'cabd', 'a']) " alternation is ordered
183
184 call add(tl, [2, 'c\?', 'ccb', 'c'])
185 call add(tl, [2, 'bc\?', 'abd', 'b'])
186 call add(tl, [2, 'bc\?', 'abccd', 'bc'])
187
188 call add(tl, [2, '\va{1}', 'ab', 'a'])
189
190 call add(tl, [2, '\va{2}', 'aa', 'aa'])
191 call add(tl, [2, '\va{2}', 'caad', 'aa'])
192 call add(tl, [2, '\va{2}', 'aba'])
193 call add(tl, [2, '\va{2}', 'ab'])
194 call add(tl, [2, '\va{2}', 'abaa', 'aa'])
195 call add(tl, [2, '\va{2}', 'aaa', 'aa'])
196
197 call add(tl, [2, '\vb{1}', 'abca', 'b'])
198 call add(tl, [2, '\vba{2}', 'abaa', 'baa'])
199 call add(tl, [2, '\vba{3}', 'aabaac'])
200
201 call add(tl, [2, '\v(ab){1}', 'ab', 'ab', 'ab'])
202 call add(tl, [2, '\v(ab){1}', 'dabc', 'ab', 'ab'])
203 call add(tl, [2, '\v(ab){1}', 'acb'])
204
205 call add(tl, [2, '\v(ab){0,2}', 'acb', "", ""])
206 call add(tl, [2, '\v(ab){0,2}', 'ab', 'ab', 'ab'])
207 call add(tl, [2, '\v(ab){1,2}', 'ab', 'ab', 'ab'])
208 call add(tl, [2, '\v(ab){1,2}', 'ababc', 'abab', 'ab'])
209 call add(tl, [2, '\v(ab){2,4}', 'ababcab', 'abab', 'ab'])
210 call add(tl, [2, '\v(ab){2,4}', 'abcababa', 'abab', 'ab'])
211
212 call add(tl, [2, '\v(ab){2}', 'abab', 'abab', 'ab'])
213 call add(tl, [2, '\v(ab){2}', 'cdababe', 'abab', 'ab'])
214 call add(tl, [2, '\v(ab){2}', 'abac'])
215 call add(tl, [2, '\v(ab){2}', 'abacabab', 'abab', 'ab'])
216 call add(tl, [2, '\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab'])
217 call add(tl, [2, '\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab'])
218
219 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
220 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
221 call add(tl, [2, '\v(a{2}){1}', 'aaac', 'aa', 'aa'])
222 call add(tl, [2, '\v(a{2}){1}', 'daaac', 'aa', 'aa'])
223 call add(tl, [2, '\v(a{1}){2}', 'daaac', 'aa', 'a'])
224 call add(tl, [2, '\v(a{1}){2}', 'aaa', 'aa', 'a'])
225 call add(tl, [2, '\v(a{2})+', 'adaac', 'aa', 'aa'])
226 call add(tl, [2, '\v(a{2})+', 'aa', 'aa', 'aa'])
227 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
228 call add(tl, [2, '\v(a{1}){2}', 'aa', 'aa', 'a'])
229 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
230 call add(tl, [2, '\v(a{2}){2}', 'aaaa', 'aaaa', 'aa'])
231 call add(tl, [2, '\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa'])
232
233 call add(tl, [2, '\v(a+){2}', 'dadaac', 'aa', 'a'])
234 call add(tl, [2, '\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa'])
235
236 call add(tl, [2, '\v(a{1,2}){2}', 'daaac', 'aaa', 'a'])
237 call add(tl, [2, '\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a'])
238 call add(tl, [2, '\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa'])
239 call add(tl, [2, '\v(a{1,3}){3}', 'daac'])
240 call add(tl, [2, '\v(a{1,2}){2}', 'dac'])
241 call add(tl, [2, '\v(a+)+', 'daac', 'aa', 'aa'])
242 call add(tl, [2, '\v(a+)+', 'aaa', 'aaa', 'aaa'])
243 call add(tl, [2, '\v(a+){1,2}', 'aaa', 'aaa', 'aaa'])
244 call add(tl, [2, '\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a'])
245 call add(tl, [2, '\v(a{3})+', 'daaaac', 'aaa', 'aaa'])
246 call add(tl, [2, '\v(a|b|c)+', 'aacb', 'aacb', 'b'])
247 call add(tl, [2, '\v(a|b|c){2}', 'abcb', 'ab', 'b'])
248 call add(tl, [2, '\v(abc){2}', 'abcabd', ])
249 call add(tl, [2, '\v(abc){2}', 'abdabcabc','abcabc', 'abc'])
250
251 call add(tl, [2, 'a*', 'cc', ''])
252 call add(tl, [2, '\v(a*)+', 'cc', ''])
253 call add(tl, [2, '\v((ab)+)+', 'ab', 'ab', 'ab', 'ab'])
254 call add(tl, [2, '\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab'])
255 call add(tl, [2, '\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab'])
256 call add(tl, [2, '\v(a{0,2})+', 'cc', ''])
257 call add(tl, [2, '\v(a*)+', '', ''])
258 call add(tl, [2, '\v((a*)+)+', '', ''])
259 call add(tl, [2, '\v((ab)*)+', '', ''])
260 call add(tl, [2, '\va{1,3}', 'aab', 'aa'])
261 call add(tl, [2, '\va{2,3}', 'abaa', 'aa'])
262
263 call add(tl, [2, '\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
264 call add(tl, [2, '\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb'])
265 call add(tl, [2, '\va{2}|b{2}', 'abab'])
266 call add(tl, [2, '\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a'])
267 call add(tl, [2, '\vab{2,3}c', 'aabbccccccccccccc', 'abbc'])
268 call add(tl, [2, '\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc'])
269 call add(tl, [2, '\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde'])
270 call add(tl, [2, '\va(bc){2}d', 'aabcbfbc' ])
271 call add(tl, [2, '\va*a{2}', 'a', ])
272 call add(tl, [2, '\va*a{2}', 'aa', 'aa' ])
273 call add(tl, [2, '\va*a{2}', 'aaa', 'aaa' ])
274 call add(tl, [2, '\va*a{2}', 'bbbabcc', ])
275 call add(tl, [2, '\va*b*|a*c*', 'a', 'a'])
276 call add(tl, [2, '\va{1}b{1}|a{1}b{1}', ''])
277
278 " submatches
279 call add(tl, [2, '\v(a)', 'ab', 'a', 'a'])
280 call add(tl, [2, '\v(a)(b)', 'ab', 'ab', 'a', 'b'])
281 call add(tl, [2, '\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c'])
282 call add(tl, [2, '\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b'])
283 call add(tl, [2, '\v(a)|(b)', 'ab', 'a', 'a'])
284
285 call add(tl, [2, '\v(a*)+', 'aaaa', 'aaaa', ''])
286 call add(tl, [2, 'x', 'abcdef'])
287
288 "
289 " Simple tests
290 "
291
292 " Search single groups
293 call add(tl, [2, 'ab', 'aab', 'ab'])
294 call add(tl, [2, 'ab', 'baced'])
295 call add(tl, [2, 'ab', ' ab ', 'ab'])
296
297 " Search multi-modifiers
298 call add(tl, [2, 'x*', 'xcd', 'x'])
299 call add(tl, [2, 'x*', 'xxxxxxxxxxxxxxxxsofijiojgf', 'xxxxxxxxxxxxxxxx'])
300 " empty match is good
301 call add(tl, [2, 'x*', 'abcdoij', ''])
302 " no match here
303 call add(tl, [2, 'x\+', 'abcdoin'])
304 call add(tl, [2, 'x\+', 'abcdeoijdfxxiuhfij', 'xx'])
305 call add(tl, [2, 'x\+', 'xxxxx', 'xxxxx'])
306 call add(tl, [2, 'x\+', 'abc x siufhiush xxxxxxxxx', 'x'])
307 call add(tl, [2, 'x\=', 'x sdfoij', 'x'])
308 call add(tl, [2, 'x\=', 'abc sfoij', '']) " empty match is good
309 call add(tl, [2, 'x\=', 'xxxxxxxxx c', 'x'])
310 call add(tl, [2, 'x\?', 'x sdfoij', 'x'])
311 " empty match is good
312 call add(tl, [2, 'x\?', 'abc sfoij', ''])
313 call add(tl, [2, 'x\?', 'xxxxxxxxxx c', 'x'])
314
315 call add(tl, [2, 'a\{0,0}', 'abcdfdoij', ''])
316 " same thing as 'a?'
317 call add(tl, [2, 'a\{0,1}', 'asiubid axxxaaa', 'a'])
318 " same thing as 'a\{0,1}'
319 call add(tl, [2, 'a\{1,0}', 'asiubid axxxaaa', 'a'])
320 call add(tl, [2, 'a\{3,6}', 'aa siofuh'])
321 call add(tl, [2, 'a\{3,6}', 'aaaaa asfoij afaa', 'aaaaa'])
322 call add(tl, [2, 'a\{3,6}', 'aaaaaaaa', 'aaaaaa'])
323 call add(tl, [2, 'a\{0}', 'asoiuj', ''])
324 call add(tl, [2, 'a\{2}', 'aaaa', 'aa'])
325 call add(tl, [2, 'a\{2}', 'iuash fiusahfliusah fiushfilushfi uhsaifuh askfj nasfvius afg aaaa sfiuhuhiushf', 'aa'])
326 call add(tl, [2, 'a\{2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
327 " same thing as 'a*'
328 call add(tl, [2, 'a\{0,}', 'oij sdigfusnf', ''])
329 call add(tl, [2, 'a\{0,}', 'aaaaa aa', 'aaaaa'])
330 call add(tl, [2, 'a\{2,}', 'sdfiougjdsafg'])
331 call add(tl, [2, 'a\{2,}', 'aaaaasfoij ', 'aaaaa'])
332 call add(tl, [2, 'a\{5,}', 'xxaaaaxxx '])
333 call add(tl, [2, 'a\{5,}', 'xxaaaaaxxx ', 'aaaaa'])
334 call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
335 call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
336 call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
337 " leading star as normal char when \{} follows
338 call add(tl, [2, '^*\{4,}$', '***'])
339 call add(tl, [2, '^*\{4,}$', '****', '****'])
340 call add(tl, [2, '^*\{4,}$', '*****', '*****'])
341 " same thing as 'a*'
342 call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
343 call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
344
345 call add(tl, [2, 'a\{-0,0}', 'abcdfdoij', ''])
346 " anti-greedy version of 'a?'
347 call add(tl, [2, 'a\{-0,1}', 'asiubid axxxaaa', ''])
348 call add(tl, [2, 'a\{-3,6}', 'aa siofuh'])
349 call add(tl, [2, 'a\{-3,6}', 'aaaaa asfoij afaa', 'aaa'])
350 call add(tl, [2, 'a\{-3,6}', 'aaaaaaaa', 'aaa'])
351 call add(tl, [2, 'a\{-0}', 'asoiuj', ''])
352 call add(tl, [2, 'a\{-2}', 'aaaa', 'aa'])
353 call add(tl, [2, 'a\{-2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
354 call add(tl, [2, 'a\{-0,}', 'oij sdigfusnf', ''])
355 call add(tl, [2, 'a\{-0,}', 'aaaaa aa', ''])
356 call add(tl, [2, 'a\{-2,}', 'sdfiougjdsafg'])
357 call add(tl, [2, 'a\{-2,}', 'aaaaasfoij ', 'aa'])
358 call add(tl, [2, 'a\{-,0}', 'oidfguih iuhi hiu aaaa', ''])
359 call add(tl, [2, 'a\{-,5}', 'abcd', ''])
360 call add(tl, [2, 'a\{-,5}', 'aaaaaaaaaa', ''])
361 " anti-greedy version of 'a*'
362 call add(tl, [2, 'a\{-}', 'bbbcddiuhfcd', ''])
363 call add(tl, [2, 'a\{-}', 'aaaaioudfh coisf jda', ''])
364
365 " Test groups of characters and submatches
366 call add(tl, [2, '\(abc\)*', 'abcabcabc', 'abcabcabc', 'abc'])
367 call add(tl, [2, '\(ab\)\+', 'abababaaaaa', 'ababab', 'ab'])
368 call add(tl, [2, '\(abaaaaa\)*cd', 'cd', 'cd', ''])
369 call add(tl, [2, '\(test1\)\? \(test2\)\?', 'test1 test3', 'test1 ', 'test1', ''])
370 call add(tl, [2, '\(test1\)\= \(test2\) \(test4443\)\=', ' test2 test4443 yupiiiiiiiiiii', ' test2 test4443', '', 'test2', 'test4443'])
371 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'])
372 call add(tl, [2, '\(\(\(yyxxzz\)\)\)', 'abcdddsfiusfyyzzxxyyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz'])
373 call add(tl, [2, '\v((ab)+|c+)+', 'abcccaba', 'abcccab', 'ab', 'ab'])
374 call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
375 call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
376 call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
377 call add(tl, [2, '\p*', 'aá ', 'aá '])
378
379 " Test greedy-ness and lazy-ness
380 call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
381 call add(tl, [2, 'a\{-2,7}x','aaaaaaaaax', 'aaaaaaax'])
382 call add(tl, [2, 'a\{2,7}','aaaaaaaaaaaaaaaaaaaa', 'aaaaaaa'])
383 call add(tl, [2, 'a\{2,7}x','aaaaaaaaax', 'aaaaaaax'])
384 call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
385 call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa',''])
386 call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
387 call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
388 call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
389 call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
390 call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
391 call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
392
393 " Test Character classes
394 call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
395
396 " Test collections and character range []
397 call add(tl, [2, '\v[a]', 'abcd', 'a'])
398 call add(tl, [2, 'a[bcd]', 'abcd', 'ab'])
399 call add(tl, [2, 'a[b-d]', 'acbd', 'ac'])
400 call add(tl, [2, '[a-d][e-f][x-x]d', 'cexdxx', 'cexd'])
401 call add(tl, [2, '\v[[:alpha:]]+', 'abcdefghijklmnopqrstuvwxyz6','abcdefghijklmnopqrstuvwxyz'])
402 call add(tl, [2, '[[:alpha:]\+]', '6x8','x'])
403 call add(tl, [2, '[^abc]\+','abcabcabc'])
404 call add(tl, [2, '[^abc]','defghiasijvoinasoiunbvb','d'])
405 call add(tl, [2, '[^abc]\+','ddddddda','ddddddd'])
406 call add(tl, [2, '[^a-d]\+','aaaAAAZIHFNCddd','AAAZIHFNC'])
407 call add(tl, [2, '[a-f]*','iiiiiiii',''])
408 call add(tl, [2, '[a-f]*','abcdefgh','abcdef'])
409 call add(tl, [2, '[^a-f]\+','abcdefgh','gh'])
410 call add(tl, [2, '[a-c]\{-3,6}','abcabc','abc'])
411 call add(tl, [2, '[^[:alpha:]]\+','abcccadfoij7787ysf287yrnccdu','7787'])
412 call add(tl, [2, '[-a]', '-', '-'])
413 call add(tl, [2, '[a-]', '-', '-'])
414 call add(tl, [2, '[a-f]*\c','ABCDEFGH','ABCDEF'])
415 call add(tl, [2, '[abc][xyz]\c','-af-AF-BY--','BY'])
416 " filename regexp
417 call add(tl, [2, '[-./[:alnum:]_~]\+', 'log13.file', 'log13.file'])
418 " special chars
419 call add(tl, [2, '[\]\^\-\\]\+', '\^\\\-\---^', '\^\\\-\---^'])
420 " collation elem
421 call add(tl, [2, '[[.a.]]\+', 'aa', 'aa'])
422 " middle of regexp
423 call add(tl, [2, 'abc[0-9]*ddd', 'siuhabc ii'])
424 call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
425 call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
426 call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
427 call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
428 call add(tl, [2, '\_f', " \na ", "\n"])
429 call add(tl, [2, '\_f\+', " \na ", "\na"])
430 call add(tl, [2, '[0-9A-Za-z-_.]\+', " @0_a.A-{ ", "0_a.A-"])
431
432 " Test start/end of line, start/end of file
433 call add(tl, [2, '^a.', "a_\nb ", "a_"])
434 call add(tl, [2, '^a.', "b a \na_"])
435 call add(tl, [2, '.a$', " a\n "])
436 call add(tl, [2, '.a$', " a b\n_a", "_a"])
437 call add(tl, [2, '\%^a.', "a a\na", "a "])
438 call add(tl, [2, '\%^a', " a \na "])
439 call add(tl, [2, '.a\%$', " a\n "])
440 call add(tl, [2, '.a\%$', " a\n_a", "_a"])
441
442 " Test recognition of character classes
443 call add(tl, [2, '[0-7]\+', 'x0123456789x', '01234567'])
444 call add(tl, [2, '[^0-7]\+', '0a;X+% 897', 'a;X+% 89'])
445 call add(tl, [2, '[0-9]\+', 'x0123456789x', '0123456789'])
446 call add(tl, [2, '[^0-9]\+', '0a;X+% 9', 'a;X+% '])
447 call add(tl, [2, '[0-9a-fA-F]\+', 'x0189abcdefg', '0189abcdef'])
448 call add(tl, [2, '[^0-9A-Fa-f]\+', '0189g;X+% ab', 'g;X+% '])
449 call add(tl, [2, '[a-z_A-Z0-9]\+', ';+aso_SfOij ', 'aso_SfOij'])
450 call add(tl, [2, '[^a-z_A-Z0-9]\+', 'aSo_;+% sfOij', ';+% '])
451 call add(tl, [2, '[a-z_A-Z]\+', '0abyz_ABYZ;', 'abyz_ABYZ'])
452 call add(tl, [2, '[^a-z_A-Z]\+', 'abAB_09;+% yzYZ', '09;+% '])
453 call add(tl, [2, '[a-z]\+', '0abcxyz1', 'abcxyz'])
454 call add(tl, [2, '[a-z]\+', 'AabxyzZ', 'abxyz'])
455 call add(tl, [2, '[^a-z]\+', 'a;X09+% x', ';X09+% '])
456 call add(tl, [2, '[^a-z]\+', 'abX0;%yz', 'X0;%'])
457 call add(tl, [2, '[a-zA-Z]\+', '0abABxzXZ9', 'abABxzXZ'])
458 call add(tl, [2, '[^a-zA-Z]\+', 'ab09_;+ XZ', '09_;+ '])
459 call add(tl, [2, '[A-Z]\+', 'aABXYZz', 'ABXYZ'])
460 call add(tl, [2, '[^A-Z]\+', 'ABx0;%YZ', 'x0;%'])
461 call add(tl, [2, '[a-z]\+\c', '0abxyzABXYZ;', 'abxyzABXYZ'])
462 call add(tl, [2, '[A-Z]\+\c', '0abABxzXZ9', 'abABxzXZ'])
463 call add(tl, [2, '\c[^a-z]\+', 'ab09_;+ XZ', '09_;+ '])
464 call add(tl, [2, '\c[^A-Z]\+', 'ab09_;+ XZ', '09_;+ '])
465 call add(tl, [2, '\C[^A-Z]\+', 'ABCOIJDEOIFNSD jsfoij sa', ' jsfoij sa'])
466
467 " Tests for \z features
468 " match ends at \ze
469 call add(tl, [2, 'xx \ze test', 'xx '])
470 call add(tl, [2, 'abc\zeend', 'oij abcend', 'abc'])
471 call add(tl, [2, 'aa\zebb\|aaxx', ' aabb ', 'aa'])
472 call add(tl, [2, 'aa\zebb\|aaxx', ' aaxx ', 'aaxx'])
473 call add(tl, [2, 'aabb\|aa\zebb', ' aabb ', 'aabb'])
474 call add(tl, [2, 'aa\zebb\|aaebb', ' aabb ', 'aa'])
475 " match starts at \zs
476 call add(tl, [2, 'abc\zsdd', 'ddabcddxyzt', 'dd'])
477 call add(tl, [2, 'aa \zsax', ' ax'])
478 call add(tl, [2, 'abc \zsmatch\ze abc', 'abc abc abc match abc abc', 'match'])
479 call add(tl, [2, '\v(a \zsif .*){2}', 'a if then a if last', 'if last', 'a if last'])
480 call add(tl, [2, '\>\zs.', 'aword. ', '.'])
481 call add(tl, [2, '\s\+\ze\[/\|\s\zs\s\+', 'is [a t', ' '])
482
483 " Tests for \@= and \& features
484 call add(tl, [2, 'abc\@=', 'abc', 'ab'])
485 call add(tl, [2, 'abc\@=cd', 'abcd', 'abcd'])
486 call add(tl, [2, 'abc\@=', 'ababc', 'ab'])
487 " will never match, no matter the input text
488 call add(tl, [2, 'abcd\@=e', 'abcd'])
489 " will never match
490 call add(tl, [2, 'abcd\@=e', 'any text in here ... '])
491 call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
492 call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
493 call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
494 call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
495 call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
496 call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
497 call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
498 call add(tl, [2, 'foo\(bar\)\@!', 'foobar'])
499 call add(tl, [2, 'foo\(bar\)\@!', 'foo bar', 'foo'])
500 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if then else'])
501 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if else ', 'if else ', ' '])
502 call add(tl, [2, '\(foo\)\@!bar', 'foobar', 'bar'])
503 call add(tl, [2, '\(foo\)\@!...bar', 'foobar'])
504 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' bar foo '])
505 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
506 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
507 call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
508 call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
509 call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
510 call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
511
512 " Combining different tests and features
513 call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])
514 call add(tl, [2, '', 'abcd', ''])
515 call add(tl, [2, '\v(())', 'any possible text', ''])
516 call add(tl, [2, '\v%(ab(xyz)c)', ' abxyzc ', 'abxyzc', 'xyz'])
517 call add(tl, [2, '\v(test|)empty', 'tesempty', 'empty', ''])
518 call add(tl, [2, '\v(a|aa)(a|aa)', 'aaa', 'aa', 'a', 'a'])
519
520 " \%u and friends
521 call add(tl, [2, '\%d32', 'yes no', ' '])
522 call add(tl, [2, '\%o40', 'yes no', ' '])
523 call add(tl, [2, '\%x20', 'yes no', ' '])
524 call add(tl, [2, '\%u0020', 'yes no', ' '])
525 call add(tl, [2, '\%U00000020', 'yes no', ' '])
526 call add(tl, [2, '\%d0', "yes\x0ano", "\x0a"])
527
528 "" \%[abc]
529 call add(tl, [2, 'foo\%[bar]', 'fobar'])
530 call add(tl, [2, 'foo\%[bar]', 'foobar', 'foobar'])
531 call add(tl, [2, 'foo\%[bar]', 'fooxx', 'foo'])
532 call add(tl, [2, 'foo\%[bar]', 'foobxx', 'foob'])
533 call add(tl, [2, 'foo\%[bar]', 'foobaxx', 'fooba'])
534 call add(tl, [2, 'foo\%[bar]', 'foobarxx', 'foobar'])
535 call add(tl, [2, 'foo\%[bar]x', 'foobxx', 'foobx'])
536 call add(tl, [2, 'foo\%[bar]x', 'foobarxx', 'foobarx'])
537 call add(tl, [2, '\%[bar]x', 'barxx', 'barx'])
538 call add(tl, [2, '\%[bar]x', 'bxx', 'bx'])
539 call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
540 call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
541 call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
542 call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
543
544 " Alternatives, must use first longest match
545 call add(tl, [2, 'goo\|go', 'google', 'goo'])
546 call add(tl, [2, '\<goo\|\<go', 'google', 'goo'])
547 call add(tl, [2, '\<goo\|go', 'google', 'goo'])
548
549 " Back references
550 call add(tl, [2, '\(\i\+\) \1', ' abc abc', 'abc abc', 'abc'])
551 call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
552 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'])
553 call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', ''])
554 call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a'])
555 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.com', 'foo.bat/foo.com', 'bat'])
556 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.bat'])
557 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<=$', 'foo.bat/foo.bat', 'foo.bat/foo.bat', 'bat', 'bat'])
558 call add(tl, [2, '\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', '2013-06-27${0}', '${0}', '0'])
559 call add(tl, [2, '^\(a*\)\1$', 'aaaaaaaa', 'aaaaaaaa', 'aaaa'])
560 call add(tl, [2, '^\(a\{-2,}\)\1\+$', 'aaaaaaaaa', 'aaaaaaaaa', 'aaa'])
561
562 " Look-behind with limit
563 call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
564 call add(tl, [2, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
565 call add(tl, [2, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
566 call add(tl, [2, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
567 call add(tl, [2, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
568 call add(tl, [2, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
569 call add(tl, [2, '\(foo\)\@<!bar.', 'xx foobar1 xbar2 xx', 'bar2'])
570
571 " look-behind match in front of a zero-width item
572 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" test header'])
573 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" Last Changed: 1970', '1970'])
574 call add(tl, [2, '\(foo\)\@<=\>', 'foobar'])
575 call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo'])
576 call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo'])
577
578 " complicated look-behind match
579 call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
580 call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
581
582 "" \@>
583 call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
584 call add(tl, [2, '\(a*\)\@>b', 'aaab', 'aaab', 'aaa'])
585 call add(tl, [2, '^\(.\{-}b\)\@>.', ' abcbd', ' abc', ' ab'])
586 call add(tl, [2, '\(.\{-}\)\(\)\@>$', 'abc', 'abc', 'abc', ''])
587 " TODO: BT engine does not restore submatch after failure
588 call add(tl, [1, '\(a*\)\@>a\|a\+', 'aaaa', 'aaaa'])
589
590 " "\_" prepended negated collection matches EOL
591 call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
592 call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
593
594 " Requiring lots of states.
595 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-"])
596
597 " Skip adding state twice
598 call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO'])
599
600 " Test \%V atom
601 call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt'])
602
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200603 " Test for ignoring case and matching repeated characters
604 call add(tl, [2, '\cb\+', 'aAbBbBcC', 'bBbB'])
605
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100606 " Run the tests
607 for t in tl
608 let re = t[0]
609 let pat = t[1]
610 let text = t[2]
611 let matchidx = 3
612 for engine in [0, 1, 2]
613 if engine == 2 && re == 0 || engine == 1 && re == 1
614 continue
615 endif
616 let &regexpengine = engine
617 try
618 let l = matchlist(text, pat)
619 catch
620 call assert_report('Error ' . engine . ': pat: \"' . pat
621 \ . '\", text: \"' . text . '\", caused an exception: \"'
622 \ . v:exception . '\"')
623 endtry
624 " check the match itself
625 if len(l) == 0 && len(t) > matchidx
626 call assert_report('Error ' . engine . ': pat: \"' . pat
627 \ . '\", text: \"' . text . '\", did not match, expected: \"'
628 \ . t[matchidx] . '\"')
629 elseif len(l) > 0 && len(t) == matchidx
630 call assert_report('Error ' . engine . ': pat: \"' . pat
631 \ . '\", text: \"' . text . '\", match: \"' . l[0]
632 \ . '\", expected no match')
633 elseif len(t) > matchidx && l[0] != t[matchidx]
634 call assert_report('Error ' . engine . ': pat: \"' . pat
635 \ . '\", text: \"' . text . '\", match: \"' . l[0]
636 \ . '\", expected: \"' . t[matchidx] . '\"')
637 else
638 " Test passed
639 endif
640
641 " check all the nine submatches
642 if len(l) > 0
643 for i in range(1, 9)
644 if len(t) <= matchidx + i
645 let e = ''
646 else
647 let e = t[matchidx + i]
648 endif
649 if l[i] != e
650 call assert_report('Error ' . engine . ': pat: \"' . pat
651 \ . '\", text: \"' . text . '\", submatch ' . i . ': \"'
652 \ . l[i] . '\", expected: \"' . e . '\"')
653 endif
654 endfor
655 unlet i
656 endif
657 endfor
658 endfor
659
660 unlet t tl e l
661endfunc
662
663" Tests for multi-line regexp patterns without multi-byte support.
664func Test_regexp_multiline_pat()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200665 " tl is a List of Lists with:
666 " regexp engines to test
667 " 0 - test with 'regexpengine' values 0 and 1
668 " 1 - test with 'regexpengine' values 0 and 2
669 " 2 - test with 'regexpengine' values 0, 1 and 2
670 " regexp pattern
671 " List with text to test the pattern on
672 " List with the expected match
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100673 let tl = []
674
675 " back references
676 call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']])
677 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']])
678
679 " line breaks
680 call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']])
681
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200682 " Any single character or end-of-line
683 call add(tl, [2, '\_.\+', ['a', 'b', 'c'], ['XX']])
684 " Any identifier or end-of-line
685 call add(tl, [2, '\_i\+', ['a', 'b', ';', '2'], ['XX;XX']])
686 " Any identifier but excluding digits or end-of-line
687 call add(tl, [2, '\_I\+', ['a', 'b', ';', '2'], ['XX;XX2XX']])
688 " Any keyword or end-of-line
689 call add(tl, [2, '\_k\+', ['a', 'b', '=', '2'], ['XX=XX']])
690 " Any keyword but excluding digits or end-of-line
691 call add(tl, [2, '\_K\+', ['a', 'b', '=', '2'], ['XX=XX2XX']])
692 " Any filename character or end-of-line
693 call add(tl, [2, '\_f\+', ['a', 'b', '.', '5'], ['XX']])
694 " Any filename character but excluding digits or end-of-line
695 call add(tl, [2, '\_F\+', ['a', 'b', '.', '5'], ['XX5XX']])
696 " Any printable character or end-of-line
697 call add(tl, [2, '\_p\+', ['a', 'b', '=', '4'], ['XX']])
698 " Any printable character excluding digits or end-of-line
699 call add(tl, [2, '\_P\+', ['a', 'b', '=', '4'], ['XX4XX']])
700 " Any whitespace character or end-of-line
701 call add(tl, [2, '\_s\+', [' ', ' ', 'a', 'b'], ['XXaXXbXX']])
702 " Any non-whitespace character or end-of-line
703 call add(tl, [2, '\_S\+', [' ', ' ', 'a', 'b'], [' XX XX']])
704 " Any decimal digit or end-of-line
705 call add(tl, [2, '\_d\+', ['1', 'a', '2', 'b', '3'], ['XXaXXbXX']])
706 " Any non-decimal digit or end-of-line
707 call add(tl, [2, '\_D\+', ['1', 'a', '2', 'b', '3'], ['1XX2XX3XX']])
708 " Any hexadecimal digit or end-of-line
709 call add(tl, [2, '\_x\+', ['1', 'a', 'g', '9', '8'], ['XXgXX']])
710 " Any non-hexadecimal digit or end-of-line
711 call add(tl, [2, '\_X\+', ['1', 'a', 'g', '9', '8'], ['1XXaXX9XX8XX']])
712 " Any octal digit or end-of-line
713 call add(tl, [2, '\_o\+', ['0', '7', '8', '9', '0'], ['XX8XX9XX']])
714 " Any non-octal digit or end-of-line
715 call add(tl, [2, '\_O\+', ['0', '7', '8', '9', '0'], ['0XX7XX0XX']])
716 " Any word character or end-of-line
717 call add(tl, [2, '\_w\+', ['A', 'B', '=', 'C', 'D'], ['XX=XX']])
718 " Any non-word character or end-of-line
719 call add(tl, [2, '\_W\+', ['A', 'B', '=', 'C', 'D'], ['AXXBXXCXXDXX']])
720 " Any head-of-word character or end-of-line
721 call add(tl, [2, '\_h\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
722 " Any non-head-of-word character or end-of-line
723 call add(tl, [2, '\_H\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
724 " Any alphabetic character or end-of-line
725 call add(tl, [2, '\_a\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
726 " Any non-alphabetic character or end-of-line
727 call add(tl, [2, '\_A\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
728 " Any lowercase character or end-of-line
729 call add(tl, [2, '\_l\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
730 " Any non-lowercase character or end-of-line
731 call add(tl, [2, '\_L\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
732 " Any uppercase character or end-of-line
733 call add(tl, [2, '\_u\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
734 " Any non-uppercase character or end-of-line
735 call add(tl, [2, '\_U\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
736 " Collection or end-of-line
737 call add(tl, [2, '\_[a-z]\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
738 " start of line anywhere in the text
739 call add(tl, [2, 'one\zs\_s*\_^\zetwo',
740 \ ['', 'one', ' two', 'one', '', 'two'],
741 \ ['', 'one', ' two', 'oneXXtwo']])
742 " end of line anywhere in the text
743 call add(tl, [2, 'one\zs\_$\_s*two',
744 \ ['', 'one', ' two', 'one', '', 'two'], ['', 'oneXX', 'oneXX']])
745
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100746 " Check that \_[0-9] matching EOL does not break a following \>
747 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', '']])
748
749 " Check a pattern with a line break and ^ and $
750 call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']])
751
752 call add(tl, [2, '\(^.\+\n\)\1', [' dog', ' dog', 'asdf'], ['XXasdf']])
753
754 " Run the multi-line tests
755 for t in tl
756 let re = t[0]
757 let pat = t[1]
758 let before = t[2]
759 let after = t[3]
760 for engine in [0, 1, 2]
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200761 if engine == 2 && re == 0 || engine == 1 && re == 1
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100762 continue
763 endif
764 let &regexpengine = engine
765 new
766 call setline(1, before)
767 exe '%s/' . pat . '/XX/'
768 let result = getline(1, '$')
769 q!
770 if result != after
771 call assert_report('Error: pat: \"' . pat . '\", text: \"'
772 \ . string(before) . '\", expected: \"' . string(after)
773 \ . '\", got: \"' . string(result) . '\"')
774 else
775 " Test passed
776 endif
777 endfor
778 endfor
779 unlet t tl
780endfunc
781
782" Check that using a pattern on two lines doesn't get messed up by using
783" matchstr() with \ze in between.
784func Test_matchstr_with_ze()
785 new
786 call append(0, ['Substitute here:', '<T="">Ta 5</Title>',
787 \ '<T="">Ac 7</Title>'])
788 call cursor(1, 1)
789 set re=0
790
791 .+1,.+2s/""/\='"' . matchstr(getline("."), '\d\+\ze<') . '"'
792 call assert_equal(['Substitute here:', '<T="5">Ta 5</Title>',
793 \ '<T="7">Ac 7</Title>', ''], getline(1, '$'))
794
795 bwipe!
796endfunc
797
798" Check a pattern with a look beind crossing a line boundary
799func Test_lookbehind_across_line()
800 new
801 call append(0, ['Behind:', 'asdfasd<yyy', 'xxstart1', 'asdfasd<yy',
802 \ 'xxxstart2', 'asdfasd<yy', 'xxstart3'])
803 call cursor(1, 1)
804 call search('\(<\_[xy]\+\)\@3<=start')
805 call assert_equal([0, 7, 3, 0], getpos('.'))
806 bwipe!
807endfunc
808
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200809" Test for the \%V atom (match inside the visual area)
810func Regex_Match_Visual_Area()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100811 call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand',
812 \ 'oooxofor foroxooo', 'oooxofor foroxooo'])
813 call cursor(1, 1)
814 exe "normal jfxvfx:s/\\%Ve/E/g\<CR>"
815 exe "normal jV:s/\\%Va/A/g\<CR>"
816 exe "normal jfx\<C-V>fxj:s/\\%Vo/O/g\<CR>"
817 call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd',
818 \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200819 %d
820endfunc
821
822" Check matching Visual area
823func Test_matching_visual_area()
824 new
825 set regexpengine=1
826 call Regex_Match_Visual_Area()
827 set regexpengine=2
828 call Regex_Match_Visual_Area()
829 set regexpengine&
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100830 bwipe!
831endfunc
832
833" Check matching marks
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200834func Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100835 call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas',
836 \ 'dfsadfEasdf', '', '', '', '', ''])
837 call cursor(4, 1)
838 exe "normal jfSmsfEme:.-4,.+6s/.\\%>'s.*\\%<'e../here/\<CR>"
839 exe "normal jfSmsj0fEme:.-4,.+6s/.\\%>'s\\_.*\\%<'e../again/\<CR>"
840 call assert_equal(['', '', '', 'Marks:', 'asdfhereasdf', 'asdfagainasdf',
841 \ '', '', '', '', '', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200842 %d
843endfunc
844
845func Test_matching_marks()
846 new
847 set regexpengine=1
848 call Regex_Mark()
849 set regexpengine=2
850 call Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100851 bwipe!
852endfunc
853
854" Check patterns matching cursor position.
855func s:curpos_test()
856 new
857 call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo',
858 \ "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_',
859 \ ' 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'])
860 call setpos('.', [0, 1, 0, 0])
861 s/\%>3c.//g
862 call setpos('.', [0, 2, 4, 0])
863 s/\%#.*$//g
864 call setpos('.', [0, 3, 0, 0])
865 s/\%<3c./_/g
866 %s/\%4l\%>5c./_/g
867 %s/\%6l\%>25v./_/g
868 %s/\%>6l\%3c./!/g
869 %s/\%>7l\%12c./?/g
870 %s/\%>7l\%<9l\%>5v\%<8v./#/g
871 $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
872 call assert_equal(['ffo', 'bob', '__ooooo', 'koooo__', 'moooooo',
873 \ ' f__', 'ab!babababababfoo',
874 \ 'ba!ab##abab?bafoo', '**!*****_',
875 \ ' ! 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'],
876 \ getline(1, '$'))
877 bwipe!
878endfunc
879
880func Test_matching_curpos()
881 set re=0
882 call s:curpos_test()
883 set re=1
884 call s:curpos_test()
885 set re=2
886 call s:curpos_test()
887 set re&
888endfunc
889
890" Test for matching the start and end of a buffer
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200891func Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100892 call setline(1, repeat(['vim edit'], 20))
893 /\%^
894 call assert_equal([0, 1, 1, 0], getpos('.'))
895 exe "normal 50%/\\%^..\<CR>"
896 call assert_equal([0, 1, 1, 0], getpos('.'))
897 exe "normal 50%/\\%$\<CR>"
898 call assert_equal([0, 20, 8, 0], getpos('.'))
899 exe "normal 6gg/..\\%$\<CR>"
900 call assert_equal([0, 20, 7, 0], getpos('.'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200901 %d
902endfunc
903
904func Test_start_end_of_buffer_match()
905 new
906 set regexpengine=1
907 call Regex_start_end_buffer()
908 set regexpengine=2
909 call Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100910 bwipe!
911endfunc
912
913" Check for detecting error
914func Test_regexp_error()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200915 call assert_fails("call matchlist('x x', '\\%#=1 \\zs*')", 'E888:')
916 call assert_fails("call matchlist('x x', '\\%#=1 \\ze*')", 'E888:')
917 call assert_fails("call matchlist('x x', '\\%#=2 \\zs*')", 'E888:')
918 call assert_fails("call matchlist('x x', '\\%#=2 \\ze*')", 'E888:')
919 call assert_fails('exe "normal /\\%#=1\\%[x\\%[x]]\<CR>"', 'E369:')
Bram Moolenaar004a6782020-04-11 17:09:31 +0200920 call assert_fails("call matchstr('abcd', '\\%o841\\%o142')", 'E678:')
921 call assert_equal('', matchstr('abcd', '\%o181\%o142'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200922endfunc
923
924" Test for using the last substitute string pattern (~)
925func Test_regexp_last_subst_string()
926 new
927 s/bar/baz/e
928 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=1\~"), "baz")
929 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=2\~"), "baz")
930 close!
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100931endfunc
932
933" vim: shiftwidth=2 sts=2 expandtab