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