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 1348a7d6542SBram Moolenaardef Test_return_type_wrong() 1358a7d6542SBram Moolenaar " TODO: why is ! needed for Mac and FreeBSD? 136978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 137978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 138978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 139978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 1408a7d6542SBram Moolenaarenddef 1418a7d6542SBram Moolenaar 1428a7d6542SBram Moolenaardef Test_try_catch() 1438a7d6542SBram Moolenaar let l = [] 1448a7d6542SBram Moolenaar try 1458a7d6542SBram Moolenaar add(l, '1') 1468a7d6542SBram Moolenaar throw 'wrong' 1478a7d6542SBram Moolenaar add(l, '2') 1488a7d6542SBram Moolenaar catch 1498a7d6542SBram Moolenaar add(l, v:exception) 1508a7d6542SBram Moolenaar finally 1518a7d6542SBram Moolenaar add(l, '3') 1528a7d6542SBram Moolenaar endtry 1538a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 1548a7d6542SBram Moolenaarenddef 1558a7d6542SBram Moolenaar 1568a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 1578a7d6542SBram Moolenaar vim9script 1588a7d6542SBram Moolenaar let name: string = 'bob' 1598a7d6542SBram Moolenaar def Concat(arg: string): string 1608a7d6542SBram Moolenaar return name .. arg 1618a7d6542SBram Moolenaar enddef 1628a7d6542SBram Moolenaar let g:result = Concat('bie') 1638a7d6542SBram Moolenaar let g:localname = name 1648a7d6542SBram Moolenaar 1658a7d6542SBram Moolenaar export const CONST = 1234 1668a7d6542SBram Moolenaar export let exported = 9876 1678a7d6542SBram Moolenaar export def Exported(): string 1688a7d6542SBram Moolenaar return 'Exported' 1698a7d6542SBram Moolenaar enddef 1708a7d6542SBram MoolenaarEND 1718a7d6542SBram Moolenaar 1728a7d6542SBram Moolenaardef Test_vim9script() 1738a7d6542SBram Moolenaar let import_script_lines =<< trim END 1748a7d6542SBram Moolenaar vim9script 1758a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 1768a7d6542SBram Moolenaar g:imported = exported 1778a7d6542SBram Moolenaar g:imported_func = Exported() 1788a7d6542SBram Moolenaar END 1798a7d6542SBram Moolenaar 1808a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 1818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 1828a7d6542SBram Moolenaar 1838a7d6542SBram Moolenaar source Ximport.vim 1848a7d6542SBram Moolenaar 1858a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 1868a7d6542SBram Moolenaar assert_equal('bob', g:localname) 1878a7d6542SBram Moolenaar assert_equal(9876, g:imported) 1888a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 1898a7d6542SBram Moolenaar assert_false(exists('g:name')) 1908a7d6542SBram Moolenaar 1918a7d6542SBram Moolenaar unlet g:result 1928a7d6542SBram Moolenaar unlet g:localname 1938a7d6542SBram Moolenaar unlet g:imported 1948a7d6542SBram Moolenaar unlet g:imported_func 1958a7d6542SBram Moolenaar delete('Ximport.vim') 1968a7d6542SBram Moolenaar delete('Xexport.vim') 1978a7d6542SBram Moolenaar 1988a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 1998a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 2008a7d6542SBram Moolenaarenddef 2018a7d6542SBram Moolenaar 2028a7d6542SBram Moolenaardef Test_vim9script_call() 2038a7d6542SBram Moolenaar let lines =<< trim END 2048a7d6542SBram Moolenaar vim9script 2058a7d6542SBram Moolenaar let var = '' 2068a7d6542SBram Moolenaar def MyFunc(arg: string) 2078a7d6542SBram Moolenaar var = arg 2088a7d6542SBram Moolenaar enddef 2098a7d6542SBram Moolenaar MyFunc('foobar') 2108a7d6542SBram Moolenaar assert_equal('foobar', var) 2118a7d6542SBram Moolenaar 2128a7d6542SBram Moolenaar let str = 'barfoo' 2138a7d6542SBram Moolenaar str->MyFunc() 2148a7d6542SBram Moolenaar assert_equal('barfoo', var) 2158a7d6542SBram Moolenaar 2168a7d6542SBram Moolenaar let g:value = 'value' 2178a7d6542SBram Moolenaar g:value->MyFunc() 2188a7d6542SBram Moolenaar assert_equal('value', var) 2198a7d6542SBram Moolenaar 2208a7d6542SBram Moolenaar let listvar = [] 2218a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 2228a7d6542SBram Moolenaar listvar = arg 2238a7d6542SBram Moolenaar enddef 2248a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 2258a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 2268a7d6542SBram Moolenaar 2278a7d6542SBram Moolenaar let dictvar = {} 2288a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 2298a7d6542SBram Moolenaar dictvar = arg 2308a7d6542SBram Moolenaar enddef 2318a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 2328a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 2338a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 2348a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 2358a7d6542SBram Moolenaar END 2368a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 2378a7d6542SBram Moolenaar source Xcall.vim 2388a7d6542SBram Moolenaar delete('Xcall.vim') 2398a7d6542SBram Moolenaarenddef 2408a7d6542SBram Moolenaar 2418a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 2428a7d6542SBram Moolenaar let lines =<< trim END 2438a7d6542SBram Moolenaar vim9script 2448a7d6542SBram Moolenaar let var = '' 2458a7d6542SBram Moolenaar def MyFunc(arg: string) 2468a7d6542SBram Moolenaar let var = 123 2478a7d6542SBram Moolenaar enddef 2488a7d6542SBram Moolenaar END 2498a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 2508a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 2518a7d6542SBram Moolenaar delete('Xcall_decl.vim') 2528a7d6542SBram Moolenaarenddef 2538a7d6542SBram Moolenaar 2548a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 2558a7d6542SBram Moolenaar let lines =<< trim END 2568a7d6542SBram Moolenaar vim9script 2578a7d6542SBram Moolenaar const var = '' 2588a7d6542SBram Moolenaar def MyFunc(arg: string) 2598a7d6542SBram Moolenaar var = 'asdf' 2608a7d6542SBram Moolenaar enddef 2618a7d6542SBram Moolenaar END 2628a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 2638a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 2648a7d6542SBram Moolenaar delete('Xcall_const.vim') 2658a7d6542SBram Moolenaarenddef 2668a7d6542SBram Moolenaar 2678a7d6542SBram Moolenaardef Test_vim9script_reload() 2688a7d6542SBram Moolenaar let lines =<< trim END 2698a7d6542SBram Moolenaar vim9script 2708a7d6542SBram Moolenaar const var = '' 2718a7d6542SBram Moolenaar let valone = 1234 2728a7d6542SBram Moolenaar def MyFunc(arg: string) 2738a7d6542SBram Moolenaar valone = 5678 2748a7d6542SBram Moolenaar enddef 2758a7d6542SBram Moolenaar END 2768a7d6542SBram Moolenaar let morelines =<< trim END 2778a7d6542SBram Moolenaar let valtwo = 222 2788a7d6542SBram Moolenaar export def GetValtwo(): number 2798a7d6542SBram Moolenaar return valtwo 2808a7d6542SBram Moolenaar enddef 2818a7d6542SBram Moolenaar END 2828a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 2838a7d6542SBram Moolenaar source Xreload.vim 2848a7d6542SBram Moolenaar source Xreload.vim 2858a7d6542SBram Moolenaar source Xreload.vim 2868a7d6542SBram Moolenaar 2878a7d6542SBram Moolenaar let testlines =<< trim END 2888a7d6542SBram Moolenaar vim9script 2898a7d6542SBram Moolenaar def TheFunc() 2908a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 2918a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 2928a7d6542SBram Moolenaar enddef 2938a7d6542SBram Moolenaar TheFunc() 2948a7d6542SBram Moolenaar END 2958a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 2968a7d6542SBram Moolenaar source Ximport.vim 2978a7d6542SBram Moolenaar 2988a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 2998a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 3008a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3018a7d6542SBram Moolenaar source Xreload.vim 3028a7d6542SBram Moolenaar source Ximport.vim 3038a7d6542SBram Moolenaar 3048a7d6542SBram Moolenaar " cannot declare a var twice 3058a7d6542SBram Moolenaar lines =<< trim END 3068a7d6542SBram Moolenaar vim9script 3078a7d6542SBram Moolenaar let valone = 1234 3088a7d6542SBram Moolenaar let valone = 5678 3098a7d6542SBram Moolenaar END 3108a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 3118a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 3128a7d6542SBram Moolenaar 3138a7d6542SBram Moolenaar delete('Xreload.vim') 3148a7d6542SBram Moolenaar delete('Ximport.vim') 3158a7d6542SBram Moolenaarenddef 3168a7d6542SBram Moolenaar 3178a7d6542SBram Moolenaardef Test_import_absolute() 3188a7d6542SBram Moolenaar let import_lines = [ 3198a7d6542SBram Moolenaar \ 'vim9script', 3208a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 321b283a8a6SBram Moolenaar \ 'def UseExported()', 3228a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 323*4e12a5dfSBram Moolenaar \ ' exported = 8888', 324*4e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 325b283a8a6SBram Moolenaar \ 'enddef', 326b283a8a6SBram Moolenaar \ 'UseExported()', 327*4e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 3288a7d6542SBram Moolenaar \ ] 3298a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 3308a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 3318a7d6542SBram Moolenaar 3328a7d6542SBram Moolenaar source Ximport_abs.vim 3338a7d6542SBram Moolenaar 3348a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 335*4e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 336b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 337b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 338b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 339*4e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 340*4e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 341*4e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 342*4e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 343*4e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 344*4e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 345*4e12a5dfSBram Moolenaar \, g:import_disassembled) 3468a7d6542SBram Moolenaar unlet g:imported_abs 347*4e12a5dfSBram Moolenaar unlet g:import_disassembled 3488a7d6542SBram Moolenaar 3498a7d6542SBram Moolenaar delete('Ximport_abs.vim') 3508a7d6542SBram Moolenaar delete('Xexport_abs.vim') 3518a7d6542SBram Moolenaarenddef 3528a7d6542SBram Moolenaar 3538a7d6542SBram Moolenaardef Test_import_rtp() 3548a7d6542SBram Moolenaar let import_lines = [ 3558a7d6542SBram Moolenaar \ 'vim9script', 3568a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 3578a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 3588a7d6542SBram Moolenaar \ ] 3598a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 3608a7d6542SBram Moolenaar mkdir('import') 3618a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 3628a7d6542SBram Moolenaar 3638a7d6542SBram Moolenaar let save_rtp = &rtp 3648a7d6542SBram Moolenaar &rtp = getcwd() 3658a7d6542SBram Moolenaar source Ximport_rtp.vim 3668a7d6542SBram Moolenaar &rtp = save_rtp 3678a7d6542SBram Moolenaar 3688a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 3698a7d6542SBram Moolenaar unlet g:imported_rtp 3708a7d6542SBram Moolenaar 3718a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 3728a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 3738a7d6542SBram Moolenaar delete('import', 'd') 3748a7d6542SBram Moolenaarenddef 3758a7d6542SBram Moolenaar 3768a7d6542SBram Moolenaardef Test_fixed_size_list() 3778a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 3788a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 3798a7d6542SBram Moolenaar l->remove(0) 3808a7d6542SBram Moolenaar l->add(5) 3818a7d6542SBram Moolenaar l->insert(99, 1) 3820f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 3838a7d6542SBram Moolenaarenddef 3848a7d6542SBram Moolenaar 385673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 386673660abSBram Moolenaar" recognized. 387673660abSBram Moolenaarfunc Test_function_python() 388673660abSBram Moolenaar CheckFeature python3 389673660abSBram Moolenaar let py = 'python3' 390673660abSBram Moolenaar execute py "<< EOF" 391673660abSBram Moolenaardef do_something(): 392673660abSBram Moolenaar return 1 393673660abSBram MoolenaarEOF 394673660abSBram Moolenaarendfunc 395673660abSBram Moolenaar 396a259d8d3SBram Moolenaardef HasEval() 397a259d8d3SBram Moolenaar if has('eval') 398a259d8d3SBram Moolenaar echo 'yes' 399a259d8d3SBram Moolenaar else 400a259d8d3SBram Moolenaar echo 'no' 401a259d8d3SBram Moolenaar endif 402a259d8d3SBram Moolenaarenddef 403a259d8d3SBram Moolenaar 404a259d8d3SBram Moolenaardef HasNothing() 405a259d8d3SBram Moolenaar if has('nothing') 406a259d8d3SBram Moolenaar echo 'yes' 407a259d8d3SBram Moolenaar else 408a259d8d3SBram Moolenaar echo 'no' 409a259d8d3SBram Moolenaar endif 410a259d8d3SBram Moolenaarenddef 411a259d8d3SBram Moolenaar 412a259d8d3SBram Moolenaardef Test_compile_const_expr() 413a259d8d3SBram Moolenaar assert_equal("\nyes", execute('call HasEval()')) 414a259d8d3SBram Moolenaar let instr = execute('disassemble HasEval') 4150f18b6d1SBram Moolenaar assert_match('PUSHS "yes"', instr) 4160f18b6d1SBram Moolenaar assert_notmatch('PUSHS "no"', instr) 4170f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 418a259d8d3SBram Moolenaar 419a259d8d3SBram Moolenaar assert_equal("\nno", execute('call HasNothing()')) 420a259d8d3SBram Moolenaar instr = execute('disassemble HasNothing') 4210f18b6d1SBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 4220f18b6d1SBram Moolenaar assert_match('PUSHS "no"', instr) 4230f18b6d1SBram Moolenaar assert_notmatch('JUMP', instr) 4240f18b6d1SBram Moolenaarenddef 4250f18b6d1SBram Moolenaar 4260f18b6d1SBram Moolenaarfunc NotCompiled() 4270f18b6d1SBram Moolenaar echo "not" 4280f18b6d1SBram Moolenaarendfunc 4290f18b6d1SBram Moolenaar 4300f18b6d1SBram Moolenaarlet s:scriptvar = 4 4310f18b6d1SBram Moolenaarlet g:globalvar = 'g' 4320f18b6d1SBram Moolenaar 433b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string) 4340f18b6d1SBram Moolenaar let local = 1 4350f18b6d1SBram Moolenaar buffers 4360f18b6d1SBram Moolenaar echo arg 4370f18b6d1SBram Moolenaar echo local 4380f18b6d1SBram Moolenaar echo v:version 4390f18b6d1SBram Moolenaar echo s:scriptvar 4400f18b6d1SBram Moolenaar echo g:globalvar 4410f18b6d1SBram Moolenaar echo &tabstop 4420f18b6d1SBram Moolenaar echo $ENVVAR 4430f18b6d1SBram Moolenaar echo @z 4440f18b6d1SBram Moolenaarenddef 4450f18b6d1SBram Moolenaar 446b283a8a6SBram Moolenaardef s:ScriptFuncStore() 447b283a8a6SBram Moolenaar let localnr = 1 448b283a8a6SBram Moolenaar localnr = 2 449b283a8a6SBram Moolenaar let localstr = 'abc' 450b283a8a6SBram Moolenaar localstr = 'xyz' 451b283a8a6SBram Moolenaar v:char = 'abc' 452b283a8a6SBram Moolenaar s:scriptvar = 'sv' 453b283a8a6SBram Moolenaar g:globalvar = 'gv' 454b283a8a6SBram Moolenaar &tabstop = 8 455b283a8a6SBram Moolenaar $ENVVAR = 'ev' 456b283a8a6SBram Moolenaar @z = 'rv' 457b283a8a6SBram Moolenaarenddef 458b283a8a6SBram Moolenaar 4590f18b6d1SBram Moolenaardef Test_disassemble() 4600f18b6d1SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 4610f18b6d1SBram Moolenaar assert_fails('disass NotCompiled', 'E1062:') 4620f18b6d1SBram Moolenaar 463b283a8a6SBram Moolenaar let res = execute('disass s:ScriptFuncLoad') 464b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' 4650f18b6d1SBram Moolenaar \ .. 'buffers.*' 4660f18b6d1SBram Moolenaar \ .. ' EXEC \+buffers.*' 4670f18b6d1SBram Moolenaar \ .. ' LOAD arg\[-1\].*' 4680f18b6d1SBram Moolenaar \ .. ' LOAD $0.*' 4690f18b6d1SBram Moolenaar \ .. ' LOADV v:version.*' 4700f18b6d1SBram Moolenaar \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*' 4710f18b6d1SBram Moolenaar \ .. ' LOADG g:globalvar.*' 4720f18b6d1SBram Moolenaar \ .. ' LOADENV $ENVVAR.*' 473b283a8a6SBram Moolenaar \ .. ' LOADREG @z.*' 474b283a8a6SBram Moolenaar \, res) 475b283a8a6SBram Moolenaar 476b283a8a6SBram Moolenaar " TODO: 477b283a8a6SBram Moolenaar " v:char = 478b283a8a6SBram Moolenaar " s:scriptvar = 479b283a8a6SBram Moolenaar res = execute('disass s:ScriptFuncStore') 480b283a8a6SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' 481b283a8a6SBram Moolenaar \ .. 'localnr = 2.*' 482b283a8a6SBram Moolenaar \ .. ' STORE 2 in $0.*' 483b283a8a6SBram Moolenaar \ .. 'localstr = ''xyz''.*' 484b283a8a6SBram Moolenaar \ .. ' STORE $1.*' 485b283a8a6SBram Moolenaar \ .. 'v:char = ''abc''.*' 486b283a8a6SBram Moolenaar \ .. 'STOREV v:char.*' 487b283a8a6SBram Moolenaar \ .. 's:scriptvar = ''sv''.*' 488b283a8a6SBram Moolenaar \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*' 489b283a8a6SBram Moolenaar \ .. 'g:globalvar = ''gv''.*' 490b283a8a6SBram Moolenaar \ .. ' STOREG g:globalvar.*' 491b283a8a6SBram Moolenaar \ .. '&tabstop = 8.*' 492b283a8a6SBram Moolenaar \ .. ' STOREOPT &tabstop.*' 493b283a8a6SBram Moolenaar \ .. '$ENVVAR = ''ev''.*' 494b283a8a6SBram Moolenaar \ .. ' STOREENV $ENVVAR.*' 495b283a8a6SBram Moolenaar \ .. '@z = ''rv''.*' 496b283a8a6SBram Moolenaar \ .. ' STOREREG @z.*' 497b283a8a6SBram Moolenaar \, res) 498a259d8d3SBram Moolenaarenddef 499a259d8d3SBram Moolenaar 5008a7d6542SBram Moolenaar 5018a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 502