blob: e47928df881333459f36fb92a14c470065354d33 [file] [log] [blame]
Bram Moolenaar42093c02016-07-30 16:16:54 +02001" Tests for diff mode
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +02002
Bram Moolenaare828b762018-09-10 17:51:58 +02003source shared.vim
4source screendump.vim
Bram Moolenaar3c8ee622019-08-03 22:55:50 +02005source check.vim
Bram Moolenaar42093c02016-07-30 16:16:54 +02006
7func Test_diff_fold_sync()
8 enew!
Bram Moolenaare8fa05b2018-09-16 15:48:06 +02009 let g:update_count = 0
10 au DiffUpdated * let g:update_count += 1
11
Bram Moolenaar42093c02016-07-30 16:16:54 +020012 let l = range(50)
13 call setline(1, l)
14 diffthis
15 let winone = win_getid()
16 new
17 let l[25] = 'diff'
18 call setline(1, l)
19 diffthis
20 let wintwo = win_getid()
21 " line 15 is inside the closed fold
22 call assert_equal(19, foldclosedend(10))
23 call win_gotoid(winone)
24 call assert_equal(19, foldclosedend(10))
25 " open the fold
26 normal zv
27 call assert_equal(-1, foldclosedend(10))
28 " fold in other window must have opened too
29 call win_gotoid(wintwo)
30 call assert_equal(-1, foldclosedend(10))
31
32 " cursor position is in sync
33 normal 23G
34 call win_gotoid(winone)
35 call assert_equal(23, getcurpos()[1])
36
Bram Moolenaare8fa05b2018-09-16 15:48:06 +020037 call assert_equal(1, g:update_count)
38 au! DiffUpdated
39
Bram Moolenaar42093c02016-07-30 16:16:54 +020040 windo diffoff
41 close!
42 set nomodified
43endfunc
44
45func Test_vert_split()
Bram Moolenaare828b762018-09-10 17:51:58 +020046 set diffopt=filler
47 call Common_vert_split()
48 set diffopt&
49endfunc
50
51func Test_vert_split_internal()
52 set diffopt=internal,filler
53 call Common_vert_split()
54 set diffopt&
55endfunc
56
57func Common_vert_split()
Bram Moolenaar42093c02016-07-30 16:16:54 +020058 " Disable the title to avoid xterm keeping the wrong one.
59 set notitle noicon
60 new
61 let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
62 call setline(1, l)
63 w! Xtest
64 normal dd
65 $
66 put
67 normal kkrXoxxx
68 w! Xtest2
69 file Nop
70 normal ggoyyyjjjozzzz
71 set foldmethod=marker foldcolumn=4
72 call assert_equal(0, &diff)
73 call assert_equal('marker', &foldmethod)
74 call assert_equal(4, &foldcolumn)
75 call assert_equal(0, &scrollbind)
76 call assert_equal(0, &cursorbind)
77 call assert_equal(1, &wrap)
78
79 vert diffsplit Xtest
80 vert diffsplit Xtest2
81 call assert_equal(1, &diff)
82 call assert_equal('diff', &foldmethod)
83 call assert_equal(2, &foldcolumn)
84 call assert_equal(1, &scrollbind)
85 call assert_equal(1, &cursorbind)
86 call assert_equal(0, &wrap)
87
88 let diff_fdm = &fdm
89 let diff_fdc = &fdc
90 " repeat entering diff mode here to see if this saves the wrong settings
91 diffthis
92 " jump to second window for a moment to have filler line appear at start of
93 " first window
94 wincmd w
95 normal gg
96 wincmd p
97 normal gg
98 call assert_equal(2, winline())
99 normal j
100 call assert_equal(4, winline())
101 normal j
102 call assert_equal(5, winline())
103 normal j
104 call assert_equal(6, winline())
105 normal j
106 call assert_equal(8, winline())
107 normal j
108 call assert_equal(9, winline())
109
110 wincmd w
111 normal gg
112 call assert_equal(1, winline())
113 normal j
114 call assert_equal(2, winline())
115 normal j
116 call assert_equal(4, winline())
117 normal j
118 call assert_equal(5, winline())
119 normal j
120 call assert_equal(8, winline())
121
122 wincmd w
123 normal gg
124 call assert_equal(2, winline())
125 normal j
126 call assert_equal(3, winline())
127 normal j
128 call assert_equal(4, winline())
129 normal j
130 call assert_equal(5, winline())
131 normal j
132 call assert_equal(6, winline())
133 normal j
134 call assert_equal(7, winline())
135 normal j
136 call assert_equal(8, winline())
137
138 " Test diffoff
139 diffoff!
140 1wincmd 2
141 let &diff = 1
142 let &fdm = diff_fdm
143 let &fdc = diff_fdc
144 4wincmd w
145 diffoff!
146 1wincmd w
147 call assert_equal(0, &diff)
148 call assert_equal('marker', &foldmethod)
149 call assert_equal(4, &foldcolumn)
150 call assert_equal(0, &scrollbind)
151 call assert_equal(0, &cursorbind)
152 call assert_equal(1, &wrap)
153
154 wincmd w
155 call assert_equal(0, &diff)
156 call assert_equal('marker', &foldmethod)
157 call assert_equal(4, &foldcolumn)
158 call assert_equal(0, &scrollbind)
159 call assert_equal(0, &cursorbind)
160 call assert_equal(1, &wrap)
161
162 wincmd w
163 call assert_equal(0, &diff)
164 call assert_equal('marker', &foldmethod)
165 call assert_equal(4, &foldcolumn)
166 call assert_equal(0, &scrollbind)
167 call assert_equal(0, &cursorbind)
168 call assert_equal(1, &wrap)
169
Bram Moolenaar623cf882016-07-30 16:36:01 +0200170 call delete('Xtest')
171 call delete('Xtest2')
Bram Moolenaar42093c02016-07-30 16:16:54 +0200172 windo bw!
173endfunc
174
175func Test_filler_lines()
176 " Test that diffing shows correct filler lines
177 enew!
178 put =range(4,10)
179 1d _
180 vnew
181 put =range(1,10)
182 1d _
183 windo diffthis
184 wincmd h
185 call assert_equal(1, line('w0'))
186 unlet! diff_fdm diff_fdc
Bram Moolenaar90d121f2016-07-30 19:11:25 +0200187 windo diffoff
188 bwipe!
189 enew!
190endfunc
Bram Moolenaar42093c02016-07-30 16:16:54 +0200191
Bram Moolenaar90d121f2016-07-30 19:11:25 +0200192func Test_diffget_diffput()
193 enew!
194 let l = range(50)
195 call setline(1, l)
196 call assert_fails('diffget', 'E99:')
197 diffthis
198 call assert_fails('diffget', 'E100:')
199 new
200 let l[10] = 'one'
201 let l[20] = 'two'
202 let l[30] = 'three'
203 let l[40] = 'four'
204 call setline(1, l)
205 diffthis
206 call assert_equal('one', getline(11))
207 11diffget
208 call assert_equal('10', getline(11))
209 21diffput
210 wincmd w
211 call assert_equal('two', getline(21))
212 normal 31Gdo
213 call assert_equal('three', getline(31))
214 call assert_equal('40', getline(41))
215 normal 41Gdp
216 wincmd w
217 call assert_equal('40', getline(41))
218 new
219 diffthis
220 call assert_fails('diffget', 'E101:')
221
222 windo diffoff
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200223 %bwipe!
224endfunc
225
Bram Moolenaar5f57bdc2018-10-25 17:52:23 +0200226" Test putting two changes from one buffer to another
227func Test_diffput_two()
228 new a
229 let win_a = win_getid()
230 call setline(1, range(1, 10))
231 diffthis
232 new b
233 let win_b = win_getid()
234 call setline(1, range(1, 10))
235 8del
236 5del
237 diffthis
238 call win_gotoid(win_a)
239 %diffput
240 call win_gotoid(win_b)
241 call assert_equal(map(range(1, 10), 'string(v:val)'), getline(1, '$'))
242 bwipe! a
243 bwipe! b
244endfunc
245
Yegappan Lakshmanan30443242021-06-10 21:52:15 +0200246" Test for :diffget/:diffput with a range that is inside a diff chunk
247func Test_diffget_diffput_range()
248 call setline(1, range(1, 10))
249 new
250 call setline(1, range(11, 20))
251 windo diffthis
252 3,5diffget
253 call assert_equal(['13', '14', '15'], getline(3, 5))
254 call setline(1, range(1, 10))
255 4,8diffput
256 wincmd p
257 call assert_equal(['13', '4', '5', '6', '7', '8', '19'], getline(3, 9))
258 %bw!
259endfunc
260
261" Test for :diffget/:diffput with an empty buffer and a non-empty buffer
262func Test_diffget_diffput_empty_buffer()
263 %d _
264 new
265 call setline(1, 'one')
266 windo diffthis
267 diffget
268 call assert_equal(['one'], getline(1, '$'))
269 %d _
270 diffput
271 wincmd p
272 call assert_equal([''], getline(1, '$'))
273 %bw!
274endfunc
275
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100276" :diffput and :diffget completes names of buffers which
Dominique Pelle923dce22021-11-21 11:36:04 +0000277" are in diff mode and which are different than current buffer.
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100278" No completion when the current window is not in diff mode.
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100279func Test_diffget_diffput_completion()
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100280 e Xdiff1 | diffthis
281 botright new Xdiff2
282 botright new Xdiff3 | split | diffthis
283 botright new Xdiff4 | diffthis
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100284
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100285 wincmd t
286 call assert_equal('Xdiff1', bufname('%'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100287 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100288 call assert_equal('"diffput Xdiff3 Xdiff4', @:)
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100289 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100290 call assert_equal('"diffget Xdiff3 Xdiff4', @:)
291 call assert_equal(['Xdiff3', 'Xdiff4'], getcompletion('', 'diff_buffer'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100292
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100293 " Xdiff2 is not in diff mode, so no completion for :diffput, :diffget
294 wincmd j
295 call assert_equal('Xdiff2', bufname('%'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100296 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
297 call assert_equal('"diffput ', @:)
298 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
299 call assert_equal('"diffget ', @:)
300 call assert_equal([], getcompletion('', 'diff_buffer'))
301
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100302 " Xdiff3 is split in 2 windows, only the top one is in diff mode.
303 " So completion of :diffput :diffget only happens in the top window.
304 wincmd j
305 call assert_equal('Xdiff3', bufname('%'))
306 call assert_equal(1, &diff)
307 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
308 call assert_equal('"diffput Xdiff1 Xdiff4', @:)
309 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
310 call assert_equal('"diffget Xdiff1 Xdiff4', @:)
311 call assert_equal(['Xdiff1', 'Xdiff4'], getcompletion('', 'diff_buffer'))
312
313 wincmd j
314 call assert_equal('Xdiff3', bufname('%'))
315 call assert_equal(0, &diff)
316 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
317 call assert_equal('"diffput ', @:)
318 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
319 call assert_equal('"diffget ', @:)
320 call assert_equal([], getcompletion('', 'diff_buffer'))
321
322 wincmd j
323 call assert_equal('Xdiff4', bufname('%'))
324 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
325 call assert_equal('"diffput Xdiff1 Xdiff3', @:)
326 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
327 call assert_equal('"diffget Xdiff1 Xdiff3', @:)
328 call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))
329
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100330 %bwipe
331endfunc
332
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200333func Test_dp_do_buffer()
334 e! one
335 let bn1=bufnr('%')
336 let l = range(60)
337 call setline(1, l)
338 diffthis
339
340 new two
341 let l[10] = 'one'
342 let l[20] = 'two'
343 let l[30] = 'three'
344 let l[40] = 'four'
345 let l[50] = 'five'
346 call setline(1, l)
347 diffthis
348
349 " dp and do with invalid buffer number.
350 11
351 call assert_fails('norm 99999dp', 'E102:')
352 call assert_fails('norm 99999do', 'E102:')
353 call assert_fails('diffput non_existing_buffer', 'E94:')
354 call assert_fails('diffget non_existing_buffer', 'E94:')
355
356 " dp and do with valid buffer number.
357 call assert_equal('one', getline('.'))
358 exe 'norm ' . bn1 . 'do'
359 call assert_equal('10', getline('.'))
360 21
361 call assert_equal('two', getline('.'))
Yegappan Lakshmanan30443242021-06-10 21:52:15 +0200362 diffget one
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200363 call assert_equal('20', getline('.'))
364
365 31
366 exe 'norm ' . bn1 . 'dp'
367 41
368 diffput one
369 wincmd w
370 31
371 call assert_equal('three', getline('.'))
372 41
373 call assert_equal('four', getline('.'))
374
375 " dp and do with buffer number which is not in diff mode.
376 new not_in_diff_mode
377 let bn3=bufnr('%')
378 wincmd w
379 51
380 call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
381 call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
382 call assert_fails('diffput not_in_diff_mode', 'E94:')
383 call assert_fails('diffget not_in_diff_mode', 'E94:')
384
385 windo diffoff
386 %bwipe!
Bram Moolenaar42093c02016-07-30 16:16:54 +0200387endfunc
Bram Moolenaare67d5462016-08-27 22:40:42 +0200388
Bram Moolenaardf77cef2018-10-07 17:46:42 +0200389func Test_do_lastline()
390 e! one
391 call setline(1, ['1','2','3','4','5','6'])
392 diffthis
393
394 new two
395 call setline(1, ['2','4','5'])
396 diffthis
397
398 1
399 norm dp]c
400 norm dp]c
401 wincmd w
402 call assert_equal(4, line('$'))
403 norm G
404 norm do
405 call assert_equal(3, line('$'))
406
407 windo diffoff
408 %bwipe!
409endfunc
410
Bram Moolenaare67d5462016-08-27 22:40:42 +0200411func Test_diffoff()
412 enew!
413 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200414 redraw
Bram Moolenaare67d5462016-08-27 22:40:42 +0200415 let normattr = screenattr(1, 1)
416 diffthis
417 botright vert new
418 call setline(1, ['One', '', 'Two', 'Three'])
419 diffthis
420 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +0200421 call assert_notequal(normattr, 1->screenattr(1))
Bram Moolenaare67d5462016-08-27 22:40:42 +0200422 diffoff!
423 redraw
424 call assert_equal(normattr, screenattr(1, 1))
425 bwipe!
426 bwipe!
427endfunc
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200428
Bram Moolenaare828b762018-09-10 17:51:58 +0200429func Common_icase_test()
430 edit one
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200431 call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200432 redraw
433 let normattr = screenattr(1, 1)
434 diffthis
435
436 botright vert new two
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200437 call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200438 diffthis
439
440 redraw
441 call assert_equal(normattr, screenattr(1, 1))
442 call assert_equal(normattr, screenattr(2, 1))
443 call assert_notequal(normattr, screenattr(3, 1))
444 call assert_equal(normattr, screenattr(4, 1))
445
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200446 let dtextattr = screenattr(5, 3)
447 call assert_notequal(dtextattr, screenattr(5, 1))
448 call assert_notequal(dtextattr, screenattr(5, 5))
449
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200450 diffoff!
451 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200452endfunc
453
454func Test_diffopt_icase()
455 set diffopt=icase,foldcolumn:0
456 call Common_icase_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200457 set diffopt&
458endfunc
459
Bram Moolenaare828b762018-09-10 17:51:58 +0200460func Test_diffopt_icase_internal()
461 set diffopt=icase,foldcolumn:0,internal
462 call Common_icase_test()
463 set diffopt&
464endfunc
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200465
Bram Moolenaare828b762018-09-10 17:51:58 +0200466func Common_iwhite_test()
467 edit one
468 " Difference in trailing spaces and amount of spaces should be ignored,
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200469 " but not other space differences.
Bram Moolenaare828b762018-09-10 17:51:58 +0200470 call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200471 redraw
472 let normattr = screenattr(1, 1)
473 diffthis
474
475 botright vert new two
Bram Moolenaare828b762018-09-10 17:51:58 +0200476 call setline(1, ["One\t ", "Two\t ", 'Three', 'one two', 'onetwo', ' Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200477 diffthis
478
479 redraw
480 call assert_equal(normattr, screenattr(1, 1))
481 call assert_equal(normattr, screenattr(2, 1))
482 call assert_equal(normattr, screenattr(3, 1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200483 call assert_equal(normattr, screenattr(4, 1))
484 call assert_notequal(normattr, screenattr(5, 1))
485 call assert_notequal(normattr, screenattr(6, 1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200486
487 diffoff!
488 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200489endfunc
490
491func Test_diffopt_iwhite()
492 set diffopt=iwhite,foldcolumn:0
493 call Common_iwhite_test()
494 set diffopt&
495endfunc
496
497func Test_diffopt_iwhite_internal()
498 set diffopt=internal,iwhite,foldcolumn:0
499 call Common_iwhite_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200500 set diffopt&
501endfunc
502
503func Test_diffopt_context()
504 enew!
505 call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
506 diffthis
507 new
508 call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
509 diffthis
510
511 set diffopt=context:2
512 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200513 set diffopt=internal,context:2
514 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
515
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200516 set diffopt=context:1
517 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200518 set diffopt=internal,context:1
519 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200520
521 diffoff!
522 %bwipe!
523 set diffopt&
524endfunc
525
526func Test_diffopt_horizontal()
Bram Moolenaare828b762018-09-10 17:51:58 +0200527 set diffopt=internal,horizontal
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200528 diffsplit
529
530 call assert_equal(&columns, winwidth(1))
531 call assert_equal(&columns, winwidth(2))
532 call assert_equal(&lines, winheight(1) + winheight(2) + 3)
533 call assert_inrange(0, 1, winheight(1) - winheight(2))
534
535 set diffopt&
536 diffoff!
537 %bwipe
538endfunc
539
540func Test_diffopt_vertical()
Bram Moolenaare828b762018-09-10 17:51:58 +0200541 set diffopt=internal,vertical
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200542 diffsplit
543
544 call assert_equal(&lines - 2, winheight(1))
545 call assert_equal(&lines - 2, winheight(2))
546 call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
547 call assert_inrange(0, 1, winwidth(1) - winwidth(2))
548
549 set diffopt&
550 diffoff!
551 %bwipe
552endfunc
553
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100554func Test_diffopt_hiddenoff()
Bram Moolenaare828b762018-09-10 17:51:58 +0200555 set diffopt=internal,filler,foldcolumn:0,hiddenoff
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100556 e! one
557 call setline(1, ['Two', 'Three'])
558 redraw
559 let normattr = screenattr(1, 1)
560 diffthis
561 botright vert new two
562 call setline(1, ['One', 'Four'])
563 diffthis
564 redraw
565 call assert_notequal(normattr, screenattr(1, 1))
566 set hidden
567 close
568 redraw
569 " should not diffing with hidden buffer two while 'hiddenoff' is enabled
570 call assert_equal(normattr, screenattr(1, 1))
571
572 bwipe!
573 bwipe!
574 set hidden& diffopt&
575endfunc
576
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100577func Test_diffoff_hidden()
Bram Moolenaare828b762018-09-10 17:51:58 +0200578 set diffopt=internal,filler,foldcolumn:0
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100579 e! one
580 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200581 redraw
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100582 let normattr = screenattr(1, 1)
583 diffthis
584 botright vert new two
585 call setline(1, ['One', 'Four'])
586 diffthis
587 redraw
588 call assert_notequal(normattr, screenattr(1, 1))
589 set hidden
590 close
591 redraw
592 " diffing with hidden buffer two
593 call assert_notequal(normattr, screenattr(1, 1))
594 diffoff
595 redraw
596 call assert_equal(normattr, screenattr(1, 1))
597 diffthis
598 redraw
599 " still diffing with hidden buffer two
600 call assert_notequal(normattr, screenattr(1, 1))
601 diffoff!
602 redraw
603 call assert_equal(normattr, screenattr(1, 1))
604 diffthis
605 redraw
606 " no longer diffing with hidden buffer two
607 call assert_equal(normattr, screenattr(1, 1))
608
609 bwipe!
610 bwipe!
611 set hidden& diffopt&
612endfunc
613
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200614func Test_setting_cursor()
615 new Xtest1
616 put =range(1,90)
617 wq
618 new Xtest2
619 put =range(1,100)
620 wq
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200621
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200622 tabe Xtest2
623 $
624 diffsp Xtest1
625 tabclose
626
627 call delete('Xtest1')
628 call delete('Xtest2')
629endfunc
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100630
631func Test_diff_move_to()
632 new
633 call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
634 diffthis
635 vnew
636 call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
637 diffthis
638 norm ]c
639 call assert_equal(2, line('.'))
640 norm 3]c
641 call assert_equal(9, line('.'))
642 norm 10]c
643 call assert_equal(11, line('.'))
644 norm [c
645 call assert_equal(9, line('.'))
646 norm 2[c
647 call assert_equal(5, line('.'))
648 norm 10[c
649 call assert_equal(2, line('.'))
650 %bwipe!
651endfunc
652
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200653func Test_diffexpr()
Bram Moolenaaraeb313f2020-11-27 19:13:28 +0100654 CheckExecutable diff
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200655
656 func DiffExpr()
Bram Moolenaar485b6272021-05-18 19:19:03 +0200657 " Prepend some text to check diff type detection
Bram Moolenaar3b8defd2018-09-13 13:03:11 +0200658 call writefile(['warning', ' message'], v:fname_out)
659 silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200660 endfunc
661 set diffexpr=DiffExpr()
662 set diffopt=foldcolumn:0
663
664 enew!
665 call setline(1, ['one', 'two', 'three'])
666 redraw
667 let normattr = screenattr(1, 1)
668 diffthis
669
670 botright vert new
671 call setline(1, ['one', 'two', 'three.'])
672 diffthis
673
674 redraw
675 call assert_equal(normattr, screenattr(1, 1))
676 call assert_equal(normattr, screenattr(2, 1))
677 call assert_notequal(normattr, screenattr(3, 1))
Yegappan Lakshmanan30443242021-06-10 21:52:15 +0200678 diffoff!
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200679
Dominique Pelle923dce22021-11-21 11:36:04 +0000680 " Try using a non-existing function for 'diffexpr'.
Yegappan Lakshmanan30443242021-06-10 21:52:15 +0200681 set diffexpr=NewDiffFunc()
682 call assert_fails('windo diffthis', ['E117:', 'E97:'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200683 diffoff!
Yegappan Lakshmanan8bb65f22021-12-26 10:51:39 +0000684
685 " Using a script-local function
686 func s:NewDiffExpr()
687 endfunc
688 set diffexpr=s:NewDiffExpr()
689 call assert_equal(expand('<SID>') .. 'NewDiffExpr()', &diffexpr)
690 set diffexpr=<SID>NewDiffExpr()
691 call assert_equal(expand('<SID>') .. 'NewDiffExpr()', &diffexpr)
692
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200693 %bwipe!
694 set diffexpr& diffopt&
Yegappan Lakshmanan8bb65f22021-12-26 10:51:39 +0000695 delfunc DiffExpr
696 delfunc s:NewDiffExpr
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200697endfunc
698
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100699func Test_diffpatch()
700 " The patch program on MS-Windows may fail or hang.
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200701 CheckExecutable patch
702 CheckUnix
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100703 new
704 insert
705***************
706*** 1,3 ****
707 1
708! 2
709 3
710--- 1,4 ----
711 1
712! 2x
713 3
714+ 4
715.
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200716 saveas! Xpatch
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100717 bwipe!
718 new
719 call assert_fails('diffpatch Xpatch', 'E816:')
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100720
Bram Moolenaara95ab322017-03-11 19:21:53 +0100721 for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100722 call setline(1, ['1', '2', '3'])
723 if name != 'Xpatch'
724 call rename('Xpatch', name)
725 endif
726 exe 'diffpatch ' . escape(name, '$')
727 call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
728 if name != 'Xpatch'
729 call rename(name, 'Xpatch')
730 endif
731 bwipe!
732 endfor
733
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100734 call delete('Xpatch')
735 bwipe!
736endfunc
737
738func Test_diff_too_many_buffers()
739 for i in range(1, 8)
740 exe "new Xtest" . i
741 diffthis
742 endfor
743 new Xtest9
744 call assert_fails('diffthis', 'E96:')
745 %bwipe!
746endfunc
747
748func Test_diff_nomodifiable()
749 new
750 call setline(1, [1, 2, 3, 4])
751 setl nomodifiable
752 diffthis
753 vnew
754 call setline(1, ['1x', 2, 3, 3, 4])
755 diffthis
756 call assert_fails('norm dp', 'E793:')
757 setl nomodifiable
758 call assert_fails('norm do', 'E21:')
759 %bwipe!
760endfunc
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100761
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200762func Test_diff_hlID()
763 new
764 call setline(1, [1, 2, 3])
765 diffthis
766 vnew
767 call setline(1, ['1x', 2, 'x', 3])
768 diffthis
769 redraw
770
Bram Moolenaara74e4942019-08-04 17:35:53 +0200771 call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200772
Bram Moolenaara74e4942019-08-04 17:35:53 +0200773 call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange")
774 call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText")
775 call diff_hlID(2, 1)->synIDattr("name")->assert_equal("")
776 call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd")
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200777 eval 4->diff_hlID(1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200778
779 wincmd w
780 call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange")
781 call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "")
782 call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "")
783
784 %bwipe!
785endfunc
786
787func Test_diff_filler()
788 new
789 call setline(1, [1, 2, 3, 'x', 4])
790 diffthis
791 vnew
792 call setline(1, [1, 2, 'y', 'y', 3, 4])
793 diffthis
794 redraw
795
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200796 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 +0200797 wincmd w
798 call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
799
800 %bwipe!
801endfunc
802
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100803func Test_diff_lastline()
804 enew!
805 only!
806 call setline(1, ['This is a ', 'line with five ', 'rows'])
807 diffthis
808 botright vert new
809 call setline(1, ['This is', 'a line with ', 'four rows'])
810 diffthis
811 1
812 call feedkeys("Je a\<CR>", 'tx')
813 call feedkeys("Je a\<CR>", 'tx')
814 let w1lines = winline()
815 wincmd w
816 $
817 let w2lines = winline()
818 call assert_equal(w2lines, w1lines)
819 bwipe!
820 bwipe!
821endfunc
Bram Moolenaare828b762018-09-10 17:51:58 +0200822
Bram Moolenaar785fc652018-09-15 19:17:38 +0200823func WriteDiffFiles(buf, list1, list2)
Bram Moolenaare828b762018-09-10 17:51:58 +0200824 call writefile(a:list1, 'Xfile1')
825 call writefile(a:list2, 'Xfile2')
Bram Moolenaar785fc652018-09-15 19:17:38 +0200826 if a:buf
827 call term_sendkeys(a:buf, ":checktime\<CR>")
828 endif
Bram Moolenaare828b762018-09-10 17:51:58 +0200829endfunc
830
Bram Moolenaar785fc652018-09-15 19:17:38 +0200831" Verify a screendump with both the internal and external diff.
Bram Moolenaare828b762018-09-10 17:51:58 +0200832func VerifyBoth(buf, dumpfile, extra)
Bram Moolenaare828b762018-09-10 17:51:58 +0200833 " trailing : for leaving the cursor on the command line
Bram Moolenaar785fc652018-09-15 19:17:38 +0200834 for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"]
Bram Moolenaare828b762018-09-10 17:51:58 +0200835 call term_sendkeys(a:buf, cmd)
836 if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external')
Bram Moolenaar485b6272021-05-18 19:19:03 +0200837 " don't let the next iteration overwrite the "failed" file.
838 return
Bram Moolenaare828b762018-09-10 17:51:58 +0200839 endif
840 endfor
Bram Moolenaar485b6272021-05-18 19:19:03 +0200841
842 " also test unified diff
843 call term_sendkeys(a:buf, ":call SetupUnified()\<CR>:")
glacambread5c1782021-05-24 14:20:53 +0200844 call term_sendkeys(a:buf, ":redraw!\<CR>:")
Bram Moolenaar485b6272021-05-18 19:19:03 +0200845 call VerifyScreenDump(a:buf, a:dumpfile, {}, 'unified')
846 call term_sendkeys(a:buf, ":call StopUnified()\<CR>:")
Bram Moolenaare828b762018-09-10 17:51:58 +0200847endfunc
848
Bram Moolenaar785fc652018-09-15 19:17:38 +0200849" Verify a screendump with the internal diff only.
850func VerifyInternal(buf, dumpfile, extra)
851 call term_sendkeys(a:buf, ":diffupdate!\<CR>")
852 " trailing : for leaving the cursor on the command line
853 call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200854 call TermWait(a:buf)
Bram Moolenaar785fc652018-09-15 19:17:38 +0200855 call VerifyScreenDump(a:buf, a:dumpfile, {})
856endfunc
857
Bram Moolenaare828b762018-09-10 17:51:58 +0200858func Test_diff_screen()
Bram Moolenaarf08b0eb2021-10-16 13:00:14 +0100859 let g:test_is_flaky = 1
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200860 CheckScreendump
861 CheckFeature menu
862
Bram Moolenaar485b6272021-05-18 19:19:03 +0200863 let lines =<< trim END
864 func UnifiedDiffExpr()
865 " Prepend some text to check diff type detection
866 call writefile(['warning', ' message'], v:fname_out)
glacambread5c1782021-05-24 14:20:53 +0200867 silent exe '!diff -U0 ' .. v:fname_in .. ' ' .. v:fname_new .. '>>' .. v:fname_out
Bram Moolenaar485b6272021-05-18 19:19:03 +0200868 endfunc
869 func SetupUnified()
870 set diffexpr=UnifiedDiffExpr()
glacambread5c1782021-05-24 14:20:53 +0200871 diffupdate
Bram Moolenaar485b6272021-05-18 19:19:03 +0200872 endfunc
873 func StopUnified()
874 set diffexpr=
875 endfunc
876 END
877 call writefile(lines, 'XdiffSetup')
878
Bram Moolenaare828b762018-09-10 17:51:58 +0200879 " clean up already existing swap files, just in case
880 call delete('.Xfile1.swp')
881 call delete('.Xfile2.swp')
882
883 " Test 1: Add a line in beginning of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200884 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 Moolenaar485b6272021-05-18 19:19:03 +0200885 let buf = RunVimInTerminal('-d -S XdiffSetup Xfile1 Xfile2', {})
Bram Moolenaar8ee4c012019-03-29 18:08:18 +0100886 " Set autoread mode, so that Vim won't complain once we re-write the test
Bram Moolenaare828b762018-09-10 17:51:58 +0200887 " files
Bram Moolenaar785fc652018-09-15 19:17:38 +0200888 call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
Bram Moolenaare828b762018-09-10 17:51:58 +0200889
890 call VerifyBoth(buf, 'Test_diff_01', '')
891
892 " Test 2: Add a line in beginning of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200893 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 +0200894 call VerifyBoth(buf, 'Test_diff_02', '')
895
896 " Test 3: Add a line at the end of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200897 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 +0200898 call VerifyBoth(buf, 'Test_diff_03', '')
899
900 " Test 4: Add a line at the end of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200901 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 +0200902 call VerifyBoth(buf, 'Test_diff_04', '')
903
904 " 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 +0200905 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 +0200906 call VerifyBoth(buf, 'Test_diff_05', '')
907
908 " 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 +0200909 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 +0200910 call VerifyBoth(buf, 'Test_diff_06', '')
911
Bram Moolenaarb9ddda62019-02-19 23:00:50 +0100912 " Variants on test 6 with different context settings
913 call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
914 call VerifyScreenDump(buf, 'Test_diff_06.2', {})
915 call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
916 call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
917 call VerifyScreenDump(buf, 'Test_diff_06.1', {})
918 call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
919 call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
920 call VerifyScreenDump(buf, 'Test_diff_06.0', {})
921 call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
922
Bram Moolenaare828b762018-09-10 17:51:58 +0200923 " Test 7 - 9: Test normal/patience/histogram diff algorithm
Bram Moolenaar785fc652018-09-15 19:17:38 +0200924 call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
Bram Moolenaare828b762018-09-10 17:51:58 +0200925 \ ' int i;', ' for(i = 0; i < 10; i++)', ' {', ' printf("Your answer is: ");',
926 \ ' printf("%d\n", foo);', ' }', '}', '', 'int fact(int n)', '{', ' if(n > 1)', ' {',
927 \ ' return fact(n-1) * n;', ' }', ' return 1;', '}', '', 'int main(int argc, char **argv)',
928 \ '{', ' frobnitz(fact(10));', '}'],
929 \ ['#include <stdio.h>', '', 'int fib(int n)', '{', ' if(n > 2)', ' {',
930 \ ' return fib(n-1) + fib(n-2);', ' }', ' return 1;', '}', '', '// Frobs foo heartily',
931 \ 'int frobnitz(int foo)', '{', ' int i;', ' for(i = 0; i < 10; i++)', ' {',
932 \ ' printf("%d\n", foo);', ' }', '}', '',
933 \ 'int main(int argc, char **argv)', '{', ' frobnitz(fib(10));', '}'])
934 call term_sendkeys(buf, ":diffupdate!\<cr>")
935 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
936 call VerifyScreenDump(buf, 'Test_diff_07', {})
937
938 call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
939 call VerifyScreenDump(buf, 'Test_diff_08', {})
940
941 call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
942 call VerifyScreenDump(buf, 'Test_diff_09', {})
943
944 " Test 10-11: normal/indent-heuristic
945 call term_sendkeys(buf, ":set diffopt&vim\<cr>")
Bram Moolenaar785fc652018-09-15 19:17:38 +0200946 call WriteDiffFiles(buf, ['', ' def finalize(values)', '', ' values.each do |v|', ' v.finalize', ' end'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200947 \ ['', ' def finalize(values)', '', ' values.each do |v|', ' v.prepare', ' end', '',
948 \ ' values.each do |v|', ' v.finalize', ' end'])
949 call term_sendkeys(buf, ":diffupdate!\<cr>")
950 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
951 call VerifyScreenDump(buf, 'Test_diff_10', {})
952
Bram Moolenaarb6fc7282018-12-04 22:24:16 +0100953 " Leave trailing : at commandline!
954 call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
955 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
956 " shouldn't matter, if indent-algorithm comes before or after the algorithm
957 call term_sendkeys(buf, ":set diffopt&\<cr>")
958 call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
959 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
960 call term_sendkeys(buf, ":set diffopt&\<cr>")
961 call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
962 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
Bram Moolenaare828b762018-09-10 17:51:58 +0200963
964 " Test 12: diff the same file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200965 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 +0200966 call VerifyBoth(buf, 'Test_diff_12', '')
967
968 " Test 13: diff an empty file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200969 call WriteDiffFiles(buf, [], [])
Bram Moolenaare828b762018-09-10 17:51:58 +0200970 call VerifyBoth(buf, 'Test_diff_13', '')
971
972 " Test 14: test diffopt+=icase
Bram Moolenaar785fc652018-09-15 19:17:38 +0200973 call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
Bram Moolenaare828b762018-09-10 17:51:58 +0200974 call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
975
976 " Test 15-16: test diffopt+=iwhite
Bram Moolenaar785fc652018-09-15 19:17:38 +0200977 call WriteDiffFiles(buf, ['int main()', '{', ' printf("Hello, World!");', ' return 0;', '}'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200978 \ ['int main()', '{', ' if (0)', ' {', ' printf("Hello, World!");', ' return 0;', ' }', '}'])
979 call term_sendkeys(buf, ":diffupdate!\<cr>")
980 call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
981 call VerifyScreenDump(buf, 'Test_diff_15', {})
982 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
983 call VerifyScreenDump(buf, 'Test_diff_16', {})
984
Bram Moolenaar785fc652018-09-15 19:17:38 +0200985 " Test 17: test diffopt+=iblank
986 call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
987 call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
988
989 " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
990 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
991 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
992 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
993
994 " Test 19: test diffopt+=iwhiteeol
995 call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
996 call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
997
998 " Test 19: test diffopt+=iwhiteall
999 call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
1000
Bram Moolenaare828b762018-09-10 17:51:58 +02001001 " clean up
1002 call StopVimInTerminal(buf)
1003 call delete('Xfile1')
1004 call delete('Xfile2')
Bram Moolenaar485b6272021-05-18 19:19:03 +02001005 call delete('XdiffSetup')
Bram Moolenaare828b762018-09-10 17:51:58 +02001006endfunc
1007
Bram Moolenaar04626c22021-09-01 16:02:07 +02001008func Test_diff_with_scroll_and_change()
1009 CheckScreendump
1010
1011 let lines =<< trim END
1012 call setline(1, range(1, 15))
1013 vnew
1014 call setline(1, range(9, 15))
1015 windo diffthis
1016 wincmd h
1017 exe "normal Gl5\<C-E>"
1018 END
1019 call writefile(lines, 'Xtest_scroll_change')
1020 let buf = RunVimInTerminal('-S Xtest_scroll_change', {})
1021
1022 call VerifyScreenDump(buf, 'Test_diff_scroll_change_01', {})
1023
1024 call term_sendkeys(buf, "ax\<Esc>")
1025 call VerifyScreenDump(buf, 'Test_diff_scroll_change_02', {})
1026
Bram Moolenaar841c2252021-10-22 20:56:55 +01001027 call term_sendkeys(buf, "\<C-W>lay\<Esc>")
1028 call VerifyScreenDump(buf, 'Test_diff_scroll_change_03', {})
1029
Bram Moolenaar04626c22021-09-01 16:02:07 +02001030 " clean up
1031 call StopVimInTerminal(buf)
1032 call delete('Xtest_scroll_change')
1033endfunc
1034
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +02001035func Test_diff_with_cursorline()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +02001036 CheckScreendump
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +02001037
1038 call writefile([
1039 \ 'hi CursorLine ctermbg=red ctermfg=white',
1040 \ 'set cursorline',
1041 \ 'call setline(1, ["foo","foo","foo","bar"])',
1042 \ 'vnew',
1043 \ 'call setline(1, ["bee","foo","foo","baz"])',
1044 \ 'windo diffthis',
1045 \ '2wincmd w',
1046 \ ], 'Xtest_diff_cursorline')
1047 let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
1048
1049 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
1050 call term_sendkeys(buf, "j")
1051 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
1052 call term_sendkeys(buf, "j")
1053 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
1054
1055 " clean up
1056 call StopVimInTerminal(buf)
1057 call delete('Xtest_diff_cursorline')
1058endfunc
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001059
zeertzjq4f33bc22021-08-05 17:57:02 +02001060func Test_diff_with_cursorline_breakindent()
1061 CheckScreendump
1062
1063 call writefile([
1064 \ 'hi CursorLine ctermbg=red ctermfg=white',
1065 \ 'set noequalalways wrap diffopt=followwrap cursorline breakindent',
1066 \ '50vnew',
1067 \ 'call setline(1, [" "," "," "," "])',
1068 \ 'exe "norm 20Afoo\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abar\<Esc>"',
1069 \ 'vnew',
1070 \ 'call setline(1, [" "," "," "," "])',
1071 \ 'exe "norm 20Abee\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abaz\<Esc>"',
1072 \ 'windo diffthis',
1073 \ '2wincmd w',
1074 \ ], 'Xtest_diff_cursorline_breakindent')
1075 let buf = RunVimInTerminal('-S Xtest_diff_cursorline_breakindent', {})
1076
1077 call term_sendkeys(buf, "gg0")
1078 call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_01', {})
1079 call term_sendkeys(buf, "j")
1080 call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_02', {})
1081 call term_sendkeys(buf, "j")
1082 call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_03', {})
1083 call term_sendkeys(buf, "j")
1084 call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_04', {})
1085
1086 " clean up
1087 call StopVimInTerminal(buf)
1088 call delete('Xtest_diff_cursorline_breakindent')
1089endfunc
1090
Bram Moolenaar248fdb32019-09-15 19:31:28 +02001091func Test_diff_with_syntax()
1092 CheckScreendump
1093
1094 let lines =<< trim END
1095 void doNothing() {
1096 int x = 0;
1097 char *s = "hello";
1098 return 5;
1099 }
1100 END
1101 call writefile(lines, 'Xprogram1.c')
1102 let lines =<< trim END
1103 void doSomething() {
1104 int x = 0;
1105 char *s = "there";
1106 return 5;
1107 }
1108 END
1109 call writefile(lines, 'Xprogram2.c')
1110
1111 let lines =<< trim END
1112 edit Xprogram1.c
1113 diffsplit Xprogram2.c
1114 END
1115 call writefile(lines, 'Xtest_diff_syntax')
1116 let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
1117
1118 call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
1119
1120 " clean up
1121 call StopVimInTerminal(buf)
1122 call delete('Xtest_diff_syntax')
1123 call delete('Xprogram1.c')
1124 call delete('Xprogram2.c')
1125endfunc
1126
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001127func Test_diff_of_diff()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +02001128 CheckScreendump
1129 CheckFeature rightleft
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001130
1131 call writefile([
1132 \ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
1133 \ 'vnew',
1134 \ 'call setline(1, ["aa","bb","cc"])',
1135 \ 'windo diffthis',
Bram Moolenaar8ee4c012019-03-29 18:08:18 +01001136 \ '1wincmd w',
1137 \ 'setlocal number',
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001138 \ ], 'Xtest_diff_diff')
1139 let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
1140
1141 call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
1142
Bram Moolenaare73f9112019-03-29 18:29:54 +01001143 call term_sendkeys(buf, ":set rightleft\<cr>")
1144 call VerifyScreenDump(buf, 'Test_diff_of_diff_02', {})
1145
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001146 " clean up
1147 call StopVimInTerminal(buf)
1148 call delete('Xtest_diff_diff')
1149endfunc
Bram Moolenaarc8234772019-11-10 21:00:27 +01001150
1151func CloseoffSetup()
1152 enew
1153 call setline(1, ['one', 'two', 'three'])
1154 diffthis
1155 new
1156 call setline(1, ['one', 'tow', 'three'])
1157 diffthis
1158 call assert_equal(1, &diff)
1159 only!
1160endfunc
1161
1162func Test_diff_closeoff()
1163 " "closeoff" included by default: last diff win gets 'diff' reset'
1164 call CloseoffSetup()
1165 call assert_equal(0, &diff)
1166 enew!
1167
1168 " "closeoff" excluded: last diff win keeps 'diff' set'
1169 set diffopt-=closeoff
1170 call CloseoffSetup()
1171 call assert_equal(1, &diff)
1172 diffoff!
1173 enew!
1174endfunc
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01001175
Bram Moolenaar4223d432021-02-10 13:18:17 +01001176func Test_diff_followwrap()
1177 new
1178 set diffopt+=followwrap
1179 set wrap
1180 diffthis
1181 call assert_equal(1, &wrap)
1182 diffoff
1183 set nowrap
1184 diffthis
1185 call assert_equal(0, &wrap)
1186 diffoff
1187 set diffopt&
1188 bwipe!
1189endfunc
1190
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01001191func Test_diff_maintains_change_mark()
1192 enew!
1193 call setline(1, ['a', 'b', 'c', 'd'])
1194 diffthis
1195 new
1196 call setline(1, ['a', 'b', 'c', 'e'])
1197 " Set '[ and '] marks
1198 2,3yank
1199 call assert_equal([2, 3], [line("'["), line("']")])
1200 " Verify they aren't affected by the implicit diff
1201 diffthis
1202 call assert_equal([2, 3], [line("'["), line("']")])
1203 " Verify they aren't affected by an explicit diff
1204 diffupdate
1205 call assert_equal([2, 3], [line("'["), line("']")])
1206 bwipe!
1207 bwipe!
1208endfunc
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001209
1210" Test for 'patchexpr'
1211func Test_patchexpr()
1212 let g:patch_args = []
1213 func TPatch()
1214 call add(g:patch_args, readfile(v:fname_in))
1215 call add(g:patch_args, readfile(v:fname_diff))
1216 call writefile(['output file'], v:fname_out)
1217 endfunc
1218 set patchexpr=TPatch()
1219
1220 call writefile(['input file'], 'Xinput')
1221 call writefile(['diff file'], 'Xdiff')
1222 %bwipe!
1223 edit Xinput
1224 diffpatch Xdiff
1225 call assert_equal('output file', getline(1))
1226 call assert_equal('Xinput.new', bufname())
1227 call assert_equal(2, winnr('$'))
1228 call assert_true(&diff)
1229
Yegappan Lakshmanan8bb65f22021-12-26 10:51:39 +00001230 " Using a script-local function
1231 func s:NewPatchExpr()
1232 endfunc
1233 set patchexpr=s:NewPatchExpr()
1234 call assert_equal(expand('<SID>') .. 'NewPatchExpr()', &patchexpr)
1235 set patchexpr=<SID>NewPatchExpr()
1236 call assert_equal(expand('<SID>') .. 'NewPatchExpr()', &patchexpr)
1237
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001238 call delete('Xinput')
1239 call delete('Xdiff')
1240 set patchexpr&
1241 delfunc TPatch
Yegappan Lakshmanan8bb65f22021-12-26 10:51:39 +00001242 delfunc s:NewPatchExpr
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001243 %bwipe!
1244endfunc
1245
Bram Moolenaar511feec2020-06-18 19:15:27 +02001246func Test_diff_rnu()
1247 CheckScreendump
1248
1249 let content =<< trim END
1250 call setline(1, ['a', 'a', 'a', 'y', 'b', 'b', 'b', 'b', 'b'])
1251 vnew
1252 call setline(1, ['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b', 'b', 'b'])
1253 windo diffthis
1254 setlocal number rnu foldcolumn=0
1255 END
1256 call writefile(content, 'Xtest_diff_rnu')
1257 let buf = RunVimInTerminal('-S Xtest_diff_rnu', {})
1258
1259 call VerifyScreenDump(buf, 'Test_diff_rnu_01', {})
1260
1261 call term_sendkeys(buf, "j")
1262 call VerifyScreenDump(buf, 'Test_diff_rnu_02', {})
1263 call term_sendkeys(buf, "j")
1264 call VerifyScreenDump(buf, 'Test_diff_rnu_03', {})
1265
1266 " clean up
1267 call StopVimInTerminal(buf)
1268 call delete('Xtest_diff_rnu')
1269endfunc
1270
Bram Moolenaarfc838d62020-06-25 22:23:48 +02001271func Test_diff_multilineconceal()
1272 new
1273 diffthis
1274
1275 new
1276 call matchadd('Conceal', 'a\nb', 9, -1, {'conceal': 'Y'})
1277 set cole=2 cocu=n
1278 call setline(1, ["a", "b"])
1279 diffthis
1280 redraw
1281endfunc
1282
Bram Moolenaar8455c5e2020-07-14 21:22:30 +02001283func Test_diff_and_scroll()
1284 " this was causing an ml_get error
1285 set ls=2
1286 for i in range(winheight(0) * 2)
1287 call setline(i, i < winheight(0) - 10 ? i : i + 10)
1288 endfor
1289 vnew
1290 for i in range(winheight(0)*2 + 10)
1291 call setline(i, i < winheight(0) - 10 ? 0 : i)
1292 endfor
1293 diffthis
1294 wincmd p
1295 diffthis
1296 execute 'normal ' . winheight(0) . "\<C-d>"
1297
1298 bwipe!
1299 bwipe!
1300 set ls&
1301endfunc
1302
Bram Moolenaarfabc3ca2020-11-05 19:07:21 +01001303func Test_diff_filler_cursorcolumn()
1304 CheckScreendump
1305
1306 let content =<< trim END
1307 call setline(1, ['aa', 'bb', 'cc'])
1308 vnew
1309 call setline(1, ['aa', 'cc'])
1310 windo diffthis
1311 wincmd p
1312 setlocal cursorcolumn foldcolumn=0
1313 norm! gg0
1314 redraw!
1315 END
1316 call writefile(content, 'Xtest_diff_cuc')
1317 let buf = RunVimInTerminal('-S Xtest_diff_cuc', {})
1318
1319 call VerifyScreenDump(buf, 'Test_diff_cuc_01', {})
1320
1321 call term_sendkeys(buf, "l")
1322 call term_sendkeys(buf, "\<C-l>")
1323 call VerifyScreenDump(buf, 'Test_diff_cuc_02', {})
1324 call term_sendkeys(buf, "0j")
1325 call term_sendkeys(buf, "\<C-l>")
1326 call VerifyScreenDump(buf, 'Test_diff_cuc_03', {})
1327 call term_sendkeys(buf, "l")
1328 call term_sendkeys(buf, "\<C-l>")
1329 call VerifyScreenDump(buf, 'Test_diff_cuc_04', {})
1330
1331 " clean up
1332 call StopVimInTerminal(buf)
1333 call delete('Xtest_diff_cuc')
1334endfunc
1335
Yegappan Lakshmanan30443242021-06-10 21:52:15 +02001336" Test for adding/removing lines inside diff chunks, between diff chunks
1337" and before diff chunks
1338func Test_diff_modify_chunks()
1339 enew!
1340 let w2_id = win_getid()
1341 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
1342 new
1343 let w1_id = win_getid()
1344 call setline(1, ['a', '2', '3', 'd', 'e', 'f', '7', '8', 'i'])
1345 windo diffthis
1346
1347 " remove a line between two diff chunks and create a new diff chunk
1348 call win_gotoid(w2_id)
1349 5d
1350 call win_gotoid(w1_id)
1351 call diff_hlID(5, 1)->synIDattr('name')->assert_equal('DiffAdd')
1352
1353 " add a line between two diff chunks
1354 call win_gotoid(w2_id)
1355 normal! 4Goe
1356 call win_gotoid(w1_id)
1357 call diff_hlID(4, 1)->synIDattr('name')->assert_equal('')
1358 call diff_hlID(5, 1)->synIDattr('name')->assert_equal('')
1359
1360 " remove all the lines in a diff chunk.
1361 call win_gotoid(w2_id)
1362 7,8d
1363 call win_gotoid(w1_id)
1364 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1365 call assert_equal(['', 'DiffText', 'DiffText', '', '', '', 'DiffAdd',
1366 \ 'DiffAdd', ''], hl)
1367
1368 " remove lines from one diff chunk to just before the next diff chunk
1369 call win_gotoid(w2_id)
1370 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
1371 2,6d
1372 call win_gotoid(w1_id)
1373 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1374 call assert_equal(['', 'DiffText', 'DiffText', 'DiffAdd', 'DiffAdd',
1375 \ 'DiffAdd', 'DiffAdd', 'DiffAdd', ''], hl)
1376
1377 " remove lines just before the top of a diff chunk
1378 call win_gotoid(w2_id)
1379 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
1380 5,6d
1381 call win_gotoid(w1_id)
1382 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1383 call assert_equal(['', 'DiffText', 'DiffText', '', 'DiffText', 'DiffText',
1384 \ 'DiffAdd', 'DiffAdd', ''], hl)
1385
1386 " remove line after the end of a diff chunk
1387 call win_gotoid(w2_id)
1388 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
1389 4d
1390 call win_gotoid(w1_id)
1391 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1392 call assert_equal(['', 'DiffText', 'DiffText', 'DiffAdd', '', '', 'DiffText',
1393 \ 'DiffText', ''], hl)
1394
1395 " remove lines starting from the end of one diff chunk and ending inside
1396 " another diff chunk
1397 call win_gotoid(w2_id)
1398 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
1399 4,7d
1400 call win_gotoid(w1_id)
1401 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1402 call assert_equal(['', 'DiffText', 'DiffText', 'DiffText', 'DiffAdd',
1403 \ 'DiffAdd', 'DiffAdd', 'DiffAdd', ''], hl)
1404
1405 " removing the only remaining diff chunk should make the files equal
1406 call win_gotoid(w2_id)
1407 call setline(1, ['a', '2', '3', 'x', 'd', 'e', 'f', 'x', '7', '8', 'i'])
1408 8d
1409 let hl = range(1, 10)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1410 call assert_equal(['', '', '', 'DiffAdd', '', '', '', '', '', ''], hl)
1411 call win_gotoid(w2_id)
1412 4d
1413 call win_gotoid(w1_id)
1414 let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
1415 call assert_equal(['', '', '', '', '', '', '', '', ''], hl)
1416
1417 %bw!
1418endfunc
glacambread5c1782021-05-24 14:20:53 +02001419
Bram Moolenaar06f60952021-12-28 18:30:05 +00001420func Test_diff_binary()
1421 CheckScreendump
1422
1423 let content =<< trim END
1424 call setline(1, ['a', 'b', "c\n", 'd', 'e', 'f', 'g'])
1425 vnew
1426 call setline(1, ['A', 'b', 'c', 'd', 'E', 'f', 'g'])
1427 windo diffthis
1428 wincmd p
1429 norm! gg0
1430 redraw!
1431 END
1432 call writefile(content, 'Xtest_diff_bin')
1433 let buf = RunVimInTerminal('-S Xtest_diff_bin', {})
1434
1435 " Test using internal diff
1436 call VerifyScreenDump(buf, 'Test_diff_bin_01', {})
1437
1438 " Test using internal diff and case folding
1439 call term_sendkeys(buf, ":set diffopt+=icase\<cr>")
1440 call term_sendkeys(buf, "\<C-l>")
1441 call VerifyScreenDump(buf, 'Test_diff_bin_02', {})
1442 " Test using external diff
1443 call term_sendkeys(buf, ":set diffopt=filler\<cr>")
1444 call term_sendkeys(buf, "\<C-l>")
1445 call VerifyScreenDump(buf, 'Test_diff_bin_03', {})
1446 " Test using external diff and case folding
1447 call term_sendkeys(buf, ":set diffopt=filler,icase\<cr>")
1448 call term_sendkeys(buf, "\<C-l>")
1449 call VerifyScreenDump(buf, 'Test_diff_bin_04', {})
1450
1451 " clean up
1452 call StopVimInTerminal(buf)
1453 call delete('Xtest_diff_bin')
1454 set diffopt&vim
1455endfunc
1456
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001457" vim: shiftwidth=2 sts=2 expandtab