142093c0eSBram Moolenaar" Tests for diff mode
2*c3c766eaSBram Moolenaarset belloff=all
342093c0eSBram Moolenaar
442093c0eSBram Moolenaarfunc Test_diff_fold_sync()
542093c0eSBram Moolenaar  enew!
642093c0eSBram Moolenaar  let l = range(50)
742093c0eSBram Moolenaar  call setline(1, l)
842093c0eSBram Moolenaar  diffthis
942093c0eSBram Moolenaar  let winone = win_getid()
1042093c0eSBram Moolenaar  new
1142093c0eSBram Moolenaar  let l[25] = 'diff'
1242093c0eSBram Moolenaar  call setline(1, l)
1342093c0eSBram Moolenaar  diffthis
1442093c0eSBram Moolenaar  let wintwo = win_getid()
1542093c0eSBram Moolenaar  " line 15 is inside the closed fold
1642093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
1742093c0eSBram Moolenaar  call win_gotoid(winone)
1842093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
1942093c0eSBram Moolenaar  " open the fold
2042093c0eSBram Moolenaar  normal zv
2142093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
2242093c0eSBram Moolenaar  " fold in other window must have opened too
2342093c0eSBram Moolenaar  call win_gotoid(wintwo)
2442093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
2542093c0eSBram Moolenaar
2642093c0eSBram Moolenaar  " cursor position is in sync
2742093c0eSBram Moolenaar  normal 23G
2842093c0eSBram Moolenaar  call win_gotoid(winone)
2942093c0eSBram Moolenaar  call assert_equal(23, getcurpos()[1])
3042093c0eSBram Moolenaar
3142093c0eSBram Moolenaar  windo diffoff
3242093c0eSBram Moolenaar  close!
3342093c0eSBram Moolenaar  set nomodified
3442093c0eSBram Moolenaarendfunc
3542093c0eSBram Moolenaar
3642093c0eSBram Moolenaarfunc Test_vert_split()
3742093c0eSBram Moolenaar  " Disable the title to avoid xterm keeping the wrong one.
3842093c0eSBram Moolenaar  set notitle noicon
3942093c0eSBram Moolenaar  new
4042093c0eSBram Moolenaar  let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
4142093c0eSBram Moolenaar  call setline(1, l)
4242093c0eSBram Moolenaar  w! Xtest
4342093c0eSBram Moolenaar  normal dd
4442093c0eSBram Moolenaar  $
4542093c0eSBram Moolenaar  put
4642093c0eSBram Moolenaar  normal kkrXoxxx
4742093c0eSBram Moolenaar  w! Xtest2
4842093c0eSBram Moolenaar  file Nop
4942093c0eSBram Moolenaar  normal ggoyyyjjjozzzz
5042093c0eSBram Moolenaar  set foldmethod=marker foldcolumn=4
5142093c0eSBram Moolenaar  call assert_equal(0, &diff)
5242093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
5342093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
5442093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
5542093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
5642093c0eSBram Moolenaar  call assert_equal(1, &wrap)
5742093c0eSBram Moolenaar
5842093c0eSBram Moolenaar  vert diffsplit Xtest
5942093c0eSBram Moolenaar  vert diffsplit Xtest2
6042093c0eSBram Moolenaar  call assert_equal(1, &diff)
6142093c0eSBram Moolenaar  call assert_equal('diff', &foldmethod)
6242093c0eSBram Moolenaar  call assert_equal(2, &foldcolumn)
6342093c0eSBram Moolenaar  call assert_equal(1, &scrollbind)
6442093c0eSBram Moolenaar  call assert_equal(1, &cursorbind)
6542093c0eSBram Moolenaar  call assert_equal(0, &wrap)
6642093c0eSBram Moolenaar
6742093c0eSBram Moolenaar  let diff_fdm = &fdm
6842093c0eSBram Moolenaar  let diff_fdc = &fdc
6942093c0eSBram Moolenaar  " repeat entering diff mode here to see if this saves the wrong settings
7042093c0eSBram Moolenaar  diffthis
7142093c0eSBram Moolenaar  " jump to second window for a moment to have filler line appear at start of
7242093c0eSBram Moolenaar  " first window
7342093c0eSBram Moolenaar  wincmd w
7442093c0eSBram Moolenaar  normal gg
7542093c0eSBram Moolenaar  wincmd p
7642093c0eSBram Moolenaar  normal gg
7742093c0eSBram Moolenaar  call assert_equal(2, winline())
7842093c0eSBram Moolenaar  normal j
7942093c0eSBram Moolenaar  call assert_equal(4, winline())
8042093c0eSBram Moolenaar  normal j
8142093c0eSBram Moolenaar  call assert_equal(5, winline())
8242093c0eSBram Moolenaar  normal j
8342093c0eSBram Moolenaar  call assert_equal(6, winline())
8442093c0eSBram Moolenaar  normal j
8542093c0eSBram Moolenaar  call assert_equal(8, winline())
8642093c0eSBram Moolenaar  normal j
8742093c0eSBram Moolenaar  call assert_equal(9, winline())
8842093c0eSBram Moolenaar
8942093c0eSBram Moolenaar  wincmd w
9042093c0eSBram Moolenaar  normal gg
9142093c0eSBram Moolenaar  call assert_equal(1, winline())
9242093c0eSBram Moolenaar  normal j
9342093c0eSBram Moolenaar  call assert_equal(2, winline())
9442093c0eSBram Moolenaar  normal j
9542093c0eSBram Moolenaar  call assert_equal(4, winline())
9642093c0eSBram Moolenaar  normal j
9742093c0eSBram Moolenaar  call assert_equal(5, winline())
9842093c0eSBram Moolenaar  normal j
9942093c0eSBram Moolenaar  call assert_equal(8, winline())
10042093c0eSBram Moolenaar
10142093c0eSBram Moolenaar  wincmd w
10242093c0eSBram Moolenaar  normal gg
10342093c0eSBram Moolenaar  call assert_equal(2, winline())
10442093c0eSBram Moolenaar  normal j
10542093c0eSBram Moolenaar  call assert_equal(3, winline())
10642093c0eSBram Moolenaar  normal j
10742093c0eSBram Moolenaar  call assert_equal(4, winline())
10842093c0eSBram Moolenaar  normal j
10942093c0eSBram Moolenaar  call assert_equal(5, winline())
11042093c0eSBram Moolenaar  normal j
11142093c0eSBram Moolenaar  call assert_equal(6, winline())
11242093c0eSBram Moolenaar  normal j
11342093c0eSBram Moolenaar  call assert_equal(7, winline())
11442093c0eSBram Moolenaar  normal j
11542093c0eSBram Moolenaar  call assert_equal(8, winline())
11642093c0eSBram Moolenaar
11742093c0eSBram Moolenaar  " Test diffoff
11842093c0eSBram Moolenaar  diffoff!
11942093c0eSBram Moolenaar  1wincmd 2
12042093c0eSBram Moolenaar  let &diff = 1
12142093c0eSBram Moolenaar  let &fdm = diff_fdm
12242093c0eSBram Moolenaar  let &fdc = diff_fdc
12342093c0eSBram Moolenaar  4wincmd w
12442093c0eSBram Moolenaar  diffoff!
12542093c0eSBram Moolenaar  1wincmd w
12642093c0eSBram Moolenaar  call assert_equal(0, &diff)
12742093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
12842093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
12942093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
13042093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
13142093c0eSBram Moolenaar  call assert_equal(1, &wrap)
13242093c0eSBram Moolenaar
13342093c0eSBram Moolenaar  wincmd w
13442093c0eSBram Moolenaar  call assert_equal(0, &diff)
13542093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
13642093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
13742093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
13842093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
13942093c0eSBram Moolenaar  call assert_equal(1, &wrap)
14042093c0eSBram Moolenaar
14142093c0eSBram Moolenaar  wincmd w
14242093c0eSBram Moolenaar  call assert_equal(0, &diff)
14342093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
14442093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
14542093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
14642093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
14742093c0eSBram Moolenaar  call assert_equal(1, &wrap)
14842093c0eSBram Moolenaar
149623cf88fSBram Moolenaar  call delete('Xtest')
150623cf88fSBram Moolenaar  call delete('Xtest2')
15142093c0eSBram Moolenaar  windo bw!
15242093c0eSBram Moolenaarendfunc
15342093c0eSBram Moolenaar
15442093c0eSBram Moolenaarfunc Test_filler_lines()
15542093c0eSBram Moolenaar  " Test that diffing shows correct filler lines
15642093c0eSBram Moolenaar  enew!
15742093c0eSBram Moolenaar  put =range(4,10)
15842093c0eSBram Moolenaar  1d _
15942093c0eSBram Moolenaar  vnew
16042093c0eSBram Moolenaar  put =range(1,10)
16142093c0eSBram Moolenaar  1d _
16242093c0eSBram Moolenaar  windo diffthis
16342093c0eSBram Moolenaar  wincmd h
16442093c0eSBram Moolenaar  call assert_equal(1, line('w0'))
16542093c0eSBram Moolenaar  unlet! diff_fdm diff_fdc
16690d121faSBram Moolenaar  windo diffoff
16790d121faSBram Moolenaar  bwipe!
16890d121faSBram Moolenaar  enew!
16990d121faSBram Moolenaarendfunc
17042093c0eSBram Moolenaar
17190d121faSBram Moolenaarfunc Test_diffget_diffput()
17290d121faSBram Moolenaar  enew!
17390d121faSBram Moolenaar  let l = range(50)
17490d121faSBram Moolenaar  call setline(1, l)
17590d121faSBram Moolenaar  call assert_fails('diffget', 'E99:')
17690d121faSBram Moolenaar  diffthis
17790d121faSBram Moolenaar  call assert_fails('diffget', 'E100:')
17890d121faSBram Moolenaar  new
17990d121faSBram Moolenaar  let l[10] = 'one'
18090d121faSBram Moolenaar  let l[20] = 'two'
18190d121faSBram Moolenaar  let l[30] = 'three'
18290d121faSBram Moolenaar  let l[40] = 'four'
18390d121faSBram Moolenaar  call setline(1, l)
18490d121faSBram Moolenaar  diffthis
18590d121faSBram Moolenaar  call assert_equal('one', getline(11))
18690d121faSBram Moolenaar  11diffget
18790d121faSBram Moolenaar  call assert_equal('10', getline(11))
18890d121faSBram Moolenaar  21diffput
18990d121faSBram Moolenaar  wincmd w
19090d121faSBram Moolenaar  call assert_equal('two', getline(21))
19190d121faSBram Moolenaar  normal 31Gdo
19290d121faSBram Moolenaar  call assert_equal('three', getline(31))
19390d121faSBram Moolenaar  call assert_equal('40', getline(41))
19490d121faSBram Moolenaar  normal 41Gdp
19590d121faSBram Moolenaar  wincmd w
19690d121faSBram Moolenaar  call assert_equal('40', getline(41))
19790d121faSBram Moolenaar  new
19890d121faSBram Moolenaar  diffthis
19990d121faSBram Moolenaar  call assert_fails('diffget', 'E101:')
20090d121faSBram Moolenaar
20190d121faSBram Moolenaar  windo diffoff
20290d121faSBram Moolenaar  bwipe!
20390d121faSBram Moolenaar  bwipe!
20490d121faSBram Moolenaar  enew!
20542093c0eSBram Moolenaarendfunc
206e67d546fSBram Moolenaar
207e67d546fSBram Moolenaarfunc Test_diffoff()
208e67d546fSBram Moolenaar  enew!
209e67d546fSBram Moolenaar  call setline(1, ['Two', 'Three'])
210e67d546fSBram Moolenaar  let normattr = screenattr(1, 1)
211e67d546fSBram Moolenaar  diffthis
212e67d546fSBram Moolenaar  botright vert new
213e67d546fSBram Moolenaar  call setline(1, ['One', '', 'Two', 'Three'])
214e67d546fSBram Moolenaar  diffthis
215e67d546fSBram Moolenaar  redraw
21625ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
217e67d546fSBram Moolenaar  diffoff!
218e67d546fSBram Moolenaar  redraw
219e67d546fSBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
220e67d546fSBram Moolenaar  bwipe!
221e67d546fSBram Moolenaar  bwipe!
222e67d546fSBram Moolenaarendfunc
223025e3e0bSBram Moolenaar
22425ea0544SBram Moolenaarfunc Test_diffoff_hidden()
22525ea0544SBram Moolenaar  set diffopt=filler,foldcolumn:0
22625ea0544SBram Moolenaar  e! one
22725ea0544SBram Moolenaar  call setline(1, ['Two', 'Three'])
22825ea0544SBram Moolenaar  let normattr = screenattr(1, 1)
22925ea0544SBram Moolenaar  diffthis
23025ea0544SBram Moolenaar  botright vert new two
23125ea0544SBram Moolenaar  call setline(1, ['One', 'Four'])
23225ea0544SBram Moolenaar  diffthis
23325ea0544SBram Moolenaar  redraw
23425ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
23525ea0544SBram Moolenaar  set hidden
23625ea0544SBram Moolenaar  close
23725ea0544SBram Moolenaar  redraw
23825ea0544SBram Moolenaar  " diffing with hidden buffer two
23925ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
24025ea0544SBram Moolenaar  diffoff
24125ea0544SBram Moolenaar  redraw
24225ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
24325ea0544SBram Moolenaar  diffthis
24425ea0544SBram Moolenaar  redraw
24525ea0544SBram Moolenaar  " still diffing with hidden buffer two
24625ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
24725ea0544SBram Moolenaar  diffoff!
24825ea0544SBram Moolenaar  redraw
24925ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
25025ea0544SBram Moolenaar  diffthis
25125ea0544SBram Moolenaar  redraw
25225ea0544SBram Moolenaar  " no longer diffing with hidden buffer two
25325ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
25425ea0544SBram Moolenaar
25525ea0544SBram Moolenaar  bwipe!
25625ea0544SBram Moolenaar  bwipe!
25725ea0544SBram Moolenaar  set hidden& diffopt&
25825ea0544SBram Moolenaarendfunc
25925ea0544SBram Moolenaar
260025e3e0bSBram Moolenaarfunc Test_setting_cursor()
261025e3e0bSBram Moolenaar  new Xtest1
262025e3e0bSBram Moolenaar  put =range(1,90)
263025e3e0bSBram Moolenaar  wq
264025e3e0bSBram Moolenaar  new Xtest2
265025e3e0bSBram Moolenaar  put =range(1,100)
266025e3e0bSBram Moolenaar  wq
267025e3e0bSBram Moolenaar
268025e3e0bSBram Moolenaar  tabe Xtest2
269025e3e0bSBram Moolenaar  $
270025e3e0bSBram Moolenaar  diffsp Xtest1
271025e3e0bSBram Moolenaar  tabclose
272025e3e0bSBram Moolenaar
273025e3e0bSBram Moolenaar  call delete('Xtest1')
274025e3e0bSBram Moolenaar  call delete('Xtest2')
275025e3e0bSBram Moolenaarendfunc
276aeb661e1SBram Moolenaar
277aeb661e1SBram Moolenaarfunc Test_diff_move_to()
278aeb661e1SBram Moolenaar  new
279aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
280aeb661e1SBram Moolenaar  diffthis
281aeb661e1SBram Moolenaar  vnew
282aeb661e1SBram Moolenaar  call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
283aeb661e1SBram Moolenaar  diffthis
284aeb661e1SBram Moolenaar  norm ]c
285aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
286aeb661e1SBram Moolenaar  norm 3]c
287aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
288aeb661e1SBram Moolenaar  norm 10]c
289aeb661e1SBram Moolenaar  call assert_equal(11, line('.'))
290aeb661e1SBram Moolenaar  norm [c
291aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
292aeb661e1SBram Moolenaar  norm 2[c
293aeb661e1SBram Moolenaar  call assert_equal(5, line('.'))
294aeb661e1SBram Moolenaar  norm 10[c
295aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
296aeb661e1SBram Moolenaar  %bwipe!
297aeb661e1SBram Moolenaarendfunc
298aeb661e1SBram Moolenaar
299aeb661e1SBram Moolenaarfunc Test_diffpatch()
300aeb661e1SBram Moolenaar  " The patch program on MS-Windows may fail or hang.
301aeb661e1SBram Moolenaar  if !executable('patch') || !has('unix')
302aeb661e1SBram Moolenaar    return
303aeb661e1SBram Moolenaar  endif
304aeb661e1SBram Moolenaar  new
305aeb661e1SBram Moolenaar  insert
306aeb661e1SBram Moolenaar***************
307aeb661e1SBram Moolenaar*** 1,3 ****
308aeb661e1SBram Moolenaar  1
309aeb661e1SBram Moolenaar! 2
310aeb661e1SBram Moolenaar  3
311aeb661e1SBram Moolenaar--- 1,4 ----
312aeb661e1SBram Moolenaar  1
313aeb661e1SBram Moolenaar! 2x
314aeb661e1SBram Moolenaar  3
315aeb661e1SBram Moolenaar+ 4
316aeb661e1SBram Moolenaar.
317aeb661e1SBram Moolenaar  saveas Xpatch
318aeb661e1SBram Moolenaar  bwipe!
319aeb661e1SBram Moolenaar  new
320aeb661e1SBram Moolenaar  call assert_fails('diffpatch Xpatch', 'E816:')
321aeb661e1SBram Moolenaar  call setline(1, ['1', '2', '3'])
322aeb661e1SBram Moolenaar  diffpatch Xpatch
323aeb661e1SBram Moolenaar  call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
324aeb661e1SBram Moolenaar  call delete('Xpatch')
325aeb661e1SBram Moolenaar  bwipe!
326aeb661e1SBram Moolenaarendfunc
327aeb661e1SBram Moolenaar
328aeb661e1SBram Moolenaarfunc Test_diff_too_many_buffers()
329aeb661e1SBram Moolenaar  for i in range(1, 8)
330aeb661e1SBram Moolenaar    exe "new Xtest" . i
331aeb661e1SBram Moolenaar    diffthis
332aeb661e1SBram Moolenaar  endfor
333aeb661e1SBram Moolenaar  new Xtest9
334aeb661e1SBram Moolenaar  call assert_fails('diffthis', 'E96:')
335aeb661e1SBram Moolenaar  %bwipe!
336aeb661e1SBram Moolenaarendfunc
337aeb661e1SBram Moolenaar
338aeb661e1SBram Moolenaarfunc Test_diff_nomodifiable()
339aeb661e1SBram Moolenaar  new
340aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4])
341aeb661e1SBram Moolenaar  setl nomodifiable
342aeb661e1SBram Moolenaar  diffthis
343aeb661e1SBram Moolenaar  vnew
344aeb661e1SBram Moolenaar  call setline(1, ['1x', 2, 3, 3, 4])
345aeb661e1SBram Moolenaar  diffthis
346aeb661e1SBram Moolenaar  call assert_fails('norm dp', 'E793:')
347aeb661e1SBram Moolenaar  setl nomodifiable
348aeb661e1SBram Moolenaar  call assert_fails('norm do', 'E21:')
349aeb661e1SBram Moolenaar  %bwipe!
350aeb661e1SBram Moolenaarendfunc
351f58a8475SBram Moolenaar
352f58a8475SBram Moolenaarfunc Test_diff_lastline()
353f58a8475SBram Moolenaar  enew!
354f58a8475SBram Moolenaar  only!
355f58a8475SBram Moolenaar  call setline(1, ['This is a ', 'line with five ', 'rows'])
356f58a8475SBram Moolenaar  diffthis
357f58a8475SBram Moolenaar  botright vert new
358f58a8475SBram Moolenaar  call setline(1, ['This is', 'a line with ', 'four rows'])
359f58a8475SBram Moolenaar  diffthis
360f58a8475SBram Moolenaar  1
361f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
362f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
363f58a8475SBram Moolenaar  let w1lines = winline()
364f58a8475SBram Moolenaar  wincmd w
365f58a8475SBram Moolenaar  $
366f58a8475SBram Moolenaar  let w2lines = winline()
367f58a8475SBram Moolenaar  call assert_equal(w2lines, w1lines)
368f58a8475SBram Moolenaar  bwipe!
369f58a8475SBram Moolenaar  bwipe!
370f58a8475SBram Moolenaarendfunc
371