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 137a092245SBram Moolenaardef CheckScriptFailure(lines: list<string>, error: string) 147a092245SBram Moolenaar writefile(lines, 'Xdef') 157a092245SBram Moolenaar assert_fails('so Xdef', error, lines) 167a092245SBram Moolenaar delete('Xdef') 177a092245SBram Moolenaarenddef 187a092245SBram Moolenaar 197a092245SBram Moolenaardef CheckScriptSuccess(lines: list<string>) 207a092245SBram Moolenaar writefile(lines, 'Xdef') 217a092245SBram Moolenaar so Xdef 227a092245SBram Moolenaar delete('Xdef') 237a092245SBram Moolenaarenddef 248a7d6542SBram Moolenaar 258a7d6542SBram Moolenaardef Test_syntax() 268a7d6542SBram Moolenaar let var = 234 278a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 288a7d6542SBram Moolenaarenddef 298a7d6542SBram Moolenaar 306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 316e587dcbSBram Moolenaarlet s:addToMe = 111 32401d9ffbSBram Moolenaarlet g:existing = 'yes' 33a8c17704SBram Moolenaarlet g:inc_counter = 1 34a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 356e587dcbSBram Moolenaar 368a7d6542SBram Moolenaardef Test_assignment() 378a7d6542SBram Moolenaar let bool1: bool = true 388a7d6542SBram Moolenaar assert_equal(v:true, bool1) 398a7d6542SBram Moolenaar let bool2: bool = false 408a7d6542SBram Moolenaar assert_equal(v:false, bool2) 418a7d6542SBram Moolenaar 420c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 438a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 440c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 450c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 460c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 478a7d6542SBram Moolenaar 48436472f5SBram Moolenaar let listS: list<string> = [] 49436472f5SBram Moolenaar let listN: list<number> = [] 508a7d6542SBram Moolenaar 510c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 528a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 530c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 540c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 550c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 56b283a8a6SBram Moolenaar 579be61bbbSBram Moolenaar let a: number = 6 589be61bbbSBram Moolenaar assert_equal(6, a) 599be61bbbSBram Moolenaar 6042a480bfSBram Moolenaar if has('channel') 6142a480bfSBram Moolenaar let chan1: channel 62fbdd08edSBram Moolenaar let job1: job 63f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6442a480bfSBram Moolenaar endif 65fbdd08edSBram Moolenaar if has('float') 66fbdd08edSBram Moolenaar let float1: float = 3.4 67fbdd08edSBram Moolenaar endif 685deeb3f1SBram Moolenaar let Funky1: func 695deeb3f1SBram Moolenaar let Funky2: func = function('len') 705deeb3f1SBram Moolenaar let Party2: func = funcref('Test_syntax') 7142a480bfSBram Moolenaar 72cb711abfSBram Moolenaar # type becomes list<any> 7361a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 74cb711abfSBram Moolenaar # type becomes dict<any> 755381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 7661a6d4e4SBram Moolenaar 77401d9ffbSBram Moolenaar g:newvar = 'new' 78401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 79401d9ffbSBram Moolenaar 80401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 81401d9ffbSBram Moolenaar g:existing = 'no' 82401d9ffbSBram Moolenaar assert_equal('no', g:existing) 83401d9ffbSBram Moolenaar 84b283a8a6SBram Moolenaar v:char = 'abc' 856e587dcbSBram Moolenaar assert_equal('abc', v:char) 86b283a8a6SBram Moolenaar 87b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 886e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 89b283a8a6SBram Moolenaar $ENVVAR = '' 906e587dcbSBram Moolenaar 91fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 92fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 93fd1823e0SBram Moolenaar s:addToMe += 222 94fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 950bbf722aSBram Moolenaar s:newVar = 'new' 960bbf722aSBram Moolenaar assert_equal('new', s:newVar) 97a8c17704SBram Moolenaar 98a8c17704SBram Moolenaar set ts=7 99a8c17704SBram Moolenaar &ts += 1 100a8c17704SBram Moolenaar assert_equal(8, &ts) 10180c34ca3SBram Moolenaar &ts -= 3 10280c34ca3SBram Moolenaar assert_equal(5, &ts) 10380c34ca3SBram Moolenaar &ts *= 2 10480c34ca3SBram Moolenaar assert_equal(10, &ts) 10580c34ca3SBram Moolenaar &ts /= 3 10680c34ca3SBram Moolenaar assert_equal(3, &ts) 10780c34ca3SBram Moolenaar set ts=10 10880c34ca3SBram Moolenaar &ts %= 4 10980c34ca3SBram Moolenaar assert_equal(2, &ts) 110a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 111a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 112a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 113cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 114585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 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:') 1365deeb3f1SBram Moolenaarenddef 1375deeb3f1SBram Moolenaar 1385deeb3f1SBram Moolenaardef Test_assignment_default() 139e69f6d04SBram Moolenaar 140cb711abfSBram Moolenaar # Test default values. 141e69f6d04SBram Moolenaar let thebool: bool 142e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 143e69f6d04SBram Moolenaar 144e69f6d04SBram Moolenaar let thenumber: number 145e69f6d04SBram Moolenaar assert_equal(0, thenumber) 146e69f6d04SBram Moolenaar 147e69f6d04SBram Moolenaar if has('float') 148e69f6d04SBram Moolenaar let thefloat: float 149e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 150e69f6d04SBram Moolenaar endif 151e69f6d04SBram Moolenaar 152e69f6d04SBram Moolenaar let thestring: string 153e69f6d04SBram Moolenaar assert_equal('', thestring) 154e69f6d04SBram Moolenaar 155e69f6d04SBram Moolenaar let theblob: blob 156e69f6d04SBram Moolenaar assert_equal(0z, theblob) 157e69f6d04SBram Moolenaar 1585deeb3f1SBram Moolenaar let Thefunc: func 1595deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 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 174585fea7bSBram Moolenaar 175585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 176585fea7bSBram Moolenaar assert_equal(5678, nr) 1778a7d6542SBram Moolenaarenddef 1788a7d6542SBram Moolenaar 179cab27678SBram Moolenaardef Mess(): string 180cab27678SBram Moolenaar v:foldstart = 123 181cab27678SBram Moolenaar return 'xxx' 182cab27678SBram Moolenaarenddef 183cab27678SBram Moolenaar 1848a7d6542SBram Moolenaarfunc Test_assignment_failure() 1858a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1868a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1878a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1888a7d6542SBram Moolenaar 1898a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1908a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1918a7d6542SBram Moolenaar 1929be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1939be61bbbSBram Moolenaar 194e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1959be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1969be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1979be61bbbSBram Moolenaar 1989be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1999be61bbbSBram Moolenaar 2009be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 2019be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 2029be61bbbSBram Moolenaar 2039be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 2049be61bbbSBram Moolenaar 2059be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 2069be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2079be61bbbSBram Moolenaar 20833fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 20933fa29cfSBram Moolenaar 2108a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2118a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2128a7d6542SBram Moolenaar 2138a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2148a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2158a7d6542SBram Moolenaar 2168a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2178a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 21842a480bfSBram Moolenaar 219d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 22042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 221cab27678SBram Moolenaar 222cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 223cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 224599c89c8SBram Moolenaarendfunc 225599c89c8SBram Moolenaar 226599c89c8SBram Moolenaarfunc Test_wrong_type() 227599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 228599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 229599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 230599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 231599c89c8SBram Moolenaar 232599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 233599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 23442a480bfSBram Moolenaar 23542a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 23642a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 23742a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 23842a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 23942a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 24042a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 24142a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 24242a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 24342a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 24442a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 24542a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2468a7d6542SBram Moolenaarendfunc 2478a7d6542SBram Moolenaar 2488a7d6542SBram Moolenaarfunc Test_const() 2498a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2508a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2518a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2529be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2538a7d6542SBram Moolenaarendfunc 2548a7d6542SBram Moolenaar 2558a7d6542SBram Moolenaardef Test_block() 2568a7d6542SBram Moolenaar let outer = 1 2578a7d6542SBram Moolenaar { 2588a7d6542SBram Moolenaar let inner = 2 2598a7d6542SBram Moolenaar assert_equal(1, outer) 2608a7d6542SBram Moolenaar assert_equal(2, inner) 2618a7d6542SBram Moolenaar } 2628a7d6542SBram Moolenaar assert_equal(1, outer) 2638a7d6542SBram Moolenaarenddef 2648a7d6542SBram Moolenaar 2658a7d6542SBram Moolenaarfunc Test_block_failure() 2668a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 267585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 268585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 2698a7d6542SBram Moolenaarendfunc 2708a7d6542SBram Moolenaar 271585fea7bSBram Moolenaardef Test_cmd_modifier() 272585fea7bSBram Moolenaar tab echo '0' 273585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 274585fea7bSBram Moolenaarenddef 275585fea7bSBram Moolenaar 2768a7d6542SBram Moolenaardef Test_try_catch() 2778a7d6542SBram Moolenaar let l = [] 2787a092245SBram Moolenaar try # comment 2798a7d6542SBram Moolenaar add(l, '1') 2808a7d6542SBram Moolenaar throw 'wrong' 2818a7d6542SBram Moolenaar add(l, '2') 2827a092245SBram Moolenaar catch # comment 2838a7d6542SBram Moolenaar add(l, v:exception) 2847a092245SBram Moolenaar finally # comment 2858a7d6542SBram Moolenaar add(l, '3') 2867a092245SBram Moolenaar endtry # comment 2878a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2888a7d6542SBram Moolenaarenddef 2898a7d6542SBram Moolenaar 290257cc5eeSBram Moolenaardef ThrowFromDef() 291257cc5eeSBram Moolenaar throw 'getout' 292257cc5eeSBram Moolenaarenddef 293257cc5eeSBram Moolenaar 294257cc5eeSBram Moolenaarfunc CatchInFunc() 295257cc5eeSBram Moolenaar try 296257cc5eeSBram Moolenaar call ThrowFromDef() 297257cc5eeSBram Moolenaar catch 298257cc5eeSBram Moolenaar let g:thrown_func = v:exception 299257cc5eeSBram Moolenaar endtry 300257cc5eeSBram Moolenaarendfunc 301257cc5eeSBram Moolenaar 302257cc5eeSBram Moolenaardef CatchInDef() 303257cc5eeSBram Moolenaar try 304257cc5eeSBram Moolenaar ThrowFromDef() 305257cc5eeSBram Moolenaar catch 306257cc5eeSBram Moolenaar g:thrown_def = v:exception 307257cc5eeSBram Moolenaar endtry 308257cc5eeSBram Moolenaarenddef 309257cc5eeSBram Moolenaar 310f575adffSBram Moolenaardef ReturnFinally(): string 311f575adffSBram Moolenaar try 312f575adffSBram Moolenaar return 'intry' 313f575adffSBram Moolenaar finally 314f575adffSBram Moolenaar g:in_finally = 'finally' 315f575adffSBram Moolenaar endtry 316f575adffSBram Moolenaar return 'end' 317f575adffSBram Moolenaarenddef 318f575adffSBram Moolenaar 319257cc5eeSBram Moolenaardef Test_try_catch_nested() 320257cc5eeSBram Moolenaar CatchInFunc() 321257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 322257cc5eeSBram Moolenaar 323257cc5eeSBram Moolenaar CatchInDef() 324257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 325f575adffSBram Moolenaar 326f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 327f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 328f575adffSBram Moolenaarenddef 329f575adffSBram Moolenaar 330f575adffSBram Moolenaardef Test_try_catch_match() 331f575adffSBram Moolenaar let seq = 'a' 332f575adffSBram Moolenaar try 333f575adffSBram Moolenaar throw 'something' 334f575adffSBram Moolenaar catch /nothing/ 335f575adffSBram Moolenaar seq ..= 'x' 336f575adffSBram Moolenaar catch /some/ 337f575adffSBram Moolenaar seq ..= 'b' 338f575adffSBram Moolenaar catch /asdf/ 339f575adffSBram Moolenaar seq ..= 'x' 340e8c4abbbSBram Moolenaar catch ?a\?sdf? 341e8c4abbbSBram Moolenaar seq ..= 'y' 342f575adffSBram Moolenaar finally 343f575adffSBram Moolenaar seq ..= 'c' 344f575adffSBram Moolenaar endtry 345f575adffSBram Moolenaar assert_equal('abc', seq) 346257cc5eeSBram Moolenaarenddef 347257cc5eeSBram Moolenaar 348e8c4abbbSBram Moolenaardef Test_try_catch_fails() 349e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 350e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 351e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 352585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 353585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 354585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 355585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 356585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 357585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 358585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 359585fea7bSBram Moolenaar 360585fea7bSBram Moolenaar call CheckDefFailure(['throw'], 'E471:') 361585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 362e8c4abbbSBram Moolenaarenddef 363e8c4abbbSBram Moolenaar 3648a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3658a7d6542SBram Moolenaar vim9script 3668a7d6542SBram Moolenaar let name: string = 'bob' 3678a7d6542SBram Moolenaar def Concat(arg: string): string 3688a7d6542SBram Moolenaar return name .. arg 3698a7d6542SBram Moolenaar enddef 3708a7d6542SBram Moolenaar let g:result = Concat('bie') 3718a7d6542SBram Moolenaar let g:localname = name 3728a7d6542SBram Moolenaar 3738a7d6542SBram Moolenaar export const CONST = 1234 3748a7d6542SBram Moolenaar export let exported = 9876 3756e587dcbSBram Moolenaar export let exp_name = 'John' 3768a7d6542SBram Moolenaar export def Exported(): string 3778a7d6542SBram Moolenaar return 'Exported' 3788a7d6542SBram Moolenaar enddef 3798a7d6542SBram MoolenaarEND 3808a7d6542SBram Moolenaar 3815269bd2aSBram Moolenaardef Test_vim9_import_export() 3828a7d6542SBram Moolenaar let import_script_lines =<< trim END 3838a7d6542SBram Moolenaar vim9script 3848a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3858a7d6542SBram Moolenaar g:imported = exported 3866e587dcbSBram Moolenaar exported += 3 3876e587dcbSBram Moolenaar g:imported_added = exported 3888a7d6542SBram Moolenaar g:imported_func = Exported() 3896e587dcbSBram Moolenaar 3906e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3916e587dcbSBram Moolenaar g:imported_name = exp_name 3926e587dcbSBram Moolenaar exp_name ..= ' Doe' 3936e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3945381c7a1SBram Moolenaar g:imported_later = exported 3958a7d6542SBram Moolenaar END 3968a7d6542SBram Moolenaar 3978a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3988a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3998a7d6542SBram Moolenaar 4008a7d6542SBram Moolenaar source Ximport.vim 4018a7d6542SBram Moolenaar 4028a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 4038a7d6542SBram Moolenaar assert_equal('bob', g:localname) 4048a7d6542SBram Moolenaar assert_equal(9876, g:imported) 4056e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 4065381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 4078a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 4086e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 4096e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 4108a7d6542SBram Moolenaar assert_false(exists('g:name')) 4118a7d6542SBram Moolenaar 4128a7d6542SBram Moolenaar unlet g:result 4138a7d6542SBram Moolenaar unlet g:localname 4148a7d6542SBram Moolenaar unlet g:imported 4156e587dcbSBram Moolenaar unlet g:imported_added 4165381c7a1SBram Moolenaar unlet g:imported_later 4178a7d6542SBram Moolenaar unlet g:imported_func 4186e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4198a7d6542SBram Moolenaar delete('Ximport.vim') 420f2d5c240SBram Moolenaar 4215381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4225381c7a1SBram Moolenaar vim9script 4235381c7a1SBram Moolenaar def ImportInDef() 4245381c7a1SBram Moolenaar import exported from './Xexport.vim' 4255381c7a1SBram Moolenaar g:imported = exported 4265381c7a1SBram Moolenaar exported += 7 4275381c7a1SBram Moolenaar g:imported_added = exported 4285381c7a1SBram Moolenaar enddef 4295381c7a1SBram Moolenaar ImportInDef() 4305381c7a1SBram Moolenaar END 4315381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4325381c7a1SBram Moolenaar source Ximport2.vim 4335381c7a1SBram Moolenaar " TODO: this should be 9879 4345381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4355381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4365381c7a1SBram Moolenaar unlet g:imported 4375381c7a1SBram Moolenaar unlet g:imported_added 4385381c7a1SBram Moolenaar delete('Ximport2.vim') 4395381c7a1SBram Moolenaar 440f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 441f2d5c240SBram Moolenaar vim9script 442f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 443f2d5c240SBram Moolenaar def UseExport() 444f2d5c240SBram Moolenaar g:imported = Export.exported 445f2d5c240SBram Moolenaar enddef 446f2d5c240SBram Moolenaar UseExport() 447f2d5c240SBram Moolenaar END 448f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 449f2d5c240SBram Moolenaar source Ximport.vim 4505381c7a1SBram Moolenaar assert_equal(9883, g:imported) 451f2d5c240SBram Moolenaar 452599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 453599c89c8SBram Moolenaar vim9script 454599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 455599c89c8SBram Moolenaar def Func() 456599c89c8SBram Moolenaar let dummy = 1 457599c89c8SBram Moolenaar let imported = Export + dummy 458599c89c8SBram Moolenaar enddef 459599c89c8SBram Moolenaar END 460599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 461599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 462599c89c8SBram Moolenaar 463599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 464599c89c8SBram Moolenaar vim9script 465599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 466599c89c8SBram Moolenaar def Func() 467599c89c8SBram Moolenaar let imported = Export . exported 468599c89c8SBram Moolenaar enddef 469599c89c8SBram Moolenaar END 470599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 471599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 472599c89c8SBram Moolenaar 473599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 474599c89c8SBram Moolenaar vim9script 475599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 476599c89c8SBram Moolenaar def Func() 477599c89c8SBram Moolenaar let imported = Export. 478599c89c8SBram Moolenaar enddef 479599c89c8SBram Moolenaar END 480599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 481599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 482599c89c8SBram Moolenaar 483f2d5c240SBram Moolenaar let import_star_lines =<< trim END 484f2d5c240SBram Moolenaar vim9script 485f2d5c240SBram Moolenaar import * from './Xexport.vim' 486f2d5c240SBram Moolenaar g:imported = exported 487f2d5c240SBram Moolenaar END 488f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 489f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 490f2d5c240SBram Moolenaar 491fa29c8abSBram Moolenaar " try to import something that exists but is not exported 492fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 493fa29c8abSBram Moolenaar vim9script 494fa29c8abSBram Moolenaar import name from './Xexport.vim' 495fa29c8abSBram Moolenaar END 496fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 497fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 498fa29c8abSBram Moolenaar 4995269bd2aSBram Moolenaar " try to import something that is already defined 5005269bd2aSBram Moolenaar let import_already_defined =<< trim END 5015269bd2aSBram Moolenaar vim9script 5025269bd2aSBram Moolenaar let exported = 'something' 5035269bd2aSBram Moolenaar import exported from './Xexport.vim' 5045269bd2aSBram Moolenaar END 5055269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5065269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5075269bd2aSBram Moolenaar 5085269bd2aSBram Moolenaar " try to import something that is already defined 5095269bd2aSBram Moolenaar import_already_defined =<< trim END 5105269bd2aSBram Moolenaar vim9script 5115269bd2aSBram Moolenaar let exported = 'something' 5125269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5135269bd2aSBram Moolenaar END 5145269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5155269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5165269bd2aSBram Moolenaar 5175269bd2aSBram Moolenaar " try to import something that is already defined 5185269bd2aSBram Moolenaar import_already_defined =<< trim END 5195269bd2aSBram Moolenaar vim9script 5205269bd2aSBram Moolenaar let exported = 'something' 5215269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5225269bd2aSBram Moolenaar END 5235269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5245269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5255269bd2aSBram Moolenaar 526fa29c8abSBram Moolenaar " import a very long name, requires making a copy 527fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 528fa29c8abSBram Moolenaar vim9script 529fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 530fa29c8abSBram Moolenaar END 531fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 532fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 533fa29c8abSBram Moolenaar 534fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 535fa29c8abSBram Moolenaar vim9script 536fa29c8abSBram Moolenaar import name './Xexport.vim' 537fa29c8abSBram Moolenaar END 538fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 539fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 540fa29c8abSBram Moolenaar 541fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 542fa29c8abSBram Moolenaar vim9script 543fa29c8abSBram Moolenaar import name from Xexport.vim 544fa29c8abSBram Moolenaar END 545fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 546fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 547fa29c8abSBram Moolenaar 548fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 549fa29c8abSBram Moolenaar vim9script 550fa29c8abSBram Moolenaar import name from './XnoExport.vim' 551fa29c8abSBram Moolenaar END 552fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 553fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 554fa29c8abSBram Moolenaar 555fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 556fa29c8abSBram Moolenaar vim9script 557fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 558fa29c8abSBram Moolenaar END 5595269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5605269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 561fa29c8abSBram Moolenaar 562f2d5c240SBram Moolenaar delete('Ximport.vim') 5635269bd2aSBram Moolenaar delete('Ximport3.vim') 5648a7d6542SBram Moolenaar delete('Xexport.vim') 5658a7d6542SBram Moolenaar 566750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 567750802b5SBram Moolenaar set cpo&vi 568750802b5SBram Moolenaar let cpo_before = &cpo 569750802b5SBram Moolenaar let lines =<< trim END 570750802b5SBram Moolenaar vim9script 571750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 572750802b5SBram Moolenaar END 573750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 574750802b5SBram Moolenaar source Xvim9_script 575750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 576750802b5SBram Moolenaar set cpo&vim 577750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 578750802b5SBram Moolenaar delete('Xvim9_script') 579750802b5SBram Moolenaarenddef 580750802b5SBram Moolenaar 581750802b5SBram Moolenaardef Test_vim9script_fails() 5828a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 5838a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 584750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 585f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 586750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 587750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 588750802b5SBram Moolenaar 589750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 590750802b5SBram Moolenaar assert_fails('export something', 'E1042') 5918a7d6542SBram Moolenaarenddef 5928a7d6542SBram Moolenaar 5938a7d6542SBram Moolenaardef Test_vim9script_reload() 5948a7d6542SBram Moolenaar let lines =<< trim END 5958a7d6542SBram Moolenaar vim9script 5968a7d6542SBram Moolenaar const var = '' 5978a7d6542SBram Moolenaar let valone = 1234 5988a7d6542SBram Moolenaar def MyFunc(arg: string) 5998a7d6542SBram Moolenaar valone = 5678 6008a7d6542SBram Moolenaar enddef 6018a7d6542SBram Moolenaar END 6028a7d6542SBram Moolenaar let morelines =<< trim END 6038a7d6542SBram Moolenaar let valtwo = 222 6048a7d6542SBram Moolenaar export def GetValtwo(): number 6058a7d6542SBram Moolenaar return valtwo 6068a7d6542SBram Moolenaar enddef 6078a7d6542SBram Moolenaar END 608675f716eSBram Moolenaar writefile(lines + morelines, 609675f716eSBram Moolenaar 'Xreload.vim') 6108a7d6542SBram Moolenaar source Xreload.vim 6118a7d6542SBram Moolenaar source Xreload.vim 6128a7d6542SBram Moolenaar source Xreload.vim 6138a7d6542SBram Moolenaar 6148a7d6542SBram Moolenaar let testlines =<< trim END 6158a7d6542SBram Moolenaar vim9script 6168a7d6542SBram Moolenaar def TheFunc() 6178a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 6188a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 6198a7d6542SBram Moolenaar enddef 6208a7d6542SBram Moolenaar TheFunc() 6218a7d6542SBram Moolenaar END 6228a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 6238a7d6542SBram Moolenaar source Ximport.vim 6248a7d6542SBram Moolenaar 6258a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 6268a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 6278a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6288a7d6542SBram Moolenaar source Xreload.vim 6298a7d6542SBram Moolenaar source Ximport.vim 6308a7d6542SBram Moolenaar 6318a7d6542SBram Moolenaar " cannot declare a var twice 6328a7d6542SBram Moolenaar lines =<< trim END 6338a7d6542SBram Moolenaar vim9script 6348a7d6542SBram Moolenaar let valone = 1234 6358a7d6542SBram Moolenaar let valone = 5678 6368a7d6542SBram Moolenaar END 6378a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6388a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 6398a7d6542SBram Moolenaar 6408a7d6542SBram Moolenaar delete('Xreload.vim') 6418a7d6542SBram Moolenaar delete('Ximport.vim') 6428a7d6542SBram Moolenaarenddef 6438a7d6542SBram Moolenaar 6448a7d6542SBram Moolenaardef Test_import_absolute() 6458a7d6542SBram Moolenaar let import_lines = [ 646e6085c53SBram Moolenaar 'vim9script', 647e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 648e6085c53SBram Moolenaar 'def UseExported()', 649e6085c53SBram Moolenaar ' g:imported_abs = exported', 650e6085c53SBram Moolenaar ' exported = 8888', 651e6085c53SBram Moolenaar ' g:imported_after = exported', 652e6085c53SBram Moolenaar 'enddef', 653e6085c53SBram Moolenaar 'UseExported()', 654e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 655e6085c53SBram Moolenaar ] 6568a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 6578a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 6588a7d6542SBram Moolenaar 6598a7d6542SBram Moolenaar source Ximport_abs.vim 6608a7d6542SBram Moolenaar 6618a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 6624e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 663675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 664675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 665675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 666675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 667675f716eSBram Moolenaar 'exported = 8888.*' .. 668675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 669675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 670675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 671675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 672e6085c53SBram Moolenaar g:import_disassembled) 6738a7d6542SBram Moolenaar unlet g:imported_abs 6744e12a5dfSBram Moolenaar unlet g:import_disassembled 6758a7d6542SBram Moolenaar 6768a7d6542SBram Moolenaar delete('Ximport_abs.vim') 6778a7d6542SBram Moolenaar delete('Xexport_abs.vim') 6788a7d6542SBram Moolenaarenddef 6798a7d6542SBram Moolenaar 6808a7d6542SBram Moolenaardef Test_import_rtp() 6818a7d6542SBram Moolenaar let import_lines = [ 682e6085c53SBram Moolenaar 'vim9script', 683e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 684e6085c53SBram Moolenaar 'g:imported_rtp = exported', 685e6085c53SBram Moolenaar ] 6868a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 6878a7d6542SBram Moolenaar mkdir('import') 6888a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 6898a7d6542SBram Moolenaar 6908a7d6542SBram Moolenaar let save_rtp = &rtp 6918a7d6542SBram Moolenaar &rtp = getcwd() 6928a7d6542SBram Moolenaar source Ximport_rtp.vim 6938a7d6542SBram Moolenaar &rtp = save_rtp 6948a7d6542SBram Moolenaar 6958a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 6968a7d6542SBram Moolenaar unlet g:imported_rtp 6978a7d6542SBram Moolenaar 6988a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 6998a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 7008a7d6542SBram Moolenaar delete('import', 'd') 7018a7d6542SBram Moolenaarenddef 7028a7d6542SBram Moolenaar 7038a7d6542SBram Moolenaardef Test_fixed_size_list() 7048a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 7058a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 7068a7d6542SBram Moolenaar l->remove(0) 7078a7d6542SBram Moolenaar l->add(5) 7088a7d6542SBram Moolenaar l->insert(99, 1) 7090f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 7108a7d6542SBram Moolenaarenddef 7118a7d6542SBram Moolenaar 712158906cfSBram Moolenaardef IfElse(what: number): string 713158906cfSBram Moolenaar let res = '' 714158906cfSBram Moolenaar if what == 1 715158906cfSBram Moolenaar res = "one" 716158906cfSBram Moolenaar elseif what == 2 717158906cfSBram Moolenaar res = "two" 718a259d8d3SBram Moolenaar else 719158906cfSBram Moolenaar res = "three" 720a259d8d3SBram Moolenaar endif 721158906cfSBram Moolenaar return res 722a259d8d3SBram Moolenaarenddef 723a259d8d3SBram Moolenaar 724158906cfSBram Moolenaardef Test_if_elseif_else() 725158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 726158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 727158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 7280f18b6d1SBram Moolenaarenddef 7290f18b6d1SBram Moolenaar 730e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 731e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 732e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 733e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 734e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 735585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 736e8c4abbbSBram Moolenaarenddef 737e8c4abbbSBram Moolenaar 7386d69bf60SBram Moolenaarlet g:bool_true = v:true 7396d69bf60SBram Moolenaarlet g:bool_false = v:false 7406d69bf60SBram Moolenaar 7416d69bf60SBram Moolenaardef Test_if_const_expr() 7426d69bf60SBram Moolenaar let res = false 7436d69bf60SBram Moolenaar if true ? true : false 7446d69bf60SBram Moolenaar res = true 7456d69bf60SBram Moolenaar endif 7466d69bf60SBram Moolenaar assert_equal(true, res) 7476d69bf60SBram Moolenaar 748585fea7bSBram Moolenaar g:glob = 2 749585fea7bSBram Moolenaar if false 750585fea7bSBram Moolenaar execute('let g:glob = 3') 751585fea7bSBram Moolenaar endif 752585fea7bSBram Moolenaar assert_equal(2, g:glob) 753585fea7bSBram Moolenaar if true 754585fea7bSBram Moolenaar execute('let g:glob = 3') 755585fea7bSBram Moolenaar endif 756585fea7bSBram Moolenaar assert_equal(3, g:glob) 757585fea7bSBram Moolenaar 7586d69bf60SBram Moolenaar res = false 7596d69bf60SBram Moolenaar if g:bool_true ? true : false 7606d69bf60SBram Moolenaar res = true 7616d69bf60SBram Moolenaar endif 7626d69bf60SBram Moolenaar assert_equal(true, res) 7636d69bf60SBram Moolenaar 7646d69bf60SBram Moolenaar res = false 7656d69bf60SBram Moolenaar if true ? g:bool_true : false 7666d69bf60SBram Moolenaar res = true 7676d69bf60SBram Moolenaar endif 7686d69bf60SBram Moolenaar assert_equal(true, res) 7696d69bf60SBram Moolenaar 7706d69bf60SBram Moolenaar res = false 7716d69bf60SBram Moolenaar if true ? true : g:bool_false 7726d69bf60SBram Moolenaar res = true 7736d69bf60SBram Moolenaar endif 7746d69bf60SBram Moolenaar assert_equal(true, res) 7756d69bf60SBram Moolenaar 7766d69bf60SBram Moolenaar res = false 7776d69bf60SBram Moolenaar if true ? false : true 7786d69bf60SBram Moolenaar res = true 7796d69bf60SBram Moolenaar endif 7806d69bf60SBram Moolenaar assert_equal(false, res) 7816d69bf60SBram Moolenaar 7826d69bf60SBram Moolenaar res = false 7836d69bf60SBram Moolenaar if false ? false : true 7846d69bf60SBram Moolenaar res = true 7856d69bf60SBram Moolenaar endif 7866d69bf60SBram Moolenaar assert_equal(true, res) 7876d69bf60SBram Moolenaar 7886d69bf60SBram Moolenaar res = false 7896d69bf60SBram Moolenaar if false ? true : false 7906d69bf60SBram Moolenaar res = true 7916d69bf60SBram Moolenaar endif 7926d69bf60SBram Moolenaar assert_equal(false, res) 7936d69bf60SBram Moolenaar 7946d69bf60SBram Moolenaar res = false 795e8c4abbbSBram Moolenaar if has('xyz') ? true : false 796e8c4abbbSBram Moolenaar res = true 797e8c4abbbSBram Moolenaar endif 798e8c4abbbSBram Moolenaar assert_equal(false, res) 799e8c4abbbSBram Moolenaar 800e8c4abbbSBram Moolenaar res = false 8016d69bf60SBram Moolenaar if true && true 8026d69bf60SBram Moolenaar res = true 8036d69bf60SBram Moolenaar endif 8046d69bf60SBram Moolenaar assert_equal(true, res) 8056d69bf60SBram Moolenaar 8066d69bf60SBram Moolenaar res = false 8076d69bf60SBram Moolenaar if true && false 8086d69bf60SBram Moolenaar res = true 8096d69bf60SBram Moolenaar endif 8106d69bf60SBram Moolenaar assert_equal(false, res) 8116d69bf60SBram Moolenaar 8126d69bf60SBram Moolenaar res = false 8136d69bf60SBram Moolenaar if g:bool_true && false 8146d69bf60SBram Moolenaar res = true 8156d69bf60SBram Moolenaar endif 8166d69bf60SBram Moolenaar assert_equal(false, res) 8176d69bf60SBram Moolenaar 8186d69bf60SBram Moolenaar res = false 8196d69bf60SBram Moolenaar if true && g:bool_false 8206d69bf60SBram Moolenaar res = true 8216d69bf60SBram Moolenaar endif 8226d69bf60SBram Moolenaar assert_equal(false, res) 8236d69bf60SBram Moolenaar 8246d69bf60SBram Moolenaar res = false 8256d69bf60SBram Moolenaar if false && false 8266d69bf60SBram Moolenaar res = true 8276d69bf60SBram Moolenaar endif 8286d69bf60SBram Moolenaar assert_equal(false, res) 8296d69bf60SBram Moolenaar 8306d69bf60SBram Moolenaar res = false 8316d69bf60SBram Moolenaar if true || false 8326d69bf60SBram Moolenaar res = true 8336d69bf60SBram Moolenaar endif 8346d69bf60SBram Moolenaar assert_equal(true, res) 8356d69bf60SBram Moolenaar 8366d69bf60SBram Moolenaar res = false 8376d69bf60SBram Moolenaar if g:bool_true || false 8386d69bf60SBram Moolenaar res = true 8396d69bf60SBram Moolenaar endif 8406d69bf60SBram Moolenaar assert_equal(true, res) 8416d69bf60SBram Moolenaar 8426d69bf60SBram Moolenaar res = false 8436d69bf60SBram Moolenaar if true || g:bool_false 8446d69bf60SBram Moolenaar res = true 8456d69bf60SBram Moolenaar endif 8466d69bf60SBram Moolenaar assert_equal(true, res) 8476d69bf60SBram Moolenaar 8486d69bf60SBram Moolenaar res = false 8496d69bf60SBram Moolenaar if false || false 8506d69bf60SBram Moolenaar res = true 8516d69bf60SBram Moolenaar endif 8526d69bf60SBram Moolenaar assert_equal(false, res) 85380c34ca3SBram Moolenaarenddef 8546d69bf60SBram Moolenaar 85580c34ca3SBram Moolenaardef Test_if_const_expr_fails() 85680c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 85780c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 858e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 859e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 8606d69bf60SBram Moolenaarenddef 8616d69bf60SBram Moolenaar 862ad39c094SBram Moolenaardef Test_execute_cmd() 863ad39c094SBram Moolenaar new 864ad39c094SBram Moolenaar setline(1, 'default') 865ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 866ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 867ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 868ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 869ad39c094SBram Moolenaar execute cmd1 cmd2 870ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 871ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 872ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 873ad39c094SBram Moolenaar let cmd_first = 'call ' 874ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 875ad39c094SBram Moolenaar execute cmd_first .. cmd_last 876ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 877ad39c094SBram Moolenaar bwipe! 878585fea7bSBram Moolenaar 879585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 880ad39c094SBram Moolenaarenddef 881ad39c094SBram Moolenaar 882ad39c094SBram Moolenaardef Test_echo_cmd() 883585fea7bSBram Moolenaar echo 'some' 884585fea7bSBram Moolenaar echon 'thing' 885ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 886ad39c094SBram Moolenaar 887ad39c094SBram Moolenaar let str1 = 'some' 888ad39c094SBram Moolenaar let str2 = 'more' 889ad39c094SBram Moolenaar echo str1 str2 890ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 891ad39c094SBram Moolenaarenddef 892ad39c094SBram Moolenaar 89341fe0617SBram Moolenaardef Test_for_outside_of_function() 89441fe0617SBram Moolenaar let lines =<< trim END 89541fe0617SBram Moolenaar vim9script 89641fe0617SBram Moolenaar new 89741fe0617SBram Moolenaar for var in range(0, 3) 89841fe0617SBram Moolenaar append(line('$'), var) 89941fe0617SBram Moolenaar endfor 90041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 90141fe0617SBram Moolenaar bwipe! 90241fe0617SBram Moolenaar END 90341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 90441fe0617SBram Moolenaar source Xvim9for.vim 90541fe0617SBram Moolenaar delete('Xvim9for.vim') 90641fe0617SBram Moolenaarenddef 9078a7d6542SBram Moolenaar 908e8c4abbbSBram Moolenaardef Test_for_loop() 909e8c4abbbSBram Moolenaar let result = '' 910e8c4abbbSBram Moolenaar for cnt in range(7) 911e8c4abbbSBram Moolenaar if cnt == 4 912e8c4abbbSBram Moolenaar break 913e8c4abbbSBram Moolenaar endif 914e8c4abbbSBram Moolenaar if cnt == 2 915e8c4abbbSBram Moolenaar continue 916e8c4abbbSBram Moolenaar endif 917e8c4abbbSBram Moolenaar result ..= cnt .. '_' 918e8c4abbbSBram Moolenaar endfor 919e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 920e8c4abbbSBram Moolenaarenddef 921e8c4abbbSBram Moolenaar 922e8c4abbbSBram Moolenaardef Test_for_loop_fails() 923675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 924675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 925675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 9266e949784SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:') 927675f716eSBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1024:') 928675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 929675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 930675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 931e8c4abbbSBram Moolenaarenddef 932e8c4abbbSBram Moolenaar 933d0df1aacSBram Moolenaardef Test_while_loop() 934d0df1aacSBram Moolenaar let result = '' 935d0df1aacSBram Moolenaar let cnt = 0 936d0df1aacSBram Moolenaar while cnt < 555 937d0df1aacSBram Moolenaar if cnt == 3 938d0df1aacSBram Moolenaar break 939d0df1aacSBram Moolenaar endif 940d0df1aacSBram Moolenaar cnt += 1 941d0df1aacSBram Moolenaar if cnt == 2 942d0df1aacSBram Moolenaar continue 943d0df1aacSBram Moolenaar endif 944d0df1aacSBram Moolenaar result ..= cnt .. '_' 945d0df1aacSBram Moolenaar endwhile 946d0df1aacSBram Moolenaar assert_equal('1_3_', result) 947d0df1aacSBram Moolenaarenddef 948d0df1aacSBram Moolenaar 949e8c4abbbSBram Moolenaardef Test_while_loop_fails() 950675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 951675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 952675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 953675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 954675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 955675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 956675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 957bd5da371SBram Moolenaarenddef 958bd5da371SBram Moolenaar 9599645e2d9SBram Moolenaardef Test_interrupt_loop() 96097acfc78SBram Moolenaar let caught = false 9619645e2d9SBram Moolenaar let x = 0 96297acfc78SBram Moolenaar try 9639645e2d9SBram Moolenaar while 1 9649645e2d9SBram Moolenaar x += 1 9659645e2d9SBram Moolenaar if x == 100 9669645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 9679645e2d9SBram Moolenaar endif 9689645e2d9SBram Moolenaar endwhile 96997acfc78SBram Moolenaar catch 97097acfc78SBram Moolenaar caught = true 97197acfc78SBram Moolenaar assert_equal(100, x) 97297acfc78SBram Moolenaar endtry 97397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 9749645e2d9SBram Moolenaarenddef 97520431c9dSBram Moolenaar 9764fdae999SBram Moolenaardef Test_automatic_line_continuation() 9774fdae999SBram Moolenaar let mylist = [ 9784fdae999SBram Moolenaar 'one', 9794fdae999SBram Moolenaar 'two', 9804fdae999SBram Moolenaar 'three', 9814fdae999SBram Moolenaar ] " comment 9824fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 9834fdae999SBram Moolenaar 9844fdae999SBram Moolenaar let mydict = { 9854fdae999SBram Moolenaar 'one': 1, 9864fdae999SBram Moolenaar 'two': 2, 9874fdae999SBram Moolenaar 'three': 9884fdae999SBram Moolenaar 3, 9894fdae999SBram Moolenaar } " comment 9904fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 9914fdae999SBram Moolenaar mydict = #{ 9922c330432SBram Moolenaar one: 1, # comment 9932c330432SBram Moolenaar two: # comment 9942c330432SBram Moolenaar 2, # comment 9952c330432SBram Moolenaar three: 3 # comment 9962c330432SBram Moolenaar } 9972c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 9982c330432SBram Moolenaar mydict = #{ 9992c330432SBram Moolenaar one: 1, 10004fdae999SBram Moolenaar two: 10014fdae999SBram Moolenaar 2, 10022c330432SBram Moolenaar three: 3 10034fdae999SBram Moolenaar } 10044fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1005e6085c53SBram Moolenaar 1006e6085c53SBram Moolenaar assert_equal( 1007e6085c53SBram Moolenaar ['one', 'two', 'three'], 1008e6085c53SBram Moolenaar split('one two three') 1009e6085c53SBram Moolenaar ) 10104fdae999SBram Moolenaarenddef 10114fdae999SBram Moolenaar 10127a092245SBram Moolenaardef Test_vim9_comment() 10137a092245SBram Moolenaar CheckScriptSuccess([ 10147a092245SBram Moolenaar 'vim9script', 10157a092245SBram Moolenaar '# something', 10167a092245SBram Moolenaar ]) 10177a092245SBram Moolenaar CheckScriptFailure([ 10187a092245SBram Moolenaar 'vim9script', 10197a092245SBram Moolenaar ':# something', 10207a092245SBram Moolenaar ], 'E488:') 10217a092245SBram Moolenaar CheckScriptFailure([ 10227a092245SBram Moolenaar '# something', 10237a092245SBram Moolenaar ], 'E488:') 10247a092245SBram Moolenaar CheckScriptFailure([ 10257a092245SBram Moolenaar ':# something', 10267a092245SBram Moolenaar ], 'E488:') 10277a092245SBram Moolenaar 1028*4a8d9f2eSBram Moolenaar { # block start 1029*4a8d9f2eSBram Moolenaar } # block end 1030*4a8d9f2eSBram Moolenaar CheckDefFailure([ 1031*4a8d9f2eSBram Moolenaar '{# comment', 1032*4a8d9f2eSBram Moolenaar ], 'E488:') 1033*4a8d9f2eSBram Moolenaar CheckDefFailure([ 1034*4a8d9f2eSBram Moolenaar '{', 1035*4a8d9f2eSBram Moolenaar '}# comment', 1036*4a8d9f2eSBram Moolenaar ], 'E488:') 1037*4a8d9f2eSBram Moolenaar 1038*4a8d9f2eSBram Moolenaar echo "yes" # comment 1039*4a8d9f2eSBram Moolenaar CheckDefFailure([ 1040*4a8d9f2eSBram Moolenaar 'echo "yes"# comment', 1041*4a8d9f2eSBram Moolenaar ], 'E488:') 10427a092245SBram Moolenaar CheckScriptSuccess([ 10437a092245SBram Moolenaar 'vim9script', 10447a092245SBram Moolenaar 'echo "yes" # something', 10457a092245SBram Moolenaar ]) 10467a092245SBram Moolenaar CheckScriptFailure([ 10477a092245SBram Moolenaar 'vim9script', 10487a092245SBram Moolenaar 'echo "yes"# something', 10497a092245SBram Moolenaar ], 'E121:') 10507a092245SBram Moolenaar CheckScriptFailure([ 10517a092245SBram Moolenaar 'vim9script', 10527a092245SBram Moolenaar 'echo# something', 10537a092245SBram Moolenaar ], 'E121:') 10547a092245SBram Moolenaar CheckScriptFailure([ 10557a092245SBram Moolenaar 'echo "yes" # something', 10567a092245SBram Moolenaar ], 'E121:') 10577a092245SBram Moolenaar 1058*4a8d9f2eSBram Moolenaar exe "echo" # comment 1059*4a8d9f2eSBram Moolenaar CheckDefFailure([ 1060*4a8d9f2eSBram Moolenaar 'exe "echo"# comment', 1061*4a8d9f2eSBram Moolenaar ], 'E488:') 1062*4a8d9f2eSBram Moolenaar CheckScriptSuccess([ 1063*4a8d9f2eSBram Moolenaar 'vim9script', 1064*4a8d9f2eSBram Moolenaar 'exe "echo" # something', 1065*4a8d9f2eSBram Moolenaar ]) 1066*4a8d9f2eSBram Moolenaar CheckScriptFailure([ 1067*4a8d9f2eSBram Moolenaar 'vim9script', 1068*4a8d9f2eSBram Moolenaar 'exe "echo"# something', 1069*4a8d9f2eSBram Moolenaar ], 'E121:') 1070*4a8d9f2eSBram Moolenaar CheckDefFailure([ 1071*4a8d9f2eSBram Moolenaar 'exe # comment', 1072*4a8d9f2eSBram Moolenaar ], 'E1015:') 1073*4a8d9f2eSBram Moolenaar CheckScriptFailure([ 1074*4a8d9f2eSBram Moolenaar 'vim9script', 1075*4a8d9f2eSBram Moolenaar 'exe# something', 1076*4a8d9f2eSBram Moolenaar ], 'E121:') 1077*4a8d9f2eSBram Moolenaar CheckScriptFailure([ 1078*4a8d9f2eSBram Moolenaar 'exe "echo" # something', 1079*4a8d9f2eSBram Moolenaar ], 'E121:') 1080*4a8d9f2eSBram Moolenaar 10817a092245SBram Moolenaar CheckDefFailure([ 10827a092245SBram Moolenaar 'try# comment', 10837a092245SBram Moolenaar 'echo "yes"', 10847a092245SBram Moolenaar 'catch', 10857a092245SBram Moolenaar 'endtry', 10867a092245SBram Moolenaar ], 'E488:') 10877a092245SBram Moolenaar CheckDefFailure([ 10887a092245SBram Moolenaar 'try', 10897a092245SBram Moolenaar 'echo "yes"', 10907a092245SBram Moolenaar 'catch# comment', 10917a092245SBram Moolenaar 'endtry', 10927a092245SBram Moolenaar ], 'E488:') 10937a092245SBram Moolenaar CheckDefFailure([ 10947a092245SBram Moolenaar 'try', 10957a092245SBram Moolenaar 'echo "yes"', 10967a092245SBram Moolenaar 'catch', 10977a092245SBram Moolenaar 'endtry# comment', 10987a092245SBram Moolenaar ], 'E488:') 10997a092245SBram Moolenaarenddef 11007a092245SBram Moolenaar 1101585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1102585fea7bSBram Moolenaardef Test_substitute_cmd() 1103585fea7bSBram Moolenaar new 1104585fea7bSBram Moolenaar setline(1, 'something') 1105585fea7bSBram Moolenaar :substitute(some(other( 1106585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1107585fea7bSBram Moolenaar bwipe! 1108585fea7bSBram Moolenaar 1109585fea7bSBram Moolenaar " also when the context is Vim9 script 1110585fea7bSBram Moolenaar let lines =<< trim END 1111585fea7bSBram Moolenaar vim9script 1112585fea7bSBram Moolenaar new 1113585fea7bSBram Moolenaar setline(1, 'something') 1114585fea7bSBram Moolenaar :substitute(some(other( 1115585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1116585fea7bSBram Moolenaar bwipe! 1117585fea7bSBram Moolenaar END 1118585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1119585fea7bSBram Moolenaar source Xvim9lines 1120585fea7bSBram Moolenaar 1121585fea7bSBram Moolenaar delete('Xvim9lines') 1122585fea7bSBram Moolenaarenddef 1123585fea7bSBram Moolenaar 11248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1125