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 ®expengine = 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 ®expengine = 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