changeset 19679:9199f34d838e v8.2.0396

patch 8.2.0396: cmdexpand.c insufficiently tested Commit: https://github.com/vim/vim/commit/24ebd83e030e1c6f9a6be1f06232756ba4d00a8c Author: Bram Moolenaar <Bram@vim.org> Date: Mon Mar 16 21:25:24 2020 +0100 patch 8.2.0396: cmdexpand.c insufficiently tested Problem: Cmdexpand.c insufficiently tested. Solution: Add more tests. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5789)
author Bram Moolenaar <Bram@vim.org>
date Mon, 16 Mar 2020 21:30:04 +0100
parents ef2d704798ba
children 842f0a26377d
files src/testdir/test_cmdline.vim src/testdir/test_taglist.vim src/testdir/test_terminal.vim src/testdir/test_usercommands.vim src/version.c
diffstat 5 files changed, 197 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -2,6 +2,7 @@
 
 source check.vim
 source screendump.vim
+source view_util.vim
 
 func Test_complete_tab()
   call writefile(['testfile'], 'Xtestfile')
@@ -401,6 +402,7 @@ func Test_getcompletion()
   set tags&
 
   call assert_fails('call getcompletion("", "burp")', 'E475:')
+  call assert_fails('call getcompletion("abc", [])', 'E474:')
 endfunc
 
 func Test_shellcmd_completion()
