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 40*0c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 418a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 42*0c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 43*0c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 44*0c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 458a7d6542SBram Moolenaar 46436472f5SBram Moolenaar let listS: list<string> = [] 47436472f5SBram Moolenaar let listN: list<number> = [] 488a7d6542SBram Moolenaar 49*0c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 508a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 51*0c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 52*0c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 53*0c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 54b283a8a6SBram Moolenaar 55401d9ffbSBram Moolenaar g:newvar = 'new' 56401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 57401d9ffbSBram Moolenaar 58401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 59401d9ffbSBram Moolenaar g:existing = 'no' 60401d9ffbSBram Moolenaar assert_equal('no', g:existing) 61401d9ffbSBram Moolenaar 62b283a8a6SBram Moolenaar v:char = 'abc' 636e587dcbSBram Moolenaar assert_equal('abc', v:char) 64b283a8a6SBram Moolenaar 65b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 666e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 67b283a8a6SBram Moolenaar $ENVVAR = '' 686e587dcbSBram Moolenaar 69fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 70fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 71fd1823e0SBram Moolenaar s:addToMe += 222 72fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 730bbf722aSBram Moolenaar s:newVar = 'new' 740bbf722aSBram Moolenaar assert_equal('new', s:newVar) 758a7d6542SBram Moolenaarenddef 768a7d6542SBram Moolenaar 778a7d6542SBram Moolenaarfunc Test_assignment_failure() 788a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 798a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 808a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 818a7d6542SBram Moolenaar 828a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 838a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 848a7d6542SBram Moolenaar 858a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 868a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 878a7d6542SBram Moolenaar 888a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 898a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 908a7d6542SBram Moolenaar 918a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 928a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 938a7d6542SBram Moolenaarendfunc 948a7d6542SBram Moolenaar 958a7d6542SBram Moolenaarfunc Test_const() 968a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 978a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 988a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 998a7d6542SBram Moolenaarendfunc 1008a7d6542SBram Moolenaar 1018a7d6542SBram Moolenaardef Test_block() 1028a7d6542SBram Moolenaar let outer = 1 1038a7d6542SBram Moolenaar { 1048a7d6542SBram Moolenaar let inner = 2 1058a7d6542SBram Moolenaar assert_equal(1, outer) 1068a7d6542SBram Moolenaar assert_equal(2, inner) 1078a7d6542SBram Moolenaar } 1088a7d6542SBram Moolenaar assert_equal(1, outer) 1098a7d6542SBram Moolenaarenddef 1108a7d6542SBram Moolenaar 1118a7d6542SBram Moolenaarfunc Test_block_failure() 1128a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 1138a7d6542SBram Moolenaarendfunc 1148a7d6542SBram Moolenaar 1158a7d6542SBram Moolenaardef ReturnString(): string 1168a7d6542SBram Moolenaar return 'string' 1178a7d6542SBram Moolenaarenddef 1188a7d6542SBram Moolenaar 1198a7d6542SBram Moolenaardef ReturnNumber(): number 1208a7d6542SBram Moolenaar return 123 1218a7d6542SBram Moolenaarenddef 1228a7d6542SBram Moolenaar 12309f28f49SBram Moolenaarlet g:notNumber = 'string' 12409f28f49SBram Moolenaar 12509f28f49SBram Moolenaardef ReturnGlobal(): number 12609f28f49SBram Moolenaar return g:notNumber 12709f28f49SBram Moolenaarenddef 12809f28f49SBram Moolenaar 1298a7d6542SBram Moolenaardef Test_return_string() 1308a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 1318a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 13209f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 1338a7d6542SBram Moolenaarenddef 1348a7d6542SBram Moolenaar 1358a7d6542SBram Moolenaarfunc Increment() 1368a7d6542SBram Moolenaar let g:counter += 1 1378a7d6542SBram Moolenaarendfunc 1388a7d6542SBram Moolenaar 1398a7d6542SBram Moolenaardef Test_call_ufunc_count() 1408a7d6542SBram Moolenaar g:counter = 1 1418a7d6542SBram Moolenaar Increment() 1428a7d6542SBram Moolenaar Increment() 1438a7d6542SBram Moolenaar Increment() 1448a7d6542SBram Moolenaar " works with and without :call 1458a7d6542SBram Moolenaar assert_equal(4, g:counter) 146b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 1478a7d6542SBram Moolenaar unlet g:counter 1488a7d6542SBram Moolenaarenddef 1498a7d6542SBram Moolenaar 1508a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 1518a7d6542SBram Moolenaar let res = arg 1528a7d6542SBram Moolenaar for s in rest 1538a7d6542SBram Moolenaar res ..= ',' .. s 1548a7d6542SBram Moolenaar endfor 1558a7d6542SBram Moolenaar return res 1568a7d6542SBram Moolenaarenddef 1578a7d6542SBram Moolenaar 1588a7d6542SBram Moolenaardef Test_call_varargs() 1598a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 1608a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 1618a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 1628a7d6542SBram Moolenaarenddef 1638a7d6542SBram Moolenaar 164170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 165170fcfcfSBram Moolenaar return name 166170fcfcfSBram Moolenaarenddef 167170fcfcfSBram Moolenaar 168170fcfcfSBram Moolenaardef Test_call_default_args() 169170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 170170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 171170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 172170fcfcfSBram Moolenaarenddef 173170fcfcfSBram Moolenaar 174170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 175170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 176170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 177170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 178170fcfcfSBram Moolenaarendfunc 179170fcfcfSBram Moolenaar 180170fcfcfSBram Moolenaar" Default arg and varargs 181170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 182170fcfcfSBram Moolenaar let res = one .. ',' .. two 183170fcfcfSBram Moolenaar for s in rest 184170fcfcfSBram Moolenaar res ..= ',' .. s 185170fcfcfSBram Moolenaar endfor 186170fcfcfSBram Moolenaar return res 187170fcfcfSBram Moolenaarenddef 188170fcfcfSBram Moolenaar 189170fcfcfSBram Moolenaardef Test_call_def_varargs() 190170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 191170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 192170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 193170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 194170fcfcfSBram Moolenaarenddef 195170fcfcfSBram Moolenaar 196170fcfcfSBram Moolenaar 19726e117e9SBram Moolenaar"def Test_call_func_defined_later() 19826e117e9SBram Moolenaar" call assert_equal('one', DefineLater('one')) 19926e117e9SBram Moolenaar" call assert_fails('call NotDefined("one")', 'E99:') 20026e117e9SBram Moolenaar"enddef 20126e117e9SBram Moolenaar 20226e117e9SBram Moolenaarfunc DefineLater(arg) 20326e117e9SBram Moolenaar return a:arg 20426e117e9SBram Moolenaarendfunc 20526e117e9SBram Moolenaar 2068a7d6542SBram Moolenaardef Test_return_type_wrong() 207978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 208978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 209978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 210978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 2118a7d6542SBram Moolenaarenddef 2128a7d6542SBram Moolenaar 213bfe12043SBram Moolenaardef Test_arg_type_wrong() 214bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 215bfe12043SBram Moolenaarenddef 216bfe12043SBram Moolenaar 2178a7d6542SBram Moolenaardef Test_try_catch() 2188a7d6542SBram Moolenaar let l = [] 2198a7d6542SBram Moolenaar try 2208a7d6542SBram Moolenaar add(l, '1') 2218a7d6542SBram Moolenaar throw 'wrong' 2228a7d6542SBram Moolenaar add(l, '2') 2238a7d6542SBram Moolenaar catch 2248a7d6542SBram Moolenaar add(l, v:exception) 2258a7d6542SBram Moolenaar finally 2268a7d6542SBram Moolenaar add(l, '3') 2278a7d6542SBram Moolenaar endtry 2288a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2298a7d6542SBram Moolenaarenddef 2308a7d6542SBram Moolenaar 231257cc5eeSBram Moolenaardef ThrowFromDef() 232257cc5eeSBram Moolenaar throw 'getout' 233257cc5eeSBram Moolenaarenddef 234257cc5eeSBram Moolenaar 235257cc5eeSBram Moolenaarfunc CatchInFunc() 236257cc5eeSBram Moolenaar try 237257cc5eeSBram Moolenaar call ThrowFromDef() 238257cc5eeSBram Moolenaar catch 239257cc5eeSBram Moolenaar let g:thrown_func = v:exception 240257cc5eeSBram Moolenaar endtry 241257cc5eeSBram Moolenaarendfunc 242257cc5eeSBram Moolenaar 243257cc5eeSBram Moolenaardef CatchInDef() 244257cc5eeSBram Moolenaar try 245257cc5eeSBram Moolenaar ThrowFromDef() 246257cc5eeSBram Moolenaar catch 247257cc5eeSBram Moolenaar g:thrown_def = v:exception 248257cc5eeSBram Moolenaar endtry 249257cc5eeSBram Moolenaarenddef 250257cc5eeSBram Moolenaar 251f575adffSBram Moolenaardef ReturnFinally(): string 252f575adffSBram Moolenaar try 253f575adffSBram Moolenaar return 'intry' 254f575adffSBram Moolenaar finally 255f575adffSBram Moolenaar g:in_finally = 'finally' 256f575adffSBram Moolenaar endtry 257f575adffSBram Moolenaar return 'end' 258f575adffSBram Moolenaarenddef 259f575adffSBram Moolenaar 260257cc5eeSBram Moolenaardef Test_try_catch_nested() 261257cc5eeSBram Moolenaar CatchInFunc() 262257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 263257cc5eeSBram Moolenaar 264257cc5eeSBram Moolenaar CatchInDef() 265257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 266f575adffSBram Moolenaar 267f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 268f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 269f575adffSBram Moolenaarenddef 270f575adffSBram Moolenaar 271f575adffSBram Moolenaardef Test_try_catch_match() 272f575adffSBram Moolenaar let seq = 'a' 273f575adffSBram Moolenaar try 274f575adffSBram Moolenaar throw 'something' 275f575adffSBram Moolenaar catch /nothing/ 276f575adffSBram Moolenaar seq ..= 'x' 277f575adffSBram Moolenaar catch /some/ 278f575adffSBram Moolenaar seq ..= 'b' 279f575adffSBram Moolenaar catch /asdf/ 280f575adffSBram Moolenaar seq ..= 'x' 281f575adffSBram Moolenaar finally 282f575adffSBram Moolenaar seq ..= 'c' 283f575adffSBram Moolenaar endtry 284f575adffSBram Moolenaar assert_equal('abc', seq) 285257cc5eeSBram Moolenaarenddef 286257cc5eeSBram Moolenaar 2878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 2888a7d6542SBram Moolenaar vim9script 2898a7d6542SBram Moolenaar let name: string = 'bob' 2908a7d6542SBram Moolenaar def Concat(arg: string): string 2918a7d6542SBram Moolenaar return name .. arg 2928a7d6542SBram Moolenaar enddef 2938a7d6542SBram Moolenaar let g:result = Concat('bie') 2948a7d6542SBram Moolenaar let g:localname = name 2958a7d6542SBram Moolenaar 2968a7d6542SBram Moolenaar export const CONST = 1234 2978a7d6542SBram Moolenaar export let exported = 9876 2986e587dcbSBram Moolenaar export let exp_name = 'John' 2998a7d6542SBram Moolenaar export def Exported(): string 3008a7d6542SBram Moolenaar return 'Exported' 3018a7d6542SBram Moolenaar enddef 3028a7d6542SBram MoolenaarEND 3038a7d6542SBram Moolenaar 3048a7d6542SBram Moolenaardef Test_vim9script() 3058a7d6542SBram Moolenaar let import_script_lines =<< trim END 3068a7d6542SBram Moolenaar vim9script 3078a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3088a7d6542SBram Moolenaar g:imported = exported 3096e587dcbSBram Moolenaar exported += 3 3106e587dcbSBram Moolenaar g:imported_added = exported 3118a7d6542SBram Moolenaar g:imported_func = Exported() 3126e587dcbSBram Moolenaar 3136e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3146e587dcbSBram Moolenaar g:imported_name = exp_name 3156e587dcbSBram Moolenaar exp_name ..= ' Doe' 3166e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3178a7d6542SBram Moolenaar END 3188a7d6542SBram Moolenaar 3198a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3208a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3218a7d6542SBram Moolenaar 3228a7d6542SBram Moolenaar source Ximport.vim 3238a7d6542SBram Moolenaar 3248a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3258a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3268a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3276e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 3288a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 3296e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 3306e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 3318a7d6542SBram Moolenaar assert_false(exists('g:name')) 3328a7d6542SBram Moolenaar 3338a7d6542SBram Moolenaar unlet g:result 3348a7d6542SBram Moolenaar unlet g:localname 3358a7d6542SBram Moolenaar unlet g:imported 3366e587dcbSBram Moolenaar unlet g:imported_added 3378a7d6542SBram Moolenaar unlet g:imported_func 3386e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 3398a7d6542SBram Moolenaar delete('Ximport.vim') 340f2d5c240SBram Moolenaar 341f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 342f2d5c240SBram Moolenaar vim9script 343f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 344f2d5c240SBram Moolenaar def UseExport() 345f2d5c240SBram Moolenaar g:imported = Export.exported 346f2d5c240SBram Moolenaar enddef 347f2d5c240SBram Moolenaar UseExport() 348f2d5c240SBram Moolenaar END 349f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 350f2d5c240SBram Moolenaar source Ximport.vim 351f2d5c240SBram Moolenaar assert_equal(9876, g:imported) 352f2d5c240SBram Moolenaar 353f2d5c240SBram Moolenaar let import_star_lines =<< trim END 354f2d5c240SBram Moolenaar vim9script 355f2d5c240SBram Moolenaar import * from './Xexport.vim' 356f2d5c240SBram Moolenaar g:imported = exported 357f2d5c240SBram Moolenaar END 358f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 359f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 360f2d5c240SBram Moolenaar 361fa29c8abSBram Moolenaar " try to import something that exists but is not exported 362fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 363fa29c8abSBram Moolenaar vim9script 364fa29c8abSBram Moolenaar import name from './Xexport.vim' 365fa29c8abSBram Moolenaar END 366fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 367fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 368fa29c8abSBram Moolenaar 369fa29c8abSBram Moolenaar " import a very long name, requires making a copy 370fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 371fa29c8abSBram Moolenaar vim9script 372fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 373fa29c8abSBram Moolenaar END 374fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 375fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 376fa29c8abSBram Moolenaar 377fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 378fa29c8abSBram Moolenaar vim9script 379fa29c8abSBram Moolenaar import name './Xexport.vim' 380fa29c8abSBram Moolenaar END 381fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 382fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 383fa29c8abSBram Moolenaar 384fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 385fa29c8abSBram Moolenaar vim9script 386fa29c8abSBram Moolenaar import name from Xexport.vim 387fa29c8abSBram Moolenaar END 388fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 389fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 390fa29c8abSBram Moolenaar 391fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 392fa29c8abSBram Moolenaar vim9script 393fa29c8abSBram Moolenaar import name from './XnoExport.vim' 394fa29c8abSBram Moolenaar END 395fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 396fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 397fa29c8abSBram Moolenaar 398fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 399fa29c8abSBram Moolenaar vim9script 400fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 401fa29c8abSBram Moolenaar END 402fa29c8abSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport.vim') 403fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1046:') 404fa29c8abSBram Moolenaar 405f2d5c240SBram Moolenaar delete('Ximport.vim') 4068a7d6542SBram Moolenaar delete('Xexport.vim') 4078a7d6542SBram Moolenaar 408750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 409750802b5SBram Moolenaar set cpo&vi 410750802b5SBram Moolenaar let cpo_before = &cpo 411750802b5SBram Moolenaar let lines =<< trim END 412750802b5SBram Moolenaar vim9script 413750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 414750802b5SBram Moolenaar END 415750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 416750802b5SBram Moolenaar source Xvim9_script 417750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 418750802b5SBram Moolenaar set cpo&vim 419750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 420750802b5SBram Moolenaar delete('Xvim9_script') 421750802b5SBram Moolenaarenddef 422750802b5SBram Moolenaar 423750802b5SBram Moolenaardef Test_vim9script_fails() 4248a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 4258a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 426750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 427f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 428750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 429750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 430750802b5SBram Moolenaar 431750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 432750802b5SBram Moolenaar assert_fails('export something', 'E1042') 4338a7d6542SBram Moolenaarenddef 4348a7d6542SBram Moolenaar 4358a7d6542SBram Moolenaardef Test_vim9script_call() 4368a7d6542SBram Moolenaar let lines =<< trim END 4378a7d6542SBram Moolenaar vim9script 4388a7d6542SBram Moolenaar let var = '' 4398a7d6542SBram Moolenaar def MyFunc(arg: string) 4408a7d6542SBram Moolenaar var = arg 4418a7d6542SBram Moolenaar enddef 4428a7d6542SBram Moolenaar MyFunc('foobar') 4438a7d6542SBram Moolenaar assert_equal('foobar', var) 4448a7d6542SBram Moolenaar 4458a7d6542SBram Moolenaar let str = 'barfoo' 4468a7d6542SBram Moolenaar str->MyFunc() 4478a7d6542SBram Moolenaar assert_equal('barfoo', var) 4488a7d6542SBram Moolenaar 4498a7d6542SBram Moolenaar let g:value = 'value' 4508a7d6542SBram Moolenaar g:value->MyFunc() 4518a7d6542SBram Moolenaar assert_equal('value', var) 4528a7d6542SBram Moolenaar 4538a7d6542SBram Moolenaar let listvar = [] 4548a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 4558a7d6542SBram Moolenaar listvar = arg 4568a7d6542SBram Moolenaar enddef 4578a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 4588a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 4598a7d6542SBram Moolenaar 4608a7d6542SBram Moolenaar let dictvar = {} 4618a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 4628a7d6542SBram Moolenaar dictvar = arg 4638a7d6542SBram Moolenaar enddef 4648a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 4658a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 4668a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 4678a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 4680c6ceaf9SBram Moolenaar 4690c6ceaf9SBram Moolenaar ('text')->MyFunc() 4700c6ceaf9SBram Moolenaar assert_equal('text', var) 4710c6ceaf9SBram Moolenaar ("some")->MyFunc() 4720c6ceaf9SBram Moolenaar assert_equal('some', var) 4738a7d6542SBram Moolenaar END 4748a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 4758a7d6542SBram Moolenaar source Xcall.vim 4768a7d6542SBram Moolenaar delete('Xcall.vim') 4778a7d6542SBram Moolenaarenddef 4788a7d6542SBram Moolenaar 4798a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 4808a7d6542SBram Moolenaar let lines =<< trim END 4818a7d6542SBram Moolenaar vim9script 4828a7d6542SBram Moolenaar let var = '' 4838a7d6542SBram Moolenaar def MyFunc(arg: string) 4848a7d6542SBram Moolenaar let var = 123 4858a7d6542SBram Moolenaar enddef 4868a7d6542SBram Moolenaar END 4878a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 4888a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 4898a7d6542SBram Moolenaar delete('Xcall_decl.vim') 4908a7d6542SBram Moolenaarenddef 4918a7d6542SBram Moolenaar 4928a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 4938a7d6542SBram Moolenaar let lines =<< trim END 4948a7d6542SBram Moolenaar vim9script 4958a7d6542SBram Moolenaar const var = '' 4968a7d6542SBram Moolenaar def MyFunc(arg: string) 4978a7d6542SBram Moolenaar var = 'asdf' 4988a7d6542SBram Moolenaar enddef 4998a7d6542SBram Moolenaar END 5008a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 5018a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 5028a7d6542SBram Moolenaar delete('Xcall_const.vim') 5038a7d6542SBram Moolenaarenddef 5048a7d6542SBram Moolenaar 5058a7d6542SBram Moolenaardef Test_vim9script_reload() 5068a7d6542SBram Moolenaar let lines =<< trim END 5078a7d6542SBram Moolenaar vim9script 5088a7d6542SBram Moolenaar const var = '' 5098a7d6542SBram Moolenaar let valone = 1234 5108a7d6542SBram Moolenaar def MyFunc(arg: string) 5118a7d6542SBram Moolenaar valone = 5678 5128a7d6542SBram Moolenaar enddef 5138a7d6542SBram Moolenaar END 5148a7d6542SBram Moolenaar let morelines =<< trim END 5158a7d6542SBram Moolenaar let valtwo = 222 5168a7d6542SBram Moolenaar export def GetValtwo(): number 5178a7d6542SBram Moolenaar return valtwo 5188a7d6542SBram Moolenaar enddef 5198a7d6542SBram Moolenaar END 5208a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 5218a7d6542SBram Moolenaar source Xreload.vim 5228a7d6542SBram Moolenaar source Xreload.vim 5238a7d6542SBram Moolenaar source Xreload.vim 5248a7d6542SBram Moolenaar 5258a7d6542SBram Moolenaar let testlines =<< trim END 5268a7d6542SBram Moolenaar vim9script 5278a7d6542SBram Moolenaar def TheFunc() 5288a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 5298a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 5308a7d6542SBram Moolenaar enddef 5318a7d6542SBram Moolenaar TheFunc() 5328a7d6542SBram Moolenaar END 5338a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 5348a7d6542SBram Moolenaar source Ximport.vim 5358a7d6542SBram Moolenaar 5368a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 5378a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 5388a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 5398a7d6542SBram Moolenaar source Xreload.vim 5408a7d6542SBram Moolenaar source Ximport.vim 5418a7d6542SBram Moolenaar 5428a7d6542SBram Moolenaar " cannot declare a var twice 5438a7d6542SBram Moolenaar lines =<< trim END 5448a7d6542SBram Moolenaar vim9script 5458a7d6542SBram Moolenaar let valone = 1234 5468a7d6542SBram Moolenaar let valone = 5678 5478a7d6542SBram Moolenaar END 5488a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 5498a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 5508a7d6542SBram Moolenaar 5518a7d6542SBram Moolenaar delete('Xreload.vim') 5528a7d6542SBram Moolenaar delete('Ximport.vim') 5538a7d6542SBram Moolenaarenddef 5548a7d6542SBram Moolenaar 5558a7d6542SBram Moolenaardef Test_import_absolute() 5568a7d6542SBram Moolenaar let import_lines = [ 5578a7d6542SBram Moolenaar \ 'vim9script', 5588a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 559b283a8a6SBram Moolenaar \ 'def UseExported()', 5608a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 5614e12a5dfSBram Moolenaar \ ' exported = 8888', 5624e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 563b283a8a6SBram Moolenaar \ 'enddef', 564b283a8a6SBram Moolenaar \ 'UseExported()', 5654e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 5668a7d6542SBram Moolenaar \ ] 5678a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 5688a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 5698a7d6542SBram Moolenaar 5708a7d6542SBram Moolenaar source Ximport_abs.vim 5718a7d6542SBram Moolenaar 5728a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 5734e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 574b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 575b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 576b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 5774e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 5784e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 5794e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 5804e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 5814e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 5824e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 5834e12a5dfSBram Moolenaar \, g:import_disassembled) 5848a7d6542SBram Moolenaar unlet g:imported_abs 5854e12a5dfSBram Moolenaar unlet g:import_disassembled 5868a7d6542SBram Moolenaar 5878a7d6542SBram Moolenaar delete('Ximport_abs.vim') 5888a7d6542SBram Moolenaar delete('Xexport_abs.vim') 5898a7d6542SBram Moolenaarenddef 5908a7d6542SBram Moolenaar 5918a7d6542SBram Moolenaardef Test_import_rtp() 5928a7d6542SBram Moolenaar let import_lines = [ 5938a7d6542SBram Moolenaar \ 'vim9script', 5948a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 5958a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 5968a7d6542SBram Moolenaar \ ] 5978a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 5988a7d6542SBram Moolenaar mkdir('import') 5998a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 6008a7d6542SBram Moolenaar 6018a7d6542SBram Moolenaar let save_rtp = &rtp 6028a7d6542SBram Moolenaar &rtp = getcwd() 6038a7d6542SBram Moolenaar source Ximport_rtp.vim 6048a7d6542SBram Moolenaar &rtp = save_rtp 6058a7d6542SBram Moolenaar 6068a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 6078a7d6542SBram Moolenaar unlet g:imported_rtp 6088a7d6542SBram Moolenaar 6098a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 6108a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 6118a7d6542SBram Moolenaar delete('import', 'd') 6128a7d6542SBram Moolenaarenddef 6138a7d6542SBram Moolenaar 6148a7d6542SBram Moolenaardef Test_fixed_size_list() 6158a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 6168a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 6178a7d6542SBram Moolenaar l->remove(0) 6188a7d6542SBram Moolenaar l->add(5) 6198a7d6542SBram Moolenaar l->insert(99, 1) 6200f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 6218a7d6542SBram Moolenaarenddef 6228a7d6542SBram Moolenaar 623673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 624673660abSBram Moolenaar" recognized. 625673660abSBram Moolenaarfunc Test_function_python() 626673660abSBram Moolenaar CheckFeature python3 627673660abSBram Moolenaar let py = 'python3' 628673660abSBram Moolenaar execute py "<< EOF" 629673660abSBram Moolenaardef do_something(): 630673660abSBram Moolenaar return 1 631673660abSBram MoolenaarEOF 632673660abSBram Moolenaarendfunc 633673660abSBram Moolenaar 634158906cfSBram Moolenaardef IfElse(what: number): string 635158906cfSBram Moolenaar let res = '' 636158906cfSBram Moolenaar if what == 1 637158906cfSBram Moolenaar res = "one" 638158906cfSBram Moolenaar elseif what == 2 639158906cfSBram Moolenaar res = "two" 640a259d8d3SBram Moolenaar else 641158906cfSBram Moolenaar res = "three" 642a259d8d3SBram Moolenaar endif 643158906cfSBram Moolenaar return res 644a259d8d3SBram Moolenaarenddef 645a259d8d3SBram Moolenaar 646158906cfSBram Moolenaardef Test_if_elseif_else() 647158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 648158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 649158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 6500f18b6d1SBram Moolenaarenddef 6510f18b6d1SBram Moolenaar 65263ce4849SBram Moolenaardef Test_delfunc() 65363ce4849SBram Moolenaar let lines =<< trim END 65463ce4849SBram Moolenaar vim9script 65563ce4849SBram Moolenaar def GoneSoon() 65663ce4849SBram Moolenaar echo 'hello' 65763ce4849SBram Moolenaar enddef 65863ce4849SBram Moolenaar 65963ce4849SBram Moolenaar def CallGoneSoon() 66063ce4849SBram Moolenaar GoneSoon() 66163ce4849SBram Moolenaar enddef 66263ce4849SBram Moolenaar 66363ce4849SBram Moolenaar delfunc GoneSoon 66463ce4849SBram Moolenaar CallGoneSoon() 66563ce4849SBram Moolenaar END 66663ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 66763ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 66863ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 66963ce4849SBram Moolenaar 67063ce4849SBram Moolenaar delete('XToDelFunc') 67163ce4849SBram Moolenaarenddef 67263ce4849SBram Moolenaar 6735b1c8fe3SBram Moolenaardef Test_substitute_cmd() 6745b1c8fe3SBram Moolenaar new 6755b1c8fe3SBram Moolenaar setline(1, 'something') 6765b1c8fe3SBram Moolenaar :substitute(some(other( 6775b1c8fe3SBram Moolenaar assert_equal('otherthing', getline(1)) 67883f37b91SBram Moolenaar bwipe! 67983f37b91SBram Moolenaar 68083f37b91SBram Moolenaar " also when the context is Vim9 script 68183f37b91SBram Moolenaar let lines =<< trim END 68283f37b91SBram Moolenaar vim9script 68383f37b91SBram Moolenaar new 68483f37b91SBram Moolenaar setline(1, 'something') 68583f37b91SBram Moolenaar :substitute(some(other( 68683f37b91SBram Moolenaar assert_equal('otherthing', getline(1)) 68783f37b91SBram Moolenaar bwipe! 68883f37b91SBram Moolenaar END 68983f37b91SBram Moolenaar writefile(lines, 'Xvim9lines') 69083f37b91SBram Moolenaar source Xvim9lines 69183f37b91SBram Moolenaar 69283f37b91SBram Moolenaar delete('Xvim9lines') 6935b1c8fe3SBram Moolenaarenddef 6945b1c8fe3SBram Moolenaar 6958a7d6542SBram Moolenaar 6968a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 697