0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.2.0396: cmdexpand.c insufficiently tested

Problem:    Cmdexpand.c insufficiently tested.
Solution:   Add more tests. (Yegappan Lakshmanan, closes #5789)
This commit is contained in:
Bram Moolenaar
2020-03-16 21:25:24 +01:00
parent a2cbdea968
commit 24ebd83e03
5 changed files with 197 additions and 14 deletions

View File

@@ -2,6 +2,7 @@
source check.vim source check.vim
source screendump.vim source screendump.vim
source view_util.vim
func Test_complete_tab() func Test_complete_tab()
call writefile(['testfile'], 'Xtestfile') call writefile(['testfile'], 'Xtestfile')
@@ -401,6 +402,7 @@ func Test_getcompletion()
set tags& set tags&
call assert_fails('call getcompletion("", "burp")', 'E475:') call assert_fails('call getcompletion("", "burp")', 'E475:')
call assert_fails('call getcompletion("abc", [])', 'E474:')
endfunc endfunc
func Test_shellcmd_completion() func Test_shellcmd_completion()
@@ -641,6 +643,149 @@ func Test_cmdline_complete_env_variable()
unlet $X_VIM_TEST_COMPLETE_ENV unlet $X_VIM_TEST_COMPLETE_ENV
endfunc 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() func Test_cmdline_write_alternatefile()
new new
call setline('.', ['one', 'two']) call setline('.', ['one', 'two'])
@@ -1116,15 +1261,6 @@ func Test_cmdline_ctrl_g()
close! close!
endfunc 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' " Test for 'wildmode'
func Test_wildmode() func Test_wildmode()
func T(a, c, p) func T(a, c, p)
@@ -1133,7 +1269,7 @@ func Test_wildmode()
command -nargs=1 -complete=custom,T MyCmd command -nargs=1 -complete=custom,T MyCmd
func SaveScreenLine() func SaveScreenLine()
let g:Sline = s:ScreenLine(&lines - 1, 1, 20) let g:Sline = Screenline(&lines - 1)
return '' return ''
endfunc endfunc
cnoremap <expr> <F2> SaveScreenLine() cnoremap <expr> <F2> SaveScreenLine()
@@ -1165,11 +1301,28 @@ func Test_wildmode()
call feedkeys(":MyCmd \t\t\<C-B>\"\<CR>", 'xt') call feedkeys(":MyCmd \t\t\<C-B>\"\<CR>", 'xt')
call assert_equal('"MyCmd oneA', @:) 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 delcommand MyCmd
delfunc T delfunc T
delfunc SaveScreenLine delfunc SaveScreenLine
cunmap <F2> cunmap <F2>
set wildmode& set wildmode&
%bwipe!
endfunc endfunc
" Test for interrupting the command-line completion " Test for interrupting the command-line completion

View File

@@ -1,5 +1,7 @@
" test taglist(), tagfiles() functions and :tags command " test taglist(), tagfiles() functions and :tags command
source view_util.vim
func Test_taglist() func Test_taglist()
call writefile([ call writefile([
\ "FFoo\tXfoo\t1", \ "FFoo\tXfoo\t1",
@@ -216,3 +218,21 @@ func Test_format_error()
set tags& set tags&
call delete('Xtags') call delete('Xtags')
endfunc 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

View File

@@ -2495,7 +2495,7 @@ func Test_term_nasty_callback()
call term_sendkeys(g:buf0, "exit\<CR>") call term_sendkeys(g:buf0, "exit\<CR>")
sleep 100m sleep 100m
exe g:buf0 .. 'bwipe' exe g:buf0 .. 'bwipe!'
set hidden& set hidden&
endfunc endfunc

View File

@@ -262,7 +262,7 @@ func CustomComplete(A, L, P)
endfunc endfunc
func CustomCompleteList(A, L, P) func CustomCompleteList(A, L, P)
return [ "Monday", "Tuesday", "Wednesday" ] return [ "Monday", "Tuesday", "Wednesday", {}]
endfunc endfunc
func Test_CmdCompletion() func Test_CmdCompletion()
@@ -327,6 +327,12 @@ func Test_CmdCompletion()
com! -complete=customlist,CustomComp DoCmd : com! -complete=customlist,CustomComp DoCmd :
call assert_fails("call feedkeys(':DoCmd \<C-D>', 'tx')", 'E117:') 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 endfunc
func CallExecute(A, L, P) 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 Xxx'))
call assert_equal("\nNo user-defined commands found", execute('command')) call assert_equal("\nNo user-defined commands found", execute('command'))
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
396,
/**/ /**/
395, 395,
/**/ /**/