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