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 5642a480bfSBram Moolenaar if has('channel') 5742a480bfSBram Moolenaar let chan1: channel 58fbdd08edSBram Moolenaar let job1: job 59f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6042a480bfSBram Moolenaar endif 61fbdd08edSBram Moolenaar if has('float') 62fbdd08edSBram Moolenaar let float1: float = 3.4 63fbdd08edSBram Moolenaar endif 64087d2e15SBram Moolenaar let funky1: func 65087d2e15SBram Moolenaar let funky2: func = function('len') 66087d2e15SBram Moolenaar let party1: partial 67087d2e15SBram Moolenaar let party2: partial = funcref('Test_syntax') 6842a480bfSBram Moolenaar 6961a6d4e4SBram Moolenaar " type becomes list<any> 7061a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 715381c7a1SBram Moolenaar " type becomes dict<any> 725381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7361a6d4e4SBram Moolenaar 74401d9ffbSBram Moolenaar g:newvar = 'new' 75401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 76401d9ffbSBram Moolenaar 77401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 78401d9ffbSBram Moolenaar g:existing = 'no' 79401d9ffbSBram Moolenaar assert_equal('no', g:existing) 80401d9ffbSBram Moolenaar 81b283a8a6SBram Moolenaar v:char = 'abc' 826e587dcbSBram Moolenaar assert_equal('abc', v:char) 83b283a8a6SBram Moolenaar 84b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 856e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 86b283a8a6SBram Moolenaar $ENVVAR = '' 876e587dcbSBram Moolenaar 88fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 89fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 90fd1823e0SBram Moolenaar s:addToMe += 222 91fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 920bbf722aSBram Moolenaar s:newVar = 'new' 930bbf722aSBram Moolenaar assert_equal('new', s:newVar) 948a7d6542SBram Moolenaarenddef 958a7d6542SBram Moolenaar 968a7d6542SBram Moolenaarfunc Test_assignment_failure() 978a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 988a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 998a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1008a7d6542SBram Moolenaar 1018a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1028a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1038a7d6542SBram Moolenaar 104*33fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 105*33fa29cfSBram Moolenaar 1068a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 1078a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1088a7d6542SBram Moolenaar 1098a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 1108a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 1118a7d6542SBram Moolenaar 1128a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 1138a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 11442a480bfSBram Moolenaar 11542a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 11642a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 117599c89c8SBram Moolenaarendfunc 118599c89c8SBram Moolenaar 119599c89c8SBram Moolenaarfunc Test_wrong_type() 120599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 121599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 122599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 123599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 124599c89c8SBram Moolenaar 125599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 126599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 12742a480bfSBram Moolenaar 12842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 12942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 13042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 13142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 13242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 13342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 13442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 13542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 13642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 13742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 13842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 1398a7d6542SBram Moolenaarendfunc 1408a7d6542SBram Moolenaar 1418a7d6542SBram Moolenaarfunc Test_const() 1428a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 1438a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 1448a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 1458a7d6542SBram Moolenaarendfunc 1468a7d6542SBram Moolenaar 1478a7d6542SBram Moolenaardef Test_block() 1488a7d6542SBram Moolenaar let outer = 1 1498a7d6542SBram Moolenaar { 1508a7d6542SBram Moolenaar let inner = 2 1518a7d6542SBram Moolenaar assert_equal(1, outer) 1528a7d6542SBram Moolenaar assert_equal(2, inner) 1538a7d6542SBram Moolenaar } 1548a7d6542SBram Moolenaar assert_equal(1, outer) 1558a7d6542SBram Moolenaarenddef 1568a7d6542SBram Moolenaar 1578a7d6542SBram Moolenaarfunc Test_block_failure() 1588a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1598a7d6542SBram Moolenaarendfunc 1608a7d6542SBram Moolenaar 1618a7d6542SBram Moolenaardef ReturnString(): string 1628a7d6542SBram Moolenaar return 'string' 1638a7d6542SBram Moolenaarenddef 1648a7d6542SBram Moolenaar 1658a7d6542SBram Moolenaardef ReturnNumber(): number 1668a7d6542SBram Moolenaar return 123 1678a7d6542SBram Moolenaarenddef 1688a7d6542SBram Moolenaar 16909f28f49SBram Moolenaarlet g:notNumber = 'string' 17009f28f49SBram Moolenaar 17109f28f49SBram Moolenaardef ReturnGlobal(): number 17209f28f49SBram Moolenaar return g:notNumber 17309f28f49SBram Moolenaarenddef 17409f28f49SBram Moolenaar 1758a7d6542SBram Moolenaardef Test_return_string() 1768a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1778a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 17809f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1798a7d6542SBram Moolenaarenddef 1808a7d6542SBram Moolenaar 1818a7d6542SBram Moolenaarfunc Increment() 1828a7d6542SBram Moolenaar let g:counter += 1 1838a7d6542SBram Moolenaarendfunc 1848a7d6542SBram Moolenaar 1858a7d6542SBram Moolenaardef Test_call_ufunc_count() 1868a7d6542SBram Moolenaar g:counter = 1 1878a7d6542SBram Moolenaar Increment() 1888a7d6542SBram Moolenaar Increment() 1898a7d6542SBram Moolenaar Increment() 1908a7d6542SBram Moolenaar " works with and without :call 1918a7d6542SBram Moolenaar assert_equal(4, g:counter) 192b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1938a7d6542SBram Moolenaar unlet g:counter 1948a7d6542SBram Moolenaarenddef 1958a7d6542SBram Moolenaar 1968a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1978a7d6542SBram Moolenaar let res = arg 1988a7d6542SBram Moolenaar for s in rest 1998a7d6542SBram Moolenaar res ..= ',' .. s 2008a7d6542SBram Moolenaar endfor 2018a7d6542SBram Moolenaar return res 2028a7d6542SBram Moolenaarenddef 2038a7d6542SBram Moolenaar 2048a7d6542SBram Moolenaardef Test_call_varargs() 2058a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 2068a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 2078a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 2088a7d6542SBram Moolenaarenddef 2098a7d6542SBram Moolenaar 210170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 211170fcfcfSBram Moolenaar return name 212170fcfcfSBram Moolenaarenddef 213170fcfcfSBram Moolenaar 214170fcfcfSBram Moolenaardef Test_call_default_args() 215170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 216170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 217170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 218170fcfcfSBram Moolenaarenddef 219170fcfcfSBram Moolenaar 220170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 221170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 222170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 223170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 224170fcfcfSBram Moolenaarendfunc 225170fcfcfSBram Moolenaar 226b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 227b35efa5eSBram Moolenaar echo a:arg 228b35efa5eSBram Moolenaarendfunc 229b35efa5eSBram Moolenaar 230b35efa5eSBram Moolenaardef Test_call_wrong_arg_count() 231b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 232b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 233b35efa5eSBram Moolenaarenddef 234b35efa5eSBram Moolenaar 235170fcfcfSBram Moolenaar" Default arg and varargs 236170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 237170fcfcfSBram Moolenaar let res = one .. ',' .. two 238170fcfcfSBram Moolenaar for s in rest 239170fcfcfSBram Moolenaar res ..= ',' .. s 240170fcfcfSBram Moolenaar endfor 241170fcfcfSBram Moolenaar return res 242170fcfcfSBram Moolenaarenddef 243170fcfcfSBram Moolenaar 244170fcfcfSBram Moolenaardef Test_call_def_varargs() 245170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 246170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 247170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 248170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 249170fcfcfSBram Moolenaarenddef 250170fcfcfSBram Moolenaar 25142a480bfSBram Moolenaardef Test_using_var_as_arg() 25242a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 25342a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 25442a480bfSBram Moolenaar call delete('Xdef') 25542a480bfSBram Moolenaarenddef 25642a480bfSBram Moolenaar 257b35efa5eSBram Moolenaardef Test_call_func_defined_later() 258b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 259b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 260b35efa5eSBram Moolenaarenddef 261170fcfcfSBram Moolenaar 262b35efa5eSBram Moolenaarfunc DefinedLater(arg) 26326e117e9SBram Moolenaar return a:arg 26426e117e9SBram Moolenaarendfunc 26526e117e9SBram Moolenaar 2667eeefd4aSBram Moolenaardef FuncWithForwardCall() 2677eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 2687eeefd4aSBram Moolenaarenddef 2697eeefd4aSBram Moolenaar 2707eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 2717eeefd4aSBram Moolenaar return arg 2727eeefd4aSBram Moolenaarenddef 2737eeefd4aSBram Moolenaar 2747eeefd4aSBram Moolenaardef Test_error_in_nested_function() 2757eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 2767eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 2777eeefd4aSBram Moolenaarenddef 2787eeefd4aSBram Moolenaar 2798a7d6542SBram Moolenaardef Test_return_type_wrong() 280978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 281978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 282978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 283978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 284cf3f8bf4SBram Moolenaar 285cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 286cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 2878a7d6542SBram Moolenaarenddef 2888a7d6542SBram Moolenaar 289bfe12043SBram Moolenaardef Test_arg_type_wrong() 290bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 291bfe12043SBram Moolenaarenddef 292bfe12043SBram Moolenaar 2938a7d6542SBram Moolenaardef Test_try_catch() 2948a7d6542SBram Moolenaar let l = [] 2958a7d6542SBram Moolenaar try 2968a7d6542SBram Moolenaar add(l, '1') 2978a7d6542SBram Moolenaar throw 'wrong' 2988a7d6542SBram Moolenaar add(l, '2') 2998a7d6542SBram Moolenaar catch 3008a7d6542SBram Moolenaar add(l, v:exception) 3018a7d6542SBram Moolenaar finally 3028a7d6542SBram Moolenaar add(l, '3') 3038a7d6542SBram Moolenaar endtry 3048a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 3058a7d6542SBram Moolenaarenddef 3068a7d6542SBram Moolenaar 307257cc5eeSBram Moolenaardef ThrowFromDef() 308257cc5eeSBram Moolenaar throw 'getout' 309257cc5eeSBram Moolenaarenddef 310257cc5eeSBram Moolenaar 311257cc5eeSBram Moolenaarfunc CatchInFunc() 312257cc5eeSBram Moolenaar try 313257cc5eeSBram Moolenaar call ThrowFromDef() 314257cc5eeSBram Moolenaar catch 315257cc5eeSBram Moolenaar let g:thrown_func = v:exception 316257cc5eeSBram Moolenaar endtry 317257cc5eeSBram Moolenaarendfunc 318257cc5eeSBram Moolenaar 319257cc5eeSBram Moolenaardef CatchInDef() 320257cc5eeSBram Moolenaar try 321257cc5eeSBram Moolenaar ThrowFromDef() 322257cc5eeSBram Moolenaar catch 323257cc5eeSBram Moolenaar g:thrown_def = v:exception 324257cc5eeSBram Moolenaar endtry 325257cc5eeSBram Moolenaarenddef 326257cc5eeSBram Moolenaar 327f575adffSBram Moolenaardef ReturnFinally(): string 328f575adffSBram Moolenaar try 329f575adffSBram Moolenaar return 'intry' 330f575adffSBram Moolenaar finally 331f575adffSBram Moolenaar g:in_finally = 'finally' 332f575adffSBram Moolenaar endtry 333f575adffSBram Moolenaar return 'end' 334f575adffSBram Moolenaarenddef 335f575adffSBram Moolenaar 336257cc5eeSBram Moolenaardef Test_try_catch_nested() 337257cc5eeSBram Moolenaar CatchInFunc() 338257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 339257cc5eeSBram Moolenaar 340257cc5eeSBram Moolenaar CatchInDef() 341257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 342f575adffSBram Moolenaar 343f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 344f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 345f575adffSBram Moolenaarenddef 346f575adffSBram Moolenaar 347f575adffSBram Moolenaardef Test_try_catch_match() 348f575adffSBram Moolenaar let seq = 'a' 349f575adffSBram Moolenaar try 350f575adffSBram Moolenaar throw 'something' 351f575adffSBram Moolenaar catch /nothing/ 352f575adffSBram Moolenaar seq ..= 'x' 353f575adffSBram Moolenaar catch /some/ 354f575adffSBram Moolenaar seq ..= 'b' 355f575adffSBram Moolenaar catch /asdf/ 356f575adffSBram Moolenaar seq ..= 'x' 357f575adffSBram Moolenaar finally 358f575adffSBram Moolenaar seq ..= 'c' 359f575adffSBram Moolenaar endtry 360f575adffSBram Moolenaar assert_equal('abc', seq) 361257cc5eeSBram Moolenaarenddef 362257cc5eeSBram Moolenaar 3638a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3648a7d6542SBram Moolenaar vim9script 3658a7d6542SBram Moolenaar let name: string = 'bob' 3668a7d6542SBram Moolenaar def Concat(arg: string): string 3678a7d6542SBram Moolenaar return name .. arg 3688a7d6542SBram Moolenaar enddef 3698a7d6542SBram Moolenaar let g:result = Concat('bie') 3708a7d6542SBram Moolenaar let g:localname = name 3718a7d6542SBram Moolenaar 3728a7d6542SBram Moolenaar export const CONST = 1234 3738a7d6542SBram Moolenaar export let exported = 9876 3746e587dcbSBram Moolenaar export let exp_name = 'John' 3758a7d6542SBram Moolenaar export def Exported(): string 3768a7d6542SBram Moolenaar return 'Exported' 3778a7d6542SBram Moolenaar enddef 3788a7d6542SBram MoolenaarEND 3798a7d6542SBram Moolenaar 3805269bd2aSBram Moolenaardef Test_vim9_import_export() 3818a7d6542SBram Moolenaar let import_script_lines =<< trim END 3828a7d6542SBram Moolenaar vim9script 3838a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3848a7d6542SBram Moolenaar g:imported = exported 3856e587dcbSBram Moolenaar exported += 3 3866e587dcbSBram Moolenaar g:imported_added = exported 3878a7d6542SBram Moolenaar g:imported_func = Exported() 3886e587dcbSBram Moolenaar 3896e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3906e587dcbSBram Moolenaar g:imported_name = exp_name 3916e587dcbSBram Moolenaar exp_name ..= ' Doe' 3926e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3935381c7a1SBram Moolenaar g:imported_later = exported 3948a7d6542SBram Moolenaar END 3958a7d6542SBram Moolenaar 3968a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3978a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaar source Ximport.vim 4008a7d6542SBram Moolenaar 4018a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 4028a7d6542SBram Moolenaar assert_equal('bob', g:localname) 4038a7d6542SBram Moolenaar assert_equal(9876, g:imported) 4046e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 4055381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 4068a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 4076e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 4086e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 4098a7d6542SBram Moolenaar assert_false(exists('g:name')) 4108a7d6542SBram Moolenaar 4118a7d6542SBram Moolenaar unlet g:result 4128a7d6542SBram Moolenaar unlet g:localname 4138a7d6542SBram Moolenaar unlet g:imported 4146e587dcbSBram Moolenaar unlet g:imported_added 4155381c7a1SBram Moolenaar unlet g:imported_later 4168a7d6542SBram Moolenaar unlet g:imported_func 4176e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4188a7d6542SBram Moolenaar delete('Ximport.vim') 419f2d5c240SBram Moolenaar 4205381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4215381c7a1SBram Moolenaar vim9script 4225381c7a1SBram Moolenaar def ImportInDef() 4235381c7a1SBram Moolenaar import exported from './Xexport.vim' 4245381c7a1SBram Moolenaar g:imported = exported 4255381c7a1SBram Moolenaar exported += 7 4265381c7a1SBram Moolenaar g:imported_added = exported 4275381c7a1SBram Moolenaar enddef 4285381c7a1SBram Moolenaar ImportInDef() 4295381c7a1SBram Moolenaar END 4305381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4315381c7a1SBram Moolenaar source Ximport2.vim 4325381c7a1SBram Moolenaar " TODO: this should be 9879 4335381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4345381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4355381c7a1SBram Moolenaar unlet g:imported 4365381c7a1SBram Moolenaar unlet g:imported_added 4375381c7a1SBram Moolenaar delete('Ximport2.vim') 4385381c7a1SBram Moolenaar 439f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 440f2d5c240SBram Moolenaar vim9script 441f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 442f2d5c240SBram Moolenaar def UseExport() 443f2d5c240SBram Moolenaar g:imported = Export.exported 444f2d5c240SBram Moolenaar enddef 445f2d5c240SBram Moolenaar UseExport() 446f2d5c240SBram Moolenaar END 447f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 448f2d5c240SBram Moolenaar source Ximport.vim 4495381c7a1SBram Moolenaar assert_equal(9883, g:imported) 450f2d5c240SBram Moolenaar 451599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 452599c89c8SBram Moolenaar vim9script 453599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 454599c89c8SBram Moolenaar def Func() 455599c89c8SBram Moolenaar let dummy = 1 456599c89c8SBram Moolenaar let imported = Export + dummy 457599c89c8SBram Moolenaar enddef 458599c89c8SBram Moolenaar END 459599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 460599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 461599c89c8SBram Moolenaar 462599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 463599c89c8SBram Moolenaar vim9script 464599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 465599c89c8SBram Moolenaar def Func() 466599c89c8SBram Moolenaar let imported = Export . exported 467599c89c8SBram Moolenaar enddef 468599c89c8SBram Moolenaar END 469599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 470599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 471599c89c8SBram Moolenaar 472599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 473599c89c8SBram Moolenaar vim9script 474599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 475599c89c8SBram Moolenaar def Func() 476599c89c8SBram Moolenaar let imported = Export. 477599c89c8SBram Moolenaar enddef 478599c89c8SBram Moolenaar END 479599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 480599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 481599c89c8SBram Moolenaar 482f2d5c240SBram Moolenaar let import_star_lines =<< trim END 483f2d5c240SBram Moolenaar vim9script 484f2d5c240SBram Moolenaar import * from './Xexport.vim' 485f2d5c240SBram Moolenaar g:imported = exported 486f2d5c240SBram Moolenaar END 487f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 488f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 489f2d5c240SBram Moolenaar 490fa29c8abSBram Moolenaar " try to import something that exists but is not exported 491fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 492fa29c8abSBram Moolenaar vim9script 493fa29c8abSBram Moolenaar import name from './Xexport.vim' 494fa29c8abSBram Moolenaar END 495fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 496fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 497fa29c8abSBram Moolenaar 4985269bd2aSBram Moolenaar " try to import something that is already defined 4995269bd2aSBram Moolenaar let import_already_defined =<< trim END 5005269bd2aSBram Moolenaar vim9script 5015269bd2aSBram Moolenaar let exported = 'something' 5025269bd2aSBram Moolenaar import exported from './Xexport.vim' 5035269bd2aSBram Moolenaar END 5045269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5055269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5065269bd2aSBram Moolenaar 5075269bd2aSBram Moolenaar " try to import something that is already defined 5085269bd2aSBram Moolenaar import_already_defined =<< trim END 5095269bd2aSBram Moolenaar vim9script 5105269bd2aSBram Moolenaar let exported = 'something' 5115269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5125269bd2aSBram Moolenaar END 5135269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5145269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5155269bd2aSBram Moolenaar 5165269bd2aSBram Moolenaar " try to import something that is already defined 5175269bd2aSBram Moolenaar import_already_defined =<< trim END 5185269bd2aSBram Moolenaar vim9script 5195269bd2aSBram Moolenaar let exported = 'something' 5205269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5215269bd2aSBram Moolenaar END 5225269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5235269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5245269bd2aSBram Moolenaar 525fa29c8abSBram Moolenaar " import a very long name, requires making a copy 526fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 527fa29c8abSBram Moolenaar vim9script 528fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 529fa29c8abSBram Moolenaar END 530fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 531fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 532fa29c8abSBram Moolenaar 533fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 534fa29c8abSBram Moolenaar vim9script 535fa29c8abSBram Moolenaar import name './Xexport.vim' 536fa29c8abSBram Moolenaar END 537fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 538fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 539fa29c8abSBram Moolenaar 540fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 541fa29c8abSBram Moolenaar vim9script 542fa29c8abSBram Moolenaar import name from Xexport.vim 543fa29c8abSBram Moolenaar END 544fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 545fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 546fa29c8abSBram Moolenaar 547fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 548fa29c8abSBram Moolenaar vim9script 549fa29c8abSBram Moolenaar import name from './XnoExport.vim' 550fa29c8abSBram Moolenaar END 551fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 552fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 553fa29c8abSBram Moolenaar 554fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 555fa29c8abSBram Moolenaar vim9script 556fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 557fa29c8abSBram Moolenaar END 5585269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5595269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 560fa29c8abSBram Moolenaar 561f2d5c240SBram Moolenaar delete('Ximport.vim') 5625269bd2aSBram Moolenaar delete('Ximport3.vim') 5638a7d6542SBram Moolenaar delete('Xexport.vim') 5648a7d6542SBram Moolenaar 565750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 566750802b5SBram Moolenaar set cpo&vi 567750802b5SBram Moolenaar let cpo_before = &cpo 568750802b5SBram Moolenaar let lines =<< trim END 569750802b5SBram Moolenaar vim9script 570750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 571750802b5SBram Moolenaar END 572750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 573750802b5SBram Moolenaar source Xvim9_script 574750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 575750802b5SBram Moolenaar set cpo&vim 576750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 577750802b5SBram Moolenaar delete('Xvim9_script') 578750802b5SBram Moolenaarenddef 579750802b5SBram Moolenaar 580750802b5SBram Moolenaardef Test_vim9script_fails() 5818a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 5828a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 583750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 584f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 585750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 586750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 587750802b5SBram Moolenaar 588750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 589750802b5SBram Moolenaar assert_fails('export something', 'E1042') 5908a7d6542SBram Moolenaarenddef 5918a7d6542SBram Moolenaar 5928a7d6542SBram Moolenaardef Test_vim9script_call() 5938a7d6542SBram Moolenaar let lines =<< trim END 5948a7d6542SBram Moolenaar vim9script 5958a7d6542SBram Moolenaar let var = '' 5968a7d6542SBram Moolenaar def MyFunc(arg: string) 5978a7d6542SBram Moolenaar var = arg 5988a7d6542SBram Moolenaar enddef 5998a7d6542SBram Moolenaar MyFunc('foobar') 6008a7d6542SBram Moolenaar assert_equal('foobar', var) 6018a7d6542SBram Moolenaar 6028a7d6542SBram Moolenaar let str = 'barfoo' 6038a7d6542SBram Moolenaar str->MyFunc() 6048a7d6542SBram Moolenaar assert_equal('barfoo', var) 6058a7d6542SBram Moolenaar 6068a7d6542SBram Moolenaar let g:value = 'value' 6078a7d6542SBram Moolenaar g:value->MyFunc() 6088a7d6542SBram Moolenaar assert_equal('value', var) 6098a7d6542SBram Moolenaar 6108a7d6542SBram Moolenaar let listvar = [] 6118a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 6128a7d6542SBram Moolenaar listvar = arg 6138a7d6542SBram Moolenaar enddef 6148a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 6158a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 6168a7d6542SBram Moolenaar 6178a7d6542SBram Moolenaar let dictvar = {} 6188a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 6198a7d6542SBram Moolenaar dictvar = arg 6208a7d6542SBram Moolenaar enddef 6218a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 6228a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 623*33fa29cfSBram Moolenaar def CompiledDict() 624*33fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 625*33fa29cfSBram Moolenaar enddef 626*33fa29cfSBram Moolenaar CompiledDict() 627*33fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 628*33fa29cfSBram Moolenaar 6298a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 6308a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 6310c6ceaf9SBram Moolenaar 6320c6ceaf9SBram Moolenaar ('text')->MyFunc() 6330c6ceaf9SBram Moolenaar assert_equal('text', var) 6340c6ceaf9SBram Moolenaar ("some")->MyFunc() 6350c6ceaf9SBram Moolenaar assert_equal('some', var) 6368a7d6542SBram Moolenaar END 6378a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 6388a7d6542SBram Moolenaar source Xcall.vim 6398a7d6542SBram Moolenaar delete('Xcall.vim') 6408a7d6542SBram Moolenaarenddef 6418a7d6542SBram Moolenaar 6428a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 6438a7d6542SBram Moolenaar let lines =<< trim END 6448a7d6542SBram Moolenaar vim9script 6458a7d6542SBram Moolenaar let var = '' 6468a7d6542SBram Moolenaar def MyFunc(arg: string) 6478a7d6542SBram Moolenaar let var = 123 6488a7d6542SBram Moolenaar enddef 6498a7d6542SBram Moolenaar END 6508a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 6518a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 6528a7d6542SBram Moolenaar delete('Xcall_decl.vim') 6538a7d6542SBram Moolenaarenddef 6548a7d6542SBram Moolenaar 6558a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 6568a7d6542SBram Moolenaar let lines =<< trim END 6578a7d6542SBram Moolenaar vim9script 6588a7d6542SBram Moolenaar const var = '' 6598a7d6542SBram Moolenaar def MyFunc(arg: string) 6608a7d6542SBram Moolenaar var = 'asdf' 6618a7d6542SBram Moolenaar enddef 6628a7d6542SBram Moolenaar END 6638a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 6648a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 6658a7d6542SBram Moolenaar delete('Xcall_const.vim') 6668a7d6542SBram Moolenaarenddef 6678a7d6542SBram Moolenaar 6688a7d6542SBram Moolenaardef Test_vim9script_reload() 6698a7d6542SBram Moolenaar let lines =<< trim END 6708a7d6542SBram Moolenaar vim9script 6718a7d6542SBram Moolenaar const var = '' 6728a7d6542SBram Moolenaar let valone = 1234 6738a7d6542SBram Moolenaar def MyFunc(arg: string) 6748a7d6542SBram Moolenaar valone = 5678 6758a7d6542SBram Moolenaar enddef 6768a7d6542SBram Moolenaar END 6778a7d6542SBram Moolenaar let morelines =<< trim END 6788a7d6542SBram Moolenaar let valtwo = 222 6798a7d6542SBram Moolenaar export def GetValtwo(): number 6808a7d6542SBram Moolenaar return valtwo 6818a7d6542SBram Moolenaar enddef 6828a7d6542SBram Moolenaar END 6838a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 6848a7d6542SBram Moolenaar source Xreload.vim 6858a7d6542SBram Moolenaar source Xreload.vim 6868a7d6542SBram Moolenaar source Xreload.vim 6878a7d6542SBram Moolenaar 6888a7d6542SBram Moolenaar let testlines =<< trim END 6898a7d6542SBram Moolenaar vim9script 6908a7d6542SBram Moolenaar def TheFunc() 6918a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 6928a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 6938a7d6542SBram Moolenaar enddef 6948a7d6542SBram Moolenaar TheFunc() 6958a7d6542SBram Moolenaar END 6968a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 6978a7d6542SBram Moolenaar source Ximport.vim 6988a7d6542SBram Moolenaar 6998a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 7008a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 7018a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7028a7d6542SBram Moolenaar source Xreload.vim 7038a7d6542SBram Moolenaar source Ximport.vim 7048a7d6542SBram Moolenaar 7058a7d6542SBram Moolenaar " cannot declare a var twice 7068a7d6542SBram Moolenaar lines =<< trim END 7078a7d6542SBram Moolenaar vim9script 7088a7d6542SBram Moolenaar let valone = 1234 7098a7d6542SBram Moolenaar let valone = 5678 7108a7d6542SBram Moolenaar END 7118a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7128a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 7138a7d6542SBram Moolenaar 7148a7d6542SBram Moolenaar delete('Xreload.vim') 7158a7d6542SBram Moolenaar delete('Ximport.vim') 7168a7d6542SBram Moolenaarenddef 7178a7d6542SBram Moolenaar 7188a7d6542SBram Moolenaardef Test_import_absolute() 7198a7d6542SBram Moolenaar let import_lines = [ 7208a7d6542SBram Moolenaar \ 'vim9script', 7218a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 722b283a8a6SBram Moolenaar \ 'def UseExported()', 7238a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 7244e12a5dfSBram Moolenaar \ ' exported = 8888', 7254e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 726b283a8a6SBram Moolenaar \ 'enddef', 727b283a8a6SBram Moolenaar \ 'UseExported()', 7284e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 7298a7d6542SBram Moolenaar \ ] 7308a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 7318a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 7328a7d6542SBram Moolenaar 7338a7d6542SBram Moolenaar source Ximport_abs.vim 7348a7d6542SBram Moolenaar 7358a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 7364e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 737b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 738b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 739b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7404e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 7414e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 7424e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 7434e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 7444e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7454e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 7464e12a5dfSBram Moolenaar \, g:import_disassembled) 7478a7d6542SBram Moolenaar unlet g:imported_abs 7484e12a5dfSBram Moolenaar unlet g:import_disassembled 7498a7d6542SBram Moolenaar 7508a7d6542SBram Moolenaar delete('Ximport_abs.vim') 7518a7d6542SBram Moolenaar delete('Xexport_abs.vim') 7528a7d6542SBram Moolenaarenddef 7538a7d6542SBram Moolenaar 7548a7d6542SBram Moolenaardef Test_import_rtp() 7558a7d6542SBram Moolenaar let import_lines = [ 7568a7d6542SBram Moolenaar \ 'vim9script', 7578a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 7588a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 7598a7d6542SBram Moolenaar \ ] 7608a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 7618a7d6542SBram Moolenaar mkdir('import') 7628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 7638a7d6542SBram Moolenaar 7648a7d6542SBram Moolenaar let save_rtp = &rtp 7658a7d6542SBram Moolenaar &rtp = getcwd() 7668a7d6542SBram Moolenaar source Ximport_rtp.vim 7678a7d6542SBram Moolenaar &rtp = save_rtp 7688a7d6542SBram Moolenaar 7698a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 7708a7d6542SBram Moolenaar unlet g:imported_rtp 7718a7d6542SBram Moolenaar 7728a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 7738a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 7748a7d6542SBram Moolenaar delete('import', 'd') 7758a7d6542SBram Moolenaarenddef 7768a7d6542SBram Moolenaar 7778a7d6542SBram Moolenaardef Test_fixed_size_list() 7788a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 7798a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 7808a7d6542SBram Moolenaar l->remove(0) 7818a7d6542SBram Moolenaar l->add(5) 7828a7d6542SBram Moolenaar l->insert(99, 1) 7830f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 7848a7d6542SBram Moolenaarenddef 7858a7d6542SBram Moolenaar 786673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 787673660abSBram Moolenaar" recognized. 788673660abSBram Moolenaarfunc Test_function_python() 789673660abSBram Moolenaar CheckFeature python3 790673660abSBram Moolenaar let py = 'python3' 791673660abSBram Moolenaar execute py "<< EOF" 792673660abSBram Moolenaardef do_something(): 793673660abSBram Moolenaar return 1 794673660abSBram MoolenaarEOF 795673660abSBram Moolenaarendfunc 796673660abSBram Moolenaar 797158906cfSBram Moolenaardef IfElse(what: number): string 798158906cfSBram Moolenaar let res = '' 799158906cfSBram Moolenaar if what == 1 800158906cfSBram Moolenaar res = "one" 801158906cfSBram Moolenaar elseif what == 2 802158906cfSBram Moolenaar res = "two" 803a259d8d3SBram Moolenaar else 804158906cfSBram Moolenaar res = "three" 805a259d8d3SBram Moolenaar endif 806158906cfSBram Moolenaar return res 807a259d8d3SBram Moolenaarenddef 808a259d8d3SBram Moolenaar 809158906cfSBram Moolenaardef Test_if_elseif_else() 810158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 811158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 812158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 8130f18b6d1SBram Moolenaarenddef 8140f18b6d1SBram Moolenaar 8156d69bf60SBram Moolenaarlet g:bool_true = v:true 8166d69bf60SBram Moolenaarlet g:bool_false = v:false 8176d69bf60SBram Moolenaar 8186d69bf60SBram Moolenaardef Test_if_const_expr() 8196d69bf60SBram Moolenaar let res = false 8206d69bf60SBram Moolenaar if true ? true : false 8216d69bf60SBram Moolenaar res = true 8226d69bf60SBram Moolenaar endif 8236d69bf60SBram Moolenaar assert_equal(true, res) 8246d69bf60SBram Moolenaar 8256d69bf60SBram Moolenaar res = false 8266d69bf60SBram Moolenaar if g:bool_true ? true : false 8276d69bf60SBram Moolenaar res = true 8286d69bf60SBram Moolenaar endif 8296d69bf60SBram Moolenaar assert_equal(true, res) 8306d69bf60SBram Moolenaar 8316d69bf60SBram Moolenaar res = false 8326d69bf60SBram Moolenaar if true ? g:bool_true : false 8336d69bf60SBram Moolenaar res = true 8346d69bf60SBram Moolenaar endif 8356d69bf60SBram Moolenaar assert_equal(true, res) 8366d69bf60SBram Moolenaar 8376d69bf60SBram Moolenaar res = false 8386d69bf60SBram Moolenaar if true ? true : g:bool_false 8396d69bf60SBram Moolenaar res = true 8406d69bf60SBram Moolenaar endif 8416d69bf60SBram Moolenaar assert_equal(true, res) 8426d69bf60SBram Moolenaar 8436d69bf60SBram Moolenaar res = false 8446d69bf60SBram Moolenaar if true ? false : true 8456d69bf60SBram Moolenaar res = true 8466d69bf60SBram Moolenaar endif 8476d69bf60SBram Moolenaar assert_equal(false, res) 8486d69bf60SBram Moolenaar 8496d69bf60SBram Moolenaar res = false 8506d69bf60SBram Moolenaar if false ? false : true 8516d69bf60SBram Moolenaar res = true 8526d69bf60SBram Moolenaar endif 8536d69bf60SBram Moolenaar assert_equal(true, res) 8546d69bf60SBram Moolenaar 8556d69bf60SBram Moolenaar res = false 8566d69bf60SBram Moolenaar if false ? true : false 8576d69bf60SBram Moolenaar res = true 8586d69bf60SBram Moolenaar endif 8596d69bf60SBram Moolenaar assert_equal(false, res) 8606d69bf60SBram Moolenaar 8616d69bf60SBram Moolenaar res = false 8626d69bf60SBram Moolenaar if true && true 8636d69bf60SBram Moolenaar res = true 8646d69bf60SBram Moolenaar endif 8656d69bf60SBram Moolenaar assert_equal(true, res) 8666d69bf60SBram Moolenaar 8676d69bf60SBram Moolenaar res = false 8686d69bf60SBram Moolenaar if true && false 8696d69bf60SBram Moolenaar res = true 8706d69bf60SBram Moolenaar endif 8716d69bf60SBram Moolenaar assert_equal(false, res) 8726d69bf60SBram Moolenaar 8736d69bf60SBram Moolenaar res = false 8746d69bf60SBram Moolenaar if g:bool_true && false 8756d69bf60SBram Moolenaar res = true 8766d69bf60SBram Moolenaar endif 8776d69bf60SBram Moolenaar assert_equal(false, res) 8786d69bf60SBram Moolenaar 8796d69bf60SBram Moolenaar res = false 8806d69bf60SBram Moolenaar if true && g:bool_false 8816d69bf60SBram Moolenaar res = true 8826d69bf60SBram Moolenaar endif 8836d69bf60SBram Moolenaar assert_equal(false, res) 8846d69bf60SBram Moolenaar 8856d69bf60SBram Moolenaar res = false 8866d69bf60SBram Moolenaar if false && false 8876d69bf60SBram Moolenaar res = true 8886d69bf60SBram Moolenaar endif 8896d69bf60SBram Moolenaar assert_equal(false, res) 8906d69bf60SBram Moolenaar 8916d69bf60SBram Moolenaar res = false 8926d69bf60SBram Moolenaar if true || false 8936d69bf60SBram Moolenaar res = true 8946d69bf60SBram Moolenaar endif 8956d69bf60SBram Moolenaar assert_equal(true, res) 8966d69bf60SBram Moolenaar 8976d69bf60SBram Moolenaar res = false 8986d69bf60SBram Moolenaar if g:bool_true || false 8996d69bf60SBram Moolenaar res = true 9006d69bf60SBram Moolenaar endif 9016d69bf60SBram Moolenaar assert_equal(true, res) 9026d69bf60SBram Moolenaar 9036d69bf60SBram Moolenaar res = false 9046d69bf60SBram Moolenaar if true || g:bool_false 9056d69bf60SBram Moolenaar res = true 9066d69bf60SBram Moolenaar endif 9076d69bf60SBram Moolenaar assert_equal(true, res) 9086d69bf60SBram Moolenaar 9096d69bf60SBram Moolenaar res = false 9106d69bf60SBram Moolenaar if false || false 9116d69bf60SBram Moolenaar res = true 9126d69bf60SBram Moolenaar endif 9136d69bf60SBram Moolenaar assert_equal(false, res) 9146d69bf60SBram Moolenaar 9156d69bf60SBram Moolenaarenddef 9166d69bf60SBram Moolenaar 91763ce4849SBram Moolenaardef Test_delfunc() 91863ce4849SBram Moolenaar let lines =<< trim END 91963ce4849SBram Moolenaar vim9script 92063ce4849SBram Moolenaar def GoneSoon() 92163ce4849SBram Moolenaar echo 'hello' 92263ce4849SBram Moolenaar enddef 92363ce4849SBram Moolenaar 92463ce4849SBram Moolenaar def CallGoneSoon() 92563ce4849SBram Moolenaar GoneSoon() 92663ce4849SBram Moolenaar enddef 92763ce4849SBram Moolenaar 92863ce4849SBram Moolenaar delfunc GoneSoon 92963ce4849SBram Moolenaar CallGoneSoon() 93063ce4849SBram Moolenaar END 93163ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 93263ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 93363ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 93463ce4849SBram Moolenaar 93563ce4849SBram Moolenaar delete('XToDelFunc') 93663ce4849SBram Moolenaarenddef 93763ce4849SBram Moolenaar 938ad39c094SBram Moolenaardef Test_execute_cmd() 939ad39c094SBram Moolenaar new 940ad39c094SBram Moolenaar setline(1, 'default') 941ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 942ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 943ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 944ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 945ad39c094SBram Moolenaar execute cmd1 cmd2 946ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 947ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 948ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 949ad39c094SBram Moolenaar let cmd_first = 'call ' 950ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 951ad39c094SBram Moolenaar execute cmd_first .. cmd_last 952ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 953ad39c094SBram Moolenaar bwipe! 954ad39c094SBram Moolenaarenddef 955ad39c094SBram Moolenaar 956ad39c094SBram Moolenaardef Test_echo_cmd() 957ad39c094SBram Moolenaar echo 'something' 958ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 959ad39c094SBram Moolenaar 960ad39c094SBram Moolenaar let str1 = 'some' 961ad39c094SBram Moolenaar let str2 = 'more' 962ad39c094SBram Moolenaar echo str1 str2 963ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 964ad39c094SBram Moolenaarenddef 965ad39c094SBram Moolenaar 96641fe0617SBram Moolenaardef Test_for_outside_of_function() 96741fe0617SBram Moolenaar let lines =<< trim END 96841fe0617SBram Moolenaar vim9script 96941fe0617SBram Moolenaar new 97041fe0617SBram Moolenaar for var in range(0, 3) 97141fe0617SBram Moolenaar append(line('$'), var) 97241fe0617SBram Moolenaar endfor 97341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 97441fe0617SBram Moolenaar bwipe! 97541fe0617SBram Moolenaar END 97641fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 97741fe0617SBram Moolenaar source Xvim9for.vim 97841fe0617SBram Moolenaar delete('Xvim9for.vim') 97941fe0617SBram Moolenaarenddef 9808a7d6542SBram Moolenaar 981d0df1aacSBram Moolenaardef Test_while_loop() 982d0df1aacSBram Moolenaar let result = '' 983d0df1aacSBram Moolenaar let cnt = 0 984d0df1aacSBram Moolenaar while cnt < 555 985d0df1aacSBram Moolenaar if cnt == 3 986d0df1aacSBram Moolenaar break 987d0df1aacSBram Moolenaar endif 988d0df1aacSBram Moolenaar cnt += 1 989d0df1aacSBram Moolenaar if cnt == 2 990d0df1aacSBram Moolenaar continue 991d0df1aacSBram Moolenaar endif 992d0df1aacSBram Moolenaar result ..= cnt .. '_' 993d0df1aacSBram Moolenaar endwhile 994d0df1aacSBram Moolenaar assert_equal('1_3_', result) 995d0df1aacSBram Moolenaarenddef 996d0df1aacSBram Moolenaar 9979645e2d9SBram Moolenaardef Test_interrupt_loop() 99897acfc78SBram Moolenaar let caught = false 9999645e2d9SBram Moolenaar let x = 0 100097acfc78SBram Moolenaar try 10019645e2d9SBram Moolenaar while 1 10029645e2d9SBram Moolenaar x += 1 10039645e2d9SBram Moolenaar if x == 100 10049645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 10059645e2d9SBram Moolenaar endif 10069645e2d9SBram Moolenaar endwhile 100797acfc78SBram Moolenaar catch 100897acfc78SBram Moolenaar caught = true 100997acfc78SBram Moolenaar assert_equal(100, x) 101097acfc78SBram Moolenaar endtry 101197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 10129645e2d9SBram Moolenaarenddef 101320431c9dSBram Moolenaar 1014d0df1aacSBram Moolenaardef Test_substitute_cmd() 1015d0df1aacSBram Moolenaar new 1016d0df1aacSBram Moolenaar setline(1, 'something') 1017d0df1aacSBram Moolenaar :substitute(some(other( 1018d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1019d0df1aacSBram Moolenaar bwipe! 1020d0df1aacSBram Moolenaar 1021d0df1aacSBram Moolenaar " also when the context is Vim9 script 1022d0df1aacSBram Moolenaar let lines =<< trim END 1023d0df1aacSBram Moolenaar vim9script 1024d0df1aacSBram Moolenaar new 1025d0df1aacSBram Moolenaar setline(1, 'something') 1026d0df1aacSBram Moolenaar :substitute(some(other( 1027d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1028d0df1aacSBram Moolenaar bwipe! 1029d0df1aacSBram Moolenaar END 1030d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1031d0df1aacSBram Moolenaar source Xvim9lines 1032d0df1aacSBram Moolenaar 1033d0df1aacSBram Moolenaar delete('Xvim9lines') 1034d0df1aacSBram Moolenaarenddef 1035d0df1aacSBram Moolenaar 103620431c9dSBram Moolenaardef Test_redef_failure() 103720431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 103820431c9dSBram Moolenaar so Xdef 103920431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 104020431c9dSBram Moolenaar so Xdef 104120431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 104220431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 104320431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 104420431c9dSBram Moolenaar so Xdef 104520431c9dSBram Moolenaar call delete('Xdef') 104620431c9dSBram Moolenaar 104720431c9dSBram Moolenaar call assert_equal(0, Func0()) 104820431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 104920431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 105020431c9dSBram Moolenaar 105120431c9dSBram Moolenaar delfunc! Func0 105220431c9dSBram Moolenaar delfunc! Func1 105320431c9dSBram Moolenaar delfunc! Func2 105420431c9dSBram Moolenaarenddef 105520431c9dSBram Moolenaar 10567d941ee0SBram Moolenaar" Test for internal functions returning different types 10577d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 10587d941ee0SBram Moolenaar let lines =<< trim END 10597d941ee0SBram Moolenaar def RetFloat(): float 10607d941ee0SBram Moolenaar return ceil(1.456) 10617d941ee0SBram Moolenaar enddef 10627d941ee0SBram Moolenaar 10637d941ee0SBram Moolenaar def RetListAny(): list<any> 10647d941ee0SBram Moolenaar return items({'k' : 'v'}) 10657d941ee0SBram Moolenaar enddef 10667d941ee0SBram Moolenaar 10677d941ee0SBram Moolenaar def RetListString(): list<string> 10687d941ee0SBram Moolenaar return split('a:b:c', ':') 10697d941ee0SBram Moolenaar enddef 10707d941ee0SBram Moolenaar 10717d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 10727d941ee0SBram Moolenaar return getbufinfo() 10737d941ee0SBram Moolenaar enddef 10747d941ee0SBram Moolenaar 10757d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 10767d941ee0SBram Moolenaar return wordcount() 10777d941ee0SBram Moolenaar enddef 10787d941ee0SBram Moolenaar 10797d941ee0SBram Moolenaar def RetDictString(): dict<string> 10807d941ee0SBram Moolenaar return environ() 10817d941ee0SBram Moolenaar enddef 10827d941ee0SBram Moolenaar END 10837d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 10847d941ee0SBram Moolenaar source Xscript 10857d941ee0SBram Moolenaar 10867d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 10877d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 10887d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 10897d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 10907d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 10917d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 10927d941ee0SBram Moolenaar call delete('Xscript') 10937d941ee0SBram Moolenaarendfunc 10947d941ee0SBram Moolenaar 10957d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 10967d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 10977d941ee0SBram Moolenaar let l =<< trim END 10987d941ee0SBram Moolenaar def! FArgErr(): float 10997d941ee0SBram Moolenaar return ceil(1.1, 2) 11007d941ee0SBram Moolenaar enddef 11017d941ee0SBram Moolenaar END 11027d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11037d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 11047d941ee0SBram Moolenaar let l =<< trim END 11057d941ee0SBram Moolenaar def! FArgErr(): float 11067d941ee0SBram Moolenaar return ceil() 11077d941ee0SBram Moolenaar enddef 11087d941ee0SBram Moolenaar END 11097d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11107d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 11117d941ee0SBram Moolenaar call delete('Xinvalidarg') 11127d941ee0SBram Moolenaarendfunc 11137d941ee0SBram Moolenaar 11148a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1115