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 30*6e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 31*6e587dcbSBram Moolenaarlet s:addToMe = 111 32*6e587dcbSBram 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' 50*6e587dcbSBram Moolenaar assert_equal('abc', v:char) 51b283a8a6SBram Moolenaar 52b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 53*6e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 54b283a8a6SBram Moolenaar $ENVVAR = '' 55*6e587dcbSBram Moolenaar 56*6e587dcbSBram Moolenaar appendToMe ..= 'yyy' 57*6e587dcbSBram Moolenaar assert_equal('xxxyyy', appendToMe) 58*6e587dcbSBram Moolenaar addToMe += 222 59*6e587dcbSBram 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 14226e117e9SBram Moolenaar"def Test_call_func_defined_later() 14326e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 14426e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 14526e117e9SBram Moolenaar"enddef 14626e117e9SBram Moolenaar 14726e117e9SBram Moolenaarfunc DefineLater(arg) 14826e117e9SBram Moolenaar return a:arg 14926e117e9SBram Moolenaarendfunc 15026e117e9SBram Moolenaar 15126e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string 15226e117e9SBram Moolenaar return name 15326e117e9SBram Moolenaarenddef 15426e117e9SBram Moolenaar 15526e117e9SBram Moolenaarfunc Test_call_default_args_from_func() 15626e117e9SBram Moolenaar " TODO: implement using default value for optional argument 15726e117e9SBram Moolenaar "call assert_equal('string', MyDefaultArgs()) 15826e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet') 15926e117e9SBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 16026e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 16126e117e9SBram Moolenaarendfunc 16226e117e9SBram Moolenaar 16326e117e9SBram Moolenaardef Test_call_default_args() 16426e117e9SBram Moolenaar " TODO: implement using default value for optional argument 16526e117e9SBram Moolenaar "assert_equal('string', MyDefaultArgs()) 16626e117e9SBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 16726e117e9SBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 16826e117e9SBram Moolenaarenddef 16926e117e9SBram Moolenaar 1708a7d6542SBram Moolenaardef Test_return_type_wrong() 171978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 172978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 173978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 174978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1758a7d6542SBram Moolenaarenddef 1768a7d6542SBram Moolenaar 177bfe12043SBram Moolenaardef Test_arg_type_wrong() 178bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 179bfe12043SBram Moolenaarenddef 180bfe12043SBram Moolenaar 1818a7d6542SBram Moolenaardef Test_try_catch() 1828a7d6542SBram Moolenaar let l = [] 1838a7d6542SBram Moolenaar try 1848a7d6542SBram Moolenaar add(l, '1') 1858a7d6542SBram Moolenaar throw 'wrong' 1868a7d6542SBram Moolenaar add(l, '2') 1878a7d6542SBram Moolenaar catch 1888a7d6542SBram Moolenaar add(l, v:exception) 1898a7d6542SBram Moolenaar finally 1908a7d6542SBram Moolenaar add(l, '3') 1918a7d6542SBram Moolenaar endtry 1928a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 1938a7d6542SBram Moolenaarenddef 1948a7d6542SBram Moolenaar 1958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 1968a7d6542SBram Moolenaar vim9script 1978a7d6542SBram Moolenaar let name: string = 'bob' 1988a7d6542SBram Moolenaar def Concat(arg: string): string 1998a7d6542SBram Moolenaar return name .. arg 2008a7d6542SBram Moolenaar enddef 2018a7d6542SBram Moolenaar let g:result = Concat('bie') 2028a7d6542SBram Moolenaar let g:localname = name 2038a7d6542SBram Moolenaar 2048a7d6542SBram Moolenaar export const CONST = 1234 2058a7d6542SBram Moolenaar export let exported = 9876 206*6e587dcbSBram Moolenaar export let exp_name = 'John' 2078a7d6542SBram Moolenaar export def Exported(): string 2088a7d6542SBram Moolenaar return 'Exported' 2098a7d6542SBram Moolenaar enddef 2108a7d6542SBram MoolenaarEND 2118a7d6542SBram Moolenaar 2128a7d6542SBram Moolenaardef Test_vim9script() 2138a7d6542SBram Moolenaar let import_script_lines =<< trim END 2148a7d6542SBram Moolenaar vim9script 2158a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 2168a7d6542SBram Moolenaar g:imported = exported 217*6e587dcbSBram Moolenaar exported += 3 218*6e587dcbSBram Moolenaar g:imported_added = exported 2198a7d6542SBram Moolenaar g:imported_func = Exported() 220*6e587dcbSBram Moolenaar 221*6e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 222*6e587dcbSBram Moolenaar g:imported_name = exp_name 223*6e587dcbSBram Moolenaar exp_name ..= ' Doe' 224*6e587dcbSBram Moolenaar g:imported_name_appended = exp_name 2258a7d6542SBram Moolenaar END 2268a7d6542SBram Moolenaar 2278a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 2288a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 2298a7d6542SBram Moolenaar 2308a7d6542SBram Moolenaar source Ximport.vim 2318a7d6542SBram Moolenaar 2328a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 2338a7d6542SBram Moolenaar assert_equal('bob', g:localname) 2348a7d6542SBram Moolenaar assert_equal(9876, g:imported) 235*6e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 2368a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 237*6e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 238*6e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 2398a7d6542SBram Moolenaar assert_false(exists('g:name')) 2408a7d6542SBram Moolenaar 2418a7d6542SBram Moolenaar unlet g:result 2428a7d6542SBram Moolenaar unlet g:localname 2438a7d6542SBram Moolenaar unlet g:imported 244*6e587dcbSBram Moolenaar unlet g:imported_added 2458a7d6542SBram Moolenaar unlet g:imported_func 246*6e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 2478a7d6542SBram Moolenaar delete('Ximport.vim') 2488a7d6542SBram Moolenaar delete('Xexport.vim') 2498a7d6542SBram Moolenaar 2508a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 2518a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 2528a7d6542SBram Moolenaarenddef 2538a7d6542SBram Moolenaar 2548a7d6542SBram Moolenaardef Test_vim9script_call() 2558a7d6542SBram Moolenaar let lines =<< trim END 2568a7d6542SBram Moolenaar vim9script 2578a7d6542SBram Moolenaar let var = '' 2588a7d6542SBram Moolenaar def MyFunc(arg: string) 2598a7d6542SBram Moolenaar var = arg 2608a7d6542SBram Moolenaar enddef 2618a7d6542SBram Moolenaar MyFunc('foobar') 2628a7d6542SBram Moolenaar assert_equal('foobar', var) 2638a7d6542SBram Moolenaar 2648a7d6542SBram Moolenaar let str = 'barfoo' 2658a7d6542SBram Moolenaar str->MyFunc() 2668a7d6542SBram Moolenaar assert_equal('barfoo', var) 2678a7d6542SBram Moolenaar 2688a7d6542SBram Moolenaar let g:value = 'value' 2698a7d6542SBram Moolenaar g:value->MyFunc() 2708a7d6542SBram Moolenaar assert_equal('value', var) 2718a7d6542SBram Moolenaar 2728a7d6542SBram Moolenaar let listvar = [] 2738a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2748a7d6542SBram Moolenaar listvar = arg 2758a7d6542SBram Moolenaar enddef 2768a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2778a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2788a7d6542SBram Moolenaar 2798a7d6542SBram Moolenaar let dictvar = {} 2808a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2818a7d6542SBram Moolenaar dictvar = arg 2828a7d6542SBram Moolenaar enddef 2838a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2848a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2858a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2868a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2878a7d6542SBram Moolenaar END 2888a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 2898a7d6542SBram Moolenaar source Xcall.vim 2908a7d6542SBram Moolenaar delete('Xcall.vim') 2918a7d6542SBram Moolenaarenddef 2928a7d6542SBram Moolenaar 2938a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 2948a7d6542SBram Moolenaar let lines =<< trim END 2958a7d6542SBram Moolenaar vim9script 2968a7d6542SBram Moolenaar let var = '' 2978a7d6542SBram Moolenaar def MyFunc(arg: string) 2988a7d6542SBram Moolenaar let var = 123 2998a7d6542SBram Moolenaar enddef 3008a7d6542SBram Moolenaar END 3018a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 3028a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 3038a7d6542SBram Moolenaar delete('Xcall_decl.vim') 3048a7d6542SBram Moolenaarenddef 3058a7d6542SBram Moolenaar 3068a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 3078a7d6542SBram Moolenaar let lines =<< trim END 3088a7d6542SBram Moolenaar vim9script 3098a7d6542SBram Moolenaar const var = '' 3108a7d6542SBram Moolenaar def MyFunc(arg: string) 3118a7d6542SBram Moolenaar var = 'asdf' 3128a7d6542SBram Moolenaar enddef 3138a7d6542SBram Moolenaar END 3148a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 3158a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 3168a7d6542SBram Moolenaar delete('Xcall_const.vim') 3178a7d6542SBram Moolenaarenddef 3188a7d6542SBram Moolenaar 3198a7d6542SBram Moolenaardef Test_vim9script_reload() 3208a7d6542SBram Moolenaar let lines =<< trim END 3218a7d6542SBram Moolenaar vim9script 3228a7d6542SBram Moolenaar const var = '' 3238a7d6542SBram Moolenaar let valone = 1234 3248a7d6542SBram Moolenaar def MyFunc(arg: string) 3258a7d6542SBram Moolenaar valone = 5678 3268a7d6542SBram Moolenaar enddef 3278a7d6542SBram Moolenaar END 3288a7d6542SBram Moolenaar let morelines =<< trim END 3298a7d6542SBram Moolenaar let valtwo = 222 3308a7d6542SBram Moolenaar export def GetValtwo(): number 3318a7d6542SBram Moolenaar return valtwo 3328a7d6542SBram Moolenaar enddef 3338a7d6542SBram Moolenaar END 3348a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 3358a7d6542SBram Moolenaar source Xreload.vim 3368a7d6542SBram Moolenaar source Xreload.vim 3378a7d6542SBram Moolenaar source Xreload.vim 3388a7d6542SBram Moolenaar 3398a7d6542SBram Moolenaar let testlines =<< trim END 3408a7d6542SBram Moolenaar vim9script 3418a7d6542SBram Moolenaar def TheFunc() 3428a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 3438a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 3448a7d6542SBram Moolenaar enddef 3458a7d6542SBram Moolenaar TheFunc() 3468a7d6542SBram Moolenaar END 3478a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 3488a7d6542SBram Moolenaar source Ximport.vim 3498a7d6542SBram Moolenaar 3508a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 3518a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 3528a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3538a7d6542SBram Moolenaar source Xreload.vim 3548a7d6542SBram Moolenaar source Ximport.vim 3558a7d6542SBram Moolenaar 3568a7d6542SBram Moolenaar " cannot declare a var twice 3578a7d6542SBram Moolenaar lines =<< trim END 3588a7d6542SBram Moolenaar vim9script 3598a7d6542SBram Moolenaar let valone = 1234 3608a7d6542SBram Moolenaar let valone = 5678 3618a7d6542SBram Moolenaar END 3628a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3638a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3648a7d6542SBram Moolenaar 3658a7d6542SBram Moolenaar delete('Xreload.vim') 3668a7d6542SBram Moolenaar delete('Ximport.vim') 3678a7d6542SBram Moolenaarenddef 3688a7d6542SBram Moolenaar 3698a7d6542SBram Moolenaardef Test_import_absolute() 3708a7d6542SBram Moolenaar let import_lines = [ 3718a7d6542SBram Moolenaar \ 'vim9script', 3728a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 373b283a8a6SBram Moolenaar \ 'def UseExported()', 3748a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 3754e12a5dfSBram Moolenaar \ ' exported = 8888', 3764e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 377b283a8a6SBram Moolenaar \ 'enddef', 378b283a8a6SBram Moolenaar \ 'UseExported()', 3794e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 3808a7d6542SBram Moolenaar \ ] 3818a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3828a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaar source Ximport_abs.vim 3858a7d6542SBram Moolenaar 3868a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 3874e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 388b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 389b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 390b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3914e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 3924e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 3934e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 3944e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 3954e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3964e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 3974e12a5dfSBram Moolenaar \, g:import_disassembled) 3988a7d6542SBram Moolenaar unlet g:imported_abs 3994e12a5dfSBram Moolenaar unlet g:import_disassembled 4008a7d6542SBram Moolenaar 4018a7d6542SBram Moolenaar delete('Ximport_abs.vim') 4028a7d6542SBram Moolenaar delete('Xexport_abs.vim') 4038a7d6542SBram Moolenaarenddef 4048a7d6542SBram Moolenaar 4058a7d6542SBram Moolenaardef Test_import_rtp() 4068a7d6542SBram Moolenaar let import_lines = [ 4078a7d6542SBram Moolenaar \ 'vim9script', 4088a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 4098a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 4108a7d6542SBram Moolenaar \ ] 4118a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 4128a7d6542SBram Moolenaar mkdir('import') 4138a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 4148a7d6542SBram Moolenaar 4158a7d6542SBram Moolenaar let save_rtp = &rtp 4168a7d6542SBram Moolenaar &rtp = getcwd() 4178a7d6542SBram Moolenaar source Ximport_rtp.vim 4188a7d6542SBram Moolenaar &rtp = save_rtp 4198a7d6542SBram Moolenaar 4208a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 4218a7d6542SBram Moolenaar unlet g:imported_rtp 4228a7d6542SBram Moolenaar 4238a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 4248a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 4258a7d6542SBram Moolenaar delete('import', 'd') 4268a7d6542SBram Moolenaarenddef 4278a7d6542SBram Moolenaar 4288a7d6542SBram Moolenaardef Test_fixed_size_list() 4298a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 4308a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 4318a7d6542SBram Moolenaar l->remove(0) 4328a7d6542SBram Moolenaar l->add(5) 4338a7d6542SBram Moolenaar l->insert(99, 1) 4340f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 4358a7d6542SBram Moolenaarenddef 4368a7d6542SBram Moolenaar 437673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 438673660abSBram Moolenaar" recognized. 439673660abSBram Moolenaarfunc Test_function_python() 440673660abSBram Moolenaar CheckFeature python3 441673660abSBram Moolenaar let py = 'python3' 442673660abSBram Moolenaar execute py "<< EOF" 443673660abSBram Moolenaardef do_something(): 444673660abSBram Moolenaar return 1 445673660abSBram MoolenaarEOF 446673660abSBram Moolenaarendfunc 447673660abSBram Moolenaar 448a259d8d3SBram Moolenaardef HasEval() 449a259d8d3SBram Moolenaar if has('eval') 450a259d8d3SBram Moolenaar echo 'yes' 451a259d8d3SBram Moolenaar else 452a259d8d3SBram Moolenaar echo 'no' 453a259d8d3SBram Moolenaar endif 454a259d8d3SBram Moolenaarenddef 455a259d8d3SBram Moolenaar 456a259d8d3SBram Moolenaardef HasNothing() 457a259d8d3SBram Moolenaar if has('nothing') 458a259d8d3SBram Moolenaar echo 'yes' 459a259d8d3SBram Moolenaar else 460a259d8d3SBram Moolenaar echo 'no' 461a259d8d3SBram Moolenaar endif 462a259d8d3SBram Moolenaarenddef 463a259d8d3SBram Moolenaar 464a259d8d3SBram Moolenaardef Test_compile_const_expr() 465a259d8d3SBram Moolenaar assert_equal("\nyes", execute('call HasEval()')) 466a259d8d3SBram Moolenaar let instr = execute('disassemble HasEval') 4670f18b6d1SBram Moolenaar assert_match('PUSHS "yes"', instr) 4680f18b6d1SBram Moolenaar assert_notmatch('PUSHS "no"', instr) 4690f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 470a259d8d3SBram Moolenaar 471a259d8d3SBram Moolenaar assert_equal("\nno", execute('call HasNothing()')) 472a259d8d3SBram Moolenaar instr = execute('disassemble HasNothing') 4730f18b6d1SBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 4740f18b6d1SBram Moolenaar assert_match('PUSHS "no"', instr) 4750f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 4760f18b6d1SBram Moolenaarenddef 4770f18b6d1SBram Moolenaar 4780f18b6d1SBram Moolenaarfunc NotCompiled() 4790f18b6d1SBram Moolenaar echo "not" 4800f18b6d1SBram Moolenaarendfunc 4810f18b6d1SBram Moolenaar 4820f18b6d1SBram Moolenaarlet s:scriptvar = 4 4830f18b6d1SBram Moolenaarlet g:globalvar = 'g' 4840f18b6d1SBram Moolenaar 485b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string) 4860f18b6d1SBram Moolenaar let local = 1 4870f18b6d1SBram Moolenaar buffers 4880f18b6d1SBram Moolenaar echo arg 4890f18b6d1SBram Moolenaar echo local 4900f18b6d1SBram Moolenaar echo v:version 4910f18b6d1SBram Moolenaar echo s:scriptvar 4920f18b6d1SBram Moolenaar echo g:globalvar 4930f18b6d1SBram Moolenaar echo &tabstop 4940f18b6d1SBram Moolenaar echo $ENVVAR 4950f18b6d1SBram Moolenaar echo @z 4960f18b6d1SBram Moolenaarenddef 4970f18b6d1SBram Moolenaar 4980de50864SBram Moolenaardef Test_disassembleLoad() 4990de50864SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 5000de50864SBram Moolenaar assert_fails('disass NotCompiled', 'E1062:') 5010de50864SBram Moolenaar 5020de50864SBram Moolenaar let res = execute('disass s:ScriptFuncLoad') 5030de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' 5040de50864SBram Moolenaar \ .. 'buffers.*' 5050de50864SBram Moolenaar \ .. ' EXEC \+buffers.*' 5060de50864SBram Moolenaar \ .. ' LOAD arg\[-1\].*' 5070de50864SBram Moolenaar \ .. ' LOAD $0.*' 5080de50864SBram Moolenaar \ .. ' LOADV v:version.*' 5090de50864SBram Moolenaar \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' 5100de50864SBram Moolenaar \ .. ' LOADG g:globalvar.*' 5110de50864SBram Moolenaar \ .. ' LOADENV $ENVVAR.*' 5120de50864SBram Moolenaar \ .. ' LOADREG @z.*' 5130de50864SBram Moolenaar \, res) 5140de50864SBram Moolenaarenddef 5150de50864SBram Moolenaar 516ff80cb68SBram Moolenaardef s:ScriptFuncPush() 517ff80cb68SBram Moolenaar let localbool = true 518ff80cb68SBram Moolenaar let localspec = v:none 519ff80cb68SBram Moolenaar let localblob = 0z1234 520ff80cb68SBram Moolenaar if has('float') 521ff80cb68SBram Moolenaar let localfloat = 1.234 522ff80cb68SBram Moolenaar endif 523ff80cb68SBram Moolenaarenddef 524ff80cb68SBram Moolenaar 5250de50864SBram Moolenaardef Test_disassemblePush() 5260de50864SBram Moolenaar let res = execute('disass s:ScriptFuncPush') 5270de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 5280de50864SBram Moolenaar \ .. 'localbool = true.*' 5290de50864SBram Moolenaar \ .. ' PUSH v:true.*' 5300de50864SBram Moolenaar \ .. 'localspec = v:none.*' 5310de50864SBram Moolenaar \ .. ' PUSH v:none.*' 5320de50864SBram Moolenaar \ .. 'localblob = 0z1234.*' 5330de50864SBram Moolenaar \ .. ' PUSHBLOB 0z1234.*' 5340de50864SBram Moolenaar \, res) 5350de50864SBram Moolenaar if has('float') 5360de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 5370de50864SBram Moolenaar \ .. 'localfloat = 1.234.*' 5380de50864SBram Moolenaar \ .. ' PUSHF 1.234.*' 5390de50864SBram Moolenaar \, res) 5400de50864SBram Moolenaar endif 5410de50864SBram Moolenaarenddef 5420de50864SBram Moolenaar 543b283a8a6SBram Moolenaardef s:ScriptFuncStore() 544b283a8a6SBram Moolenaar let localnr = 1 545b283a8a6SBram Moolenaar localnr = 2 546b283a8a6SBram Moolenaar let localstr = 'abc' 547b283a8a6SBram Moolenaar localstr = 'xyz' 548b283a8a6SBram Moolenaar v:char = 'abc' 549b283a8a6SBram Moolenaar s:scriptvar = 'sv' 550b283a8a6SBram Moolenaar g:globalvar = 'gv' 551b283a8a6SBram Moolenaar &tabstop = 8 552b283a8a6SBram Moolenaar $ENVVAR = 'ev' 553b283a8a6SBram Moolenaar @z = 'rv' 554b283a8a6SBram Moolenaarenddef 555b283a8a6SBram Moolenaar 5560de50864SBram Moolenaardef Test_disassembleStore() 5570de50864SBram Moolenaar let res = execute('disass s:ScriptFuncStore') 558b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' 559b283a8a6SBram Moolenaar \ .. 'localnr = 2.*' 560b283a8a6SBram Moolenaar \ .. ' STORE 2 in $0.*' 561b283a8a6SBram Moolenaar \ .. 'localstr = ''xyz''.*' 562b283a8a6SBram Moolenaar \ .. ' STORE $1.*' 563b283a8a6SBram Moolenaar \ .. 'v:char = ''abc''.*' 564b283a8a6SBram Moolenaar \ .. 'STOREV v:char.*' 565b283a8a6SBram Moolenaar \ .. 's:scriptvar = ''sv''.*' 566b283a8a6SBram Moolenaar \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*' 567b283a8a6SBram Moolenaar \ .. 'g:globalvar = ''gv''.*' 568b283a8a6SBram Moolenaar \ .. ' STOREG g:globalvar.*' 569b283a8a6SBram Moolenaar \ .. '&tabstop = 8.*' 570b283a8a6SBram Moolenaar \ .. ' STOREOPT &tabstop.*' 571b283a8a6SBram Moolenaar \ .. '$ENVVAR = ''ev''.*' 572b283a8a6SBram Moolenaar \ .. ' STOREENV $ENVVAR.*' 573b283a8a6SBram Moolenaar \ .. '@z = ''rv''.*' 574b283a8a6SBram Moolenaar \ .. ' STOREREG @z.*' 575b283a8a6SBram Moolenaar \, res) 5760de50864SBram Moolenaarenddef 577ff80cb68SBram Moolenaar 5780de50864SBram Moolenaardef s:ScriptFuncTry() 5790de50864SBram Moolenaar try 5800de50864SBram Moolenaar echo 'yes' 5810de50864SBram Moolenaar catch /fail/ 5820de50864SBram Moolenaar echo 'no' 5830de50864SBram Moolenaar finally 5840de50864SBram Moolenaar echo 'end' 5850de50864SBram Moolenaar endtry 5860de50864SBram Moolenaarenddef 5870de50864SBram Moolenaar 5880de50864SBram Moolenaardef Test_disassembleTry() 5890de50864SBram Moolenaar let res = execute('disass s:ScriptFuncTry') 590ff80cb68SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncTry.*' 591ff80cb68SBram Moolenaar \ .. 'try.*' 592ff80cb68SBram Moolenaar \ .. 'TRY catch -> \d\+, finally -> \d\+.*' 593ff80cb68SBram Moolenaar \ .. 'catch /fail/.*' 594ff80cb68SBram Moolenaar \ .. ' JUMP -> \d\+.*' 595ff80cb68SBram Moolenaar \ .. ' PUSH v:exception.*' 596ff80cb68SBram Moolenaar \ .. ' PUSHS "fail".*' 597ff80cb68SBram Moolenaar \ .. ' COMPARESTRING =\~.*' 598ff80cb68SBram Moolenaar \ .. ' JUMP_IF_FALSE -> \d\+.*' 599ff80cb68SBram Moolenaar \ .. ' CATCH.*' 600ff80cb68SBram Moolenaar \ .. 'finally.*' 601ff80cb68SBram Moolenaar \ .. ' PUSHS "end".*' 602ff80cb68SBram Moolenaar \ .. 'endtry.*' 603ff80cb68SBram Moolenaar \ .. ' ENDTRY.*' 604ff80cb68SBram Moolenaar \, res) 605a259d8d3SBram Moolenaarenddef 606a259d8d3SBram Moolenaar 6070de50864SBram Moolenaardef s:ScriptFuncNew() 6080de50864SBram Moolenaar let ll = [1, "two", 333] 6090de50864SBram Moolenaar let dd = #{one: 1, two: "val"} 6100de50864SBram Moolenaarenddef 6110de50864SBram Moolenaar 6120de50864SBram Moolenaardef Test_disassembleNew() 6130de50864SBram Moolenaar let res = execute('disass s:ScriptFuncNew') 6140de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncNew.*' 6150de50864SBram Moolenaar \ .. 'let ll = \[1, "two", 333].*' 6160de50864SBram Moolenaar \ .. 'PUSHNR 1.*' 6170de50864SBram Moolenaar \ .. 'PUSHS "two".*' 6180de50864SBram Moolenaar \ .. 'PUSHNR 333.*' 6190de50864SBram Moolenaar \ .. 'NEWLIST size 3.*' 6200de50864SBram Moolenaar \ .. 'let dd = #{one: 1, two: "val"}.*' 6210de50864SBram Moolenaar \ .. 'PUSHS "one".*' 6220de50864SBram Moolenaar \ .. 'PUSHNR 1.*' 6230de50864SBram Moolenaar \ .. 'PUSHS "two".*' 6240de50864SBram Moolenaar \ .. 'PUSHS "val".*' 6250de50864SBram Moolenaar \ .. 'NEWDICT size 2.*' 6260de50864SBram Moolenaar \, res) 6270de50864SBram Moolenaarenddef 6280de50864SBram Moolenaar 6290de50864SBram Moolenaardef FuncWithArg(arg) 6300de50864SBram Moolenaar echo arg 6310de50864SBram Moolenaarenddef 6320de50864SBram Moolenaar 6330de50864SBram Moolenaarfunc UserFunc() 6340de50864SBram Moolenaar echo 'nothing' 6350de50864SBram Moolenaarendfunc 6360de50864SBram Moolenaar 6370de50864SBram Moolenaarfunc UserFuncWithArg(arg) 6380de50864SBram Moolenaar echo a:arg 6390de50864SBram Moolenaarendfunc 6400de50864SBram Moolenaar 6410de50864SBram Moolenaardef s:ScriptFuncCall(): string 6420de50864SBram Moolenaar changenr() 6430de50864SBram Moolenaar char2nr("abc") 6440de50864SBram Moolenaar Test_disassembleNew() 6450de50864SBram Moolenaar FuncWithArg(343) 6460de50864SBram Moolenaar UserFunc() 6470de50864SBram Moolenaar UserFuncWithArg("foo") 6480de50864SBram Moolenaar let FuncRef = function("UserFunc") 6490de50864SBram Moolenaar FuncRef() 6500de50864SBram Moolenaar let FuncRefWithArg = function("UserFuncWithArg") 6510de50864SBram Moolenaar FuncRefWithArg("bar") 6520de50864SBram Moolenaar return "yes" 6530de50864SBram Moolenaarenddef 6540de50864SBram Moolenaar 6550de50864SBram Moolenaardef Test_disassembleCall() 6560de50864SBram Moolenaar let res = execute('disass s:ScriptFuncCall') 6570de50864SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncCall.*' 6580de50864SBram Moolenaar \ .. 'changenr().*' 6590de50864SBram Moolenaar \ .. ' BCALL changenr(argc 0).*' 6600de50864SBram Moolenaar \ .. 'char2nr("abc").*' 6610de50864SBram Moolenaar \ .. ' PUSHS "abc".*' 6620de50864SBram Moolenaar \ .. ' BCALL char2nr(argc 1).*' 6630de50864SBram Moolenaar \ .. 'Test_disassembleNew().*' 6640de50864SBram Moolenaar \ .. ' DCALL Test_disassembleNew(argc 0).*' 6650de50864SBram Moolenaar \ .. 'FuncWithArg(343).*' 6660de50864SBram Moolenaar \ .. ' PUSHNR 343.*' 6670de50864SBram Moolenaar \ .. ' DCALL FuncWithArg(argc 1).*' 6680de50864SBram Moolenaar \ .. 'UserFunc().*' 6690de50864SBram Moolenaar \ .. ' UCALL UserFunc(argc 0).*' 6700de50864SBram Moolenaar \ .. 'UserFuncWithArg("foo").*' 6710de50864SBram Moolenaar \ .. ' PUSHS "foo".*' 6720de50864SBram Moolenaar \ .. ' UCALL UserFuncWithArg(argc 1).*' 6730de50864SBram Moolenaar \ .. 'let FuncRef = function("UserFunc").*' 6740de50864SBram Moolenaar \ .. 'FuncRef().*' 6750de50864SBram Moolenaar \ .. ' LOAD $\d.*' 6760de50864SBram Moolenaar \ .. ' PCALL (argc 0).*' 6770de50864SBram Moolenaar \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*' 6780de50864SBram Moolenaar \ .. 'FuncRefWithArg("bar").*' 6790de50864SBram Moolenaar \ .. ' PUSHS "bar".*' 6800de50864SBram Moolenaar \ .. ' LOAD $\d.*' 6810de50864SBram Moolenaar \ .. ' PCALL (argc 1).*' 6820de50864SBram Moolenaar \ .. 'return "yes".*' 6830de50864SBram Moolenaar \ .. ' PUSHS "yes".*' 6840de50864SBram Moolenaar \ .. ' RETURN.*' 6850de50864SBram Moolenaar \, res) 6860de50864SBram Moolenaarenddef 6870de50864SBram Moolenaar 6888a7d6542SBram Moolenaar 6898a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 690