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) 103*80c34ca3SBram Moolenaar &ts -= 3 104*80c34ca3SBram Moolenaar assert_equal(5, &ts) 105*80c34ca3SBram Moolenaar &ts *= 2 106*80c34ca3SBram Moolenaar assert_equal(10, &ts) 107*80c34ca3SBram Moolenaar &ts /= 3 108*80c34ca3SBram Moolenaar assert_equal(3, &ts) 109*80c34ca3SBram Moolenaar set ts=10 110*80c34ca3SBram Moolenaar &ts %= 4 111*80c34ca3SBram Moolenaar assert_equal(2, &ts) 112a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 113a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 114a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 115*80c34ca3SBram Moolenaar &ts = 8 116a8c17704SBram Moolenaar 117a8c17704SBram Moolenaar g:inc_counter += 1 118a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 119a8c17704SBram Moolenaar 120a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 121a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 122a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 123a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 124a8c17704SBram Moolenaar 125a8c17704SBram Moolenaar @a = 'areg' 126a8c17704SBram Moolenaar @a ..= 'add' 127a8c17704SBram Moolenaar assert_equal('aregadd', @a) 128a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 129a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 130e69f6d04SBram Moolenaar 131e69f6d04SBram Moolenaar v:errmsg = 'none' 132e69f6d04SBram Moolenaar v:errmsg ..= 'again' 133e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 134e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 135e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 136e69f6d04SBram Moolenaar 137e69f6d04SBram Moolenaar " Test default values. 138e69f6d04SBram Moolenaar let thebool: bool 139e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 140e69f6d04SBram Moolenaar 141e69f6d04SBram Moolenaar let thenumber: number 142e69f6d04SBram Moolenaar assert_equal(0, thenumber) 143e69f6d04SBram Moolenaar 144e69f6d04SBram Moolenaar if has('float') 145e69f6d04SBram Moolenaar let thefloat: float 146e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 147e69f6d04SBram Moolenaar endif 148e69f6d04SBram Moolenaar 149e69f6d04SBram Moolenaar let thestring: string 150e69f6d04SBram Moolenaar assert_equal('', thestring) 151e69f6d04SBram Moolenaar 152e69f6d04SBram Moolenaar let theblob: blob 153e69f6d04SBram Moolenaar assert_equal(0z, theblob) 154e69f6d04SBram Moolenaar 155e69f6d04SBram Moolenaar let thefunc: func 156e69f6d04SBram Moolenaar assert_equal(test_null_function(), thefunc) 157e69f6d04SBram Moolenaar 158e69f6d04SBram Moolenaar let thepartial: partial 159e69f6d04SBram Moolenaar assert_equal(test_null_partial(), thepartial) 160e69f6d04SBram Moolenaar 161e69f6d04SBram Moolenaar let thelist: list<any> 162e69f6d04SBram Moolenaar assert_equal([], thelist) 163e69f6d04SBram Moolenaar 164e69f6d04SBram Moolenaar let thedict: dict<any> 165e69f6d04SBram Moolenaar assert_equal({}, thedict) 166e69f6d04SBram Moolenaar 167e69f6d04SBram Moolenaar let thejob: job 168e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 169e69f6d04SBram Moolenaar 170e69f6d04SBram Moolenaar let thechannel: channel 171e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1728a7d6542SBram Moolenaarenddef 1738a7d6542SBram Moolenaar 1748a7d6542SBram Moolenaarfunc Test_assignment_failure() 1758a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1768a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1778a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1788a7d6542SBram Moolenaar 1798a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1808a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1818a7d6542SBram Moolenaar 1829be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1839be61bbbSBram Moolenaar 184e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1859be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1869be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1879be61bbbSBram Moolenaar 1889be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1899be61bbbSBram Moolenaar 1909be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1919be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1929be61bbbSBram Moolenaar 1939be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1949be61bbbSBram Moolenaar 1959be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1969be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 1979be61bbbSBram Moolenaar 19833fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 19933fa29cfSBram Moolenaar 2008a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2018a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2028a7d6542SBram Moolenaar 2038a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2048a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2058a7d6542SBram Moolenaar 2068a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2078a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 20842a480bfSBram Moolenaar 20942a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 21042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 211599c89c8SBram Moolenaarendfunc 212599c89c8SBram Moolenaar 213599c89c8SBram Moolenaarfunc Test_wrong_type() 214599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 215599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 216599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 217599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 218599c89c8SBram Moolenaar 219599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 220599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22142a480bfSBram Moolenaar 22242a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 22342a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 22442a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 22542a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 22642a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 22742a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 22842a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23242a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2338a7d6542SBram Moolenaarendfunc 2348a7d6542SBram Moolenaar 2358a7d6542SBram Moolenaarfunc Test_const() 2368a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2378a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2388a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2399be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2408a7d6542SBram Moolenaarendfunc 2418a7d6542SBram Moolenaar 2428a7d6542SBram Moolenaardef Test_block() 2438a7d6542SBram Moolenaar let outer = 1 2448a7d6542SBram Moolenaar { 2458a7d6542SBram Moolenaar let inner = 2 2468a7d6542SBram Moolenaar assert_equal(1, outer) 2478a7d6542SBram Moolenaar assert_equal(2, inner) 2488a7d6542SBram Moolenaar } 2498a7d6542SBram Moolenaar assert_equal(1, outer) 2508a7d6542SBram Moolenaarenddef 2518a7d6542SBram Moolenaar 2528a7d6542SBram Moolenaarfunc Test_block_failure() 2538a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 2548a7d6542SBram Moolenaarendfunc 2558a7d6542SBram Moolenaar 2568a7d6542SBram Moolenaardef ReturnString(): string 2578a7d6542SBram Moolenaar return 'string' 2588a7d6542SBram Moolenaarenddef 2598a7d6542SBram Moolenaar 2608a7d6542SBram Moolenaardef ReturnNumber(): number 2618a7d6542SBram Moolenaar return 123 2628a7d6542SBram Moolenaarenddef 2638a7d6542SBram Moolenaar 26409f28f49SBram Moolenaarlet g:notNumber = 'string' 26509f28f49SBram Moolenaar 26609f28f49SBram Moolenaardef ReturnGlobal(): number 26709f28f49SBram Moolenaar return g:notNumber 26809f28f49SBram Moolenaarenddef 26909f28f49SBram Moolenaar 2709be61bbbSBram Moolenaardef Test_return_something() 2718a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 2728a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 27309f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 2748a7d6542SBram Moolenaarenddef 2758a7d6542SBram Moolenaar 2769be61bbbSBram Moolenaarlet s:nothing = 0 2779be61bbbSBram Moolenaardef ReturnNothing() 2789be61bbbSBram Moolenaar s:nothing = 1 2799be61bbbSBram Moolenaar if true 2809be61bbbSBram Moolenaar return 2819be61bbbSBram Moolenaar endif 2829be61bbbSBram Moolenaar s:nothing = 2 2839be61bbbSBram Moolenaarenddef 2849be61bbbSBram Moolenaar 2859be61bbbSBram Moolenaardef Test_return_nothing() 2869be61bbbSBram Moolenaar ReturnNothing() 2879be61bbbSBram Moolenaar assert_equal(1, s:nothing) 2889be61bbbSBram Moolenaarenddef 2899be61bbbSBram Moolenaar 2908a7d6542SBram Moolenaarfunc Increment() 2918a7d6542SBram Moolenaar let g:counter += 1 2928a7d6542SBram Moolenaarendfunc 2938a7d6542SBram Moolenaar 2948a7d6542SBram Moolenaardef Test_call_ufunc_count() 2958a7d6542SBram Moolenaar g:counter = 1 2968a7d6542SBram Moolenaar Increment() 2978a7d6542SBram Moolenaar Increment() 2988a7d6542SBram Moolenaar Increment() 2998a7d6542SBram Moolenaar " works with and without :call 3008a7d6542SBram Moolenaar assert_equal(4, g:counter) 301b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 3028a7d6542SBram Moolenaar unlet g:counter 3038a7d6542SBram Moolenaarenddef 3048a7d6542SBram Moolenaar 3058a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 3068a7d6542SBram Moolenaar let res = arg 3078a7d6542SBram Moolenaar for s in rest 3088a7d6542SBram Moolenaar res ..= ',' .. s 3098a7d6542SBram Moolenaar endfor 3108a7d6542SBram Moolenaar return res 3118a7d6542SBram Moolenaarenddef 3128a7d6542SBram Moolenaar 3138a7d6542SBram Moolenaardef Test_call_varargs() 3148a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 3158a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 3168a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 3178a7d6542SBram Moolenaarenddef 3188a7d6542SBram Moolenaar 319170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 320170fcfcfSBram Moolenaar return name 321170fcfcfSBram Moolenaarenddef 322170fcfcfSBram Moolenaar 323170fcfcfSBram Moolenaardef Test_call_default_args() 324170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 325170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 326170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 327170fcfcfSBram Moolenaarenddef 328170fcfcfSBram Moolenaar 329170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 330170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 331170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 332170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 333170fcfcfSBram Moolenaarendfunc 334170fcfcfSBram Moolenaar 335b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 336b35efa5eSBram Moolenaar echo a:arg 337b35efa5eSBram Moolenaarendfunc 338b35efa5eSBram Moolenaar 339bd5da371SBram Moolenaardef Test_call_wrong_args() 340b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 341b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 342bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 343b35efa5eSBram Moolenaarenddef 344b35efa5eSBram Moolenaar 345170fcfcfSBram Moolenaar" Default arg and varargs 346170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 347170fcfcfSBram Moolenaar let res = one .. ',' .. two 348170fcfcfSBram Moolenaar for s in rest 349170fcfcfSBram Moolenaar res ..= ',' .. s 350170fcfcfSBram Moolenaar endfor 351170fcfcfSBram Moolenaar return res 352170fcfcfSBram Moolenaarenddef 353170fcfcfSBram Moolenaar 354170fcfcfSBram Moolenaardef Test_call_def_varargs() 355170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 356170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 357170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 358170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 359170fcfcfSBram Moolenaarenddef 360170fcfcfSBram Moolenaar 36142a480bfSBram Moolenaardef Test_using_var_as_arg() 36242a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 36342a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 36442a480bfSBram Moolenaar call delete('Xdef') 36542a480bfSBram Moolenaarenddef 36642a480bfSBram Moolenaar 367b35efa5eSBram Moolenaardef Test_call_func_defined_later() 368b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 369b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 370b35efa5eSBram Moolenaarenddef 371170fcfcfSBram Moolenaar 372b35efa5eSBram Moolenaarfunc DefinedLater(arg) 37326e117e9SBram Moolenaar return a:arg 37426e117e9SBram Moolenaarendfunc 37526e117e9SBram Moolenaar 3767eeefd4aSBram Moolenaardef FuncWithForwardCall() 3777eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3787eeefd4aSBram Moolenaarenddef 3797eeefd4aSBram Moolenaar 3807eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3817eeefd4aSBram Moolenaar return arg 3827eeefd4aSBram Moolenaarenddef 3837eeefd4aSBram Moolenaar 3847eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3857eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3867eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 3877eeefd4aSBram Moolenaarenddef 3887eeefd4aSBram Moolenaar 3898a7d6542SBram Moolenaardef Test_return_type_wrong() 390978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 391978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 392978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 393978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 394cf3f8bf4SBram Moolenaar 3959be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 3969be61bbbSBram Moolenaar 397cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 398cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 3998a7d6542SBram Moolenaarenddef 4008a7d6542SBram Moolenaar 401bfe12043SBram Moolenaardef Test_arg_type_wrong() 402bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 403bfe12043SBram Moolenaarenddef 404bfe12043SBram Moolenaar 4058a7d6542SBram Moolenaardef Test_try_catch() 4068a7d6542SBram Moolenaar let l = [] 4078a7d6542SBram Moolenaar try 4088a7d6542SBram Moolenaar add(l, '1') 4098a7d6542SBram Moolenaar throw 'wrong' 4108a7d6542SBram Moolenaar add(l, '2') 4118a7d6542SBram Moolenaar catch 4128a7d6542SBram Moolenaar add(l, v:exception) 4138a7d6542SBram Moolenaar finally 4148a7d6542SBram Moolenaar add(l, '3') 4158a7d6542SBram Moolenaar endtry 4168a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4178a7d6542SBram Moolenaarenddef 4188a7d6542SBram Moolenaar 419257cc5eeSBram Moolenaardef ThrowFromDef() 420257cc5eeSBram Moolenaar throw 'getout' 421257cc5eeSBram Moolenaarenddef 422257cc5eeSBram Moolenaar 423257cc5eeSBram Moolenaarfunc CatchInFunc() 424257cc5eeSBram Moolenaar try 425257cc5eeSBram Moolenaar call ThrowFromDef() 426257cc5eeSBram Moolenaar catch 427257cc5eeSBram Moolenaar let g:thrown_func = v:exception 428257cc5eeSBram Moolenaar endtry 429257cc5eeSBram Moolenaarendfunc 430257cc5eeSBram Moolenaar 431257cc5eeSBram Moolenaardef CatchInDef() 432257cc5eeSBram Moolenaar try 433257cc5eeSBram Moolenaar ThrowFromDef() 434257cc5eeSBram Moolenaar catch 435257cc5eeSBram Moolenaar g:thrown_def = v:exception 436257cc5eeSBram Moolenaar endtry 437257cc5eeSBram Moolenaarenddef 438257cc5eeSBram Moolenaar 439f575adffSBram Moolenaardef ReturnFinally(): string 440f575adffSBram Moolenaar try 441f575adffSBram Moolenaar return 'intry' 442f575adffSBram Moolenaar finally 443f575adffSBram Moolenaar g:in_finally = 'finally' 444f575adffSBram Moolenaar endtry 445f575adffSBram Moolenaar return 'end' 446f575adffSBram Moolenaarenddef 447f575adffSBram Moolenaar 448257cc5eeSBram Moolenaardef Test_try_catch_nested() 449257cc5eeSBram Moolenaar CatchInFunc() 450257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 451257cc5eeSBram Moolenaar 452257cc5eeSBram Moolenaar CatchInDef() 453257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 454f575adffSBram Moolenaar 455f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 456f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 457f575adffSBram Moolenaarenddef 458f575adffSBram Moolenaar 459f575adffSBram Moolenaardef Test_try_catch_match() 460f575adffSBram Moolenaar let seq = 'a' 461f575adffSBram Moolenaar try 462f575adffSBram Moolenaar throw 'something' 463f575adffSBram Moolenaar catch /nothing/ 464f575adffSBram Moolenaar seq ..= 'x' 465f575adffSBram Moolenaar catch /some/ 466f575adffSBram Moolenaar seq ..= 'b' 467f575adffSBram Moolenaar catch /asdf/ 468f575adffSBram Moolenaar seq ..= 'x' 469f575adffSBram Moolenaar finally 470f575adffSBram Moolenaar seq ..= 'c' 471f575adffSBram Moolenaar endtry 472f575adffSBram Moolenaar assert_equal('abc', seq) 473257cc5eeSBram Moolenaarenddef 474257cc5eeSBram Moolenaar 4758a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 4768a7d6542SBram Moolenaar vim9script 4778a7d6542SBram Moolenaar let name: string = 'bob' 4788a7d6542SBram Moolenaar def Concat(arg: string): string 4798a7d6542SBram Moolenaar return name .. arg 4808a7d6542SBram Moolenaar enddef 4818a7d6542SBram Moolenaar let g:result = Concat('bie') 4828a7d6542SBram Moolenaar let g:localname = name 4838a7d6542SBram Moolenaar 4848a7d6542SBram Moolenaar export const CONST = 1234 4858a7d6542SBram Moolenaar export let exported = 9876 4866e587dcbSBram Moolenaar export let exp_name = 'John' 4878a7d6542SBram Moolenaar export def Exported(): string 4888a7d6542SBram Moolenaar return 'Exported' 4898a7d6542SBram Moolenaar enddef 4908a7d6542SBram MoolenaarEND 4918a7d6542SBram Moolenaar 4925269bd2aSBram Moolenaardef Test_vim9_import_export() 4938a7d6542SBram Moolenaar let import_script_lines =<< trim END 4948a7d6542SBram Moolenaar vim9script 4958a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 4968a7d6542SBram Moolenaar g:imported = exported 4976e587dcbSBram Moolenaar exported += 3 4986e587dcbSBram Moolenaar g:imported_added = exported 4998a7d6542SBram Moolenaar g:imported_func = Exported() 5006e587dcbSBram Moolenaar 5016e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5026e587dcbSBram Moolenaar g:imported_name = exp_name 5036e587dcbSBram Moolenaar exp_name ..= ' Doe' 5046e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5055381c7a1SBram Moolenaar g:imported_later = exported 5068a7d6542SBram Moolenaar END 5078a7d6542SBram Moolenaar 5088a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5098a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5108a7d6542SBram Moolenaar 5118a7d6542SBram Moolenaar source Ximport.vim 5128a7d6542SBram Moolenaar 5138a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5148a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5158a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5166e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5175381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5188a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5196e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5206e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5218a7d6542SBram Moolenaar assert_false(exists('g:name')) 5228a7d6542SBram Moolenaar 5238a7d6542SBram Moolenaar unlet g:result 5248a7d6542SBram Moolenaar unlet g:localname 5258a7d6542SBram Moolenaar unlet g:imported 5266e587dcbSBram Moolenaar unlet g:imported_added 5275381c7a1SBram Moolenaar unlet g:imported_later 5288a7d6542SBram Moolenaar unlet g:imported_func 5296e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5308a7d6542SBram Moolenaar delete('Ximport.vim') 531f2d5c240SBram Moolenaar 5325381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5335381c7a1SBram Moolenaar vim9script 5345381c7a1SBram Moolenaar def ImportInDef() 5355381c7a1SBram Moolenaar import exported from './Xexport.vim' 5365381c7a1SBram Moolenaar g:imported = exported 5375381c7a1SBram Moolenaar exported += 7 5385381c7a1SBram Moolenaar g:imported_added = exported 5395381c7a1SBram Moolenaar enddef 5405381c7a1SBram Moolenaar ImportInDef() 5415381c7a1SBram Moolenaar END 5425381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5435381c7a1SBram Moolenaar source Ximport2.vim 5445381c7a1SBram Moolenaar " TODO: this should be 9879 5455381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5465381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5475381c7a1SBram Moolenaar unlet g:imported 5485381c7a1SBram Moolenaar unlet g:imported_added 5495381c7a1SBram Moolenaar delete('Ximport2.vim') 5505381c7a1SBram Moolenaar 551f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 552f2d5c240SBram Moolenaar vim9script 553f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 554f2d5c240SBram Moolenaar def UseExport() 555f2d5c240SBram Moolenaar g:imported = Export.exported 556f2d5c240SBram Moolenaar enddef 557f2d5c240SBram Moolenaar UseExport() 558f2d5c240SBram Moolenaar END 559f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 560f2d5c240SBram Moolenaar source Ximport.vim 5615381c7a1SBram Moolenaar assert_equal(9883, g:imported) 562f2d5c240SBram Moolenaar 563599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 564599c89c8SBram Moolenaar vim9script 565599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 566599c89c8SBram Moolenaar def Func() 567599c89c8SBram Moolenaar let dummy = 1 568599c89c8SBram Moolenaar let imported = Export + dummy 569599c89c8SBram Moolenaar enddef 570599c89c8SBram Moolenaar END 571599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 572599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 573599c89c8SBram Moolenaar 574599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 575599c89c8SBram Moolenaar vim9script 576599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 577599c89c8SBram Moolenaar def Func() 578599c89c8SBram Moolenaar let imported = Export . exported 579599c89c8SBram Moolenaar enddef 580599c89c8SBram Moolenaar END 581599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 582599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 583599c89c8SBram Moolenaar 584599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 585599c89c8SBram Moolenaar vim9script 586599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 587599c89c8SBram Moolenaar def Func() 588599c89c8SBram Moolenaar let imported = Export. 589599c89c8SBram Moolenaar enddef 590599c89c8SBram Moolenaar END 591599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 592599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 593599c89c8SBram Moolenaar 594f2d5c240SBram Moolenaar let import_star_lines =<< trim END 595f2d5c240SBram Moolenaar vim9script 596f2d5c240SBram Moolenaar import * from './Xexport.vim' 597f2d5c240SBram Moolenaar g:imported = exported 598f2d5c240SBram Moolenaar END 599f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 600f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 601f2d5c240SBram Moolenaar 602fa29c8abSBram Moolenaar " try to import something that exists but is not exported 603fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 604fa29c8abSBram Moolenaar vim9script 605fa29c8abSBram Moolenaar import name from './Xexport.vim' 606fa29c8abSBram Moolenaar END 607fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 608fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 609fa29c8abSBram Moolenaar 6105269bd2aSBram Moolenaar " try to import something that is already defined 6115269bd2aSBram Moolenaar let import_already_defined =<< trim END 6125269bd2aSBram Moolenaar vim9script 6135269bd2aSBram Moolenaar let exported = 'something' 6145269bd2aSBram Moolenaar import exported from './Xexport.vim' 6155269bd2aSBram Moolenaar END 6165269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6175269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6185269bd2aSBram Moolenaar 6195269bd2aSBram Moolenaar " try to import something that is already defined 6205269bd2aSBram Moolenaar import_already_defined =<< trim END 6215269bd2aSBram Moolenaar vim9script 6225269bd2aSBram Moolenaar let exported = 'something' 6235269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6245269bd2aSBram Moolenaar END 6255269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6265269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6275269bd2aSBram Moolenaar 6285269bd2aSBram Moolenaar " try to import something that is already defined 6295269bd2aSBram Moolenaar import_already_defined =<< trim END 6305269bd2aSBram Moolenaar vim9script 6315269bd2aSBram Moolenaar let exported = 'something' 6325269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6335269bd2aSBram Moolenaar END 6345269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6355269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6365269bd2aSBram Moolenaar 637fa29c8abSBram Moolenaar " import a very long name, requires making a copy 638fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 639fa29c8abSBram Moolenaar vim9script 640fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 641fa29c8abSBram Moolenaar END 642fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 643fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 644fa29c8abSBram Moolenaar 645fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 646fa29c8abSBram Moolenaar vim9script 647fa29c8abSBram Moolenaar import name './Xexport.vim' 648fa29c8abSBram Moolenaar END 649fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 650fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 651fa29c8abSBram Moolenaar 652fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 653fa29c8abSBram Moolenaar vim9script 654fa29c8abSBram Moolenaar import name from Xexport.vim 655fa29c8abSBram Moolenaar END 656fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 657fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 658fa29c8abSBram Moolenaar 659fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 660fa29c8abSBram Moolenaar vim9script 661fa29c8abSBram Moolenaar import name from './XnoExport.vim' 662fa29c8abSBram Moolenaar END 663fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 664fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 665fa29c8abSBram Moolenaar 666fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 667fa29c8abSBram Moolenaar vim9script 668fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 669fa29c8abSBram Moolenaar END 6705269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 6715269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 672fa29c8abSBram Moolenaar 673f2d5c240SBram Moolenaar delete('Ximport.vim') 6745269bd2aSBram Moolenaar delete('Ximport3.vim') 6758a7d6542SBram Moolenaar delete('Xexport.vim') 6768a7d6542SBram Moolenaar 677750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 678750802b5SBram Moolenaar set cpo&vi 679750802b5SBram Moolenaar let cpo_before = &cpo 680750802b5SBram Moolenaar let lines =<< trim END 681750802b5SBram Moolenaar vim9script 682750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 683750802b5SBram Moolenaar END 684750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 685750802b5SBram Moolenaar source Xvim9_script 686750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 687750802b5SBram Moolenaar set cpo&vim 688750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 689750802b5SBram Moolenaar delete('Xvim9_script') 690750802b5SBram Moolenaarenddef 691750802b5SBram Moolenaar 692750802b5SBram Moolenaardef Test_vim9script_fails() 6938a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 6948a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 695750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 696f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 697750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 698750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 699750802b5SBram Moolenaar 700750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 701750802b5SBram Moolenaar assert_fails('export something', 'E1042') 7028a7d6542SBram Moolenaarenddef 7038a7d6542SBram Moolenaar 7048a7d6542SBram Moolenaardef Test_vim9script_call() 7058a7d6542SBram Moolenaar let lines =<< trim END 7068a7d6542SBram Moolenaar vim9script 7078a7d6542SBram Moolenaar let var = '' 7088a7d6542SBram Moolenaar def MyFunc(arg: string) 7098a7d6542SBram Moolenaar var = arg 7108a7d6542SBram Moolenaar enddef 7118a7d6542SBram Moolenaar MyFunc('foobar') 7128a7d6542SBram Moolenaar assert_equal('foobar', var) 7138a7d6542SBram Moolenaar 7148a7d6542SBram Moolenaar let str = 'barfoo' 7158a7d6542SBram Moolenaar str->MyFunc() 7168a7d6542SBram Moolenaar assert_equal('barfoo', var) 7178a7d6542SBram Moolenaar 7188a7d6542SBram Moolenaar let g:value = 'value' 7198a7d6542SBram Moolenaar g:value->MyFunc() 7208a7d6542SBram Moolenaar assert_equal('value', var) 7218a7d6542SBram Moolenaar 7228a7d6542SBram Moolenaar let listvar = [] 7238a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 7248a7d6542SBram Moolenaar listvar = arg 7258a7d6542SBram Moolenaar enddef 7268a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 7278a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 7288a7d6542SBram Moolenaar 7298a7d6542SBram Moolenaar let dictvar = {} 7308a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 7318a7d6542SBram Moolenaar dictvar = arg 7328a7d6542SBram Moolenaar enddef 7338a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 7348a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 73533fa29cfSBram Moolenaar def CompiledDict() 73633fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 73733fa29cfSBram Moolenaar enddef 73833fa29cfSBram Moolenaar CompiledDict() 73933fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 74033fa29cfSBram Moolenaar 7418a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 7428a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 7430c6ceaf9SBram Moolenaar 7440c6ceaf9SBram Moolenaar ('text')->MyFunc() 7450c6ceaf9SBram Moolenaar assert_equal('text', var) 7460c6ceaf9SBram Moolenaar ("some")->MyFunc() 7470c6ceaf9SBram Moolenaar assert_equal('some', var) 7488a7d6542SBram Moolenaar END 7498a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 7508a7d6542SBram Moolenaar source Xcall.vim 7518a7d6542SBram Moolenaar delete('Xcall.vim') 7528a7d6542SBram Moolenaarenddef 7538a7d6542SBram Moolenaar 7548a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 7558a7d6542SBram Moolenaar let lines =<< trim END 7568a7d6542SBram Moolenaar vim9script 7578a7d6542SBram Moolenaar let var = '' 7588a7d6542SBram Moolenaar def MyFunc(arg: string) 7598a7d6542SBram Moolenaar let var = 123 7608a7d6542SBram Moolenaar enddef 7618a7d6542SBram Moolenaar END 7628a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 7638a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 7648a7d6542SBram Moolenaar delete('Xcall_decl.vim') 7658a7d6542SBram Moolenaarenddef 7668a7d6542SBram Moolenaar 7678a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 7688a7d6542SBram Moolenaar let lines =<< trim END 7698a7d6542SBram Moolenaar vim9script 7708a7d6542SBram Moolenaar const var = '' 7718a7d6542SBram Moolenaar def MyFunc(arg: string) 7728a7d6542SBram Moolenaar var = 'asdf' 7738a7d6542SBram Moolenaar enddef 7748a7d6542SBram Moolenaar END 7758a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 7768a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 7778a7d6542SBram Moolenaar delete('Xcall_const.vim') 7788a7d6542SBram Moolenaarenddef 7798a7d6542SBram Moolenaar 7808a7d6542SBram Moolenaardef Test_vim9script_reload() 7818a7d6542SBram Moolenaar let lines =<< trim END 7828a7d6542SBram Moolenaar vim9script 7838a7d6542SBram Moolenaar const var = '' 7848a7d6542SBram Moolenaar let valone = 1234 7858a7d6542SBram Moolenaar def MyFunc(arg: string) 7868a7d6542SBram Moolenaar valone = 5678 7878a7d6542SBram Moolenaar enddef 7888a7d6542SBram Moolenaar END 7898a7d6542SBram Moolenaar let morelines =<< trim END 7908a7d6542SBram Moolenaar let valtwo = 222 7918a7d6542SBram Moolenaar export def GetValtwo(): number 7928a7d6542SBram Moolenaar return valtwo 7938a7d6542SBram Moolenaar enddef 7948a7d6542SBram Moolenaar END 7958a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7968a7d6542SBram Moolenaar source Xreload.vim 7978a7d6542SBram Moolenaar source Xreload.vim 7988a7d6542SBram Moolenaar source Xreload.vim 7998a7d6542SBram Moolenaar 8008a7d6542SBram Moolenaar let testlines =<< trim END 8018a7d6542SBram Moolenaar vim9script 8028a7d6542SBram Moolenaar def TheFunc() 8038a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 8048a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 8058a7d6542SBram Moolenaar enddef 8068a7d6542SBram Moolenaar TheFunc() 8078a7d6542SBram Moolenaar END 8088a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 8098a7d6542SBram Moolenaar source Ximport.vim 8108a7d6542SBram Moolenaar 8118a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 8128a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 8138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8148a7d6542SBram Moolenaar source Xreload.vim 8158a7d6542SBram Moolenaar source Ximport.vim 8168a7d6542SBram Moolenaar 8178a7d6542SBram Moolenaar " cannot declare a var twice 8188a7d6542SBram Moolenaar lines =<< trim END 8198a7d6542SBram Moolenaar vim9script 8208a7d6542SBram Moolenaar let valone = 1234 8218a7d6542SBram Moolenaar let valone = 5678 8228a7d6542SBram Moolenaar END 8238a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8248a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 8258a7d6542SBram Moolenaar 8268a7d6542SBram Moolenaar delete('Xreload.vim') 8278a7d6542SBram Moolenaar delete('Ximport.vim') 8288a7d6542SBram Moolenaarenddef 8298a7d6542SBram Moolenaar 8308a7d6542SBram Moolenaardef Test_import_absolute() 8318a7d6542SBram Moolenaar let import_lines = [ 8328a7d6542SBram Moolenaar \ 'vim9script', 8338a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 834b283a8a6SBram Moolenaar \ 'def UseExported()', 8358a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 8364e12a5dfSBram Moolenaar \ ' exported = 8888', 8374e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 838b283a8a6SBram Moolenaar \ 'enddef', 839b283a8a6SBram Moolenaar \ 'UseExported()', 8404e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 8418a7d6542SBram Moolenaar \ ] 8428a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8438a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8448a7d6542SBram Moolenaar 8458a7d6542SBram Moolenaar source Ximport_abs.vim 8468a7d6542SBram Moolenaar 8478a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8484e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 849b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 850b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 851b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8524e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 8534e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 8544e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 8554e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 8564e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8574e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 8584e12a5dfSBram Moolenaar \, g:import_disassembled) 8598a7d6542SBram Moolenaar unlet g:imported_abs 8604e12a5dfSBram Moolenaar unlet g:import_disassembled 8618a7d6542SBram Moolenaar 8628a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8638a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8648a7d6542SBram Moolenaarenddef 8658a7d6542SBram Moolenaar 8668a7d6542SBram Moolenaardef Test_import_rtp() 8678a7d6542SBram Moolenaar let import_lines = [ 8688a7d6542SBram Moolenaar \ 'vim9script', 8698a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 8708a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 8718a7d6542SBram Moolenaar \ ] 8728a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 8738a7d6542SBram Moolenaar mkdir('import') 8748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaar let save_rtp = &rtp 8778a7d6542SBram Moolenaar &rtp = getcwd() 8788a7d6542SBram Moolenaar source Ximport_rtp.vim 8798a7d6542SBram Moolenaar &rtp = save_rtp 8808a7d6542SBram Moolenaar 8818a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8828a7d6542SBram Moolenaar unlet g:imported_rtp 8838a7d6542SBram Moolenaar 8848a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 8858a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 8868a7d6542SBram Moolenaar delete('import', 'd') 8878a7d6542SBram Moolenaarenddef 8888a7d6542SBram Moolenaar 8898a7d6542SBram Moolenaardef Test_fixed_size_list() 8908a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 8918a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 8928a7d6542SBram Moolenaar l->remove(0) 8938a7d6542SBram Moolenaar l->add(5) 8948a7d6542SBram Moolenaar l->insert(99, 1) 8950f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 8968a7d6542SBram Moolenaarenddef 8978a7d6542SBram Moolenaar 898673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 899673660abSBram Moolenaar" recognized. 900673660abSBram Moolenaarfunc Test_function_python() 901673660abSBram Moolenaar CheckFeature python3 902673660abSBram Moolenaar let py = 'python3' 903673660abSBram Moolenaar execute py "<< EOF" 904673660abSBram Moolenaardef do_something(): 905673660abSBram Moolenaar return 1 906673660abSBram MoolenaarEOF 907673660abSBram Moolenaarendfunc 908673660abSBram Moolenaar 909158906cfSBram Moolenaardef IfElse(what: number): string 910158906cfSBram Moolenaar let res = '' 911158906cfSBram Moolenaar if what == 1 912158906cfSBram Moolenaar res = "one" 913158906cfSBram Moolenaar elseif what == 2 914158906cfSBram Moolenaar res = "two" 915a259d8d3SBram Moolenaar else 916158906cfSBram Moolenaar res = "three" 917a259d8d3SBram Moolenaar endif 918158906cfSBram Moolenaar return res 919a259d8d3SBram Moolenaarenddef 920a259d8d3SBram Moolenaar 921158906cfSBram Moolenaardef Test_if_elseif_else() 922158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 923158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 924158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9250f18b6d1SBram Moolenaarenddef 9260f18b6d1SBram Moolenaar 9276d69bf60SBram Moolenaarlet g:bool_true = v:true 9286d69bf60SBram Moolenaarlet g:bool_false = v:false 9296d69bf60SBram Moolenaar 9306d69bf60SBram Moolenaardef Test_if_const_expr() 9316d69bf60SBram Moolenaar let res = false 9326d69bf60SBram Moolenaar if true ? true : false 9336d69bf60SBram Moolenaar res = true 9346d69bf60SBram Moolenaar endif 9356d69bf60SBram Moolenaar assert_equal(true, res) 9366d69bf60SBram Moolenaar 9376d69bf60SBram Moolenaar res = false 9386d69bf60SBram Moolenaar if g:bool_true ? true : false 9396d69bf60SBram Moolenaar res = true 9406d69bf60SBram Moolenaar endif 9416d69bf60SBram Moolenaar assert_equal(true, res) 9426d69bf60SBram Moolenaar 9436d69bf60SBram Moolenaar res = false 9446d69bf60SBram Moolenaar if true ? g:bool_true : false 9456d69bf60SBram Moolenaar res = true 9466d69bf60SBram Moolenaar endif 9476d69bf60SBram Moolenaar assert_equal(true, res) 9486d69bf60SBram Moolenaar 9496d69bf60SBram Moolenaar res = false 9506d69bf60SBram Moolenaar if true ? true : g:bool_false 9516d69bf60SBram Moolenaar res = true 9526d69bf60SBram Moolenaar endif 9536d69bf60SBram Moolenaar assert_equal(true, res) 9546d69bf60SBram Moolenaar 9556d69bf60SBram Moolenaar res = false 9566d69bf60SBram Moolenaar if true ? false : true 9576d69bf60SBram Moolenaar res = true 9586d69bf60SBram Moolenaar endif 9596d69bf60SBram Moolenaar assert_equal(false, res) 9606d69bf60SBram Moolenaar 9616d69bf60SBram Moolenaar res = false 9626d69bf60SBram Moolenaar if false ? false : true 9636d69bf60SBram Moolenaar res = true 9646d69bf60SBram Moolenaar endif 9656d69bf60SBram Moolenaar assert_equal(true, res) 9666d69bf60SBram Moolenaar 9676d69bf60SBram Moolenaar res = false 9686d69bf60SBram Moolenaar if false ? true : false 9696d69bf60SBram Moolenaar res = true 9706d69bf60SBram Moolenaar endif 9716d69bf60SBram Moolenaar assert_equal(false, res) 9726d69bf60SBram Moolenaar 9736d69bf60SBram Moolenaar res = false 9746d69bf60SBram Moolenaar if true && true 9756d69bf60SBram Moolenaar res = true 9766d69bf60SBram Moolenaar endif 9776d69bf60SBram Moolenaar assert_equal(true, res) 9786d69bf60SBram Moolenaar 9796d69bf60SBram Moolenaar res = false 9806d69bf60SBram Moolenaar if true && false 9816d69bf60SBram Moolenaar res = true 9826d69bf60SBram Moolenaar endif 9836d69bf60SBram Moolenaar assert_equal(false, res) 9846d69bf60SBram Moolenaar 9856d69bf60SBram Moolenaar res = false 9866d69bf60SBram Moolenaar if g:bool_true && false 9876d69bf60SBram Moolenaar res = true 9886d69bf60SBram Moolenaar endif 9896d69bf60SBram Moolenaar assert_equal(false, res) 9906d69bf60SBram Moolenaar 9916d69bf60SBram Moolenaar res = false 9926d69bf60SBram Moolenaar if true && g:bool_false 9936d69bf60SBram Moolenaar res = true 9946d69bf60SBram Moolenaar endif 9956d69bf60SBram Moolenaar assert_equal(false, res) 9966d69bf60SBram Moolenaar 9976d69bf60SBram Moolenaar res = false 9986d69bf60SBram Moolenaar if false && false 9996d69bf60SBram Moolenaar res = true 10006d69bf60SBram Moolenaar endif 10016d69bf60SBram Moolenaar assert_equal(false, res) 10026d69bf60SBram Moolenaar 10036d69bf60SBram Moolenaar res = false 10046d69bf60SBram Moolenaar if true || false 10056d69bf60SBram Moolenaar res = true 10066d69bf60SBram Moolenaar endif 10076d69bf60SBram Moolenaar assert_equal(true, res) 10086d69bf60SBram Moolenaar 10096d69bf60SBram Moolenaar res = false 10106d69bf60SBram Moolenaar if g:bool_true || false 10116d69bf60SBram Moolenaar res = true 10126d69bf60SBram Moolenaar endif 10136d69bf60SBram Moolenaar assert_equal(true, res) 10146d69bf60SBram Moolenaar 10156d69bf60SBram Moolenaar res = false 10166d69bf60SBram Moolenaar if true || g:bool_false 10176d69bf60SBram Moolenaar res = true 10186d69bf60SBram Moolenaar endif 10196d69bf60SBram Moolenaar assert_equal(true, res) 10206d69bf60SBram Moolenaar 10216d69bf60SBram Moolenaar res = false 10226d69bf60SBram Moolenaar if false || false 10236d69bf60SBram Moolenaar res = true 10246d69bf60SBram Moolenaar endif 10256d69bf60SBram Moolenaar assert_equal(false, res) 1026*80c34ca3SBram Moolenaarenddef 10276d69bf60SBram Moolenaar 1028*80c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1029*80c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1030*80c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 10316d69bf60SBram Moolenaarenddef 10326d69bf60SBram Moolenaar 103363ce4849SBram Moolenaardef Test_delfunc() 103463ce4849SBram Moolenaar let lines =<< trim END 103563ce4849SBram Moolenaar vim9script 103663ce4849SBram Moolenaar def GoneSoon() 103763ce4849SBram Moolenaar echo 'hello' 103863ce4849SBram Moolenaar enddef 103963ce4849SBram Moolenaar 104063ce4849SBram Moolenaar def CallGoneSoon() 104163ce4849SBram Moolenaar GoneSoon() 104263ce4849SBram Moolenaar enddef 104363ce4849SBram Moolenaar 104463ce4849SBram Moolenaar delfunc GoneSoon 104563ce4849SBram Moolenaar CallGoneSoon() 104663ce4849SBram Moolenaar END 104763ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 104863ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 104963ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 105063ce4849SBram Moolenaar 105163ce4849SBram Moolenaar delete('XToDelFunc') 105263ce4849SBram Moolenaarenddef 105363ce4849SBram Moolenaar 1054ad39c094SBram Moolenaardef Test_execute_cmd() 1055ad39c094SBram Moolenaar new 1056ad39c094SBram Moolenaar setline(1, 'default') 1057ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1058ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1059ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1060ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1061ad39c094SBram Moolenaar execute cmd1 cmd2 1062ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1063ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1064ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1065ad39c094SBram Moolenaar let cmd_first = 'call ' 1066ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1067ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1068ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1069ad39c094SBram Moolenaar bwipe! 1070ad39c094SBram Moolenaarenddef 1071ad39c094SBram Moolenaar 1072ad39c094SBram Moolenaardef Test_echo_cmd() 1073ad39c094SBram Moolenaar echo 'something' 1074ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1075ad39c094SBram Moolenaar 1076ad39c094SBram Moolenaar let str1 = 'some' 1077ad39c094SBram Moolenaar let str2 = 'more' 1078ad39c094SBram Moolenaar echo str1 str2 1079ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1080ad39c094SBram Moolenaarenddef 1081ad39c094SBram Moolenaar 108241fe0617SBram Moolenaardef Test_for_outside_of_function() 108341fe0617SBram Moolenaar let lines =<< trim END 108441fe0617SBram Moolenaar vim9script 108541fe0617SBram Moolenaar new 108641fe0617SBram Moolenaar for var in range(0, 3) 108741fe0617SBram Moolenaar append(line('$'), var) 108841fe0617SBram Moolenaar endfor 108941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 109041fe0617SBram Moolenaar bwipe! 109141fe0617SBram Moolenaar END 109241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 109341fe0617SBram Moolenaar source Xvim9for.vim 109441fe0617SBram Moolenaar delete('Xvim9for.vim') 109541fe0617SBram Moolenaarenddef 10968a7d6542SBram Moolenaar 1097d0df1aacSBram Moolenaardef Test_while_loop() 1098d0df1aacSBram Moolenaar let result = '' 1099d0df1aacSBram Moolenaar let cnt = 0 1100d0df1aacSBram Moolenaar while cnt < 555 1101d0df1aacSBram Moolenaar if cnt == 3 1102d0df1aacSBram Moolenaar break 1103d0df1aacSBram Moolenaar endif 1104d0df1aacSBram Moolenaar cnt += 1 1105d0df1aacSBram Moolenaar if cnt == 2 1106d0df1aacSBram Moolenaar continue 1107d0df1aacSBram Moolenaar endif 1108d0df1aacSBram Moolenaar result ..= cnt .. '_' 1109d0df1aacSBram Moolenaar endwhile 1110d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1111d0df1aacSBram Moolenaarenddef 1112d0df1aacSBram Moolenaar 1113bd5da371SBram Moolenaardef Test_for_loop_fails() 1114bd5da371SBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1115bd5da371SBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1116bd5da371SBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1117bd5da371SBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1118bd5da371SBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1119bd5da371SBram Moolenaarenddef 1120bd5da371SBram Moolenaar 11219645e2d9SBram Moolenaardef Test_interrupt_loop() 112297acfc78SBram Moolenaar let caught = false 11239645e2d9SBram Moolenaar let x = 0 112497acfc78SBram Moolenaar try 11259645e2d9SBram Moolenaar while 1 11269645e2d9SBram Moolenaar x += 1 11279645e2d9SBram Moolenaar if x == 100 11289645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 11299645e2d9SBram Moolenaar endif 11309645e2d9SBram Moolenaar endwhile 113197acfc78SBram Moolenaar catch 113297acfc78SBram Moolenaar caught = true 113397acfc78SBram Moolenaar assert_equal(100, x) 113497acfc78SBram Moolenaar endtry 113597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 11369645e2d9SBram Moolenaarenddef 113720431c9dSBram Moolenaar 1138d0df1aacSBram Moolenaardef Test_substitute_cmd() 1139d0df1aacSBram Moolenaar new 1140d0df1aacSBram Moolenaar setline(1, 'something') 1141d0df1aacSBram Moolenaar :substitute(some(other( 1142d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1143d0df1aacSBram Moolenaar bwipe! 1144d0df1aacSBram Moolenaar 1145d0df1aacSBram Moolenaar " also when the context is Vim9 script 1146d0df1aacSBram Moolenaar let lines =<< trim END 1147d0df1aacSBram Moolenaar vim9script 1148d0df1aacSBram Moolenaar new 1149d0df1aacSBram Moolenaar setline(1, 'something') 1150d0df1aacSBram Moolenaar :substitute(some(other( 1151d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1152d0df1aacSBram Moolenaar bwipe! 1153d0df1aacSBram Moolenaar END 1154d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1155d0df1aacSBram Moolenaar source Xvim9lines 1156d0df1aacSBram Moolenaar 1157d0df1aacSBram Moolenaar delete('Xvim9lines') 1158d0df1aacSBram Moolenaarenddef 1159d0df1aacSBram Moolenaar 116020431c9dSBram Moolenaardef Test_redef_failure() 116120431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 116220431c9dSBram Moolenaar so Xdef 116320431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 116420431c9dSBram Moolenaar so Xdef 116520431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 116620431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 116720431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 116820431c9dSBram Moolenaar so Xdef 116920431c9dSBram Moolenaar call delete('Xdef') 117020431c9dSBram Moolenaar 117120431c9dSBram Moolenaar call assert_equal(0, Func0()) 117220431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 117320431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 117420431c9dSBram Moolenaar 117520431c9dSBram Moolenaar delfunc! Func0 117620431c9dSBram Moolenaar delfunc! Func1 117720431c9dSBram Moolenaar delfunc! Func2 117820431c9dSBram Moolenaarenddef 117920431c9dSBram Moolenaar 11807d941ee0SBram Moolenaar" Test for internal functions returning different types 11817d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 11827d941ee0SBram Moolenaar let lines =<< trim END 11837d941ee0SBram Moolenaar def RetFloat(): float 11847d941ee0SBram Moolenaar return ceil(1.456) 11857d941ee0SBram Moolenaar enddef 11867d941ee0SBram Moolenaar 11877d941ee0SBram Moolenaar def RetListAny(): list<any> 11887d941ee0SBram Moolenaar return items({'k' : 'v'}) 11897d941ee0SBram Moolenaar enddef 11907d941ee0SBram Moolenaar 11917d941ee0SBram Moolenaar def RetListString(): list<string> 11927d941ee0SBram Moolenaar return split('a:b:c', ':') 11937d941ee0SBram Moolenaar enddef 11947d941ee0SBram Moolenaar 11957d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 11967d941ee0SBram Moolenaar return getbufinfo() 11977d941ee0SBram Moolenaar enddef 11987d941ee0SBram Moolenaar 11997d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 12007d941ee0SBram Moolenaar return wordcount() 12017d941ee0SBram Moolenaar enddef 12027d941ee0SBram Moolenaar 12037d941ee0SBram Moolenaar def RetDictString(): dict<string> 12047d941ee0SBram Moolenaar return environ() 12057d941ee0SBram Moolenaar enddef 12067d941ee0SBram Moolenaar END 12077d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 12087d941ee0SBram Moolenaar source Xscript 12097d941ee0SBram Moolenaar 12107d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 12117d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 12127d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 12137d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 12147d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 12157d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 12167d941ee0SBram Moolenaar call delete('Xscript') 12177d941ee0SBram Moolenaarendfunc 12187d941ee0SBram Moolenaar 12197d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 12207d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 12217d941ee0SBram Moolenaar let l =<< trim END 12227d941ee0SBram Moolenaar def! FArgErr(): float 12237d941ee0SBram Moolenaar return ceil(1.1, 2) 12247d941ee0SBram Moolenaar enddef 12257d941ee0SBram Moolenaar END 12267d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12277d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 12287d941ee0SBram Moolenaar let l =<< trim END 12297d941ee0SBram Moolenaar def! FArgErr(): float 12307d941ee0SBram Moolenaar return ceil() 12317d941ee0SBram Moolenaar enddef 12327d941ee0SBram Moolenaar END 12337d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12347d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 12357d941ee0SBram Moolenaar call delete('Xinvalidarg') 12367d941ee0SBram Moolenaarendfunc 12377d941ee0SBram Moolenaar 12388a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1239