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