18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4ad39c094SBram Moolenaarsource view_util.vim 5673660abSBram Moolenaar 68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message. 78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error) 8978d170bSBram Moolenaar call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef') 98a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 108a7d6542SBram Moolenaar call delete('Xdef') 118a7d6542SBram Moolenaarendfunc 128a7d6542SBram Moolenaar 138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error) 148a7d6542SBram Moolenaar call writefile(a:lines, 'Xdef') 158a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 168a7d6542SBram Moolenaar call delete('Xdef') 178a7d6542SBram Moolenaarendfunc 188a7d6542SBram Moolenaar 198a7d6542SBram Moolenaardef Test_syntax() 208a7d6542SBram Moolenaar let var = 234 218a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 228a7d6542SBram Moolenaarenddef 238a7d6542SBram Moolenaar 248a7d6542SBram Moolenaarfunc Test_def_basic() 258a7d6542SBram Moolenaar def SomeFunc(): string 268a7d6542SBram Moolenaar return 'yes' 278a7d6542SBram Moolenaar enddef 288a7d6542SBram Moolenaar call assert_equal('yes', SomeFunc()) 298a7d6542SBram Moolenaarendfunc 308a7d6542SBram Moolenaar 316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 326e587dcbSBram Moolenaarlet s:addToMe = 111 33401d9ffbSBram Moolenaarlet g:existing = 'yes' 34a8c17704SBram Moolenaarlet g:inc_counter = 1 35a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 366e587dcbSBram Moolenaar 378a7d6542SBram Moolenaardef Test_assignment() 388a7d6542SBram Moolenaar let bool1: bool = true 398a7d6542SBram Moolenaar assert_equal(v:true, bool1) 408a7d6542SBram Moolenaar let bool2: bool = false 418a7d6542SBram Moolenaar assert_equal(v:false, bool2) 428a7d6542SBram Moolenaar 430c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 448a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 450c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 460c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 470c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 488a7d6542SBram Moolenaar 49436472f5SBram Moolenaar let listS: list<string> = [] 50436472f5SBram Moolenaar let listN: list<number> = [] 518a7d6542SBram Moolenaar 520c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 538a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 540c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 550c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 560c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 57b283a8a6SBram Moolenaar 589be61bbbSBram Moolenaar let a: number = 6 599be61bbbSBram Moolenaar assert_equal(6, a) 609be61bbbSBram Moolenaar 6142a480bfSBram Moolenaar if has('channel') 6242a480bfSBram Moolenaar let chan1: channel 63fbdd08edSBram Moolenaar let job1: job 64f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6542a480bfSBram Moolenaar endif 66fbdd08edSBram Moolenaar if has('float') 67fbdd08edSBram Moolenaar let float1: float = 3.4 68fbdd08edSBram Moolenaar endif 69087d2e15SBram Moolenaar let funky1: func 70087d2e15SBram Moolenaar let funky2: func = function('len') 71087d2e15SBram Moolenaar let party1: partial 72087d2e15SBram Moolenaar let party2: partial = funcref('Test_syntax') 7342a480bfSBram Moolenaar 7461a6d4e4SBram Moolenaar " type becomes list<any> 7561a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 765381c7a1SBram Moolenaar " type becomes dict<any> 775381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7861a6d4e4SBram Moolenaar 79401d9ffbSBram Moolenaar g:newvar = 'new' 80401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 81401d9ffbSBram Moolenaar 82401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 83401d9ffbSBram Moolenaar g:existing = 'no' 84401d9ffbSBram Moolenaar assert_equal('no', g:existing) 85401d9ffbSBram Moolenaar 86b283a8a6SBram Moolenaar v:char = 'abc' 876e587dcbSBram Moolenaar assert_equal('abc', v:char) 88b283a8a6SBram Moolenaar 89b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 906e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 91b283a8a6SBram Moolenaar $ENVVAR = '' 926e587dcbSBram Moolenaar 93fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 94fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 95fd1823e0SBram Moolenaar s:addToMe += 222 96fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 970bbf722aSBram Moolenaar s:newVar = 'new' 980bbf722aSBram Moolenaar assert_equal('new', s:newVar) 99a8c17704SBram Moolenaar 100a8c17704SBram Moolenaar set ts=7 101a8c17704SBram Moolenaar &ts += 1 102a8c17704SBram Moolenaar assert_equal(8, &ts) 103a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 104a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 105a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 106a8c17704SBram Moolenaar 107a8c17704SBram Moolenaar g:inc_counter += 1 108a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 109a8c17704SBram Moolenaar 110a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 111a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 112a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 113a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 114a8c17704SBram Moolenaar 115a8c17704SBram Moolenaar @a = 'areg' 116a8c17704SBram Moolenaar @a ..= 'add' 117a8c17704SBram Moolenaar assert_equal('aregadd', @a) 118a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 119a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 120*e69f6d04SBram Moolenaar 121*e69f6d04SBram Moolenaar v:errmsg = 'none' 122*e69f6d04SBram Moolenaar v:errmsg ..= 'again' 123*e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 124*e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 125*e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 126*e69f6d04SBram Moolenaar 127*e69f6d04SBram Moolenaar " Test default values. 128*e69f6d04SBram Moolenaar let thebool: bool 129*e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 130*e69f6d04SBram Moolenaar 131*e69f6d04SBram Moolenaar let thenumber: number 132*e69f6d04SBram Moolenaar assert_equal(0, thenumber) 133*e69f6d04SBram Moolenaar 134*e69f6d04SBram Moolenaar if has('float') 135*e69f6d04SBram Moolenaar let thefloat: float 136*e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 137*e69f6d04SBram Moolenaar endif 138*e69f6d04SBram Moolenaar 139*e69f6d04SBram Moolenaar let thestring: string 140*e69f6d04SBram Moolenaar assert_equal('', thestring) 141*e69f6d04SBram Moolenaar 142*e69f6d04SBram Moolenaar let theblob: blob 143*e69f6d04SBram Moolenaar assert_equal(0z, theblob) 144*e69f6d04SBram Moolenaar 145*e69f6d04SBram Moolenaar let thefunc: func 146*e69f6d04SBram Moolenaar assert_equal(test_null_function(), thefunc) 147*e69f6d04SBram Moolenaar 148*e69f6d04SBram Moolenaar let thepartial: partial 149*e69f6d04SBram Moolenaar assert_equal(test_null_partial(), thepartial) 150*e69f6d04SBram Moolenaar 151*e69f6d04SBram Moolenaar let thelist: list<any> 152*e69f6d04SBram Moolenaar assert_equal([], thelist) 153*e69f6d04SBram Moolenaar 154*e69f6d04SBram Moolenaar let thedict: dict<any> 155*e69f6d04SBram Moolenaar assert_equal({}, thedict) 156*e69f6d04SBram Moolenaar 157*e69f6d04SBram Moolenaar let thejob: job 158*e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 159*e69f6d04SBram Moolenaar 160*e69f6d04SBram Moolenaar let thechannel: channel 161*e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1628a7d6542SBram Moolenaarenddef 1638a7d6542SBram Moolenaar 1648a7d6542SBram Moolenaarfunc Test_assignment_failure() 1658a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1668a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1678a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1688a7d6542SBram Moolenaar 1698a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1708a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1718a7d6542SBram Moolenaar 1729be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1739be61bbbSBram Moolenaar 174*e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1759be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1769be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1779be61bbbSBram Moolenaar 1789be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1799be61bbbSBram Moolenaar 1809be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1819be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1829be61bbbSBram Moolenaar 1839be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1849be61bbbSBram Moolenaar 1859be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1869be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 1879be61bbbSBram Moolenaar 18833fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 18933fa29cfSBram Moolenaar 1908a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 1918a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1928a7d6542SBram Moolenaar 1938a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 1948a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 1958a7d6542SBram Moolenaar 1968a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 1978a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 19842a480bfSBram Moolenaar 19942a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 20042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 201599c89c8SBram Moolenaarendfunc 202599c89c8SBram Moolenaar 203599c89c8SBram Moolenaarfunc Test_wrong_type() 204599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 205599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 206599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 207599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 208599c89c8SBram Moolenaar 209599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 210599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 21142a480bfSBram Moolenaar 21242a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 21342a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 21442a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 21542a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 21642a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 21742a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 21842a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 21942a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 22042a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 22142a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 22242a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2238a7d6542SBram Moolenaarendfunc 2248a7d6542SBram Moolenaar 2258a7d6542SBram Moolenaarfunc Test_const() 2268a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2278a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2288a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2299be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2308a7d6542SBram Moolenaarendfunc 2318a7d6542SBram Moolenaar 2328a7d6542SBram Moolenaardef Test_block() 2338a7d6542SBram Moolenaar let outer = 1 2348a7d6542SBram Moolenaar { 2358a7d6542SBram Moolenaar let inner = 2 2368a7d6542SBram Moolenaar assert_equal(1, outer) 2378a7d6542SBram Moolenaar assert_equal(2, inner) 2388a7d6542SBram Moolenaar } 2398a7d6542SBram Moolenaar assert_equal(1, outer) 2408a7d6542SBram Moolenaarenddef 2418a7d6542SBram Moolenaar 2428a7d6542SBram Moolenaarfunc Test_block_failure() 2438a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 2448a7d6542SBram Moolenaarendfunc 2458a7d6542SBram Moolenaar 2468a7d6542SBram Moolenaardef ReturnString(): string 2478a7d6542SBram Moolenaar return 'string' 2488a7d6542SBram Moolenaarenddef 2498a7d6542SBram Moolenaar 2508a7d6542SBram Moolenaardef ReturnNumber(): number 2518a7d6542SBram Moolenaar return 123 2528a7d6542SBram Moolenaarenddef 2538a7d6542SBram Moolenaar 25409f28f49SBram Moolenaarlet g:notNumber = 'string' 25509f28f49SBram Moolenaar 25609f28f49SBram Moolenaardef ReturnGlobal(): number 25709f28f49SBram Moolenaar return g:notNumber 25809f28f49SBram Moolenaarenddef 25909f28f49SBram Moolenaar 2609be61bbbSBram Moolenaardef Test_return_something() 2618a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 2628a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 26309f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 2648a7d6542SBram Moolenaarenddef 2658a7d6542SBram Moolenaar 2669be61bbbSBram Moolenaarlet s:nothing = 0 2679be61bbbSBram Moolenaardef ReturnNothing() 2689be61bbbSBram Moolenaar s:nothing = 1 2699be61bbbSBram Moolenaar if true 2709be61bbbSBram Moolenaar return 2719be61bbbSBram Moolenaar endif 2729be61bbbSBram Moolenaar s:nothing = 2 2739be61bbbSBram Moolenaarenddef 2749be61bbbSBram Moolenaar 2759be61bbbSBram Moolenaardef Test_return_nothing() 2769be61bbbSBram Moolenaar ReturnNothing() 2779be61bbbSBram Moolenaar assert_equal(1, s:nothing) 2789be61bbbSBram Moolenaarenddef 2799be61bbbSBram Moolenaar 2808a7d6542SBram Moolenaarfunc Increment() 2818a7d6542SBram Moolenaar let g:counter += 1 2828a7d6542SBram Moolenaarendfunc 2838a7d6542SBram Moolenaar 2848a7d6542SBram Moolenaardef Test_call_ufunc_count() 2858a7d6542SBram Moolenaar g:counter = 1 2868a7d6542SBram Moolenaar Increment() 2878a7d6542SBram Moolenaar Increment() 2888a7d6542SBram Moolenaar Increment() 2898a7d6542SBram Moolenaar " works with and without :call 2908a7d6542SBram Moolenaar assert_equal(4, g:counter) 291b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 2928a7d6542SBram Moolenaar unlet g:counter 2938a7d6542SBram Moolenaarenddef 2948a7d6542SBram Moolenaar 2958a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 2968a7d6542SBram Moolenaar let res = arg 2978a7d6542SBram Moolenaar for s in rest 2988a7d6542SBram Moolenaar res ..= ',' .. s 2998a7d6542SBram Moolenaar endfor 3008a7d6542SBram Moolenaar return res 3018a7d6542SBram Moolenaarenddef 3028a7d6542SBram Moolenaar 3038a7d6542SBram Moolenaardef Test_call_varargs() 3048a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 3058a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 3068a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 3078a7d6542SBram Moolenaarenddef 3088a7d6542SBram Moolenaar 309170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 310170fcfcfSBram Moolenaar return name 311170fcfcfSBram Moolenaarenddef 312170fcfcfSBram Moolenaar 313170fcfcfSBram Moolenaardef Test_call_default_args() 314170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 315170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 316170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 317170fcfcfSBram Moolenaarenddef 318170fcfcfSBram Moolenaar 319170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 320170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 321170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 322170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 323170fcfcfSBram Moolenaarendfunc 324170fcfcfSBram Moolenaar 325b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 326b35efa5eSBram Moolenaar echo a:arg 327b35efa5eSBram Moolenaarendfunc 328b35efa5eSBram Moolenaar 329bd5da371SBram Moolenaardef Test_call_wrong_args() 330b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 331b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 332bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 333b35efa5eSBram Moolenaarenddef 334b35efa5eSBram Moolenaar 335170fcfcfSBram Moolenaar" Default arg and varargs 336170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 337170fcfcfSBram Moolenaar let res = one .. ',' .. two 338170fcfcfSBram Moolenaar for s in rest 339170fcfcfSBram Moolenaar res ..= ',' .. s 340170fcfcfSBram Moolenaar endfor 341170fcfcfSBram Moolenaar return res 342170fcfcfSBram Moolenaarenddef 343170fcfcfSBram Moolenaar 344170fcfcfSBram Moolenaardef Test_call_def_varargs() 345170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 346170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 347170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 348170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 349170fcfcfSBram Moolenaarenddef 350170fcfcfSBram Moolenaar 35142a480bfSBram Moolenaardef Test_using_var_as_arg() 35242a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 35342a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 35442a480bfSBram Moolenaar call delete('Xdef') 35542a480bfSBram Moolenaarenddef 35642a480bfSBram Moolenaar 357b35efa5eSBram Moolenaardef Test_call_func_defined_later() 358b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 359b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 360b35efa5eSBram Moolenaarenddef 361170fcfcfSBram Moolenaar 362b35efa5eSBram Moolenaarfunc DefinedLater(arg) 36326e117e9SBram Moolenaar return a:arg 36426e117e9SBram Moolenaarendfunc 36526e117e9SBram Moolenaar 3667eeefd4aSBram Moolenaardef FuncWithForwardCall() 3677eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3687eeefd4aSBram Moolenaarenddef 3697eeefd4aSBram Moolenaar 3707eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3717eeefd4aSBram Moolenaar return arg 3727eeefd4aSBram Moolenaarenddef 3737eeefd4aSBram Moolenaar 3747eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3757eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3767eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 3777eeefd4aSBram Moolenaarenddef 3787eeefd4aSBram Moolenaar 3798a7d6542SBram Moolenaardef Test_return_type_wrong() 380978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 381978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 382978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 383978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 384cf3f8bf4SBram Moolenaar 3859be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 3869be61bbbSBram Moolenaar 387cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 388cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 3898a7d6542SBram Moolenaarenddef 3908a7d6542SBram Moolenaar 391bfe12043SBram Moolenaardef Test_arg_type_wrong() 392bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 393bfe12043SBram Moolenaarenddef 394bfe12043SBram Moolenaar 3958a7d6542SBram Moolenaardef Test_try_catch() 3968a7d6542SBram Moolenaar let l = [] 3978a7d6542SBram Moolenaar try 3988a7d6542SBram Moolenaar add(l, '1') 3998a7d6542SBram Moolenaar throw 'wrong' 4008a7d6542SBram Moolenaar add(l, '2') 4018a7d6542SBram Moolenaar catch 4028a7d6542SBram Moolenaar add(l, v:exception) 4038a7d6542SBram Moolenaar finally 4048a7d6542SBram Moolenaar add(l, '3') 4058a7d6542SBram Moolenaar endtry 4068a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4078a7d6542SBram Moolenaarenddef 4088a7d6542SBram Moolenaar 409257cc5eeSBram Moolenaardef ThrowFromDef() 410257cc5eeSBram Moolenaar throw 'getout' 411257cc5eeSBram Moolenaarenddef 412257cc5eeSBram Moolenaar 413257cc5eeSBram Moolenaarfunc CatchInFunc() 414257cc5eeSBram Moolenaar try 415257cc5eeSBram Moolenaar call ThrowFromDef() 416257cc5eeSBram Moolenaar catch 417257cc5eeSBram Moolenaar let g:thrown_func = v:exception 418257cc5eeSBram Moolenaar endtry 419257cc5eeSBram Moolenaarendfunc 420257cc5eeSBram Moolenaar 421257cc5eeSBram Moolenaardef CatchInDef() 422257cc5eeSBram Moolenaar try 423257cc5eeSBram Moolenaar ThrowFromDef() 424257cc5eeSBram Moolenaar catch 425257cc5eeSBram Moolenaar g:thrown_def = v:exception 426257cc5eeSBram Moolenaar endtry 427257cc5eeSBram Moolenaarenddef 428257cc5eeSBram Moolenaar 429f575adffSBram Moolenaardef ReturnFinally(): string 430f575adffSBram Moolenaar try 431f575adffSBram Moolenaar return 'intry' 432f575adffSBram Moolenaar finally 433f575adffSBram Moolenaar g:in_finally = 'finally' 434f575adffSBram Moolenaar endtry 435f575adffSBram Moolenaar return 'end' 436f575adffSBram Moolenaarenddef 437f575adffSBram Moolenaar 438257cc5eeSBram Moolenaardef Test_try_catch_nested() 439257cc5eeSBram Moolenaar CatchInFunc() 440257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 441257cc5eeSBram Moolenaar 442257cc5eeSBram Moolenaar CatchInDef() 443257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 444f575adffSBram Moolenaar 445f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 446f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 447f575adffSBram Moolenaarenddef 448f575adffSBram Moolenaar 449f575adffSBram Moolenaardef Test_try_catch_match() 450f575adffSBram Moolenaar let seq = 'a' 451f575adffSBram Moolenaar try 452f575adffSBram Moolenaar throw 'something' 453f575adffSBram Moolenaar catch /nothing/ 454f575adffSBram Moolenaar seq ..= 'x' 455f575adffSBram Moolenaar catch /some/ 456f575adffSBram Moolenaar seq ..= 'b' 457f575adffSBram Moolenaar catch /asdf/ 458f575adffSBram Moolenaar seq ..= 'x' 459f575adffSBram Moolenaar finally 460f575adffSBram Moolenaar seq ..= 'c' 461f575adffSBram Moolenaar endtry 462f575adffSBram Moolenaar assert_equal('abc', seq) 463257cc5eeSBram Moolenaarenddef 464257cc5eeSBram Moolenaar 4658a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 4668a7d6542SBram Moolenaar vim9script 4678a7d6542SBram Moolenaar let name: string = 'bob' 4688a7d6542SBram Moolenaar def Concat(arg: string): string 4698a7d6542SBram Moolenaar return name .. arg 4708a7d6542SBram Moolenaar enddef 4718a7d6542SBram Moolenaar let g:result = Concat('bie') 4728a7d6542SBram Moolenaar let g:localname = name 4738a7d6542SBram Moolenaar 4748a7d6542SBram Moolenaar export const CONST = 1234 4758a7d6542SBram Moolenaar export let exported = 9876 4766e587dcbSBram Moolenaar export let exp_name = 'John' 4778a7d6542SBram Moolenaar export def Exported(): string 4788a7d6542SBram Moolenaar return 'Exported' 4798a7d6542SBram Moolenaar enddef 4808a7d6542SBram MoolenaarEND 4818a7d6542SBram Moolenaar 4825269bd2aSBram Moolenaardef Test_vim9_import_export() 4838a7d6542SBram Moolenaar let import_script_lines =<< trim END 4848a7d6542SBram Moolenaar vim9script 4858a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 4868a7d6542SBram Moolenaar g:imported = exported 4876e587dcbSBram Moolenaar exported += 3 4886e587dcbSBram Moolenaar g:imported_added = exported 4898a7d6542SBram Moolenaar g:imported_func = Exported() 4906e587dcbSBram Moolenaar 4916e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 4926e587dcbSBram Moolenaar g:imported_name = exp_name 4936e587dcbSBram Moolenaar exp_name ..= ' Doe' 4946e587dcbSBram Moolenaar g:imported_name_appended = exp_name 4955381c7a1SBram Moolenaar g:imported_later = exported 4968a7d6542SBram Moolenaar END 4978a7d6542SBram Moolenaar 4988a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 4998a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5008a7d6542SBram Moolenaar 5018a7d6542SBram Moolenaar source Ximport.vim 5028a7d6542SBram Moolenaar 5038a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5048a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5058a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5066e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5075381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5088a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5096e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5106e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5118a7d6542SBram Moolenaar assert_false(exists('g:name')) 5128a7d6542SBram Moolenaar 5138a7d6542SBram Moolenaar unlet g:result 5148a7d6542SBram Moolenaar unlet g:localname 5158a7d6542SBram Moolenaar unlet g:imported 5166e587dcbSBram Moolenaar unlet g:imported_added 5175381c7a1SBram Moolenaar unlet g:imported_later 5188a7d6542SBram Moolenaar unlet g:imported_func 5196e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5208a7d6542SBram Moolenaar delete('Ximport.vim') 521f2d5c240SBram Moolenaar 5225381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5235381c7a1SBram Moolenaar vim9script 5245381c7a1SBram Moolenaar def ImportInDef() 5255381c7a1SBram Moolenaar import exported from './Xexport.vim' 5265381c7a1SBram Moolenaar g:imported = exported 5275381c7a1SBram Moolenaar exported += 7 5285381c7a1SBram Moolenaar g:imported_added = exported 5295381c7a1SBram Moolenaar enddef 5305381c7a1SBram Moolenaar ImportInDef() 5315381c7a1SBram Moolenaar END 5325381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5335381c7a1SBram Moolenaar source Ximport2.vim 5345381c7a1SBram Moolenaar " TODO: this should be 9879 5355381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5365381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5375381c7a1SBram Moolenaar unlet g:imported 5385381c7a1SBram Moolenaar unlet g:imported_added 5395381c7a1SBram Moolenaar delete('Ximport2.vim') 5405381c7a1SBram Moolenaar 541f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 542f2d5c240SBram Moolenaar vim9script 543f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 544f2d5c240SBram Moolenaar def UseExport() 545f2d5c240SBram Moolenaar g:imported = Export.exported 546f2d5c240SBram Moolenaar enddef 547f2d5c240SBram Moolenaar UseExport() 548f2d5c240SBram Moolenaar END 549f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 550f2d5c240SBram Moolenaar source Ximport.vim 5515381c7a1SBram Moolenaar assert_equal(9883, g:imported) 552f2d5c240SBram Moolenaar 553599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 554599c89c8SBram Moolenaar vim9script 555599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 556599c89c8SBram Moolenaar def Func() 557599c89c8SBram Moolenaar let dummy = 1 558599c89c8SBram Moolenaar let imported = Export + dummy 559599c89c8SBram Moolenaar enddef 560599c89c8SBram Moolenaar END 561599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 562599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 563599c89c8SBram Moolenaar 564599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 565599c89c8SBram Moolenaar vim9script 566599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 567599c89c8SBram Moolenaar def Func() 568599c89c8SBram Moolenaar let imported = Export . exported 569599c89c8SBram Moolenaar enddef 570599c89c8SBram Moolenaar END 571599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 572599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 573599c89c8SBram Moolenaar 574599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 575599c89c8SBram Moolenaar vim9script 576599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 577599c89c8SBram Moolenaar def Func() 578599c89c8SBram Moolenaar let imported = Export. 579599c89c8SBram Moolenaar enddef 580599c89c8SBram Moolenaar END 581599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 582599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 583599c89c8SBram Moolenaar 584f2d5c240SBram Moolenaar let import_star_lines =<< trim END 585f2d5c240SBram Moolenaar vim9script 586f2d5c240SBram Moolenaar import * from './Xexport.vim' 587f2d5c240SBram Moolenaar g:imported = exported 588f2d5c240SBram Moolenaar END 589f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 590f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 591f2d5c240SBram Moolenaar 592fa29c8abSBram Moolenaar " try to import something that exists but is not exported 593fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 594fa29c8abSBram Moolenaar vim9script 595fa29c8abSBram Moolenaar import name from './Xexport.vim' 596fa29c8abSBram Moolenaar END 597fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 598fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 599fa29c8abSBram Moolenaar 6005269bd2aSBram Moolenaar " try to import something that is already defined 6015269bd2aSBram Moolenaar let import_already_defined =<< trim END 6025269bd2aSBram Moolenaar vim9script 6035269bd2aSBram Moolenaar let exported = 'something' 6045269bd2aSBram Moolenaar import exported from './Xexport.vim' 6055269bd2aSBram Moolenaar END 6065269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6075269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6085269bd2aSBram Moolenaar 6095269bd2aSBram Moolenaar " try to import something that is already defined 6105269bd2aSBram Moolenaar import_already_defined =<< trim END 6115269bd2aSBram Moolenaar vim9script 6125269bd2aSBram Moolenaar let exported = 'something' 6135269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6145269bd2aSBram Moolenaar END 6155269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6165269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6175269bd2aSBram Moolenaar 6185269bd2aSBram Moolenaar " try to import something that is already defined 6195269bd2aSBram Moolenaar import_already_defined =<< trim END 6205269bd2aSBram Moolenaar vim9script 6215269bd2aSBram Moolenaar let exported = 'something' 6225269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6235269bd2aSBram Moolenaar END 6245269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6255269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6265269bd2aSBram Moolenaar 627fa29c8abSBram Moolenaar " import a very long name, requires making a copy 628fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 629fa29c8abSBram Moolenaar vim9script 630fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 631fa29c8abSBram Moolenaar END 632fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 633fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 634fa29c8abSBram Moolenaar 635fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 636fa29c8abSBram Moolenaar vim9script 637fa29c8abSBram Moolenaar import name './Xexport.vim' 638fa29c8abSBram Moolenaar END 639fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 640fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 641fa29c8abSBram Moolenaar 642fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 643fa29c8abSBram Moolenaar vim9script 644fa29c8abSBram Moolenaar import name from Xexport.vim 645fa29c8abSBram Moolenaar END 646fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 647fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 648fa29c8abSBram Moolenaar 649fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 650fa29c8abSBram Moolenaar vim9script 651fa29c8abSBram Moolenaar import name from './XnoExport.vim' 652fa29c8abSBram Moolenaar END 653fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 654fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 655fa29c8abSBram Moolenaar 656fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 657fa29c8abSBram Moolenaar vim9script 658fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 659fa29c8abSBram Moolenaar END 6605269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 6615269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 662fa29c8abSBram Moolenaar 663f2d5c240SBram Moolenaar delete('Ximport.vim') 6645269bd2aSBram Moolenaar delete('Ximport3.vim') 6658a7d6542SBram Moolenaar delete('Xexport.vim') 6668a7d6542SBram Moolenaar 667750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 668750802b5SBram Moolenaar set cpo&vi 669750802b5SBram Moolenaar let cpo_before = &cpo 670750802b5SBram Moolenaar let lines =<< trim END 671750802b5SBram Moolenaar vim9script 672750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 673750802b5SBram Moolenaar END 674750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 675750802b5SBram Moolenaar source Xvim9_script 676750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 677750802b5SBram Moolenaar set cpo&vim 678750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 679750802b5SBram Moolenaar delete('Xvim9_script') 680750802b5SBram Moolenaarenddef 681750802b5SBram Moolenaar 682750802b5SBram Moolenaardef Test_vim9script_fails() 6838a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 6848a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 685750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 686f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 687750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 688750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 689750802b5SBram Moolenaar 690750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 691750802b5SBram Moolenaar assert_fails('export something', 'E1042') 6928a7d6542SBram Moolenaarenddef 6938a7d6542SBram Moolenaar 6948a7d6542SBram Moolenaardef Test_vim9script_call() 6958a7d6542SBram Moolenaar let lines =<< trim END 6968a7d6542SBram Moolenaar vim9script 6978a7d6542SBram Moolenaar let var = '' 6988a7d6542SBram Moolenaar def MyFunc(arg: string) 6998a7d6542SBram Moolenaar var = arg 7008a7d6542SBram Moolenaar enddef 7018a7d6542SBram Moolenaar MyFunc('foobar') 7028a7d6542SBram Moolenaar assert_equal('foobar', var) 7038a7d6542SBram Moolenaar 7048a7d6542SBram Moolenaar let str = 'barfoo' 7058a7d6542SBram Moolenaar str->MyFunc() 7068a7d6542SBram Moolenaar assert_equal('barfoo', var) 7078a7d6542SBram Moolenaar 7088a7d6542SBram Moolenaar let g:value = 'value' 7098a7d6542SBram Moolenaar g:value->MyFunc() 7108a7d6542SBram Moolenaar assert_equal('value', var) 7118a7d6542SBram Moolenaar 7128a7d6542SBram Moolenaar let listvar = [] 7138a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 7148a7d6542SBram Moolenaar listvar = arg 7158a7d6542SBram Moolenaar enddef 7168a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 7178a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 7188a7d6542SBram Moolenaar 7198a7d6542SBram Moolenaar let dictvar = {} 7208a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 7218a7d6542SBram Moolenaar dictvar = arg 7228a7d6542SBram Moolenaar enddef 7238a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 7248a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 72533fa29cfSBram Moolenaar def CompiledDict() 72633fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 72733fa29cfSBram Moolenaar enddef 72833fa29cfSBram Moolenaar CompiledDict() 72933fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 73033fa29cfSBram Moolenaar 7318a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 7328a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 7330c6ceaf9SBram Moolenaar 7340c6ceaf9SBram Moolenaar ('text')->MyFunc() 7350c6ceaf9SBram Moolenaar assert_equal('text', var) 7360c6ceaf9SBram Moolenaar ("some")->MyFunc() 7370c6ceaf9SBram Moolenaar assert_equal('some', var) 7388a7d6542SBram Moolenaar END 7398a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 7408a7d6542SBram Moolenaar source Xcall.vim 7418a7d6542SBram Moolenaar delete('Xcall.vim') 7428a7d6542SBram Moolenaarenddef 7438a7d6542SBram Moolenaar 7448a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 7458a7d6542SBram Moolenaar let lines =<< trim END 7468a7d6542SBram Moolenaar vim9script 7478a7d6542SBram Moolenaar let var = '' 7488a7d6542SBram Moolenaar def MyFunc(arg: string) 7498a7d6542SBram Moolenaar let var = 123 7508a7d6542SBram Moolenaar enddef 7518a7d6542SBram Moolenaar END 7528a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 7538a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 7548a7d6542SBram Moolenaar delete('Xcall_decl.vim') 7558a7d6542SBram Moolenaarenddef 7568a7d6542SBram Moolenaar 7578a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 7588a7d6542SBram Moolenaar let lines =<< trim END 7598a7d6542SBram Moolenaar vim9script 7608a7d6542SBram Moolenaar const var = '' 7618a7d6542SBram Moolenaar def MyFunc(arg: string) 7628a7d6542SBram Moolenaar var = 'asdf' 7638a7d6542SBram Moolenaar enddef 7648a7d6542SBram Moolenaar END 7658a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 7668a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 7678a7d6542SBram Moolenaar delete('Xcall_const.vim') 7688a7d6542SBram Moolenaarenddef 7698a7d6542SBram Moolenaar 7708a7d6542SBram Moolenaardef Test_vim9script_reload() 7718a7d6542SBram Moolenaar let lines =<< trim END 7728a7d6542SBram Moolenaar vim9script 7738a7d6542SBram Moolenaar const var = '' 7748a7d6542SBram Moolenaar let valone = 1234 7758a7d6542SBram Moolenaar def MyFunc(arg: string) 7768a7d6542SBram Moolenaar valone = 5678 7778a7d6542SBram Moolenaar enddef 7788a7d6542SBram Moolenaar END 7798a7d6542SBram Moolenaar let morelines =<< trim END 7808a7d6542SBram Moolenaar let valtwo = 222 7818a7d6542SBram Moolenaar export def GetValtwo(): number 7828a7d6542SBram Moolenaar return valtwo 7838a7d6542SBram Moolenaar enddef 7848a7d6542SBram Moolenaar END 7858a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7868a7d6542SBram Moolenaar source Xreload.vim 7878a7d6542SBram Moolenaar source Xreload.vim 7888a7d6542SBram Moolenaar source Xreload.vim 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaar let testlines =<< trim END 7918a7d6542SBram Moolenaar vim9script 7928a7d6542SBram Moolenaar def TheFunc() 7938a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 7948a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 7958a7d6542SBram Moolenaar enddef 7968a7d6542SBram Moolenaar TheFunc() 7978a7d6542SBram Moolenaar END 7988a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 7998a7d6542SBram Moolenaar source Ximport.vim 8008a7d6542SBram Moolenaar 8018a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 8028a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 8038a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8048a7d6542SBram Moolenaar source Xreload.vim 8058a7d6542SBram Moolenaar source Ximport.vim 8068a7d6542SBram Moolenaar 8078a7d6542SBram Moolenaar " cannot declare a var twice 8088a7d6542SBram Moolenaar lines =<< trim END 8098a7d6542SBram Moolenaar vim9script 8108a7d6542SBram Moolenaar let valone = 1234 8118a7d6542SBram Moolenaar let valone = 5678 8128a7d6542SBram Moolenaar END 8138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8148a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 8158a7d6542SBram Moolenaar 8168a7d6542SBram Moolenaar delete('Xreload.vim') 8178a7d6542SBram Moolenaar delete('Ximport.vim') 8188a7d6542SBram Moolenaarenddef 8198a7d6542SBram Moolenaar 8208a7d6542SBram Moolenaardef Test_import_absolute() 8218a7d6542SBram Moolenaar let import_lines = [ 8228a7d6542SBram Moolenaar \ 'vim9script', 8238a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 824b283a8a6SBram Moolenaar \ 'def UseExported()', 8258a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 8264e12a5dfSBram Moolenaar \ ' exported = 8888', 8274e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 828b283a8a6SBram Moolenaar \ 'enddef', 829b283a8a6SBram Moolenaar \ 'UseExported()', 8304e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 8318a7d6542SBram Moolenaar \ ] 8328a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8338a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8348a7d6542SBram Moolenaar 8358a7d6542SBram Moolenaar source Ximport_abs.vim 8368a7d6542SBram Moolenaar 8378a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8384e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 839b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 840b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 841b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8424e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 8434e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 8444e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 8454e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 8464e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8474e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 8484e12a5dfSBram Moolenaar \, g:import_disassembled) 8498a7d6542SBram Moolenaar unlet g:imported_abs 8504e12a5dfSBram Moolenaar unlet g:import_disassembled 8518a7d6542SBram Moolenaar 8528a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8538a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8548a7d6542SBram Moolenaarenddef 8558a7d6542SBram Moolenaar 8568a7d6542SBram Moolenaardef Test_import_rtp() 8578a7d6542SBram Moolenaar let import_lines = [ 8588a7d6542SBram Moolenaar \ 'vim9script', 8598a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 8608a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 8618a7d6542SBram Moolenaar \ ] 8628a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 8638a7d6542SBram Moolenaar mkdir('import') 8648a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 8658a7d6542SBram Moolenaar 8668a7d6542SBram Moolenaar let save_rtp = &rtp 8678a7d6542SBram Moolenaar &rtp = getcwd() 8688a7d6542SBram Moolenaar source Ximport_rtp.vim 8698a7d6542SBram Moolenaar &rtp = save_rtp 8708a7d6542SBram Moolenaar 8718a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8728a7d6542SBram Moolenaar unlet g:imported_rtp 8738a7d6542SBram Moolenaar 8748a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 8758a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 8768a7d6542SBram Moolenaar delete('import', 'd') 8778a7d6542SBram Moolenaarenddef 8788a7d6542SBram Moolenaar 8798a7d6542SBram Moolenaardef Test_fixed_size_list() 8808a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 8818a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 8828a7d6542SBram Moolenaar l->remove(0) 8838a7d6542SBram Moolenaar l->add(5) 8848a7d6542SBram Moolenaar l->insert(99, 1) 8850f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 8868a7d6542SBram Moolenaarenddef 8878a7d6542SBram Moolenaar 888673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 889673660abSBram Moolenaar" recognized. 890673660abSBram Moolenaarfunc Test_function_python() 891673660abSBram Moolenaar CheckFeature python3 892673660abSBram Moolenaar let py = 'python3' 893673660abSBram Moolenaar execute py "<< EOF" 894673660abSBram Moolenaardef do_something(): 895673660abSBram Moolenaar return 1 896673660abSBram MoolenaarEOF 897673660abSBram Moolenaarendfunc 898673660abSBram Moolenaar 899158906cfSBram Moolenaardef IfElse(what: number): string 900158906cfSBram Moolenaar let res = '' 901158906cfSBram Moolenaar if what == 1 902158906cfSBram Moolenaar res = "one" 903158906cfSBram Moolenaar elseif what == 2 904158906cfSBram Moolenaar res = "two" 905a259d8d3SBram Moolenaar else 906158906cfSBram Moolenaar res = "three" 907a259d8d3SBram Moolenaar endif 908158906cfSBram Moolenaar return res 909a259d8d3SBram Moolenaarenddef 910a259d8d3SBram Moolenaar 911158906cfSBram Moolenaardef Test_if_elseif_else() 912158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 913158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 914158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9150f18b6d1SBram Moolenaarenddef 9160f18b6d1SBram Moolenaar 9176d69bf60SBram Moolenaarlet g:bool_true = v:true 9186d69bf60SBram Moolenaarlet g:bool_false = v:false 9196d69bf60SBram Moolenaar 9206d69bf60SBram Moolenaardef Test_if_const_expr() 9216d69bf60SBram Moolenaar let res = false 9226d69bf60SBram Moolenaar if true ? true : false 9236d69bf60SBram Moolenaar res = true 9246d69bf60SBram Moolenaar endif 9256d69bf60SBram Moolenaar assert_equal(true, res) 9266d69bf60SBram Moolenaar 9276d69bf60SBram Moolenaar res = false 9286d69bf60SBram Moolenaar if g:bool_true ? true : false 9296d69bf60SBram Moolenaar res = true 9306d69bf60SBram Moolenaar endif 9316d69bf60SBram Moolenaar assert_equal(true, res) 9326d69bf60SBram Moolenaar 9336d69bf60SBram Moolenaar res = false 9346d69bf60SBram Moolenaar if true ? g:bool_true : false 9356d69bf60SBram Moolenaar res = true 9366d69bf60SBram Moolenaar endif 9376d69bf60SBram Moolenaar assert_equal(true, res) 9386d69bf60SBram Moolenaar 9396d69bf60SBram Moolenaar res = false 9406d69bf60SBram Moolenaar if true ? true : g:bool_false 9416d69bf60SBram Moolenaar res = true 9426d69bf60SBram Moolenaar endif 9436d69bf60SBram Moolenaar assert_equal(true, res) 9446d69bf60SBram Moolenaar 9456d69bf60SBram Moolenaar res = false 9466d69bf60SBram Moolenaar if true ? false : true 9476d69bf60SBram Moolenaar res = true 9486d69bf60SBram Moolenaar endif 9496d69bf60SBram Moolenaar assert_equal(false, res) 9506d69bf60SBram Moolenaar 9516d69bf60SBram Moolenaar res = false 9526d69bf60SBram Moolenaar if false ? false : true 9536d69bf60SBram Moolenaar res = true 9546d69bf60SBram Moolenaar endif 9556d69bf60SBram Moolenaar assert_equal(true, res) 9566d69bf60SBram Moolenaar 9576d69bf60SBram Moolenaar res = false 9586d69bf60SBram Moolenaar if false ? true : false 9596d69bf60SBram Moolenaar res = true 9606d69bf60SBram Moolenaar endif 9616d69bf60SBram Moolenaar assert_equal(false, res) 9626d69bf60SBram Moolenaar 9636d69bf60SBram Moolenaar res = false 9646d69bf60SBram Moolenaar if true && true 9656d69bf60SBram Moolenaar res = true 9666d69bf60SBram Moolenaar endif 9676d69bf60SBram Moolenaar assert_equal(true, res) 9686d69bf60SBram Moolenaar 9696d69bf60SBram Moolenaar res = false 9706d69bf60SBram Moolenaar if true && false 9716d69bf60SBram Moolenaar res = true 9726d69bf60SBram Moolenaar endif 9736d69bf60SBram Moolenaar assert_equal(false, res) 9746d69bf60SBram Moolenaar 9756d69bf60SBram Moolenaar res = false 9766d69bf60SBram Moolenaar if g:bool_true && false 9776d69bf60SBram Moolenaar res = true 9786d69bf60SBram Moolenaar endif 9796d69bf60SBram Moolenaar assert_equal(false, res) 9806d69bf60SBram Moolenaar 9816d69bf60SBram Moolenaar res = false 9826d69bf60SBram Moolenaar if true && g:bool_false 9836d69bf60SBram Moolenaar res = true 9846d69bf60SBram Moolenaar endif 9856d69bf60SBram Moolenaar assert_equal(false, res) 9866d69bf60SBram Moolenaar 9876d69bf60SBram Moolenaar res = false 9886d69bf60SBram Moolenaar if false && false 9896d69bf60SBram Moolenaar res = true 9906d69bf60SBram Moolenaar endif 9916d69bf60SBram Moolenaar assert_equal(false, res) 9926d69bf60SBram Moolenaar 9936d69bf60SBram Moolenaar res = false 9946d69bf60SBram Moolenaar if true || false 9956d69bf60SBram Moolenaar res = true 9966d69bf60SBram Moolenaar endif 9976d69bf60SBram Moolenaar assert_equal(true, res) 9986d69bf60SBram Moolenaar 9996d69bf60SBram Moolenaar res = false 10006d69bf60SBram Moolenaar if g:bool_true || false 10016d69bf60SBram Moolenaar res = true 10026d69bf60SBram Moolenaar endif 10036d69bf60SBram Moolenaar assert_equal(true, res) 10046d69bf60SBram Moolenaar 10056d69bf60SBram Moolenaar res = false 10066d69bf60SBram Moolenaar if true || g:bool_false 10076d69bf60SBram Moolenaar res = true 10086d69bf60SBram Moolenaar endif 10096d69bf60SBram Moolenaar assert_equal(true, res) 10106d69bf60SBram Moolenaar 10116d69bf60SBram Moolenaar res = false 10126d69bf60SBram Moolenaar if false || false 10136d69bf60SBram Moolenaar res = true 10146d69bf60SBram Moolenaar endif 10156d69bf60SBram Moolenaar assert_equal(false, res) 10166d69bf60SBram Moolenaar 10176d69bf60SBram Moolenaarenddef 10186d69bf60SBram Moolenaar 101963ce4849SBram Moolenaardef Test_delfunc() 102063ce4849SBram Moolenaar let lines =<< trim END 102163ce4849SBram Moolenaar vim9script 102263ce4849SBram Moolenaar def GoneSoon() 102363ce4849SBram Moolenaar echo 'hello' 102463ce4849SBram Moolenaar enddef 102563ce4849SBram Moolenaar 102663ce4849SBram Moolenaar def CallGoneSoon() 102763ce4849SBram Moolenaar GoneSoon() 102863ce4849SBram Moolenaar enddef 102963ce4849SBram Moolenaar 103063ce4849SBram Moolenaar delfunc GoneSoon 103163ce4849SBram Moolenaar CallGoneSoon() 103263ce4849SBram Moolenaar END 103363ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 103463ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 103563ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 103663ce4849SBram Moolenaar 103763ce4849SBram Moolenaar delete('XToDelFunc') 103863ce4849SBram Moolenaarenddef 103963ce4849SBram Moolenaar 1040ad39c094SBram Moolenaardef Test_execute_cmd() 1041ad39c094SBram Moolenaar new 1042ad39c094SBram Moolenaar setline(1, 'default') 1043ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1044ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1045ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1046ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1047ad39c094SBram Moolenaar execute cmd1 cmd2 1048ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1049ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1050ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1051ad39c094SBram Moolenaar let cmd_first = 'call ' 1052ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1053ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1054ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1055ad39c094SBram Moolenaar bwipe! 1056ad39c094SBram Moolenaarenddef 1057ad39c094SBram Moolenaar 1058ad39c094SBram Moolenaardef Test_echo_cmd() 1059ad39c094SBram Moolenaar echo 'something' 1060ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1061ad39c094SBram Moolenaar 1062ad39c094SBram Moolenaar let str1 = 'some' 1063ad39c094SBram Moolenaar let str2 = 'more' 1064ad39c094SBram Moolenaar echo str1 str2 1065ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1066ad39c094SBram Moolenaarenddef 1067ad39c094SBram Moolenaar 106841fe0617SBram Moolenaardef Test_for_outside_of_function() 106941fe0617SBram Moolenaar let lines =<< trim END 107041fe0617SBram Moolenaar vim9script 107141fe0617SBram Moolenaar new 107241fe0617SBram Moolenaar for var in range(0, 3) 107341fe0617SBram Moolenaar append(line('$'), var) 107441fe0617SBram Moolenaar endfor 107541fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 107641fe0617SBram Moolenaar bwipe! 107741fe0617SBram Moolenaar END 107841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 107941fe0617SBram Moolenaar source Xvim9for.vim 108041fe0617SBram Moolenaar delete('Xvim9for.vim') 108141fe0617SBram Moolenaarenddef 10828a7d6542SBram Moolenaar 1083d0df1aacSBram Moolenaardef Test_while_loop() 1084d0df1aacSBram Moolenaar let result = '' 1085d0df1aacSBram Moolenaar let cnt = 0 1086d0df1aacSBram Moolenaar while cnt < 555 1087d0df1aacSBram Moolenaar if cnt == 3 1088d0df1aacSBram Moolenaar break 1089d0df1aacSBram Moolenaar endif 1090d0df1aacSBram Moolenaar cnt += 1 1091d0df1aacSBram Moolenaar if cnt == 2 1092d0df1aacSBram Moolenaar continue 1093d0df1aacSBram Moolenaar endif 1094d0df1aacSBram Moolenaar result ..= cnt .. '_' 1095d0df1aacSBram Moolenaar endwhile 1096d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1097d0df1aacSBram Moolenaarenddef 1098d0df1aacSBram Moolenaar 1099bd5da371SBram Moolenaardef Test_for_loop_fails() 1100bd5da371SBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1101bd5da371SBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1102bd5da371SBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1103bd5da371SBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1104bd5da371SBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1105bd5da371SBram Moolenaarenddef 1106bd5da371SBram Moolenaar 11079645e2d9SBram Moolenaardef Test_interrupt_loop() 110897acfc78SBram Moolenaar let caught = false 11099645e2d9SBram Moolenaar let x = 0 111097acfc78SBram Moolenaar try 11119645e2d9SBram Moolenaar while 1 11129645e2d9SBram Moolenaar x += 1 11139645e2d9SBram Moolenaar if x == 100 11149645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 11159645e2d9SBram Moolenaar endif 11169645e2d9SBram Moolenaar endwhile 111797acfc78SBram Moolenaar catch 111897acfc78SBram Moolenaar caught = true 111997acfc78SBram Moolenaar assert_equal(100, x) 112097acfc78SBram Moolenaar endtry 112197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 11229645e2d9SBram Moolenaarenddef 112320431c9dSBram Moolenaar 1124d0df1aacSBram Moolenaardef Test_substitute_cmd() 1125d0df1aacSBram Moolenaar new 1126d0df1aacSBram Moolenaar setline(1, 'something') 1127d0df1aacSBram Moolenaar :substitute(some(other( 1128d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1129d0df1aacSBram Moolenaar bwipe! 1130d0df1aacSBram Moolenaar 1131d0df1aacSBram Moolenaar " also when the context is Vim9 script 1132d0df1aacSBram Moolenaar let lines =<< trim END 1133d0df1aacSBram Moolenaar vim9script 1134d0df1aacSBram Moolenaar new 1135d0df1aacSBram Moolenaar setline(1, 'something') 1136d0df1aacSBram Moolenaar :substitute(some(other( 1137d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1138d0df1aacSBram Moolenaar bwipe! 1139d0df1aacSBram Moolenaar END 1140d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1141d0df1aacSBram Moolenaar source Xvim9lines 1142d0df1aacSBram Moolenaar 1143d0df1aacSBram Moolenaar delete('Xvim9lines') 1144d0df1aacSBram Moolenaarenddef 1145d0df1aacSBram Moolenaar 114620431c9dSBram Moolenaardef Test_redef_failure() 114720431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 114820431c9dSBram Moolenaar so Xdef 114920431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 115020431c9dSBram Moolenaar so Xdef 115120431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 115220431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 115320431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 115420431c9dSBram Moolenaar so Xdef 115520431c9dSBram Moolenaar call delete('Xdef') 115620431c9dSBram Moolenaar 115720431c9dSBram Moolenaar call assert_equal(0, Func0()) 115820431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 115920431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 116020431c9dSBram Moolenaar 116120431c9dSBram Moolenaar delfunc! Func0 116220431c9dSBram Moolenaar delfunc! Func1 116320431c9dSBram Moolenaar delfunc! Func2 116420431c9dSBram Moolenaarenddef 116520431c9dSBram Moolenaar 11667d941ee0SBram Moolenaar" Test for internal functions returning different types 11677d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 11687d941ee0SBram Moolenaar let lines =<< trim END 11697d941ee0SBram Moolenaar def RetFloat(): float 11707d941ee0SBram Moolenaar return ceil(1.456) 11717d941ee0SBram Moolenaar enddef 11727d941ee0SBram Moolenaar 11737d941ee0SBram Moolenaar def RetListAny(): list<any> 11747d941ee0SBram Moolenaar return items({'k' : 'v'}) 11757d941ee0SBram Moolenaar enddef 11767d941ee0SBram Moolenaar 11777d941ee0SBram Moolenaar def RetListString(): list<string> 11787d941ee0SBram Moolenaar return split('a:b:c', ':') 11797d941ee0SBram Moolenaar enddef 11807d941ee0SBram Moolenaar 11817d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 11827d941ee0SBram Moolenaar return getbufinfo() 11837d941ee0SBram Moolenaar enddef 11847d941ee0SBram Moolenaar 11857d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 11867d941ee0SBram Moolenaar return wordcount() 11877d941ee0SBram Moolenaar enddef 11887d941ee0SBram Moolenaar 11897d941ee0SBram Moolenaar def RetDictString(): dict<string> 11907d941ee0SBram Moolenaar return environ() 11917d941ee0SBram Moolenaar enddef 11927d941ee0SBram Moolenaar END 11937d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 11947d941ee0SBram Moolenaar source Xscript 11957d941ee0SBram Moolenaar 11967d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 11977d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 11987d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 11997d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 12007d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 12017d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 12027d941ee0SBram Moolenaar call delete('Xscript') 12037d941ee0SBram Moolenaarendfunc 12047d941ee0SBram Moolenaar 12057d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 12067d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 12077d941ee0SBram Moolenaar let l =<< trim END 12087d941ee0SBram Moolenaar def! FArgErr(): float 12097d941ee0SBram Moolenaar return ceil(1.1, 2) 12107d941ee0SBram Moolenaar enddef 12117d941ee0SBram Moolenaar END 12127d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12137d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 12147d941ee0SBram Moolenaar let l =<< trim END 12157d941ee0SBram Moolenaar def! FArgErr(): float 12167d941ee0SBram Moolenaar return ceil() 12177d941ee0SBram Moolenaar enddef 12187d941ee0SBram Moolenaar END 12197d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12207d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 12217d941ee0SBram Moolenaar call delete('Xinvalidarg') 12227d941ee0SBram Moolenaarendfunc 12237d941ee0SBram Moolenaar 12248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1225