comparison src/testdir/test_user_func.vim @ 30166:d1c04b4dc60d v9.0.0419

patch 9.0.0419: the :defer command does not check the function arguments Commit: https://github.com/vim/vim/commit/169003289fb4b2ad18fd7f5807e0d05efff0be85 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 8 19:51:45 2022 +0100 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.
author Bram Moolenaar <Bram@vim.org>
date Thu, 08 Sep 2022 21:00:04 +0200
parents 3b42bdfff7cb
children 029c59bf78f1
comparison
equal deleted inserted replaced
30165:27820ff1eaf4 30166:d1c04b4dc60d
3 " Also test that a builtin function cannot be replaced. 3 " Also test that a builtin function cannot be replaced.
4 " Also test for regression when calling arbitrary expression. 4 " Also test for regression when calling arbitrary expression.
5 5
6 source check.vim 6 source check.vim
7 source shared.vim 7 source shared.vim
8 import './vim9.vim' as v9
8 9
9 func Table(title, ...) 10 func Table(title, ...)
10 let ret = a:title 11 let ret = a:title
11 let idx = 1 12 let idx = 1
12 while idx <= a:0 13 while idx <= a:0
617 enddef 618 enddef
618 619
619 DeferLevelOne() 620 DeferLevelOne()
620 END 621 END
621 call writefile(lines, 'XdeferQuitall', 'D') 622 call writefile(lines, 'XdeferQuitall', 'D')
622 let res = system(GetVimCommandClean() .. ' -X -S XdeferQuitall') 623 let res = system(GetVimCommand() .. ' -X -S XdeferQuitall')
623 call assert_equal(0, v:shell_error) 624 call assert_equal(0, v:shell_error)
624 call assert_false(filereadable('XQuitallOne')) 625 call assert_false(filereadable('XQuitallOne'))
625 call assert_false(filereadable('XQuitallTwo')) 626 call assert_false(filereadable('XQuitallTwo'))
626 endfunc 627 endfunc
627 628
639 assert_equal(2, indexof(['a', 'b', 'c'], funcref('g:DefIndex'))) 640 assert_equal(2, indexof(['a', 'b', 'c'], funcref('g:DefIndex')))
640 enddef 641 enddef
641 call Test_defer_in_funcref() 642 call Test_defer_in_funcref()
642 END 643 END
643 call writefile(lines, 'XdeferQuitallExpr', 'D') 644 call writefile(lines, 'XdeferQuitallExpr', 'D')
644 let res = system(GetVimCommandClean() .. ' -X -S XdeferQuitallExpr') 645 let res = system(GetVimCommand() .. ' -X -S XdeferQuitallExpr')
645 call assert_equal(0, v:shell_error) 646 call assert_equal(0, v:shell_error)
646 call assert_false(filereadable('Xentry0')) 647 call assert_false(filereadable('Xentry0'))
647 call assert_false(filereadable('Xentry1')) 648 call assert_false(filereadable('Xentry1'))
648 call assert_false(filereadable('Xentry2')) 649 call assert_false(filereadable('Xentry2'))
649 endfunc 650 endfunc
693 assert_false(filereadable('Xentry0')) 694 assert_false(filereadable('Xentry0'))
694 assert_false(filereadable('Xentry1')) 695 assert_false(filereadable('Xentry1'))
695 assert_false(filereadable('Xentry2')) 696 assert_false(filereadable('Xentry2'))
696 enddef 697 enddef
697 698
699 func Test_defer_wrong_arguments()
700 call assert_fails('defer delete()', 'E119:')
701 call assert_fails('defer FuncIndex(1)', 'E119:')
702 call assert_fails('defer delete(1, 2, 3)', 'E118:')
703 call assert_fails('defer FuncIndex(1, 2, 3)', 'E118:')
704
705 let lines =<< trim END
706 def DeferFunc0()
707 defer delete()
708 enddef
709 defcompile
710 END
711 call v9.CheckScriptFailure(lines, 'E119:')
712 let lines =<< trim END
713 def DeferFunc3()
714 defer delete(1, 2, 3)
715 enddef
716 defcompile
717 END
718 call v9.CheckScriptFailure(lines, 'E118:')
719 let lines =<< trim END
720 def DeferFunc2()
721 defer delete(1, 2)
722 enddef
723 defcompile
724 END
725 call v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
726
727 def g:FuncOneArg(arg: string)
728 echo arg
729 enddef
730
731 let lines =<< trim END
732 def DeferUserFunc0()
733 defer g:FuncOneArg()
734 enddef
735 defcompile
736 END
737 call v9.CheckScriptFailure(lines, 'E119:')
738 let lines =<< trim END
739 def DeferUserFunc2()
740 defer g:FuncOneArg(1, 2)
741 enddef
742 defcompile
743 END
744 call v9.CheckScriptFailure(lines, 'E118:')
745 let lines =<< trim END
746 def DeferUserFunc1()
747 defer g:FuncOneArg(1)
748 enddef
749 defcompile
750 END
751 call v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
752 endfunc
753
698 754
699 " vim: shiftwidth=2 sts=2 expandtab 755 " vim: shiftwidth=2 sts=2 expandtab