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