blob: b93cc6d3e1be7278f8f79f59ef17999419efe128 [file] [log] [blame]
Bram Moolenaar42093c02016-07-30 16:16:54 +02001" Tests for diff mode
Bram Moolenaare828b762018-09-10 17:51:58 +02002source shared.vim
3source screendump.vim
Bram Moolenaar3c8ee622019-08-03 22:55:50 +02004source check.vim
Bram Moolenaar42093c02016-07-30 16:16:54 +02005
6func Test_diff_fold_sync()
7 enew!
Bram Moolenaare8fa05b2018-09-16 15:48:06 +02008 let g:update_count = 0
9 au DiffUpdated * let g:update_count += 1
10
Bram Moolenaar42093c02016-07-30 16:16:54 +020011 let l = range(50)
12 call setline(1, l)
13 diffthis
14 let winone = win_getid()
15 new
16 let l[25] = 'diff'
17 call setline(1, l)
18 diffthis
19 let wintwo = win_getid()
20 " line 15 is inside the closed fold
21 call assert_equal(19, foldclosedend(10))
22 call win_gotoid(winone)
23 call assert_equal(19, foldclosedend(10))
24 " open the fold
25 normal zv
26 call assert_equal(-1, foldclosedend(10))
27 " fold in other window must have opened too
28 call win_gotoid(wintwo)
29 call assert_equal(-1, foldclosedend(10))
30
31 " cursor position is in sync
32 normal 23G
33 call win_gotoid(winone)
34 call assert_equal(23, getcurpos()[1])
35
Bram Moolenaare8fa05b2018-09-16 15:48:06 +020036 call assert_equal(1, g:update_count)
37 au! DiffUpdated
38
Bram Moolenaar42093c02016-07-30 16:16:54 +020039 windo diffoff
40 close!
41 set nomodified
42endfunc
43
44func Test_vert_split()
Bram Moolenaare828b762018-09-10 17:51:58 +020045 set diffopt=filler
46 call Common_vert_split()
47 set diffopt&
48endfunc
49
50func Test_vert_split_internal()
51 set diffopt=internal,filler
52 call Common_vert_split()
53 set diffopt&
54endfunc
55
56func Common_vert_split()
Bram Moolenaar42093c02016-07-30 16:16:54 +020057 " Disable the title to avoid xterm keeping the wrong one.
58 set notitle noicon
59 new
60 let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
61 call setline(1, l)
62 w! Xtest
63 normal dd
64 $
65 put
66 normal kkrXoxxx
67 w! Xtest2
68 file Nop
69 normal ggoyyyjjjozzzz
70 set foldmethod=marker foldcolumn=4
71 call assert_equal(0, &diff)
72 call assert_equal('marker', &foldmethod)
73 call assert_equal(4, &foldcolumn)
74 call assert_equal(0, &scrollbind)
75 call assert_equal(0, &cursorbind)
76 call assert_equal(1, &wrap)
77
78 vert diffsplit Xtest
79 vert diffsplit Xtest2
80 call assert_equal(1, &diff)
81 call assert_equal('diff', &foldmethod)
82 call assert_equal(2, &foldcolumn)
83 call assert_equal(1, &scrollbind)
84 call assert_equal(1, &cursorbind)
85 call assert_equal(0, &wrap)
86
87 let diff_fdm = &fdm
88 let diff_fdc = &fdc
89 " repeat entering diff mode here to see if this saves the wrong settings
90 diffthis
91 " jump to second window for a moment to have filler line appear at start of
92 " first window
93 wincmd w
94 normal gg
95 wincmd p
96 normal gg
97 call assert_equal(2, winline())
98 normal j
99 call assert_equal(4, winline())
100 normal j
101 call assert_equal(5, winline())
102 normal j
103 call assert_equal(6, winline())
104 normal j
105 call assert_equal(8, winline())
106 normal j
107 call assert_equal(9, winline())
108
109 wincmd w
110 normal gg
111 call assert_equal(1, winline())
112 normal j
113 call assert_equal(2, winline())
114 normal j
115 call assert_equal(4, winline())
116 normal j
117 call assert_equal(5, winline())
118 normal j
119 call assert_equal(8, winline())
120
121 wincmd w
122 normal gg
123 call assert_equal(2, winline())
124 normal j
125 call assert_equal(3, winline())
126 normal j
127 call assert_equal(4, winline())
128 normal j
129 call assert_equal(5, winline())
130 normal j
131 call assert_equal(6, winline())
132 normal j
133 call assert_equal(7, winline())
134 normal j
135 call assert_equal(8, winline())
136
137 " Test diffoff
138 diffoff!
139 1wincmd 2
140 let &diff = 1
141 let &fdm = diff_fdm
142 let &fdc = diff_fdc
143 4wincmd w
144 diffoff!
145 1wincmd w
146 call assert_equal(0, &diff)
147 call assert_equal('marker', &foldmethod)
148 call assert_equal(4, &foldcolumn)
149 call assert_equal(0, &scrollbind)
150 call assert_equal(0, &cursorbind)
151 call assert_equal(1, &wrap)
152
153 wincmd w
154 call assert_equal(0, &diff)
155 call assert_equal('marker', &foldmethod)
156 call assert_equal(4, &foldcolumn)
157 call assert_equal(0, &scrollbind)
158 call assert_equal(0, &cursorbind)
159 call assert_equal(1, &wrap)
160
161 wincmd w
162 call assert_equal(0, &diff)
163 call assert_equal('marker', &foldmethod)
164 call assert_equal(4, &foldcolumn)
165 call assert_equal(0, &scrollbind)
166 call assert_equal(0, &cursorbind)
167 call assert_equal(1, &wrap)
168
Bram Moolenaar623cf882016-07-30 16:36:01 +0200169 call delete('Xtest')
170 call delete('Xtest2')
Bram Moolenaar42093c02016-07-30 16:16:54 +0200171 windo bw!
172endfunc
173
174func Test_filler_lines()
175 " Test that diffing shows correct filler lines
176 enew!
177 put =range(4,10)
178 1d _
179 vnew
180 put =range(1,10)
181 1d _
182 windo diffthis
183 wincmd h
184 call assert_equal(1, line('w0'))
185 unlet! diff_fdm diff_fdc
Bram Moolenaar90d121f2016-07-30 19:11:25 +0200186 windo diffoff
187 bwipe!
188 enew!
189endfunc
Bram Moolenaar42093c02016-07-30 16:16:54 +0200190
Bram Moolenaar90d121f2016-07-30 19:11:25 +0200191func Test_diffget_diffput()
192 enew!
193 let l = range(50)
194 call setline(1, l)
195 call assert_fails('diffget', 'E99:')
196 diffthis
197 call assert_fails('diffget', 'E100:')
198 new
199 let l[10] = 'one'
200 let l[20] = 'two'
201 let l[30] = 'three'
202 let l[40] = 'four'
203 call setline(1, l)
204 diffthis
205 call assert_equal('one', getline(11))
206 11diffget
207 call assert_equal('10', getline(11))
208 21diffput
209 wincmd w
210 call assert_equal('two', getline(21))
211 normal 31Gdo
212 call assert_equal('three', getline(31))
213 call assert_equal('40', getline(41))
214 normal 41Gdp
215 wincmd w
216 call assert_equal('40', getline(41))
217 new
218 diffthis
219 call assert_fails('diffget', 'E101:')
220
221 windo diffoff
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200222 %bwipe!
223endfunc
224
Bram Moolenaar5f57bdc2018-10-25 17:52:23 +0200225" Test putting two changes from one buffer to another
226func Test_diffput_two()
227 new a
228 let win_a = win_getid()
229 call setline(1, range(1, 10))
230 diffthis
231 new b
232 let win_b = win_getid()
233 call setline(1, range(1, 10))
234 8del
235 5del
236 diffthis
237 call win_gotoid(win_a)
238 %diffput
239 call win_gotoid(win_b)
240 call assert_equal(map(range(1, 10), 'string(v:val)'), getline(1, '$'))
241 bwipe! a
242 bwipe! b
243endfunc
244
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100245func Test_diffget_diffput_completion()
246 new Xdiff1 | diffthis
247 new Xdiff2 | diffthis
248 new Xdiff3 | diffthis
249 new Xdiff4
250
251 " :diffput and :diffget completes names of buffers which
252 " are in diff mode and which are different then current buffer.
253 b Xdiff1
254 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
255 call assert_equal('"diffput Xdiff2 Xdiff3', @:)
256 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
257 call assert_equal('"diffget Xdiff2 Xdiff3', @:)
258 call assert_equal(['Xdiff2', 'Xdiff3'], getcompletion('', 'diff_buffer'))
259
260 b Xdiff2
261 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
262 call assert_equal('"diffput Xdiff1 Xdiff3', @:)
263 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
264 call assert_equal('"diffget Xdiff1 Xdiff3', @:)
265 call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))
266
267 b Xdiff3
268 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
269 call assert_equal('"diffput Xdiff1 Xdiff2', @:)
270 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
271 call assert_equal('"diffget Xdiff1 Xdiff2', @:)
272 call assert_equal(['Xdiff1', 'Xdiff2'], getcompletion('', 'diff_buffer'))
273
274 " No completion when in Xdiff4, it's not in diff mode.
275 b Xdiff4
276 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
277 call assert_equal('"diffput ', @:)
278 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
279 call assert_equal('"diffget ', @:)
280 call assert_equal([], getcompletion('', 'diff_buffer'))
281
282 %bwipe
283endfunc
284
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200285func Test_dp_do_buffer()
286 e! one
287 let bn1=bufnr('%')
288 let l = range(60)
289 call setline(1, l)
290 diffthis
291
292 new two
293 let l[10] = 'one'
294 let l[20] = 'two'
295 let l[30] = 'three'
296 let l[40] = 'four'
297 let l[50] = 'five'
298 call setline(1, l)
299 diffthis
300
301 " dp and do with invalid buffer number.
302 11
303 call assert_fails('norm 99999dp', 'E102:')
304 call assert_fails('norm 99999do', 'E102:')
305 call assert_fails('diffput non_existing_buffer', 'E94:')
306 call assert_fails('diffget non_existing_buffer', 'E94:')
307
308 " dp and do with valid buffer number.
309 call assert_equal('one', getline('.'))
310 exe 'norm ' . bn1 . 'do'
311 call assert_equal('10', getline('.'))
312 21
313 call assert_equal('two', getline('.'))
314 diffget one
315 call assert_equal('20', getline('.'))
316
317 31
318 exe 'norm ' . bn1 . 'dp'
319 41
320 diffput one
321 wincmd w
322 31
323 call assert_equal('three', getline('.'))
324 41
325 call assert_equal('four', getline('.'))
326
327 " dp and do with buffer number which is not in diff mode.
328 new not_in_diff_mode
329 let bn3=bufnr('%')
330 wincmd w
331 51
332 call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
333 call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
334 call assert_fails('diffput not_in_diff_mode', 'E94:')
335 call assert_fails('diffget not_in_diff_mode', 'E94:')
336
337 windo diffoff
338 %bwipe!
Bram Moolenaar42093c02016-07-30 16:16:54 +0200339endfunc
Bram Moolenaare67d5462016-08-27 22:40:42 +0200340
Bram Moolenaardf77cef2018-10-07 17:46:42 +0200341func Test_do_lastline()
342 e! one
343 call setline(1, ['1','2','3','4','5','6'])
344 diffthis
345
346 new two
347 call setline(1, ['2','4','5'])
348 diffthis
349
350 1
351 norm dp]c
352 norm dp]c
353 wincmd w
354 call assert_equal(4, line('$'))
355 norm G
356 norm do
357 call assert_equal(3, line('$'))
358
359 windo diffoff
360 %bwipe!
361endfunc
362
Bram Moolenaare67d5462016-08-27 22:40:42 +0200363func Test_diffoff()
364 enew!
365 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200366 redraw
Bram Moolenaare67d5462016-08-27 22:40:42 +0200367 let normattr = screenattr(1, 1)
368 diffthis
369 botright vert new
370 call setline(1, ['One', '', 'Two', 'Three'])
371 diffthis
372 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +0200373 call assert_notequal(normattr, 1->screenattr(1))
Bram Moolenaare67d5462016-08-27 22:40:42 +0200374 diffoff!
375 redraw
376 call assert_equal(normattr, screenattr(1, 1))
377 bwipe!
378 bwipe!
379endfunc
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200380
Bram Moolenaare828b762018-09-10 17:51:58 +0200381func Common_icase_test()
382 edit one
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200383 call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200384 redraw
385 let normattr = screenattr(1, 1)
386 diffthis
387
388 botright vert new two
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200389 call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200390 diffthis
391
392 redraw
393 call assert_equal(normattr, screenattr(1, 1))
394 call assert_equal(normattr, screenattr(2, 1))
395 call assert_notequal(normattr, screenattr(3, 1))
396 call assert_equal(normattr, screenattr(4, 1))
397
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200398 let dtextattr = screenattr(5, 3)
399 call assert_notequal(dtextattr, screenattr(5, 1))
400 call assert_notequal(dtextattr, screenattr(5, 5))
401
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200402 diffoff!
403 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200404endfunc
405
406func Test_diffopt_icase()
407 set diffopt=icase,foldcolumn:0
408 call Common_icase_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200409 set diffopt&
410endfunc
411
Bram Moolenaare828b762018-09-10 17:51:58 +0200412func Test_diffopt_icase_internal()
413 set diffopt=icase,foldcolumn:0,internal
414 call Common_icase_test()
415 set diffopt&
416endfunc
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200417
Bram Moolenaare828b762018-09-10 17:51:58 +0200418func Common_iwhite_test()
419 edit one
420 " Difference in trailing spaces and amount of spaces should be ignored,
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200421 " but not other space differences.
Bram Moolenaare828b762018-09-10 17:51:58 +0200422 call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200423 redraw
424 let normattr = screenattr(1, 1)
425 diffthis
426
427 botright vert new two
Bram Moolenaare828b762018-09-10 17:51:58 +0200428 call setline(1, ["One\t ", "Two\t ", 'Three', 'one two', 'onetwo', ' Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200429 diffthis
430
431 redraw
432 call assert_equal(normattr, screenattr(1, 1))
433 call assert_equal(normattr, screenattr(2, 1))
434 call assert_equal(normattr, screenattr(3, 1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200435 call assert_equal(normattr, screenattr(4, 1))
436 call assert_notequal(normattr, screenattr(5, 1))
437 call assert_notequal(normattr, screenattr(6, 1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200438
439 diffoff!
440 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200441endfunc
442
443func Test_diffopt_iwhite()
444 set diffopt=iwhite,foldcolumn:0
445 call Common_iwhite_test()
446 set diffopt&
447endfunc
448
449func Test_diffopt_iwhite_internal()
450 set diffopt=internal,iwhite,foldcolumn:0
451 call Common_iwhite_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200452 set diffopt&
453endfunc
454
455func Test_diffopt_context()
456 enew!
457 call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
458 diffthis
459 new
460 call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
461 diffthis
462
463 set diffopt=context:2
464 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200465 set diffopt=internal,context:2
466 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
467
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200468 set diffopt=context:1
469 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200470 set diffopt=internal,context:1
471 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200472
473 diffoff!
474 %bwipe!
475 set diffopt&
476endfunc
477
478func Test_diffopt_horizontal()
Bram Moolenaare828b762018-09-10 17:51:58 +0200479 set diffopt=internal,horizontal
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200480 diffsplit
481
482 call assert_equal(&columns, winwidth(1))
483 call assert_equal(&columns, winwidth(2))
484 call assert_equal(&lines, winheight(1) + winheight(2) + 3)
485 call assert_inrange(0, 1, winheight(1) - winheight(2))
486
487 set diffopt&
488 diffoff!
489 %bwipe
490endfunc
491
492func Test_diffopt_vertical()
Bram Moolenaare828b762018-09-10 17:51:58 +0200493 set diffopt=internal,vertical
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200494 diffsplit
495
496 call assert_equal(&lines - 2, winheight(1))
497 call assert_equal(&lines - 2, winheight(2))
498 call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
499 call assert_inrange(0, 1, winwidth(1) - winwidth(2))
500
501 set diffopt&
502 diffoff!
503 %bwipe
504endfunc
505
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100506func Test_diffopt_hiddenoff()
Bram Moolenaare828b762018-09-10 17:51:58 +0200507 set diffopt=internal,filler,foldcolumn:0,hiddenoff
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100508 e! one
509 call setline(1, ['Two', 'Three'])
510 redraw
511 let normattr = screenattr(1, 1)
512 diffthis
513 botright vert new two
514 call setline(1, ['One', 'Four'])
515 diffthis
516 redraw
517 call assert_notequal(normattr, screenattr(1, 1))
518 set hidden
519 close
520 redraw
521 " should not diffing with hidden buffer two while 'hiddenoff' is enabled
522 call assert_equal(normattr, screenattr(1, 1))
523
524 bwipe!
525 bwipe!
526 set hidden& diffopt&
527endfunc
528
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100529func Test_diffoff_hidden()
Bram Moolenaare828b762018-09-10 17:51:58 +0200530 set diffopt=internal,filler,foldcolumn:0
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100531 e! one
532 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200533 redraw
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100534 let normattr = screenattr(1, 1)
535 diffthis
536 botright vert new two
537 call setline(1, ['One', 'Four'])
538 diffthis
539 redraw
540 call assert_notequal(normattr, screenattr(1, 1))
541 set hidden
542 close
543 redraw
544 " diffing with hidden buffer two
545 call assert_notequal(normattr, screenattr(1, 1))
546 diffoff
547 redraw
548 call assert_equal(normattr, screenattr(1, 1))
549 diffthis
550 redraw
551 " still diffing with hidden buffer two
552 call assert_notequal(normattr, screenattr(1, 1))
553 diffoff!
554 redraw
555 call assert_equal(normattr, screenattr(1, 1))
556 diffthis
557 redraw
558 " no longer diffing with hidden buffer two
559 call assert_equal(normattr, screenattr(1, 1))
560
561 bwipe!
562 bwipe!
563 set hidden& diffopt&
564endfunc
565
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200566func Test_setting_cursor()
567 new Xtest1
568 put =range(1,90)
569 wq
570 new Xtest2
571 put =range(1,100)
572 wq
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200573
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200574 tabe Xtest2
575 $
576 diffsp Xtest1
577 tabclose
578
579 call delete('Xtest1')
580 call delete('Xtest2')
581endfunc
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100582
583func Test_diff_move_to()
584 new
585 call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
586 diffthis
587 vnew
588 call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
589 diffthis
590 norm ]c
591 call assert_equal(2, line('.'))
592 norm 3]c
593 call assert_equal(9, line('.'))
594 norm 10]c
595 call assert_equal(11, line('.'))
596 norm [c
597 call assert_equal(9, line('.'))
598 norm 2[c
599 call assert_equal(5, line('.'))
600 norm 10[c
601 call assert_equal(2, line('.'))
602 %bwipe!
603endfunc
604
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200605func Test_diffexpr()
606 if !executable('diff')
607 return
608 endif
609
610 func DiffExpr()
Bram Moolenaar3b8defd2018-09-13 13:03:11 +0200611 " Prepent some text to check diff type detection
612 call writefile(['warning', ' message'], v:fname_out)
613 silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200614 endfunc
615 set diffexpr=DiffExpr()
616 set diffopt=foldcolumn:0
617
618 enew!
619 call setline(1, ['one', 'two', 'three'])
620 redraw
621 let normattr = screenattr(1, 1)
622 diffthis
623
624 botright vert new
625 call setline(1, ['one', 'two', 'three.'])
626 diffthis
627
628 redraw
629 call assert_equal(normattr, screenattr(1, 1))
630 call assert_equal(normattr, screenattr(2, 1))
631 call assert_notequal(normattr, screenattr(3, 1))
632
633 diffoff!
634 %bwipe!
635 set diffexpr& diffopt&
636endfunc
637
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100638func Test_diffpatch()
639 " The patch program on MS-Windows may fail or hang.
640 if !executable('patch') || !has('unix')
641 return
642 endif
643 new
644 insert
645***************
646*** 1,3 ****
647 1
648! 2
649 3
650--- 1,4 ----
651 1
652! 2x
653 3
654+ 4
655.
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200656 saveas! Xpatch
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100657 bwipe!
658 new
659 call assert_fails('diffpatch Xpatch', 'E816:')
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100660
Bram Moolenaara95ab322017-03-11 19:21:53 +0100661 for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100662 call setline(1, ['1', '2', '3'])
663 if name != 'Xpatch'
664 call rename('Xpatch', name)
665 endif
666 exe 'diffpatch ' . escape(name, '$')
667 call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
668 if name != 'Xpatch'
669 call rename(name, 'Xpatch')
670 endif
671 bwipe!
672 endfor
673
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100674 call delete('Xpatch')
675 bwipe!
676endfunc
677
678func Test_diff_too_many_buffers()
679 for i in range(1, 8)
680 exe "new Xtest" . i
681 diffthis
682 endfor
683 new Xtest9
684 call assert_fails('diffthis', 'E96:')
685 %bwipe!
686endfunc
687
688func Test_diff_nomodifiable()
689 new
690 call setline(1, [1, 2, 3, 4])
691 setl nomodifiable
692 diffthis
693 vnew
694 call setline(1, ['1x', 2, 3, 3, 4])
695 diffthis
696 call assert_fails('norm dp', 'E793:')
697 setl nomodifiable
698 call assert_fails('norm do', 'E21:')
699 %bwipe!
700endfunc
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100701
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200702func Test_diff_hlID()
703 new
704 call setline(1, [1, 2, 3])
705 diffthis
706 vnew
707 call setline(1, ['1x', 2, 'x', 3])
708 diffthis
709 redraw
710
Bram Moolenaara74e4942019-08-04 17:35:53 +0200711 call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200712
Bram Moolenaara74e4942019-08-04 17:35:53 +0200713 call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange")
714 call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText")
715 call diff_hlID(2, 1)->synIDattr("name")->assert_equal("")
716 call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd")
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200717 eval 4->diff_hlID(1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200718
719 wincmd w
720 call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange")
721 call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "")
722 call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "")
723
724 %bwipe!
725endfunc
726
727func Test_diff_filler()
728 new
729 call setline(1, [1, 2, 3, 'x', 4])
730 diffthis
731 vnew
732 call setline(1, [1, 2, 'y', 'y', 3, 4])
733 diffthis
734 redraw
735
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200736 call assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0], map(range(-1, 7), 'v:val->diff_filler()'))
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200737 wincmd w
738 call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
739
740 %bwipe!
741endfunc
742
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100743func Test_diff_lastline()
744 enew!
745 only!
746 call setline(1, ['This is a ', 'line with five ', 'rows'])
747 diffthis
748 botright vert new
749 call setline(1, ['This is', 'a line with ', 'four rows'])
750 diffthis
751 1
752 call feedkeys("Je a\<CR>", 'tx')
753 call feedkeys("Je a\<CR>", 'tx')
754 let w1lines = winline()
755 wincmd w
756 $
757 let w2lines = winline()
758 call assert_equal(w2lines, w1lines)
759 bwipe!
760 bwipe!
761endfunc
Bram Moolenaare828b762018-09-10 17:51:58 +0200762
Bram Moolenaar785fc652018-09-15 19:17:38 +0200763func WriteDiffFiles(buf, list1, list2)
Bram Moolenaare828b762018-09-10 17:51:58 +0200764 call writefile(a:list1, 'Xfile1')
765 call writefile(a:list2, 'Xfile2')
Bram Moolenaar785fc652018-09-15 19:17:38 +0200766 if a:buf
767 call term_sendkeys(a:buf, ":checktime\<CR>")
768 endif
Bram Moolenaare828b762018-09-10 17:51:58 +0200769endfunc
770
Bram Moolenaar785fc652018-09-15 19:17:38 +0200771" Verify a screendump with both the internal and external diff.
Bram Moolenaare828b762018-09-10 17:51:58 +0200772func VerifyBoth(buf, dumpfile, extra)
Bram Moolenaare828b762018-09-10 17:51:58 +0200773 " trailing : for leaving the cursor on the command line
Bram Moolenaar785fc652018-09-15 19:17:38 +0200774 for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"]
Bram Moolenaare828b762018-09-10 17:51:58 +0200775 call term_sendkeys(a:buf, cmd)
776 if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external')
777 break " don't let the next iteration overwrite the "failed" file.
778 endif
779 endfor
780endfunc
781
Bram Moolenaar785fc652018-09-15 19:17:38 +0200782" Verify a screendump with the internal diff only.
783func VerifyInternal(buf, dumpfile, extra)
784 call term_sendkeys(a:buf, ":diffupdate!\<CR>")
785 " trailing : for leaving the cursor on the command line
786 call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:")
Bram Moolenaar37d9f172019-07-14 17:26:46 +0200787 call term_wait(a:buf)
Bram Moolenaar785fc652018-09-15 19:17:38 +0200788 call VerifyScreenDump(a:buf, a:dumpfile, {})
789endfunc
790
Bram Moolenaare828b762018-09-10 17:51:58 +0200791func Test_diff_screen()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200792 CheckScreendump
793 CheckFeature menu
794
Bram Moolenaare828b762018-09-10 17:51:58 +0200795 " clean up already existing swap files, just in case
796 call delete('.Xfile1.swp')
797 call delete('.Xfile2.swp')
798
799 " Test 1: Add a line in beginning of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200800 call WriteDiffFiles(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Bram Moolenaare828b762018-09-10 17:51:58 +0200801 let buf = RunVimInTerminal('-d Xfile1 Xfile2', {})
Bram Moolenaar8ee4c012019-03-29 18:08:18 +0100802 " Set autoread mode, so that Vim won't complain once we re-write the test
Bram Moolenaare828b762018-09-10 17:51:58 +0200803 " files
Bram Moolenaar785fc652018-09-15 19:17:38 +0200804 call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
Bram Moolenaare828b762018-09-10 17:51:58 +0200805
806 call VerifyBoth(buf, 'Test_diff_01', '')
807
808 " Test 2: Add a line in beginning of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200809 call WriteDiffFiles(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Bram Moolenaare828b762018-09-10 17:51:58 +0200810 call VerifyBoth(buf, 'Test_diff_02', '')
811
812 " Test 3: Add a line at the end of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200813 call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Bram Moolenaare828b762018-09-10 17:51:58 +0200814 call VerifyBoth(buf, 'Test_diff_03', '')
815
816 " Test 4: Add a line at the end of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200817 call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Bram Moolenaare828b762018-09-10 17:51:58 +0200818 call VerifyBoth(buf, 'Test_diff_04', '')
819
820 " Test 5: Add a line in the middle of file 2, remove on at the end of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200821 call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10])
Bram Moolenaare828b762018-09-10 17:51:58 +0200822 call VerifyBoth(buf, 'Test_diff_05', '')
823
824 " Test 6: Add a line in the middle of file 1, remove on at the end of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200825 call WriteDiffFiles(buf, [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Bram Moolenaare828b762018-09-10 17:51:58 +0200826 call VerifyBoth(buf, 'Test_diff_06', '')
827
Bram Moolenaarb9ddda62019-02-19 23:00:50 +0100828 " Variants on test 6 with different context settings
829 call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
830 call VerifyScreenDump(buf, 'Test_diff_06.2', {})
831 call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
832 call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
833 call VerifyScreenDump(buf, 'Test_diff_06.1', {})
834 call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
835 call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
836 call VerifyScreenDump(buf, 'Test_diff_06.0', {})
837 call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
838
Bram Moolenaare828b762018-09-10 17:51:58 +0200839 " Test 7 - 9: Test normal/patience/histogram diff algorithm
Bram Moolenaar785fc652018-09-15 19:17:38 +0200840 call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
Bram Moolenaare828b762018-09-10 17:51:58 +0200841 \ ' int i;', ' for(i = 0; i < 10; i++)', ' {', ' printf("Your answer is: ");',
842 \ ' printf("%d\n", foo);', ' }', '}', '', 'int fact(int n)', '{', ' if(n > 1)', ' {',
843 \ ' return fact(n-1) * n;', ' }', ' return 1;', '}', '', 'int main(int argc, char **argv)',
844 \ '{', ' frobnitz(fact(10));', '}'],
845 \ ['#include <stdio.h>', '', 'int fib(int n)', '{', ' if(n > 2)', ' {',
846 \ ' return fib(n-1) + fib(n-2);', ' }', ' return 1;', '}', '', '// Frobs foo heartily',
847 \ 'int frobnitz(int foo)', '{', ' int i;', ' for(i = 0; i < 10; i++)', ' {',
848 \ ' printf("%d\n", foo);', ' }', '}', '',
849 \ 'int main(int argc, char **argv)', '{', ' frobnitz(fib(10));', '}'])
850 call term_sendkeys(buf, ":diffupdate!\<cr>")
851 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
852 call VerifyScreenDump(buf, 'Test_diff_07', {})
853
854 call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
855 call VerifyScreenDump(buf, 'Test_diff_08', {})
856
857 call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
858 call VerifyScreenDump(buf, 'Test_diff_09', {})
859
860 " Test 10-11: normal/indent-heuristic
861 call term_sendkeys(buf, ":set diffopt&vim\<cr>")
Bram Moolenaar785fc652018-09-15 19:17:38 +0200862 call WriteDiffFiles(buf, ['', ' def finalize(values)', '', ' values.each do |v|', ' v.finalize', ' end'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200863 \ ['', ' def finalize(values)', '', ' values.each do |v|', ' v.prepare', ' end', '',
864 \ ' values.each do |v|', ' v.finalize', ' end'])
865 call term_sendkeys(buf, ":diffupdate!\<cr>")
866 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
867 call VerifyScreenDump(buf, 'Test_diff_10', {})
868
Bram Moolenaarb6fc7282018-12-04 22:24:16 +0100869 " Leave trailing : at commandline!
870 call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
871 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
872 " shouldn't matter, if indent-algorithm comes before or after the algorithm
873 call term_sendkeys(buf, ":set diffopt&\<cr>")
874 call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
875 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
876 call term_sendkeys(buf, ":set diffopt&\<cr>")
877 call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
878 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
Bram Moolenaare828b762018-09-10 17:51:58 +0200879
880 " Test 12: diff the same file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200881 call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Bram Moolenaare828b762018-09-10 17:51:58 +0200882 call VerifyBoth(buf, 'Test_diff_12', '')
883
884 " Test 13: diff an empty file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200885 call WriteDiffFiles(buf, [], [])
Bram Moolenaare828b762018-09-10 17:51:58 +0200886 call VerifyBoth(buf, 'Test_diff_13', '')
887
888 " Test 14: test diffopt+=icase
Bram Moolenaar785fc652018-09-15 19:17:38 +0200889 call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
Bram Moolenaare828b762018-09-10 17:51:58 +0200890 call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
891
892 " Test 15-16: test diffopt+=iwhite
Bram Moolenaar785fc652018-09-15 19:17:38 +0200893 call WriteDiffFiles(buf, ['int main()', '{', ' printf("Hello, World!");', ' return 0;', '}'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200894 \ ['int main()', '{', ' if (0)', ' {', ' printf("Hello, World!");', ' return 0;', ' }', '}'])
895 call term_sendkeys(buf, ":diffupdate!\<cr>")
896 call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
897 call VerifyScreenDump(buf, 'Test_diff_15', {})
898 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
899 call VerifyScreenDump(buf, 'Test_diff_16', {})
900
Bram Moolenaar785fc652018-09-15 19:17:38 +0200901 " Test 17: test diffopt+=iblank
902 call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
903 call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
904
905 " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
906 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
907 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
908 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
909
910 " Test 19: test diffopt+=iwhiteeol
911 call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
912 call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
913
914 " Test 19: test diffopt+=iwhiteall
915 call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
916
Bram Moolenaare828b762018-09-10 17:51:58 +0200917 " clean up
918 call StopVimInTerminal(buf)
919 call delete('Xfile1')
920 call delete('Xfile2')
921endfunc
922
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +0200923func Test_diff_with_cursorline()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200924 CheckScreendump
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +0200925
926 call writefile([
927 \ 'hi CursorLine ctermbg=red ctermfg=white',
928 \ 'set cursorline',
929 \ 'call setline(1, ["foo","foo","foo","bar"])',
930 \ 'vnew',
931 \ 'call setline(1, ["bee","foo","foo","baz"])',
932 \ 'windo diffthis',
933 \ '2wincmd w',
934 \ ], 'Xtest_diff_cursorline')
935 let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
936
937 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
938 call term_sendkeys(buf, "j")
939 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
940 call term_sendkeys(buf, "j")
941 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
942
943 " clean up
944 call StopVimInTerminal(buf)
945 call delete('Xtest_diff_cursorline')
946endfunc
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +0100947
Bram Moolenaar248fdb32019-09-15 19:31:28 +0200948func Test_diff_with_syntax()
949 CheckScreendump
950
951 let lines =<< trim END
952 void doNothing() {
953 int x = 0;
954 char *s = "hello";
955 return 5;
956 }
957 END
958 call writefile(lines, 'Xprogram1.c')
959 let lines =<< trim END
960 void doSomething() {
961 int x = 0;
962 char *s = "there";
963 return 5;
964 }
965 END
966 call writefile(lines, 'Xprogram2.c')
967
968 let lines =<< trim END
969 edit Xprogram1.c
970 diffsplit Xprogram2.c
971 END
972 call writefile(lines, 'Xtest_diff_syntax')
973 let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
974
975 call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
976
977 " clean up
978 call StopVimInTerminal(buf)
979 call delete('Xtest_diff_syntax')
980 call delete('Xprogram1.c')
981 call delete('Xprogram2.c')
982endfunc
983
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +0100984func Test_diff_of_diff()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200985 CheckScreendump
986 CheckFeature rightleft
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +0100987
988 call writefile([
989 \ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
990 \ 'vnew',
991 \ 'call setline(1, ["aa","bb","cc"])',
992 \ 'windo diffthis',
Bram Moolenaar8ee4c012019-03-29 18:08:18 +0100993 \ '1wincmd w',
994 \ 'setlocal number',
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +0100995 \ ], 'Xtest_diff_diff')
996 let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
997
998 call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
999
Bram Moolenaare73f9112019-03-29 18:29:54 +01001000 call term_sendkeys(buf, ":set rightleft\<cr>")
1001 call VerifyScreenDump(buf, 'Test_diff_of_diff_02', {})
1002
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001003 " clean up
1004 call StopVimInTerminal(buf)
1005 call delete('Xtest_diff_diff')
1006endfunc
Bram Moolenaarc8234772019-11-10 21:00:27 +01001007
1008func CloseoffSetup()
1009 enew
1010 call setline(1, ['one', 'two', 'three'])
1011 diffthis
1012 new
1013 call setline(1, ['one', 'tow', 'three'])
1014 diffthis
1015 call assert_equal(1, &diff)
1016 only!
1017endfunc
1018
1019func Test_diff_closeoff()
1020 " "closeoff" included by default: last diff win gets 'diff' reset'
1021 call CloseoffSetup()
1022 call assert_equal(0, &diff)
1023 enew!
1024
1025 " "closeoff" excluded: last diff win keeps 'diff' set'
1026 set diffopt-=closeoff
1027 call CloseoffSetup()
1028 call assert_equal(1, &diff)
1029 diffoff!
1030 enew!
1031endfunc
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01001032
1033func Test_diff_maintains_change_mark()
1034 enew!
1035 call setline(1, ['a', 'b', 'c', 'd'])
1036 diffthis
1037 new
1038 call setline(1, ['a', 'b', 'c', 'e'])
1039 " Set '[ and '] marks
1040 2,3yank
1041 call assert_equal([2, 3], [line("'["), line("']")])
1042 " Verify they aren't affected by the implicit diff
1043 diffthis
1044 call assert_equal([2, 3], [line("'["), line("']")])
1045 " Verify they aren't affected by an explicit diff
1046 diffupdate
1047 call assert_equal([2, 3], [line("'["), line("']")])
1048 bwipe!
1049 bwipe!
1050endfunc