Mercurial > vim
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 |