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 326e587dcbSBram Moolenaar 338a7d6542SBram Moolenaardef Test_assignment() 348a7d6542SBram Moolenaar let bool1: bool = true 358a7d6542SBram Moolenaar assert_equal(v:true, bool1) 368a7d6542SBram Moolenaar let bool2: bool = false 378a7d6542SBram Moolenaar assert_equal(v:false, bool2) 388a7d6542SBram Moolenaar 398a7d6542SBram Moolenaar let list1: list<string> = ['sdf', 'asdf'] 408a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 418a7d6542SBram Moolenaar 428a7d6542SBram Moolenaar " TODO: does not work yet 438a7d6542SBram Moolenaar " let listS: list<string> = [] 448a7d6542SBram Moolenaar " let listN: list<number> = [] 458a7d6542SBram Moolenaar 468a7d6542SBram Moolenaar let dict1: dict<string> = #{key: 'value'} 478a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 48b283a8a6SBram Moolenaar 49b283a8a6SBram Moolenaar v:char = 'abc' 506e587dcbSBram Moolenaar assert_equal('abc', v:char) 51b283a8a6SBram Moolenaar 52b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 536e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 54b283a8a6SBram Moolenaar $ENVVAR = '' 556e587dcbSBram Moolenaar 566e587dcbSBram Moolenaar appendToMe ..= 'yyy' 576e587dcbSBram Moolenaar assert_equal('xxxyyy', appendToMe) 586e587dcbSBram Moolenaar addToMe += 222 596e587dcbSBram Moolenaar assert_equal(333, addToMe) 608a7d6542SBram Moolenaarenddef 618a7d6542SBram Moolenaar 628a7d6542SBram Moolenaarfunc Test_assignment_failure() 638a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 648a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 658a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 668a7d6542SBram Moolenaar 678a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 688a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 698a7d6542SBram Moolenaar 708a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 718a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 728a7d6542SBram Moolenaar 738a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 748a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 758a7d6542SBram Moolenaar 768a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 778a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 788a7d6542SBram Moolenaarendfunc 798a7d6542SBram Moolenaar 808a7d6542SBram Moolenaarfunc Test_const() 818a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 828a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 838a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 848a7d6542SBram Moolenaarendfunc 858a7d6542SBram Moolenaar 868a7d6542SBram Moolenaardef Test_block() 878a7d6542SBram Moolenaar let outer = 1 888a7d6542SBram Moolenaar { 898a7d6542SBram Moolenaar let inner = 2 908a7d6542SBram Moolenaar assert_equal(1, outer) 918a7d6542SBram Moolenaar assert_equal(2, inner) 928a7d6542SBram Moolenaar } 938a7d6542SBram Moolenaar assert_equal(1, outer) 948a7d6542SBram Moolenaarenddef 958a7d6542SBram Moolenaar 968a7d6542SBram Moolenaarfunc Test_block_failure() 978a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 988a7d6542SBram Moolenaarendfunc 998a7d6542SBram Moolenaar 1008a7d6542SBram Moolenaardef ReturnString(): string 1018a7d6542SBram Moolenaar return 'string' 1028a7d6542SBram Moolenaarenddef 1038a7d6542SBram Moolenaar 1048a7d6542SBram Moolenaardef ReturnNumber(): number 1058a7d6542SBram Moolenaar return 123 1068a7d6542SBram Moolenaarenddef 1078a7d6542SBram Moolenaar 1088a7d6542SBram Moolenaardef Test_return_string() 1098a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1108a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 1118a7d6542SBram Moolenaarenddef 1128a7d6542SBram Moolenaar 1138a7d6542SBram Moolenaarfunc Increment() 1148a7d6542SBram Moolenaar let g:counter += 1 1158a7d6542SBram Moolenaarendfunc 1168a7d6542SBram Moolenaar 1178a7d6542SBram Moolenaardef Test_call_ufunc_count() 1188a7d6542SBram Moolenaar g:counter = 1 1198a7d6542SBram Moolenaar Increment() 1208a7d6542SBram Moolenaar Increment() 1218a7d6542SBram Moolenaar Increment() 1228a7d6542SBram Moolenaar " works with and without :call 1238a7d6542SBram Moolenaar assert_equal(4, g:counter) 124b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1258a7d6542SBram Moolenaar unlet g:counter 1268a7d6542SBram Moolenaarenddef 1278a7d6542SBram Moolenaar 1288a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1298a7d6542SBram Moolenaar let res = arg 1308a7d6542SBram Moolenaar for s in rest 1318a7d6542SBram Moolenaar res ..= ',' .. s 1328a7d6542SBram Moolenaar endfor 1338a7d6542SBram Moolenaar return res 1348a7d6542SBram Moolenaarenddef 1358a7d6542SBram Moolenaar 1368a7d6542SBram Moolenaardef Test_call_varargs() 1378a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1388a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1398a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1408a7d6542SBram Moolenaarenddef 1418a7d6542SBram Moolenaar 142*170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 143*170fcfcfSBram Moolenaar return name 144*170fcfcfSBram Moolenaarenddef 145*170fcfcfSBram Moolenaar 146*170fcfcfSBram Moolenaardef Test_call_default_args() 147*170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 148*170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 149*170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 150*170fcfcfSBram Moolenaarenddef 151*170fcfcfSBram Moolenaar 152*170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 153*170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 154*170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 155*170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 156*170fcfcfSBram Moolenaarendfunc 157*170fcfcfSBram Moolenaar 158*170fcfcfSBram Moolenaar" Default arg and varargs 159*170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 160*170fcfcfSBram Moolenaar let res = one .. ',' .. two 161*170fcfcfSBram Moolenaar for s in rest 162*170fcfcfSBram Moolenaar res ..= ',' .. s 163*170fcfcfSBram Moolenaar endfor 164*170fcfcfSBram Moolenaar return res 165*170fcfcfSBram Moolenaarenddef 166*170fcfcfSBram Moolenaar 167*170fcfcfSBram Moolenaardef Test_call_def_varargs() 168*170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 169*170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 170*170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 171*170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 172*170fcfcfSBram Moolenaarenddef 173*170fcfcfSBram Moolenaar 174*170fcfcfSBram Moolenaar 17526e117e9SBram Moolenaar"def Test_call_func_defined_later() 17626e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 17726e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 17826e117e9SBram Moolenaar"enddef 17926e117e9SBram Moolenaar 18026e117e9SBram Moolenaarfunc DefineLater(arg) 18126e117e9SBram Moolenaar return a:arg 18226e117e9SBram Moolenaarendfunc 18326e117e9SBram Moolenaar 1848a7d6542SBram Moolenaardef Test_return_type_wrong() 185978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 186978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 187978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 188978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1898a7d6542SBram Moolenaarenddef 1908a7d6542SBram Moolenaar 191bfe12043SBram Moolenaardef Test_arg_type_wrong() 192bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 193bfe12043SBram Moolenaarenddef 194bfe12043SBram Moolenaar 1958a7d6542SBram Moolenaardef Test_try_catch() 1968a7d6542SBram Moolenaar let l = [] 1978a7d6542SBram Moolenaar try 1988a7d6542SBram Moolenaar add(l, '1') 1998a7d6542SBram Moolenaar throw 'wrong' 2008a7d6542SBram Moolenaar add(l, '2') 2018a7d6542SBram Moolenaar catch 2028a7d6542SBram Moolenaar add(l, v:exception) 2038a7d6542SBram Moolenaar finally 2048a7d6542SBram Moolenaar add(l, '3') 2058a7d6542SBram Moolenaar endtry 2068a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2078a7d6542SBram Moolenaarenddef 2088a7d6542SBram Moolenaar 2098a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 2108a7d6542SBram Moolenaar vim9script 2118a7d6542SBram Moolenaar let name: string = 'bob' 2128a7d6542SBram Moolenaar def Concat(arg: string): string 2138a7d6542SBram Moolenaar return name .. arg 2148a7d6542SBram Moolenaar enddef 2158a7d6542SBram Moolenaar let g:result = Concat('bie') 2168a7d6542SBram Moolenaar let g:localname = name 2178a7d6542SBram Moolenaar 2188a7d6542SBram Moolenaar export const CONST = 1234 2198a7d6542SBram Moolenaar export let exported = 9876 2206e587dcbSBram Moolenaar export let exp_name = 'John' 2218a7d6542SBram Moolenaar export def Exported(): string 2228a7d6542SBram Moolenaar return 'Exported' 2238a7d6542SBram Moolenaar enddef 2248a7d6542SBram MoolenaarEND 2258a7d6542SBram Moolenaar 2268a7d6542SBram Moolenaardef Test_vim9script() 2278a7d6542SBram Moolenaar let import_script_lines =<< trim END 2288a7d6542SBram Moolenaar vim9script 2298a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 2308a7d6542SBram Moolenaar g:imported = exported 2316e587dcbSBram Moolenaar exported += 3 2326e587dcbSBram Moolenaar g:imported_added = exported 2338a7d6542SBram Moolenaar g:imported_func = Exported() 2346e587dcbSBram Moolenaar 2356e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 2366e587dcbSBram Moolenaar g:imported_name = exp_name 2376e587dcbSBram Moolenaar exp_name ..= ' Doe' 2386e587dcbSBram Moolenaar g:imported_name_appended = exp_name 2398a7d6542SBram Moolenaar END 2408a7d6542SBram Moolenaar 2418a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 2428a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 2438a7d6542SBram Moolenaar 2448a7d6542SBram Moolenaar source Ximport.vim 2458a7d6542SBram Moolenaar 2468a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 2478a7d6542SBram Moolenaar assert_equal('bob', g:localname) 2488a7d6542SBram Moolenaar assert_equal(9876, g:imported) 2496e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 2508a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 2516e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 2526e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 2538a7d6542SBram Moolenaar assert_false(exists('g:name')) 2548a7d6542SBram Moolenaar 2558a7d6542SBram Moolenaar unlet g:result 2568a7d6542SBram Moolenaar unlet g:localname 2578a7d6542SBram Moolenaar unlet g:imported 2586e587dcbSBram Moolenaar unlet g:imported_added 2598a7d6542SBram Moolenaar unlet g:imported_func 2606e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 2618a7d6542SBram Moolenaar delete('Ximport.vim') 2628a7d6542SBram Moolenaar delete('Xexport.vim') 2638a7d6542SBram Moolenaar 2648a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 2658a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 2668a7d6542SBram Moolenaarenddef 2678a7d6542SBram Moolenaar 2688a7d6542SBram Moolenaardef Test_vim9script_call() 2698a7d6542SBram Moolenaar let lines =<< trim END 2708a7d6542SBram Moolenaar vim9script 2718a7d6542SBram Moolenaar let var = '' 2728a7d6542SBram Moolenaar def MyFunc(arg: string) 2738a7d6542SBram Moolenaar var = arg 2748a7d6542SBram Moolenaar enddef 2758a7d6542SBram Moolenaar MyFunc('foobar') 2768a7d6542SBram Moolenaar assert_equal('foobar', var) 2778a7d6542SBram Moolenaar 2788a7d6542SBram Moolenaar let str = 'barfoo' 2798a7d6542SBram Moolenaar str->MyFunc() 2808a7d6542SBram Moolenaar assert_equal('barfoo', var) 2818a7d6542SBram Moolenaar 2828a7d6542SBram Moolenaar let g:value = 'value' 2838a7d6542SBram Moolenaar g:value->MyFunc() 2848a7d6542SBram Moolenaar assert_equal('value', var) 2858a7d6542SBram Moolenaar 2868a7d6542SBram Moolenaar let listvar = [] 2878a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2888a7d6542SBram Moolenaar listvar = arg 2898a7d6542SBram Moolenaar enddef 2908a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2918a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2928a7d6542SBram Moolenaar 2938a7d6542SBram Moolenaar let dictvar = {} 2948a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2958a7d6542SBram Moolenaar dictvar = arg 2968a7d6542SBram Moolenaar enddef 2978a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2988a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2998a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 3008a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 3018a7d6542SBram Moolenaar END 3028a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 3038a7d6542SBram Moolenaar source Xcall.vim 3048a7d6542SBram Moolenaar delete('Xcall.vim') 3058a7d6542SBram Moolenaarenddef 3068a7d6542SBram Moolenaar 3078a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 3088a7d6542SBram Moolenaar let lines =<< trim END 3098a7d6542SBram Moolenaar vim9script 3108a7d6542SBram Moolenaar let var = '' 3118a7d6542SBram Moolenaar def MyFunc(arg: string) 3128a7d6542SBram Moolenaar let var = 123 3138a7d6542SBram Moolenaar enddef 3148a7d6542SBram Moolenaar END 3158a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 3168a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 3178a7d6542SBram Moolenaar delete('Xcall_decl.vim') 3188a7d6542SBram Moolenaarenddef 3198a7d6542SBram Moolenaar 3208a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 3218a7d6542SBram Moolenaar let lines =<< trim END 3228a7d6542SBram Moolenaar vim9script 3238a7d6542SBram Moolenaar const var = '' 3248a7d6542SBram Moolenaar def MyFunc(arg: string) 3258a7d6542SBram Moolenaar var = 'asdf' 3268a7d6542SBram Moolenaar enddef 3278a7d6542SBram Moolenaar END 3288a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 3298a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 3308a7d6542SBram Moolenaar delete('Xcall_const.vim') 3318a7d6542SBram Moolenaarenddef 3328a7d6542SBram Moolenaar 3338a7d6542SBram Moolenaardef Test_vim9script_reload() 3348a7d6542SBram Moolenaar let lines =<< trim END 3358a7d6542SBram Moolenaar vim9script 3368a7d6542SBram Moolenaar const var = '' 3378a7d6542SBram Moolenaar let valone = 1234 3388a7d6542SBram Moolenaar def MyFunc(arg: string) 3398a7d6542SBram Moolenaar valone = 5678 3408a7d6542SBram Moolenaar enddef 3418a7d6542SBram Moolenaar END 3428a7d6542SBram Moolenaar let morelines =<< trim END 3438a7d6542SBram Moolenaar let valtwo = 222 3448a7d6542SBram Moolenaar export def GetValtwo(): number 3458a7d6542SBram Moolenaar return valtwo 3468a7d6542SBram Moolenaar enddef 3478a7d6542SBram Moolenaar END 3488a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 3498a7d6542SBram Moolenaar source Xreload.vim 3508a7d6542SBram Moolenaar source Xreload.vim 3518a7d6542SBram Moolenaar source Xreload.vim 3528a7d6542SBram Moolenaar 3538a7d6542SBram Moolenaar let testlines =<< trim END 3548a7d6542SBram Moolenaar vim9script 3558a7d6542SBram Moolenaar def TheFunc() 3568a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 3578a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 3588a7d6542SBram Moolenaar enddef 3598a7d6542SBram Moolenaar TheFunc() 3608a7d6542SBram Moolenaar END 3618a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 3628a7d6542SBram Moolenaar source Ximport.vim 3638a7d6542SBram Moolenaar 3648a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 3658a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 3668a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3678a7d6542SBram Moolenaar source Xreload.vim 3688a7d6542SBram Moolenaar source Ximport.vim 3698a7d6542SBram Moolenaar 3708a7d6542SBram Moolenaar " cannot declare a var twice 3718a7d6542SBram Moolenaar lines =<< trim END 3728a7d6542SBram Moolenaar vim9script 3738a7d6542SBram Moolenaar let valone = 1234 3748a7d6542SBram Moolenaar let valone = 5678 3758a7d6542SBram Moolenaar END 3768a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3778a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3788a7d6542SBram Moolenaar 3798a7d6542SBram Moolenaar delete('Xreload.vim') 3808a7d6542SBram Moolenaar delete('Ximport.vim') 3818a7d6542SBram Moolenaarenddef 3828a7d6542SBram Moolenaar 3838a7d6542SBram Moolenaardef Test_import_absolute() 3848a7d6542SBram Moolenaar let import_lines = [ 3858a7d6542SBram Moolenaar \ 'vim9script', 3868a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 387b283a8a6SBram Moolenaar \ 'def UseExported()', 3888a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 3894e12a5dfSBram Moolenaar \ ' exported = 8888', 3904e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 391b283a8a6SBram Moolenaar \ 'enddef', 392b283a8a6SBram Moolenaar \ 'UseExported()', 3934e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 3948a7d6542SBram Moolenaar \ ] 3958a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3968a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3978a7d6542SBram Moolenaar 3988a7d6542SBram Moolenaar source Ximport_abs.vim 3998a7d6542SBram Moolenaar 4008a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 4014e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 402b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 403b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 404b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 4054e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 4064e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 4074e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 4084e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 4094e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 4104e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 4114e12a5dfSBram Moolenaar \, g:import_disassembled) 4128a7d6542SBram Moolenaar unlet g:imported_abs 4134e12a5dfSBram Moolenaar unlet g:import_disassembled 4148a7d6542SBram Moolenaar 4158a7d6542SBram Moolenaar delete('Ximport_abs.vim') 4168a7d6542SBram Moolenaar delete('Xexport_abs.vim') 4178a7d6542SBram Moolenaarenddef 4188a7d6542SBram Moolenaar 4198a7d6542SBram Moolenaardef Test_import_rtp() 4208a7d6542SBram Moolenaar let import_lines = [ 4218a7d6542SBram Moolenaar \ 'vim9script', 4228a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 4238a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 4248a7d6542SBram Moolenaar \ ] 4258a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 4268a7d6542SBram Moolenaar mkdir('import') 4278a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 4288a7d6542SBram Moolenaar 4298a7d6542SBram Moolenaar let save_rtp = &rtp 4308a7d6542SBram Moolenaar &rtp = getcwd() 4318a7d6542SBram Moolenaar source Ximport_rtp.vim 4328a7d6542SBram Moolenaar &rtp = save_rtp 4338a7d6542SBram Moolenaar 4348a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 4358a7d6542SBram Moolenaar unlet g:imported_rtp 4368a7d6542SBram Moolenaar 4378a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 4388a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 4398a7d6542SBram Moolenaar delete('import', 'd') 4408a7d6542SBram Moolenaarenddef 4418a7d6542SBram Moolenaar 4428a7d6542SBram Moolenaardef Test_fixed_size_list() 4438a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 4448a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 4458a7d6542SBram Moolenaar l->remove(0) 4468a7d6542SBram Moolenaar l->add(5) 4478a7d6542SBram Moolenaar l->insert(99, 1) 4480f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 4498a7d6542SBram Moolenaarenddef 4508a7d6542SBram Moolenaar 451673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 452673660abSBram Moolenaar" recognized. 453673660abSBram Moolenaarfunc Test_function_python() 454673660abSBram Moolenaar CheckFeature python3 455673660abSBram Moolenaar let py = 'python3' 456673660abSBram Moolenaar execute py "<< EOF" 457673660abSBram Moolenaardef do_something(): 458673660abSBram Moolenaar return 1 459673660abSBram MoolenaarEOF 460673660abSBram Moolenaarendfunc 461673660abSBram Moolenaar 462a259d8d3SBram Moolenaardef HasEval() 463a259d8d3SBram Moolenaar if has('eval') 464a259d8d3SBram Moolenaar echo 'yes' 465a259d8d3SBram Moolenaar else 466a259d8d3SBram Moolenaar echo 'no' 467a259d8d3SBram Moolenaar endif 468a259d8d3SBram Moolenaarenddef 469a259d8d3SBram Moolenaar 470a259d8d3SBram Moolenaardef HasNothing() 471a259d8d3SBram Moolenaar if has('nothing') 472a259d8d3SBram Moolenaar echo 'yes' 473a259d8d3SBram Moolenaar else 474a259d8d3SBram Moolenaar echo 'no' 475a259d8d3SBram Moolenaar endif 476a259d8d3SBram Moolenaarenddef 477a259d8d3SBram Moolenaar 478a259d8d3SBram Moolenaardef Test_compile_const_expr() 479a259d8d3SBram Moolenaar assert_equal("\nyes", execute('call HasEval()')) 480a259d8d3SBram Moolenaar let instr = execute('disassemble HasEval') 4810f18b6d1SBram Moolenaar assert_match('PUSHS "yes"', instr) 4820f18b6d1SBram Moolenaar assert_notmatch('PUSHS "no"', instr) 4830f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 484a259d8d3SBram Moolenaar 485a259d8d3SBram Moolenaar assert_equal("\nno", execute('call HasNothing()')) 486a259d8d3SBram Moolenaar instr = execute('disassemble HasNothing') 4870f18b6d1SBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 4880f18b6d1SBram Moolenaar assert_match('PUSHS "no"', instr) 4890f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 4900f18b6d1SBram Moolenaarenddef 4910f18b6d1SBram Moolenaar 4920f18b6d1SBram Moolenaarfunc NotCompiled() 4930f18b6d1SBram Moolenaar echo "not" 4940f18b6d1SBram Moolenaarendfunc 4950f18b6d1SBram Moolenaar 4960f18b6d1SBram Moolenaarlet s:scriptvar = 4 4970f18b6d1SBram Moolenaarlet g:globalvar = 'g' 4980f18b6d1SBram Moolenaar 499b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string) 5000f18b6d1SBram Moolenaar let local = 1 5010f18b6d1SBram Moolenaar buffers 5020f18b6d1SBram Moolenaar echo arg 5030f18b6d1SBram Moolenaar echo local 5040f18b6d1SBram Moolenaar echo v:version 5050f18b6d1SBram Moolenaar echo s:scriptvar 5060f18b6d1SBram Moolenaar echo g:globalvar 5070f18b6d1SBram Moolenaar echo &tabstop 5080f18b6d1SBram Moolenaar echo $ENVVAR 5090f18b6d1SBram Moolenaar echo @z 5100f18b6d1SBram Moolenaarenddef 5110f18b6d1SBram Moolenaar 5120de50864SBram Moolenaardef Test_disassembleLoad() 5130de50864SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 5140de50864SBram Moolenaar assert_fails('disass NotCompiled', 'E1062:') 5150de50864SBram Moolenaar 5160de50864SBram Moolenaar let res = execute('disass s:ScriptFuncLoad') 5170de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' 5180de50864SBram Moolenaar \ .. 'buffers.*' 5190de50864SBram Moolenaar \ .. ' EXEC \+buffers.*' 5200de50864SBram Moolenaar \ .. ' LOAD arg\[-1\].*' 5210de50864SBram Moolenaar \ .. ' LOAD $0.*' 5220de50864SBram Moolenaar \ .. ' LOADV v:version.*' 5230de50864SBram Moolenaar \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' 5240de50864SBram Moolenaar \ .. ' LOADG g:globalvar.*' 5250de50864SBram Moolenaar \ .. ' LOADENV $ENVVAR.*' 5260de50864SBram Moolenaar \ .. ' LOADREG @z.*' 5270de50864SBram Moolenaar \, res) 5280de50864SBram Moolenaarenddef 5290de50864SBram Moolenaar 530ff80cb68SBram Moolenaardef s:ScriptFuncPush() 531ff80cb68SBram Moolenaar let localbool = true 532ff80cb68SBram Moolenaar let localspec = v:none 533ff80cb68SBram Moolenaar let localblob = 0z1234 534ff80cb68SBram Moolenaar if has('float') 535ff80cb68SBram Moolenaar let localfloat = 1.234 536ff80cb68SBram Moolenaar endif 537ff80cb68SBram Moolenaarenddef 538ff80cb68SBram Moolenaar 5390de50864SBram Moolenaardef Test_disassemblePush() 5400de50864SBram Moolenaar let res = execute('disass s:ScriptFuncPush') 5410de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 5420de50864SBram Moolenaar \ .. 'localbool = true.*' 5430de50864SBram Moolenaar \ .. ' PUSH v:true.*' 5440de50864SBram Moolenaar \ .. 'localspec = v:none.*' 5450de50864SBram Moolenaar \ .. ' PUSH v:none.*' 5460de50864SBram Moolenaar \ .. 'localblob = 0z1234.*' 5470de50864SBram Moolenaar \ .. ' PUSHBLOB 0z1234.*' 5480de50864SBram Moolenaar \, res) 5490de50864SBram Moolenaar if has('float') 5500de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 5510de50864SBram Moolenaar \ .. 'localfloat = 1.234.*' 5520de50864SBram Moolenaar \ .. ' PUSHF 1.234.*' 5530de50864SBram Moolenaar \, res) 5540de50864SBram Moolenaar endif 5550de50864SBram Moolenaarenddef 5560de50864SBram Moolenaar 557b283a8a6SBram Moolenaardef s:ScriptFuncStore() 558b283a8a6SBram Moolenaar let localnr = 1 559b283a8a6SBram Moolenaar localnr = 2 560b283a8a6SBram Moolenaar let localstr = 'abc' 561b283a8a6SBram Moolenaar localstr = 'xyz' 562b283a8a6SBram Moolenaar v:char = 'abc' 563b283a8a6SBram Moolenaar s:scriptvar = 'sv' 564b283a8a6SBram Moolenaar g:globalvar = 'gv' 565b283a8a6SBram Moolenaar &tabstop = 8 566b283a8a6SBram Moolenaar $ENVVAR = 'ev' 567b283a8a6SBram Moolenaar @z = 'rv' 568b283a8a6SBram Moolenaarenddef 569b283a8a6SBram Moolenaar 5700de50864SBram Moolenaardef Test_disassembleStore() 5710de50864SBram Moolenaar let res = execute('disass s:ScriptFuncStore') 572b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' 573b283a8a6SBram Moolenaar \ .. 'localnr = 2.*' 574b283a8a6SBram Moolenaar \ .. ' STORE 2 in $0.*' 575b283a8a6SBram Moolenaar \ .. 'localstr = ''xyz''.*' 576b283a8a6SBram Moolenaar \ .. ' STORE $1.*' 577b283a8a6SBram Moolenaar \ .. 'v:char = ''abc''.*' 578b283a8a6SBram Moolenaar \ .. 'STOREV v:char.*' 579b283a8a6SBram Moolenaar \ .. 's:scriptvar = ''sv''.*' 580b283a8a6SBram Moolenaar \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*' 581b283a8a6SBram Moolenaar \ .. 'g:globalvar = ''gv''.*' 582b283a8a6SBram Moolenaar \ .. ' STOREG g:globalvar.*' 583b283a8a6SBram Moolenaar \ .. '&tabstop = 8.*' 584b283a8a6SBram Moolenaar \ .. ' STOREOPT &tabstop.*' 585b283a8a6SBram Moolenaar \ .. '$ENVVAR = ''ev''.*' 586b283a8a6SBram Moolenaar \ .. ' STOREENV $ENVVAR.*' 587b283a8a6SBram Moolenaar \ .. '@z = ''rv''.*' 588b283a8a6SBram Moolenaar \ .. ' STOREREG @z.*' 589b283a8a6SBram Moolenaar \, res) 5900de50864SBram Moolenaarenddef 591ff80cb68SBram Moolenaar 5920de50864SBram Moolenaardef s:ScriptFuncTry() 5930de50864SBram Moolenaar try 5940de50864SBram Moolenaar echo 'yes' 5950de50864SBram Moolenaar catch /fail/ 5960de50864SBram Moolenaar echo 'no' 5970de50864SBram Moolenaar finally 5980de50864SBram Moolenaar echo 'end' 5990de50864SBram Moolenaar endtry 6000de50864SBram Moolenaarenddef 6010de50864SBram Moolenaar 6020de50864SBram Moolenaardef Test_disassembleTry() 6030de50864SBram Moolenaar let res = execute('disass s:ScriptFuncTry') 604ff80cb68SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncTry.*' 605ff80cb68SBram Moolenaar \ .. 'try.*' 606ff80cb68SBram Moolenaar \ .. 'TRY catch -> \d\+, finally -> \d\+.*' 607ff80cb68SBram Moolenaar \ .. 'catch /fail/.*' 608ff80cb68SBram Moolenaar \ .. ' JUMP -> \d\+.*' 609ff80cb68SBram Moolenaar \ .. ' PUSH v:exception.*' 610ff80cb68SBram Moolenaar \ .. ' PUSHS "fail".*' 611ff80cb68SBram Moolenaar \ .. ' COMPARESTRING =\~.*' 612ff80cb68SBram Moolenaar \ .. ' JUMP_IF_FALSE -> \d\+.*' 613ff80cb68SBram Moolenaar \ .. ' CATCH.*' 614ff80cb68SBram Moolenaar \ .. 'finally.*' 615ff80cb68SBram Moolenaar \ .. ' PUSHS "end".*' 616ff80cb68SBram Moolenaar \ .. 'endtry.*' 617ff80cb68SBram Moolenaar \ .. ' ENDTRY.*' 618ff80cb68SBram Moolenaar \, res) 619a259d8d3SBram Moolenaarenddef 620a259d8d3SBram Moolenaar 6210de50864SBram Moolenaardef s:ScriptFuncNew() 6220de50864SBram Moolenaar let ll = [1, "two", 333] 6230de50864SBram Moolenaar let dd = #{one: 1, two: "val"} 6240de50864SBram Moolenaarenddef 6250de50864SBram Moolenaar 6260de50864SBram Moolenaardef Test_disassembleNew() 6270de50864SBram Moolenaar let res = execute('disass s:ScriptFuncNew') 6280de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncNew.*' 6290de50864SBram Moolenaar \ .. 'let ll = \[1, "two", 333].*' 6300de50864SBram Moolenaar \ .. 'PUSHNR 1.*' 6310de50864SBram Moolenaar \ .. 'PUSHS "two".*' 6320de50864SBram Moolenaar \ .. 'PUSHNR 333.*' 6330de50864SBram Moolenaar \ .. 'NEWLIST size 3.*' 6340de50864SBram Moolenaar \ .. 'let dd = #{one: 1, two: "val"}.*' 6350de50864SBram Moolenaar \ .. 'PUSHS "one".*' 6360de50864SBram Moolenaar \ .. 'PUSHNR 1.*' 6370de50864SBram Moolenaar \ .. 'PUSHS "two".*' 6380de50864SBram Moolenaar \ .. 'PUSHS "val".*' 6390de50864SBram Moolenaar \ .. 'NEWDICT size 2.*' 6400de50864SBram Moolenaar \, res) 6410de50864SBram Moolenaarenddef 6420de50864SBram Moolenaar 6430de50864SBram Moolenaardef FuncWithArg(arg) 6440de50864SBram Moolenaar echo arg 6450de50864SBram Moolenaarenddef 6460de50864SBram Moolenaar 6470de50864SBram Moolenaarfunc UserFunc() 6480de50864SBram Moolenaar echo 'nothing' 6490de50864SBram Moolenaarendfunc 6500de50864SBram Moolenaar 6510de50864SBram Moolenaarfunc UserFuncWithArg(arg) 6520de50864SBram Moolenaar echo a:arg 6530de50864SBram Moolenaarendfunc 6540de50864SBram Moolenaar 6550de50864SBram Moolenaardef s:ScriptFuncCall(): string 6560de50864SBram Moolenaar changenr() 6570de50864SBram Moolenaar char2nr("abc") 6580de50864SBram Moolenaar Test_disassembleNew() 6590de50864SBram Moolenaar FuncWithArg(343) 6600de50864SBram Moolenaar UserFunc() 6610de50864SBram Moolenaar UserFuncWithArg("foo") 6620de50864SBram Moolenaar let FuncRef = function("UserFunc") 6630de50864SBram Moolenaar FuncRef() 6640de50864SBram Moolenaar let FuncRefWithArg = function("UserFuncWithArg") 6650de50864SBram Moolenaar FuncRefWithArg("bar") 6660de50864SBram Moolenaar return "yes" 6670de50864SBram Moolenaarenddef 6680de50864SBram Moolenaar 6690de50864SBram Moolenaardef Test_disassembleCall() 6700de50864SBram Moolenaar let res = execute('disass s:ScriptFuncCall') 6710de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncCall.*' 6720de50864SBram Moolenaar \ .. 'changenr().*' 6730de50864SBram Moolenaar \ .. ' BCALL changenr(argc 0).*' 6740de50864SBram Moolenaar \ .. 'char2nr("abc").*' 6750de50864SBram Moolenaar \ .. ' PUSHS "abc".*' 6760de50864SBram Moolenaar \ .. ' BCALL char2nr(argc 1).*' 6770de50864SBram Moolenaar \ .. 'Test_disassembleNew().*' 6780de50864SBram Moolenaar \ .. ' DCALL Test_disassembleNew(argc 0).*' 6790de50864SBram Moolenaar \ .. 'FuncWithArg(343).*' 6800de50864SBram Moolenaar \ .. ' PUSHNR 343.*' 6810de50864SBram Moolenaar \ .. ' DCALL FuncWithArg(argc 1).*' 6820de50864SBram Moolenaar \ .. 'UserFunc().*' 6830de50864SBram Moolenaar \ .. ' UCALL UserFunc(argc 0).*' 6840de50864SBram Moolenaar \ .. 'UserFuncWithArg("foo").*' 6850de50864SBram Moolenaar \ .. ' PUSHS "foo".*' 6860de50864SBram Moolenaar \ .. ' UCALL UserFuncWithArg(argc 1).*' 6870de50864SBram Moolenaar \ .. 'let FuncRef = function("UserFunc").*' 6880de50864SBram Moolenaar \ .. 'FuncRef().*' 6890de50864SBram Moolenaar \ .. ' LOAD $\d.*' 6900de50864SBram Moolenaar \ .. ' PCALL (argc 0).*' 6910de50864SBram Moolenaar \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*' 6920de50864SBram Moolenaar \ .. 'FuncRefWithArg("bar").*' 6930de50864SBram Moolenaar \ .. ' PUSHS "bar".*' 6940de50864SBram Moolenaar \ .. ' LOAD $\d.*' 6950de50864SBram Moolenaar \ .. ' PCALL (argc 1).*' 6960de50864SBram Moolenaar \ .. 'return "yes".*' 6970de50864SBram Moolenaar \ .. ' PUSHS "yes".*' 6980de50864SBram Moolenaar \ .. ' RETURN.*' 6990de50864SBram Moolenaar \, res) 7000de50864SBram Moolenaarenddef 7010de50864SBram Moolenaar 7028a7d6542SBram Moolenaar 7038a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 704