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 308a7d6542SBram Moolenaardef Test_assignment() 318a7d6542SBram Moolenaar let bool1: bool = true 328a7d6542SBram Moolenaar assert_equal(v:true, bool1) 338a7d6542SBram Moolenaar let bool2: bool = false 348a7d6542SBram Moolenaar assert_equal(v:false, bool2) 358a7d6542SBram Moolenaar 368a7d6542SBram Moolenaar let list1: list<string> = ['sdf', 'asdf'] 378a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 388a7d6542SBram Moolenaar 398a7d6542SBram Moolenaar " TODO: does not work yet 408a7d6542SBram Moolenaar " let listS: list<string> = [] 418a7d6542SBram Moolenaar " let listN: list<number> = [] 428a7d6542SBram Moolenaar 438a7d6542SBram Moolenaar let dict1: dict<string> = #{key: 'value'} 448a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 45b283a8a6SBram Moolenaar 46b283a8a6SBram Moolenaar v:char = 'abc' 47b283a8a6SBram Moolenaar call assert_equal('abc', v:char) 48b283a8a6SBram Moolenaar 49b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 50b283a8a6SBram Moolenaar call assert_equal('foobar', $ENVVAR) 51b283a8a6SBram Moolenaar $ENVVAR = '' 528a7d6542SBram Moolenaarenddef 538a7d6542SBram Moolenaar 548a7d6542SBram Moolenaarfunc Test_assignment_failure() 558a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 568a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 578a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 588a7d6542SBram Moolenaar 598a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 608a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 618a7d6542SBram Moolenaar 628a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 638a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 648a7d6542SBram Moolenaar 658a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 668a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 678a7d6542SBram Moolenaar 688a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 698a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 708a7d6542SBram Moolenaarendfunc 718a7d6542SBram Moolenaar 728a7d6542SBram Moolenaarfunc Test_const() 738a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 748a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 758a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 768a7d6542SBram Moolenaarendfunc 778a7d6542SBram Moolenaar 788a7d6542SBram Moolenaardef Test_block() 798a7d6542SBram Moolenaar let outer = 1 808a7d6542SBram Moolenaar { 818a7d6542SBram Moolenaar let inner = 2 828a7d6542SBram Moolenaar assert_equal(1, outer) 838a7d6542SBram Moolenaar assert_equal(2, inner) 848a7d6542SBram Moolenaar } 858a7d6542SBram Moolenaar assert_equal(1, outer) 868a7d6542SBram Moolenaarenddef 878a7d6542SBram Moolenaar 888a7d6542SBram Moolenaarfunc Test_block_failure() 898a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 908a7d6542SBram Moolenaarendfunc 918a7d6542SBram Moolenaar 928a7d6542SBram Moolenaardef ReturnString(): string 938a7d6542SBram Moolenaar return 'string' 948a7d6542SBram Moolenaarenddef 958a7d6542SBram Moolenaar 968a7d6542SBram Moolenaardef ReturnNumber(): number 978a7d6542SBram Moolenaar return 123 988a7d6542SBram Moolenaarenddef 998a7d6542SBram Moolenaar 1008a7d6542SBram Moolenaardef Test_return_string() 1018a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1028a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 1038a7d6542SBram Moolenaarenddef 1048a7d6542SBram Moolenaar 1058a7d6542SBram Moolenaarfunc Increment() 1068a7d6542SBram Moolenaar let g:counter += 1 1078a7d6542SBram Moolenaarendfunc 1088a7d6542SBram Moolenaar 1098a7d6542SBram Moolenaardef Test_call_ufunc_count() 1108a7d6542SBram Moolenaar g:counter = 1 1118a7d6542SBram Moolenaar Increment() 1128a7d6542SBram Moolenaar Increment() 1138a7d6542SBram Moolenaar Increment() 1148a7d6542SBram Moolenaar " works with and without :call 1158a7d6542SBram Moolenaar assert_equal(4, g:counter) 116b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1178a7d6542SBram Moolenaar unlet g:counter 1188a7d6542SBram Moolenaarenddef 1198a7d6542SBram Moolenaar 1208a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1218a7d6542SBram Moolenaar let res = arg 1228a7d6542SBram Moolenaar for s in rest 1238a7d6542SBram Moolenaar res ..= ',' .. s 1248a7d6542SBram Moolenaar endfor 1258a7d6542SBram Moolenaar return res 1268a7d6542SBram Moolenaarenddef 1278a7d6542SBram Moolenaar 1288a7d6542SBram Moolenaardef Test_call_varargs() 1298a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1308a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1318a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1328a7d6542SBram Moolenaarenddef 1338a7d6542SBram Moolenaar 13426e117e9SBram Moolenaar"def Test_call_func_defined_later() 13526e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 13626e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 13726e117e9SBram Moolenaar"enddef 13826e117e9SBram Moolenaar 13926e117e9SBram Moolenaarfunc DefineLater(arg) 14026e117e9SBram Moolenaar return a:arg 14126e117e9SBram Moolenaarendfunc 14226e117e9SBram Moolenaar 14326e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string 14426e117e9SBram Moolenaar return name 14526e117e9SBram Moolenaarenddef 14626e117e9SBram Moolenaar 14726e117e9SBram Moolenaarfunc Test_call_default_args_from_func() 14826e117e9SBram Moolenaar " TODO: implement using default value for optional argument 14926e117e9SBram Moolenaar "call assert_equal('string', MyDefaultArgs()) 15026e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet') 15126e117e9SBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 15226e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 15326e117e9SBram Moolenaarendfunc 15426e117e9SBram Moolenaar 15526e117e9SBram Moolenaardef Test_call_default_args() 15626e117e9SBram Moolenaar " TODO: implement using default value for optional argument 15726e117e9SBram Moolenaar "assert_equal('string', MyDefaultArgs()) 15826e117e9SBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 15926e117e9SBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 16026e117e9SBram Moolenaarenddef 16126e117e9SBram Moolenaar 1628a7d6542SBram Moolenaardef Test_return_type_wrong() 163978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 164978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 165978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 166978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1678a7d6542SBram Moolenaarenddef 1688a7d6542SBram Moolenaar 169bfe12043SBram Moolenaardef Test_arg_type_wrong() 170bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 171bfe12043SBram Moolenaarenddef 172bfe12043SBram Moolenaar 1738a7d6542SBram Moolenaardef Test_try_catch() 1748a7d6542SBram Moolenaar let l = [] 1758a7d6542SBram Moolenaar try 1768a7d6542SBram Moolenaar add(l, '1') 1778a7d6542SBram Moolenaar throw 'wrong' 1788a7d6542SBram Moolenaar add(l, '2') 1798a7d6542SBram Moolenaar catch 1808a7d6542SBram Moolenaar add(l, v:exception) 1818a7d6542SBram Moolenaar finally 1828a7d6542SBram Moolenaar add(l, '3') 1838a7d6542SBram Moolenaar endtry 1848a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 1858a7d6542SBram Moolenaarenddef 1868a7d6542SBram Moolenaar 1878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 1888a7d6542SBram Moolenaar vim9script 1898a7d6542SBram Moolenaar let name: string = 'bob' 1908a7d6542SBram Moolenaar def Concat(arg: string): string 1918a7d6542SBram Moolenaar return name .. arg 1928a7d6542SBram Moolenaar enddef 1938a7d6542SBram Moolenaar let g:result = Concat('bie') 1948a7d6542SBram Moolenaar let g:localname = name 1958a7d6542SBram Moolenaar 1968a7d6542SBram Moolenaar export const CONST = 1234 1978a7d6542SBram Moolenaar export let exported = 9876 1988a7d6542SBram Moolenaar export def Exported(): string 1998a7d6542SBram Moolenaar return 'Exported' 2008a7d6542SBram Moolenaar enddef 2018a7d6542SBram MoolenaarEND 2028a7d6542SBram Moolenaar 2038a7d6542SBram Moolenaardef Test_vim9script() 2048a7d6542SBram Moolenaar let import_script_lines =<< trim END 2058a7d6542SBram Moolenaar vim9script 2068a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 2078a7d6542SBram Moolenaar g:imported = exported 2088a7d6542SBram Moolenaar g:imported_func = Exported() 2098a7d6542SBram Moolenaar END 2108a7d6542SBram Moolenaar 2118a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 2128a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 2138a7d6542SBram Moolenaar 2148a7d6542SBram Moolenaar source Ximport.vim 2158a7d6542SBram Moolenaar 2168a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 2178a7d6542SBram Moolenaar assert_equal('bob', g:localname) 2188a7d6542SBram Moolenaar assert_equal(9876, g:imported) 2198a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 2208a7d6542SBram Moolenaar assert_false(exists('g:name')) 2218a7d6542SBram Moolenaar 2228a7d6542SBram Moolenaar unlet g:result 2238a7d6542SBram Moolenaar unlet g:localname 2248a7d6542SBram Moolenaar unlet g:imported 2258a7d6542SBram Moolenaar unlet g:imported_func 2268a7d6542SBram Moolenaar delete('Ximport.vim') 2278a7d6542SBram Moolenaar delete('Xexport.vim') 2288a7d6542SBram Moolenaar 2298a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 2308a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 2318a7d6542SBram Moolenaarenddef 2328a7d6542SBram Moolenaar 2338a7d6542SBram Moolenaardef Test_vim9script_call() 2348a7d6542SBram Moolenaar let lines =<< trim END 2358a7d6542SBram Moolenaar vim9script 2368a7d6542SBram Moolenaar let var = '' 2378a7d6542SBram Moolenaar def MyFunc(arg: string) 2388a7d6542SBram Moolenaar var = arg 2398a7d6542SBram Moolenaar enddef 2408a7d6542SBram Moolenaar MyFunc('foobar') 2418a7d6542SBram Moolenaar assert_equal('foobar', var) 2428a7d6542SBram Moolenaar 2438a7d6542SBram Moolenaar let str = 'barfoo' 2448a7d6542SBram Moolenaar str->MyFunc() 2458a7d6542SBram Moolenaar assert_equal('barfoo', var) 2468a7d6542SBram Moolenaar 2478a7d6542SBram Moolenaar let g:value = 'value' 2488a7d6542SBram Moolenaar g:value->MyFunc() 2498a7d6542SBram Moolenaar assert_equal('value', var) 2508a7d6542SBram Moolenaar 2518a7d6542SBram Moolenaar let listvar = [] 2528a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2538a7d6542SBram Moolenaar listvar = arg 2548a7d6542SBram Moolenaar enddef 2558a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2568a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2578a7d6542SBram Moolenaar 2588a7d6542SBram Moolenaar let dictvar = {} 2598a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2608a7d6542SBram Moolenaar dictvar = arg 2618a7d6542SBram Moolenaar enddef 2628a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2638a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2648a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2658a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2668a7d6542SBram Moolenaar END 2678a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 2688a7d6542SBram Moolenaar source Xcall.vim 2698a7d6542SBram Moolenaar delete('Xcall.vim') 2708a7d6542SBram Moolenaarenddef 2718a7d6542SBram Moolenaar 2728a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 2738a7d6542SBram Moolenaar let lines =<< trim END 2748a7d6542SBram Moolenaar vim9script 2758a7d6542SBram Moolenaar let var = '' 2768a7d6542SBram Moolenaar def MyFunc(arg: string) 2778a7d6542SBram Moolenaar let var = 123 2788a7d6542SBram Moolenaar enddef 2798a7d6542SBram Moolenaar END 2808a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 2818a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 2828a7d6542SBram Moolenaar delete('Xcall_decl.vim') 2838a7d6542SBram Moolenaarenddef 2848a7d6542SBram Moolenaar 2858a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 2868a7d6542SBram Moolenaar let lines =<< trim END 2878a7d6542SBram Moolenaar vim9script 2888a7d6542SBram Moolenaar const var = '' 2898a7d6542SBram Moolenaar def MyFunc(arg: string) 2908a7d6542SBram Moolenaar var = 'asdf' 2918a7d6542SBram Moolenaar enddef 2928a7d6542SBram Moolenaar END 2938a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 2948a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 2958a7d6542SBram Moolenaar delete('Xcall_const.vim') 2968a7d6542SBram Moolenaarenddef 2978a7d6542SBram Moolenaar 2988a7d6542SBram Moolenaardef Test_vim9script_reload() 2998a7d6542SBram Moolenaar let lines =<< trim END 3008a7d6542SBram Moolenaar vim9script 3018a7d6542SBram Moolenaar const var = '' 3028a7d6542SBram Moolenaar let valone = 1234 3038a7d6542SBram Moolenaar def MyFunc(arg: string) 3048a7d6542SBram Moolenaar valone = 5678 3058a7d6542SBram Moolenaar enddef 3068a7d6542SBram Moolenaar END 3078a7d6542SBram Moolenaar let morelines =<< trim END 3088a7d6542SBram Moolenaar let valtwo = 222 3098a7d6542SBram Moolenaar export def GetValtwo(): number 3108a7d6542SBram Moolenaar return valtwo 3118a7d6542SBram Moolenaar enddef 3128a7d6542SBram Moolenaar END 3138a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 3148a7d6542SBram Moolenaar source Xreload.vim 3158a7d6542SBram Moolenaar source Xreload.vim 3168a7d6542SBram Moolenaar source Xreload.vim 3178a7d6542SBram Moolenaar 3188a7d6542SBram Moolenaar let testlines =<< trim END 3198a7d6542SBram Moolenaar vim9script 3208a7d6542SBram Moolenaar def TheFunc() 3218a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 3228a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 3238a7d6542SBram Moolenaar enddef 3248a7d6542SBram Moolenaar TheFunc() 3258a7d6542SBram Moolenaar END 3268a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 3278a7d6542SBram Moolenaar source Ximport.vim 3288a7d6542SBram Moolenaar 3298a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 3308a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 3318a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3328a7d6542SBram Moolenaar source Xreload.vim 3338a7d6542SBram Moolenaar source Ximport.vim 3348a7d6542SBram Moolenaar 3358a7d6542SBram Moolenaar " cannot declare a var twice 3368a7d6542SBram Moolenaar lines =<< trim END 3378a7d6542SBram Moolenaar vim9script 3388a7d6542SBram Moolenaar let valone = 1234 3398a7d6542SBram Moolenaar let valone = 5678 3408a7d6542SBram Moolenaar END 3418a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3428a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3438a7d6542SBram Moolenaar 3448a7d6542SBram Moolenaar delete('Xreload.vim') 3458a7d6542SBram Moolenaar delete('Ximport.vim') 3468a7d6542SBram Moolenaarenddef 3478a7d6542SBram Moolenaar 3488a7d6542SBram Moolenaardef Test_import_absolute() 3498a7d6542SBram Moolenaar let import_lines = [ 3508a7d6542SBram Moolenaar \ 'vim9script', 3518a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 352b283a8a6SBram Moolenaar \ 'def UseExported()', 3538a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 3544e12a5dfSBram Moolenaar \ ' exported = 8888', 3554e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 356b283a8a6SBram Moolenaar \ 'enddef', 357b283a8a6SBram Moolenaar \ 'UseExported()', 3584e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 3598a7d6542SBram Moolenaar \ ] 3608a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3618a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3628a7d6542SBram Moolenaar 3638a7d6542SBram Moolenaar source Ximport_abs.vim 3648a7d6542SBram Moolenaar 3658a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 3664e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 367b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 368b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 369b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3704e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 3714e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 3724e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 3734e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 3744e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3754e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 3764e12a5dfSBram Moolenaar \, g:import_disassembled) 3778a7d6542SBram Moolenaar unlet g:imported_abs 3784e12a5dfSBram Moolenaar unlet g:import_disassembled 3798a7d6542SBram Moolenaar 3808a7d6542SBram Moolenaar delete('Ximport_abs.vim') 3818a7d6542SBram Moolenaar delete('Xexport_abs.vim') 3828a7d6542SBram Moolenaarenddef 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaardef Test_import_rtp() 3858a7d6542SBram Moolenaar let import_lines = [ 3868a7d6542SBram Moolenaar \ 'vim9script', 3878a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 3888a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 3898a7d6542SBram Moolenaar \ ] 3908a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 3918a7d6542SBram Moolenaar mkdir('import') 3928a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 3938a7d6542SBram Moolenaar 3948a7d6542SBram Moolenaar let save_rtp = &rtp 3958a7d6542SBram Moolenaar &rtp = getcwd() 3968a7d6542SBram Moolenaar source Ximport_rtp.vim 3978a7d6542SBram Moolenaar &rtp = save_rtp 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 4008a7d6542SBram Moolenaar unlet g:imported_rtp 4018a7d6542SBram Moolenaar 4028a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 4038a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 4048a7d6542SBram Moolenaar delete('import', 'd') 4058a7d6542SBram Moolenaarenddef 4068a7d6542SBram Moolenaar 4078a7d6542SBram Moolenaardef Test_fixed_size_list() 4088a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 4098a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 4108a7d6542SBram Moolenaar l->remove(0) 4118a7d6542SBram Moolenaar l->add(5) 4128a7d6542SBram Moolenaar l->insert(99, 1) 4130f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 4148a7d6542SBram Moolenaarenddef 4158a7d6542SBram Moolenaar 416673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 417673660abSBram Moolenaar" recognized. 418673660abSBram Moolenaarfunc Test_function_python() 419673660abSBram Moolenaar CheckFeature python3 420673660abSBram Moolenaar let py = 'python3' 421673660abSBram Moolenaar execute py "<< EOF" 422673660abSBram Moolenaardef do_something(): 423673660abSBram Moolenaar return 1 424673660abSBram MoolenaarEOF 425673660abSBram Moolenaarendfunc 426673660abSBram Moolenaar 427a259d8d3SBram Moolenaardef HasEval() 428a259d8d3SBram Moolenaar if has('eval') 429a259d8d3SBram Moolenaar echo 'yes' 430a259d8d3SBram Moolenaar else 431a259d8d3SBram Moolenaar echo 'no' 432a259d8d3SBram Moolenaar endif 433a259d8d3SBram Moolenaarenddef 434a259d8d3SBram Moolenaar 435a259d8d3SBram Moolenaardef HasNothing() 436a259d8d3SBram Moolenaar if has('nothing') 437a259d8d3SBram Moolenaar echo 'yes' 438a259d8d3SBram Moolenaar else 439a259d8d3SBram Moolenaar echo 'no' 440a259d8d3SBram Moolenaar endif 441a259d8d3SBram Moolenaarenddef 442a259d8d3SBram Moolenaar 443a259d8d3SBram Moolenaardef Test_compile_const_expr() 444a259d8d3SBram Moolenaar assert_equal("\nyes", execute('call HasEval()')) 445a259d8d3SBram Moolenaar let instr = execute('disassemble HasEval') 4460f18b6d1SBram Moolenaar assert_match('PUSHS "yes"', instr) 4470f18b6d1SBram Moolenaar assert_notmatch('PUSHS "no"', instr) 4480f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 449a259d8d3SBram Moolenaar 450a259d8d3SBram Moolenaar assert_equal("\nno", execute('call HasNothing()')) 451a259d8d3SBram Moolenaar instr = execute('disassemble HasNothing') 4520f18b6d1SBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 4530f18b6d1SBram Moolenaar assert_match('PUSHS "no"', instr) 4540f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 4550f18b6d1SBram Moolenaarenddef 4560f18b6d1SBram Moolenaar 4570f18b6d1SBram Moolenaarfunc NotCompiled() 4580f18b6d1SBram Moolenaar echo "not" 4590f18b6d1SBram Moolenaarendfunc 4600f18b6d1SBram Moolenaar 4610f18b6d1SBram Moolenaarlet s:scriptvar = 4 4620f18b6d1SBram Moolenaarlet g:globalvar = 'g' 4630f18b6d1SBram Moolenaar 464b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string) 4650f18b6d1SBram Moolenaar let local = 1 4660f18b6d1SBram Moolenaar buffers 4670f18b6d1SBram Moolenaar echo arg 4680f18b6d1SBram Moolenaar echo local 4690f18b6d1SBram Moolenaar echo v:version 4700f18b6d1SBram Moolenaar echo s:scriptvar 4710f18b6d1SBram Moolenaar echo g:globalvar 4720f18b6d1SBram Moolenaar echo &tabstop 4730f18b6d1SBram Moolenaar echo $ENVVAR 4740f18b6d1SBram Moolenaar echo @z 4750f18b6d1SBram Moolenaarenddef 4760f18b6d1SBram Moolenaar 477*ff80cb68SBram Moolenaardef s:ScriptFuncPush() 478*ff80cb68SBram Moolenaar let localbool = true 479*ff80cb68SBram Moolenaar let localspec = v:none 480*ff80cb68SBram Moolenaar let localblob = 0z1234 481*ff80cb68SBram Moolenaar if has('float') 482*ff80cb68SBram Moolenaar let localfloat = 1.234 483*ff80cb68SBram Moolenaar endif 484*ff80cb68SBram Moolenaarenddef 485*ff80cb68SBram Moolenaar 486b283a8a6SBram Moolenaardef s:ScriptFuncStore() 487b283a8a6SBram Moolenaar let localnr = 1 488b283a8a6SBram Moolenaar localnr = 2 489b283a8a6SBram Moolenaar let localstr = 'abc' 490b283a8a6SBram Moolenaar localstr = 'xyz' 491b283a8a6SBram Moolenaar v:char = 'abc' 492b283a8a6SBram Moolenaar s:scriptvar = 'sv' 493b283a8a6SBram Moolenaar g:globalvar = 'gv' 494b283a8a6SBram Moolenaar &tabstop = 8 495b283a8a6SBram Moolenaar $ENVVAR = 'ev' 496b283a8a6SBram Moolenaar @z = 'rv' 497b283a8a6SBram Moolenaarenddef 498b283a8a6SBram Moolenaar 499*ff80cb68SBram Moolenaardef s:ScriptFuncTry() 500*ff80cb68SBram Moolenaar try 501*ff80cb68SBram Moolenaar echo 'yes' 502*ff80cb68SBram Moolenaar catch /fail/ 503*ff80cb68SBram Moolenaar echo 'no' 504*ff80cb68SBram Moolenaar finally 505*ff80cb68SBram Moolenaar echo 'end' 506*ff80cb68SBram Moolenaar endtry 507*ff80cb68SBram Moolenaarenddef 508*ff80cb68SBram Moolenaar 5090f18b6d1SBram Moolenaardef Test_disassemble() 5100f18b6d1SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 5110f18b6d1SBram Moolenaar assert_fails('disass NotCompiled', 'E1062:') 5120f18b6d1SBram Moolenaar 513b283a8a6SBram Moolenaar let res = execute('disass s:ScriptFuncLoad') 514b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' 5150f18b6d1SBram Moolenaar \ .. 'buffers.*' 5160f18b6d1SBram Moolenaar \ .. ' EXEC \+buffers.*' 5170f18b6d1SBram Moolenaar \ .. ' LOAD arg\[-1\].*' 5180f18b6d1SBram Moolenaar \ .. ' LOAD $0.*' 5190f18b6d1SBram Moolenaar \ .. ' LOADV v:version.*' 5200f18b6d1SBram Moolenaar \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' 5210f18b6d1SBram Moolenaar \ .. ' LOADG g:globalvar.*' 5220f18b6d1SBram Moolenaar \ .. ' LOADENV $ENVVAR.*' 523b283a8a6SBram Moolenaar \ .. ' LOADREG @z.*' 524b283a8a6SBram Moolenaar \, res) 525b283a8a6SBram Moolenaar 526*ff80cb68SBram Moolenaar res = execute('disass s:ScriptFuncPush') 527*ff80cb68SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 528*ff80cb68SBram Moolenaar \ .. 'localbool = true.*' 529*ff80cb68SBram Moolenaar \ .. ' PUSH v:true.*' 530*ff80cb68SBram Moolenaar \ .. 'localspec = v:none.*' 531*ff80cb68SBram Moolenaar \ .. ' PUSH v:none.*' 532*ff80cb68SBram Moolenaar \ .. 'localblob = 0z1234.*' 533*ff80cb68SBram Moolenaar \ .. ' PUSHBLOB 0z1234.*' 534*ff80cb68SBram Moolenaar \, res) 535*ff80cb68SBram Moolenaar if has('float') 536*ff80cb68SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' 537*ff80cb68SBram Moolenaar \ .. 'localfloat = 1.234.*' 538*ff80cb68SBram Moolenaar \ .. ' PUSHF 1.234.*' 539*ff80cb68SBram Moolenaar \, res) 540*ff80cb68SBram Moolenaar endif 541*ff80cb68SBram Moolenaar 542b283a8a6SBram Moolenaar res = execute('disass s:ScriptFuncStore') 543b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' 544b283a8a6SBram Moolenaar \ .. 'localnr = 2.*' 545b283a8a6SBram Moolenaar \ .. ' STORE 2 in $0.*' 546b283a8a6SBram Moolenaar \ .. 'localstr = ''xyz''.*' 547b283a8a6SBram Moolenaar \ .. ' STORE $1.*' 548b283a8a6SBram Moolenaar \ .. 'v:char = ''abc''.*' 549b283a8a6SBram Moolenaar \ .. 'STOREV v:char.*' 550b283a8a6SBram Moolenaar \ .. 's:scriptvar = ''sv''.*' 551b283a8a6SBram Moolenaar \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*' 552b283a8a6SBram Moolenaar \ .. 'g:globalvar = ''gv''.*' 553b283a8a6SBram Moolenaar \ .. ' STOREG g:globalvar.*' 554b283a8a6SBram Moolenaar \ .. '&tabstop = 8.*' 555b283a8a6SBram Moolenaar \ .. ' STOREOPT &tabstop.*' 556b283a8a6SBram Moolenaar \ .. '$ENVVAR = ''ev''.*' 557b283a8a6SBram Moolenaar \ .. ' STOREENV $ENVVAR.*' 558b283a8a6SBram Moolenaar \ .. '@z = ''rv''.*' 559b283a8a6SBram Moolenaar \ .. ' STOREREG @z.*' 560b283a8a6SBram Moolenaar \, res) 561*ff80cb68SBram Moolenaar 562*ff80cb68SBram Moolenaar res = execute('disass s:ScriptFuncTry') 563*ff80cb68SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncTry.*' 564*ff80cb68SBram Moolenaar \ .. 'try.*' 565*ff80cb68SBram Moolenaar \ .. 'TRY catch -> \d\+, finally -> \d\+.*' 566*ff80cb68SBram Moolenaar \ .. 'catch /fail/.*' 567*ff80cb68SBram Moolenaar \ .. ' JUMP -> \d\+.*' 568*ff80cb68SBram Moolenaar \ .. ' PUSH v:exception.*' 569*ff80cb68SBram Moolenaar \ .. ' PUSHS "fail".*' 570*ff80cb68SBram Moolenaar \ .. ' COMPARESTRING =\~.*' 571*ff80cb68SBram Moolenaar \ .. ' JUMP_IF_FALSE -> \d\+.*' 572*ff80cb68SBram Moolenaar \ .. ' CATCH.*' 573*ff80cb68SBram Moolenaar \ .. 'finally.*' 574*ff80cb68SBram Moolenaar \ .. ' PUSHS "end".*' 575*ff80cb68SBram Moolenaar \ .. 'endtry.*' 576*ff80cb68SBram Moolenaar \ .. ' ENDTRY.*' 577*ff80cb68SBram Moolenaar \, res) 578a259d8d3SBram Moolenaarenddef 579a259d8d3SBram Moolenaar 5808a7d6542SBram Moolenaar 5818a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 582