blob: f4fbf28d19a92f67f17e9fef69c40d93711e1382 [file] [log] [blame]
Bram Moolenaar1381d792016-08-18 22:11:42 +02001" Tests for tabpage
2
Bram Moolenaardbe88692018-05-20 14:57:22 +02003
Bram Moolenaar1381d792016-08-18 22:11:42 +02004function Test_tabpage()
5 bw!
6 " Simple test for opening and closing a tab page
7 tabnew
8 call assert_equal(2, tabpagenr())
9 quit
10
11 " Open three tab pages and use ":tabdo"
12 0tabnew
13 1tabnew
14 $tabnew
Bram Moolenaar3e8474d2016-10-12 17:52:42 +020015 %del
Bram Moolenaar1381d792016-08-18 22:11:42 +020016 tabdo call append(line('$'), tabpagenr())
17 tabclose! 2
18 tabrewind
19 let line1 = getline('$')
20 undo
21 q
22 tablast
23 let line2 = getline('$')
24 q!
25 call append(line('$'), line1)
26 call append(line('$'), line2)
27 unlet line1 line2
28 call assert_equal(['', '3', '1', '4'], getline(1, '$'))
29 "
30 " Test for settabvar() and gettabvar() functions. Open a new tab page and
31 " set 3 variables to a number, string and a list. Verify that the variables
32 " are correctly set.
33 tabnew
34 tabfirst
35 call settabvar(2, 'val_num', 100)
36 call settabvar(2, 'val_str', 'SetTabVar test')
37 call settabvar(2, 'val_list', ['red', 'blue', 'green'])
38 "
39 call assert_true(gettabvar(2, 'val_num') == 100 && gettabvar(2, 'val_str') == 'SetTabVar test' && gettabvar(2, 'val_list') == ['red', 'blue', 'green'])
40
41 tabnext 2
42 call assert_true(t:val_num == 100 && t:val_str == 'SetTabVar test' && t:val_list == ['red', 'blue', 'green'])
43 tabclose
44
Bram Moolenaar5a656862018-02-12 22:08:06 +010045 " 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
Bram Moolenaar1381d792016-08-18 22:11:42 +020077 "
78 "
79 for i in range(9) | tabnew | endfor
80 normal! 1gt
81 call assert_equal(1, tabpagenr())
82 tabmove 5
83 call assert_equal(5, tabpagenr())
84 .tabmove
85 call assert_equal(5, tabpagenr())
86 tabmove -
87 call assert_equal(4, tabpagenr())
88 tabmove +
89 call assert_equal(5, tabpagenr())
90 tabmove -2
91 call assert_equal(3, tabpagenr())
92 tabmove +4
93 call assert_equal(7, tabpagenr())
94 tabmove
95 call assert_equal(10, tabpagenr())
Bram Moolenaar1381d792016-08-18 22:11:42 +020096 0tabmove
97 call assert_equal(1, tabpagenr())
98 $tabmove
99 call assert_equal(10, tabpagenr())
100 tabmove 0
101 call assert_equal(1, tabpagenr())
102 tabmove $
103 call assert_equal(10, tabpagenr())
104 3tabmove
105 call assert_equal(4, tabpagenr())
106 7tabmove 5
107 call assert_equal(5, tabpagenr())
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100108 call assert_fails("99tabmove", 'E16:')
109 call assert_fails("+99tabmove", 'E16:')
110 call assert_fails("-99tabmove", 'E16:')
Bram Moolenaar1381d792016-08-18 22:11:42 +0200111 call assert_fails("tabmove foo", 'E474:')
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100112 call assert_fails("tabmove 99", 'E474:')
113 call assert_fails("tabmove +99", 'E474:')
114 call assert_fails("tabmove -99", 'E474:')
115 call assert_fails("tabmove -3+", 'E474:')
116 call assert_fails("tabmove $3", 'E474:')
117 1tabonly!
Bram Moolenaar1381d792016-08-18 22:11:42 +0200118endfunc
119
120" Test autocommands
121function Test_tabpage_with_autocmd()
122 if !has('autocmd')
123 return
124 endif
Bram Moolenaar1381d792016-08-18 22:11:42 +0200125 command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
126 augroup TestTabpageGroup
127 au!
128 autocmd TabEnter * call add(s:li, 'TabEnter')
129 autocmd WinEnter * call add(s:li, 'WinEnter')
130 autocmd BufEnter * call add(s:li, 'BufEnter')
131 autocmd TabLeave * call add(s:li, 'TabLeave')
132 autocmd WinLeave * call add(s:li, 'WinLeave')
133 autocmd BufLeave * call add(s:li, 'BufLeave')
134 augroup END
135
136 let s:li = []
137 let t:a='a'
138 C tab split
139 call assert_equal(['=== tab split ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter'], s:li)
140 let s:li = []
141 let t:a='b'
142 C tabnew
143 call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
144 let t:a='c'
145 let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
146 call assert_equal(['a', 'b', 'c'], s:li)
147
148 let s:li = []
149 C call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)')
150 call assert_equal(["=== call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)') ==="], s:li)
151 let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
152 call assert_equal(['2', '4', '6'], s:li)
153
154 let s:li = []
155 let w:a='a'
156 C vsplit
157 call assert_equal(['=== vsplit ===', 'WinLeave', 'WinEnter'], s:li)
158 let s:li = []
159 let w:a='a'
160 let tabn=tabpagenr()
161 let winr=range(1, winnr('$'))
162 C tabnext 1
163 call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
164 let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
165 call assert_equal(['a', 'a'], s:li)
166 let s:li = []
167 C call map(copy(winr), 'settabwinvar('.tabn.', v:val, ''a'', v:val*2)')
168 let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
169 call assert_equal(['2', '4'], s:li)
170
171 augroup TabDestructive
172 autocmd TabEnter * :C tabnext 2 | C tabclose 3
173 augroup END
174 let s:li = []
175 C tabnext 3
176 call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
177 call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
178
179 autocmd! TabDestructive TabEnter
180 let s:li = []
181 C tabnew
182 call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
183 let s:li = []
184 C tabnext 1
185 call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
186
187 autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
188 let s:li = []
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100189 call assert_equal(3, tabpagenr('$'))
190 C tabnext 2
191 call assert_equal(2, tabpagenr('$'))
192 call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
Bram Moolenaar1381d792016-08-18 22:11:42 +0200193 call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
194
195 delcommand C
196 autocmd! TabDestructive
197 augroup! TabDestructive
198 autocmd! TestTabpageGroup
199 augroup! TestTabpageGroup
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100200 1tabonly!
Bram Moolenaar1381d792016-08-18 22:11:42 +0200201endfunction
202
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200203function Test_tabpage_with_tab_modifier()
204 for n in range(4)
205 tabedit
206 endfor
207
208 function s:check_tab(pre_nr, cmd, post_nr)
209 exec 'tabnext ' . a:pre_nr
210 exec a:cmd
211 call assert_equal(a:post_nr, tabpagenr())
Bram Moolenaar100f5c92016-09-06 21:33:52 +0200212 call assert_equal('help', &buftype)
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200213 helpclose
214 endfunc
215
216 call s:check_tab(1, 'tab help', 2)
217 call s:check_tab(1, '3tab help', 4)
218 call s:check_tab(1, '.tab help', 2)
219 call s:check_tab(1, '.+1tab help', 3)
220 call s:check_tab(1, '0tab help', 1)
221 call s:check_tab(2, '+tab help', 4)
222 call s:check_tab(2, '+2tab help', 5)
223 call s:check_tab(4, '-tab help', 4)
224 call s:check_tab(4, '-2tab help', 3)
225 call s:check_tab(3, '$tab help', 6)
226 call assert_fails('99tab help', 'E16:')
227 call assert_fails('+99tab help', 'E16:')
228 call assert_fails('-99tab help', 'E16:')
229
230 delfunction s:check_tab
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100231 1tabonly!
232endfunction
233
234function Check_tab_count(pre_nr, cmd, post_nr)
235 exec 'tabnext' a:pre_nr
236 normal! G
237 exec a:cmd
238 call assert_equal(a:post_nr, tabpagenr(), a:cmd)
239endfunc
240
241" Test for [count] of tabnext
242function Test_tabpage_with_tabnext()
243 for n in range(4)
244 tabedit
245 call setline(1, ['', '', '3'])
246 endfor
247
248 call Check_tab_count(1, 'tabnext', 2)
249 call Check_tab_count(1, '3tabnext', 3)
250 call Check_tab_count(1, '.tabnext', 1)
251 call Check_tab_count(1, '.+1tabnext', 2)
252 call Check_tab_count(2, '+tabnext', 3)
253 call Check_tab_count(2, '+2tabnext', 4)
254 call Check_tab_count(4, '-tabnext', 3)
255 call Check_tab_count(4, '-2tabnext', 2)
256 call Check_tab_count(3, '$tabnext', 5)
257 call assert_fails('0tabnext', 'E16:')
258 call assert_fails('99tabnext', 'E16:')
259 call assert_fails('+99tabnext', 'E16:')
260 call assert_fails('-99tabnext', 'E16:')
261 call Check_tab_count(1, 'tabnext 3', 3)
262 call Check_tab_count(2, 'tabnext +', 3)
263 call Check_tab_count(2, 'tabnext +2', 4)
264 call Check_tab_count(4, 'tabnext -', 3)
265 call Check_tab_count(4, 'tabnext -2', 2)
266 call Check_tab_count(3, 'tabnext $', 5)
267 call assert_fails('tabnext 0', 'E474:')
268 call assert_fails('tabnext .', 'E474:')
269 call assert_fails('tabnext -+', 'E474:')
270 call assert_fails('tabnext +2-', 'E474:')
271 call assert_fails('tabnext $3', 'E474:')
272 call assert_fails('tabnext 99', 'E474:')
273 call assert_fails('tabnext +99', 'E474:')
274 call assert_fails('tabnext -99', 'E474:')
275
276 1tabonly!
277endfunction
278
279" Test for [count] of tabprevious
280function Test_tabpage_with_tabprevious()
281 for n in range(5)
282 tabedit
283 call setline(1, ['', '', '3'])
284 endfor
285
286 for cmd in ['tabNext', 'tabprevious']
287 call Check_tab_count(6, cmd, 5)
288 call Check_tab_count(6, '3' . cmd, 3)
289 call Check_tab_count(6, '8' . cmd, 4)
290 call Check_tab_count(6, cmd . ' 3', 3)
291 call Check_tab_count(6, cmd . ' 8', 4)
292 for n in range(2)
293 for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
294 if n == 0 " pre count
295 let entire_cmd = c . cmd
296 let err_code = 'E16:'
297 else
298 let entire_cmd = cmd . ' ' . c
299 let err_code = 'E474:'
300 endif
301 call assert_fails(entire_cmd, err_code)
302 endfor
303 endfor
304 endfor
305
306 1tabonly!
307endfunction
308
309function s:reconstruct_tabpage_for_test(nr)
310 let n = (a:nr > 2) ? a:nr - 2 : 1
311 1tabonly!
312 0tabedit n0
313 for n in range(1, n)
314 exec '$tabedit n' . n
315 if n == 1
316 call setline(1, ['', '', '3'])
317 endif
318 endfor
319endfunc
320
Bram Moolenaardbe88692018-05-20 14:57:22 +0200321func Test_tabpage_ctrl_pgup_pgdown()
322 enew!
323 tabnew tab1
324 tabnew tab2
325
326 call assert_equal(3, tabpagenr())
327 exe "norm! \<C-PageUp>"
328 call assert_equal(2, tabpagenr())
329 exe "norm! \<C-PageDown>"
330 call assert_equal(3, tabpagenr())
331
332 " Check wrapping at last or first page.
333 exe "norm! \<C-PageDown>"
334 call assert_equal(1, tabpagenr())
335 exe "norm! \<C-PageUp>"
336 call assert_equal(3, tabpagenr())
337
338 " With a count, <C-PageUp> and <C-PageDown> are not symmetrical somehow:
339 " - {count}<C-PageUp> goes {count} pages downward (relative count)
340 " - {count}<C-PageDown> goes to page number {count} (absolute count)
341 exe "norm! 2\<C-PageUp>"
342 call assert_equal(1, tabpagenr())
343 exe "norm! 2\<C-PageDown>"
344 call assert_equal(2, tabpagenr())
345
346 1tabonly!
347endfunc
348
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100349" Test for [count] of tabclose
350function Test_tabpage_with_tabclose()
351
352 " pre count
353 call s:reconstruct_tabpage_for_test(6)
354 call Check_tab_count(3, 'tabclose!', 3)
355 call Check_tab_count(1, '3tabclose', 1)
356 call Check_tab_count(4, '4tabclose', 3)
357 call Check_tab_count(3, '1tabclose', 2)
358 call Check_tab_count(2, 'tabclose', 1)
359 call assert_equal(1, tabpagenr('$'))
360 call assert_equal('', bufname(''))
361
362 call s:reconstruct_tabpage_for_test(6)
363 call Check_tab_count(2, '$tabclose', 2)
364 call Check_tab_count(4, '.tabclose', 4)
365 call Check_tab_count(3, '.+tabclose', 3)
366 call Check_tab_count(3, '.-2tabclose', 2)
367 call Check_tab_count(1, '.+1tabclose!', 1)
368 call assert_equal(1, tabpagenr('$'))
369 call assert_equal('', bufname(''))
370
371 " post count
372 call s:reconstruct_tabpage_for_test(6)
373 call Check_tab_count(3, 'tabclose!', 3)
374 call Check_tab_count(1, 'tabclose 3', 1)
375 call Check_tab_count(4, 'tabclose 4', 3)
376 call Check_tab_count(3, 'tabclose 1', 2)
377 call Check_tab_count(2, 'tabclose', 1)
378 call assert_equal(1, tabpagenr('$'))
379 call assert_equal('', bufname(''))
380
381 call s:reconstruct_tabpage_for_test(6)
382 call Check_tab_count(2, 'tabclose $', 2)
383 call Check_tab_count(4, 'tabclose', 4)
384 call Check_tab_count(3, 'tabclose +', 3)
385 call Check_tab_count(3, 'tabclose -2', 2)
386 call Check_tab_count(1, 'tabclose! +1', 1)
387 call assert_equal(1, tabpagenr('$'))
388 call assert_equal('', bufname(''))
389
390 call s:reconstruct_tabpage_for_test(6)
391 for n in range(2)
392 for c in ['0', '$3', '99', '+99', '-99']
393 if n == 0 " pre count
394 let entire_cmd = c . 'tabclose'
395 let err_code = 'E16:'
396 else
397 let entire_cmd = 'tabclose ' . c
398 let err_code = 'E474:'
399 endif
400 call assert_fails(entire_cmd, err_code)
401 call assert_equal(6, tabpagenr('$'))
402 endfor
403 endfor
404
405 call assert_fails('3tabclose', 'E37:')
406 call assert_fails('tabclose 3', 'E37:')
407 call assert_fails('tabclose -+', 'E474:')
408 call assert_fails('tabclose +2-', 'E474:')
409 call assert_equal(6, tabpagenr('$'))
410
411 1tabonly!
412endfunction
413
414" Test for [count] of tabonly
415function Test_tabpage_with_tabonly()
416
417 " Test for the normal behavior (pre count only)
418 let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
419 for c in tc
420 call s:reconstruct_tabpage_for_test(6)
421 let entire_cmd = c[1] . 'tabonly' . c[2]
422 call Check_tab_count(c[0], entire_cmd, 1)
423 call assert_equal(1, tabpagenr('$'))
424 endfor
425
426 " Test for the normal behavior
427 let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
428 \ [2, '', '!'],
429 \ [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
430 \ ]
431 for n in range(2)
432 for c in tc2
433 call s:reconstruct_tabpage_for_test(6)
434 if n == 0 " pre count
435 let entire_cmd = c[1] . 'tabonly' . c[2]
436 else
437 let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
438 endif
439 call Check_tab_count(c[0], entire_cmd, 1)
440 call assert_equal(1, tabpagenr('$'))
441 endfor
442 endfor
443
444 " Test for the error behavior
445 for n in range(2)
446 for c in ['0', '$3', '99', '+99', '-99']
447 call s:reconstruct_tabpage_for_test(6)
448 if n == 0 " pre count
449 let entire_cmd = c . 'tabonly'
450 let err_code = 'E16:'
451 else
452 let entire_cmd = 'tabonly ' . c
453 let err_code = 'E474:'
454 endif
455 call assert_fails(entire_cmd, err_code)
456 call assert_equal(6, tabpagenr('$'))
457 endfor
458 endfor
459
460 " Test for the error behavior (post count only)
461 for c in tc
462 call s:reconstruct_tabpage_for_test(6)
463 let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
464 let err_code = 'E474:'
465 call assert_fails(entire_cmd, err_code)
466 call assert_equal(6, tabpagenr('$'))
467 endfor
468
469 call assert_fails('tabonly -+', 'E474:')
470 call assert_fails('tabonly +2-', 'E474:')
471 call assert_equal(6, tabpagenr('$'))
472
473 1tabonly!
474 new
475 only!
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200476endfunction
477
Bram Moolenaar5a497892016-09-03 16:29:04 +0200478func Test_tabnext_on_buf_unload1()
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200479 " This once caused a crash
480 new
481 tabedit
482 tabfirst
483 au BufUnload <buffer> tabnext
484 q
485
486 while tabpagenr('$') > 1
Bram Moolenaar5a497892016-09-03 16:29:04 +0200487 bwipe!
488 endwhile
489endfunc
490
491func Test_tabnext_on_buf_unload2()
492 " This once caused a crash
493 tabedit
494 autocmd BufUnload <buffer> tabnext
495 file x
496 edit y
497
498 while tabpagenr('$') > 1
499 bwipe!
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200500 endwhile
501endfunc
502
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200503func Test_close_on_quitpre()
504 " This once caused a crash
Bram Moolenaarce11de82017-10-26 22:00:00 +0200505 edit Xtest
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200506 new
507 only
508 set bufhidden=delete
509 au QuitPre <buffer> close
510 tabnew tab1
511 tabnew tab2
512 1tabn
513 q!
514 call assert_equal(1, tabpagenr())
515 call assert_equal(2, tabpagenr('$'))
516 " clean up
517 while tabpagenr('$') > 1
518 bwipe!
519 endwhile
Bram Moolenaarce11de82017-10-26 22:00:00 +0200520 buf Xtest
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200521endfunc
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200522
Bram Moolenaardbe88692018-05-20 14:57:22 +0200523func Test_tabs()
524 enew!
525 tabnew tab1
526 norm ixxx
527 let a=split(execute(':tabs'), "\n")
528 call assert_equal(['Tab page 1',
529 \ ' [No Name]',
530 \ 'Tab page 2',
531 \ '> + tab1'], a)
532
533 1tabonly!
534 bw!
535endfunc
536
Bram Moolenaar1381d792016-08-18 22:11:42 +0200537" vim: shiftwidth=2 sts=2 expandtab