blob: 96a8d2c069cecedf42ff5c7fc803d1e1458a2e9d [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
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100246" :diffput and :diffget completes names of buffers which
247" are in diff mode and which are different then current buffer.
248" No completion when the current window is not in diff mode.
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100249func Test_diffget_diffput_completion()
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100250 e Xdiff1 | diffthis
251 botright new Xdiff2
252 botright new Xdiff3 | split | diffthis
253 botright new Xdiff4 | diffthis
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100254
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100255 wincmd t
256 call assert_equal('Xdiff1', bufname('%'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100257 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100258 call assert_equal('"diffput Xdiff3 Xdiff4', @:)
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100259 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100260 call assert_equal('"diffget Xdiff3 Xdiff4', @:)
261 call assert_equal(['Xdiff3', 'Xdiff4'], getcompletion('', 'diff_buffer'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100262
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100263 " Xdiff2 is not in diff mode, so no completion for :diffput, :diffget
264 wincmd j
265 call assert_equal('Xdiff2', bufname('%'))
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100266 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
267 call assert_equal('"diffput ', @:)
268 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
269 call assert_equal('"diffget ', @:)
270 call assert_equal([], getcompletion('', 'diff_buffer'))
271
Bram Moolenaarefcc3292019-12-30 21:59:03 +0100272 " Xdiff3 is split in 2 windows, only the top one is in diff mode.
273 " So completion of :diffput :diffget only happens in the top window.
274 wincmd j
275 call assert_equal('Xdiff3', bufname('%'))
276 call assert_equal(1, &diff)
277 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
278 call assert_equal('"diffput Xdiff1 Xdiff4', @:)
279 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
280 call assert_equal('"diffget Xdiff1 Xdiff4', @:)
281 call assert_equal(['Xdiff1', 'Xdiff4'], getcompletion('', 'diff_buffer'))
282
283 wincmd j
284 call assert_equal('Xdiff3', bufname('%'))
285 call assert_equal(0, &diff)
286 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
287 call assert_equal('"diffput ', @:)
288 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
289 call assert_equal('"diffget ', @:)
290 call assert_equal([], getcompletion('', 'diff_buffer'))
291
292 wincmd j
293 call assert_equal('Xdiff4', bufname('%'))
294 call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
295 call assert_equal('"diffput Xdiff1 Xdiff3', @:)
296 call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
297 call assert_equal('"diffget Xdiff1 Xdiff3', @:)
298 call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))
299
Bram Moolenaarae7dba82019-12-29 13:56:33 +0100300 %bwipe
301endfunc
302
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200303func Test_dp_do_buffer()
304 e! one
305 let bn1=bufnr('%')
306 let l = range(60)
307 call setline(1, l)
308 diffthis
309
310 new two
311 let l[10] = 'one'
312 let l[20] = 'two'
313 let l[30] = 'three'
314 let l[40] = 'four'
315 let l[50] = 'five'
316 call setline(1, l)
317 diffthis
318
319 " dp and do with invalid buffer number.
320 11
321 call assert_fails('norm 99999dp', 'E102:')
322 call assert_fails('norm 99999do', 'E102:')
323 call assert_fails('diffput non_existing_buffer', 'E94:')
324 call assert_fails('diffget non_existing_buffer', 'E94:')
325
326 " dp and do with valid buffer number.
327 call assert_equal('one', getline('.'))
328 exe 'norm ' . bn1 . 'do'
329 call assert_equal('10', getline('.'))
330 21
331 call assert_equal('two', getline('.'))
332 diffget one
333 call assert_equal('20', getline('.'))
334
335 31
336 exe 'norm ' . bn1 . 'dp'
337 41
338 diffput one
339 wincmd w
340 31
341 call assert_equal('three', getline('.'))
342 41
343 call assert_equal('four', getline('.'))
344
345 " dp and do with buffer number which is not in diff mode.
346 new not_in_diff_mode
347 let bn3=bufnr('%')
348 wincmd w
349 51
350 call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
351 call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
352 call assert_fails('diffput not_in_diff_mode', 'E94:')
353 call assert_fails('diffget not_in_diff_mode', 'E94:')
354
355 windo diffoff
356 %bwipe!
Bram Moolenaar42093c02016-07-30 16:16:54 +0200357endfunc
Bram Moolenaare67d5462016-08-27 22:40:42 +0200358
Bram Moolenaardf77cef2018-10-07 17:46:42 +0200359func Test_do_lastline()
360 e! one
361 call setline(1, ['1','2','3','4','5','6'])
362 diffthis
363
364 new two
365 call setline(1, ['2','4','5'])
366 diffthis
367
368 1
369 norm dp]c
370 norm dp]c
371 wincmd w
372 call assert_equal(4, line('$'))
373 norm G
374 norm do
375 call assert_equal(3, line('$'))
376
377 windo diffoff
378 %bwipe!
379endfunc
380
Bram Moolenaare67d5462016-08-27 22:40:42 +0200381func Test_diffoff()
382 enew!
383 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200384 redraw
Bram Moolenaare67d5462016-08-27 22:40:42 +0200385 let normattr = screenattr(1, 1)
386 diffthis
387 botright vert new
388 call setline(1, ['One', '', 'Two', 'Three'])
389 diffthis
390 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +0200391 call assert_notequal(normattr, 1->screenattr(1))
Bram Moolenaare67d5462016-08-27 22:40:42 +0200392 diffoff!
393 redraw
394 call assert_equal(normattr, screenattr(1, 1))
395 bwipe!
396 bwipe!
397endfunc
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200398
Bram Moolenaare828b762018-09-10 17:51:58 +0200399func Common_icase_test()
400 edit one
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200401 call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200402 redraw
403 let normattr = screenattr(1, 1)
404 diffthis
405
406 botright vert new two
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200407 call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200408 diffthis
409
410 redraw
411 call assert_equal(normattr, screenattr(1, 1))
412 call assert_equal(normattr, screenattr(2, 1))
413 call assert_notequal(normattr, screenattr(3, 1))
414 call assert_equal(normattr, screenattr(4, 1))
415
Bram Moolenaarda22b8c2017-09-02 18:01:50 +0200416 let dtextattr = screenattr(5, 3)
417 call assert_notequal(dtextattr, screenattr(5, 1))
418 call assert_notequal(dtextattr, screenattr(5, 5))
419
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200420 diffoff!
421 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200422endfunc
423
424func Test_diffopt_icase()
425 set diffopt=icase,foldcolumn:0
426 call Common_icase_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200427 set diffopt&
428endfunc
429
Bram Moolenaare828b762018-09-10 17:51:58 +0200430func Test_diffopt_icase_internal()
431 set diffopt=icase,foldcolumn:0,internal
432 call Common_icase_test()
433 set diffopt&
434endfunc
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200435
Bram Moolenaare828b762018-09-10 17:51:58 +0200436func Common_iwhite_test()
437 edit one
438 " Difference in trailing spaces and amount of spaces should be ignored,
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200439 " but not other space differences.
Bram Moolenaare828b762018-09-10 17:51:58 +0200440 call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200441 redraw
442 let normattr = screenattr(1, 1)
443 diffthis
444
445 botright vert new two
Bram Moolenaare828b762018-09-10 17:51:58 +0200446 call setline(1, ["One\t ", "Two\t ", 'Three', 'one two', 'onetwo', ' Four'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200447 diffthis
448
449 redraw
450 call assert_equal(normattr, screenattr(1, 1))
451 call assert_equal(normattr, screenattr(2, 1))
452 call assert_equal(normattr, screenattr(3, 1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200453 call assert_equal(normattr, screenattr(4, 1))
454 call assert_notequal(normattr, screenattr(5, 1))
455 call assert_notequal(normattr, screenattr(6, 1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200456
457 diffoff!
458 %bwipe!
Bram Moolenaare828b762018-09-10 17:51:58 +0200459endfunc
460
461func Test_diffopt_iwhite()
462 set diffopt=iwhite,foldcolumn:0
463 call Common_iwhite_test()
464 set diffopt&
465endfunc
466
467func Test_diffopt_iwhite_internal()
468 set diffopt=internal,iwhite,foldcolumn:0
469 call Common_iwhite_test()
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200470 set diffopt&
471endfunc
472
473func Test_diffopt_context()
474 enew!
475 call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
476 diffthis
477 new
478 call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
479 diffthis
480
481 set diffopt=context:2
482 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200483 set diffopt=internal,context:2
484 call assert_equal('+-- 2 lines: 1', foldtextresult(1))
485
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200486 set diffopt=context:1
487 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaare828b762018-09-10 17:51:58 +0200488 set diffopt=internal,context:1
489 call assert_equal('+-- 3 lines: 1', foldtextresult(1))
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200490
491 diffoff!
492 %bwipe!
493 set diffopt&
494endfunc
495
496func Test_diffopt_horizontal()
Bram Moolenaare828b762018-09-10 17:51:58 +0200497 set diffopt=internal,horizontal
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200498 diffsplit
499
500 call assert_equal(&columns, winwidth(1))
501 call assert_equal(&columns, winwidth(2))
502 call assert_equal(&lines, winheight(1) + winheight(2) + 3)
503 call assert_inrange(0, 1, winheight(1) - winheight(2))
504
505 set diffopt&
506 diffoff!
507 %bwipe
508endfunc
509
510func Test_diffopt_vertical()
Bram Moolenaare828b762018-09-10 17:51:58 +0200511 set diffopt=internal,vertical
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200512 diffsplit
513
514 call assert_equal(&lines - 2, winheight(1))
515 call assert_equal(&lines - 2, winheight(2))
516 call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
517 call assert_inrange(0, 1, winwidth(1) - winwidth(2))
518
519 set diffopt&
520 diffoff!
521 %bwipe
522endfunc
523
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100524func Test_diffopt_hiddenoff()
Bram Moolenaare828b762018-09-10 17:51:58 +0200525 set diffopt=internal,filler,foldcolumn:0,hiddenoff
Bram Moolenaar97ce4192017-12-01 20:35:58 +0100526 e! one
527 call setline(1, ['Two', 'Three'])
528 redraw
529 let normattr = screenattr(1, 1)
530 diffthis
531 botright vert new two
532 call setline(1, ['One', 'Four'])
533 diffthis
534 redraw
535 call assert_notequal(normattr, screenattr(1, 1))
536 set hidden
537 close
538 redraw
539 " should not diffing with hidden buffer two while 'hiddenoff' is enabled
540 call assert_equal(normattr, screenattr(1, 1))
541
542 bwipe!
543 bwipe!
544 set hidden& diffopt&
545endfunc
546
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100547func Test_diffoff_hidden()
Bram Moolenaare828b762018-09-10 17:51:58 +0200548 set diffopt=internal,filler,foldcolumn:0
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100549 e! one
550 call setline(1, ['Two', 'Three'])
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200551 redraw
Bram Moolenaar25ea0542017-02-03 23:16:28 +0100552 let normattr = screenattr(1, 1)
553 diffthis
554 botright vert new two
555 call setline(1, ['One', 'Four'])
556 diffthis
557 redraw
558 call assert_notequal(normattr, screenattr(1, 1))
559 set hidden
560 close
561 redraw
562 " diffing with hidden buffer two
563 call assert_notequal(normattr, screenattr(1, 1))
564 diffoff
565 redraw
566 call assert_equal(normattr, screenattr(1, 1))
567 diffthis
568 redraw
569 " still diffing with hidden buffer two
570 call assert_notequal(normattr, screenattr(1, 1))
571 diffoff!
572 redraw
573 call assert_equal(normattr, screenattr(1, 1))
574 diffthis
575 redraw
576 " no longer diffing with hidden buffer two
577 call assert_equal(normattr, screenattr(1, 1))
578
579 bwipe!
580 bwipe!
581 set hidden& diffopt&
582endfunc
583
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200584func Test_setting_cursor()
585 new Xtest1
586 put =range(1,90)
587 wq
588 new Xtest2
589 put =range(1,100)
590 wq
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200591
Bram Moolenaar025e3e02016-10-18 14:50:18 +0200592 tabe Xtest2
593 $
594 diffsp Xtest1
595 tabclose
596
597 call delete('Xtest1')
598 call delete('Xtest2')
599endfunc
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100600
601func Test_diff_move_to()
602 new
603 call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
604 diffthis
605 vnew
606 call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
607 diffthis
608 norm ]c
609 call assert_equal(2, line('.'))
610 norm 3]c
611 call assert_equal(9, line('.'))
612 norm 10]c
613 call assert_equal(11, line('.'))
614 norm [c
615 call assert_equal(9, line('.'))
616 norm 2[c
617 call assert_equal(5, line('.'))
618 norm 10[c
619 call assert_equal(2, line('.'))
620 %bwipe!
621endfunc
622
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200623func Test_diffexpr()
Bram Moolenaaraeb313f2020-11-27 19:13:28 +0100624 CheckExecutable diff
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200625
626 func DiffExpr()
Bram Moolenaar485b6272021-05-18 19:19:03 +0200627 " Prepend some text to check diff type detection
Bram Moolenaar3b8defd2018-09-13 13:03:11 +0200628 call writefile(['warning', ' message'], v:fname_out)
629 silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
Bram Moolenaar79a213d2017-05-16 13:15:18 +0200630 endfunc
631 set diffexpr=DiffExpr()
632 set diffopt=foldcolumn:0
633
634 enew!
635 call setline(1, ['one', 'two', 'three'])
636 redraw
637 let normattr = screenattr(1, 1)
638 diffthis
639
640 botright vert new
641 call setline(1, ['one', 'two', 'three.'])
642 diffthis
643
644 redraw
645 call assert_equal(normattr, screenattr(1, 1))
646 call assert_equal(normattr, screenattr(2, 1))
647 call assert_notequal(normattr, screenattr(3, 1))
648
649 diffoff!
650 %bwipe!
651 set diffexpr& diffopt&
652endfunc
653
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100654func Test_diffpatch()
655 " The patch program on MS-Windows may fail or hang.
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200656 CheckExecutable patch
657 CheckUnix
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100658 new
659 insert
660***************
661*** 1,3 ****
662 1
663! 2
664 3
665--- 1,4 ----
666 1
667! 2x
668 3
669+ 4
670.
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200671 saveas! Xpatch
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100672 bwipe!
673 new
674 call assert_fails('diffpatch Xpatch', 'E816:')
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100675
Bram Moolenaara95ab322017-03-11 19:21:53 +0100676 for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
Bram Moolenaar1ef73e32017-03-09 19:21:30 +0100677 call setline(1, ['1', '2', '3'])
678 if name != 'Xpatch'
679 call rename('Xpatch', name)
680 endif
681 exe 'diffpatch ' . escape(name, '$')
682 call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
683 if name != 'Xpatch'
684 call rename(name, 'Xpatch')
685 endif
686 bwipe!
687 endfor
688
Bram Moolenaaraeb661e2017-02-26 19:59:59 +0100689 call delete('Xpatch')
690 bwipe!
691endfunc
692
693func Test_diff_too_many_buffers()
694 for i in range(1, 8)
695 exe "new Xtest" . i
696 diffthis
697 endfor
698 new Xtest9
699 call assert_fails('diffthis', 'E96:')
700 %bwipe!
701endfunc
702
703func Test_diff_nomodifiable()
704 new
705 call setline(1, [1, 2, 3, 4])
706 setl nomodifiable
707 diffthis
708 vnew
709 call setline(1, ['1x', 2, 3, 3, 4])
710 diffthis
711 call assert_fails('norm dp', 'E793:')
712 setl nomodifiable
713 call assert_fails('norm do', 'E21:')
714 %bwipe!
715endfunc
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100716
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200717func Test_diff_hlID()
718 new
719 call setline(1, [1, 2, 3])
720 diffthis
721 vnew
722 call setline(1, ['1x', 2, 'x', 3])
723 diffthis
724 redraw
725
Bram Moolenaara74e4942019-08-04 17:35:53 +0200726 call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200727
Bram Moolenaara74e4942019-08-04 17:35:53 +0200728 call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange")
729 call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText")
730 call diff_hlID(2, 1)->synIDattr("name")->assert_equal("")
731 call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd")
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200732 eval 4->diff_hlID(1)->synIDattr("name")->assert_equal("")
Bram Moolenaar97fbc402017-09-26 19:41:46 +0200733
734 wincmd w
735 call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange")
736 call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "")
737 call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "")
738
739 %bwipe!
740endfunc
741
742func Test_diff_filler()
743 new
744 call setline(1, [1, 2, 3, 'x', 4])
745 diffthis
746 vnew
747 call setline(1, [1, 2, 'y', 'y', 3, 4])
748 diffthis
749 redraw
750
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200751 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 +0200752 wincmd w
753 call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
754
755 %bwipe!
756endfunc
757
Bram Moolenaarf58a8472017-03-05 18:03:04 +0100758func Test_diff_lastline()
759 enew!
760 only!
761 call setline(1, ['This is a ', 'line with five ', 'rows'])
762 diffthis
763 botright vert new
764 call setline(1, ['This is', 'a line with ', 'four rows'])
765 diffthis
766 1
767 call feedkeys("Je a\<CR>", 'tx')
768 call feedkeys("Je a\<CR>", 'tx')
769 let w1lines = winline()
770 wincmd w
771 $
772 let w2lines = winline()
773 call assert_equal(w2lines, w1lines)
774 bwipe!
775 bwipe!
776endfunc
Bram Moolenaare828b762018-09-10 17:51:58 +0200777
Bram Moolenaar785fc652018-09-15 19:17:38 +0200778func WriteDiffFiles(buf, list1, list2)
Bram Moolenaare828b762018-09-10 17:51:58 +0200779 call writefile(a:list1, 'Xfile1')
780 call writefile(a:list2, 'Xfile2')
Bram Moolenaar785fc652018-09-15 19:17:38 +0200781 if a:buf
782 call term_sendkeys(a:buf, ":checktime\<CR>")
783 endif
Bram Moolenaare828b762018-09-10 17:51:58 +0200784endfunc
785
Bram Moolenaar785fc652018-09-15 19:17:38 +0200786" Verify a screendump with both the internal and external diff.
Bram Moolenaare828b762018-09-10 17:51:58 +0200787func VerifyBoth(buf, dumpfile, extra)
Bram Moolenaare828b762018-09-10 17:51:58 +0200788 " trailing : for leaving the cursor on the command line
Bram Moolenaar785fc652018-09-15 19:17:38 +0200789 for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"]
Bram Moolenaare828b762018-09-10 17:51:58 +0200790 call term_sendkeys(a:buf, cmd)
791 if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external')
Bram Moolenaar485b6272021-05-18 19:19:03 +0200792 " don't let the next iteration overwrite the "failed" file.
793 return
Bram Moolenaare828b762018-09-10 17:51:58 +0200794 endif
795 endfor
Bram Moolenaar485b6272021-05-18 19:19:03 +0200796
797 " also test unified diff
798 call term_sendkeys(a:buf, ":call SetupUnified()\<CR>:")
glacambread5c1782021-05-24 14:20:53 +0200799 call term_sendkeys(a:buf, ":redraw!\<CR>:")
Bram Moolenaar485b6272021-05-18 19:19:03 +0200800 call VerifyScreenDump(a:buf, a:dumpfile, {}, 'unified')
801 call term_sendkeys(a:buf, ":call StopUnified()\<CR>:")
Bram Moolenaare828b762018-09-10 17:51:58 +0200802endfunc
803
Bram Moolenaar785fc652018-09-15 19:17:38 +0200804" Verify a screendump with the internal diff only.
805func VerifyInternal(buf, dumpfile, extra)
806 call term_sendkeys(a:buf, ":diffupdate!\<CR>")
807 " trailing : for leaving the cursor on the command line
808 call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200809 call TermWait(a:buf)
Bram Moolenaar785fc652018-09-15 19:17:38 +0200810 call VerifyScreenDump(a:buf, a:dumpfile, {})
811endfunc
812
Bram Moolenaare828b762018-09-10 17:51:58 +0200813func Test_diff_screen()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200814 CheckScreendump
815 CheckFeature menu
816
Bram Moolenaar485b6272021-05-18 19:19:03 +0200817 let lines =<< trim END
818 func UnifiedDiffExpr()
819 " Prepend some text to check diff type detection
820 call writefile(['warning', ' message'], v:fname_out)
glacambread5c1782021-05-24 14:20:53 +0200821 silent exe '!diff -U0 ' .. v:fname_in .. ' ' .. v:fname_new .. '>>' .. v:fname_out
Bram Moolenaar485b6272021-05-18 19:19:03 +0200822 endfunc
823 func SetupUnified()
824 set diffexpr=UnifiedDiffExpr()
glacambread5c1782021-05-24 14:20:53 +0200825 diffupdate
Bram Moolenaar485b6272021-05-18 19:19:03 +0200826 endfunc
827 func StopUnified()
828 set diffexpr=
829 endfunc
830 END
831 call writefile(lines, 'XdiffSetup')
832
Bram Moolenaare828b762018-09-10 17:51:58 +0200833 " clean up already existing swap files, just in case
834 call delete('.Xfile1.swp')
835 call delete('.Xfile2.swp')
836
837 " Test 1: Add a line in beginning of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200838 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 +0200839 let buf = RunVimInTerminal('-d -S XdiffSetup Xfile1 Xfile2', {})
Bram Moolenaar8ee4c012019-03-29 18:08:18 +0100840 " Set autoread mode, so that Vim won't complain once we re-write the test
Bram Moolenaare828b762018-09-10 17:51:58 +0200841 " files
Bram Moolenaar785fc652018-09-15 19:17:38 +0200842 call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
Bram Moolenaare828b762018-09-10 17:51:58 +0200843
844 call VerifyBoth(buf, 'Test_diff_01', '')
845
846 " Test 2: Add a line in beginning of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200847 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 +0200848 call VerifyBoth(buf, 'Test_diff_02', '')
849
850 " Test 3: Add a line at the end of file 2
Bram Moolenaar785fc652018-09-15 19:17:38 +0200851 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 +0200852 call VerifyBoth(buf, 'Test_diff_03', '')
853
854 " Test 4: Add a line at the end of file 1
Bram Moolenaar785fc652018-09-15 19:17:38 +0200855 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 +0200856 call VerifyBoth(buf, 'Test_diff_04', '')
857
858 " 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 +0200859 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 +0200860 call VerifyBoth(buf, 'Test_diff_05', '')
861
862 " 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 +0200863 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 +0200864 call VerifyBoth(buf, 'Test_diff_06', '')
865
Bram Moolenaarb9ddda62019-02-19 23:00:50 +0100866 " Variants on test 6 with different context settings
867 call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
868 call VerifyScreenDump(buf, 'Test_diff_06.2', {})
869 call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
870 call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
871 call VerifyScreenDump(buf, 'Test_diff_06.1', {})
872 call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
873 call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
874 call VerifyScreenDump(buf, 'Test_diff_06.0', {})
875 call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
876
Bram Moolenaare828b762018-09-10 17:51:58 +0200877 " Test 7 - 9: Test normal/patience/histogram diff algorithm
Bram Moolenaar785fc652018-09-15 19:17:38 +0200878 call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
Bram Moolenaare828b762018-09-10 17:51:58 +0200879 \ ' int i;', ' for(i = 0; i < 10; i++)', ' {', ' printf("Your answer is: ");',
880 \ ' printf("%d\n", foo);', ' }', '}', '', 'int fact(int n)', '{', ' if(n > 1)', ' {',
881 \ ' return fact(n-1) * n;', ' }', ' return 1;', '}', '', 'int main(int argc, char **argv)',
882 \ '{', ' frobnitz(fact(10));', '}'],
883 \ ['#include <stdio.h>', '', 'int fib(int n)', '{', ' if(n > 2)', ' {',
884 \ ' return fib(n-1) + fib(n-2);', ' }', ' return 1;', '}', '', '// Frobs foo heartily',
885 \ 'int frobnitz(int foo)', '{', ' int i;', ' for(i = 0; i < 10; i++)', ' {',
886 \ ' printf("%d\n", foo);', ' }', '}', '',
887 \ 'int main(int argc, char **argv)', '{', ' frobnitz(fib(10));', '}'])
888 call term_sendkeys(buf, ":diffupdate!\<cr>")
889 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
890 call VerifyScreenDump(buf, 'Test_diff_07', {})
891
892 call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
893 call VerifyScreenDump(buf, 'Test_diff_08', {})
894
895 call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
896 call VerifyScreenDump(buf, 'Test_diff_09', {})
897
898 " Test 10-11: normal/indent-heuristic
899 call term_sendkeys(buf, ":set diffopt&vim\<cr>")
Bram Moolenaar785fc652018-09-15 19:17:38 +0200900 call WriteDiffFiles(buf, ['', ' def finalize(values)', '', ' values.each do |v|', ' v.finalize', ' end'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200901 \ ['', ' def finalize(values)', '', ' values.each do |v|', ' v.prepare', ' end', '',
902 \ ' values.each do |v|', ' v.finalize', ' end'])
903 call term_sendkeys(buf, ":diffupdate!\<cr>")
904 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
905 call VerifyScreenDump(buf, 'Test_diff_10', {})
906
Bram Moolenaarb6fc7282018-12-04 22:24:16 +0100907 " Leave trailing : at commandline!
908 call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
909 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
910 " shouldn't matter, if indent-algorithm comes before or after the algorithm
911 call term_sendkeys(buf, ":set diffopt&\<cr>")
912 call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
913 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
914 call term_sendkeys(buf, ":set diffopt&\<cr>")
915 call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
916 call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
Bram Moolenaare828b762018-09-10 17:51:58 +0200917
918 " Test 12: diff the same file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200919 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 +0200920 call VerifyBoth(buf, 'Test_diff_12', '')
921
922 " Test 13: diff an empty file
Bram Moolenaar785fc652018-09-15 19:17:38 +0200923 call WriteDiffFiles(buf, [], [])
Bram Moolenaare828b762018-09-10 17:51:58 +0200924 call VerifyBoth(buf, 'Test_diff_13', '')
925
926 " Test 14: test diffopt+=icase
Bram Moolenaar785fc652018-09-15 19:17:38 +0200927 call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
Bram Moolenaare828b762018-09-10 17:51:58 +0200928 call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
929
930 " Test 15-16: test diffopt+=iwhite
Bram Moolenaar785fc652018-09-15 19:17:38 +0200931 call WriteDiffFiles(buf, ['int main()', '{', ' printf("Hello, World!");', ' return 0;', '}'],
Bram Moolenaare828b762018-09-10 17:51:58 +0200932 \ ['int main()', '{', ' if (0)', ' {', ' printf("Hello, World!");', ' return 0;', ' }', '}'])
933 call term_sendkeys(buf, ":diffupdate!\<cr>")
934 call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
935 call VerifyScreenDump(buf, 'Test_diff_15', {})
936 call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
937 call VerifyScreenDump(buf, 'Test_diff_16', {})
938
Bram Moolenaar785fc652018-09-15 19:17:38 +0200939 " Test 17: test diffopt+=iblank
940 call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
941 call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
942
943 " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
944 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
945 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
946 call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
947
948 " Test 19: test diffopt+=iwhiteeol
949 call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
950 call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
951
952 " Test 19: test diffopt+=iwhiteall
953 call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
954
Bram Moolenaare828b762018-09-10 17:51:58 +0200955 " clean up
956 call StopVimInTerminal(buf)
957 call delete('Xfile1')
958 call delete('Xfile2')
Bram Moolenaar485b6272021-05-18 19:19:03 +0200959 call delete('XdiffSetup')
Bram Moolenaare828b762018-09-10 17:51:58 +0200960endfunc
961
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +0200962func Test_diff_with_cursorline()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +0200963 CheckScreendump
Bram Moolenaar4a5abbd2018-10-02 18:26:10 +0200964
965 call writefile([
966 \ 'hi CursorLine ctermbg=red ctermfg=white',
967 \ 'set cursorline',
968 \ 'call setline(1, ["foo","foo","foo","bar"])',
969 \ 'vnew',
970 \ 'call setline(1, ["bee","foo","foo","baz"])',
971 \ 'windo diffthis',
972 \ '2wincmd w',
973 \ ], 'Xtest_diff_cursorline')
974 let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
975
976 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
977 call term_sendkeys(buf, "j")
978 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
979 call term_sendkeys(buf, "j")
980 call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
981
982 " clean up
983 call StopVimInTerminal(buf)
984 call delete('Xtest_diff_cursorline')
985endfunc
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +0100986
Bram Moolenaar248fdb32019-09-15 19:31:28 +0200987func Test_diff_with_syntax()
988 CheckScreendump
989
990 let lines =<< trim END
991 void doNothing() {
992 int x = 0;
993 char *s = "hello";
994 return 5;
995 }
996 END
997 call writefile(lines, 'Xprogram1.c')
998 let lines =<< trim END
999 void doSomething() {
1000 int x = 0;
1001 char *s = "there";
1002 return 5;
1003 }
1004 END
1005 call writefile(lines, 'Xprogram2.c')
1006
1007 let lines =<< trim END
1008 edit Xprogram1.c
1009 diffsplit Xprogram2.c
1010 END
1011 call writefile(lines, 'Xtest_diff_syntax')
1012 let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
1013
1014 call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
1015
1016 " clean up
1017 call StopVimInTerminal(buf)
1018 call delete('Xtest_diff_syntax')
1019 call delete('Xprogram1.c')
1020 call delete('Xprogram2.c')
1021endfunc
1022
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001023func Test_diff_of_diff()
Bram Moolenaar3c8ee622019-08-03 22:55:50 +02001024 CheckScreendump
1025 CheckFeature rightleft
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001026
1027 call writefile([
1028 \ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
1029 \ 'vnew',
1030 \ 'call setline(1, ["aa","bb","cc"])',
1031 \ 'windo diffthis',
Bram Moolenaar8ee4c012019-03-29 18:08:18 +01001032 \ '1wincmd w',
1033 \ 'setlocal number',
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001034 \ ], 'Xtest_diff_diff')
1035 let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
1036
1037 call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
1038
Bram Moolenaare73f9112019-03-29 18:29:54 +01001039 call term_sendkeys(buf, ":set rightleft\<cr>")
1040 call VerifyScreenDump(buf, 'Test_diff_of_diff_02', {})
1041
Bram Moolenaarf7acf2b2018-11-01 21:14:53 +01001042 " clean up
1043 call StopVimInTerminal(buf)
1044 call delete('Xtest_diff_diff')
1045endfunc
Bram Moolenaarc8234772019-11-10 21:00:27 +01001046
1047func CloseoffSetup()
1048 enew
1049 call setline(1, ['one', 'two', 'three'])
1050 diffthis
1051 new
1052 call setline(1, ['one', 'tow', 'three'])
1053 diffthis
1054 call assert_equal(1, &diff)
1055 only!
1056endfunc
1057
1058func Test_diff_closeoff()
1059 " "closeoff" included by default: last diff win gets 'diff' reset'
1060 call CloseoffSetup()
1061 call assert_equal(0, &diff)
1062 enew!
1063
1064 " "closeoff" excluded: last diff win keeps 'diff' set'
1065 set diffopt-=closeoff
1066 call CloseoffSetup()
1067 call assert_equal(1, &diff)
1068 diffoff!
1069 enew!
1070endfunc
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01001071
Bram Moolenaar4223d432021-02-10 13:18:17 +01001072func Test_diff_followwrap()
1073 new
1074 set diffopt+=followwrap
1075 set wrap
1076 diffthis
1077 call assert_equal(1, &wrap)
1078 diffoff
1079 set nowrap
1080 diffthis
1081 call assert_equal(0, &wrap)
1082 diffoff
1083 set diffopt&
1084 bwipe!
1085endfunc
1086
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01001087func Test_diff_maintains_change_mark()
1088 enew!
1089 call setline(1, ['a', 'b', 'c', 'd'])
1090 diffthis
1091 new
1092 call setline(1, ['a', 'b', 'c', 'e'])
1093 " Set '[ and '] marks
1094 2,3yank
1095 call assert_equal([2, 3], [line("'["), line("']")])
1096 " Verify they aren't affected by the implicit diff
1097 diffthis
1098 call assert_equal([2, 3], [line("'["), line("']")])
1099 " Verify they aren't affected by an explicit diff
1100 diffupdate
1101 call assert_equal([2, 3], [line("'["), line("']")])
1102 bwipe!
1103 bwipe!
1104endfunc
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001105
1106" Test for 'patchexpr'
1107func Test_patchexpr()
1108 let g:patch_args = []
1109 func TPatch()
1110 call add(g:patch_args, readfile(v:fname_in))
1111 call add(g:patch_args, readfile(v:fname_diff))
1112 call writefile(['output file'], v:fname_out)
1113 endfunc
1114 set patchexpr=TPatch()
1115
1116 call writefile(['input file'], 'Xinput')
1117 call writefile(['diff file'], 'Xdiff')
1118 %bwipe!
1119 edit Xinput
1120 diffpatch Xdiff
1121 call assert_equal('output file', getline(1))
1122 call assert_equal('Xinput.new', bufname())
1123 call assert_equal(2, winnr('$'))
1124 call assert_true(&diff)
1125
1126 call delete('Xinput')
1127 call delete('Xdiff')
1128 set patchexpr&
1129 delfunc TPatch
1130 %bwipe!
1131endfunc
1132
Bram Moolenaar511feec2020-06-18 19:15:27 +02001133func Test_diff_rnu()
1134 CheckScreendump
1135
1136 let content =<< trim END
1137 call setline(1, ['a', 'a', 'a', 'y', 'b', 'b', 'b', 'b', 'b'])
1138 vnew
1139 call setline(1, ['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b', 'b', 'b'])
1140 windo diffthis
1141 setlocal number rnu foldcolumn=0
1142 END
1143 call writefile(content, 'Xtest_diff_rnu')
1144 let buf = RunVimInTerminal('-S Xtest_diff_rnu', {})
1145
1146 call VerifyScreenDump(buf, 'Test_diff_rnu_01', {})
1147
1148 call term_sendkeys(buf, "j")
1149 call VerifyScreenDump(buf, 'Test_diff_rnu_02', {})
1150 call term_sendkeys(buf, "j")
1151 call VerifyScreenDump(buf, 'Test_diff_rnu_03', {})
1152
1153 " clean up
1154 call StopVimInTerminal(buf)
1155 call delete('Xtest_diff_rnu')
1156endfunc
1157
Bram Moolenaarfc838d62020-06-25 22:23:48 +02001158func Test_diff_multilineconceal()
1159 new
1160 diffthis
1161
1162 new
1163 call matchadd('Conceal', 'a\nb', 9, -1, {'conceal': 'Y'})
1164 set cole=2 cocu=n
1165 call setline(1, ["a", "b"])
1166 diffthis
1167 redraw
1168endfunc
1169
Bram Moolenaar8455c5e2020-07-14 21:22:30 +02001170func Test_diff_and_scroll()
1171 " this was causing an ml_get error
1172 set ls=2
1173 for i in range(winheight(0) * 2)
1174 call setline(i, i < winheight(0) - 10 ? i : i + 10)
1175 endfor
1176 vnew
1177 for i in range(winheight(0)*2 + 10)
1178 call setline(i, i < winheight(0) - 10 ? 0 : i)
1179 endfor
1180 diffthis
1181 wincmd p
1182 diffthis
1183 execute 'normal ' . winheight(0) . "\<C-d>"
1184
1185 bwipe!
1186 bwipe!
1187 set ls&
1188endfunc
1189
Bram Moolenaarfabc3ca2020-11-05 19:07:21 +01001190func Test_diff_filler_cursorcolumn()
1191 CheckScreendump
1192
1193 let content =<< trim END
1194 call setline(1, ['aa', 'bb', 'cc'])
1195 vnew
1196 call setline(1, ['aa', 'cc'])
1197 windo diffthis
1198 wincmd p
1199 setlocal cursorcolumn foldcolumn=0
1200 norm! gg0
1201 redraw!
1202 END
1203 call writefile(content, 'Xtest_diff_cuc')
1204 let buf = RunVimInTerminal('-S Xtest_diff_cuc', {})
1205
1206 call VerifyScreenDump(buf, 'Test_diff_cuc_01', {})
1207
1208 call term_sendkeys(buf, "l")
1209 call term_sendkeys(buf, "\<C-l>")
1210 call VerifyScreenDump(buf, 'Test_diff_cuc_02', {})
1211 call term_sendkeys(buf, "0j")
1212 call term_sendkeys(buf, "\<C-l>")
1213 call VerifyScreenDump(buf, 'Test_diff_cuc_03', {})
1214 call term_sendkeys(buf, "l")
1215 call term_sendkeys(buf, "\<C-l>")
1216 call VerifyScreenDump(buf, 'Test_diff_cuc_04', {})
1217
1218 " clean up
1219 call StopVimInTerminal(buf)
1220 call delete('Xtest_diff_cuc')
1221endfunc
1222
glacambread5c1782021-05-24 14:20:53 +02001223
Bram Moolenaar8dfcce32020-03-18 19:32:26 +01001224" vim: shiftwidth=2 sts=2 expandtab