1" Tests for diff mode
2set belloff=all
3
4func Test_diff_fold_sync()
5  enew!
6  let l = range(50)
7  call setline(1, l)
8  diffthis
9  let winone = win_getid()
10  new
11  let l[25] = 'diff'
12  call setline(1, l)
13  diffthis
14  let wintwo = win_getid()
15  " line 15 is inside the closed fold
16  call assert_equal(19, foldclosedend(10))
17  call win_gotoid(winone)
18  call assert_equal(19, foldclosedend(10))
19  " open the fold
20  normal zv
21  call assert_equal(-1, foldclosedend(10))
22  " fold in other window must have opened too
23  call win_gotoid(wintwo)
24  call assert_equal(-1, foldclosedend(10))
25
26  " cursor position is in sync
27  normal 23G
28  call win_gotoid(winone)
29  call assert_equal(23, getcurpos()[1])
30
31  windo diffoff
32  close!
33  set nomodified
34endfunc
35
36func Test_vert_split()
37  " Disable the title to avoid xterm keeping the wrong one.
38  set notitle noicon
39  new
40  let l = ['1 aa', '2 bb', '3 cc', '4 dd', '5 ee']
41  call setline(1, l)
42  w! Xtest
43  normal dd
44  $
45  put
46  normal kkrXoxxx
47  w! Xtest2
48  file Nop
49  normal ggoyyyjjjozzzz
50  set foldmethod=marker foldcolumn=4
51  call assert_equal(0, &diff)
52  call assert_equal('marker', &foldmethod)
53  call assert_equal(4, &foldcolumn)
54  call assert_equal(0, &scrollbind)
55  call assert_equal(0, &cursorbind)
56  call assert_equal(1, &wrap)
57
58  vert diffsplit Xtest
59  vert diffsplit Xtest2
60  call assert_equal(1, &diff)
61  call assert_equal('diff', &foldmethod)
62  call assert_equal(2, &foldcolumn)
63  call assert_equal(1, &scrollbind)
64  call assert_equal(1, &cursorbind)
65  call assert_equal(0, &wrap)
66
67  let diff_fdm = &fdm
68  let diff_fdc = &fdc
69  " repeat entering diff mode here to see if this saves the wrong settings
70  diffthis
71  " jump to second window for a moment to have filler line appear at start of
72  " first window
73  wincmd w
74  normal gg
75  wincmd p
76  normal gg
77  call assert_equal(2, winline())
78  normal j
79  call assert_equal(4, winline())
80  normal j
81  call assert_equal(5, winline())
82  normal j
83  call assert_equal(6, winline())
84  normal j
85  call assert_equal(8, winline())
86  normal j
87  call assert_equal(9, winline())
88
89  wincmd w
90  normal gg
91  call assert_equal(1, winline())
92  normal j
93  call assert_equal(2, winline())
94  normal j
95  call assert_equal(4, winline())
96  normal j
97  call assert_equal(5, winline())
98  normal j
99  call assert_equal(8, winline())
100
101  wincmd w
102  normal gg
103  call assert_equal(2, winline())
104  normal j
105  call assert_equal(3, winline())
106  normal j
107  call assert_equal(4, winline())
108  normal j
109  call assert_equal(5, winline())
110  normal j
111  call assert_equal(6, winline())
112  normal j
113  call assert_equal(7, winline())
114  normal j
115  call assert_equal(8, winline())
116
117  " Test diffoff
118  diffoff!
119  1wincmd 2
120  let &diff = 1
121  let &fdm = diff_fdm
122  let &fdc = diff_fdc
123  4wincmd w
124  diffoff!
125  1wincmd w
126  call assert_equal(0, &diff)
127  call assert_equal('marker', &foldmethod)
128  call assert_equal(4, &foldcolumn)
129  call assert_equal(0, &scrollbind)
130  call assert_equal(0, &cursorbind)
131  call assert_equal(1, &wrap)
132
133  wincmd w
134  call assert_equal(0, &diff)
135  call assert_equal('marker', &foldmethod)
136  call assert_equal(4, &foldcolumn)
137  call assert_equal(0, &scrollbind)
138  call assert_equal(0, &cursorbind)
139  call assert_equal(1, &wrap)
140
141  wincmd w
142  call assert_equal(0, &diff)
143  call assert_equal('marker', &foldmethod)
144  call assert_equal(4, &foldcolumn)
145  call assert_equal(0, &scrollbind)
146  call assert_equal(0, &cursorbind)
147  call assert_equal(1, &wrap)
148
149  call delete('Xtest')
150  call delete('Xtest2')
151  windo bw!
152endfunc
153
154func Test_filler_lines()
155  " Test that diffing shows correct filler lines
156  enew!
157  put =range(4,10)
158  1d _
159  vnew
160  put =range(1,10)
161  1d _
162  windo diffthis
163  wincmd h
164  call assert_equal(1, line('w0'))
165  unlet! diff_fdm diff_fdc
166  windo diffoff
167  bwipe!
168  enew!
169endfunc
170
171func Test_diffget_diffput()
172  enew!
173  let l = range(50)
174  call setline(1, l)
175  call assert_fails('diffget', 'E99:')
176  diffthis
177  call assert_fails('diffget', 'E100:')
178  new
179  let l[10] = 'one'
180  let l[20] = 'two'
181  let l[30] = 'three'
182  let l[40] = 'four'
183  call setline(1, l)
184  diffthis
185  call assert_equal('one', getline(11))
186  11diffget
187  call assert_equal('10', getline(11))
188  21diffput
189  wincmd w
190  call assert_equal('two', getline(21))
191  normal 31Gdo
192  call assert_equal('three', getline(31))
193  call assert_equal('40', getline(41))
194  normal 41Gdp
195  wincmd w
196  call assert_equal('40', getline(41))
197  new
198  diffthis
199  call assert_fails('diffget', 'E101:')
200
201  windo diffoff
202  bwipe!
203  bwipe!
204  enew!
205endfunc
206
207func Test_diffoff()
208  enew!
209  call setline(1, ['Two', 'Three'])
210  let normattr = screenattr(1, 1)
211  diffthis
212  botright vert new
213  call setline(1, ['One', '', 'Two', 'Three'])
214  diffthis
215  redraw
216  call assert_notequal(normattr, screenattr(1, 1))
217  diffoff!
218  redraw
219  call assert_equal(normattr, screenattr(1, 1))
220  bwipe!
221  bwipe!
222endfunc
223
224func Test_diffoff_hidden()
225  set diffopt=filler,foldcolumn:0
226  e! one
227  call setline(1, ['Two', 'Three'])
228  let normattr = screenattr(1, 1)
229  diffthis
230  botright vert new two
231  call setline(1, ['One', 'Four'])
232  diffthis
233  redraw
234  call assert_notequal(normattr, screenattr(1, 1))
235  set hidden
236  close
237  redraw
238  " diffing with hidden buffer two
239  call assert_notequal(normattr, screenattr(1, 1))
240  diffoff
241  redraw
242  call assert_equal(normattr, screenattr(1, 1))
243  diffthis
244  redraw
245  " still diffing with hidden buffer two
246  call assert_notequal(normattr, screenattr(1, 1))
247  diffoff!
248  redraw
249  call assert_equal(normattr, screenattr(1, 1))
250  diffthis
251  redraw
252  " no longer diffing with hidden buffer two
253  call assert_equal(normattr, screenattr(1, 1))
254
255  bwipe!
256  bwipe!
257  set hidden& diffopt&
258endfunc
259
260func Test_setting_cursor()
261  new Xtest1
262  put =range(1,90)
263  wq
264  new Xtest2
265  put =range(1,100)
266  wq
267
268  tabe Xtest2
269  $
270  diffsp Xtest1
271  tabclose
272
273  call delete('Xtest1')
274  call delete('Xtest2')
275endfunc
276
277func Test_diff_move_to()
278  new
279  call setline(1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
280  diffthis
281  vnew
282  call setline(1, [1, '2x', 3, 4, 4, 5, '6x', 7, '8x', 9, '10x'])
283  diffthis
284  norm ]c
285  call assert_equal(2, line('.'))
286  norm 3]c
287  call assert_equal(9, line('.'))
288  norm 10]c
289  call assert_equal(11, line('.'))
290  norm [c
291  call assert_equal(9, line('.'))
292  norm 2[c
293  call assert_equal(5, line('.'))
294  norm 10[c
295  call assert_equal(2, line('.'))
296  %bwipe!
297endfunc
298
299func Test_diffpatch()
300  " The patch program on MS-Windows may fail or hang.
301  if !executable('patch') || !has('unix')
302    return
303  endif
304  new
305  insert
306***************
307*** 1,3 ****
308  1
309! 2
310  3
311--- 1,4 ----
312  1
313! 2x
314  3
315+ 4
316.
317  saveas Xpatch
318  bwipe!
319  new
320  call assert_fails('diffpatch Xpatch', 'E816:')
321
322  for name in ['Xpatch', 'Xpatch$HOME', 'Xpa''tch']
323    call setline(1, ['1', '2', '3'])
324    if name != 'Xpatch'
325      call rename('Xpatch', name)
326    endif
327    exe 'diffpatch ' . escape(name, '$')
328    call assert_equal(['1', '2x', '3', '4'], getline(1, '$'))
329    if name != 'Xpatch'
330      call rename(name, 'Xpatch')
331    endif
332    bwipe!
333  endfor
334
335  call delete('Xpatch')
336  bwipe!
337endfunc
338
339func Test_diff_too_many_buffers()
340  for i in range(1, 8)
341    exe "new Xtest" . i
342    diffthis
343  endfor
344  new Xtest9
345  call assert_fails('diffthis', 'E96:')
346  %bwipe!
347endfunc
348
349func Test_diff_nomodifiable()
350  new
351  call setline(1, [1, 2, 3, 4])
352  setl nomodifiable
353  diffthis
354  vnew
355  call setline(1, ['1x', 2, 3, 3, 4])
356  diffthis
357  call assert_fails('norm dp', 'E793:')
358  setl nomodifiable
359  call assert_fails('norm do', 'E21:')
360  %bwipe!
361endfunc
362
363func Test_diff_lastline()
364  enew!
365  only!
366  call setline(1, ['This is a ', 'line with five ', 'rows'])
367  diffthis
368  botright vert new
369  call setline(1, ['This is', 'a line with ', 'four rows'])
370  diffthis
371  1
372  call feedkeys("Je a\<CR>", 'tx')
373  call feedkeys("Je a\<CR>", 'tx')
374  let w1lines = winline()
375  wincmd w
376  $
377  let w2lines = winline()
378  call assert_equal(w2lines, w1lines)
379  bwipe!
380  bwipe!
381endfunc
382