142093c0eSBram Moolenaar" Tests for diff mode
26d91bcb4SBram Moolenaar
3e828b762SBram Moolenaarsource shared.vim
4e828b762SBram Moolenaarsource screendump.vim
53c8ee629SBram Moolenaarsource check.vim
642093c0eSBram Moolenaar
742093c0eSBram Moolenaarfunc Test_diff_fold_sync()
842093c0eSBram Moolenaar  enew!
9e8fa05b5SBram Moolenaar  let g:update_count = 0
10e8fa05b5SBram Moolenaar  au DiffUpdated * let g:update_count += 1
11e8fa05b5SBram Moolenaar
1242093c0eSBram Moolenaar  let l = range(50)
1342093c0eSBram Moolenaar  call setline(1, l)
1442093c0eSBram Moolenaar  diffthis
1542093c0eSBram Moolenaar  let winone = win_getid()
1642093c0eSBram Moolenaar  new
1742093c0eSBram Moolenaar  let l[25] = 'diff'
1842093c0eSBram Moolenaar  call setline(1, l)
1942093c0eSBram Moolenaar  diffthis
2042093c0eSBram Moolenaar  let wintwo = win_getid()
2142093c0eSBram Moolenaar  " line 15 is inside the closed fold
2242093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
2342093c0eSBram Moolenaar  call win_gotoid(winone)
2442093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
2542093c0eSBram Moolenaar  " open the fold
2642093c0eSBram Moolenaar  normal zv
2742093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
2842093c0eSBram Moolenaar  " fold in other window must have opened too
2942093c0eSBram Moolenaar  call win_gotoid(wintwo)
3042093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
3142093c0eSBram Moolenaar
3242093c0eSBram Moolenaar  " cursor position is in sync
3342093c0eSBram Moolenaar  normal 23G
3442093c0eSBram Moolenaar  call win_gotoid(winone)
3542093c0eSBram Moolenaar  call assert_equal(23, getcurpos()[1])
3642093c0eSBram Moolenaar
37e8fa05b5SBram Moolenaar  call assert_equal(1, g:update_count)
38e8fa05b5SBram Moolenaar  au! DiffUpdated
39e8fa05b5SBram Moolenaar
4042093c0eSBram Moolenaar  windo diffoff
4142093c0eSBram Moolenaar  close!
4242093c0eSBram Moolenaar  set nomodified
4342093c0eSBram Moolenaarendfunc
4442093c0eSBram Moolenaar
4542093c0eSBram Moolenaarfunc Test_vert_split()
46e828b762SBram Moolenaar  set diffopt=filler
47e828b762SBram Moolenaar  call Common_vert_split()
48e828b762SBram Moolenaar  set diffopt&
49e828b762SBram Moolenaarendfunc
50e828b762SBram Moolenaar
51e828b762SBram Moolenaarfunc Test_vert_split_internal()
52e828b762SBram Moolenaar  set diffopt=internal,filler
53e828b762SBram Moolenaar  call Common_vert_split()
54e828b762SBram Moolenaar  set diffopt&
55e828b762SBram Moolenaarendfunc
56e828b762SBram Moolenaar
57e828b762SBram Moolenaarfunc Common_vert_split()
5842093c0eSBram Moolenaar  " Disable the title to avoid xterm keeping the wrong one.
5942093c0eSBram Moolenaar  set notitle noicon
6042093c0eSBram Moolenaar  new
6142093c0eSBram Moolenaar  let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
6242093c0eSBram Moolenaar  call setline(1, l)
6342093c0eSBram Moolenaar  w! Xtest
6442093c0eSBram Moolenaar  normal dd
6542093c0eSBram Moolenaar  $
6642093c0eSBram Moolenaar  put
6742093c0eSBram Moolenaar  normal kkrXoxxx
6842093c0eSBram Moolenaar  w! Xtest2
6942093c0eSBram Moolenaar  file Nop
7042093c0eSBram Moolenaar  normal ggoyyyjjjozzzz
7142093c0eSBram Moolenaar  set foldmethod=marker foldcolumn=4
7242093c0eSBram Moolenaar  call assert_equal(0, &diff)
7342093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
7442093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
7542093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
7642093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
7742093c0eSBram Moolenaar  call assert_equal(1, &wrap)
7842093c0eSBram Moolenaar
7942093c0eSBram Moolenaar  vert diffsplit Xtest
8042093c0eSBram Moolenaar  vert diffsplit Xtest2
8142093c0eSBram Moolenaar  call assert_equal(1, &diff)
8242093c0eSBram Moolenaar  call assert_equal('diff', &foldmethod)
8342093c0eSBram Moolenaar  call assert_equal(2, &foldcolumn)
8442093c0eSBram Moolenaar  call assert_equal(1, &scrollbind)
8542093c0eSBram Moolenaar  call assert_equal(1, &cursorbind)
8642093c0eSBram Moolenaar  call assert_equal(0, &wrap)
8742093c0eSBram Moolenaar
8842093c0eSBram Moolenaar  let diff_fdm = &fdm
8942093c0eSBram Moolenaar  let diff_fdc = &fdc
9042093c0eSBram Moolenaar  " repeat entering diff mode here to see if this saves the wrong settings
9142093c0eSBram Moolenaar  diffthis
9242093c0eSBram Moolenaar  " jump to second window for a moment to have filler line appear at start of
9342093c0eSBram Moolenaar  " first window
9442093c0eSBram Moolenaar  wincmd w
9542093c0eSBram Moolenaar  normal gg
9642093c0eSBram Moolenaar  wincmd p
9742093c0eSBram Moolenaar  normal gg
9842093c0eSBram Moolenaar  call assert_equal(2, winline())
9942093c0eSBram Moolenaar  normal j
10042093c0eSBram Moolenaar  call assert_equal(4, winline())
10142093c0eSBram Moolenaar  normal j
10242093c0eSBram Moolenaar  call assert_equal(5, winline())
10342093c0eSBram Moolenaar  normal j
10442093c0eSBram Moolenaar  call assert_equal(6, winline())
10542093c0eSBram Moolenaar  normal j
10642093c0eSBram Moolenaar  call assert_equal(8, winline())
10742093c0eSBram Moolenaar  normal j
10842093c0eSBram Moolenaar  call assert_equal(9, winline())
10942093c0eSBram Moolenaar
11042093c0eSBram Moolenaar  wincmd w
11142093c0eSBram Moolenaar  normal gg
11242093c0eSBram Moolenaar  call assert_equal(1, winline())
11342093c0eSBram Moolenaar  normal j
11442093c0eSBram Moolenaar  call assert_equal(2, winline())
11542093c0eSBram Moolenaar  normal j
11642093c0eSBram Moolenaar  call assert_equal(4, winline())
11742093c0eSBram Moolenaar  normal j
11842093c0eSBram Moolenaar  call assert_equal(5, winline())
11942093c0eSBram Moolenaar  normal j
12042093c0eSBram Moolenaar  call assert_equal(8, winline())
12142093c0eSBram Moolenaar
12242093c0eSBram Moolenaar  wincmd w
12342093c0eSBram Moolenaar  normal gg
12442093c0eSBram Moolenaar  call assert_equal(2, winline())
12542093c0eSBram Moolenaar  normal j
12642093c0eSBram Moolenaar  call assert_equal(3, winline())
12742093c0eSBram Moolenaar  normal j
12842093c0eSBram Moolenaar  call assert_equal(4, winline())
12942093c0eSBram Moolenaar  normal j
13042093c0eSBram Moolenaar  call assert_equal(5, winline())
13142093c0eSBram Moolenaar  normal j
13242093c0eSBram Moolenaar  call assert_equal(6, winline())
13342093c0eSBram Moolenaar  normal j
13442093c0eSBram Moolenaar  call assert_equal(7, winline())
13542093c0eSBram Moolenaar  normal j
13642093c0eSBram Moolenaar  call assert_equal(8, winline())
13742093c0eSBram Moolenaar
13842093c0eSBram Moolenaar  " Test diffoff
13942093c0eSBram Moolenaar  diffoff!
14042093c0eSBram Moolenaar  1wincmd 2
14142093c0eSBram Moolenaar  let &diff = 1
14242093c0eSBram Moolenaar  let &fdm = diff_fdm
14342093c0eSBram Moolenaar  let &fdc = diff_fdc
14442093c0eSBram Moolenaar  4wincmd w
14542093c0eSBram Moolenaar  diffoff!
14642093c0eSBram Moolenaar  1wincmd w
14742093c0eSBram Moolenaar  call assert_equal(0, &diff)
14842093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
14942093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
15042093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
15142093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
15242093c0eSBram Moolenaar  call assert_equal(1, &wrap)
15342093c0eSBram Moolenaar
15442093c0eSBram Moolenaar  wincmd w
15542093c0eSBram Moolenaar  call assert_equal(0, &diff)
15642093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
15742093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
15842093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
15942093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
16042093c0eSBram Moolenaar  call assert_equal(1, &wrap)
16142093c0eSBram Moolenaar
16242093c0eSBram Moolenaar  wincmd w
16342093c0eSBram Moolenaar  call assert_equal(0, &diff)
16442093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
16542093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
16642093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
16742093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
16842093c0eSBram Moolenaar  call assert_equal(1, &wrap)
16942093c0eSBram Moolenaar
170623cf88fSBram Moolenaar  call delete('Xtest')
171623cf88fSBram Moolenaar  call delete('Xtest2')
17242093c0eSBram Moolenaar  windo bw!
17342093c0eSBram Moolenaarendfunc
17442093c0eSBram Moolenaar
17542093c0eSBram Moolenaarfunc Test_filler_lines()
17642093c0eSBram Moolenaar  " Test that diffing shows correct filler lines
17742093c0eSBram Moolenaar  enew!
17842093c0eSBram Moolenaar  put =range(4,10)
17942093c0eSBram Moolenaar  1d _
18042093c0eSBram Moolenaar  vnew
18142093c0eSBram Moolenaar  put =range(1,10)
18242093c0eSBram Moolenaar  1d _
18342093c0eSBram Moolenaar  windo diffthis
18442093c0eSBram Moolenaar  wincmd h
18542093c0eSBram Moolenaar  call assert_equal(1, line('w0'))
18642093c0eSBram Moolenaar  unlet! diff_fdm diff_fdc
18790d121faSBram Moolenaar  windo diffoff
18890d121faSBram Moolenaar  bwipe!
18990d121faSBram Moolenaar  enew!
19090d121faSBram Moolenaarendfunc
19142093c0eSBram Moolenaar
19290d121faSBram Moolenaarfunc Test_diffget_diffput()
19390d121faSBram Moolenaar  enew!
19490d121faSBram Moolenaar  let l = range(50)
19590d121faSBram Moolenaar  call setline(1, l)
19690d121faSBram Moolenaar  call assert_fails('diffget', 'E99:')
19790d121faSBram Moolenaar  diffthis
19890d121faSBram Moolenaar  call assert_fails('diffget', 'E100:')
19990d121faSBram Moolenaar  new
20090d121faSBram Moolenaar  let l[10] = 'one'
20190d121faSBram Moolenaar  let l[20] = 'two'
20290d121faSBram Moolenaar  let l[30] = 'three'
20390d121faSBram Moolenaar  let l[40] = 'four'
20490d121faSBram Moolenaar  call setline(1, l)
20590d121faSBram Moolenaar  diffthis
20690d121faSBram Moolenaar  call assert_equal('one', getline(11))
20790d121faSBram Moolenaar  11diffget
20890d121faSBram Moolenaar  call assert_equal('10', getline(11))
20990d121faSBram Moolenaar  21diffput
21090d121faSBram Moolenaar  wincmd w
21190d121faSBram Moolenaar  call assert_equal('two', getline(21))
21290d121faSBram Moolenaar  normal 31Gdo
21390d121faSBram Moolenaar  call assert_equal('three', getline(31))
21490d121faSBram Moolenaar  call assert_equal('40', getline(41))
21590d121faSBram Moolenaar  normal 41Gdp
21690d121faSBram Moolenaar  wincmd w
21790d121faSBram Moolenaar  call assert_equal('40', getline(41))
21890d121faSBram Moolenaar  new
21990d121faSBram Moolenaar  diffthis
22090d121faSBram Moolenaar  call assert_fails('diffget', 'E101:')
22190d121faSBram Moolenaar
22290d121faSBram Moolenaar  windo diffoff
22379a213d6SBram Moolenaar  %bwipe!
22479a213d6SBram Moolenaarendfunc
22579a213d6SBram Moolenaar
2265f57bdcaSBram Moolenaar" Test putting two changes from one buffer to another
2275f57bdcaSBram Moolenaarfunc Test_diffput_two()
2285f57bdcaSBram Moolenaar  new a
2295f57bdcaSBram Moolenaar  let win_a = win_getid()
2305f57bdcaSBram Moolenaar  call setline(1, range(1, 10))
2315f57bdcaSBram Moolenaar  diffthis
2325f57bdcaSBram Moolenaar  new b
2335f57bdcaSBram Moolenaar  let win_b = win_getid()
2345f57bdcaSBram Moolenaar  call setline(1, range(1, 10))
2355f57bdcaSBram Moolenaar  8del
2365f57bdcaSBram Moolenaar  5del
2375f57bdcaSBram Moolenaar  diffthis
2385f57bdcaSBram Moolenaar  call win_gotoid(win_a)
2395f57bdcaSBram Moolenaar  %diffput
2405f57bdcaSBram Moolenaar  call win_gotoid(win_b)
2415f57bdcaSBram Moolenaar  call assert_equal(map(range(1, 10), 'string(v:val)'), getline(1, '$'))
2425f57bdcaSBram Moolenaar  bwipe! a
2435f57bdcaSBram Moolenaar  bwipe! b
2445f57bdcaSBram Moolenaarendfunc
2455f57bdcaSBram Moolenaar
2463044324eSYegappan Lakshmanan" Test for :diffget/:diffput with a range that is inside a diff chunk
2473044324eSYegappan Lakshmananfunc Test_diffget_diffput_range()
2483044324eSYegappan Lakshmanan  call setline(1, range(1, 10))
2493044324eSYegappan Lakshmanan  new
2503044324eSYegappan Lakshmanan  call setline(1, range(11, 20))
2513044324eSYegappan Lakshmanan  windo diffthis
2523044324eSYegappan Lakshmanan  3,5diffget
2533044324eSYegappan Lakshmanan  call assert_equal(['13', '14', '15'], getline(3, 5))
2543044324eSYegappan Lakshmanan  call setline(1, range(1, 10))
2553044324eSYegappan Lakshmanan  4,8diffput
2563044324eSYegappan Lakshmanan  wincmd p
2573044324eSYegappan Lakshmanan  call assert_equal(['13', '4', '5', '6', '7', '8', '19'], getline(3, 9))
2583044324eSYegappan Lakshmanan  %bw!
2593044324eSYegappan Lakshmananendfunc
2603044324eSYegappan Lakshmanan
2613044324eSYegappan Lakshmanan" Test for :diffget/:diffput with an empty buffer and a non-empty buffer
2623044324eSYegappan Lakshmananfunc Test_diffget_diffput_empty_buffer()
2633044324eSYegappan Lakshmanan  %d _
2643044324eSYegappan Lakshmanan  new
2653044324eSYegappan Lakshmanan  call setline(1, 'one')
2663044324eSYegappan Lakshmanan  windo diffthis
2673044324eSYegappan Lakshmanan  diffget
2683044324eSYegappan Lakshmanan  call assert_equal(['one'], getline(1, '$'))
2693044324eSYegappan Lakshmanan  %d _
2703044324eSYegappan Lakshmanan  diffput
2713044324eSYegappan Lakshmanan  wincmd p
2723044324eSYegappan Lakshmanan  call assert_equal([''], getline(1, '$'))
2733044324eSYegappan Lakshmanan  %bw!
2743044324eSYegappan Lakshmananendfunc
2753044324eSYegappan Lakshmanan
276ae7dba89SBram Moolenaar" :diffput and :diffget completes names of buffers which
277ae7dba89SBram Moolenaar" are in diff mode and which are different then current buffer.
278efcc3290SBram Moolenaar" No completion when the current window is not in diff mode.
279efcc3290SBram Moolenaarfunc Test_diffget_diffput_completion()
280efcc3290SBram Moolenaar  e            Xdiff1 | diffthis
281efcc3290SBram Moolenaar  botright new Xdiff2
282efcc3290SBram Moolenaar  botright new Xdiff3 | split | diffthis
283efcc3290SBram Moolenaar  botright new Xdiff4 | diffthis
284ae7dba89SBram Moolenaar
285efcc3290SBram Moolenaar  wincmd t
286efcc3290SBram Moolenaar  call assert_equal('Xdiff1', bufname('%'))
287ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
288efcc3290SBram Moolenaar  call assert_equal('"diffput Xdiff3 Xdiff4', @:)
289ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
290efcc3290SBram Moolenaar  call assert_equal('"diffget Xdiff3 Xdiff4', @:)
291efcc3290SBram Moolenaar  call assert_equal(['Xdiff3', 'Xdiff4'], getcompletion('', 'diff_buffer'))
292ae7dba89SBram Moolenaar
293efcc3290SBram Moolenaar  " Xdiff2 is not in diff mode, so no completion for :diffput, :diffget
294efcc3290SBram Moolenaar  wincmd j
295efcc3290SBram Moolenaar  call assert_equal('Xdiff2', bufname('%'))
296ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
297ae7dba89SBram Moolenaar  call assert_equal('"diffput ', @:)
298ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
299ae7dba89SBram Moolenaar  call assert_equal('"diffget ', @:)
300ae7dba89SBram Moolenaar  call assert_equal([], getcompletion('', 'diff_buffer'))
301ae7dba89SBram Moolenaar
302efcc3290SBram Moolenaar  " Xdiff3 is split in 2 windows, only the top one is in diff mode.
303efcc3290SBram Moolenaar  " So completion of :diffput :diffget only happens in the top window.
304efcc3290SBram Moolenaar  wincmd j
305efcc3290SBram Moolenaar  call assert_equal('Xdiff3', bufname('%'))
306efcc3290SBram Moolenaar  call assert_equal(1, &diff)
307efcc3290SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
308efcc3290SBram Moolenaar  call assert_equal('"diffput Xdiff1 Xdiff4', @:)
309efcc3290SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
310efcc3290SBram Moolenaar  call assert_equal('"diffget Xdiff1 Xdiff4', @:)
311efcc3290SBram Moolenaar  call assert_equal(['Xdiff1', 'Xdiff4'], getcompletion('', 'diff_buffer'))
312efcc3290SBram Moolenaar
313efcc3290SBram Moolenaar  wincmd j
314efcc3290SBram Moolenaar  call assert_equal('Xdiff3', bufname('%'))
315efcc3290SBram Moolenaar  call assert_equal(0, &diff)
316efcc3290SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
317efcc3290SBram Moolenaar  call assert_equal('"diffput ', @:)
318efcc3290SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
319efcc3290SBram Moolenaar  call assert_equal('"diffget ', @:)
320efcc3290SBram Moolenaar  call assert_equal([], getcompletion('', 'diff_buffer'))
321efcc3290SBram Moolenaar
322efcc3290SBram Moolenaar  wincmd j
323efcc3290SBram Moolenaar  call assert_equal('Xdiff4', bufname('%'))
324efcc3290SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
325efcc3290SBram Moolenaar  call assert_equal('"diffput Xdiff1 Xdiff3', @:)
326efcc3290SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
327efcc3290SBram Moolenaar  call assert_equal('"diffget Xdiff1 Xdiff3', @:)
328efcc3290SBram Moolenaar  call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))
329efcc3290SBram Moolenaar
330ae7dba89SBram Moolenaar  %bwipe
331ae7dba89SBram Moolenaarendfunc
332ae7dba89SBram Moolenaar
33379a213d6SBram Moolenaarfunc Test_dp_do_buffer()
33479a213d6SBram Moolenaar  e! one
33579a213d6SBram Moolenaar  let bn1=bufnr('%')
33679a213d6SBram Moolenaar  let l = range(60)
33779a213d6SBram Moolenaar  call setline(1, l)
33879a213d6SBram Moolenaar  diffthis
33979a213d6SBram Moolenaar
34079a213d6SBram Moolenaar  new two
34179a213d6SBram Moolenaar  let l[10] = 'one'
34279a213d6SBram Moolenaar  let l[20] = 'two'
34379a213d6SBram Moolenaar  let l[30] = 'three'
34479a213d6SBram Moolenaar  let l[40] = 'four'
34579a213d6SBram Moolenaar  let l[50] = 'five'
34679a213d6SBram Moolenaar  call setline(1, l)
34779a213d6SBram Moolenaar  diffthis
34879a213d6SBram Moolenaar
34979a213d6SBram Moolenaar  " dp and do with invalid buffer number.
35079a213d6SBram Moolenaar  11
35179a213d6SBram Moolenaar  call assert_fails('norm 99999dp', 'E102:')
35279a213d6SBram Moolenaar  call assert_fails('norm 99999do', 'E102:')
35379a213d6SBram Moolenaar  call assert_fails('diffput non_existing_buffer', 'E94:')
35479a213d6SBram Moolenaar  call assert_fails('diffget non_existing_buffer', 'E94:')
35579a213d6SBram Moolenaar
35679a213d6SBram Moolenaar  " dp and do with valid buffer number.
35779a213d6SBram Moolenaar  call assert_equal('one', getline('.'))
35879a213d6SBram Moolenaar  exe 'norm ' . bn1 . 'do'
35979a213d6SBram Moolenaar  call assert_equal('10', getline('.'))
36079a213d6SBram Moolenaar  21
36179a213d6SBram Moolenaar  call assert_equal('two', getline('.'))
36279a213d6SBram Moolenaar  diffget one
36379a213d6SBram Moolenaar  call assert_equal('20', getline('.'))
36479a213d6SBram Moolenaar
36579a213d6SBram Moolenaar  31
36679a213d6SBram Moolenaar  exe 'norm ' . bn1 . 'dp'
36779a213d6SBram Moolenaar  41
36879a213d6SBram Moolenaar  diffput one
36979a213d6SBram Moolenaar  wincmd w
37079a213d6SBram Moolenaar  31
37179a213d6SBram Moolenaar  call assert_equal('three', getline('.'))
37279a213d6SBram Moolenaar  41
37379a213d6SBram Moolenaar  call assert_equal('four', getline('.'))
37479a213d6SBram Moolenaar
37579a213d6SBram Moolenaar  " dp and do with buffer number which is not in diff mode.
37679a213d6SBram Moolenaar  new not_in_diff_mode
37779a213d6SBram Moolenaar  let bn3=bufnr('%')
37879a213d6SBram Moolenaar  wincmd w
37979a213d6SBram Moolenaar  51
38079a213d6SBram Moolenaar  call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
38179a213d6SBram Moolenaar  call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
38279a213d6SBram Moolenaar  call assert_fails('diffput not_in_diff_mode', 'E94:')
38379a213d6SBram Moolenaar  call assert_fails('diffget not_in_diff_mode', 'E94:')
38479a213d6SBram Moolenaar
38579a213d6SBram Moolenaar  windo diffoff
38679a213d6SBram Moolenaar  %bwipe!
38742093c0eSBram Moolenaarendfunc
388e67d546fSBram Moolenaar
389df77cef9SBram Moolenaarfunc Test_do_lastline()
390df77cef9SBram Moolenaar  e! one
391df77cef9SBram Moolenaar  call setline(1, ['1','2','3','4','5','6'])
392df77cef9SBram Moolenaar  diffthis
393df77cef9SBram Moolenaar
394df77cef9SBram Moolenaar  new two
395df77cef9SBram Moolenaar  call setline(1, ['2','4','5'])
396df77cef9SBram Moolenaar  diffthis
397df77cef9SBram Moolenaar
398df77cef9SBram Moolenaar  1
399df77cef9SBram Moolenaar  norm dp]c
400df77cef9SBram Moolenaar  norm dp]c
401df77cef9SBram Moolenaar  wincmd w
402df77cef9SBram Moolenaar  call assert_equal(4, line('$'))
403df77cef9SBram Moolenaar  norm G
404df77cef9SBram Moolenaar  norm do
405df77cef9SBram Moolenaar  call assert_equal(3, line('$'))
406df77cef9SBram Moolenaar
407df77cef9SBram Moolenaar  windo diffoff
408df77cef9SBram Moolenaar  %bwipe!
409df77cef9SBram Moolenaarendfunc
410df77cef9SBram Moolenaar
411e67d546fSBram Moolenaarfunc Test_diffoff()
412e67d546fSBram Moolenaar  enew!
413e67d546fSBram Moolenaar  call setline(1, ['Two', 'Three'])
41479a213d6SBram Moolenaar  redraw
415e67d546fSBram Moolenaar  let normattr = screenattr(1, 1)
416e67d546fSBram Moolenaar  diffthis
417e67d546fSBram Moolenaar  botright vert new
418e67d546fSBram Moolenaar  call setline(1, ['One', '', 'Two', 'Three'])
419e67d546fSBram Moolenaar  diffthis
420e67d546fSBram Moolenaar  redraw
421196b4664SBram Moolenaar  call assert_notequal(normattr, 1->screenattr(1))
422e67d546fSBram Moolenaar  diffoff!
423e67d546fSBram Moolenaar  redraw
424e67d546fSBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
425e67d546fSBram Moolenaar  bwipe!
426e67d546fSBram Moolenaar  bwipe!
427e67d546fSBram Moolenaarendfunc
428025e3e0bSBram Moolenaar
429e828b762SBram Moolenaarfunc Common_icase_test()
430e828b762SBram Moolenaar  edit one
431da22b8ccSBram Moolenaar  call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
43279a213d6SBram Moolenaar  redraw
43379a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
43479a213d6SBram Moolenaar  diffthis
43579a213d6SBram Moolenaar
43679a213d6SBram Moolenaar  botright vert new two
437da22b8ccSBram Moolenaar  call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
43879a213d6SBram Moolenaar  diffthis
43979a213d6SBram Moolenaar
44079a213d6SBram Moolenaar  redraw
44179a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
44279a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
44379a213d6SBram Moolenaar  call assert_notequal(normattr, screenattr(3, 1))
44479a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(4, 1))
44579a213d6SBram Moolenaar
446da22b8ccSBram Moolenaar  let dtextattr = screenattr(5, 3)
447da22b8ccSBram Moolenaar  call assert_notequal(dtextattr, screenattr(5, 1))
448da22b8ccSBram Moolenaar  call assert_notequal(dtextattr, screenattr(5, 5))
449da22b8ccSBram Moolenaar
45079a213d6SBram Moolenaar  diffoff!
45179a213d6SBram Moolenaar  %bwipe!
452e828b762SBram Moolenaarendfunc
453e828b762SBram Moolenaar
454e828b762SBram Moolenaarfunc Test_diffopt_icase()
455e828b762SBram Moolenaar  set diffopt=icase,foldcolumn:0
456e828b762SBram Moolenaar  call Common_icase_test()
45779a213d6SBram Moolenaar  set diffopt&
45879a213d6SBram Moolenaarendfunc
45979a213d6SBram Moolenaar
460e828b762SBram Moolenaarfunc Test_diffopt_icase_internal()
461e828b762SBram Moolenaar  set diffopt=icase,foldcolumn:0,internal
462e828b762SBram Moolenaar  call Common_icase_test()
463e828b762SBram Moolenaar  set diffopt&
464e828b762SBram Moolenaarendfunc
46579a213d6SBram Moolenaar
466e828b762SBram Moolenaarfunc Common_iwhite_test()
467e828b762SBram Moolenaar  edit one
468e828b762SBram Moolenaar  " Difference in trailing spaces and amount of spaces should be ignored,
46979a213d6SBram Moolenaar  " but not other space differences.
470e828b762SBram Moolenaar  call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
47179a213d6SBram Moolenaar  redraw
47279a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
47379a213d6SBram Moolenaar  diffthis
47479a213d6SBram Moolenaar
47579a213d6SBram Moolenaar  botright vert new two
476e828b762SBram Moolenaar  call setline(1, ["One\t ", "Two\t ", 'Three', 'one   two', 'onetwo', ' Four'])
47779a213d6SBram Moolenaar  diffthis
47879a213d6SBram Moolenaar
47979a213d6SBram Moolenaar  redraw
48079a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
48179a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
48279a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(3, 1))
483e828b762SBram Moolenaar  call assert_equal(normattr, screenattr(4, 1))
484e828b762SBram Moolenaar  call assert_notequal(normattr, screenattr(5, 1))
485e828b762SBram Moolenaar  call assert_notequal(normattr, screenattr(6, 1))
48679a213d6SBram Moolenaar
48779a213d6SBram Moolenaar  diffoff!
48879a213d6SBram Moolenaar  %bwipe!
489e828b762SBram Moolenaarendfunc
490e828b762SBram Moolenaar
491e828b762SBram Moolenaarfunc Test_diffopt_iwhite()
492e828b762SBram Moolenaar  set diffopt=iwhite,foldcolumn:0
493e828b762SBram Moolenaar  call Common_iwhite_test()
494e828b762SBram Moolenaar  set diffopt&
495e828b762SBram Moolenaarendfunc
496e828b762SBram Moolenaar
497e828b762SBram Moolenaarfunc Test_diffopt_iwhite_internal()
498e828b762SBram Moolenaar  set diffopt=internal,iwhite,foldcolumn:0
499e828b762SBram Moolenaar  call Common_iwhite_test()
50079a213d6SBram Moolenaar  set diffopt&
50179a213d6SBram Moolenaarendfunc
50279a213d6SBram Moolenaar
50379a213d6SBram Moolenaarfunc Test_diffopt_context()
50479a213d6SBram Moolenaar  enew!
50579a213d6SBram Moolenaar  call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
50679a213d6SBram Moolenaar  diffthis
50779a213d6SBram Moolenaar  new
50879a213d6SBram Moolenaar  call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
50979a213d6SBram Moolenaar  diffthis
51079a213d6SBram Moolenaar
51179a213d6SBram Moolenaar  set diffopt=context:2
51279a213d6SBram Moolenaar  call assert_equal('+--  2 lines: 1', foldtextresult(1))
513e828b762SBram Moolenaar  set diffopt=internal,context:2
514e828b762SBram Moolenaar  call assert_equal('+--  2 lines: 1', foldtextresult(1))
515e828b762SBram Moolenaar
51679a213d6SBram Moolenaar  set diffopt=context:1
51779a213d6SBram Moolenaar  call assert_equal('+--  3 lines: 1', foldtextresult(1))
518e828b762SBram Moolenaar  set diffopt=internal,context:1
519e828b762SBram Moolenaar  call assert_equal('+--  3 lines: 1', foldtextresult(1))
52079a213d6SBram Moolenaar
52179a213d6SBram Moolenaar  diffoff!
52279a213d6SBram Moolenaar  %bwipe!
52379a213d6SBram Moolenaar  set diffopt&
52479a213d6SBram Moolenaarendfunc
52579a213d6SBram Moolenaar
52679a213d6SBram Moolenaarfunc Test_diffopt_horizontal()
527e828b762SBram Moolenaar  set diffopt=internal,horizontal
52879a213d6SBram Moolenaar  diffsplit
52979a213d6SBram Moolenaar
53079a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(1))
53179a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(2))
53279a213d6SBram Moolenaar  call assert_equal(&lines, winheight(1) + winheight(2) + 3)
53379a213d6SBram Moolenaar  call assert_inrange(0, 1, winheight(1) - winheight(2))
53479a213d6SBram Moolenaar
53579a213d6SBram Moolenaar  set diffopt&
53679a213d6SBram Moolenaar  diffoff!
53779a213d6SBram Moolenaar  %bwipe
53879a213d6SBram Moolenaarendfunc
53979a213d6SBram Moolenaar
54079a213d6SBram Moolenaarfunc Test_diffopt_vertical()
541e828b762SBram Moolenaar  set diffopt=internal,vertical
54279a213d6SBram Moolenaar  diffsplit
54379a213d6SBram Moolenaar
54479a213d6SBram Moolenaar  call assert_equal(&lines - 2, winheight(1))
54579a213d6SBram Moolenaar  call assert_equal(&lines - 2, winheight(2))
54679a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
54779a213d6SBram Moolenaar  call assert_inrange(0, 1, winwidth(1) - winwidth(2))
54879a213d6SBram Moolenaar
54979a213d6SBram Moolenaar  set diffopt&
55079a213d6SBram Moolenaar  diffoff!
55179a213d6SBram Moolenaar  %bwipe
55279a213d6SBram Moolenaarendfunc
55379a213d6SBram Moolenaar
55497ce4192SBram Moolenaarfunc Test_diffopt_hiddenoff()
555e828b762SBram Moolenaar  set diffopt=internal,filler,foldcolumn:0,hiddenoff
55697ce4192SBram Moolenaar  e! one
55797ce4192SBram Moolenaar  call setline(1, ['Two', 'Three'])
55897ce4192SBram Moolenaar  redraw
55997ce4192SBram Moolenaar  let normattr = screenattr(1, 1)
56097ce4192SBram Moolenaar  diffthis
56197ce4192SBram Moolenaar  botright vert new two
56297ce4192SBram Moolenaar  call setline(1, ['One', 'Four'])
56397ce4192SBram Moolenaar  diffthis
56497ce4192SBram Moolenaar  redraw
56597ce4192SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
56697ce4192SBram Moolenaar  set hidden
56797ce4192SBram Moolenaar  close
56897ce4192SBram Moolenaar  redraw
56997ce4192SBram Moolenaar  " should not diffing with hidden buffer two while 'hiddenoff' is enabled
57097ce4192SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
57197ce4192SBram Moolenaar
57297ce4192SBram Moolenaar  bwipe!
57397ce4192SBram Moolenaar  bwipe!
57497ce4192SBram Moolenaar  set hidden& diffopt&
57597ce4192SBram Moolenaarendfunc
57697ce4192SBram Moolenaar
57725ea0544SBram Moolenaarfunc Test_diffoff_hidden()
578e828b762SBram Moolenaar  set diffopt=internal,filler,foldcolumn:0
57925ea0544SBram Moolenaar  e! one
58025ea0544SBram Moolenaar  call setline(1, ['Two', 'Three'])
58179a213d6SBram Moolenaar  redraw
58225ea0544SBram Moolenaar  let normattr = screenattr(1, 1)
58325ea0544SBram Moolenaar  diffthis
58425ea0544SBram Moolenaar  botright vert new two
58525ea0544SBram Moolenaar  call setline(1, ['One', 'Four'])
58625ea0544SBram Moolenaar  diffthis
58725ea0544SBram Moolenaar  redraw
58825ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
58925ea0544SBram Moolenaar  set hidden
59025ea0544SBram Moolenaar  close
59125ea0544SBram Moolenaar  redraw
59225ea0544SBram Moolenaar  " diffing with hidden buffer two
59325ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
59425ea0544SBram Moolenaar  diffoff
59525ea0544SBram Moolenaar  redraw
59625ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
59725ea0544SBram Moolenaar  diffthis
59825ea0544SBram Moolenaar  redraw
59925ea0544SBram Moolenaar  " still diffing with hidden buffer two
60025ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
60125ea0544SBram Moolenaar  diffoff!
60225ea0544SBram Moolenaar  redraw
60325ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
60425ea0544SBram Moolenaar  diffthis
60525ea0544SBram Moolenaar  redraw
60625ea0544SBram Moolenaar  " no longer diffing with hidden buffer two
60725ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
60825ea0544SBram Moolenaar
60925ea0544SBram Moolenaar  bwipe!
61025ea0544SBram Moolenaar  bwipe!
61125ea0544SBram Moolenaar  set hidden& diffopt&
61225ea0544SBram Moolenaarendfunc
61325ea0544SBram Moolenaar
614025e3e0bSBram Moolenaarfunc Test_setting_cursor()
615025e3e0bSBram Moolenaar  new Xtest1
616025e3e0bSBram Moolenaar  put =range(1,90)
617025e3e0bSBram Moolenaar  wq
618025e3e0bSBram Moolenaar  new Xtest2
619025e3e0bSBram Moolenaar  put =range(1,100)
620025e3e0bSBram Moolenaar  wq
621025e3e0bSBram Moolenaar
622025e3e0bSBram Moolenaar  tabe Xtest2
623025e3e0bSBram Moolenaar  $
624025e3e0bSBram Moolenaar  diffsp Xtest1
625025e3e0bSBram Moolenaar  tabclose
626025e3e0bSBram Moolenaar
627025e3e0bSBram Moolenaar  call delete('Xtest1')
628025e3e0bSBram Moolenaar  call delete('Xtest2')
629025e3e0bSBram Moolenaarendfunc
630aeb661e1SBram Moolenaar
631aeb661e1SBram Moolenaarfunc Test_diff_move_to()
632aeb661e1SBram Moolenaar  new
633aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
634aeb661e1SBram Moolenaar  diffthis
635aeb661e1SBram Moolenaar  vnew
636aeb661e1SBram Moolenaar  call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
637aeb661e1SBram Moolenaar  diffthis
638aeb661e1SBram Moolenaar  norm ]c
639aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
640aeb661e1SBram Moolenaar  norm 3]c
641aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
642aeb661e1SBram Moolenaar  norm 10]c
643aeb661e1SBram Moolenaar  call assert_equal(11, line('.'))
644aeb661e1SBram Moolenaar  norm [c
645aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
646aeb661e1SBram Moolenaar  norm 2[c
647aeb661e1SBram Moolenaar  call assert_equal(5, line('.'))
648aeb661e1SBram Moolenaar  norm 10[c
649aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
650aeb661e1SBram Moolenaar  %bwipe!
651aeb661e1SBram Moolenaarendfunc
652aeb661e1SBram Moolenaar
65379a213d6SBram Moolenaarfunc Test_diffexpr()
654aeb313f3SBram Moolenaar  CheckExecutable diff
65579a213d6SBram Moolenaar
65679a213d6SBram Moolenaar  func DiffExpr()
657485b6271SBram Moolenaar    " Prepend some text to check diff type detection
6583b8defd0SBram Moolenaar    call writefile(['warning', '  message'], v:fname_out)
6593b8defd0SBram Moolenaar    silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
66079a213d6SBram Moolenaar  endfunc
66179a213d6SBram Moolenaar  set diffexpr=DiffExpr()
66279a213d6SBram Moolenaar  set diffopt=foldcolumn:0
66379a213d6SBram Moolenaar
66479a213d6SBram Moolenaar  enew!
66579a213d6SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
66679a213d6SBram Moolenaar  redraw
66779a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
66879a213d6SBram Moolenaar  diffthis
66979a213d6SBram Moolenaar
67079a213d6SBram Moolenaar  botright vert new
67179a213d6SBram Moolenaar  call setline(1, ['one', 'two', 'three.'])
67279a213d6SBram Moolenaar  diffthis
67379a213d6SBram Moolenaar
67479a213d6SBram Moolenaar  redraw
67579a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
67679a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
67779a213d6SBram Moolenaar  call assert_notequal(normattr, screenattr(3, 1))
6783044324eSYegappan Lakshmanan  diffoff!
67979a213d6SBram Moolenaar
6803044324eSYegappan Lakshmanan  " Try using an non-existing function for 'diffexpr'.
6813044324eSYegappan Lakshmanan  set diffexpr=NewDiffFunc()
6823044324eSYegappan Lakshmanan  call assert_fails('windo diffthis', ['E117:', 'E97:'])
68379a213d6SBram Moolenaar  diffoff!
68479a213d6SBram Moolenaar  %bwipe!
68579a213d6SBram Moolenaar  set diffexpr& diffopt&
68679a213d6SBram Moolenaarendfunc
68779a213d6SBram Moolenaar
688aeb661e1SBram Moolenaarfunc Test_diffpatch()
689aeb661e1SBram Moolenaar  " The patch program on MS-Windows may fail or hang.
6906d91bcb4SBram Moolenaar  CheckExecutable patch
6916d91bcb4SBram Moolenaar  CheckUnix
692aeb661e1SBram Moolenaar  new
693aeb661e1SBram Moolenaar  insert
694aeb661e1SBram Moolenaar***************
695aeb661e1SBram Moolenaar*** 1,3 ****
696aeb661e1SBram Moolenaar  1
697aeb661e1SBram Moolenaar! 2
698aeb661e1SBram Moolenaar  3
699aeb661e1SBram Moolenaar--- 1,4 ----
700aeb661e1SBram Moolenaar  1
701aeb661e1SBram Moolenaar! 2x
702aeb661e1SBram Moolenaar  3
703aeb661e1SBram Moolenaar+ 4
704aeb661e1SBram Moolenaar.
70597fbc404SBram Moolenaar  saveas! Xpatch
706aeb661e1SBram Moolenaar  bwipe!
707aeb661e1SBram Moolenaar  new
708aeb661e1SBram Moolenaar  call assert_fails('diffpatch Xpatch', 'E816:')
7091ef73e33SBram Moolenaar
710a95ab321SBram Moolenaar  for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
711aeb661e1SBram Moolenaar    call setline(1, ['1', '2', '3'])
7121ef73e33SBram Moolenaar    if name != 'Xpatch'
7131ef73e33SBram Moolenaar      call rename('Xpatch', name)
7141ef73e33SBram Moolenaar    endif
7151ef73e33SBram Moolenaar    exe 'diffpatch ' . escape(name, '$')
716aeb661e1SBram Moolenaar    call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
7171ef73e33SBram Moolenaar    if name != 'Xpatch'
7181ef73e33SBram Moolenaar      call rename(name, 'Xpatch')
7191ef73e33SBram Moolenaar    endif
7201ef73e33SBram Moolenaar    bwipe!
7211ef73e33SBram Moolenaar  endfor
7221ef73e33SBram Moolenaar
723aeb661e1SBram Moolenaar  call delete('Xpatch')
724aeb661e1SBram Moolenaar  bwipe!
725aeb661e1SBram Moolenaarendfunc
726aeb661e1SBram Moolenaar
727aeb661e1SBram Moolenaarfunc Test_diff_too_many_buffers()
728aeb661e1SBram Moolenaar  for i in range(1, 8)
729aeb661e1SBram Moolenaar    exe "new Xtest" . i
730aeb661e1SBram Moolenaar    diffthis
731aeb661e1SBram Moolenaar  endfor
732aeb661e1SBram Moolenaar  new Xtest9
733aeb661e1SBram Moolenaar  call assert_fails('diffthis', 'E96:')
734aeb661e1SBram Moolenaar  %bwipe!
735aeb661e1SBram Moolenaarendfunc
736aeb661e1SBram Moolenaar
737aeb661e1SBram Moolenaarfunc Test_diff_nomodifiable()
738aeb661e1SBram Moolenaar  new
739aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4])
740aeb661e1SBram Moolenaar  setl nomodifiable
741aeb661e1SBram Moolenaar  diffthis
742aeb661e1SBram Moolenaar  vnew
743aeb661e1SBram Moolenaar  call setline(1, ['1x', 2, 3, 3, 4])
744aeb661e1SBram Moolenaar  diffthis
745aeb661e1SBram Moolenaar  call assert_fails('norm dp', 'E793:')
746aeb661e1SBram Moolenaar  setl nomodifiable
747aeb661e1SBram Moolenaar  call assert_fails('norm do', 'E21:')
748aeb661e1SBram Moolenaar  %bwipe!
749aeb661e1SBram Moolenaarendfunc
750f58a8475SBram Moolenaar
75197fbc404SBram Moolenaarfunc Test_diff_hlID()
75297fbc404SBram Moolenaar  new
75397fbc404SBram Moolenaar  call setline(1, [1, 2, 3])
75497fbc404SBram Moolenaar  diffthis
75597fbc404SBram Moolenaar  vnew
75697fbc404SBram Moolenaar  call setline(1, ['1x', 2, 'x', 3])
75797fbc404SBram Moolenaar  diffthis
75897fbc404SBram Moolenaar  redraw
75997fbc404SBram Moolenaar
760a74e4946SBram Moolenaar  call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("")
76197fbc404SBram Moolenaar
762a74e4946SBram Moolenaar  call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange")
763a74e4946SBram Moolenaar  call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText")
764a74e4946SBram Moolenaar  call diff_hlID(2, 1)->synIDattr("name")->assert_equal("")
765a74e4946SBram Moolenaar  call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd")
7661a3a8916SBram Moolenaar  eval 4->diff_hlID(1)->synIDattr("name")->assert_equal("")
76797fbc404SBram Moolenaar
76897fbc404SBram Moolenaar  wincmd w
76997fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange")
77097fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "")
77197fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "")
77297fbc404SBram Moolenaar
77397fbc404SBram Moolenaar  %bwipe!
77497fbc404SBram Moolenaarendfunc
77597fbc404SBram Moolenaar
77697fbc404SBram Moolenaarfunc Test_diff_filler()
77797fbc404SBram Moolenaar  new
77897fbc404SBram Moolenaar  call setline(1, [1, 2, 3, 'x', 4])
77997fbc404SBram Moolenaar  diffthis
78097fbc404SBram Moolenaar  vnew
78197fbc404SBram Moolenaar  call setline(1, [1, 2, 'y', 'y', 3, 4])
78297fbc404SBram Moolenaar  diffthis
78397fbc404SBram Moolenaar  redraw
78497fbc404SBram Moolenaar
7851a3a8916SBram Moolenaar  call assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0], map(range(-1, 7), 'v:val->diff_filler()'))
78697fbc404SBram Moolenaar  wincmd w
78797fbc404SBram Moolenaar  call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
78897fbc404SBram Moolenaar
78997fbc404SBram Moolenaar  %bwipe!
79097fbc404SBram Moolenaarendfunc
79197fbc404SBram Moolenaar
792f58a8475SBram Moolenaarfunc Test_diff_lastline()
793f58a8475SBram Moolenaar  enew!
794f58a8475SBram Moolenaar  only!
795f58a8475SBram Moolenaar  call setline(1, ['This is a ', 'line with five ', 'rows'])
796f58a8475SBram Moolenaar  diffthis
797f58a8475SBram Moolenaar  botright vert new
798f58a8475SBram Moolenaar  call setline(1, ['This is', 'a line with ', 'four rows'])
799f58a8475SBram Moolenaar  diffthis
800f58a8475SBram Moolenaar  1
801f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
802f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
803f58a8475SBram Moolenaar  let w1lines = winline()
804f58a8475SBram Moolenaar  wincmd w
805f58a8475SBram Moolenaar  $
806f58a8475SBram Moolenaar  let w2lines = winline()
807f58a8475SBram Moolenaar  call assert_equal(w2lines, w1lines)
808f58a8475SBram Moolenaar  bwipe!
809f58a8475SBram Moolenaar  bwipe!
810f58a8475SBram Moolenaarendfunc
811e828b762SBram Moolenaar
812785fc656SBram Moolenaarfunc WriteDiffFiles(buf, list1, list2)
813e828b762SBram Moolenaar  call writefile(a:list1, 'Xfile1')
814e828b762SBram Moolenaar  call writefile(a:list2, 'Xfile2')
815785fc656SBram Moolenaar  if a:buf
816785fc656SBram Moolenaar    call term_sendkeys(a:buf, ":checktime\<CR>")
817785fc656SBram Moolenaar  endif
818e828b762SBram Moolenaarendfunc
819e828b762SBram Moolenaar
820785fc656SBram Moolenaar" Verify a screendump with both the internal and external diff.
821e828b762SBram Moolenaarfunc VerifyBoth(buf, dumpfile, extra)
822e828b762SBram Moolenaar  " trailing : for leaving the cursor on the command line
823785fc656SBram Moolenaar  for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"]
824e828b762SBram Moolenaar    call term_sendkeys(a:buf, cmd)
825e828b762SBram Moolenaar    if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external')
826485b6271SBram Moolenaar      " don't let the next iteration overwrite the "failed" file.
827485b6271SBram Moolenaar      return
828e828b762SBram Moolenaar    endif
829e828b762SBram Moolenaar  endfor
830485b6271SBram Moolenaar
831485b6271SBram Moolenaar  " also test unified diff
832485b6271SBram Moolenaar  call term_sendkeys(a:buf, ":call SetupUnified()\<CR>:")
833ad5c178aSglacambre  call term_sendkeys(a:buf, ":redraw!\<CR>:")
834485b6271SBram Moolenaar  call VerifyScreenDump(a:buf, a:dumpfile, {}, 'unified')
835485b6271SBram Moolenaar  call term_sendkeys(a:buf, ":call StopUnified()\<CR>:")
836e828b762SBram Moolenaarendfunc
837e828b762SBram Moolenaar
838785fc656SBram Moolenaar" Verify a screendump with the internal diff only.
839785fc656SBram Moolenaarfunc VerifyInternal(buf, dumpfile, extra)
840785fc656SBram Moolenaar  call term_sendkeys(a:buf, ":diffupdate!\<CR>")
841785fc656SBram Moolenaar  " trailing : for leaving the cursor on the command line
842785fc656SBram Moolenaar  call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:")
8436a2c5a7dSBram Moolenaar  call TermWait(a:buf)
844785fc656SBram Moolenaar  call VerifyScreenDump(a:buf, a:dumpfile, {})
845785fc656SBram Moolenaarendfunc
846785fc656SBram Moolenaar
847e828b762SBram Moolenaarfunc Test_diff_screen()
848f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
8493c8ee629SBram Moolenaar  CheckScreendump
8503c8ee629SBram Moolenaar  CheckFeature menu
8513c8ee629SBram Moolenaar
852485b6271SBram Moolenaar  let lines =<< trim END
853485b6271SBram Moolenaar      func UnifiedDiffExpr()
854485b6271SBram Moolenaar        " Prepend some text to check diff type detection
855485b6271SBram Moolenaar        call writefile(['warning', '  message'], v:fname_out)
856ad5c178aSglacambre        silent exe '!diff -U0 ' .. v:fname_in .. ' ' .. v:fname_new .. '>>' .. v:fname_out
857485b6271SBram Moolenaar      endfunc
858485b6271SBram Moolenaar      func SetupUnified()
859485b6271SBram Moolenaar        set diffexpr=UnifiedDiffExpr()
860ad5c178aSglacambre        diffupdate
861485b6271SBram Moolenaar      endfunc
862485b6271SBram Moolenaar      func StopUnified()
863485b6271SBram Moolenaar        set diffexpr=
864485b6271SBram Moolenaar      endfunc
865485b6271SBram Moolenaar  END
866485b6271SBram Moolenaar  call writefile(lines, 'XdiffSetup')
867485b6271SBram Moolenaar
868e828b762SBram Moolenaar  " clean up already existing swap files, just in case
869e828b762SBram Moolenaar  call delete('.Xfile1.swp')
870e828b762SBram Moolenaar  call delete('.Xfile2.swp')
871e828b762SBram Moolenaar
872e828b762SBram Moolenaar  " Test 1: Add a line in beginning of file 2
873785fc656SBram Moolenaar  call WriteDiffFiles(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
874485b6271SBram Moolenaar  let buf = RunVimInTerminal('-d -S XdiffSetup Xfile1 Xfile2', {})
8758ee4c01bSBram Moolenaar  " Set autoread mode, so that Vim won't complain once we re-write the test
876e828b762SBram Moolenaar  " files
877785fc656SBram Moolenaar  call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
878e828b762SBram Moolenaar
879e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_01', '')
880e828b762SBram Moolenaar
881e828b762SBram Moolenaar  " Test 2: Add a line in beginning of file 1
882785fc656SBram Moolenaar  call WriteDiffFiles(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
883e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_02', '')
884e828b762SBram Moolenaar
885e828b762SBram Moolenaar  " Test 3: Add a line at the end of file 2
886785fc656SBram Moolenaar  call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
887e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_03', '')
888e828b762SBram Moolenaar
889e828b762SBram Moolenaar  " Test 4: Add a line at the end of file 1
890785fc656SBram Moolenaar  call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
891e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_04', '')
892e828b762SBram Moolenaar
893e828b762SBram Moolenaar  " Test 5: Add a line in the middle of file 2, remove on at the end of file 1
894785fc656SBram Moolenaar  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])
895e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_05', '')
896e828b762SBram Moolenaar
897e828b762SBram Moolenaar  " Test 6: Add a line in the middle of file 1, remove on at the end of file 2
898785fc656SBram Moolenaar  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])
899e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_06', '')
900e828b762SBram Moolenaar
901b9ddda6cSBram Moolenaar  " Variants on test 6 with different context settings
902b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
903b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.2', {})
904b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
905b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
906b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.1', {})
907b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
908b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
909b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.0', {})
910b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
911b9ddda6cSBram Moolenaar
912e828b762SBram Moolenaar  " Test 7 - 9: Test normal/patience/histogram diff algorithm
913785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
914e828b762SBram Moolenaar      \ '    int i;', '    for(i = 0; i < 10; i++)', '    {', '        printf("Your answer is: ");',
915e828b762SBram Moolenaar      \ '        printf("%d\n", foo);', '    }', '}', '', 'int fact(int n)', '{', '    if(n > 1)', '    {',
916e828b762SBram Moolenaar      \ '        return fact(n-1) * n;', '    }', '    return 1;', '}', '', 'int main(int argc, char **argv)',
917e828b762SBram Moolenaar      \ '{', '    frobnitz(fact(10));', '}'],
918e828b762SBram Moolenaar      \ ['#include <stdio.h>', '', 'int fib(int n)', '{', '    if(n > 2)', '    {',
919e828b762SBram Moolenaar      \ '        return fib(n-1) + fib(n-2);', '    }', '    return 1;', '}', '', '// Frobs foo heartily',
920e828b762SBram Moolenaar      \ 'int frobnitz(int foo)', '{', '    int i;', '    for(i = 0; i < 10; i++)', '    {',
921e828b762SBram Moolenaar      \ '        printf("%d\n", foo);', '    }', '}', '',
922e828b762SBram Moolenaar      \ 'int main(int argc, char **argv)', '{', '    frobnitz(fib(10));', '}'])
923e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
924e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
925e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_07', {})
926e828b762SBram Moolenaar
927e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
928e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_08', {})
929e828b762SBram Moolenaar
930e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
931e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_09', {})
932e828b762SBram Moolenaar
933e828b762SBram Moolenaar  " Test 10-11: normal/indent-heuristic
934e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&vim\<cr>")
935785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['', '  def finalize(values)', '', '    values.each do |v|', '      v.finalize', '    end'],
936e828b762SBram Moolenaar      \ ['', '  def finalize(values)', '', '    values.each do |v|', '      v.prepare', '    end', '',
937e828b762SBram Moolenaar      \ '    values.each do |v|', '      v.finalize', '    end'])
938e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
939e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
940e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_10', {})
941e828b762SBram Moolenaar
942b6fc7285SBram Moolenaar  " Leave trailing : at commandline!
943b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
944b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
945b6fc7285SBram Moolenaar  " shouldn't matter, if indent-algorithm comes before or after the algorithm
946b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&\<cr>")
947b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
948b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
949b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&\<cr>")
950b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
951b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
952e828b762SBram Moolenaar
953e828b762SBram Moolenaar  " Test 12: diff the same file
954785fc656SBram Moolenaar  call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
955e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_12', '')
956e828b762SBram Moolenaar
957e828b762SBram Moolenaar  " Test 13: diff an empty file
958785fc656SBram Moolenaar  call WriteDiffFiles(buf, [], [])
959e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_13', '')
960e828b762SBram Moolenaar
961e828b762SBram Moolenaar  " Test 14: test diffopt+=icase
962785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
963e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
964e828b762SBram Moolenaar
965e828b762SBram Moolenaar  " Test 15-16: test diffopt+=iwhite
966785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['int main()', '{', '   printf("Hello, World!");', '   return 0;', '}'],
967e828b762SBram Moolenaar      \ ['int main()', '{', '   if (0)', '   {', '      printf("Hello, World!");', '      return 0;', '   }', '}'])
968e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
969e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
970e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_15', {})
971e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
972e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_16', {})
973e828b762SBram Moolenaar
974785fc656SBram Moolenaar  " Test 17: test diffopt+=iblank
975785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
976785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
977785fc656SBram Moolenaar
978785fc656SBram Moolenaar  " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
979785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
980785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
981785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
982785fc656SBram Moolenaar
983785fc656SBram Moolenaar  " Test 19: test diffopt+=iwhiteeol
984785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx  xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
985785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
986785fc656SBram Moolenaar
987785fc656SBram Moolenaar  " Test 19: test diffopt+=iwhiteall
988785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
989785fc656SBram Moolenaar
990e828b762SBram Moolenaar  " clean up
991e828b762SBram Moolenaar  call StopVimInTerminal(buf)
992e828b762SBram Moolenaar  call delete('Xfile1')
993e828b762SBram Moolenaar  call delete('Xfile2')
994485b6271SBram Moolenaar  call delete('XdiffSetup')
995e828b762SBram Moolenaarendfunc
996e828b762SBram Moolenaar
99704626c24SBram Moolenaarfunc Test_diff_with_scroll_and_change()
99804626c24SBram Moolenaar  CheckScreendump
99904626c24SBram Moolenaar
100004626c24SBram Moolenaar  let lines =<< trim END
100104626c24SBram Moolenaar	call setline(1, range(1, 15))
100204626c24SBram Moolenaar	vnew
100304626c24SBram Moolenaar	call setline(1, range(9, 15))
100404626c24SBram Moolenaar	windo diffthis
100504626c24SBram Moolenaar	wincmd h
100604626c24SBram Moolenaar	exe "normal Gl5\<C-E>"
100704626c24SBram Moolenaar  END
100804626c24SBram Moolenaar  call writefile(lines, 'Xtest_scroll_change')
100904626c24SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_scroll_change', {})
101004626c24SBram Moolenaar
101104626c24SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_scroll_change_01', {})
101204626c24SBram Moolenaar
101304626c24SBram Moolenaar  call term_sendkeys(buf, "ax\<Esc>")
101404626c24SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_scroll_change_02', {})
101504626c24SBram Moolenaar
1016*841c225bSBram Moolenaar  call term_sendkeys(buf, "\<C-W>lay\<Esc>")
1017*841c225bSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_scroll_change_03', {})
1018*841c225bSBram Moolenaar
101904626c24SBram Moolenaar  " clean up
102004626c24SBram Moolenaar  call StopVimInTerminal(buf)
102104626c24SBram Moolenaar  call delete('Xtest_scroll_change')
102204626c24SBram Moolenaarendfunc
102304626c24SBram Moolenaar
10244a5abbd6SBram Moolenaarfunc Test_diff_with_cursorline()
10253c8ee629SBram Moolenaar  CheckScreendump
10264a5abbd6SBram Moolenaar
10274a5abbd6SBram Moolenaar  call writefile([
10284a5abbd6SBram Moolenaar	\ 'hi CursorLine ctermbg=red ctermfg=white',
10294a5abbd6SBram Moolenaar	\ 'set cursorline',
10304a5abbd6SBram Moolenaar	\ 'call setline(1, ["foo","foo","foo","bar"])',
10314a5abbd6SBram Moolenaar	\ 'vnew',
10324a5abbd6SBram Moolenaar	\ 'call setline(1, ["bee","foo","foo","baz"])',
10334a5abbd6SBram Moolenaar	\ 'windo diffthis',
10344a5abbd6SBram Moolenaar	\ '2wincmd w',
10354a5abbd6SBram Moolenaar	\ ], 'Xtest_diff_cursorline')
10364a5abbd6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
10374a5abbd6SBram Moolenaar
10384a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
10394a5abbd6SBram Moolenaar  call term_sendkeys(buf, "j")
10404a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
10414a5abbd6SBram Moolenaar  call term_sendkeys(buf, "j")
10424a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
10434a5abbd6SBram Moolenaar
10444a5abbd6SBram Moolenaar  " clean up
10454a5abbd6SBram Moolenaar  call StopVimInTerminal(buf)
10464a5abbd6SBram Moolenaar  call delete('Xtest_diff_cursorline')
10474a5abbd6SBram Moolenaarendfunc
1048f7acf2b6SBram Moolenaar
10494f33bc20Szeertzjqfunc Test_diff_with_cursorline_breakindent()
10504f33bc20Szeertzjq  CheckScreendump
10514f33bc20Szeertzjq
10524f33bc20Szeertzjq  call writefile([
10534f33bc20Szeertzjq	\ 'hi CursorLine ctermbg=red ctermfg=white',
10544f33bc20Szeertzjq	\ 'set noequalalways wrap diffopt=followwrap cursorline breakindent',
10554f33bc20Szeertzjq	\ '50vnew',
10564f33bc20Szeertzjq	\ 'call setline(1, ["  ","  ","  ","  "])',
10574f33bc20Szeertzjq	\ 'exe "norm 20Afoo\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abar\<Esc>"',
10584f33bc20Szeertzjq	\ 'vnew',
10594f33bc20Szeertzjq	\ 'call setline(1, ["  ","  ","  ","  "])',
10604f33bc20Szeertzjq	\ 'exe "norm 20Abee\<Esc>j20Afoo\<Esc>j20Afoo\<Esc>j20Abaz\<Esc>"',
10614f33bc20Szeertzjq	\ 'windo diffthis',
10624f33bc20Szeertzjq	\ '2wincmd w',
10634f33bc20Szeertzjq	\ ], 'Xtest_diff_cursorline_breakindent')
10644f33bc20Szeertzjq  let buf = RunVimInTerminal('-S Xtest_diff_cursorline_breakindent', {})
10654f33bc20Szeertzjq
10664f33bc20Szeertzjq  call term_sendkeys(buf, "gg0")
10674f33bc20Szeertzjq  call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_01', {})
10684f33bc20Szeertzjq  call term_sendkeys(buf, "j")
10694f33bc20Szeertzjq  call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_02', {})
10704f33bc20Szeertzjq  call term_sendkeys(buf, "j")
10714f33bc20Szeertzjq  call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_03', {})
10724f33bc20Szeertzjq  call term_sendkeys(buf, "j")
10734f33bc20Szeertzjq  call VerifyScreenDump(buf, 'Test_diff_with_cul_bri_04', {})
10744f33bc20Szeertzjq
10754f33bc20Szeertzjq  " clean up
10764f33bc20Szeertzjq  call StopVimInTerminal(buf)
10774f33bc20Szeertzjq  call delete('Xtest_diff_cursorline_breakindent')
10784f33bc20Szeertzjqendfunc
10794f33bc20Szeertzjq
1080248fdb33SBram Moolenaarfunc Test_diff_with_syntax()
1081248fdb33SBram Moolenaar  CheckScreendump
1082248fdb33SBram Moolenaar
1083248fdb33SBram Moolenaar  let lines =<< trim END
1084248fdb33SBram Moolenaar  	void doNothing() {
1085248fdb33SBram Moolenaar	   int x = 0;
1086248fdb33SBram Moolenaar	   char *s = "hello";
1087248fdb33SBram Moolenaar	   return 5;
1088248fdb33SBram Moolenaar	}
1089248fdb33SBram Moolenaar  END
1090248fdb33SBram Moolenaar  call writefile(lines, 'Xprogram1.c')
1091248fdb33SBram Moolenaar  let lines =<< trim END
1092248fdb33SBram Moolenaar  	void doSomething() {
1093248fdb33SBram Moolenaar	   int x = 0;
1094248fdb33SBram Moolenaar	   char *s = "there";
1095248fdb33SBram Moolenaar	   return 5;
1096248fdb33SBram Moolenaar	}
1097248fdb33SBram Moolenaar  END
1098248fdb33SBram Moolenaar  call writefile(lines, 'Xprogram2.c')
1099248fdb33SBram Moolenaar
1100248fdb33SBram Moolenaar  let lines =<< trim END
1101248fdb33SBram Moolenaar  	edit Xprogram1.c
1102248fdb33SBram Moolenaar	diffsplit Xprogram2.c
1103248fdb33SBram Moolenaar  END
1104248fdb33SBram Moolenaar  call writefile(lines, 'Xtest_diff_syntax')
1105248fdb33SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
1106248fdb33SBram Moolenaar
1107248fdb33SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
1108248fdb33SBram Moolenaar
1109248fdb33SBram Moolenaar  " clean up
1110248fdb33SBram Moolenaar  call StopVimInTerminal(buf)
1111248fdb33SBram Moolenaar  call delete('Xtest_diff_syntax')
1112248fdb33SBram Moolenaar  call delete('Xprogram1.c')
1113248fdb33SBram Moolenaar  call delete('Xprogram2.c')
1114248fdb33SBram Moolenaarendfunc
1115248fdb33SBram Moolenaar
1116f7acf2b6SBram Moolenaarfunc Test_diff_of_diff()
11173c8ee629SBram Moolenaar  CheckScreendump
11183c8ee629SBram Moolenaar  CheckFeature rightleft
1119f7acf2b6SBram Moolenaar
1120f7acf2b6SBram Moolenaar  call writefile([
1121f7acf2b6SBram Moolenaar	\ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
1122f7acf2b6SBram Moolenaar	\ 'vnew',
1123f7acf2b6SBram Moolenaar	\ 'call setline(1, ["aa","bb","cc"])',
1124f7acf2b6SBram Moolenaar	\ 'windo diffthis',
11258ee4c01bSBram Moolenaar	\ '1wincmd w',
11268ee4c01bSBram Moolenaar	\ 'setlocal number',
1127f7acf2b6SBram Moolenaar	\ ], 'Xtest_diff_diff')
1128f7acf2b6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
1129f7acf2b6SBram Moolenaar
1130f7acf2b6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
1131f7acf2b6SBram Moolenaar
1132e73f911cSBram Moolenaar  call term_sendkeys(buf, ":set rightleft\<cr>")
1133e73f911cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_of_diff_02', {})
1134e73f911cSBram Moolenaar
1135f7acf2b6SBram Moolenaar  " clean up
1136f7acf2b6SBram Moolenaar  call StopVimInTerminal(buf)
1137f7acf2b6SBram Moolenaar  call delete('Xtest_diff_diff')
1138f7acf2b6SBram Moolenaarendfunc
1139c8234779SBram Moolenaar
1140c8234779SBram Moolenaarfunc CloseoffSetup()
1141c8234779SBram Moolenaar  enew
1142c8234779SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
1143c8234779SBram Moolenaar  diffthis
1144c8234779SBram Moolenaar  new
1145c8234779SBram Moolenaar  call setline(1, ['one', 'tow', 'three'])
1146c8234779SBram Moolenaar  diffthis
1147c8234779SBram Moolenaar  call assert_equal(1, &diff)
1148c8234779SBram Moolenaar  only!
1149c8234779SBram Moolenaarendfunc
1150c8234779SBram Moolenaar
1151c8234779SBram Moolenaarfunc Test_diff_closeoff()
1152c8234779SBram Moolenaar  " "closeoff" included by default: last diff win gets 'diff' reset'
1153c8234779SBram Moolenaar  call CloseoffSetup()
1154c8234779SBram Moolenaar  call assert_equal(0, &diff)
1155c8234779SBram Moolenaar  enew!
1156c8234779SBram Moolenaar
1157c8234779SBram Moolenaar  " "closeoff" excluded: last diff win keeps 'diff' set'
1158c8234779SBram Moolenaar  set diffopt-=closeoff
1159c8234779SBram Moolenaar  call CloseoffSetup()
1160c8234779SBram Moolenaar  call assert_equal(1, &diff)
1161c8234779SBram Moolenaar  diffoff!
1162c8234779SBram Moolenaar  enew!
1163c8234779SBram Moolenaarendfunc
1164f4a1d1c0SBram Moolenaar
11654223d43cSBram Moolenaarfunc Test_diff_followwrap()
11664223d43cSBram Moolenaar  new
11674223d43cSBram Moolenaar  set diffopt+=followwrap
11684223d43cSBram Moolenaar  set wrap
11694223d43cSBram Moolenaar  diffthis
11704223d43cSBram Moolenaar  call assert_equal(1, &wrap)
11714223d43cSBram Moolenaar  diffoff
11724223d43cSBram Moolenaar  set nowrap
11734223d43cSBram Moolenaar  diffthis
11744223d43cSBram Moolenaar  call assert_equal(0, &wrap)
11754223d43cSBram Moolenaar  diffoff
11764223d43cSBram Moolenaar  set diffopt&
11774223d43cSBram Moolenaar  bwipe!
11784223d43cSBram Moolenaarendfunc
11794223d43cSBram Moolenaar
1180f4a1d1c0SBram Moolenaarfunc Test_diff_maintains_change_mark()
1181f4a1d1c0SBram Moolenaar  enew!
1182f4a1d1c0SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1183f4a1d1c0SBram Moolenaar  diffthis
1184f4a1d1c0SBram Moolenaar  new
1185f4a1d1c0SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'e'])
1186f4a1d1c0SBram Moolenaar  " Set '[ and '] marks
1187f4a1d1c0SBram Moolenaar  2,3yank
1188f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1189f4a1d1c0SBram Moolenaar  " Verify they aren't affected by the implicit diff
1190f4a1d1c0SBram Moolenaar  diffthis
1191f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1192f4a1d1c0SBram Moolenaar  " Verify they aren't affected by an explicit diff
1193f4a1d1c0SBram Moolenaar  diffupdate
1194f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1195f4a1d1c0SBram Moolenaar  bwipe!
1196f4a1d1c0SBram Moolenaar  bwipe!
1197f4a1d1c0SBram Moolenaarendfunc
11988dfcce3aSBram Moolenaar
11998dfcce3aSBram Moolenaar" Test for 'patchexpr'
12008dfcce3aSBram Moolenaarfunc Test_patchexpr()
12018dfcce3aSBram Moolenaar  let g:patch_args = []
12028dfcce3aSBram Moolenaar  func TPatch()
12038dfcce3aSBram Moolenaar    call add(g:patch_args, readfile(v:fname_in))
12048dfcce3aSBram Moolenaar    call add(g:patch_args, readfile(v:fname_diff))
12058dfcce3aSBram Moolenaar    call writefile(['output file'], v:fname_out)
12068dfcce3aSBram Moolenaar  endfunc
12078dfcce3aSBram Moolenaar  set patchexpr=TPatch()
12088dfcce3aSBram Moolenaar
12098dfcce3aSBram Moolenaar  call writefile(['input file'], 'Xinput')
12108dfcce3aSBram Moolenaar  call writefile(['diff file'], 'Xdiff')
12118dfcce3aSBram Moolenaar  %bwipe!
12128dfcce3aSBram Moolenaar  edit Xinput
12138dfcce3aSBram Moolenaar  diffpatch Xdiff
12148dfcce3aSBram Moolenaar  call assert_equal('output file', getline(1))
12158dfcce3aSBram Moolenaar  call assert_equal('Xinput.new', bufname())
12168dfcce3aSBram Moolenaar  call assert_equal(2, winnr('$'))
12178dfcce3aSBram Moolenaar  call assert_true(&diff)
12188dfcce3aSBram Moolenaar
12198dfcce3aSBram Moolenaar  call delete('Xinput')
12208dfcce3aSBram Moolenaar  call delete('Xdiff')
12218dfcce3aSBram Moolenaar  set patchexpr&
12228dfcce3aSBram Moolenaar  delfunc TPatch
12238dfcce3aSBram Moolenaar  %bwipe!
12248dfcce3aSBram Moolenaarendfunc
12258dfcce3aSBram Moolenaar
1226511feec6SBram Moolenaarfunc Test_diff_rnu()
1227511feec6SBram Moolenaar  CheckScreendump
1228511feec6SBram Moolenaar
1229511feec6SBram Moolenaar  let content =<< trim END
1230511feec6SBram Moolenaar    call setline(1, ['a', 'a', 'a', 'y', 'b', 'b', 'b', 'b', 'b'])
1231511feec6SBram Moolenaar    vnew
1232511feec6SBram Moolenaar    call setline(1, ['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b', 'b', 'b'])
1233511feec6SBram Moolenaar    windo diffthis
1234511feec6SBram Moolenaar    setlocal number rnu foldcolumn=0
1235511feec6SBram Moolenaar  END
1236511feec6SBram Moolenaar  call writefile(content, 'Xtest_diff_rnu')
1237511feec6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_rnu', {})
1238511feec6SBram Moolenaar
1239511feec6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_rnu_01', {})
1240511feec6SBram Moolenaar
1241511feec6SBram Moolenaar  call term_sendkeys(buf, "j")
1242511feec6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_rnu_02', {})
1243511feec6SBram Moolenaar  call term_sendkeys(buf, "j")
1244511feec6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_rnu_03', {})
1245511feec6SBram Moolenaar
1246511feec6SBram Moolenaar  " clean up
1247511feec6SBram Moolenaar  call StopVimInTerminal(buf)
1248511feec6SBram Moolenaar  call delete('Xtest_diff_rnu')
1249511feec6SBram Moolenaarendfunc
1250511feec6SBram Moolenaar
1251fc838d6cSBram Moolenaarfunc Test_diff_multilineconceal()
1252fc838d6cSBram Moolenaar  new
1253fc838d6cSBram Moolenaar  diffthis
1254fc838d6cSBram Moolenaar
1255fc838d6cSBram Moolenaar  new
1256fc838d6cSBram Moolenaar  call matchadd('Conceal', 'a\nb', 9, -1, {'conceal': 'Y'})
1257fc838d6cSBram Moolenaar  set cole=2 cocu=n
1258fc838d6cSBram Moolenaar  call setline(1, ["a", "b"])
1259fc838d6cSBram Moolenaar  diffthis
1260fc838d6cSBram Moolenaar  redraw
1261fc838d6cSBram Moolenaarendfunc
1262fc838d6cSBram Moolenaar
12638455c5edSBram Moolenaarfunc Test_diff_and_scroll()
12648455c5edSBram Moolenaar  " this was causing an ml_get error
12658455c5edSBram Moolenaar  set ls=2
12668455c5edSBram Moolenaar  for i in range(winheight(0) * 2)
12678455c5edSBram Moolenaar    call setline(i, i < winheight(0) - 10 ? i : i + 10)
12688455c5edSBram Moolenaar  endfor
12698455c5edSBram Moolenaar  vnew
12708455c5edSBram Moolenaar  for i in range(winheight(0)*2 + 10)
12718455c5edSBram Moolenaar    call setline(i, i < winheight(0) - 10 ? 0 : i)
12728455c5edSBram Moolenaar  endfor
12738455c5edSBram Moolenaar  diffthis
12748455c5edSBram Moolenaar  wincmd p
12758455c5edSBram Moolenaar  diffthis
12768455c5edSBram Moolenaar  execute 'normal ' . winheight(0) . "\<C-d>"
12778455c5edSBram Moolenaar
12788455c5edSBram Moolenaar  bwipe!
12798455c5edSBram Moolenaar  bwipe!
12808455c5edSBram Moolenaar  set ls&
12818455c5edSBram Moolenaarendfunc
12828455c5edSBram Moolenaar
1283fabc3ca8SBram Moolenaarfunc Test_diff_filler_cursorcolumn()
1284fabc3ca8SBram Moolenaar  CheckScreendump
1285fabc3ca8SBram Moolenaar
1286fabc3ca8SBram Moolenaar  let content =<< trim END
1287fabc3ca8SBram Moolenaar    call setline(1, ['aa', 'bb', 'cc'])
1288fabc3ca8SBram Moolenaar    vnew
1289fabc3ca8SBram Moolenaar    call setline(1, ['aa', 'cc'])
1290fabc3ca8SBram Moolenaar    windo diffthis
1291fabc3ca8SBram Moolenaar    wincmd p
1292fabc3ca8SBram Moolenaar    setlocal cursorcolumn foldcolumn=0
1293fabc3ca8SBram Moolenaar    norm! gg0
1294fabc3ca8SBram Moolenaar    redraw!
1295fabc3ca8SBram Moolenaar  END
1296fabc3ca8SBram Moolenaar  call writefile(content, 'Xtest_diff_cuc')
1297fabc3ca8SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_cuc', {})
1298fabc3ca8SBram Moolenaar
1299fabc3ca8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_cuc_01', {})
1300fabc3ca8SBram Moolenaar
1301fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "l")
1302fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "\<C-l>")
1303fabc3ca8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_cuc_02', {})
1304fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "0j")
1305fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "\<C-l>")
1306fabc3ca8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_cuc_03', {})
1307fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "l")
1308fabc3ca8SBram Moolenaar  call term_sendkeys(buf, "\<C-l>")
1309fabc3ca8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_cuc_04', {})
1310fabc3ca8SBram Moolenaar
1311fabc3ca8SBram Moolenaar  " clean up
1312fabc3ca8SBram Moolenaar  call StopVimInTerminal(buf)
1313fabc3ca8SBram Moolenaar  call delete('Xtest_diff_cuc')
1314fabc3ca8SBram Moolenaarendfunc
1315fabc3ca8SBram Moolenaar
13163044324eSYegappan Lakshmanan" Test for adding/removing lines inside diff chunks, between diff chunks
13173044324eSYegappan Lakshmanan" and before diff chunks
13183044324eSYegappan Lakshmananfunc Test_diff_modify_chunks()
13193044324eSYegappan Lakshmanan  enew!
13203044324eSYegappan Lakshmanan  let w2_id = win_getid()
13213044324eSYegappan Lakshmanan  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
13223044324eSYegappan Lakshmanan  new
13233044324eSYegappan Lakshmanan  let w1_id = win_getid()
13243044324eSYegappan Lakshmanan  call setline(1, ['a', '2', '3', 'd', 'e', 'f', '7', '8', 'i'])
13253044324eSYegappan Lakshmanan  windo diffthis
13263044324eSYegappan Lakshmanan
13273044324eSYegappan Lakshmanan  " remove a line between two diff chunks and create a new diff chunk
13283044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13293044324eSYegappan Lakshmanan  5d
13303044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13313044324eSYegappan Lakshmanan  call diff_hlID(5, 1)->synIDattr('name')->assert_equal('DiffAdd')
13323044324eSYegappan Lakshmanan
13333044324eSYegappan Lakshmanan  " add a line between two diff chunks
13343044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13353044324eSYegappan Lakshmanan  normal! 4Goe
13363044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13373044324eSYegappan Lakshmanan  call diff_hlID(4, 1)->synIDattr('name')->assert_equal('')
13383044324eSYegappan Lakshmanan  call diff_hlID(5, 1)->synIDattr('name')->assert_equal('')
13393044324eSYegappan Lakshmanan
13403044324eSYegappan Lakshmanan  " remove all the lines in a diff chunk.
13413044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13423044324eSYegappan Lakshmanan  7,8d
13433044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13443044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13453044324eSYegappan Lakshmanan  call assert_equal(['', 'DiffText', 'DiffText', '', '', '', 'DiffAdd',
13463044324eSYegappan Lakshmanan        \ 'DiffAdd', ''], hl)
13473044324eSYegappan Lakshmanan
13483044324eSYegappan Lakshmanan  " remove lines from one diff chunk to just before the next diff chunk
13493044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13503044324eSYegappan Lakshmanan  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
13513044324eSYegappan Lakshmanan  2,6d
13523044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13533044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13543044324eSYegappan Lakshmanan  call assert_equal(['', 'DiffText', 'DiffText', 'DiffAdd', 'DiffAdd',
13553044324eSYegappan Lakshmanan        \ 'DiffAdd', 'DiffAdd', 'DiffAdd', ''], hl)
13563044324eSYegappan Lakshmanan
13573044324eSYegappan Lakshmanan  " remove lines just before the top of a diff chunk
13583044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13593044324eSYegappan Lakshmanan  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
13603044324eSYegappan Lakshmanan  5,6d
13613044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13623044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13633044324eSYegappan Lakshmanan  call assert_equal(['', 'DiffText', 'DiffText', '', 'DiffText', 'DiffText',
13643044324eSYegappan Lakshmanan        \ 'DiffAdd', 'DiffAdd', ''], hl)
13653044324eSYegappan Lakshmanan
13663044324eSYegappan Lakshmanan  " remove line after the end of a diff chunk
13673044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13683044324eSYegappan Lakshmanan  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
13693044324eSYegappan Lakshmanan  4d
13703044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13713044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13723044324eSYegappan Lakshmanan  call assert_equal(['', 'DiffText', 'DiffText', 'DiffAdd', '', '', 'DiffText',
13733044324eSYegappan Lakshmanan        \ 'DiffText', ''], hl)
13743044324eSYegappan Lakshmanan
13753044324eSYegappan Lakshmanan  " remove lines starting from the end of one diff chunk and ending inside
13763044324eSYegappan Lakshmanan  " another diff chunk
13773044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13783044324eSYegappan Lakshmanan  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
13793044324eSYegappan Lakshmanan  4,7d
13803044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13813044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13823044324eSYegappan Lakshmanan  call assert_equal(['', 'DiffText', 'DiffText', 'DiffText', 'DiffAdd',
13833044324eSYegappan Lakshmanan        \ 'DiffAdd', 'DiffAdd', 'DiffAdd', ''], hl)
13843044324eSYegappan Lakshmanan
13853044324eSYegappan Lakshmanan  " removing the only remaining diff chunk should make the files equal
13863044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13873044324eSYegappan Lakshmanan  call setline(1, ['a', '2', '3', 'x', 'd', 'e', 'f', 'x', '7', '8', 'i'])
13883044324eSYegappan Lakshmanan  8d
13893044324eSYegappan Lakshmanan  let hl = range(1, 10)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13903044324eSYegappan Lakshmanan  call assert_equal(['', '', '', 'DiffAdd', '', '', '', '', '', ''], hl)
13913044324eSYegappan Lakshmanan  call win_gotoid(w2_id)
13923044324eSYegappan Lakshmanan  4d
13933044324eSYegappan Lakshmanan  call win_gotoid(w1_id)
13943044324eSYegappan Lakshmanan  let hl = range(1, 9)->map({_, lnum -> diff_hlID(lnum, 1)->synIDattr('name')})
13953044324eSYegappan Lakshmanan  call assert_equal(['', '', '', '', '', '', '', '', ''], hl)
13963044324eSYegappan Lakshmanan
13973044324eSYegappan Lakshmanan  %bw!
13983044324eSYegappan Lakshmananendfunc
1399ad5c178aSglacambre
14008dfcce3aSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1401