vim-patch:8.2.0293: various Ex commands not sufficiently tested

Problem:    Various Ex commands not sufficiently tested.
Solution:   Add more test cases. (Yegappan Lakshmanan, closes vim/vim#5673)
818fc9ad14

Needs to assert E170 instead of E580 because patch 8.2.3486 has been
ported but patch 8.2.1183 hasn't.
This commit is contained in:
zeertzjq
2022-07-12 14:45:36 +08:00
parent 01afd43bc9
commit 4aa4675fbf
12 changed files with 180 additions and 3 deletions

View File

@@ -520,8 +520,10 @@ func Test_quit_with_arglist()
throw 'Skipped: cannot run vim in terminal' throw 'Skipped: cannot run vim in terminal'
endif endif
let buf = RunVimInTerminal('', {'rows': 6}) let buf = RunVimInTerminal('', {'rows': 6})
call term_sendkeys(buf, ":set nomore\n")
call term_sendkeys(buf, ":args a b c\n") call term_sendkeys(buf, ":args a b c\n")
call term_sendkeys(buf, ":quit\n") call term_sendkeys(buf, ":quit\n")
call term_wait(buf)
call WaitForAssert({-> assert_match('^E173:', term_getline(buf, 6))}) call WaitForAssert({-> assert_match('^E173:', term_getline(buf, 6))})
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
@@ -530,14 +532,18 @@ func Test_quit_with_arglist()
call term_sendkeys(buf, ":set nomore\n") call term_sendkeys(buf, ":set nomore\n")
call term_sendkeys(buf, ":args a b c\n") call term_sendkeys(buf, ":args a b c\n")
call term_sendkeys(buf, ":confirm quit\n") call term_sendkeys(buf, ":confirm quit\n")
call term_wait(buf)
call WaitForAssert({-> assert_match('^\[Y\]es, (N)o: *$', call WaitForAssert({-> assert_match('^\[Y\]es, (N)o: *$',
\ term_getline(buf, 6))}) \ term_getline(buf, 6))})
call term_sendkeys(buf, "N") call term_sendkeys(buf, "N")
call term_wait(buf)
call term_sendkeys(buf, ":confirm quit\n") call term_sendkeys(buf, ":confirm quit\n")
call WaitForAssert({-> assert_match('^\[Y\]es, (N)o: *$', call WaitForAssert({-> assert_match('^\[Y\]es, (N)o: *$',
\ term_getline(buf, 6))}) \ term_getline(buf, 6))})
call term_sendkeys(buf, "Y") call term_sendkeys(buf, "Y")
call StopVimInTerminal(buf) call term_wait(buf)
call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))})
only!
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -1385,6 +1385,35 @@ func Test_cmdwin_tabpage()
tabclose! tabclose!
endfunc endfunc
" Test for the :! command
func Test_cmd_bang()
if !has('unix')
return
endif
let lines =<< trim [SCRIPT]
" Test for no previous command
call assert_fails('!!', 'E34:')
set nomore
" Test for cmdline expansion with :!
call setline(1, 'foo!')
silent !echo <cWORD> > Xfile.out
call assert_equal(['foo!'], readfile('Xfile.out'))
" Test for using previous command
silent !echo \! !
call assert_equal(['! echo foo!'], readfile('Xfile.out'))
call writefile(v:errors, 'Xresult')
call delete('Xfile.out')
qall!
[SCRIPT]
call writefile(lines, 'Xscript')
if RunVim([], [], '--clean -S Xscript')
call assert_equal([], readfile('Xresult'))
endif
call delete('Xscript')
call delete('Xresult')
endfunc
" Test error: "E135: *Filter* Autocommands must not change current buffer" " Test error: "E135: *Filter* Autocommands must not change current buffer"
func Test_cmd_bang_E135() func Test_cmd_bang_E135()
new new

View File

