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