changeset 19950:9cbe3a4f1492 v8.2.0531

patch 8.2.0531: various errors not tested Commit: https://github.com/vim/vim/commit/476a613135bdc94e61c1dce8a9cbb4ab0b6dc2d1 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Apr 8 19:48:56 2020 +0200 patch 8.2.0531: various errors not tested Problem: Various errors not tested. Solution: Add tests. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5895)
author Bram Moolenaar <Bram@vim.org>
date Wed, 08 Apr 2020 20:00:04 +0200
parents 313b448185bc
children d98f73cfabfa
files src/testdir/test_search.vim src/testdir/test_source.vim src/testdir/test_syntax.vim src/testdir/test_user_func.vim src/testdir/test_vimscript.vim src/version.c
diffstat 6 files changed, 357 insertions(+), 160 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1543,4 +1543,39 @@ func Test_searchforward_var()
   close!
 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
--- a/src/testdir/test_source.vim
+++ b/src/testdir/test_source.vim
@@ -87,4 +87,10 @@ func Test_source_autocmd_sfile()
   call delete('Xscript.vim')
 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
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -332,6 +332,64 @@ func Test_syntax_invalid_arg()
   call assert_fails('syntax sync x', 'E404:')
   call assert_fails('syntax keyword Abc a[', 'E789:')
   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
 
 func Test_syn_sync()
--- a/src/testdir/test_user_func.vim
+++ b/src/testdir/test_user_func.vim
@@ -3,6 +3,9 @@
 " Also test that a builtin function cannot be replaced.
 " Also test for regression when calling arbitrary expression.
 
+source check.vim
+source shared.vim
+
 func Table(title, ...)
   let ret = a:title
   let idx = 1
@@ -83,6 +86,7 @@ func Test_user_func()
   normal o[(one again
   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_fails("call extend(g:, {'max': function('min')})", 'E704')
   call assert_equal(3, max([1, 2, 3]))
@@ -175,4 +179,256 @@ func Test_function_list()
   call assert_fails("function Xabc", 'E123:')
 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
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -1576,58 +1576,6 @@ func Test_bitwise_functions()
     call assert_fails("call invert({})", 'E728:')
 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
 func Test_user_command_with_bang()
     command -bang Nieuw let nieuw = 1
@@ -1637,26 +1585,6 @@ func Test_user_command_with_bang()
     delcommand Nieuw
 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()
   let lines =<< trim END
     func s:snr()
@@ -1888,84 +1816,6 @@ func Test_refcount()
     delfunc DictFunc
 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
 func Test_missing_end()
   call writefile(['if 2 > 1', 'echo ">"'], 'Xscript')
@@ -2098,16 +1948,6 @@ func Test_deep_nest()
   call delete('Xscript')
 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
 func Test_float_conversion_errors()
   if has('float')
--- 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 */
 /**/
+    531,
+/**/
     530,
 /**/
     529,