diff src/testdir/test_tabpage.vim @ 10739:380e706814da v8.0.0259

patch 8.0.0259: tab commands do not handle count correctly commit https://github.com/vim/vim/commit/2f72c70657129c16e6b0e413752a775c804f02f8 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 29 14:48:10 2017 +0100 patch 8.0.0259: tab commands do not handle count correctly Problem: Tab commands do not handle count correctly. (Ken Hamada) Solution: Add ADDR_TABS_RELATIVE. (Hirohito Higashi)
author Christian Brabandt <cb@256bit.org>
date Sun, 29 Jan 2017 15:00:05 +0100
parents 262f5bc3d38e
children 70bc7b107610
line wrap: on
line diff
--- a/src/testdir/test_tabpage.vim
+++ b/src/testdir/test_tabpage.vim
@@ -94,10 +94,6 @@ function Test_tabpage()
   call assert_equal(7, tabpagenr())
   tabmove
   call assert_equal(10, tabpagenr())
-  tabmove -20
-  call assert_equal(1, tabpagenr())
-  tabmove +20
-  call assert_equal(10, tabpagenr())
   0tabmove
   call assert_equal(1, tabpagenr())
   $tabmove
@@ -110,7 +106,16 @@ function Test_tabpage()
   call assert_equal(4, tabpagenr())
   7tabmove 5
   call assert_equal(5, tabpagenr())
+  call assert_fails("99tabmove", 'E16:')
+  call assert_fails("+99tabmove", 'E16:')
+  call assert_fails("-99tabmove", 'E16:')
   call assert_fails("tabmove foo", 'E474:')
+  call assert_fails("tabmove 99", 'E474:')
+  call assert_fails("tabmove +99", 'E474:')
+  call assert_fails("tabmove -99", 'E474:')
+  call assert_fails("tabmove -3+", 'E474:')
+  call assert_fails("tabmove $3", 'E474:')
+  1tabonly!
 endfunc
 
 " Test autocommands
@@ -118,7 +123,6 @@ function Test_tabpage_with_autocmd()
   if !has('autocmd')
     return
   endif
-  tabonly!
   command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
   augroup TestTabpageGroup
     au!
@@ -183,8 +187,10 @@ function Test_tabpage_with_autocmd()
 
   autocmd TabDestructive TabEnter * nested :C tabnext 2 | C tabclose 3
   let s:li = []
