Patch 8.2.0531
Problem:    Various errors not tested.
Solution:   Add tests. (Yegappan Lakshmanan, closes #5895)
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


*** ../vim-8.2.0530/src/testdir/test_search.vim 2020-03-25 22:23:41.898363595 
+0100
--- src/testdir/test_search.vim 2020-04-08 19:46:57.216103999 +0200
***************
*** 1543,1546 ****
--- 1543,1581 ----
    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
*** ../vim-8.2.0530/src/testdir/test_source.vim 2020-02-17 21:33:26.270098788 
+0100
--- src/testdir/test_source.vim 2020-04-08 19:46:57.216103999 +0200
***************
*** 87,90 ****
--- 87,96 ----
    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
*** ../vim-8.2.0530/src/testdir/test_syntax.vim 2020-03-25 22:23:41.898363595 
+0100
--- src/testdir/test_syntax.vim 2020-04-08 19:46:57.220103987 +0200
***************
*** 332,337 ****
--- 332,395 ----
    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()
*** ../vim-8.2.0530/src/testdir/test_user_func.vim      2020-04-06 
21:35:02.464237765 +0200
--- src/testdir/test_user_func.vim      2020-04-08 19:46:57.220103987 +0200
***************
*** 3,8 ****
--- 3,11 ----
  " 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,88 ****
--- 86,92 ----
    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,178 ****
--- 179,434 ----
    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
*** ../vim-8.2.0530/src/testdir/test_vimscript.vim      2020-04-06 
21:35:02.464237765 +0200
--- src/testdir/test_vimscript.vim      2020-04-08 19:46:57.220103987 +0200
***************
*** 1576,1633 ****
      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
--- 1576,1581 ----
***************
*** 1637,1662 ****
      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()
--- 1585,1590 ----
***************
*** 1888,1971 ****
      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')
--- 1816,1821 ----
***************
*** 2098,2113 ****
    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')
--- 1948,1953 ----
*** ../vim-8.2.0530/src/version.c       2020-04-08 11:31:45.468620014 +0200
--- src/version.c       2020-04-08 19:48:44.743761404 +0200
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     531,
  /**/

-- 
"Software is like sex... it's better when it's free."
                -- Linus Torvalds, initiator of the free Linux OS
Makes me wonder what FSF stands for...?

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202004081749.038HnXZj009403%40masaka.moolenaar.net.

Raspunde prin e-mail lui