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' 346e587dcbSBram Moolenaar 358a7d6542SBram Moolenaardef Test_assignment() 368a7d6542SBram Moolenaar let bool1: bool = true 378a7d6542SBram Moolenaar assert_equal(v:true, bool1) 388a7d6542SBram Moolenaar let bool2: bool = false 398a7d6542SBram Moolenaar assert_equal(v:false, bool2) 408a7d6542SBram Moolenaar 410c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 428a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 430c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 440c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 450c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 468a7d6542SBram Moolenaar 47436472f5SBram Moolenaar let listS: list<string> = [] 48436472f5SBram Moolenaar let listN: list<number> = [] 498a7d6542SBram Moolenaar 500c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 518a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 520c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 530c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 540c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 55b283a8a6SBram Moolenaar 56*9be61bbbSBram Moolenaar let a: number = 6 57*9be61bbbSBram Moolenaar assert_equal(6, a) 58*9be61bbbSBram Moolenaar 5942a480bfSBram Moolenaar if has('channel') 6042a480bfSBram Moolenaar let chan1: channel 61fbdd08edSBram Moolenaar let job1: job 62f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6342a480bfSBram Moolenaar endif 64fbdd08edSBram Moolenaar if has('float') 65fbdd08edSBram Moolenaar let float1: float = 3.4 66fbdd08edSBram Moolenaar endif 67087d2e15SBram Moolenaar let funky1: func 68087d2e15SBram Moolenaar let funky2: func = function('len') 69087d2e15SBram Moolenaar let party1: partial 70087d2e15SBram Moolenaar let party2: partial = funcref('Test_syntax') 7142a480bfSBram Moolenaar 7261a6d4e4SBram Moolenaar " type becomes list<any> 7361a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 745381c7a1SBram Moolenaar " type becomes dict<any> 755381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7661a6d4e4SBram Moolenaar 77401d9ffbSBram Moolenaar g:newvar = 'new' 78401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 79401d9ffbSBram Moolenaar 80401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 81401d9ffbSBram Moolenaar g:existing = 'no' 82401d9ffbSBram Moolenaar assert_equal('no', g:existing) 83401d9ffbSBram Moolenaar 84b283a8a6SBram Moolenaar v:char = 'abc' 856e587dcbSBram Moolenaar assert_equal('abc', v:char) 86b283a8a6SBram Moolenaar 87b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 886e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 89b283a8a6SBram Moolenaar $ENVVAR = '' 906e587dcbSBram Moolenaar 91fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 92fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 93fd1823e0SBram Moolenaar s:addToMe += 222 94fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 950bbf722aSBram Moolenaar s:newVar = 'new' 960bbf722aSBram Moolenaar assert_equal('new', s:newVar) 978a7d6542SBram Moolenaarenddef 988a7d6542SBram Moolenaar 998a7d6542SBram Moolenaarfunc Test_assignment_failure() 1008a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1018a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1028a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1038a7d6542SBram Moolenaar 1048a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1058a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1068a7d6542SBram Moolenaar 107*9be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 108*9be61bbbSBram Moolenaar 109*9be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 110*9be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 111*9be61bbbSBram Moolenaar 112*9be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 113*9be61bbbSBram Moolenaar 114*9be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 115*9be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 116*9be61bbbSBram Moolenaar 117*9be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 118*9be61bbbSBram Moolenaar 119*9be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 120*9be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 121*9be61bbbSBram Moolenaar 12233fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 12333fa29cfSBram Moolenaar 1248a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 1258a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1268a7d6542SBram Moolenaar 1278a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 1288a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 1298a7d6542SBram Moolenaar 1308a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 1318a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 13242a480bfSBram Moolenaar 13342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 13442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 135599c89c8SBram Moolenaarendfunc 136599c89c8SBram Moolenaar 137599c89c8SBram Moolenaarfunc Test_wrong_type() 138599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 139599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 140599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 141599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 142599c89c8SBram Moolenaar 143599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 144599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 14542a480bfSBram Moolenaar 14642a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 14742a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 14842a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 14942a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 15042a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 15142a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 15242a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 15342a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 15442a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 15542a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 15642a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 1578a7d6542SBram Moolenaarendfunc 1588a7d6542SBram Moolenaar 1598a7d6542SBram Moolenaarfunc Test_const() 1608a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 1618a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 1628a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 163*9be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 1648a7d6542SBram Moolenaarendfunc 1658a7d6542SBram Moolenaar 1668a7d6542SBram Moolenaardef Test_block() 1678a7d6542SBram Moolenaar let outer = 1 1688a7d6542SBram Moolenaar { 1698a7d6542SBram Moolenaar let inner = 2 1708a7d6542SBram Moolenaar assert_equal(1, outer) 1718a7d6542SBram Moolenaar assert_equal(2, inner) 1728a7d6542SBram Moolenaar } 1738a7d6542SBram Moolenaar assert_equal(1, outer) 1748a7d6542SBram Moolenaarenddef 1758a7d6542SBram Moolenaar 1768a7d6542SBram Moolenaarfunc Test_block_failure() 1778a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1788a7d6542SBram Moolenaarendfunc 1798a7d6542SBram Moolenaar 1808a7d6542SBram Moolenaardef ReturnString(): string 1818a7d6542SBram Moolenaar return 'string' 1828a7d6542SBram Moolenaarenddef 1838a7d6542SBram Moolenaar 1848a7d6542SBram Moolenaardef ReturnNumber(): number 1858a7d6542SBram Moolenaar return 123 1868a7d6542SBram Moolenaarenddef 1878a7d6542SBram Moolenaar 18809f28f49SBram Moolenaarlet g:notNumber = 'string' 18909f28f49SBram Moolenaar 19009f28f49SBram Moolenaardef ReturnGlobal(): number 19109f28f49SBram Moolenaar return g:notNumber 19209f28f49SBram Moolenaarenddef 19309f28f49SBram Moolenaar 194*9be61bbbSBram Moolenaardef Test_return_something() 1958a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1968a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 19709f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1988a7d6542SBram Moolenaarenddef 1998a7d6542SBram Moolenaar 200*9be61bbbSBram Moolenaarlet s:nothing = 0 201*9be61bbbSBram Moolenaardef ReturnNothing() 202*9be61bbbSBram Moolenaar s:nothing = 1 203*9be61bbbSBram Moolenaar if true 204*9be61bbbSBram Moolenaar return 205*9be61bbbSBram Moolenaar endif 206*9be61bbbSBram Moolenaar s:nothing = 2 207*9be61bbbSBram Moolenaarenddef 208*9be61bbbSBram Moolenaar 209*9be61bbbSBram Moolenaardef Test_return_nothing() 210*9be61bbbSBram Moolenaar ReturnNothing() 211*9be61bbbSBram Moolenaar assert_equal(1, s:nothing) 212*9be61bbbSBram Moolenaarenddef 213*9be61bbbSBram Moolenaar 2148a7d6542SBram Moolenaarfunc Increment() 2158a7d6542SBram Moolenaar let g:counter += 1 2168a7d6542SBram Moolenaarendfunc 2178a7d6542SBram Moolenaar 2188a7d6542SBram Moolenaardef Test_call_ufunc_count() 2198a7d6542SBram Moolenaar g:counter = 1 2208a7d6542SBram Moolenaar Increment() 2218a7d6542SBram Moolenaar Increment() 2228a7d6542SBram Moolenaar Increment() 2238a7d6542SBram Moolenaar " works with and without :call 2248a7d6542SBram Moolenaar assert_equal(4, g:counter) 225b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 2268a7d6542SBram Moolenaar unlet g:counter 2278a7d6542SBram Moolenaarenddef 2288a7d6542SBram Moolenaar 2298a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 2308a7d6542SBram Moolenaar let res = arg 2318a7d6542SBram Moolenaar for s in rest 2328a7d6542SBram Moolenaar res ..= ',' .. s 2338a7d6542SBram Moolenaar endfor 2348a7d6542SBram Moolenaar return res 2358a7d6542SBram Moolenaarenddef 2368a7d6542SBram Moolenaar 2378a7d6542SBram Moolenaardef Test_call_varargs() 2388a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 2398a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 2408a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 2418a7d6542SBram Moolenaarenddef 2428a7d6542SBram Moolenaar 243170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 244170fcfcfSBram Moolenaar return name 245170fcfcfSBram Moolenaarenddef 246170fcfcfSBram Moolenaar 247170fcfcfSBram Moolenaardef Test_call_default_args() 248170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 249170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 250170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 251170fcfcfSBram Moolenaarenddef 252170fcfcfSBram Moolenaar 253170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 254170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 255170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 256170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 257170fcfcfSBram Moolenaarendfunc 258170fcfcfSBram Moolenaar 259b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 260b35efa5eSBram Moolenaar echo a:arg 261b35efa5eSBram Moolenaarendfunc 262b35efa5eSBram Moolenaar 263b35efa5eSBram Moolenaardef Test_call_wrong_arg_count() 264b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 265b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 266b35efa5eSBram Moolenaarenddef 267b35efa5eSBram Moolenaar 268170fcfcfSBram Moolenaar" Default arg and varargs 269170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 270170fcfcfSBram Moolenaar let res = one .. ',' .. two 271170fcfcfSBram Moolenaar for s in rest 272170fcfcfSBram Moolenaar res ..= ',' .. s 273170fcfcfSBram Moolenaar endfor 274170fcfcfSBram Moolenaar return res 275170fcfcfSBram Moolenaarenddef 276170fcfcfSBram Moolenaar 277170fcfcfSBram Moolenaardef Test_call_def_varargs() 278170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 279170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 280170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 281170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 282170fcfcfSBram Moolenaarenddef 283170fcfcfSBram Moolenaar 28442a480bfSBram Moolenaardef Test_using_var_as_arg() 28542a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 28642a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 28742a480bfSBram Moolenaar call delete('Xdef') 28842a480bfSBram Moolenaarenddef 28942a480bfSBram Moolenaar 290b35efa5eSBram Moolenaardef Test_call_func_defined_later() 291b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 292b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 293b35efa5eSBram Moolenaarenddef 294170fcfcfSBram Moolenaar 295b35efa5eSBram Moolenaarfunc DefinedLater(arg) 29626e117e9SBram Moolenaar return a:arg 29726e117e9SBram Moolenaarendfunc 29826e117e9SBram Moolenaar 2997eeefd4aSBram Moolenaardef FuncWithForwardCall() 3007eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3017eeefd4aSBram Moolenaarenddef 3027eeefd4aSBram Moolenaar 3037eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3047eeefd4aSBram Moolenaar return arg 3057eeefd4aSBram Moolenaarenddef 3067eeefd4aSBram Moolenaar 3077eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3087eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3097eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 3107eeefd4aSBram Moolenaarenddef 3117eeefd4aSBram Moolenaar 3128a7d6542SBram Moolenaardef Test_return_type_wrong() 313978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 314978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 315978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 316978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 317cf3f8bf4SBram Moolenaar 318*9be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 319*9be61bbbSBram Moolenaar 320cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 321cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 3228a7d6542SBram Moolenaarenddef 3238a7d6542SBram Moolenaar 324bfe12043SBram Moolenaardef Test_arg_type_wrong() 325bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 326bfe12043SBram Moolenaarenddef 327bfe12043SBram Moolenaar 3288a7d6542SBram Moolenaardef Test_try_catch() 3298a7d6542SBram Moolenaar let l = [] 3308a7d6542SBram Moolenaar try 3318a7d6542SBram Moolenaar add(l, '1') 3328a7d6542SBram Moolenaar throw 'wrong' 3338a7d6542SBram Moolenaar add(l, '2') 3348a7d6542SBram Moolenaar catch 3358a7d6542SBram Moolenaar add(l, v:exception) 3368a7d6542SBram Moolenaar finally 3378a7d6542SBram Moolenaar add(l, '3') 3388a7d6542SBram Moolenaar endtry 3398a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 3408a7d6542SBram Moolenaarenddef 3418a7d6542SBram Moolenaar 342257cc5eeSBram Moolenaardef ThrowFromDef() 343257cc5eeSBram Moolenaar throw 'getout' 344257cc5eeSBram Moolenaarenddef 345257cc5eeSBram Moolenaar 346257cc5eeSBram Moolenaarfunc CatchInFunc() 347257cc5eeSBram Moolenaar try 348257cc5eeSBram Moolenaar call ThrowFromDef() 349257cc5eeSBram Moolenaar catch 350257cc5eeSBram Moolenaar let g:thrown_func = v:exception 351257cc5eeSBram Moolenaar endtry 352257cc5eeSBram Moolenaarendfunc 353257cc5eeSBram Moolenaar 354257cc5eeSBram Moolenaardef CatchInDef() 355257cc5eeSBram Moolenaar try 356257cc5eeSBram Moolenaar ThrowFromDef() 357257cc5eeSBram Moolenaar catch 358257cc5eeSBram Moolenaar g:thrown_def = v:exception 359257cc5eeSBram Moolenaar endtry 360257cc5eeSBram Moolenaarenddef 361257cc5eeSBram Moolenaar 362f575adffSBram Moolenaardef ReturnFinally(): string 363f575adffSBram Moolenaar try 364f575adffSBram Moolenaar return 'intry' 365f575adffSBram Moolenaar finally 366f575adffSBram Moolenaar g:in_finally = 'finally' 367f575adffSBram Moolenaar endtry 368f575adffSBram Moolenaar return 'end' 369f575adffSBram Moolenaarenddef 370f575adffSBram Moolenaar 371257cc5eeSBram Moolenaardef Test_try_catch_nested() 372257cc5eeSBram Moolenaar CatchInFunc() 373257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 374257cc5eeSBram Moolenaar 375257cc5eeSBram Moolenaar CatchInDef() 376257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 377f575adffSBram Moolenaar 378f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 379f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 380f575adffSBram Moolenaarenddef 381f575adffSBram Moolenaar 382f575adffSBram Moolenaardef Test_try_catch_match() 383f575adffSBram Moolenaar let seq = 'a' 384f575adffSBram Moolenaar try 385f575adffSBram Moolenaar throw 'something' 386f575adffSBram Moolenaar catch /nothing/ 387f575adffSBram Moolenaar seq ..= 'x' 388f575adffSBram Moolenaar catch /some/ 389f575adffSBram Moolenaar seq ..= 'b' 390f575adffSBram Moolenaar catch /asdf/ 391f575adffSBram Moolenaar seq ..= 'x' 392f575adffSBram Moolenaar finally 393f575adffSBram Moolenaar seq ..= 'c' 394f575adffSBram Moolenaar endtry 395f575adffSBram Moolenaar assert_equal('abc', seq) 396257cc5eeSBram Moolenaarenddef 397257cc5eeSBram Moolenaar 3988a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3998a7d6542SBram Moolenaar vim9script 4008a7d6542SBram Moolenaar let name: string = 'bob' 4018a7d6542SBram Moolenaar def Concat(arg: string): string 4028a7d6542SBram Moolenaar return name .. arg 4038a7d6542SBram Moolenaar enddef 4048a7d6542SBram Moolenaar let g:result = Concat('bie') 4058a7d6542SBram Moolenaar let g:localname = name 4068a7d6542SBram Moolenaar 4078a7d6542SBram Moolenaar export const CONST = 1234 4088a7d6542SBram Moolenaar export let exported = 9876 4096e587dcbSBram Moolenaar export let exp_name = 'John' 4108a7d6542SBram Moolenaar export def Exported(): string 4118a7d6542SBram Moolenaar return 'Exported' 4128a7d6542SBram Moolenaar enddef 4138a7d6542SBram MoolenaarEND 4148a7d6542SBram Moolenaar 4155269bd2aSBram Moolenaardef Test_vim9_import_export() 4168a7d6542SBram Moolenaar let import_script_lines =<< trim END 4178a7d6542SBram Moolenaar vim9script 4188a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 4198a7d6542SBram Moolenaar g:imported = exported 4206e587dcbSBram Moolenaar exported += 3 4216e587dcbSBram Moolenaar g:imported_added = exported 4228a7d6542SBram Moolenaar g:imported_func = Exported() 4236e587dcbSBram Moolenaar 4246e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 4256e587dcbSBram Moolenaar g:imported_name = exp_name 4266e587dcbSBram Moolenaar exp_name ..= ' Doe' 4276e587dcbSBram Moolenaar g:imported_name_appended = exp_name 4285381c7a1SBram Moolenaar g:imported_later = exported 4298a7d6542SBram Moolenaar END 4308a7d6542SBram Moolenaar 4318a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 4328a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 4338a7d6542SBram Moolenaar 4348a7d6542SBram Moolenaar source Ximport.vim 4358a7d6542SBram Moolenaar 4368a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 4378a7d6542SBram Moolenaar assert_equal('bob', g:localname) 4388a7d6542SBram Moolenaar assert_equal(9876, g:imported) 4396e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 4405381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 4418a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 4426e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 4436e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 4448a7d6542SBram Moolenaar assert_false(exists('g:name')) 4458a7d6542SBram Moolenaar 4468a7d6542SBram Moolenaar unlet g:result 4478a7d6542SBram Moolenaar unlet g:localname 4488a7d6542SBram Moolenaar unlet g:imported 4496e587dcbSBram Moolenaar unlet g:imported_added 4505381c7a1SBram Moolenaar unlet g:imported_later 4518a7d6542SBram Moolenaar unlet g:imported_func 4526e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4538a7d6542SBram Moolenaar delete('Ximport.vim') 454f2d5c240SBram Moolenaar 4555381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4565381c7a1SBram Moolenaar vim9script 4575381c7a1SBram Moolenaar def ImportInDef() 4585381c7a1SBram Moolenaar import exported from './Xexport.vim' 4595381c7a1SBram Moolenaar g:imported = exported 4605381c7a1SBram Moolenaar exported += 7 4615381c7a1SBram Moolenaar g:imported_added = exported 4625381c7a1SBram Moolenaar enddef 4635381c7a1SBram Moolenaar ImportInDef() 4645381c7a1SBram Moolenaar END 4655381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4665381c7a1SBram Moolenaar source Ximport2.vim 4675381c7a1SBram Moolenaar " TODO: this should be 9879 4685381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4695381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4705381c7a1SBram Moolenaar unlet g:imported 4715381c7a1SBram Moolenaar unlet g:imported_added 4725381c7a1SBram Moolenaar delete('Ximport2.vim') 4735381c7a1SBram Moolenaar 474f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 475f2d5c240SBram Moolenaar vim9script 476f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 477f2d5c240SBram Moolenaar def UseExport() 478f2d5c240SBram Moolenaar g:imported = Export.exported 479f2d5c240SBram Moolenaar enddef 480f2d5c240SBram Moolenaar UseExport() 481f2d5c240SBram Moolenaar END 482f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 483f2d5c240SBram Moolenaar source Ximport.vim 4845381c7a1SBram Moolenaar assert_equal(9883, g:imported) 485f2d5c240SBram Moolenaar 486599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 487599c89c8SBram Moolenaar vim9script 488599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 489599c89c8SBram Moolenaar def Func() 490599c89c8SBram Moolenaar let dummy = 1 491599c89c8SBram Moolenaar let imported = Export + dummy 492599c89c8SBram Moolenaar enddef 493599c89c8SBram Moolenaar END 494599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 495599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 496599c89c8SBram Moolenaar 497599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 498599c89c8SBram Moolenaar vim9script 499599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 500599c89c8SBram Moolenaar def Func() 501599c89c8SBram Moolenaar let imported = Export . exported 502599c89c8SBram Moolenaar enddef 503599c89c8SBram Moolenaar END 504599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 505599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 506599c89c8SBram Moolenaar 507599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 508599c89c8SBram Moolenaar vim9script 509599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 510599c89c8SBram Moolenaar def Func() 511599c89c8SBram Moolenaar let imported = Export. 512599c89c8SBram Moolenaar enddef 513599c89c8SBram Moolenaar END 514599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 515599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 516599c89c8SBram Moolenaar 517f2d5c240SBram Moolenaar let import_star_lines =<< trim END 518f2d5c240SBram Moolenaar vim9script 519f2d5c240SBram Moolenaar import * from './Xexport.vim' 520f2d5c240SBram Moolenaar g:imported = exported 521f2d5c240SBram Moolenaar END 522f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 523f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 524f2d5c240SBram Moolenaar 525fa29c8abSBram Moolenaar " try to import something that exists but is not exported 526fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 527fa29c8abSBram Moolenaar vim9script 528fa29c8abSBram Moolenaar import name from './Xexport.vim' 529fa29c8abSBram Moolenaar END 530fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 531fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 532fa29c8abSBram Moolenaar 5335269bd2aSBram Moolenaar " try to import something that is already defined 5345269bd2aSBram Moolenaar let import_already_defined =<< trim END 5355269bd2aSBram Moolenaar vim9script 5365269bd2aSBram Moolenaar let exported = 'something' 5375269bd2aSBram Moolenaar import exported from './Xexport.vim' 5385269bd2aSBram Moolenaar END 5395269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5405269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5415269bd2aSBram Moolenaar 5425269bd2aSBram Moolenaar " try to import something that is already defined 5435269bd2aSBram Moolenaar import_already_defined =<< trim END 5445269bd2aSBram Moolenaar vim9script 5455269bd2aSBram Moolenaar let exported = 'something' 5465269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5475269bd2aSBram Moolenaar END 5485269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5495269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5505269bd2aSBram Moolenaar 5515269bd2aSBram Moolenaar " try to import something that is already defined 5525269bd2aSBram Moolenaar import_already_defined =<< trim END 5535269bd2aSBram Moolenaar vim9script 5545269bd2aSBram Moolenaar let exported = 'something' 5555269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5565269bd2aSBram Moolenaar END 5575269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5585269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5595269bd2aSBram Moolenaar 560fa29c8abSBram Moolenaar " import a very long name, requires making a copy 561fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 562fa29c8abSBram Moolenaar vim9script 563fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 564fa29c8abSBram Moolenaar END 565fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 566fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 567fa29c8abSBram Moolenaar 568fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 569fa29c8abSBram Moolenaar vim9script 570fa29c8abSBram Moolenaar import name './Xexport.vim' 571fa29c8abSBram Moolenaar END 572fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 573fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 574fa29c8abSBram Moolenaar 575fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 576fa29c8abSBram Moolenaar vim9script 577fa29c8abSBram Moolenaar import name from Xexport.vim 578fa29c8abSBram Moolenaar END 579fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 580fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 581fa29c8abSBram Moolenaar 582fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 583fa29c8abSBram Moolenaar vim9script 584fa29c8abSBram Moolenaar import name from './XnoExport.vim' 585fa29c8abSBram Moolenaar END 586fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 587fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 588fa29c8abSBram Moolenaar 589fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 590fa29c8abSBram Moolenaar vim9script 591fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 592fa29c8abSBram Moolenaar END 5935269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5945269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 595fa29c8abSBram Moolenaar 596f2d5c240SBram Moolenaar delete('Ximport.vim') 5975269bd2aSBram Moolenaar delete('Ximport3.vim') 5988a7d6542SBram Moolenaar delete('Xexport.vim') 5998a7d6542SBram Moolenaar 600750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 601750802b5SBram Moolenaar set cpo&vi 602750802b5SBram Moolenaar let cpo_before = &cpo 603750802b5SBram Moolenaar let lines =<< trim END 604750802b5SBram Moolenaar vim9script 605750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 606750802b5SBram Moolenaar END 607750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 608750802b5SBram Moolenaar source Xvim9_script 609750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 610750802b5SBram Moolenaar set cpo&vim 611750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 612750802b5SBram Moolenaar delete('Xvim9_script') 613750802b5SBram Moolenaarenddef 614750802b5SBram Moolenaar 615750802b5SBram Moolenaardef Test_vim9script_fails() 6168a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 6178a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 618750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 619f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 620750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 621750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 622750802b5SBram Moolenaar 623750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 624750802b5SBram Moolenaar assert_fails('export something', 'E1042') 6258a7d6542SBram Moolenaarenddef 6268a7d6542SBram Moolenaar 6278a7d6542SBram Moolenaardef Test_vim9script_call() 6288a7d6542SBram Moolenaar let lines =<< trim END 6298a7d6542SBram Moolenaar vim9script 6308a7d6542SBram Moolenaar let var = '' 6318a7d6542SBram Moolenaar def MyFunc(arg: string) 6328a7d6542SBram Moolenaar var = arg 6338a7d6542SBram Moolenaar enddef 6348a7d6542SBram Moolenaar MyFunc('foobar') 6358a7d6542SBram Moolenaar assert_equal('foobar', var) 6368a7d6542SBram Moolenaar 6378a7d6542SBram Moolenaar let str = 'barfoo' 6388a7d6542SBram Moolenaar str->MyFunc() 6398a7d6542SBram Moolenaar assert_equal('barfoo', var) 6408a7d6542SBram Moolenaar 6418a7d6542SBram Moolenaar let g:value = 'value' 6428a7d6542SBram Moolenaar g:value->MyFunc() 6438a7d6542SBram Moolenaar assert_equal('value', var) 6448a7d6542SBram Moolenaar 6458a7d6542SBram Moolenaar let listvar = [] 6468a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 6478a7d6542SBram Moolenaar listvar = arg 6488a7d6542SBram Moolenaar enddef 6498a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 6508a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 6518a7d6542SBram Moolenaar 6528a7d6542SBram Moolenaar let dictvar = {} 6538a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 6548a7d6542SBram Moolenaar dictvar = arg 6558a7d6542SBram Moolenaar enddef 6568a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 6578a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 65833fa29cfSBram Moolenaar def CompiledDict() 65933fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 66033fa29cfSBram Moolenaar enddef 66133fa29cfSBram Moolenaar CompiledDict() 66233fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 66333fa29cfSBram Moolenaar 6648a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 6658a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 6660c6ceaf9SBram Moolenaar 6670c6ceaf9SBram Moolenaar ('text')->MyFunc() 6680c6ceaf9SBram Moolenaar assert_equal('text', var) 6690c6ceaf9SBram Moolenaar ("some")->MyFunc() 6700c6ceaf9SBram Moolenaar assert_equal('some', var) 6718a7d6542SBram Moolenaar END 6728a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 6738a7d6542SBram Moolenaar source Xcall.vim 6748a7d6542SBram Moolenaar delete('Xcall.vim') 6758a7d6542SBram Moolenaarenddef 6768a7d6542SBram Moolenaar 6778a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 6788a7d6542SBram Moolenaar let lines =<< trim END 6798a7d6542SBram Moolenaar vim9script 6808a7d6542SBram Moolenaar let var = '' 6818a7d6542SBram Moolenaar def MyFunc(arg: string) 6828a7d6542SBram Moolenaar let var = 123 6838a7d6542SBram Moolenaar enddef 6848a7d6542SBram Moolenaar END 6858a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 6868a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 6878a7d6542SBram Moolenaar delete('Xcall_decl.vim') 6888a7d6542SBram Moolenaarenddef 6898a7d6542SBram Moolenaar 6908a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 6918a7d6542SBram Moolenaar let lines =<< trim END 6928a7d6542SBram Moolenaar vim9script 6938a7d6542SBram Moolenaar const var = '' 6948a7d6542SBram Moolenaar def MyFunc(arg: string) 6958a7d6542SBram Moolenaar var = 'asdf' 6968a7d6542SBram Moolenaar enddef 6978a7d6542SBram Moolenaar END 6988a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 6998a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 7008a7d6542SBram Moolenaar delete('Xcall_const.vim') 7018a7d6542SBram Moolenaarenddef 7028a7d6542SBram Moolenaar 7038a7d6542SBram Moolenaardef Test_vim9script_reload() 7048a7d6542SBram Moolenaar let lines =<< trim END 7058a7d6542SBram Moolenaar vim9script 7068a7d6542SBram Moolenaar const var = '' 7078a7d6542SBram Moolenaar let valone = 1234 7088a7d6542SBram Moolenaar def MyFunc(arg: string) 7098a7d6542SBram Moolenaar valone = 5678 7108a7d6542SBram Moolenaar enddef 7118a7d6542SBram Moolenaar END 7128a7d6542SBram Moolenaar let morelines =<< trim END 7138a7d6542SBram Moolenaar let valtwo = 222 7148a7d6542SBram Moolenaar export def GetValtwo(): number 7158a7d6542SBram Moolenaar return valtwo 7168a7d6542SBram Moolenaar enddef 7178a7d6542SBram Moolenaar END 7188a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7198a7d6542SBram Moolenaar source Xreload.vim 7208a7d6542SBram Moolenaar source Xreload.vim 7218a7d6542SBram Moolenaar source Xreload.vim 7228a7d6542SBram Moolenaar 7238a7d6542SBram Moolenaar let testlines =<< trim END 7248a7d6542SBram Moolenaar vim9script 7258a7d6542SBram Moolenaar def TheFunc() 7268a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 7278a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 7288a7d6542SBram Moolenaar enddef 7298a7d6542SBram Moolenaar TheFunc() 7308a7d6542SBram Moolenaar END 7318a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 7328a7d6542SBram Moolenaar source Ximport.vim 7338a7d6542SBram Moolenaar 7348a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 7358a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 7368a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7378a7d6542SBram Moolenaar source Xreload.vim 7388a7d6542SBram Moolenaar source Ximport.vim 7398a7d6542SBram Moolenaar 7408a7d6542SBram Moolenaar " cannot declare a var twice 7418a7d6542SBram Moolenaar lines =<< trim END 7428a7d6542SBram Moolenaar vim9script 7438a7d6542SBram Moolenaar let valone = 1234 7448a7d6542SBram Moolenaar let valone = 5678 7458a7d6542SBram Moolenaar END 7468a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7478a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 7488a7d6542SBram Moolenaar 7498a7d6542SBram Moolenaar delete('Xreload.vim') 7508a7d6542SBram Moolenaar delete('Ximport.vim') 7518a7d6542SBram Moolenaarenddef 7528a7d6542SBram Moolenaar 7538a7d6542SBram Moolenaardef Test_import_absolute() 7548a7d6542SBram Moolenaar let import_lines = [ 7558a7d6542SBram Moolenaar \ 'vim9script', 7568a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 757b283a8a6SBram Moolenaar \ 'def UseExported()', 7588a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 7594e12a5dfSBram Moolenaar \ ' exported = 8888', 7604e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 761b283a8a6SBram Moolenaar \ 'enddef', 762b283a8a6SBram Moolenaar \ 'UseExported()', 7634e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 7648a7d6542SBram Moolenaar \ ] 7658a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 7668a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 7678a7d6542SBram Moolenaar 7688a7d6542SBram Moolenaar source Ximport_abs.vim 7698a7d6542SBram Moolenaar 7708a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 7714e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 772b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 773b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 774b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7754e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 7764e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 7774e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 7784e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 7794e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7804e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 7814e12a5dfSBram Moolenaar \, g:import_disassembled) 7828a7d6542SBram Moolenaar unlet g:imported_abs 7834e12a5dfSBram Moolenaar unlet g:import_disassembled 7848a7d6542SBram Moolenaar 7858a7d6542SBram Moolenaar delete('Ximport_abs.vim') 7868a7d6542SBram Moolenaar delete('Xexport_abs.vim') 7878a7d6542SBram Moolenaarenddef 7888a7d6542SBram Moolenaar 7898a7d6542SBram Moolenaardef Test_import_rtp() 7908a7d6542SBram Moolenaar let import_lines = [ 7918a7d6542SBram Moolenaar \ 'vim9script', 7928a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 7938a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 7948a7d6542SBram Moolenaar \ ] 7958a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 7968a7d6542SBram Moolenaar mkdir('import') 7978a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 7988a7d6542SBram Moolenaar 7998a7d6542SBram Moolenaar let save_rtp = &rtp 8008a7d6542SBram Moolenaar &rtp = getcwd() 8018a7d6542SBram Moolenaar source Ximport_rtp.vim 8028a7d6542SBram Moolenaar &rtp = save_rtp 8038a7d6542SBram Moolenaar 8048a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8058a7d6542SBram Moolenaar unlet g:imported_rtp 8068a7d6542SBram Moolenaar 8078a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 8088a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 8098a7d6542SBram Moolenaar delete('import', 'd') 8108a7d6542SBram Moolenaarenddef 8118a7d6542SBram Moolenaar 8128a7d6542SBram Moolenaardef Test_fixed_size_list() 8138a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 8148a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 8158a7d6542SBram Moolenaar l->remove(0) 8168a7d6542SBram Moolenaar l->add(5) 8178a7d6542SBram Moolenaar l->insert(99, 1) 8180f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 8198a7d6542SBram Moolenaarenddef 8208a7d6542SBram Moolenaar 821673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 822673660abSBram Moolenaar" recognized. 823673660abSBram Moolenaarfunc Test_function_python() 824673660abSBram Moolenaar CheckFeature python3 825673660abSBram Moolenaar let py = 'python3' 826673660abSBram Moolenaar execute py "<< EOF" 827673660abSBram Moolenaardef do_something(): 828673660abSBram Moolenaar return 1 829673660abSBram MoolenaarEOF 830673660abSBram Moolenaarendfunc 831673660abSBram Moolenaar 832158906cfSBram Moolenaardef IfElse(what: number): string 833158906cfSBram Moolenaar let res = '' 834158906cfSBram Moolenaar if what == 1 835158906cfSBram Moolenaar res = "one" 836158906cfSBram Moolenaar elseif what == 2 837158906cfSBram Moolenaar res = "two" 838a259d8d3SBram Moolenaar else 839158906cfSBram Moolenaar res = "three" 840a259d8d3SBram Moolenaar endif 841158906cfSBram Moolenaar return res 842a259d8d3SBram Moolenaarenddef 843a259d8d3SBram Moolenaar 844158906cfSBram Moolenaardef Test_if_elseif_else() 845158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 846158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 847158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 8480f18b6d1SBram Moolenaarenddef 8490f18b6d1SBram Moolenaar 8506d69bf60SBram Moolenaarlet g:bool_true = v:true 8516d69bf60SBram Moolenaarlet g:bool_false = v:false 8526d69bf60SBram Moolenaar 8536d69bf60SBram Moolenaardef Test_if_const_expr() 8546d69bf60SBram Moolenaar let res = false 8556d69bf60SBram Moolenaar if true ? true : false 8566d69bf60SBram Moolenaar res = true 8576d69bf60SBram Moolenaar endif 8586d69bf60SBram Moolenaar assert_equal(true, res) 8596d69bf60SBram Moolenaar 8606d69bf60SBram Moolenaar res = false 8616d69bf60SBram Moolenaar if g:bool_true ? true : false 8626d69bf60SBram Moolenaar res = true 8636d69bf60SBram Moolenaar endif 8646d69bf60SBram Moolenaar assert_equal(true, res) 8656d69bf60SBram Moolenaar 8666d69bf60SBram Moolenaar res = false 8676d69bf60SBram Moolenaar if true ? g:bool_true : false 8686d69bf60SBram Moolenaar res = true 8696d69bf60SBram Moolenaar endif 8706d69bf60SBram Moolenaar assert_equal(true, res) 8716d69bf60SBram Moolenaar 8726d69bf60SBram Moolenaar res = false 8736d69bf60SBram Moolenaar if true ? true : g:bool_false 8746d69bf60SBram Moolenaar res = true 8756d69bf60SBram Moolenaar endif 8766d69bf60SBram Moolenaar assert_equal(true, res) 8776d69bf60SBram Moolenaar 8786d69bf60SBram Moolenaar res = false 8796d69bf60SBram Moolenaar if true ? false : true 8806d69bf60SBram Moolenaar res = true 8816d69bf60SBram Moolenaar endif 8826d69bf60SBram Moolenaar assert_equal(false, res) 8836d69bf60SBram Moolenaar 8846d69bf60SBram Moolenaar res = false 8856d69bf60SBram Moolenaar if false ? false : true 8866d69bf60SBram Moolenaar res = true 8876d69bf60SBram Moolenaar endif 8886d69bf60SBram Moolenaar assert_equal(true, res) 8896d69bf60SBram Moolenaar 8906d69bf60SBram Moolenaar res = false 8916d69bf60SBram Moolenaar if false ? true : false 8926d69bf60SBram Moolenaar res = true 8936d69bf60SBram Moolenaar endif 8946d69bf60SBram Moolenaar assert_equal(false, res) 8956d69bf60SBram Moolenaar 8966d69bf60SBram Moolenaar res = false 8976d69bf60SBram Moolenaar if true && true 8986d69bf60SBram Moolenaar res = true 8996d69bf60SBram Moolenaar endif 9006d69bf60SBram Moolenaar assert_equal(true, res) 9016d69bf60SBram Moolenaar 9026d69bf60SBram Moolenaar res = false 9036d69bf60SBram Moolenaar if true && false 9046d69bf60SBram Moolenaar res = true 9056d69bf60SBram Moolenaar endif 9066d69bf60SBram Moolenaar assert_equal(false, res) 9076d69bf60SBram Moolenaar 9086d69bf60SBram Moolenaar res = false 9096d69bf60SBram Moolenaar if g:bool_true && false 9106d69bf60SBram Moolenaar res = true 9116d69bf60SBram Moolenaar endif 9126d69bf60SBram Moolenaar assert_equal(false, res) 9136d69bf60SBram Moolenaar 9146d69bf60SBram Moolenaar res = false 9156d69bf60SBram Moolenaar if true && g:bool_false 9166d69bf60SBram Moolenaar res = true 9176d69bf60SBram Moolenaar endif 9186d69bf60SBram Moolenaar assert_equal(false, res) 9196d69bf60SBram Moolenaar 9206d69bf60SBram Moolenaar res = false 9216d69bf60SBram Moolenaar if false && false 9226d69bf60SBram Moolenaar res = true 9236d69bf60SBram Moolenaar endif 9246d69bf60SBram Moolenaar assert_equal(false, res) 9256d69bf60SBram Moolenaar 9266d69bf60SBram Moolenaar res = false 9276d69bf60SBram Moolenaar if true || false 9286d69bf60SBram Moolenaar res = true 9296d69bf60SBram Moolenaar endif 9306d69bf60SBram Moolenaar assert_equal(true, res) 9316d69bf60SBram Moolenaar 9326d69bf60SBram Moolenaar res = false 9336d69bf60SBram Moolenaar if g:bool_true || false 9346d69bf60SBram Moolenaar res = true 9356d69bf60SBram Moolenaar endif 9366d69bf60SBram Moolenaar assert_equal(true, res) 9376d69bf60SBram Moolenaar 9386d69bf60SBram Moolenaar res = false 9396d69bf60SBram Moolenaar if true || g:bool_false 9406d69bf60SBram Moolenaar res = true 9416d69bf60SBram Moolenaar endif 9426d69bf60SBram Moolenaar assert_equal(true, res) 9436d69bf60SBram Moolenaar 9446d69bf60SBram Moolenaar res = false 9456d69bf60SBram Moolenaar if false || false 9466d69bf60SBram Moolenaar res = true 9476d69bf60SBram Moolenaar endif 9486d69bf60SBram Moolenaar assert_equal(false, res) 9496d69bf60SBram Moolenaar 9506d69bf60SBram Moolenaarenddef 9516d69bf60SBram Moolenaar 95263ce4849SBram Moolenaardef Test_delfunc() 95363ce4849SBram Moolenaar let lines =<< trim END 95463ce4849SBram Moolenaar vim9script 95563ce4849SBram Moolenaar def GoneSoon() 95663ce4849SBram Moolenaar echo 'hello' 95763ce4849SBram Moolenaar enddef 95863ce4849SBram Moolenaar 95963ce4849SBram Moolenaar def CallGoneSoon() 96063ce4849SBram Moolenaar GoneSoon() 96163ce4849SBram Moolenaar enddef 96263ce4849SBram Moolenaar 96363ce4849SBram Moolenaar delfunc GoneSoon 96463ce4849SBram Moolenaar CallGoneSoon() 96563ce4849SBram Moolenaar END 96663ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 96763ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 96863ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 96963ce4849SBram Moolenaar 97063ce4849SBram Moolenaar delete('XToDelFunc') 97163ce4849SBram Moolenaarenddef 97263ce4849SBram Moolenaar 973ad39c094SBram Moolenaardef Test_execute_cmd() 974ad39c094SBram Moolenaar new 975ad39c094SBram Moolenaar setline(1, 'default') 976ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 977ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 978ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 979ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 980ad39c094SBram Moolenaar execute cmd1 cmd2 981ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 982ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 983ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 984ad39c094SBram Moolenaar let cmd_first = 'call ' 985ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 986ad39c094SBram Moolenaar execute cmd_first .. cmd_last 987ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 988ad39c094SBram Moolenaar bwipe! 989ad39c094SBram Moolenaarenddef 990ad39c094SBram Moolenaar 991ad39c094SBram Moolenaardef Test_echo_cmd() 992ad39c094SBram Moolenaar echo 'something' 993ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 994ad39c094SBram Moolenaar 995ad39c094SBram Moolenaar let str1 = 'some' 996ad39c094SBram Moolenaar let str2 = 'more' 997ad39c094SBram Moolenaar echo str1 str2 998ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 999ad39c094SBram Moolenaarenddef 1000ad39c094SBram Moolenaar 100141fe0617SBram Moolenaardef Test_for_outside_of_function() 100241fe0617SBram Moolenaar let lines =<< trim END 100341fe0617SBram Moolenaar vim9script 100441fe0617SBram Moolenaar new 100541fe0617SBram Moolenaar for var in range(0, 3) 100641fe0617SBram Moolenaar append(line('$'), var) 100741fe0617SBram Moolenaar endfor 100841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 100941fe0617SBram Moolenaar bwipe! 101041fe0617SBram Moolenaar END 101141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 101241fe0617SBram Moolenaar source Xvim9for.vim 101341fe0617SBram Moolenaar delete('Xvim9for.vim') 101441fe0617SBram Moolenaarenddef 10158a7d6542SBram Moolenaar 1016d0df1aacSBram Moolenaardef Test_while_loop() 1017d0df1aacSBram Moolenaar let result = '' 1018d0df1aacSBram Moolenaar let cnt = 0 1019d0df1aacSBram Moolenaar while cnt < 555 1020d0df1aacSBram Moolenaar if cnt == 3 1021d0df1aacSBram Moolenaar break 1022d0df1aacSBram Moolenaar endif 1023d0df1aacSBram Moolenaar cnt += 1 1024d0df1aacSBram Moolenaar if cnt == 2 1025d0df1aacSBram Moolenaar continue 1026d0df1aacSBram Moolenaar endif 1027d0df1aacSBram Moolenaar result ..= cnt .. '_' 1028d0df1aacSBram Moolenaar endwhile 1029d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1030d0df1aacSBram Moolenaarenddef 1031d0df1aacSBram Moolenaar 10329645e2d9SBram Moolenaardef Test_interrupt_loop() 103397acfc78SBram Moolenaar let caught = false 10349645e2d9SBram Moolenaar let x = 0 103597acfc78SBram Moolenaar try 10369645e2d9SBram Moolenaar while 1 10379645e2d9SBram Moolenaar x += 1 10389645e2d9SBram Moolenaar if x == 100 10399645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 10409645e2d9SBram Moolenaar endif 10419645e2d9SBram Moolenaar endwhile 104297acfc78SBram Moolenaar catch 104397acfc78SBram Moolenaar caught = true 104497acfc78SBram Moolenaar assert_equal(100, x) 104597acfc78SBram Moolenaar endtry 104697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 10479645e2d9SBram Moolenaarenddef 104820431c9dSBram Moolenaar 1049d0df1aacSBram Moolenaardef Test_substitute_cmd() 1050d0df1aacSBram Moolenaar new 1051d0df1aacSBram Moolenaar setline(1, 'something') 1052d0df1aacSBram Moolenaar :substitute(some(other( 1053d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1054d0df1aacSBram Moolenaar bwipe! 1055d0df1aacSBram Moolenaar 1056d0df1aacSBram Moolenaar " also when the context is Vim9 script 1057d0df1aacSBram Moolenaar let lines =<< trim END 1058d0df1aacSBram Moolenaar vim9script 1059d0df1aacSBram Moolenaar new 1060d0df1aacSBram Moolenaar setline(1, 'something') 1061d0df1aacSBram Moolenaar :substitute(some(other( 1062d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1063d0df1aacSBram Moolenaar bwipe! 1064d0df1aacSBram Moolenaar END 1065d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1066d0df1aacSBram Moolenaar source Xvim9lines 1067d0df1aacSBram Moolenaar 1068d0df1aacSBram Moolenaar delete('Xvim9lines') 1069d0df1aacSBram Moolenaarenddef 1070d0df1aacSBram Moolenaar 107120431c9dSBram Moolenaardef Test_redef_failure() 107220431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 107320431c9dSBram Moolenaar so Xdef 107420431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 107520431c9dSBram Moolenaar so Xdef 107620431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 107720431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 107820431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 107920431c9dSBram Moolenaar so Xdef 108020431c9dSBram Moolenaar call delete('Xdef') 108120431c9dSBram Moolenaar 108220431c9dSBram Moolenaar call assert_equal(0, Func0()) 108320431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 108420431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 108520431c9dSBram Moolenaar 108620431c9dSBram Moolenaar delfunc! Func0 108720431c9dSBram Moolenaar delfunc! Func1 108820431c9dSBram Moolenaar delfunc! Func2 108920431c9dSBram Moolenaarenddef 109020431c9dSBram Moolenaar 10917d941ee0SBram Moolenaar" Test for internal functions returning different types 10927d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 10937d941ee0SBram Moolenaar let lines =<< trim END 10947d941ee0SBram Moolenaar def RetFloat(): float 10957d941ee0SBram Moolenaar return ceil(1.456) 10967d941ee0SBram Moolenaar enddef 10977d941ee0SBram Moolenaar 10987d941ee0SBram Moolenaar def RetListAny(): list<any> 10997d941ee0SBram Moolenaar return items({'k' : 'v'}) 11007d941ee0SBram Moolenaar enddef 11017d941ee0SBram Moolenaar 11027d941ee0SBram Moolenaar def RetListString(): list<string> 11037d941ee0SBram Moolenaar return split('a:b:c', ':') 11047d941ee0SBram Moolenaar enddef 11057d941ee0SBram Moolenaar 11067d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 11077d941ee0SBram Moolenaar return getbufinfo() 11087d941ee0SBram Moolenaar enddef 11097d941ee0SBram Moolenaar 11107d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 11117d941ee0SBram Moolenaar return wordcount() 11127d941ee0SBram Moolenaar enddef 11137d941ee0SBram Moolenaar 11147d941ee0SBram Moolenaar def RetDictString(): dict<string> 11157d941ee0SBram Moolenaar return environ() 11167d941ee0SBram Moolenaar enddef 11177d941ee0SBram Moolenaar END 11187d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 11197d941ee0SBram Moolenaar source Xscript 11207d941ee0SBram Moolenaar 11217d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 11227d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 11237d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 11247d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 11257d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 11267d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 11277d941ee0SBram Moolenaar call delete('Xscript') 11287d941ee0SBram Moolenaarendfunc 11297d941ee0SBram Moolenaar 11307d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 11317d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 11327d941ee0SBram Moolenaar let l =<< trim END 11337d941ee0SBram Moolenaar def! FArgErr(): float 11347d941ee0SBram Moolenaar return ceil(1.1, 2) 11357d941ee0SBram Moolenaar enddef 11367d941ee0SBram Moolenaar END 11377d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11387d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 11397d941ee0SBram Moolenaar let l =<< trim END 11407d941ee0SBram Moolenaar def! FArgErr(): float 11417d941ee0SBram Moolenaar return ceil() 11427d941ee0SBram Moolenaar enddef 11437d941ee0SBram Moolenaar END 11447d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11457d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 11467d941ee0SBram Moolenaar call delete('Xinvalidarg') 11477d941ee0SBram Moolenaarendfunc 11487d941ee0SBram Moolenaar 11498a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1150