Tests for tab pages

STARTTEST
:so small.vim
:" Simple test for opening and closing a tab page
:tabnew
:let nr = tabpagenr()
:q
:call append(line('$'), 'tab page ' . nr)
:unlet nr
:"
:" Open three tab pages and use ":tabdo"
:0tabnew
:1tabnew
:888tabnew
:tabdo call append(line('$'), 'this is tab page ' . tabpagenr())
:tabclose! 2
:tabrewind
:let line1 = getline('$')
:undo
:q
:tablast
:let line2 = getline('$')
:q!
:call append(line('$'), line1)
:call append(line('$'), line2)
:unlet line1 line2
:"
:" Test for settabvar() and gettabvar() functions. Open a new tab page and 
:" set 3 variables to a number, string and a list. Verify that the variables
:" are correctly set.
:tabnew
:tabfirst
:call settabvar(2, 'val_num', 100)
:call settabvar(2, 'val_str', 'SetTabVar test')
:call settabvar(2, 'val_list', ['red', 'blue', 'green'])
:"
:let test_status = 'gettabvar: fail'
:if gettabvar(2, 'val_num') == 100 && gettabvar(2, 'val_str') == 'SetTabVar test' && gettabvar(2, 'val_list') == ['red', 'blue', 'green']
:    let test_status = 'gettabvar: pass'
:endif
:call append(line('$'), test_status)
:"
:tabnext 2
:let test_status = 'settabvar: fail'
:if t:val_num == 100 && t:val_str == 'SetTabVar test'  && t:val_list == ['red', 'blue', 'green']
:   let test_status = 'settabvar: pass'
:endif
:tabclose
:call append(line('$'), test_status)
:"
:if has('gui') || has('clientserver')
:" Test for ":tab drop exist-file" to keep current window.
:sp test1
:tab drop test1
:let test_status = 'tab drop 1: fail'
:if tabpagenr('$') == 1 && winnr('$') == 2 && winnr() == 1
:    let test_status = 'tab drop 1: pass'
:endif
:close
:call append(line('$'), test_status)
:"
:"
:" Test for ":tab drop new-file" to keep current window of tabpage 1.
:split
:tab drop newfile
:let test_status = 'tab drop 2: fail'
:if tabpagenr('$') == 2 && tabpagewinnr(1, '$') == 2 && tabpagewinnr(1) == 1
:    let test_status = 'tab drop 2: pass'
:endif
:tabclose
:q
:call append(line('$'), test_status)
:"
:"
:" Test for ":tab drop multi-opend-file" to keep current tabpage and window.
:new test1
:tabnew
:new test1
:tab drop test1
:let test_status = 'tab drop 3: fail'
:if tabpagenr() == 2 && tabpagewinnr(2, '$') == 2 && tabpagewinnr(2) == 1
:    let test_status = 'tab drop 3: pass'
:endif
:tabclose
:q
:call append(line('$'), test_status)
:else
:" :drop not supported
:call append(line('$'), 'tab drop 1: pass')
:call append(line('$'), 'tab drop 2: pass')
:call append(line('$'), 'tab drop 3: pass')
:endif
:"
:"
:for i in range(9) | tabnew | endfor
1gt
Go=tabpagenr()


:tabmove 5
i=tabpagenr()


:tabmove -2
i=tabpagenr()


:tabmove +4
i=tabpagenr()


:tabmove
i=tabpagenr()


:tabmove -20
i=tabpagenr()


:tabmove +20
i=tabpagenr()


:3tabmove
i=tabpagenr()


:7tabmove 5
i=tabpagenr()


:let a='No error caught.'
:try
:tabmove foo
:catch E474
:let a='E474 caught.'
:endtry
i=a

:"
:" Test autocommands
:tabonly!
:let g:r=[]
:command -nargs=1 -bar C :call add(g:r, '=== ' . <q-args> . ' ===')|<args>
:function Test()
    let hasau=has('autocmd')
    if hasau
        autocmd TabEnter * :call add(g:r, 'TabEnter')
        autocmd WinEnter * :call add(g:r, 'WinEnter')
        autocmd BufEnter * :call add(g:r, 'BufEnter')
        autocmd TabLeave * :call add(g:r, 'TabLeave')
        autocmd WinLeave * :call add(g:r, 'WinLeave')
        autocmd BufLeave * :call add(g:r, 'BufLeave')
    endif
    let t:a='a'
    C tab split
    if !hasau
        let g:r+=['WinLeave', 'TabLeave', 'WinEnter', 'TabEnter']
    endif
    let t:a='b'
    C tabnew
    if !hasau
        let g:r+=['WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufLeave', 'BufEnter']
    endif
    let t:a='c'
    call add(g:r, join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')))
    C call map(range(1, tabpagenr('$')), 'settabvar(v:val, ''a'', v:val*2)')
    call add(g:r, join(map(range(1, tabpagenr('$')), 'gettabvar(v:val, "a")')))
    let w:a='a'
    C vsplit
    if !hasau
        let g:r+=['WinLeave', 'WinEnter']
    endif
    let w:a='a'
    let tabn=tabpagenr()
    let winr=range(1, winnr('$'))
    C tabnext 1
    if !hasau
        let g:r+=['BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', 'BufEnter']
    endif
    call add(g:r, join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')))
    C call map(copy(winr), 'settabwinvar('.tabn.', v:val, ''a'', v:val*2)')
    call add(g:r, join(map(copy(winr), 'gettabwinvar('.tabn.', v:val, "a")')))
    if hasau
        augroup TabDestructive
            autocmd TabEnter * :C tabnext 2 | C tabclose 3
        augroup END
        C tabnext 3
        let g:r+=[tabpagenr().'/'.tabpagenr('$')]
        autocmd! TabDestructive TabEnter
        C tabnew
        C tabnext 1
        autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
        C tabnext 3
        let g:r+=[tabpagenr().'/'.tabpagenr('$')]
    else
        let g:r+=["=== tabnext 3 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","=== tabclose 3 ===","2/2","=== tabnew ===","WinLeave","TabLeave","WinEnter","TabEnter","BufLeave","BufEnter","=== tabnext 1 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","BufEnter","=== tabnext 3 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","BufLeave","WinLeave","TabLeave","WinEnter","TabEnter","=== tabnext 2 ===","=== tabclose 3 ===","BufEnter","=== tabclose 3 ===","2/2",]
    endif
endfunction
:call Test()
:$ put =g:r
:"
:"
:/^Results/,$w! test.out
:qa!
ENDTEST

Results:
