mirror of
https://github.com/vim/vim.git
synced 2025-10-04 05:25:06 -04:00
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 #5673)
This commit is contained in:
@@ -515,8 +515,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)
|
||||||
|
|
||||||
@@ -525,14 +527,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
|
||||||
|
@@ -977,4 +977,33 @@ func Test_cmd_backtick()
|
|||||||
%argd
|
%argd
|
||||||
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
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -111,11 +111,14 @@ func Test_open_command()
|
|||||||
close!
|
close!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_Ex_feedkeys()
|
" Test for :g/pat/visual to run vi commands in Ex mode
|
||||||
" this doesn't do anything useful, just check it doesn't hang
|
" This used to hang Vim before 8.2.0274.
|
||||||
|
func Test_Ex_global()
|
||||||
new
|
new
|
||||||
call setline(1, ["foo"])
|
call setline(1, ['', 'foo', 'bar', 'foo', 'bar', 'foo'])
|
||||||
call feedkeys("Qg/foo/visual\<CR>", "xt")
|
call feedkeys("Qg/bar/visual\<CR>$rxQ$ryQvisual\<CR>j", "xt")
|
||||||
|
call assert_equal('bax', getline(3))
|
||||||
|
call assert_equal('bay', getline(5))
|
||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@@ -349,6 +349,44 @@ func Test_run_excmd_with_text_locked()
|
|||||||
let cmd = ":\<C-\>eexecute('close')\<CR>\<C-C>"
|
let cmd = ":\<C-\>eexecute('close')\<CR>\<C-C>"
|
||||||
call assert_equal(2, winnr('$'))
|
call assert_equal(2, winnr('$'))
|
||||||
close
|
close
|
||||||
|
|
||||||
|
call assert_fails("call feedkeys(\":\<C-R>=execute('bnext')\<CR>\", 'xt')", 'E523:')
|
||||||
|
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
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -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
|
||||||
|
@@ -637,8 +637,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
|
||||||
|
|
||||||
|
@@ -47,6 +47,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:')
|
||||||
|
@@ -55,4 +55,16 @@ 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
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -2721,3 +2721,13 @@ func Test_normal_cpo_minus()
|
|||||||
let &cpo = save_cpo
|
let &cpo = save_cpo
|
||||||
close!
|
close!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for using : to run a multi-line Ex command in operator pending mode
|
||||||
|
func Test_normal_yank_with_excmd()
|
||||||
|
new
|
||||||
|
call setline(1, ['foo', 'bar', 'baz'])
|
||||||
|
let @a = ''
|
||||||
|
call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
|
||||||
|
call assert_equal('f', @a)
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
@@ -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
|
||||||
|
@@ -484,6 +484,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
|
||||||
|
@@ -1996,5 +1996,44 @@ 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:')
|
||||||
|
call assert_fails('try | for i in range(5) | endif | endtry', 'E580:')
|
||||||
|
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
|
||||||
|
|
||||||
" Modeline {{{1
|
" Modeline {{{1
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -1970,6 +1970,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
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
293,
|
||||||
/**/
|
/**/
|
||||||
292,
|
292,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user