blob: 360418c503263093581d16e172079343e1812f49 [file] [log] [blame]
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +02001Test for regexp patterns without multi-byte support.
2See test95 for multi-byte tests.
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +00003
4A pattern that gives the expected result produces OK, so that we know it was
5actually tried.
6
7STARTTEST
8:so small.vim
9:" tl is a List of Lists with:
Bram Moolenaaref795d12015-01-18 16:46:32 +010010:" regexp engine
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +000011:" regexp pattern
12:" text to test the pattern on
13:" expected match (optional)
14:" expected submatch 1 (optional)
15:" expected submatch 2 (optional)
16:" etc.
17:" When there is no match use only the first two items.
18:let tl = []
Bram Moolenaar57a285b2013-05-26 16:57:28 +020019:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +020020:""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
21:"""" Previously written tests """"""""""""""""""""""""""""""""
22:""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Bram Moolenaar57a285b2013-05-26 16:57:28 +020023:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020024:call add(tl, [2, 'ab', 'aab', 'ab'])
25:call add(tl, [2, 'b', 'abcdef', 'b'])
26:call add(tl, [2, 'bc*', 'abccccdef', 'bcccc'])
Bram Moolenaar36b3a012013-06-01 12:40:20 +020027:call add(tl, [2, 'bc\{-}', 'abccccdef', 'b'])
28:call add(tl, [2, 'bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020029:call add(tl, [2, 'bc*', 'abbdef', 'b'])
30:call add(tl, [2, 'c*', 'ccc', 'ccc'])
31:call add(tl, [2, 'bc*', 'abdef', 'b'])
32:call add(tl, [2, 'c*', 'abdef', ''])
33:call add(tl, [2, 'bc\+', 'abccccdef', 'bcccc'])
34:call add(tl, [2, 'bc\+', 'abdef']) "no match
Bram Moolenaar3d660142008-01-01 16:37:52 +000035:"
36:"operator \|
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020037:call add(tl, [2, 'a\|ab', 'cabd', 'a']) "alternation is ordered
Bram Moolenaar3d660142008-01-01 16:37:52 +000038:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020039:call add(tl, [2, 'c\?', 'ccb', 'c'])
40:call add(tl, [2, 'bc\?', 'abd', 'b'])
41:call add(tl, [2, 'bc\?', 'abccd', 'bc'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000042:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020043:call add(tl, [2, '\va{1}', 'ab', 'a'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000044:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020045:call add(tl, [2, '\va{2}', 'aa', 'aa'])
46:call add(tl, [2, '\va{2}', 'caad', 'aa'])
47:call add(tl, [2, '\va{2}', 'aba'])
48:call add(tl, [2, '\va{2}', 'ab'])
49:call add(tl, [2, '\va{2}', 'abaa', 'aa'])
50:call add(tl, [2, '\va{2}', 'aaa', 'aa'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000051:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020052:call add(tl, [2, '\vb{1}', 'abca', 'b'])
53:call add(tl, [2, '\vba{2}', 'abaa', 'baa'])
54:call add(tl, [2, '\vba{3}', 'aabaac'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000055:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020056:call add(tl, [2, '\v(ab){1}', 'ab', 'ab', 'ab'])
57:call add(tl, [2, '\v(ab){1}', 'dabc', 'ab', 'ab'])
58:call add(tl, [2, '\v(ab){1}', 'acb'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000059:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020060:call add(tl, [2, '\v(ab){0,2}', 'acb', "", ""])
61:call add(tl, [2, '\v(ab){0,2}', 'ab', 'ab', 'ab'])
62:call add(tl, [2, '\v(ab){1,2}', 'ab', 'ab', 'ab'])
63:call add(tl, [2, '\v(ab){1,2}', 'ababc', 'abab', 'ab'])
64:call add(tl, [2, '\v(ab){2,4}', 'ababcab', 'abab', 'ab'])
65:call add(tl, [2, '\v(ab){2,4}', 'abcababa', 'abab', 'ab'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000066:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020067:call add(tl, [2, '\v(ab){2}', 'abab', 'abab', 'ab'])
68:call add(tl, [2, '\v(ab){2}', 'cdababe', 'abab', 'ab'])
69:call add(tl, [2, '\v(ab){2}', 'abac'])
70:call add(tl, [2, '\v(ab){2}', 'abacabab', 'abab', 'ab'])
71:call add(tl, [2, '\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab'])
72:call add(tl, [2, '\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000073:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020074:call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
75:call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
76:call add(tl, [2, '\v(a{2}){1}', 'aaac', 'aa', 'aa'])
77:call add(tl, [2, '\v(a{2}){1}', 'daaac', 'aa', 'aa'])
78:call add(tl, [2, '\v(a{1}){2}', 'daaac', 'aa', 'a'])
79:call add(tl, [2, '\v(a{1}){2}', 'aaa', 'aa', 'a'])
80:call add(tl, [2, '\v(a{2})+', 'adaac', 'aa', 'aa'])
81:call add(tl, [2, '\v(a{2})+', 'aa', 'aa', 'aa'])
82:call add(tl, [2, '\v(a{2}){1}', 'aa', 'aa', 'aa'])
83:call add(tl, [2, '\v(a{1}){2}', 'aa', 'aa', 'a'])
84:call add(tl, [2, '\v(a{1}){1}', 'a', 'a', 'a'])
85:call add(tl, [2, '\v(a{2}){2}', 'aaaa', 'aaaa', 'aa'])
86:call add(tl, [2, '\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000087:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020088:call add(tl, [2, '\v(a+){2}', 'dadaac', 'aa', 'a'])
89:call add(tl, [2, '\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa'])
Bram Moolenaar3d660142008-01-01 16:37:52 +000090:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +020091:call add(tl, [2, '\v(a{1,2}){2}', 'daaac', 'aaa', 'a'])
92:call add(tl, [2, '\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a'])
93:call add(tl, [2, '\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa'])
94:call add(tl, [2, '\v(a{1,3}){3}', 'daac'])
95:call add(tl, [2, '\v(a{1,2}){2}', 'dac'])
96:call add(tl, [2, '\v(a+)+', 'daac', 'aa', 'aa'])
97:call add(tl, [2, '\v(a+)+', 'aaa', 'aaa', 'aaa'])
98:call add(tl, [2, '\v(a+){1,2}', 'aaa', 'aaa', 'aaa'])
99:call add(tl, [2, '\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a'])
100:call add(tl, [2, '\v(a{3})+', 'daaaac', 'aaa', 'aaa'])
101:call add(tl, [2, '\v(a|b|c)+', 'aacb', 'aacb', 'b'])
102:call add(tl, [2, '\v(a|b|c){2}', 'abcb', 'ab', 'b'])
103:call add(tl, [2, '\v(abc){2}', 'abcabd', ])
104:call add(tl, [2, '\v(abc){2}', 'abdabcabc','abcabc', 'abc'])
Bram Moolenaar3d660142008-01-01 16:37:52 +0000105:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200106:call add(tl, [2, 'a*', 'cc', ''])
107:call add(tl, [2, '\v(a*)+', 'cc', ''])
108:call add(tl, [2, '\v((ab)+)+', 'ab', 'ab', 'ab', 'ab'])
109:call add(tl, [2, '\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab'])
110:call add(tl, [2, '\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab'])
111:call add(tl, [2, '\v(a{0,2})+', 'cc', ''])
112:call add(tl, [2, '\v(a*)+', '', ''])
113:call add(tl, [2, '\v((a*)+)+', '', ''])
114:call add(tl, [2, '\v((ab)*)+', '', ''])
115:call add(tl, [2, '\va{1,3}', 'aab', 'aa'])
116:call add(tl, [2, '\va{2,3}', 'abaa', 'aa'])
Bram Moolenaar3d660142008-01-01 16:37:52 +0000117:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200118:call add(tl, [2, '\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
119:call add(tl, [2, '\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb'])
120:call add(tl, [2, '\va{2}|b{2}', 'abab'])
121:call add(tl, [2, '\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a'])
122:call add(tl, [2, '\vab{2,3}c', 'aabbccccccccccccc', 'abbc'])
123:call add(tl, [2, '\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc'])
124:call add(tl, [2, '\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde'])
125:call add(tl, [2, '\va(bc){2}d', 'aabcbfbc' ])
126:call add(tl, [2, '\va*a{2}', 'a', ])
127:call add(tl, [2, '\va*a{2}', 'aa', 'aa' ])
128:call add(tl, [2, '\va*a{2}', 'aaa', 'aaa' ])
129:call add(tl, [2, '\va*a{2}', 'bbbabcc', ])
130:call add(tl, [2, '\va*b*|a*c*', 'a', 'a'])
131:call add(tl, [2, '\va{1}b{1}|a{1}b{1}', ''])
Bram Moolenaar3d660142008-01-01 16:37:52 +0000132:"
133:"submatches
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200134:call add(tl, [2, '\v(a)', 'ab', 'a', 'a'])
135:call add(tl, [2, '\v(a)(b)', 'ab', 'ab', 'a', 'b'])
136:call add(tl, [2, '\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c'])
137:call add(tl, [2, '\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b'])
138:call add(tl, [2, '\v(a)|(b)', 'ab', 'a', 'a'])
Bram Moolenaar3d660142008-01-01 16:37:52 +0000139:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200140:call add(tl, [2, '\v(a*)+', 'aaaa', 'aaaa', ''])
141:call add(tl, [2, 'x', 'abcdef'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200142:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200143:""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
144:""""" Simple tests """""""""""""""""""""""""""""""""""""""""""
145:""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200146:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200147:" Search single groups
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200148:call add(tl, [2, 'ab', 'aab', 'ab'])
149:call add(tl, [2, 'ab', 'baced'])
150:call add(tl, [2, 'ab', ' ab ', 'ab'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200151:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200152:" Search multi-modifiers
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200153:call add(tl, [2, 'x*', 'xcd', 'x'])
154:call add(tl, [2, 'x*', 'xxxxxxxxxxxxxxxxsofijiojgf', 'xxxxxxxxxxxxxxxx'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200155:" empty match is good
156:call add(tl, [2, 'x*', 'abcdoij', ''])
157:" no match here
158:call add(tl, [2, 'x\+', 'abcdoin'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200159:call add(tl, [2, 'x\+', 'abcdeoijdfxxiuhfij', 'xx'])
160:call add(tl, [2, 'x\+', 'xxxxx', 'xxxxx'])
161:call add(tl, [2, 'x\+', 'abc x siufhiush xxxxxxxxx', 'x'])
162:call add(tl, [2, 'x\=', 'x sdfoij', 'x'])
163:call add(tl, [2, 'x\=', 'abc sfoij', '']) " empty match is good
164:call add(tl, [2, 'x\=', 'xxxxxxxxx c', 'x'])
165:call add(tl, [2, 'x\?', 'x sdfoij', 'x'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200166:" empty match is good
167:call add(tl, [2, 'x\?', 'abc sfoij', ''])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200168:call add(tl, [2, 'x\?', 'xxxxxxxxxx c', 'x'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200169:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200170:call add(tl, [2, 'a\{0,0}', 'abcdfdoij', ''])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200171:" same thing as 'a?'
172:call add(tl, [2, 'a\{0,1}', 'asiubid axxxaaa', 'a'])
173:" same thing as 'a\{0,1}'
174:call add(tl, [2, 'a\{1,0}', 'asiubid axxxaaa', 'a'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200175:call add(tl, [2, 'a\{3,6}', 'aa siofuh'])
176:call add(tl, [2, 'a\{3,6}', 'aaaaa asfoij afaa', 'aaaaa'])
177:call add(tl, [2, 'a\{3,6}', 'aaaaaaaa', 'aaaaaa'])
178:call add(tl, [2, 'a\{0}', 'asoiuj', ''])
179:call add(tl, [2, 'a\{2}', 'aaaa', 'aa'])
180:call add(tl, [2, 'a\{2}', 'iuash fiusahfliusah fiushfilushfi uhsaifuh askfj nasfvius afg aaaa sfiuhuhiushf', 'aa'])
181:call add(tl, [2, 'a\{2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200182:" same thing as 'a*'
183:call add(tl, [2, 'a\{0,}', 'oij sdigfusnf', ''])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200184:call add(tl, [2, 'a\{0,}', 'aaaaa aa', 'aaaaa'])
185:call add(tl, [2, 'a\{2,}', 'sdfiougjdsafg'])
Bram Moolenaar54dafde2013-05-31 23:18:00 +0200186:call add(tl, [2, 'a\{2,}', 'aaaaasfoij ', 'aaaaa'])
187:call add(tl, [2, 'a\{5,}', 'xxaaaaxxx '])
188:call add(tl, [2, 'a\{5,}', 'xxaaaaaxxx ', 'aaaaa'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200189:call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
190:call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
191:call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
Bram Moolenaar3737fc12013-06-01 14:42:56 +0200192:" leading star as normal char when \{} follows
193:call add(tl, [2, '^*\{4,}$', '***'])
194:call add(tl, [2, '^*\{4,}$', '****', '****'])
195:call add(tl, [2, '^*\{4,}$', '*****', '*****'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200196:" same thing as 'a*'
197:call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200198:call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200199:"
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200200:call add(tl, [2, 'a\{-0,0}', 'abcdfdoij', ''])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200201:" anti-greedy version of 'a?'
202:call add(tl, [2, 'a\{-0,1}', 'asiubid axxxaaa', ''])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200203:call add(tl, [2, 'a\{-3,6}', 'aa siofuh'])
204:call add(tl, [2, 'a\{-3,6}', 'aaaaa asfoij afaa', 'aaa'])
205:call add(tl, [2, 'a\{-3,6}', 'aaaaaaaa', 'aaa'])
206:call add(tl, [2, 'a\{-0}', 'asoiuj', ''])
207:call add(tl, [2, 'a\{-2}', 'aaaa', 'aa'])
208:call add(tl, [2, 'a\{-2}', 'abcdefghijklmnopqrestuvwxyz1234567890'])
Bram Moolenaar36b3a012013-06-01 12:40:20 +0200209:call add(tl, [2, 'a\{-0,}', 'oij sdigfusnf', ''])
210:call add(tl, [2, 'a\{-0,}', 'aaaaa aa', ''])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200211:call add(tl, [2, 'a\{-2,}', 'sdfiougjdsafg'])
Bram Moolenaar36b3a012013-06-01 12:40:20 +0200212:call add(tl, [2, 'a\{-2,}', 'aaaaasfoij ', 'aa'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200213:call add(tl, [2, 'a\{-,0}', 'oidfguih iuhi hiu aaaa', ''])
214:call add(tl, [2, 'a\{-,5}', 'abcd', ''])
215:call add(tl, [2, 'a\{-,5}', 'aaaaaaaaaa', ''])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200216:" anti-greedy version of 'a*'
Bram Moolenaar36b3a012013-06-01 12:40:20 +0200217:call add(tl, [2, 'a\{-}', 'bbbcddiuhfcd', ''])
218:call add(tl, [2, 'a\{-}', 'aaaaioudfh coisf jda', ''])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200219:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200220:" Test groups of characters and submatches
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200221:call add(tl, [2, '\(abc\)*', 'abcabcabc', 'abcabcabc', 'abc'])
222:call add(tl, [2, '\(ab\)\+', 'abababaaaaa', 'ababab', 'ab'])
223:call add(tl, [2, '\(abaaaaa\)*cd', 'cd', 'cd', ''])
224:call add(tl, [2, '\(test1\)\? \(test2\)\?', 'test1 test3', 'test1 ', 'test1', ''])
225:call add(tl, [2, '\(test1\)\= \(test2\) \(test4443\)\=', ' test2 test4443 yupiiiiiiiiiii', ' test2 test4443', '', 'test2', 'test4443'])
226: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'])
227:call add(tl, [2, '\(\(\(yyxxzz\)\)\)', 'abcdddsfiusfyyzzxxyyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz', 'yyxxzz'])
228:call add(tl, [2, '\v((ab)+|c+)+', 'abcccaba', 'abcccab', 'ab', 'ab'])
229:call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
230:call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
231:call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
Bram Moolenaarac7c33e2013-07-21 17:06:00 +0200232:call add(tl, [2, '\p*', 'aá ', 'aá '])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200233:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200234:" Test greedy-ness and lazy-ness
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200235:call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
Bram Moolenaar54dafde2013-05-31 23:18:00 +0200236:call add(tl, [2, 'a\{-2,7}x','aaaaaaaaax', 'aaaaaaax'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200237:call add(tl, [2, 'a\{2,7}','aaaaaaaaaaaaaaaaaaaa', 'aaaaaaa'])
Bram Moolenaar54dafde2013-05-31 23:18:00 +0200238:call add(tl, [2, 'a\{2,7}x','aaaaaaaaax', 'aaaaaaax'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200239:call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
240:call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa',''])
241:call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
Bram Moolenaar9c235062014-05-13 16:44:29 +0200242:call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
243:call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
244:call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
245:call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
246:call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200247:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200248:" Test Character classes
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200249:call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200250:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200251:" Test collections and character range []
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200252:call add(tl, [2, '\v[a]', 'abcd', 'a'])
253:call add(tl, [2, 'a[bcd]', 'abcd', 'ab'])
254:call add(tl, [2, 'a[b-d]', 'acbd', 'ac'])
255:call add(tl, [2, '[a-d][e-f][x-x]d', 'cexdxx', 'cexd'])
256:call add(tl, [2, '\v[[:alpha:]]+', 'abcdefghijklmnopqrstuvwxyz6','abcdefghijklmnopqrstuvwxyz'])
257:call add(tl, [2, '[[:alpha:]\+]', '6x8','x'])
258:call add(tl, [2, '[^abc]\+','abcabcabc'])
259:call add(tl, [2, '[^abc]','defghiasijvoinasoiunbvb','d'])
260:call add(tl, [2, '[^abc]\+','ddddddda','ddddddd'])
261:call add(tl, [2, '[^a-d]\+','aaaAAAZIHFNCddd','AAAZIHFNC'])
262:call add(tl, [2, '[a-f]*','iiiiiiii',''])
263:call add(tl, [2, '[a-f]*','abcdefgh','abcdef'])
264:call add(tl, [2, '[^a-f]\+','abcdefgh','gh'])
265:call add(tl, [2, '[a-c]\{-3,6}','abcabc','abc'])
266:call add(tl, [2, '[^[:alpha:]]\+','abcccadfoij7787ysf287yrnccdu','7787'])
267:call add(tl, [2, '[-a]', '-', '-'])
268:call add(tl, [2, '[a-]', '-', '-'])
Bram Moolenaar473de612013-06-08 18:19:48 +0200269:call add(tl, [2, '[a-f]*\c','ABCDEFGH','ABCDEF'])
270:call add(tl, [2, '[abc][xyz]\c','-af-AF-BY--','BY'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200271:" filename regexp
272:call add(tl, [2, '[-./[:alnum:]_~]\+', 'log13.file', 'log13.file'])
273:" special chars
274:call add(tl, [2, '[\]\^\-\\]\+', '\^\\\-\---^', '\^\\\-\---^'])
275:" collation elem
276:call add(tl, [2, '[[.a.]]\+', 'aa', 'aa'])
277:" middle of regexp
278:call add(tl, [2, 'abc[0-9]*ddd', 'siuhabc ii'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200279:call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
280:call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
281:call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
Bram Moolenaar61db8b52013-05-26 17:45:49 +0200282:call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
283:call add(tl, [2, '\_f', " \na ", "\n"])
284:call add(tl, [2, '\_f\+', " \na ", "\na"])
Bram Moolenaar75d7a062013-06-01 13:24:24 +0200285:call add(tl, [2, '[0-9A-Za-z-_.]\+', " @0_a.A-{ ", "0_a.A-"])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200286:"
Bram Moolenaar4b780632013-05-31 22:14:52 +0200287:"""" Test start/end of line, start/end of file
288:call add(tl, [2, '^a.', "a_\nb ", "a_"])
289:call add(tl, [2, '^a.', "b a \na_"])
290:call add(tl, [2, '.a$', " a\n "])
291:call add(tl, [2, '.a$', " a b\n_a", "_a"])
292:call add(tl, [2, '\%^a.', "a a\na", "a "])
293:call add(tl, [2, '\%^a', " a \na "])
294:call add(tl, [2, '.a\%$', " a\n "])
295:call add(tl, [2, '.a\%$', " a\n_a", "_a"])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200296:"
Bram Moolenaar1cfad522013-08-14 12:06:49 +0200297:"""" Test recognition of character classes
298:call add(tl, [2, '[0-7]\+', 'x0123456789x', '01234567'])
299:call add(tl, [2, '[^0-7]\+', '0a;X+% 897', 'a;X+% 89'])
300:call add(tl, [2, '[0-9]\+', 'x0123456789x', '0123456789'])
301:call add(tl, [2, '[^0-9]\+', '0a;X+% 9', 'a;X+% '])
302:call add(tl, [2, '[0-9a-fA-F]\+', 'x0189abcdefg', '0189abcdef'])
303:call add(tl, [2, '[^0-9A-Fa-f]\+', '0189g;X+% ab', 'g;X+% '])
304:call add(tl, [2, '[a-z_A-Z0-9]\+', ';+aso_SfOij ', 'aso_SfOij'])
305:call add(tl, [2, '[^a-z_A-Z0-9]\+', 'aSo_;+% sfOij', ';+% '])
306:call add(tl, [2, '[a-z_A-Z]\+', '0abyz_ABYZ;', 'abyz_ABYZ'])
307:call add(tl, [2, '[^a-z_A-Z]\+', 'abAB_09;+% yzYZ', '09;+% '])
308:call add(tl, [2, '[a-z]\+', '0abcxyz1', 'abcxyz'])
309:call add(tl, [2, '[a-z]\+', 'AabxyzZ', 'abxyz'])
310:call add(tl, [2, '[^a-z]\+', 'a;X09+% x', ';X09+% '])
311:call add(tl, [2, '[^a-z]\+', 'abX0;%yz', 'X0;%'])
312:call add(tl, [2, '[a-zA-Z]\+', '0abABxzXZ9', 'abABxzXZ'])
313:call add(tl, [2, '[^a-zA-Z]\+', 'ab09_;+ XZ', '09_;+ '])
314:call add(tl, [2, '[A-Z]\+', 'aABXYZz', 'ABXYZ'])
315:call add(tl, [2, '[^A-Z]\+', 'ABx0;%YZ', 'x0;%'])
316:call add(tl, [2, '[a-z]\+\c', '0abxyzABXYZ;', 'abxyzABXYZ'])
317:call add(tl, [2, '[A-Z]\+\c', '0abABxzXZ9', 'abABxzXZ'])
318:call add(tl, [2, '\c[^a-z]\+', 'ab09_;+ XZ', '09_;+ '])
319:call add(tl, [2, '\c[^A-Z]\+', 'ab09_;+ XZ', '09_;+ '])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200320:call add(tl, [2, '\C[^A-Z]\+', 'ABCOIJDEOIFNSD jsfoij sa', ' jsfoij sa'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200321:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200322:"""" Tests for \z features
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200323:" match ends at \ze
324:call add(tl, [2, 'xx \ze test', 'xx '])
325:call add(tl, [2, 'abc\zeend', 'oij abcend', 'abc'])
326:call add(tl, [2, 'aa\zebb\|aaxx', ' aabb ', 'aa'])
327:call add(tl, [2, 'aa\zebb\|aaxx', ' aaxx ', 'aaxx'])
328:call add(tl, [2, 'aabb\|aa\zebb', ' aabb ', 'aabb'])
329:call add(tl, [2, 'aa\zebb\|aaebb', ' aabb ', 'aa'])
330:" match starts at \zs
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200331:call add(tl, [2, 'abc\zsdd', 'ddabcddxyzt', 'dd'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200332:call add(tl, [2, 'aa \zsax', ' ax'])
333:call add(tl, [2, 'abc \zsmatch\ze abc', 'abc abc abc match abc abc', 'match'])
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200334:call add(tl, [2, '\v(a \zsif .*){2}', 'a if then a if last', 'if last', 'a if last'])
335:call add(tl, [2, '\>\zs.', 'aword. ', '.'])
Bram Moolenaar9be44812013-09-05 21:15:44 +0200336:call add(tl, [2, '\s\+\ze\[/\|\s\zs\s\+', 'is [a t', ' '])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200337:"
Bram Moolenaar2d5e1122013-05-30 21:42:13 +0200338:"""" Tests for \@= and \& features
339:call add(tl, [2, 'abc\@=', 'abc', 'ab'])
340:call add(tl, [2, 'abc\@=cd', 'abcd', 'abcd'])
341:call add(tl, [2, 'abc\@=', 'ababc', 'ab'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200342:" will never match, no matter the input text
343:call add(tl, [2, 'abcd\@=e', 'abcd'])
344:" will never match
345:call add(tl, [2, 'abcd\@=e', 'any text in here ... '])
Bram Moolenaar2d5e1122013-05-30 21:42:13 +0200346:call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200347:call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
Bram Moolenaar2d5e1122013-05-30 21:42:13 +0200348:call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
Bram Moolenaar14f55c62013-05-31 21:45:09 +0200349:call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
Bram Moolenaare0fea9c2013-05-27 20:10:50 +0200350:call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
Bram Moolenaar2d5e1122013-05-30 21:42:13 +0200351:call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
352:call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
Bram Moolenaarb06e20e2013-05-30 22:44:02 +0200353:call add(tl, [2, 'foo\(bar\)\@!', 'foobar'])
354:call add(tl, [2, 'foo\(bar\)\@!', 'foo bar', 'foo'])
355:call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if then else'])
356:call add(tl, [2, 'if \(\(then\)\@!.\)*$', ' if else ', 'if else ', ' '])
357:call add(tl, [2, '\(foo\)\@!bar', 'foobar', 'bar'])
358:call add(tl, [2, '\(foo\)\@!...bar', 'foobar'])
359:call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' bar foo '])
360:call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo bar '])
361:call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
Bram Moolenaara0169122013-06-26 18:16:58 +0200362:call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
Bram Moolenaar398d53d2013-08-01 15:45:52 +0200363:call add(tl, [2, '[ ]\@!\p\([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:', 's'])
Bram Moolenaare53c8612013-07-17 22:35:39 +0200364:call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
Bram Moolenaar196ed142013-07-21 18:59:24 +0200365:call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200366:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200367:"""" Combining different tests and features
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200368:call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])
369:call add(tl, [2, '', 'abcd', ''])
370:call add(tl, [2, '\v(())', 'any possible text', ''])
371:call add(tl, [2, '\v%(ab(xyz)c)', ' abxyzc ', 'abxyzc', 'xyz'])
372:call add(tl, [2, '\v(test|)empty', 'tesempty', 'empty', ''])
373:call add(tl, [2, '\v(a|aa)(a|aa)', 'aaa', 'aa', 'a', 'a'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200374:"
Bram Moolenaard2470e92013-05-21 13:30:21 +0200375:"""" \%u and friends
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200376:call add(tl, [2, '\%d32', 'yes no', ' '])
377:call add(tl, [2, '\%o40', 'yes no', ' '])
378:call add(tl, [2, '\%x20', 'yes no', ' '])
379:call add(tl, [2, '\%u0020', 'yes no', ' '])
380:call add(tl, [2, '\%U00000020', 'yes no', ' '])
Bram Moolenaar595cad22013-09-22 13:57:24 +0200381:call add(tl, [2, '\%d0', "yes\x0ano", "\x0a"])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200382:"
Bram Moolenaard75799ab72013-06-05 11:05:17 +0200383:""""" \%[abc]
384:call add(tl, [2, 'foo\%[bar]', 'fobar'])
385:call add(tl, [2, 'foo\%[bar]', 'foobar', 'foobar'])
386:call add(tl, [2, 'foo\%[bar]', 'fooxx', 'foo'])
387:call add(tl, [2, 'foo\%[bar]', 'foobxx', 'foob'])
388:call add(tl, [2, 'foo\%[bar]', 'foobaxx', 'fooba'])
389:call add(tl, [2, 'foo\%[bar]', 'foobarxx', 'foobar'])
390:call add(tl, [2, 'foo\%[bar]x', 'foobxx', 'foobx'])
391:call add(tl, [2, 'foo\%[bar]x', 'foobarxx', 'foobarx'])
392:call add(tl, [2, '\%[bar]x', 'barxx', 'barx'])
393:call add(tl, [2, '\%[bar]x', 'bxx', 'bx'])
394:call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
Bram Moolenaard7986252013-06-17 21:33:41 +0200395:call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
Bram Moolenaara0c85c72013-06-17 22:04:38 +0200396:call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
Bram Moolenaareec3e1e2013-08-01 18:38:26 +0200397:call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
Bram Moolenaard75799ab72013-06-05 11:05:17 +0200398:"
Bram Moolenaar4b417062013-05-25 20:19:50 +0200399:"""" Alternatives, must use first longest match
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200400:call add(tl, [2, 'goo\|go', 'google', 'goo'])
401:call add(tl, [2, '\<goo\|\<go', 'google', 'goo'])
402:call add(tl, [2, '\<goo\|go', 'google', 'goo'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200403:"
Bram Moolenaar5714b802013-05-28 22:03:20 +0200404:"""" Back references
405:call add(tl, [2, '\(\i\+\) \1', ' abc abc', 'abc abc', 'abc'])
Bram Moolenaar428e9872013-05-30 17:05:39 +0200406:call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
Bram Moolenaar5714b802013-05-28 22:03:20 +0200407: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'])
Bram Moolenaarb122e972013-06-02 16:07:10 +0200408:call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', ''])
Bram Moolenaar141f6bb2013-06-15 15:09:50 +0200409:call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a'])
Bram Moolenaarf86c0b02013-06-26 12:42:44 +0200410:call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.com', 'foo.bat/foo.com', 'bat'])
411:call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<!$', 'foo.bat/foo.bat'])
412:call add(tl, [2, '^.*\.\(.*\)/.\+\(\1\)\@<=$', 'foo.bat/foo.bat', 'foo.bat/foo.bat', 'bat', 'bat'])
Bram Moolenaar560c52d2013-06-29 12:10:26 +0200413:call add(tl, [2, '\\\@<!\${\(\d\+\%(:.\{-}\)\?\\\@<!\)}', '2013-06-27${0}', '${0}', '0'])
Bram Moolenaar272fb582013-11-21 16:03:40 +0100414:call add(tl, [2, '^\(a*\)\1$', 'aaaaaaaa', 'aaaaaaaa', 'aaaa'])
Bram Moolenaaree482532014-05-13 15:56:51 +0200415:call add(tl, [2, '^\(a\{-2,}\)\1\+$', 'aaaaaaaaa', 'aaaaaaaaa', 'aaa'])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200416:"
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200417:"""" Look-behind with limit
Bram Moolenaar61602c52013-06-01 19:54:43 +0200418:call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
419:call add(tl, [2, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
420:call add(tl, [2, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
421:call add(tl, [2, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
422:call add(tl, [2, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
423:call add(tl, [2, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
424:call add(tl, [2, '\(foo\)\@<!bar.', 'xx foobar1 xbar2 xx', 'bar2'])
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200425:"
Bram Moolenaar473de612013-06-08 18:19:48 +0200426:" look-behind match in front of a zero-width item
427:call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" test header'])
428:call add(tl, [2, '\v\C%(<Last Changed:\s+)@<=.*$', '" Last Changed: 1970', '1970'])
429:call add(tl, [2, '\(foo\)\@<=\>', 'foobar'])
430:call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo'])
Bram Moolenaarbcf4d172013-06-10 16:35:18 +0200431:call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo'])
Bram Moolenaar473de612013-06-08 18:19:48 +0200432:"
Bram Moolenaar3f0df062013-08-14 13:34:25 +0200433:" complicated look-behind match
434:call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
Bram Moolenaarf2118842013-09-25 18:16:38 +0200435:call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
Bram Moolenaar3f0df062013-08-14 13:34:25 +0200436:"
Bram Moolenaar87953742013-06-05 18:52:40 +0200437:""""" \@>
438:call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
439:call add(tl, [2, '\(a*\)\@>b', 'aaab', 'aaab', 'aaa'])
Bram Moolenaar78c93e42013-09-05 16:05:36 +0200440:call add(tl, [2, '^\(.\{-}b\)\@>.', ' abcbd', ' abc', ' ab'])
Bram Moolenaar699c1202013-09-25 16:41:54 +0200441:call add(tl, [2, '\(.\{-}\)\(\)\@>$', 'abc', 'abc', 'abc', ''])
Bram Moolenaar87953742013-06-05 18:52:40 +0200442:" TODO: BT engine does not restore submatch after failure
443:call add(tl, [1, '\(a*\)\@>a\|a\+', 'aaaa', 'aaaa'])
444:"
Bram Moolenaarbad704f2013-05-30 11:51:08 +0200445:"""" "\_" prepended negated collection matches EOL
446:call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
447:call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200448:"
Bram Moolenaar16299b52013-05-30 18:45:23 +0200449:"""" Requiring lots of states.
Bram Moolenaar54dafde2013-05-31 23:18:00 +0200450: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-"])
Bram Moolenaar16299b52013-05-30 18:45:23 +0200451:"
Bram Moolenaara50d02d2013-06-16 15:43:50 +0200452:"""" Skip adding state twice
453:call add(tl, [2, '^\%(\%(^\s*#\s*if\>\|#\s*if\)\)\(\%>1c.*$\)\@=', "#if FOO", "#if", ' FOO'])
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000454:"
Bram Moolenaaref795d12015-01-18 16:46:32 +0100455:""" Test \%V atom
456:call add(tl, [2, '\%>70vGesamt', 'Jean-Michel Charlier & Victor Hubinon\Gesamtausgabe [Salleck] Buck Danny {Jean-Michel Charlier & Victor Hubinon}\Gesamtausgabe', 'Gesamt'])
457:"
Bram Moolenaarbad704f2013-05-30 11:51:08 +0200458:"""" Run the tests
459:"
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000460:for t in tl
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200461: let re = t[0]
462: let pat = t[1]
463: let text = t[2]
464: let matchidx = 3
465: for engine in [0, 1, 2]
Bram Moolenaar2d46e602014-08-29 11:56:32 +0200466: if engine == 2 && re == 0 || engine == 1 && re == 1
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200467: continue
468: endif
469: let &regexpengine = engine
Bram Moolenaar16299b52013-05-30 18:45:23 +0200470: try
471: let l = matchlist(text, pat)
472: catch
Bram Moolenaar9c235062014-05-13 16:44:29 +0200473: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"'
Bram Moolenaar16299b52013-05-30 18:45:23 +0200474: endtry
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000475:" check the match itself
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200476: if len(l) == 0 && len(t) > matchidx
Bram Moolenaar9c235062014-05-13 16:44:29 +0200477: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"'
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200478: elseif len(l) > 0 && len(t) == matchidx
Bram Moolenaar9c235062014-05-13 16:44:29 +0200479: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match'
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200480: elseif len(t) > matchidx && l[0] != t[matchidx]
Bram Moolenaar9c235062014-05-13 16:44:29 +0200481: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200482: else
483: $put ='OK ' . engine . ' - ' . pat
484: endif
485: if len(l) > 0
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000486:" check all the nine submatches
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200487: for i in range(1, 9)
488: if len(t) <= matchidx + i
489: let e = ''
490: else
491: let e = t[matchidx + i]
492: endif
493: if l[i] != e
Bram Moolenaar9c235062014-05-13 16:44:29 +0200494: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
Bram Moolenaarfdb6dc12013-05-25 23:15:27 +0200495: endif
496: endfor
497: unlet i
498: endif
499: endfor
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000500:endfor
Bram Moolenaar9d2c8c12007-09-25 16:00:00 +0000501:unlet t tl e l
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200502:"
Bram Moolenaar560c52d2013-06-29 12:10:26 +0200503:"""""" multi-line tests """"""""""""""""""""
Bram Moolenaar141f6bb2013-06-15 15:09:50 +0200504:let tl = []
505:"
506:"""" back references
507:call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']])
508: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']])
509:"
510:"""" line breaks
511:call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']])
512:"
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200513:" Check that \_[0-9] matching EOL does not break a following \>
Bram Moolenaar141f6bb2013-06-15 15:09:50 +0200514: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', '']])
515:"
516:" Check a pattern with a line break and ^ and $
517:call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']])
518:"
Bram Moolenaar438ee5b2013-11-21 17:13:00 +0100519:call add(tl, [2, '\(^.\+\n\)\1', [' dog', ' dog', 'asdf'], ['XXasdf']])
520:"
Bram Moolenaar141f6bb2013-06-15 15:09:50 +0200521:"""" Run the multi-line tests
522:"
523:$put ='multi-line tests'
524:for t in tl
525: let re = t[0]
526: let pat = t[1]
527: let before = t[2]
528: let after = t[3]
529: for engine in [0, 1, 2]
530: if engine == 2 && re == 0 || engine == 1 && re ==1
531: continue
532: endif
533: let &regexpengine = engine
534: new
535: call setline(1, before)
536: exe '%s/' . pat . '/XX/'
537: let result = getline(1, '$')
538: q!
539: if result != after
540: $put ='ERROR: pat: \"' . pat . '\", text: \"' . string(before) . '\", expected: \"' . string(after) . '\", got: \"' . string(result) . '\"'
541: else
542: $put ='OK ' . engine . ' - ' . pat
543: endif
544: endfor
545:endfor
546:unlet t tl
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200547:"
548:" Check that using a pattern on two lines doesn't get messed up by using
549:" matchstr() with \ze in between.
550:set re=0
551/^Substitute here
552:.+1,.+2s/""/\='"'.matchstr(getline("."), '\d\+\ze<').'"'
553/^Substitute here
554:.+1,.+2yank
555Gop:"
556:"
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200557:" Check a pattern with a look beind crossing a line boundary
558/^Behind:
559/\(<\_[xy]\+\)\@3<=start
560:.yank
561Gop:"
562:"
Bram Moolenaardacd7de2013-06-04 18:28:48 +0200563:" Check matching Visual area
564/^Visual:
565jfxvfx:s/\%Ve/E/g
566jV:s/\%Va/A/g
567jfxfxj:s/\%Vo/O/g
568:/^Visual/+1,/^Visual/+4yank
569Gop:"
570:"
Bram Moolenaar044aa292013-06-04 21:27:38 +0200571:" Check matching marks
572/^Marks:
573jfSmsfEme:.-4,.+6s/.\%>'s.*\%<'e../here/
574jfSmsj0fEme:.-4,.+6s/.\%>'s\_.*\%<'e../again/
575:/^Marks:/+1,/^Marks:/+3yank
576Gop:"
577:"
Bram Moolenaar423532e2013-05-29 21:14:42 +0200578:" Check patterns matching cursor position.
579:func! Postest()
580 new
Bram Moolenaar6747fab2016-06-28 22:39:16 +0200581 call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo', "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_', ' 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'])
Bram Moolenaar423532e2013-05-29 21:14:42 +0200582 call setpos('.', [0, 1, 0, 0])
583 s/\%>3c.//g
584 call setpos('.', [0, 2, 4, 0])
585 s/\%#.*$//g
586 call setpos('.', [0, 3, 0, 0])
587 s/\%<3c./_/g
588 %s/\%4l\%>5c./_/g
589 %s/\%6l\%>25v./_/g
590 %s/\%>6l\%3c./!/g
591 %s/\%>7l\%12c./?/g
592 %s/\%>7l\%<9l\%>5v\%<8v./#/g
Bram Moolenaar6747fab2016-06-28 22:39:16 +0200593 $s/\%(|\u.*\)\@<=[^|\t]\+$//ge
Bram Moolenaar423532e2013-05-29 21:14:42 +0200594 1,$yank
595 quit!
596endfunc
597Go-0-:set re=0
598:call Postest()
599:put
600o-1-:set re=1
601:call Postest()
602:put
603o-2-:set re=2
604:call Postest()
605:put
606:"
Bram Moolenaar4b780632013-05-31 22:14:52 +0200607:" start and end of buffer
608/\%^
609yeGop:"
61050%/\%^..
611yeGopA END:"
61250%/\%$
613"ayb20gg/..\%$
614"bybGo"apo"bp:"
615:"
Bram Moolenaar2d46e602014-08-29 11:56:32 +0200616:" Check for detecting error
617:set regexpengine=2
618:for pat in [' \ze*', ' \zs*']
619: try
620: let l = matchlist('x x', pat)
621: $put ='E888 NOT detected for ' . pat
622: catch
623: $put ='E888 detected for ' . pat
624: endtry
625:endfor
626:"
Bram Moolenaar560c52d2013-06-29 12:10:26 +0200627:""""" Write the results """""""""""""
Bram Moolenaarfbc0d2e2013-05-19 19:40:29 +0200628:/\%#=1^Results/,$wq! test.out
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000629ENDTEST
630
Bram Moolenaar57a285b2013-05-26 16:57:28 +0200631Substitute here:
632<T="">Ta 5</Title>
633<T="">Ac 7</Title>
634
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200635Behind:
636asdfasd<yyy
637xxstart1
638asdfasd<yy
Bram Moolenaar61602c52013-06-01 19:54:43 +0200639xxxstart2
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200640asdfasd<yy
Bram Moolenaar61602c52013-06-01 19:54:43 +0200641xxstart3
Bram Moolenaar75eb1612013-05-29 18:45:11 +0200642
Bram Moolenaardacd7de2013-06-04 18:28:48 +0200643Visual:
644thexe the thexethe
645andaxand andaxand
646oooxofor foroxooo
647oooxofor foroxooo
648
Bram Moolenaar044aa292013-06-04 21:27:38 +0200649Marks:
650asdfSasdfsadfEasdf
651asdfSas
652dfsadfEasdf
653
Bram Moolenaar4d2fffc2007-08-14 15:29:16 +0000654Results of test64: