15deeb3f1SBram Moolenaar" Test various aspects of the Vim9 script language. 25deeb3f1SBram Moolenaar 35deeb3f1SBram Moolenaarsource check.vim 45deeb3f1SBram Moolenaarsource view_util.vim 55deeb3f1SBram Moolenaar 65deeb3f1SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message. 75deeb3f1SBram Moolenaarfunc CheckDefFailure(lines, error) 85deeb3f1SBram Moolenaar call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef') 95deeb3f1SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 105deeb3f1SBram Moolenaar call delete('Xdef') 115deeb3f1SBram Moolenaarendfunc 125deeb3f1SBram Moolenaar 135deeb3f1SBram Moolenaarfunc CheckScriptFailure(lines, error) 145deeb3f1SBram Moolenaar call writefile(a:lines, 'Xdef') 155deeb3f1SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 165deeb3f1SBram Moolenaar call delete('Xdef') 175deeb3f1SBram Moolenaarendfunc 185deeb3f1SBram Moolenaar 195deeb3f1SBram Moolenaarfunc Test_def_basic() 205deeb3f1SBram Moolenaar def SomeFunc(): string 215deeb3f1SBram Moolenaar return 'yes' 225deeb3f1SBram Moolenaar enddef 235deeb3f1SBram Moolenaar call assert_equal('yes', SomeFunc()) 245deeb3f1SBram Moolenaarendfunc 255deeb3f1SBram Moolenaar 265deeb3f1SBram Moolenaardef ReturnString(): string 275deeb3f1SBram Moolenaar return 'string' 285deeb3f1SBram Moolenaarenddef 295deeb3f1SBram Moolenaar 305deeb3f1SBram Moolenaardef ReturnNumber(): number 315deeb3f1SBram Moolenaar return 123 325deeb3f1SBram Moolenaarenddef 335deeb3f1SBram Moolenaar 345deeb3f1SBram Moolenaarlet g:notNumber = 'string' 355deeb3f1SBram Moolenaar 365deeb3f1SBram Moolenaardef ReturnGlobal(): number 375deeb3f1SBram Moolenaar return g:notNumber 385deeb3f1SBram Moolenaarenddef 395deeb3f1SBram Moolenaar 405deeb3f1SBram Moolenaardef Test_return_something() 415deeb3f1SBram Moolenaar assert_equal('string', ReturnString()) 425deeb3f1SBram Moolenaar assert_equal(123, ReturnNumber()) 435deeb3f1SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 445deeb3f1SBram Moolenaarenddef 455deeb3f1SBram Moolenaar 465deeb3f1SBram Moolenaarlet s:nothing = 0 475deeb3f1SBram Moolenaardef ReturnNothing() 485deeb3f1SBram Moolenaar s:nothing = 1 495deeb3f1SBram Moolenaar if true 505deeb3f1SBram Moolenaar return 515deeb3f1SBram Moolenaar endif 525deeb3f1SBram Moolenaar s:nothing = 2 535deeb3f1SBram Moolenaarenddef 545deeb3f1SBram Moolenaar 555deeb3f1SBram Moolenaardef Test_return_nothing() 565deeb3f1SBram Moolenaar ReturnNothing() 575deeb3f1SBram Moolenaar assert_equal(1, s:nothing) 585deeb3f1SBram Moolenaarenddef 595deeb3f1SBram Moolenaar 605deeb3f1SBram Moolenaarfunc Increment() 615deeb3f1SBram Moolenaar let g:counter += 1 625deeb3f1SBram Moolenaarendfunc 635deeb3f1SBram Moolenaar 645deeb3f1SBram Moolenaardef Test_call_ufunc_count() 655deeb3f1SBram Moolenaar g:counter = 1 665deeb3f1SBram Moolenaar Increment() 675deeb3f1SBram Moolenaar Increment() 685deeb3f1SBram Moolenaar Increment() 695deeb3f1SBram Moolenaar " works with and without :call 705deeb3f1SBram Moolenaar assert_equal(4, g:counter) 715deeb3f1SBram Moolenaar call assert_equal(4, g:counter) 725deeb3f1SBram Moolenaar unlet g:counter 735deeb3f1SBram Moolenaarenddef 745deeb3f1SBram Moolenaar 755deeb3f1SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 765deeb3f1SBram Moolenaar let res = arg 775deeb3f1SBram Moolenaar for s in rest 785deeb3f1SBram Moolenaar res ..= ',' .. s 795deeb3f1SBram Moolenaar endfor 805deeb3f1SBram Moolenaar return res 815deeb3f1SBram Moolenaarenddef 825deeb3f1SBram Moolenaar 835deeb3f1SBram Moolenaardef Test_call_varargs() 845deeb3f1SBram Moolenaar assert_equal('one', MyVarargs('one')) 855deeb3f1SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 865deeb3f1SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 875deeb3f1SBram Moolenaarenddef 885deeb3f1SBram Moolenaar 895deeb3f1SBram Moolenaardef MyDefaultArgs(name = 'string'): string 905deeb3f1SBram Moolenaar return name 915deeb3f1SBram Moolenaarenddef 925deeb3f1SBram Moolenaar 935deeb3f1SBram Moolenaardef Test_call_default_args() 945deeb3f1SBram Moolenaar assert_equal('string', MyDefaultArgs()) 955deeb3f1SBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 965deeb3f1SBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 975deeb3f1SBram Moolenaar 985deeb3f1SBram Moolenaar call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:') 995deeb3f1SBram Moolenaarenddef 1005deeb3f1SBram Moolenaar 1015deeb3f1SBram Moolenaarfunc Test_call_default_args_from_func() 1025deeb3f1SBram Moolenaar call assert_equal('string', MyDefaultArgs()) 1035deeb3f1SBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 1045deeb3f1SBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 1055deeb3f1SBram Moolenaarendfunc 1065deeb3f1SBram Moolenaar 1075deeb3f1SBram Moolenaarfunc TakesOneArg(arg) 1085deeb3f1SBram Moolenaar echo a:arg 1095deeb3f1SBram Moolenaarendfunc 1105deeb3f1SBram Moolenaar 1115deeb3f1SBram Moolenaardef Test_call_wrong_args() 1125deeb3f1SBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 1135deeb3f1SBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 1145deeb3f1SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 1155deeb3f1SBram Moolenaarenddef 1165deeb3f1SBram Moolenaar 1175deeb3f1SBram Moolenaar" Default arg and varargs 1185deeb3f1SBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 1195deeb3f1SBram Moolenaar let res = one .. ',' .. two 1205deeb3f1SBram Moolenaar for s in rest 1215deeb3f1SBram Moolenaar res ..= ',' .. s 1225deeb3f1SBram Moolenaar endfor 1235deeb3f1SBram Moolenaar return res 1245deeb3f1SBram Moolenaarenddef 1255deeb3f1SBram Moolenaar 1265deeb3f1SBram Moolenaardef Test_call_def_varargs() 1275deeb3f1SBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 1285deeb3f1SBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 1295deeb3f1SBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 1305deeb3f1SBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 131*49cf7cc8SBram Moolenaar call CheckDefFailure(['MyDefVarargs("one", 22)'], 'E1013: argument 2: type mismatch, expected string but got number') 1325deeb3f1SBram Moolenaarenddef 1335deeb3f1SBram Moolenaar 1340b76b42dSBram Moolenaar" Only varargs 1350b76b42dSBram Moolenaardef MyVarargsOnly(...args: list<string>): string 1360b76b42dSBram Moolenaar return join(args, ',') 1370b76b42dSBram Moolenaarenddef 1380b76b42dSBram Moolenaar 1390b76b42dSBram Moolenaardef Test_call_varargs_only() 1400b76b42dSBram Moolenaar assert_equal('', MyVarargsOnly()) 1410b76b42dSBram Moolenaar assert_equal('one', MyVarargsOnly('one')) 1420b76b42dSBram Moolenaar assert_equal('one,two', MyVarargsOnly('one', 'two')) 1430b76b42dSBram Moolenaar call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number') 1440b76b42dSBram Moolenaar call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number') 1450b76b42dSBram Moolenaarenddef 1460b76b42dSBram Moolenaar 1475deeb3f1SBram Moolenaardef Test_using_var_as_arg() 1485deeb3f1SBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 1495deeb3f1SBram Moolenaar call assert_fails('so Xdef', 'E1006:') 1505deeb3f1SBram Moolenaar call delete('Xdef') 1515deeb3f1SBram Moolenaarenddef 1525deeb3f1SBram Moolenaar 1535deeb3f1SBram Moolenaardef Test_call_func_defined_later() 1545deeb3f1SBram Moolenaar call assert_equal('one', DefinedLater('one')) 1555deeb3f1SBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 1565deeb3f1SBram Moolenaarenddef 1575deeb3f1SBram Moolenaar 1585deeb3f1SBram Moolenaarfunc DefinedLater(arg) 1595deeb3f1SBram Moolenaar return a:arg 1605deeb3f1SBram Moolenaarendfunc 1615deeb3f1SBram Moolenaar 1625deeb3f1SBram Moolenaardef FuncWithForwardCall() 1635deeb3f1SBram Moolenaar return DefinedEvenLater("yes") 1645deeb3f1SBram Moolenaarenddef 1655deeb3f1SBram Moolenaar 1665deeb3f1SBram Moolenaardef DefinedEvenLater(arg: string): string 1675deeb3f1SBram Moolenaar return arg 1685deeb3f1SBram Moolenaarenddef 1695deeb3f1SBram Moolenaar 1705deeb3f1SBram Moolenaardef Test_error_in_nested_function() 1715deeb3f1SBram Moolenaar " Error in called function requires unwinding the call stack. 1725deeb3f1SBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 1735deeb3f1SBram Moolenaarenddef 1745deeb3f1SBram Moolenaar 1755deeb3f1SBram Moolenaardef Test_return_type_wrong() 1765deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 1775deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 1785deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 1795deeb3f1SBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1805deeb3f1SBram Moolenaar 1815deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 1825deeb3f1SBram Moolenaar 1835deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 1845deeb3f1SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 185ee4e0c1eSBram Moolenaar CheckScriptFailure(['def Func()', 'return 1'], 'E1057:') 1865deeb3f1SBram Moolenaarenddef 1875deeb3f1SBram Moolenaar 1885deeb3f1SBram Moolenaardef Test_arg_type_wrong() 1895deeb3f1SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 190ee4e0c1eSBram Moolenaar CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...') 1915deeb3f1SBram Moolenaarenddef 1925deeb3f1SBram Moolenaar 1935deeb3f1SBram Moolenaardef Test_vim9script_call() 1945deeb3f1SBram Moolenaar let lines =<< trim END 1955deeb3f1SBram Moolenaar vim9script 1965deeb3f1SBram Moolenaar let var = '' 1975deeb3f1SBram Moolenaar def MyFunc(arg: string) 1985deeb3f1SBram Moolenaar var = arg 1995deeb3f1SBram Moolenaar enddef 2005deeb3f1SBram Moolenaar MyFunc('foobar') 2015deeb3f1SBram Moolenaar assert_equal('foobar', var) 2025deeb3f1SBram Moolenaar 2035deeb3f1SBram Moolenaar let str = 'barfoo' 2045deeb3f1SBram Moolenaar str->MyFunc() 2055deeb3f1SBram Moolenaar assert_equal('barfoo', var) 2065deeb3f1SBram Moolenaar 2075deeb3f1SBram Moolenaar let g:value = 'value' 2085deeb3f1SBram Moolenaar g:value->MyFunc() 2095deeb3f1SBram Moolenaar assert_equal('value', var) 2105deeb3f1SBram Moolenaar 2115deeb3f1SBram Moolenaar let listvar = [] 2125deeb3f1SBram Moolenaar def ListFunc(arg: list<number>) 2135deeb3f1SBram Moolenaar listvar = arg 2145deeb3f1SBram Moolenaar enddef 2155deeb3f1SBram Moolenaar [1, 2, 3]->ListFunc() 2165deeb3f1SBram Moolenaar assert_equal([1, 2, 3], listvar) 2175deeb3f1SBram Moolenaar 2185deeb3f1SBram Moolenaar let dictvar = {} 2195deeb3f1SBram Moolenaar def DictFunc(arg: dict<number>) 2205deeb3f1SBram Moolenaar dictvar = arg 2215deeb3f1SBram Moolenaar enddef 2225deeb3f1SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2235deeb3f1SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2245deeb3f1SBram Moolenaar def CompiledDict() 2255deeb3f1SBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 2265deeb3f1SBram Moolenaar enddef 2275deeb3f1SBram Moolenaar CompiledDict() 2285deeb3f1SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2295deeb3f1SBram Moolenaar 2305deeb3f1SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2315deeb3f1SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2325deeb3f1SBram Moolenaar 2335deeb3f1SBram Moolenaar ('text')->MyFunc() 2345deeb3f1SBram Moolenaar assert_equal('text', var) 2355deeb3f1SBram Moolenaar ("some")->MyFunc() 2365deeb3f1SBram Moolenaar assert_equal('some', var) 2375deeb3f1SBram Moolenaar END 2385deeb3f1SBram Moolenaar writefile(lines, 'Xcall.vim') 2395deeb3f1SBram Moolenaar source Xcall.vim 2405deeb3f1SBram Moolenaar delete('Xcall.vim') 2415deeb3f1SBram Moolenaarenddef 2425deeb3f1SBram Moolenaar 2435deeb3f1SBram Moolenaardef Test_vim9script_call_fail_decl() 2445deeb3f1SBram Moolenaar let lines =<< trim END 2455deeb3f1SBram Moolenaar vim9script 2465deeb3f1SBram Moolenaar let var = '' 2475deeb3f1SBram Moolenaar def MyFunc(arg: string) 2485deeb3f1SBram Moolenaar let var = 123 2495deeb3f1SBram Moolenaar enddef 2505deeb3f1SBram Moolenaar END 2515deeb3f1SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 2525deeb3f1SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 2535deeb3f1SBram Moolenaar delete('Xcall_decl.vim') 2545deeb3f1SBram Moolenaarenddef 2555deeb3f1SBram Moolenaar 2565deeb3f1SBram Moolenaardef Test_vim9script_call_fail_const() 2575deeb3f1SBram Moolenaar let lines =<< trim END 2585deeb3f1SBram Moolenaar vim9script 2595deeb3f1SBram Moolenaar const var = '' 2605deeb3f1SBram Moolenaar def MyFunc(arg: string) 2615deeb3f1SBram Moolenaar var = 'asdf' 2625deeb3f1SBram Moolenaar enddef 2635deeb3f1SBram Moolenaar END 2645deeb3f1SBram Moolenaar writefile(lines, 'Xcall_const.vim') 2655deeb3f1SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 2665deeb3f1SBram Moolenaar delete('Xcall_const.vim') 2675deeb3f1SBram Moolenaarenddef 2685deeb3f1SBram Moolenaar 2695deeb3f1SBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 2705deeb3f1SBram Moolenaar" recognized. 2715deeb3f1SBram Moolenaarfunc Test_function_python() 2725deeb3f1SBram Moolenaar CheckFeature python3 2735deeb3f1SBram Moolenaar let py = 'python3' 2745deeb3f1SBram Moolenaar execute py "<< EOF" 2755deeb3f1SBram Moolenaardef do_something(): 2765deeb3f1SBram Moolenaar return 1 2775deeb3f1SBram MoolenaarEOF 2785deeb3f1SBram Moolenaarendfunc 2795deeb3f1SBram Moolenaar 2805deeb3f1SBram Moolenaardef Test_delfunc() 2815deeb3f1SBram Moolenaar let lines =<< trim END 2825deeb3f1SBram Moolenaar vim9script 2835deeb3f1SBram Moolenaar def GoneSoon() 2845deeb3f1SBram Moolenaar echo 'hello' 2855deeb3f1SBram Moolenaar enddef 2865deeb3f1SBram Moolenaar 2875deeb3f1SBram Moolenaar def CallGoneSoon() 2885deeb3f1SBram Moolenaar GoneSoon() 2895deeb3f1SBram Moolenaar enddef 2905deeb3f1SBram Moolenaar 2915deeb3f1SBram Moolenaar delfunc GoneSoon 2925deeb3f1SBram Moolenaar CallGoneSoon() 2935deeb3f1SBram Moolenaar END 2945deeb3f1SBram Moolenaar writefile(lines, 'XToDelFunc') 2955deeb3f1SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 2965deeb3f1SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 2975deeb3f1SBram Moolenaar 2985deeb3f1SBram Moolenaar delete('XToDelFunc') 2995deeb3f1SBram Moolenaarenddef 3005deeb3f1SBram Moolenaar 3015deeb3f1SBram Moolenaardef Test_redef_failure() 3025deeb3f1SBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 3035deeb3f1SBram Moolenaar so Xdef 3045deeb3f1SBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 3055deeb3f1SBram Moolenaar so Xdef 3065deeb3f1SBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 3075deeb3f1SBram Moolenaar call assert_fails('so Xdef', 'E1027:') 3085deeb3f1SBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 3095deeb3f1SBram Moolenaar so Xdef 3105deeb3f1SBram Moolenaar call delete('Xdef') 3115deeb3f1SBram Moolenaar 3125deeb3f1SBram Moolenaar call assert_equal(0, Func0()) 3135deeb3f1SBram Moolenaar call assert_equal('Func1', Func1()) 3145deeb3f1SBram Moolenaar call assert_equal('Func2', Func2()) 3155deeb3f1SBram Moolenaar 3165deeb3f1SBram Moolenaar delfunc! Func0 3175deeb3f1SBram Moolenaar delfunc! Func1 3185deeb3f1SBram Moolenaar delfunc! Func2 3195deeb3f1SBram Moolenaarenddef 3205deeb3f1SBram Moolenaar 3215deeb3f1SBram Moolenaar" Test for internal functions returning different types 3225deeb3f1SBram Moolenaarfunc Test_InternalFuncRetType() 3235deeb3f1SBram Moolenaar let lines =<< trim END 3245deeb3f1SBram Moolenaar def RetFloat(): float 3255deeb3f1SBram Moolenaar return ceil(1.456) 3265deeb3f1SBram Moolenaar enddef 3275deeb3f1SBram Moolenaar 3285deeb3f1SBram Moolenaar def RetListAny(): list<any> 3295deeb3f1SBram Moolenaar return items({'k' : 'v'}) 3305deeb3f1SBram Moolenaar enddef 3315deeb3f1SBram Moolenaar 3325deeb3f1SBram Moolenaar def RetListString(): list<string> 3335deeb3f1SBram Moolenaar return split('a:b:c', ':') 3345deeb3f1SBram Moolenaar enddef 3355deeb3f1SBram Moolenaar 3365deeb3f1SBram Moolenaar def RetListDictAny(): list<dict<any>> 3375deeb3f1SBram Moolenaar return getbufinfo() 3385deeb3f1SBram Moolenaar enddef 3395deeb3f1SBram Moolenaar 3405deeb3f1SBram Moolenaar def RetDictNumber(): dict<number> 3415deeb3f1SBram Moolenaar return wordcount() 3425deeb3f1SBram Moolenaar enddef 3435deeb3f1SBram Moolenaar 3445deeb3f1SBram Moolenaar def RetDictString(): dict<string> 3455deeb3f1SBram Moolenaar return environ() 3465deeb3f1SBram Moolenaar enddef 3475deeb3f1SBram Moolenaar END 3485deeb3f1SBram Moolenaar call writefile(lines, 'Xscript') 3495deeb3f1SBram Moolenaar source Xscript 3505deeb3f1SBram Moolenaar 3515deeb3f1SBram Moolenaar call assert_equal(2.0, RetFloat()) 3525deeb3f1SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 3535deeb3f1SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 3545deeb3f1SBram Moolenaar call assert_notequal([], RetListDictAny()) 3555deeb3f1SBram Moolenaar call assert_notequal({}, RetDictNumber()) 3565deeb3f1SBram Moolenaar call assert_notequal({}, RetDictString()) 3575deeb3f1SBram Moolenaar call delete('Xscript') 3585deeb3f1SBram Moolenaarendfunc 3595deeb3f1SBram Moolenaar 3605deeb3f1SBram Moolenaar" Test for passing too many or too few arguments to internal functions 3615deeb3f1SBram Moolenaarfunc Test_internalfunc_arg_error() 3625deeb3f1SBram Moolenaar let l =<< trim END 3635deeb3f1SBram Moolenaar def! FArgErr(): float 3645deeb3f1SBram Moolenaar return ceil(1.1, 2) 3655deeb3f1SBram Moolenaar enddef 3665deeb3f1SBram Moolenaar END 3675deeb3f1SBram Moolenaar call writefile(l, 'Xinvalidarg') 3685deeb3f1SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 3695deeb3f1SBram Moolenaar let l =<< trim END 3705deeb3f1SBram Moolenaar def! FArgErr(): float 3715deeb3f1SBram Moolenaar return ceil() 3725deeb3f1SBram Moolenaar enddef 3735deeb3f1SBram Moolenaar END 3745deeb3f1SBram Moolenaar call writefile(l, 'Xinvalidarg') 3755deeb3f1SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 3765deeb3f1SBram Moolenaar call delete('Xinvalidarg') 3775deeb3f1SBram Moolenaarendfunc 3785deeb3f1SBram Moolenaar 3795deeb3f1SBram Moolenaarlet s:funcResult = 0 3805deeb3f1SBram Moolenaar 3815deeb3f1SBram Moolenaardef FuncNoArgNoRet() 3825deeb3f1SBram Moolenaar funcResult = 11 3835deeb3f1SBram Moolenaarenddef 3845deeb3f1SBram Moolenaar 3855deeb3f1SBram Moolenaardef FuncNoArgRetNumber(): number 3865deeb3f1SBram Moolenaar funcResult = 22 3875deeb3f1SBram Moolenaar return 1234 3885deeb3f1SBram Moolenaarenddef 3895deeb3f1SBram Moolenaar 390ec5929d0SBram Moolenaardef FuncNoArgRetString(): string 391ec5929d0SBram Moolenaar funcResult = 45 392ec5929d0SBram Moolenaar return 'text' 393ec5929d0SBram Moolenaarenddef 394ec5929d0SBram Moolenaar 3955deeb3f1SBram Moolenaardef FuncOneArgNoRet(arg: number) 3965deeb3f1SBram Moolenaar funcResult = arg 3975deeb3f1SBram Moolenaarenddef 3985deeb3f1SBram Moolenaar 3995deeb3f1SBram Moolenaardef FuncOneArgRetNumber(arg: number): number 4005deeb3f1SBram Moolenaar funcResult = arg 4015deeb3f1SBram Moolenaar return arg 4025deeb3f1SBram Moolenaarenddef 4035deeb3f1SBram Moolenaar 404ec5929d0SBram Moolenaardef FuncOneArgRetString(arg: string): string 405ec5929d0SBram Moolenaar return arg 406ec5929d0SBram Moolenaarenddef 407ec5929d0SBram Moolenaar 4088922860aSBram Moolenaardef FuncOneArgRetAny(arg: any): any 4098922860aSBram Moolenaar return arg 4108922860aSBram Moolenaarenddef 4118922860aSBram Moolenaar 4125deeb3f1SBram Moolenaardef Test_func_type() 4135deeb3f1SBram Moolenaar let Ref1: func() 4145deeb3f1SBram Moolenaar funcResult = 0 4155deeb3f1SBram Moolenaar Ref1 = FuncNoArgNoRet 4165deeb3f1SBram Moolenaar Ref1() 4175deeb3f1SBram Moolenaar assert_equal(11, funcResult) 4184c683750SBram Moolenaar 4194c683750SBram Moolenaar let Ref2: func 4204c683750SBram Moolenaar funcResult = 0 4214c683750SBram Moolenaar Ref2 = FuncNoArgNoRet 4224c683750SBram Moolenaar Ref2() 4234c683750SBram Moolenaar assert_equal(11, funcResult) 4244c683750SBram Moolenaar 4254c683750SBram Moolenaar funcResult = 0 4264c683750SBram Moolenaar Ref2 = FuncOneArgNoRet 4274c683750SBram Moolenaar Ref2(12) 4284c683750SBram Moolenaar assert_equal(12, funcResult) 4294c683750SBram Moolenaar 4304c683750SBram Moolenaar funcResult = 0 4314c683750SBram Moolenaar Ref2 = FuncNoArgRetNumber 4324c683750SBram Moolenaar assert_equal(1234, Ref2()) 4334c683750SBram Moolenaar assert_equal(22, funcResult) 4344c683750SBram Moolenaar 4354c683750SBram Moolenaar funcResult = 0 4364c683750SBram Moolenaar Ref2 = FuncOneArgRetNumber 4374c683750SBram Moolenaar assert_equal(13, Ref2(13)) 4384c683750SBram Moolenaar assert_equal(13, funcResult) 4395deeb3f1SBram Moolenaarenddef 4405deeb3f1SBram Moolenaar 441ec5929d0SBram Moolenaardef Test_func_type_part() 442ec5929d0SBram Moolenaar let RefVoid: func: void 443ec5929d0SBram Moolenaar RefVoid = FuncNoArgNoRet 444ec5929d0SBram Moolenaar RefVoid = FuncOneArgNoRet 445ec5929d0SBram Moolenaar CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number') 446ec5929d0SBram Moolenaar CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string') 447ec5929d0SBram Moolenaar 448ec5929d0SBram Moolenaar let RefAny: func(): any 449ec5929d0SBram Moolenaar RefAny = FuncNoArgRetNumber 450ec5929d0SBram Moolenaar RefAny = FuncNoArgRetString 451ec5929d0SBram Moolenaar CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()') 452ec5929d0SBram Moolenaar CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)') 453ec5929d0SBram Moolenaar 454ec5929d0SBram Moolenaar let RefNr: func: number 455ec5929d0SBram Moolenaar RefNr = FuncNoArgRetNumber 456ec5929d0SBram Moolenaar RefNr = FuncOneArgRetNumber 457ec5929d0SBram Moolenaar CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()') 458ec5929d0SBram Moolenaar CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string') 459ec5929d0SBram Moolenaar 460ec5929d0SBram Moolenaar let RefStr: func: string 461ec5929d0SBram Moolenaar RefStr = FuncNoArgRetString 462ec5929d0SBram Moolenaar RefStr = FuncOneArgRetString 463ec5929d0SBram Moolenaar CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()') 464ec5929d0SBram Moolenaar CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number') 465ec5929d0SBram Moolenaarenddef 466ec5929d0SBram Moolenaar 4675deeb3f1SBram Moolenaardef Test_func_type_fails() 4685deeb3f1SBram Moolenaar CheckDefFailure(['let ref1: func()'], 'E704:') 4695deeb3f1SBram Moolenaar 4705deeb3f1SBram Moolenaar CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number') 4715deeb3f1SBram Moolenaar CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)') 4725deeb3f1SBram Moolenaar CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number') 4735deeb3f1SBram Moolenaarenddef 4745deeb3f1SBram Moolenaar 4758922860aSBram Moolenaardef Test_func_return_type() 4768922860aSBram Moolenaar let nr: number 4778922860aSBram Moolenaar nr = FuncNoArgRetNumber() 4788922860aSBram Moolenaar assert_equal(1234, nr) 4798922860aSBram Moolenaar 4808922860aSBram Moolenaar nr = FuncOneArgRetAny(122) 4818922860aSBram Moolenaar assert_equal(122, nr) 4828922860aSBram Moolenaar 4838922860aSBram Moolenaar let str: string 4848922860aSBram Moolenaar str = FuncOneArgRetAny('yes') 4858922860aSBram Moolenaar assert_equal('yes', str) 4868922860aSBram Moolenaar 4878922860aSBram Moolenaar CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1013: type mismatch, expected string but got number') 4888922860aSBram Moolenaarenddef 4898922860aSBram Moolenaar 490ee4e0c1eSBram Moolenaar" When using CheckScriptFailure() for the below test, E1010 is generated instead 491ee4e0c1eSBram Moolenaar" of E1056. 492ee4e0c1eSBram Moolenaarfunc Test_E1056_1059() 493ee4e0c1eSBram Moolenaar let caught_1056 = 0 494ee4e0c1eSBram Moolenaar try 495ee4e0c1eSBram Moolenaar def F(): 496ee4e0c1eSBram Moolenaar return 1 497ee4e0c1eSBram Moolenaar enddef 498ee4e0c1eSBram Moolenaar catch /E1056:/ 499ee4e0c1eSBram Moolenaar let caught_1056 = 1 500ee4e0c1eSBram Moolenaar endtry 501ee4e0c1eSBram Moolenaar call assert_equal(1, caught_1056) 502ee4e0c1eSBram Moolenaar 503ee4e0c1eSBram Moolenaar let caught_1059 = 0 504ee4e0c1eSBram Moolenaar try 505ee4e0c1eSBram Moolenaar def F5(items : list) 506ee4e0c1eSBram Moolenaar echo 'a' 507ee4e0c1eSBram Moolenaar enddef 508ee4e0c1eSBram Moolenaar catch /E1059:/ 509ee4e0c1eSBram Moolenaar let caught_1059 = 1 510ee4e0c1eSBram Moolenaar endtry 511ee4e0c1eSBram Moolenaar call assert_equal(1, caught_1059) 512ee4e0c1eSBram Moolenaarendfunc 5135deeb3f1SBram Moolenaar 5145deeb3f1SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 515