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