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 569be61bbbSBram Moolenaar let a: number = 6 579be61bbbSBram Moolenaar assert_equal(6, a) 589be61bbbSBram Moolenaar 5942a480bfSBram Moolenaar if has('channel') 6042a480bfSBram Moolenaar let chan1: channel 61fbdd08edSBram Moolenaar let job1: job 62f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6342a480bfSBram Moolenaar endif 64fbdd08edSBram Moolenaar if has('float') 65fbdd08edSBram Moolenaar let float1: float = 3.4 66fbdd08edSBram Moolenaar endif 67087d2e15SBram Moolenaar let funky1: func 68087d2e15SBram Moolenaar let funky2: func = function('len') 69087d2e15SBram Moolenaar let party1: partial 70087d2e15SBram Moolenaar let party2: partial = funcref('Test_syntax') 7142a480bfSBram Moolenaar 7261a6d4e4SBram Moolenaar " type becomes list<any> 7361a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 745381c7a1SBram Moolenaar " type becomes dict<any> 755381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7661a6d4e4SBram Moolenaar 77401d9ffbSBram Moolenaar g:newvar = 'new' 78401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 79401d9ffbSBram Moolenaar 80401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 81401d9ffbSBram Moolenaar g:existing = 'no' 82401d9ffbSBram Moolenaar assert_equal('no', g:existing) 83401d9ffbSBram Moolenaar 84b283a8a6SBram Moolenaar v:char = 'abc' 856e587dcbSBram Moolenaar assert_equal('abc', v:char) 86b283a8a6SBram Moolenaar 87b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 886e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 89b283a8a6SBram Moolenaar $ENVVAR = '' 906e587dcbSBram Moolenaar 91fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 92fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 93fd1823e0SBram Moolenaar s:addToMe += 222 94fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 950bbf722aSBram Moolenaar s:newVar = 'new' 960bbf722aSBram Moolenaar assert_equal('new', s:newVar) 978a7d6542SBram Moolenaarenddef 988a7d6542SBram Moolenaar 998a7d6542SBram Moolenaarfunc Test_assignment_failure() 1008a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1018a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1028a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1038a7d6542SBram Moolenaar 1048a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1058a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1068a7d6542SBram Moolenaar 1079be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1089be61bbbSBram Moolenaar 1099be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1109be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1119be61bbbSBram Moolenaar 1129be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1139be61bbbSBram Moolenaar 1149be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1159be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1169be61bbbSBram Moolenaar 1179be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1189be61bbbSBram Moolenaar 1199be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1209be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 1219be61bbbSBram Moolenaar 12233fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 12333fa29cfSBram Moolenaar 1248a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 1258a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1268a7d6542SBram Moolenaar 1278a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 1288a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 1298a7d6542SBram Moolenaar 1308a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 1318a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 13242a480bfSBram Moolenaar 13342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 13442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 135599c89c8SBram Moolenaarendfunc 136599c89c8SBram Moolenaar 137599c89c8SBram Moolenaarfunc Test_wrong_type() 138599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 139599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 140599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 141599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 142599c89c8SBram Moolenaar 143599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 144599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 14542a480bfSBram Moolenaar 14642a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 14742a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 14842a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 14942a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 15042a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 15142a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 15242a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 15342a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 15442a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 15542a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 15642a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 1578a7d6542SBram Moolenaarendfunc 1588a7d6542SBram Moolenaar 1598a7d6542SBram Moolenaarfunc Test_const() 1608a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 1618a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 1628a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 1639be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 1648a7d6542SBram Moolenaarendfunc 1658a7d6542SBram Moolenaar 1668a7d6542SBram Moolenaardef Test_block() 1678a7d6542SBram Moolenaar let outer = 1 1688a7d6542SBram Moolenaar { 1698a7d6542SBram Moolenaar let inner = 2 1708a7d6542SBram Moolenaar assert_equal(1, outer) 1718a7d6542SBram Moolenaar assert_equal(2, inner) 1728a7d6542SBram Moolenaar } 1738a7d6542SBram Moolenaar assert_equal(1, outer) 1748a7d6542SBram Moolenaarenddef 1758a7d6542SBram Moolenaar 1768a7d6542SBram Moolenaarfunc Test_block_failure() 1778a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1788a7d6542SBram Moolenaarendfunc 1798a7d6542SBram Moolenaar 1808a7d6542SBram Moolenaardef ReturnString(): string 1818a7d6542SBram Moolenaar return 'string' 1828a7d6542SBram Moolenaarenddef 1838a7d6542SBram Moolenaar 1848a7d6542SBram Moolenaardef ReturnNumber(): number 1858a7d6542SBram Moolenaar return 123 1868a7d6542SBram Moolenaarenddef 1878a7d6542SBram Moolenaar 18809f28f49SBram Moolenaarlet g:notNumber = 'string' 18909f28f49SBram Moolenaar 19009f28f49SBram Moolenaardef ReturnGlobal(): number 19109f28f49SBram Moolenaar return g:notNumber 19209f28f49SBram Moolenaarenddef 19309f28f49SBram Moolenaar 1949be61bbbSBram Moolenaardef Test_return_something() 1958a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1968a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 19709f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1988a7d6542SBram Moolenaarenddef 1998a7d6542SBram Moolenaar 2009be61bbbSBram Moolenaarlet s:nothing = 0 2019be61bbbSBram Moolenaardef ReturnNothing() 2029be61bbbSBram Moolenaar s:nothing = 1 2039be61bbbSBram Moolenaar if true 2049be61bbbSBram Moolenaar return 2059be61bbbSBram Moolenaar endif 2069be61bbbSBram Moolenaar s:nothing = 2 2079be61bbbSBram Moolenaarenddef 2089be61bbbSBram Moolenaar 2099be61bbbSBram Moolenaardef Test_return_nothing() 2109be61bbbSBram Moolenaar ReturnNothing() 2119be61bbbSBram Moolenaar assert_equal(1, s:nothing) 2129be61bbbSBram Moolenaarenddef 2139be61bbbSBram Moolenaar 2148a7d6542SBram Moolenaarfunc Increment() 2158a7d6542SBram Moolenaar let g:counter += 1 2168a7d6542SBram Moolenaarendfunc 2178a7d6542SBram Moolenaar 2188a7d6542SBram Moolenaardef Test_call_ufunc_count() 2198a7d6542SBram Moolenaar g:counter = 1 2208a7d6542SBram Moolenaar Increment() 2218a7d6542SBram Moolenaar Increment() 2228a7d6542SBram Moolenaar Increment() 2238a7d6542SBram Moolenaar " works with and without :call 2248a7d6542SBram Moolenaar assert_equal(4, g:counter) 225b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 2268a7d6542SBram Moolenaar unlet g:counter 2278a7d6542SBram Moolenaarenddef 2288a7d6542SBram Moolenaar 2298a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 2308a7d6542SBram Moolenaar let res = arg 2318a7d6542SBram Moolenaar for s in rest 2328a7d6542SBram Moolenaar res ..= ',' .. s 2338a7d6542SBram Moolenaar endfor 2348a7d6542SBram Moolenaar return res 2358a7d6542SBram Moolenaarenddef 2368a7d6542SBram Moolenaar 2378a7d6542SBram Moolenaardef Test_call_varargs() 2388a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 2398a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 2408a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 2418a7d6542SBram Moolenaarenddef 2428a7d6542SBram Moolenaar 243170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 244170fcfcfSBram Moolenaar return name 245170fcfcfSBram Moolenaarenddef 246170fcfcfSBram Moolenaar 247170fcfcfSBram Moolenaardef Test_call_default_args() 248170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 249170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 250170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 251170fcfcfSBram Moolenaarenddef 252170fcfcfSBram Moolenaar 253170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 254170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 255170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 256170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 257170fcfcfSBram Moolenaarendfunc 258170fcfcfSBram Moolenaar 259b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 260b35efa5eSBram Moolenaar echo a:arg 261b35efa5eSBram Moolenaarendfunc 262b35efa5eSBram Moolenaar 263*bd5da371SBram Moolenaardef Test_call_wrong_args() 264b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 265b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 266*bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 267b35efa5eSBram Moolenaarenddef 268b35efa5eSBram Moolenaar 269170fcfcfSBram Moolenaar" Default arg and varargs 270170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 271170fcfcfSBram Moolenaar let res = one .. ',' .. two 272170fcfcfSBram Moolenaar for s in rest 273170fcfcfSBram Moolenaar res ..= ',' .. s 274170fcfcfSBram Moolenaar endfor 275170fcfcfSBram Moolenaar return res 276170fcfcfSBram Moolenaarenddef 277170fcfcfSBram Moolenaar 278170fcfcfSBram Moolenaardef Test_call_def_varargs() 279170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 280170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 281170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 282170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 283170fcfcfSBram Moolenaarenddef 284170fcfcfSBram Moolenaar 28542a480bfSBram Moolenaardef Test_using_var_as_arg() 28642a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 28742a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 28842a480bfSBram Moolenaar call delete('Xdef') 28942a480bfSBram Moolenaarenddef 29042a480bfSBram Moolenaar 291b35efa5eSBram Moolenaardef Test_call_func_defined_later() 292b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 293b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 294b35efa5eSBram Moolenaarenddef 295170fcfcfSBram Moolenaar 296b35efa5eSBram Moolenaarfunc DefinedLater(arg) 29726e117e9SBram Moolenaar return a:arg 29826e117e9SBram Moolenaarendfunc 29926e117e9SBram Moolenaar 3007eeefd4aSBram Moolenaardef FuncWithForwardCall() 3017eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3027eeefd4aSBram Moolenaarenddef 3037eeefd4aSBram Moolenaar 3047eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3057eeefd4aSBram Moolenaar return arg 3067eeefd4aSBram Moolenaarenddef 3077eeefd4aSBram Moolenaar 3087eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3097eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3107eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 3117eeefd4aSBram Moolenaarenddef 3127eeefd4aSBram Moolenaar 3138a7d6542SBram Moolenaardef Test_return_type_wrong() 314978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 315978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 316978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 317978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 318cf3f8bf4SBram Moolenaar 3199be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 3209be61bbbSBram Moolenaar 321cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 322cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 3238a7d6542SBram Moolenaarenddef 3248a7d6542SBram Moolenaar 325bfe12043SBram Moolenaardef Test_arg_type_wrong() 326bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 327bfe12043SBram Moolenaarenddef 328bfe12043SBram Moolenaar 3298a7d6542SBram Moolenaardef Test_try_catch() 3308a7d6542SBram Moolenaar let l = [] 3318a7d6542SBram Moolenaar try 3328a7d6542SBram Moolenaar add(l, '1') 3338a7d6542SBram Moolenaar throw 'wrong' 3348a7d6542SBram Moolenaar add(l, '2') 3358a7d6542SBram Moolenaar catch 3368a7d6542SBram Moolenaar add(l, v:exception) 3378a7d6542SBram Moolenaar finally 3388a7d6542SBram Moolenaar add(l, '3') 3398a7d6542SBram Moolenaar endtry 3408a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 3418a7d6542SBram Moolenaarenddef 3428a7d6542SBram Moolenaar 343257cc5eeSBram Moolenaardef ThrowFromDef() 344257cc5eeSBram Moolenaar throw 'getout' 345257cc5eeSBram Moolenaarenddef 346257cc5eeSBram Moolenaar 347257cc5eeSBram Moolenaarfunc CatchInFunc() 348257cc5eeSBram Moolenaar try 349257cc5eeSBram Moolenaar call ThrowFromDef() 350257cc5eeSBram Moolenaar catch 351257cc5eeSBram Moolenaar let g:thrown_func = v:exception 352257cc5eeSBram Moolenaar endtry 353257cc5eeSBram Moolenaarendfunc 354257cc5eeSBram Moolenaar 355257cc5eeSBram Moolenaardef CatchInDef() 356257cc5eeSBram Moolenaar try 357257cc5eeSBram Moolenaar ThrowFromDef() 358257cc5eeSBram Moolenaar catch 359257cc5eeSBram Moolenaar g:thrown_def = v:exception 360257cc5eeSBram Moolenaar endtry 361257cc5eeSBram Moolenaarenddef 362257cc5eeSBram Moolenaar 363f575adffSBram Moolenaardef ReturnFinally(): string 364f575adffSBram Moolenaar try 365f575adffSBram Moolenaar return 'intry' 366f575adffSBram Moolenaar finally 367f575adffSBram Moolenaar g:in_finally = 'finally' 368f575adffSBram Moolenaar endtry 369f575adffSBram Moolenaar return 'end' 370f575adffSBram Moolenaarenddef 371f575adffSBram Moolenaar 372257cc5eeSBram Moolenaardef Test_try_catch_nested() 373257cc5eeSBram Moolenaar CatchInFunc() 374257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 375257cc5eeSBram Moolenaar 376257cc5eeSBram Moolenaar CatchInDef() 377257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 378f575adffSBram Moolenaar 379f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 380f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 381f575adffSBram Moolenaarenddef 382f575adffSBram Moolenaar 383f575adffSBram Moolenaardef Test_try_catch_match() 384f575adffSBram Moolenaar let seq = 'a' 385f575adffSBram Moolenaar try 386f575adffSBram Moolenaar throw 'something' 387f575adffSBram Moolenaar catch /nothing/ 388f575adffSBram Moolenaar seq ..= 'x' 389f575adffSBram Moolenaar catch /some/ 390f575adffSBram Moolenaar seq ..= 'b' 391f575adffSBram Moolenaar catch /asdf/ 392f575adffSBram Moolenaar seq ..= 'x' 393f575adffSBram Moolenaar finally 394f575adffSBram Moolenaar seq ..= 'c' 395f575adffSBram Moolenaar endtry 396f575adffSBram Moolenaar assert_equal('abc', seq) 397257cc5eeSBram Moolenaarenddef 398257cc5eeSBram Moolenaar 3998a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 4008a7d6542SBram Moolenaar vim9script 4018a7d6542SBram Moolenaar let name: string = 'bob' 4028a7d6542SBram Moolenaar def Concat(arg: string): string 4038a7d6542SBram Moolenaar return name .. arg 4048a7d6542SBram Moolenaar enddef 4058a7d6542SBram Moolenaar let g:result = Concat('bie') 4068a7d6542SBram Moolenaar let g:localname = name 4078a7d6542SBram Moolenaar 4088a7d6542SBram Moolenaar export const CONST = 1234 4098a7d6542SBram Moolenaar export let exported = 9876 4106e587dcbSBram Moolenaar export let exp_name = 'John' 4118a7d6542SBram Moolenaar export def Exported(): string 4128a7d6542SBram Moolenaar return 'Exported' 4138a7d6542SBram Moolenaar enddef 4148a7d6542SBram MoolenaarEND 4158a7d6542SBram Moolenaar 4165269bd2aSBram Moolenaardef Test_vim9_import_export() 4178a7d6542SBram Moolenaar let import_script_lines =<< trim END 4188a7d6542SBram Moolenaar vim9script 4198a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 4208a7d6542SBram Moolenaar g:imported = exported 4216e587dcbSBram Moolenaar exported += 3 4226e587dcbSBram Moolenaar g:imported_added = exported 4238a7d6542SBram Moolenaar g:imported_func = Exported() 4246e587dcbSBram Moolenaar 4256e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 4266e587dcbSBram Moolenaar g:imported_name = exp_name 4276e587dcbSBram Moolenaar exp_name ..= ' Doe' 4286e587dcbSBram Moolenaar g:imported_name_appended = exp_name 4295381c7a1SBram Moolenaar g:imported_later = exported 4308a7d6542SBram Moolenaar END 4318a7d6542SBram Moolenaar 4328a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 4338a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 4348a7d6542SBram Moolenaar 4358a7d6542SBram Moolenaar source Ximport.vim 4368a7d6542SBram Moolenaar 4378a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 4388a7d6542SBram Moolenaar assert_equal('bob', g:localname) 4398a7d6542SBram Moolenaar assert_equal(9876, g:imported) 4406e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 4415381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 4428a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 4436e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 4446e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 4458a7d6542SBram Moolenaar assert_false(exists('g:name')) 4468a7d6542SBram Moolenaar 4478a7d6542SBram Moolenaar unlet g:result 4488a7d6542SBram Moolenaar unlet g:localname 4498a7d6542SBram Moolenaar unlet g:imported 4506e587dcbSBram Moolenaar unlet g:imported_added 4515381c7a1SBram Moolenaar unlet g:imported_later 4528a7d6542SBram Moolenaar unlet g:imported_func 4536e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4548a7d6542SBram Moolenaar delete('Ximport.vim') 455f2d5c240SBram Moolenaar 4565381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4575381c7a1SBram Moolenaar vim9script 4585381c7a1SBram Moolenaar def ImportInDef() 4595381c7a1SBram Moolenaar import exported from './Xexport.vim' 4605381c7a1SBram Moolenaar g:imported = exported 4615381c7a1SBram Moolenaar exported += 7 4625381c7a1SBram Moolenaar g:imported_added = exported 4635381c7a1SBram Moolenaar enddef 4645381c7a1SBram Moolenaar ImportInDef() 4655381c7a1SBram Moolenaar END 4665381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4675381c7a1SBram Moolenaar source Ximport2.vim 4685381c7a1SBram Moolenaar " TODO: this should be 9879 4695381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4705381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4715381c7a1SBram Moolenaar unlet g:imported 4725381c7a1SBram Moolenaar unlet g:imported_added 4735381c7a1SBram Moolenaar delete('Ximport2.vim') 4745381c7a1SBram Moolenaar 475f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 476f2d5c240SBram Moolenaar vim9script 477f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 478f2d5c240SBram Moolenaar def UseExport() 479f2d5c240SBram Moolenaar g:imported = Export.exported 480f2d5c240SBram Moolenaar enddef 481f2d5c240SBram Moolenaar UseExport() 482f2d5c240SBram Moolenaar END 483f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 484f2d5c240SBram Moolenaar source Ximport.vim 4855381c7a1SBram Moolenaar assert_equal(9883, g:imported) 486f2d5c240SBram Moolenaar 487599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 488599c89c8SBram Moolenaar vim9script 489599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 490599c89c8SBram Moolenaar def Func() 491599c89c8SBram Moolenaar let dummy = 1 492599c89c8SBram Moolenaar let imported = Export + dummy 493599c89c8SBram Moolenaar enddef 494599c89c8SBram Moolenaar END 495599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 496599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 497599c89c8SBram Moolenaar 498599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 499599c89c8SBram Moolenaar vim9script 500599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 501599c89c8SBram Moolenaar def Func() 502599c89c8SBram Moolenaar let imported = Export . exported 503599c89c8SBram Moolenaar enddef 504599c89c8SBram Moolenaar END 505599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 506599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 507599c89c8SBram Moolenaar 508599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 509599c89c8SBram Moolenaar vim9script 510599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 511599c89c8SBram Moolenaar def Func() 512599c89c8SBram Moolenaar let imported = Export. 513599c89c8SBram Moolenaar enddef 514599c89c8SBram Moolenaar END 515599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 516599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 517599c89c8SBram Moolenaar 518f2d5c240SBram Moolenaar let import_star_lines =<< trim END 519f2d5c240SBram Moolenaar vim9script 520f2d5c240SBram Moolenaar import * from './Xexport.vim' 521f2d5c240SBram Moolenaar g:imported = exported 522f2d5c240SBram Moolenaar END 523f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 524f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 525f2d5c240SBram Moolenaar 526fa29c8abSBram Moolenaar " try to import something that exists but is not exported 527fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 528fa29c8abSBram Moolenaar vim9script 529fa29c8abSBram Moolenaar import name from './Xexport.vim' 530fa29c8abSBram Moolenaar END 531fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 532fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 533fa29c8abSBram Moolenaar 5345269bd2aSBram Moolenaar " try to import something that is already defined 5355269bd2aSBram Moolenaar let import_already_defined =<< trim END 5365269bd2aSBram Moolenaar vim9script 5375269bd2aSBram Moolenaar let exported = 'something' 5385269bd2aSBram Moolenaar import exported from './Xexport.vim' 5395269bd2aSBram Moolenaar END 5405269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5415269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5425269bd2aSBram Moolenaar 5435269bd2aSBram Moolenaar " try to import something that is already defined 5445269bd2aSBram Moolenaar import_already_defined =<< trim END 5455269bd2aSBram Moolenaar vim9script 5465269bd2aSBram Moolenaar let exported = 'something' 5475269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5485269bd2aSBram Moolenaar END 5495269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5505269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5515269bd2aSBram Moolenaar 5525269bd2aSBram Moolenaar " try to import something that is already defined 5535269bd2aSBram Moolenaar import_already_defined =<< trim END 5545269bd2aSBram Moolenaar vim9script 5555269bd2aSBram Moolenaar let exported = 'something' 5565269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5575269bd2aSBram Moolenaar END 5585269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5595269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5605269bd2aSBram Moolenaar 561fa29c8abSBram Moolenaar " import a very long name, requires making a copy 562fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 563fa29c8abSBram Moolenaar vim9script 564fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 565fa29c8abSBram Moolenaar END 566fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 567fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 568fa29c8abSBram Moolenaar 569fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 570fa29c8abSBram Moolenaar vim9script 571fa29c8abSBram Moolenaar import name './Xexport.vim' 572fa29c8abSBram Moolenaar END 573fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 574fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 575fa29c8abSBram Moolenaar 576fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 577fa29c8abSBram Moolenaar vim9script 578fa29c8abSBram Moolenaar import name from Xexport.vim 579fa29c8abSBram Moolenaar END 580fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 581fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 582fa29c8abSBram Moolenaar 583fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 584fa29c8abSBram Moolenaar vim9script 585fa29c8abSBram Moolenaar import name from './XnoExport.vim' 586fa29c8abSBram Moolenaar END 587fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 588fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 589fa29c8abSBram Moolenaar 590fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 591fa29c8abSBram Moolenaar vim9script 592fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 593fa29c8abSBram Moolenaar END 5945269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5955269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 596fa29c8abSBram Moolenaar 597f2d5c240SBram Moolenaar delete('Ximport.vim') 5985269bd2aSBram Moolenaar delete('Ximport3.vim') 5998a7d6542SBram Moolenaar delete('Xexport.vim') 6008a7d6542SBram Moolenaar 601750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 602750802b5SBram Moolenaar set cpo&vi 603750802b5SBram Moolenaar let cpo_before = &cpo 604750802b5SBram Moolenaar let lines =<< trim END 605750802b5SBram Moolenaar vim9script 606750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 607750802b5SBram Moolenaar END 608750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 609750802b5SBram Moolenaar source Xvim9_script 610750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 611750802b5SBram Moolenaar set cpo&vim 612750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 613750802b5SBram Moolenaar delete('Xvim9_script') 614750802b5SBram Moolenaarenddef 615750802b5SBram Moolenaar 616750802b5SBram Moolenaardef Test_vim9script_fails() 6178a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 6188a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 619750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 620f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 621750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 622750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 623750802b5SBram Moolenaar 624750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 625750802b5SBram Moolenaar assert_fails('export something', 'E1042') 6268a7d6542SBram Moolenaarenddef 6278a7d6542SBram Moolenaar 6288a7d6542SBram Moolenaardef Test_vim9script_call() 6298a7d6542SBram Moolenaar let lines =<< trim END 6308a7d6542SBram Moolenaar vim9script 6318a7d6542SBram Moolenaar let var = '' 6328a7d6542SBram Moolenaar def MyFunc(arg: string) 6338a7d6542SBram Moolenaar var = arg 6348a7d6542SBram Moolenaar enddef 6358a7d6542SBram Moolenaar MyFunc('foobar') 6368a7d6542SBram Moolenaar assert_equal('foobar', var) 6378a7d6542SBram Moolenaar 6388a7d6542SBram Moolenaar let str = 'barfoo' 6398a7d6542SBram Moolenaar str->MyFunc() 6408a7d6542SBram Moolenaar assert_equal('barfoo', var) 6418a7d6542SBram Moolenaar 6428a7d6542SBram Moolenaar let g:value = 'value' 6438a7d6542SBram Moolenaar g:value->MyFunc() 6448a7d6542SBram Moolenaar assert_equal('value', var) 6458a7d6542SBram Moolenaar 6468a7d6542SBram Moolenaar let listvar = [] 6478a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 6488a7d6542SBram Moolenaar listvar = arg 6498a7d6542SBram Moolenaar enddef 6508a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 6518a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 6528a7d6542SBram Moolenaar 6538a7d6542SBram Moolenaar let dictvar = {} 6548a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 6558a7d6542SBram Moolenaar dictvar = arg 6568a7d6542SBram Moolenaar enddef 6578a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 6588a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 65933fa29cfSBram Moolenaar def CompiledDict() 66033fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 66133fa29cfSBram Moolenaar enddef 66233fa29cfSBram Moolenaar CompiledDict() 66333fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 66433fa29cfSBram Moolenaar 6658a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 6668a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 6670c6ceaf9SBram Moolenaar 6680c6ceaf9SBram Moolenaar ('text')->MyFunc() 6690c6ceaf9SBram Moolenaar assert_equal('text', var) 6700c6ceaf9SBram Moolenaar ("some")->MyFunc() 6710c6ceaf9SBram Moolenaar assert_equal('some', var) 6728a7d6542SBram Moolenaar END 6738a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 6748a7d6542SBram Moolenaar source Xcall.vim 6758a7d6542SBram Moolenaar delete('Xcall.vim') 6768a7d6542SBram Moolenaarenddef 6778a7d6542SBram Moolenaar 6788a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 6798a7d6542SBram Moolenaar let lines =<< trim END 6808a7d6542SBram Moolenaar vim9script 6818a7d6542SBram Moolenaar let var = '' 6828a7d6542SBram Moolenaar def MyFunc(arg: string) 6838a7d6542SBram Moolenaar let var = 123 6848a7d6542SBram Moolenaar enddef 6858a7d6542SBram Moolenaar END 6868a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 6878a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 6888a7d6542SBram Moolenaar delete('Xcall_decl.vim') 6898a7d6542SBram Moolenaarenddef 6908a7d6542SBram Moolenaar 6918a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 6928a7d6542SBram Moolenaar let lines =<< trim END 6938a7d6542SBram Moolenaar vim9script 6948a7d6542SBram Moolenaar const var = '' 6958a7d6542SBram Moolenaar def MyFunc(arg: string) 6968a7d6542SBram Moolenaar var = 'asdf' 6978a7d6542SBram Moolenaar enddef 6988a7d6542SBram Moolenaar END 6998a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 7008a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 7018a7d6542SBram Moolenaar delete('Xcall_const.vim') 7028a7d6542SBram Moolenaarenddef 7038a7d6542SBram Moolenaar 7048a7d6542SBram Moolenaardef Test_vim9script_reload() 7058a7d6542SBram Moolenaar let lines =<< trim END 7068a7d6542SBram Moolenaar vim9script 7078a7d6542SBram Moolenaar const var = '' 7088a7d6542SBram Moolenaar let valone = 1234 7098a7d6542SBram Moolenaar def MyFunc(arg: string) 7108a7d6542SBram Moolenaar valone = 5678 7118a7d6542SBram Moolenaar enddef 7128a7d6542SBram Moolenaar END 7138a7d6542SBram Moolenaar let morelines =<< trim END 7148a7d6542SBram Moolenaar let valtwo = 222 7158a7d6542SBram Moolenaar export def GetValtwo(): number 7168a7d6542SBram Moolenaar return valtwo 7178a7d6542SBram Moolenaar enddef 7188a7d6542SBram Moolenaar END 7198a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7208a7d6542SBram Moolenaar source Xreload.vim 7218a7d6542SBram Moolenaar source Xreload.vim 7228a7d6542SBram Moolenaar source Xreload.vim 7238a7d6542SBram Moolenaar 7248a7d6542SBram Moolenaar let testlines =<< trim END 7258a7d6542SBram Moolenaar vim9script 7268a7d6542SBram Moolenaar def TheFunc() 7278a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 7288a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 7298a7d6542SBram Moolenaar enddef 7308a7d6542SBram Moolenaar TheFunc() 7318a7d6542SBram Moolenaar END 7328a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 7338a7d6542SBram Moolenaar source Ximport.vim 7348a7d6542SBram Moolenaar 7358a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 7368a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 7378a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7388a7d6542SBram Moolenaar source Xreload.vim 7398a7d6542SBram Moolenaar source Ximport.vim 7408a7d6542SBram Moolenaar 7418a7d6542SBram Moolenaar " cannot declare a var twice 7428a7d6542SBram Moolenaar lines =<< trim END 7438a7d6542SBram Moolenaar vim9script 7448a7d6542SBram Moolenaar let valone = 1234 7458a7d6542SBram Moolenaar let valone = 5678 7468a7d6542SBram Moolenaar END 7478a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7488a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 7498a7d6542SBram Moolenaar 7508a7d6542SBram Moolenaar delete('Xreload.vim') 7518a7d6542SBram Moolenaar delete('Ximport.vim') 7528a7d6542SBram Moolenaarenddef 7538a7d6542SBram Moolenaar 7548a7d6542SBram Moolenaardef Test_import_absolute() 7558a7d6542SBram Moolenaar let import_lines = [ 7568a7d6542SBram Moolenaar \ 'vim9script', 7578a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 758b283a8a6SBram Moolenaar \ 'def UseExported()', 7598a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 7604e12a5dfSBram Moolenaar \ ' exported = 8888', 7614e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 762b283a8a6SBram Moolenaar \ 'enddef', 763b283a8a6SBram Moolenaar \ 'UseExported()', 7644e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 7658a7d6542SBram Moolenaar \ ] 7668a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 7678a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 7688a7d6542SBram Moolenaar 7698a7d6542SBram Moolenaar source Ximport_abs.vim 7708a7d6542SBram Moolenaar 7718a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 7724e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 773b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 774b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 775b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7764e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 7774e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 7784e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 7794e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 7804e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 7814e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 7824e12a5dfSBram Moolenaar \, g:import_disassembled) 7838a7d6542SBram Moolenaar unlet g:imported_abs 7844e12a5dfSBram Moolenaar unlet g:import_disassembled 7858a7d6542SBram Moolenaar 7868a7d6542SBram Moolenaar delete('Ximport_abs.vim') 7878a7d6542SBram Moolenaar delete('Xexport_abs.vim') 7888a7d6542SBram Moolenaarenddef 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaardef Test_import_rtp() 7918a7d6542SBram Moolenaar let import_lines = [ 7928a7d6542SBram Moolenaar \ 'vim9script', 7938a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 7948a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 7958a7d6542SBram Moolenaar \ ] 7968a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 7978a7d6542SBram Moolenaar mkdir('import') 7988a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 7998a7d6542SBram Moolenaar 8008a7d6542SBram Moolenaar let save_rtp = &rtp 8018a7d6542SBram Moolenaar &rtp = getcwd() 8028a7d6542SBram Moolenaar source Ximport_rtp.vim 8038a7d6542SBram Moolenaar &rtp = save_rtp 8048a7d6542SBram Moolenaar 8058a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8068a7d6542SBram Moolenaar unlet g:imported_rtp 8078a7d6542SBram Moolenaar 8088a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 8098a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 8108a7d6542SBram Moolenaar delete('import', 'd') 8118a7d6542SBram Moolenaarenddef 8128a7d6542SBram Moolenaar 8138a7d6542SBram Moolenaardef Test_fixed_size_list() 8148a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 8158a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 8168a7d6542SBram Moolenaar l->remove(0) 8178a7d6542SBram Moolenaar l->add(5) 8188a7d6542SBram Moolenaar l->insert(99, 1) 8190f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 8208a7d6542SBram Moolenaarenddef 8218a7d6542SBram Moolenaar 822673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 823673660abSBram Moolenaar" recognized. 824673660abSBram Moolenaarfunc Test_function_python() 825673660abSBram Moolenaar CheckFeature python3 826673660abSBram Moolenaar let py = 'python3' 827673660abSBram Moolenaar execute py "<< EOF" 828673660abSBram Moolenaardef do_something(): 829673660abSBram Moolenaar return 1 830673660abSBram MoolenaarEOF 831673660abSBram Moolenaarendfunc 832673660abSBram Moolenaar 833158906cfSBram Moolenaardef IfElse(what: number): string 834158906cfSBram Moolenaar let res = '' 835158906cfSBram Moolenaar if what == 1 836158906cfSBram Moolenaar res = "one" 837158906cfSBram Moolenaar elseif what == 2 838158906cfSBram Moolenaar res = "two" 839a259d8d3SBram Moolenaar else 840158906cfSBram Moolenaar res = "three" 841a259d8d3SBram Moolenaar endif 842158906cfSBram Moolenaar return res 843a259d8d3SBram Moolenaarenddef 844a259d8d3SBram Moolenaar 845158906cfSBram Moolenaardef Test_if_elseif_else() 846158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 847158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 848158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 8490f18b6d1SBram Moolenaarenddef 8500f18b6d1SBram Moolenaar 8516d69bf60SBram Moolenaarlet g:bool_true = v:true 8526d69bf60SBram Moolenaarlet g:bool_false = v:false 8536d69bf60SBram Moolenaar 8546d69bf60SBram Moolenaardef Test_if_const_expr() 8556d69bf60SBram Moolenaar let res = false 8566d69bf60SBram Moolenaar if true ? true : false 8576d69bf60SBram Moolenaar res = true 8586d69bf60SBram Moolenaar endif 8596d69bf60SBram Moolenaar assert_equal(true, res) 8606d69bf60SBram Moolenaar 8616d69bf60SBram Moolenaar res = false 8626d69bf60SBram Moolenaar if g:bool_true ? true : false 8636d69bf60SBram Moolenaar res = true 8646d69bf60SBram Moolenaar endif 8656d69bf60SBram Moolenaar assert_equal(true, res) 8666d69bf60SBram Moolenaar 8676d69bf60SBram Moolenaar res = false 8686d69bf60SBram Moolenaar if true ? g:bool_true : false 8696d69bf60SBram Moolenaar res = true 8706d69bf60SBram Moolenaar endif 8716d69bf60SBram Moolenaar assert_equal(true, res) 8726d69bf60SBram Moolenaar 8736d69bf60SBram Moolenaar res = false 8746d69bf60SBram Moolenaar if true ? true : g:bool_false 8756d69bf60SBram Moolenaar res = true 8766d69bf60SBram Moolenaar endif 8776d69bf60SBram Moolenaar assert_equal(true, res) 8786d69bf60SBram Moolenaar 8796d69bf60SBram Moolenaar res = false 8806d69bf60SBram Moolenaar if true ? false : true 8816d69bf60SBram Moolenaar res = true 8826d69bf60SBram Moolenaar endif 8836d69bf60SBram Moolenaar assert_equal(false, res) 8846d69bf60SBram Moolenaar 8856d69bf60SBram Moolenaar res = false 8866d69bf60SBram Moolenaar if false ? false : true 8876d69bf60SBram Moolenaar res = true 8886d69bf60SBram Moolenaar endif 8896d69bf60SBram Moolenaar assert_equal(true, res) 8906d69bf60SBram Moolenaar 8916d69bf60SBram Moolenaar res = false 8926d69bf60SBram Moolenaar if false ? true : false 8936d69bf60SBram Moolenaar res = true 8946d69bf60SBram Moolenaar endif 8956d69bf60SBram Moolenaar assert_equal(false, res) 8966d69bf60SBram Moolenaar 8976d69bf60SBram Moolenaar res = false 8986d69bf60SBram Moolenaar if true && true 8996d69bf60SBram Moolenaar res = true 9006d69bf60SBram Moolenaar endif 9016d69bf60SBram Moolenaar assert_equal(true, res) 9026d69bf60SBram Moolenaar 9036d69bf60SBram Moolenaar res = false 9046d69bf60SBram Moolenaar if true && false 9056d69bf60SBram Moolenaar res = true 9066d69bf60SBram Moolenaar endif 9076d69bf60SBram Moolenaar assert_equal(false, res) 9086d69bf60SBram Moolenaar 9096d69bf60SBram Moolenaar res = false 9106d69bf60SBram Moolenaar if g:bool_true && false 9116d69bf60SBram Moolenaar res = true 9126d69bf60SBram Moolenaar endif 9136d69bf60SBram Moolenaar assert_equal(false, res) 9146d69bf60SBram Moolenaar 9156d69bf60SBram Moolenaar res = false 9166d69bf60SBram Moolenaar if true && g:bool_false 9176d69bf60SBram Moolenaar res = true 9186d69bf60SBram Moolenaar endif 9196d69bf60SBram Moolenaar assert_equal(false, res) 9206d69bf60SBram Moolenaar 9216d69bf60SBram Moolenaar res = false 9226d69bf60SBram Moolenaar if false && false 9236d69bf60SBram Moolenaar res = true 9246d69bf60SBram Moolenaar endif 9256d69bf60SBram Moolenaar assert_equal(false, res) 9266d69bf60SBram Moolenaar 9276d69bf60SBram Moolenaar res = false 9286d69bf60SBram Moolenaar if true || false 9296d69bf60SBram Moolenaar res = true 9306d69bf60SBram Moolenaar endif 9316d69bf60SBram Moolenaar assert_equal(true, res) 9326d69bf60SBram Moolenaar 9336d69bf60SBram Moolenaar res = false 9346d69bf60SBram Moolenaar if g:bool_true || false 9356d69bf60SBram Moolenaar res = true 9366d69bf60SBram Moolenaar endif 9376d69bf60SBram Moolenaar assert_equal(true, res) 9386d69bf60SBram Moolenaar 9396d69bf60SBram Moolenaar res = false 9406d69bf60SBram Moolenaar if true || g:bool_false 9416d69bf60SBram Moolenaar res = true 9426d69bf60SBram Moolenaar endif 9436d69bf60SBram Moolenaar assert_equal(true, res) 9446d69bf60SBram Moolenaar 9456d69bf60SBram Moolenaar res = false 9466d69bf60SBram Moolenaar if false || false 9476d69bf60SBram Moolenaar res = true 9486d69bf60SBram Moolenaar endif 9496d69bf60SBram Moolenaar assert_equal(false, res) 9506d69bf60SBram Moolenaar 9516d69bf60SBram Moolenaarenddef 9526d69bf60SBram Moolenaar 95363ce4849SBram Moolenaardef Test_delfunc() 95463ce4849SBram Moolenaar let lines =<< trim END 95563ce4849SBram Moolenaar vim9script 95663ce4849SBram Moolenaar def GoneSoon() 95763ce4849SBram Moolenaar echo 'hello' 95863ce4849SBram Moolenaar enddef 95963ce4849SBram Moolenaar 96063ce4849SBram Moolenaar def CallGoneSoon() 96163ce4849SBram Moolenaar GoneSoon() 96263ce4849SBram Moolenaar enddef 96363ce4849SBram Moolenaar 96463ce4849SBram Moolenaar delfunc GoneSoon 96563ce4849SBram Moolenaar CallGoneSoon() 96663ce4849SBram Moolenaar END 96763ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 96863ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 96963ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 97063ce4849SBram Moolenaar 97163ce4849SBram Moolenaar delete('XToDelFunc') 97263ce4849SBram Moolenaarenddef 97363ce4849SBram Moolenaar 974ad39c094SBram Moolenaardef Test_execute_cmd() 975ad39c094SBram Moolenaar new 976ad39c094SBram Moolenaar setline(1, 'default') 977ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 978ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 979ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 980ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 981ad39c094SBram Moolenaar execute cmd1 cmd2 982ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 983ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 984ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 985ad39c094SBram Moolenaar let cmd_first = 'call ' 986ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 987ad39c094SBram Moolenaar execute cmd_first .. cmd_last 988ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 989ad39c094SBram Moolenaar bwipe! 990ad39c094SBram Moolenaarenddef 991ad39c094SBram Moolenaar 992ad39c094SBram Moolenaardef Test_echo_cmd() 993ad39c094SBram Moolenaar echo 'something' 994ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 995ad39c094SBram Moolenaar 996ad39c094SBram Moolenaar let str1 = 'some' 997ad39c094SBram Moolenaar let str2 = 'more' 998ad39c094SBram Moolenaar echo str1 str2 999ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1000ad39c094SBram Moolenaarenddef 1001ad39c094SBram Moolenaar 100241fe0617SBram Moolenaardef Test_for_outside_of_function() 100341fe0617SBram Moolenaar let lines =<< trim END 100441fe0617SBram Moolenaar vim9script 100541fe0617SBram Moolenaar new 100641fe0617SBram Moolenaar for var in range(0, 3) 100741fe0617SBram Moolenaar append(line('$'), var) 100841fe0617SBram Moolenaar endfor 100941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 101041fe0617SBram Moolenaar bwipe! 101141fe0617SBram Moolenaar END 101241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 101341fe0617SBram Moolenaar source Xvim9for.vim 101441fe0617SBram Moolenaar delete('Xvim9for.vim') 101541fe0617SBram Moolenaarenddef 10168a7d6542SBram Moolenaar 1017d0df1aacSBram Moolenaardef Test_while_loop() 1018d0df1aacSBram Moolenaar let result = '' 1019d0df1aacSBram Moolenaar let cnt = 0 1020d0df1aacSBram Moolenaar while cnt < 555 1021d0df1aacSBram Moolenaar if cnt == 3 1022d0df1aacSBram Moolenaar break 1023d0df1aacSBram Moolenaar endif 1024d0df1aacSBram Moolenaar cnt += 1 1025d0df1aacSBram Moolenaar if cnt == 2 1026d0df1aacSBram Moolenaar continue 1027d0df1aacSBram Moolenaar endif 1028d0df1aacSBram Moolenaar result ..= cnt .. '_' 1029d0df1aacSBram Moolenaar endwhile 1030d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1031d0df1aacSBram Moolenaarenddef 1032d0df1aacSBram Moolenaar 1033*bd5da371SBram Moolenaardef Test_for_loop_fails() 1034*bd5da371SBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1035*bd5da371SBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1036*bd5da371SBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1037*bd5da371SBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1038*bd5da371SBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1039*bd5da371SBram Moolenaarenddef 1040*bd5da371SBram Moolenaar 10419645e2d9SBram Moolenaardef Test_interrupt_loop() 104297acfc78SBram Moolenaar let caught = false 10439645e2d9SBram Moolenaar let x = 0 104497acfc78SBram Moolenaar try 10459645e2d9SBram Moolenaar while 1 10469645e2d9SBram Moolenaar x += 1 10479645e2d9SBram Moolenaar if x == 100 10489645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 10499645e2d9SBram Moolenaar endif 10509645e2d9SBram Moolenaar endwhile 105197acfc78SBram Moolenaar catch 105297acfc78SBram Moolenaar caught = true 105397acfc78SBram Moolenaar assert_equal(100, x) 105497acfc78SBram Moolenaar endtry 105597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 10569645e2d9SBram Moolenaarenddef 105720431c9dSBram Moolenaar 1058d0df1aacSBram Moolenaardef Test_substitute_cmd() 1059d0df1aacSBram Moolenaar new 1060d0df1aacSBram Moolenaar setline(1, 'something') 1061d0df1aacSBram Moolenaar :substitute(some(other( 1062d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1063d0df1aacSBram Moolenaar bwipe! 1064d0df1aacSBram Moolenaar 1065d0df1aacSBram Moolenaar " also when the context is Vim9 script 1066d0df1aacSBram Moolenaar let lines =<< trim END 1067d0df1aacSBram Moolenaar vim9script 1068d0df1aacSBram Moolenaar new 1069d0df1aacSBram Moolenaar setline(1, 'something') 1070d0df1aacSBram Moolenaar :substitute(some(other( 1071d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1072d0df1aacSBram Moolenaar bwipe! 1073d0df1aacSBram Moolenaar END 1074d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1075d0df1aacSBram Moolenaar source Xvim9lines 1076d0df1aacSBram Moolenaar 1077d0df1aacSBram Moolenaar delete('Xvim9lines') 1078d0df1aacSBram Moolenaarenddef 1079d0df1aacSBram Moolenaar 108020431c9dSBram Moolenaardef Test_redef_failure() 108120431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 108220431c9dSBram Moolenaar so Xdef 108320431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 108420431c9dSBram Moolenaar so Xdef 108520431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 108620431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 108720431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 108820431c9dSBram Moolenaar so Xdef 108920431c9dSBram Moolenaar call delete('Xdef') 109020431c9dSBram Moolenaar 109120431c9dSBram Moolenaar call assert_equal(0, Func0()) 109220431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 109320431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 109420431c9dSBram Moolenaar 109520431c9dSBram Moolenaar delfunc! Func0 109620431c9dSBram Moolenaar delfunc! Func1 109720431c9dSBram Moolenaar delfunc! Func2 109820431c9dSBram Moolenaarenddef 109920431c9dSBram Moolenaar 11007d941ee0SBram Moolenaar" Test for internal functions returning different types 11017d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 11027d941ee0SBram Moolenaar let lines =<< trim END 11037d941ee0SBram Moolenaar def RetFloat(): float 11047d941ee0SBram Moolenaar return ceil(1.456) 11057d941ee0SBram Moolenaar enddef 11067d941ee0SBram Moolenaar 11077d941ee0SBram Moolenaar def RetListAny(): list<any> 11087d941ee0SBram Moolenaar return items({'k' : 'v'}) 11097d941ee0SBram Moolenaar enddef 11107d941ee0SBram Moolenaar 11117d941ee0SBram Moolenaar def RetListString(): list<string> 11127d941ee0SBram Moolenaar return split('a:b:c', ':') 11137d941ee0SBram Moolenaar enddef 11147d941ee0SBram Moolenaar 11157d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 11167d941ee0SBram Moolenaar return getbufinfo() 11177d941ee0SBram Moolenaar enddef 11187d941ee0SBram Moolenaar 11197d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 11207d941ee0SBram Moolenaar return wordcount() 11217d941ee0SBram Moolenaar enddef 11227d941ee0SBram Moolenaar 11237d941ee0SBram Moolenaar def RetDictString(): dict<string> 11247d941ee0SBram Moolenaar return environ() 11257d941ee0SBram Moolenaar enddef 11267d941ee0SBram Moolenaar END 11277d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 11287d941ee0SBram Moolenaar source Xscript 11297d941ee0SBram Moolenaar 11307d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 11317d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 11327d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 11337d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 11347d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 11357d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 11367d941ee0SBram Moolenaar call delete('Xscript') 11377d941ee0SBram Moolenaarendfunc 11387d941ee0SBram Moolenaar 11397d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 11407d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 11417d941ee0SBram Moolenaar let l =<< trim END 11427d941ee0SBram Moolenaar def! FArgErr(): float 11437d941ee0SBram Moolenaar return ceil(1.1, 2) 11447d941ee0SBram Moolenaar enddef 11457d941ee0SBram Moolenaar END 11467d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11477d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 11487d941ee0SBram Moolenaar let l =<< trim END 11497d941ee0SBram Moolenaar def! FArgErr(): float 11507d941ee0SBram Moolenaar return ceil() 11517d941ee0SBram Moolenaar enddef 11527d941ee0SBram Moolenaar END 11537d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 11547d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 11557d941ee0SBram Moolenaar call delete('Xinvalidarg') 11567d941ee0SBram Moolenaarendfunc 11577d941ee0SBram Moolenaar 11588a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1159