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:') 11580c34ca3SBram Moolenaar &ts = 8 116a8c17704SBram Moolenaar 117a8c17704SBram Moolenaar g:inc_counter += 1 118a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 119a8c17704SBram Moolenaar 120a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 121a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 122a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 123a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 124a8c17704SBram Moolenaar 125a8c17704SBram Moolenaar @a = 'areg' 126a8c17704SBram Moolenaar @a ..= 'add' 127a8c17704SBram Moolenaar assert_equal('aregadd', @a) 128a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 129a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 130e69f6d04SBram Moolenaar 131e69f6d04SBram Moolenaar v:errmsg = 'none' 132e69f6d04SBram Moolenaar v:errmsg ..= 'again' 133e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 134e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 135e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 136e69f6d04SBram Moolenaar 137e69f6d04SBram Moolenaar " Test default values. 138e69f6d04SBram Moolenaar let thebool: bool 139e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 140e69f6d04SBram Moolenaar 141e69f6d04SBram Moolenaar let thenumber: number 142e69f6d04SBram Moolenaar assert_equal(0, thenumber) 143e69f6d04SBram Moolenaar 144e69f6d04SBram Moolenaar if has('float') 145e69f6d04SBram Moolenaar let thefloat: float 146e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 147e69f6d04SBram Moolenaar endif 148e69f6d04SBram Moolenaar 149e69f6d04SBram Moolenaar let thestring: string 150e69f6d04SBram Moolenaar assert_equal('', thestring) 151e69f6d04SBram Moolenaar 152e69f6d04SBram Moolenaar let theblob: blob 153e69f6d04SBram Moolenaar assert_equal(0z, theblob) 154e69f6d04SBram Moolenaar 155e69f6d04SBram Moolenaar let thefunc: func 156e69f6d04SBram Moolenaar assert_equal(test_null_function(), thefunc) 157e69f6d04SBram Moolenaar 158e69f6d04SBram Moolenaar let thepartial: partial 159e69f6d04SBram Moolenaar assert_equal(test_null_partial(), thepartial) 160e69f6d04SBram Moolenaar 161e69f6d04SBram Moolenaar let thelist: list<any> 162e69f6d04SBram Moolenaar assert_equal([], thelist) 163e69f6d04SBram Moolenaar 164e69f6d04SBram Moolenaar let thedict: dict<any> 165e69f6d04SBram Moolenaar assert_equal({}, thedict) 166e69f6d04SBram Moolenaar 1672c869deeSBram Moolenaar if has('channel') 168e69f6d04SBram Moolenaar let thejob: job 169e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 170e69f6d04SBram Moolenaar 171e69f6d04SBram Moolenaar let thechannel: channel 172e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1732c869deeSBram Moolenaar endif 1748a7d6542SBram Moolenaarenddef 1758a7d6542SBram Moolenaar 1768a7d6542SBram Moolenaarfunc Test_assignment_failure() 1778a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1788a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1798a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1808a7d6542SBram Moolenaar 1818a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1828a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1838a7d6542SBram Moolenaar 1849be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1859be61bbbSBram Moolenaar 186e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1879be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1889be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1899be61bbbSBram Moolenaar 1909be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1919be61bbbSBram Moolenaar 1929be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1939be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1949be61bbbSBram Moolenaar 1959be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1969be61bbbSBram Moolenaar 1979be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1989be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 1999be61bbbSBram Moolenaar 20033fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 20133fa29cfSBram Moolenaar 2028a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2038a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2048a7d6542SBram Moolenaar 2058a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2068a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2078a7d6542SBram Moolenaar 2088a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2098a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 21042a480bfSBram Moolenaar 21142a480bfSBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1007:') 21242a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 213599c89c8SBram Moolenaarendfunc 214599c89c8SBram Moolenaar 215599c89c8SBram Moolenaarfunc Test_wrong_type() 216599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 217599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 218599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 219599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 220599c89c8SBram Moolenaar 221599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 222599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22342a480bfSBram Moolenaar 22442a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 22542a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 22642a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 22742a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 22842a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 23242a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23342a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23442a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2358a7d6542SBram Moolenaarendfunc 2368a7d6542SBram Moolenaar 2378a7d6542SBram Moolenaarfunc Test_const() 2388a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2398a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2408a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2419be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2428a7d6542SBram Moolenaarendfunc 2438a7d6542SBram Moolenaar 2448a7d6542SBram Moolenaardef Test_block() 2458a7d6542SBram Moolenaar let outer = 1 2468a7d6542SBram Moolenaar { 2478a7d6542SBram Moolenaar let inner = 2 2488a7d6542SBram Moolenaar assert_equal(1, outer) 2498a7d6542SBram Moolenaar assert_equal(2, inner) 2508a7d6542SBram Moolenaar } 2518a7d6542SBram Moolenaar assert_equal(1, outer) 2528a7d6542SBram Moolenaarenddef 2538a7d6542SBram Moolenaar 2548a7d6542SBram Moolenaarfunc Test_block_failure() 2558a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 2568a7d6542SBram Moolenaarendfunc 2578a7d6542SBram Moolenaar 2588a7d6542SBram Moolenaardef ReturnString(): string 2598a7d6542SBram Moolenaar return 'string' 2608a7d6542SBram Moolenaarenddef 2618a7d6542SBram Moolenaar 2628a7d6542SBram Moolenaardef ReturnNumber(): number 2638a7d6542SBram Moolenaar return 123 2648a7d6542SBram Moolenaarenddef 2658a7d6542SBram Moolenaar 26609f28f49SBram Moolenaarlet g:notNumber = 'string' 26709f28f49SBram Moolenaar 26809f28f49SBram Moolenaardef ReturnGlobal(): number 26909f28f49SBram Moolenaar return g:notNumber 27009f28f49SBram Moolenaarenddef 27109f28f49SBram Moolenaar 2729be61bbbSBram Moolenaardef Test_return_something() 2738a7d6542SBram Moolenaar assert_equal('string', ReturnString()) 2748a7d6542SBram Moolenaar assert_equal(123, ReturnNumber()) 27509f28f49SBram Moolenaar assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string') 2768a7d6542SBram Moolenaarenddef 2778a7d6542SBram Moolenaar 2789be61bbbSBram Moolenaarlet s:nothing = 0 2799be61bbbSBram Moolenaardef ReturnNothing() 2809be61bbbSBram Moolenaar s:nothing = 1 2819be61bbbSBram Moolenaar if true 2829be61bbbSBram Moolenaar return 2839be61bbbSBram Moolenaar endif 2849be61bbbSBram Moolenaar s:nothing = 2 2859be61bbbSBram Moolenaarenddef 2869be61bbbSBram Moolenaar 2879be61bbbSBram Moolenaardef Test_return_nothing() 2889be61bbbSBram Moolenaar ReturnNothing() 2899be61bbbSBram Moolenaar assert_equal(1, s:nothing) 2909be61bbbSBram Moolenaarenddef 2919be61bbbSBram Moolenaar 2928a7d6542SBram Moolenaarfunc Increment() 2938a7d6542SBram Moolenaar let g:counter += 1 2948a7d6542SBram Moolenaarendfunc 2958a7d6542SBram Moolenaar 2968a7d6542SBram Moolenaardef Test_call_ufunc_count() 2978a7d6542SBram Moolenaar g:counter = 1 2988a7d6542SBram Moolenaar Increment() 2998a7d6542SBram Moolenaar Increment() 3008a7d6542SBram Moolenaar Increment() 3018a7d6542SBram Moolenaar " works with and without :call 3028a7d6542SBram Moolenaar assert_equal(4, g:counter) 303b283a8a6SBram Moolenaar call assert_equal(4, g:counter) 3048a7d6542SBram Moolenaar unlet g:counter 3058a7d6542SBram Moolenaarenddef 3068a7d6542SBram Moolenaar 3078a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string 3088a7d6542SBram Moolenaar let res = arg 3098a7d6542SBram Moolenaar for s in rest 3108a7d6542SBram Moolenaar res ..= ',' .. s 3118a7d6542SBram Moolenaar endfor 3128a7d6542SBram Moolenaar return res 3138a7d6542SBram Moolenaarenddef 3148a7d6542SBram Moolenaar 3158a7d6542SBram Moolenaardef Test_call_varargs() 3168a7d6542SBram Moolenaar assert_equal('one', MyVarargs('one')) 3178a7d6542SBram Moolenaar assert_equal('one,two', MyVarargs('one', 'two')) 3188a7d6542SBram Moolenaar assert_equal('one,two,three', MyVarargs('one', 'two', 'three')) 3198a7d6542SBram Moolenaarenddef 3208a7d6542SBram Moolenaar 321170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string 322170fcfcfSBram Moolenaar return name 323170fcfcfSBram Moolenaarenddef 324170fcfcfSBram Moolenaar 325170fcfcfSBram Moolenaardef Test_call_default_args() 326170fcfcfSBram Moolenaar assert_equal('string', MyDefaultArgs()) 327170fcfcfSBram Moolenaar assert_equal('one', MyDefaultArgs('one')) 328170fcfcfSBram Moolenaar assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 329170fcfcfSBram Moolenaarenddef 330170fcfcfSBram Moolenaar 331170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func() 332170fcfcfSBram Moolenaar call assert_equal('string', MyDefaultArgs()) 333170fcfcfSBram Moolenaar call assert_equal('one', MyDefaultArgs('one')) 334170fcfcfSBram Moolenaar call assert_fails('call MyDefaultArgs("one", "two")', 'E118:') 335170fcfcfSBram Moolenaarendfunc 336170fcfcfSBram Moolenaar 337b35efa5eSBram Moolenaarfunc TakesOneArg(arg) 338b35efa5eSBram Moolenaar echo a:arg 339b35efa5eSBram Moolenaarendfunc 340b35efa5eSBram Moolenaar 341bd5da371SBram Moolenaardef Test_call_wrong_args() 342b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg()'], 'E119:') 343b35efa5eSBram Moolenaar call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:') 344bd5da371SBram Moolenaar call CheckDefFailure(['bufnr(xxx)'], 'E1001:') 345b35efa5eSBram Moolenaarenddef 346b35efa5eSBram Moolenaar 347170fcfcfSBram Moolenaar" Default arg and varargs 348170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string 349170fcfcfSBram Moolenaar let res = one .. ',' .. two 350170fcfcfSBram Moolenaar for s in rest 351170fcfcfSBram Moolenaar res ..= ',' .. s 352170fcfcfSBram Moolenaar endfor 353170fcfcfSBram Moolenaar return res 354170fcfcfSBram Moolenaarenddef 355170fcfcfSBram Moolenaar 356170fcfcfSBram Moolenaardef Test_call_def_varargs() 357170fcfcfSBram Moolenaar call assert_fails('call MyDefVarargs()', 'E119:') 358170fcfcfSBram Moolenaar assert_equal('one,foo', MyDefVarargs('one')) 359170fcfcfSBram Moolenaar assert_equal('one,two', MyDefVarargs('one', 'two')) 360170fcfcfSBram Moolenaar assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three')) 361170fcfcfSBram Moolenaarenddef 362170fcfcfSBram Moolenaar 36342a480bfSBram Moolenaardef Test_using_var_as_arg() 36442a480bfSBram Moolenaar call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef') 36542a480bfSBram Moolenaar call assert_fails('so Xdef', 'E1006:') 36642a480bfSBram Moolenaar call delete('Xdef') 36742a480bfSBram Moolenaarenddef 36842a480bfSBram Moolenaar 369b35efa5eSBram Moolenaardef Test_call_func_defined_later() 370b35efa5eSBram Moolenaar call assert_equal('one', DefinedLater('one')) 371b35efa5eSBram Moolenaar call assert_fails('call NotDefined("one")', 'E117:') 372b35efa5eSBram Moolenaarenddef 373170fcfcfSBram Moolenaar 374b35efa5eSBram Moolenaarfunc DefinedLater(arg) 37526e117e9SBram Moolenaar return a:arg 37626e117e9SBram Moolenaarendfunc 37726e117e9SBram Moolenaar 3787eeefd4aSBram Moolenaardef FuncWithForwardCall() 3797eeefd4aSBram Moolenaar return DefinedEvenLater("yes") 3807eeefd4aSBram Moolenaarenddef 3817eeefd4aSBram Moolenaar 3827eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string 3837eeefd4aSBram Moolenaar return arg 3847eeefd4aSBram Moolenaarenddef 3857eeefd4aSBram Moolenaar 3867eeefd4aSBram Moolenaardef Test_error_in_nested_function() 3877eeefd4aSBram Moolenaar " Error in called function requires unwinding the call stack. 3887eeefd4aSBram Moolenaar assert_fails('call FuncWithForwardCall()', 'E1029') 3897eeefd4aSBram Moolenaarenddef 3907eeefd4aSBram Moolenaar 3918a7d6542SBram Moolenaardef Test_return_type_wrong() 392978d170bSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string') 393978d170bSBram Moolenaar CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number') 394978d170bSBram Moolenaar CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string') 395978d170bSBram Moolenaar CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string') 396cf3f8bf4SBram Moolenaar 3979be61bbbSBram Moolenaar CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:') 3989be61bbbSBram Moolenaar 399cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:') 400cf3f8bf4SBram Moolenaar CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:') 4018a7d6542SBram Moolenaarenddef 4028a7d6542SBram Moolenaar 403bfe12043SBram Moolenaardef Test_arg_type_wrong() 404bfe12043SBram Moolenaar CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>') 405bfe12043SBram Moolenaarenddef 406bfe12043SBram Moolenaar 4078a7d6542SBram Moolenaardef Test_try_catch() 4088a7d6542SBram Moolenaar let l = [] 4098a7d6542SBram Moolenaar try 4108a7d6542SBram Moolenaar add(l, '1') 4118a7d6542SBram Moolenaar throw 'wrong' 4128a7d6542SBram Moolenaar add(l, '2') 4138a7d6542SBram Moolenaar catch 4148a7d6542SBram Moolenaar add(l, v:exception) 4158a7d6542SBram Moolenaar finally 4168a7d6542SBram Moolenaar add(l, '3') 4178a7d6542SBram Moolenaar endtry 4188a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4198a7d6542SBram Moolenaarenddef 4208a7d6542SBram Moolenaar 421257cc5eeSBram Moolenaardef ThrowFromDef() 422257cc5eeSBram Moolenaar throw 'getout' 423257cc5eeSBram Moolenaarenddef 424257cc5eeSBram Moolenaar 425257cc5eeSBram Moolenaarfunc CatchInFunc() 426257cc5eeSBram Moolenaar try 427257cc5eeSBram Moolenaar call ThrowFromDef() 428257cc5eeSBram Moolenaar catch 429257cc5eeSBram Moolenaar let g:thrown_func = v:exception 430257cc5eeSBram Moolenaar endtry 431257cc5eeSBram Moolenaarendfunc 432257cc5eeSBram Moolenaar 433257cc5eeSBram Moolenaardef CatchInDef() 434257cc5eeSBram Moolenaar try 435257cc5eeSBram Moolenaar ThrowFromDef() 436257cc5eeSBram Moolenaar catch 437257cc5eeSBram Moolenaar g:thrown_def = v:exception 438257cc5eeSBram Moolenaar endtry 439257cc5eeSBram Moolenaarenddef 440257cc5eeSBram Moolenaar 441f575adffSBram Moolenaardef ReturnFinally(): string 442f575adffSBram Moolenaar try 443f575adffSBram Moolenaar return 'intry' 444f575adffSBram Moolenaar finally 445f575adffSBram Moolenaar g:in_finally = 'finally' 446f575adffSBram Moolenaar endtry 447f575adffSBram Moolenaar return 'end' 448f575adffSBram Moolenaarenddef 449f575adffSBram Moolenaar 450257cc5eeSBram Moolenaardef Test_try_catch_nested() 451257cc5eeSBram Moolenaar CatchInFunc() 452257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 453257cc5eeSBram Moolenaar 454257cc5eeSBram Moolenaar CatchInDef() 455257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 456f575adffSBram Moolenaar 457f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 458f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 459f575adffSBram Moolenaarenddef 460f575adffSBram Moolenaar 461f575adffSBram Moolenaardef Test_try_catch_match() 462f575adffSBram Moolenaar let seq = 'a' 463f575adffSBram Moolenaar try 464f575adffSBram Moolenaar throw 'something' 465f575adffSBram Moolenaar catch /nothing/ 466f575adffSBram Moolenaar seq ..= 'x' 467f575adffSBram Moolenaar catch /some/ 468f575adffSBram Moolenaar seq ..= 'b' 469f575adffSBram Moolenaar catch /asdf/ 470f575adffSBram Moolenaar seq ..= 'x' 471*e8c4abbbSBram Moolenaar catch ?a\?sdf? 472*e8c4abbbSBram Moolenaar seq ..= 'y' 473f575adffSBram Moolenaar finally 474f575adffSBram Moolenaar seq ..= 'c' 475f575adffSBram Moolenaar endtry 476f575adffSBram Moolenaar assert_equal('abc', seq) 477257cc5eeSBram Moolenaarenddef 478257cc5eeSBram Moolenaar 479*e8c4abbbSBram Moolenaardef Test_try_catch_fails() 480*e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 481*e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 482*e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 483*e8c4abbbSBram Moolenaarenddef 484*e8c4abbbSBram Moolenaar 4858a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 4868a7d6542SBram Moolenaar vim9script 4878a7d6542SBram Moolenaar let name: string = 'bob' 4888a7d6542SBram Moolenaar def Concat(arg: string): string 4898a7d6542SBram Moolenaar return name .. arg 4908a7d6542SBram Moolenaar enddef 4918a7d6542SBram Moolenaar let g:result = Concat('bie') 4928a7d6542SBram Moolenaar let g:localname = name 4938a7d6542SBram Moolenaar 4948a7d6542SBram Moolenaar export const CONST = 1234 4958a7d6542SBram Moolenaar export let exported = 9876 4966e587dcbSBram Moolenaar export let exp_name = 'John' 4978a7d6542SBram Moolenaar export def Exported(): string 4988a7d6542SBram Moolenaar return 'Exported' 4998a7d6542SBram Moolenaar enddef 5008a7d6542SBram MoolenaarEND 5018a7d6542SBram Moolenaar 5025269bd2aSBram Moolenaardef Test_vim9_import_export() 5038a7d6542SBram Moolenaar let import_script_lines =<< trim END 5048a7d6542SBram Moolenaar vim9script 5058a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 5068a7d6542SBram Moolenaar g:imported = exported 5076e587dcbSBram Moolenaar exported += 3 5086e587dcbSBram Moolenaar g:imported_added = exported 5098a7d6542SBram Moolenaar g:imported_func = Exported() 5106e587dcbSBram Moolenaar 5116e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5126e587dcbSBram Moolenaar g:imported_name = exp_name 5136e587dcbSBram Moolenaar exp_name ..= ' Doe' 5146e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5155381c7a1SBram Moolenaar g:imported_later = exported 5168a7d6542SBram Moolenaar END 5178a7d6542SBram Moolenaar 5188a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5198a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5208a7d6542SBram Moolenaar 5218a7d6542SBram Moolenaar source Ximport.vim 5228a7d6542SBram Moolenaar 5238a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5248a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5258a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5266e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5275381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5288a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5296e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5306e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5318a7d6542SBram Moolenaar assert_false(exists('g:name')) 5328a7d6542SBram Moolenaar 5338a7d6542SBram Moolenaar unlet g:result 5348a7d6542SBram Moolenaar unlet g:localname 5358a7d6542SBram Moolenaar unlet g:imported 5366e587dcbSBram Moolenaar unlet g:imported_added 5375381c7a1SBram Moolenaar unlet g:imported_later 5388a7d6542SBram Moolenaar unlet g:imported_func 5396e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5408a7d6542SBram Moolenaar delete('Ximport.vim') 541f2d5c240SBram Moolenaar 5425381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5435381c7a1SBram Moolenaar vim9script 5445381c7a1SBram Moolenaar def ImportInDef() 5455381c7a1SBram Moolenaar import exported from './Xexport.vim' 5465381c7a1SBram Moolenaar g:imported = exported 5475381c7a1SBram Moolenaar exported += 7 5485381c7a1SBram Moolenaar g:imported_added = exported 5495381c7a1SBram Moolenaar enddef 5505381c7a1SBram Moolenaar ImportInDef() 5515381c7a1SBram Moolenaar END 5525381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5535381c7a1SBram Moolenaar source Ximport2.vim 5545381c7a1SBram Moolenaar " TODO: this should be 9879 5555381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5565381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5575381c7a1SBram Moolenaar unlet g:imported 5585381c7a1SBram Moolenaar unlet g:imported_added 5595381c7a1SBram Moolenaar delete('Ximport2.vim') 5605381c7a1SBram Moolenaar 561f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 562f2d5c240SBram Moolenaar vim9script 563f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 564f2d5c240SBram Moolenaar def UseExport() 565f2d5c240SBram Moolenaar g:imported = Export.exported 566f2d5c240SBram Moolenaar enddef 567f2d5c240SBram Moolenaar UseExport() 568f2d5c240SBram Moolenaar END 569f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 570f2d5c240SBram Moolenaar source Ximport.vim 5715381c7a1SBram Moolenaar assert_equal(9883, g:imported) 572f2d5c240SBram Moolenaar 573599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 574599c89c8SBram Moolenaar vim9script 575599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 576599c89c8SBram Moolenaar def Func() 577599c89c8SBram Moolenaar let dummy = 1 578599c89c8SBram Moolenaar let imported = Export + dummy 579599c89c8SBram Moolenaar enddef 580599c89c8SBram Moolenaar END 581599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 582599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 583599c89c8SBram Moolenaar 584599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 585599c89c8SBram Moolenaar vim9script 586599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 587599c89c8SBram Moolenaar def Func() 588599c89c8SBram Moolenaar let imported = Export . exported 589599c89c8SBram Moolenaar enddef 590599c89c8SBram Moolenaar END 591599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 592599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 593599c89c8SBram Moolenaar 594599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 595599c89c8SBram Moolenaar vim9script 596599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 597599c89c8SBram Moolenaar def Func() 598599c89c8SBram Moolenaar let imported = Export. 599599c89c8SBram Moolenaar enddef 600599c89c8SBram Moolenaar END 601599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 602599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 603599c89c8SBram Moolenaar 604f2d5c240SBram Moolenaar let import_star_lines =<< trim END 605f2d5c240SBram Moolenaar vim9script 606f2d5c240SBram Moolenaar import * from './Xexport.vim' 607f2d5c240SBram Moolenaar g:imported = exported 608f2d5c240SBram Moolenaar END 609f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 610f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 611f2d5c240SBram Moolenaar 612fa29c8abSBram Moolenaar " try to import something that exists but is not exported 613fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 614fa29c8abSBram Moolenaar vim9script 615fa29c8abSBram Moolenaar import name from './Xexport.vim' 616fa29c8abSBram Moolenaar END 617fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 618fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 619fa29c8abSBram Moolenaar 6205269bd2aSBram Moolenaar " try to import something that is already defined 6215269bd2aSBram Moolenaar let import_already_defined =<< trim END 6225269bd2aSBram Moolenaar vim9script 6235269bd2aSBram Moolenaar let exported = 'something' 6245269bd2aSBram Moolenaar import exported from './Xexport.vim' 6255269bd2aSBram Moolenaar END 6265269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6275269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6285269bd2aSBram Moolenaar 6295269bd2aSBram Moolenaar " try to import something that is already defined 6305269bd2aSBram Moolenaar import_already_defined =<< trim END 6315269bd2aSBram Moolenaar vim9script 6325269bd2aSBram Moolenaar let exported = 'something' 6335269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6345269bd2aSBram Moolenaar END 6355269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6365269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6375269bd2aSBram Moolenaar 6385269bd2aSBram Moolenaar " try to import something that is already defined 6395269bd2aSBram Moolenaar import_already_defined =<< trim END 6405269bd2aSBram Moolenaar vim9script 6415269bd2aSBram Moolenaar let exported = 'something' 6425269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6435269bd2aSBram Moolenaar END 6445269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6455269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6465269bd2aSBram Moolenaar 647fa29c8abSBram Moolenaar " import a very long name, requires making a copy 648fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 649fa29c8abSBram Moolenaar vim9script 650fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 651fa29c8abSBram Moolenaar END 652fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 653fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 654fa29c8abSBram Moolenaar 655fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 656fa29c8abSBram Moolenaar vim9script 657fa29c8abSBram Moolenaar import name './Xexport.vim' 658fa29c8abSBram Moolenaar END 659fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 660fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 661fa29c8abSBram Moolenaar 662fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 663fa29c8abSBram Moolenaar vim9script 664fa29c8abSBram Moolenaar import name from Xexport.vim 665fa29c8abSBram Moolenaar END 666fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 667fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 668fa29c8abSBram Moolenaar 669fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 670fa29c8abSBram Moolenaar vim9script 671fa29c8abSBram Moolenaar import name from './XnoExport.vim' 672fa29c8abSBram Moolenaar END 673fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 674fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 675fa29c8abSBram Moolenaar 676fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 677fa29c8abSBram Moolenaar vim9script 678fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 679fa29c8abSBram Moolenaar END 6805269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 6815269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 682fa29c8abSBram Moolenaar 683f2d5c240SBram Moolenaar delete('Ximport.vim') 6845269bd2aSBram Moolenaar delete('Ximport3.vim') 6858a7d6542SBram Moolenaar delete('Xexport.vim') 6868a7d6542SBram Moolenaar 687750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 688750802b5SBram Moolenaar set cpo&vi 689750802b5SBram Moolenaar let cpo_before = &cpo 690750802b5SBram Moolenaar let lines =<< trim END 691750802b5SBram Moolenaar vim9script 692750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 693750802b5SBram Moolenaar END 694750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 695750802b5SBram Moolenaar source Xvim9_script 696750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 697750802b5SBram Moolenaar set cpo&vim 698750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 699750802b5SBram Moolenaar delete('Xvim9_script') 700750802b5SBram Moolenaarenddef 701750802b5SBram Moolenaar 702750802b5SBram Moolenaardef Test_vim9script_fails() 7038a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 7048a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 705750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 706f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 707750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 708750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 709750802b5SBram Moolenaar 710750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 711750802b5SBram Moolenaar assert_fails('export something', 'E1042') 7128a7d6542SBram Moolenaarenddef 7138a7d6542SBram Moolenaar 7148a7d6542SBram Moolenaardef Test_vim9script_call() 7158a7d6542SBram Moolenaar let lines =<< trim END 7168a7d6542SBram Moolenaar vim9script 7178a7d6542SBram Moolenaar let var = '' 7188a7d6542SBram Moolenaar def MyFunc(arg: string) 7198a7d6542SBram Moolenaar var = arg 7208a7d6542SBram Moolenaar enddef 7218a7d6542SBram Moolenaar MyFunc('foobar') 7228a7d6542SBram Moolenaar assert_equal('foobar', var) 7238a7d6542SBram Moolenaar 7248a7d6542SBram Moolenaar let str = 'barfoo' 7258a7d6542SBram Moolenaar str->MyFunc() 7268a7d6542SBram Moolenaar assert_equal('barfoo', var) 7278a7d6542SBram Moolenaar 7288a7d6542SBram Moolenaar let g:value = 'value' 7298a7d6542SBram Moolenaar g:value->MyFunc() 7308a7d6542SBram Moolenaar assert_equal('value', var) 7318a7d6542SBram Moolenaar 7328a7d6542SBram Moolenaar let listvar = [] 7338a7d6542SBram Moolenaar def ListFunc(arg: list<number>) 7348a7d6542SBram Moolenaar listvar = arg 7358a7d6542SBram Moolenaar enddef 7368a7d6542SBram Moolenaar [1, 2, 3]->ListFunc() 7378a7d6542SBram Moolenaar assert_equal([1, 2, 3], listvar) 7388a7d6542SBram Moolenaar 7398a7d6542SBram Moolenaar let dictvar = {} 7408a7d6542SBram Moolenaar def DictFunc(arg: dict<number>) 7418a7d6542SBram Moolenaar dictvar = arg 7428a7d6542SBram Moolenaar enddef 7438a7d6542SBram Moolenaar {'a': 1, 'b': 2}->DictFunc() 7448a7d6542SBram Moolenaar assert_equal(#{a: 1, b: 2}, dictvar) 74533fa29cfSBram Moolenaar def CompiledDict() 74633fa29cfSBram Moolenaar {'a': 3, 'b': 4}->DictFunc() 74733fa29cfSBram Moolenaar enddef 74833fa29cfSBram Moolenaar CompiledDict() 74933fa29cfSBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 75033fa29cfSBram Moolenaar 7518a7d6542SBram Moolenaar #{a: 3, b: 4}->DictFunc() 7528a7d6542SBram Moolenaar assert_equal(#{a: 3, b: 4}, dictvar) 7530c6ceaf9SBram Moolenaar 7540c6ceaf9SBram Moolenaar ('text')->MyFunc() 7550c6ceaf9SBram Moolenaar assert_equal('text', var) 7560c6ceaf9SBram Moolenaar ("some")->MyFunc() 7570c6ceaf9SBram Moolenaar assert_equal('some', var) 7588a7d6542SBram Moolenaar END 7598a7d6542SBram Moolenaar writefile(lines, 'Xcall.vim') 7608a7d6542SBram Moolenaar source Xcall.vim 7618a7d6542SBram Moolenaar delete('Xcall.vim') 7628a7d6542SBram Moolenaarenddef 7638a7d6542SBram Moolenaar 7648a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl() 7658a7d6542SBram Moolenaar let lines =<< trim END 7668a7d6542SBram Moolenaar vim9script 7678a7d6542SBram Moolenaar let var = '' 7688a7d6542SBram Moolenaar def MyFunc(arg: string) 7698a7d6542SBram Moolenaar let var = 123 7708a7d6542SBram Moolenaar enddef 7718a7d6542SBram Moolenaar END 7728a7d6542SBram Moolenaar writefile(lines, 'Xcall_decl.vim') 7738a7d6542SBram Moolenaar assert_fails('source Xcall_decl.vim', 'E1054:') 7748a7d6542SBram Moolenaar delete('Xcall_decl.vim') 7758a7d6542SBram Moolenaarenddef 7768a7d6542SBram Moolenaar 7778a7d6542SBram Moolenaardef Test_vim9script_call_fail_const() 7788a7d6542SBram Moolenaar let lines =<< trim END 7798a7d6542SBram Moolenaar vim9script 7808a7d6542SBram Moolenaar const var = '' 7818a7d6542SBram Moolenaar def MyFunc(arg: string) 7828a7d6542SBram Moolenaar var = 'asdf' 7838a7d6542SBram Moolenaar enddef 7848a7d6542SBram Moolenaar END 7858a7d6542SBram Moolenaar writefile(lines, 'Xcall_const.vim') 7868a7d6542SBram Moolenaar assert_fails('source Xcall_const.vim', 'E46:') 7878a7d6542SBram Moolenaar delete('Xcall_const.vim') 7888a7d6542SBram Moolenaarenddef 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaardef Test_vim9script_reload() 7918a7d6542SBram Moolenaar let lines =<< trim END 7928a7d6542SBram Moolenaar vim9script 7938a7d6542SBram Moolenaar const var = '' 7948a7d6542SBram Moolenaar let valone = 1234 7958a7d6542SBram Moolenaar def MyFunc(arg: string) 7968a7d6542SBram Moolenaar valone = 5678 7978a7d6542SBram Moolenaar enddef 7988a7d6542SBram Moolenaar END 7998a7d6542SBram Moolenaar let morelines =<< trim END 8008a7d6542SBram Moolenaar let valtwo = 222 8018a7d6542SBram Moolenaar export def GetValtwo(): number 8028a7d6542SBram Moolenaar return valtwo 8038a7d6542SBram Moolenaar enddef 8048a7d6542SBram Moolenaar END 8058a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 8068a7d6542SBram Moolenaar source Xreload.vim 8078a7d6542SBram Moolenaar source Xreload.vim 8088a7d6542SBram Moolenaar source Xreload.vim 8098a7d6542SBram Moolenaar 8108a7d6542SBram Moolenaar let testlines =<< trim END 8118a7d6542SBram Moolenaar vim9script 8128a7d6542SBram Moolenaar def TheFunc() 8138a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 8148a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 8158a7d6542SBram Moolenaar enddef 8168a7d6542SBram Moolenaar TheFunc() 8178a7d6542SBram Moolenaar END 8188a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 8198a7d6542SBram Moolenaar source Ximport.vim 8208a7d6542SBram Moolenaar 8218a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 8228a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 8238a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8248a7d6542SBram Moolenaar source Xreload.vim 8258a7d6542SBram Moolenaar source Ximport.vim 8268a7d6542SBram Moolenaar 8278a7d6542SBram Moolenaar " cannot declare a var twice 8288a7d6542SBram Moolenaar lines =<< trim END 8298a7d6542SBram Moolenaar vim9script 8308a7d6542SBram Moolenaar let valone = 1234 8318a7d6542SBram Moolenaar let valone = 5678 8328a7d6542SBram Moolenaar END 8338a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 8348a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 8358a7d6542SBram Moolenaar 8368a7d6542SBram Moolenaar delete('Xreload.vim') 8378a7d6542SBram Moolenaar delete('Ximport.vim') 8388a7d6542SBram Moolenaarenddef 8398a7d6542SBram Moolenaar 8408a7d6542SBram Moolenaardef Test_import_absolute() 8418a7d6542SBram Moolenaar let import_lines = [ 8428a7d6542SBram Moolenaar \ 'vim9script', 8438a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 844b283a8a6SBram Moolenaar \ 'def UseExported()', 8458a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 8464e12a5dfSBram Moolenaar \ ' exported = 8888', 8474e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 848b283a8a6SBram Moolenaar \ 'enddef', 849b283a8a6SBram Moolenaar \ 'UseExported()', 8504e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 8518a7d6542SBram Moolenaar \ ] 8528a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8538a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8548a7d6542SBram Moolenaar 8558a7d6542SBram Moolenaar source Ximport_abs.vim 8568a7d6542SBram Moolenaar 8578a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8584e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 859b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 860b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 861b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8624e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 8634e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 8644e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 8654e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 8664e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 8674e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 8684e12a5dfSBram Moolenaar \, g:import_disassembled) 8698a7d6542SBram Moolenaar unlet g:imported_abs 8704e12a5dfSBram Moolenaar unlet g:import_disassembled 8718a7d6542SBram Moolenaar 8728a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8738a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8748a7d6542SBram Moolenaarenddef 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaardef Test_import_rtp() 8778a7d6542SBram Moolenaar let import_lines = [ 8788a7d6542SBram Moolenaar \ 'vim9script', 8798a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 8808a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 8818a7d6542SBram Moolenaar \ ] 8828a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 8838a7d6542SBram Moolenaar mkdir('import') 8848a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 8858a7d6542SBram Moolenaar 8868a7d6542SBram Moolenaar let save_rtp = &rtp 8878a7d6542SBram Moolenaar &rtp = getcwd() 8888a7d6542SBram Moolenaar source Ximport_rtp.vim 8898a7d6542SBram Moolenaar &rtp = save_rtp 8908a7d6542SBram Moolenaar 8918a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8928a7d6542SBram Moolenaar unlet g:imported_rtp 8938a7d6542SBram Moolenaar 8948a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 8958a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 8968a7d6542SBram Moolenaar delete('import', 'd') 8978a7d6542SBram Moolenaarenddef 8988a7d6542SBram Moolenaar 8998a7d6542SBram Moolenaardef Test_fixed_size_list() 9008a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 9018a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 9028a7d6542SBram Moolenaar l->remove(0) 9038a7d6542SBram Moolenaar l->add(5) 9048a7d6542SBram Moolenaar l->insert(99, 1) 9050f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 9068a7d6542SBram Moolenaarenddef 9078a7d6542SBram Moolenaar 908673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not 909673660abSBram Moolenaar" recognized. 910673660abSBram Moolenaarfunc Test_function_python() 911673660abSBram Moolenaar CheckFeature python3 912673660abSBram Moolenaar let py = 'python3' 913673660abSBram Moolenaar execute py "<< EOF" 914673660abSBram Moolenaardef do_something(): 915673660abSBram Moolenaar return 1 916673660abSBram MoolenaarEOF 917673660abSBram Moolenaarendfunc 918673660abSBram Moolenaar 919158906cfSBram Moolenaardef IfElse(what: number): string 920158906cfSBram Moolenaar let res = '' 921158906cfSBram Moolenaar if what == 1 922158906cfSBram Moolenaar res = "one" 923158906cfSBram Moolenaar elseif what == 2 924158906cfSBram Moolenaar res = "two" 925a259d8d3SBram Moolenaar else 926158906cfSBram Moolenaar res = "three" 927a259d8d3SBram Moolenaar endif 928158906cfSBram Moolenaar return res 929a259d8d3SBram Moolenaarenddef 930a259d8d3SBram Moolenaar 931158906cfSBram Moolenaardef Test_if_elseif_else() 932158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 933158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 934158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9350f18b6d1SBram Moolenaarenddef 9360f18b6d1SBram Moolenaar 937*e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 938*e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 939*e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 940*e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 941*e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 942*e8c4abbbSBram Moolenaarenddef 943*e8c4abbbSBram Moolenaar 9446d69bf60SBram Moolenaarlet g:bool_true = v:true 9456d69bf60SBram Moolenaarlet g:bool_false = v:false 9466d69bf60SBram Moolenaar 9476d69bf60SBram Moolenaardef Test_if_const_expr() 9486d69bf60SBram Moolenaar let res = false 9496d69bf60SBram Moolenaar if true ? true : false 9506d69bf60SBram Moolenaar res = true 9516d69bf60SBram Moolenaar endif 9526d69bf60SBram Moolenaar assert_equal(true, res) 9536d69bf60SBram Moolenaar 9546d69bf60SBram Moolenaar res = false 9556d69bf60SBram Moolenaar if g:bool_true ? true : false 9566d69bf60SBram Moolenaar res = true 9576d69bf60SBram Moolenaar endif 9586d69bf60SBram Moolenaar assert_equal(true, res) 9596d69bf60SBram Moolenaar 9606d69bf60SBram Moolenaar res = false 9616d69bf60SBram Moolenaar if true ? g:bool_true : false 9626d69bf60SBram Moolenaar res = true 9636d69bf60SBram Moolenaar endif 9646d69bf60SBram Moolenaar assert_equal(true, res) 9656d69bf60SBram Moolenaar 9666d69bf60SBram Moolenaar res = false 9676d69bf60SBram Moolenaar if true ? true : g:bool_false 9686d69bf60SBram Moolenaar res = true 9696d69bf60SBram Moolenaar endif 9706d69bf60SBram Moolenaar assert_equal(true, res) 9716d69bf60SBram Moolenaar 9726d69bf60SBram Moolenaar res = false 9736d69bf60SBram Moolenaar if true ? false : true 9746d69bf60SBram Moolenaar res = true 9756d69bf60SBram Moolenaar endif 9766d69bf60SBram Moolenaar assert_equal(false, res) 9776d69bf60SBram Moolenaar 9786d69bf60SBram Moolenaar res = false 9796d69bf60SBram Moolenaar if false ? false : true 9806d69bf60SBram Moolenaar res = true 9816d69bf60SBram Moolenaar endif 9826d69bf60SBram Moolenaar assert_equal(true, res) 9836d69bf60SBram Moolenaar 9846d69bf60SBram Moolenaar res = false 9856d69bf60SBram Moolenaar if false ? true : false 9866d69bf60SBram Moolenaar res = true 9876d69bf60SBram Moolenaar endif 9886d69bf60SBram Moolenaar assert_equal(false, res) 9896d69bf60SBram Moolenaar 9906d69bf60SBram Moolenaar res = false 991*e8c4abbbSBram Moolenaar if has('xyz') ? true : false 992*e8c4abbbSBram Moolenaar res = true 993*e8c4abbbSBram Moolenaar endif 994*e8c4abbbSBram Moolenaar assert_equal(false, res) 995*e8c4abbbSBram Moolenaar 996*e8c4abbbSBram Moolenaar res = false 9976d69bf60SBram Moolenaar if true && true 9986d69bf60SBram Moolenaar res = true 9996d69bf60SBram Moolenaar endif 10006d69bf60SBram Moolenaar assert_equal(true, res) 10016d69bf60SBram Moolenaar 10026d69bf60SBram Moolenaar res = false 10036d69bf60SBram Moolenaar if true && false 10046d69bf60SBram Moolenaar res = true 10056d69bf60SBram Moolenaar endif 10066d69bf60SBram Moolenaar assert_equal(false, res) 10076d69bf60SBram Moolenaar 10086d69bf60SBram Moolenaar res = false 10096d69bf60SBram Moolenaar if g:bool_true && false 10106d69bf60SBram Moolenaar res = true 10116d69bf60SBram Moolenaar endif 10126d69bf60SBram Moolenaar assert_equal(false, res) 10136d69bf60SBram Moolenaar 10146d69bf60SBram Moolenaar res = false 10156d69bf60SBram Moolenaar if true && g:bool_false 10166d69bf60SBram Moolenaar res = true 10176d69bf60SBram Moolenaar endif 10186d69bf60SBram Moolenaar assert_equal(false, res) 10196d69bf60SBram Moolenaar 10206d69bf60SBram Moolenaar res = false 10216d69bf60SBram Moolenaar if false && false 10226d69bf60SBram Moolenaar res = true 10236d69bf60SBram Moolenaar endif 10246d69bf60SBram Moolenaar assert_equal(false, res) 10256d69bf60SBram Moolenaar 10266d69bf60SBram Moolenaar res = false 10276d69bf60SBram Moolenaar if true || false 10286d69bf60SBram Moolenaar res = true 10296d69bf60SBram Moolenaar endif 10306d69bf60SBram Moolenaar assert_equal(true, res) 10316d69bf60SBram Moolenaar 10326d69bf60SBram Moolenaar res = false 10336d69bf60SBram Moolenaar if g:bool_true || false 10346d69bf60SBram Moolenaar res = true 10356d69bf60SBram Moolenaar endif 10366d69bf60SBram Moolenaar assert_equal(true, res) 10376d69bf60SBram Moolenaar 10386d69bf60SBram Moolenaar res = false 10396d69bf60SBram Moolenaar if true || g:bool_false 10406d69bf60SBram Moolenaar res = true 10416d69bf60SBram Moolenaar endif 10426d69bf60SBram Moolenaar assert_equal(true, res) 10436d69bf60SBram Moolenaar 10446d69bf60SBram Moolenaar res = false 10456d69bf60SBram Moolenaar if false || false 10466d69bf60SBram Moolenaar res = true 10476d69bf60SBram Moolenaar endif 10486d69bf60SBram Moolenaar assert_equal(false, res) 104980c34ca3SBram Moolenaarenddef 10506d69bf60SBram Moolenaar 105180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 105280c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 105380c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1054*e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1055*e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 10566d69bf60SBram Moolenaarenddef 10576d69bf60SBram Moolenaar 105863ce4849SBram Moolenaardef Test_delfunc() 105963ce4849SBram Moolenaar let lines =<< trim END 106063ce4849SBram Moolenaar vim9script 106163ce4849SBram Moolenaar def GoneSoon() 106263ce4849SBram Moolenaar echo 'hello' 106363ce4849SBram Moolenaar enddef 106463ce4849SBram Moolenaar 106563ce4849SBram Moolenaar def CallGoneSoon() 106663ce4849SBram Moolenaar GoneSoon() 106763ce4849SBram Moolenaar enddef 106863ce4849SBram Moolenaar 106963ce4849SBram Moolenaar delfunc GoneSoon 107063ce4849SBram Moolenaar CallGoneSoon() 107163ce4849SBram Moolenaar END 107263ce4849SBram Moolenaar writefile(lines, 'XToDelFunc') 107363ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 107463ce4849SBram Moolenaar assert_fails('so XToDelFunc', 'E933') 107563ce4849SBram Moolenaar 107663ce4849SBram Moolenaar delete('XToDelFunc') 107763ce4849SBram Moolenaarenddef 107863ce4849SBram Moolenaar 1079ad39c094SBram Moolenaardef Test_execute_cmd() 1080ad39c094SBram Moolenaar new 1081ad39c094SBram Moolenaar setline(1, 'default') 1082ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1083ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1084ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1085ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1086ad39c094SBram Moolenaar execute cmd1 cmd2 1087ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1088ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1089ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1090ad39c094SBram Moolenaar let cmd_first = 'call ' 1091ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1092ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1093ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1094ad39c094SBram Moolenaar bwipe! 1095ad39c094SBram Moolenaarenddef 1096ad39c094SBram Moolenaar 1097ad39c094SBram Moolenaardef Test_echo_cmd() 1098ad39c094SBram Moolenaar echo 'something' 1099ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1100ad39c094SBram Moolenaar 1101ad39c094SBram Moolenaar let str1 = 'some' 1102ad39c094SBram Moolenaar let str2 = 'more' 1103ad39c094SBram Moolenaar echo str1 str2 1104ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1105ad39c094SBram Moolenaarenddef 1106ad39c094SBram Moolenaar 110741fe0617SBram Moolenaardef Test_for_outside_of_function() 110841fe0617SBram Moolenaar let lines =<< trim END 110941fe0617SBram Moolenaar vim9script 111041fe0617SBram Moolenaar new 111141fe0617SBram Moolenaar for var in range(0, 3) 111241fe0617SBram Moolenaar append(line('$'), var) 111341fe0617SBram Moolenaar endfor 111441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 111541fe0617SBram Moolenaar bwipe! 111641fe0617SBram Moolenaar END 111741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 111841fe0617SBram Moolenaar source Xvim9for.vim 111941fe0617SBram Moolenaar delete('Xvim9for.vim') 112041fe0617SBram Moolenaarenddef 11218a7d6542SBram Moolenaar 1122*e8c4abbbSBram Moolenaardef Test_for_loop() 1123*e8c4abbbSBram Moolenaar let result = '' 1124*e8c4abbbSBram Moolenaar for cnt in range(7) 1125*e8c4abbbSBram Moolenaar if cnt == 4 1126*e8c4abbbSBram Moolenaar break 1127*e8c4abbbSBram Moolenaar endif 1128*e8c4abbbSBram Moolenaar if cnt == 2 1129*e8c4abbbSBram Moolenaar continue 1130*e8c4abbbSBram Moolenaar endif 1131*e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1132*e8c4abbbSBram Moolenaar endfor 1133*e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 1134*e8c4abbbSBram Moolenaarenddef 1135*e8c4abbbSBram Moolenaar 1136*e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1137*e8c4abbbSBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 1138*e8c4abbbSBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 1139*e8c4abbbSBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1140*e8c4abbbSBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 1141*e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 1142*e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in xxx'], 'E1001:') 1143*e8c4abbbSBram Moolenaar call CheckDefFailure(['endfor'], 'E588:') 1144*e8c4abbbSBram Moolenaarenddef 1145*e8c4abbbSBram Moolenaar 1146d0df1aacSBram Moolenaardef Test_while_loop() 1147d0df1aacSBram Moolenaar let result = '' 1148d0df1aacSBram Moolenaar let cnt = 0 1149d0df1aacSBram Moolenaar while cnt < 555 1150d0df1aacSBram Moolenaar if cnt == 3 1151d0df1aacSBram Moolenaar break 1152d0df1aacSBram Moolenaar endif 1153d0df1aacSBram Moolenaar cnt += 1 1154d0df1aacSBram Moolenaar if cnt == 2 1155d0df1aacSBram Moolenaar continue 1156d0df1aacSBram Moolenaar endif 1157d0df1aacSBram Moolenaar result ..= cnt .. '_' 1158d0df1aacSBram Moolenaar endwhile 1159d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1160d0df1aacSBram Moolenaarenddef 1161d0df1aacSBram Moolenaar 1162*e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1163*e8c4abbbSBram Moolenaar call CheckDefFailure(['while xxx'], 'E1001:') 1164*e8c4abbbSBram Moolenaar call CheckDefFailure(['endwhile'], 'E588:') 1165*e8c4abbbSBram Moolenaar call CheckDefFailure(['continue'], 'E586:') 1166*e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'continue'], 'E586:') 1167*e8c4abbbSBram Moolenaar call CheckDefFailure(['break'], 'E587:') 1168*e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'break'], 'E587:') 1169bd5da371SBram Moolenaarenddef 1170bd5da371SBram Moolenaar 11719645e2d9SBram Moolenaardef Test_interrupt_loop() 117297acfc78SBram Moolenaar let caught = false 11739645e2d9SBram Moolenaar let x = 0 117497acfc78SBram Moolenaar try 11759645e2d9SBram Moolenaar while 1 11769645e2d9SBram Moolenaar x += 1 11779645e2d9SBram Moolenaar if x == 100 11789645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 11799645e2d9SBram Moolenaar endif 11809645e2d9SBram Moolenaar endwhile 118197acfc78SBram Moolenaar catch 118297acfc78SBram Moolenaar caught = true 118397acfc78SBram Moolenaar assert_equal(100, x) 118497acfc78SBram Moolenaar endtry 118597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 11869645e2d9SBram Moolenaarenddef 118720431c9dSBram Moolenaar 1188d0df1aacSBram Moolenaardef Test_substitute_cmd() 1189d0df1aacSBram Moolenaar new 1190d0df1aacSBram Moolenaar setline(1, 'something') 1191d0df1aacSBram Moolenaar :substitute(some(other( 1192d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1193d0df1aacSBram Moolenaar bwipe! 1194d0df1aacSBram Moolenaar 1195d0df1aacSBram Moolenaar " also when the context is Vim9 script 1196d0df1aacSBram Moolenaar let lines =<< trim END 1197d0df1aacSBram Moolenaar vim9script 1198d0df1aacSBram Moolenaar new 1199d0df1aacSBram Moolenaar setline(1, 'something') 1200d0df1aacSBram Moolenaar :substitute(some(other( 1201d0df1aacSBram Moolenaar assert_equal('otherthing', getline(1)) 1202d0df1aacSBram Moolenaar bwipe! 1203d0df1aacSBram Moolenaar END 1204d0df1aacSBram Moolenaar writefile(lines, 'Xvim9lines') 1205d0df1aacSBram Moolenaar source Xvim9lines 1206d0df1aacSBram Moolenaar 1207d0df1aacSBram Moolenaar delete('Xvim9lines') 1208d0df1aacSBram Moolenaarenddef 1209d0df1aacSBram Moolenaar 121020431c9dSBram Moolenaardef Test_redef_failure() 121120431c9dSBram Moolenaar call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef') 121220431c9dSBram Moolenaar so Xdef 121320431c9dSBram Moolenaar call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef') 121420431c9dSBram Moolenaar so Xdef 121520431c9dSBram Moolenaar call writefile(['def! Func0(): string', 'enddef'], 'Xdef') 121620431c9dSBram Moolenaar call assert_fails('so Xdef', 'E1027:') 121720431c9dSBram Moolenaar call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef') 121820431c9dSBram Moolenaar so Xdef 121920431c9dSBram Moolenaar call delete('Xdef') 122020431c9dSBram Moolenaar 122120431c9dSBram Moolenaar call assert_equal(0, Func0()) 122220431c9dSBram Moolenaar call assert_equal('Func1', Func1()) 122320431c9dSBram Moolenaar call assert_equal('Func2', Func2()) 122420431c9dSBram Moolenaar 122520431c9dSBram Moolenaar delfunc! Func0 122620431c9dSBram Moolenaar delfunc! Func1 122720431c9dSBram Moolenaar delfunc! Func2 122820431c9dSBram Moolenaarenddef 122920431c9dSBram Moolenaar 12307d941ee0SBram Moolenaar" Test for internal functions returning different types 12317d941ee0SBram Moolenaarfunc Test_InternalFuncRetType() 12327d941ee0SBram Moolenaar let lines =<< trim END 12337d941ee0SBram Moolenaar def RetFloat(): float 12347d941ee0SBram Moolenaar return ceil(1.456) 12357d941ee0SBram Moolenaar enddef 12367d941ee0SBram Moolenaar 12377d941ee0SBram Moolenaar def RetListAny(): list<any> 12387d941ee0SBram Moolenaar return items({'k' : 'v'}) 12397d941ee0SBram Moolenaar enddef 12407d941ee0SBram Moolenaar 12417d941ee0SBram Moolenaar def RetListString(): list<string> 12427d941ee0SBram Moolenaar return split('a:b:c', ':') 12437d941ee0SBram Moolenaar enddef 12447d941ee0SBram Moolenaar 12457d941ee0SBram Moolenaar def RetListDictAny(): list<dict<any>> 12467d941ee0SBram Moolenaar return getbufinfo() 12477d941ee0SBram Moolenaar enddef 12487d941ee0SBram Moolenaar 12497d941ee0SBram Moolenaar def RetDictNumber(): dict<number> 12507d941ee0SBram Moolenaar return wordcount() 12517d941ee0SBram Moolenaar enddef 12527d941ee0SBram Moolenaar 12537d941ee0SBram Moolenaar def RetDictString(): dict<string> 12547d941ee0SBram Moolenaar return environ() 12557d941ee0SBram Moolenaar enddef 12567d941ee0SBram Moolenaar END 12577d941ee0SBram Moolenaar call writefile(lines, 'Xscript') 12587d941ee0SBram Moolenaar source Xscript 12597d941ee0SBram Moolenaar 12607d941ee0SBram Moolenaar call assert_equal(2.0, RetFloat()) 12617d941ee0SBram Moolenaar call assert_equal([['k', 'v']], RetListAny()) 12627d941ee0SBram Moolenaar call assert_equal(['a', 'b', 'c'], RetListString()) 12637d941ee0SBram Moolenaar call assert_notequal([], RetListDictAny()) 12647d941ee0SBram Moolenaar call assert_notequal({}, RetDictNumber()) 12657d941ee0SBram Moolenaar call assert_notequal({}, RetDictString()) 12667d941ee0SBram Moolenaar call delete('Xscript') 12677d941ee0SBram Moolenaarendfunc 12687d941ee0SBram Moolenaar 12697d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions 12707d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error() 12717d941ee0SBram Moolenaar let l =<< trim END 12727d941ee0SBram Moolenaar def! FArgErr(): float 12737d941ee0SBram Moolenaar return ceil(1.1, 2) 12747d941ee0SBram Moolenaar enddef 12757d941ee0SBram Moolenaar END 12767d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12777d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E118:') 12787d941ee0SBram Moolenaar let l =<< trim END 12797d941ee0SBram Moolenaar def! FArgErr(): float 12807d941ee0SBram Moolenaar return ceil() 12817d941ee0SBram Moolenaar enddef 12827d941ee0SBram Moolenaar END 12837d941ee0SBram Moolenaar call writefile(l, 'Xinvalidarg') 12847d941ee0SBram Moolenaar call assert_fails('so Xinvalidarg', 'E119:') 12857d941ee0SBram Moolenaar call delete('Xinvalidarg') 12867d941ee0SBram Moolenaarendfunc 12877d941ee0SBram Moolenaar 12888a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1289