@@ -641,6 +643,149 @@ func Test_cmdline_complete_env_variable(
   unlet $X_VIM_TEST_COMPLETE_ENV
 endfunc
 
+" Test for various command-line completion
+func Test_cmdline_complete_various()
+  " completion for a command starting with a comment
+  call feedkeys(": :|\"\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\" :|\"\<C-A>", @:)
+
+  " completion for a range followed by a comment
+  call feedkeys(":1,2\"\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"1,2\"\<C-A>", @:)
+
+  " completion for :k command
+  call feedkeys(":ka\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"ka\<C-A>", @:)
+
+  " completion for short version of the :s command
+  call feedkeys(":sI \<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"sI \<C-A>", @:)
+
+  " completion for :write command
+  call mkdir('Xdir')
+  call writefile(['one'], 'Xdir/Xfile1')
+  let save_cwd = getcwd()
+  cd Xdir
+  call feedkeys(":w >> \<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"w >> Xfile1", @:)
+  call chdir(save_cwd)
+  call delete('Xdir', 'rf')
+
+  " completion for :w ! and :r ! commands
+  call feedkeys(":w !invalid_xyz_cmd\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"w !invalid_xyz_cmd", @:)
+  call feedkeys(":r !invalid_xyz_cmd\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"r !invalid_xyz_cmd", @:)
+
+  " completion for :>> and :<< commands
+  call feedkeys(":>>>\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\">>>\<C-A>", @:)
+  call feedkeys(":<<<\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"<<<\<C-A>", @:)
+
+  " completion for command with +cmd argument
+  call feedkeys(":buffer +/pat Xabc\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"buffer +/pat Xabc", @:)
+  call feedkeys(":buffer +/pat\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"buffer +/pat\<C-A>", @:)
+
+  " completion for a command with a trailing comment
+  call feedkeys(":ls \" comment\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"ls \" comment\<C-A>", @:)
+
+  " completion for a command with a trailing command
+  call feedkeys(":ls | ls\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"ls | ls", @:)
+
+  " completion for a command with an CTRL-V escaped argument
+  call feedkeys(":ls \<C-V>\<C-V>a\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"ls \<C-V>a\<C-A>", @:)
+
+  " completion for a command that doesn't take additional arguments
+  call feedkeys(":all abc\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"all abc\<C-A>", @:)
+
+  " completion for a command with a command modifier
+  call feedkeys(":topleft new\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"topleft new", @:)
+
+  " completion for the :match command
+  call feedkeys(":match Search /pat/\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"match Search /pat/\<C-A>", @:)
+
+  " completion for the :s command
+  call feedkeys(":s/from/to/g\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"s/from/to/g\<C-A>", @:)
+
+  " completion for the :dlist command
+  call feedkeys(":dlist 10 /pat/ a\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"dlist 10 /pat/ a\<C-A>", @:)
+
+  " completion for the :doautocmd command
+  call feedkeys(":doautocmd User MyCmd a.c\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"doautocmd User MyCmd a.c\<C-A>", @:)
+
+  " completion for the :augroup command
+  augroup XTest
+  augroup END
+  call feedkeys(":augroup X\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"augroup XTest", @:)
+  augroup! XTest
+
+  " completion for the :unlet command
+  call feedkeys(":unlet one two\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"unlet one two", @:)
+
+  " completion for the :bdelete command
+  call feedkeys(":bdel a b c\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"bdel a b c", @:)
+
+  " completion for the :mapclear command
+  call feedkeys(":mapclear \<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"mapclear <buffer>", @:)
+
+  " completion for user defined commands with menu names
+  menu Test.foo :ls<CR>
+  com -nargs=* -complete=menu MyCmd
+  call feedkeys(":MyCmd Te\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"MyCmd Test.', @:)
+  delcom MyCmd
+  unmenu Test
+
+  " completion for user defined commands with mappings
+  mapclear
+  map <F3> :ls<CR>
+  com -nargs=* -complete=mapping MyCmd
+  call feedkeys(":MyCmd <F\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"MyCmd <F3>', @:)
+  mapclear
+  delcom MyCmd
+
+  " completion for :set path= with multiple backslashes
+  call feedkeys(":set path=a\\\\\\ b\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"set path=a\\\ b', @:)
+
+  " completion for :set dir= with a backslash
+  call feedkeys(":set dir=a\\ b\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"set dir=a\ b', @:)
+
+  " completion for the :py3 commands
+  call feedkeys(":py3\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"py3 py3do py3file', @:)
+
+  " redir @" is not the start of a comment. So complete after that
+  call feedkeys(":redir @\" | cwin\t\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"redir @" | cwindow', @:)
+
+  " completion after a backtick
+  call feedkeys(":e `a1b2c\t\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"e `a1b2c', @:)
+
+  " completion for the expression register
+  call feedkeys(":\"\<C-R>=float2\t\"\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"float2nr("', @=)
+endfunc
+
 func Test_cmdline_write_alternatefile()
   new
   call setline('.', ['one', 'two'])
@@ -1116,15 +1261,6 @@ func Test_cmdline_ctrl_g()
   close!
 endfunc
 
-" Return the 'len' characters in screen starting from (row,col)
-func s:ScreenLine(row, col, len)
-  let s = ''
-  for i in range(a:len)
-    let s .= nr2char(screenchar(a:row, a:col + i))
-  endfor
-  return s
-endfunc
-
 " Test for 'wildmode'
 func Test_wildmode()
   func T(a, c, p)
@@ -1133,7 +1269,7 @@ func Test_wildmode()
   command -nargs=1 -complete=custom,T MyCmd
 
   func SaveScreenLine()
-    let g:Sline = s:ScreenLine(&lines - 1, 1, 20)
+    let g:Sline = Screenline(&lines - 1)
     return ''
   endfunc
   cnoremap <expr> <F2> SaveScreenLine()
@@ -1142,7 +1278,7 @@ func Test_wildmode()
   set wildmode=full,list
   let g:Sline = ''
   call feedkeys(":MyCmd \t\t\<F2>\<C-B>\"\<CR>", 'xt')
-  call assert_equal('oneA  oneB  oneC    ', g:Sline)
+  call assert_equal('oneA  oneB  oneC', g:Sline)
   call assert_equal('"MyCmd oneA', @:)
 
   set wildmode=longest,full
@@ -1158,18 +1294,35 @@ func Test_wildmode()
   set wildmode=list:longest
   let g:Sline = ''
   call feedkeys(":MyCmd \t\<F2>\<C-B>\"\<CR>", 'xt')
-  call assert_equal('oneA  oneB  oneC    ', g:Sline)
+  call assert_equal('oneA  oneB  oneC', g:Sline)
   call assert_equal('"MyCmd one', @:)
 
   set wildmode=""
   call feedkeys(":MyCmd \t\t\<C-B>\"\<CR>", 'xt')
   call assert_equal('"MyCmd oneA', @:)
 
+  " Test for wildmode=longest with 'fileignorecase' set
+  set wildmode=longest
+  set fileignorecase
+  argadd AA AAA AAAA
+  call feedkeys(":buffer \t\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"buffer AA', @:)
+  set fileignorecase&
+
+  " Test for listing files with wildmode=list
+  set wildmode=list
+  let g:Sline = ''
+  call feedkeys(":b A\t\t\<F2>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('AA    AAA   AAAA', g:Sline)
+  call assert_equal('"b A', @:)
+
+  %argdelete
   delcommand MyCmd
   delfunc T
   delfunc SaveScreenLine
   cunmap <F2>
   set wildmode&
+  %bwipe!
 endfunc
 
 " Test for interrupting the command-line completion
--- a/src/testdir/test_taglist.vim
+++ b/src/testdir/test_taglist.vim
@@ -1,5 +1,7 @@
 " test taglist(), tagfiles() functions and :tags command
 
+source view_util.vim
+
 func Test_taglist()
   call writefile([
 	\ "FFoo\tXfoo\t1",
@@ -216,3 +218,21 @@ func Test_format_error()
   set tags&
   call delete('Xtags')
 endfunc
+
+" Test for :tag command completion with 'wildoptions' set to 'tagfile'
+func Test_tag_complete_wildoptions()
+  call writefile(["foo\ta.c\t10;\"\tf", "bar\tb.c\t20;\"\td"], 'Xtags')
+  set tags=Xtags
+  set wildoptions=tagfile
+
+  call feedkeys(":tag \<C-D>\<C-R>=Screenline(&lines - 1)\<CR> : "
+        \ .. "\<C-R>=Screenline(&lines - 2)\<CR>\<C-B>\"\<CR>", 'xt')
+
+  call assert_equal('"tag bar d b.c : foo f a.c', @:)
+
+  call delete('Xtags')
+  set wildoptions&
+  set tags&
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -2495,7 +2495,7 @@ func Test_term_nasty_callback()
 
   call term_sendkeys(g:buf0, "exit\<CR>")
   sleep 100m
-  exe g:buf0 .. 'bwipe'
+  exe g:buf0 .. 'bwipe!'
   set hidden&
 endfunc
 
--- a/src/testdir/test_usercommands.vim
+++ b/src/testdir/test_usercommands.vim
@@ -262,7 +262,7 @@ func CustomComplete(A, L, P)
 endfunc
 
 func CustomCompleteList(A, L, P)
-  return [ "Monday", "Tuesday", "Wednesday" ]
+  return [ "Monday", "Tuesday", "Wednesday", {}]
 endfunc
 
 func Test_CmdCompletion()
@@ -327,6 +327,12 @@ func Test_CmdCompletion()
 
   com! -complete=customlist,CustomComp DoCmd :
   call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E117:')
+
+  " custom completion without a function
+  com! -complete=custom, DoCmd
+  call assert_beeps("call feedkeys(':DoCmd \t', 'tx')")
+
+  delcom DoCmd
 endfunc
 
 func CallExecute(A, L, P)
@@ -542,3 +548,5 @@ func Test_command_list()
   call assert_equal("\nNo user-defined commands found", execute(':command Xxx'))
   call assert_equal("\nNo user-defined commands found", execute('command'))
 endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    396,
+/**/
     395,
 /**/
     394,