# HG changeset patch # User Bram Moolenaar # Date 1584390604 -3600 # Node ID 9199f34d838e57c71789aab1236eebd5138df729 # Parent ef2d704798bac5fb6f9e8c9ef1987628f76c7be1 patch 8.2.0396: cmdexpand.c insufficiently tested Commit: https://github.com/vim/vim/commit/24ebd83e030e1c6f9a6be1f06232756ba4d00a8c Author: Bram Moolenaar 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) diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- 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(": :|\"\\\"\", 'xt') + call assert_equal("\" :|\"\", @:) + + " completion for a range followed by a comment + call feedkeys(":1,2\"\\\"\", 'xt') + call assert_equal("\"1,2\"\", @:) + + " completion for :k command + call feedkeys(":ka\\\"\", 'xt') + call assert_equal("\"ka\", @:) + + " completion for short version of the :s command + call feedkeys(":sI \\\"\", 'xt') + call assert_equal("\"sI \", @:) + + " completion for :write command + call mkdir('Xdir') + call writefile(['one'], 'Xdir/Xfile1') + let save_cwd = getcwd() + cd Xdir + call feedkeys(":w >> \\\"\", '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\\\"\", 'xt') + call assert_equal("\"w !invalid_xyz_cmd", @:) + call feedkeys(":r !invalid_xyz_cmd\\\"\", 'xt') + call assert_equal("\"r !invalid_xyz_cmd", @:) + + " completion for :>> and :<< commands + call feedkeys(":>>>\\\"\", 'xt') + call assert_equal("\">>>\", @:) + call feedkeys(":<<<\\\"\", 'xt') + call assert_equal("\"<<<\", @:) + + " completion for command with +cmd argument + call feedkeys(":buffer +/pat Xabc\\\"\", 'xt') + call assert_equal("\"buffer +/pat Xabc", @:) + call feedkeys(":buffer +/pat\\\"\", 'xt') + call assert_equal("\"buffer +/pat\", @:) + + " completion for a command with a trailing comment + call feedkeys(":ls \" comment\\\"\", 'xt') + call assert_equal("\"ls \" comment\", @:) + + " completion for a command with a trailing command + call feedkeys(":ls | ls\\\"\", 'xt') + call assert_equal("\"ls | ls", @:) + + " completion for a command with an CTRL-V escaped argument + call feedkeys(":ls \\a\\\"\", 'xt') + call assert_equal("\"ls \a\", @:) + + " completion for a command that doesn't take additional arguments + call feedkeys(":all abc\\\"\", 'xt') + call assert_equal("\"all abc\", @:) + + " completion for a command with a command modifier + call feedkeys(":topleft new\\\"\", 'xt') + call assert_equal("\"topleft new", @:) + + " completion for the :match command + call feedkeys(":match Search /pat/\\\"\", 'xt') + call assert_equal("\"match Search /pat/\", @:) + + " completion for the :s command + call feedkeys(":s/from/to/g\\\"\", 'xt') + call assert_equal("\"s/from/to/g\", @:) + + " completion for the :dlist command + call feedkeys(":dlist 10 /pat/ a\\\"\", 'xt') + call assert_equal("\"dlist 10 /pat/ a\", @:) + + " completion for the :doautocmd command + call feedkeys(":doautocmd User MyCmd a.c\\\"\", 'xt') + call assert_equal("\"doautocmd User MyCmd a.c\", @:) + + " completion for the :augroup command + augroup XTest + augroup END + call feedkeys(":augroup X\\\"\", 'xt') + call assert_equal("\"augroup XTest", @:) + augroup! XTest + + " completion for the :unlet command + call feedkeys(":unlet one two\\\"\", 'xt') + call assert_equal("\"unlet one two", @:) + + " completion for the :bdelete command + call feedkeys(":bdel a b c\\\"\", 'xt') + call assert_equal("\"bdel a b c", @:) + + " completion for the :mapclear command + call feedkeys(":mapclear \\\"\", 'xt') + call assert_equal("\"mapclear ", @:) + + " completion for user defined commands with menu names + menu Test.foo :ls + com -nargs=* -complete=menu MyCmd + call feedkeys(":MyCmd Te\\\"\", 'xt') + call assert_equal('"MyCmd Test.', @:) + delcom MyCmd + unmenu Test + + " completion for user defined commands with mappings + mapclear + map :ls + com -nargs=* -complete=mapping MyCmd + call feedkeys(":MyCmd \\"\", 'xt') + call assert_equal('"MyCmd ', @:) + mapclear + delcom MyCmd + + " completion for :set path= with multiple backslashes + call feedkeys(":set path=a\\\\\\ b\\\"\", 'xt') + call assert_equal('"set path=a\\\ b', @:) + + " completion for :set dir= with a backslash + call feedkeys(":set dir=a\\ b\\\"\", 'xt') + call assert_equal('"set dir=a\ b', @:) + + " completion for the :py3 commands + call feedkeys(":py3\\\"\", 'xt') + call assert_equal('"py3 py3do py3file', @:) + + " redir @" is not the start of a comment. So complete after that + call feedkeys(":redir @\" | cwin\t\\"\", 'xt') + call assert_equal('"redir @" | cwindow', @:) + + " completion after a backtick + call feedkeys(":e `a1b2c\t\\"\", 'xt') + call assert_equal('"e `a1b2c', @:) + + " completion for the expression register + call feedkeys(":\"\=float2\t\"\\"\", '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 SaveScreenLine() @@ -1142,7 +1278,7 @@ func Test_wildmode() set wildmode=full,list let g:Sline = '' call feedkeys(":MyCmd \t\t\\\"\", '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\\\"\", '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\\"\", '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\\"\", '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\\\"\", 'xt') + call assert_equal('AA AAA AAAA', g:Sline) + call assert_equal('"b A', @:) + + %argdelete delcommand MyCmd delfunc T delfunc SaveScreenLine cunmap set wildmode& + %bwipe! endfunc " Test for interrupting the command-line completion diff --git a/src/testdir/test_taglist.vim b/src/testdir/test_taglist.vim --- 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 \\=Screenline(&lines - 1)\ : " + \ .. "\=Screenline(&lines - 2)\\\"\", '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 diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim --- 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\") sleep 100m - exe g:buf0 .. 'bwipe' + exe g:buf0 .. 'bwipe!' set hidden& endfunc diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim --- 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 \', '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 diff --git a/src/version.c b/src/version.c --- 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,