aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-04-17 09:08:25 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-04-17 09:38:09 +0800
commit7a3f86481e96e5c30db5af74760e475bac8cc403 (patch)
tree32a6104e5d40df885d884bd72d20a0c9a54e1390 /test
parent6bfba3660c5fbb22104cd87bd66a1381007fca22 (diff)
downloadrneovim-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.vim61
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