To: vim_dev@googlegroups.com Subject: Patch 8.2.0401 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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(":\"\=float2\t\"\\"\", 'xt') call assert_equal('"float2nr("', @=) + + " completion for :language command with an invalid argument + call feedkeys(":language dummy \t\\"\", 'xt') + call assert_equal("\"language dummy \t", @:) + + " completion for commands after a :global command + call feedkeys(":g/a\\xb/call float2\t\\"\", '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\\"\", 'xt') + call assert_equal('"TCmd ', @:) + delcom TCmd1 + delcom TCmd2 + + " completion after a range followed by a pipe (|) character + call feedkeys(":1,10 | chist\t\\"\", '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\\\"\", '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\\\"\", '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\\"\", '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\\\"\", '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\\"\", '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\\\"\", '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 -- Bram@Moolenaar.net -- 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 ///