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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user