1" Tests for diff mode 2 3func Test_diff_fold_sync() 4 enew! 5 let l = range(50) 6 call setline(1, l) 7 diffthis 8 let winone = win_getid() 9 new 10 let l[25] = 'diff' 11 call setline(1, l) 12 diffthis 13 let wintwo = win_getid() 14 " line 15 is inside the closed fold 15 call assert_equal(19, foldclosedend(10)) 16 call win_gotoid(winone) 17 call assert_equal(19, foldclosedend(10)) 18 " open the fold 19 normal zv 20 call assert_equal(-1, foldclosedend(10)) 21 " fold in other window must have opened too 22 call win_gotoid(wintwo) 23 call assert_equal(-1, foldclosedend(10)) 24 25 " cursor position is in sync 26 normal 23G 27 call win_gotoid(winone) 28 call assert_equal(23, getcurpos()[1]) 29 30 windo diffoff 31 close! 32 set nomodified 33endfunc 34 35func Test_vert_split() 36 " Disable the title to avoid xterm keeping the wrong one. 37 set notitle noicon 38 new 39 let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee'] 40 call setline(1, l) 41 w! Xtest 42 normal dd 43 $ 44 put 45 normal kkrXoxxx 46 w! Xtest2 47 file Nop 48 normal ggoyyyjjjozzzz 49 set foldmethod=marker foldcolumn=4 50 call assert_equal(0, &diff) 51 call assert_equal('marker', &foldmethod) 52 call assert_equal(4, &foldcolumn) 53 call assert_equal(0, &scrollbind) 54 call assert_equal(0, &cursorbind) 55 call assert_equal(1, &wrap) 56 57 vert diffsplit Xtest 58 vert diffsplit Xtest2 59 call assert_equal(1, &diff) 60 call assert_equal('diff', &foldmethod) 61 call assert_equal(2, &foldcolumn) 62 call assert_equal(1, &scrollbind) 63 call assert_equal(1, &cursorbind) 64 call assert_equal(0, &wrap) 65 66 let diff_fdm = &fdm 67 let diff_fdc = &fdc 68 " repeat entering diff mode here to see if this saves the wrong settings 69 diffthis 70 " jump to second window for a moment to have filler line appear at start of 71 " first window 72 wincmd w 73 normal gg 74 wincmd p 75 normal gg 76 call assert_equal(2, winline()) 77 normal j 78 call assert_equal(4, winline()) 79 normal j 80 call assert_equal(5, winline()) 81 normal j 82 call assert_equal(6, winline()) 83 normal j 84 call assert_equal(8, winline()) 85 normal j 86 call assert_equal(9, winline()) 87 88 wincmd w 89 normal gg 90 call assert_equal(1, winline()) 91 normal j 92 call assert_equal(2, winline()) 93 normal j 94 call assert_equal(4, winline()) 95 normal j 96 call assert_equal(5, winline()) 97 normal j 98 call assert_equal(8, winline()) 99 100 wincmd w 101 normal gg 102 call assert_equal(2, winline()) 103 normal j 104 call assert_equal(3, winline()) 105 normal j 106 call assert_equal(4, winline()) 107 normal j 108 call assert_equal(5, winline()) 109 normal j 110 call assert_equal(6, winline()) 111 normal j 112 call assert_equal(7, winline()) 113 normal j 114 call assert_equal(8, winline()) 115 116 " Test diffoff 117 diffoff! 118 1wincmd 2 119 let &diff = 1 120 let &fdm = diff_fdm 121 let &fdc = diff_fdc 122 4wincmd w 123 diffoff! 124 1wincmd w 125 call assert_equal(0, &diff) 126 call assert_equal('marker', &foldmethod) 127 call assert_equal(4, &foldcolumn) 128 call assert_equal(0, &scrollbind) 129 call assert_equal(0, &cursorbind) 130 call assert_equal(1, &wrap) 131 132 wincmd w 133 call assert_equal(0, &diff) 134 call assert_equal('marker', &foldmethod) 135 call assert_equal(4, &foldcolumn) 136 call assert_equal(0, &scrollbind) 137 call assert_equal(0, &cursorbind) 138 call assert_equal(1, &wrap) 139 140 wincmd w 141 call assert_equal(0, &diff) 142 call assert_equal('marker', &foldmethod) 143 call assert_equal(4, &foldcolumn) 144 call assert_equal(0, &scrollbind) 145 call assert_equal(0, &cursorbind) 146 call assert_equal(1, &wrap) 147 148 call delete('Xtest') 149 call delete('Xtest2') 150 windo bw! 151endfunc 152 153func Test_filler_lines() 154 " Test that diffing shows correct filler lines 155 enew! 156 put =range(4,10) 157 1d _ 158 vnew 159 put =range(1,10) 160 1d _ 161 windo diffthis 162 wincmd h 163 call assert_equal(1, line('w0')) 164 unlet! diff_fdm diff_fdc 165 windo diffoff 166 bwipe! 167 enew! 168endfunc 169 170func Test_diffget_diffput() 171 enew! 172 let l = range(50) 173 call setline(1, l) 174 call assert_fails('diffget', 'E99:') 175 diffthis 176 call assert_fails('diffget', 'E100:') 177 new 178 let l[10] = 'one' 179 let l[20] = 'two' 180 let l[30] = 'three' 181 let l[40] = 'four' 182 call setline(1, l) 183 diffthis 184 call assert_equal('one', getline(11)) 185 11diffget 186 call assert_equal('10', getline(11)) 187 21diffput 188 wincmd w 189 call assert_equal('two', getline(21)) 190 normal 31Gdo 191 call assert_equal('three', getline(31)) 192 call assert_equal('40', getline(41)) 193 normal 41Gdp 194 wincmd w 195 call assert_equal('40', getline(41)) 196 new 197 diffthis 198 call assert_fails('diffget', 'E101:') 199 200 windo diffoff 201 %bwipe! 202endfunc 203 204func Test_dp_do_buffer() 205 e! one 206 let bn1=bufnr('%') 207 let l = range(60) 208 call setline(1, l) 209 diffthis 210 211 new two 212 let l[10] = 'one' 213 let l[20] = 'two' 214 let l[30] = 'three' 215 let l[40] = 'four' 216 let l[50] = 'five' 217 call setline(1, l) 218 diffthis 219 220 " dp and do with invalid buffer number. 221 11 222 call assert_fails('norm 99999dp', 'E102:') 223 call assert_fails('norm 99999do', 'E102:') 224 call assert_fails('diffput non_existing_buffer', 'E94:') 225 call assert_fails('diffget non_existing_buffer', 'E94:') 226 227 " dp and do with valid buffer number. 228 call assert_equal('one', getline('.')) 229 exe 'norm ' . bn1 . 'do' 230 call assert_equal('10', getline('.')) 231 21 232 call assert_equal('two', getline('.')) 233 diffget one 234 call assert_equal('20', getline('.')) 235 236 31 237 exe 'norm ' . bn1 . 'dp' 238 41 239 diffput one 240 wincmd w 241 31 242 call assert_equal('three', getline('.')) 243 41 244 call assert_equal('four', getline('.')) 245 246 " dp and do with buffer number which is not in diff mode. 247 new not_in_diff_mode 248 let bn3=bufnr('%') 249 wincmd w 250 51 251 call assert_fails('exe "norm" . bn3 . "dp"', 'E103:') 252 call assert_fails('exe "norm" . bn3 . "do"', 'E103:') 253 call assert_fails('diffput not_in_diff_mode', 'E94:') 254 call assert_fails('diffget not_in_diff_mode', 'E94:') 255 256 windo diffoff 257 %bwipe! 258endfunc 259 260func Test_diffoff() 261 enew! 262 call setline(1, ['Two', 'Three']) 263 redraw 264 let normattr = screenattr(1, 1) 265 diffthis 266 botright vert new 267 call setline(1, ['One', '', 'Two', 'Three']) 268 diffthis 269 redraw 270 call assert_notequal(normattr, screenattr(1, 1)) 271 diffoff! 272 redraw 273 call assert_equal(normattr, screenattr(1, 1)) 274 bwipe! 275 bwipe! 276endfunc 277 278func Test_diffopt_icase() 279 set diffopt=icase,foldcolumn:0 280 281 e one 282 call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve']) 283 redraw 284 let normattr = screenattr(1, 1) 285 diffthis 286 287 botright vert new two 288 call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE']) 289 diffthis 290 291 redraw 292 call assert_equal(normattr, screenattr(1, 1)) 293 call assert_equal(normattr, screenattr(2, 1)) 294 call assert_notequal(normattr, screenattr(3, 1)) 295 call assert_equal(normattr, screenattr(4, 1)) 296 297 let dtextattr = screenattr(5, 3) 298 call assert_notequal(dtextattr, screenattr(5, 1)) 299 call assert_notequal(dtextattr, screenattr(5, 5)) 300 301 diffoff! 302 %bwipe! 303 set diffopt& 304endfunc 305 306func Test_diffopt_iwhite() 307 set diffopt=iwhite,foldcolumn:0 308 309 e one 310 " Difference in trailing spaces should be ignored, 311 " but not other space differences. 312 call setline(1, ["One \t", 'Two', 'Three', 'Four']) 313 redraw 314 let normattr = screenattr(1, 1) 315 diffthis 316 317 botright vert new two 318 call setline(1, ["One\t ", "Two\t ", 'Three', ' Four']) 319 diffthis 320 321 redraw 322 call assert_equal(normattr, screenattr(1, 1)) 323 call assert_equal(normattr, screenattr(2, 1)) 324 call assert_equal(normattr, screenattr(3, 1)) 325 call assert_notequal(normattr, screenattr(4, 1)) 326 327 diffoff! 328 %bwipe! 329 set diffopt& 330endfunc 331 332func Test_diffopt_context() 333 enew! 334 call setline(1, ['1', '2', '3', '4', '5', '6', '7']) 335 diffthis 336 new 337 call setline(1, ['1', '2', '3', '4', '5x', '6', '7']) 338 diffthis 339 340 set diffopt=context:2 341 call assert_equal('+-- 2 lines: 1', foldtextresult(1)) 342 set diffopt=context:1 343 call assert_equal('+-- 3 lines: 1', foldtextresult(1)) 344 345 diffoff! 346 %bwipe! 347 set diffopt& 348endfunc 349 350func Test_diffopt_horizontal() 351 set diffopt=horizontal 352 diffsplit 353 354 call assert_equal(&columns, winwidth(1)) 355 call assert_equal(&columns, winwidth(2)) 356 call assert_equal(&lines, winheight(1) + winheight(2) + 3) 357 call assert_inrange(0, 1, winheight(1) - winheight(2)) 358 359 set diffopt& 360 diffoff! 361 %bwipe 362endfunc 363 364func Test_diffopt_vertical() 365 set diffopt=vertical 366 diffsplit 367 368 call assert_equal(&lines - 2, winheight(1)) 369 call assert_equal(&lines - 2, winheight(2)) 370 call assert_equal(&columns, winwidth(1) + winwidth(2) + 1) 371 call assert_inrange(0, 1, winwidth(1) - winwidth(2)) 372 373 set diffopt& 374 diffoff! 375 %bwipe 376endfunc 377 378func Test_diffopt_hiddenoff() 379 set diffopt=filler,foldcolumn:0,hiddenoff 380 e! one 381 call setline(1, ['Two', 'Three']) 382 redraw 383 let normattr = screenattr(1, 1) 384 diffthis 385 botright vert new two 386 call setline(1, ['One', 'Four']) 387 diffthis 388 redraw 389 call assert_notequal(normattr, screenattr(1, 1)) 390 set hidden 391 close 392 redraw 393 " should not diffing with hidden buffer two while 'hiddenoff' is enabled 394 call assert_equal(normattr, screenattr(1, 1)) 395 396 bwipe! 397 bwipe! 398 set hidden& diffopt& 399endfunc 400 401func Test_diffoff_hidden() 402 set diffopt=filler,foldcolumn:0 403 e! one 404 call setline(1, ['Two', 'Three']) 405 redraw 406 let normattr = screenattr(1, 1) 407 diffthis 408 botright vert new two 409 call setline(1, ['One', 'Four']) 410 diffthis 411 redraw 412 call assert_notequal(normattr, screenattr(1, 1)) 413 set hidden 414 close 415 redraw 416 " diffing with hidden buffer two 417 call assert_notequal(normattr, screenattr(1, 1)) 418 diffoff 419 redraw 420 call assert_equal(normattr, screenattr(1, 1)) 421 diffthis 422 redraw 423 " still diffing with hidden buffer two 424 call assert_notequal(normattr, screenattr(1, 1)) 425 diffoff! 426 redraw 427 call assert_equal(normattr, screenattr(1, 1)) 428 diffthis 429 redraw 430 " no longer diffing with hidden buffer two 431 call assert_equal(normattr, screenattr(1, 1)) 432 433 bwipe! 434 bwipe! 435 set hidden& diffopt& 436endfunc 437 438func Test_setting_cursor() 439 new Xtest1 440 put =range(1,90) 441 wq 442 new Xtest2 443 put =range(1,100) 444 wq 445 446 tabe Xtest2 447 $ 448 diffsp Xtest1 449 tabclose 450 451 call delete('Xtest1') 452 call delete('Xtest2') 453endfunc 454 455func Test_diff_move_to() 456 new 457 call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 458 diffthis 459 vnew 460 call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x']) 461 diffthis 462 norm ]c 463 call assert_equal(2, line('.')) 464 norm 3]c 465 call assert_equal(9, line('.')) 466 norm 10]c 467 call assert_equal(11, line('.')) 468 norm [c 469 call assert_equal(9, line('.')) 470 norm 2[c 471 call assert_equal(5, line('.')) 472 norm 10[c 473 call assert_equal(2, line('.')) 474 %bwipe! 475endfunc 476 477func Test_diffexpr() 478 if !executable('diff') 479 return 480 endif 481 482 func DiffExpr() 483 silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>' . v:fname_out 484 endfunc 485 set diffexpr=DiffExpr() 486 set diffopt=foldcolumn:0 487 488 enew! 489 call setline(1, ['one', 'two', 'three']) 490 redraw 491 let normattr = screenattr(1, 1) 492 diffthis 493 494 botright vert new 495 call setline(1, ['one', 'two', 'three.']) 496 diffthis 497 498 redraw 499 call assert_equal(normattr, screenattr(1, 1)) 500 call assert_equal(normattr, screenattr(2, 1)) 501 call assert_notequal(normattr, screenattr(3, 1)) 502 503 diffoff! 504 %bwipe! 505 set diffexpr& diffopt& 506endfunc 507 508func Test_diffpatch() 509 " The patch program on MS-Windows may fail or hang. 510 if !executable('patch') || !has('unix') 511 return 512 endif 513 new 514 insert 515*************** 516*** 1,3 **** 517 1 518! 2 519 3 520--- 1,4 ---- 521 1 522! 2x 523 3 524+ 4 525. 526 saveas! Xpatch 527 bwipe! 528 new 529 call assert_fails('diffpatch Xpatch', 'E816:') 530 531 for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch'] 532 call setline(1, ['1', '2', '3']) 533 if name != 'Xpatch' 534 call rename('Xpatch', name) 535 endif 536 exe 'diffpatch ' . escape(name, '$') 537 call assert_equal(['1', '2x', '3', '4'], getline(1, '$')) 538 if name != 'Xpatch' 539 call rename(name, 'Xpatch') 540 endif 541 bwipe! 542 endfor 543 544 call delete('Xpatch') 545 bwipe! 546endfunc 547 548func Test_diff_too_many_buffers() 549 for i in range(1, 8) 550 exe "new Xtest" . i 551 diffthis 552 endfor 553 new Xtest9 554 call assert_fails('diffthis', 'E96:') 555 %bwipe! 556endfunc 557 558func Test_diff_nomodifiable() 559 new 560 call setline(1, [1, 2, 3, 4]) 561 setl nomodifiable 562 diffthis 563 vnew 564 call setline(1, ['1x', 2, 3, 3, 4]) 565 diffthis 566 call assert_fails('norm dp', 'E793:') 567 setl nomodifiable 568 call assert_fails('norm do', 'E21:') 569 %bwipe! 570endfunc 571 572func Test_diff_hlID() 573 new 574 call setline(1, [1, 2, 3]) 575 diffthis 576 vnew 577 call setline(1, ['1x', 2, 'x', 3]) 578 diffthis 579 redraw 580 581 call assert_equal(synIDattr(diff_hlID(-1, 1), "name"), "") 582 583 call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange") 584 call assert_equal(synIDattr(diff_hlID(1, 2), "name"), "DiffText") 585 call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "") 586 call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "DiffAdd") 587 call assert_equal(synIDattr(diff_hlID(4, 1), "name"), "") 588 589 wincmd w 590 call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange") 591 call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "") 592 call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "") 593 594 %bwipe! 595endfunc 596 597func Test_diff_filler() 598 new 599 call setline(1, [1, 2, 3, 'x', 4]) 600 diffthis 601 vnew 602 call setline(1, [1, 2, 'y', 'y', 3, 4]) 603 diffthis 604 redraw 605 606 call assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0], map(range(-1, 7), 'diff_filler(v:val)')) 607 wincmd w 608 call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)')) 609 610 %bwipe! 611endfunc 612 613func Test_diff_lastline() 614 enew! 615 only! 616 call setline(1, ['This is a ', 'line with five ', 'rows']) 617 diffthis 618 botright vert new 619 call setline(1, ['This is', 'a line with ', 'four rows']) 620 diffthis 621 1 622 call feedkeys("Je a\<CR>", 'tx') 623 call feedkeys("Je a\<CR>", 'tx') 624 let w1lines = winline() 625 wincmd w 626 $ 627 let w2lines = winline() 628 call assert_equal(w2lines, w1lines) 629 bwipe! 630 bwipe! 631endfunc 632