18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4ad39c094SBram Moolenaarsource view_util.vim 5673660abSBram Moolenaar 68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message. 78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error) 8978d170bSBram Moolenaar call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef') 98a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 108a7d6542SBram Moolenaar call delete('Xdef') 118a7d6542SBram Moolenaarendfunc 128a7d6542SBram Moolenaar 138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error) 148a7d6542SBram Moolenaar call writefile(a:lines, 'Xdef') 158a7d6542SBram Moolenaar call assert_fails('so Xdef', a:error, a:lines) 168a7d6542SBram Moolenaar call delete('Xdef') 178a7d6542SBram Moolenaarendfunc 188a7d6542SBram Moolenaar 198a7d6542SBram Moolenaardef Test_syntax() 208a7d6542SBram Moolenaar let var = 234 218a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 228a7d6542SBram Moolenaarenddef 238a7d6542SBram Moolenaar 248a7d6542SBram Moolenaarfunc Test_def_basic() 258a7d6542SBram Moolenaar def SomeFunc(): string 268a7d6542SBram Moolenaar return 'yes' 278a7d6542SBram Moolenaar enddef 288a7d6542SBram Moolenaar call assert_equal('yes', SomeFunc()) 298a7d6542SBram Moolenaarendfunc 308a7d6542SBram Moolenaar 316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 326e587dcbSBram Moolenaarlet s:addToMe = 111 33401d9ffbSBram Moolenaarlet g:existing = 'yes' 34a8c17704SBram Moolenaarlet g:inc_counter = 1 35a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 366e587dcbSBram Moolenaar 378a7d6542SBram Moolenaardef Test_assignment() 388a7d6542SBram Moolenaar let bool1: bool = true 398a7d6542SBram Moolenaar assert_equal(v:true, bool1) 408a7d6542SBram Moolenaar let bool2: bool = false 418a7d6542SBram Moolenaar assert_equal(v:false, bool2) 428a7d6542SBram Moolenaar 430c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 448a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 450c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 460c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 470c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 488a7d6542SBram Moolenaar 49436472f5SBram Moolenaar let listS: list<string> = [] 50436472f5SBram Moolenaar let listN: list<number> = [] 518a7d6542SBram Moolenaar 520c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 538a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 540c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 550c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 560c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 57b283a8a6SBram Moolenaar 589be61bbbSBram Moolenaar let a: number = 6 599be61bbbSBram Moolenaar assert_equal(6, a) 609be61bbbSBram Moolenaar 6142a480bfSBram Moolenaar if has('channel') 6242a480bfSBram Moolenaar let chan1: channel 63fbdd08edSBram Moolenaar let job1: job 64f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6542a480bfSBram Moolenaar endif 66fbdd08edSBram Moolenaar if has('float') 67fbdd08edSBram Moolenaar let float1: float = 3.4 68fbdd08edSBram Moolenaar endif 69087d2e15SBram Moolenaar let funky1: func 70087d2e15SBram Moolenaar let funky2: func = function('len') 71087d2e15SBram Moolenaar let party1: partial 72087d2e15SBram Moolenaar let party2: partial = funcref('Test_syntax') 7342a480bfSBram Moolenaar 7461a6d4e4SBram Moolenaar " type becomes list<any> 7561a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 765381c7a1SBram Moolenaar " type becomes dict<any> 775381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7861a6d4e4SBram Moolenaar 79401d9ffbSBram Moolenaar g:newvar = 'new' 80401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 81401d9ffbSBram Moolenaar 82401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 83401d9ffbSBram Moolenaar g:existing = 'no' 84401d9ffbSBram Moolenaar assert_equal('no', g:existing) 85401d9ffbSBram Moolenaar 86b283a8a6SBram Moolenaar v:char = 'abc' 876e587dcbSBram Moolenaar assert_equal('abc', v:char) 88b283a8a6SBram Moolenaar 89b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 906e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 91b283a8a6SBram Moolenaar $ENVVAR = '' 926e587dcbSBram Moolenaar 93fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 94fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 95fd1823e0SBram Moolenaar s:addToMe += 222 96fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 970bbf722aSBram Moolenaar s:newVar = 'new' 980bbf722aSBram Moolenaar assert_equal('new', s:newVar) 99a8c17704SBram Moolenaar 100a8c17704SBram Moolenaar set ts=7 101a8c17704SBram Moolenaar &ts += 1 102a8c17704SBram Moolenaar assert_equal(8, &ts) 10380c34ca3SBram Moolenaar &ts -= 3 10480c34ca3SBram Moolenaar assert_equal(5, &ts) 10580c34ca3SBram Moolenaar &ts *= 2 10680c34ca3SBram Moolenaar assert_equal(10, &ts) 10780c34ca3SBram Moolenaar &ts /= 3 10880c34ca3SBram Moolenaar assert_equal(3, &ts) 10980c34ca3SBram Moolenaar set ts=10 11080c34ca3SBram Moolenaar &ts %= 4 11180c34ca3SBram Moolenaar assert_equal(2, &ts) 112a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 113a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 114a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 115*585fea7bSBram Moolenaar " test freeing ISN_STOREOPT 116*585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11780c34ca3SBram Moolenaar &ts = 8 118a8c17704SBram Moolenaar 119a8c17704SBram Moolenaar g:inc_counter += 1 120a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 121a8c17704SBram Moolenaar 122a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 123a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 124a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 125a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 126a8c17704SBram Moolenaar 127a8c17704SBram Moolenaar @a = 'areg' 128a8c17704SBram Moolenaar @a ..= 'add' 129a8c17704SBram Moolenaar assert_equal('aregadd', @a) 130a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 131a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 132e69f6d04SBram Moolenaar 133e69f6d04SBram Moolenaar v:errmsg = 'none' 134e69f6d04SBram Moolenaar v:errmsg ..= 'again' 135e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 136e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 137e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 138e69f6d04SBram Moolenaar 139e69f6d04SBram Moolenaar " Test default values. 140e69f6d04SBram Moolenaar let thebool: bool 141e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 142e69f6d04SBram Moolenaar 143e69f6d04SBram Moolenaar let thenumber: number 144e69f6d04SBram Moolenaar assert_equal(0, thenumber) 145e69f6d04SBram Moolenaar 146e69f6d04SBram Moolenaar if has('float') 147e69f6d04SBram Moolenaar let thefloat: float 148e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 149e69f6d04SBram Moolenaar endif 150e69f6d04SBram Moolenaar 151e69f6d04SBram Moolenaar let thestring: string 152e69f6d04SBram Moolenaar assert_equal('', thestring) 153e69f6d04SBram Moolenaar 154e69f6d04SBram Moolenaar let theblob: blob 155e69f6d04SBram Moolenaar assert_equal(0z, theblob) 156e69f6d04SBram Moolenaar 157e69f6d04SBram Moolenaar let thefunc: func 158e69f6d04SBram Moolenaar assert_equal(test_null_function(), thefunc) 159e69f6d04SBram Moolenaar 160e69f6d04SBram Moolenaar let thepartial: partial 161e69f6d04SBram Moolenaar assert_equal(test_null_partial(), thepartial) 162e69f6d04SBram Moolenaar 163e69f6d04SBram Moolenaar let thelist: list<any> 164e69f6d04SBram Moolenaar assert_equal([], thelist) 165e69f6d04SBram Moolenaar 166e69f6d04SBram Moolenaar let thedict: dict<any> 167e69f6d04SBram Moolenaar assert_equal({}, thedict) 168e69f6d04SBram Moolenaar 1692c869deeSBram Moolenaar if has('channel') 170e69f6d04SBram Moolenaar let thejob: job 171e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 172e69f6d04SBram Moolenaar 173e69f6d04SBram Moolenaar let thechannel: channel 174e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1752c869deeSBram Moolenaar endif 176*585fea7bSBram Moolenaar 177*585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 178*585fea7bSBram Moolenaar assert_equal(5678, nr) 1798a7d6542SBram Moolenaarenddef 1808a7d6542SBram Moolenaar 1818a7d6542SBram Moolenaarfunc Test_assignment_failure() 1828a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1838a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1848a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1858a7d6542SBram Moolenaar 1868a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1878a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1888a7d6542SBram Moolenaar 1899be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1909be61bbbSBram Moolenaar 191e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1929be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1939be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1949be61bbbSBram Moolenaar 1959be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1969be61bbbSBram Moolenaar 1979be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1989be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1999be61bbbSBram Moolenaar 2009be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 2019be61bbbSBram Moolenaar 2029be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 2039be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2049be61bbbSBram Moolenaar 20533fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 20633fa29cfSBram Moolenaar 2078a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2088a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2098a7d6542SBram Moolenaar 2108a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2118a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2128a7d6542SBram Moolenaar 2138a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2148a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 21542a480bfSBram Moolenaar 21642a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 21742a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 218599c89c8SBram Moolenaarendfunc 219599c89c8SBram Moolenaar 220599c89c8SBram Moolenaarfunc Test_wrong_type() 221599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 222599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 223599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 224599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 225599c89c8SBram Moolenaar 226599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 227599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22842a480bfSBram Moolenaar 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 23242a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 23342a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 23442a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 23542a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 23642a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 23742a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23842a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23942a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2408a7d6542SBram Moolenaarendfunc 2418a7d6542SBram Moolenaar 2428a7d6542SBram Moolenaarfunc Test_const() 2438a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2448a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2458a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2469be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2478a7d6542SBram Moolenaarendfunc 2488a7d6542SBram Moolenaar 2498a7d6542SBram Moolenaardef Test_block() 2508a7d6542SBram Moolenaar let outer = 1 2518a7d6542SBram Moolenaar { 2528a7d6542SBram Moolenaar let inner = 2 2538a7d6542SBram Moolenaar assert_equal(1, outer) 2548a7d6542SBram Moolenaar assert_equal(2, inner) 2558a7d6542SBram Moolenaar } 2568a7d6542SBram Moolenaar assert_equal(1, outer) 2578a7d6542SBram Moolenaarenddef 2588a7d6542SBram Moolenaar 2598a7d6542SBram Moolenaarfunc Test_block_failure() 2608a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 261*585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 262*585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 2638a7d6542SBram Moolenaarendfunc 2648a7d6542SBram Moolenaar 265*585fea7bSBram Moolenaardef Test_cmd_modifier() 266*585fea7bSBram Moolenaar tab echo '0' 267*585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 268*585fea7bSBram Moolenaarenddef 269*585fea7bSBram Moolenaar 270*585fea7bSBram Moolenaar 2718a7d6542SBram Moolenaardef ReturnString(): string 2728a7d6542SBram Moolenaar return 'string' 2738a7d6542SBram Moolenaarenddef 2748a7d6542SBram Moolenaar 2758a7d6542SBram Moolenaardef ReturnNumber(): number 2768a7d6542SBram Moolenaar return 123 2778a7d6542SBram Moolenaarenddef 2788a7d6542SBram Moolenaar 27909f28f49SBram Moolenaarlet g:notNumber = 'string' 28009f28f49SBram Moolenaar 28109f28f49SBram Moolenaardef ReturnGlobal(): number 28209f28f49SBram Moolenaar return g:notNumber 28309f28f49SBram Moolenaarenddef 28409f28f49SBram Moolenaar 2859be61bbbSBram Moolenaardef Test_return_something() 2868a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 2878a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 28809f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 2898a7d6542SBram Moolenaarenddef 2908a7d6542SBram Moolenaar 2919be61bbbSBram Moolenaarlet s:nothing = 0 2929be61bbbSBram Moolenaardef ReturnNothing() 2939be61bbbSBram Moolenaar s:nothing = 1 2949be61bbbSBram Moolenaar if true 2959be61bbbSBram Moolenaar return 2969be61bbbSBram Moolenaar endif 2979be61bbbSBram Moolenaar s:nothing = 2 2989be61bbbSBram Moolenaarenddef 2999be61bbbSBram Moolenaar 3009be61bbbSBram Moolenaardef Test_return_nothing() 3019be61bbbSBram Moolenaar ReturnNothing() 3029be61bbbSBram Moolenaar assert_equal(1, s:nothing) 3039be61bbbSBram Moolenaarenddef 3049be61bbbSBram Moolenaar 3058a7d6542SBram Moolenaarfunc Increment() 3068a7d6542SBram Moolenaar let g:counter += 1 3078a7d6542SBram Moolenaarendfunc 3088a7d6542SBram Moolenaar 3098a7d6542SBram Moolenaardef Test_call_ufunc_count() 3108a7d6542SBram Moolenaar g:counter = 1 3118a7d6542SBram Moolenaar Increment() 3128a7d6542SBram Moolenaar Increment() 3138a7d6542SBram Moolenaar Increment() 3148a7d6542SBram Moolenaar " works with and without :call 3158a7d6542SBram Moolenaar assert_equal(4, g:counter) 316b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 3178a7d6542SBram Moolenaar unlet g:counter 3188a7d6542SBram Moolenaarenddef 3198a7d6542SBram Moolenaar 3208a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 3218a7d6542SBram Moolenaar let res = arg 3228a7d6542SBram Moolenaar for s in rest 3238a7d6542SBram Moolenaar res ..= ',' .. s 3248a7d6542SBram Moolenaar endfor 3258a7d6542SBram Moolenaar return res 3268a7d6542SBram Moolenaarenddef 3278a7d6542SBram Moolenaar 3288a7d6542SBram Moolenaardef Test_call_varargs() 3298a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 3308a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 3318a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 3328a7d6542SBram Moolenaarenddef 3338a7d6542SBram Moolenaar 334170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 335170fcfcfSBram Moolenaar return name 336170fcfcfSBram Moolenaarenddef 337170fcfcfSBram Moolenaar 338170fcfcfSBram Moolenaardef Test_call_default_args() 339170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 340170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 341170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 342*585fea7bSBram Moolenaar 343*585fea7bSBram Moolenaar call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:') 344170fcfcfSBram Moolenaarenddef 345170fcfcfSBram Moolenaar 346170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 347170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 348170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 349170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 350170fcfcfSBram Moolenaarendfunc 351170fcfcfSBram Moolenaar 352b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 353b35efa5eSBram Moolenaar echo a:arg 354b35efa5eSBram Moolenaarendfunc 355b35efa5eSBram Moolenaar 356bd5da371SBram Moolenaardef Test_call_wrong_args() 357b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 358b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 359bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 360b35efa5eSBram Moolenaarenddef 361b35efa5eSBram Moolenaar 362170fcfcfSBram Moolenaar" Default arg and varargs 363170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 364170fcfcfSBram Moolenaar let res = one .. ',' .. two 365170fcfcfSBram Moolenaar for s in rest 366170fcfcfSBram Moolenaar res ..= ',' .. s 367170fcfcfSBram Moolenaar endfor 368170fcfcfSBram Moolenaar return res 369170fcfcfSBram Moolenaarenddef 370170fcfcfSBram Moolenaar 371170fcfcfSBram Moolenaardef Test_call_def_varargs() 372170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 373170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 374170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 375170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 376170fcfcfSBram Moolenaarenddef 377170fcfcfSBram Moolenaar 37842a480bfSBram Moolenaardef Test_using_var_as_arg() 37942a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 38042a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 38142a480bfSBram Moolenaar call delete('Xdef') 38242a480bfSBram Moolenaarenddef 38342a480bfSBram Moolenaar 384b35efa5eSBram Moolenaardef Test_call_func_defined_later() 385b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 386b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 387b35efa5eSBram Moolenaarenddef 388170fcfcfSBram Moolenaar 389b35efa5eSBram Moolenaarfunc DefinedLater(arg) 39026e117e9SBram Moolenaar return a:arg 39126e117e9SBram Moolenaarendfunc 39226e117e9SBram Moolenaar 3937eeefd4aSBram Moolenaardef FuncWithForwardCall() 3947eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3957eeefd4aSBram Moolenaarenddef 3967eeefd4aSBram Moolenaar 3977eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3987eeefd4aSBram Moolenaar return arg 3997eeefd4aSBram Moolenaarenddef 4007eeefd4aSBram Moolenaar 4017eeefd4aSBram Moolenaardef Test_error_in_nested_function() 4027eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 4037eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 4047eeefd4aSBram Moolenaarenddef 4057eeefd4aSBram Moolenaar 4068a7d6542SBram Moolenaardef Test_return_type_wrong() 407978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 408978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 409978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 410978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 411cf3f8bf4SBram Moolenaar 4129be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 4139be61bbbSBram Moolenaar 414cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 415cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 4168a7d6542SBram Moolenaarenddef 4178a7d6542SBram Moolenaar 418bfe12043SBram Moolenaardef Test_arg_type_wrong() 419bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 420bfe12043SBram Moolenaarenddef 421bfe12043SBram Moolenaar 4228a7d6542SBram Moolenaardef Test_try_catch() 4238a7d6542SBram Moolenaar let l = [] 4248a7d6542SBram Moolenaar try 4258a7d6542SBram Moolenaar add(l, '1') 4268a7d6542SBram Moolenaar throw 'wrong' 4278a7d6542SBram Moolenaar add(l, '2') 4288a7d6542SBram Moolenaar catch 4298a7d6542SBram Moolenaar add(l, v:exception) 4308a7d6542SBram Moolenaar finally 4318a7d6542SBram Moolenaar add(l, '3') 4328a7d6542SBram Moolenaar endtry 4338a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4348a7d6542SBram Moolenaarenddef 4358a7d6542SBram Moolenaar 436257cc5eeSBram Moolenaardef ThrowFromDef() 437257cc5eeSBram Moolenaar throw 'getout' 438257cc5eeSBram Moolenaarenddef 439257cc5eeSBram Moolenaar 440257cc5eeSBram Moolenaarfunc CatchInFunc() 441257cc5eeSBram Moolenaar try 442257cc5eeSBram Moolenaar call ThrowFromDef() 443257cc5eeSBram Moolenaar catch 444257cc5eeSBram Moolenaar let g:thrown_func = v:exception 445257cc5eeSBram Moolenaar endtry 446257cc5eeSBram Moolenaarendfunc 447257cc5eeSBram Moolenaar 448257cc5eeSBram Moolenaardef CatchInDef() 449257cc5eeSBram Moolenaar try 450257cc5eeSBram Moolenaar ThrowFromDef() 451257cc5eeSBram Moolenaar catch 452257cc5eeSBram Moolenaar g:thrown_def = v:exception 453257cc5eeSBram Moolenaar endtry 454257cc5eeSBram Moolenaarenddef 455257cc5eeSBram Moolenaar 456f575adffSBram Moolenaardef ReturnFinally(): string 457f575adffSBram Moolenaar try 458f575adffSBram Moolenaar return 'intry' 459f575adffSBram Moolenaar finally 460f575adffSBram Moolenaar g:in_finally = 'finally' 461f575adffSBram Moolenaar endtry 462f575adffSBram Moolenaar return 'end' 463f575adffSBram Moolenaarenddef 464f575adffSBram Moolenaar 465257cc5eeSBram Moolenaardef Test_try_catch_nested() 466257cc5eeSBram Moolenaar CatchInFunc() 467257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 468257cc5eeSBram Moolenaar 469257cc5eeSBram Moolenaar CatchInDef() 470257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 471f575adffSBram Moolenaar 472f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 473f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 474f575adffSBram Moolenaarenddef 475f575adffSBram Moolenaar 476f575adffSBram Moolenaardef Test_try_catch_match() 477f575adffSBram Moolenaar let seq = 'a' 478f575adffSBram Moolenaar try 479f575adffSBram Moolenaar throw 'something' 480f575adffSBram Moolenaar catch /nothing/ 481f575adffSBram Moolenaar seq ..= 'x' 482f575adffSBram Moolenaar catch /some/ 483f575adffSBram Moolenaar seq ..= 'b' 484f575adffSBram Moolenaar catch /asdf/ 485f575adffSBram Moolenaar seq ..= 'x' 486e8c4abbbSBram Moolenaar catch ?a\?sdf? 487e8c4abbbSBram Moolenaar seq ..= 'y' 488f575adffSBram Moolenaar finally 489f575adffSBram Moolenaar seq ..= 'c' 490f575adffSBram Moolenaar endtry 491f575adffSBram Moolenaar assert_equal('abc', seq) 492257cc5eeSBram Moolenaarenddef 493257cc5eeSBram Moolenaar 494e8c4abbbSBram Moolenaardef Test_try_catch_fails() 495e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 496e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 497e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 498*585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 499*585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 500*585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 501*585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 502*585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 503*585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 504*585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 505*585fea7bSBram Moolenaar 506*585fea7bSBram Moolenaar call CheckDefFailure(['throw'], 'E471:') 507*585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 508e8c4abbbSBram Moolenaarenddef 509e8c4abbbSBram Moolenaar 5108a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 5118a7d6542SBram Moolenaar vim9script 5128a7d6542SBram Moolenaar let name: string = 'bob' 5138a7d6542SBram Moolenaar def Concat(arg: string): string 5148a7d6542SBram Moolenaar return name .. arg 5158a7d6542SBram Moolenaar enddef 5168a7d6542SBram Moolenaar let g:result = Concat('bie') 5178a7d6542SBram Moolenaar let g:localname = name 5188a7d6542SBram Moolenaar 5198a7d6542SBram Moolenaar export const CONST = 1234 5208a7d6542SBram Moolenaar export let exported = 9876 5216e587dcbSBram Moolenaar export let exp_name = 'John' 5228a7d6542SBram Moolenaar export def Exported(): string 5238a7d6542SBram Moolenaar return 'Exported' 5248a7d6542SBram Moolenaar enddef 5258a7d6542SBram MoolenaarEND 5268a7d6542SBram Moolenaar 5275269bd2aSBram Moolenaardef Test_vim9_import_export() 5288a7d6542SBram Moolenaar let import_script_lines =<< trim END 5298a7d6542SBram Moolenaar vim9script 5308a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 5318a7d6542SBram Moolenaar g:imported = exported 5326e587dcbSBram Moolenaar exported += 3 5336e587dcbSBram Moolenaar g:imported_added = exported 5348a7d6542SBram Moolenaar g:imported_func = Exported() 5356e587dcbSBram Moolenaar 5366e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5376e587dcbSBram Moolenaar g:imported_name = exp_name 5386e587dcbSBram Moolenaar exp_name ..= ' Doe' 5396e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5405381c7a1SBram Moolenaar g:imported_later = exported 5418a7d6542SBram Moolenaar END 5428a7d6542SBram Moolenaar 5438a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5448a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5458a7d6542SBram Moolenaar 5468a7d6542SBram Moolenaar source Ximport.vim 5478a7d6542SBram Moolenaar 5488a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5498a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5508a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5516e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5525381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5538a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5546e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5556e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5568a7d6542SBram Moolenaar assert_false(exists('g:name')) 5578a7d6542SBram Moolenaar 5588a7d6542SBram Moolenaar unlet g:result 5598a7d6542SBram Moolenaar unlet g:localname 5608a7d6542SBram Moolenaar unlet g:imported 5616e587dcbSBram Moolenaar unlet g:imported_added 5625381c7a1SBram Moolenaar unlet g:imported_later 5638a7d6542SBram Moolenaar unlet g:imported_func 5646e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5658a7d6542SBram Moolenaar delete('Ximport.vim') 566f2d5c240SBram Moolenaar 5675381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5685381c7a1SBram Moolenaar vim9script 5695381c7a1SBram Moolenaar def ImportInDef() 5705381c7a1SBram Moolenaar import exported from './Xexport.vim' 5715381c7a1SBram Moolenaar g:imported = exported 5725381c7a1SBram Moolenaar exported += 7 5735381c7a1SBram Moolenaar g:imported_added = exported 5745381c7a1SBram Moolenaar enddef 5755381c7a1SBram Moolenaar ImportInDef() 5765381c7a1SBram Moolenaar END 5775381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5785381c7a1SBram Moolenaar source Ximport2.vim 5795381c7a1SBram Moolenaar " TODO: this should be 9879 5805381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5815381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5825381c7a1SBram Moolenaar unlet g:imported 5835381c7a1SBram Moolenaar unlet g:imported_added 5845381c7a1SBram Moolenaar delete('Ximport2.vim') 5855381c7a1SBram Moolenaar 586f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 587f2d5c240SBram Moolenaar vim9script 588f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 589f2d5c240SBram Moolenaar def UseExport() 590f2d5c240SBram Moolenaar g:imported = Export.exported 591f2d5c240SBram Moolenaar enddef 592f2d5c240SBram Moolenaar UseExport() 593f2d5c240SBram Moolenaar END 594f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 595f2d5c240SBram Moolenaar source Ximport.vim 5965381c7a1SBram Moolenaar assert_equal(9883, g:imported) 597f2d5c240SBram Moolenaar 598599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 599599c89c8SBram Moolenaar vim9script 600599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 601599c89c8SBram Moolenaar def Func() 602599c89c8SBram Moolenaar let dummy = 1 603599c89c8SBram Moolenaar let imported = Export + dummy 604599c89c8SBram Moolenaar enddef 605599c89c8SBram Moolenaar END 606599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 607599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 608599c89c8SBram Moolenaar 609599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 610599c89c8SBram Moolenaar vim9script 611599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 612599c89c8SBram Moolenaar def Func() 613599c89c8SBram Moolenaar let imported = Export . exported 614599c89c8SBram Moolenaar enddef 615599c89c8SBram Moolenaar END 616599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 617599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 618599c89c8SBram Moolenaar 619599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 620599c89c8SBram Moolenaar vim9script 621599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 622599c89c8SBram Moolenaar def Func() 623599c89c8SBram Moolenaar let imported = Export. 624599c89c8SBram Moolenaar enddef 625599c89c8SBram Moolenaar END 626599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 627599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 628599c89c8SBram Moolenaar 629f2d5c240SBram Moolenaar let import_star_lines =<< trim END 630f2d5c240SBram Moolenaar vim9script 631f2d5c240SBram Moolenaar import * from './Xexport.vim' 632f2d5c240SBram Moolenaar g:imported = exported 633f2d5c240SBram Moolenaar END 634f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 635f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 636f2d5c240SBram Moolenaar 637fa29c8abSBram Moolenaar " try to import something that exists but is not exported 638fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 639fa29c8abSBram Moolenaar vim9script 640fa29c8abSBram Moolenaar import name from './Xexport.vim' 641fa29c8abSBram Moolenaar END 642fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 643fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 644fa29c8abSBram Moolenaar 6455269bd2aSBram Moolenaar " try to import something that is already defined 6465269bd2aSBram Moolenaar let import_already_defined =<< trim END 6475269bd2aSBram Moolenaar vim9script 6485269bd2aSBram Moolenaar let exported = 'something' 6495269bd2aSBram Moolenaar import exported from './Xexport.vim' 6505269bd2aSBram Moolenaar END 6515269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6525269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6535269bd2aSBram Moolenaar 6545269bd2aSBram Moolenaar " try to import something that is already defined 6555269bd2aSBram Moolenaar import_already_defined =<< trim END 6565269bd2aSBram Moolenaar vim9script 6575269bd2aSBram Moolenaar let exported = 'something' 6585269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6595269bd2aSBram Moolenaar END 6605269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6615269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6625269bd2aSBram Moolenaar 6635269bd2aSBram Moolenaar " try to import something that is already defined 6645269bd2aSBram Moolenaar import_already_defined =<< trim END 6655269bd2aSBram Moolenaar vim9script 6665269bd2aSBram Moolenaar let exported = 'something' 6675269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6685269bd2aSBram Moolenaar END 6695269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6705269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6715269bd2aSBram Moolenaar 672fa29c8abSBram Moolenaar " import a very long name, requires making a copy 673fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 674fa29c8abSBram Moolenaar vim9script 675fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 676fa29c8abSBram Moolenaar END 677fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 678fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 679fa29c8abSBram Moolenaar 680fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 681fa29c8abSBram Moolenaar vim9script 682fa29c8abSBram Moolenaar import name './Xexport.vim' 683fa29c8abSBram Moolenaar END 684fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 685fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 686fa29c8abSBram Moolenaar 687fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 688fa29c8abSBram Moolenaar vim9script 689fa29c8abSBram Moolenaar import name from Xexport.vim 690fa29c8abSBram Moolenaar END 691fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 692fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 693fa29c8abSBram Moolenaar 694fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 695fa29c8abSBram Moolenaar vim9script 696fa29c8abSBram Moolenaar import name from './XnoExport.vim' 697fa29c8abSBram Moolenaar END 698fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 699fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 700fa29c8abSBram Moolenaar 701fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 702fa29c8abSBram Moolenaar vim9script 703fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 704fa29c8abSBram Moolenaar END 7055269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 7065269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 707fa29c8abSBram Moolenaar 708f2d5c240SBram Moolenaar delete('Ximport.vim') 7095269bd2aSBram Moolenaar delete('Ximport3.vim') 7108a7d6542SBram Moolenaar delete('Xexport.vim') 7118a7d6542SBram Moolenaar 712750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 713750802b5SBram Moolenaar set cpo&vi 714750802b5SBram Moolenaar let cpo_before = &cpo 715750802b5SBram Moolenaar let lines =<< trim END 716750802b5SBram Moolenaar vim9script 717750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 718750802b5SBram Moolenaar END 719750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 720750802b5SBram Moolenaar source Xvim9_script 721750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 722750802b5SBram Moolenaar set cpo&vim 723750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 724750802b5SBram Moolenaar delete('Xvim9_script') 725750802b5SBram Moolenaarenddef 726750802b5SBram Moolenaar 727750802b5SBram Moolenaardef Test_vim9script_fails() 7288a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 7298a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 730750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 731f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 732750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 733750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 734750802b5SBram Moolenaar 735750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 736750802b5SBram Moolenaar assert_fails('export something', 'E1042') 7378a7d6542SBram Moolenaarenddef 7388a7d6542SBram Moolenaar 7398a7d6542SBram Moolenaardef Test_vim9script_call() 7408a7d6542SBram Moolenaar let lines =<< trim END 7418a7d6542SBram Moolenaar vim9script 7428a7d6542SBram Moolenaar let var = '' 7438a7d6542SBram Moolenaar def MyFunc(arg: string) 7448a7d6542SBram Moolenaar var = arg 7458a7d6542SBram Moolenaar enddef 7468a7d6542SBram Moolenaar MyFunc('foobar') 7478a7d6542SBram Moolenaar assert_equal('foobar', var) 7488a7d6542SBram Moolenaar 7498a7d6542SBram Moolenaar let str = 'barfoo' 7508a7d6542SBram Moolenaar str->MyFunc() 7518a7d6542SBram Moolenaar assert_equal('barfoo', var) 7528a7d6542SBram Moolenaar 7538a7d6542SBram Moolenaar let g:value = 'value' 7548a7d6542SBram Moolenaar g:value->MyFunc() 7558a7d6542SBram Moolenaar assert_equal('value', var) 7568a7d6542SBram Moolenaar 7578a7d6542SBram Moolenaar let listvar = [] 7588a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 7598a7d6542SBram Moolenaar listvar = arg 7608a7d6542SBram Moolenaar enddef 7618a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 7628a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 7638a7d6542SBram Moolenaar 7648a7d6542SBram Moolenaar let dictvar = {} 7658a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 7668a7d6542SBram Moolenaar dictvar = arg 7678a7d6542SBram Moolenaar enddef 7688a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 7698a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 77033fa29cfSBram Moolenaar def CompiledDict() 77133fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 77233fa29cfSBram Moolenaar enddef 77333fa29cfSBram Moolenaar CompiledDict() 77433fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 77533fa29cfSBram Moolenaar 7768a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 7778a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 7780c6ceaf9SBram Moolenaar 7790c6ceaf9SBram Moolenaar ('text')->MyFunc() 7800c6ceaf9SBram Moolenaar assert_equal('text', var) 7810c6ceaf9SBram Moolenaar ("some")->MyFunc() 7820c6ceaf9SBram Moolenaar assert_equal('some', var) 7838a7d6542SBram Moolenaar END 7848a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 7858a7d6542SBram Moolenaar source Xcall.vim 7868a7d6542SBram Moolenaar delete('Xcall.vim') 7878a7d6542SBram Moolenaarenddef 7888a7d6542SBram Moolenaar 7898a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 7908a7d6542SBram Moolenaar let lines =<< trim END 7918a7d6542SBram Moolenaar vim9script 7928a7d6542SBram Moolenaar let var = '' 7938a7d6542SBram Moolenaar def MyFunc(arg: string) 7948a7d6542SBram Moolenaar let var = 123 7958a7d6542SBram Moolenaar enddef 7968a7d6542SBram Moolenaar END 7978a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 7988a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 7998a7d6542SBram Moolenaar delete('Xcall_decl.vim') 8008a7d6542SBram Moolenaarenddef 8018a7d6542SBram Moolenaar 8028a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 8038a7d6542SBram Moolenaar let lines =<< trim END 8048a7d6542SBram Moolenaar vim9script 8058a7d6542SBram Moolenaar const var = '' 8068a7d6542SBram Moolenaar def MyFunc(arg: string) 8078a7d6542SBram Moolenaar var = 'asdf' 8088a7d6542SBram Moolenaar enddef 8098a7d6542SBram Moolenaar END 8108a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 8118a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 8128a7d6542SBram Moolenaar delete('Xcall_const.vim') 8138a7d6542SBram Moolenaarenddef 8148a7d6542SBram Moolenaar 8158a7d6542SBram Moolenaardef Test_vim9script_reload() 8168a7d6542SBram Moolenaar let lines =<< trim END 8178a7d6542SBram Moolenaar vim9script 8188a7d6542SBram Moolenaar const var = '' 8198a7d6542SBram Moolenaar let valone = 1234 8208a7d6542SBram Moolenaar def MyFunc(arg: string) 8218a7d6542SBram Moolenaar valone = 5678 8228a7d6542SBram Moolenaar enddef 8238a7d6542SBram Moolenaar END 8248a7d6542SBram Moolenaar let morelines =<< trim END 8258a7d6542SBram Moolenaar let valtwo = 222 8268a7d6542SBram Moolenaar export def GetValtwo(): number 8278a7d6542SBram Moolenaar return valtwo 8288a7d6542SBram Moolenaar enddef 8298a7d6542SBram Moolenaar END 8308a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 8318a7d6542SBram Moolenaar source Xreload.vim 8328a7d6542SBram Moolenaar source Xreload.vim 8338a7d6542SBram Moolenaar source Xreload.vim 8348a7d6542SBram Moolenaar 8358a7d6542SBram Moolenaar let testlines =<< trim END 8368a7d6542SBram Moolenaar vim9script 8378a7d6542SBram Moolenaar def TheFunc() 8388a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 8398a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 8408a7d6542SBram Moolenaar enddef 8418a7d6542SBram Moolenaar TheFunc() 8428a7d6542SBram Moolenaar END 8438a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 8448a7d6542SBram Moolenaar source Ximport.vim 8458a7d6542SBram Moolenaar 8468a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 8478a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 8488a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8498a7d6542SBram Moolenaar source Xreload.vim 8508a7d6542SBram Moolenaar source Ximport.vim 8518a7d6542SBram Moolenaar 8528a7d6542SBram Moolenaar " cannot declare a var twice 8538a7d6542SBram Moolenaar lines =<< trim END 8548a7d6542SBram Moolenaar vim9script 8558a7d6542SBram Moolenaar let valone = 1234 8568a7d6542SBram Moolenaar let valone = 5678 8578a7d6542SBram Moolenaar END 8588a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8598a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 8608a7d6542SBram Moolenaar 8618a7d6542SBram Moolenaar delete('Xreload.vim') 8628a7d6542SBram Moolenaar delete('Ximport.vim') 8638a7d6542SBram Moolenaarenddef 8648a7d6542SBram Moolenaar 8658a7d6542SBram Moolenaardef Test_import_absolute() 8668a7d6542SBram Moolenaar let import_lines = [ 8678a7d6542SBram Moolenaar \ 'vim9script', 8688a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 869b283a8a6SBram Moolenaar \ 'def UseExported()', 8708a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 8714e12a5dfSBram Moolenaar \ ' exported = 8888', 8724e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 873b283a8a6SBram Moolenaar \ 'enddef', 874b283a8a6SBram Moolenaar \ 'UseExported()', 8754e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 8768a7d6542SBram Moolenaar \ ] 8778a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8788a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8798a7d6542SBram Moolenaar 8808a7d6542SBram Moolenaar source Ximport_abs.vim 8818a7d6542SBram Moolenaar 8828a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8834e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 884b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 885b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 886b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8874e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 8884e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 8894e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 8904e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 8914e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8924e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 8934e12a5dfSBram Moolenaar \, g:import_disassembled) 8948a7d6542SBram Moolenaar unlet g:imported_abs 8954e12a5dfSBram Moolenaar unlet g:import_disassembled 8968a7d6542SBram Moolenaar 8978a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8988a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8998a7d6542SBram Moolenaarenddef 9008a7d6542SBram Moolenaar 9018a7d6542SBram Moolenaardef Test_import_rtp() 9028a7d6542SBram Moolenaar let import_lines = [ 9038a7d6542SBram Moolenaar \ 'vim9script', 9048a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 9058a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 9068a7d6542SBram Moolenaar \ ] 9078a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 9088a7d6542SBram Moolenaar mkdir('import') 9098a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 9108a7d6542SBram Moolenaar 9118a7d6542SBram Moolenaar let save_rtp = &rtp 9128a7d6542SBram Moolenaar &rtp = getcwd() 9138a7d6542SBram Moolenaar source Ximport_rtp.vim 9148a7d6542SBram Moolenaar &rtp = save_rtp 9158a7d6542SBram Moolenaar 9168a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 9178a7d6542SBram Moolenaar unlet g:imported_rtp 9188a7d6542SBram Moolenaar 9198a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 9208a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 9218a7d6542SBram Moolenaar delete('import', 'd') 9228a7d6542SBram Moolenaarenddef 9238a7d6542SBram Moolenaar 9248a7d6542SBram Moolenaardef Test_fixed_size_list() 9258a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 9268a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 9278a7d6542SBram Moolenaar l->remove(0) 9288a7d6542SBram Moolenaar l->add(5) 9298a7d6542SBram Moolenaar l->insert(99, 1) 9300f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 9318a7d6542SBram Moolenaarenddef 9328a7d6542SBram Moolenaar 933673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 934673660abSBram Moolenaar" recognized. 935673660abSBram Moolenaarfunc Test_function_python() 936673660abSBram Moolenaar CheckFeature python3 937673660abSBram Moolenaar let py = 'python3' 938673660abSBram Moolenaar execute py "<< EOF" 939673660abSBram Moolenaardef do_something(): 940673660abSBram Moolenaar return 1 941673660abSBram MoolenaarEOF 942673660abSBram Moolenaarendfunc 943673660abSBram Moolenaar 944158906cfSBram Moolenaardef IfElse(what: number): string 945158906cfSBram Moolenaar let res = '' 946158906cfSBram Moolenaar if what == 1 947158906cfSBram Moolenaar res = "one" 948158906cfSBram Moolenaar elseif what == 2 949158906cfSBram Moolenaar res = "two" 950a259d8d3SBram Moolenaar else 951158906cfSBram Moolenaar res = "three" 952a259d8d3SBram Moolenaar endif 953158906cfSBram Moolenaar return res 954a259d8d3SBram Moolenaarenddef 955a259d8d3SBram Moolenaar 956158906cfSBram Moolenaardef Test_if_elseif_else() 957158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 958158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 959158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9600f18b6d1SBram Moolenaarenddef 9610f18b6d1SBram Moolenaar 962e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 963e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 964e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 965e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 966e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 967*585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 968e8c4abbbSBram Moolenaarenddef 969e8c4abbbSBram Moolenaar 9706d69bf60SBram Moolenaarlet g:bool_true = v:true 9716d69bf60SBram Moolenaarlet g:bool_false = v:false 9726d69bf60SBram Moolenaar 9736d69bf60SBram Moolenaardef Test_if_const_expr() 9746d69bf60SBram Moolenaar let res = false 9756d69bf60SBram Moolenaar if true ? true : false 9766d69bf60SBram Moolenaar res = true 9776d69bf60SBram Moolenaar endif 9786d69bf60SBram Moolenaar assert_equal(true, res) 9796d69bf60SBram Moolenaar 980*585fea7bSBram Moolenaar g:glob = 2 981*585fea7bSBram Moolenaar if false 982*585fea7bSBram Moolenaar execute('let g:glob = 3') 983*585fea7bSBram Moolenaar endif 984*585fea7bSBram Moolenaar assert_equal(2, g:glob) 985*585fea7bSBram Moolenaar if true 986*585fea7bSBram Moolenaar execute('let g:glob = 3') 987*585fea7bSBram Moolenaar endif 988*585fea7bSBram Moolenaar assert_equal(3, g:glob) 989*585fea7bSBram Moolenaar 9906d69bf60SBram Moolenaar res = false 9916d69bf60SBram Moolenaar if g:bool_true ? true : false 9926d69bf60SBram Moolenaar res = true 9936d69bf60SBram Moolenaar endif 9946d69bf60SBram Moolenaar assert_equal(true, res) 9956d69bf60SBram Moolenaar 9966d69bf60SBram Moolenaar res = false 9976d69bf60SBram Moolenaar if true ? g:bool_true : false 9986d69bf60SBram Moolenaar res = true 9996d69bf60SBram Moolenaar endif 10006d69bf60SBram Moolenaar assert_equal(true, res) 10016d69bf60SBram Moolenaar 10026d69bf60SBram Moolenaar res = false 10036d69bf60SBram Moolenaar if true ? true : g:bool_false 10046d69bf60SBram Moolenaar res = true 10056d69bf60SBram Moolenaar endif 10066d69bf60SBram Moolenaar assert_equal(true, res) 10076d69bf60SBram Moolenaar 10086d69bf60SBram Moolenaar res = false 10096d69bf60SBram Moolenaar if true ? false : true 10106d69bf60SBram Moolenaar res = true 10116d69bf60SBram Moolenaar endif 10126d69bf60SBram Moolenaar assert_equal(false, res) 10136d69bf60SBram Moolenaar 10146d69bf60SBram Moolenaar res = false 10156d69bf60SBram Moolenaar if false ? false : true 10166d69bf60SBram Moolenaar res = true 10176d69bf60SBram Moolenaar endif 10186d69bf60SBram Moolenaar assert_equal(true, res) 10196d69bf60SBram Moolenaar 10206d69bf60SBram Moolenaar res = false 10216d69bf60SBram Moolenaar if false ? true : false 10226d69bf60SBram Moolenaar res = true 10236d69bf60SBram Moolenaar endif 10246d69bf60SBram Moolenaar assert_equal(false, res) 10256d69bf60SBram Moolenaar 10266d69bf60SBram Moolenaar res = false 1027e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1028e8c4abbbSBram Moolenaar res = true 1029e8c4abbbSBram Moolenaar endif 1030e8c4abbbSBram Moolenaar assert_equal(false, res) 1031e8c4abbbSBram Moolenaar 1032e8c4abbbSBram Moolenaar res = false 10336d69bf60SBram Moolenaar if true && true 10346d69bf60SBram Moolenaar res = true 10356d69bf60SBram Moolenaar endif 10366d69bf60SBram Moolenaar assert_equal(true, res) 10376d69bf60SBram Moolenaar 10386d69bf60SBram Moolenaar res = false 10396d69bf60SBram Moolenaar if true && false 10406d69bf60SBram Moolenaar res = true 10416d69bf60SBram Moolenaar endif 10426d69bf60SBram Moolenaar assert_equal(false, res) 10436d69bf60SBram Moolenaar 10446d69bf60SBram Moolenaar res = false 10456d69bf60SBram Moolenaar if g:bool_true && false 10466d69bf60SBram Moolenaar res = true 10476d69bf60SBram Moolenaar endif 10486d69bf60SBram Moolenaar assert_equal(false, res) 10496d69bf60SBram Moolenaar 10506d69bf60SBram Moolenaar res = false 10516d69bf60SBram Moolenaar if true && g:bool_false 10526d69bf60SBram Moolenaar res = true 10536d69bf60SBram Moolenaar endif 10546d69bf60SBram Moolenaar assert_equal(false, res) 10556d69bf60SBram Moolenaar 10566d69bf60SBram Moolenaar res = false 10576d69bf60SBram Moolenaar if false && false 10586d69bf60SBram Moolenaar res = true 10596d69bf60SBram Moolenaar endif 10606d69bf60SBram Moolenaar assert_equal(false, res) 10616d69bf60SBram Moolenaar 10626d69bf60SBram Moolenaar res = false 10636d69bf60SBram Moolenaar if true || false 10646d69bf60SBram Moolenaar res = true 10656d69bf60SBram Moolenaar endif 10666d69bf60SBram Moolenaar assert_equal(true, res) 10676d69bf60SBram Moolenaar 10686d69bf60SBram Moolenaar res = false 10696d69bf60SBram Moolenaar if g:bool_true || false 10706d69bf60SBram Moolenaar res = true 10716d69bf60SBram Moolenaar endif 10726d69bf60SBram Moolenaar assert_equal(true, res) 10736d69bf60SBram Moolenaar 10746d69bf60SBram Moolenaar res = false 10756d69bf60SBram Moolenaar if true || g:bool_false 10766d69bf60SBram Moolenaar res = true 10776d69bf60SBram Moolenaar endif 10786d69bf60SBram Moolenaar assert_equal(true, res) 10796d69bf60SBram Moolenaar 10806d69bf60SBram Moolenaar res = false 10816d69bf60SBram Moolenaar if false || false 10826d69bf60SBram Moolenaar res = true 10836d69bf60SBram Moolenaar endif 10846d69bf60SBram Moolenaar assert_equal(false, res) 108580c34ca3SBram Moolenaarenddef 10866d69bf60SBram Moolenaar 108780c34ca3SBram Moolenaardef Test_if_const_expr_fails() 108880c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 108980c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1090e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1091e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 10926d69bf60SBram Moolenaarenddef 10936d69bf60SBram Moolenaar 109463ce4849SBram Moolenaardef Test_delfunc() 109563ce4849SBram Moolenaar let lines =<< trim END 109663ce4849SBram Moolenaar vim9script 109763ce4849SBram Moolenaar def GoneSoon() 109863ce4849SBram Moolenaar echo 'hello' 109963ce4849SBram Moolenaar enddef 110063ce4849SBram Moolenaar 110163ce4849SBram Moolenaar def CallGoneSoon() 110263ce4849SBram Moolenaar GoneSoon() 110363ce4849SBram Moolenaar enddef 110463ce4849SBram Moolenaar 110563ce4849SBram Moolenaar delfunc GoneSoon 110663ce4849SBram Moolenaar CallGoneSoon() 110763ce4849SBram Moolenaar END 110863ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 110963ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 111063ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 111163ce4849SBram Moolenaar 111263ce4849SBram Moolenaar delete('XToDelFunc') 111363ce4849SBram Moolenaarenddef 111463ce4849SBram Moolenaar 1115ad39c094SBram Moolenaardef Test_execute_cmd() 1116ad39c094SBram Moolenaar new 1117ad39c094SBram Moolenaar setline(1, 'default') 1118ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1119ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1120ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1121ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1122ad39c094SBram Moolenaar execute cmd1 cmd2 1123ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1124ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1125ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1126ad39c094SBram Moolenaar let cmd_first = 'call ' 1127ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1128ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1129ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1130ad39c094SBram Moolenaar bwipe! 1131*585fea7bSBram Moolenaar 1132*585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1133ad39c094SBram Moolenaarenddef 1134ad39c094SBram Moolenaar 1135ad39c094SBram Moolenaardef Test_echo_cmd() 1136*585fea7bSBram Moolenaar echo 'some' 1137*585fea7bSBram Moolenaar echon 'thing' 1138ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1139ad39c094SBram Moolenaar 1140ad39c094SBram Moolenaar let str1 = 'some' 1141ad39c094SBram Moolenaar let str2 = 'more' 1142ad39c094SBram Moolenaar echo str1 str2 1143ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1144ad39c094SBram Moolenaarenddef 1145ad39c094SBram Moolenaar 114641fe0617SBram Moolenaardef Test_for_outside_of_function() 114741fe0617SBram Moolenaar let lines =<< trim END 114841fe0617SBram Moolenaar vim9script 114941fe0617SBram Moolenaar new 115041fe0617SBram Moolenaar for var in range(0, 3) 115141fe0617SBram Moolenaar append(line('$'), var) 115241fe0617SBram Moolenaar endfor 115341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 115441fe0617SBram Moolenaar bwipe! 115541fe0617SBram Moolenaar END 115641fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 115741fe0617SBram Moolenaar source Xvim9for.vim 115841fe0617SBram Moolenaar delete('Xvim9for.vim') 115941fe0617SBram Moolenaarenddef 11608a7d6542SBram Moolenaar 1161e8c4abbbSBram Moolenaardef Test_for_loop() 1162e8c4abbbSBram Moolenaar let result = '' 1163e8c4abbbSBram Moolenaar for cnt in range(7) 1164e8c4abbbSBram Moolenaar if cnt == 4 1165e8c4abbbSBram Moolenaar break 1166e8c4abbbSBram Moolenaar endif 1167e8c4abbbSBram Moolenaar if cnt == 2 1168e8c4abbbSBram Moolenaar continue 1169e8c4abbbSBram Moolenaar endif 1170e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1171e8c4abbbSBram Moolenaar endfor 1172e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 1173e8c4abbbSBram Moolenaarenddef 1174e8c4abbbSBram Moolenaar 1175e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1176e8c4abbbSBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1177e8c4abbbSBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1178e8c4abbbSBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1179e8c4abbbSBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1180e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1181e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in xxx'], 'E1001:') 1182e8c4abbbSBram Moolenaar call CheckDefFailure(['endfor'], 'E588:') 1183*585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1184e8c4abbbSBram Moolenaarenddef 1185e8c4abbbSBram Moolenaar 1186d0df1aacSBram Moolenaardef Test_while_loop() 1187d0df1aacSBram Moolenaar let result = '' 1188d0df1aacSBram Moolenaar let cnt = 0 1189d0df1aacSBram Moolenaar while cnt < 555 1190d0df1aacSBram Moolenaar if cnt == 3 1191d0df1aacSBram Moolenaar break 1192d0df1aacSBram Moolenaar endif 1193d0df1aacSBram Moolenaar cnt += 1 1194d0df1aacSBram Moolenaar if cnt == 2 1195d0df1aacSBram Moolenaar continue 1196d0df1aacSBram Moolenaar endif 1197d0df1aacSBram Moolenaar result ..= cnt .. '_' 1198d0df1aacSBram Moolenaar endwhile 1199d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1200d0df1aacSBram Moolenaarenddef 1201d0df1aacSBram Moolenaar 1202e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1203e8c4abbbSBram Moolenaar call CheckDefFailure(['while xxx'], 'E1001:') 1204e8c4abbbSBram Moolenaar call CheckDefFailure(['endwhile'], 'E588:') 1205e8c4abbbSBram Moolenaar call CheckDefFailure(['continue'], 'E586:') 1206e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'continue'], 'E586:') 1207e8c4abbbSBram Moolenaar call CheckDefFailure(['break'], 'E587:') 1208e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'break'], 'E587:') 1209*585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1210bd5da371SBram Moolenaarenddef 1211bd5da371SBram Moolenaar 12129645e2d9SBram Moolenaardef Test_interrupt_loop() 121397acfc78SBram Moolenaar let caught = false 12149645e2d9SBram Moolenaar let x = 0 121597acfc78SBram Moolenaar try 12169645e2d9SBram Moolenaar while 1 12179645e2d9SBram Moolenaar x += 1 12189645e2d9SBram Moolenaar if x == 100 12199645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 12209645e2d9SBram Moolenaar endif 12219645e2d9SBram Moolenaar endwhile 122297acfc78SBram Moolenaar catch 122397acfc78SBram Moolenaar caught = true 122497acfc78SBram Moolenaar assert_equal(100, x) 122597acfc78SBram Moolenaar endtry 122697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 12279645e2d9SBram Moolenaarenddef 122820431c9dSBram Moolenaar 122920431c9dSBram Moolenaardef Test_redef_failure() 123020431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 123120431c9dSBram Moolenaar so Xdef 123220431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 123320431c9dSBram Moolenaar so Xdef 123420431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 123520431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 123620431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 123720431c9dSBram Moolenaar so Xdef 123820431c9dSBram Moolenaar call delete('Xdef') 123920431c9dSBram Moolenaar 124020431c9dSBram Moolenaar call assert_equal(0, Func0()) 124120431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 124220431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 124320431c9dSBram Moolenaar 124420431c9dSBram Moolenaar delfunc! Func0 124520431c9dSBram Moolenaar delfunc! Func1 124620431c9dSBram Moolenaar delfunc! Func2 124720431c9dSBram Moolenaarenddef 124820431c9dSBram Moolenaar 12497d941ee0SBram Moolenaar" Test for internal functions returning different types 12507d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 12517d941ee0SBram Moolenaar let lines =<< trim END 12527d941ee0SBram Moolenaar def RetFloat(): float 12537d941ee0SBram Moolenaar return ceil(1.456) 12547d941ee0SBram Moolenaar enddef 12557d941ee0SBram Moolenaar 12567d941ee0SBram Moolenaar def RetListAny(): list<any> 12577d941ee0SBram Moolenaar return items({'k' : 'v'}) 12587d941ee0SBram Moolenaar enddef 12597d941ee0SBram Moolenaar 12607d941ee0SBram Moolenaar def RetListString(): list<string> 12617d941ee0SBram Moolenaar return split('a:b:c', ':') 12627d941ee0SBram Moolenaar enddef 12637d941ee0SBram Moolenaar 12647d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 12657d941ee0SBram Moolenaar return getbufinfo() 12667d941ee0SBram Moolenaar enddef 12677d941ee0SBram Moolenaar 12687d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 12697d941ee0SBram Moolenaar return wordcount() 12707d941ee0SBram Moolenaar enddef 12717d941ee0SBram Moolenaar 12727d941ee0SBram Moolenaar def RetDictString(): dict<string> 12737d941ee0SBram Moolenaar return environ() 12747d941ee0SBram Moolenaar enddef 12757d941ee0SBram Moolenaar END 12767d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 12777d941ee0SBram Moolenaar source Xscript 12787d941ee0SBram Moolenaar 12797d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 12807d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 12817d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 12827d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 12837d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 12847d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 12857d941ee0SBram Moolenaar call delete('Xscript') 12867d941ee0SBram Moolenaarendfunc 12877d941ee0SBram Moolenaar 12887d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 12897d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 12907d941ee0SBram Moolenaar let l =<< trim END 12917d941ee0SBram Moolenaar def! FArgErr(): float 12927d941ee0SBram Moolenaar return ceil(1.1, 2) 12937d941ee0SBram Moolenaar enddef 12947d941ee0SBram Moolenaar END 12957d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12967d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 12977d941ee0SBram Moolenaar let l =<< trim END 12987d941ee0SBram Moolenaar def! FArgErr(): float 12997d941ee0SBram Moolenaar return ceil() 13007d941ee0SBram Moolenaar enddef 13017d941ee0SBram Moolenaar END 13027d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 13037d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 13047d941ee0SBram Moolenaar call delete('Xinvalidarg') 13057d941ee0SBram Moolenaarendfunc 13067d941ee0SBram Moolenaar 1307*585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1308*585fea7bSBram Moolenaardef Test_substitute_cmd() 1309*585fea7bSBram Moolenaar new 1310*585fea7bSBram Moolenaar setline(1, 'something') 1311*585fea7bSBram Moolenaar :substitute(some(other( 1312*585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1313*585fea7bSBram Moolenaar bwipe! 1314*585fea7bSBram Moolenaar 1315*585fea7bSBram Moolenaar " also when the context is Vim9 script 1316*585fea7bSBram Moolenaar let lines =<< trim END 1317*585fea7bSBram Moolenaar vim9script 1318*585fea7bSBram Moolenaar new 1319*585fea7bSBram Moolenaar setline(1, 'something') 1320*585fea7bSBram Moolenaar :substitute(some(other( 1321*585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1322*585fea7bSBram Moolenaar bwipe! 1323*585fea7bSBram Moolenaar END 1324*585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1325*585fea7bSBram Moolenaar source Xvim9lines 1326*585fea7bSBram Moolenaar 1327*585fea7bSBram Moolenaar delete('Xvim9lines') 1328*585fea7bSBram Moolenaarenddef 1329*585fea7bSBram Moolenaar 13308a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1331