Patch 8.2.0401
Problem:    Not enough test coverage for evalvars.c.
Solution:   Add more tests. (Yegappan Lakshmanan, closes #5804)
Files:      src/testdir/test_cmdline.vim, src/testdir/test_const.vim,
            src/testdir/test_diffmode.vim, src/testdir/test_excmd.vim,
            src/testdir/test_functions.vim, src/testdir/test_let.vim,
            src/testdir/test_listdict.vim, src/testdir/test_spell.vim,
            src/testdir/test_unlet.vim, src/testdir/test_user_func.vim,
            src/testdir/test_vimscript.vim


*** ../vim-8.2.0400/src/testdir/test_cmdline.vim        2020-03-16 
21:25:16.998615353 +0100
--- src/testdir/test_cmdline.vim        2020-03-18 19:29:48.210936583 +0100
***************
*** 784,789 ****
--- 784,823 ----
    " completion for the expression register
    call feedkeys(":\"\<C-R>=float2\t\"\<C-B>\"\<CR>", 'xt')
    call assert_equal('"float2nr("', @=)
+ 
+   " completion for :language command with an invalid argument
+   call feedkeys(":language dummy \t\<C-B>\"\<CR>", 'xt')
+   call assert_equal("\"language dummy \t", @:)
+ 
+   " completion for commands after a :global command
+   call feedkeys(":g/a\\xb/call float2\t\<C-B>\"\<CR>", 'xt')
+   call assert_equal('"g/a\xb/call float2nr(', @:)
+ 
+   " completion with ambiguous user defined commands
+   com TCmd1 echo 'TCmd1'
+   com TCmd2 echo 'TCmd2'
+   call feedkeys(":TCmd \t\<C-B>\"\<CR>", 'xt')
+   call assert_equal('"TCmd ', @:)
+   delcom TCmd1
+   delcom TCmd2
+ 
+   " completion after a range followed by a pipe (|) character
+   call feedkeys(":1,10 | chist\t\<C-B>\"\<CR>", 'xt')
+   call assert_equal('"1,10 | chistory', @:)
+ 
+   " completion for window local variables
+   let w:wvar1 = 10
+   let w:wvar2 = 10
+   call feedkeys(":echo w:wvar\<C-A>\<C-B>\"\<CR>", 'xt')
+   call assert_equal('"echo w:wvar1 w:wvar2', @:)
+   unlet w:wvar1 w:wvar2
+ 
+   " completion for tab local variables
+   let t:tvar1 = 10
+   let t:tvar2 = 10
+   call feedkeys(":echo t:tvar\<C-A>\<C-B>\"\<CR>", 'xt')
+   call assert_equal('"echo t:tvar1 t:tvar2', @:)
+   unlet t:tvar1 t:tvar2
  endfunc
  
  func Test_cmdline_write_alternatefile()
***************
*** 1304,1319 ****
    " Test for wildmode=longest with 'fileignorecase' set
    set wildmode=longest
    set fileignorecase
!   argadd AA AAA AAAA
!   call feedkeys(":buffer \t\<C-B>\"\<CR>", 'xt')
!   call assert_equal('"buffer AA', @:)
    set fileignorecase&
  
    " Test for listing files with wildmode=list
    set wildmode=list
    let g:Sline = ''
    call feedkeys(":b A\t\t\<F2>\<C-B>\"\<CR>", 'xt')
!   call assert_equal('AA    AAA   AAAA', g:Sline)
    call assert_equal('"b A', @:)
  
    %argdelete
--- 1338,1353 ----
    " Test for wildmode=longest with 'fileignorecase' set
    set wildmode=longest
    set fileignorecase
!   argadd AAA AAAA AAAAA
!   call feedkeys(":buffer a\t\<C-B>\"\<CR>", 'xt')
!   call assert_equal('"buffer AAA', @:)
    set fileignorecase&
  
    " Test for listing files with wildmode=list
    set wildmode=list
    let g:Sline = ''
    call feedkeys(":b A\t\t\<F2>\<C-B>\"\<CR>", 'xt')
!   call assert_equal('AAA    AAAA   AAAAA', g:Sline)
    call assert_equal('"b A', @:)
  
    %argdelete
*** ../vim-8.2.0400/src/testdir/test_const.vim  2019-11-26 16:59:34.000000000 
+0100
--- src/testdir/test_const.vim  2020-03-18 19:29:48.210936583 +0100
***************
*** 251,256 ****
--- 251,264 ----
      call assert_fails('const &filetype = "vim"', 'E996:')
      call assert_fails('const &l:filetype = "vim"', 'E996:')
      call assert_fails('const &g:encoding = "utf-8"', 'E996:')
+ 
+     call assert_fails('const [a, $CONST_FOO] = [369, "abc"]', 'E996:')
+     call assert_equal(369, a)
+     call assert_equal(v:null, getenv("CONST_FOO"))
+ 
+     call assert_fails('const [b; $CONST_FOO] = [246, 2, "abc"]', 'E996:')
+     call assert_equal(246, b)
+     call assert_equal(v:null, getenv("CONST_FOO"))
  endfunc
  
  func Test_const_with_eval_name()
***************
*** 276,278 ****
--- 284,288 ----
      let d['bar'] = 'hello'
      let d.foo = 44
  endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0400/src/testdir/test_diffmode.vim       2019-12-30 
21:58:58.359667037 +0100
--- src/testdir/test_diffmode.vim       2020-03-18 19:29:48.210936583 +0100
***************
*** 1065,1067 ****
--- 1065,1096 ----
    bwipe!
    bwipe!
  endfunc
+ 
+ " Test for 'patchexpr'
+ func Test_patchexpr()
+   let g:patch_args = []
+   func TPatch()
+     call add(g:patch_args, readfile(v:fname_in))
+     call add(g:patch_args, readfile(v:fname_diff))
+     call writefile(['output file'], v:fname_out)
+   endfunc
+   set patchexpr=TPatch()
+ 
+   call writefile(['input file'], 'Xinput')
+   call writefile(['diff file'], 'Xdiff')
+   %bwipe!
+   edit Xinput
+   diffpatch Xdiff
+   call assert_equal('output file', getline(1))
+   call assert_equal('Xinput.new', bufname())
+   call assert_equal(2, winnr('$'))
+   call assert_true(&diff)
+ 
+   call delete('Xinput')
+   call delete('Xdiff')
+   set patchexpr&
+   delfunc TPatch
+   %bwipe!
+ endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0400/src/testdir/test_excmd.vim  2020-03-10 07:48:06.571619551 
+0100
--- src/testdir/test_excmd.vim  2020-03-18 19:29:48.210936583 +0100
***************
*** 276,287 ****
--- 276,296 ----
  func Test_redir_cmd()
    call assert_fails('redir @@', 'E475:')
    call assert_fails('redir abc', 'E475:')
+   call assert_fails('redir => 1abc', 'E474:')
+   call assert_fails('redir => a b', 'E488:')
+   call assert_fails('redir => abc[1]', 'E474:')
+   let b=0zFF
+   call assert_fails('redir =>> b', 'E734:')
+   unlet b
+ 
    if has('unix')
+     " Redirecting to a directory name
      call mkdir('Xdir')
      call assert_fails('redir > Xdir', 'E17:')
      call delete('Xdir', 'd')
    endif
    if !has('bsd')
+     " Redirecting to a read-only file
      call writefile([], 'Xfile')
      call setfperm('Xfile', 'r--r--r--')
      call assert_fails('redir! > Xfile', 'E190:')
*** ../vim-8.2.0400/src/testdir/test_functions.vim      2020-02-29 
17:38:08.866485874 +0100
--- src/testdir/test_functions.vim      2020-03-18 19:29:48.210936583 +0100
***************
*** 800,805 ****
--- 800,809 ----
    call assert_equal(0, getbufvar(bnr, '&autoindent'))
    call assert_equal(0, getbufvar(bnr, '&autoindent', 1))
  
+   " Set and get a buffer-local variable
+   call setbufvar(bnr, 'bufvar_test', ['one', 'two'])
+   call assert_equal(['one', 'two'], getbufvar(bnr, 'bufvar_test'))
+ 
    " Open new window with forced option values
    set fileformats=unix,dos
    new ++ff=dos ++bin ++enc=iso-8859-2
***************
*** 1498,1503 ****
--- 1502,1511 ----
  
    call assert_fails('call Fsandbox()', 'E48:')
    delfunc Fsandbox
+ 
+   " From a sandbox try to set a predefined variable (which cannot be modified
+   " from a sandbox)
+   call assert_fails('sandbox let v:lnum = 10', 'E794:')
  endfunc
  
  func EditAnotherFile()
***************
*** 2030,2043 ****
    " sort()
    call assert_equal([0, 1, 2, 3, 4, 5], sort(range(5, 0, -1)))
  
-   " 'spellsuggest'
-   func MySuggest()
-     return range(3)
-   endfunc
-   set spell spellsuggest=expr:MySuggest()
-   call assert_equal([], spellsuggest('baord', 3))
-   set nospell spellsuggest&
- 
    " string()
    call assert_equal('[0, 1, 2, 3, 4]', string(range(5)))
  
--- 2038,2043 ----
*** ../vim-8.2.0400/src/testdir/test_let.vim    2019-11-26 16:56:17.000000000 
+0100
--- src/testdir/test_let.vim    2020-03-18 19:29:48.210936583 +0100
***************
*** 25,33 ****
--- 25,86 ----
    let s = "\na                     #1\nb                     #2"
    call assert_equal(s, out)
  
+   " Test for displaying a string variable
+   let s = 'vim'
+   let out = execute('let s')
+   let s = "\ns                      vim"
+   call assert_equal(s, out)
+ 
+   " Test for displaying a list variable
+   let l = [1, 2]
+   let out = execute('let l')
+   let s = "\nl                     [1, 2]"
+   call assert_equal(s, out)
+ 
+   " Test for displaying a dict variable
+   let d = {'k' : 'v'}
+   let out = execute('let d')
+   let s = "\nd                     {'k': 'v'}"
+   call assert_equal(s, out)
+ 
+   " Test for displaying a function reference variable
+   let F = function('min')
+   let out = execute('let F')
+   let s = "\nF                     *min()"
+   call assert_equal(s, out)
+ 
    let x = 0
    if 0 | let x = 1 | endif
    call assert_equal(0, x)
+ 
+   " Display a list item using an out of range index
+   let l = [10]
+   call assert_fails('let l[1]', 'E684:')
+ 
+   " List special variable dictionaries
+   let g:Test_Global_Var = 5
+   call assert_match("\nTest_Global_Var       #5", execute('let g:'))
+   unlet g:Test_Global_Var
+ 
+   let b:Test_Buf_Var = 8
+   call assert_match("\nb:Test_Buf_Var        #8", execute('let b:'))
+   unlet b:Test_Buf_Var
+ 
+   let w:Test_Win_Var = 'foo'
+   call assert_equal("\nw:Test_Win_Var         foo", execute('let w:'))
+   unlet w:Test_Win_Var
+ 
+   let t:Test_Tab_Var = 'bar'
+   call assert_equal("\nt:Test_Tab_Var         bar", execute('let t:'))
+   unlet t:Test_Tab_Var
+ 
+   let s:Test_Script_Var = [7]
+   call assert_match("\ns:Test_Script_Var     \\[7]", execute('let s:'))
+   unlet s:Test_Script_Var
+ 
+   let l:Test_Local_Var = {'k' : 5}
+   call assert_match("\nl:Test_Local_Var      {'k': 5}", execute('let l:'))
+   call assert_match("v:errors              []", execute('let v:'))
  endfunc
  
  func s:set_arg1(a) abort
***************
*** 200,215 ****
--- 253,297 ----
    let &fillchars = _w
  endfunc
  
+ " Errors with the :let statement
  func Test_let_errors()
    let s = 'abcd'
    call assert_fails('let s[1] = 5', 'E689:')
  
    let l = [1, 2, 3]
    call assert_fails('let l[:] = 5', 'E709:')
+ 
+   call assert_fails('let x:lnum=5', 'E488:')
+   call assert_fails('let v:=5', 'E461:')
+   call assert_fails('let [a]', 'E474:')
+   call assert_fails('let [a, b] = [', 'E697:')
+   call assert_fails('let [a, b] = [10, 20', 'E696:')
+   call assert_fails('let [a, b] = 10', 'E714:')
+   call assert_fails('let [a, , b] = [10, 20]', 'E475:')
+   call assert_fails('let [a, b&] = [10, 20]', 'E475:')
+   call assert_fails('let $ = 10', 'E475:')
+   call assert_fails('let $FOO[1] = "abc"', 'E18:')
+   call assert_fails('let &buftype[1] = "nofile"', 'E18:')
+   let s = "var"
+   let var = 1
+   call assert_fails('let {s}.1 = 2', 'E18:')
+ 
+   " This test works only when the language is English
+   if v:lang == "C" || v:lang =~ '^[Ee]n'
+     call assert_fails('let [a ; b;] = [10, 20]',
+           \ 'Double ; in list of variables')
+   endif
  endfunc
  
  func Test_let_heredoc_fails()
    call assert_fails('let v =<< marker', 'E991:')
+   try
+     exe "let v =<< TEXT | abc | TEXT"
+     call assert_report('No exception thrown')
+   catch /E488:/
+   catch
+     call assert_report("Caught exception: " .. v:exception)
+   endtry
  
    let text =<< trim END
    func WrongSyntax()
***************
*** 242,247 ****
--- 324,333 ----
    call writefile(text, 'XheredocBadMarker')
    call assert_fails('source XheredocBadMarker', 'E221:')
    call delete('XheredocBadMarker')
+ 
+   call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker')
+   call assert_fails('source XheredocMissingMarker', 'E990:')
+   call delete('XheredocMissingMarker')
  endfunc
  
  func Test_let_heredoc_trim_no_indent_marker()
***************
*** 368,370 ****
--- 454,458 ----
  END
    call assert_equal(['     x', '     \y', '     z'], [a, b, c])
  endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0400/src/testdir/test_listdict.vim       2020-01-30 
18:24:47.001204003 +0100
--- src/testdir/test_listdict.vim       2020-03-18 19:29:48.210936583 +0100
***************
*** 559,564 ****
--- 559,576 ----
    unlet l
  endfunc
  
+ " Locking part of the list
+ func Test_let_lock_list_items()
+   let l = [1, 2, 3, 4]
+   lockvar l[2:]
+   call assert_equal(0, islocked('l[0]'))
+   call assert_equal(1, islocked('l[2]'))
+   call assert_equal(1, islocked('l[3]'))
+   call assert_fails('let l[2] = 10', 'E741:')
+   call assert_fails('let l[3] = 20', 'E741:')
+   unlet l
+ endfunc
+ 
  " lockvar/islocked() triggering script autoloading
  func Test_lockvar_script_autoload()
    let old_rtp = &rtp
***************
*** 791,793 ****
--- 803,845 ----
    " Test for v:
    call s:check_scope_dict('v', v:true)
  endfunc
+ 
+ " Test for deep nesting of lists (> 100)
+ func Test_deep_nested_list()
+   let deep_list = []
+   let l = deep_list
+   for i in range(102)
+     let newlist = []
+     call add(l, newlist)
+     let l = newlist
+   endfor
+   call add(l, 102)
+ 
+   call assert_fails('let m = deepcopy(deep_list)', 'E698:')
+   call assert_fails('lockvar 110 deep_list', 'E743:')
+   call assert_fails('unlockvar 110 deep_list', 'E743:')
+   call assert_fails('let x = execute("echo deep_list")', 'E724:')
+   call test_garbagecollect_now()
+   unlet deep_list
+ endfunc
+ 
+ " Test for deep nesting of dicts (> 100)
+ func Test_deep_nested_dict()
+   let deep_dict = {}
+   let d = deep_dict
+   for i in range(102)
+     let newdict = {}
+     let d.k = newdict
+     let d = newdict
+   endfor
+   let d.k = 'v'
+ 
+   call assert_fails('let m = deepcopy(deep_dict)', 'E698:')
+   call assert_fails('lockvar 110 deep_dict', 'E743:')
+   call assert_fails('unlockvar 110 deep_dict', 'E743:')
+   call assert_fails('let x = execute("echo deep_dict")', 'E724:')
+   call test_garbagecollect_now()
+   unlet deep_dict
+ endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0400/src/testdir/test_spell.vim  2019-12-26 14:30:11.763609692 
+0100
--- src/testdir/test_spell.vim  2020-03-18 19:29:48.210936583 +0100
***************
*** 298,303 ****
--- 298,332 ----
    bwipe!
  endfunc
  
+ " Test for 'spellsuggest' expr errrors
+ func Test_spellsuggest_expr_errors()
+   " 'spellsuggest'
+   func MySuggest()
+     return range(3)
+   endfunc
+   set spell spellsuggest=expr:MySuggest()
+   call assert_equal([], spellsuggest('baord', 3))
+ 
+   " Test for 'spellsuggest' expression returning a non-list value
+   func! MySuggest2()
+     return 'good'
+   endfunc
+   set spellsuggest=expr:MySuggest2()
+   call assert_equal([], spellsuggest('baord'))
+ 
+   " Test for 'spellsuggest' expression returning a list with dict values
+   func! MySuggest3()
+     return [[{}, {}]]
+   endfunc
+   set spellsuggest=expr:MySuggest3()
+   call assert_fails("call spellsuggest('baord')", 'E728:')
+ 
+   set nospell spellsuggest&
+   delfunc MySuggest
+   delfunc MySuggest2
+   delfunc MySuggest3
+ endfunc
+ 
  func Test_spellinfo()
    new
    let runtime = substitute($VIMRUNTIME, '\\', '/', 'g')
*** ../vim-8.2.0400/src/testdir/test_unlet.vim  2018-06-12 16:59:13.000000000 
+0200
--- src/testdir/test_unlet.vim  2020-03-18 19:29:48.210936583 +0100
***************
*** 20,25 ****
--- 20,26 ----
  
  func Test_unlet_fails()
    call assert_fails('unlet v:["count"]', 'E46:')
+   call assert_fails('unlet $', 'E475:')
  endfunc
  
  func Test_unlet_env()
***************
*** 55,57 ****
--- 56,60 ----
    call feedkeys(":unlet $FOO\t\n", 'tx')
    call assert_true(!exists('$FOOBAR') || empty($FOOBAR))
  endfunc
+ 
+ " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0400/src/testdir/test_user_func.vim      2020-02-16 
19:42:18.877413180 +0100
--- src/testdir/test_user_func.vim      2020-03-18 19:29:48.210936583 +0100
***************
*** 87,92 ****
--- 87,95 ----
    call assert_fails("call extend(g:, {'max': function('min')})", 'E704')
    call assert_equal(3, max([1, 2, 3]))
  
+   " Try to overwrite an user defined function with a function reference
+   call assert_fails("let Expr1 = function('min')", 'E705:')
+ 
    " Regression: the first line below used to throw ?E110: Missing ')'?
    " Second is here just to prove that this line is correct when not skipping
    " rhs of &&.
*** ../vim-8.2.0400/src/testdir/test_vimscript.vim      2020-02-29 
13:43:23.698780174 +0100
--- src/testdir/test_vimscript.vim      2020-03-18 19:29:48.210936583 +0100
***************
*** 1623,1628 ****
--- 1623,1631 ----
      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
*** ../vim-8.2.0400/src/version.c       2020-03-18 19:17:55.009563163 +0100
--- src/version.c       2020-03-18 19:30:58.994673725 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     401,
  /**/

-- 
Facepalm statement #6: "Estland is a fantasy place, just like Middle Earth and
Madagaskar"

 /// 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/202003181833.02IIX0v9004506%40masaka.moolenaar.net.

Raspunde prin e-mail lui