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 1048a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 1058a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1068a7d6542SBram Moolenaar 1078a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 1088a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 1098a7d6542SBram Moolenaar 1108a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 1118a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 11242a480bfSBram Moolenaar 11342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 11442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 11542a480bfSBram Moolenaar 11642a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 11742a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 11842a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 11942a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 12042a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 12142a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 12242a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 12342a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 12442a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 12542a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 12642a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 1278a7d6542SBram Moolenaarendfunc 1288a7d6542SBram Moolenaar 1298a7d6542SBram Moolenaarfunc Test_const() 1308a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 1318a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 1328a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 1338a7d6542SBram Moolenaarendfunc 1348a7d6542SBram Moolenaar 1358a7d6542SBram Moolenaardef Test_block() 1368a7d6542SBram Moolenaar let outer = 1 1378a7d6542SBram Moolenaar { 1388a7d6542SBram Moolenaar let inner = 2 1398a7d6542SBram Moolenaar assert_equal(1, outer) 1408a7d6542SBram Moolenaar assert_equal(2, inner) 1418a7d6542SBram Moolenaar } 1428a7d6542SBram Moolenaar assert_equal(1, outer) 1438a7d6542SBram Moolenaarenddef 1448a7d6542SBram Moolenaar 1458a7d6542SBram Moolenaarfunc Test_block_failure() 1468a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1478a7d6542SBram Moolenaarendfunc 1488a7d6542SBram Moolenaar 1498a7d6542SBram Moolenaardef ReturnString(): string 1508a7d6542SBram Moolenaar return 'string' 1518a7d6542SBram Moolenaarenddef 1528a7d6542SBram Moolenaar 1538a7d6542SBram Moolenaardef ReturnNumber(): number 1548a7d6542SBram Moolenaar return 123 1558a7d6542SBram Moolenaarenddef 1568a7d6542SBram Moolenaar 15709f28f49SBram Moolenaarlet g:notNumber = 'string' 15809f28f49SBram Moolenaar 15909f28f49SBram Moolenaardef ReturnGlobal(): number 16009f28f49SBram Moolenaar return g:notNumber 16109f28f49SBram Moolenaarenddef 16209f28f49SBram Moolenaar 1638a7d6542SBram Moolenaardef Test_return_string() 1648a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1658a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 16609f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1678a7d6542SBram Moolenaarenddef 1688a7d6542SBram Moolenaar 1698a7d6542SBram Moolenaarfunc Increment() 1708a7d6542SBram Moolenaar let g:counter += 1 1718a7d6542SBram Moolenaarendfunc 1728a7d6542SBram Moolenaar 1738a7d6542SBram Moolenaardef Test_call_ufunc_count() 1748a7d6542SBram Moolenaar g:counter = 1 1758a7d6542SBram Moolenaar Increment() 1768a7d6542SBram Moolenaar Increment() 1778a7d6542SBram Moolenaar Increment() 1788a7d6542SBram Moolenaar " works with and without :call 1798a7d6542SBram Moolenaar assert_equal(4, g:counter) 180b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1818a7d6542SBram Moolenaar unlet g:counter 1828a7d6542SBram Moolenaarenddef 1838a7d6542SBram Moolenaar 1848a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1858a7d6542SBram Moolenaar let res = arg 1868a7d6542SBram Moolenaar for s in rest 1878a7d6542SBram Moolenaar res ..= ',' .. s 1888a7d6542SBram Moolenaar endfor 1898a7d6542SBram Moolenaar return res 1908a7d6542SBram Moolenaarenddef 1918a7d6542SBram Moolenaar 1928a7d6542SBram Moolenaardef Test_call_varargs() 1938a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1948a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1958a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1968a7d6542SBram Moolenaarenddef 1978a7d6542SBram Moolenaar 198170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 199170fcfcfSBram Moolenaar return name 200170fcfcfSBram Moolenaarenddef 201170fcfcfSBram Moolenaar 202170fcfcfSBram Moolenaardef Test_call_default_args() 203170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 204170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 205170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 206170fcfcfSBram Moolenaarenddef 207170fcfcfSBram Moolenaar 208170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 209170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 210170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 211170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 212170fcfcfSBram Moolenaarendfunc 213170fcfcfSBram Moolenaar 214b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 215b35efa5eSBram Moolenaar echo a:arg 216b35efa5eSBram Moolenaarendfunc 217b35efa5eSBram Moolenaar 218b35efa5eSBram Moolenaardef Test_call_wrong_arg_count() 219b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 220b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 221b35efa5eSBram Moolenaarenddef 222b35efa5eSBram Moolenaar 223170fcfcfSBram Moolenaar" Default arg and varargs 224170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 225170fcfcfSBram Moolenaar let res = one .. ',' .. two 226170fcfcfSBram Moolenaar for s in rest 227170fcfcfSBram Moolenaar res ..= ',' .. s 228170fcfcfSBram Moolenaar endfor 229170fcfcfSBram Moolenaar return res 230170fcfcfSBram Moolenaarenddef 231170fcfcfSBram Moolenaar 232170fcfcfSBram Moolenaardef Test_call_def_varargs() 233170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 234170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 235170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 236170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 237170fcfcfSBram Moolenaarenddef 238170fcfcfSBram Moolenaar 23942a480bfSBram Moolenaardef Test_using_var_as_arg() 24042a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 24142a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 24242a480bfSBram Moolenaar call delete('Xdef') 24342a480bfSBram Moolenaarenddef 24442a480bfSBram Moolenaar 245b35efa5eSBram Moolenaardef Test_call_func_defined_later() 246b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 247b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 248b35efa5eSBram Moolenaarenddef 249170fcfcfSBram Moolenaar 250b35efa5eSBram Moolenaarfunc DefinedLater(arg) 25126e117e9SBram Moolenaar return a:arg 25226e117e9SBram Moolenaarendfunc 25326e117e9SBram Moolenaar 2547eeefd4aSBram Moolenaardef FuncWithForwardCall() 2557eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 2567eeefd4aSBram Moolenaarenddef 2577eeefd4aSBram Moolenaar 2587eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 2597eeefd4aSBram Moolenaar return arg 2607eeefd4aSBram Moolenaarenddef 2617eeefd4aSBram Moolenaar 2627eeefd4aSBram Moolenaardef Test_error_in_nested_function() 2637eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 2647eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 2657eeefd4aSBram Moolenaarenddef 2667eeefd4aSBram Moolenaar 2678a7d6542SBram Moolenaardef Test_return_type_wrong() 268978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 269978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 270978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 271978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 272*cf3f8bf4SBram Moolenaar 273*cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 274*cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 2758a7d6542SBram Moolenaarenddef 2768a7d6542SBram Moolenaar 277bfe12043SBram Moolenaardef Test_arg_type_wrong() 278bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 279bfe12043SBram Moolenaarenddef 280bfe12043SBram Moolenaar 2818a7d6542SBram Moolenaardef Test_try_catch() 2828a7d6542SBram Moolenaar let l = [] 2838a7d6542SBram Moolenaar try 2848a7d6542SBram Moolenaar add(l, '1') 2858a7d6542SBram Moolenaar throw 'wrong' 2868a7d6542SBram Moolenaar add(l, '2') 2878a7d6542SBram Moolenaar catch 2888a7d6542SBram Moolenaar add(l, v:exception) 2898a7d6542SBram Moolenaar finally 2908a7d6542SBram Moolenaar add(l, '3') 2918a7d6542SBram Moolenaar endtry 2928a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2938a7d6542SBram Moolenaarenddef 2948a7d6542SBram Moolenaar 295257cc5eeSBram Moolenaardef ThrowFromDef() 296257cc5eeSBram Moolenaar throw 'getout' 297257cc5eeSBram Moolenaarenddef 298257cc5eeSBram Moolenaar 299257cc5eeSBram Moolenaarfunc CatchInFunc() 300257cc5eeSBram Moolenaar try 301257cc5eeSBram Moolenaar call ThrowFromDef() 302257cc5eeSBram Moolenaar catch 303257cc5eeSBram Moolenaar let g:thrown_func = v:exception 304257cc5eeSBram Moolenaar endtry 305257cc5eeSBram Moolenaarendfunc 306257cc5eeSBram Moolenaar 307257cc5eeSBram Moolenaardef CatchInDef() 308257cc5eeSBram Moolenaar try 309257cc5eeSBram Moolenaar ThrowFromDef() 310257cc5eeSBram Moolenaar catch 311257cc5eeSBram Moolenaar g:thrown_def = v:exception 312257cc5eeSBram Moolenaar endtry 313257cc5eeSBram Moolenaarenddef 314257cc5eeSBram Moolenaar 315f575adffSBram Moolenaardef ReturnFinally(): string 316f575adffSBram Moolenaar try 317f575adffSBram Moolenaar return 'intry' 318f575adffSBram Moolenaar finally 319f575adffSBram Moolenaar g:in_finally = 'finally' 320f575adffSBram Moolenaar endtry 321f575adffSBram Moolenaar return 'end' 322f575adffSBram Moolenaarenddef 323f575adffSBram Moolenaar 324257cc5eeSBram Moolenaardef Test_try_catch_nested() 325257cc5eeSBram Moolenaar CatchInFunc() 326257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 327257cc5eeSBram Moolenaar 328257cc5eeSBram Moolenaar CatchInDef() 329257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 330f575adffSBram Moolenaar 331f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 332f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 333f575adffSBram Moolenaarenddef 334f575adffSBram Moolenaar 335f575adffSBram Moolenaardef Test_try_catch_match() 336f575adffSBram Moolenaar let seq = 'a' 337f575adffSBram Moolenaar try 338f575adffSBram Moolenaar throw 'something' 339f575adffSBram Moolenaar catch /nothing/ 340f575adffSBram Moolenaar seq ..= 'x' 341f575adffSBram Moolenaar catch /some/ 342f575adffSBram Moolenaar seq ..= 'b' 343f575adffSBram Moolenaar catch /asdf/ 344f575adffSBram Moolenaar seq ..= 'x' 345f575adffSBram Moolenaar finally 346f575adffSBram Moolenaar seq ..= 'c' 347f575adffSBram Moolenaar endtry 348f575adffSBram Moolenaar assert_equal('abc', seq) 349257cc5eeSBram Moolenaarenddef 350257cc5eeSBram Moolenaar 3518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3528a7d6542SBram Moolenaar vim9script 3538a7d6542SBram Moolenaar let name: string = 'bob' 3548a7d6542SBram Moolenaar def Concat(arg: string): string 3558a7d6542SBram Moolenaar return name .. arg 3568a7d6542SBram Moolenaar enddef 3578a7d6542SBram Moolenaar let g:result = Concat('bie') 3588a7d6542SBram Moolenaar let g:localname = name 3598a7d6542SBram Moolenaar 3608a7d6542SBram Moolenaar export const CONST = 1234 3618a7d6542SBram Moolenaar export let exported = 9876 3626e587dcbSBram Moolenaar export let exp_name = 'John' 3638a7d6542SBram Moolenaar export def Exported(): string 3648a7d6542SBram Moolenaar return 'Exported' 3658a7d6542SBram Moolenaar enddef 3668a7d6542SBram MoolenaarEND 3678a7d6542SBram Moolenaar 3685269bd2aSBram Moolenaardef Test_vim9_import_export() 3698a7d6542SBram Moolenaar let import_script_lines =<< trim END 3708a7d6542SBram Moolenaar vim9script 3718a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3728a7d6542SBram Moolenaar g:imported = exported 3736e587dcbSBram Moolenaar exported += 3 3746e587dcbSBram Moolenaar g:imported_added = exported 3758a7d6542SBram Moolenaar g:imported_func = Exported() 3766e587dcbSBram Moolenaar 3776e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3786e587dcbSBram Moolenaar g:imported_name = exp_name 3796e587dcbSBram Moolenaar exp_name ..= ' Doe' 3806e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3815381c7a1SBram Moolenaar g:imported_later = exported 3828a7d6542SBram Moolenaar END 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3858a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3868a7d6542SBram Moolenaar 3878a7d6542SBram Moolenaar source Ximport.vim 3888a7d6542SBram Moolenaar 3898a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3908a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3918a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3926e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 3935381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 3948a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 3956e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 3966e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 3978a7d6542SBram Moolenaar assert_false(exists('g:name')) 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaar unlet g:result 4008a7d6542SBram Moolenaar unlet g:localname 4018a7d6542SBram Moolenaar unlet g:imported 4026e587dcbSBram Moolenaar unlet g:imported_added 4035381c7a1SBram Moolenaar unlet g:imported_later 4048a7d6542SBram Moolenaar unlet g:imported_func 4056e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4068a7d6542SBram Moolenaar delete('Ximport.vim') 407f2d5c240SBram Moolenaar 4085381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4095381c7a1SBram Moolenaar vim9script 4105381c7a1SBram Moolenaar def ImportInDef() 4115381c7a1SBram Moolenaar import exported from './Xexport.vim' 4125381c7a1SBram Moolenaar g:imported = exported 4135381c7a1SBram Moolenaar exported += 7 4145381c7a1SBram Moolenaar g:imported_added = exported 4155381c7a1SBram Moolenaar enddef 4165381c7a1SBram Moolenaar ImportInDef() 4175381c7a1SBram Moolenaar END 4185381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4195381c7a1SBram Moolenaar source Ximport2.vim 4205381c7a1SBram Moolenaar " TODO: this should be 9879 4215381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4225381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4235381c7a1SBram Moolenaar unlet g:imported 4245381c7a1SBram Moolenaar unlet g:imported_added 4255381c7a1SBram Moolenaar delete('Ximport2.vim') 4265381c7a1SBram Moolenaar 427f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 428f2d5c240SBram Moolenaar vim9script 429f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 430f2d5c240SBram Moolenaar def UseExport() 431f2d5c240SBram Moolenaar g:imported = Export.exported 432f2d5c240SBram Moolenaar enddef 433f2d5c240SBram Moolenaar UseExport() 434f2d5c240SBram Moolenaar END 435f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 436f2d5c240SBram Moolenaar source Ximport.vim 4375381c7a1SBram Moolenaar assert_equal(9883, g:imported) 438f2d5c240SBram Moolenaar 439f2d5c240SBram Moolenaar let import_star_lines =<< trim END 440f2d5c240SBram Moolenaar vim9script 441f2d5c240SBram Moolenaar import * from './Xexport.vim' 442f2d5c240SBram Moolenaar g:imported = exported 443f2d5c240SBram Moolenaar END 444f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 445f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 446f2d5c240SBram Moolenaar 447fa29c8abSBram Moolenaar " try to import something that exists but is not exported 448fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 449fa29c8abSBram Moolenaar vim9script 450fa29c8abSBram Moolenaar import name from './Xexport.vim' 451fa29c8abSBram Moolenaar END 452fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 453fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 454fa29c8abSBram Moolenaar 4555269bd2aSBram Moolenaar " try to import something that is already defined 4565269bd2aSBram Moolenaar let import_already_defined =<< trim END 4575269bd2aSBram Moolenaar vim9script 4585269bd2aSBram Moolenaar let exported = 'something' 4595269bd2aSBram Moolenaar import exported from './Xexport.vim' 4605269bd2aSBram Moolenaar END 4615269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 4625269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 4635269bd2aSBram Moolenaar 4645269bd2aSBram Moolenaar " try to import something that is already defined 4655269bd2aSBram Moolenaar import_already_defined =<< trim END 4665269bd2aSBram Moolenaar vim9script 4675269bd2aSBram Moolenaar let exported = 'something' 4685269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 4695269bd2aSBram Moolenaar END 4705269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 4715269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 4725269bd2aSBram Moolenaar 4735269bd2aSBram Moolenaar " try to import something that is already defined 4745269bd2aSBram Moolenaar import_already_defined =<< trim END 4755269bd2aSBram Moolenaar vim9script 4765269bd2aSBram Moolenaar let exported = 'something' 4775269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 4785269bd2aSBram Moolenaar END 4795269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 4805269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 4815269bd2aSBram Moolenaar 482fa29c8abSBram Moolenaar " import a very long name, requires making a copy 483fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 484fa29c8abSBram Moolenaar vim9script 485fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 486fa29c8abSBram Moolenaar END 487fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 488fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 489fa29c8abSBram Moolenaar 490fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 491fa29c8abSBram Moolenaar vim9script 492fa29c8abSBram Moolenaar import name './Xexport.vim' 493fa29c8abSBram Moolenaar END 494fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 495fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 496fa29c8abSBram Moolenaar 497fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 498fa29c8abSBram Moolenaar vim9script 499fa29c8abSBram Moolenaar import name from Xexport.vim 500fa29c8abSBram Moolenaar END 501fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 502fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 503fa29c8abSBram Moolenaar 504fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 505fa29c8abSBram Moolenaar vim9script 506fa29c8abSBram Moolenaar import name from './XnoExport.vim' 507fa29c8abSBram Moolenaar END 508fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 509fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 510fa29c8abSBram Moolenaar 511fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 512fa29c8abSBram Moolenaar vim9script 513fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 514fa29c8abSBram Moolenaar END 5155269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5165269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 517fa29c8abSBram Moolenaar 518f2d5c240SBram Moolenaar delete('Ximport.vim') 5195269bd2aSBram Moolenaar delete('Ximport3.vim') 5208a7d6542SBram Moolenaar delete('Xexport.vim') 5218a7d6542SBram Moolenaar 522750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 523750802b5SBram Moolenaar set cpo&vi 524750802b5SBram Moolenaar let cpo_before = &cpo 525750802b5SBram Moolenaar let lines =<< trim END 526750802b5SBram Moolenaar vim9script 527750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 528750802b5SBram Moolenaar END 529750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 530750802b5SBram Moolenaar source Xvim9_script 531750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 532750802b5SBram Moolenaar set cpo&vim 533750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 534750802b5SBram Moolenaar delete('Xvim9_script') 535750802b5SBram Moolenaarenddef 536750802b5SBram Moolenaar 537750802b5SBram Moolenaardef Test_vim9script_fails() 5388a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 5398a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 540750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 541f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 542750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 543750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 544750802b5SBram Moolenaar 545750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 546750802b5SBram Moolenaar assert_fails('export something', 'E1042') 5478a7d6542SBram Moolenaarenddef 5488a7d6542SBram Moolenaar 5498a7d6542SBram Moolenaardef Test_vim9script_call() 5508a7d6542SBram Moolenaar let lines =<< trim END 5518a7d6542SBram Moolenaar vim9script 5528a7d6542SBram Moolenaar let var = '' 5538a7d6542SBram Moolenaar def MyFunc(arg: string) 5548a7d6542SBram Moolenaar var = arg 5558a7d6542SBram Moolenaar enddef 5568a7d6542SBram Moolenaar MyFunc('foobar') 5578a7d6542SBram Moolenaar assert_equal('foobar', var) 5588a7d6542SBram Moolenaar 5598a7d6542SBram Moolenaar let str = 'barfoo' 5608a7d6542SBram Moolenaar str->MyFunc() 5618a7d6542SBram Moolenaar assert_equal('barfoo', var) 5628a7d6542SBram Moolenaar 5638a7d6542SBram Moolenaar let g:value = 'value' 5648a7d6542SBram Moolenaar g:value->MyFunc() 5658a7d6542SBram Moolenaar assert_equal('value', var) 5668a7d6542SBram Moolenaar 5678a7d6542SBram Moolenaar let listvar = [] 5688a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 5698a7d6542SBram Moolenaar listvar = arg 5708a7d6542SBram Moolenaar enddef 5718a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 5728a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 5738a7d6542SBram Moolenaar 5748a7d6542SBram Moolenaar let dictvar = {} 5758a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 5768a7d6542SBram Moolenaar dictvar = arg 5778a7d6542SBram Moolenaar enddef 5788a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 5798a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 5808a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 5818a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 5820c6ceaf9SBram Moolenaar 5830c6ceaf9SBram Moolenaar ('text')->MyFunc() 5840c6ceaf9SBram Moolenaar assert_equal('text', var) 5850c6ceaf9SBram Moolenaar ("some")->MyFunc() 5860c6ceaf9SBram Moolenaar assert_equal('some', var) 5878a7d6542SBram Moolenaar END 5888a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 5898a7d6542SBram Moolenaar source Xcall.vim 5908a7d6542SBram Moolenaar delete('Xcall.vim') 5918a7d6542SBram Moolenaarenddef 5928a7d6542SBram Moolenaar 5938a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 5948a7d6542SBram Moolenaar let lines =<< trim END 5958a7d6542SBram Moolenaar vim9script 5968a7d6542SBram Moolenaar let var = '' 5978a7d6542SBram Moolenaar def MyFunc(arg: string) 5988a7d6542SBram Moolenaar let var = 123 5998a7d6542SBram Moolenaar enddef 6008a7d6542SBram Moolenaar END 6018a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 6028a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 6038a7d6542SBram Moolenaar delete('Xcall_decl.vim') 6048a7d6542SBram Moolenaarenddef 6058a7d6542SBram Moolenaar 6068a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 6078a7d6542SBram Moolenaar let lines =<< trim END 6088a7d6542SBram Moolenaar vim9script 6098a7d6542SBram Moolenaar const var = '' 6108a7d6542SBram Moolenaar def MyFunc(arg: string) 6118a7d6542SBram Moolenaar var = 'asdf' 6128a7d6542SBram Moolenaar enddef 6138a7d6542SBram Moolenaar END 6148a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 6158a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 6168a7d6542SBram Moolenaar delete('Xcall_const.vim') 6178a7d6542SBram Moolenaarenddef 6188a7d6542SBram Moolenaar 6198a7d6542SBram Moolenaardef Test_vim9script_reload() 6208a7d6542SBram Moolenaar let lines =<< trim END 6218a7d6542SBram Moolenaar vim9script 6228a7d6542SBram Moolenaar const var = '' 6238a7d6542SBram Moolenaar let valone = 1234 6248a7d6542SBram Moolenaar def MyFunc(arg: string) 6258a7d6542SBram Moolenaar valone = 5678 6268a7d6542SBram Moolenaar enddef 6278a7d6542SBram Moolenaar END 6288a7d6542SBram Moolenaar let morelines =<< trim END 6298a7d6542SBram Moolenaar let valtwo = 222 6308a7d6542SBram Moolenaar export def GetValtwo(): number 6318a7d6542SBram Moolenaar return valtwo 6328a7d6542SBram Moolenaar enddef 6338a7d6542SBram Moolenaar END 6348a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 6358a7d6542SBram Moolenaar source Xreload.vim 6368a7d6542SBram Moolenaar source Xreload.vim 6378a7d6542SBram Moolenaar source Xreload.vim 6388a7d6542SBram Moolenaar 6398a7d6542SBram Moolenaar let testlines =<< trim END 6408a7d6542SBram Moolenaar vim9script 6418a7d6542SBram Moolenaar def TheFunc() 6428a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 6438a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 6448a7d6542SBram Moolenaar enddef 6458a7d6542SBram Moolenaar TheFunc() 6468a7d6542SBram Moolenaar END 6478a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 6488a7d6542SBram Moolenaar source Ximport.vim 6498a7d6542SBram Moolenaar 6508a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 6518a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 6528a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6538a7d6542SBram Moolenaar source Xreload.vim 6548a7d6542SBram Moolenaar source Ximport.vim 6558a7d6542SBram Moolenaar 6568a7d6542SBram Moolenaar " cannot declare a var twice 6578a7d6542SBram Moolenaar lines =<< trim END 6588a7d6542SBram Moolenaar vim9script 6598a7d6542SBram Moolenaar let valone = 1234 6608a7d6542SBram Moolenaar let valone = 5678 6618a7d6542SBram Moolenaar END 6628a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6638a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 6648a7d6542SBram Moolenaar 6658a7d6542SBram Moolenaar delete('Xreload.vim') 6668a7d6542SBram Moolenaar delete('Ximport.vim') 6678a7d6542SBram Moolenaarenddef 6688a7d6542SBram Moolenaar 6698a7d6542SBram Moolenaardef Test_import_absolute() 6708a7d6542SBram Moolenaar let import_lines = [ 6718a7d6542SBram Moolenaar \ 'vim9script', 6728a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 673b283a8a6SBram Moolenaar \ 'def UseExported()', 6748a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 6754e12a5dfSBram Moolenaar \ ' exported = 8888', 6764e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 677b283a8a6SBram Moolenaar \ 'enddef', 678b283a8a6SBram Moolenaar \ 'UseExported()', 6794e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 6808a7d6542SBram Moolenaar \ ] 6818a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 6828a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 6838a7d6542SBram Moolenaar 6848a7d6542SBram Moolenaar source Ximport_abs.vim 6858a7d6542SBram Moolenaar 6868a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 6874e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 688b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 689b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 690b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 6914e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 6924e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 6934e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 6944e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 6954e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 6964e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 6974e12a5dfSBram Moolenaar \, g:import_disassembled) 6988a7d6542SBram Moolenaar unlet g:imported_abs 6994e12a5dfSBram Moolenaar unlet g:import_disassembled 7008a7d6542SBram Moolenaar 7018a7d6542SBram Moolenaar delete('Ximport_abs.vim') 7028a7d6542SBram Moolenaar delete('Xexport_abs.vim') 7038a7d6542SBram Moolenaarenddef 7048a7d6542SBram Moolenaar 7058a7d6542SBram Moolenaardef Test_import_rtp() 7068a7d6542SBram Moolenaar let import_lines = [ 7078a7d6542SBram Moolenaar \ 'vim9script', 7088a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 7098a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 7108a7d6542SBram Moolenaar \ ] 7118a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 7128a7d6542SBram Moolenaar mkdir('import') 7138a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 7148a7d6542SBram Moolenaar 7158a7d6542SBram Moolenaar let save_rtp = &rtp 7168a7d6542SBram Moolenaar &rtp = getcwd() 7178a7d6542SBram Moolenaar source Ximport_rtp.vim 7188a7d6542SBram Moolenaar &rtp = save_rtp 7198a7d6542SBram Moolenaar 7208a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 7218a7d6542SBram Moolenaar unlet g:imported_rtp 7228a7d6542SBram Moolenaar 7238a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 7248a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 7258a7d6542SBram Moolenaar delete('import', 'd') 7268a7d6542SBram Moolenaarenddef 7278a7d6542SBram Moolenaar 7288a7d6542SBram Moolenaardef Test_fixed_size_list() 7298a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 7308a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 7318a7d6542SBram Moolenaar l->remove(0) 7328a7d6542SBram Moolenaar l->add(5) 7338a7d6542SBram Moolenaar l->insert(99, 1) 7340f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 7358a7d6542SBram Moolenaarenddef 7368a7d6542SBram Moolenaar 737673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 738673660abSBram Moolenaar" recognized. 739673660abSBram Moolenaarfunc Test_function_python() 740673660abSBram Moolenaar CheckFeature python3 741673660abSBram Moolenaar let py = 'python3' 742673660abSBram Moolenaar execute py "<< EOF" 743673660abSBram Moolenaardef do_something(): 744673660abSBram Moolenaar return 1 745673660abSBram MoolenaarEOF 746673660abSBram Moolenaarendfunc 747673660abSBram Moolenaar 748158906cfSBram Moolenaardef IfElse(what: number): string 749158906cfSBram Moolenaar let res = '' 750158906cfSBram Moolenaar if what == 1 751158906cfSBram Moolenaar res = "one" 752158906cfSBram Moolenaar elseif what == 2 753158906cfSBram Moolenaar res = "two" 754a259d8d3SBram Moolenaar else 755158906cfSBram Moolenaar res = "three" 756a259d8d3SBram Moolenaar endif 757158906cfSBram Moolenaar return res 758a259d8d3SBram Moolenaarenddef 759a259d8d3SBram Moolenaar 760158906cfSBram Moolenaardef Test_if_elseif_else() 761158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 762158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 763158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 7640f18b6d1SBram Moolenaarenddef 7650f18b6d1SBram Moolenaar 7666d69bf60SBram Moolenaarlet g:bool_true = v:true 7676d69bf60SBram Moolenaarlet g:bool_false = v:false 7686d69bf60SBram Moolenaar 7696d69bf60SBram Moolenaardef Test_if_const_expr() 7706d69bf60SBram Moolenaar let res = false 7716d69bf60SBram Moolenaar if true ? true : false 7726d69bf60SBram Moolenaar res = true 7736d69bf60SBram Moolenaar endif 7746d69bf60SBram Moolenaar assert_equal(true, res) 7756d69bf60SBram Moolenaar 7766d69bf60SBram Moolenaar res = false 7776d69bf60SBram Moolenaar if g:bool_true ? true : false 7786d69bf60SBram Moolenaar res = true 7796d69bf60SBram Moolenaar endif 7806d69bf60SBram Moolenaar assert_equal(true, res) 7816d69bf60SBram Moolenaar 7826d69bf60SBram Moolenaar res = false 7836d69bf60SBram Moolenaar if true ? g:bool_true : false 7846d69bf60SBram Moolenaar res = true 7856d69bf60SBram Moolenaar endif 7866d69bf60SBram Moolenaar assert_equal(true, res) 7876d69bf60SBram Moolenaar 7886d69bf60SBram Moolenaar res = false 7896d69bf60SBram Moolenaar if true ? true : g:bool_false 7906d69bf60SBram Moolenaar res = true 7916d69bf60SBram Moolenaar endif 7926d69bf60SBram Moolenaar assert_equal(true, res) 7936d69bf60SBram Moolenaar 7946d69bf60SBram Moolenaar res = false 7956d69bf60SBram Moolenaar if true ? false : true 7966d69bf60SBram Moolenaar res = true 7976d69bf60SBram Moolenaar endif 7986d69bf60SBram Moolenaar assert_equal(false, res) 7996d69bf60SBram Moolenaar 8006d69bf60SBram Moolenaar res = false 8016d69bf60SBram Moolenaar if false ? false : true 8026d69bf60SBram Moolenaar res = true 8036d69bf60SBram Moolenaar endif 8046d69bf60SBram Moolenaar assert_equal(true, res) 8056d69bf60SBram Moolenaar 8066d69bf60SBram Moolenaar res = false 8076d69bf60SBram Moolenaar if false ? true : false 8086d69bf60SBram Moolenaar res = true 8096d69bf60SBram Moolenaar endif 8106d69bf60SBram Moolenaar assert_equal(false, res) 8116d69bf60SBram Moolenaar 8126d69bf60SBram Moolenaar res = false 8136d69bf60SBram Moolenaar if true && true 8146d69bf60SBram Moolenaar res = true 8156d69bf60SBram Moolenaar endif 8166d69bf60SBram Moolenaar assert_equal(true, res) 8176d69bf60SBram Moolenaar 8186d69bf60SBram Moolenaar res = false 8196d69bf60SBram Moolenaar if true && false 8206d69bf60SBram Moolenaar res = true 8216d69bf60SBram Moolenaar endif 8226d69bf60SBram Moolenaar assert_equal(false, res) 8236d69bf60SBram Moolenaar 8246d69bf60SBram Moolenaar res = false 8256d69bf60SBram Moolenaar if g:bool_true && false 8266d69bf60SBram Moolenaar res = true 8276d69bf60SBram Moolenaar endif 8286d69bf60SBram Moolenaar assert_equal(false, res) 8296d69bf60SBram Moolenaar 8306d69bf60SBram Moolenaar res = false 8316d69bf60SBram Moolenaar if true && g:bool_false 8326d69bf60SBram Moolenaar res = true 8336d69bf60SBram Moolenaar endif 8346d69bf60SBram Moolenaar assert_equal(false, res) 8356d69bf60SBram Moolenaar 8366d69bf60SBram Moolenaar res = false 8376d69bf60SBram Moolenaar if false && false 8386d69bf60SBram Moolenaar res = true 8396d69bf60SBram Moolenaar endif 8406d69bf60SBram Moolenaar assert_equal(false, res) 8416d69bf60SBram Moolenaar 8426d69bf60SBram Moolenaar res = false 8436d69bf60SBram Moolenaar if true || false 8446d69bf60SBram Moolenaar res = true 8456d69bf60SBram Moolenaar endif 8466d69bf60SBram Moolenaar assert_equal(true, res) 8476d69bf60SBram Moolenaar 8486d69bf60SBram Moolenaar res = false 8496d69bf60SBram Moolenaar if g:bool_true || false 8506d69bf60SBram Moolenaar res = true 8516d69bf60SBram Moolenaar endif 8526d69bf60SBram Moolenaar assert_equal(true, res) 8536d69bf60SBram Moolenaar 8546d69bf60SBram Moolenaar res = false 8556d69bf60SBram Moolenaar if true || g:bool_false 8566d69bf60SBram Moolenaar res = true 8576d69bf60SBram Moolenaar endif 8586d69bf60SBram Moolenaar assert_equal(true, res) 8596d69bf60SBram Moolenaar 8606d69bf60SBram Moolenaar res = false 8616d69bf60SBram Moolenaar if false || false 8626d69bf60SBram Moolenaar res = true 8636d69bf60SBram Moolenaar endif 8646d69bf60SBram Moolenaar assert_equal(false, res) 8656d69bf60SBram Moolenaar 8666d69bf60SBram Moolenaarenddef 8676d69bf60SBram Moolenaar 86863ce4849SBram Moolenaardef Test_delfunc() 86963ce4849SBram Moolenaar let lines =<< trim END 87063ce4849SBram Moolenaar vim9script 87163ce4849SBram Moolenaar def GoneSoon() 87263ce4849SBram Moolenaar echo 'hello' 87363ce4849SBram Moolenaar enddef 87463ce4849SBram Moolenaar 87563ce4849SBram Moolenaar def CallGoneSoon() 87663ce4849SBram Moolenaar GoneSoon() 87763ce4849SBram Moolenaar enddef 87863ce4849SBram Moolenaar 87963ce4849SBram Moolenaar delfunc GoneSoon 88063ce4849SBram Moolenaar CallGoneSoon() 88163ce4849SBram Moolenaar END 88263ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 88363ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 88463ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 88563ce4849SBram Moolenaar 88663ce4849SBram Moolenaar delete('XToDelFunc') 88763ce4849SBram Moolenaarenddef 88863ce4849SBram Moolenaar 889ad39c094SBram Moolenaardef Test_execute_cmd() 890ad39c094SBram Moolenaar new 891ad39c094SBram Moolenaar setline(1, 'default') 892ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 893ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 894ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 895ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 896ad39c094SBram Moolenaar execute cmd1 cmd2 897ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 898ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 899ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 900ad39c094SBram Moolenaar let cmd_first = 'call ' 901ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 902ad39c094SBram Moolenaar execute cmd_first .. cmd_last 903ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 904ad39c094SBram Moolenaar bwipe! 905ad39c094SBram Moolenaarenddef 906ad39c094SBram Moolenaar 907ad39c094SBram Moolenaardef Test_echo_cmd() 908ad39c094SBram Moolenaar echo 'something' 909ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 910ad39c094SBram Moolenaar 911ad39c094SBram Moolenaar let str1 = 'some' 912ad39c094SBram Moolenaar let str2 = 'more' 913ad39c094SBram Moolenaar echo str1 str2 914ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 915ad39c094SBram Moolenaarenddef 916ad39c094SBram Moolenaar 91741fe0617SBram Moolenaardef Test_for_outside_of_function() 91841fe0617SBram Moolenaar let lines =<< trim END 91941fe0617SBram Moolenaar vim9script 92041fe0617SBram Moolenaar new 92141fe0617SBram Moolenaar for var in range(0, 3) 92241fe0617SBram Moolenaar append(line('$'), var) 92341fe0617SBram Moolenaar endfor 92441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 92541fe0617SBram Moolenaar bwipe! 92641fe0617SBram Moolenaar END 92741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 92841fe0617SBram Moolenaar source Xvim9for.vim 92941fe0617SBram Moolenaar delete('Xvim9for.vim') 93041fe0617SBram Moolenaarenddef 9318a7d6542SBram Moolenaar 932d0df1aacSBram Moolenaardef Test_while_loop() 933d0df1aacSBram Moolenaar let result = '' 934d0df1aacSBram Moolenaar let cnt = 0 935d0df1aacSBram Moolenaar while cnt < 555 936d0df1aacSBram Moolenaar if cnt == 3 937d0df1aacSBram Moolenaar break 938d0df1aacSBram Moolenaar endif 939d0df1aacSBram Moolenaar cnt += 1 940d0df1aacSBram Moolenaar if cnt == 2 941d0df1aacSBram Moolenaar continue 942d0df1aacSBram Moolenaar endif 943d0df1aacSBram Moolenaar result ..= cnt .. '_' 944d0df1aacSBram Moolenaar endwhile 945d0df1aacSBram Moolenaar assert_equal('1_3_', result) 946d0df1aacSBram Moolenaarenddef 947d0df1aacSBram Moolenaar 9489645e2d9SBram Moolenaardef Test_interrupt_loop() 94997acfc78SBram Moolenaar let caught = false 9509645e2d9SBram Moolenaar let x = 0 95197acfc78SBram Moolenaar try 9529645e2d9SBram Moolenaar while 1 9539645e2d9SBram Moolenaar x += 1 9549645e2d9SBram Moolenaar if x == 100 9559645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 9569645e2d9SBram Moolenaar endif 9579645e2d9SBram Moolenaar endwhile 95897acfc78SBram Moolenaar catch 95997acfc78SBram Moolenaar caught = true 96097acfc78SBram Moolenaar assert_equal(100, x) 96197acfc78SBram Moolenaar endtry 96297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 9639645e2d9SBram Moolenaarenddef 96420431c9dSBram Moolenaar 965d0df1aacSBram Moolenaardef Test_substitute_cmd() 966d0df1aacSBram Moolenaar new 967d0df1aacSBram Moolenaar setline(1, 'something') 968d0df1aacSBram Moolenaar :substitute(some(other( 969d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 970d0df1aacSBram Moolenaar bwipe! 971d0df1aacSBram Moolenaar 972d0df1aacSBram Moolenaar " also when the context is Vim9 script 973d0df1aacSBram Moolenaar let lines =<< trim END 974d0df1aacSBram Moolenaar vim9script 975d0df1aacSBram Moolenaar new 976d0df1aacSBram Moolenaar setline(1, 'something') 977d0df1aacSBram Moolenaar :substitute(some(other( 978d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 979d0df1aacSBram Moolenaar bwipe! 980d0df1aacSBram Moolenaar END 981d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 982d0df1aacSBram Moolenaar source Xvim9lines 983d0df1aacSBram Moolenaar 984d0df1aacSBram Moolenaar delete('Xvim9lines') 985d0df1aacSBram Moolenaarenddef 986d0df1aacSBram Moolenaar 98720431c9dSBram Moolenaardef Test_redef_failure() 98820431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 98920431c9dSBram Moolenaar so Xdef 99020431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 99120431c9dSBram Moolenaar so Xdef 99220431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 99320431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 99420431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 99520431c9dSBram Moolenaar so Xdef 99620431c9dSBram Moolenaar call delete('Xdef') 99720431c9dSBram Moolenaar 99820431c9dSBram Moolenaar call assert_equal(0, Func0()) 99920431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 100020431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 100120431c9dSBram Moolenaar 100220431c9dSBram Moolenaar delfunc! Func0 100320431c9dSBram Moolenaar delfunc! Func1 100420431c9dSBram Moolenaar delfunc! Func2 100520431c9dSBram Moolenaarenddef 100620431c9dSBram Moolenaar 10078a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1008