diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-17 09:08:25 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-04-17 09:38:09 +0800 |
commit | 7a3f86481e96e5c30db5af74760e475bac8cc403 (patch) | |
tree | 32a6104e5d40df885d884bd72d20a0c9a54e1390 /test | |
parent | 6bfba3660c5fbb22104cd87bd66a1381007fca22 (diff) | |
download | rneovim-7a3f86481e96e5c30db5af74760e475bac8cc403.tar.gz rneovim-7a3f86481e96e5c30db5af74760e475bac8cc403.tar.bz2 rneovim-7a3f86481e96e5c30db5af74760e475bac8cc403.zip |
vim-patch:9.0.0419: the :defer command does not check the function arguments
Problem: The :defer command does not check the function argument count and
types.
Solution: Check the function arguments when adding a deferred function.
https://github.com/vim/vim/commit/169003289fb4b2ad18fd7f5807e0d05efff0be85
Cherry-pick check_internal_func() from Vim, but use EvalFuncDef pointer
as first argument.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/old/testdir/test_user_func.vim | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/test/old/testdir/test_user_func.vim b/test/old/testdir/test_user_func.vim index 5a1931e690..0f9b40814c 100644 --- a/test/old/testdir/test_user_func.vim +++ b/test/old/testdir/test_user_func.vim @@ -5,6 +5,7 @@ source check.vim source shared.vim +source vim9.vim func Table(title, ...) let ret = a:title @@ -627,7 +628,7 @@ func Test_defer_quitall() call DeferLevelOne() END call writefile(lines, 'XdeferQuitall', 'D') - let res = system(GetVimCommandClean() .. ' -X -S XdeferQuitall') + let res = system(GetVimCommand() .. ' -X -S XdeferQuitall') call assert_equal(0, v:shell_error) call assert_false(filereadable('XQuitallOne')) call assert_false(filereadable('XQuitallTwo')) @@ -650,7 +651,7 @@ func Test_defer_quitall_in_expr_func() call Test_defer_in_funcref() END call writefile(lines, 'XdeferQuitallExpr', 'D') - let res = system(GetVimCommandClean() .. ' -X -S XdeferQuitallExpr') + let res = system(GetVimCommand() .. ' -X -S XdeferQuitallExpr') call assert_equal(0, v:shell_error) call assert_false(filereadable('Xentry0')) call assert_false(filereadable('Xentry1')) @@ -662,5 +663,61 @@ func FuncIndex(idx, val) return a:val == 'c' endfunc +func Test_defer_wrong_arguments() + call assert_fails('defer delete()', 'E119:') + call assert_fails('defer FuncIndex(1)', 'E119:') + call assert_fails('defer delete(1, 2, 3)', 'E118:') + call assert_fails('defer FuncIndex(1, 2, 3)', 'E118:') + + throw 'Skipped: Vim9 script is N/A' + let lines =<< trim END + def DeferFunc0() + defer delete() + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E119:') + let lines =<< trim END + def DeferFunc3() + defer delete(1, 2, 3) + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E118:') + let lines =<< trim END + def DeferFunc2() + defer delete(1, 2) + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number') + + def g:FuncOneArg(arg: string) + echo arg + enddef + + let lines =<< trim END + def DeferUserFunc0() + defer g:FuncOneArg() + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E119:') + let lines =<< trim END + def DeferUserFunc2() + defer g:FuncOneArg(1, 2) + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E118:') + let lines =<< trim END + def DeferUserFunc1() + defer g:FuncOneArg(1) + enddef + defcompile + END + call v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number') +endfunc + " vim: shiftwidth=2 sts=2 expandtab |