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