1
0
forked from aniani/vim

patch 8.2.0531: various errors not tested

Problem:    Various errors not tested.
Solution:   Add tests. (Yegappan Lakshmanan, closes #5895)
This commit is contained in:
Bram Moolenaar
2020-04-08 19:48:56 +02:00
parent a65c288134
commit 476a613135
6 changed files with 357 additions and 160 deletions

View File

@@ -1543,4 +1543,39 @@ func Test_searchforward_var()
close! close!
endfunc endfunc
" Test for invalid regular expressions
func Test_invalid_regexp()
set regexpengine=1
call assert_fails("call search(repeat('\\(.\\)', 10))", 'E51:')
call assert_fails("call search('a\\+*')", 'E61:')
call assert_fails("call search('x\\@#')", 'E59:')
call assert_fails("call search('\\_m')", 'E63:')
call assert_fails("call search('\\+')", 'E64:')
call assert_fails("call search('\\1')", 'E65:')
call assert_fails("call search('\\z\\(\\)')", 'E66:')
call assert_fails("call search('\\z2')", 'E67:')
call assert_fails("call search('\\zx')", 'E68:')
call assert_fails("call search('\\%[ab')", 'E69:')
call assert_fails("call search('\\%[]')", 'E70:')
call assert_fails("call search('\\%a')", 'E71:')
call assert_fails("call search('ab\\%[\\(cd\\)]')", 'E369:')
call assert_fails("call search('ab\\%[\\%(cd\\)]')", 'E369:')
set regexpengine=2
call assert_fails("call search('\\_')", 'E865:')
call assert_fails("call search('\\+')", 'E866:')
call assert_fails("call search('\\zx')", 'E867:')
call assert_fails("call search('\\%a')", 'E867:')
call assert_fails("call search('x\\@#')", 'E869:')
call assert_fails("call search(repeat('\\(.\\)', 10))", 'E872:')
call assert_fails("call search('\\_m')", 'E877:')
call assert_fails("call search('\\%(')", 'E53:')
call assert_fails("call search('\\(')", 'E54:')
call assert_fails("call search('\\)')", 'E55:')
call assert_fails("call search('\\z\\(\\)')", 'E66:')
call assert_fails("call search('\\%[ab')", 'E69:')
call assert_fails("call search('\\%9999999999999999999999999999v')", 'E951:')
set regexpengine&
call assert_fails("call search('\\%#=3ab')", 'E864:')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -87,4 +87,10 @@ func Test_source_autocmd_sfile()
call delete('Xscript.vim') call delete('Xscript.vim')
endfunc endfunc
func Test_source_error()
call assert_fails('scriptencoding utf-8', 'E167:')
call assert_fails('finish', 'E168:')
call assert_fails('scriptversion 2', 'E984:')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -332,6 +332,64 @@ func Test_syntax_invalid_arg()
call assert_fails('syntax sync x', 'E404:') call assert_fails('syntax sync x', 'E404:')
call assert_fails('syntax keyword Abc a[', 'E789:') call assert_fails('syntax keyword Abc a[', 'E789:')
call assert_fails('syntax keyword Abc a[bc]d', 'E890:') call assert_fails('syntax keyword Abc a[bc]d', 'E890:')
let caught_393 = 0
try
syntax keyword cMyItem grouphere G1
catch /E393:/
let caught_393 = 1
endtry
call assert_equal(1, caught_393)
let caught_394 = 0
try
syntax sync match Abc grouphere MyItem "abc"'
catch /E394:/
let caught_394 = 1
endtry
call assert_equal(1, caught_394)
" Test for too many \z\( and unmatched \z\(
" Not able to use assert_fails() here because both E50:/E879: and E475:
" messages are emitted.
set regexpengine=1
let caught_52 = 0
try
syntax region MyRegion start='\z\(' end='\*/'
catch /E52:/
let caught_52 = 1
endtry
call assert_equal(1, caught_52)
let caught_50 = 0
try
let cmd = "syntax region MyRegion start='"
let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'"
exe cmd
catch /E50:/
let caught_50 = 1
endtry
call assert_equal(1, caught_50)
set regexpengine=2
let caught_54 = 0
try
syntax region MyRegion start='\z\(' end='\*/'
catch /E54:/
let caught_54 = 1
endtry
call assert_equal(1, caught_54)
let caught_879 = 0
try
let cmd = "syntax region MyRegion start='"
let cmd ..= repeat("\\z\\(.\\)", 10) .. "' end='\*/'"
exe cmd
catch /E879:/
let caught_879 = 1
endtry
call assert_equal(1, caught_879)
set regexpengine&
endfunc endfunc
func Test_syn_sync() func Test_syn_sync()

View File

@@ -3,6 +3,9 @@
" Also test that a builtin function cannot be replaced. " Also test that a builtin function cannot be replaced.
" Also test for regression when calling arbitrary expression. " Also test for regression when calling arbitrary expression.
source check.vim
source shared.vim
func Table(title, ...) func Table(title, ...)
let ret = a:title let ret = a:title
let idx = 1 let idx = 1
@@ -83,6 +86,7 @@ func Test_user_func()
normal o[(one again normal o[(one again
call assert_equal('1. one again', getline('.')) call assert_equal('1. one again', getline('.'))
" Try to overwrite a function in the global (g:) scope
call assert_equal(3, max([1, 2, 3])) call assert_equal(3, max([1, 2, 3]))
call assert_fails("call extend(g:, {'max': function('min')})", 'E704') call assert_fails("call extend(g:, {'max': function('min')})", 'E704')
call assert_equal(3, max([1, 2, 3])) call assert_equal(3, max([1, 2, 3]))
@@ -175,4 +179,256 @@ func Test_function_list()
call assert_fails("function Xabc", 'E123:') call assert_fails("function Xabc", 'E123:')
endfunc endfunc
" Test for <sfile>, <slnum> in a function
func Test_sfile_in_function()
func Xfunc()
call assert_match('..Test_sfile_in_function\[5]..Xfunc', expand('<sfile>'))
call assert_equal('2', expand('<slnum>'))
endfunc
call Xfunc()
delfunc Xfunc
endfunc
" Test trailing text after :endfunction {{{1
func Test_endfunction_trailing()
call assert_false(exists('*Xtest'))
exe "func Xtest()\necho 'hello'\nendfunc\nlet done = 'yes'"
call assert_true(exists('*Xtest'))
call assert_equal('yes', done)
delfunc Xtest
unlet done
exe "func Xtest()\necho 'hello'\nendfunc|let done = 'yes'"
call assert_true(exists('*Xtest'))
call assert_equal('yes', done)
delfunc Xtest
unlet done
" trailing line break
exe "func Xtest()\necho 'hello'\nendfunc\n"
call assert_true(exists('*Xtest'))
delfunc Xtest
set verbose=1
exe "func Xtest()\necho 'hello'\nendfunc \" garbage"
call assert_notmatch('W22:', split(execute('1messages'), "\n")[0])
call assert_true(exists('*Xtest'))
delfunc Xtest
exe "func Xtest()\necho 'hello'\nendfunc garbage"
call assert_match('W22:', split(execute('1messages'), "\n")[0])
call assert_true(exists('*Xtest'))
delfunc Xtest
set verbose=0
function Foo()
echo 'hello'
endfunction | echo 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
delfunc Foo
endfunc
func Test_delfunction_force()
delfunc! Xtest
delfunc! Xtest
func Xtest()
echo 'nothing'
endfunc
delfunc! Xtest
delfunc! Xtest
" Try deleting the current function
call assert_fails('delfunc Test_delfunction_force', 'E131:')
endfunc
func Test_function_defined_line()
CheckNotGui
let lines =<< trim [CODE]
" F1
func F1()
" F2
func F2()
"
"
"
return
endfunc
" F3
execute "func F3()\n\n\n\nreturn\nendfunc"
" F4
execute "func F4()\n
\\n
\\n
\\n
\return\n
\endfunc"
endfunc
" F5
execute "func F5()\n\n\n\nreturn\nendfunc"
" F6
execute "func F6()\n
\\n
\\n
\\n
\return\n
\endfunc"
call F1()
verbose func F1
verbose func F2
verbose func F3
verbose func F4
verbose func F5
verbose func F6
qall!
[CODE]
call writefile(lines, 'Xtest.vim')
let res = system(GetVimCommandClean() .. ' -es -X -S Xtest.vim')
call assert_equal(0, v:shell_error)
let m = matchstr(res, 'function F1()[^[:print:]]*[[:print:]]*')
call assert_match(' line 2$', m)
let m = matchstr(res, 'function F2()[^[:print:]]*[[:print:]]*')
call assert_match(' line 4$', m)
let m = matchstr(res, 'function F3()[^[:print:]]*[[:print:]]*')
call assert_match(' line 11$', m)
let m = matchstr(res, 'function F4()[^[:print:]]*[[:print:]]*')
call assert_match(' line 13$', m)
let m = matchstr(res, 'function F5()[^[:print:]]*[[:print:]]*')
call assert_match(' line 21$', m)
let m = matchstr(res, 'function F6()[^[:print:]]*[[:print:]]*')
call assert_match(' line 23$', m)
call delete('Xtest.vim')
endfunc
" Test for defining a function reference in the global scope
func Test_add_funcref_to_global_scope()
let x = g:
let caught_E862 = 0
try
func x.Xfunc()
return 1
endfunc
catch /E862:/
let caught_E862 = 1
endtry
call assert_equal(1, caught_E862)
endfunc
func Test_funccall_garbage_collect()
func Func(x, ...)
call add(a:x, a:000)
endfunc
call Func([], [])
" Must not crash cause by invalid freeing
call test_garbagecollect_now()
call assert_true(v:true)
delfunc Func
endfunc
" Test for script-local function
func <SID>DoLast()
call append(line('$'), "last line")
endfunc
func s:DoNothing()
call append(line('$'), "nothing line")
endfunc
func Test_script_local_func()
set nocp nomore viminfo+=nviminfo
new
nnoremap <buffer> _x :call <SID>DoNothing()<bar>call <SID>DoLast()<bar>delfunc <SID>DoNothing<bar>delfunc <SID>DoLast<cr>
normal _x
call assert_equal('nothing line', getline(2))
call assert_equal('last line', getline(3))
close!
" Try to call a script local function in global scope
let lines =<< trim [CODE]
:call assert_fails('call s:Xfunc()', 'E81:')
:call assert_fails('let x = call("<SID>Xfunc", [])', 'E120:')
:call writefile(v:errors, 'Xresult')
:qall
[CODE]
call writefile(lines, 'Xscript')
if RunVim([], [], '-s Xscript')
call assert_equal([], readfile('Xresult'))
endif
call delete('Xresult')
call delete('Xscript')
endfunc
" Test for errors in defining new functions
func Test_func_def_error()
call assert_fails('func Xfunc abc ()', 'E124:')
call assert_fails('func Xfunc(', 'E125:')
call assert_fails('func xfunc()', 'E128:')
" Try to redefine a function that is in use
let caught_E127 = 0
try
func! Test_func_def_error()
endfunc
catch /E127:/
let caught_E127 = 1
endtry
call assert_equal(1, caught_E127)
" Try to define a function in a dict twice
let d = {}
let lines =<< trim END
func d.F1()
return 1
endfunc
END
let l = join(lines, "\n") . "\n"
exe l
call assert_fails('exe l', 'E717:')
" Define an autoload function with an incorrect file name
call writefile(['func foo#Bar()', 'return 1', 'endfunc'], 'Xscript')
call assert_fails('source Xscript', 'E746:')
call delete('Xscript')
endfunc
" Test for deleting a function
func Test_del_func()
call assert_fails('delfunction Xabc', 'E130:')
let d = {'a' : 10}
call assert_fails('delfunc d.a', 'E718:')
endfunc
" Test for calling return outside of a function
func Test_return_outside_func()
call writefile(['return 10'], 'Xscript')
call assert_fails('source Xscript', 'E133:')
call delete('Xscript')
endfunc
" Test for errors in calling a function
func Test_func_arg_error()
" Too many arguments
call assert_fails("call call('min', range(1,20))", 'E118:')
call assert_fails("call call('min', range(1,21))", 'E699:')
call assert_fails('echo min(0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,0,1)',
\ 'E740:')
" Missing dict argument
func Xfunc() dict
return 1
endfunc
call assert_fails('call Xfunc()', 'E725:')
delfunc Xfunc
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -1576,58 +1576,6 @@ func Test_bitwise_functions()
call assert_fails("call invert({})", 'E728:') call assert_fails("call invert({})", 'E728:')
endfunc endfunc
" Test trailing text after :endfunction {{{1
func Test_endfunction_trailing()
call assert_false(exists('*Xtest'))
exe "func Xtest()\necho 'hello'\nendfunc\nlet done = 'yes'"
call assert_true(exists('*Xtest'))
call assert_equal('yes', done)
delfunc Xtest
unlet done
exe "func Xtest()\necho 'hello'\nendfunc|let done = 'yes'"
call assert_true(exists('*Xtest'))
call assert_equal('yes', done)
delfunc Xtest
unlet done
" trailing line break
exe "func Xtest()\necho 'hello'\nendfunc\n"
call assert_true(exists('*Xtest'))
delfunc Xtest
set verbose=1
exe "func Xtest()\necho 'hello'\nendfunc \" garbage"
call assert_notmatch('W22:', split(execute('1messages'), "\n")[0])
call assert_true(exists('*Xtest'))
delfunc Xtest
exe "func Xtest()\necho 'hello'\nendfunc garbage"
call assert_match('W22:', split(execute('1messages'), "\n")[0])
call assert_true(exists('*Xtest'))
delfunc Xtest
set verbose=0
function Foo()
echo 'hello'
endfunction | echo 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
delfunc Foo
endfunc
func Test_delfunction_force()
delfunc! Xtest
delfunc! Xtest
func Xtest()
echo 'nothing'
endfunc
delfunc! Xtest
delfunc! Xtest
" Try deleting the current function
call assert_fails('delfunc Test_delfunction_force', 'E131:')
endfunc
" Test using bang after user command {{{1 " Test using bang after user command {{{1
func Test_user_command_with_bang() func Test_user_command_with_bang()
command -bang Nieuw let nieuw = 1 command -bang Nieuw let nieuw = 1
@@ -1637,26 +1585,6 @@ func Test_user_command_with_bang()
delcommand Nieuw delcommand Nieuw
endfunc endfunc
" Test for script-local function
func <SID>DoLast()
call append(line('$'), "last line")
endfunc
func s:DoNothing()
call append(line('$'), "nothing line")
endfunc
func Test_script_local_func()
set nocp nomore viminfo+=nviminfo
new
nnoremap <buffer> _x :call <SID>DoNothing()<bar>call <SID>DoLast()<bar>delfunc <SID>DoNothing<bar>delfunc <SID>DoLast<cr>
normal _x
call assert_equal('nothing line', getline(2))
call assert_equal('last line', getline(3))
enew! | close
endfunc
func Test_script_expand_sfile() func Test_script_expand_sfile()
let lines =<< trim END let lines =<< trim END
func s:snr() func s:snr()
@@ -1888,84 +1816,6 @@ func Test_refcount()
delfunc DictFunc delfunc DictFunc
endfunc endfunc
func Test_funccall_garbage_collect()
func Func(x, ...)
call add(a:x, a:000)
endfunc
call Func([], [])
" Must not crash cause by invalid freeing
call test_garbagecollect_now()
call assert_true(v:true)
delfunc Func
endfunc
func Test_function_defined_line()
CheckNotGui
let lines =<< trim [CODE]
" F1
func F1()
" F2
func F2()
"
"
"
return
endfunc
" F3
execute "func F3()\n\n\n\nreturn\nendfunc"
" F4
execute "func F4()\n
\\n
\\n
\\n
\return\n
\endfunc"
endfunc
" F5
execute "func F5()\n\n\n\nreturn\nendfunc"
" F6
execute "func F6()\n
\\n
\\n
\\n
\return\n
\endfunc"
call F1()
verbose func F1
verbose func F2
verbose func F3
verbose func F4
verbose func F5
verbose func F6
qall!
[CODE]
call writefile(lines, 'Xtest.vim')
let res = system(GetVimCommandClean() .. ' -es -X -S Xtest.vim')
call assert_equal(0, v:shell_error)
let m = matchstr(res, 'function F1()[^[:print:]]*[[:print:]]*')
call assert_match(' line 2$', m)
let m = matchstr(res, 'function F2()[^[:print:]]*[[:print:]]*')
call assert_match(' line 4$', m)
let m = matchstr(res, 'function F3()[^[:print:]]*[[:print:]]*')
call assert_match(' line 11$', m)
let m = matchstr(res, 'function F4()[^[:print:]]*[[:print:]]*')
call assert_match(' line 13$', m)
let m = matchstr(res, 'function F5()[^[:print:]]*[[:print:]]*')
call assert_match(' line 21$', m)
let m = matchstr(res, 'function F6()[^[:print:]]*[[:print:]]*')
call assert_match(' line 23$', m)
call delete('Xtest.vim')
endfunc
" Test for missing :endif, :endfor, :endwhile and :endtry {{{1 " Test for missing :endif, :endfor, :endwhile and :endtry {{{1
func Test_missing_end() func Test_missing_end()
call writefile(['if 2 > 1', 'echo ">"'], 'Xscript') call writefile(['if 2 > 1', 'echo ">"'], 'Xscript')
@@ -2098,16 +1948,6 @@ func Test_deep_nest()
call delete('Xscript') call delete('Xscript')
endfunc endfunc
" Test for <sfile>, <slnum> in a function {{{1
func Test_sfile_in_function()
func Xfunc()
call assert_match('..Test_sfile_in_function\[5]..Xfunc', expand('<sfile>'))
call assert_equal('2', expand('<slnum>'))
endfunc
call Xfunc()
delfunc Xfunc
endfunc
" Test for errors in converting to float from various types {{{1 " Test for errors in converting to float from various types {{{1
func Test_float_conversion_errors() func Test_float_conversion_errors()
if has('float') if has('float')

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 */
/**/
531,
/**/ /**/
530, 530,
/**/ /**/