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