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 134*26e117e9SBram Moolenaar"def Test_call_func_defined_later() 135*26e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 136*26e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 137*26e117e9SBram Moolenaar"enddef 138*26e117e9SBram Moolenaar 139*26e117e9SBram Moolenaarfunc DefineLater(arg) 140*26e117e9SBram Moolenaar return a:arg 141*26e117e9SBram Moolenaarendfunc 142*26e117e9SBram Moolenaar 143*26e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string 144*26e117e9SBram Moolenaar return name 145*26e117e9SBram Moolenaarenddef 146*26e117e9SBram Moolenaar 147*26e117e9SBram Moolenaarfunc Test_call_default_args_from_func() 148*26e117e9SBram Moolenaar " TODO: implement using default value for optional argument 149*26e117e9SBram Moolenaar "call assert_equal('string', MyDefaultArgs()) 150*26e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet') 151*26e117e9SBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 152*26e117e9SBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 153*26e117e9SBram Moolenaarendfunc 154*26e117e9SBram Moolenaar 155*26e117e9SBram Moolenaardef Test_call_default_args() 156*26e117e9SBram Moolenaar " TODO: implement using default value for optional argument 157*26e117e9SBram Moolenaar "assert_equal('string', MyDefaultArgs()) 158*26e117e9SBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 159*26e117e9SBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 160*26e117e9SBram Moolenaarenddef 161*26e117e9SBram Moolenaar 1628a7d6542SBram Moolenaardef Test_return_type_wrong() 1638a7d6542SBram Moolenaar " TODO: why is ! needed for Mac and FreeBSD? 164978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 165978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 166978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 167978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1688a7d6542SBram Moolenaarenddef 1698a7d6542SBram Moolenaar 1708a7d6542SBram Moolenaardef Test_try_catch() 1718a7d6542SBram Moolenaar let l = [] 1728a7d6542SBram Moolenaar try 1738a7d6542SBram Moolenaar add(l, '1') 1748a7d6542SBram Moolenaar throw 'wrong' 1758a7d6542SBram Moolenaar add(l, '2') 1768a7d6542SBram Moolenaar catch 1778a7d6542SBram Moolenaar add(l, v:exception) 1788a7d6542SBram Moolenaar finally 1798a7d6542SBram Moolenaar add(l, '3') 1808a7d6542SBram Moolenaar endtry 1818a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 1828a7d6542SBram Moolenaarenddef 1838a7d6542SBram Moolenaar 1848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 1858a7d6542SBram Moolenaar vim9script 1868a7d6542SBram Moolenaar let name: string = 'bob' 1878a7d6542SBram Moolenaar def Concat(arg: string): string 1888a7d6542SBram Moolenaar return name .. arg 1898a7d6542SBram Moolenaar enddef 1908a7d6542SBram Moolenaar let g:result = Concat('bie') 1918a7d6542SBram Moolenaar let g:localname = name 1928a7d6542SBram Moolenaar 1938a7d6542SBram Moolenaar export const CONST = 1234 1948a7d6542SBram Moolenaar export let exported = 9876 1958a7d6542SBram Moolenaar export def Exported(): string 1968a7d6542SBram Moolenaar return 'Exported' 1978a7d6542SBram Moolenaar enddef 1988a7d6542SBram MoolenaarEND 1998a7d6542SBram Moolenaar 2008a7d6542SBram Moolenaardef Test_vim9script() 2018a7d6542SBram Moolenaar let import_script_lines =<< trim END 2028a7d6542SBram Moolenaar vim9script 2038a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 2048a7d6542SBram Moolenaar g:imported = exported 2058a7d6542SBram Moolenaar g:imported_func = Exported() 2068a7d6542SBram Moolenaar END 2078a7d6542SBram Moolenaar 2088a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 2098a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 2108a7d6542SBram Moolenaar 2118a7d6542SBram Moolenaar source Ximport.vim 2128a7d6542SBram Moolenaar 2138a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 2148a7d6542SBram Moolenaar assert_equal('bob', g:localname) 2158a7d6542SBram Moolenaar assert_equal(9876, g:imported) 2168a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 2178a7d6542SBram Moolenaar assert_false(exists('g:name')) 2188a7d6542SBram Moolenaar 2198a7d6542SBram Moolenaar unlet g:result 2208a7d6542SBram Moolenaar unlet g:localname 2218a7d6542SBram Moolenaar unlet g:imported 2228a7d6542SBram Moolenaar unlet g:imported_func 2238a7d6542SBram Moolenaar delete('Ximport.vim') 2248a7d6542SBram Moolenaar delete('Xexport.vim') 2258a7d6542SBram Moolenaar 2268a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 2278a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 2288a7d6542SBram Moolenaarenddef 2298a7d6542SBram Moolenaar 2308a7d6542SBram Moolenaardef Test_vim9script_call() 2318a7d6542SBram Moolenaar let lines =<< trim END 2328a7d6542SBram Moolenaar vim9script 2338a7d6542SBram Moolenaar let var = '' 2348a7d6542SBram Moolenaar def MyFunc(arg: string) 2358a7d6542SBram Moolenaar var = arg 2368a7d6542SBram Moolenaar enddef 2378a7d6542SBram Moolenaar MyFunc('foobar') 2388a7d6542SBram Moolenaar assert_equal('foobar', var) 2398a7d6542SBram Moolenaar 2408a7d6542SBram Moolenaar let str = 'barfoo' 2418a7d6542SBram Moolenaar str->MyFunc() 2428a7d6542SBram Moolenaar assert_equal('barfoo', var) 2438a7d6542SBram Moolenaar 2448a7d6542SBram Moolenaar let g:value = 'value' 2458a7d6542SBram Moolenaar g:value->MyFunc() 2468a7d6542SBram Moolenaar assert_equal('value', var) 2478a7d6542SBram Moolenaar 2488a7d6542SBram Moolenaar let listvar = [] 2498a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2508a7d6542SBram Moolenaar listvar = arg 2518a7d6542SBram Moolenaar enddef 2528a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2538a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2548a7d6542SBram Moolenaar 2558a7d6542SBram Moolenaar let dictvar = {} 2568a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2578a7d6542SBram Moolenaar dictvar = arg 2588a7d6542SBram Moolenaar enddef 2598a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2608a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2618a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2628a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2638a7d6542SBram Moolenaar END 2648a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 2658a7d6542SBram Moolenaar source Xcall.vim 2668a7d6542SBram Moolenaar delete('Xcall.vim') 2678a7d6542SBram Moolenaarenddef 2688a7d6542SBram Moolenaar 2698a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 2708a7d6542SBram Moolenaar let lines =<< trim END 2718a7d6542SBram Moolenaar vim9script 2728a7d6542SBram Moolenaar let var = '' 2738a7d6542SBram Moolenaar def MyFunc(arg: string) 2748a7d6542SBram Moolenaar let var = 123 2758a7d6542SBram Moolenaar enddef 2768a7d6542SBram Moolenaar END 2778a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 2788a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 2798a7d6542SBram Moolenaar delete('Xcall_decl.vim') 2808a7d6542SBram Moolenaarenddef 2818a7d6542SBram Moolenaar 2828a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 2838a7d6542SBram Moolenaar let lines =<< trim END 2848a7d6542SBram Moolenaar vim9script 2858a7d6542SBram Moolenaar const var = '' 2868a7d6542SBram Moolenaar def MyFunc(arg: string) 2878a7d6542SBram Moolenaar var = 'asdf' 2888a7d6542SBram Moolenaar enddef 2898a7d6542SBram Moolenaar END 2908a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 2918a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 2928a7d6542SBram Moolenaar delete('Xcall_const.vim') 2938a7d6542SBram Moolenaarenddef 2948a7d6542SBram Moolenaar 2958a7d6542SBram Moolenaardef Test_vim9script_reload() 2968a7d6542SBram Moolenaar let lines =<< trim END 2978a7d6542SBram Moolenaar vim9script 2988a7d6542SBram Moolenaar const var = '' 2998a7d6542SBram Moolenaar let valone = 1234 3008a7d6542SBram Moolenaar def MyFunc(arg: string) 3018a7d6542SBram Moolenaar valone = 5678 3028a7d6542SBram Moolenaar enddef 3038a7d6542SBram Moolenaar END 3048a7d6542SBram Moolenaar let morelines =<< trim END 3058a7d6542SBram Moolenaar let valtwo = 222 3068a7d6542SBram Moolenaar export def GetValtwo(): number 3078a7d6542SBram Moolenaar return valtwo 3088a7d6542SBram Moolenaar enddef 3098a7d6542SBram Moolenaar END 3108a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 3118a7d6542SBram Moolenaar source Xreload.vim 3128a7d6542SBram Moolenaar source Xreload.vim 3138a7d6542SBram Moolenaar source Xreload.vim 3148a7d6542SBram Moolenaar 3158a7d6542SBram Moolenaar let testlines =<< trim END 3168a7d6542SBram Moolenaar vim9script 3178a7d6542SBram Moolenaar def TheFunc() 3188a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 3198a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 3208a7d6542SBram Moolenaar enddef 3218a7d6542SBram Moolenaar TheFunc() 3228a7d6542SBram Moolenaar END 3238a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 3248a7d6542SBram Moolenaar source Ximport.vim 3258a7d6542SBram Moolenaar 3268a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 3278a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 3288a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3298a7d6542SBram Moolenaar source Xreload.vim 3308a7d6542SBram Moolenaar source Ximport.vim 3318a7d6542SBram Moolenaar 3328a7d6542SBram Moolenaar " cannot declare a var twice 3338a7d6542SBram Moolenaar lines =<< trim END 3348a7d6542SBram Moolenaar vim9script 3358a7d6542SBram Moolenaar let valone = 1234 3368a7d6542SBram Moolenaar let valone = 5678 3378a7d6542SBram Moolenaar END 3388a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3398a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3408a7d6542SBram Moolenaar 3418a7d6542SBram Moolenaar delete('Xreload.vim') 3428a7d6542SBram Moolenaar delete('Ximport.vim') 3438a7d6542SBram Moolenaarenddef 3448a7d6542SBram Moolenaar 3458a7d6542SBram Moolenaardef Test_import_absolute() 3468a7d6542SBram Moolenaar let import_lines = [ 3478a7d6542SBram Moolenaar \ 'vim9script', 3488a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 349b283a8a6SBram Moolenaar \ 'def UseExported()', 3508a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 3514e12a5dfSBram Moolenaar \ ' exported = 8888', 3524e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 353b283a8a6SBram Moolenaar \ 'enddef', 354b283a8a6SBram Moolenaar \ 'UseExported()', 3554e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 3568a7d6542SBram Moolenaar \ ] 3578a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3588a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3598a7d6542SBram Moolenaar 3608a7d6542SBram Moolenaar source Ximport_abs.vim 3618a7d6542SBram Moolenaar 3628a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 3634e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 364b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 365b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 366b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3674e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 3684e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 3694e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 3704e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 3714e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 3724e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 3734e12a5dfSBram Moolenaar \, g:import_disassembled) 3748a7d6542SBram Moolenaar unlet g:imported_abs 3754e12a5dfSBram Moolenaar unlet g:import_disassembled 3768a7d6542SBram Moolenaar 3778a7d6542SBram Moolenaar delete('Ximport_abs.vim') 3788a7d6542SBram Moolenaar delete('Xexport_abs.vim') 3798a7d6542SBram Moolenaarenddef 3808a7d6542SBram Moolenaar 3818a7d6542SBram Moolenaardef Test_import_rtp() 3828a7d6542SBram Moolenaar let import_lines = [ 3838a7d6542SBram Moolenaar \ 'vim9script', 3848a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 3858a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 3868a7d6542SBram Moolenaar \ ] 3878a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 3888a7d6542SBram Moolenaar mkdir('import') 3898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 3908a7d6542SBram Moolenaar 3918a7d6542SBram Moolenaar let save_rtp = &rtp 3928a7d6542SBram Moolenaar &rtp = getcwd() 3938a7d6542SBram Moolenaar source Ximport_rtp.vim 3948a7d6542SBram Moolenaar &rtp = save_rtp 3958a7d6542SBram Moolenaar 3968a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 3978a7d6542SBram Moolenaar unlet g:imported_rtp 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 4008a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 4018a7d6542SBram Moolenaar delete('import', 'd') 4028a7d6542SBram Moolenaarenddef 4038a7d6542SBram Moolenaar 4048a7d6542SBram Moolenaardef Test_fixed_size_list() 4058a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 4068a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 4078a7d6542SBram Moolenaar l->remove(0) 4088a7d6542SBram Moolenaar l->add(5) 4098a7d6542SBram Moolenaar l->insert(99, 1) 4100f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 4118a7d6542SBram Moolenaarenddef 4128a7d6542SBram Moolenaar 413673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 414673660abSBram Moolenaar" recognized. 415673660abSBram Moolenaarfunc Test_function_python() 416673660abSBram Moolenaar CheckFeature python3 417673660abSBram Moolenaar let py = 'python3' 418673660abSBram Moolenaar execute py "<< EOF" 419673660abSBram Moolenaardef do_something(): 420673660abSBram Moolenaar return 1 421673660abSBram MoolenaarEOF 422673660abSBram Moolenaarendfunc 423673660abSBram Moolenaar 424a259d8d3SBram Moolenaardef HasEval() 425a259d8d3SBram Moolenaar if has('eval') 426a259d8d3SBram Moolenaar echo 'yes' 427a259d8d3SBram Moolenaar else 428a259d8d3SBram Moolenaar echo 'no' 429a259d8d3SBram Moolenaar endif 430a259d8d3SBram Moolenaarenddef 431a259d8d3SBram Moolenaar 432a259d8d3SBram Moolenaardef HasNothing() 433a259d8d3SBram Moolenaar if has('nothing') 434a259d8d3SBram Moolenaar echo 'yes' 435a259d8d3SBram Moolenaar else 436a259d8d3SBram Moolenaar echo 'no' 437a259d8d3SBram Moolenaar endif 438a259d8d3SBram Moolenaarenddef 439a259d8d3SBram Moolenaar 440a259d8d3SBram Moolenaardef Test_compile_const_expr() 441a259d8d3SBram Moolenaar assert_equal("\nyes", execute('call HasEval()')) 442a259d8d3SBram Moolenaar let instr = execute('disassemble HasEval') 4430f18b6d1SBram Moolenaar assert_match('PUSHS "yes"', instr) 4440f18b6d1SBram Moolenaar assert_notmatch('PUSHS "no"', instr) 4450f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 446a259d8d3SBram Moolenaar 447a259d8d3SBram Moolenaar assert_equal("\nno", execute('call HasNothing()')) 448a259d8d3SBram Moolenaar instr = execute('disassemble HasNothing') 4490f18b6d1SBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 4500f18b6d1SBram Moolenaar assert_match('PUSHS "no"', instr) 4510f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 4520f18b6d1SBram Moolenaarenddef 4530f18b6d1SBram Moolenaar 4540f18b6d1SBram Moolenaarfunc NotCompiled() 4550f18b6d1SBram Moolenaar echo "not" 4560f18b6d1SBram Moolenaarendfunc 4570f18b6d1SBram Moolenaar 4580f18b6d1SBram Moolenaarlet s:scriptvar = 4 4590f18b6d1SBram Moolenaarlet g:globalvar = 'g' 4600f18b6d1SBram Moolenaar 461b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string) 4620f18b6d1SBram Moolenaar let local = 1 4630f18b6d1SBram Moolenaar buffers 4640f18b6d1SBram Moolenaar echo arg 4650f18b6d1SBram Moolenaar echo local 4660f18b6d1SBram Moolenaar echo v:version 4670f18b6d1SBram Moolenaar echo s:scriptvar 4680f18b6d1SBram Moolenaar echo g:globalvar 4690f18b6d1SBram Moolenaar echo &tabstop 4700f18b6d1SBram Moolenaar echo $ENVVAR 4710f18b6d1SBram Moolenaar echo @z 4720f18b6d1SBram Moolenaarenddef 4730f18b6d1SBram Moolenaar 474b283a8a6SBram Moolenaardef s:ScriptFuncStore() 475b283a8a6SBram Moolenaar let localnr = 1 476b283a8a6SBram Moolenaar localnr = 2 477b283a8a6SBram Moolenaar let localstr = 'abc' 478b283a8a6SBram Moolenaar localstr = 'xyz' 479b283a8a6SBram Moolenaar v:char = 'abc' 480b283a8a6SBram Moolenaar s:scriptvar = 'sv' 481b283a8a6SBram Moolenaar g:globalvar = 'gv' 482b283a8a6SBram Moolenaar &tabstop = 8 483b283a8a6SBram Moolenaar $ENVVAR = 'ev' 484b283a8a6SBram Moolenaar @z = 'rv' 485b283a8a6SBram Moolenaarenddef 486b283a8a6SBram Moolenaar 4870f18b6d1SBram Moolenaardef Test_disassemble() 4880f18b6d1SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 4890f18b6d1SBram Moolenaar assert_fails('disass NotCompiled', 'E1062:') 4900f18b6d1SBram Moolenaar 491b283a8a6SBram Moolenaar let res = execute('disass s:ScriptFuncLoad') 492b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' 4930f18b6d1SBram Moolenaar \ .. 'buffers.*' 4940f18b6d1SBram Moolenaar \ .. ' EXEC \+buffers.*' 4950f18b6d1SBram Moolenaar \ .. ' LOAD arg\[-1\].*' 4960f18b6d1SBram Moolenaar \ .. ' LOAD $0.*' 4970f18b6d1SBram Moolenaar \ .. ' LOADV v:version.*' 4980f18b6d1SBram Moolenaar \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' 4990f18b6d1SBram Moolenaar \ .. ' LOADG g:globalvar.*' 5000f18b6d1SBram Moolenaar \ .. ' LOADENV $ENVVAR.*' 501b283a8a6SBram Moolenaar \ .. ' LOADREG @z.*' 502b283a8a6SBram Moolenaar \, res) 503b283a8a6SBram Moolenaar 504b283a8a6SBram Moolenaar " TODO: 505b283a8a6SBram Moolenaar " v:char = 506b283a8a6SBram Moolenaar " s:scriptvar = 507b283a8a6SBram Moolenaar res = execute('disass s:ScriptFuncStore') 508b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' 509b283a8a6SBram Moolenaar \ .. 'localnr = 2.*' 510b283a8a6SBram Moolenaar \ .. ' STORE 2 in $0.*' 511b283a8a6SBram Moolenaar \ .. 'localstr = ''xyz''.*' 512b283a8a6SBram Moolenaar \ .. ' STORE $1.*' 513b283a8a6SBram Moolenaar \ .. 'v:char = ''abc''.*' 514b283a8a6SBram Moolenaar \ .. 'STOREV v:char.*' 515b283a8a6SBram Moolenaar \ .. 's:scriptvar = ''sv''.*' 516b283a8a6SBram Moolenaar \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*' 517b283a8a6SBram Moolenaar \ .. 'g:globalvar = ''gv''.*' 518b283a8a6SBram Moolenaar \ .. ' STOREG g:globalvar.*' 519b283a8a6SBram Moolenaar \ .. '&tabstop = 8.*' 520b283a8a6SBram Moolenaar \ .. ' STOREOPT &tabstop.*' 521b283a8a6SBram Moolenaar \ .. '$ENVVAR = ''ev''.*' 522b283a8a6SBram Moolenaar \ .. ' STOREENV $ENVVAR.*' 523b283a8a6SBram Moolenaar \ .. '@z = ''rv''.*' 524b283a8a6SBram Moolenaar \ .. ' STOREREG @z.*' 525b283a8a6SBram Moolenaar \, res) 526a259d8d3SBram Moolenaarenddef 527a259d8d3SBram Moolenaar 5288a7d6542SBram Moolenaar 5298a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 530