1" Test for the search command 2 3source shared.vim 4 5func Test_search_cmdline() 6 if !exists('+incsearch') 7 return 8 endif 9 " need to disable char_avail, 10 " so that expansion of commandline works 11 call test_override("char_avail", 1) 12 new 13 call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar']) 14 " Test 1 15 " CTRL-N / CTRL-P skips through the previous search history 16 set noincsearch 17 :1 18 call feedkeys("/foobar\<cr>", 'tx') 19 call feedkeys("/the\<cr>",'tx') 20 call assert_equal('the', @/) 21 call feedkeys("/thes\<C-P>\<C-P>\<cr>",'tx') 22 call assert_equal('foobar', @/) 23 24 " Test 2 25 " Ctrl-G goes from one match to the next 26 " until the end of the buffer 27 set incsearch nowrapscan 28 :1 29 " first match 30 call feedkeys("/the\<cr>", 'tx') 31 call assert_equal(' 2 these', getline('.')) 32 :1 33 " second match 34 call feedkeys("/the\<C-G>\<cr>", 'tx') 35 call assert_equal(' 3 the', getline('.')) 36 call assert_equal([0, 0, 0, 0], getpos('"')) 37 :1 38 " third match 39 call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx') 40 call assert_equal(' 4 their', getline('.')) 41 :1 42 " fourth match 43 call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx') 44 call assert_equal(' 5 there', getline('.')) 45 :1 46 " fifth match 47 call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx') 48 call assert_equal(' 6 their', getline('.')) 49 :1 50 " sixth match 51 call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx') 52 call assert_equal(' 7 the', getline('.')) 53 :1 54 " seventh match 55 call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx') 56 call assert_equal(' 8 them', getline('.')) 57 :1 58 " eigth match 59 call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx') 60 call assert_equal(' 9 these', getline('.')) 61 :1 62 " no further match 63 call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx') 64 call assert_equal(' 9 these', getline('.')) 65 call assert_equal([0, 0, 0, 0], getpos('"')) 66 67 " Test 3 68 " Ctrl-G goes from one match to the next 69 " and continues back at the top 70 set incsearch wrapscan 71 :1 72 " first match 73 call feedkeys("/the\<cr>", 'tx') 74 call assert_equal(' 2 these', getline('.')) 75 :1 76 " second match 77 call feedkeys("/the\<C-G>\<cr>", 'tx') 78 call assert_equal(' 3 the', getline('.')) 79 :1 80 " third match 81 call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx') 82 call assert_equal(' 4 their', getline('.')) 83 :1 84 " fourth match 85 call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx') 86 call assert_equal(' 5 there', getline('.')) 87 :1 88 " fifth match 89 call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx') 90 call assert_equal(' 6 their', getline('.')) 91 :1 92 " sixth match 93 call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx') 94 call assert_equal(' 7 the', getline('.')) 95 :1 96 " seventh match 97 call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx') 98 call assert_equal(' 8 them', getline('.')) 99 :1 100 " eigth match 101 call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx') 102 call assert_equal(' 9 these', getline('.')) 103 :1 104 " back at first match 105 call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx') 106 call assert_equal(' 2 these', getline('.')) 107 108 " Test 4 109 " CTRL-T goes to the previous match 110 set incsearch nowrapscan 111 $ 112 " first match 113 call feedkeys("?the\<cr>", 'tx') 114 call assert_equal(' 9 these', getline('.')) 115 $ 116 " first match 117 call feedkeys("?the\<C-G>\<cr>", 'tx') 118 call assert_equal(' 9 these', getline('.')) 119 $ 120 " second match 121 call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx') 122 call assert_equal(' 8 them', getline('.')) 123 $ 124 " last match 125 call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx') 126 call assert_equal(' 2 these', getline('.')) 127 $ 128 " last match 129 call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx') 130 call assert_equal(' 2 these', getline('.')) 131 132 " Test 5 133 " CTRL-T goes to the previous match 134 set incsearch wrapscan 135 $ 136 " first match 137 call feedkeys("?the\<cr>", 'tx') 138 call assert_equal(' 9 these', getline('.')) 139 $ 140 " first match at the top 141 call feedkeys("?the\<C-G>\<cr>", 'tx') 142 call assert_equal(' 2 these', getline('.')) 143 $ 144 " second match 145 call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx') 146 call assert_equal(' 8 them', getline('.')) 147 $ 148 " last match 149 call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx') 150 call assert_equal(' 2 these', getline('.')) 151 $ 152 " back at the bottom of the buffer 153 call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx') 154 call assert_equal(' 9 these', getline('.')) 155 156 " Test 6 157 " CTRL-L adds to the search pattern 158 set incsearch wrapscan 159 1 160 " first match 161 call feedkeys("/the\<c-l>\<cr>", 'tx') 162 call assert_equal(' 2 these', getline('.')) 163 1 164 " go to next match of 'thes' 165 call feedkeys("/the\<c-l>\<C-G>\<cr>", 'tx') 166 call assert_equal(' 9 these', getline('.')) 167 1 168 " wrap around 169 call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx') 170 call assert_equal(' 2 these', getline('.')) 171 1 172 " wrap around 173 set nowrapscan 174 call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx') 175 call assert_equal(' 9 these', getline('.')) 176 177 " Test 7 178 " <bs> remove from match, but stay at current match 179 set incsearch wrapscan 180 1 181 " first match 182 call feedkeys("/thei\<cr>", 'tx') 183 call assert_equal(' 4 their', getline('.')) 184 1 185 " delete one char, add another 186 call feedkeys("/thei\<bs>s\<cr>", 'tx') 187 call assert_equal(' 2 these', getline('.')) 188 1 189 " delete one char, add another, go to previous match, add one char 190 call feedkeys("/thei\<bs>s\<bs>\<C-T>\<c-l>\<cr>", 'tx') 191 call assert_equal(' 9 these', getline('.')) 192 1 193 " delete all chars, start from the beginning again 194 call feedkeys("/them". repeat("\<bs>",4).'the\>'."\<cr>", 'tx') 195 call assert_equal(' 3 the', getline('.')) 196 197 " clean up 198 call test_override("char_avail", 0) 199 bw! 200endfunc 201 202func Test_search_cmdline2() 203 if !exists('+incsearch') 204 return 205 endif 206 " need to disable char_avail, 207 " so that expansion of commandline works 208 call test_override("char_avail", 1) 209 new 210 call setline(1, [' 1', ' 2 these', ' 3 the theother']) 211 " Test 1 212 " Ctrl-T goes correctly back and forth 213 set incsearch 214 1 215 " first match 216 call feedkeys("/the\<cr>", 'tx') 217 call assert_equal(' 2 these', getline('.')) 218 1 219 " go to next match (on next line) 220 call feedkeys("/the\<C-G>\<cr>", 'tx') 221 call assert_equal(' 3 the theother', getline('.')) 222 1 223 " go to next match (still on line 3) 224 call feedkeys("/the\<C-G>\<C-G>\<cr>", 'tx') 225 call assert_equal(' 3 the theother', getline('.')) 226 1 227 " go to next match (still on line 3) 228 call feedkeys("/the\<C-G>\<C-G>\<C-G>\<cr>", 'tx') 229 call assert_equal(' 3 the theother', getline('.')) 230 1 231 " go to previous match (on line 3) 232 call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<cr>", 'tx') 233 call assert_equal(' 3 the theother', getline('.')) 234 1 235 " go to previous match (on line 3) 236 call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<cr>", 'tx') 237 call assert_equal(' 3 the theother', getline('.')) 238 1 239 " go to previous match (on line 2) 240 call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<C-T>\<cr>", 'tx') 241 call assert_equal(' 2 these', getline('.')) 242 243 " Test 2: keep the view, 244 " after deleting a character from the search cmd 245 call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar']) 246 resize 5 247 1 248 call feedkeys("/foo\<bs>\<cr>", 'tx') 249 redraw 250 call assert_equal({'lnum': 10, 'leftcol': 0, 'col': 4, 'topfill': 0, 'topline': 6, 'coladd': 0, 'skipcol': 0, 'curswant': 4}, winsaveview()) 251 252 " remove all history entries 253 for i in range(10) 254 call histdel('/') 255 endfor 256 257 " Test 3: reset the view, 258 " after deleting all characters from the search cmd 259 norm! 1gg0 260 " unfortunately, neither "/foo\<c-w>\<cr>", nor "/foo\<bs>\<bs>\<bs>\<cr>", 261 " nor "/foo\<c-u>\<cr>" works to delete the commandline. 262 " In that case Vim should return "E35 no previous regular expression", 263 " but it looks like Vim still sees /foo and therefore the test fails. 264 " Therefore, disableing this test 265 "call assert_fails(feedkeys("/foo\<c-w>\<cr>", 'tx'), 'E35') 266 "call assert_equal({'lnum': 1, 'leftcol': 0, 'col': 0, 'topfill': 0, 'topline': 1, 'coladd': 0, 'skipcol': 0, 'curswant': 0}, winsaveview()) 267 268 " clean up 269 set noincsearch 270 call test_override("char_avail", 0) 271 bw! 272endfunc 273 274func Test_use_sub_pat() 275 split 276 let @/ = '' 277 func X() 278 s/^/a/ 279 / 280 endfunc 281 call X() 282 bwipe! 283endfunc 284 285func Test_searchpair() 286 new 287 call setline(1, ['other code here', '', '[', '" cursor here', ']']) 288 4 289 let a=searchpair('\[','',']','bW') 290 call assert_equal(3, a) 291 set nomagic 292 4 293 let a=searchpair('\[','',']','bW') 294 call assert_equal(3, a) 295 set magic 296 q! 297endfunc 298 299func Test_searchpair_skip() 300 func Zero() 301 return 0 302 endfunc 303 func Partial(x) 304 return a:x 305 endfunc 306 new 307 call setline(1, ['{', 'foo', 'foo', 'foo', '}']) 308 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', '')) 309 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', '0')) 310 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', {-> 0})) 311 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Zero'))) 312 3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Partial', [0]))) 313 " invalid argument 314 3 | call assert_equal(0, searchpair('{', '', '}', 'bWn', 0)) 315 bw! 316endfunc 317 318func Test_searchc() 319 " These commands used to cause memory overflow in searchc(). 320 new 321 norm ixx 322 exe "norm 0t\u93cf" 323 bw! 324endfunc 325 326func Test_search_cmdline3() 327 if !exists('+incsearch') 328 return 329 endif 330 " need to disable char_avail, 331 " so that expansion of commandline works 332 call test_override("char_avail", 1) 333 new 334 call setline(1, [' 1', ' 2 the~e', ' 3 the theother']) 335 set incsearch 336 1 337 " first match 338 call feedkeys("/the\<c-l>\<cr>", 'tx') 339 call assert_equal(' 2 the~e', getline('.')) 340 " clean up 341 set noincsearch 342 call test_override("char_avail", 0) 343 bw! 344endfunc 345 346func Test_search_cmdline4() 347 if !exists('+incsearch') 348 return 349 endif 350 " need to disable char_avail, 351 " so that expansion of commandline works 352 call test_override("char_avail", 1) 353 new 354 call setline(1, [' 1 the first', ' 2 the second', ' 3 the third']) 355 set incsearch 356 $ 357 call feedkeys("?the\<c-g>\<cr>", 'tx') 358 call assert_equal(' 3 the third', getline('.')) 359 $ 360 call feedkeys("?the\<c-g>\<c-g>\<cr>", 'tx') 361 call assert_equal(' 1 the first', getline('.')) 362 $ 363 call feedkeys("?the\<c-g>\<c-g>\<c-g>\<cr>", 'tx') 364 call assert_equal(' 2 the second', getline('.')) 365 $ 366 call feedkeys("?the\<c-t>\<cr>", 'tx') 367 call assert_equal(' 1 the first', getline('.')) 368 $ 369 call feedkeys("?the\<c-t>\<c-t>\<cr>", 'tx') 370 call assert_equal(' 3 the third', getline('.')) 371 $ 372 call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx') 373 call assert_equal(' 2 the second', getline('.')) 374 " clean up 375 set noincsearch 376 call test_override("char_avail", 0) 377 bw! 378endfunc 379 380func Test_search_cmdline5() 381 if !exists('+incsearch') 382 return 383 endif 384 " Do not call test_override("char_avail", 1) so that <C-g> and <C-t> work 385 " regardless char_avail. 386 new 387 call setline(1, [' 1 the first', ' 2 the second', ' 3 the third']) 388 set incsearch 389 1 390 call feedkeys("/the\<c-g>\<c-g>\<cr>", 'tx') 391 call assert_equal(' 3 the third', getline('.')) 392 $ 393 call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx') 394 call assert_equal(' 2 the second', getline('.')) 395 " clean up 396 set noincsearch 397 bw! 398endfunc 399 400func Test_search_cmdline6() 401 " Test that consecutive matches 402 " are caught by <c-g>/<c-t> 403 if !exists('+incsearch') 404 return 405 endif 406 " need to disable char_avail, 407 " so that expansion of commandline works 408 call test_override("char_avail", 1) 409 new 410 call setline(1, [' bbvimb', '']) 411 set incsearch 412 " first match 413 norm! gg0 414 call feedkeys("/b\<cr>", 'tx') 415 call assert_equal([0,1,2,0], getpos('.')) 416 " second match 417 norm! gg0 418 call feedkeys("/b\<c-g>\<cr>", 'tx') 419 call assert_equal([0,1,3,0], getpos('.')) 420 " third match 421 norm! gg0 422 call feedkeys("/b\<c-g>\<c-g>\<cr>", 'tx') 423 call assert_equal([0,1,7,0], getpos('.')) 424 " first match again 425 norm! gg0 426 call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx') 427 call assert_equal([0,1,2,0], getpos('.')) 428 set nowrapscan 429 " last match 430 norm! gg0 431 call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx') 432 call assert_equal([0,1,7,0], getpos('.')) 433 " clean up 434 set wrapscan&vim 435 set noincsearch 436 call test_override("char_avail", 0) 437 bw! 438endfunc 439 440func Test_search_cmdline7() 441 " Test that an pressing <c-g> in an empty command line 442 " does not move the cursor 443 if !exists('+incsearch') 444 return 445 endif 446 " need to disable char_avail, 447 " so that expansion of commandline works 448 call test_override("char_avail", 1) 449 new 450 let @/='b' 451 call setline(1, [' bbvimb', '']) 452 set incsearch 453 " first match 454 norm! gg0 455 " moves to next match of previous search pattern, just like /<cr> 456 call feedkeys("/\<c-g>\<cr>", 'tx') 457 call assert_equal([0,1,2,0], getpos('.')) 458 " moves to next match of previous search pattern, just like /<cr> 459 call feedkeys("/\<cr>", 'tx') 460 call assert_equal([0,1,3,0], getpos('.')) 461 " moves to next match of previous search pattern, just like /<cr> 462 call feedkeys("/\<c-t>\<cr>", 'tx') 463 call assert_equal([0,1,7,0], getpos('.')) 464 465 " using an offset uses the last search pattern 466 call cursor(1, 1) 467 call setline(1, ['1 bbvimb', ' 2 bbvimb']) 468 let @/ = 'b' 469 call feedkeys("//e\<c-g>\<cr>", 'tx') 470 call assert_equal('1 bbvimb', getline('.')) 471 call assert_equal(4, col('.')) 472 473 set noincsearch 474 call test_override("char_avail", 0) 475 bw! 476endfunc 477 478func Test_search_cmdline8() 479 " Highlighting is cleared in all windows 480 " since hls applies to all windows 481 if !exists('+incsearch') || !has('terminal') || has('gui_running') || winwidth(0) < 30 482 return 483 endif 484 if has("win32") 485 throw "Skipped: Bug with sending <ESC> to terminal window not fixed yet" 486 endif 487 let h = winheight(0) 488 if h < 3 489 return 490 endif 491 " Prepare buffer text 492 let lines = ['abb vim vim vi', 'vimvivim'] 493 call writefile(lines, 'Xsearch.txt') 494 let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) 495 496 call WaitFor({-> lines == [term_getline(buf, 1), term_getline(buf, 2)] }) 497 498 call term_sendkeys(buf, ":set incsearch hlsearch\<cr>") 499 call term_sendkeys(buf, ":14vsp\<cr>") 500 call term_sendkeys(buf, "/vim\<cr>") 501 call term_sendkeys(buf, "/b\<esc>") 502 call term_sendkeys(buf, "gg0") 503 call term_wait(buf, 500) 504 let screen_line = term_scrape(buf, 1) 505 let [a0,a1,a2,a3] = [screen_line[3].attr, screen_line[4].attr, 506 \ screen_line[18].attr, screen_line[19].attr] 507 call assert_notequal(a0, a1) 508 call assert_notequal(a0, a3) 509 call assert_notequal(a1, a2) 510 call assert_equal(a0, a2) 511 call assert_equal(a1, a3) 512 " clean up 513 call delete('Xsearch.txt') 514 515 bwipe! 516endfunc 517 518" Tests for regexp with various magic settings 519func Test_search_regexp() 520 enew! 521 522 put ='1 a aa abb abbccc' 523 exe 'normal! /a*b\{2}c\+/e' . "\<CR>" 524 call assert_equal([0, 2, 17, 0], getpos('.')) 525 526 put ='2 d dd dee deefff' 527 exe 'normal! /\Md\*e\{2}f\+/e' . "\<CR>" 528 call assert_equal([0, 3, 17, 0], getpos('.')) 529 530 set nomagic 531 put ='3 g gg ghh ghhiii' 532 exe 'normal! /g\*h\{2}i\+/e' . "\<CR>" 533 call assert_equal([0, 4, 17, 0], getpos('.')) 534 535 put ='4 j jj jkk jkklll' 536 exe 'normal! /\mj*k\{2}l\+/e' . "\<CR>" 537 call assert_equal([0, 5, 17, 0], getpos('.')) 538 539 put ='5 m mm mnn mnnooo' 540 exe 'normal! /\vm*n{2}o+/e' . "\<CR>" 541 call assert_equal([0, 6, 17, 0], getpos('.')) 542 543 put ='6 x ^aa$ x' 544 exe 'normal! /\V^aa$' . "\<CR>" 545 call assert_equal([0, 7, 5, 0], getpos('.')) 546 547 set magic 548 put ='7 (a)(b) abbaa' 549 exe 'normal! /\v(a)(b)\2\1\1/e' . "\<CR>" 550 call assert_equal([0, 8, 14, 0], getpos('.')) 551 552 put ='8 axx [ab]xx' 553 exe 'normal! /\V[ab]\(\[xy]\)\1' . "\<CR>" 554 call assert_equal([0, 9, 7, 0], getpos('.')) 555 556 set undolevels=100 557 put ='9 foobar' 558 put ='' 559 exe "normal! a\<C-G>u\<Esc>" 560 normal G 561 exe 'normal! dv?bar?' . "\<CR>" 562 call assert_equal('9 foo', getline('.')) 563 call assert_equal([0, 10, 5, 0], getpos('.')) 564 call assert_equal(10, line('$')) 565 normal u 566 call assert_equal('9 foobar', getline('.')) 567 call assert_equal([0, 10, 6, 0], getpos('.')) 568 call assert_equal(11, line('$')) 569 570 set undolevels& 571 enew! 572endfunc 573 574func Test_search_cmdline_incsearch_highlight() 575 if !exists('+incsearch') 576 return 577 endif 578 set incsearch hlsearch 579 " need to disable char_avail, 580 " so that expansion of commandline works 581 call test_override("char_avail", 1) 582 new 583 call setline(1, ['aaa 1 the first', ' 2 the second', ' 3 the third']) 584 585 1 586 call feedkeys("/second\<cr>", 'tx') 587 call assert_equal('second', @/) 588 call assert_equal(' 2 the second', getline('.')) 589 590 " Canceling search won't change @/ 591 1 592 let @/ = 'last pattern' 593 call feedkeys("/third\<C-c>", 'tx') 594 call assert_equal('last pattern', @/) 595 call feedkeys("/third\<Esc>", 'tx') 596 call assert_equal('last pattern', @/) 597 call feedkeys("/3\<bs>\<bs>", 'tx') 598 call assert_equal('last pattern', @/) 599 call feedkeys("/third\<c-g>\<c-t>\<Esc>", 'tx') 600 call assert_equal('last pattern', @/) 601 602 " clean up 603 set noincsearch nohlsearch 604 bw! 605endfunc 606 607func Test_search_cmdline_incsearch_highlight_attr() 608 if !exists('+incsearch') || !has('terminal') || has('gui_running') 609 return 610 endif 611 let h = winheight(0) 612 if h < 3 613 return 614 endif 615 616 " Prepare buffer text 617 let lines = ['abb vim vim vi', 'vimvivim'] 618 call writefile(lines, 'Xsearch.txt') 619 let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) 620 621 call WaitFor({-> lines == [term_getline(buf, 1), term_getline(buf, 2)] }) 622 623 " Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight 624 call term_sendkeys(buf, ":set incsearch hlsearch\<cr>") 625 call term_sendkeys(buf, '/b') 626 call term_wait(buf, 200) 627 let screen_line1 = term_scrape(buf, 1) 628 call assert_true(len(screen_line1) > 2) 629 " a0: attr_normal 630 let a0 = screen_line1[0].attr 631 " a1: attr_incsearch 632 let a1 = screen_line1[1].attr 633 " a2: attr_hlsearch 634 let a2 = screen_line1[2].attr 635 call assert_notequal(a0, a1) 636 call assert_notequal(a0, a2) 637 call assert_notequal(a1, a2) 638 call term_sendkeys(buf, "\<cr>gg0") 639 640 " Test incremental highlight search 641 call term_sendkeys(buf, "/vim") 642 call term_wait(buf, 200) 643 " Buffer: 644 " abb vim vim vi 645 " vimvivim 646 " Search: /vim 647 let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a2,a2,a2,a0,a0,a0] 648 let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] 649 call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) 650 call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) 651 652 " Test <C-g> 653 call term_sendkeys(buf, "\<C-g>\<C-g>") 654 call term_wait(buf, 200) 655 let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] 656 let attr_line2 = [a1,a1,a1,a0,a0,a2,a2,a2] 657 call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) 658 call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) 659 660 " Test <C-t> 661 call term_sendkeys(buf, "\<C-t>") 662 call term_wait(buf, 200) 663 let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a1,a1,a1,a0,a0,a0] 664 let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] 665 call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) 666 call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) 667 668 " Type Enter and a1(incsearch highlight) should become a2(hlsearch highlight) 669 call term_sendkeys(buf, "\<cr>") 670 call term_wait(buf, 200) 671 let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] 672 let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] 673 call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) 674 call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) 675 676 " Test nohlsearch. a2(hlsearch highlight) should become a0(normal highlight) 677 call term_sendkeys(buf, ":1\<cr>") 678 call term_sendkeys(buf, ":set nohlsearch\<cr>") 679 call term_sendkeys(buf, "/vim") 680 call term_wait(buf, 200) 681 let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a0,a0,a0,a0,a0,a0] 682 let attr_line2 = [a0,a0,a0,a0,a0,a0,a0,a0] 683 call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) 684 call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) 685 call delete('Xsearch.txt') 686 687 call delete('Xsearch.txt') 688 bwipe! 689endfunc 690 691func Test_search_undefined_behaviour() 692 if !has("terminal") 693 return 694 endif 695 let h = winheight(0) 696 if h < 3 697 return 698 endif 699 " did cause an undefined left shift 700 let g:buf = term_start([GetVimProg(), '--clean', '-e', '-s', '-c', 'call search(getline("."))', 'samples/test000'], {'term_rows': 3}) 701 call assert_equal([''], getline(1, '$')) 702 call term_sendkeys(g:buf, ":qa!\<cr>") 703 bwipe! 704endfunc 705 706func Test_search_undefined_behaviour2() 707 call search("\%UC0000000") 708endfunc 709 710" Test for search('multi-byte char', 'bce') 711func Test_search_multibyte() 712 if !has('multi_byte') 713 return 714 endif 715 let save_enc = &encoding 716 set encoding=utf8 717 enew! 718 call append('$', 'A') 719 call cursor(2, 1) 720 call assert_equal(2, search('A', 'bce', line('.'))) 721 enew! 722 let &encoding = save_enc 723endfunc 724 725" This was causing E874. Also causes an invalid read? 726func Test_look_behind() 727 new 728 call setline(1, '0\|\&\n\@<=') 729 call search(getline(".")) 730 bwipe! 731endfunc 732