18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4673660abSBram Moolenaar 58a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message. 68a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error) 7978d170bSBram Moolenaar call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef') 88a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 98a7d6542SBram Moolenaar call delete('Xdef') 108a7d6542SBram Moolenaarendfunc 118a7d6542SBram Moolenaar 128a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error) 138a7d6542SBram Moolenaar call writefile(a:lines, 'Xdef') 148a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 158a7d6542SBram Moolenaar call delete('Xdef') 168a7d6542SBram Moolenaarendfunc 178a7d6542SBram Moolenaar 188a7d6542SBram Moolenaardef Test_syntax() 198a7d6542SBram Moolenaar let var = 234 208a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 218a7d6542SBram Moolenaarenddef 228a7d6542SBram Moolenaar 238a7d6542SBram Moolenaarfunc Test_def_basic() 248a7d6542SBram Moolenaar def SomeFunc(): string 258a7d6542SBram Moolenaar return 'yes' 268a7d6542SBram Moolenaar enddef 278a7d6542SBram Moolenaar call assert_equal('yes', SomeFunc()) 288a7d6542SBram Moolenaarendfunc 298a7d6542SBram Moolenaar 306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 316e587dcbSBram Moolenaarlet s:addToMe = 111 32401d9ffbSBram Moolenaarlet g:existing = 'yes' 336e587dcbSBram Moolenaar 348a7d6542SBram Moolenaardef Test_assignment() 358a7d6542SBram Moolenaar let bool1: bool = true 368a7d6542SBram Moolenaar assert_equal(v:true, bool1) 378a7d6542SBram Moolenaar let bool2: bool = false 388a7d6542SBram Moolenaar assert_equal(v:false, bool2) 398a7d6542SBram Moolenaar 408a7d6542SBram Moolenaar let list1: list<string> = ['sdf', 'asdf'] 418a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 428a7d6542SBram Moolenaar 438a7d6542SBram Moolenaar " TODO: does not work yet 448a7d6542SBram Moolenaar " let listS: list<string> = [] 458a7d6542SBram Moolenaar " let listN: list<number> = [] 468a7d6542SBram Moolenaar 478a7d6542SBram Moolenaar let dict1: dict<string> = #{key: 'value'} 488a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 49b283a8a6SBram Moolenaar 50401d9ffbSBram Moolenaar g:newvar = 'new' 51401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 52401d9ffbSBram Moolenaar 53401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 54401d9ffbSBram Moolenaar g:existing = 'no' 55401d9ffbSBram Moolenaar assert_equal('no', g:existing) 56401d9ffbSBram Moolenaar 57b283a8a6SBram Moolenaar v:char = 'abc' 586e587dcbSBram Moolenaar assert_equal('abc', v:char) 59b283a8a6SBram Moolenaar 60b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 616e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 62b283a8a6SBram Moolenaar $ENVVAR = '' 636e587dcbSBram Moolenaar 64fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 65fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 66fd1823e0SBram Moolenaar s:addToMe += 222 67fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 680bbf722aSBram Moolenaar s:newVar = 'new' 690bbf722aSBram Moolenaar assert_equal('new', s:newVar) 708a7d6542SBram Moolenaarenddef 718a7d6542SBram Moolenaar 728a7d6542SBram Moolenaarfunc Test_assignment_failure() 738a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 748a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 758a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 768a7d6542SBram Moolenaar 778a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 788a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 798a7d6542SBram Moolenaar 808a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 818a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 828a7d6542SBram Moolenaar 838a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 848a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 858a7d6542SBram Moolenaar 868a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 878a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 888a7d6542SBram Moolenaarendfunc 898a7d6542SBram Moolenaar 908a7d6542SBram Moolenaarfunc Test_const() 918a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 928a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 938a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 948a7d6542SBram Moolenaarendfunc 958a7d6542SBram Moolenaar 968a7d6542SBram Moolenaardef Test_block() 978a7d6542SBram Moolenaar let outer = 1 988a7d6542SBram Moolenaar { 998a7d6542SBram Moolenaar let inner = 2 1008a7d6542SBram Moolenaar assert_equal(1, outer) 1018a7d6542SBram Moolenaar assert_equal(2, inner) 1028a7d6542SBram Moolenaar } 1038a7d6542SBram Moolenaar assert_equal(1, outer) 1048a7d6542SBram Moolenaarenddef 1058a7d6542SBram Moolenaar 1068a7d6542SBram Moolenaarfunc Test_block_failure() 1078a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1088a7d6542SBram Moolenaarendfunc 1098a7d6542SBram Moolenaar 1108a7d6542SBram Moolenaardef ReturnString(): string 1118a7d6542SBram Moolenaar return 'string' 1128a7d6542SBram Moolenaarenddef 1138a7d6542SBram Moolenaar 1148a7d6542SBram Moolenaardef ReturnNumber(): number 1158a7d6542SBram Moolenaar return 123 1168a7d6542SBram Moolenaarenddef 1178a7d6542SBram Moolenaar 1188a7d6542SBram Moolenaardef Test_return_string() 1198a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1208a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 1218a7d6542SBram Moolenaarenddef 1228a7d6542SBram Moolenaar 1238a7d6542SBram Moolenaarfunc Increment() 1248a7d6542SBram Moolenaar let g:counter += 1 1258a7d6542SBram Moolenaarendfunc 1268a7d6542SBram Moolenaar 1278a7d6542SBram Moolenaardef Test_call_ufunc_count() 1288a7d6542SBram Moolenaar g:counter = 1 1298a7d6542SBram Moolenaar Increment() 1308a7d6542SBram Moolenaar Increment() 1318a7d6542SBram Moolenaar Increment() 1328a7d6542SBram Moolenaar " works with and without :call 1338a7d6542SBram Moolenaar assert_equal(4, g:counter) 134b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1358a7d6542SBram Moolenaar unlet g:counter 1368a7d6542SBram Moolenaarenddef 1378a7d6542SBram Moolenaar 1388a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1398a7d6542SBram Moolenaar let res = arg 1408a7d6542SBram Moolenaar for s in rest 1418a7d6542SBram Moolenaar res ..= ',' .. s 1428a7d6542SBram Moolenaar endfor 1438a7d6542SBram Moolenaar return res 1448a7d6542SBram Moolenaarenddef 1458a7d6542SBram Moolenaar 1468a7d6542SBram Moolenaardef Test_call_varargs() 1478a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1488a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1498a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1508a7d6542SBram Moolenaarenddef 1518a7d6542SBram Moolenaar 152170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 153170fcfcfSBram Moolenaar return name 154170fcfcfSBram Moolenaarenddef 155170fcfcfSBram Moolenaar 156170fcfcfSBram Moolenaardef Test_call_default_args() 157170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 158170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 159170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 160170fcfcfSBram Moolenaarenddef 161170fcfcfSBram Moolenaar 162170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 163170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 164170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 165170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 166170fcfcfSBram Moolenaarendfunc 167170fcfcfSBram Moolenaar 168170fcfcfSBram Moolenaar" Default arg and varargs 169170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 170170fcfcfSBram Moolenaar let res = one .. ',' .. two 171170fcfcfSBram Moolenaar for s in rest 172170fcfcfSBram Moolenaar res ..= ',' .. s 173170fcfcfSBram Moolenaar endfor 174170fcfcfSBram Moolenaar return res 175170fcfcfSBram Moolenaarenddef 176170fcfcfSBram Moolenaar 177170fcfcfSBram Moolenaardef Test_call_def_varargs() 178170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 179170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 180170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 181170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 182170fcfcfSBram Moolenaarenddef 183170fcfcfSBram Moolenaar 184170fcfcfSBram Moolenaar 18526e117e9SBram Moolenaar"def Test_call_func_defined_later() 18626e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 18726e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 18826e117e9SBram Moolenaar"enddef 18926e117e9SBram Moolenaar 19026e117e9SBram Moolenaarfunc DefineLater(arg) 19126e117e9SBram Moolenaar return a:arg 19226e117e9SBram Moolenaarendfunc 19326e117e9SBram Moolenaar 1948a7d6542SBram Moolenaardef Test_return_type_wrong() 195978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 196978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 197978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 198978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1998a7d6542SBram Moolenaarenddef 2008a7d6542SBram Moolenaar 201bfe12043SBram Moolenaardef Test_arg_type_wrong() 202bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 203bfe12043SBram Moolenaarenddef 204bfe12043SBram Moolenaar 2058a7d6542SBram Moolenaardef Test_try_catch() 2068a7d6542SBram Moolenaar let l = [] 2078a7d6542SBram Moolenaar try 2088a7d6542SBram Moolenaar add(l, '1') 2098a7d6542SBram Moolenaar throw 'wrong' 2108a7d6542SBram Moolenaar add(l, '2') 2118a7d6542SBram Moolenaar catch 2128a7d6542SBram Moolenaar add(l, v:exception) 2138a7d6542SBram Moolenaar finally 2148a7d6542SBram Moolenaar add(l, '3') 2158a7d6542SBram Moolenaar endtry 2168a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2178a7d6542SBram Moolenaarenddef 2188a7d6542SBram Moolenaar 219257cc5eeSBram Moolenaardef ThrowFromDef() 220257cc5eeSBram Moolenaar throw 'getout' 221257cc5eeSBram Moolenaarenddef 222257cc5eeSBram Moolenaar 223257cc5eeSBram Moolenaarfunc CatchInFunc() 224257cc5eeSBram Moolenaar try 225257cc5eeSBram Moolenaar call ThrowFromDef() 226257cc5eeSBram Moolenaar catch 227257cc5eeSBram Moolenaar let g:thrown_func = v:exception 228257cc5eeSBram Moolenaar endtry 229257cc5eeSBram Moolenaarendfunc 230257cc5eeSBram Moolenaar 231257cc5eeSBram Moolenaardef CatchInDef() 232257cc5eeSBram Moolenaar try 233257cc5eeSBram Moolenaar ThrowFromDef() 234257cc5eeSBram Moolenaar catch 235257cc5eeSBram Moolenaar g:thrown_def = v:exception 236257cc5eeSBram Moolenaar endtry 237257cc5eeSBram Moolenaarenddef 238257cc5eeSBram Moolenaar 239*f575adffSBram Moolenaardef ReturnFinally(): string 240*f575adffSBram Moolenaar try 241*f575adffSBram Moolenaar return 'intry' 242*f575adffSBram Moolenaar finally 243*f575adffSBram Moolenaar g:in_finally = 'finally' 244*f575adffSBram Moolenaar endtry 245*f575adffSBram Moolenaar return 'end' 246*f575adffSBram Moolenaarenddef 247*f575adffSBram Moolenaar 248257cc5eeSBram Moolenaardef Test_try_catch_nested() 249257cc5eeSBram Moolenaar CatchInFunc() 250257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 251257cc5eeSBram Moolenaar 252257cc5eeSBram Moolenaar CatchInDef() 253257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 254*f575adffSBram Moolenaar 255*f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 256*f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 257*f575adffSBram Moolenaarenddef 258*f575adffSBram Moolenaar 259*f575adffSBram Moolenaardef Test_try_catch_match() 260*f575adffSBram Moolenaar let seq = 'a' 261*f575adffSBram Moolenaar try 262*f575adffSBram Moolenaar throw 'something' 263*f575adffSBram Moolenaar catch /nothing/ 264*f575adffSBram Moolenaar seq ..= 'x' 265*f575adffSBram Moolenaar catch /some/ 266*f575adffSBram Moolenaar seq ..= 'b' 267*f575adffSBram Moolenaar catch /asdf/ 268*f575adffSBram Moolenaar seq ..= 'x' 269*f575adffSBram Moolenaar finally 270*f575adffSBram Moolenaar seq ..= 'c' 271*f575adffSBram Moolenaar endtry 272*f575adffSBram Moolenaar assert_equal('abc', seq) 273257cc5eeSBram Moolenaarenddef 274257cc5eeSBram Moolenaar 2758a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 2768a7d6542SBram Moolenaar vim9script 2778a7d6542SBram Moolenaar let name: string = 'bob' 2788a7d6542SBram Moolenaar def Concat(arg: string): string 2798a7d6542SBram Moolenaar return name .. arg 2808a7d6542SBram Moolenaar enddef 2818a7d6542SBram Moolenaar let g:result = Concat('bie') 2828a7d6542SBram Moolenaar let g:localname = name 2838a7d6542SBram Moolenaar 2848a7d6542SBram Moolenaar export const CONST = 1234 2858a7d6542SBram Moolenaar export let exported = 9876 2866e587dcbSBram Moolenaar export let exp_name = 'John' 2878a7d6542SBram Moolenaar export def Exported(): string 2888a7d6542SBram Moolenaar return 'Exported' 2898a7d6542SBram Moolenaar enddef 2908a7d6542SBram MoolenaarEND 2918a7d6542SBram Moolenaar 2928a7d6542SBram Moolenaardef Test_vim9script() 2938a7d6542SBram Moolenaar let import_script_lines =<< trim END 2948a7d6542SBram Moolenaar vim9script 2958a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 2968a7d6542SBram Moolenaar g:imported = exported 2976e587dcbSBram Moolenaar exported += 3 2986e587dcbSBram Moolenaar g:imported_added = exported 2998a7d6542SBram Moolenaar g:imported_func = Exported() 3006e587dcbSBram Moolenaar 3016e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3026e587dcbSBram Moolenaar g:imported_name = exp_name 3036e587dcbSBram Moolenaar exp_name ..= ' Doe' 3046e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3058a7d6542SBram Moolenaar END 3068a7d6542SBram Moolenaar 3078a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3088a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3098a7d6542SBram Moolenaar 3108a7d6542SBram Moolenaar source Ximport.vim 3118a7d6542SBram Moolenaar 3128a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3138a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3148a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3156e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 3168a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 3176e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 3186e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 3198a7d6542SBram Moolenaar assert_false(exists('g:name')) 3208a7d6542SBram Moolenaar 3218a7d6542SBram Moolenaar unlet g:result 3228a7d6542SBram Moolenaar unlet g:localname 3238a7d6542SBram Moolenaar unlet g:imported 3246e587dcbSBram Moolenaar unlet g:imported_added 3258a7d6542SBram Moolenaar unlet g:imported_func 3266e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 3278a7d6542SBram Moolenaar delete('Ximport.vim') 3288a7d6542SBram Moolenaar delete('Xexport.vim') 3298a7d6542SBram Moolenaar 3308a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 3318a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 3328a7d6542SBram Moolenaarenddef 3338a7d6542SBram Moolenaar 3348a7d6542SBram Moolenaardef Test_vim9script_call() 3358a7d6542SBram Moolenaar let lines =<< trim END 3368a7d6542SBram Moolenaar vim9script 3378a7d6542SBram Moolenaar let var = '' 3388a7d6542SBram Moolenaar def MyFunc(arg: string) 3398a7d6542SBram Moolenaar var = arg 3408a7d6542SBram Moolenaar enddef 3418a7d6542SBram Moolenaar MyFunc('foobar') 3428a7d6542SBram Moolenaar assert_equal('foobar', var) 3438a7d6542SBram Moolenaar 3448a7d6542SBram Moolenaar let str = 'barfoo' 3458a7d6542SBram Moolenaar str->MyFunc() 3468a7d6542SBram Moolenaar assert_equal('barfoo', var) 3478a7d6542SBram Moolenaar 3488a7d6542SBram Moolenaar let g:value = 'value' 3498a7d6542SBram Moolenaar g:value->MyFunc() 3508a7d6542SBram Moolenaar assert_equal('value', var) 3518a7d6542SBram Moolenaar 3528a7d6542SBram Moolenaar let listvar = [] 3538a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 3548a7d6542SBram Moolenaar listvar = arg 3558a7d6542SBram Moolenaar enddef 3568a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 3578a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 3588a7d6542SBram Moolenaar 3598a7d6542SBram Moolenaar let dictvar = {} 3608a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 3618a7d6542SBram Moolenaar dictvar = arg 3628a7d6542SBram Moolenaar enddef 3638a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 3648a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 3658a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 3668a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 3678a7d6542SBram Moolenaar END 3688a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 3698a7d6542SBram Moolenaar source Xcall.vim 3708a7d6542SBram Moolenaar delete('Xcall.vim') 3718a7d6542SBram Moolenaarenddef 3728a7d6542SBram Moolenaar 3738a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 3748a7d6542SBram Moolenaar let lines =<< trim END 3758a7d6542SBram Moolenaar vim9script 3768a7d6542SBram Moolenaar let var = '' 3778a7d6542SBram Moolenaar def MyFunc(arg: string) 3788a7d6542SBram Moolenaar let var = 123 3798a7d6542SBram Moolenaar enddef 3808a7d6542SBram Moolenaar END 3818a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 3828a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 3838a7d6542SBram Moolenaar delete('Xcall_decl.vim') 3848a7d6542SBram Moolenaarenddef 3858a7d6542SBram Moolenaar 3868a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 3878a7d6542SBram Moolenaar let lines =<< trim END 3888a7d6542SBram Moolenaar vim9script 3898a7d6542SBram Moolenaar const var = '' 3908a7d6542SBram Moolenaar def MyFunc(arg: string) 3918a7d6542SBram Moolenaar var = 'asdf' 3928a7d6542SBram Moolenaar enddef 3938a7d6542SBram Moolenaar END 3948a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 3958a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 3968a7d6542SBram Moolenaar delete('Xcall_const.vim') 3978a7d6542SBram Moolenaarenddef 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaardef Test_vim9script_reload() 4008a7d6542SBram Moolenaar let lines =<< trim END 4018a7d6542SBram Moolenaar vim9script 4028a7d6542SBram Moolenaar const var = '' 4038a7d6542SBram Moolenaar let valone = 1234 4048a7d6542SBram Moolenaar def MyFunc(arg: string) 4058a7d6542SBram Moolenaar valone = 5678 4068a7d6542SBram Moolenaar enddef 4078a7d6542SBram Moolenaar END 4088a7d6542SBram Moolenaar let morelines =<< trim END 4098a7d6542SBram Moolenaar let valtwo = 222 4108a7d6542SBram Moolenaar export def GetValtwo(): number 4118a7d6542SBram Moolenaar return valtwo 4128a7d6542SBram Moolenaar enddef 4138a7d6542SBram Moolenaar END 4148a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 4158a7d6542SBram Moolenaar source Xreload.vim 4168a7d6542SBram Moolenaar source Xreload.vim 4178a7d6542SBram Moolenaar source Xreload.vim 4188a7d6542SBram Moolenaar 4198a7d6542SBram Moolenaar let testlines =<< trim END 4208a7d6542SBram Moolenaar vim9script 4218a7d6542SBram Moolenaar def TheFunc() 4228a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 4238a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 4248a7d6542SBram Moolenaar enddef 4258a7d6542SBram Moolenaar TheFunc() 4268a7d6542SBram Moolenaar END 4278a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 4288a7d6542SBram Moolenaar source Ximport.vim 4298a7d6542SBram Moolenaar 4308a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 4318a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 4328a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 4338a7d6542SBram Moolenaar source Xreload.vim 4348a7d6542SBram Moolenaar source Ximport.vim 4358a7d6542SBram Moolenaar 4368a7d6542SBram Moolenaar " cannot declare a var twice 4378a7d6542SBram Moolenaar lines =<< trim END 4388a7d6542SBram Moolenaar vim9script 4398a7d6542SBram Moolenaar let valone = 1234 4408a7d6542SBram Moolenaar let valone = 5678 4418a7d6542SBram Moolenaar END 4428a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 4438a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 4448a7d6542SBram Moolenaar 4458a7d6542SBram Moolenaar delete('Xreload.vim') 4468a7d6542SBram Moolenaar delete('Ximport.vim') 4478a7d6542SBram Moolenaarenddef 4488a7d6542SBram Moolenaar 4498a7d6542SBram Moolenaardef Test_import_absolute() 4508a7d6542SBram Moolenaar let import_lines = [ 4518a7d6542SBram Moolenaar \ 'vim9script', 4528a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 453b283a8a6SBram Moolenaar \ 'def UseExported()', 4548a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 4554e12a5dfSBram Moolenaar \ ' exported = 8888', 4564e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 457b283a8a6SBram Moolenaar \ 'enddef', 458b283a8a6SBram Moolenaar \ 'UseExported()', 4594e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 4608a7d6542SBram Moolenaar \ ] 4618a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 4628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 4638a7d6542SBram Moolenaar 4648a7d6542SBram Moolenaar source Ximport_abs.vim 4658a7d6542SBram Moolenaar 4668a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 4674e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 468b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 469b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 470b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 4714e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 4724e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 4734e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 4744e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 4754e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 4764e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 4774e12a5dfSBram Moolenaar \, g:import_disassembled) 4788a7d6542SBram Moolenaar unlet g:imported_abs 4794e12a5dfSBram Moolenaar unlet g:import_disassembled 4808a7d6542SBram Moolenaar 4818a7d6542SBram Moolenaar delete('Ximport_abs.vim') 4828a7d6542SBram Moolenaar delete('Xexport_abs.vim') 4838a7d6542SBram Moolenaarenddef 4848a7d6542SBram Moolenaar 4858a7d6542SBram Moolenaardef Test_import_rtp() 4868a7d6542SBram Moolenaar let import_lines = [ 4878a7d6542SBram Moolenaar \ 'vim9script', 4888a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 4898a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 4908a7d6542SBram Moolenaar \ ] 4918a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 4928a7d6542SBram Moolenaar mkdir('import') 4938a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 4948a7d6542SBram Moolenaar 4958a7d6542SBram Moolenaar let save_rtp = &rtp 4968a7d6542SBram Moolenaar &rtp = getcwd() 4978a7d6542SBram Moolenaar source Ximport_rtp.vim 4988a7d6542SBram Moolenaar &rtp = save_rtp 4998a7d6542SBram Moolenaar 5008a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 5018a7d6542SBram Moolenaar unlet g:imported_rtp 5028a7d6542SBram Moolenaar 5038a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 5048a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 5058a7d6542SBram Moolenaar delete('import', 'd') 5068a7d6542SBram Moolenaarenddef 5078a7d6542SBram Moolenaar 5088a7d6542SBram Moolenaardef Test_fixed_size_list() 5098a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 5108a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 5118a7d6542SBram Moolenaar l->remove(0) 5128a7d6542SBram Moolenaar l->add(5) 5138a7d6542SBram Moolenaar l->insert(99, 1) 5140f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 5158a7d6542SBram Moolenaarenddef 5168a7d6542SBram Moolenaar 517673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 518673660abSBram Moolenaar" recognized. 519673660abSBram Moolenaarfunc Test_function_python() 520673660abSBram Moolenaar CheckFeature python3 521673660abSBram Moolenaar let py = 'python3' 522673660abSBram Moolenaar execute py "<< EOF" 523673660abSBram Moolenaardef do_something(): 524673660abSBram Moolenaar return 1 525673660abSBram MoolenaarEOF 526673660abSBram Moolenaarendfunc 527673660abSBram Moolenaar 528158906cfSBram Moolenaardef IfElse(what: number): string 529158906cfSBram Moolenaar let res = '' 530158906cfSBram Moolenaar if what == 1 531158906cfSBram Moolenaar res = "one" 532158906cfSBram Moolenaar elseif what == 2 533158906cfSBram Moolenaar res = "two" 534a259d8d3SBram Moolenaar else 535158906cfSBram Moolenaar res = "three" 536a259d8d3SBram Moolenaar endif 537158906cfSBram Moolenaar return res 538a259d8d3SBram Moolenaarenddef 539a259d8d3SBram Moolenaar 540158906cfSBram Moolenaardef Test_if_elseif_else() 541158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 542158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 543158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 5440f18b6d1SBram Moolenaarenddef 5450f18b6d1SBram Moolenaar 54663ce4849SBram Moolenaardef Test_delfunc() 54763ce4849SBram Moolenaar let lines =<< trim END 54863ce4849SBram Moolenaar vim9script 54963ce4849SBram Moolenaar def GoneSoon() 55063ce4849SBram Moolenaar echo 'hello' 55163ce4849SBram Moolenaar enddef 55263ce4849SBram Moolenaar 55363ce4849SBram Moolenaar def CallGoneSoon() 55463ce4849SBram Moolenaar GoneSoon() 55563ce4849SBram Moolenaar enddef 55663ce4849SBram Moolenaar 55763ce4849SBram Moolenaar delfunc GoneSoon 55863ce4849SBram Moolenaar CallGoneSoon() 55963ce4849SBram Moolenaar END 56063ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 56163ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 56263ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 56363ce4849SBram Moolenaar 56463ce4849SBram Moolenaar delete('XToDelFunc') 56563ce4849SBram Moolenaarenddef 56663ce4849SBram Moolenaar 5678a7d6542SBram Moolenaar 5688a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 569