blob: 48ac6eb2f26541bbfff5ffe3dea74293e6c82c8a [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 Moolenaar82a12462019-01-22 22:41:42 +0100108 -tabmove
109 call assert_equal(4, tabpagenr())
110 +tabmove
111 call assert_equal(5, tabpagenr())
112 -2tabmove
113 call assert_equal(3, tabpagenr())
114 +3tabmove
115 call assert_equal(6, tabpagenr())
Bram Moolenaar7cc59652018-08-07 13:14:46 +0200116
117 " The following are a no-op
118 norm! 2gt
119 call assert_equal(2, tabpagenr())
120 tabmove 2
121 call assert_equal(2, tabpagenr())
122 2tabmove
123 call assert_equal(2, tabpagenr())
124 tabmove 1
125 call assert_equal(2, tabpagenr())
126 1tabmove
127 call assert_equal(2, tabpagenr())
128
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100129 call assert_fails("99tabmove", 'E16:')
130 call assert_fails("+99tabmove", 'E16:')
131 call assert_fails("-99tabmove", 'E16:')
Bram Moolenaar1381d792016-08-18 22:11:42 +0200132 call assert_fails("tabmove foo", 'E474:')
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100133 call assert_fails("tabmove 99", 'E474:')
134 call assert_fails("tabmove +99", 'E474:')
135 call assert_fails("tabmove -99", 'E474:')
136 call assert_fails("tabmove -3+", 'E474:')
137 call assert_fails("tabmove $3", 'E474:')
138 1tabonly!
Bram Moolenaar1381d792016-08-18 22:11:42 +0200139endfunc
140
141" Test autocommands
142function Test_tabpage_with_autocmd()
143 if !has('autocmd')
144 return
145 endif
Bram Moolenaar1381d792016-08-18 22:11:42 +0200146 command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
147 augroup TestTabpageGroup
148 au!
149 autocmd TabEnter * call add(s:li, 'TabEnter')
150 autocmd WinEnter * call add(s:li, 'WinEnter')
151 autocmd BufEnter * call add(s:li, 'BufEnter')
152 autocmd TabLeave * call add(s:li, 'TabLeave')
153 autocmd WinLeave * call add(s:li, 'WinLeave')
154 autocmd BufLeave * call add(s:li, 'BufLeave')
155 augroup END
156
157 let s:li = []
158 let t:a='a'
159 C tab split
160 call assert_equal(['=== tab split ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter'], s:li)
161 let s:li = []
162 let t:a='b'
163 C tabnew
164 call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
165 let t:a='c'
166 let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
167 call assert_equal(['a', 'b', 'c'], s:li)
168
169 let s:li = []
170 C call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)')
171 call assert_equal(["=== call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)') ==="], s:li)
172 let s:li = split(join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')) , '\s\+')
173 call assert_equal(['2', '4', '6'], s:li)
174
175 let s:li = []
176 let w:a='a'
177 C vsplit
178 call assert_equal(['=== vsplit ===', 'WinLeave', 'WinEnter'], s:li)
179 let s:li = []
180 let w:a='a'
181 let tabn=tabpagenr()
182 let winr=range(1, winnr('$'))
183 C tabnext 1
184 call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
185 let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
186 call assert_equal(['a', 'a'], s:li)
187 let s:li = []
188 C call map(copy(winr), 'settabwinvar('.tabn.', v:val, ''a'', v:val*2)')
189 let s:li = split(join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')), '\s\+')
190 call assert_equal(['2', '4'], s:li)
191
192 augroup TabDestructive
193 autocmd TabEnter * :C tabnext 2 | C tabclose 3
194 augroup END
195 let s:li = []
196 C tabnext 3
197 call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
198 call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
199
200 autocmd! TabDestructive TabEnter
201 let s:li = []
202 C tabnew
203 call assert_equal(['=== tabnew ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter'], s:li)
204 let s:li = []
205 C tabnext 1
206 call assert_equal(['=== tabnext 1 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter'], s:li)
207
208 autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
209 let s:li = []
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100210 call assert_equal(3, tabpagenr('$'))
211 C tabnext 2
212 call assert_equal(2, tabpagenr('$'))
213 call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
Bram Moolenaar1381d792016-08-18 22:11:42 +0200214 call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
215
216 delcommand C
217 autocmd! TabDestructive
218 augroup! TabDestructive
219 autocmd! TestTabpageGroup
220 augroup! TestTabpageGroup
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100221 1tabonly!
Bram Moolenaar1381d792016-08-18 22:11:42 +0200222endfunction
223
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200224function Test_tabpage_with_tab_modifier()
225 for n in range(4)
226 tabedit
227 endfor
228
229 function s:check_tab(pre_nr, cmd, post_nr)
230 exec 'tabnext ' . a:pre_nr
231 exec a:cmd
232 call assert_equal(a:post_nr, tabpagenr())
Bram Moolenaar100f5c92016-09-06 21:33:52 +0200233 call assert_equal('help', &buftype)
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200234 helpclose
235 endfunc
236
237 call s:check_tab(1, 'tab help', 2)
238 call s:check_tab(1, '3tab help', 4)
239 call s:check_tab(1, '.tab help', 2)
240 call s:check_tab(1, '.+1tab help', 3)
241 call s:check_tab(1, '0tab help', 1)
242 call s:check_tab(2, '+tab help', 4)
243 call s:check_tab(2, '+2tab help', 5)
244 call s:check_tab(4, '-tab help', 4)
245 call s:check_tab(4, '-2tab help', 3)
246 call s:check_tab(3, '$tab help', 6)
247 call assert_fails('99tab help', 'E16:')
248 call assert_fails('+99tab help', 'E16:')
249 call assert_fails('-99tab help', 'E16:')
250
251 delfunction s:check_tab
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100252 1tabonly!
253endfunction
254
255function Check_tab_count(pre_nr, cmd, post_nr)
256 exec 'tabnext' a:pre_nr
257 normal! G
258 exec a:cmd
259 call assert_equal(a:post_nr, tabpagenr(), a:cmd)
260endfunc
261
262" Test for [count] of tabnext
263function Test_tabpage_with_tabnext()
264 for n in range(4)
265 tabedit
266 call setline(1, ['', '', '3'])
267 endfor
268
269 call Check_tab_count(1, 'tabnext', 2)
270 call Check_tab_count(1, '3tabnext', 3)
271 call Check_tab_count(1, '.tabnext', 1)
272 call Check_tab_count(1, '.+1tabnext', 2)
273 call Check_tab_count(2, '+tabnext', 3)
274 call Check_tab_count(2, '+2tabnext', 4)
275 call Check_tab_count(4, '-tabnext', 3)
276 call Check_tab_count(4, '-2tabnext', 2)
277 call Check_tab_count(3, '$tabnext', 5)
278 call assert_fails('0tabnext', 'E16:')
279 call assert_fails('99tabnext', 'E16:')
280 call assert_fails('+99tabnext', 'E16:')
281 call assert_fails('-99tabnext', 'E16:')
282 call Check_tab_count(1, 'tabnext 3', 3)
283 call Check_tab_count(2, 'tabnext +', 3)
284 call Check_tab_count(2, 'tabnext +2', 4)
285 call Check_tab_count(4, 'tabnext -', 3)
286 call Check_tab_count(4, 'tabnext -2', 2)
287 call Check_tab_count(3, 'tabnext $', 5)
288 call assert_fails('tabnext 0', 'E474:')
289 call assert_fails('tabnext .', 'E474:')
290 call assert_fails('tabnext -+', 'E474:')
291 call assert_fails('tabnext +2-', 'E474:')
292 call assert_fails('tabnext $3', 'E474:')
293 call assert_fails('tabnext 99', 'E474:')
294 call assert_fails('tabnext +99', 'E474:')
295 call assert_fails('tabnext -99', 'E474:')
296
297 1tabonly!
298endfunction
299
300" Test for [count] of tabprevious
301function Test_tabpage_with_tabprevious()
302 for n in range(5)
303 tabedit
304 call setline(1, ['', '', '3'])
305 endfor
306
307 for cmd in ['tabNext', 'tabprevious']
308 call Check_tab_count(6, cmd, 5)
309 call Check_tab_count(6, '3' . cmd, 3)
310 call Check_tab_count(6, '8' . cmd, 4)
311 call Check_tab_count(6, cmd . ' 3', 3)
312 call Check_tab_count(6, cmd . ' 8', 4)
313 for n in range(2)
314 for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
315 if n == 0 " pre count
316 let entire_cmd = c . cmd
317 let err_code = 'E16:'
318 else
319 let entire_cmd = cmd . ' ' . c
320 let err_code = 'E474:'
321 endif
322 call assert_fails(entire_cmd, err_code)
323 endfor
324 endfor
325 endfor
326
327 1tabonly!
328endfunction
329
330function s:reconstruct_tabpage_for_test(nr)
331 let n = (a:nr > 2) ? a:nr - 2 : 1
332 1tabonly!
333 0tabedit n0
334 for n in range(1, n)
335 exec '$tabedit n' . n
336 if n == 1
337 call setline(1, ['', '', '3'])
338 endif
339 endfor
340endfunc
341
Bram Moolenaardbe88692018-05-20 14:57:22 +0200342func Test_tabpage_ctrl_pgup_pgdown()
343 enew!
344 tabnew tab1
345 tabnew tab2
346
347 call assert_equal(3, tabpagenr())
348 exe "norm! \<C-PageUp>"
349 call assert_equal(2, tabpagenr())
350 exe "norm! \<C-PageDown>"
351 call assert_equal(3, tabpagenr())
352
353 " Check wrapping at last or first page.
354 exe "norm! \<C-PageDown>"
355 call assert_equal(1, tabpagenr())
356 exe "norm! \<C-PageUp>"
357 call assert_equal(3, tabpagenr())
358
359 " With a count, <C-PageUp> and <C-PageDown> are not symmetrical somehow:
360 " - {count}<C-PageUp> goes {count} pages downward (relative count)
361 " - {count}<C-PageDown> goes to page number {count} (absolute count)
362 exe "norm! 2\<C-PageUp>"
363 call assert_equal(1, tabpagenr())
364 exe "norm! 2\<C-PageDown>"
365 call assert_equal(2, tabpagenr())
366
367 1tabonly!
368endfunc
369
Bram Moolenaar2f72c702017-01-29 14:48:10 +0100370" Test for [count] of tabclose
371function Test_tabpage_with_tabclose()
372
373 " pre count
374 call s:reconstruct_tabpage_for_test(6)
375 call Check_tab_count(3, 'tabclose!', 3)
376 call Check_tab_count(1, '3tabclose', 1)
377 call Check_tab_count(4, '4tabclose', 3)
378 call Check_tab_count(3, '1tabclose', 2)
379 call Check_tab_count(2, 'tabclose', 1)
380 call assert_equal(1, tabpagenr('$'))
381 call assert_equal('', bufname(''))
382
383 call s:reconstruct_tabpage_for_test(6)
384 call Check_tab_count(2, '$tabclose', 2)
385 call Check_tab_count(4, '.tabclose', 4)
386 call Check_tab_count(3, '.+tabclose', 3)
387 call Check_tab_count(3, '.-2tabclose', 2)
388 call Check_tab_count(1, '.+1tabclose!', 1)
389 call assert_equal(1, tabpagenr('$'))
390 call assert_equal('', bufname(''))
391
392 " post count
393 call s:reconstruct_tabpage_for_test(6)
394 call Check_tab_count(3, 'tabclose!', 3)
395 call Check_tab_count(1, 'tabclose 3', 1)
396 call Check_tab_count(4, 'tabclose 4', 3)
397 call Check_tab_count(3, 'tabclose 1', 2)
398 call Check_tab_count(2, 'tabclose', 1)
399 call assert_equal(1, tabpagenr('$'))
400 call assert_equal('', bufname(''))
401
402 call s:reconstruct_tabpage_for_test(6)
403 call Check_tab_count(2, 'tabclose $', 2)
404 call Check_tab_count(4, 'tabclose', 4)
405 call Check_tab_count(3, 'tabclose +', 3)
406 call Check_tab_count(3, 'tabclose -2', 2)
407 call Check_tab_count(1, 'tabclose! +1', 1)
408 call assert_equal(1, tabpagenr('$'))
409 call assert_equal('', bufname(''))
410
411 call s:reconstruct_tabpage_for_test(6)
412 for n in range(2)
413 for c in ['0', '$3', '99', '+99', '-99']
414 if n == 0 " pre count
415 let entire_cmd = c . 'tabclose'
416 let err_code = 'E16:'
417 else
418 let entire_cmd = 'tabclose ' . c
419 let err_code = 'E474:'
420 endif
421 call assert_fails(entire_cmd, err_code)
422 call assert_equal(6, tabpagenr('$'))
423 endfor
424 endfor
425
426 call assert_fails('3tabclose', 'E37:')
427 call assert_fails('tabclose 3', 'E37:')
428 call assert_fails('tabclose -+', 'E474:')
429 call assert_fails('tabclose +2-', 'E474:')
430 call assert_equal(6, tabpagenr('$'))
431
432 1tabonly!
433endfunction
434
435" Test for [count] of tabonly
436function Test_tabpage_with_tabonly()
437
438 " Test for the normal behavior (pre count only)
439 let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
440 for c in tc
441 call s:reconstruct_tabpage_for_test(6)
442 let entire_cmd = c[1] . 'tabonly' . c[2]
443 call Check_tab_count(c[0], entire_cmd, 1)
444 call assert_equal(1, tabpagenr('$'))
445 endfor
446
447 " Test for the normal behavior
448 let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
449 \ [2, '', '!'],
450 \ [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
451 \ ]
452 for n in range(2)
453 for c in tc2
454 call s:reconstruct_tabpage_for_test(6)
455 if n == 0 " pre count
456 let entire_cmd = c[1] . 'tabonly' . c[2]
457 else
458 let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
459 endif
460 call Check_tab_count(c[0], entire_cmd, 1)
461 call assert_equal(1, tabpagenr('$'))
462 endfor
463 endfor
464
465 " Test for the error behavior
466 for n in range(2)
467 for c in ['0', '$3', '99', '+99', '-99']
468 call s:reconstruct_tabpage_for_test(6)
469 if n == 0 " pre count
470 let entire_cmd = c . 'tabonly'
471 let err_code = 'E16:'
472 else
473 let entire_cmd = 'tabonly ' . c
474 let err_code = 'E474:'
475 endif
476 call assert_fails(entire_cmd, err_code)
477 call assert_equal(6, tabpagenr('$'))
478 endfor
479 endfor
480
481 " Test for the error behavior (post count only)
482 for c in tc
483 call s:reconstruct_tabpage_for_test(6)
484 let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
485 let err_code = 'E474:'
486 call assert_fails(entire_cmd, err_code)
487 call assert_equal(6, tabpagenr('$'))
488 endfor
489
490 call assert_fails('tabonly -+', 'E474:')
491 call assert_fails('tabonly +2-', 'E474:')
492 call assert_equal(6, tabpagenr('$'))
493
494 1tabonly!
495 new
496 only!
Bram Moolenaar9b7f8ce2016-08-21 19:07:17 +0200497endfunction
498
Bram Moolenaar5a497892016-09-03 16:29:04 +0200499func Test_tabnext_on_buf_unload1()
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200500 " This once caused a crash
501 new
502 tabedit
503 tabfirst
504 au BufUnload <buffer> tabnext
505 q
506
507 while tabpagenr('$') > 1
Bram Moolenaar5a497892016-09-03 16:29:04 +0200508 bwipe!
509 endwhile
510endfunc
511
512func Test_tabnext_on_buf_unload2()
513 " This once caused a crash
514 tabedit
515 autocmd BufUnload <buffer> tabnext
516 file x
517 edit y
518
519 while tabpagenr('$') > 1
520 bwipe!
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200521 endwhile
522endfunc
523
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200524func Test_close_on_quitpre()
525 " This once caused a crash
Bram Moolenaarce11de82017-10-26 22:00:00 +0200526 edit Xtest
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200527 new
528 only
529 set bufhidden=delete
530 au QuitPre <buffer> close
531 tabnew tab1
532 tabnew tab2
533 1tabn
534 q!
535 call assert_equal(1, tabpagenr())
536 call assert_equal(2, tabpagenr('$'))
537 " clean up
538 while tabpagenr('$') > 1
539 bwipe!
540 endwhile
Bram Moolenaarce11de82017-10-26 22:00:00 +0200541 buf Xtest
Bram Moolenaar0ea50702017-07-08 14:44:50 +0200542endfunc
Bram Moolenaar11fbc282016-09-02 21:48:32 +0200543
Bram Moolenaardbe88692018-05-20 14:57:22 +0200544func Test_tabs()
545 enew!
546 tabnew tab1
547 norm ixxx
548 let a=split(execute(':tabs'), "\n")
549 call assert_equal(['Tab page 1',
550 \ ' [No Name]',
551 \ 'Tab page 2',
552 \ '> + tab1'], a)
553
554 1tabonly!
555 bw!
556endfunc
557
Bram Moolenaar1381d792016-08-18 22:11:42 +0200558" vim: shiftwidth=2 sts=2 expandtab