xref: /vim-8.2.3635/src/testdir/test_tabpage.vim (revision b2a76ec0)
1" Tests for tabpage
2
3function Test_tabpage()
4  bw!
5  " Simple test for opening and closing a tab page
6  tabnew
7  call assert_equal(2, tabpagenr())
8  quit
9
10  " Open three tab pages and use ":tabdo"
11  0tabnew
12  1tabnew
13  $tabnew
14  %del
15  tabdo call append(line('$'), tabpagenr())
16  tabclose! 2
17  tabrewind
18  let line1 = getline('$')
19  undo
20  q
21  tablast
22  let line2 = getline('$')
23  q!
24  call append(line('$'), line1)
25  call append(line('$'), line2)
26  unlet line1 line2
27  call assert_equal(['', '3', '1', '4'], getline(1, '$'))
28  "
29  " Test for settabvar() and gettabvar() functions. Open a new tab page and
30  " set 3 variables to a number, string and a list. Verify that the variables
31  " are correctly set.
32  tabnew
33  tabfirst
34  call settabvar(2, 'val_num', 100)
35  call settabvar(2, 'val_str', 'SetTabVar test')
36  call settabvar(2, 'val_list', ['red', 'blue', 'green'])
37  "
38  call assert_true(gettabvar(2, 'val_num') == 100 && gettabvar(2, 'val_str') == 'SetTabVar test' && gettabvar(2, 'val_list') == ['red', 'blue', 'green'])
39
40  tabnext 2
41  call assert_true(t:val_num == 100 && t:val_str == 'SetTabVar test'  && t:val_list == ['red', 'blue', 'green'])
42  tabclose
43
44  if has('gui') || has('clientserver')
45    " Test for ":tab drop exist-file" to keep current window.
46    sp test1
47    tab drop test1
48    call assert_true(tabpagenr('$') == 1 && winnr('$') == 2 && winnr() == 1)
49    close
50    "
51    "
52    " Test for ":tab drop new-file" to keep current window of tabpage 1.
53    split
54    tab drop newfile
55    call assert_true(tabpagenr('$') == 2 && tabpagewinnr(1, '$') == 2 && tabpagewinnr(1) == 1)
56    tabclose
57    q
58    "
59    "
60    " Test for ":tab drop multi-opend-file" to keep current tabpage and window.
61    new test1
62    tabnew
63    new test1
64    tab drop test1
65    call assert_true(tabpagenr() == 2 && tabpagewinnr(2, '$') == 2 && tabpagewinnr(2) == 1)
66    tabclose
67    q
68    "
69    "
70    " Test for ":tab drop vertical-split-window" to jump test1 buffer
71    tabedit test1
72    vnew
73    tabfirst
74    tab drop test1
75    call assert_equal([2, 2, 2, 2], [tabpagenr('$'), tabpagenr(), tabpagewinnr(2, '$'), tabpagewinnr(2)])
76    1tabonly
77  endif
78  "
79  "
80  for i in range(9) | tabnew | endfor
81  normal! 1gt
82  call assert_equal(1, tabpagenr())
83  tabmove 5
84  call assert_equal(5, tabpagenr())
85  .tabmove
86  call assert_equal(5, tabpagenr())
87  tabmove -
88  call assert_equal(4, tabpagenr())
89  tabmove +
90  call assert_equal(5, tabpagenr())
91  tabmove -2
92  call assert_equal(3, tabpagenr())
93  tabmove +4
94  call assert_equal(7, tabpagenr())
95  tabmove
96  call assert_equal(10, tabpagenr())
97  0tabmove
98  call assert_equal(1, tabpagenr())
99  $tabmove
100  call assert_equal(10, tabpagenr())
101  tabmove 0
102  call assert_equal(1, tabpagenr())
103  tabmove $
104  call assert_equal(10, tabpagenr())
105  3tabmove
106  call assert_equal(4, tabpagenr())
107  7tabmove 5
108  call assert_equal(5, tabpagenr())
109  call assert_fails("99tabmove", 'E16:')
110  call assert_fails("+99tabmove", 'E16:')
111  call assert_fails("-99tabmove", 'E16:')
112  call assert_fails("tabmove foo", 'E474:')
113  call assert_fails("tabmove 99", 'E474:')
114  call assert_fails("tabmove +99", 'E474:')
115  call assert_fails("tabmove -99", 'E474:')
116  call assert_fails("tabmove -3+", 'E474:')
117  call assert_fails("tabmove $3", 'E474:')
118  1tabonly!
119endfunc
120
121" Test autocommands
122function Test_tabpage_with_autocmd()
123  if !has('autocmd')
124    return
125  endif
126  command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
127  augroup TestTabpageGroup
128    au!
129    autocmd TabEnter * call add(s:li, 'TabEnter')
130    autocmd WinEnter * call add(s:li, 'WinEnter')
131    autocmd BufEnter * call add(s:li, 'BufEnter')
132    autocmd TabLeave * call add(s:li, 'TabLeave')
133    autocmd WinLeave * call add(s:li, 'WinLeave')
134    autocmd BufLeave * call add(s:li, 'BufLeave')
135  augroup END
136
137  let s:li = []
138  let t:a='a'
139  C tab split
140  call assert_equal(['=== tab split ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter'], s:li)
141  let s:li = []
142  let t:a='b'
143  C tabnew
144  call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
145  let t:a='c'
146  let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
147  call assert_equal(['a', 'b', 'c'], s:li)
148
149  let s:li = []
150  C call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)')
151  call assert_equal(["=== call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)') ==="], s:li)
152  let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
153  call assert_equal(['2', '4', '6'], s:li)
154
155  let s:li = []
156  let w:a='a'
157  C vsplit
158  call assert_equal(['=== vsplit ===', 'WinLeave', 'WinEnter'], s:li)
159  let s:li = []
160  let w:a='a'
161  let tabn=tabpagenr()
162  let winr=range(1, winnr('$'))
163  C tabnext 1
164  call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
165  let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
166  call assert_equal(['a', 'a'], s:li)
167  let s:li = []
168  C call map(copy(winr), 'settabwinvar('.tabn.', v:val, ''a'', v:val*2)')
169  let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
170  call assert_equal(['2', '4'], s:li)
171
172  augroup TabDestructive
173    autocmd TabEnter * :C tabnext 2 | C tabclose 3
174  augroup END
175  let s:li = []
176  C tabnext 3
177  call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
178  call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
179
180  autocmd! TabDestructive TabEnter
181  let s:li = []
182  C tabnew
183  call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
184  let s:li = []
185  C tabnext 1
186  call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
187
188  autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
189  let s:li = []
190  call assert_equal(3, tabpagenr('$'))
191  C tabnext 2
192  call assert_equal(2, tabpagenr('$'))
193  call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
194  call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
195
196  delcommand C
197  autocmd! TabDestructive
198  augroup! TabDestructive
199  autocmd! TestTabpageGroup
200  augroup! TestTabpageGroup
201  1tabonly!
202endfunction
203
204function Test_tabpage_with_tab_modifier()
205  for n in range(4)
206    tabedit
207  endfor
208
209  function s:check_tab(pre_nr, cmd, post_nr)
210    exec 'tabnext ' . a:pre_nr
211    exec a:cmd
212    call assert_equal(a:post_nr, tabpagenr())
213    call assert_equal('help', &buftype)
214    helpclose
215  endfunc
216
217  call s:check_tab(1, 'tab help', 2)
218  call s:check_tab(1, '3tab help', 4)
219  call s:check_tab(1, '.tab help', 2)
220  call s:check_tab(1, '.+1tab help', 3)
221  call s:check_tab(1, '0tab help', 1)
222  call s:check_tab(2, '+tab help', 4)
223  call s:check_tab(2, '+2tab help', 5)
224  call s:check_tab(4, '-tab help', 4)
225  call s:check_tab(4, '-2tab help', 3)
226  call s:check_tab(3, '$tab help', 6)
227  call assert_fails('99tab help', 'E16:')
228  call assert_fails('+99tab help', 'E16:')
229  call assert_fails('-99tab help', 'E16:')
230
231  delfunction s:check_tab
232  1tabonly!
233endfunction
234
235function Check_tab_count(pre_nr, cmd, post_nr)
236  exec 'tabnext' a:pre_nr
237  normal! G
238  exec a:cmd
239  call assert_equal(a:post_nr, tabpagenr(), a:cmd)
240endfunc
241
242" Test for [count] of tabnext
243function Test_tabpage_with_tabnext()
244  for n in range(4)
245    tabedit
246    call setline(1, ['', '', '3'])
247  endfor
248
249  call Check_tab_count(1, 'tabnext', 2)
250  call Check_tab_count(1, '3tabnext', 3)
251  call Check_tab_count(1, '.tabnext', 1)
252  call Check_tab_count(1, '.+1tabnext', 2)
253  call Check_tab_count(2, '+tabnext', 3)
254  call Check_tab_count(2, '+2tabnext', 4)
255  call Check_tab_count(4, '-tabnext', 3)
256  call Check_tab_count(4, '-2tabnext', 2)
257  call Check_tab_count(3, '$tabnext', 5)
258  call assert_fails('0tabnext', 'E16:')
259  call assert_fails('99tabnext', 'E16:')
260  call assert_fails('+99tabnext', 'E16:')
261  call assert_fails('-99tabnext', 'E16:')
262  call Check_tab_count(1, 'tabnext 3', 3)
263  call Check_tab_count(2, 'tabnext +', 3)
264  call Check_tab_count(2, 'tabnext +2', 4)
265  call Check_tab_count(4, 'tabnext -', 3)
266  call Check_tab_count(4, 'tabnext -2', 2)
267  call Check_tab_count(3, 'tabnext $', 5)
268  call assert_fails('tabnext 0', 'E474:')
269  call assert_fails('tabnext .', 'E474:')
270  call assert_fails('tabnext -+', 'E474:')
271  call assert_fails('tabnext +2-', 'E474:')
272  call assert_fails('tabnext $3', 'E474:')
273  call assert_fails('tabnext 99', 'E474:')
274  call assert_fails('tabnext +99', 'E474:')
275  call assert_fails('tabnext -99', 'E474:')
276
277  1tabonly!
278endfunction
279
280" Test for [count] of tabprevious
281function Test_tabpage_with_tabprevious()
282  for n in range(5)
283    tabedit
284    call setline(1, ['', '', '3'])
285  endfor
286
287  for cmd in ['tabNext', 'tabprevious']
288    call Check_tab_count(6, cmd, 5)
289    call Check_tab_count(6, '3' . cmd, 3)
290    call Check_tab_count(6, '8' . cmd, 4)
291    call Check_tab_count(6, cmd . ' 3', 3)
292    call Check_tab_count(6, cmd . ' 8', 4)
293    for n in range(2)
294      for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
295        if n == 0 " pre count
296          let entire_cmd = c . cmd
297          let err_code = 'E16:'
298        else
299          let entire_cmd = cmd . ' ' . c
300          let err_code = 'E474:'
301        endif
302        call assert_fails(entire_cmd, err_code)
303      endfor
304    endfor
305  endfor
306
307  1tabonly!
308endfunction
309
310function s:reconstruct_tabpage_for_test(nr)
311  let n = (a:nr > 2) ? a:nr - 2 : 1
312  1tabonly!
313  0tabedit n0
314  for n in range(1, n)
315    exec '$tabedit n' . n
316    if n == 1
317      call setline(1, ['', '', '3'])
318    endif
319  endfor
320endfunc
321
322" Test for [count] of tabclose
323function Test_tabpage_with_tabclose()
324
325  " pre count
326  call s:reconstruct_tabpage_for_test(6)
327  call Check_tab_count(3, 'tabclose!', 3)
328  call Check_tab_count(1, '3tabclose', 1)
329  call Check_tab_count(4, '4tabclose', 3)
330  call Check_tab_count(3, '1tabclose', 2)
331  call Check_tab_count(2, 'tabclose', 1)
332  call assert_equal(1, tabpagenr('$'))
333  call assert_equal('', bufname(''))
334
335  call s:reconstruct_tabpage_for_test(6)
336  call Check_tab_count(2, '$tabclose', 2)
337  call Check_tab_count(4, '.tabclose', 4)
338  call Check_tab_count(3, '.+tabclose', 3)
339  call Check_tab_count(3, '.-2tabclose', 2)
340  call Check_tab_count(1, '.+1tabclose!', 1)
341  call assert_equal(1, tabpagenr('$'))
342  call assert_equal('', bufname(''))
343
344  " post count
345  call s:reconstruct_tabpage_for_test(6)
346  call Check_tab_count(3, 'tabclose!', 3)
347  call Check_tab_count(1, 'tabclose 3', 1)
348  call Check_tab_count(4, 'tabclose 4', 3)
349  call Check_tab_count(3, 'tabclose 1', 2)
350  call Check_tab_count(2, 'tabclose', 1)
351  call assert_equal(1, tabpagenr('$'))
352  call assert_equal('', bufname(''))
353
354  call s:reconstruct_tabpage_for_test(6)
355  call Check_tab_count(2, 'tabclose $', 2)
356  call Check_tab_count(4, 'tabclose', 4)
357  call Check_tab_count(3, 'tabclose +', 3)
358  call Check_tab_count(3, 'tabclose -2', 2)
359  call Check_tab_count(1, 'tabclose! +1', 1)
360  call assert_equal(1, tabpagenr('$'))
361  call assert_equal('', bufname(''))
362
363  call s:reconstruct_tabpage_for_test(6)
364  for n in range(2)
365    for c in ['0', '$3', '99', '+99', '-99']
366      if n == 0 " pre count
367        let entire_cmd = c . 'tabclose'
368        let err_code = 'E16:'
369      else
370        let entire_cmd = 'tabclose ' . c
371        let err_code = 'E474:'
372      endif
373      call assert_fails(entire_cmd, err_code)
374      call assert_equal(6, tabpagenr('$'))
375    endfor
376  endfor
377
378  call assert_fails('3tabclose', 'E37:')
379  call assert_fails('tabclose 3', 'E37:')
380  call assert_fails('tabclose -+', 'E474:')
381  call assert_fails('tabclose +2-', 'E474:')
382  call assert_equal(6, tabpagenr('$'))
383
384  1tabonly!
385endfunction
386
387" Test for [count] of tabonly
388function Test_tabpage_with_tabonly()
389
390  " Test for the normal behavior (pre count only)
391  let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
392  for c in tc
393    call s:reconstruct_tabpage_for_test(6)
394    let entire_cmd = c[1] . 'tabonly' . c[2]
395    call Check_tab_count(c[0], entire_cmd, 1)
396    call assert_equal(1, tabpagenr('$'))
397  endfor
398
399  " Test for the normal behavior
400  let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
401        \    [2, '', '!'],
402        \    [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
403        \  ]
404  for n in range(2)
405    for c in tc2
406      call s:reconstruct_tabpage_for_test(6)
407      if n == 0 " pre count
408        let entire_cmd = c[1] . 'tabonly' . c[2]
409      else
410        let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
411      endif
412      call Check_tab_count(c[0], entire_cmd, 1)
413      call assert_equal(1, tabpagenr('$'))
414    endfor
415  endfor
416
417  " Test for the error behavior
418  for n in range(2)
419    for c in ['0', '$3', '99', '+99', '-99']
420      call s:reconstruct_tabpage_for_test(6)
421      if n == 0 " pre count
422        let entire_cmd = c . 'tabonly'
423        let err_code = 'E16:'
424      else
425        let entire_cmd = 'tabonly ' . c
426        let err_code = 'E474:'
427      endif
428      call assert_fails(entire_cmd, err_code)
429      call assert_equal(6, tabpagenr('$'))
430    endfor
431  endfor
432
433  " Test for the error behavior (post count only)
434  for c in tc
435    call s:reconstruct_tabpage_for_test(6)
436    let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
437    let err_code = 'E474:'
438    call assert_fails(entire_cmd, err_code)
439    call assert_equal(6, tabpagenr('$'))
440  endfor
441
442  call assert_fails('tabonly -+', 'E474:')
443  call assert_fails('tabonly +2-', 'E474:')
444  call assert_equal(6, tabpagenr('$'))
445
446  1tabonly!
447  new
448  only!
449endfunction
450
451func Test_tabnext_on_buf_unload1()
452  " This once caused a crash
453  new
454  tabedit
455  tabfirst
456  au BufUnload <buffer> tabnext
457  q
458
459  while tabpagenr('$') > 1
460    bwipe!
461  endwhile
462endfunc
463
464func Test_tabnext_on_buf_unload2()
465  " This once caused a crash
466  tabedit
467  autocmd BufUnload <buffer> tabnext
468  file x
469  edit y
470
471  while tabpagenr('$') > 1
472    bwipe!
473  endwhile
474endfunc
475
476func Test_close_on_quitpre()
477  " This once caused a crash
478  new
479  only
480  set bufhidden=delete
481  au QuitPre <buffer> close
482  tabnew tab1
483  tabnew tab2
484  1tabn
485  q!
486  call assert_equal(1, tabpagenr())
487  call assert_equal(2, tabpagenr('$'))
488  " clean up
489  while tabpagenr('$') > 1
490    bwipe!
491  endwhile
492  1b
493endfunc
494
495" vim: shiftwidth=2 sts=2 expandtab
496