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) 7*978d170bSBram 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} 458a7d6542SBram Moolenaarenddef 468a7d6542SBram Moolenaar 478a7d6542SBram Moolenaarfunc Test_assignment_failure() 488a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 498a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 508a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 518a7d6542SBram Moolenaar 528a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 538a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 548a7d6542SBram Moolenaar 558a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 568a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 578a7d6542SBram Moolenaar 588a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 598a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 608a7d6542SBram Moolenaar 618a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 628a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 638a7d6542SBram Moolenaarendfunc 648a7d6542SBram Moolenaar 658a7d6542SBram Moolenaarfunc Test_const() 668a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 678a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 688a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 698a7d6542SBram Moolenaarendfunc 708a7d6542SBram Moolenaar 718a7d6542SBram Moolenaardef Test_block() 728a7d6542SBram Moolenaar let outer = 1 738a7d6542SBram Moolenaar { 748a7d6542SBram Moolenaar let inner = 2 758a7d6542SBram Moolenaar assert_equal(1, outer) 768a7d6542SBram Moolenaar assert_equal(2, inner) 778a7d6542SBram Moolenaar } 788a7d6542SBram Moolenaar assert_equal(1, outer) 798a7d6542SBram Moolenaarenddef 808a7d6542SBram Moolenaar 818a7d6542SBram Moolenaarfunc Test_block_failure() 828a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 838a7d6542SBram Moolenaarendfunc 848a7d6542SBram Moolenaar 858a7d6542SBram Moolenaardef ReturnString(): string 868a7d6542SBram Moolenaar return 'string' 878a7d6542SBram Moolenaarenddef 888a7d6542SBram Moolenaar 898a7d6542SBram Moolenaardef ReturnNumber(): number 908a7d6542SBram Moolenaar return 123 918a7d6542SBram Moolenaarenddef 928a7d6542SBram Moolenaar 938a7d6542SBram Moolenaardef Test_return_string() 948a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 958a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 968a7d6542SBram Moolenaarenddef 978a7d6542SBram Moolenaar 988a7d6542SBram Moolenaarfunc Increment() 998a7d6542SBram Moolenaar let g:counter += 1 1008a7d6542SBram Moolenaarendfunc 1018a7d6542SBram Moolenaar 1028a7d6542SBram Moolenaardef Test_call_ufunc_count() 1038a7d6542SBram Moolenaar g:counter = 1 1048a7d6542SBram Moolenaar Increment() 1058a7d6542SBram Moolenaar Increment() 1068a7d6542SBram Moolenaar Increment() 1078a7d6542SBram Moolenaar " works with and without :call 1088a7d6542SBram Moolenaar assert_equal(4, g:counter) 1098a7d6542SBram Moolenaar call assert_equal(4, g:counter) 1108a7d6542SBram Moolenaar unlet g:counter 1118a7d6542SBram Moolenaarenddef 1128a7d6542SBram Moolenaar 1138a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1148a7d6542SBram Moolenaar let res = arg 1158a7d6542SBram Moolenaar for s in rest 1168a7d6542SBram Moolenaar res ..= ',' .. s 1178a7d6542SBram Moolenaar endfor 1188a7d6542SBram Moolenaar return res 1198a7d6542SBram Moolenaarenddef 1208a7d6542SBram Moolenaar 1218a7d6542SBram Moolenaardef Test_call_varargs() 1228a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1238a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1248a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1258a7d6542SBram Moolenaarenddef 1268a7d6542SBram Moolenaar 1278a7d6542SBram Moolenaardef Test_return_type_wrong() 1288a7d6542SBram Moolenaar " TODO: why is ! needed for Mac and FreeBSD? 129*978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 130*978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 131*978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 132*978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1338a7d6542SBram Moolenaarenddef 1348a7d6542SBram Moolenaar 1358a7d6542SBram Moolenaardef Test_try_catch() 1368a7d6542SBram Moolenaar let l = [] 1378a7d6542SBram Moolenaar try 1388a7d6542SBram Moolenaar add(l, '1') 1398a7d6542SBram Moolenaar throw 'wrong' 1408a7d6542SBram Moolenaar add(l, '2') 1418a7d6542SBram Moolenaar catch 1428a7d6542SBram Moolenaar add(l, v:exception) 1438a7d6542SBram Moolenaar finally 1448a7d6542SBram Moolenaar add(l, '3') 1458a7d6542SBram Moolenaar endtry 1468a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 1478a7d6542SBram Moolenaarenddef 1488a7d6542SBram Moolenaar 1498a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 1508a7d6542SBram Moolenaar vim9script 1518a7d6542SBram Moolenaar let name: string = 'bob' 1528a7d6542SBram Moolenaar def Concat(arg: string): string 1538a7d6542SBram Moolenaar return name .. arg 1548a7d6542SBram Moolenaar enddef 1558a7d6542SBram Moolenaar let g:result = Concat('bie') 1568a7d6542SBram Moolenaar let g:localname = name 1578a7d6542SBram Moolenaar 1588a7d6542SBram Moolenaar export const CONST = 1234 1598a7d6542SBram Moolenaar export let exported = 9876 1608a7d6542SBram Moolenaar export def Exported(): string 1618a7d6542SBram Moolenaar return 'Exported' 1628a7d6542SBram Moolenaar enddef 1638a7d6542SBram MoolenaarEND 1648a7d6542SBram Moolenaar 1658a7d6542SBram Moolenaardef Test_vim9script() 1668a7d6542SBram Moolenaar let import_script_lines =<< trim END 1678a7d6542SBram Moolenaar vim9script 1688a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 1698a7d6542SBram Moolenaar g:imported = exported 1708a7d6542SBram Moolenaar g:imported_func = Exported() 1718a7d6542SBram Moolenaar END 1728a7d6542SBram Moolenaar 1738a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 1748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 1758a7d6542SBram Moolenaar 1768a7d6542SBram Moolenaar source Ximport.vim 1778a7d6542SBram Moolenaar 1788a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 1798a7d6542SBram Moolenaar assert_equal('bob', g:localname) 1808a7d6542SBram Moolenaar assert_equal(9876, g:imported) 1818a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 1828a7d6542SBram Moolenaar assert_false(exists('g:name')) 1838a7d6542SBram Moolenaar 1848a7d6542SBram Moolenaar unlet g:result 1858a7d6542SBram Moolenaar unlet g:localname 1868a7d6542SBram Moolenaar unlet g:imported 1878a7d6542SBram Moolenaar unlet g:imported_func 1888a7d6542SBram Moolenaar delete('Ximport.vim') 1898a7d6542SBram Moolenaar delete('Xexport.vim') 1908a7d6542SBram Moolenaar 1918a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 1928a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1938a7d6542SBram Moolenaarenddef 1948a7d6542SBram Moolenaar 1958a7d6542SBram Moolenaardef Test_vim9script_call() 1968a7d6542SBram Moolenaar let lines =<< trim END 1978a7d6542SBram Moolenaar vim9script 1988a7d6542SBram Moolenaar let var = '' 1998a7d6542SBram Moolenaar def MyFunc(arg: string) 2008a7d6542SBram Moolenaar var = arg 2018a7d6542SBram Moolenaar enddef 2028a7d6542SBram Moolenaar MyFunc('foobar') 2038a7d6542SBram Moolenaar assert_equal('foobar', var) 2048a7d6542SBram Moolenaar 2058a7d6542SBram Moolenaar let str = 'barfoo' 2068a7d6542SBram Moolenaar str->MyFunc() 2078a7d6542SBram Moolenaar assert_equal('barfoo', var) 2088a7d6542SBram Moolenaar 2098a7d6542SBram Moolenaar let g:value = 'value' 2108a7d6542SBram Moolenaar g:value->MyFunc() 2118a7d6542SBram Moolenaar assert_equal('value', var) 2128a7d6542SBram Moolenaar 2138a7d6542SBram Moolenaar let listvar = [] 2148a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2158a7d6542SBram Moolenaar listvar = arg 2168a7d6542SBram Moolenaar enddef 2178a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2188a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2198a7d6542SBram Moolenaar 2208a7d6542SBram Moolenaar let dictvar = {} 2218a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2228a7d6542SBram Moolenaar dictvar = arg 2238a7d6542SBram Moolenaar enddef 2248a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2258a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2268a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2278a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2288a7d6542SBram Moolenaar END 2298a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 2308a7d6542SBram Moolenaar source Xcall.vim 2318a7d6542SBram Moolenaar delete('Xcall.vim') 2328a7d6542SBram Moolenaarenddef 2338a7d6542SBram Moolenaar 2348a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 2358a7d6542SBram Moolenaar let lines =<< trim END 2368a7d6542SBram Moolenaar vim9script 2378a7d6542SBram Moolenaar let var = '' 2388a7d6542SBram Moolenaar def MyFunc(arg: string) 2398a7d6542SBram Moolenaar let var = 123 2408a7d6542SBram Moolenaar enddef 2418a7d6542SBram Moolenaar END 2428a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 2438a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 2448a7d6542SBram Moolenaar delete('Xcall_decl.vim') 2458a7d6542SBram Moolenaarenddef 2468a7d6542SBram Moolenaar 2478a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 2488a7d6542SBram Moolenaar let lines =<< trim END 2498a7d6542SBram Moolenaar vim9script 2508a7d6542SBram Moolenaar const var = '' 2518a7d6542SBram Moolenaar def MyFunc(arg: string) 2528a7d6542SBram Moolenaar var = 'asdf' 2538a7d6542SBram Moolenaar enddef 2548a7d6542SBram Moolenaar END 2558a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 2568a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 2578a7d6542SBram Moolenaar delete('Xcall_const.vim') 2588a7d6542SBram Moolenaarenddef 2598a7d6542SBram Moolenaar 2608a7d6542SBram Moolenaardef Test_vim9script_reload() 2618a7d6542SBram Moolenaar let lines =<< trim END 2628a7d6542SBram Moolenaar vim9script 2638a7d6542SBram Moolenaar const var = '' 2648a7d6542SBram Moolenaar let valone = 1234 2658a7d6542SBram Moolenaar def MyFunc(arg: string) 2668a7d6542SBram Moolenaar valone = 5678 2678a7d6542SBram Moolenaar enddef 2688a7d6542SBram Moolenaar END 2698a7d6542SBram Moolenaar let morelines =<< trim END 2708a7d6542SBram Moolenaar let valtwo = 222 2718a7d6542SBram Moolenaar export def GetValtwo(): number 2728a7d6542SBram Moolenaar return valtwo 2738a7d6542SBram Moolenaar enddef 2748a7d6542SBram Moolenaar END 2758a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 2768a7d6542SBram Moolenaar source Xreload.vim 2778a7d6542SBram Moolenaar source Xreload.vim 2788a7d6542SBram Moolenaar source Xreload.vim 2798a7d6542SBram Moolenaar 2808a7d6542SBram Moolenaar let testlines =<< trim END 2818a7d6542SBram Moolenaar vim9script 2828a7d6542SBram Moolenaar def TheFunc() 2838a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 2848a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 2858a7d6542SBram Moolenaar enddef 2868a7d6542SBram Moolenaar TheFunc() 2878a7d6542SBram Moolenaar END 2888a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 2898a7d6542SBram Moolenaar source Ximport.vim 2908a7d6542SBram Moolenaar 2918a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 2928a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 2938a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 2948a7d6542SBram Moolenaar source Xreload.vim 2958a7d6542SBram Moolenaar source Ximport.vim 2968a7d6542SBram Moolenaar 2978a7d6542SBram Moolenaar " cannot declare a var twice 2988a7d6542SBram Moolenaar lines =<< trim END 2998a7d6542SBram Moolenaar vim9script 3008a7d6542SBram Moolenaar let valone = 1234 3018a7d6542SBram Moolenaar let valone = 5678 3028a7d6542SBram Moolenaar END 3038a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3048a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3058a7d6542SBram Moolenaar 3068a7d6542SBram Moolenaar delete('Xreload.vim') 3078a7d6542SBram Moolenaar delete('Ximport.vim') 3088a7d6542SBram Moolenaarenddef 3098a7d6542SBram Moolenaar 3108a7d6542SBram Moolenaardef Test_import_absolute() 3118a7d6542SBram Moolenaar let import_lines = [ 3128a7d6542SBram Moolenaar \ 'vim9script', 3138a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 3148a7d6542SBram Moolenaar \ 'g:imported_abs = exported', 3158a7d6542SBram Moolenaar \ ] 3168a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3178a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3188a7d6542SBram Moolenaar 3198a7d6542SBram Moolenaar source Ximport_abs.vim 3208a7d6542SBram Moolenaar 3218a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 3228a7d6542SBram Moolenaar unlet g:imported_abs 3238a7d6542SBram Moolenaar 3248a7d6542SBram Moolenaar delete('Ximport_abs.vim') 3258a7d6542SBram Moolenaar delete('Xexport_abs.vim') 3268a7d6542SBram Moolenaarenddef 3278a7d6542SBram Moolenaar 3288a7d6542SBram Moolenaardef Test_import_rtp() 3298a7d6542SBram Moolenaar let import_lines = [ 3308a7d6542SBram Moolenaar \ 'vim9script', 3318a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 3328a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 3338a7d6542SBram Moolenaar \ ] 3348a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 3358a7d6542SBram Moolenaar mkdir('import') 3368a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 3378a7d6542SBram Moolenaar 3388a7d6542SBram Moolenaar let save_rtp = &rtp 3398a7d6542SBram Moolenaar &rtp = getcwd() 3408a7d6542SBram Moolenaar source Ximport_rtp.vim 3418a7d6542SBram Moolenaar &rtp = save_rtp 3428a7d6542SBram Moolenaar 3438a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 3448a7d6542SBram Moolenaar unlet g:imported_rtp 3458a7d6542SBram Moolenaar 3468a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 3478a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 3488a7d6542SBram Moolenaar delete('import', 'd') 3498a7d6542SBram Moolenaarenddef 3508a7d6542SBram Moolenaar 3518a7d6542SBram Moolenaardef Test_fixed_size_list() 3528a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 3538a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 3548a7d6542SBram Moolenaar l->remove(0) 3558a7d6542SBram Moolenaar l->add(5) 3568a7d6542SBram Moolenaar l->insert(99, 1) 3578a7d6542SBram Moolenaar call assert_equal([2, 99, 3, 4, 5], l) 3588a7d6542SBram Moolenaarenddef 3598a7d6542SBram Moolenaar 360673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 361673660abSBram Moolenaar" recognized. 362673660abSBram Moolenaarfunc Test_function_python() 363673660abSBram Moolenaar CheckFeature python3 364673660abSBram Moolenaar let py = 'python3' 365673660abSBram Moolenaar execute py "<< EOF" 366673660abSBram Moolenaardef do_something(): 367673660abSBram Moolenaar return 1 368673660abSBram MoolenaarEOF 369673660abSBram Moolenaarendfunc 370673660abSBram Moolenaar 3718a7d6542SBram Moolenaar 3728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 373