142093c0eSBram Moolenaar" Tests for diff mode
2e828b762SBram Moolenaarsource shared.vim
3e828b762SBram Moolenaarsource screendump.vim
43c8ee629SBram Moolenaarsource check.vim
542093c0eSBram Moolenaar
642093c0eSBram Moolenaarfunc Test_diff_fold_sync()
742093c0eSBram Moolenaar  enew!
8e8fa05b5SBram Moolenaar  let g:update_count = 0
9e8fa05b5SBram Moolenaar  au DiffUpdated * let g:update_count += 1
10e8fa05b5SBram Moolenaar
1142093c0eSBram Moolenaar  let l = range(50)
1242093c0eSBram Moolenaar  call setline(1, l)
1342093c0eSBram Moolenaar  diffthis
1442093c0eSBram Moolenaar  let winone = win_getid()
1542093c0eSBram Moolenaar  new
1642093c0eSBram Moolenaar  let l[25] = 'diff'
1742093c0eSBram Moolenaar  call setline(1, l)
1842093c0eSBram Moolenaar  diffthis
1942093c0eSBram Moolenaar  let wintwo = win_getid()
2042093c0eSBram Moolenaar  " line 15 is inside the closed fold
2142093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
2242093c0eSBram Moolenaar  call win_gotoid(winone)
2342093c0eSBram Moolenaar  call assert_equal(19, foldclosedend(10))
2442093c0eSBram Moolenaar  " open the fold
2542093c0eSBram Moolenaar  normal zv
2642093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
2742093c0eSBram Moolenaar  " fold in other window must have opened too
2842093c0eSBram Moolenaar  call win_gotoid(wintwo)
2942093c0eSBram Moolenaar  call assert_equal(-1, foldclosedend(10))
3042093c0eSBram Moolenaar
3142093c0eSBram Moolenaar  " cursor position is in sync
3242093c0eSBram Moolenaar  normal 23G
3342093c0eSBram Moolenaar  call win_gotoid(winone)
3442093c0eSBram Moolenaar  call assert_equal(23, getcurpos()[1])
3542093c0eSBram Moolenaar
36e8fa05b5SBram Moolenaar  call assert_equal(1, g:update_count)
37e8fa05b5SBram Moolenaar  au! DiffUpdated
38e8fa05b5SBram Moolenaar
3942093c0eSBram Moolenaar  windo diffoff
4042093c0eSBram Moolenaar  close!
4142093c0eSBram Moolenaar  set nomodified
4242093c0eSBram Moolenaarendfunc
4342093c0eSBram Moolenaar
4442093c0eSBram Moolenaarfunc Test_vert_split()
45e828b762SBram Moolenaar  set diffopt=filler
46e828b762SBram Moolenaar  call Common_vert_split()
47e828b762SBram Moolenaar  set diffopt&
48e828b762SBram Moolenaarendfunc
49e828b762SBram Moolenaar
50e828b762SBram Moolenaarfunc Test_vert_split_internal()
51e828b762SBram Moolenaar  set diffopt=internal,filler
52e828b762SBram Moolenaar  call Common_vert_split()
53e828b762SBram Moolenaar  set diffopt&
54e828b762SBram Moolenaarendfunc
55e828b762SBram Moolenaar
56e828b762SBram Moolenaarfunc Common_vert_split()
5742093c0eSBram Moolenaar  " Disable the title to avoid xterm keeping the wrong one.
5842093c0eSBram Moolenaar  set notitle noicon
5942093c0eSBram Moolenaar  new
6042093c0eSBram Moolenaar  let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
6142093c0eSBram Moolenaar  call setline(1, l)
6242093c0eSBram Moolenaar  w! Xtest
6342093c0eSBram Moolenaar  normal dd
6442093c0eSBram Moolenaar  $
6542093c0eSBram Moolenaar  put
6642093c0eSBram Moolenaar  normal kkrXoxxx
6742093c0eSBram Moolenaar  w! Xtest2
6842093c0eSBram Moolenaar  file Nop
6942093c0eSBram Moolenaar  normal ggoyyyjjjozzzz
7042093c0eSBram Moolenaar  set foldmethod=marker foldcolumn=4
7142093c0eSBram Moolenaar  call assert_equal(0, &diff)
7242093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
7342093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
7442093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
7542093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
7642093c0eSBram Moolenaar  call assert_equal(1, &wrap)
7742093c0eSBram Moolenaar
7842093c0eSBram Moolenaar  vert diffsplit Xtest
7942093c0eSBram Moolenaar  vert diffsplit Xtest2
8042093c0eSBram Moolenaar  call assert_equal(1, &diff)
8142093c0eSBram Moolenaar  call assert_equal('diff', &foldmethod)
8242093c0eSBram Moolenaar  call assert_equal(2, &foldcolumn)
8342093c0eSBram Moolenaar  call assert_equal(1, &scrollbind)
8442093c0eSBram Moolenaar  call assert_equal(1, &cursorbind)
8542093c0eSBram Moolenaar  call assert_equal(0, &wrap)
8642093c0eSBram Moolenaar
8742093c0eSBram Moolenaar  let diff_fdm = &fdm
8842093c0eSBram Moolenaar  let diff_fdc = &fdc
8942093c0eSBram Moolenaar  " repeat entering diff mode here to see if this saves the wrong settings
9042093c0eSBram Moolenaar  diffthis
9142093c0eSBram Moolenaar  " jump to second window for a moment to have filler line appear at start of
9242093c0eSBram Moolenaar  " first window
9342093c0eSBram Moolenaar  wincmd w
9442093c0eSBram Moolenaar  normal gg
9542093c0eSBram Moolenaar  wincmd p
9642093c0eSBram Moolenaar  normal gg
9742093c0eSBram Moolenaar  call assert_equal(2, winline())
9842093c0eSBram Moolenaar  normal j
9942093c0eSBram Moolenaar  call assert_equal(4, winline())
10042093c0eSBram Moolenaar  normal j
10142093c0eSBram Moolenaar  call assert_equal(5, winline())
10242093c0eSBram Moolenaar  normal j
10342093c0eSBram Moolenaar  call assert_equal(6, winline())
10442093c0eSBram Moolenaar  normal j
10542093c0eSBram Moolenaar  call assert_equal(8, winline())
10642093c0eSBram Moolenaar  normal j
10742093c0eSBram Moolenaar  call assert_equal(9, winline())
10842093c0eSBram Moolenaar
10942093c0eSBram Moolenaar  wincmd w
11042093c0eSBram Moolenaar  normal gg
11142093c0eSBram Moolenaar  call assert_equal(1, winline())
11242093c0eSBram Moolenaar  normal j
11342093c0eSBram Moolenaar  call assert_equal(2, winline())
11442093c0eSBram Moolenaar  normal j
11542093c0eSBram Moolenaar  call assert_equal(4, winline())
11642093c0eSBram Moolenaar  normal j
11742093c0eSBram Moolenaar  call assert_equal(5, winline())
11842093c0eSBram Moolenaar  normal j
11942093c0eSBram Moolenaar  call assert_equal(8, winline())
12042093c0eSBram Moolenaar
12142093c0eSBram Moolenaar  wincmd w
12242093c0eSBram Moolenaar  normal gg
12342093c0eSBram Moolenaar  call assert_equal(2, winline())
12442093c0eSBram Moolenaar  normal j
12542093c0eSBram Moolenaar  call assert_equal(3, winline())
12642093c0eSBram Moolenaar  normal j
12742093c0eSBram Moolenaar  call assert_equal(4, winline())
12842093c0eSBram Moolenaar  normal j
12942093c0eSBram Moolenaar  call assert_equal(5, winline())
13042093c0eSBram Moolenaar  normal j
13142093c0eSBram Moolenaar  call assert_equal(6, winline())
13242093c0eSBram Moolenaar  normal j
13342093c0eSBram Moolenaar  call assert_equal(7, winline())
13442093c0eSBram Moolenaar  normal j
13542093c0eSBram Moolenaar  call assert_equal(8, winline())
13642093c0eSBram Moolenaar
13742093c0eSBram Moolenaar  " Test diffoff
13842093c0eSBram Moolenaar  diffoff!
13942093c0eSBram Moolenaar  1wincmd 2
14042093c0eSBram Moolenaar  let &diff = 1
14142093c0eSBram Moolenaar  let &fdm = diff_fdm
14242093c0eSBram Moolenaar  let &fdc = diff_fdc
14342093c0eSBram Moolenaar  4wincmd w
14442093c0eSBram Moolenaar  diffoff!
14542093c0eSBram Moolenaar  1wincmd w
14642093c0eSBram Moolenaar  call assert_equal(0, &diff)
14742093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
14842093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
14942093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
15042093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
15142093c0eSBram Moolenaar  call assert_equal(1, &wrap)
15242093c0eSBram Moolenaar
15342093c0eSBram Moolenaar  wincmd w
15442093c0eSBram Moolenaar  call assert_equal(0, &diff)
15542093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
15642093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
15742093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
15842093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
15942093c0eSBram Moolenaar  call assert_equal(1, &wrap)
16042093c0eSBram Moolenaar
16142093c0eSBram Moolenaar  wincmd w
16242093c0eSBram Moolenaar  call assert_equal(0, &diff)
16342093c0eSBram Moolenaar  call assert_equal('marker', &foldmethod)
16442093c0eSBram Moolenaar  call assert_equal(4, &foldcolumn)
16542093c0eSBram Moolenaar  call assert_equal(0, &scrollbind)
16642093c0eSBram Moolenaar  call assert_equal(0, &cursorbind)
16742093c0eSBram Moolenaar  call assert_equal(1, &wrap)
16842093c0eSBram Moolenaar
169623cf88fSBram Moolenaar  call delete('Xtest')
170623cf88fSBram Moolenaar  call delete('Xtest2')
17142093c0eSBram Moolenaar  windo bw!
17242093c0eSBram Moolenaarendfunc
17342093c0eSBram Moolenaar
17442093c0eSBram Moolenaarfunc Test_filler_lines()
17542093c0eSBram Moolenaar  " Test that diffing shows correct filler lines
17642093c0eSBram Moolenaar  enew!
17742093c0eSBram Moolenaar  put =range(4,10)
17842093c0eSBram Moolenaar  1d _
17942093c0eSBram Moolenaar  vnew
18042093c0eSBram Moolenaar  put =range(1,10)
18142093c0eSBram Moolenaar  1d _
18242093c0eSBram Moolenaar  windo diffthis
18342093c0eSBram Moolenaar  wincmd h
18442093c0eSBram Moolenaar  call assert_equal(1, line('w0'))
18542093c0eSBram Moolenaar  unlet! diff_fdm diff_fdc
18690d121faSBram Moolenaar  windo diffoff
18790d121faSBram Moolenaar  bwipe!
18890d121faSBram Moolenaar  enew!
18990d121faSBram Moolenaarendfunc
19042093c0eSBram Moolenaar
19190d121faSBram Moolenaarfunc Test_diffget_diffput()
19290d121faSBram Moolenaar  enew!
19390d121faSBram Moolenaar  let l = range(50)
19490d121faSBram Moolenaar  call setline(1, l)
19590d121faSBram Moolenaar  call assert_fails('diffget', 'E99:')
19690d121faSBram Moolenaar  diffthis
19790d121faSBram Moolenaar  call assert_fails('diffget', 'E100:')
19890d121faSBram Moolenaar  new
19990d121faSBram Moolenaar  let l[10] = 'one'
20090d121faSBram Moolenaar  let l[20] = 'two'
20190d121faSBram Moolenaar  let l[30] = 'three'
20290d121faSBram Moolenaar  let l[40] = 'four'
20390d121faSBram Moolenaar  call setline(1, l)
20490d121faSBram Moolenaar  diffthis
20590d121faSBram Moolenaar  call assert_equal('one', getline(11))
20690d121faSBram Moolenaar  11diffget
20790d121faSBram Moolenaar  call assert_equal('10', getline(11))
20890d121faSBram Moolenaar  21diffput
20990d121faSBram Moolenaar  wincmd w
21090d121faSBram Moolenaar  call assert_equal('two', getline(21))
21190d121faSBram Moolenaar  normal 31Gdo
21290d121faSBram Moolenaar  call assert_equal('three', getline(31))
21390d121faSBram Moolenaar  call assert_equal('40', getline(41))
21490d121faSBram Moolenaar  normal 41Gdp
21590d121faSBram Moolenaar  wincmd w
21690d121faSBram Moolenaar  call assert_equal('40', getline(41))
21790d121faSBram Moolenaar  new
21890d121faSBram Moolenaar  diffthis
21990d121faSBram Moolenaar  call assert_fails('diffget', 'E101:')
22090d121faSBram Moolenaar
22190d121faSBram Moolenaar  windo diffoff
22279a213d6SBram Moolenaar  %bwipe!
22379a213d6SBram Moolenaarendfunc
22479a213d6SBram Moolenaar
2255f57bdcaSBram Moolenaar" Test putting two changes from one buffer to another
2265f57bdcaSBram Moolenaarfunc Test_diffput_two()
2275f57bdcaSBram Moolenaar  new a
2285f57bdcaSBram Moolenaar  let win_a = win_getid()
2295f57bdcaSBram Moolenaar  call setline(1, range(1, 10))
2305f57bdcaSBram Moolenaar  diffthis
2315f57bdcaSBram Moolenaar  new b
2325f57bdcaSBram Moolenaar  let win_b = win_getid()
2335f57bdcaSBram Moolenaar  call setline(1, range(1, 10))
2345f57bdcaSBram Moolenaar  8del
2355f57bdcaSBram Moolenaar  5del
2365f57bdcaSBram Moolenaar  diffthis
2375f57bdcaSBram Moolenaar  call win_gotoid(win_a)
2385f57bdcaSBram Moolenaar  %diffput
2395f57bdcaSBram Moolenaar  call win_gotoid(win_b)
2405f57bdcaSBram Moolenaar  call assert_equal(map(range(1, 10), 'string(v:val)'), getline(1, '$'))
2415f57bdcaSBram Moolenaar  bwipe! a
2425f57bdcaSBram Moolenaar  bwipe! b
2435f57bdcaSBram Moolenaarendfunc
2445f57bdcaSBram Moolenaar
245*ae7dba89SBram Moolenaarfunc Test_diffget_diffput_completion()
246*ae7dba89SBram Moolenaar  new Xdiff1 | diffthis
247*ae7dba89SBram Moolenaar  new Xdiff2 | diffthis
248*ae7dba89SBram Moolenaar  new Xdiff3 | diffthis
249*ae7dba89SBram Moolenaar  new Xdiff4
250*ae7dba89SBram Moolenaar
251*ae7dba89SBram Moolenaar  " :diffput and :diffget completes names of buffers which
252*ae7dba89SBram Moolenaar  " are in diff mode and which are different then current buffer.
253*ae7dba89SBram Moolenaar  b Xdiff1
254*ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
255*ae7dba89SBram Moolenaar  call assert_equal('"diffput Xdiff2 Xdiff3', @:)
256*ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
257*ae7dba89SBram Moolenaar  call assert_equal('"diffget Xdiff2 Xdiff3', @:)
258*ae7dba89SBram Moolenaar  call assert_equal(['Xdiff2', 'Xdiff3'], getcompletion('', 'diff_buffer'))
259*ae7dba89SBram Moolenaar
260*ae7dba89SBram Moolenaar  b Xdiff2
261*ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
262*ae7dba89SBram Moolenaar  call assert_equal('"diffput Xdiff1 Xdiff3', @:)
263*ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
264*ae7dba89SBram Moolenaar  call assert_equal('"diffget Xdiff1 Xdiff3', @:)
265*ae7dba89SBram Moolenaar  call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))
266*ae7dba89SBram Moolenaar
267*ae7dba89SBram Moolenaar  b Xdiff3
268*ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
269*ae7dba89SBram Moolenaar  call assert_equal('"diffput Xdiff1 Xdiff2', @:)
270*ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
271*ae7dba89SBram Moolenaar  call assert_equal('"diffget Xdiff1 Xdiff2', @:)
272*ae7dba89SBram Moolenaar  call assert_equal(['Xdiff1', 'Xdiff2'], getcompletion('', 'diff_buffer'))
273*ae7dba89SBram Moolenaar
274*ae7dba89SBram Moolenaar  " No completion when in Xdiff4, it's not in diff mode.
275*ae7dba89SBram Moolenaar  b Xdiff4
276*ae7dba89SBram Moolenaar  call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
277*ae7dba89SBram Moolenaar  call assert_equal('"diffput ', @:)
278*ae7dba89SBram Moolenaar  call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
279*ae7dba89SBram Moolenaar  call assert_equal('"diffget ', @:)
280*ae7dba89SBram Moolenaar  call assert_equal([], getcompletion('', 'diff_buffer'))
281*ae7dba89SBram Moolenaar
282*ae7dba89SBram Moolenaar  %bwipe
283*ae7dba89SBram Moolenaarendfunc
284*ae7dba89SBram Moolenaar
28579a213d6SBram Moolenaarfunc Test_dp_do_buffer()
28679a213d6SBram Moolenaar  e! one
28779a213d6SBram Moolenaar  let bn1=bufnr('%')
28879a213d6SBram Moolenaar  let l = range(60)
28979a213d6SBram Moolenaar  call setline(1, l)
29079a213d6SBram Moolenaar  diffthis
29179a213d6SBram Moolenaar
29279a213d6SBram Moolenaar  new two
29379a213d6SBram Moolenaar  let l[10] = 'one'
29479a213d6SBram Moolenaar  let l[20] = 'two'
29579a213d6SBram Moolenaar  let l[30] = 'three'
29679a213d6SBram Moolenaar  let l[40] = 'four'
29779a213d6SBram Moolenaar  let l[50] = 'five'
29879a213d6SBram Moolenaar  call setline(1, l)
29979a213d6SBram Moolenaar  diffthis
30079a213d6SBram Moolenaar
30179a213d6SBram Moolenaar  " dp and do with invalid buffer number.
30279a213d6SBram Moolenaar  11
30379a213d6SBram Moolenaar  call assert_fails('norm 99999dp', 'E102:')
30479a213d6SBram Moolenaar  call assert_fails('norm 99999do', 'E102:')
30579a213d6SBram Moolenaar  call assert_fails('diffput non_existing_buffer', 'E94:')
30679a213d6SBram Moolenaar  call assert_fails('diffget non_existing_buffer', 'E94:')
30779a213d6SBram Moolenaar
30879a213d6SBram Moolenaar  " dp and do with valid buffer number.
30979a213d6SBram Moolenaar  call assert_equal('one', getline('.'))
31079a213d6SBram Moolenaar  exe 'norm ' . bn1 . 'do'
31179a213d6SBram Moolenaar  call assert_equal('10', getline('.'))
31279a213d6SBram Moolenaar  21
31379a213d6SBram Moolenaar  call assert_equal('two', getline('.'))
31479a213d6SBram Moolenaar  diffget one
31579a213d6SBram Moolenaar  call assert_equal('20', getline('.'))
31679a213d6SBram Moolenaar
31779a213d6SBram Moolenaar  31
31879a213d6SBram Moolenaar  exe 'norm ' . bn1 . 'dp'
31979a213d6SBram Moolenaar  41
32079a213d6SBram Moolenaar  diffput one
32179a213d6SBram Moolenaar  wincmd w
32279a213d6SBram Moolenaar  31
32379a213d6SBram Moolenaar  call assert_equal('three', getline('.'))
32479a213d6SBram Moolenaar  41
32579a213d6SBram Moolenaar  call assert_equal('four', getline('.'))
32679a213d6SBram Moolenaar
32779a213d6SBram Moolenaar  " dp and do with buffer number which is not in diff mode.
32879a213d6SBram Moolenaar  new not_in_diff_mode
32979a213d6SBram Moolenaar  let bn3=bufnr('%')
33079a213d6SBram Moolenaar  wincmd w
33179a213d6SBram Moolenaar  51
33279a213d6SBram Moolenaar  call assert_fails('exe "norm" . bn3 . "dp"', 'E103:')
33379a213d6SBram Moolenaar  call assert_fails('exe "norm" . bn3 . "do"', 'E103:')
33479a213d6SBram Moolenaar  call assert_fails('diffput not_in_diff_mode', 'E94:')
33579a213d6SBram Moolenaar  call assert_fails('diffget not_in_diff_mode', 'E94:')
33679a213d6SBram Moolenaar
33779a213d6SBram Moolenaar  windo diffoff
33879a213d6SBram Moolenaar  %bwipe!
33942093c0eSBram Moolenaarendfunc
340e67d546fSBram Moolenaar
341df77cef9SBram Moolenaarfunc Test_do_lastline()
342df77cef9SBram Moolenaar  e! one
343df77cef9SBram Moolenaar  call setline(1, ['1','2','3','4','5','6'])
344df77cef9SBram Moolenaar  diffthis
345df77cef9SBram Moolenaar
346df77cef9SBram Moolenaar  new two
347df77cef9SBram Moolenaar  call setline(1, ['2','4','5'])
348df77cef9SBram Moolenaar  diffthis
349df77cef9SBram Moolenaar
350df77cef9SBram Moolenaar  1
351df77cef9SBram Moolenaar  norm dp]c
352df77cef9SBram Moolenaar  norm dp]c
353df77cef9SBram Moolenaar  wincmd w
354df77cef9SBram Moolenaar  call assert_equal(4, line('$'))
355df77cef9SBram Moolenaar  norm G
356df77cef9SBram Moolenaar  norm do
357df77cef9SBram Moolenaar  call assert_equal(3, line('$'))
358df77cef9SBram Moolenaar
359df77cef9SBram Moolenaar  windo diffoff
360df77cef9SBram Moolenaar  %bwipe!
361df77cef9SBram Moolenaarendfunc
362df77cef9SBram Moolenaar
363e67d546fSBram Moolenaarfunc Test_diffoff()
364e67d546fSBram Moolenaar  enew!
365e67d546fSBram Moolenaar  call setline(1, ['Two', 'Three'])
36679a213d6SBram Moolenaar  redraw
367e67d546fSBram Moolenaar  let normattr = screenattr(1, 1)
368e67d546fSBram Moolenaar  diffthis
369e67d546fSBram Moolenaar  botright vert new
370e67d546fSBram Moolenaar  call setline(1, ['One', '', 'Two', 'Three'])
371e67d546fSBram Moolenaar  diffthis
372e67d546fSBram Moolenaar  redraw
373196b4664SBram Moolenaar  call assert_notequal(normattr, 1->screenattr(1))
374e67d546fSBram Moolenaar  diffoff!
375e67d546fSBram Moolenaar  redraw
376e67d546fSBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
377e67d546fSBram Moolenaar  bwipe!
378e67d546fSBram Moolenaar  bwipe!
379e67d546fSBram Moolenaarendfunc
380025e3e0bSBram Moolenaar
381e828b762SBram Moolenaarfunc Common_icase_test()
382e828b762SBram Moolenaar  edit one
383da22b8ccSBram Moolenaar  call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
38479a213d6SBram Moolenaar  redraw
38579a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
38679a213d6SBram Moolenaar  diffthis
38779a213d6SBram Moolenaar
38879a213d6SBram Moolenaar  botright vert new two
389da22b8ccSBram Moolenaar  call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
39079a213d6SBram Moolenaar  diffthis
39179a213d6SBram Moolenaar
39279a213d6SBram Moolenaar  redraw
39379a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
39479a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
39579a213d6SBram Moolenaar  call assert_notequal(normattr, screenattr(3, 1))
39679a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(4, 1))
39779a213d6SBram Moolenaar
398da22b8ccSBram Moolenaar  let dtextattr = screenattr(5, 3)
399da22b8ccSBram Moolenaar  call assert_notequal(dtextattr, screenattr(5, 1))
400da22b8ccSBram Moolenaar  call assert_notequal(dtextattr, screenattr(5, 5))
401da22b8ccSBram Moolenaar
40279a213d6SBram Moolenaar  diffoff!
40379a213d6SBram Moolenaar  %bwipe!
404e828b762SBram Moolenaarendfunc
405e828b762SBram Moolenaar
406e828b762SBram Moolenaarfunc Test_diffopt_icase()
407e828b762SBram Moolenaar  set diffopt=icase,foldcolumn:0
408e828b762SBram Moolenaar  call Common_icase_test()
40979a213d6SBram Moolenaar  set diffopt&
41079a213d6SBram Moolenaarendfunc
41179a213d6SBram Moolenaar
412e828b762SBram Moolenaarfunc Test_diffopt_icase_internal()
413e828b762SBram Moolenaar  set diffopt=icase,foldcolumn:0,internal
414e828b762SBram Moolenaar  call Common_icase_test()
415e828b762SBram Moolenaar  set diffopt&
416e828b762SBram Moolenaarendfunc
41779a213d6SBram Moolenaar
418e828b762SBram Moolenaarfunc Common_iwhite_test()
419e828b762SBram Moolenaar  edit one
420e828b762SBram Moolenaar  " Difference in trailing spaces and amount of spaces should be ignored,
42179a213d6SBram Moolenaar  " but not other space differences.
422e828b762SBram Moolenaar  call setline(1, ["One \t", 'Two', 'Three', 'one two', 'one two', 'Four'])
42379a213d6SBram Moolenaar  redraw
42479a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
42579a213d6SBram Moolenaar  diffthis
42679a213d6SBram Moolenaar
42779a213d6SBram Moolenaar  botright vert new two
428e828b762SBram Moolenaar  call setline(1, ["One\t ", "Two\t ", 'Three', 'one   two', 'onetwo', ' Four'])
42979a213d6SBram Moolenaar  diffthis
43079a213d6SBram Moolenaar
43179a213d6SBram Moolenaar  redraw
43279a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
43379a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
43479a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(3, 1))
435e828b762SBram Moolenaar  call assert_equal(normattr, screenattr(4, 1))
436e828b762SBram Moolenaar  call assert_notequal(normattr, screenattr(5, 1))
437e828b762SBram Moolenaar  call assert_notequal(normattr, screenattr(6, 1))
43879a213d6SBram Moolenaar
43979a213d6SBram Moolenaar  diffoff!
44079a213d6SBram Moolenaar  %bwipe!
441e828b762SBram Moolenaarendfunc
442e828b762SBram Moolenaar
443e828b762SBram Moolenaarfunc Test_diffopt_iwhite()
444e828b762SBram Moolenaar  set diffopt=iwhite,foldcolumn:0
445e828b762SBram Moolenaar  call Common_iwhite_test()
446e828b762SBram Moolenaar  set diffopt&
447e828b762SBram Moolenaarendfunc
448e828b762SBram Moolenaar
449e828b762SBram Moolenaarfunc Test_diffopt_iwhite_internal()
450e828b762SBram Moolenaar  set diffopt=internal,iwhite,foldcolumn:0
451e828b762SBram Moolenaar  call Common_iwhite_test()
45279a213d6SBram Moolenaar  set diffopt&
45379a213d6SBram Moolenaarendfunc
45479a213d6SBram Moolenaar
45579a213d6SBram Moolenaarfunc Test_diffopt_context()
45679a213d6SBram Moolenaar  enew!
45779a213d6SBram Moolenaar  call setline(1, ['1', '2', '3', '4', '5', '6', '7'])
45879a213d6SBram Moolenaar  diffthis
45979a213d6SBram Moolenaar  new
46079a213d6SBram Moolenaar  call setline(1, ['1', '2', '3', '4', '5x', '6', '7'])
46179a213d6SBram Moolenaar  diffthis
46279a213d6SBram Moolenaar
46379a213d6SBram Moolenaar  set diffopt=context:2
46479a213d6SBram Moolenaar  call assert_equal('+--  2 lines: 1', foldtextresult(1))
465e828b762SBram Moolenaar  set diffopt=internal,context:2
466e828b762SBram Moolenaar  call assert_equal('+--  2 lines: 1', foldtextresult(1))
467e828b762SBram Moolenaar
46879a213d6SBram Moolenaar  set diffopt=context:1
46979a213d6SBram Moolenaar  call assert_equal('+--  3 lines: 1', foldtextresult(1))
470e828b762SBram Moolenaar  set diffopt=internal,context:1
471e828b762SBram Moolenaar  call assert_equal('+--  3 lines: 1', foldtextresult(1))
47279a213d6SBram Moolenaar
47379a213d6SBram Moolenaar  diffoff!
47479a213d6SBram Moolenaar  %bwipe!
47579a213d6SBram Moolenaar  set diffopt&
47679a213d6SBram Moolenaarendfunc
47779a213d6SBram Moolenaar
47879a213d6SBram Moolenaarfunc Test_diffopt_horizontal()
479e828b762SBram Moolenaar  set diffopt=internal,horizontal
48079a213d6SBram Moolenaar  diffsplit
48179a213d6SBram Moolenaar
48279a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(1))
48379a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(2))
48479a213d6SBram Moolenaar  call assert_equal(&lines, winheight(1) + winheight(2) + 3)
48579a213d6SBram Moolenaar  call assert_inrange(0, 1, winheight(1) - winheight(2))
48679a213d6SBram Moolenaar
48779a213d6SBram Moolenaar  set diffopt&
48879a213d6SBram Moolenaar  diffoff!
48979a213d6SBram Moolenaar  %bwipe
49079a213d6SBram Moolenaarendfunc
49179a213d6SBram Moolenaar
49279a213d6SBram Moolenaarfunc Test_diffopt_vertical()
493e828b762SBram Moolenaar  set diffopt=internal,vertical
49479a213d6SBram Moolenaar  diffsplit
49579a213d6SBram Moolenaar
49679a213d6SBram Moolenaar  call assert_equal(&lines - 2, winheight(1))
49779a213d6SBram Moolenaar  call assert_equal(&lines - 2, winheight(2))
49879a213d6SBram Moolenaar  call assert_equal(&columns, winwidth(1) + winwidth(2) + 1)
49979a213d6SBram Moolenaar  call assert_inrange(0, 1, winwidth(1) - winwidth(2))
50079a213d6SBram Moolenaar
50179a213d6SBram Moolenaar  set diffopt&
50279a213d6SBram Moolenaar  diffoff!
50379a213d6SBram Moolenaar  %bwipe
50479a213d6SBram Moolenaarendfunc
50579a213d6SBram Moolenaar
50697ce4192SBram Moolenaarfunc Test_diffopt_hiddenoff()
507e828b762SBram Moolenaar  set diffopt=internal,filler,foldcolumn:0,hiddenoff
50897ce4192SBram Moolenaar  e! one
50997ce4192SBram Moolenaar  call setline(1, ['Two', 'Three'])
51097ce4192SBram Moolenaar  redraw
51197ce4192SBram Moolenaar  let normattr = screenattr(1, 1)
51297ce4192SBram Moolenaar  diffthis
51397ce4192SBram Moolenaar  botright vert new two
51497ce4192SBram Moolenaar  call setline(1, ['One', 'Four'])
51597ce4192SBram Moolenaar  diffthis
51697ce4192SBram Moolenaar  redraw
51797ce4192SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
51897ce4192SBram Moolenaar  set hidden
51997ce4192SBram Moolenaar  close
52097ce4192SBram Moolenaar  redraw
52197ce4192SBram Moolenaar  " should not diffing with hidden buffer two while 'hiddenoff' is enabled
52297ce4192SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
52397ce4192SBram Moolenaar
52497ce4192SBram Moolenaar  bwipe!
52597ce4192SBram Moolenaar  bwipe!
52697ce4192SBram Moolenaar  set hidden& diffopt&
52797ce4192SBram Moolenaarendfunc
52897ce4192SBram Moolenaar
52925ea0544SBram Moolenaarfunc Test_diffoff_hidden()
530e828b762SBram Moolenaar  set diffopt=internal,filler,foldcolumn:0
53125ea0544SBram Moolenaar  e! one
53225ea0544SBram Moolenaar  call setline(1, ['Two', 'Three'])
53379a213d6SBram Moolenaar  redraw
53425ea0544SBram Moolenaar  let normattr = screenattr(1, 1)
53525ea0544SBram Moolenaar  diffthis
53625ea0544SBram Moolenaar  botright vert new two
53725ea0544SBram Moolenaar  call setline(1, ['One', 'Four'])
53825ea0544SBram Moolenaar  diffthis
53925ea0544SBram Moolenaar  redraw
54025ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
54125ea0544SBram Moolenaar  set hidden
54225ea0544SBram Moolenaar  close
54325ea0544SBram Moolenaar  redraw
54425ea0544SBram Moolenaar  " diffing with hidden buffer two
54525ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
54625ea0544SBram Moolenaar  diffoff
54725ea0544SBram Moolenaar  redraw
54825ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
54925ea0544SBram Moolenaar  diffthis
55025ea0544SBram Moolenaar  redraw
55125ea0544SBram Moolenaar  " still diffing with hidden buffer two
55225ea0544SBram Moolenaar  call assert_notequal(normattr, screenattr(1, 1))
55325ea0544SBram Moolenaar  diffoff!
55425ea0544SBram Moolenaar  redraw
55525ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
55625ea0544SBram Moolenaar  diffthis
55725ea0544SBram Moolenaar  redraw
55825ea0544SBram Moolenaar  " no longer diffing with hidden buffer two
55925ea0544SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
56025ea0544SBram Moolenaar
56125ea0544SBram Moolenaar  bwipe!
56225ea0544SBram Moolenaar  bwipe!
56325ea0544SBram Moolenaar  set hidden& diffopt&
56425ea0544SBram Moolenaarendfunc
56525ea0544SBram Moolenaar
566025e3e0bSBram Moolenaarfunc Test_setting_cursor()
567025e3e0bSBram Moolenaar  new Xtest1
568025e3e0bSBram Moolenaar  put =range(1,90)
569025e3e0bSBram Moolenaar  wq
570025e3e0bSBram Moolenaar  new Xtest2
571025e3e0bSBram Moolenaar  put =range(1,100)
572025e3e0bSBram Moolenaar  wq
573025e3e0bSBram Moolenaar
574025e3e0bSBram Moolenaar  tabe Xtest2
575025e3e0bSBram Moolenaar  $
576025e3e0bSBram Moolenaar  diffsp Xtest1
577025e3e0bSBram Moolenaar  tabclose
578025e3e0bSBram Moolenaar
579025e3e0bSBram Moolenaar  call delete('Xtest1')
580025e3e0bSBram Moolenaar  call delete('Xtest2')
581025e3e0bSBram Moolenaarendfunc
582aeb661e1SBram Moolenaar
583aeb661e1SBram Moolenaarfunc Test_diff_move_to()
584aeb661e1SBram Moolenaar  new
585aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
586aeb661e1SBram Moolenaar  diffthis
587aeb661e1SBram Moolenaar  vnew
588aeb661e1SBram Moolenaar  call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
589aeb661e1SBram Moolenaar  diffthis
590aeb661e1SBram Moolenaar  norm ]c
591aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
592aeb661e1SBram Moolenaar  norm 3]c
593aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
594aeb661e1SBram Moolenaar  norm 10]c
595aeb661e1SBram Moolenaar  call assert_equal(11, line('.'))
596aeb661e1SBram Moolenaar  norm [c
597aeb661e1SBram Moolenaar  call assert_equal(9, line('.'))
598aeb661e1SBram Moolenaar  norm 2[c
599aeb661e1SBram Moolenaar  call assert_equal(5, line('.'))
600aeb661e1SBram Moolenaar  norm 10[c
601aeb661e1SBram Moolenaar  call assert_equal(2, line('.'))
602aeb661e1SBram Moolenaar  %bwipe!
603aeb661e1SBram Moolenaarendfunc
604aeb661e1SBram Moolenaar
60579a213d6SBram Moolenaarfunc Test_diffexpr()
60679a213d6SBram Moolenaar  if !executable('diff')
60779a213d6SBram Moolenaar    return
60879a213d6SBram Moolenaar  endif
60979a213d6SBram Moolenaar
61079a213d6SBram Moolenaar  func DiffExpr()
6113b8defd0SBram Moolenaar    " Prepent some text to check diff type detection
6123b8defd0SBram Moolenaar    call writefile(['warning', '  message'], v:fname_out)
6133b8defd0SBram Moolenaar    silent exe '!diff ' . v:fname_in . ' ' . v:fname_new . '>>' . v:fname_out
61479a213d6SBram Moolenaar  endfunc
61579a213d6SBram Moolenaar  set diffexpr=DiffExpr()
61679a213d6SBram Moolenaar  set diffopt=foldcolumn:0
61779a213d6SBram Moolenaar
61879a213d6SBram Moolenaar  enew!
61979a213d6SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
62079a213d6SBram Moolenaar  redraw
62179a213d6SBram Moolenaar  let normattr = screenattr(1, 1)
62279a213d6SBram Moolenaar  diffthis
62379a213d6SBram Moolenaar
62479a213d6SBram Moolenaar  botright vert new
62579a213d6SBram Moolenaar  call setline(1, ['one', 'two', 'three.'])
62679a213d6SBram Moolenaar  diffthis
62779a213d6SBram Moolenaar
62879a213d6SBram Moolenaar  redraw
62979a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(1, 1))
63079a213d6SBram Moolenaar  call assert_equal(normattr, screenattr(2, 1))
63179a213d6SBram Moolenaar  call assert_notequal(normattr, screenattr(3, 1))
63279a213d6SBram Moolenaar
63379a213d6SBram Moolenaar  diffoff!
63479a213d6SBram Moolenaar  %bwipe!
63579a213d6SBram Moolenaar  set diffexpr& diffopt&
63679a213d6SBram Moolenaarendfunc
63779a213d6SBram Moolenaar
638aeb661e1SBram Moolenaarfunc Test_diffpatch()
639aeb661e1SBram Moolenaar  " The patch program on MS-Windows may fail or hang.
640aeb661e1SBram Moolenaar  if !executable('patch') || !has('unix')
641aeb661e1SBram Moolenaar    return
642aeb661e1SBram Moolenaar  endif
643aeb661e1SBram Moolenaar  new
644aeb661e1SBram Moolenaar  insert
645aeb661e1SBram Moolenaar***************
646aeb661e1SBram Moolenaar*** 1,3 ****
647aeb661e1SBram Moolenaar  1
648aeb661e1SBram Moolenaar! 2
649aeb661e1SBram Moolenaar  3
650aeb661e1SBram Moolenaar--- 1,4 ----
651aeb661e1SBram Moolenaar  1
652aeb661e1SBram Moolenaar! 2x
653aeb661e1SBram Moolenaar  3
654aeb661e1SBram Moolenaar+ 4
655aeb661e1SBram Moolenaar.
65697fbc404SBram Moolenaar  saveas! Xpatch
657aeb661e1SBram Moolenaar  bwipe!
658aeb661e1SBram Moolenaar  new
659aeb661e1SBram Moolenaar  call assert_fails('diffpatch Xpatch', 'E816:')
6601ef73e33SBram Moolenaar
661a95ab321SBram Moolenaar  for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
662aeb661e1SBram Moolenaar    call setline(1, ['1', '2', '3'])
6631ef73e33SBram Moolenaar    if name != 'Xpatch'
6641ef73e33SBram Moolenaar      call rename('Xpatch', name)
6651ef73e33SBram Moolenaar    endif
6661ef73e33SBram Moolenaar    exe 'diffpatch ' . escape(name, '$')
667aeb661e1SBram Moolenaar    call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
6681ef73e33SBram Moolenaar    if name != 'Xpatch'
6691ef73e33SBram Moolenaar      call rename(name, 'Xpatch')
6701ef73e33SBram Moolenaar    endif
6711ef73e33SBram Moolenaar    bwipe!
6721ef73e33SBram Moolenaar  endfor
6731ef73e33SBram Moolenaar
674aeb661e1SBram Moolenaar  call delete('Xpatch')
675aeb661e1SBram Moolenaar  bwipe!
676aeb661e1SBram Moolenaarendfunc
677aeb661e1SBram Moolenaar
678aeb661e1SBram Moolenaarfunc Test_diff_too_many_buffers()
679aeb661e1SBram Moolenaar  for i in range(1, 8)
680aeb661e1SBram Moolenaar    exe "new Xtest" . i
681aeb661e1SBram Moolenaar    diffthis
682aeb661e1SBram Moolenaar  endfor
683aeb661e1SBram Moolenaar  new Xtest9
684aeb661e1SBram Moolenaar  call assert_fails('diffthis', 'E96:')
685aeb661e1SBram Moolenaar  %bwipe!
686aeb661e1SBram Moolenaarendfunc
687aeb661e1SBram Moolenaar
688aeb661e1SBram Moolenaarfunc Test_diff_nomodifiable()
689aeb661e1SBram Moolenaar  new
690aeb661e1SBram Moolenaar  call setline(1, [1, 2, 3, 4])
691aeb661e1SBram Moolenaar  setl nomodifiable
692aeb661e1SBram Moolenaar  diffthis
693aeb661e1SBram Moolenaar  vnew
694aeb661e1SBram Moolenaar  call setline(1, ['1x', 2, 3, 3, 4])
695aeb661e1SBram Moolenaar  diffthis
696aeb661e1SBram Moolenaar  call assert_fails('norm dp', 'E793:')
697aeb661e1SBram Moolenaar  setl nomodifiable
698aeb661e1SBram Moolenaar  call assert_fails('norm do', 'E21:')
699aeb661e1SBram Moolenaar  %bwipe!
700aeb661e1SBram Moolenaarendfunc
701f58a8475SBram Moolenaar
70297fbc404SBram Moolenaarfunc Test_diff_hlID()
70397fbc404SBram Moolenaar  new
70497fbc404SBram Moolenaar  call setline(1, [1, 2, 3])
70597fbc404SBram Moolenaar  diffthis
70697fbc404SBram Moolenaar  vnew
70797fbc404SBram Moolenaar  call setline(1, ['1x', 2, 'x', 3])
70897fbc404SBram Moolenaar  diffthis
70997fbc404SBram Moolenaar  redraw
71097fbc404SBram Moolenaar
711a74e4946SBram Moolenaar  call diff_hlID(-1, 1)->synIDattr("name")->assert_equal("")
71297fbc404SBram Moolenaar
713a74e4946SBram Moolenaar  call diff_hlID(1, 1)->synIDattr("name")->assert_equal("DiffChange")
714a74e4946SBram Moolenaar  call diff_hlID(1, 2)->synIDattr("name")->assert_equal("DiffText")
715a74e4946SBram Moolenaar  call diff_hlID(2, 1)->synIDattr("name")->assert_equal("")
716a74e4946SBram Moolenaar  call diff_hlID(3, 1)->synIDattr("name")->assert_equal("DiffAdd")
7171a3a8916SBram Moolenaar  eval 4->diff_hlID(1)->synIDattr("name")->assert_equal("")
71897fbc404SBram Moolenaar
71997fbc404SBram Moolenaar  wincmd w
72097fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(1, 1), "name"), "DiffChange")
72197fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(2, 1), "name"), "")
72297fbc404SBram Moolenaar  call assert_equal(synIDattr(diff_hlID(3, 1), "name"), "")
72397fbc404SBram Moolenaar
72497fbc404SBram Moolenaar  %bwipe!
72597fbc404SBram Moolenaarendfunc
72697fbc404SBram Moolenaar
72797fbc404SBram Moolenaarfunc Test_diff_filler()
72897fbc404SBram Moolenaar  new
72997fbc404SBram Moolenaar  call setline(1, [1, 2, 3, 'x', 4])
73097fbc404SBram Moolenaar  diffthis
73197fbc404SBram Moolenaar  vnew
73297fbc404SBram Moolenaar  call setline(1, [1, 2, 'y', 'y', 3, 4])
73397fbc404SBram Moolenaar  diffthis
73497fbc404SBram Moolenaar  redraw
73597fbc404SBram Moolenaar
7361a3a8916SBram Moolenaar  call assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0], map(range(-1, 7), 'v:val->diff_filler()'))
73797fbc404SBram Moolenaar  wincmd w
73897fbc404SBram Moolenaar  call assert_equal([0, 0, 0, 0, 2, 0, 0, 0], map(range(-1, 6), 'diff_filler(v:val)'))
73997fbc404SBram Moolenaar
74097fbc404SBram Moolenaar  %bwipe!
74197fbc404SBram Moolenaarendfunc
74297fbc404SBram Moolenaar
743f58a8475SBram Moolenaarfunc Test_diff_lastline()
744f58a8475SBram Moolenaar  enew!
745f58a8475SBram Moolenaar  only!
746f58a8475SBram Moolenaar  call setline(1, ['This is a ', 'line with five ', 'rows'])
747f58a8475SBram Moolenaar  diffthis
748f58a8475SBram Moolenaar  botright vert new
749f58a8475SBram Moolenaar  call setline(1, ['This is', 'a line with ', 'four rows'])
750f58a8475SBram Moolenaar  diffthis
751f58a8475SBram Moolenaar  1
752f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
753f58a8475SBram Moolenaar  call feedkeys("Je a\<CR>", 'tx')
754f58a8475SBram Moolenaar  let w1lines = winline()
755f58a8475SBram Moolenaar  wincmd w
756f58a8475SBram Moolenaar  $
757f58a8475SBram Moolenaar  let w2lines = winline()
758f58a8475SBram Moolenaar  call assert_equal(w2lines, w1lines)
759f58a8475SBram Moolenaar  bwipe!
760f58a8475SBram Moolenaar  bwipe!
761f58a8475SBram Moolenaarendfunc
762e828b762SBram Moolenaar
763785fc656SBram Moolenaarfunc WriteDiffFiles(buf, list1, list2)
764e828b762SBram Moolenaar  call writefile(a:list1, 'Xfile1')
765e828b762SBram Moolenaar  call writefile(a:list2, 'Xfile2')
766785fc656SBram Moolenaar  if a:buf
767785fc656SBram Moolenaar    call term_sendkeys(a:buf, ":checktime\<CR>")
768785fc656SBram Moolenaar  endif
769e828b762SBram Moolenaarendfunc
770e828b762SBram Moolenaar
771785fc656SBram Moolenaar" Verify a screendump with both the internal and external diff.
772e828b762SBram Moolenaarfunc VerifyBoth(buf, dumpfile, extra)
773e828b762SBram Moolenaar  " trailing : for leaving the cursor on the command line
774785fc656SBram Moolenaar  for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"]
775e828b762SBram Moolenaar    call term_sendkeys(a:buf, cmd)
776e828b762SBram Moolenaar    if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external')
777e828b762SBram Moolenaar      break " don't let the next iteration overwrite the "failed" file.
778e828b762SBram Moolenaar    endif
779e828b762SBram Moolenaar  endfor
780e828b762SBram Moolenaarendfunc
781e828b762SBram Moolenaar
782785fc656SBram Moolenaar" Verify a screendump with the internal diff only.
783785fc656SBram Moolenaarfunc VerifyInternal(buf, dumpfile, extra)
784785fc656SBram Moolenaar  call term_sendkeys(a:buf, ":diffupdate!\<CR>")
785785fc656SBram Moolenaar  " trailing : for leaving the cursor on the command line
786785fc656SBram Moolenaar  call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:")
78737d9f175SBram Moolenaar  call term_wait(a:buf)
788785fc656SBram Moolenaar  call VerifyScreenDump(a:buf, a:dumpfile, {})
789785fc656SBram Moolenaarendfunc
790785fc656SBram Moolenaar
791e828b762SBram Moolenaarfunc Test_diff_screen()
7923c8ee629SBram Moolenaar  CheckScreendump
7933c8ee629SBram Moolenaar  CheckFeature menu
7943c8ee629SBram Moolenaar
795e828b762SBram Moolenaar  " clean up already existing swap files, just in case
796e828b762SBram Moolenaar  call delete('.Xfile1.swp')
797e828b762SBram Moolenaar  call delete('.Xfile2.swp')
798e828b762SBram Moolenaar
799e828b762SBram Moolenaar  " Test 1: Add a line in beginning of file 2
800785fc656SBram 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])
801e828b762SBram Moolenaar  let buf = RunVimInTerminal('-d Xfile1 Xfile2', {})
8028ee4c01bSBram Moolenaar  " Set autoread mode, so that Vim won't complain once we re-write the test
803e828b762SBram Moolenaar  " files
804785fc656SBram Moolenaar  call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
805e828b762SBram Moolenaar
806e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_01', '')
807e828b762SBram Moolenaar
808e828b762SBram Moolenaar  " Test 2: Add a line in beginning of file 1
809785fc656SBram 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])
810e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_02', '')
811e828b762SBram Moolenaar
812e828b762SBram Moolenaar  " Test 3: Add a line at the end of file 2
813785fc656SBram 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])
814e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_03', '')
815e828b762SBram Moolenaar
816e828b762SBram Moolenaar  " Test 4: Add a line at the end of file 1
817785fc656SBram 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])
818e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_04', '')
819e828b762SBram Moolenaar
820e828b762SBram Moolenaar  " Test 5: Add a line in the middle of file 2, remove on at the end of file 1
821785fc656SBram 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])
822e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_05', '')
823e828b762SBram Moolenaar
824e828b762SBram Moolenaar  " Test 6: Add a line in the middle of file 1, remove on at the end of file 2
825785fc656SBram 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])
826e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_06', '')
827e828b762SBram Moolenaar
828b9ddda6cSBram Moolenaar  " Variants on test 6 with different context settings
829b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
830b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.2', {})
831b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
832b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
833b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.1', {})
834b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
835b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
836b9ddda6cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_06.0', {})
837b9ddda6cSBram Moolenaar  call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
838b9ddda6cSBram Moolenaar
839e828b762SBram Moolenaar  " Test 7 - 9: Test normal/patience/histogram diff algorithm
840785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
841e828b762SBram Moolenaar      \ '    int i;', '    for(i = 0; i < 10; i++)', '    {', '        printf("Your answer is: ");',
842e828b762SBram Moolenaar      \ '        printf("%d\n", foo);', '    }', '}', '', 'int fact(int n)', '{', '    if(n > 1)', '    {',
843e828b762SBram Moolenaar      \ '        return fact(n-1) * n;', '    }', '    return 1;', '}', '', 'int main(int argc, char **argv)',
844e828b762SBram Moolenaar      \ '{', '    frobnitz(fact(10));', '}'],
845e828b762SBram Moolenaar      \ ['#include <stdio.h>', '', 'int fib(int n)', '{', '    if(n > 2)', '    {',
846e828b762SBram Moolenaar      \ '        return fib(n-1) + fib(n-2);', '    }', '    return 1;', '}', '', '// Frobs foo heartily',
847e828b762SBram Moolenaar      \ 'int frobnitz(int foo)', '{', '    int i;', '    for(i = 0; i < 10; i++)', '    {',
848e828b762SBram Moolenaar      \ '        printf("%d\n", foo);', '    }', '}', '',
849e828b762SBram Moolenaar      \ 'int main(int argc, char **argv)', '{', '    frobnitz(fib(10));', '}'])
850e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
851e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
852e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_07', {})
853e828b762SBram Moolenaar
854e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
855e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_08', {})
856e828b762SBram Moolenaar
857e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
858e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_09', {})
859e828b762SBram Moolenaar
860e828b762SBram Moolenaar  " Test 10-11: normal/indent-heuristic
861e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&vim\<cr>")
862785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['', '  def finalize(values)', '', '    values.each do |v|', '      v.finalize', '    end'],
863e828b762SBram Moolenaar      \ ['', '  def finalize(values)', '', '    values.each do |v|', '      v.prepare', '    end', '',
864e828b762SBram Moolenaar      \ '    values.each do |v|', '      v.finalize', '    end'])
865e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
866e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
867e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_10', {})
868e828b762SBram Moolenaar
869b6fc7285SBram Moolenaar  " Leave trailing : at commandline!
870b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
871b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
872b6fc7285SBram Moolenaar  " shouldn't matter, if indent-algorithm comes before or after the algorithm
873b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&\<cr>")
874b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
875b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
876b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&\<cr>")
877b6fc7285SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
878b6fc7285SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
879e828b762SBram Moolenaar
880e828b762SBram Moolenaar  " Test 12: diff the same file
881785fc656SBram Moolenaar  call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
882e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_12', '')
883e828b762SBram Moolenaar
884e828b762SBram Moolenaar  " Test 13: diff an empty file
885785fc656SBram Moolenaar  call WriteDiffFiles(buf, [], [])
886e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_13', '')
887e828b762SBram Moolenaar
888e828b762SBram Moolenaar  " Test 14: test diffopt+=icase
889785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
890e828b762SBram Moolenaar  call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
891e828b762SBram Moolenaar
892e828b762SBram Moolenaar  " Test 15-16: test diffopt+=iwhite
893785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['int main()', '{', '   printf("Hello, World!");', '   return 0;', '}'],
894e828b762SBram Moolenaar      \ ['int main()', '{', '   if (0)', '   {', '      printf("Hello, World!");', '      return 0;', '   }', '}'])
895e828b762SBram Moolenaar  call term_sendkeys(buf, ":diffupdate!\<cr>")
896e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
897e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_15', {})
898e828b762SBram Moolenaar  call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
899e828b762SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_16', {})
900e828b762SBram Moolenaar
901785fc656SBram Moolenaar  " Test 17: test diffopt+=iblank
902785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
903785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
904785fc656SBram Moolenaar
905785fc656SBram Moolenaar  " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
906785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
907785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
908785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
909785fc656SBram Moolenaar
910785fc656SBram Moolenaar  " Test 19: test diffopt+=iwhiteeol
911785fc656SBram Moolenaar  call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx  xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
912785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
913785fc656SBram Moolenaar
914785fc656SBram Moolenaar  " Test 19: test diffopt+=iwhiteall
915785fc656SBram Moolenaar  call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
916785fc656SBram Moolenaar
917e828b762SBram Moolenaar  " clean up
918e828b762SBram Moolenaar  call StopVimInTerminal(buf)
919e828b762SBram Moolenaar  call delete('Xfile1')
920e828b762SBram Moolenaar  call delete('Xfile2')
921e828b762SBram Moolenaarendfunc
922e828b762SBram Moolenaar
9234a5abbd6SBram Moolenaarfunc Test_diff_with_cursorline()
9243c8ee629SBram Moolenaar  CheckScreendump
9254a5abbd6SBram Moolenaar
9264a5abbd6SBram Moolenaar  call writefile([
9274a5abbd6SBram Moolenaar	\ 'hi CursorLine ctermbg=red ctermfg=white',
9284a5abbd6SBram Moolenaar	\ 'set cursorline',
9294a5abbd6SBram Moolenaar	\ 'call setline(1, ["foo","foo","foo","bar"])',
9304a5abbd6SBram Moolenaar	\ 'vnew',
9314a5abbd6SBram Moolenaar	\ 'call setline(1, ["bee","foo","foo","baz"])',
9324a5abbd6SBram Moolenaar	\ 'windo diffthis',
9334a5abbd6SBram Moolenaar	\ '2wincmd w',
9344a5abbd6SBram Moolenaar	\ ], 'Xtest_diff_cursorline')
9354a5abbd6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_cursorline', {})
9364a5abbd6SBram Moolenaar
9374a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_01', {})
9384a5abbd6SBram Moolenaar  call term_sendkeys(buf, "j")
9394a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_02', {})
9404a5abbd6SBram Moolenaar  call term_sendkeys(buf, "j")
9414a5abbd6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_with_cursorline_03', {})
9424a5abbd6SBram Moolenaar
9434a5abbd6SBram Moolenaar  " clean up
9444a5abbd6SBram Moolenaar  call StopVimInTerminal(buf)
9454a5abbd6SBram Moolenaar  call delete('Xtest_diff_cursorline')
9464a5abbd6SBram Moolenaarendfunc
947f7acf2b6SBram Moolenaar
948248fdb33SBram Moolenaarfunc Test_diff_with_syntax()
949248fdb33SBram Moolenaar  CheckScreendump
950248fdb33SBram Moolenaar
951248fdb33SBram Moolenaar  let lines =<< trim END
952248fdb33SBram Moolenaar  	void doNothing() {
953248fdb33SBram Moolenaar	   int x = 0;
954248fdb33SBram Moolenaar	   char *s = "hello";
955248fdb33SBram Moolenaar	   return 5;
956248fdb33SBram Moolenaar	}
957248fdb33SBram Moolenaar  END
958248fdb33SBram Moolenaar  call writefile(lines, 'Xprogram1.c')
959248fdb33SBram Moolenaar  let lines =<< trim END
960248fdb33SBram Moolenaar  	void doSomething() {
961248fdb33SBram Moolenaar	   int x = 0;
962248fdb33SBram Moolenaar	   char *s = "there";
963248fdb33SBram Moolenaar	   return 5;
964248fdb33SBram Moolenaar	}
965248fdb33SBram Moolenaar  END
966248fdb33SBram Moolenaar  call writefile(lines, 'Xprogram2.c')
967248fdb33SBram Moolenaar
968248fdb33SBram Moolenaar  let lines =<< trim END
969248fdb33SBram Moolenaar  	edit Xprogram1.c
970248fdb33SBram Moolenaar	diffsplit Xprogram2.c
971248fdb33SBram Moolenaar  END
972248fdb33SBram Moolenaar  call writefile(lines, 'Xtest_diff_syntax')
973248fdb33SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
974248fdb33SBram Moolenaar
975248fdb33SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
976248fdb33SBram Moolenaar
977248fdb33SBram Moolenaar  " clean up
978248fdb33SBram Moolenaar  call StopVimInTerminal(buf)
979248fdb33SBram Moolenaar  call delete('Xtest_diff_syntax')
980248fdb33SBram Moolenaar  call delete('Xprogram1.c')
981248fdb33SBram Moolenaar  call delete('Xprogram2.c')
982248fdb33SBram Moolenaarendfunc
983248fdb33SBram Moolenaar
984f7acf2b6SBram Moolenaarfunc Test_diff_of_diff()
9853c8ee629SBram Moolenaar  CheckScreendump
9863c8ee629SBram Moolenaar  CheckFeature rightleft
987f7acf2b6SBram Moolenaar
988f7acf2b6SBram Moolenaar  call writefile([
989f7acf2b6SBram Moolenaar	\ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
990f7acf2b6SBram Moolenaar	\ 'vnew',
991f7acf2b6SBram Moolenaar	\ 'call setline(1, ["aa","bb","cc"])',
992f7acf2b6SBram Moolenaar	\ 'windo diffthis',
9938ee4c01bSBram Moolenaar	\ '1wincmd w',
9948ee4c01bSBram Moolenaar	\ 'setlocal number',
995f7acf2b6SBram Moolenaar	\ ], 'Xtest_diff_diff')
996f7acf2b6SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_diff_diff', {})
997f7acf2b6SBram Moolenaar
998f7acf2b6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_of_diff_01', {})
999f7acf2b6SBram Moolenaar
1000e73f911cSBram Moolenaar  call term_sendkeys(buf, ":set rightleft\<cr>")
1001e73f911cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_diff_of_diff_02', {})
1002e73f911cSBram Moolenaar
1003f7acf2b6SBram Moolenaar  " clean up
1004f7acf2b6SBram Moolenaar  call StopVimInTerminal(buf)
1005f7acf2b6SBram Moolenaar  call delete('Xtest_diff_diff')
1006f7acf2b6SBram Moolenaarendfunc
1007c8234779SBram Moolenaar
1008c8234779SBram Moolenaarfunc CloseoffSetup()
1009c8234779SBram Moolenaar  enew
1010c8234779SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
1011c8234779SBram Moolenaar  diffthis
1012c8234779SBram Moolenaar  new
1013c8234779SBram Moolenaar  call setline(1, ['one', 'tow', 'three'])
1014c8234779SBram Moolenaar  diffthis
1015c8234779SBram Moolenaar  call assert_equal(1, &diff)
1016c8234779SBram Moolenaar  only!
1017c8234779SBram Moolenaarendfunc
1018c8234779SBram Moolenaar
1019c8234779SBram Moolenaarfunc Test_diff_closeoff()
1020c8234779SBram Moolenaar  " "closeoff" included by default: last diff win gets 'diff' reset'
1021c8234779SBram Moolenaar  call CloseoffSetup()
1022c8234779SBram Moolenaar  call assert_equal(0, &diff)
1023c8234779SBram Moolenaar  enew!
1024c8234779SBram Moolenaar
1025c8234779SBram Moolenaar  " "closeoff" excluded: last diff win keeps 'diff' set'
1026c8234779SBram Moolenaar  set diffopt-=closeoff
1027c8234779SBram Moolenaar  call CloseoffSetup()
1028c8234779SBram Moolenaar  call assert_equal(1, &diff)
1029c8234779SBram Moolenaar  diffoff!
1030c8234779SBram Moolenaar  enew!
1031c8234779SBram Moolenaarendfunc
1032f4a1d1c0SBram Moolenaar
1033f4a1d1c0SBram Moolenaarfunc Test_diff_maintains_change_mark()
1034f4a1d1c0SBram Moolenaar  enew!
1035f4a1d1c0SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1036f4a1d1c0SBram Moolenaar  diffthis
1037f4a1d1c0SBram Moolenaar  new
1038f4a1d1c0SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'e'])
1039f4a1d1c0SBram Moolenaar  " Set '[ and '] marks
1040f4a1d1c0SBram Moolenaar  2,3yank
1041f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1042f4a1d1c0SBram Moolenaar  " Verify they aren't affected by the implicit diff
1043f4a1d1c0SBram Moolenaar  diffthis
1044f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1045f4a1d1c0SBram Moolenaar  " Verify they aren't affected by an explicit diff
1046f4a1d1c0SBram Moolenaar  diffupdate
1047f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
1048f4a1d1c0SBram Moolenaar  bwipe!
1049f4a1d1c0SBram Moolenaar  bwipe!
1050f4a1d1c0SBram Moolenaarendfunc
1051