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 246e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 256e587dcbSBram Moolenaarlet s:addToMe = 111 26401d9ffbSBram Moolenaarlet g:existing = 'yes' 27a8c17704SBram Moolenaarlet g:inc_counter = 1 28a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 296e587dcbSBram Moolenaar 308a7d6542SBram Moolenaardef Test_assignment() 318a7d6542SBram Moolenaar let bool1: bool = true 328a7d6542SBram Moolenaar assert_equal(v:true, bool1) 338a7d6542SBram Moolenaar let bool2: bool = false 348a7d6542SBram Moolenaar assert_equal(v:false, bool2) 358a7d6542SBram Moolenaar 360c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 378a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 380c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 390c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 400c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 418a7d6542SBram Moolenaar 42436472f5SBram Moolenaar let listS: list<string> = [] 43436472f5SBram Moolenaar let listN: list<number> = [] 448a7d6542SBram Moolenaar 450c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 468a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 470c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 480c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 490c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 50b283a8a6SBram Moolenaar 519be61bbbSBram Moolenaar let a: number = 6 529be61bbbSBram Moolenaar assert_equal(6, a) 539be61bbbSBram Moolenaar 5442a480bfSBram Moolenaar if has('channel') 5542a480bfSBram Moolenaar let chan1: channel 56fbdd08edSBram Moolenaar let job1: job 57f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 5842a480bfSBram Moolenaar endif 59fbdd08edSBram Moolenaar if has('float') 60fbdd08edSBram Moolenaar let float1: float = 3.4 61fbdd08edSBram Moolenaar endif 62*5deeb3f1SBram Moolenaar let Funky1: func 63*5deeb3f1SBram Moolenaar let Funky2: func = function('len') 64*5deeb3f1SBram Moolenaar let Party2: func = funcref('Test_syntax') 6542a480bfSBram Moolenaar 6661a6d4e4SBram Moolenaar " type becomes list<any> 6761a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 685381c7a1SBram Moolenaar " type becomes dict<any> 695381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7061a6d4e4SBram Moolenaar 71401d9ffbSBram Moolenaar g:newvar = 'new' 72401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 73401d9ffbSBram Moolenaar 74401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 75401d9ffbSBram Moolenaar g:existing = 'no' 76401d9ffbSBram Moolenaar assert_equal('no', g:existing) 77401d9ffbSBram Moolenaar 78b283a8a6SBram Moolenaar v:char = 'abc' 796e587dcbSBram Moolenaar assert_equal('abc', v:char) 80b283a8a6SBram Moolenaar 81b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 826e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 83b283a8a6SBram Moolenaar $ENVVAR = '' 846e587dcbSBram Moolenaar 85fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 86fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 87fd1823e0SBram Moolenaar s:addToMe += 222 88fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 890bbf722aSBram Moolenaar s:newVar = 'new' 900bbf722aSBram Moolenaar assert_equal('new', s:newVar) 91a8c17704SBram Moolenaar 92a8c17704SBram Moolenaar set ts=7 93a8c17704SBram Moolenaar &ts += 1 94a8c17704SBram Moolenaar assert_equal(8, &ts) 9580c34ca3SBram Moolenaar &ts -= 3 9680c34ca3SBram Moolenaar assert_equal(5, &ts) 9780c34ca3SBram Moolenaar &ts *= 2 9880c34ca3SBram Moolenaar assert_equal(10, &ts) 9980c34ca3SBram Moolenaar &ts /= 3 10080c34ca3SBram Moolenaar assert_equal(3, &ts) 10180c34ca3SBram Moolenaar set ts=10 10280c34ca3SBram Moolenaar &ts %= 4 10380c34ca3SBram Moolenaar assert_equal(2, &ts) 104a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 105a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 106a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 107585fea7bSBram Moolenaar " test freeing ISN_STOREOPT 108585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 10980c34ca3SBram Moolenaar &ts = 8 110a8c17704SBram Moolenaar 111a8c17704SBram Moolenaar g:inc_counter += 1 112a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 113a8c17704SBram Moolenaar 114a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 115a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 116a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 117a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 118a8c17704SBram Moolenaar 119a8c17704SBram Moolenaar @a = 'areg' 120a8c17704SBram Moolenaar @a ..= 'add' 121a8c17704SBram Moolenaar assert_equal('aregadd', @a) 122a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 123a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 124e69f6d04SBram Moolenaar 125e69f6d04SBram Moolenaar v:errmsg = 'none' 126e69f6d04SBram Moolenaar v:errmsg ..= 'again' 127e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 128e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 129e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 130*5deeb3f1SBram Moolenaarenddef 131*5deeb3f1SBram Moolenaar 132*5deeb3f1SBram Moolenaardef Test_assignment_default() 133e69f6d04SBram Moolenaar 134e69f6d04SBram Moolenaar " Test default values. 135e69f6d04SBram Moolenaar let thebool: bool 136e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 137e69f6d04SBram Moolenaar 138e69f6d04SBram Moolenaar let thenumber: number 139e69f6d04SBram Moolenaar assert_equal(0, thenumber) 140e69f6d04SBram Moolenaar 141e69f6d04SBram Moolenaar if has('float') 142e69f6d04SBram Moolenaar let thefloat: float 143e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 144e69f6d04SBram Moolenaar endif 145e69f6d04SBram Moolenaar 146e69f6d04SBram Moolenaar let thestring: string 147e69f6d04SBram Moolenaar assert_equal('', thestring) 148e69f6d04SBram Moolenaar 149e69f6d04SBram Moolenaar let theblob: blob 150e69f6d04SBram Moolenaar assert_equal(0z, theblob) 151e69f6d04SBram Moolenaar 152*5deeb3f1SBram Moolenaar let Thefunc: func 153*5deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 154e69f6d04SBram Moolenaar 155e69f6d04SBram Moolenaar let thelist: list<any> 156e69f6d04SBram Moolenaar assert_equal([], thelist) 157e69f6d04SBram Moolenaar 158e69f6d04SBram Moolenaar let thedict: dict<any> 159e69f6d04SBram Moolenaar assert_equal({}, thedict) 160e69f6d04SBram Moolenaar 1612c869deeSBram Moolenaar if has('channel') 162e69f6d04SBram Moolenaar let thejob: job 163e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 164e69f6d04SBram Moolenaar 165e69f6d04SBram Moolenaar let thechannel: channel 166e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 1672c869deeSBram Moolenaar endif 168585fea7bSBram Moolenaar 169585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 170585fea7bSBram Moolenaar assert_equal(5678, nr) 1718a7d6542SBram Moolenaarenddef 1728a7d6542SBram Moolenaar 1738a7d6542SBram Moolenaarfunc Test_assignment_failure() 1748a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1758a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1768a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1778a7d6542SBram Moolenaar 1788a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1798a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1808a7d6542SBram Moolenaar 1819be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1829be61bbbSBram Moolenaar 183e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1849be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1859be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1869be61bbbSBram Moolenaar 1879be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1889be61bbbSBram Moolenaar 1899be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1909be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1919be61bbbSBram Moolenaar 1929be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1939be61bbbSBram Moolenaar 1949be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 1959be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 1969be61bbbSBram Moolenaar 19733fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 19833fa29cfSBram Moolenaar 1998a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2008a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2018a7d6542SBram Moolenaar 2028a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2038a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2048a7d6542SBram Moolenaar 2058a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2068a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 20742a480bfSBram Moolenaar 208d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 20942a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 210599c89c8SBram Moolenaarendfunc 211599c89c8SBram Moolenaar 212599c89c8SBram Moolenaarfunc Test_wrong_type() 213599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 214599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 215599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 216599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 217599c89c8SBram Moolenaar 218599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 219599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22042a480bfSBram Moolenaar 22142a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 22242a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 22342a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 22442a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 22542a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 22642a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 22742a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 22842a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2328a7d6542SBram Moolenaarendfunc 2338a7d6542SBram Moolenaar 2348a7d6542SBram Moolenaarfunc Test_const() 2358a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2368a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2378a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2389be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2398a7d6542SBram Moolenaarendfunc 2408a7d6542SBram Moolenaar 2418a7d6542SBram Moolenaardef Test_block() 2428a7d6542SBram Moolenaar let outer = 1 2438a7d6542SBram Moolenaar { 2448a7d6542SBram Moolenaar let inner = 2 2458a7d6542SBram Moolenaar assert_equal(1, outer) 2468a7d6542SBram Moolenaar assert_equal(2, inner) 2478a7d6542SBram Moolenaar } 2488a7d6542SBram Moolenaar assert_equal(1, outer) 2498a7d6542SBram Moolenaarenddef 2508a7d6542SBram Moolenaar 2518a7d6542SBram Moolenaarfunc Test_block_failure() 2528a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 253585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 254585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 2558a7d6542SBram Moolenaarendfunc 2568a7d6542SBram Moolenaar 257585fea7bSBram Moolenaardef Test_cmd_modifier() 258585fea7bSBram Moolenaar tab echo '0' 259585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 260585fea7bSBram Moolenaarenddef 261585fea7bSBram Moolenaar 262585fea7bSBram Moolenaar 2638a7d6542SBram Moolenaardef Test_try_catch() 2648a7d6542SBram Moolenaar let l = [] 2658a7d6542SBram Moolenaar try 2668a7d6542SBram Moolenaar add(l, '1') 2678a7d6542SBram Moolenaar throw 'wrong' 2688a7d6542SBram Moolenaar add(l, '2') 2698a7d6542SBram Moolenaar catch 2708a7d6542SBram Moolenaar add(l, v:exception) 2718a7d6542SBram Moolenaar finally 2728a7d6542SBram Moolenaar add(l, '3') 2738a7d6542SBram Moolenaar endtry 2748a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2758a7d6542SBram Moolenaarenddef 2768a7d6542SBram Moolenaar 277257cc5eeSBram Moolenaardef ThrowFromDef() 278257cc5eeSBram Moolenaar throw 'getout' 279257cc5eeSBram Moolenaarenddef 280257cc5eeSBram Moolenaar 281257cc5eeSBram Moolenaarfunc CatchInFunc() 282257cc5eeSBram Moolenaar try 283257cc5eeSBram Moolenaar call ThrowFromDef() 284257cc5eeSBram Moolenaar catch 285257cc5eeSBram Moolenaar let g:thrown_func = v:exception 286257cc5eeSBram Moolenaar endtry 287257cc5eeSBram Moolenaarendfunc 288257cc5eeSBram Moolenaar 289257cc5eeSBram Moolenaardef CatchInDef() 290257cc5eeSBram Moolenaar try 291257cc5eeSBram Moolenaar ThrowFromDef() 292257cc5eeSBram Moolenaar catch 293257cc5eeSBram Moolenaar g:thrown_def = v:exception 294257cc5eeSBram Moolenaar endtry 295257cc5eeSBram Moolenaarenddef 296257cc5eeSBram Moolenaar 297f575adffSBram Moolenaardef ReturnFinally(): string 298f575adffSBram Moolenaar try 299f575adffSBram Moolenaar return 'intry' 300f575adffSBram Moolenaar finally 301f575adffSBram Moolenaar g:in_finally = 'finally' 302f575adffSBram Moolenaar endtry 303f575adffSBram Moolenaar return 'end' 304f575adffSBram Moolenaarenddef 305f575adffSBram Moolenaar 306257cc5eeSBram Moolenaardef Test_try_catch_nested() 307257cc5eeSBram Moolenaar CatchInFunc() 308257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 309257cc5eeSBram Moolenaar 310257cc5eeSBram Moolenaar CatchInDef() 311257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 312f575adffSBram Moolenaar 313f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 314f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 315f575adffSBram Moolenaarenddef 316f575adffSBram Moolenaar 317f575adffSBram Moolenaardef Test_try_catch_match() 318f575adffSBram Moolenaar let seq = 'a' 319f575adffSBram Moolenaar try 320f575adffSBram Moolenaar throw 'something' 321f575adffSBram Moolenaar catch /nothing/ 322f575adffSBram Moolenaar seq ..= 'x' 323f575adffSBram Moolenaar catch /some/ 324f575adffSBram Moolenaar seq ..= 'b' 325f575adffSBram Moolenaar catch /asdf/ 326f575adffSBram Moolenaar seq ..= 'x' 327e8c4abbbSBram Moolenaar catch ?a\?sdf? 328e8c4abbbSBram Moolenaar seq ..= 'y' 329f575adffSBram Moolenaar finally 330f575adffSBram Moolenaar seq ..= 'c' 331f575adffSBram Moolenaar endtry 332f575adffSBram Moolenaar assert_equal('abc', seq) 333257cc5eeSBram Moolenaarenddef 334257cc5eeSBram Moolenaar 335e8c4abbbSBram Moolenaardef Test_try_catch_fails() 336e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 337e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 338e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 339585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 340585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 341585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 342585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 343585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 344585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 345585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 346585fea7bSBram Moolenaar 347585fea7bSBram Moolenaar call CheckDefFailure(['throw'], 'E471:') 348585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 349e8c4abbbSBram Moolenaarenddef 350e8c4abbbSBram Moolenaar 3518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3528a7d6542SBram Moolenaar vim9script 3538a7d6542SBram Moolenaar let name: string = 'bob' 3548a7d6542SBram Moolenaar def Concat(arg: string): string 3558a7d6542SBram Moolenaar return name .. arg 3568a7d6542SBram Moolenaar enddef 3578a7d6542SBram Moolenaar let g:result = Concat('bie') 3588a7d6542SBram Moolenaar let g:localname = name 3598a7d6542SBram Moolenaar 3608a7d6542SBram Moolenaar export const CONST = 1234 3618a7d6542SBram Moolenaar export let exported = 9876 3626e587dcbSBram Moolenaar export let exp_name = 'John' 3638a7d6542SBram Moolenaar export def Exported(): string 3648a7d6542SBram Moolenaar return 'Exported' 3658a7d6542SBram Moolenaar enddef 3668a7d6542SBram MoolenaarEND 3678a7d6542SBram Moolenaar 3685269bd2aSBram Moolenaardef Test_vim9_import_export() 3698a7d6542SBram Moolenaar let import_script_lines =<< trim END 3708a7d6542SBram Moolenaar vim9script 3718a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3728a7d6542SBram Moolenaar g:imported = exported 3736e587dcbSBram Moolenaar exported += 3 3746e587dcbSBram Moolenaar g:imported_added = exported 3758a7d6542SBram Moolenaar g:imported_func = Exported() 3766e587dcbSBram Moolenaar 3776e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3786e587dcbSBram Moolenaar g:imported_name = exp_name 3796e587dcbSBram Moolenaar exp_name ..= ' Doe' 3806e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3815381c7a1SBram Moolenaar g:imported_later = exported 3828a7d6542SBram Moolenaar END 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3858a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3868a7d6542SBram Moolenaar 3878a7d6542SBram Moolenaar source Ximport.vim 3888a7d6542SBram Moolenaar 3898a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3908a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3918a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3926e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 3935381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 3948a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 3956e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 3966e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 3978a7d6542SBram Moolenaar assert_false(exists('g:name')) 3988a7d6542SBram Moolenaar 3998a7d6542SBram Moolenaar unlet g:result 4008a7d6542SBram Moolenaar unlet g:localname 4018a7d6542SBram Moolenaar unlet g:imported 4026e587dcbSBram Moolenaar unlet g:imported_added 4035381c7a1SBram Moolenaar unlet g:imported_later 4048a7d6542SBram Moolenaar unlet g:imported_func 4056e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4068a7d6542SBram Moolenaar delete('Ximport.vim') 407f2d5c240SBram Moolenaar 4085381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4095381c7a1SBram Moolenaar vim9script 4105381c7a1SBram Moolenaar def ImportInDef() 4115381c7a1SBram Moolenaar import exported from './Xexport.vim' 4125381c7a1SBram Moolenaar g:imported = exported 4135381c7a1SBram Moolenaar exported += 7 4145381c7a1SBram Moolenaar g:imported_added = exported 4155381c7a1SBram Moolenaar enddef 4165381c7a1SBram Moolenaar ImportInDef() 4175381c7a1SBram Moolenaar END 4185381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4195381c7a1SBram Moolenaar source Ximport2.vim 4205381c7a1SBram Moolenaar " TODO: this should be 9879 4215381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4225381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4235381c7a1SBram Moolenaar unlet g:imported 4245381c7a1SBram Moolenaar unlet g:imported_added 4255381c7a1SBram Moolenaar delete('Ximport2.vim') 4265381c7a1SBram Moolenaar 427f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 428f2d5c240SBram Moolenaar vim9script 429f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 430f2d5c240SBram Moolenaar def UseExport() 431f2d5c240SBram Moolenaar g:imported = Export.exported 432f2d5c240SBram Moolenaar enddef 433f2d5c240SBram Moolenaar UseExport() 434f2d5c240SBram Moolenaar END 435f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 436f2d5c240SBram Moolenaar source Ximport.vim 4375381c7a1SBram Moolenaar assert_equal(9883, g:imported) 438f2d5c240SBram Moolenaar 439599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 440599c89c8SBram Moolenaar vim9script 441599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 442599c89c8SBram Moolenaar def Func() 443599c89c8SBram Moolenaar let dummy = 1 444599c89c8SBram Moolenaar let imported = Export + dummy 445599c89c8SBram Moolenaar enddef 446599c89c8SBram Moolenaar END 447599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 448599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 449599c89c8SBram Moolenaar 450599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 451599c89c8SBram Moolenaar vim9script 452599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 453599c89c8SBram Moolenaar def Func() 454599c89c8SBram Moolenaar let imported = Export . exported 455599c89c8SBram Moolenaar enddef 456599c89c8SBram Moolenaar END 457599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 458599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 459599c89c8SBram Moolenaar 460599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 461599c89c8SBram Moolenaar vim9script 462599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 463599c89c8SBram Moolenaar def Func() 464599c89c8SBram Moolenaar let imported = Export. 465599c89c8SBram Moolenaar enddef 466599c89c8SBram Moolenaar END 467599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 468599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 469599c89c8SBram Moolenaar 470f2d5c240SBram Moolenaar let import_star_lines =<< trim END 471f2d5c240SBram Moolenaar vim9script 472f2d5c240SBram Moolenaar import * from './Xexport.vim' 473f2d5c240SBram Moolenaar g:imported = exported 474f2d5c240SBram Moolenaar END 475f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 476f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 477f2d5c240SBram Moolenaar 478fa29c8abSBram Moolenaar " try to import something that exists but is not exported 479fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 480fa29c8abSBram Moolenaar vim9script 481fa29c8abSBram Moolenaar import name from './Xexport.vim' 482fa29c8abSBram Moolenaar END 483fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 484fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 485fa29c8abSBram Moolenaar 4865269bd2aSBram Moolenaar " try to import something that is already defined 4875269bd2aSBram Moolenaar let import_already_defined =<< trim END 4885269bd2aSBram Moolenaar vim9script 4895269bd2aSBram Moolenaar let exported = 'something' 4905269bd2aSBram Moolenaar import exported from './Xexport.vim' 4915269bd2aSBram Moolenaar END 4925269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 4935269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 4945269bd2aSBram Moolenaar 4955269bd2aSBram Moolenaar " try to import something that is already defined 4965269bd2aSBram Moolenaar import_already_defined =<< trim END 4975269bd2aSBram Moolenaar vim9script 4985269bd2aSBram Moolenaar let exported = 'something' 4995269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5005269bd2aSBram Moolenaar END 5015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5025269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5035269bd2aSBram Moolenaar 5045269bd2aSBram Moolenaar " try to import something that is already defined 5055269bd2aSBram Moolenaar import_already_defined =<< trim END 5065269bd2aSBram Moolenaar vim9script 5075269bd2aSBram Moolenaar let exported = 'something' 5085269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5095269bd2aSBram Moolenaar END 5105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5115269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5125269bd2aSBram Moolenaar 513fa29c8abSBram Moolenaar " import a very long name, requires making a copy 514fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 515fa29c8abSBram Moolenaar vim9script 516fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 517fa29c8abSBram Moolenaar END 518fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 519fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 520fa29c8abSBram Moolenaar 521fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 522fa29c8abSBram Moolenaar vim9script 523fa29c8abSBram Moolenaar import name './Xexport.vim' 524fa29c8abSBram Moolenaar END 525fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 526fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 527fa29c8abSBram Moolenaar 528fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 529fa29c8abSBram Moolenaar vim9script 530fa29c8abSBram Moolenaar import name from Xexport.vim 531fa29c8abSBram Moolenaar END 532fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 533fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 534fa29c8abSBram Moolenaar 535fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 536fa29c8abSBram Moolenaar vim9script 537fa29c8abSBram Moolenaar import name from './XnoExport.vim' 538fa29c8abSBram Moolenaar END 539fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 540fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 541fa29c8abSBram Moolenaar 542fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 543fa29c8abSBram Moolenaar vim9script 544fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 545fa29c8abSBram Moolenaar END 5465269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5475269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 548fa29c8abSBram Moolenaar 549f2d5c240SBram Moolenaar delete('Ximport.vim') 5505269bd2aSBram Moolenaar delete('Ximport3.vim') 5518a7d6542SBram Moolenaar delete('Xexport.vim') 5528a7d6542SBram Moolenaar 553750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 554750802b5SBram Moolenaar set cpo&vi 555750802b5SBram Moolenaar let cpo_before = &cpo 556750802b5SBram Moolenaar let lines =<< trim END 557750802b5SBram Moolenaar vim9script 558750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 559750802b5SBram Moolenaar END 560750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 561750802b5SBram Moolenaar source Xvim9_script 562750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 563750802b5SBram Moolenaar set cpo&vim 564750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 565750802b5SBram Moolenaar delete('Xvim9_script') 566750802b5SBram Moolenaarenddef 567750802b5SBram Moolenaar 568750802b5SBram Moolenaardef Test_vim9script_fails() 5698a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 5708a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 571750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 572f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 573750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 574750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 575750802b5SBram Moolenaar 576750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 577750802b5SBram Moolenaar assert_fails('export something', 'E1042') 5788a7d6542SBram Moolenaarenddef 5798a7d6542SBram Moolenaar 5808a7d6542SBram Moolenaardef Test_vim9script_reload() 5818a7d6542SBram Moolenaar let lines =<< trim END 5828a7d6542SBram Moolenaar vim9script 5838a7d6542SBram Moolenaar const var = '' 5848a7d6542SBram Moolenaar let valone = 1234 5858a7d6542SBram Moolenaar def MyFunc(arg: string) 5868a7d6542SBram Moolenaar valone = 5678 5878a7d6542SBram Moolenaar enddef 5888a7d6542SBram Moolenaar END 5898a7d6542SBram Moolenaar let morelines =<< trim END 5908a7d6542SBram Moolenaar let valtwo = 222 5918a7d6542SBram Moolenaar export def GetValtwo(): number 5928a7d6542SBram Moolenaar return valtwo 5938a7d6542SBram Moolenaar enddef 5948a7d6542SBram Moolenaar END 5958a7d6542SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 5968a7d6542SBram Moolenaar source Xreload.vim 5978a7d6542SBram Moolenaar source Xreload.vim 5988a7d6542SBram Moolenaar source Xreload.vim 5998a7d6542SBram Moolenaar 6008a7d6542SBram Moolenaar let testlines =<< trim END 6018a7d6542SBram Moolenaar vim9script 6028a7d6542SBram Moolenaar def TheFunc() 6038a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 6048a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 6058a7d6542SBram Moolenaar enddef 6068a7d6542SBram Moolenaar TheFunc() 6078a7d6542SBram Moolenaar END 6088a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 6098a7d6542SBram Moolenaar source Ximport.vim 6108a7d6542SBram Moolenaar 6118a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 6128a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 6138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6148a7d6542SBram Moolenaar source Xreload.vim 6158a7d6542SBram Moolenaar source Ximport.vim 6168a7d6542SBram Moolenaar 6178a7d6542SBram Moolenaar " cannot declare a var twice 6188a7d6542SBram Moolenaar lines =<< trim END 6198a7d6542SBram Moolenaar vim9script 6208a7d6542SBram Moolenaar let valone = 1234 6218a7d6542SBram Moolenaar let valone = 5678 6228a7d6542SBram Moolenaar END 6238a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6248a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 6258a7d6542SBram Moolenaar 6268a7d6542SBram Moolenaar delete('Xreload.vim') 6278a7d6542SBram Moolenaar delete('Ximport.vim') 6288a7d6542SBram Moolenaarenddef 6298a7d6542SBram Moolenaar 6308a7d6542SBram Moolenaardef Test_import_absolute() 6318a7d6542SBram Moolenaar let import_lines = [ 6328a7d6542SBram Moolenaar \ 'vim9script', 6338a7d6542SBram Moolenaar \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 634b283a8a6SBram Moolenaar \ 'def UseExported()', 6358a7d6542SBram Moolenaar \ ' g:imported_abs = exported', 6364e12a5dfSBram Moolenaar \ ' exported = 8888', 6374e12a5dfSBram Moolenaar \ ' g:imported_after = exported', 638b283a8a6SBram Moolenaar \ 'enddef', 639b283a8a6SBram Moolenaar \ 'UseExported()', 6404e12a5dfSBram Moolenaar \ 'g:import_disassembled = execute("disass UseExported")', 6418a7d6542SBram Moolenaar \ ] 6428a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 6438a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 6448a7d6542SBram Moolenaar 6458a7d6542SBram Moolenaar source Ximport_abs.vim 6468a7d6542SBram Moolenaar 6478a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 6484e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 649b283a8a6SBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' 650b283a8a6SBram Moolenaar \ .. 'g:imported_abs = exported.*' 651b283a8a6SBram Moolenaar \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' 6524e12a5dfSBram Moolenaar \ .. '1 STOREG g:imported_abs.*' 6534e12a5dfSBram Moolenaar \ .. 'exported = 8888.*' 6544e12a5dfSBram Moolenaar \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*' 6554e12a5dfSBram Moolenaar \ .. 'g:imported_after = exported.*' 6564e12a5dfSBram Moolenaar \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' 6574e12a5dfSBram Moolenaar \ .. '5 STOREG g:imported_after.*' 6584e12a5dfSBram Moolenaar \, g:import_disassembled) 6598a7d6542SBram Moolenaar unlet g:imported_abs 6604e12a5dfSBram Moolenaar unlet g:import_disassembled 6618a7d6542SBram Moolenaar 6628a7d6542SBram Moolenaar delete('Ximport_abs.vim') 6638a7d6542SBram Moolenaar delete('Xexport_abs.vim') 6648a7d6542SBram Moolenaarenddef 6658a7d6542SBram Moolenaar 6668a7d6542SBram Moolenaardef Test_import_rtp() 6678a7d6542SBram Moolenaar let import_lines = [ 6688a7d6542SBram Moolenaar \ 'vim9script', 6698a7d6542SBram Moolenaar \ 'import exported from "Xexport_rtp.vim"', 6708a7d6542SBram Moolenaar \ 'g:imported_rtp = exported', 6718a7d6542SBram Moolenaar \ ] 6728a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 6738a7d6542SBram Moolenaar mkdir('import') 6748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 6758a7d6542SBram Moolenaar 6768a7d6542SBram Moolenaar let save_rtp = &rtp 6778a7d6542SBram Moolenaar &rtp = getcwd() 6788a7d6542SBram Moolenaar source Ximport_rtp.vim 6798a7d6542SBram Moolenaar &rtp = save_rtp 6808a7d6542SBram Moolenaar 6818a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 6828a7d6542SBram Moolenaar unlet g:imported_rtp 6838a7d6542SBram Moolenaar 6848a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 6858a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 6868a7d6542SBram Moolenaar delete('import', 'd') 6878a7d6542SBram Moolenaarenddef 6888a7d6542SBram Moolenaar 6898a7d6542SBram Moolenaardef Test_fixed_size_list() 6908a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 6918a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 6928a7d6542SBram Moolenaar l->remove(0) 6938a7d6542SBram Moolenaar l->add(5) 6948a7d6542SBram Moolenaar l->insert(99, 1) 6950f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 6968a7d6542SBram Moolenaarenddef 6978a7d6542SBram Moolenaar 698158906cfSBram Moolenaardef IfElse(what: number): string 699158906cfSBram Moolenaar let res = '' 700158906cfSBram Moolenaar if what == 1 701158906cfSBram Moolenaar res = "one" 702158906cfSBram Moolenaar elseif what == 2 703158906cfSBram Moolenaar res = "two" 704a259d8d3SBram Moolenaar else 705158906cfSBram Moolenaar res = "three" 706a259d8d3SBram Moolenaar endif 707158906cfSBram Moolenaar return res 708a259d8d3SBram Moolenaarenddef 709a259d8d3SBram Moolenaar 710158906cfSBram Moolenaardef Test_if_elseif_else() 711158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 712158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 713158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 7140f18b6d1SBram Moolenaarenddef 7150f18b6d1SBram Moolenaar 716e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 717e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 718e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 719e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 720e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 721585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 722e8c4abbbSBram Moolenaarenddef 723e8c4abbbSBram Moolenaar 7246d69bf60SBram Moolenaarlet g:bool_true = v:true 7256d69bf60SBram Moolenaarlet g:bool_false = v:false 7266d69bf60SBram Moolenaar 7276d69bf60SBram Moolenaardef Test_if_const_expr() 7286d69bf60SBram Moolenaar let res = false 7296d69bf60SBram Moolenaar if true ? true : false 7306d69bf60SBram Moolenaar res = true 7316d69bf60SBram Moolenaar endif 7326d69bf60SBram Moolenaar assert_equal(true, res) 7336d69bf60SBram Moolenaar 734585fea7bSBram Moolenaar g:glob = 2 735585fea7bSBram Moolenaar if false 736585fea7bSBram Moolenaar execute('let g:glob = 3') 737585fea7bSBram Moolenaar endif 738585fea7bSBram Moolenaar assert_equal(2, g:glob) 739585fea7bSBram Moolenaar if true 740585fea7bSBram Moolenaar execute('let g:glob = 3') 741585fea7bSBram Moolenaar endif 742585fea7bSBram Moolenaar assert_equal(3, g:glob) 743585fea7bSBram Moolenaar 7446d69bf60SBram Moolenaar res = false 7456d69bf60SBram Moolenaar if g:bool_true ? true : false 7466d69bf60SBram Moolenaar res = true 7476d69bf60SBram Moolenaar endif 7486d69bf60SBram Moolenaar assert_equal(true, res) 7496d69bf60SBram Moolenaar 7506d69bf60SBram Moolenaar res = false 7516d69bf60SBram Moolenaar if true ? g:bool_true : false 7526d69bf60SBram Moolenaar res = true 7536d69bf60SBram Moolenaar endif 7546d69bf60SBram Moolenaar assert_equal(true, res) 7556d69bf60SBram Moolenaar 7566d69bf60SBram Moolenaar res = false 7576d69bf60SBram Moolenaar if true ? true : g:bool_false 7586d69bf60SBram Moolenaar res = true 7596d69bf60SBram Moolenaar endif 7606d69bf60SBram Moolenaar assert_equal(true, res) 7616d69bf60SBram Moolenaar 7626d69bf60SBram Moolenaar res = false 7636d69bf60SBram Moolenaar if true ? false : true 7646d69bf60SBram Moolenaar res = true 7656d69bf60SBram Moolenaar endif 7666d69bf60SBram Moolenaar assert_equal(false, res) 7676d69bf60SBram Moolenaar 7686d69bf60SBram Moolenaar res = false 7696d69bf60SBram Moolenaar if false ? false : true 7706d69bf60SBram Moolenaar res = true 7716d69bf60SBram Moolenaar endif 7726d69bf60SBram Moolenaar assert_equal(true, res) 7736d69bf60SBram Moolenaar 7746d69bf60SBram Moolenaar res = false 7756d69bf60SBram Moolenaar if false ? true : false 7766d69bf60SBram Moolenaar res = true 7776d69bf60SBram Moolenaar endif 7786d69bf60SBram Moolenaar assert_equal(false, res) 7796d69bf60SBram Moolenaar 7806d69bf60SBram Moolenaar res = false 781e8c4abbbSBram Moolenaar if has('xyz') ? true : false 782e8c4abbbSBram Moolenaar res = true 783e8c4abbbSBram Moolenaar endif 784e8c4abbbSBram Moolenaar assert_equal(false, res) 785e8c4abbbSBram Moolenaar 786e8c4abbbSBram Moolenaar res = false 7876d69bf60SBram Moolenaar if true && true 7886d69bf60SBram Moolenaar res = true 7896d69bf60SBram Moolenaar endif 7906d69bf60SBram Moolenaar assert_equal(true, res) 7916d69bf60SBram Moolenaar 7926d69bf60SBram Moolenaar res = false 7936d69bf60SBram Moolenaar if true && false 7946d69bf60SBram Moolenaar res = true 7956d69bf60SBram Moolenaar endif 7966d69bf60SBram Moolenaar assert_equal(false, res) 7976d69bf60SBram Moolenaar 7986d69bf60SBram Moolenaar res = false 7996d69bf60SBram Moolenaar if g:bool_true && false 8006d69bf60SBram Moolenaar res = true 8016d69bf60SBram Moolenaar endif 8026d69bf60SBram Moolenaar assert_equal(false, res) 8036d69bf60SBram Moolenaar 8046d69bf60SBram Moolenaar res = false 8056d69bf60SBram Moolenaar if true && g:bool_false 8066d69bf60SBram Moolenaar res = true 8076d69bf60SBram Moolenaar endif 8086d69bf60SBram Moolenaar assert_equal(false, res) 8096d69bf60SBram Moolenaar 8106d69bf60SBram Moolenaar res = false 8116d69bf60SBram Moolenaar if false && false 8126d69bf60SBram Moolenaar res = true 8136d69bf60SBram Moolenaar endif 8146d69bf60SBram Moolenaar assert_equal(false, res) 8156d69bf60SBram Moolenaar 8166d69bf60SBram Moolenaar res = false 8176d69bf60SBram Moolenaar if true || false 8186d69bf60SBram Moolenaar res = true 8196d69bf60SBram Moolenaar endif 8206d69bf60SBram Moolenaar assert_equal(true, res) 8216d69bf60SBram Moolenaar 8226d69bf60SBram Moolenaar res = false 8236d69bf60SBram Moolenaar if g:bool_true || false 8246d69bf60SBram Moolenaar res = true 8256d69bf60SBram Moolenaar endif 8266d69bf60SBram Moolenaar assert_equal(true, res) 8276d69bf60SBram Moolenaar 8286d69bf60SBram Moolenaar res = false 8296d69bf60SBram Moolenaar if true || g:bool_false 8306d69bf60SBram Moolenaar res = true 8316d69bf60SBram Moolenaar endif 8326d69bf60SBram Moolenaar assert_equal(true, res) 8336d69bf60SBram Moolenaar 8346d69bf60SBram Moolenaar res = false 8356d69bf60SBram Moolenaar if false || false 8366d69bf60SBram Moolenaar res = true 8376d69bf60SBram Moolenaar endif 8386d69bf60SBram Moolenaar assert_equal(false, res) 83980c34ca3SBram Moolenaarenddef 8406d69bf60SBram Moolenaar 84180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 84280c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 84380c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 844e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 845e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 8466d69bf60SBram Moolenaarenddef 8476d69bf60SBram Moolenaar 848ad39c094SBram Moolenaardef Test_execute_cmd() 849ad39c094SBram Moolenaar new 850ad39c094SBram Moolenaar setline(1, 'default') 851ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 852ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 853ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 854ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 855ad39c094SBram Moolenaar execute cmd1 cmd2 856ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 857ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 858ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 859ad39c094SBram Moolenaar let cmd_first = 'call ' 860ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 861ad39c094SBram Moolenaar execute cmd_first .. cmd_last 862ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 863ad39c094SBram Moolenaar bwipe! 864585fea7bSBram Moolenaar 865585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 866ad39c094SBram Moolenaarenddef 867ad39c094SBram Moolenaar 868ad39c094SBram Moolenaardef Test_echo_cmd() 869585fea7bSBram Moolenaar echo 'some' 870585fea7bSBram Moolenaar echon 'thing' 871ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 872ad39c094SBram Moolenaar 873ad39c094SBram Moolenaar let str1 = 'some' 874ad39c094SBram Moolenaar let str2 = 'more' 875ad39c094SBram Moolenaar echo str1 str2 876ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 877ad39c094SBram Moolenaarenddef 878ad39c094SBram Moolenaar 87941fe0617SBram Moolenaardef Test_for_outside_of_function() 88041fe0617SBram Moolenaar let lines =<< trim END 88141fe0617SBram Moolenaar vim9script 88241fe0617SBram Moolenaar new 88341fe0617SBram Moolenaar for var in range(0, 3) 88441fe0617SBram Moolenaar append(line('$'), var) 88541fe0617SBram Moolenaar endfor 88641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 88741fe0617SBram Moolenaar bwipe! 88841fe0617SBram Moolenaar END 88941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 89041fe0617SBram Moolenaar source Xvim9for.vim 89141fe0617SBram Moolenaar delete('Xvim9for.vim') 89241fe0617SBram Moolenaarenddef 8938a7d6542SBram Moolenaar 894e8c4abbbSBram Moolenaardef Test_for_loop() 895e8c4abbbSBram Moolenaar let result = '' 896e8c4abbbSBram Moolenaar for cnt in range(7) 897e8c4abbbSBram Moolenaar if cnt == 4 898e8c4abbbSBram Moolenaar break 899e8c4abbbSBram Moolenaar endif 900e8c4abbbSBram Moolenaar if cnt == 2 901e8c4abbbSBram Moolenaar continue 902e8c4abbbSBram Moolenaar endif 903e8c4abbbSBram Moolenaar result ..= cnt .. '_' 904e8c4abbbSBram Moolenaar endfor 905e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 906e8c4abbbSBram Moolenaarenddef 907e8c4abbbSBram Moolenaar 908e8c4abbbSBram Moolenaardef Test_for_loop_fails() 909e8c4abbbSBram Moolenaar call CheckDefFailure(['for # in range(5)'], 'E690:') 910e8c4abbbSBram Moolenaar call CheckDefFailure(['for i In range(5)'], 'E690:') 911e8c4abbbSBram Moolenaar call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 912e8c4abbbSBram Moolenaar call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:') 913e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in "text"'], 'E1024:') 914e8c4abbbSBram Moolenaar call CheckDefFailure(['for i in xxx'], 'E1001:') 915e8c4abbbSBram Moolenaar call CheckDefFailure(['endfor'], 'E588:') 916585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 917e8c4abbbSBram Moolenaarenddef 918e8c4abbbSBram Moolenaar 919d0df1aacSBram Moolenaardef Test_while_loop() 920d0df1aacSBram Moolenaar let result = '' 921d0df1aacSBram Moolenaar let cnt = 0 922d0df1aacSBram Moolenaar while cnt < 555 923d0df1aacSBram Moolenaar if cnt == 3 924d0df1aacSBram Moolenaar break 925d0df1aacSBram Moolenaar endif 926d0df1aacSBram Moolenaar cnt += 1 927d0df1aacSBram Moolenaar if cnt == 2 928d0df1aacSBram Moolenaar continue 929d0df1aacSBram Moolenaar endif 930d0df1aacSBram Moolenaar result ..= cnt .. '_' 931d0df1aacSBram Moolenaar endwhile 932d0df1aacSBram Moolenaar assert_equal('1_3_', result) 933d0df1aacSBram Moolenaarenddef 934d0df1aacSBram Moolenaar 935e8c4abbbSBram Moolenaardef Test_while_loop_fails() 936e8c4abbbSBram Moolenaar call CheckDefFailure(['while xxx'], 'E1001:') 937e8c4abbbSBram Moolenaar call CheckDefFailure(['endwhile'], 'E588:') 938e8c4abbbSBram Moolenaar call CheckDefFailure(['continue'], 'E586:') 939e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'continue'], 'E586:') 940e8c4abbbSBram Moolenaar call CheckDefFailure(['break'], 'E587:') 941e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'break'], 'E587:') 942585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'echo 3'], 'E170:') 943bd5da371SBram Moolenaarenddef 944bd5da371SBram Moolenaar 9459645e2d9SBram Moolenaardef Test_interrupt_loop() 94697acfc78SBram Moolenaar let caught = false 9479645e2d9SBram Moolenaar let x = 0 94897acfc78SBram Moolenaar try 9499645e2d9SBram Moolenaar while 1 9509645e2d9SBram Moolenaar x += 1 9519645e2d9SBram Moolenaar if x == 100 9529645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 9539645e2d9SBram Moolenaar endif 9549645e2d9SBram Moolenaar endwhile 95597acfc78SBram Moolenaar catch 95697acfc78SBram Moolenaar caught = true 95797acfc78SBram Moolenaar assert_equal(100, x) 95897acfc78SBram Moolenaar endtry 95997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 9609645e2d9SBram Moolenaarenddef 96120431c9dSBram Moolenaar 9627d941ee0SBram Moolenaar 963585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 964585fea7bSBram Moolenaardef Test_substitute_cmd() 965585fea7bSBram Moolenaar new 966585fea7bSBram Moolenaar setline(1, 'something') 967585fea7bSBram Moolenaar :substitute(some(other( 968585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 969585fea7bSBram Moolenaar bwipe! 970585fea7bSBram Moolenaar 971585fea7bSBram Moolenaar " also when the context is Vim9 script 972585fea7bSBram Moolenaar let lines =<< trim END 973585fea7bSBram Moolenaar vim9script 974585fea7bSBram Moolenaar new 975585fea7bSBram Moolenaar setline(1, 'something') 976585fea7bSBram Moolenaar :substitute(some(other( 977585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 978585fea7bSBram Moolenaar bwipe! 979585fea7bSBram Moolenaar END 980585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 981585fea7bSBram Moolenaar source Xvim9lines 982585fea7bSBram Moolenaar 983585fea7bSBram Moolenaar delete('Xvim9lines') 984585fea7bSBram Moolenaarenddef 985585fea7bSBram Moolenaar 9868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 987