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 306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 316e587dcbSBram Moolenaarlet s:addToMe = 111 32401d9ffbSBram Moolenaarlet g:existing = 'yes' 336e587dcbSBram Moolenaar 348a7d6542SBram Moolenaardef Test_assignment() 358a7d6542SBram Moolenaar let bool1: bool = true 368a7d6542SBram Moolenaar assert_equal(v:true, bool1) 378a7d6542SBram Moolenaar let bool2: bool = false 388a7d6542SBram Moolenaar assert_equal(v:false, bool2) 398a7d6542SBram Moolenaar 408a7d6542SBram Moolenaar let list1: list<string> = ['sdf', 'asdf'] 418a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 428a7d6542SBram Moolenaar 43436472f5SBram Moolenaar let listS: list<string> = [] 44436472f5SBram Moolenaar let listN: list<number> = [] 458a7d6542SBram Moolenaar 468a7d6542SBram Moolenaar let dict1: dict<string> = #{key: 'value'} 478a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 48b283a8a6SBram Moolenaar 49401d9ffbSBram Moolenaar g:newvar = 'new' 50401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 51401d9ffbSBram Moolenaar 52401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 53401d9ffbSBram Moolenaar g:existing = 'no' 54401d9ffbSBram Moolenaar assert_equal('no', g:existing) 55401d9ffbSBram Moolenaar 56b283a8a6SBram Moolenaar v:char = 'abc' 576e587dcbSBram Moolenaar assert_equal('abc', v:char) 58b283a8a6SBram Moolenaar 59b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 606e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 61b283a8a6SBram Moolenaar $ENVVAR = '' 626e587dcbSBram Moolenaar 63fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 64fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 65fd1823e0SBram Moolenaar s:addToMe += 222 66fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 670bbf722aSBram Moolenaar s:newVar = 'new' 680bbf722aSBram Moolenaar assert_equal('new', s:newVar) 698a7d6542SBram Moolenaarenddef 708a7d6542SBram Moolenaar 718a7d6542SBram Moolenaarfunc Test_assignment_failure() 728a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 738a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 748a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 758a7d6542SBram Moolenaar 768a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 778a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 788a7d6542SBram Moolenaar 798a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 808a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 818a7d6542SBram Moolenaar 828a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 838a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 848a7d6542SBram Moolenaar 858a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 868a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 878a7d6542SBram Moolenaarendfunc 888a7d6542SBram Moolenaar 898a7d6542SBram Moolenaarfunc Test_const() 908a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 918a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 928a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 938a7d6542SBram Moolenaarendfunc 948a7d6542SBram Moolenaar 958a7d6542SBram Moolenaardef Test_block() 968a7d6542SBram Moolenaar let outer = 1 978a7d6542SBram Moolenaar { 988a7d6542SBram Moolenaar let inner = 2 998a7d6542SBram Moolenaar assert_equal(1, outer) 1008a7d6542SBram Moolenaar assert_equal(2, inner) 1018a7d6542SBram Moolenaar } 1028a7d6542SBram Moolenaar assert_equal(1, outer) 1038a7d6542SBram Moolenaarenddef 1048a7d6542SBram Moolenaar 1058a7d6542SBram Moolenaarfunc Test_block_failure() 1068a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1078a7d6542SBram Moolenaarendfunc 1088a7d6542SBram Moolenaar 1098a7d6542SBram Moolenaardef ReturnString(): string 1108a7d6542SBram Moolenaar return 'string' 1118a7d6542SBram Moolenaarenddef 1128a7d6542SBram Moolenaar 1138a7d6542SBram Moolenaardef ReturnNumber(): number 1148a7d6542SBram Moolenaar return 123 1158a7d6542SBram Moolenaarenddef 1168a7d6542SBram Moolenaar 11709f28f49SBram Moolenaarlet g:notNumber = 'string' 11809f28f49SBram Moolenaar 11909f28f49SBram Moolenaardef ReturnGlobal(): number 12009f28f49SBram Moolenaar return g:notNumber 12109f28f49SBram Moolenaarenddef 12209f28f49SBram Moolenaar 1238a7d6542SBram Moolenaardef Test_return_string() 1248a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1258a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 12609f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1278a7d6542SBram Moolenaarenddef 1288a7d6542SBram Moolenaar 1298a7d6542SBram Moolenaarfunc Increment() 1308a7d6542SBram Moolenaar let g:counter += 1 1318a7d6542SBram Moolenaarendfunc 1328a7d6542SBram Moolenaar 1338a7d6542SBram Moolenaardef Test_call_ufunc_count() 1348a7d6542SBram Moolenaar g:counter = 1 1358a7d6542SBram Moolenaar Increment() 1368a7d6542SBram Moolenaar Increment() 1378a7d6542SBram Moolenaar Increment() 1388a7d6542SBram Moolenaar " works with and without :call 1398a7d6542SBram Moolenaar assert_equal(4, g:counter) 140b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1418a7d6542SBram Moolenaar unlet g:counter 1428a7d6542SBram Moolenaarenddef 1438a7d6542SBram Moolenaar 1448a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1458a7d6542SBram Moolenaar let res = arg 1468a7d6542SBram Moolenaar for s in rest 1478a7d6542SBram Moolenaar res ..= ',' .. s 1488a7d6542SBram Moolenaar endfor 1498a7d6542SBram Moolenaar return res 1508a7d6542SBram Moolenaarenddef 1518a7d6542SBram Moolenaar 1528a7d6542SBram Moolenaardef Test_call_varargs() 1538a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1548a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1558a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1568a7d6542SBram Moolenaarenddef 1578a7d6542SBram Moolenaar 158170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 159170fcfcfSBram Moolenaar return name 160170fcfcfSBram Moolenaarenddef 161170fcfcfSBram Moolenaar 162170fcfcfSBram Moolenaardef Test_call_default_args() 163170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 164170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 165170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 166170fcfcfSBram Moolenaarenddef 167170fcfcfSBram Moolenaar 168170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 169170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 170170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 171170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 172170fcfcfSBram Moolenaarendfunc 173170fcfcfSBram Moolenaar 174170fcfcfSBram Moolenaar" Default arg and varargs 175170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 176170fcfcfSBram Moolenaar let res = one .. ',' .. two 177170fcfcfSBram Moolenaar for s in rest 178170fcfcfSBram Moolenaar res ..= ',' .. s 179170fcfcfSBram Moolenaar endfor 180170fcfcfSBram Moolenaar return res 181170fcfcfSBram Moolenaarenddef 182170fcfcfSBram Moolenaar 183170fcfcfSBram Moolenaardef Test_call_def_varargs() 184170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 185170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 186170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 187170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 188170fcfcfSBram Moolenaarenddef 189170fcfcfSBram Moolenaar 190170fcfcfSBram Moolenaar 19126e117e9SBram Moolenaar"def Test_call_func_defined_later() 19226e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 19326e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 19426e117e9SBram Moolenaar"enddef 19526e117e9SBram Moolenaar 19626e117e9SBram Moolenaarfunc DefineLater(arg) 19726e117e9SBram Moolenaar return a:arg 19826e117e9SBram Moolenaarendfunc 19926e117e9SBram Moolenaar 2008a7d6542SBram Moolenaardef Test_return_type_wrong() 201978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 202978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 203978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 204978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 2058a7d6542SBram Moolenaarenddef 2068a7d6542SBram Moolenaar 207bfe12043SBram Moolenaardef Test_arg_type_wrong() 208bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 209bfe12043SBram Moolenaarenddef 210bfe12043SBram Moolenaar 2118a7d6542SBram Moolenaardef Test_try_catch() 2128a7d6542SBram Moolenaar let l = [] 2138a7d6542SBram Moolenaar try 2148a7d6542SBram Moolenaar add(l, '1') 2158a7d6542SBram Moolenaar throw 'wrong' 2168a7d6542SBram Moolenaar add(l, '2') 2178a7d6542SBram Moolenaar catch 2188a7d6542SBram Moolenaar add(l, v:exception) 2198a7d6542SBram Moolenaar finally 2208a7d6542SBram Moolenaar add(l, '3') 2218a7d6542SBram Moolenaar endtry 2228a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2238a7d6542SBram Moolenaarenddef 2248a7d6542SBram Moolenaar 225257cc5eeSBram Moolenaardef ThrowFromDef() 226257cc5eeSBram Moolenaar throw 'getout' 227257cc5eeSBram Moolenaarenddef 228257cc5eeSBram Moolenaar 229257cc5eeSBram Moolenaarfunc CatchInFunc() 230257cc5eeSBram Moolenaar try 231257cc5eeSBram Moolenaar call ThrowFromDef() 232257cc5eeSBram Moolenaar catch 233257cc5eeSBram Moolenaar let g:thrown_func = v:exception 234257cc5eeSBram Moolenaar endtry 235257cc5eeSBram Moolenaarendfunc 236257cc5eeSBram Moolenaar 237257cc5eeSBram Moolenaardef CatchInDef() 238257cc5eeSBram Moolenaar try 239257cc5eeSBram Moolenaar ThrowFromDef() 240257cc5eeSBram Moolenaar catch 241257cc5eeSBram Moolenaar g:thrown_def = v:exception 242257cc5eeSBram Moolenaar endtry 243257cc5eeSBram Moolenaarenddef 244257cc5eeSBram Moolenaar 245f575adffSBram Moolenaardef ReturnFinally(): string 246f575adffSBram Moolenaar try 247f575adffSBram Moolenaar return 'intry' 248f575adffSBram Moolenaar finally 249f575adffSBram Moolenaar g:in_finally = 'finally' 250f575adffSBram Moolenaar endtry 251f575adffSBram Moolenaar return 'end' 252f575adffSBram Moolenaarenddef 253f575adffSBram Moolenaar 254257cc5eeSBram Moolenaardef Test_try_catch_nested() 255257cc5eeSBram Moolenaar CatchInFunc() 256257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 257257cc5eeSBram Moolenaar 258257cc5eeSBram Moolenaar CatchInDef() 259257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 260f575adffSBram Moolenaar 261f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 262f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 263f575adffSBram Moolenaarenddef 264f575adffSBram Moolenaar 265f575adffSBram Moolenaardef Test_try_catch_match() 266f575adffSBram Moolenaar let seq = 'a' 267f575adffSBram Moolenaar try 268f575adffSBram Moolenaar throw 'something' 269f575adffSBram Moolenaar catch /nothing/ 270f575adffSBram Moolenaar seq ..= 'x' 271f575adffSBram Moolenaar catch /some/ 272f575adffSBram Moolenaar seq ..= 'b' 273f575adffSBram Moolenaar catch /asdf/ 274f575adffSBram Moolenaar seq ..= 'x' 275f575adffSBram Moolenaar finally 276f575adffSBram Moolenaar seq ..= 'c' 277f575adffSBram Moolenaar endtry 278f575adffSBram Moolenaar assert_equal('abc', seq) 279257cc5eeSBram Moolenaarenddef 280257cc5eeSBram Moolenaar 2818a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 2828a7d6542SBram Moolenaar vim9script 2838a7d6542SBram Moolenaar let name: string = 'bob' 2848a7d6542SBram Moolenaar def Concat(arg: string): string 2858a7d6542SBram Moolenaar return name .. arg 2868a7d6542SBram Moolenaar enddef 2878a7d6542SBram Moolenaar let g:result = Concat('bie') 2888a7d6542SBram Moolenaar let g:localname = name 2898a7d6542SBram Moolenaar 2908a7d6542SBram Moolenaar export const CONST = 1234 2918a7d6542SBram Moolenaar export let exported = 9876 2926e587dcbSBram Moolenaar export let exp_name = 'John' 2938a7d6542SBram Moolenaar export def Exported(): string 2948a7d6542SBram Moolenaar return 'Exported' 2958a7d6542SBram Moolenaar enddef 2968a7d6542SBram MoolenaarEND 2978a7d6542SBram Moolenaar 2988a7d6542SBram Moolenaardef Test_vim9script() 2998a7d6542SBram Moolenaar let import_script_lines =<< trim END 3008a7d6542SBram Moolenaar vim9script 3018a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3028a7d6542SBram Moolenaar g:imported = exported 3036e587dcbSBram Moolenaar exported += 3 3046e587dcbSBram Moolenaar g:imported_added = exported 3058a7d6542SBram Moolenaar g:imported_func = Exported() 3066e587dcbSBram Moolenaar 3076e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3086e587dcbSBram Moolenaar g:imported_name = exp_name 3096e587dcbSBram Moolenaar exp_name ..= ' Doe' 3106e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3118a7d6542SBram Moolenaar END 3128a7d6542SBram Moolenaar 3138a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3148a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3158a7d6542SBram Moolenaar 3168a7d6542SBram Moolenaar source Ximport.vim 3178a7d6542SBram Moolenaar 3188a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3198a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3208a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3216e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 3228a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 3236e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 3246e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 3258a7d6542SBram Moolenaar assert_false(exists('g:name')) 3268a7d6542SBram Moolenaar 3278a7d6542SBram Moolenaar unlet g:result 3288a7d6542SBram Moolenaar unlet g:localname 3298a7d6542SBram Moolenaar unlet g:imported 3306e587dcbSBram Moolenaar unlet g:imported_added 3318a7d6542SBram Moolenaar unlet g:imported_func 3326e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 3338a7d6542SBram Moolenaar delete('Ximport.vim') 334f2d5c240SBram Moolenaar 335f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 336f2d5c240SBram Moolenaar vim9script 337f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 338f2d5c240SBram Moolenaar def UseExport() 339f2d5c240SBram Moolenaar g:imported = Export.exported 340f2d5c240SBram Moolenaar enddef 341f2d5c240SBram Moolenaar UseExport() 342f2d5c240SBram Moolenaar END 343f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 344f2d5c240SBram Moolenaar source Ximport.vim 345f2d5c240SBram Moolenaar assert_equal(9876, g:imported) 346f2d5c240SBram Moolenaar 347f2d5c240SBram Moolenaar let import_star_lines =<< trim END 348f2d5c240SBram Moolenaar vim9script 349f2d5c240SBram Moolenaar import * from './Xexport.vim' 350f2d5c240SBram Moolenaar g:imported = exported 351f2d5c240SBram Moolenaar END 352f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 353f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 354f2d5c240SBram Moolenaar 355*fa29c8abSBram Moolenaar " try to import something that exists but is not exported 356*fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 357*fa29c8abSBram Moolenaar vim9script 358*fa29c8abSBram Moolenaar import name from './Xexport.vim' 359*fa29c8abSBram Moolenaar END 360*fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 361*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 362*fa29c8abSBram Moolenaar 363*fa29c8abSBram Moolenaar " import a very long name, requires making a copy 364*fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 365*fa29c8abSBram Moolenaar vim9script 366*fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 367*fa29c8abSBram Moolenaar END 368*fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 369*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 370*fa29c8abSBram Moolenaar 371*fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 372*fa29c8abSBram Moolenaar vim9script 373*fa29c8abSBram Moolenaar import name './Xexport.vim' 374*fa29c8abSBram Moolenaar END 375*fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 376*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 377*fa29c8abSBram Moolenaar 378*fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 379*fa29c8abSBram Moolenaar vim9script 380*fa29c8abSBram Moolenaar import name from Xexport.vim 381*fa29c8abSBram Moolenaar END 382*fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 383*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 384*fa29c8abSBram Moolenaar 385*fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 386*fa29c8abSBram Moolenaar vim9script 387*fa29c8abSBram Moolenaar import name from './XnoExport.vim' 388*fa29c8abSBram Moolenaar END 389*fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 390*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 391*fa29c8abSBram Moolenaar 392*fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 393*fa29c8abSBram Moolenaar vim9script 394*fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 395*fa29c8abSBram Moolenaar END 396*fa29c8abSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport.vim') 397*fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1046:') 398*fa29c8abSBram Moolenaar 399f2d5c240SBram Moolenaar delete('Ximport.vim') 4008a7d6542SBram Moolenaar delete('Xexport.vim') 4018a7d6542SBram Moolenaar 402750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 403750802b5SBram Moolenaar set cpo&vi 404750802b5SBram Moolenaar let cpo_before = &cpo 405750802b5SBram Moolenaar let lines =<< trim END 406750802b5SBram Moolenaar vim9script 407750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 408750802b5SBram Moolenaar END 409750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 410750802b5SBram Moolenaar source Xvim9_script 411750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 412750802b5SBram Moolenaar set cpo&vim 413750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 414750802b5SBram Moolenaar delete('Xvim9_script') 415750802b5SBram Moolenaarenddef 416750802b5SBram Moolenaar 417750802b5SBram Moolenaardef Test_vim9script_fails() 4188a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 4198a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 420750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 421f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 422750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 423750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 424750802b5SBram Moolenaar 425750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 426750802b5SBram Moolenaar assert_fails('export something', 'E1042') 4278a7d6542SBram Moolenaarenddef 4288a7d6542SBram Moolenaar 4298a7d6542SBram Moolenaardef Test_vim9script_call() 4308a7d6542SBram Moolenaar let lines =<< trim END 4318a7d6542SBram Moolenaar vim9script 4328a7d6542SBram Moolenaar let var = '' 4338a7d6542SBram Moolenaar def MyFunc(arg: string) 4348a7d6542SBram Moolenaar var = arg 4358a7d6542SBram Moolenaar enddef 4368a7d6542SBram Moolenaar MyFunc('foobar') 4378a7d6542SBram Moolenaar assert_equal('foobar', var) 4388a7d6542SBram Moolenaar 4398a7d6542SBram Moolenaar let str = 'barfoo' 4408a7d6542SBram Moolenaar str->MyFunc() 4418a7d6542SBram Moolenaar assert_equal('barfoo', var) 4428a7d6542SBram Moolenaar 4438a7d6542SBram Moolenaar let g:value = 'value' 4448a7d6542SBram Moolenaar g:value->MyFunc() 4458a7d6542SBram Moolenaar assert_equal('value', var) 4468a7d6542SBram Moolenaar 4478a7d6542SBram Moolenaar let listvar = [] 4488a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 4498a7d6542SBram Moolenaar listvar = arg 4508a7d6542SBram Moolenaar enddef 4518a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 4528a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 4538a7d6542SBram Moolenaar 4548a7d6542SBram Moolenaar let dictvar = {} 4558a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 4568a7d6542SBram Moolenaar dictvar = arg 4578a7d6542SBram Moolenaar enddef 4588a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 4598a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 4608a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 4618a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 4620c6ceaf9SBram Moolenaar 4630c6ceaf9SBram Moolenaar ('text')->MyFunc() 4640c6ceaf9SBram Moolenaar assert_equal('text', var) 4650c6ceaf9SBram Moolenaar ("some")->MyFunc() 4660c6ceaf9SBram Moolenaar assert_equal('some', var) 4678a7d6542SBram Moolenaar END 4688a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 4698a7d6542SBram Moolenaar source Xcall.vim 4708a7d6542SBram Moolenaar delete('Xcall.vim') 4718a7d6542SBram Moolenaarenddef 4728a7d6542SBram Moolenaar 4738a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 4748a7d6542SBram Moolenaar let lines =<< trim END 4758a7d6542SBram Moolenaar vim9script 4768a7d6542SBram Moolenaar let var = '' 4778a7d6542SBram Moolenaar def MyFunc(arg: string) 4788a7d6542SBram Moolenaar let var = 123 4798a7d6542SBram Moolenaar enddef 4808a7d6542SBram Moolenaar END 4818a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 4828a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 4838a7d6542SBram Moolenaar delete('Xcall_decl.vim') 4848a7d6542SBram Moolenaarenddef 4858a7d6542SBram Moolenaar 4868a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 4878a7d6542SBram Moolenaar let lines =<< trim END 4888a7d6542SBram Moolenaar vim9script 4898a7d6542SBram Moolenaar const var = '' 4908a7d6542SBram Moolenaar def MyFunc(arg: string) 4918a7d6542SBram Moolenaar var = 'asdf' 4928a7d6542SBram Moolenaar enddef 4938a7d6542SBram Moolenaar END 4948a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 4958a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 4968a7d6542SBram Moolenaar delete('Xcall_const.vim') 4978a7d6542SBram Moolenaarenddef 4988a7d6542SBram Moolenaar 4998a7d6542SBram Moolenaardef Test_vim9script_reload() 5008a7d6542SBram Moolenaar let lines =<< trim END 5018a7d6542SBram Moolenaar vim9script 5028a7d6542SBram Moolenaar const var = '' 5038a7d6542SBram Moolenaar let valone = 1234 5048a7d6542SBram Moolenaar def MyFunc(arg: string) 5058a7d6542SBram Moolenaar valone = 5678 5068a7d6542SBram Moolenaar enddef 5078a7d6542SBram Moolenaar END 5088a7d6542SBram Moolenaar let morelines =<< trim END 5098a7d6542SBram Moolenaar let valtwo = 222 5108a7d6542SBram Moolenaar export def GetValtwo(): number 5118a7d6542SBram Moolenaar return valtwo 5128a7d6542SBram Moolenaar enddef 5138a7d6542SBram Moolenaar END 5148a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 5158a7d6542SBram Moolenaar source Xreload.vim 5168a7d6542SBram Moolenaar source Xreload.vim 5178a7d6542SBram Moolenaar source Xreload.vim 5188a7d6542SBram Moolenaar 5198a7d6542SBram Moolenaar let testlines =<< trim END 5208a7d6542SBram Moolenaar vim9script 5218a7d6542SBram Moolenaar def TheFunc() 5228a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 5238a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 5248a7d6542SBram Moolenaar enddef 5258a7d6542SBram Moolenaar TheFunc() 5268a7d6542SBram Moolenaar END 5278a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 5288a7d6542SBram Moolenaar source Ximport.vim 5298a7d6542SBram Moolenaar 5308a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 5318a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 5328a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 5338a7d6542SBram Moolenaar source Xreload.vim 5348a7d6542SBram Moolenaar source Ximport.vim 5358a7d6542SBram Moolenaar 5368a7d6542SBram Moolenaar " cannot declare a var twice 5378a7d6542SBram Moolenaar lines =<< trim END 5388a7d6542SBram Moolenaar vim9script 5398a7d6542SBram Moolenaar let valone = 1234 5408a7d6542SBram Moolenaar let valone = 5678 5418a7d6542SBram Moolenaar END 5428a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 5438a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 5448a7d6542SBram Moolenaar 5458a7d6542SBram Moolenaar delete('Xreload.vim') 5468a7d6542SBram Moolenaar delete('Ximport.vim') 5478a7d6542SBram Moolenaarenddef 5488a7d6542SBram Moolenaar 5498a7d6542SBram Moolenaardef Test_import_absolute() 5508a7d6542SBram Moolenaar let import_lines = [ 5518a7d6542SBram Moolenaar \ 'vim9script', 5528a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 553b283a8a6SBram Moolenaar \ 'def UseExported()', 5548a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 5554e12a5dfSBram Moolenaar \ ' exported = 8888', 5564e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 557b283a8a6SBram Moolenaar \ 'enddef', 558b283a8a6SBram Moolenaar \ 'UseExported()', 5594e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 5608a7d6542SBram Moolenaar \ ] 5618a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 5628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 5638a7d6542SBram Moolenaar 5648a7d6542SBram Moolenaar source Ximport_abs.vim 5658a7d6542SBram Moolenaar 5668a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 5674e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 568b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 569b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 570b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 5714e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 5724e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 5734e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 5744e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 5754e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 5764e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 5774e12a5dfSBram Moolenaar \, g:import_disassembled) 5788a7d6542SBram Moolenaar unlet g:imported_abs 5794e12a5dfSBram Moolenaar unlet g:import_disassembled 5808a7d6542SBram Moolenaar 5818a7d6542SBram Moolenaar delete('Ximport_abs.vim') 5828a7d6542SBram Moolenaar delete('Xexport_abs.vim') 5838a7d6542SBram Moolenaarenddef 5848a7d6542SBram Moolenaar 5858a7d6542SBram Moolenaardef Test_import_rtp() 5868a7d6542SBram Moolenaar let import_lines = [ 5878a7d6542SBram Moolenaar \ 'vim9script', 5888a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 5898a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 5908a7d6542SBram Moolenaar \ ] 5918a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 5928a7d6542SBram Moolenaar mkdir('import') 5938a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 5948a7d6542SBram Moolenaar 5958a7d6542SBram Moolenaar let save_rtp = &rtp 5968a7d6542SBram Moolenaar &rtp = getcwd() 5978a7d6542SBram Moolenaar source Ximport_rtp.vim 5988a7d6542SBram Moolenaar &rtp = save_rtp 5998a7d6542SBram Moolenaar 6008a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 6018a7d6542SBram Moolenaar unlet g:imported_rtp 6028a7d6542SBram Moolenaar 6038a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 6048a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 6058a7d6542SBram Moolenaar delete('import', 'd') 6068a7d6542SBram Moolenaarenddef 6078a7d6542SBram Moolenaar 6088a7d6542SBram Moolenaardef Test_fixed_size_list() 6098a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 6108a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 6118a7d6542SBram Moolenaar l->remove(0) 6128a7d6542SBram Moolenaar l->add(5) 6138a7d6542SBram Moolenaar l->insert(99, 1) 6140f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 6158a7d6542SBram Moolenaarenddef 6168a7d6542SBram Moolenaar 617673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 618673660abSBram Moolenaar" recognized. 619673660abSBram Moolenaarfunc Test_function_python() 620673660abSBram Moolenaar CheckFeature python3 621673660abSBram Moolenaar let py = 'python3' 622673660abSBram Moolenaar execute py "<< EOF" 623673660abSBram Moolenaardef do_something(): 624673660abSBram Moolenaar return 1 625673660abSBram MoolenaarEOF 626673660abSBram Moolenaarendfunc 627673660abSBram Moolenaar 628158906cfSBram Moolenaardef IfElse(what: number): string 629158906cfSBram Moolenaar let res = '' 630158906cfSBram Moolenaar if what == 1 631158906cfSBram Moolenaar res = "one" 632158906cfSBram Moolenaar elseif what == 2 633158906cfSBram Moolenaar res = "two" 634a259d8d3SBram Moolenaar else 635158906cfSBram Moolenaar res = "three" 636a259d8d3SBram Moolenaar endif 637158906cfSBram Moolenaar return res 638a259d8d3SBram Moolenaarenddef 639a259d8d3SBram Moolenaar 640158906cfSBram Moolenaardef Test_if_elseif_else() 641158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 642158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 643158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 6440f18b6d1SBram Moolenaarenddef 6450f18b6d1SBram Moolenaar 64663ce4849SBram Moolenaardef Test_delfunc() 64763ce4849SBram Moolenaar let lines =<< trim END 64863ce4849SBram Moolenaar vim9script 64963ce4849SBram Moolenaar def GoneSoon() 65063ce4849SBram Moolenaar echo 'hello' 65163ce4849SBram Moolenaar enddef 65263ce4849SBram Moolenaar 65363ce4849SBram Moolenaar def CallGoneSoon() 65463ce4849SBram Moolenaar GoneSoon() 65563ce4849SBram Moolenaar enddef 65663ce4849SBram Moolenaar 65763ce4849SBram Moolenaar delfunc GoneSoon 65863ce4849SBram Moolenaar CallGoneSoon() 65963ce4849SBram Moolenaar END 66063ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 66163ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 66263ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 66363ce4849SBram Moolenaar 66463ce4849SBram Moolenaar delete('XToDelFunc') 66563ce4849SBram Moolenaarenddef 66663ce4849SBram Moolenaar 6675b1c8fe3SBram Moolenaardef Test_substitute_cmd() 6685b1c8fe3SBram Moolenaar new 6695b1c8fe3SBram Moolenaar setline(1, 'something') 6705b1c8fe3SBram Moolenaar :substitute(some(other( 6715b1c8fe3SBram Moolenaar assert_equal('otherthing', getline(1)) 67283f37b91SBram Moolenaar bwipe! 67383f37b91SBram Moolenaar 67483f37b91SBram Moolenaar " also when the context is Vim9 script 67583f37b91SBram Moolenaar let lines =<< trim END 67683f37b91SBram Moolenaar vim9script 67783f37b91SBram Moolenaar new 67883f37b91SBram Moolenaar setline(1, 'something') 67983f37b91SBram Moolenaar :substitute(some(other( 68083f37b91SBram Moolenaar assert_equal('otherthing', getline(1)) 68183f37b91SBram Moolenaar bwipe! 68283f37b91SBram Moolenaar END 68383f37b91SBram Moolenaar writefile(lines, 'Xvim9lines') 68483f37b91SBram Moolenaar source Xvim9lines 68583f37b91SBram Moolenaar 68683f37b91SBram Moolenaar delete('Xvim9lines') 6875b1c8fe3SBram Moolenaarenddef 6885b1c8fe3SBram Moolenaar 6898a7d6542SBram Moolenaar 6908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 691