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') 71*d77a8525SBram Moolenaar let party2: func = funcref('Test_syntax') 7242a480bfSBram Moolenaar 7361a6d4e4SBram Moolenaar " type becomes list<any> 7461a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 755381c7a1SBram Moolenaar " type becomes dict<any> 765381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7761a6d4e4SBram Moolenaar 78401d9ffbSBram Moolenaar g:newvar = 'new' 79401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 80401d9ffbSBram Moolenaar 81401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 82401d9ffbSBram Moolenaar g:existing = 'no' 83401d9ffbSBram Moolenaar assert_equal('no', g:existing) 84401d9ffbSBram Moolenaar 85b283a8a6SBram Moolenaar v:char = 'abc' 866e587dcbSBram Moolenaar assert_equal('abc', v:char) 87b283a8a6SBram Moolenaar 88b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 896e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 90b283a8a6SBram Moolenaar $ENVVAR = '' 916e587dcbSBram Moolenaar 92fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 93fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 94fd1823e0SBram Moolenaar s:addToMe += 222 95fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 960bbf722aSBram Moolenaar s:newVar = 'new' 970bbf722aSBram Moolenaar assert_equal('new', s:newVar) 98a8c17704SBram Moolenaar 99a8c17704SBram Moolenaar set ts=7 100a8c17704SBram Moolenaar &ts += 1 101a8c17704SBram Moolenaar assert_equal(8, &ts) 10280c34ca3SBram Moolenaar &ts -= 3 10380c34ca3SBram Moolenaar assert_equal(5, &ts) 10480c34ca3SBram Moolenaar &ts *= 2 10580c34ca3SBram Moolenaar assert_equal(10, &ts) 10680c34ca3SBram Moolenaar &ts /= 3 10780c34ca3SBram Moolenaar assert_equal(3, &ts) 10880c34ca3SBram Moolenaar set ts=10 10980c34ca3SBram Moolenaar &ts %= 4 11080c34ca3SBram Moolenaar assert_equal(2, &ts) 111a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 112a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 113a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 114585fea7bSBram Moolenaar " test freeing ISN_STOREOPT 115585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11680c34ca3SBram Moolenaar &ts = 8 117a8c17704SBram Moolenaar 118a8c17704SBram Moolenaar g:inc_counter += 1 119a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 120a8c17704SBram Moolenaar 121a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 122a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 123a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 124a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 125a8c17704SBram Moolenaar 126a8c17704SBram Moolenaar @a = 'areg' 127a8c17704SBram Moolenaar @a ..= 'add' 128a8c17704SBram Moolenaar assert_equal('aregadd', @a) 129a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 130a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 131e69f6d04SBram Moolenaar 132e69f6d04SBram Moolenaar v:errmsg = 'none' 133e69f6d04SBram Moolenaar v:errmsg ..= 'again' 134e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 135e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 136e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 137e69f6d04SBram Moolenaar 138e69f6d04SBram Moolenaar " Test default values. 139e69f6d04SBram Moolenaar let thebool: bool 140e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 141e69f6d04SBram Moolenaar 142e69f6d04SBram Moolenaar let thenumber: number 143e69f6d04SBram Moolenaar assert_equal(0, thenumber) 144e69f6d04SBram Moolenaar 145e69f6d04SBram Moolenaar if has('float') 146e69f6d04SBram Moolenaar let thefloat: float 147e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 148e69f6d04SBram Moolenaar endif 149e69f6d04SBram Moolenaar 150e69f6d04SBram Moolenaar let thestring: string 151e69f6d04SBram Moolenaar assert_equal('', thestring) 152e69f6d04SBram Moolenaar 153e69f6d04SBram Moolenaar let theblob: blob 154e69f6d04SBram Moolenaar assert_equal(0z, theblob) 155e69f6d04SBram Moolenaar 156e69f6d04SBram Moolenaar let thefunc: func 157e69f6d04SBram Moolenaar assert_equal(test_null_function(), thefunc) 158e69f6d04SBram Moolenaar 159e69f6d04SBram Moolenaar let thelist: list<any> 160e69f6d04SBram Moolenaar assert_equal([], thelist) 161e69f6d04SBram Moolenaar 162e69f6d04SBram Moolenaar let thedict: dict<any> 163e69f6d04SBram Moolenaar assert_equal({}, thedict) 164e69f6d04SBram Moolenaar 1652c869deeSBram Moolenaar if has('channel') 166e69f6d04SBram Moolenaar let thejob: job 167e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 168e69f6d04SBram Moolenaar 169e69f6d04SBram Moolenaar let thechannel: channel 170e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1712c869deeSBram Moolenaar endif 172585fea7bSBram Moolenaar 173585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 174585fea7bSBram Moolenaar assert_equal(5678, nr) 1758a7d6542SBram Moolenaarenddef 1768a7d6542SBram Moolenaar 1778a7d6542SBram Moolenaarfunc Test_assignment_failure() 1788a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1798a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1808a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1818a7d6542SBram Moolenaar 1828a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1838a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1848a7d6542SBram Moolenaar 1859be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1869be61bbbSBram Moolenaar 187e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1889be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1899be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1909be61bbbSBram Moolenaar 1919be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1929be61bbbSBram Moolenaar 1939be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1949be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1959be61bbbSBram Moolenaar 1969be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1979be61bbbSBram Moolenaar 1989be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1999be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2009be61bbbSBram Moolenaar 20133fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 20233fa29cfSBram Moolenaar 2038a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2048a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2058a7d6542SBram Moolenaar 2068a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2078a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2088a7d6542SBram Moolenaar 2098a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2108a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 21142a480bfSBram Moolenaar 212*d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 21342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 214599c89c8SBram Moolenaarendfunc 215599c89c8SBram Moolenaar 216599c89c8SBram Moolenaarfunc Test_wrong_type() 217599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 218599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 219599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 220599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 221599c89c8SBram Moolenaar 222599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 223599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22442a480bfSBram Moolenaar 22542a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 22642a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 22742a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 22842a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 23242a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 23342a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23442a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23542a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2368a7d6542SBram Moolenaarendfunc 2378a7d6542SBram Moolenaar 2388a7d6542SBram Moolenaarfunc Test_const() 2398a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2408a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2418a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2429be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2438a7d6542SBram Moolenaarendfunc 2448a7d6542SBram Moolenaar 2458a7d6542SBram Moolenaardef Test_block() 2468a7d6542SBram Moolenaar let outer = 1 2478a7d6542SBram Moolenaar { 2488a7d6542SBram Moolenaar let inner = 2 2498a7d6542SBram Moolenaar assert_equal(1, outer) 2508a7d6542SBram Moolenaar assert_equal(2, inner) 2518a7d6542SBram Moolenaar } 2528a7d6542SBram Moolenaar assert_equal(1, outer) 2538a7d6542SBram Moolenaarenddef 2548a7d6542SBram Moolenaar 2558a7d6542SBram Moolenaarfunc Test_block_failure() 2568a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 257585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 258585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 2598a7d6542SBram Moolenaarendfunc 2608a7d6542SBram Moolenaar 261585fea7bSBram Moolenaardef Test_cmd_modifier() 262585fea7bSBram Moolenaar tab echo '0' 263585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 264585fea7bSBram Moolenaarenddef 265585fea7bSBram Moolenaar 266585fea7bSBram Moolenaar 2678a7d6542SBram Moolenaardef ReturnString(): string 2688a7d6542SBram Moolenaar return 'string' 2698a7d6542SBram Moolenaarenddef 2708a7d6542SBram Moolenaar 2718a7d6542SBram Moolenaardef ReturnNumber(): number 2728a7d6542SBram Moolenaar return 123 2738a7d6542SBram Moolenaarenddef 2748a7d6542SBram Moolenaar 27509f28f49SBram Moolenaarlet g:notNumber = 'string' 27609f28f49SBram Moolenaar 27709f28f49SBram Moolenaardef ReturnGlobal(): number 27809f28f49SBram Moolenaar return g:notNumber 27909f28f49SBram Moolenaarenddef 28009f28f49SBram Moolenaar 2819be61bbbSBram Moolenaardef Test_return_something() 2828a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 2838a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 28409f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 2858a7d6542SBram Moolenaarenddef 2868a7d6542SBram Moolenaar 2879be61bbbSBram Moolenaarlet s:nothing = 0 2889be61bbbSBram Moolenaardef ReturnNothing() 2899be61bbbSBram Moolenaar s:nothing = 1 2909be61bbbSBram Moolenaar if true 2919be61bbbSBram Moolenaar return 2929be61bbbSBram Moolenaar endif 2939be61bbbSBram Moolenaar s:nothing = 2 2949be61bbbSBram Moolenaarenddef 2959be61bbbSBram Moolenaar 2969be61bbbSBram Moolenaardef Test_return_nothing() 2979be61bbbSBram Moolenaar ReturnNothing() 2989be61bbbSBram Moolenaar assert_equal(1, s:nothing) 2999be61bbbSBram Moolenaarenddef 3009be61bbbSBram Moolenaar 3018a7d6542SBram Moolenaarfunc Increment() 3028a7d6542SBram Moolenaar let g:counter += 1 3038a7d6542SBram Moolenaarendfunc 3048a7d6542SBram Moolenaar 3058a7d6542SBram Moolenaardef Test_call_ufunc_count() 3068a7d6542SBram Moolenaar g:counter = 1 3078a7d6542SBram Moolenaar Increment() 3088a7d6542SBram Moolenaar Increment() 3098a7d6542SBram Moolenaar Increment() 3108a7d6542SBram Moolenaar " works with and without :call 3118a7d6542SBram Moolenaar assert_equal(4, g:counter) 312b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 3138a7d6542SBram Moolenaar unlet g:counter 3148a7d6542SBram Moolenaarenddef 3158a7d6542SBram Moolenaar 3168a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 3178a7d6542SBram Moolenaar let res = arg 3188a7d6542SBram Moolenaar for s in rest 3198a7d6542SBram Moolenaar res ..= ',' .. s 3208a7d6542SBram Moolenaar endfor 3218a7d6542SBram Moolenaar return res 3228a7d6542SBram Moolenaarenddef 3238a7d6542SBram Moolenaar 3248a7d6542SBram Moolenaardef Test_call_varargs() 3258a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 3268a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 3278a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 3288a7d6542SBram Moolenaarenddef 3298a7d6542SBram Moolenaar 330170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 331170fcfcfSBram Moolenaar return name 332170fcfcfSBram Moolenaarenddef 333170fcfcfSBram Moolenaar 334170fcfcfSBram Moolenaardef Test_call_default_args() 335170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 336170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 337170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 338585fea7bSBram Moolenaar 339585fea7bSBram Moolenaar call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:') 340170fcfcfSBram Moolenaarenddef 341170fcfcfSBram Moolenaar 342170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 343170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 344170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 345170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 346170fcfcfSBram Moolenaarendfunc 347170fcfcfSBram Moolenaar 348b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 349b35efa5eSBram Moolenaar echo a:arg 350b35efa5eSBram Moolenaarendfunc 351b35efa5eSBram Moolenaar 352bd5da371SBram Moolenaardef Test_call_wrong_args() 353b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 354b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 355bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 356b35efa5eSBram Moolenaarenddef 357b35efa5eSBram Moolenaar 358170fcfcfSBram Moolenaar" Default arg and varargs 359170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 360170fcfcfSBram Moolenaar let res = one .. ',' .. two 361170fcfcfSBram Moolenaar for s in rest 362170fcfcfSBram Moolenaar res ..= ',' .. s 363170fcfcfSBram Moolenaar endfor 364170fcfcfSBram Moolenaar return res 365170fcfcfSBram Moolenaarenddef 366170fcfcfSBram Moolenaar 367170fcfcfSBram Moolenaardef Test_call_def_varargs() 368170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 369170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 370170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 371170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 372170fcfcfSBram Moolenaarenddef 373170fcfcfSBram Moolenaar 37442a480bfSBram Moolenaardef Test_using_var_as_arg() 37542a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 37642a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 37742a480bfSBram Moolenaar call delete('Xdef') 37842a480bfSBram Moolenaarenddef 37942a480bfSBram Moolenaar 380b35efa5eSBram Moolenaardef Test_call_func_defined_later() 381b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 382b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 383b35efa5eSBram Moolenaarenddef 384170fcfcfSBram Moolenaar 385b35efa5eSBram Moolenaarfunc DefinedLater(arg) 38626e117e9SBram Moolenaar return a:arg 38726e117e9SBram Moolenaarendfunc 38826e117e9SBram Moolenaar 3897eeefd4aSBram Moolenaardef FuncWithForwardCall() 3907eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3917eeefd4aSBram Moolenaarenddef 3927eeefd4aSBram Moolenaar 3937eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3947eeefd4aSBram Moolenaar return arg 3957eeefd4aSBram Moolenaarenddef 3967eeefd4aSBram Moolenaar 3977eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3987eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3997eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 4007eeefd4aSBram Moolenaarenddef 4017eeefd4aSBram Moolenaar 4028a7d6542SBram Moolenaardef Test_return_type_wrong() 403978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 404978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 405978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 406978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 407cf3f8bf4SBram Moolenaar 4089be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 4099be61bbbSBram Moolenaar 410cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 411cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 4128a7d6542SBram Moolenaarenddef 4138a7d6542SBram Moolenaar 414bfe12043SBram Moolenaardef Test_arg_type_wrong() 415bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 416bfe12043SBram Moolenaarenddef 417bfe12043SBram Moolenaar 4188a7d6542SBram Moolenaardef Test_try_catch() 4198a7d6542SBram Moolenaar let l = [] 4208a7d6542SBram Moolenaar try 4218a7d6542SBram Moolenaar add(l, '1') 4228a7d6542SBram Moolenaar throw 'wrong' 4238a7d6542SBram Moolenaar add(l, '2') 4248a7d6542SBram Moolenaar catch 4258a7d6542SBram Moolenaar add(l, v:exception) 4268a7d6542SBram Moolenaar finally 4278a7d6542SBram Moolenaar add(l, '3') 4288a7d6542SBram Moolenaar endtry 4298a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4308a7d6542SBram Moolenaarenddef 4318a7d6542SBram Moolenaar 432257cc5eeSBram Moolenaardef ThrowFromDef() 433257cc5eeSBram Moolenaar throw 'getout' 434257cc5eeSBram Moolenaarenddef 435257cc5eeSBram Moolenaar 436257cc5eeSBram Moolenaarfunc CatchInFunc() 437257cc5eeSBram Moolenaar try 438257cc5eeSBram Moolenaar call ThrowFromDef() 439257cc5eeSBram Moolenaar catch 440257cc5eeSBram Moolenaar let g:thrown_func = v:exception 441257cc5eeSBram Moolenaar endtry 442257cc5eeSBram Moolenaarendfunc 443257cc5eeSBram Moolenaar 444257cc5eeSBram Moolenaardef CatchInDef() 445257cc5eeSBram Moolenaar try 446257cc5eeSBram Moolenaar ThrowFromDef() 447257cc5eeSBram Moolenaar catch 448257cc5eeSBram Moolenaar g:thrown_def = v:exception 449257cc5eeSBram Moolenaar endtry 450257cc5eeSBram Moolenaarenddef 451257cc5eeSBram Moolenaar 452f575adffSBram Moolenaardef ReturnFinally(): string 453f575adffSBram Moolenaar try 454f575adffSBram Moolenaar return 'intry' 455f575adffSBram Moolenaar finally 456f575adffSBram Moolenaar g:in_finally = 'finally' 457f575adffSBram Moolenaar endtry 458f575adffSBram Moolenaar return 'end' 459f575adffSBram Moolenaarenddef 460f575adffSBram Moolenaar 461257cc5eeSBram Moolenaardef Test_try_catch_nested() 462257cc5eeSBram Moolenaar CatchInFunc() 463257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 464257cc5eeSBram Moolenaar 465257cc5eeSBram Moolenaar CatchInDef() 466257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 467f575adffSBram Moolenaar 468f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 469f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 470f575adffSBram Moolenaarenddef 471f575adffSBram Moolenaar 472f575adffSBram Moolenaardef Test_try_catch_match() 473f575adffSBram Moolenaar let seq = 'a' 474f575adffSBram Moolenaar try 475f575adffSBram Moolenaar throw 'something' 476f575adffSBram Moolenaar catch /nothing/ 477f575adffSBram Moolenaar seq ..= 'x' 478f575adffSBram Moolenaar catch /some/ 479f575adffSBram Moolenaar seq ..= 'b' 480f575adffSBram Moolenaar catch /asdf/ 481f575adffSBram Moolenaar seq ..= 'x' 482e8c4abbbSBram Moolenaar catch ?a\?sdf? 483e8c4abbbSBram Moolenaar seq ..= 'y' 484f575adffSBram Moolenaar finally 485f575adffSBram Moolenaar seq ..= 'c' 486f575adffSBram Moolenaar endtry 487f575adffSBram Moolenaar assert_equal('abc', seq) 488257cc5eeSBram Moolenaarenddef 489257cc5eeSBram Moolenaar 490e8c4abbbSBram Moolenaardef Test_try_catch_fails() 491e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 492e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 493e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 494585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 495585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 496585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 497585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 498585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 499585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 500585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 501585fea7bSBram Moolenaar 502585fea7bSBram Moolenaar call CheckDefFailure(['throw'], 'E471:') 503585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 504e8c4abbbSBram Moolenaarenddef 505e8c4abbbSBram Moolenaar 5068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 5078a7d6542SBram Moolenaar vim9script 5088a7d6542SBram Moolenaar let name: string = 'bob' 5098a7d6542SBram Moolenaar def Concat(arg: string): string 5108a7d6542SBram Moolenaar return name .. arg 5118a7d6542SBram Moolenaar enddef 5128a7d6542SBram Moolenaar let g:result = Concat('bie') 5138a7d6542SBram Moolenaar let g:localname = name 5148a7d6542SBram Moolenaar 5158a7d6542SBram Moolenaar export const CONST = 1234 5168a7d6542SBram Moolenaar export let exported = 9876 5176e587dcbSBram Moolenaar export let exp_name = 'John' 5188a7d6542SBram Moolenaar export def Exported(): string 5198a7d6542SBram Moolenaar return 'Exported' 5208a7d6542SBram Moolenaar enddef 5218a7d6542SBram MoolenaarEND 5228a7d6542SBram Moolenaar 5235269bd2aSBram Moolenaardef Test_vim9_import_export() 5248a7d6542SBram Moolenaar let import_script_lines =<< trim END 5258a7d6542SBram Moolenaar vim9script 5268a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 5278a7d6542SBram Moolenaar g:imported = exported 5286e587dcbSBram Moolenaar exported += 3 5296e587dcbSBram Moolenaar g:imported_added = exported 5308a7d6542SBram Moolenaar g:imported_func = Exported() 5316e587dcbSBram Moolenaar 5326e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5336e587dcbSBram Moolenaar g:imported_name = exp_name 5346e587dcbSBram Moolenaar exp_name ..= ' Doe' 5356e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5365381c7a1SBram Moolenaar g:imported_later = exported 5378a7d6542SBram Moolenaar END 5388a7d6542SBram Moolenaar 5398a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5408a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5418a7d6542SBram Moolenaar 5428a7d6542SBram Moolenaar source Ximport.vim 5438a7d6542SBram Moolenaar 5448a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5458a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5468a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5476e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5485381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5498a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5506e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5516e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5528a7d6542SBram Moolenaar assert_false(exists('g:name')) 5538a7d6542SBram Moolenaar 5548a7d6542SBram Moolenaar unlet g:result 5558a7d6542SBram Moolenaar unlet g:localname 5568a7d6542SBram Moolenaar unlet g:imported 5576e587dcbSBram Moolenaar unlet g:imported_added 5585381c7a1SBram Moolenaar unlet g:imported_later 5598a7d6542SBram Moolenaar unlet g:imported_func 5606e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5618a7d6542SBram Moolenaar delete('Ximport.vim') 562f2d5c240SBram Moolenaar 5635381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5645381c7a1SBram Moolenaar vim9script 5655381c7a1SBram Moolenaar def ImportInDef() 5665381c7a1SBram Moolenaar import exported from './Xexport.vim' 5675381c7a1SBram Moolenaar g:imported = exported 5685381c7a1SBram Moolenaar exported += 7 5695381c7a1SBram Moolenaar g:imported_added = exported 5705381c7a1SBram Moolenaar enddef 5715381c7a1SBram Moolenaar ImportInDef() 5725381c7a1SBram Moolenaar END 5735381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5745381c7a1SBram Moolenaar source Ximport2.vim 5755381c7a1SBram Moolenaar " TODO: this should be 9879 5765381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5775381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5785381c7a1SBram Moolenaar unlet g:imported 5795381c7a1SBram Moolenaar unlet g:imported_added 5805381c7a1SBram Moolenaar delete('Ximport2.vim') 5815381c7a1SBram Moolenaar 582f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 583f2d5c240SBram Moolenaar vim9script 584f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 585f2d5c240SBram Moolenaar def UseExport() 586f2d5c240SBram Moolenaar g:imported = Export.exported 587f2d5c240SBram Moolenaar enddef 588f2d5c240SBram Moolenaar UseExport() 589f2d5c240SBram Moolenaar END 590f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 591f2d5c240SBram Moolenaar source Ximport.vim 5925381c7a1SBram Moolenaar assert_equal(9883, g:imported) 593f2d5c240SBram Moolenaar 594599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 595599c89c8SBram Moolenaar vim9script 596599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 597599c89c8SBram Moolenaar def Func() 598599c89c8SBram Moolenaar let dummy = 1 599599c89c8SBram Moolenaar let imported = Export + dummy 600599c89c8SBram Moolenaar enddef 601599c89c8SBram Moolenaar END 602599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 603599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 604599c89c8SBram Moolenaar 605599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 606599c89c8SBram Moolenaar vim9script 607599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 608599c89c8SBram Moolenaar def Func() 609599c89c8SBram Moolenaar let imported = Export . exported 610599c89c8SBram Moolenaar enddef 611599c89c8SBram Moolenaar END 612599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 613599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 614599c89c8SBram Moolenaar 615599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 616599c89c8SBram Moolenaar vim9script 617599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 618599c89c8SBram Moolenaar def Func() 619599c89c8SBram Moolenaar let imported = Export. 620599c89c8SBram Moolenaar enddef 621599c89c8SBram Moolenaar END 622599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 623599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 624599c89c8SBram Moolenaar 625f2d5c240SBram Moolenaar let import_star_lines =<< trim END 626f2d5c240SBram Moolenaar vim9script 627f2d5c240SBram Moolenaar import * from './Xexport.vim' 628f2d5c240SBram Moolenaar g:imported = exported 629f2d5c240SBram Moolenaar END 630f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 631f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 632f2d5c240SBram Moolenaar 633fa29c8abSBram Moolenaar " try to import something that exists but is not exported 634fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 635fa29c8abSBram Moolenaar vim9script 636fa29c8abSBram Moolenaar import name from './Xexport.vim' 637fa29c8abSBram Moolenaar END 638fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 639fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 640fa29c8abSBram Moolenaar 6415269bd2aSBram Moolenaar " try to import something that is already defined 6425269bd2aSBram Moolenaar let import_already_defined =<< trim END 6435269bd2aSBram Moolenaar vim9script 6445269bd2aSBram Moolenaar let exported = 'something' 6455269bd2aSBram Moolenaar import exported from './Xexport.vim' 6465269bd2aSBram Moolenaar END 6475269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6485269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6495269bd2aSBram Moolenaar 6505269bd2aSBram Moolenaar " try to import something that is already defined 6515269bd2aSBram Moolenaar import_already_defined =<< trim END 6525269bd2aSBram Moolenaar vim9script 6535269bd2aSBram Moolenaar let exported = 'something' 6545269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6555269bd2aSBram Moolenaar END 6565269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6575269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6585269bd2aSBram Moolenaar 6595269bd2aSBram Moolenaar " try to import something that is already defined 6605269bd2aSBram Moolenaar import_already_defined =<< trim END 6615269bd2aSBram Moolenaar vim9script 6625269bd2aSBram Moolenaar let exported = 'something' 6635269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6645269bd2aSBram Moolenaar END 6655269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6665269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6675269bd2aSBram Moolenaar 668fa29c8abSBram Moolenaar " import a very long name, requires making a copy 669fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 670fa29c8abSBram Moolenaar vim9script 671fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 672fa29c8abSBram Moolenaar END 673fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 674fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 675fa29c8abSBram Moolenaar 676fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 677fa29c8abSBram Moolenaar vim9script 678fa29c8abSBram Moolenaar import name './Xexport.vim' 679fa29c8abSBram Moolenaar END 680fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 681fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 682fa29c8abSBram Moolenaar 683fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 684fa29c8abSBram Moolenaar vim9script 685fa29c8abSBram Moolenaar import name from Xexport.vim 686fa29c8abSBram Moolenaar END 687fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 688fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 689fa29c8abSBram Moolenaar 690fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 691fa29c8abSBram Moolenaar vim9script 692fa29c8abSBram Moolenaar import name from './XnoExport.vim' 693fa29c8abSBram Moolenaar END 694fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 695fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 696fa29c8abSBram Moolenaar 697fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 698fa29c8abSBram Moolenaar vim9script 699fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 700fa29c8abSBram Moolenaar END 7015269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 7025269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 703fa29c8abSBram Moolenaar 704f2d5c240SBram Moolenaar delete('Ximport.vim') 7055269bd2aSBram Moolenaar delete('Ximport3.vim') 7068a7d6542SBram Moolenaar delete('Xexport.vim') 7078a7d6542SBram Moolenaar 708750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 709750802b5SBram Moolenaar set cpo&vi 710750802b5SBram Moolenaar let cpo_before = &cpo 711750802b5SBram Moolenaar let lines =<< trim END 712750802b5SBram Moolenaar vim9script 713750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 714750802b5SBram Moolenaar END 715750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 716750802b5SBram Moolenaar source Xvim9_script 717750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 718750802b5SBram Moolenaar set cpo&vim 719750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 720750802b5SBram Moolenaar delete('Xvim9_script') 721750802b5SBram Moolenaarenddef 722750802b5SBram Moolenaar 723750802b5SBram Moolenaardef Test_vim9script_fails() 7248a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 7258a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 726750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 727f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 728750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 729750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 730750802b5SBram Moolenaar 731750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 732750802b5SBram Moolenaar assert_fails('export something', 'E1042') 7338a7d6542SBram Moolenaarenddef 7348a7d6542SBram Moolenaar 7358a7d6542SBram Moolenaardef Test_vim9script_call() 7368a7d6542SBram Moolenaar let lines =<< trim END 7378a7d6542SBram Moolenaar vim9script 7388a7d6542SBram Moolenaar let var = '' 7398a7d6542SBram Moolenaar def MyFunc(arg: string) 7408a7d6542SBram Moolenaar var = arg 7418a7d6542SBram Moolenaar enddef 7428a7d6542SBram Moolenaar MyFunc('foobar') 7438a7d6542SBram Moolenaar assert_equal('foobar', var) 7448a7d6542SBram Moolenaar 7458a7d6542SBram Moolenaar let str = 'barfoo' 7468a7d6542SBram Moolenaar str->MyFunc() 7478a7d6542SBram Moolenaar assert_equal('barfoo', var) 7488a7d6542SBram Moolenaar 7498a7d6542SBram Moolenaar let g:value = 'value' 7508a7d6542SBram Moolenaar g:value->MyFunc() 7518a7d6542SBram Moolenaar assert_equal('value', var) 7528a7d6542SBram Moolenaar 7538a7d6542SBram Moolenaar let listvar = [] 7548a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 7558a7d6542SBram Moolenaar listvar = arg 7568a7d6542SBram Moolenaar enddef 7578a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 7588a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 7598a7d6542SBram Moolenaar 7608a7d6542SBram Moolenaar let dictvar = {} 7618a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 7628a7d6542SBram Moolenaar dictvar = arg 7638a7d6542SBram Moolenaar enddef 7648a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 7658a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 76633fa29cfSBram Moolenaar def CompiledDict() 76733fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 76833fa29cfSBram Moolenaar enddef 76933fa29cfSBram Moolenaar CompiledDict() 77033fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 77133fa29cfSBram Moolenaar 7728a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 7738a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 7740c6ceaf9SBram Moolenaar 7750c6ceaf9SBram Moolenaar ('text')->MyFunc() 7760c6ceaf9SBram Moolenaar assert_equal('text', var) 7770c6ceaf9SBram Moolenaar ("some")->MyFunc() 7780c6ceaf9SBram Moolenaar assert_equal('some', var) 7798a7d6542SBram Moolenaar END 7808a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 7818a7d6542SBram Moolenaar source Xcall.vim 7828a7d6542SBram Moolenaar delete('Xcall.vim') 7838a7d6542SBram Moolenaarenddef 7848a7d6542SBram Moolenaar 7858a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 7868a7d6542SBram Moolenaar let lines =<< trim END 7878a7d6542SBram Moolenaar vim9script 7888a7d6542SBram Moolenaar let var = '' 7898a7d6542SBram Moolenaar def MyFunc(arg: string) 7908a7d6542SBram Moolenaar let var = 123 7918a7d6542SBram Moolenaar enddef 7928a7d6542SBram Moolenaar END 7938a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 7948a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 7958a7d6542SBram Moolenaar delete('Xcall_decl.vim') 7968a7d6542SBram Moolenaarenddef 7978a7d6542SBram Moolenaar 7988a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 7998a7d6542SBram Moolenaar let lines =<< trim END 8008a7d6542SBram Moolenaar vim9script 8018a7d6542SBram Moolenaar const var = '' 8028a7d6542SBram Moolenaar def MyFunc(arg: string) 8038a7d6542SBram Moolenaar var = 'asdf' 8048a7d6542SBram Moolenaar enddef 8058a7d6542SBram Moolenaar END 8068a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 8078a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 8088a7d6542SBram Moolenaar delete('Xcall_const.vim') 8098a7d6542SBram Moolenaarenddef 8108a7d6542SBram Moolenaar 8118a7d6542SBram Moolenaardef Test_vim9script_reload() 8128a7d6542SBram Moolenaar let lines =<< trim END 8138a7d6542SBram Moolenaar vim9script 8148a7d6542SBram Moolenaar const var = '' 8158a7d6542SBram Moolenaar let valone = 1234 8168a7d6542SBram Moolenaar def MyFunc(arg: string) 8178a7d6542SBram Moolenaar valone = 5678 8188a7d6542SBram Moolenaar enddef 8198a7d6542SBram Moolenaar END 8208a7d6542SBram Moolenaar let morelines =<< trim END 8218a7d6542SBram Moolenaar let valtwo = 222 8228a7d6542SBram Moolenaar export def GetValtwo(): number 8238a7d6542SBram Moolenaar return valtwo 8248a7d6542SBram Moolenaar enddef 8258a7d6542SBram Moolenaar END 8268a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 8278a7d6542SBram Moolenaar source Xreload.vim 8288a7d6542SBram Moolenaar source Xreload.vim 8298a7d6542SBram Moolenaar source Xreload.vim 8308a7d6542SBram Moolenaar 8318a7d6542SBram Moolenaar let testlines =<< trim END 8328a7d6542SBram Moolenaar vim9script 8338a7d6542SBram Moolenaar def TheFunc() 8348a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 8358a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 8368a7d6542SBram Moolenaar enddef 8378a7d6542SBram Moolenaar TheFunc() 8388a7d6542SBram Moolenaar END 8398a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 8408a7d6542SBram Moolenaar source Ximport.vim 8418a7d6542SBram Moolenaar 8428a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 8438a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 8448a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8458a7d6542SBram Moolenaar source Xreload.vim 8468a7d6542SBram Moolenaar source Ximport.vim 8478a7d6542SBram Moolenaar 8488a7d6542SBram Moolenaar " cannot declare a var twice 8498a7d6542SBram Moolenaar lines =<< trim END 8508a7d6542SBram Moolenaar vim9script 8518a7d6542SBram Moolenaar let valone = 1234 8528a7d6542SBram Moolenaar let valone = 5678 8538a7d6542SBram Moolenaar END 8548a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8558a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 8568a7d6542SBram Moolenaar 8578a7d6542SBram Moolenaar delete('Xreload.vim') 8588a7d6542SBram Moolenaar delete('Ximport.vim') 8598a7d6542SBram Moolenaarenddef 8608a7d6542SBram Moolenaar 8618a7d6542SBram Moolenaardef Test_import_absolute() 8628a7d6542SBram Moolenaar let import_lines = [ 8638a7d6542SBram Moolenaar \ 'vim9script', 8648a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 865b283a8a6SBram Moolenaar \ 'def UseExported()', 8668a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 8674e12a5dfSBram Moolenaar \ ' exported = 8888', 8684e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 869b283a8a6SBram Moolenaar \ 'enddef', 870b283a8a6SBram Moolenaar \ 'UseExported()', 8714e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 8728a7d6542SBram Moolenaar \ ] 8738a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaar source Ximport_abs.vim 8778a7d6542SBram Moolenaar 8788a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8794e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 880b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 881b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 882b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8834e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 8844e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 8854e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 8864e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 8874e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8884e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 8894e12a5dfSBram Moolenaar \, g:import_disassembled) 8908a7d6542SBram Moolenaar unlet g:imported_abs 8914e12a5dfSBram Moolenaar unlet g:import_disassembled 8928a7d6542SBram Moolenaar 8938a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8948a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8958a7d6542SBram Moolenaarenddef 8968a7d6542SBram Moolenaar 8978a7d6542SBram Moolenaardef Test_import_rtp() 8988a7d6542SBram Moolenaar let import_lines = [ 8998a7d6542SBram Moolenaar \ 'vim9script', 9008a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 9018a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 9028a7d6542SBram Moolenaar \ ] 9038a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 9048a7d6542SBram Moolenaar mkdir('import') 9058a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 9068a7d6542SBram Moolenaar 9078a7d6542SBram Moolenaar let save_rtp = &rtp 9088a7d6542SBram Moolenaar &rtp = getcwd() 9098a7d6542SBram Moolenaar source Ximport_rtp.vim 9108a7d6542SBram Moolenaar &rtp = save_rtp 9118a7d6542SBram Moolenaar 9128a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 9138a7d6542SBram Moolenaar unlet g:imported_rtp 9148a7d6542SBram Moolenaar 9158a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 9168a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 9178a7d6542SBram Moolenaar delete('import', 'd') 9188a7d6542SBram Moolenaarenddef 9198a7d6542SBram Moolenaar 9208a7d6542SBram Moolenaardef Test_fixed_size_list() 9218a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 9228a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 9238a7d6542SBram Moolenaar l->remove(0) 9248a7d6542SBram Moolenaar l->add(5) 9258a7d6542SBram Moolenaar l->insert(99, 1) 9260f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 9278a7d6542SBram Moolenaarenddef 9288a7d6542SBram Moolenaar 929673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 930673660abSBram Moolenaar" recognized. 931673660abSBram Moolenaarfunc Test_function_python() 932673660abSBram Moolenaar CheckFeature python3 933673660abSBram Moolenaar let py = 'python3' 934673660abSBram Moolenaar execute py "<< EOF" 935673660abSBram Moolenaardef do_something(): 936673660abSBram Moolenaar return 1 937673660abSBram MoolenaarEOF 938673660abSBram Moolenaarendfunc 939673660abSBram Moolenaar 940158906cfSBram Moolenaardef IfElse(what: number): string 941158906cfSBram Moolenaar let res = '' 942158906cfSBram Moolenaar if what == 1 943158906cfSBram Moolenaar res = "one" 944158906cfSBram Moolenaar elseif what == 2 945158906cfSBram Moolenaar res = "two" 946a259d8d3SBram Moolenaar else 947158906cfSBram Moolenaar res = "three" 948a259d8d3SBram Moolenaar endif 949158906cfSBram Moolenaar return res 950a259d8d3SBram Moolenaarenddef 951a259d8d3SBram Moolenaar 952158906cfSBram Moolenaardef Test_if_elseif_else() 953158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 954158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 955158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9560f18b6d1SBram Moolenaarenddef 9570f18b6d1SBram Moolenaar 958e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 959e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 960e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 961e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 962e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 963585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 964e8c4abbbSBram Moolenaarenddef 965e8c4abbbSBram Moolenaar 9666d69bf60SBram Moolenaarlet g:bool_true = v:true 9676d69bf60SBram Moolenaarlet g:bool_false = v:false 9686d69bf60SBram Moolenaar 9696d69bf60SBram Moolenaardef Test_if_const_expr() 9706d69bf60SBram Moolenaar let res = false 9716d69bf60SBram Moolenaar if true ? true : false 9726d69bf60SBram Moolenaar res = true 9736d69bf60SBram Moolenaar endif 9746d69bf60SBram Moolenaar assert_equal(true, res) 9756d69bf60SBram Moolenaar 976585fea7bSBram Moolenaar g:glob = 2 977585fea7bSBram Moolenaar if false 978585fea7bSBram Moolenaar execute('let g:glob = 3') 979585fea7bSBram Moolenaar endif 980585fea7bSBram Moolenaar assert_equal(2, g:glob) 981585fea7bSBram Moolenaar if true 982585fea7bSBram Moolenaar execute('let g:glob = 3') 983585fea7bSBram Moolenaar endif 984585fea7bSBram Moolenaar assert_equal(3, g:glob) 985585fea7bSBram Moolenaar 9866d69bf60SBram Moolenaar res = false 9876d69bf60SBram Moolenaar if g:bool_true ? true : false 9886d69bf60SBram Moolenaar res = true 9896d69bf60SBram Moolenaar endif 9906d69bf60SBram Moolenaar assert_equal(true, res) 9916d69bf60SBram Moolenaar 9926d69bf60SBram Moolenaar res = false 9936d69bf60SBram Moolenaar if true ? g:bool_true : false 9946d69bf60SBram Moolenaar res = true 9956d69bf60SBram Moolenaar endif 9966d69bf60SBram Moolenaar assert_equal(true, res) 9976d69bf60SBram Moolenaar 9986d69bf60SBram Moolenaar res = false 9996d69bf60SBram Moolenaar if true ? true : g:bool_false 10006d69bf60SBram Moolenaar res = true 10016d69bf60SBram Moolenaar endif 10026d69bf60SBram Moolenaar assert_equal(true, res) 10036d69bf60SBram Moolenaar 10046d69bf60SBram Moolenaar res = false 10056d69bf60SBram Moolenaar if true ? false : true 10066d69bf60SBram Moolenaar res = true 10076d69bf60SBram Moolenaar endif 10086d69bf60SBram Moolenaar assert_equal(false, res) 10096d69bf60SBram Moolenaar 10106d69bf60SBram Moolenaar res = false 10116d69bf60SBram Moolenaar if false ? false : true 10126d69bf60SBram Moolenaar res = true 10136d69bf60SBram Moolenaar endif 10146d69bf60SBram Moolenaar assert_equal(true, res) 10156d69bf60SBram Moolenaar 10166d69bf60SBram Moolenaar res = false 10176d69bf60SBram Moolenaar if false ? true : false 10186d69bf60SBram Moolenaar res = true 10196d69bf60SBram Moolenaar endif 10206d69bf60SBram Moolenaar assert_equal(false, res) 10216d69bf60SBram Moolenaar 10226d69bf60SBram Moolenaar res = false 1023e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1024e8c4abbbSBram Moolenaar res = true 1025e8c4abbbSBram Moolenaar endif 1026e8c4abbbSBram Moolenaar assert_equal(false, res) 1027e8c4abbbSBram Moolenaar 1028e8c4abbbSBram Moolenaar res = false 10296d69bf60SBram Moolenaar if true && true 10306d69bf60SBram Moolenaar res = true 10316d69bf60SBram Moolenaar endif 10326d69bf60SBram Moolenaar assert_equal(true, res) 10336d69bf60SBram Moolenaar 10346d69bf60SBram Moolenaar res = false 10356d69bf60SBram Moolenaar if true && false 10366d69bf60SBram Moolenaar res = true 10376d69bf60SBram Moolenaar endif 10386d69bf60SBram Moolenaar assert_equal(false, res) 10396d69bf60SBram Moolenaar 10406d69bf60SBram Moolenaar res = false 10416d69bf60SBram Moolenaar if g:bool_true && false 10426d69bf60SBram Moolenaar res = true 10436d69bf60SBram Moolenaar endif 10446d69bf60SBram Moolenaar assert_equal(false, res) 10456d69bf60SBram Moolenaar 10466d69bf60SBram Moolenaar res = false 10476d69bf60SBram Moolenaar if true && g:bool_false 10486d69bf60SBram Moolenaar res = true 10496d69bf60SBram Moolenaar endif 10506d69bf60SBram Moolenaar assert_equal(false, res) 10516d69bf60SBram Moolenaar 10526d69bf60SBram Moolenaar res = false 10536d69bf60SBram Moolenaar if false && false 10546d69bf60SBram Moolenaar res = true 10556d69bf60SBram Moolenaar endif 10566d69bf60SBram Moolenaar assert_equal(false, res) 10576d69bf60SBram Moolenaar 10586d69bf60SBram Moolenaar res = false 10596d69bf60SBram Moolenaar if true || false 10606d69bf60SBram Moolenaar res = true 10616d69bf60SBram Moolenaar endif 10626d69bf60SBram Moolenaar assert_equal(true, res) 10636d69bf60SBram Moolenaar 10646d69bf60SBram Moolenaar res = false 10656d69bf60SBram Moolenaar if g:bool_true || false 10666d69bf60SBram Moolenaar res = true 10676d69bf60SBram Moolenaar endif 10686d69bf60SBram Moolenaar assert_equal(true, res) 10696d69bf60SBram Moolenaar 10706d69bf60SBram Moolenaar res = false 10716d69bf60SBram Moolenaar if true || g:bool_false 10726d69bf60SBram Moolenaar res = true 10736d69bf60SBram Moolenaar endif 10746d69bf60SBram Moolenaar assert_equal(true, res) 10756d69bf60SBram Moolenaar 10766d69bf60SBram Moolenaar res = false 10776d69bf60SBram Moolenaar if false || false 10786d69bf60SBram Moolenaar res = true 10796d69bf60SBram Moolenaar endif 10806d69bf60SBram Moolenaar assert_equal(false, res) 108180c34ca3SBram Moolenaarenddef 10826d69bf60SBram Moolenaar 108380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 108480c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 108580c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1086e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1087e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 10886d69bf60SBram Moolenaarenddef 10896d69bf60SBram Moolenaar 109063ce4849SBram Moolenaardef Test_delfunc() 109163ce4849SBram Moolenaar let lines =<< trim END 109263ce4849SBram Moolenaar vim9script 109363ce4849SBram Moolenaar def GoneSoon() 109463ce4849SBram Moolenaar echo 'hello' 109563ce4849SBram Moolenaar enddef 109663ce4849SBram Moolenaar 109763ce4849SBram Moolenaar def CallGoneSoon() 109863ce4849SBram Moolenaar GoneSoon() 109963ce4849SBram Moolenaar enddef 110063ce4849SBram Moolenaar 110163ce4849SBram Moolenaar delfunc GoneSoon 110263ce4849SBram Moolenaar CallGoneSoon() 110363ce4849SBram Moolenaar END 110463ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 110563ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 110663ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 110763ce4849SBram Moolenaar 110863ce4849SBram Moolenaar delete('XToDelFunc') 110963ce4849SBram Moolenaarenddef 111063ce4849SBram Moolenaar 1111ad39c094SBram Moolenaardef Test_execute_cmd() 1112ad39c094SBram Moolenaar new 1113ad39c094SBram Moolenaar setline(1, 'default') 1114ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1115ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1116ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1117ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1118ad39c094SBram Moolenaar execute cmd1 cmd2 1119ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1120ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1121ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1122ad39c094SBram Moolenaar let cmd_first = 'call ' 1123ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1124ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1125ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1126ad39c094SBram Moolenaar bwipe! 1127585fea7bSBram Moolenaar 1128585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1129ad39c094SBram Moolenaarenddef 1130ad39c094SBram Moolenaar 1131ad39c094SBram Moolenaardef Test_echo_cmd() 1132585fea7bSBram Moolenaar echo 'some' 1133585fea7bSBram Moolenaar echon 'thing' 1134ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1135ad39c094SBram Moolenaar 1136ad39c094SBram Moolenaar let str1 = 'some' 1137ad39c094SBram Moolenaar let str2 = 'more' 1138ad39c094SBram Moolenaar echo str1 str2 1139ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1140ad39c094SBram Moolenaarenddef 1141ad39c094SBram Moolenaar 114241fe0617SBram Moolenaardef Test_for_outside_of_function() 114341fe0617SBram Moolenaar let lines =<< trim END 114441fe0617SBram Moolenaar vim9script 114541fe0617SBram Moolenaar new 114641fe0617SBram Moolenaar for var in range(0, 3) 114741fe0617SBram Moolenaar append(line('$'), var) 114841fe0617SBram Moolenaar endfor 114941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 115041fe0617SBram Moolenaar bwipe! 115141fe0617SBram Moolenaar END 115241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 115341fe0617SBram Moolenaar source Xvim9for.vim 115441fe0617SBram Moolenaar delete('Xvim9for.vim') 115541fe0617SBram Moolenaarenddef 11568a7d6542SBram Moolenaar 1157e8c4abbbSBram Moolenaardef Test_for_loop() 1158e8c4abbbSBram Moolenaar let result = '' 1159e8c4abbbSBram Moolenaar for cnt in range(7) 1160e8c4abbbSBram Moolenaar if cnt == 4 1161e8c4abbbSBram Moolenaar break 1162e8c4abbbSBram Moolenaar endif 1163e8c4abbbSBram Moolenaar if cnt == 2 1164e8c4abbbSBram Moolenaar continue 1165e8c4abbbSBram Moolenaar endif 1166e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1167e8c4abbbSBram Moolenaar endfor 1168e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 1169e8c4abbbSBram Moolenaarenddef 1170e8c4abbbSBram Moolenaar 1171e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1172e8c4abbbSBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1173e8c4abbbSBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1174e8c4abbbSBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1175e8c4abbbSBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1176e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1177e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in xxx'], 'E1001:') 1178e8c4abbbSBram Moolenaar call CheckDefFailure(['endfor'], 'E588:') 1179585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1180e8c4abbbSBram Moolenaarenddef 1181e8c4abbbSBram Moolenaar 1182d0df1aacSBram Moolenaardef Test_while_loop() 1183d0df1aacSBram Moolenaar let result = '' 1184d0df1aacSBram Moolenaar let cnt = 0 1185d0df1aacSBram Moolenaar while cnt < 555 1186d0df1aacSBram Moolenaar if cnt == 3 1187d0df1aacSBram Moolenaar break 1188d0df1aacSBram Moolenaar endif 1189d0df1aacSBram Moolenaar cnt += 1 1190d0df1aacSBram Moolenaar if cnt == 2 1191d0df1aacSBram Moolenaar continue 1192d0df1aacSBram Moolenaar endif 1193d0df1aacSBram Moolenaar result ..= cnt .. '_' 1194d0df1aacSBram Moolenaar endwhile 1195d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1196d0df1aacSBram Moolenaarenddef 1197d0df1aacSBram Moolenaar 1198e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1199e8c4abbbSBram Moolenaar call CheckDefFailure(['while xxx'], 'E1001:') 1200e8c4abbbSBram Moolenaar call CheckDefFailure(['endwhile'], 'E588:') 1201e8c4abbbSBram Moolenaar call CheckDefFailure(['continue'], 'E586:') 1202e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'continue'], 'E586:') 1203e8c4abbbSBram Moolenaar call CheckDefFailure(['break'], 'E587:') 1204e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'break'], 'E587:') 1205585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1206bd5da371SBram Moolenaarenddef 1207bd5da371SBram Moolenaar 12089645e2d9SBram Moolenaardef Test_interrupt_loop() 120997acfc78SBram Moolenaar let caught = false 12109645e2d9SBram Moolenaar let x = 0 121197acfc78SBram Moolenaar try 12129645e2d9SBram Moolenaar while 1 12139645e2d9SBram Moolenaar x += 1 12149645e2d9SBram Moolenaar if x == 100 12159645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 12169645e2d9SBram Moolenaar endif 12179645e2d9SBram Moolenaar endwhile 121897acfc78SBram Moolenaar catch 121997acfc78SBram Moolenaar caught = true 122097acfc78SBram Moolenaar assert_equal(100, x) 122197acfc78SBram Moolenaar endtry 122297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 12239645e2d9SBram Moolenaarenddef 122420431c9dSBram Moolenaar 122520431c9dSBram Moolenaardef Test_redef_failure() 122620431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 122720431c9dSBram Moolenaar so Xdef 122820431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 122920431c9dSBram Moolenaar so Xdef 123020431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 123120431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 123220431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 123320431c9dSBram Moolenaar so Xdef 123420431c9dSBram Moolenaar call delete('Xdef') 123520431c9dSBram Moolenaar 123620431c9dSBram Moolenaar call assert_equal(0, Func0()) 123720431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 123820431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 123920431c9dSBram Moolenaar 124020431c9dSBram Moolenaar delfunc! Func0 124120431c9dSBram Moolenaar delfunc! Func1 124220431c9dSBram Moolenaar delfunc! Func2 124320431c9dSBram Moolenaarenddef 124420431c9dSBram Moolenaar 12457d941ee0SBram Moolenaar" Test for internal functions returning different types 12467d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 12477d941ee0SBram Moolenaar let lines =<< trim END 12487d941ee0SBram Moolenaar def RetFloat(): float 12497d941ee0SBram Moolenaar return ceil(1.456) 12507d941ee0SBram Moolenaar enddef 12517d941ee0SBram Moolenaar 12527d941ee0SBram Moolenaar def RetListAny(): list<any> 12537d941ee0SBram Moolenaar return items({'k' : 'v'}) 12547d941ee0SBram Moolenaar enddef 12557d941ee0SBram Moolenaar 12567d941ee0SBram Moolenaar def RetListString(): list<string> 12577d941ee0SBram Moolenaar return split('a:b:c', ':') 12587d941ee0SBram Moolenaar enddef 12597d941ee0SBram Moolenaar 12607d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 12617d941ee0SBram Moolenaar return getbufinfo() 12627d941ee0SBram Moolenaar enddef 12637d941ee0SBram Moolenaar 12647d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 12657d941ee0SBram Moolenaar return wordcount() 12667d941ee0SBram Moolenaar enddef 12677d941ee0SBram Moolenaar 12687d941ee0SBram Moolenaar def RetDictString(): dict<string> 12697d941ee0SBram Moolenaar return environ() 12707d941ee0SBram Moolenaar enddef 12717d941ee0SBram Moolenaar END 12727d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 12737d941ee0SBram Moolenaar source Xscript 12747d941ee0SBram Moolenaar 12757d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 12767d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 12777d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 12787d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 12797d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 12807d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 12817d941ee0SBram Moolenaar call delete('Xscript') 12827d941ee0SBram Moolenaarendfunc 12837d941ee0SBram Moolenaar 12847d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 12857d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 12867d941ee0SBram Moolenaar let l =<< trim END 12877d941ee0SBram Moolenaar def! FArgErr(): float 12887d941ee0SBram Moolenaar return ceil(1.1, 2) 12897d941ee0SBram Moolenaar enddef 12907d941ee0SBram Moolenaar END 12917d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12927d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 12937d941ee0SBram Moolenaar let l =<< trim END 12947d941ee0SBram Moolenaar def! FArgErr(): float 12957d941ee0SBram Moolenaar return ceil() 12967d941ee0SBram Moolenaar enddef 12977d941ee0SBram Moolenaar END 12987d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12997d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 13007d941ee0SBram Moolenaar call delete('Xinvalidarg') 13017d941ee0SBram Moolenaarendfunc 13027d941ee0SBram Moolenaar 1303585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1304585fea7bSBram Moolenaardef Test_substitute_cmd() 1305585fea7bSBram Moolenaar new 1306585fea7bSBram Moolenaar setline(1, 'something') 1307585fea7bSBram Moolenaar :substitute(some(other( 1308585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1309585fea7bSBram Moolenaar bwipe! 1310585fea7bSBram Moolenaar 1311585fea7bSBram Moolenaar " also when the context is Vim9 script 1312585fea7bSBram Moolenaar let lines =<< trim END 1313585fea7bSBram Moolenaar vim9script 1314585fea7bSBram Moolenaar new 1315585fea7bSBram Moolenaar setline(1, 'something') 1316585fea7bSBram Moolenaar :substitute(some(other( 1317585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1318585fea7bSBram Moolenaar bwipe! 1319585fea7bSBram Moolenaar END 1320585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1321585fea7bSBram Moolenaar source Xvim9lines 1322585fea7bSBram Moolenaar 1323585fea7bSBram Moolenaar delete('Xvim9lines') 1324585fea7bSBram Moolenaarenddef 1325585fea7bSBram Moolenaar 13268a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1327