-  C tabnext 3
-  call assert_equal(['=== tabnext 3 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', 'BufLeave', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ===', 'BufEnter', '=== tabclose 3 ==='], s:li)
+  call assert_equal(3, tabpagenr('$'))
+  C tabnext 2
+  call assert_equal(2, tabpagenr('$'))
+  call assert_equal(['=== tabnext 2 ===', 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter', '=== tabnext 2 ===', '=== tabclose 3 ==='], s:li)
   call assert_equal(['2/2'], [tabpagenr().'/'.tabpagenr('$')])
 
   delcommand C
@@ -192,8 +198,7 @@ function Test_tabpage_with_autocmd()
   augroup! TabDestructive
   autocmd! TestTabpageGroup
   augroup! TestTabpageGroup
-  tabonly!
-  bw!
+  1tabonly!
 endfunction
 
 function Test_tabpage_with_tab_modifier()
@@ -224,8 +229,223 @@ function Test_tabpage_with_tab_modifier(
   call assert_fails('-99tab help', 'E16:')
 
   delfunction s:check_tab
-  tabonly!
-  bw!
+  1tabonly!
+endfunction
+
+function Check_tab_count(pre_nr, cmd, post_nr)
+  exec 'tabnext' a:pre_nr
+  normal! G
+  exec a:cmd
+  call assert_equal(a:post_nr, tabpagenr(), a:cmd)
+endfunc
+
+" Test for [count] of tabnext
+function Test_tabpage_with_tabnext()
+  for n in range(4)
+    tabedit
+    call setline(1, ['', '', '3'])
+  endfor
+
+  call Check_tab_count(1, 'tabnext', 2)
+  call Check_tab_count(1, '3tabnext', 3)
+  call Check_tab_count(1, '.tabnext', 1)
+  call Check_tab_count(1, '.+1tabnext', 2)
+  call Check_tab_count(2, '+tabnext', 3)
+  call Check_tab_count(2, '+2tabnext', 4)
+  call Check_tab_count(4, '-tabnext', 3)
+  call Check_tab_count(4, '-2tabnext', 2)
+  call Check_tab_count(3, '$tabnext', 5)
+  call assert_fails('0tabnext', 'E16:')
+  call assert_fails('99tabnext', 'E16:')
+  call assert_fails('+99tabnext', 'E16:')
+  call assert_fails('-99tabnext', 'E16:')
+  call Check_tab_count(1, 'tabnext 3', 3)
+  call Check_tab_count(2, 'tabnext +', 3)
+  call Check_tab_count(2, 'tabnext +2', 4)
+  call Check_tab_count(4, 'tabnext -', 3)
+  call Check_tab_count(4, 'tabnext -2', 2)
+  call Check_tab_count(3, 'tabnext $', 5)
+  call assert_fails('tabnext 0', 'E474:')
+  call assert_fails('tabnext .', 'E474:')
+  call assert_fails('tabnext -+', 'E474:')
+  call assert_fails('tabnext +2-', 'E474:')
+  call assert_fails('tabnext $3', 'E474:')
+  call assert_fails('tabnext 99', 'E474:')
+  call assert_fails('tabnext +99', 'E474:')
+  call assert_fails('tabnext -99', 'E474:')
+
+  1tabonly!
+endfunction
+
+" Test for [count] of tabprevious
+function Test_tabpage_with_tabprevious()
+  for n in range(5)
+    tabedit
+    call setline(1, ['', '', '3'])
+  endfor
+
+  for cmd in ['tabNext', 'tabprevious']
+    call Check_tab_count(6, cmd, 5)
+    call Check_tab_count(6, '3' . cmd, 3)
+    call Check_tab_count(6, '8' . cmd, 4)
+    call Check_tab_count(6, cmd . ' 3', 3)
+    call Check_tab_count(6, cmd . ' 8', 4)
+    for n in range(2)
+      for c in ['0', '.+3', '+', '+2' , '-', '-2' , '$', '+99', '-99']
+        if n == 0 " pre count
+          let entire_cmd = c . cmd
+          let err_code = 'E16:'
+        else
+          let entire_cmd = cmd . ' ' . c
+          let err_code = 'E474:'
+        endif
+        call assert_fails(entire_cmd, err_code)
+      endfor
+    endfor
+  endfor
+
+  1tabonly!
+endfunction
+
+function s:reconstruct_tabpage_for_test(nr)
+  let n = (a:nr > 2) ? a:nr - 2 : 1
+  1tabonly!
+  0tabedit n0
+  for n in range(1, n)
+    exec '$tabedit n' . n
+    if n == 1
+      call setline(1, ['', '', '3'])
+    endif
+  endfor
+endfunc
+
+" Test for [count] of tabclose
+function Test_tabpage_with_tabclose()
+
+  " pre count
+  call s:reconstruct_tabpage_for_test(6)
+  call Check_tab_count(3, 'tabclose!', 3)
+  call Check_tab_count(1, '3tabclose', 1)
+  call Check_tab_count(4, '4tabclose', 3)
+  call Check_tab_count(3, '1tabclose', 2)
+  call Check_tab_count(2, 'tabclose', 1)
+  call assert_equal(1, tabpagenr('$'))
+  call assert_equal('', bufname(''))
+
+  call s:reconstruct_tabpage_for_test(6)
+  call Check_tab_count(2, '$tabclose', 2)
+  call Check_tab_count(4, '.tabclose', 4)
+  call Check_tab_count(3, '.+tabclose', 3)
+  call Check_tab_count(3, '.-2tabclose', 2)
+  call Check_tab_count(1, '.+1tabclose!', 1)
+  call assert_equal(1, tabpagenr('$'))
+  call assert_equal('', bufname(''))
+
+  " post count
+  call s:reconstruct_tabpage_for_test(6)
+  call Check_tab_count(3, 'tabclose!', 3)
+  call Check_tab_count(1, 'tabclose 3', 1)
+  call Check_tab_count(4, 'tabclose 4', 3)
+  call Check_tab_count(3, 'tabclose 1', 2)
+  call Check_tab_count(2, 'tabclose', 1)
+  call assert_equal(1, tabpagenr('$'))
+  call assert_equal('', bufname(''))
+
+  call s:reconstruct_tabpage_for_test(6)
+  call Check_tab_count(2, 'tabclose $', 2)
+  call Check_tab_count(4, 'tabclose', 4)
+  call Check_tab_count(3, 'tabclose +', 3)
+  call Check_tab_count(3, 'tabclose -2', 2)
+  call Check_tab_count(1, 'tabclose! +1', 1)
+  call assert_equal(1, tabpagenr('$'))
+  call assert_equal('', bufname(''))
+
+  call s:reconstruct_tabpage_for_test(6)
+  for n in range(2)
+    for c in ['0', '$3', '99', '+99', '-99']
+      if n == 0 " pre count
+        let entire_cmd = c . 'tabclose'
+        let err_code = 'E16:'
+      else
+        let entire_cmd = 'tabclose ' . c
+        let err_code = 'E474:'
+      endif
+      call assert_fails(entire_cmd, err_code)
+      call assert_equal(6, tabpagenr('$'))
+    endfor
+  endfor
+
+  call assert_fails('3tabclose', 'E37:')
+  call assert_fails('tabclose 3', 'E37:')
+  call assert_fails('tabclose -+', 'E474:')
+  call assert_fails('tabclose +2-', 'E474:')
+  call assert_equal(6, tabpagenr('$'))
+
+  1tabonly!
+endfunction
+
+" Test for [count] of tabonly
+function Test_tabpage_with_tabonly()
+
+  " Test for the normal behavior (pre count only)
+  let tc = [ [4, '.', '!'], [2, '.+', ''], [3, '.-2', '!'], [1, '.+1', '!'] ]
+  for c in tc
+    call s:reconstruct_tabpage_for_test(6)
+    let entire_cmd = c[1] . 'tabonly' . c[2]
+    call Check_tab_count(c[0], entire_cmd, 1)
+    call assert_equal(1, tabpagenr('$'))
+  endfor
+
+  " Test for the normal behavior
+  let tc2 = [ [3, '', ''], [1, '3', ''], [4, '4', '!'], [3, '1', '!'],
+        \    [2, '', '!'],
+        \    [2, '$', '!'], [3, '+', '!'], [3, '-2', '!'], [3, '+1', '!']
+        \  ]
+  for n in range(2)
+    for c in tc2
+      call s:reconstruct_tabpage_for_test(6)
+      if n == 0 " pre count
+        let entire_cmd = c[1] . 'tabonly' . c[2]
+      else
+        let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
+      endif
+      call Check_tab_count(c[0], entire_cmd, 1)
+      call assert_equal(1, tabpagenr('$'))
+    endfor
+  endfor
+
+  " Test for the error behavior
+  for n in range(2)
+    for c in ['0', '$3', '99', '+99', '-99']
+      call s:reconstruct_tabpage_for_test(6)
+      if n == 0 " pre count
+        let entire_cmd = c . 'tabonly'
+        let err_code = 'E16:'
+      else
+        let entire_cmd = 'tabonly ' . c
+        let err_code = 'E474:'
+      endif
+      call assert_fails(entire_cmd, err_code)
+      call assert_equal(6, tabpagenr('$'))
+    endfor
+  endfor
+
+  " Test for the error behavior (post count only)
+  for c in tc
+    call s:reconstruct_tabpage_for_test(6)
+    let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
+    let err_code = 'E474:'
+    call assert_fails(entire_cmd, err_code)
+    call assert_equal(6, tabpagenr('$'))
+  endfor
+
+  call assert_fails('tabonly -+', 'E474:')
+  call assert_fails('tabonly +2-', 'E474:')
+  call assert_equal(6, tabpagenr('$'))
+
+  1tabonly!
+  new
+  only!
 endfunction
 
 func Test_tabnext_on_buf_unload1()