blob: f2910f06465b74096b4abaffe9700507c78ee195 [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 Moolenaar4d23c522020-04-09 18:42:11 +0200174 " match newline character in a string
175 call add(tl, [2, 'o\nb', "foo\nbar", "o\nb"])
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100176
177 " operator \|
178 call add(tl, [2, 'a\|ab', 'cabd', 'a']) " alternation is ordered
179
180 call add(tl, [2, 'c\?', 'ccb', 'c'])
181 call add(tl, [2, 'bc\?', 'abd', 'b'])
182 call add(tl, [2, 'bc\?', 'abccd', 'bc'])
183
184 call add(tl, [2, '\va{1}', 'ab', 'a'])
185
186 call add(tl, [2, '\va{2}', 'aa', 'aa'])
187 call add(tl, [2, '\va{2}', 'caad', 'aa'])
188 call add(tl, [2, '\va{2}', 'aba'])
189 call add(tl, [2, '\va{2}', 'ab'])
190 call add(tl, [2, '\va{2}', 'abaa', 'aa'])
191 call add(tl, [2, '\va{2}', 'aaa', 'aa'])
192
193 call add(tl, [2, '\vb{1}', 'abca', 'b'])
194 call add(tl, [2, '\vba{2}', 'abaa', 'baa'])
195 call add(tl, [2, '\vba{3}', 'aabaac'])
196
197 call add(tl, [2, '\v(ab){1}', 'ab', 'ab', 'ab'])
198 call add(tl, [2, '\v(ab){1}', 'dabc', 'ab', 'ab'])
199 call add(tl, [2, '\v(ab){1}', 'acb'])
200
201 call add(tl, [2, '\v(ab){0,2}', 'acb', "", ""])
202 call add(tl, [2, '\v(ab){0,2}', 'ab', 'ab', 'ab'])
203 call add(tl, [2, '\v(ab){1,2}', 'ab', 'ab', 'ab'])
204 call add(tl, [2, '\v(ab){1,2}', 'ababc', 'abab', 'ab'])
205 call add(tl, [2, '\v(ab){2,4}', 'ababcab', 'abab', 'ab'])
206 call add(tl, [2, '\v(ab){2,4}', 'abcababa', 'abab', 'ab'])
207
208 call add(tl, [2, '\v(ab){2}', 'abab', 'abab', 'ab'])
209 call add(tl, [2, '\v(ab){2}', 'cdababe', 'abab', 'ab'])
210 call add(tl, [2, '\v(ab){2}', 'abac'])
211 call add(tl, [2, '\v(ab){2}', 'abacabab', 'abab', 'ab'])
212 call add(tl, [2, '\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab'])
213 call add(tl, [2, '\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab'])
214
215 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
216 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
217 call add(tl, [2, '\v(a{2}){1}', 'aaac', 'aa', 'aa'])
218 call add(tl, [2, '\v(a{2}){1}', 'daaac', 'aa', 'aa'])
219 call add(tl, [2, '\v(a{1}){2}', 'daaac', 'aa', 'a'])
220 call add(tl, [2, '\v(a{1}){2}', 'aaa', 'aa', 'a'])
221 call add(tl, [2, '\v(a{2})+', 'adaac', 'aa', 'aa'])
222 call add(tl, [2, '\v(a{2})+', 'aa', 'aa', 'aa'])
223 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
224 call add(tl, [2, '\v(a{1}){2}', 'aa', 'aa', 'a'])
225 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
226 call add(tl, [2, '\v(a{2}){2}', 'aaaa', 'aaaa', 'aa'])
227 call add(tl, [2, '\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa'])
228
229 call add(tl, [2, '\v(a+){2}', 'dadaac', 'aa', 'a'])
230 call add(tl, [2, '\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa'])
231
232 call add(tl, [2, '\v(a{1,2}){2}', 'daaac', 'aaa', 'a'])
233 call add(tl, [2, '\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a'])
234 call add(tl, [2, '\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa'])
235 call add(tl, [2, '\v(a{1,3}){3}', 'daac'])
236 call add(tl, [2, '\v(a{1,2}){2}', 'dac'])
237 call add(tl, [2, '\v(a+)+', 'daac', 'aa', 'aa'])
238 call add(tl, [2, '\v(a+)+', 'aaa', 'aaa', 'aaa'])
239 call add(tl, [2, '\v(a+){1,2}', 'aaa', 'aaa', 'aaa'])
240 call add(tl, [2, '\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a'])
241 call add(tl, [2, '\v(a{3})+', 'daaaac', 'aaa', 'aaa'])
242 call add(tl, [2, '\v(a|b|c)+', 'aacb', 'aacb', 'b'])
243 call add(tl, [2, '\v(a|b|c){2}', 'abcb', 'ab', 'b'])
244 call add(tl, [2, '\v(abc){2}', 'abcabd', ])
245 call add(tl, [2, '\v(abc){2}', 'abdabcabc','abcabc', 'abc'])
246
247 call add(tl, [2, 'a*', 'cc', ''])
248 call add(tl, [2, '\v(a*)+', 'cc', ''])
249 call add(tl, [2, '\v((ab)+)+', 'ab', 'ab', 'ab', 'ab'])
250 call add(tl, [2, '\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab'])
251 call add(tl, [2, '\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab'])
252 call add(tl, [2, '\v(a{0,2})+', 'cc', ''])
253 call add(tl, [2, '\v(a*)+', '', ''])
254 call add(tl, [2, '\v((a*)+)+', '', ''])
255 call add(tl, [2, '\v((ab)*)+', '', ''])
256 call add(tl, [2, '\va{1,3}', 'aab', 'aa'])
257 call add(tl, [2, '\va{2,3}', 'abaa', 'aa'])
258
259 call add(tl, [2, '\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
260 call add(tl, [2, '\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb'])
261 call add(tl, [2, '\va{2}|b{2}', 'abab'])
262 call add(tl, [2, '\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a'])
263 call add(tl, [2, '\vab{2,3}c', 'aabbccccccccccccc', 'abbc'])
264 call add(tl, [2, '\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc'])
265 call add(tl, [2, '\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde'])
266 call add(tl, [2, '\va(bc){2}d', 'aabcbfbc' ])
267 call add(tl, [2, '\va*a{2}', 'a', ])
268 call add(tl, [2, '\va*a{2}', 'aa', 'aa' ])
269 call add(tl, [2, '\va*a{2}', 'aaa', 'aaa' ])
270 call add(tl, [2, '\va*a{2}', 'bbbabcc', ])
271 call add(tl, [2, '\va*b*|a*c*', 'a', 'a'])
272 call add(tl, [2, '\va{1}b{1}|a{1}b{1}', ''])
273
274 " submatches
275 call add(tl, [2, '\v(a)', 'ab', 'a', 'a'])
276 call add(tl, [2, '\v(a)(b)', 'ab', 'ab', 'a', 'b'])
277 call add(tl, [2, '\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c'])
278 call add(tl, [2, '\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b'])
279 call add(tl, [2, '\v(a)|(b)', 'ab', 'a', 'a'])
280
281 call add(tl, [2, '\v(a*)+', 'aaaa', 'aaaa', ''])
282 call add(tl, [2, 'x', 'abcdef'])
283
284 "
285 " Simple tests
286 "
287
288 " Search single groups
289 call add(tl, [2, 'ab', 'aab', 'ab'])
290 call add(tl, [2, 'ab', 'baced'])
291 call add(tl, [2, 'ab', ' ab ', 'ab'])
292
293 " Search multi-modifiers
294 call add(tl, [2, 'x*', 'xcd', 'x'])
295 call add(tl, [2, 'x*', 'xxxxxxxxxxxxxxxxsofijiojgf', 'xxxxxxxxxxxxxxxx'])
296 " empty match is good
297 call add(tl, [2, 'x*', 'abcdoij', ''])
298 " no match here
299 call add(tl, [2, 'x\+', 'abcdoin'])
300 call add(tl, [2, 'x\+', 'abcdeoijdfxxiuhfij', 'xx'])
301 call add(tl, [2, 'x\+', 'xxxxx', 'xxxxx'])
302 call add(tl, [2, 'x\+', 'abc x siufhiush xxxxxxxxx', 'x'])
303 call add(tl, [2, 'x\=', 'x sdfoij', 'x'])
304 call add(tl, [2, 'x\=', 'abc sfoij', '']) " empty match is good
305 call add(tl, [2, 'x\=', 'xxxxxxxxx c', 'x'])
306 call add(tl, [2, 'x\?', 'x sdfoij', 'x'])
307 " empty match is good
308 call add(tl, [2, 'x\?', 'abc sfoij', ''])
309 call add(tl, [2, 'x\?', 'xxxxxxxxxx c', 'x'])
310
311 call add(tl, [2, 'a\{0,0}', 'abcdfdoij', ''])
312 " same thing as 'a?'
313 call add(tl, [2, 'a\{0,1}', 'asiubid axxxaaa', 'a'])
314 " same thing as 'a\{0,1}'
315 call add(tl, [2, 'a\{1,0}', 'asiubid axxxaaa', 'a'])
316 call add(tl, [2, 'a\{3,6}', 'aa siofuh'])
317 call add(tl, [2, 'a\{3,6}', 'aaaaa asfoij afaa', 'aaaaa'])
318 call add(tl, [2, 'a\{3,6}', 'aaaaaaaa', 'aaaaaa'])
319 call add(tl, [2, 'a\{0}', 'asoiuj', ''])
320 call add(tl, [2, 'a\{2}', 'aaaa', 'aa'])
321 call add(tl, [2, 'a\{2}', 'iuash fiusahfliusah fiushfilushfi uhsaifuh askfj nasfvius afg aaaa sfiuhuhiushf', 'aa'])
322 call add(tl, [2, 'a\{2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
323 " same thing as 'a*'
324 call add(tl, [2, 'a\{0,}', 'oij sdigfusnf', ''])
325 call add(tl, [2, 'a\{0,}', 'aaaaa aa', 'aaaaa'])
326 call add(tl, [2, 'a\{2,}', 'sdfiougjdsafg'])
327 call add(tl, [2, 'a\{2,}', 'aaaaasfoij ', 'aaaaa'])
328 call add(tl, [2, 'a\{5,}', 'xxaaaaxxx '])
329 call add(tl, [2, 'a\{5,}', 'xxaaaaaxxx ', 'aaaaa'])
330 call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
331 call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
332 call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
333 " leading star as normal char when \{} follows
334 call add(tl, [2, '^*\{4,}$', '***'])
335 call add(tl, [2, '^*\{4,}$', '****', '****'])
336 call add(tl, [2, '^*\{4,}$', '*****', '*****'])
337 " same thing as 'a*'
338 call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
339 call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
340
341 call add(tl, [2, 'a\{-0,0}', 'abcdfdoij', ''])
342 " anti-greedy version of 'a?'
343 call add(tl, [2, 'a\{-0,1}', 'asiubid axxxaaa', ''])
344 call add(tl, [2, 'a\{-3,6}', 'aa siofuh'])
345 call add(tl, [2, 'a\{-3,6}', 'aaaaa asfoij afaa', 'aaa'])
346 call add(tl, [2, 'a\{-3,6}', 'aaaaaaaa', 'aaa'])
347 call add(tl, [2, 'a\{-0}', 'asoiuj', ''])
348 call add(tl, [2, 'a\{-2}', 'aaaa', 'aa'])
349 call add(tl, [2, 'a\{-2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
350 call add(tl, [2, 'a\{-0,}', 'oij sdigfusnf', ''])
351 call add(tl, [2, 'a\{-0,}', 'aaaaa aa', ''])
352 call add(tl, [2, 'a\{-2,}', 'sdfiougjdsafg'])
353 call add(tl, [2, 'a\{-2,}', 'aaaaasfoij ', 'aa'])
354 call add(tl, [2, 'a\{-,0}', 'oidfguih iuhi hiu aaaa', ''])
355 call add(tl, [2, 'a\{-,5}', 'abcd', ''])
356 call add(tl, [2, 'a\{-,5}', 'aaaaaaaaaa', ''])
357 " anti-greedy version of 'a*'
358 call add(tl, [2, 'a\{-}', 'bbbcddiuhfcd', ''])
359 call add(tl, [2, 'a\{-}', 'aaaaioudfh coisf jda', ''])
360
361 " Test groups of characters and submatches
362 call add(tl, [2, '\(abc\)*', 'abcabcabc', 'abcabcabc', 'abc'])
363 call add(tl, [2, '\(ab\)\+', 'abababaaaaa', 'ababab', 'ab'])
364 call add(tl, [2, '\(abaaaaa\)*cd', 'cd', 'cd', ''])
365 call add(tl, [2, '\(test1\)\? \(test2\)\?', 'test1 test3', 'test1 ', 'test1', ''])
366 call add(tl, [2, '\(test1\)\= \(test2\) \(test4443\)\=', ' test2 test4443 yupiiiiiiiiiii', ' test2 test4443', '', 'test2', 'test4443'])
367 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'])
368 call add(tl, [2, '\(\(\(yyxxzz\)\)\)', 'abcdddsfiusfyyzzxxyyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz'])
369 call add(tl, [2, '\v((ab)+|c+)+', 'abcccaba', 'abcccab', 'ab', 'ab'])
370 call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
371 call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
372 call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
373 call add(tl, [2, '\p*', 'aá ', 'aá '])
374
375 " Test greedy-ness and lazy-ness
376 call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
377 call add(tl, [2, 'a\{-2,7}x','aaaaaaaaax', 'aaaaaaax'])
378 call add(tl, [2, 'a\{2,7}','aaaaaaaaaaaaaaaaaaaa', 'aaaaaaa'])
379 call add(tl, [2, 'a\{2,7}x','aaaaaaaaax', 'aaaaaaax'])
380 call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
381 call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa',''])
382 call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
383 call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
384 call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
385 call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
386 call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
387 call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
388
389 " Test Character classes
390 call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
391
392 " Test collections and character range []
393 call add(tl, [2, '\v[a]', 'abcd', 'a'])
394 call add(tl, [2, 'a[bcd]', 'abcd', 'ab'])
395 call add(tl, [2, 'a[b-d]', 'acbd', 'ac'])
396 call add(tl, [2, '[a-d][e-f][x-x]d', 'cexdxx', 'cexd'])
397 call add(tl, [2, '\v[[:alpha:]]+', 'abcdefghijklmnopqrstuvwxyz6','abcdefghijklmnopqrstuvwxyz'])
398 call add(tl, [2, '[[:alpha:]\+]', '6x8','x'])
399 call add(tl, [2, '[^abc]\+','abcabcabc'])
400 call add(tl, [2, '[^abc]','defghiasijvoinasoiunbvb','d'])
401 call add(tl, [2, '[^abc]\+','ddddddda','ddddddd'])
402 call add(tl, [2, '[^a-d]\+','aaaAAAZIHFNCddd','AAAZIHFNC'])
403 call add(tl, [2, '[a-f]*','iiiiiiii',''])
404 call add(tl, [2, '[a-f]*','abcdefgh','abcdef'])
405 call add(tl, [2, '[^a-f]\+','abcdefgh','gh'])
406 call add(tl, [2, '[a-c]\{-3,6}','abcabc','abc'])
407 call add(tl, [2, '[^[:alpha:]]\+','abcccadfoij7787ysf287yrnccdu','7787'])
408 call add(tl, [2, '[-a]', '-', '-'])
409 call add(tl, [2, '[a-]', '-', '-'])
410 call add(tl, [2, '[a-f]*\c','ABCDEFGH','ABCDEF'])
411 call add(tl, [2, '[abc][xyz]\c','-af-AF-BY--','BY'])
412 " filename regexp
413 call add(tl, [2, '[-./[:alnum:]_~]\+', 'log13.file', 'log13.file'])
414 " special chars
415 call add(tl, [2, '[\]\^\-\\]\+', '\^\\\-\---^', '\^\\\-\---^'])
416 " collation elem
417 call add(tl, [2, '[[.a.]]\+', 'aa', 'aa'])
418 " middle of regexp
419 call add(tl, [2, 'abc[0-9]*ddd', 'siuhabc ii'])
420 call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
421 call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
422 call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
423 call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
424 call add(tl, [2, '\_f', " \na ", "\n"])
425 call add(tl, [2, '\_f\+', " \na ", "\na"])
426 call add(tl, [2, '[0-9A-Za-z-_.]\+', " @0_a.A-{ ", "0_a.A-"])
427
428 " Test start/end of line, start/end of file
429 call add(tl, [2, '^a.', "a_\nb ", "a_"])
430 call add(tl, [2, '^a.', "b a \na_"])
431 call add(tl, [2, '.a$', " a\n "])
432 call add(tl, [2, '.a$', " a b\n_a", "_a"])
433 call add(tl, [2, '\%^a.', "a a\na", "a "])
434 call add(tl, [2, '\%^a', " a \na "])
435 call add(tl, [2, '.a\%$', " a\n "])
436 call add(tl, [2, '.a\%$', " a\n_a", "_a"])
437
438 " Test recognition of character classes
439 call add(tl, [2, '[0-7]\+', 'x0123456789x', '01234567'])
440 call add(tl, [2, '[^0-7]\+', '0a;X+% 897', 'a;X+% 89'])
441 call add(tl, [2, '[0-9]\+', 'x0123456789x', '0123456789'])
442 call add(tl, [2, '[^0-9]\+', '0a;X+% 9', 'a;X+% '])
443 call add(tl, [2, '[0-9a-fA-F]\+', 'x0189abcdefg', '0189abcdef'])
444 call add(tl, [2, '[^0-9A-Fa-f]\+', '0189g;X+% ab', 'g;X+% '])
445 call add(tl, [2, '[a-z_A-Z0-9]\+', ';+aso_SfOij ', 'aso_SfOij'])
446 call add(tl, [2, '[^a-z_A-Z0-9]\+', 'aSo_;+% sfOij', ';+% '])
447 call add(tl, [2, '[a-z_A-Z]\+', '0abyz_ABYZ;', 'abyz_ABYZ'])
448 call add(tl, [2, '[^a-z_A-Z]\+', 'abAB_09;+% yzYZ', '09;+% '])
449 call add(tl, [2, '[a-z]\+', '0abcxyz1', 'abcxyz'])
450 call add(tl, [2, '[a-z]\+', 'AabxyzZ', 'abxyz'])
451 call add(tl, [2, '[^a-z]\+', 'a;X09+% x', ';X09+% '])
452 call add(tl, [2, '[^a-z]\+', 'abX0;%yz', 'X0;%'])
453 call add(tl, [2, '[a-zA-Z]\+', '0abABxzXZ9', 'abABxzXZ'])
454 call add(tl, [2, '[^a-zA-Z]\+', 'ab09_;+ XZ', '09_;+ '])
455 call add(tl, [2, '[A-Z]\+', 'aABXYZz', 'ABXYZ'])
456 call add(tl, [2, '[^A-Z]\+', 'ABx0;%YZ', 'x0;%'])
457 call add(tl, [2, '[a-z]\+\c', '0abxyzABXYZ;', 'abxyzABXYZ'])
458 call add(tl, [2, '[A-Z]\+\c', '0abABxzXZ9', 'abABxzXZ'])
459 call add(tl, [2, '\c[^a-z]\+', 'ab09_;+ XZ', '09_;+ '])
460 call add(tl, [2, '\c[^A-Z]\+', 'ab09_;+ XZ', '09_;+ '])
461 call add(tl, [2, '\C[^A-Z]\+', 'ABCOIJDEOIFNSD jsfoij sa', ' jsfoij sa'])
462
463 " Tests for \z features
464 " match ends at \ze
465 call add(tl, [2, 'xx \ze test', 'xx '])
466 call add(tl, [2, 'abc\zeend', 'oij abcend', 'abc'])
467 call add(tl, [2, 'aa\zebb\|aaxx', ' aabb ', 'aa'])
468 call add(tl, [2, 'aa\zebb\|aaxx', ' aaxx ', 'aaxx'])
469 call add(tl, [2, 'aabb\|aa\zebb', ' aabb ', 'aabb'])
470 call add(tl, [2, 'aa\zebb\|aaebb', ' aabb ', 'aa'])
471 " match starts at \zs
472 call add(tl, [2, 'abc\zsdd', 'ddabcddxyzt', 'dd'])
473 call add(tl, [2, 'aa \zsax', ' ax'])
474 call add(tl, [2, 'abc \zsmatch\ze abc', 'abc abc abc match abc abc', 'match'])
475 call add(tl, [2, '\v(a \zsif .*){2}', 'a if then a if last', 'if last', 'a if last'])
476 call add(tl, [2, '\>\zs.', 'aword. ', '.'])
477 call add(tl, [2, '\s\+\ze\[/\|\s\zs\s\+', 'is [a t', ' '])
478
479 " Tests for \@= and \& features
480 call add(tl, [2, 'abc\@=', 'abc', 'ab'])
481 call add(tl, [2, 'abc\@=cd', 'abcd', 'abcd'])
482 call add(tl, [2, 'abc\@=', 'ababc', 'ab'])
483 " will never match, no matter the input text
484 call add(tl, [2, 'abcd\@=e', 'abcd'])
485 " will never match
486 call add(tl, [2, 'abcd\@=e', 'any text in here ... '])
487 call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
488 call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
489 call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
490 call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
491 call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
492 call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
493 call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
494 call add(tl, [2, 'foo\(bar\)\@!', 'foobar'])
495 call add(tl, [2, 'foo\(bar\)\@!', 'foo bar', 'foo'])
496 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if then else'])
497 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if else ', 'if else ', ' '])
498 call add(tl, [2, '\(foo\)\@!bar', 'foobar', 'bar'])
499 call add(tl, [2, '\(foo\)\@!...bar', 'foobar'])
500 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' bar foo '])
501 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
502 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
503 call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
504 call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
505 call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
506 call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
507
508 " Combining different tests and features
509 call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])
510 call add(tl, [2, '', 'abcd', ''])
511 call add(tl, [2, '\v(())', 'any possible text', ''])
512 call add(tl, [2, '\v%(ab(xyz)c)', ' abxyzc ', 'abxyzc', 'xyz'])
513 call add(tl, [2, '\v(test|)empty', 'tesempty', 'empty', ''])
514 call add(tl, [2, '\v(a|aa)(a|aa)', 'aaa', 'aa', 'a', 'a'])
515
516 " \%u and friends
517 call add(tl, [2, '\%d32', 'yes no', ' '])
518 call add(tl, [2, '\%o40', 'yes no', ' '])
519 call add(tl, [2, '\%x20', 'yes no', ' '])
520 call add(tl, [2, '\%u0020', 'yes no', ' '])
521 call add(tl, [2, '\%U00000020', 'yes no', ' '])
522 call add(tl, [2, '\%d0', "yes\x0ano", "\x0a"])
523
524 "" \%[abc]
525 call add(tl, [2, 'foo\%[bar]', 'fobar'])
526 call add(tl, [2, 'foo\%[bar]', 'foobar', 'foobar'])
527 call add(tl, [2, 'foo\%[bar]', 'fooxx', 'foo'])
528 call add(tl, [2, 'foo\%[bar]', 'foobxx', 'foob'])
529 call add(tl, [2, 'foo\%[bar]', 'foobaxx', 'fooba'])
530 call add(tl, [2, 'foo\%[bar]', 'foobarxx', 'foobar'])
531 call add(tl, [2, 'foo\%[bar]x', 'foobxx', 'foobx'])
532 call add(tl, [2, 'foo\%[bar]x', 'foobarxx', 'foobarx'])
533 call add(tl, [2, '\%[bar]x', 'barxx', 'barx'])
534 call add(tl, [2, '\%[bar]x', 'bxx', 'bx'])
535 call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
536 call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
537 call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
538 call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
539
540 " Alternatives, must use first longest match
541 call add(tl, [2, 'goo\|go', 'google', 'goo'])
542 call add(tl, [2, '\<goo\|\<go', 'google', 'goo'])
543 call add(tl, [2, '\<goo\|go', 'google', 'goo'])
544
545 " Back references
546 call add(tl, [2, '\(\i\+\) \1', ' abc abc', 'abc abc', 'abc'])
547 call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
548 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'])
549 call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', ''])
550 call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a'])
551 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.com', 'foo.bat/foo.com', 'bat'])
552 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.bat'])
553 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<=$', 'foo.bat/foo.bat', 'foo.bat/foo.bat', 'bat', 'bat'])
554 call add(tl, [2, '\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', '2013-06-27${0}', '${0}', '0'])
555 call add(tl, [2, '^\(a*\)\1$', 'aaaaaaaa', 'aaaaaaaa', 'aaaa'])
556 call add(tl, [2, '^\(a\{-2,}\)\1\+$', 'aaaaaaaaa', 'aaaaaaaaa', 'aaa'])
557
558 " Look-behind with limit
559 call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
560 call add(tl, [2, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
561 call add(tl, [2, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
562 call add(tl, [2, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
563 call add(tl, [2, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
564 call add(tl, [2, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
565 call add(tl, [2, '\(foo\)\@<!bar.', 'xx foobar1 xbar2 xx', 'bar2'])
566
567 " look-behind match in front of a zero-width item
568 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" test header'])
569 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" Last Changed: 1970', '1970'])
570 call add(tl, [2, '\(foo\)\@<=\>', 'foobar'])
571 call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo'])
572 call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo'])
573
574 " complicated look-behind match
575 call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
576 call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
577
578 "" \@>
579 call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
580 call add(tl, [2, '\(a*\)\@>b', 'aaab', 'aaab', 'aaa'])
581 call add(tl, [2, '^\(.\{-}b\)\@>.', ' abcbd', ' abc', ' ab'])
582 call add(tl, [2, '\(.\{-}\)\(\)\@>$', 'abc', 'abc', 'abc', ''])
583 " TODO: BT engine does not restore submatch after failure
584 call add(tl, [1, '\(a*\)\@>a\|a\+', 'aaaa', 'aaaa'])
585
586 " "\_" prepended negated collection matches EOL
587 call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
588 call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
589
590 " Requiring lots of states.
591 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-"])
592
593 " Skip adding state twice
594 call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO'])
595
596 " Test \%V atom
597 call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt'])
598
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200599 " Test for ignoring case and matching repeated characters
600 call add(tl, [2, '\cb\+', 'aAbBbBcC', 'bBbB'])
601
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100602 " Run the tests
603 for t in tl
604 let re = t[0]
605 let pat = t[1]
606 let text = t[2]
607 let matchidx = 3
608 for engine in [0, 1, 2]
609 if engine == 2 && re == 0 || engine == 1 && re == 1
610 continue
611 endif
612 let &regexpengine = engine
613 try
614 let l = matchlist(text, pat)
615 catch
616 call assert_report('Error ' . engine . ': pat: \"' . pat
617 \ . '\", text: \"' . text . '\", caused an exception: \"'
618 \ . v:exception . '\"')
619 endtry
620 " check the match itself
621 if len(l) == 0 && len(t) > matchidx
622 call assert_report('Error ' . engine . ': pat: \"' . pat
623 \ . '\", text: \"' . text . '\", did not match, expected: \"'
624 \ . t[matchidx] . '\"')
625 elseif len(l) > 0 && len(t) == matchidx
626 call assert_report('Error ' . engine . ': pat: \"' . pat
627 \ . '\", text: \"' . text . '\", match: \"' . l[0]
628 \ . '\", expected no match')
629 elseif len(t) > matchidx && l[0] != t[matchidx]
630 call assert_report('Error ' . engine . ': pat: \"' . pat
631 \ . '\", text: \"' . text . '\", match: \"' . l[0]
632 \ . '\", expected: \"' . t[matchidx] . '\"')
633 else
634 " Test passed
635 endif
636
637 " check all the nine submatches
638 if len(l) > 0
639 for i in range(1, 9)
640 if len(t) <= matchidx + i
641 let e = ''
642 else
643 let e = t[matchidx + i]
644 endif
645 if l[i] != e
646 call assert_report('Error ' . engine . ': pat: \"' . pat
647 \ . '\", text: \"' . text . '\", submatch ' . i . ': \"'
648 \ . l[i] . '\", expected: \"' . e . '\"')
649 endif
650 endfor
651 unlet i
652 endif
653 endfor
654 endfor
655
656 unlet t tl e l
657endfunc
658
659" Tests for multi-line regexp patterns without multi-byte support.
660func Test_regexp_multiline_pat()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200661 " tl is a List of Lists with:
662 " regexp engines to test
663 " 0 - test with 'regexpengine' values 0 and 1
664 " 1 - test with 'regexpengine' values 0 and 2
665 " 2 - test with 'regexpengine' values 0, 1 and 2
666 " regexp pattern
667 " List with text to test the pattern on
668 " List with the expected match
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100669 let tl = []
670
671 " back references
672 call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']])
673 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']])
674
675 " line breaks
676 call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']])
677
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200678 " Any single character or end-of-line
679 call add(tl, [2, '\_.\+', ['a', 'b', 'c'], ['XX']])
680 " Any identifier or end-of-line
681 call add(tl, [2, '\_i\+', ['a', 'b', ';', '2'], ['XX;XX']])
682 " Any identifier but excluding digits or end-of-line
683 call add(tl, [2, '\_I\+', ['a', 'b', ';', '2'], ['XX;XX2XX']])
684 " Any keyword or end-of-line
685 call add(tl, [2, '\_k\+', ['a', 'b', '=', '2'], ['XX=XX']])
686 " Any keyword but excluding digits or end-of-line
687 call add(tl, [2, '\_K\+', ['a', 'b', '=', '2'], ['XX=XX2XX']])
688 " Any filename character or end-of-line
689 call add(tl, [2, '\_f\+', ['a', 'b', '.', '5'], ['XX']])
690 " Any filename character but excluding digits or end-of-line
691 call add(tl, [2, '\_F\+', ['a', 'b', '.', '5'], ['XX5XX']])
692 " Any printable character or end-of-line
693 call add(tl, [2, '\_p\+', ['a', 'b', '=', '4'], ['XX']])
694 " Any printable character excluding digits or end-of-line
695 call add(tl, [2, '\_P\+', ['a', 'b', '=', '4'], ['XX4XX']])
696 " Any whitespace character or end-of-line
697 call add(tl, [2, '\_s\+', [' ', ' ', 'a', 'b'], ['XXaXXbXX']])
698 " Any non-whitespace character or end-of-line
699 call add(tl, [2, '\_S\+', [' ', ' ', 'a', 'b'], [' XX XX']])
700 " Any decimal digit or end-of-line
701 call add(tl, [2, '\_d\+', ['1', 'a', '2', 'b', '3'], ['XXaXXbXX']])
702 " Any non-decimal digit or end-of-line
703 call add(tl, [2, '\_D\+', ['1', 'a', '2', 'b', '3'], ['1XX2XX3XX']])
704 " Any hexadecimal digit or end-of-line
705 call add(tl, [2, '\_x\+', ['1', 'a', 'g', '9', '8'], ['XXgXX']])
706 " Any non-hexadecimal digit or end-of-line
707 call add(tl, [2, '\_X\+', ['1', 'a', 'g', '9', '8'], ['1XXaXX9XX8XX']])
708 " Any octal digit or end-of-line
709 call add(tl, [2, '\_o\+', ['0', '7', '8', '9', '0'], ['XX8XX9XX']])
710 " Any non-octal digit or end-of-line
711 call add(tl, [2, '\_O\+', ['0', '7', '8', '9', '0'], ['0XX7XX0XX']])
712 " Any word character or end-of-line
713 call add(tl, [2, '\_w\+', ['A', 'B', '=', 'C', 'D'], ['XX=XX']])
714 " Any non-word character or end-of-line
715 call add(tl, [2, '\_W\+', ['A', 'B', '=', 'C', 'D'], ['AXXBXXCXXDXX']])
716 " Any head-of-word character or end-of-line
717 call add(tl, [2, '\_h\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
718 " Any non-head-of-word character or end-of-line
719 call add(tl, [2, '\_H\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
720 " Any alphabetic character or end-of-line
721 call add(tl, [2, '\_a\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
722 " Any non-alphabetic character or end-of-line
723 call add(tl, [2, '\_A\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
724 " Any lowercase character or end-of-line
725 call add(tl, [2, '\_l\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
726 " Any non-lowercase character or end-of-line
727 call add(tl, [2, '\_L\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
728 " Any uppercase character or end-of-line
729 call add(tl, [2, '\_u\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
730 " Any non-uppercase character or end-of-line
731 call add(tl, [2, '\_U\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
732 " Collection or end-of-line
733 call add(tl, [2, '\_[a-z]\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
734 " start of line anywhere in the text
735 call add(tl, [2, 'one\zs\_s*\_^\zetwo',
736 \ ['', 'one', ' two', 'one', '', 'two'],
737 \ ['', 'one', ' two', 'oneXXtwo']])
738 " end of line anywhere in the text
739 call add(tl, [2, 'one\zs\_$\_s*two',
740 \ ['', 'one', ' two', 'one', '', 'two'], ['', 'oneXX', 'oneXX']])
741
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100742 " Check that \_[0-9] matching EOL does not break a following \>
743 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', '']])
744
745 " Check a pattern with a line break and ^ and $
746 call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']])
747
748 call add(tl, [2, '\(^.\+\n\)\1', [' dog', ' dog', 'asdf'], ['XXasdf']])
749
750 " Run the multi-line tests
751 for t in tl
752 let re = t[0]
753 let pat = t[1]
754 let before = t[2]
755 let after = t[3]
756 for engine in [0, 1, 2]
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200757 if engine == 2 && re == 0 || engine == 1 && re == 1
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100758 continue
759 endif
760 let &regexpengine = engine
761 new
762 call setline(1, before)
763 exe '%s/' . pat . '/XX/'
764 let result = getline(1, '$')
765 q!
766 if result != after
767 call assert_report('Error: pat: \"' . pat . '\", text: \"'
768 \ . string(before) . '\", expected: \"' . string(after)
769 \ . '\", got: \"' . string(result) . '\"')
770 else
771 " Test passed
772 endif
773 endfor
774 endfor
775 unlet t tl
776endfunc
777
778" Check that using a pattern on two lines doesn't get messed up by using
779" matchstr() with \ze in between.
780func Test_matchstr_with_ze()
781 new
782 call append(0, ['Substitute here:', '<T="">Ta 5</Title>',
783 \ '<T="">Ac 7</Title>'])
784 call cursor(1, 1)
785 set re=0
786
787 .+1,.+2s/""/\='"' . matchstr(getline("."), '\d\+\ze<') . '"'
788 call assert_equal(['Substitute here:', '<T="5">Ta 5</Title>',
789 \ '<T="7">Ac 7</Title>', ''], getline(1, '$'))
790
791 bwipe!
792endfunc
793
794" Check a pattern with a look beind crossing a line boundary
795func Test_lookbehind_across_line()
796 new
797 call append(0, ['Behind:', 'asdfasd<yyy', 'xxstart1', 'asdfasd<yy',
798 \ 'xxxstart2', 'asdfasd<yy', 'xxstart3'])
799 call cursor(1, 1)
800 call search('\(<\_[xy]\+\)\@3<=start')
801 call assert_equal([0, 7, 3, 0], getpos('.'))
802 bwipe!
803endfunc
804
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200805" Test for the \%V atom (match inside the visual area)
806func Regex_Match_Visual_Area()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100807 call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand',
808 \ 'oooxofor foroxooo', 'oooxofor foroxooo'])
809 call cursor(1, 1)
810 exe "normal jfxvfx:s/\\%Ve/E/g\<CR>"
811 exe "normal jV:s/\\%Va/A/g\<CR>"
812 exe "normal jfx\<C-V>fxj:s/\\%Vo/O/g\<CR>"
813 call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd',
814 \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200815 %d
816endfunc
817
818" Check matching Visual area
819func Test_matching_visual_area()
820 new
821 set regexpengine=1
822 call Regex_Match_Visual_Area()
823 set regexpengine=2
824 call Regex_Match_Visual_Area()
825 set regexpengine&
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100826 bwipe!
827endfunc
828
829" Check matching marks
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200830func Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100831 call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas',
832 \ 'dfsadfEasdf', '', '', '', '', ''])
833 call cursor(4, 1)
834 exe "normal jfSmsfEme:.-4,.+6s/.\\%>'s.*\\%<'e../here/\<CR>"
835 exe "normal jfSmsj0fEme:.-4,.+6s/.\\%>'s\\_.*\\%<'e../again/\<CR>"
836 call assert_equal(['', '', '', 'Marks:', 'asdfhereasdf', 'asdfagainasdf',
837 \ '', '', '', '', '', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200838 %d
839endfunc
840
841func Test_matching_marks()
842 new
843 set regexpengine=1
844 call Regex_Mark()
845 set regexpengine=2
846 call Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100847 bwipe!
848endfunc
849
850" Check patterns matching cursor position.
851func s:curpos_test()
852 new
853 call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo',
854 \ "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_',
855 \ ' 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'])
856 call setpos('.', [0, 1, 0, 0])
857 s/\%>3c.//g
858 call setpos('.', [0, 2, 4, 0])
859 s/\%#.*$//g
860 call setpos('.', [0, 3, 0, 0])
861 s/\%<3c./_/g
862 %s/\%4l\%>5c./_/g
863 %s/\%6l\%>25v./_/g
864 %s/\%>6l\%3c./!/g
865 %s/\%>7l\%12c./?/g
866 %s/\%>7l\%<9l\%>5v\%<8v./#/g
867 $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
868 call assert_equal(['ffo', 'bob', '__ooooo', 'koooo__', 'moooooo',
869 \ ' f__', 'ab!babababababfoo',
870 \ 'ba!ab##abab?bafoo', '**!*****_',
871 \ ' ! 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'],
872 \ getline(1, '$'))
873 bwipe!
874endfunc
875
876func Test_matching_curpos()
877 set re=0
878 call s:curpos_test()
879 set re=1
880 call s:curpos_test()
881 set re=2
882 call s:curpos_test()
883 set re&
884endfunc
885
886" Test for matching the start and end of a buffer
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200887func Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100888 call setline(1, repeat(['vim edit'], 20))
889 /\%^
890 call assert_equal([0, 1, 1, 0], getpos('.'))
891 exe "normal 50%/\\%^..\<CR>"
892 call assert_equal([0, 1, 1, 0], getpos('.'))
893 exe "normal 50%/\\%$\<CR>"
894 call assert_equal([0, 20, 8, 0], getpos('.'))
895 exe "normal 6gg/..\\%$\<CR>"
896 call assert_equal([0, 20, 7, 0], getpos('.'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200897 %d
898endfunc
899
900func Test_start_end_of_buffer_match()
901 new
902 set regexpengine=1
903 call Regex_start_end_buffer()
904 set regexpengine=2
905 call Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100906 bwipe!
907endfunc
908
909" Check for detecting error
910func Test_regexp_error()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200911 call assert_fails("call matchlist('x x', '\\%#=1 \\zs*')", 'E888:')
912 call assert_fails("call matchlist('x x', '\\%#=1 \\ze*')", 'E888:')
913 call assert_fails("call matchlist('x x', '\\%#=2 \\zs*')", 'E888:')
914 call assert_fails("call matchlist('x x', '\\%#=2 \\ze*')", 'E888:')
915 call assert_fails('exe "normal /\\%#=1\\%[x\\%[x]]\<CR>"', 'E369:')
916endfunc
917
918" Test for using the last substitute string pattern (~)
919func Test_regexp_last_subst_string()
920 new
921 s/bar/baz/e
922 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=1\~"), "baz")
923 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=2\~"), "baz")
924 close!
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100925endfunc
926
927" vim: shiftwidth=2 sts=2 expandtab