@@ -507,6 +507,42 @@ func Test_run_excmd_with_text_locked()
call assert_fails("call feedkeys(\":\<C-R>=execute('bnext')\<CR>\", 'xt')", 'E565:') call assert_fails("call feedkeys(\":\<C-R>=execute('bnext')\<CR>\", 'xt')", 'E565:')
endfunc endfunc
" Test for the :verbose command
func Test_verbose_cmd()
call assert_equal([' verbose=1'], split(execute('verbose set vbs'), "\n"))
call assert_equal([' verbose=0'], split(execute('0verbose set vbs'), "\n"))
let l = execute("4verbose set verbose | set verbose")
call assert_equal([' verbose=4', ' verbose=0'], split(l, "\n"))
endfunc
" Test for the :delete command and the related abbreviated commands
func Test_excmd_delete()
new
call setline(1, ['foo', "\tbar"])
call assert_equal(['^Ibar$'], split(execute('dl'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal(['^Ibar$'], split(execute('dell'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal(['^Ibar$'], split(execute('delel'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal(['^Ibar$'], split(execute('deletl'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal(['^Ibar$'], split(execute('deletel'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('dp'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('dep'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('delp'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('delep'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('deletp'), "\n"))
call setline(1, ['foo', "\tbar"])
call assert_equal([' bar'], split(execute('deletep'), "\n"))
close!
endfunc
func Test_not_break_expression_register() func Test_not_break_expression_register()
call setreg('=', '1+1') call setreg('=', '1+1')
if 0 if 0

View File

@@ -81,7 +81,11 @@ func Test_expandcmd()
call assert_fails('call expandcmd("make <afile>")', 'E495:') call assert_fails('call expandcmd("make <afile>")', 'E495:')
enew enew
call assert_fails('call expandcmd("make %")', 'E499:') call assert_fails('call expandcmd("make %")', 'E499:')
close let $FOO="blue\tsky"
call setline(1, "$FOO")
call assert_equal("grep pat blue\tsky", expandcmd('grep pat <cfile>'))
unlet $FOO
close!
endfunc endfunc
" Test for expanding <sfile>, <slnum> and <sflnum> outside of sourcing a script " Test for expanding <sfile>, <slnum> and <sflnum> outside of sourcing a script
@@ -108,5 +112,17 @@ func Test_source_sfile()
call delete('Xresult') call delete('Xresult')
endfunc endfunc
" Test for expanding filenames multiple times in a command line
func Test_expand_filename_multicmd()
edit foo
call setline(1, 'foo!')
new
call setline(1, 'foo!')
new <cword> | new <cWORD>
call assert_equal(4, winnr('$'))
call assert_equal('foo!', bufname(winbufnr(1)))
call assert_equal('foo', bufname(winbufnr(2)))
%bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -772,8 +772,12 @@ func Test_filetype_indent_off()
new Xtest.vim new Xtest.vim
filetype indent on filetype indent on
call assert_equal(1, g:did_indent_on) call assert_equal(1, g:did_indent_on)
call assert_equal(['filetype detection:ON plugin:OFF indent:ON'],
\ execute('filetype')->split("\n"))
filetype indent off filetype indent off
call assert_equal(0, exists('g:did_indent_on')) call assert_equal(0, exists('g:did_indent_on'))
call assert_equal(['filetype detection:ON plugin:OFF indent:OFF'],
\ execute('filetype')->split("\n"))
close close
endfunc endfunc

View File

@@ -45,6 +45,14 @@ func Test_filter_fails()
call assert_fails('filter /pat', 'E476:') call assert_fails('filter /pat', 'E476:')
call assert_fails('filter /pat/', 'E476:') call assert_fails('filter /pat/', 'E476:')
call assert_fails('filter /pat/ asdf', 'E492:') call assert_fails('filter /pat/ asdf', 'E492:')
" Using assert_fails() causes E476 instead of E866. So use a try-catch.
let caught_e866 = 0
try
filter /\@>b/ ls
catch /E866:/
let caught_e866 = 1
endtry
call assert_equal(1, caught_e866)
call assert_fails('filter!', 'E471:') call assert_fails('filter!', 'E471:')
call assert_fails('filter! pat', 'E476:') call assert_fails('filter! pat', 'E476:')

View File

@@ -66,6 +66,18 @@ func Test_global_print()
close! close!
endfunc endfunc
" Test for global command with newline character
func Test_global_newline()
new
call setline(1, ['foo'])
exe "g/foo/s/f/h/\<NL>s/o$/w/"
call assert_equal('how', getline(1))
call setline(1, ["foo\<NL>bar"])
exe "g/foo/s/foo\\\<NL>bar/xyz/"
call assert_equal('xyz', getline(1))
close!
endfunc
func Test_wrong_delimiter() func Test_wrong_delimiter()
call assert_fails('g x^bxd', 'E146:') call assert_fails('g x^bxd', 'E146:')
endfunc endfunc

View File

@@ -18,7 +18,7 @@ func Test_edit_bad()
e! ++enc=utf8 Xfile e! ++enc=utf8 Xfile
call assert_equal('[?][?][???][??]', getline(1)) call assert_equal('[?][?][???][??]', getline(1))
e! ++enc=utf8 ++bad=_ Xfile e! ++encoding=utf8 ++bad=_ Xfile
call assert_equal('[_][_][___][__]', getline(1)) call assert_equal('[_][_][___][__]', getline(1))
e! ++enc=utf8 ++bad=drop Xfile e! ++enc=utf8 ++bad=drop Xfile

View File

@@ -499,6 +499,7 @@ func Xtest_browse(cchar)
\ 'RegularLine2'] \ 'RegularLine2']
Xfirst Xfirst
call assert_fails('-5Xcc', 'E16:')
call assert_fails('Xprev', 'E553') call assert_fails('Xprev', 'E553')
call assert_fails('Xpfile', 'E553') call assert_fails('Xpfile', 'E553')
Xnfile Xnfile

View File

@@ -1996,6 +1996,47 @@ func Test_reload_in_try_catch()
call delete('Xreload') call delete('Xreload')
endfunc endfunc
" Test for errors with :catch, :throw, :finally {{{1
func Test_try_catch_errors()
call assert_fails('throw |', 'E471:')
call assert_fails("throw \n ", 'E471:')
call assert_fails('catch abc', 'E603:')
call assert_fails('try | let i = 1| finally | catch | endtry', 'E604:')
call assert_fails('finally', 'E606:')
call assert_fails('try | finally | finally | endtry', 'E607:')
" v8.2.3486 has been ported, but v8.2.1183 hasn't, so E170 appears here.
" call assert_fails('try | for i in range(5) | endif | endtry', 'E580:')
call assert_fails('try | for i in range(5) | endif | endtry', 'E170:')
call assert_fails('try | while v:true | endtry', 'E170:')
call assert_fails('try | if v:true | endtry', 'E171:')
endfunc
" Test for verbose messages with :try :catch, and :finally {{{1
func Test_try_catch_verbose()
" This test works only when the language is English
if v:lang != "C" && v:lang !~ '^[Ee]n'
return
endif
set verbose=14
redir => msg
try
echo i
catch /E121:/
finally
endtry
redir END
let expected = [
\ 'Exception thrown: Vim(echo):E121: Undefined variable: i',
\ '',
\ 'Exception caught: Vim(echo):E121: Undefined variable: i',
\ '',
\ 'Exception finished: Vim(echo):E121: Undefined variable: i'
\ ]
call assert_equal(expected, split(msg, "\n"))
set verbose&
endfunc
" Test for using throw in a called function with following error {{{1 " Test for using throw in a called function with following error {{{1
func Test_user_command_throw_in_function_call() func Test_user_command_throw_in_function_call()
let lines =<< trim END let lines =<< trim END

View File

@@ -1782,6 +1782,29 @@ func Test_missing_end()
call writefile(['try', 'echo "."'], 'Xscript') call writefile(['try', 'echo "."'], 'Xscript')
call assert_fails('source Xscript', 'E600:') call assert_fails('source Xscript', 'E600:')
call delete('Xscript') call delete('Xscript')
" Using endfor with :while
let caught_e732 = 0
try
while v:true
endfor
catch /E732:/
let caught_e732 = 1
endtry
call assert_equal(1, caught_e732)
" Using endwhile with :for
let caught_e733 = 0
try
for i in range(1)
endwhile
catch /E733:/
let caught_e733 = 1
endtry
call assert_equal(1, caught_e733)
" Missing 'in' in a :for statement
call assert_fails('for i range(1) | endfor', 'E690:')
endfunc endfunc
" Test for deep nesting of if/for/while/try statements {{{1 " Test for deep nesting of if/for/while/try statements {{{1

View File

@@ -238,6 +238,7 @@ describe('argument list commands', function()
end) end)
it('quitting Vim with unedited files in the argument list throws E173', function() it('quitting Vim with unedited files in the argument list throws E173', function()
command('set nomore')
command('args a b c') command('args a b c')
eq('Vim(quit):E173: 2 more files to edit', pcall_err(command, 'quit')) eq('Vim(quit):E173: 2 more files to edit', pcall_err(command, 'quit'))
end) end)