blob: 8df357fd4484fb2bdba58195e97a914b151f01a3 [file] [log] [blame]
Bram Moolenaar22e42152016-04-03 14:02:02 +02001" Tests for regexp in latin1 encoding
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +02002
Bram Moolenaar22e42152016-04-03 14:02:02 +02003set encoding=latin1
4scriptencoding latin1
5
Bram Moolenaar5feabe02020-01-30 18:24:53 +01006source check.vim
7
Bram Moolenaar22e42152016-04-03 14:02:02 +02008func s:equivalence_test()
Dominique Pelle8bfa0eb2022-01-02 16:16:33 +00009 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 '
10 \ .. '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 '
11 \ .. "0 1 2 3 4 5 6 7 8 9 "
12 \ .. "` ~ ! ? ; : . , / \\ ' \" | < > [ ] { } ( ) @ # $ % ^ & * _ - + \b \e \f \n \r \t"
Bram Moolenaar22e42152016-04-03 14:02:02 +020013 let groups = split(str)
14 for group1 in groups
15 for c in split(group1, '\zs')
16 " next statement confirms that equivalence class matches every
17 " character in group
18 call assert_match('^[[=' . c . '=]]*$', group1)
19 for group2 in groups
20 if group2 != group1
21 " next statement converts that equivalence class doesn't match
22 " a character in any other group
23 call assert_equal(-1, match(group2, '[[=' . c . '=]]'))
24 endif
25 endfor
26 endfor
27 endfor
28endfunc
29
30func Test_equivalence_re1()
31 set re=1
32 call s:equivalence_test()
Bram Moolenaar75a115e2022-09-07 18:21:24 +010033 set re=0
Bram Moolenaar22e42152016-04-03 14:02:02 +020034endfunc
35
36func Test_equivalence_re2()
37 set re=2
38 call s:equivalence_test()
Bram Moolenaar75a115e2022-09-07 18:21:24 +010039 set re=0
Bram Moolenaar22e42152016-04-03 14:02:02 +020040endfunc
Bram Moolenaarf5a39442016-08-16 21:04:41 +020041
42func Test_recursive_substitute()
43 new
44 s/^/\=execute("s#^##gn")
45 " check we are now not in the sandbox
46 call setwinvar(1, 'myvar', 1)
47 bwipe!
48endfunc
Bram Moolenaard5638832016-09-09 17:59:50 +020049
50func Test_nested_backrefs()
51 " Check example in change.txt.
52 new
53 for re in range(0, 2)
54 exe 'set re=' . re
55 call setline(1, 'aa ab x')
56 1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/
57 call assert_equal('-aa ab - -ab - -x-', getline(1))
58
59 call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', ''))
60 endfor
61 bwipe!
62 set re=0
63endfunc
Bram Moolenaar16b35782016-09-09 20:29:50 +020064
65func Test_eow_with_optional()
66 let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', '']
67 for re in range(0, 2)
68 exe 'set re=' . re
69 let actual = matchlist('abc def', '\(abc\>\)\?\s*\(def\)')
70 call assert_equal(expected, actual)
71 endfor
Bram Moolenaar75a115e2022-09-07 18:21:24 +010072 set re=0
Bram Moolenaar16b35782016-09-09 20:29:50 +020073endfunc
Bram Moolenaar1ef9bbe2017-06-17 20:08:20 +020074
75func Test_backref()
76 new
77 call setline(1, ['one', 'two', 'three', 'four', 'five'])
78 call assert_equal(3, search('\%#=1\(e\)\1'))
79 call assert_equal(3, search('\%#=2\(e\)\1'))
80 call assert_fails('call search("\\%#=1\\(e\\1\\)")', 'E65:')
81 call assert_fails('call search("\\%#=2\\(e\\1\\)")', 'E65:')
82 bwipe!
83endfunc
Bram Moolenaar6057ed42019-01-14 23:19:29 +010084
85func Test_multi_failure()
86 set re=1
87 call assert_fails('/a**', 'E61:')
88 call assert_fails('/a*\+', 'E62:')
89 call assert_fails('/a\{a}', 'E554:')
90 set re=2
91 call assert_fails('/a**', 'E871:')
92 call assert_fails('/a*\+', 'E871:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020093 call assert_fails('/a\{a}', 'E554:')
Bram Moolenaar6057ed42019-01-14 23:19:29 +010094 set re=0
95endfunc
Bram Moolenaar5567ad42019-02-12 23:05:46 +010096
Bram Moolenaar72bb10d2022-04-05 14:00:32 +010097func Test_column_success_failure()
98 new
99 call setline(1, 'xbar')
100
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100101 set re=1
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100102 %s/\%>0v./A/
103 call assert_equal('Abar', getline(1))
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100104 call assert_fails('/\%v', 'E71:')
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100105 call assert_fails('/\%>v', 'E71:')
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100106 call assert_fails('/\%c', 'E71:')
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100107 call assert_fails('/\%<c', 'E71:')
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100108 call assert_fails('/\%l', 'E71:')
109 set re=2
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100110 %s/\%>0v./B/
111 call assert_equal('Bbar', getline(1))
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100112 call assert_fails('/\%v', 'E1273:')
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100113 call assert_fails('/\%>v', 'E1273:')
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100114 call assert_fails('/\%c', 'E1273:')
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100115 call assert_fails('/\%<c', 'E1273:')
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100116 call assert_fails('/\%l', 'E1273:')
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100117
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100118 set re=0
Bram Moolenaar72bb10d2022-04-05 14:00:32 +0100119 bwipe!
Bram Moolenaar91ff3d42022-04-04 18:32:32 +0100120endfunc
121
Bram Moolenaar5567ad42019-02-12 23:05:46 +0100122func Test_recursive_addstate()
123 " This will call addstate() recursively until it runs into the limit.
124 let lnum = search('\v((){328}){389}')
125 call assert_equal(0, lnum)
126endfunc
Bram Moolenaar15bbd6e2019-02-13 20:31:50 +0100127
128func Test_out_of_memory()
129 new
130 s/^/,n
131 " This will be slow...
132 call assert_fails('call search("\\v((n||<)+);")', 'E363:')
133endfunc
Bram Moolenaar985079c2019-02-16 17:07:47 +0100134
135func Test_get_equi_class()
136 new
137 " Incomplete equivalence class caused invalid memory access
138 s/^/[[=
139 call assert_equal(1, search(getline(1)))
Bram Moolenaarf1b57ab2019-02-17 13:53:34 +0100140 s/.*/[[.
141 call assert_equal(1, search(getline(1)))
Bram Moolenaar985079c2019-02-16 17:07:47 +0100142endfunc
Bram Moolenaar8bfd9462019-02-16 18:07:57 +0100143
144func Test_rex_init()
145 set noincsearch
146 set re=1
147 new
148 setlocal iskeyword=a-z
149 call setline(1, ['abc', 'ABC'])
150 call assert_equal(1, search('[[:keyword:]]'))
151 new
152 setlocal iskeyword=A-Z
153 call setline(1, ['abc', 'ABC'])
154 call assert_equal(2, search('[[:keyword:]]'))
155 bwipe!
156 bwipe!
157 set re=0
158endfunc
Bram Moolenaara5483442019-02-17 20:17:02 +0100159
160func Test_range_with_newline()
161 new
162 call setline(1, "a")
163 call assert_equal(0, search("[ -*\\n- ]"))
164 call assert_equal(0, search("[ -*\\t-\\n]"))
165 bwipe!
166endfunc
Bram Moolenaar38f08e72019-02-20 22:04:32 +0100167
168func Test_pattern_compile_speed()
Bram Moolenaar5feabe02020-01-30 18:24:53 +0100169 CheckOption spellcapcheck
170 CheckFunction reltimefloat
171
Bram Moolenaar38f08e72019-02-20 22:04:32 +0100172 let start = reltime()
173 " this used to be very slow, not it should be about a second
174 set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
175 call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
176 set spc=
177endfunc
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100178
179" Tests for regexp patterns without multi-byte support.
180func Test_regexp_single_line_pat()
181 " tl is a List of Lists with:
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200182 " regexp engines to test
183 " 0 - test with 'regexpengine' values 0 and 1
184 " 1 - test with 'regexpengine' values 0 and 2
185 " 2 - test with 'regexpengine' values 0, 1 and 2
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100186 " regexp pattern
187 " text to test the pattern on
188 " expected match (optional)
189 " expected submatch 1 (optional)
190 " expected submatch 2 (optional)
191 " etc.
192 " When there is no match use only the first two items.
193 let tl = []
194
195 call add(tl, [2, 'ab', 'aab', 'ab'])
196 call add(tl, [2, 'b', 'abcdef', 'b'])
197 call add(tl, [2, 'bc*', 'abccccdef', 'bcccc'])
198 call add(tl, [2, 'bc\{-}', 'abccccdef', 'b'])
199 call add(tl, [2, 'bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd'])
200 call add(tl, [2, 'bc*', 'abbdef', 'b'])
201 call add(tl, [2, 'c*', 'ccc', 'ccc'])
202 call add(tl, [2, 'bc*', 'abdef', 'b'])
203 call add(tl, [2, 'c*', 'abdef', ''])
204 call add(tl, [2, 'bc\+', 'abccccdef', 'bcccc'])
205 call add(tl, [2, 'bc\+', 'abdef']) " no match
Bram Moolenaar004a6782020-04-11 17:09:31 +0200206 " match escape character in a string
207 call add(tl, [2, '.\e.', "one\<Esc>two", "e\<Esc>t"])
208 " match backspace character in a string
209 call add(tl, [2, '.\b.', "one\<C-H>two", "e\<C-H>t"])
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200210 " match newline character in a string
211 call add(tl, [2, 'o\nb', "foo\nbar", "o\nb"])
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100212
213 " operator \|
214 call add(tl, [2, 'a\|ab', 'cabd', 'a']) " alternation is ordered
215
216 call add(tl, [2, 'c\?', 'ccb', 'c'])
217 call add(tl, [2, 'bc\?', 'abd', 'b'])
218 call add(tl, [2, 'bc\?', 'abccd', 'bc'])
219
220 call add(tl, [2, '\va{1}', 'ab', 'a'])
221
222 call add(tl, [2, '\va{2}', 'aa', 'aa'])
223 call add(tl, [2, '\va{2}', 'caad', 'aa'])
224 call add(tl, [2, '\va{2}', 'aba'])
225 call add(tl, [2, '\va{2}', 'ab'])
226 call add(tl, [2, '\va{2}', 'abaa', 'aa'])
227 call add(tl, [2, '\va{2}', 'aaa', 'aa'])
228
229 call add(tl, [2, '\vb{1}', 'abca', 'b'])
230 call add(tl, [2, '\vba{2}', 'abaa', 'baa'])
231 call add(tl, [2, '\vba{3}', 'aabaac'])
232
233 call add(tl, [2, '\v(ab){1}', 'ab', 'ab', 'ab'])
234 call add(tl, [2, '\v(ab){1}', 'dabc', 'ab', 'ab'])
235 call add(tl, [2, '\v(ab){1}', 'acb'])
236
237 call add(tl, [2, '\v(ab){0,2}', 'acb', "", ""])
238 call add(tl, [2, '\v(ab){0,2}', 'ab', 'ab', 'ab'])
239 call add(tl, [2, '\v(ab){1,2}', 'ab', 'ab', 'ab'])
240 call add(tl, [2, '\v(ab){1,2}', 'ababc', 'abab', 'ab'])
241 call add(tl, [2, '\v(ab){2,4}', 'ababcab', 'abab', 'ab'])
242 call add(tl, [2, '\v(ab){2,4}', 'abcababa', 'abab', 'ab'])
243
244 call add(tl, [2, '\v(ab){2}', 'abab', 'abab', 'ab'])
245 call add(tl, [2, '\v(ab){2}', 'cdababe', 'abab', 'ab'])
246 call add(tl, [2, '\v(ab){2}', 'abac'])
247 call add(tl, [2, '\v(ab){2}', 'abacabab', 'abab', 'ab'])
248 call add(tl, [2, '\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab'])
249 call add(tl, [2, '\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab'])
250
251 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
252 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
253 call add(tl, [2, '\v(a{2}){1}', 'aaac', 'aa', 'aa'])
254 call add(tl, [2, '\v(a{2}){1}', 'daaac', 'aa', 'aa'])
255 call add(tl, [2, '\v(a{1}){2}', 'daaac', 'aa', 'a'])
256 call add(tl, [2, '\v(a{1}){2}', 'aaa', 'aa', 'a'])
257 call add(tl, [2, '\v(a{2})+', 'adaac', 'aa', 'aa'])
258 call add(tl, [2, '\v(a{2})+', 'aa', 'aa', 'aa'])
259 call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
260 call add(tl, [2, '\v(a{1}){2}', 'aa', 'aa', 'a'])
261 call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
262 call add(tl, [2, '\v(a{2}){2}', 'aaaa', 'aaaa', 'aa'])
263 call add(tl, [2, '\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa'])
264
265 call add(tl, [2, '\v(a+){2}', 'dadaac', 'aa', 'a'])
266 call add(tl, [2, '\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa'])
267
268 call add(tl, [2, '\v(a{1,2}){2}', 'daaac', 'aaa', 'a'])
269 call add(tl, [2, '\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a'])
270 call add(tl, [2, '\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa'])
271 call add(tl, [2, '\v(a{1,3}){3}', 'daac'])
272 call add(tl, [2, '\v(a{1,2}){2}', 'dac'])
273 call add(tl, [2, '\v(a+)+', 'daac', 'aa', 'aa'])
274 call add(tl, [2, '\v(a+)+', 'aaa', 'aaa', 'aaa'])
275 call add(tl, [2, '\v(a+){1,2}', 'aaa', 'aaa', 'aaa'])
276 call add(tl, [2, '\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a'])
277 call add(tl, [2, '\v(a{3})+', 'daaaac', 'aaa', 'aaa'])
278 call add(tl, [2, '\v(a|b|c)+', 'aacb', 'aacb', 'b'])
279 call add(tl, [2, '\v(a|b|c){2}', 'abcb', 'ab', 'b'])
280 call add(tl, [2, '\v(abc){2}', 'abcabd', ])
281 call add(tl, [2, '\v(abc){2}', 'abdabcabc','abcabc', 'abc'])
282
283 call add(tl, [2, 'a*', 'cc', ''])
284 call add(tl, [2, '\v(a*)+', 'cc', ''])
285 call add(tl, [2, '\v((ab)+)+', 'ab', 'ab', 'ab', 'ab'])
286 call add(tl, [2, '\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab'])
287 call add(tl, [2, '\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab'])
288 call add(tl, [2, '\v(a{0,2})+', 'cc', ''])
289 call add(tl, [2, '\v(a*)+', '', ''])
290 call add(tl, [2, '\v((a*)+)+', '', ''])
291 call add(tl, [2, '\v((ab)*)+', '', ''])
292 call add(tl, [2, '\va{1,3}', 'aab', 'aa'])
293 call add(tl, [2, '\va{2,3}', 'abaa', 'aa'])
294
295 call add(tl, [2, '\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
296 call add(tl, [2, '\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb'])
297 call add(tl, [2, '\va{2}|b{2}', 'abab'])
298 call add(tl, [2, '\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a'])
299 call add(tl, [2, '\vab{2,3}c', 'aabbccccccccccccc', 'abbc'])
300 call add(tl, [2, '\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc'])
301 call add(tl, [2, '\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde'])
302 call add(tl, [2, '\va(bc){2}d', 'aabcbfbc' ])
303 call add(tl, [2, '\va*a{2}', 'a', ])
304 call add(tl, [2, '\va*a{2}', 'aa', 'aa' ])
305 call add(tl, [2, '\va*a{2}', 'aaa', 'aaa' ])
306 call add(tl, [2, '\va*a{2}', 'bbbabcc', ])
307 call add(tl, [2, '\va*b*|a*c*', 'a', 'a'])
308 call add(tl, [2, '\va{1}b{1}|a{1}b{1}', ''])
309
310 " submatches
311 call add(tl, [2, '\v(a)', 'ab', 'a', 'a'])
312 call add(tl, [2, '\v(a)(b)', 'ab', 'ab', 'a', 'b'])
313 call add(tl, [2, '\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c'])
314 call add(tl, [2, '\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b'])
315 call add(tl, [2, '\v(a)|(b)', 'ab', 'a', 'a'])
316
317 call add(tl, [2, '\v(a*)+', 'aaaa', 'aaaa', ''])
318 call add(tl, [2, 'x', 'abcdef'])
319
320 "
321 " Simple tests
322 "
323
324 " Search single groups
325 call add(tl, [2, 'ab', 'aab', 'ab'])
326 call add(tl, [2, 'ab', 'baced'])
327 call add(tl, [2, 'ab', ' ab ', 'ab'])
328
329 " Search multi-modifiers
330 call add(tl, [2, 'x*', 'xcd', 'x'])
331 call add(tl, [2, 'x*', 'xxxxxxxxxxxxxxxxsofijiojgf', 'xxxxxxxxxxxxxxxx'])
332 " empty match is good
333 call add(tl, [2, 'x*', 'abcdoij', ''])
334 " no match here
335 call add(tl, [2, 'x\+', 'abcdoin'])
336 call add(tl, [2, 'x\+', 'abcdeoijdfxxiuhfij', 'xx'])
337 call add(tl, [2, 'x\+', 'xxxxx', 'xxxxx'])
338 call add(tl, [2, 'x\+', 'abc x siufhiush xxxxxxxxx', 'x'])
339 call add(tl, [2, 'x\=', 'x sdfoij', 'x'])
340 call add(tl, [2, 'x\=', 'abc sfoij', '']) " empty match is good
341 call add(tl, [2, 'x\=', 'xxxxxxxxx c', 'x'])
342 call add(tl, [2, 'x\?', 'x sdfoij', 'x'])
343 " empty match is good
344 call add(tl, [2, 'x\?', 'abc sfoij', ''])
345 call add(tl, [2, 'x\?', 'xxxxxxxxxx c', 'x'])
346
347 call add(tl, [2, 'a\{0,0}', 'abcdfdoij', ''])
348 " same thing as 'a?'
349 call add(tl, [2, 'a\{0,1}', 'asiubid axxxaaa', 'a'])
350 " same thing as 'a\{0,1}'
351 call add(tl, [2, 'a\{1,0}', 'asiubid axxxaaa', 'a'])
352 call add(tl, [2, 'a\{3,6}', 'aa siofuh'])
353 call add(tl, [2, 'a\{3,6}', 'aaaaa asfoij afaa', 'aaaaa'])
354 call add(tl, [2, 'a\{3,6}', 'aaaaaaaa', 'aaaaaa'])
355 call add(tl, [2, 'a\{0}', 'asoiuj', ''])
356 call add(tl, [2, 'a\{2}', 'aaaa', 'aa'])
357 call add(tl, [2, 'a\{2}', 'iuash fiusahfliusah fiushfilushfi uhsaifuh askfj nasfvius afg aaaa sfiuhuhiushf', 'aa'])
358 call add(tl, [2, 'a\{2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
359 " same thing as 'a*'
360 call add(tl, [2, 'a\{0,}', 'oij sdigfusnf', ''])
361 call add(tl, [2, 'a\{0,}', 'aaaaa aa', 'aaaaa'])
362 call add(tl, [2, 'a\{2,}', 'sdfiougjdsafg'])
363 call add(tl, [2, 'a\{2,}', 'aaaaasfoij ', 'aaaaa'])
364 call add(tl, [2, 'a\{5,}', 'xxaaaaxxx '])
365 call add(tl, [2, 'a\{5,}', 'xxaaaaaxxx ', 'aaaaa'])
366 call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
367 call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
368 call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
369 " leading star as normal char when \{} follows
370 call add(tl, [2, '^*\{4,}$', '***'])
371 call add(tl, [2, '^*\{4,}$', '****', '****'])
372 call add(tl, [2, '^*\{4,}$', '*****', '*****'])
373 " same thing as 'a*'
374 call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
375 call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
376
377 call add(tl, [2, 'a\{-0,0}', 'abcdfdoij', ''])
378 " anti-greedy version of 'a?'
379 call add(tl, [2, 'a\{-0,1}', 'asiubid axxxaaa', ''])
380 call add(tl, [2, 'a\{-3,6}', 'aa siofuh'])
381 call add(tl, [2, 'a\{-3,6}', 'aaaaa asfoij afaa', 'aaa'])
382 call add(tl, [2, 'a\{-3,6}', 'aaaaaaaa', 'aaa'])
383 call add(tl, [2, 'a\{-0}', 'asoiuj', ''])
384 call add(tl, [2, 'a\{-2}', 'aaaa', 'aa'])
385 call add(tl, [2, 'a\{-2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
386 call add(tl, [2, 'a\{-0,}', 'oij sdigfusnf', ''])
387 call add(tl, [2, 'a\{-0,}', 'aaaaa aa', ''])
388 call add(tl, [2, 'a\{-2,}', 'sdfiougjdsafg'])
389 call add(tl, [2, 'a\{-2,}', 'aaaaasfoij ', 'aa'])
390 call add(tl, [2, 'a\{-,0}', 'oidfguih iuhi hiu aaaa', ''])
391 call add(tl, [2, 'a\{-,5}', 'abcd', ''])
392 call add(tl, [2, 'a\{-,5}', 'aaaaaaaaaa', ''])
393 " anti-greedy version of 'a*'
394 call add(tl, [2, 'a\{-}', 'bbbcddiuhfcd', ''])
395 call add(tl, [2, 'a\{-}', 'aaaaioudfh coisf jda', ''])
396
397 " Test groups of characters and submatches
398 call add(tl, [2, '\(abc\)*', 'abcabcabc', 'abcabcabc', 'abc'])
399 call add(tl, [2, '\(ab\)\+', 'abababaaaaa', 'ababab', 'ab'])
400 call add(tl, [2, '\(abaaaaa\)*cd', 'cd', 'cd', ''])
401 call add(tl, [2, '\(test1\)\? \(test2\)\?', 'test1 test3', 'test1 ', 'test1', ''])
402 call add(tl, [2, '\(test1\)\= \(test2\) \(test4443\)\=', ' test2 test4443 yupiiiiiiiiiii', ' test2 test4443', '', 'test2', 'test4443'])
403 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'])
404 call add(tl, [2, '\(\(\(yyxxzz\)\)\)', 'abcdddsfiusfyyzzxxyyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz'])
405 call add(tl, [2, '\v((ab)+|c+)+', 'abcccaba', 'abcccab', 'ab', 'ab'])
406 call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
407 call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
408 call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
409 call add(tl, [2, '\p*', 'aá ', 'aá '])
410
411 " Test greedy-ness and lazy-ness
412 call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
413 call add(tl, [2, 'a\{-2,7}x','aaaaaaaaax', 'aaaaaaax'])
414 call add(tl, [2, 'a\{2,7}','aaaaaaaaaaaaaaaaaaaa', 'aaaaaaa'])
415 call add(tl, [2, 'a\{2,7}x','aaaaaaaaax', 'aaaaaaax'])
416 call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
417 call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa',''])
418 call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
419 call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
420 call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
421 call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
422 call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
423 call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
424
425 " Test Character classes
426 call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
427
428 " Test collections and character range []
429 call add(tl, [2, '\v[a]', 'abcd', 'a'])
430 call add(tl, [2, 'a[bcd]', 'abcd', 'ab'])
431 call add(tl, [2, 'a[b-d]', 'acbd', 'ac'])
432 call add(tl, [2, '[a-d][e-f][x-x]d', 'cexdxx', 'cexd'])
433 call add(tl, [2, '\v[[:alpha:]]+', 'abcdefghijklmnopqrstuvwxyz6','abcdefghijklmnopqrstuvwxyz'])
434 call add(tl, [2, '[[:alpha:]\+]', '6x8','x'])
435 call add(tl, [2, '[^abc]\+','abcabcabc'])
436 call add(tl, [2, '[^abc]','defghiasijvoinasoiunbvb','d'])
437 call add(tl, [2, '[^abc]\+','ddddddda','ddddddd'])
438 call add(tl, [2, '[^a-d]\+','aaaAAAZIHFNCddd','AAAZIHFNC'])
439 call add(tl, [2, '[a-f]*','iiiiiiii',''])
440 call add(tl, [2, '[a-f]*','abcdefgh','abcdef'])
441 call add(tl, [2, '[^a-f]\+','abcdefgh','gh'])
442 call add(tl, [2, '[a-c]\{-3,6}','abcabc','abc'])
443 call add(tl, [2, '[^[:alpha:]]\+','abcccadfoij7787ysf287yrnccdu','7787'])
444 call add(tl, [2, '[-a]', '-', '-'])
445 call add(tl, [2, '[a-]', '-', '-'])
446 call add(tl, [2, '[a-f]*\c','ABCDEFGH','ABCDEF'])
447 call add(tl, [2, '[abc][xyz]\c','-af-AF-BY--','BY'])
448 " filename regexp
449 call add(tl, [2, '[-./[:alnum:]_~]\+', 'log13.file', 'log13.file'])
450 " special chars
451 call add(tl, [2, '[\]\^\-\\]\+', '\^\\\-\---^', '\^\\\-\---^'])
452 " collation elem
453 call add(tl, [2, '[[.a.]]\+', 'aa', 'aa'])
454 " middle of regexp
455 call add(tl, [2, 'abc[0-9]*ddd', 'siuhabc ii'])
456 call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
457 call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
458 call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
459 call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
460 call add(tl, [2, '\_f', " \na ", "\n"])
461 call add(tl, [2, '\_f\+', " \na ", "\na"])
462 call add(tl, [2, '[0-9A-Za-z-_.]\+', " @0_a.A-{ ", "0_a.A-"])
463
464 " Test start/end of line, start/end of file
465 call add(tl, [2, '^a.', "a_\nb ", "a_"])
466 call add(tl, [2, '^a.', "b a \na_"])
467 call add(tl, [2, '.a$', " a\n "])
468 call add(tl, [2, '.a$', " a b\n_a", "_a"])
469 call add(tl, [2, '\%^a.', "a a\na", "a "])
470 call add(tl, [2, '\%^a', " a \na "])
471 call add(tl, [2, '.a\%$', " a\n "])
472 call add(tl, [2, '.a\%$', " a\n_a", "_a"])
473
474 " Test recognition of character classes
475 call add(tl, [2, '[0-7]\+', 'x0123456789x', '01234567'])
476 call add(tl, [2, '[^0-7]\+', '0a;X+% 897', 'a;X+% 89'])
477 call add(tl, [2, '[0-9]\+', 'x0123456789x', '0123456789'])
478 call add(tl, [2, '[^0-9]\+', '0a;X+% 9', 'a;X+% '])
479 call add(tl, [2, '[0-9a-fA-F]\+', 'x0189abcdefg', '0189abcdef'])
480 call add(tl, [2, '[^0-9A-Fa-f]\+', '0189g;X+% ab', 'g;X+% '])
481 call add(tl, [2, '[a-z_A-Z0-9]\+', ';+aso_SfOij ', 'aso_SfOij'])
482 call add(tl, [2, '[^a-z_A-Z0-9]\+', 'aSo_;+% sfOij', ';+% '])
483 call add(tl, [2, '[a-z_A-Z]\+', '0abyz_ABYZ;', 'abyz_ABYZ'])
484 call add(tl, [2, '[^a-z_A-Z]\+', 'abAB_09;+% yzYZ', '09;+% '])
485 call add(tl, [2, '[a-z]\+', '0abcxyz1', 'abcxyz'])
486 call add(tl, [2, '[a-z]\+', 'AabxyzZ', 'abxyz'])
487 call add(tl, [2, '[^a-z]\+', 'a;X09+% x', ';X09+% '])
488 call add(tl, [2, '[^a-z]\+', 'abX0;%yz', 'X0;%'])
489 call add(tl, [2, '[a-zA-Z]\+', '0abABxzXZ9', 'abABxzXZ'])
490 call add(tl, [2, '[^a-zA-Z]\+', 'ab09_;+ XZ', '09_;+ '])
491 call add(tl, [2, '[A-Z]\+', 'aABXYZz', 'ABXYZ'])
492 call add(tl, [2, '[^A-Z]\+', 'ABx0;%YZ', 'x0;%'])
493 call add(tl, [2, '[a-z]\+\c', '0abxyzABXYZ;', 'abxyzABXYZ'])
494 call add(tl, [2, '[A-Z]\+\c', '0abABxzXZ9', 'abABxzXZ'])
495 call add(tl, [2, '\c[^a-z]\+', 'ab09_;+ XZ', '09_;+ '])
496 call add(tl, [2, '\c[^A-Z]\+', 'ab09_;+ XZ', '09_;+ '])
497 call add(tl, [2, '\C[^A-Z]\+', 'ABCOIJDEOIFNSD jsfoij sa', ' jsfoij sa'])
498
499 " Tests for \z features
500 " match ends at \ze
501 call add(tl, [2, 'xx \ze test', 'xx '])
502 call add(tl, [2, 'abc\zeend', 'oij abcend', 'abc'])
503 call add(tl, [2, 'aa\zebb\|aaxx', ' aabb ', 'aa'])
504 call add(tl, [2, 'aa\zebb\|aaxx', ' aaxx ', 'aaxx'])
505 call add(tl, [2, 'aabb\|aa\zebb', ' aabb ', 'aabb'])
506 call add(tl, [2, 'aa\zebb\|aaebb', ' aabb ', 'aa'])
507 " match starts at \zs
508 call add(tl, [2, 'abc\zsdd', 'ddabcddxyzt', 'dd'])
509 call add(tl, [2, 'aa \zsax', ' ax'])
510 call add(tl, [2, 'abc \zsmatch\ze abc', 'abc abc abc match abc abc', 'match'])
511 call add(tl, [2, '\v(a \zsif .*){2}', 'a if then a if last', 'if last', 'a if last'])
512 call add(tl, [2, '\>\zs.', 'aword. ', '.'])
513 call add(tl, [2, '\s\+\ze\[/\|\s\zs\s\+', 'is [a t', ' '])
514
515 " Tests for \@= and \& features
516 call add(tl, [2, 'abc\@=', 'abc', 'ab'])
517 call add(tl, [2, 'abc\@=cd', 'abcd', 'abcd'])
518 call add(tl, [2, 'abc\@=', 'ababc', 'ab'])
519 " will never match, no matter the input text
520 call add(tl, [2, 'abcd\@=e', 'abcd'])
521 " will never match
522 call add(tl, [2, 'abcd\@=e', 'any text in here ... '])
523 call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
524 call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
525 call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
526 call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
527 call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
528 call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
529 call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
530 call add(tl, [2, 'foo\(bar\)\@!', 'foobar'])
531 call add(tl, [2, 'foo\(bar\)\@!', 'foo bar', 'foo'])
532 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if then else'])
533 call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if else ', 'if else ', ' '])
534 call add(tl, [2, '\(foo\)\@!bar', 'foobar', 'bar'])
535 call add(tl, [2, '\(foo\)\@!...bar', 'foobar'])
536 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' bar foo '])
537 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
538 call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
539 call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
540 call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
541 call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
542 call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
543
544 " Combining different tests and features
545 call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])
546 call add(tl, [2, '', 'abcd', ''])
547 call add(tl, [2, '\v(())', 'any possible text', ''])
548 call add(tl, [2, '\v%(ab(xyz)c)', ' abxyzc ', 'abxyzc', 'xyz'])
549 call add(tl, [2, '\v(test|)empty', 'tesempty', 'empty', ''])
550 call add(tl, [2, '\v(a|aa)(a|aa)', 'aaa', 'aa', 'a', 'a'])
551
552 " \%u and friends
553 call add(tl, [2, '\%d32', 'yes no', ' '])
554 call add(tl, [2, '\%o40', 'yes no', ' '])
555 call add(tl, [2, '\%x20', 'yes no', ' '])
556 call add(tl, [2, '\%u0020', 'yes no', ' '])
557 call add(tl, [2, '\%U00000020', 'yes no', ' '])
558 call add(tl, [2, '\%d0', "yes\x0ano", "\x0a"])
559
560 "" \%[abc]
561 call add(tl, [2, 'foo\%[bar]', 'fobar'])
562 call add(tl, [2, 'foo\%[bar]', 'foobar', 'foobar'])
563 call add(tl, [2, 'foo\%[bar]', 'fooxx', 'foo'])
564 call add(tl, [2, 'foo\%[bar]', 'foobxx', 'foob'])
565 call add(tl, [2, 'foo\%[bar]', 'foobaxx', 'fooba'])
566 call add(tl, [2, 'foo\%[bar]', 'foobarxx', 'foobar'])
567 call add(tl, [2, 'foo\%[bar]x', 'foobxx', 'foobx'])
568 call add(tl, [2, 'foo\%[bar]x', 'foobarxx', 'foobarx'])
569 call add(tl, [2, '\%[bar]x', 'barxx', 'barx'])
570 call add(tl, [2, '\%[bar]x', 'bxx', 'bx'])
571 call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
572 call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
573 call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
574 call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
575
576 " Alternatives, must use first longest match
577 call add(tl, [2, 'goo\|go', 'google', 'goo'])
578 call add(tl, [2, '\<goo\|\<go', 'google', 'goo'])
579 call add(tl, [2, '\<goo\|go', 'google', 'goo'])
580
581 " Back references
582 call add(tl, [2, '\(\i\+\) \1', ' abc abc', 'abc abc', 'abc'])
583 call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
584 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'])
585 call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', ''])
586 call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a'])
587 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.com', 'foo.bat/foo.com', 'bat'])
588 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.bat'])
589 call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<=$', 'foo.bat/foo.bat', 'foo.bat/foo.bat', 'bat', 'bat'])
590 call add(tl, [2, '\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', '2013-06-27${0}', '${0}', '0'])
591 call add(tl, [2, '^\(a*\)\1$', 'aaaaaaaa', 'aaaaaaaa', 'aaaa'])
592 call add(tl, [2, '^\(a\{-2,}\)\1\+$', 'aaaaaaaaa', 'aaaaaaaaa', 'aaa'])
593
594 " Look-behind with limit
595 call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
596 call add(tl, [2, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
597 call add(tl, [2, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
598 call add(tl, [2, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
599 call add(tl, [2, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
600 call add(tl, [2, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
601 call add(tl, [2, '\(foo\)\@<!bar.', 'xx foobar1 xbar2 xx', 'bar2'])
602
603 " look-behind match in front of a zero-width item
604 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" test header'])
605 call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" Last Changed: 1970', '1970'])
606 call add(tl, [2, '\(foo\)\@<=\>', 'foobar'])
607 call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo'])
608 call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo'])
609
610 " complicated look-behind match
611 call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
612 call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
613
614 "" \@>
615 call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
616 call add(tl, [2, '\(a*\)\@>b', 'aaab', 'aaab', 'aaa'])
617 call add(tl, [2, '^\(.\{-}b\)\@>.', ' abcbd', ' abc', ' ab'])
618 call add(tl, [2, '\(.\{-}\)\(\)\@>$', 'abc', 'abc', 'abc', ''])
619 " TODO: BT engine does not restore submatch after failure
620 call add(tl, [1, '\(a*\)\@>a\|a\+', 'aaaa', 'aaaa'])
621
622 " "\_" prepended negated collection matches EOL
623 call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
624 call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
625
626 " Requiring lots of states.
627 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-"])
628
629 " Skip adding state twice
630 call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO'])
631
632 " Test \%V atom
633 call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt'])
634
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200635 " Test for ignoring case and matching repeated characters
636 call add(tl, [2, '\cb\+', 'aAbBbBcC', 'bBbB'])
637
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100638 " Run the tests
639 for t in tl
640 let re = t[0]
641 let pat = t[1]
642 let text = t[2]
643 let matchidx = 3
644 for engine in [0, 1, 2]
645 if engine == 2 && re == 0 || engine == 1 && re == 1
646 continue
647 endif
648 let &regexpengine = engine
649 try
650 let l = matchlist(text, pat)
651 catch
652 call assert_report('Error ' . engine . ': pat: \"' . pat
653 \ . '\", text: \"' . text . '\", caused an exception: \"'
654 \ . v:exception . '\"')
655 endtry
656 " check the match itself
657 if len(l) == 0 && len(t) > matchidx
658 call assert_report('Error ' . engine . ': pat: \"' . pat
659 \ . '\", text: \"' . text . '\", did not match, expected: \"'
660 \ . t[matchidx] . '\"')
661 elseif len(l) > 0 && len(t) == matchidx
662 call assert_report('Error ' . engine . ': pat: \"' . pat
663 \ . '\", text: \"' . text . '\", match: \"' . l[0]
664 \ . '\", expected no match')
665 elseif len(t) > matchidx && l[0] != t[matchidx]
666 call assert_report('Error ' . engine . ': pat: \"' . pat
667 \ . '\", text: \"' . text . '\", match: \"' . l[0]
668 \ . '\", expected: \"' . t[matchidx] . '\"')
669 else
670 " Test passed
671 endif
672
673 " check all the nine submatches
674 if len(l) > 0
675 for i in range(1, 9)
676 if len(t) <= matchidx + i
677 let e = ''
678 else
679 let e = t[matchidx + i]
680 endif
681 if l[i] != e
682 call assert_report('Error ' . engine . ': pat: \"' . pat
683 \ . '\", text: \"' . text . '\", submatch ' . i . ': \"'
684 \ . l[i] . '\", expected: \"' . e . '\"')
685 endif
686 endfor
687 unlet i
688 endif
689 endfor
690 endfor
691
692 unlet t tl e l
693endfunc
694
695" Tests for multi-line regexp patterns without multi-byte support.
696func Test_regexp_multiline_pat()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200697 " tl is a List of Lists with:
698 " regexp engines to test
699 " 0 - test with 'regexpengine' values 0 and 1
700 " 1 - test with 'regexpengine' values 0 and 2
701 " 2 - test with 'regexpengine' values 0, 1 and 2
702 " regexp pattern
703 " List with text to test the pattern on
704 " List with the expected match
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100705 let tl = []
706
707 " back references
708 call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']])
709 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']])
710
711 " line breaks
712 call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']])
713
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200714 " Any single character or end-of-line
715 call add(tl, [2, '\_.\+', ['a', 'b', 'c'], ['XX']])
716 " Any identifier or end-of-line
717 call add(tl, [2, '\_i\+', ['a', 'b', ';', '2'], ['XX;XX']])
718 " Any identifier but excluding digits or end-of-line
719 call add(tl, [2, '\_I\+', ['a', 'b', ';', '2'], ['XX;XX2XX']])
720 " Any keyword or end-of-line
721 call add(tl, [2, '\_k\+', ['a', 'b', '=', '2'], ['XX=XX']])
722 " Any keyword but excluding digits or end-of-line
723 call add(tl, [2, '\_K\+', ['a', 'b', '=', '2'], ['XX=XX2XX']])
724 " Any filename character or end-of-line
725 call add(tl, [2, '\_f\+', ['a', 'b', '.', '5'], ['XX']])
726 " Any filename character but excluding digits or end-of-line
727 call add(tl, [2, '\_F\+', ['a', 'b', '.', '5'], ['XX5XX']])
728 " Any printable character or end-of-line
729 call add(tl, [2, '\_p\+', ['a', 'b', '=', '4'], ['XX']])
730 " Any printable character excluding digits or end-of-line
731 call add(tl, [2, '\_P\+', ['a', 'b', '=', '4'], ['XX4XX']])
732 " Any whitespace character or end-of-line
733 call add(tl, [2, '\_s\+', [' ', ' ', 'a', 'b'], ['XXaXXbXX']])
734 " Any non-whitespace character or end-of-line
735 call add(tl, [2, '\_S\+', [' ', ' ', 'a', 'b'], [' XX XX']])
736 " Any decimal digit or end-of-line
737 call add(tl, [2, '\_d\+', ['1', 'a', '2', 'b', '3'], ['XXaXXbXX']])
738 " Any non-decimal digit or end-of-line
739 call add(tl, [2, '\_D\+', ['1', 'a', '2', 'b', '3'], ['1XX2XX3XX']])
740 " Any hexadecimal digit or end-of-line
741 call add(tl, [2, '\_x\+', ['1', 'a', 'g', '9', '8'], ['XXgXX']])
742 " Any non-hexadecimal digit or end-of-line
743 call add(tl, [2, '\_X\+', ['1', 'a', 'g', '9', '8'], ['1XXaXX9XX8XX']])
744 " Any octal digit or end-of-line
745 call add(tl, [2, '\_o\+', ['0', '7', '8', '9', '0'], ['XX8XX9XX']])
746 " Any non-octal digit or end-of-line
747 call add(tl, [2, '\_O\+', ['0', '7', '8', '9', '0'], ['0XX7XX0XX']])
748 " Any word character or end-of-line
749 call add(tl, [2, '\_w\+', ['A', 'B', '=', 'C', 'D'], ['XX=XX']])
750 " Any non-word character or end-of-line
751 call add(tl, [2, '\_W\+', ['A', 'B', '=', 'C', 'D'], ['AXXBXXCXXDXX']])
752 " Any head-of-word character or end-of-line
753 call add(tl, [2, '\_h\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
754 " Any non-head-of-word character or end-of-line
755 call add(tl, [2, '\_H\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
756 " Any alphabetic character or end-of-line
757 call add(tl, [2, '\_a\+', ['a', '1', 'b', '2', 'c'], ['XX1XX2XX']])
758 " Any non-alphabetic character or end-of-line
759 call add(tl, [2, '\_A\+', ['a', '1', 'b', '2', 'c'], ['aXXbXXcXX']])
760 " Any lowercase character or end-of-line
761 call add(tl, [2, '\_l\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
762 " Any non-lowercase character or end-of-line
763 call add(tl, [2, '\_L\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
764 " Any uppercase character or end-of-line
765 call add(tl, [2, '\_u\+', ['a', 'A', 'b', 'B'], ['aXXbXX']])
766 " Any non-uppercase character or end-of-line
767 call add(tl, [2, '\_U\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
768 " Collection or end-of-line
769 call add(tl, [2, '\_[a-z]\+', ['a', 'A', 'b', 'B'], ['XXAXXBXX']])
770 " start of line anywhere in the text
771 call add(tl, [2, 'one\zs\_s*\_^\zetwo',
772 \ ['', 'one', ' two', 'one', '', 'two'],
773 \ ['', 'one', ' two', 'oneXXtwo']])
774 " end of line anywhere in the text
775 call add(tl, [2, 'one\zs\_$\_s*two',
776 \ ['', 'one', ' two', 'one', '', 'two'], ['', 'oneXX', 'oneXX']])
777
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100778 " Check that \_[0-9] matching EOL does not break a following \>
779 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', '']])
780
781 " Check a pattern with a line break and ^ and $
782 call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']])
783
784 call add(tl, [2, '\(^.\+\n\)\1', [' dog', ' dog', 'asdf'], ['XXasdf']])
785
786 " Run the multi-line tests
787 for t in tl
788 let re = t[0]
789 let pat = t[1]
790 let before = t[2]
791 let after = t[3]
792 for engine in [0, 1, 2]
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200793 if engine == 2 && re == 0 || engine == 1 && re == 1
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100794 continue
795 endif
796 let &regexpengine = engine
797 new
798 call setline(1, before)
799 exe '%s/' . pat . '/XX/'
800 let result = getline(1, '$')
801 q!
802 if result != after
803 call assert_report('Error: pat: \"' . pat . '\", text: \"'
804 \ . string(before) . '\", expected: \"' . string(after)
805 \ . '\", got: \"' . string(result) . '\"')
806 else
807 " Test passed
808 endif
809 endfor
810 endfor
811 unlet t tl
812endfunc
813
814" Check that using a pattern on two lines doesn't get messed up by using
815" matchstr() with \ze in between.
816func Test_matchstr_with_ze()
817 new
818 call append(0, ['Substitute here:', '<T="">Ta 5</Title>',
819 \ '<T="">Ac 7</Title>'])
820 call cursor(1, 1)
821 set re=0
822
823 .+1,.+2s/""/\='"' . matchstr(getline("."), '\d\+\ze<') . '"'
824 call assert_equal(['Substitute here:', '<T="5">Ta 5</Title>',
825 \ '<T="7">Ac 7</Title>', ''], getline(1, '$'))
826
827 bwipe!
828endfunc
829
Dominique Pelle81b573d2022-03-22 21:14:55 +0000830" Check a pattern with a look behind crossing a line boundary
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100831func Test_lookbehind_across_line()
832 new
833 call append(0, ['Behind:', 'asdfasd<yyy', 'xxstart1', 'asdfasd<yy',
834 \ 'xxxstart2', 'asdfasd<yy', 'xxstart3'])
835 call cursor(1, 1)
836 call search('\(<\_[xy]\+\)\@3<=start')
837 call assert_equal([0, 7, 3, 0], getpos('.'))
838 bwipe!
839endfunc
840
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200841" Test for the \%V atom (match inside the visual area)
842func Regex_Match_Visual_Area()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100843 call append(0, ['Visual:', 'thexe the thexethe', 'andaxand andaxand',
844 \ 'oooxofor foroxooo', 'oooxofor foroxooo'])
845 call cursor(1, 1)
846 exe "normal jfxvfx:s/\\%Ve/E/g\<CR>"
847 exe "normal jV:s/\\%Va/A/g\<CR>"
848 exe "normal jfx\<C-V>fxj:s/\\%Vo/O/g\<CR>"
849 call assert_equal(['Visual:', 'thexE thE thExethe', 'AndAxAnd AndAxAnd',
850 \ 'oooxOfOr fOrOxooo', 'oooxOfOr fOrOxooo', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200851 %d
852endfunc
853
854" Check matching Visual area
855func Test_matching_visual_area()
856 new
857 set regexpengine=1
858 call Regex_Match_Visual_Area()
859 set regexpengine=2
860 call Regex_Match_Visual_Area()
861 set regexpengine&
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100862 bwipe!
863endfunc
864
865" Check matching marks
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200866func Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100867 call append(0, ['', '', '', 'Marks:', 'asdfSasdfsadfEasdf', 'asdfSas',
868 \ 'dfsadfEasdf', '', '', '', '', ''])
869 call cursor(4, 1)
870 exe "normal jfSmsfEme:.-4,.+6s/.\\%>'s.*\\%<'e../here/\<CR>"
871 exe "normal jfSmsj0fEme:.-4,.+6s/.\\%>'s\\_.*\\%<'e../again/\<CR>"
872 call assert_equal(['', '', '', 'Marks:', 'asdfhereasdf', 'asdfagainasdf',
873 \ '', '', '', '', '', ''], getline(1, '$'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200874 %d
875endfunc
876
877func Test_matching_marks()
878 new
879 set regexpengine=1
880 call Regex_Mark()
881 set regexpengine=2
882 call Regex_Mark()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100883 bwipe!
884endfunc
885
886" Check patterns matching cursor position.
887func s:curpos_test()
888 new
889 call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo',
890 \ "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_',
891 \ ' 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'])
892 call setpos('.', [0, 1, 0, 0])
893 s/\%>3c.//g
894 call setpos('.', [0, 2, 4, 0])
895 s/\%#.*$//g
896 call setpos('.', [0, 3, 0, 0])
897 s/\%<3c./_/g
898 %s/\%4l\%>5c./_/g
899 %s/\%6l\%>25v./_/g
900 %s/\%>6l\%3c./!/g
901 %s/\%>7l\%12c./?/g
902 %s/\%>7l\%<9l\%>5v\%<8v./#/g
903 $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
904 call assert_equal(['ffo', 'bob', '__ooooo', 'koooo__', 'moooooo',
905 \ ' f__', 'ab!babababababfoo',
906 \ 'ba!ab##abab?bafoo', '**!*****_',
907 \ ' ! 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'],
908 \ getline(1, '$'))
909 bwipe!
910endfunc
911
912func Test_matching_curpos()
913 set re=0
914 call s:curpos_test()
915 set re=1
916 call s:curpos_test()
917 set re=2
918 call s:curpos_test()
919 set re&
920endfunc
921
922" Test for matching the start and end of a buffer
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200923func Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100924 call setline(1, repeat(['vim edit'], 20))
925 /\%^
926 call assert_equal([0, 1, 1, 0], getpos('.'))
927 exe "normal 50%/\\%^..\<CR>"
928 call assert_equal([0, 1, 1, 0], getpos('.'))
929 exe "normal 50%/\\%$\<CR>"
930 call assert_equal([0, 20, 8, 0], getpos('.'))
931 exe "normal 6gg/..\\%$\<CR>"
932 call assert_equal([0, 20, 7, 0], getpos('.'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200933 %d
934endfunc
935
936func Test_start_end_of_buffer_match()
937 new
938 set regexpengine=1
939 call Regex_start_end_buffer()
940 set regexpengine=2
941 call Regex_start_end_buffer()
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100942 bwipe!
943endfunc
944
Bram Moolenaara7a691c2020-12-09 16:36:04 +0100945func Test_ze_before_zs()
946 call assert_equal('', matchstr(' ', '\%#=1\ze \zs'))
947 call assert_equal('', matchstr(' ', '\%#=2\ze \zs'))
948 call assert_equal(repeat([''], 10), matchlist(' ', '\%#=1\ze \zs'))
949 call assert_equal(repeat([''], 10), matchlist(' ', '\%#=2\ze \zs'))
950endfunc
951
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100952" Check for detecting error
953func Test_regexp_error()
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200954 call assert_fails("call matchlist('x x', '\\%#=1 \\zs*')", 'E888:')
955 call assert_fails("call matchlist('x x', '\\%#=1 \\ze*')", 'E888:')
956 call assert_fails("call matchlist('x x', '\\%#=2 \\zs*')", 'E888:')
957 call assert_fails("call matchlist('x x', '\\%#=2 \\ze*')", 'E888:')
Bram Moolenaar004a6782020-04-11 17:09:31 +0200958 call assert_fails("call matchstr('abcd', '\\%o841\\%o142')", 'E678:')
Bram Moolenaara2b3e7d2021-03-26 17:24:34 +0100959 call assert_fails("call matchstr('abcd', '\\%#=2\\%2147483647c')", 'E951:')
960 call assert_fails("call matchstr('abcd', '\\%#=2\\%2147483647l')", 'E951:')
961 call assert_fails("call matchstr('abcd', '\\%#=2\\%2147483647v')", 'E951:')
962 call assert_fails('exe "normal /\\%#=1\\%[x\\%[x]]\<CR>"', 'E369:')
963 call assert_fails('exe "normal /\\%#=2\\%2147483647l\<CR>"', 'E951:')
964 call assert_fails('exe "normal /\\%#=2\\%2147483647c\<CR>"', 'E951:')
965 call assert_fails('exe "normal /\\%#=2\\%102261126v\<CR>"', 'E951:')
966 call assert_fails('exe "normal /\\%#=2\\%2147483646l\<CR>"', 'E486:')
967 call assert_fails('exe "normal /\\%#=2\\%2147483646c\<CR>"', 'E486:')
968 call assert_fails('exe "normal /\\%#=2\\%102261125v\<CR>"', 'E486:')
Bram Moolenaar004a6782020-04-11 17:09:31 +0200969 call assert_equal('', matchstr('abcd', '\%o181\%o142'))
Bram Moolenaar4d23c522020-04-09 18:42:11 +0200970endfunc
971
972" Test for using the last substitute string pattern (~)
973func Test_regexp_last_subst_string()
974 new
975 s/bar/baz/e
976 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=1\~"), "baz")
977 call assert_equal(matchstr("foo\nbaz\nbar", "\\%#=2\~"), "baz")
978 close!
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +0100979endfunc
980
Bram Moolenaar04db26b2021-07-05 20:15:23 +0200981" Check patterns matching cursor position.
982func s:curpos_test2()
983 new
984 call setline(1, ['1', '2 foobar eins zwei drei vier fünf sechse',
985 \ '3 foobar eins zwei drei vier fünf sechse',
986 \ '4 foobar eins zwei drei vier fünf sechse',
987 \ '5 foobar eins zwei drei vier fünf sechse',
988 \ '6 foobar eins zwei drei vier fünf sechse',
989 \ '7 foobar eins zwei drei vier fünf sechse'])
990 call setpos('.', [0, 2, 10, 0])
991 s/\%.c.*//g
992 call setpos('.', [0, 3, 15, 0])
993 s/\%.l.*//g
994 call setpos('.', [0, 5, 3, 0])
995 s/\%.v.*/_/g
996 call assert_equal(['1',
997 \ '2 foobar ',
998 \ '',
999 \ '4 foobar eins zwei drei vier fünf sechse',
1000 \ '5 _',
1001 \ '6 foobar eins zwei drei vier fünf sechse',
1002 \ '7 foobar eins zwei drei vier fünf sechse'],
1003 \ getline(1, '$'))
1004 call assert_fails('call search("\\%.1l")', 'E1204:')
1005 call assert_fails('call search("\\%.1c")', 'E1204:')
1006 call assert_fails('call search("\\%.1v")', 'E1204:')
1007 bwipe!
1008endfunc
1009
1010" Check patterns matching before or after cursor position.
1011func s:curpos_test3()
1012 new
1013 call setline(1, ['1', '2 foobar eins zwei drei vier fünf sechse',
1014 \ '3 foobar eins zwei drei vier fünf sechse',
1015 \ '4 foobar eins zwei drei vier fünf sechse',
1016 \ '5 foobar eins zwei drei vier fünf sechse',
1017 \ '6 foobar eins zwei drei vier fünf sechse',
1018 \ '7 foobar eins zwei drei vier fünf sechse'])
1019 call setpos('.', [0, 2, 10, 0])
1020 " Note: This removes all columns, except for the column directly in front of
1021 " the cursor. Bug????
1022 :s/^.*\%<.c//
1023 call setpos('.', [0, 3, 10, 0])
1024 :s/\%>.c.*$//
1025 call setpos('.', [0, 5, 4, 0])
1026 " Note: This removes all columns, except for the column directly in front of
1027 " the cursor. Bug????
1028 :s/^.*\%<.v/_/
1029 call setpos('.', [0, 6, 4, 0])
1030 :s/\%>.v.*$/_/
1031 call assert_equal(['1',
1032 \ ' eins zwei drei vier fünf sechse',
1033 \ '3 foobar e',
1034 \ '4 foobar eins zwei drei vier fünf sechse',
1035 \ '_foobar eins zwei drei vier fünf sechse',
1036 \ '6 fo_',
1037 \ '7 foobar eins zwei drei vier fünf sechse'],
1038 \ getline(1, '$'))
1039 sil %d
1040 call setline(1, ['1', '2 foobar eins zwei drei vier fünf sechse',
1041 \ '3 foobar eins zwei drei vier fünf sechse',
1042 \ '4 foobar eins zwei drei vier fünf sechse',
1043 \ '5 foobar eins zwei drei vier fünf sechse',
1044 \ '6 foobar eins zwei drei vier fünf sechse',
1045 \ '7 foobar eins zwei drei vier fünf sechse'])
1046 call setpos('.', [0, 4, 4, 0])
1047 %s/\%<.l.*//
1048 call setpos('.', [0, 5, 4, 0])
1049 %s/\%>.l.*//
1050 call assert_equal(['', '', '',
1051 \ '4 foobar eins zwei drei vier fünf sechse',
1052 \ '5 foobar eins zwei drei vier fünf sechse',
1053 \ '', ''],
1054 \ getline(1, '$'))
1055 bwipe!
1056endfunc
1057
1058" Test that matching below, at or after the
1059" cursor position work
1060func Test_matching_pos()
1061 for val in range(3)
1062 exe "set re=" .. val
1063 " Match at cursor position
1064 call s:curpos_test2()
1065 " Match before or after cursor position
1066 call s:curpos_test3()
1067 endfor
1068 set re&
1069endfunc
1070
Bram Moolenaar64066b92021-11-17 18:22:56 +00001071func Test_using_mark_position()
1072 " this was using freed memory
Bram Moolenaarb55986c2022-03-29 13:24:58 +01001073 " new engine
Bram Moolenaar64066b92021-11-17 18:22:56 +00001074 new
1075 norm O0
1076 call assert_fails("s/\\%')", 'E486:')
1077 bwipe!
Bram Moolenaarb55986c2022-03-29 13:24:58 +01001078
1079 " old engine
1080 new
1081 norm O0
1082 call assert_fails("s/\\%#=1\\%')", 'E486:')
1083 bwipe!
Bram Moolenaar64066b92021-11-17 18:22:56 +00001084endfunc
1085
Bram Moolenaar4c13e5e2021-12-30 14:49:43 +00001086func Test_using_visual_position()
1087 " this was using freed memory
1088 new
1089 exe "norm 0o\<Esc>\<C-V>k\<C-X>o0"
1090 /\%V
1091 bwipe!
1092endfunc
1093
Bram Moolenaar94f31922021-12-30 15:29:18 +00001094func Test_using_invalid_visual_position()
1095 " this was going beyond the end of the line
1096 new
1097 exe "norm 0o000\<Esc>0\<C-V>$s0"
1098 /\%V
1099 bwipe!
1100endfunc
1101
Christian Brabandt360da402022-05-18 15:04:02 +01001102func Test_using_two_engines_pattern()
1103 new
1104 call setline(1, ['foobar=0', 'foobar=1', 'foobar=2'])
1105 " \%#= at the end of the pattern
1106 for i in range(0, 2)
Dominique Pelle3a393792022-07-14 17:40:49 +01001107 for j in range(0, 2)
1108 exe "set re=" .. i
1109 call cursor(j + 1, 7)
1110 call assert_fails("%s/foobar\\%#=" .. j, 'E1281:')
1111 endfor
Christian Brabandt360da402022-05-18 15:04:02 +01001112 endfor
Dominique Pelle3a393792022-07-14 17:40:49 +01001113 set re=0
Christian Brabandt360da402022-05-18 15:04:02 +01001114
1115 " \%#= at the start of the pattern
1116 for i in range(0, 2)
Dominique Pelle3a393792022-07-14 17:40:49 +01001117 call cursor(i + 1, 7)
Christian Brabandt360da402022-05-18 15:04:02 +01001118 exe ":%s/\\%#=" .. i .. "foobar=" .. i .. "/xx"
1119 endfor
1120 call assert_equal(['xx', 'xx', 'xx'], getline(1, '$'))
1121 bwipe!
1122endfunc
1123
Bram Moolenaar32acf1f2022-07-07 22:20:31 +01001124func Test_recursive_substitute_expr()
1125 new
1126 func Repl()
1127 s
1128 endfunc
1129 silent! s/\%')/~\=Repl()
1130
1131 bwipe!
1132 delfunc Repl
1133endfunc
1134
Bram Moolenaar13ed4942022-08-19 13:59:25 +01001135def Test_compare_columns()
1136 # this was using a line below the last line
1137 enew
1138 setline(1, ['', ''])
1139 prop_type_add('name', {highlight: 'ErrorMsg'})
1140 prop_add(1, 1, {length: 1, type: 'name'})
1141 search('\%#=1\%>.l\n.*\%<2v', 'nW')
1142 search('\%#=2\%>.l\n.*\%<2v', 'nW')
1143 bwipe!
1144 prop_type_delete('name')
1145enddef
1146
Bram Moolenaar75a115e2022-09-07 18:21:24 +01001147def Test_compare_column_matchstr()
Bram Moolenaar753aead2022-09-08 12:17:06 +01001148 # do some search in text to set the line number, it should be ignored in
1149 # matchstr().
Bram Moolenaar75a115e2022-09-07 18:21:24 +01001150 enew
Bram Moolenaar753aead2022-09-08 12:17:06 +01001151 setline(1, ['one', 'two', 'three'])
1152 :3
1153 :/ee
1154 bwipe!
Bram Moolenaar75a115e2022-09-07 18:21:24 +01001155 set re=1
1156 call assert_equal('aaa', matchstr('aaaaaaaaaaaaaaaaaaaa', '.*\%<5v'))
1157 set re=2
1158 call assert_equal('aaa', matchstr('aaaaaaaaaaaaaaaaaaaa', '.*\%<5v'))
1159 set re=0
1160enddef
1161
1162
Bram Moolenaarf9cb05c2019-12-15 13:39:22 +01001163" vim: shiftwidth=2 sts=2 expandtab