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 625deeb3f1SBram Moolenaar let Funky1: func 635deeb3f1SBram Moolenaar let Funky2: func = function('len') 645deeb3f1SBram 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:') 1305deeb3f1SBram Moolenaarenddef 1315deeb3f1SBram Moolenaar 1325deeb3f1SBram 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 1525deeb3f1SBram Moolenaar let Thefunc: func 1535deeb3f1SBram 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 173cab27678SBram Moolenaardef Mess(): string 174cab27678SBram Moolenaar v:foldstart = 123 175cab27678SBram Moolenaar return 'xxx' 176cab27678SBram Moolenaarenddef 177cab27678SBram Moolenaar 1788a7d6542SBram Moolenaarfunc Test_assignment_failure() 1798a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 1808a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 1818a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 1828a7d6542SBram Moolenaar 1838a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 1848a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 1858a7d6542SBram Moolenaar 1869be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 1879be61bbbSBram Moolenaar 188e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 1899be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 1909be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 1919be61bbbSBram Moolenaar 1929be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 1939be61bbbSBram Moolenaar 1949be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 1959be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 1969be61bbbSBram Moolenaar 1979be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 1989be61bbbSBram Moolenaar 1999be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 2009be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2019be61bbbSBram Moolenaar 20233fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 20333fa29cfSBram Moolenaar 2048a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2058a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2068a7d6542SBram Moolenaar 2078a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2088a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2098a7d6542SBram Moolenaar 2108a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2118a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 21242a480bfSBram Moolenaar 213d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 21442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 215cab27678SBram Moolenaar 216cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 217cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 218599c89c8SBram Moolenaarendfunc 219599c89c8SBram Moolenaar 220599c89c8SBram Moolenaarfunc Test_wrong_type() 221599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 222599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 223599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 224599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 225599c89c8SBram Moolenaar 226599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 227599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 22842a480bfSBram Moolenaar 22942a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 23042a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 23142a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 23242a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 23342a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 23442a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 23542a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 23642a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 23742a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 23842a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 23942a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 2408a7d6542SBram Moolenaarendfunc 2418a7d6542SBram Moolenaar 2428a7d6542SBram Moolenaarfunc Test_const() 2438a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 2448a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 2458a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 2469be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 2478a7d6542SBram Moolenaarendfunc 2488a7d6542SBram Moolenaar 2498a7d6542SBram Moolenaardef Test_block() 2508a7d6542SBram Moolenaar let outer = 1 2518a7d6542SBram Moolenaar { 2528a7d6542SBram Moolenaar let inner = 2 2538a7d6542SBram Moolenaar assert_equal(1, outer) 2548a7d6542SBram Moolenaar assert_equal(2, inner) 2558a7d6542SBram Moolenaar } 2568a7d6542SBram Moolenaar assert_equal(1, outer) 2578a7d6542SBram Moolenaarenddef 2588a7d6542SBram Moolenaar 2598a7d6542SBram Moolenaarfunc Test_block_failure() 2608a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 261585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 262585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 2638a7d6542SBram Moolenaarendfunc 2648a7d6542SBram Moolenaar 265585fea7bSBram Moolenaardef Test_cmd_modifier() 266585fea7bSBram Moolenaar tab echo '0' 267585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 268585fea7bSBram Moolenaarenddef 269585fea7bSBram Moolenaar 2708a7d6542SBram Moolenaardef Test_try_catch() 2718a7d6542SBram Moolenaar let l = [] 2728a7d6542SBram Moolenaar try 2738a7d6542SBram Moolenaar add(l, '1') 2748a7d6542SBram Moolenaar throw 'wrong' 2758a7d6542SBram Moolenaar add(l, '2') 2768a7d6542SBram Moolenaar catch 2778a7d6542SBram Moolenaar add(l, v:exception) 2788a7d6542SBram Moolenaar finally 2798a7d6542SBram Moolenaar add(l, '3') 2808a7d6542SBram Moolenaar endtry 2818a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 2828a7d6542SBram Moolenaarenddef 2838a7d6542SBram Moolenaar 284257cc5eeSBram Moolenaardef ThrowFromDef() 285257cc5eeSBram Moolenaar throw 'getout' 286257cc5eeSBram Moolenaarenddef 287257cc5eeSBram Moolenaar 288257cc5eeSBram Moolenaarfunc CatchInFunc() 289257cc5eeSBram Moolenaar try 290257cc5eeSBram Moolenaar call ThrowFromDef() 291257cc5eeSBram Moolenaar catch 292257cc5eeSBram Moolenaar let g:thrown_func = v:exception 293257cc5eeSBram Moolenaar endtry 294257cc5eeSBram Moolenaarendfunc 295257cc5eeSBram Moolenaar 296257cc5eeSBram Moolenaardef CatchInDef() 297257cc5eeSBram Moolenaar try 298257cc5eeSBram Moolenaar ThrowFromDef() 299257cc5eeSBram Moolenaar catch 300257cc5eeSBram Moolenaar g:thrown_def = v:exception 301257cc5eeSBram Moolenaar endtry 302257cc5eeSBram Moolenaarenddef 303257cc5eeSBram Moolenaar 304f575adffSBram Moolenaardef ReturnFinally(): string 305f575adffSBram Moolenaar try 306f575adffSBram Moolenaar return 'intry' 307f575adffSBram Moolenaar finally 308f575adffSBram Moolenaar g:in_finally = 'finally' 309f575adffSBram Moolenaar endtry 310f575adffSBram Moolenaar return 'end' 311f575adffSBram Moolenaarenddef 312f575adffSBram Moolenaar 313257cc5eeSBram Moolenaardef Test_try_catch_nested() 314257cc5eeSBram Moolenaar CatchInFunc() 315257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 316257cc5eeSBram Moolenaar 317257cc5eeSBram Moolenaar CatchInDef() 318257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 319f575adffSBram Moolenaar 320f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 321f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 322f575adffSBram Moolenaarenddef 323f575adffSBram Moolenaar 324f575adffSBram Moolenaardef Test_try_catch_match() 325f575adffSBram Moolenaar let seq = 'a' 326f575adffSBram Moolenaar try 327f575adffSBram Moolenaar throw 'something' 328f575adffSBram Moolenaar catch /nothing/ 329f575adffSBram Moolenaar seq ..= 'x' 330f575adffSBram Moolenaar catch /some/ 331f575adffSBram Moolenaar seq ..= 'b' 332f575adffSBram Moolenaar catch /asdf/ 333f575adffSBram Moolenaar seq ..= 'x' 334e8c4abbbSBram Moolenaar catch ?a\?sdf? 335e8c4abbbSBram Moolenaar seq ..= 'y' 336f575adffSBram Moolenaar finally 337f575adffSBram Moolenaar seq ..= 'c' 338f575adffSBram Moolenaar endtry 339f575adffSBram Moolenaar assert_equal('abc', seq) 340257cc5eeSBram Moolenaarenddef 341257cc5eeSBram Moolenaar 342e8c4abbbSBram Moolenaardef Test_try_catch_fails() 343e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 344e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 345e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 346585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 347585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 348585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 349585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 350585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 351585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 352585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 353585fea7bSBram Moolenaar 354585fea7bSBram Moolenaar call CheckDefFailure(['throw'], 'E471:') 355585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 356e8c4abbbSBram Moolenaarenddef 357e8c4abbbSBram Moolenaar 3588a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 3598a7d6542SBram Moolenaar vim9script 3608a7d6542SBram Moolenaar let name: string = 'bob' 3618a7d6542SBram Moolenaar def Concat(arg: string): string 3628a7d6542SBram Moolenaar return name .. arg 3638a7d6542SBram Moolenaar enddef 3648a7d6542SBram Moolenaar let g:result = Concat('bie') 3658a7d6542SBram Moolenaar let g:localname = name 3668a7d6542SBram Moolenaar 3678a7d6542SBram Moolenaar export const CONST = 1234 3688a7d6542SBram Moolenaar export let exported = 9876 3696e587dcbSBram Moolenaar export let exp_name = 'John' 3708a7d6542SBram Moolenaar export def Exported(): string 3718a7d6542SBram Moolenaar return 'Exported' 3728a7d6542SBram Moolenaar enddef 3738a7d6542SBram MoolenaarEND 3748a7d6542SBram Moolenaar 3755269bd2aSBram Moolenaardef Test_vim9_import_export() 3768a7d6542SBram Moolenaar let import_script_lines =<< trim END 3778a7d6542SBram Moolenaar vim9script 3788a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 3798a7d6542SBram Moolenaar g:imported = exported 3806e587dcbSBram Moolenaar exported += 3 3816e587dcbSBram Moolenaar g:imported_added = exported 3828a7d6542SBram Moolenaar g:imported_func = Exported() 3836e587dcbSBram Moolenaar 3846e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 3856e587dcbSBram Moolenaar g:imported_name = exp_name 3866e587dcbSBram Moolenaar exp_name ..= ' Doe' 3876e587dcbSBram Moolenaar g:imported_name_appended = exp_name 3885381c7a1SBram Moolenaar g:imported_later = exported 3898a7d6542SBram Moolenaar END 3908a7d6542SBram Moolenaar 3918a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 3928a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 3938a7d6542SBram Moolenaar 3948a7d6542SBram Moolenaar source Ximport.vim 3958a7d6542SBram Moolenaar 3968a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 3978a7d6542SBram Moolenaar assert_equal('bob', g:localname) 3988a7d6542SBram Moolenaar assert_equal(9876, g:imported) 3996e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 4005381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 4018a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 4026e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 4036e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 4048a7d6542SBram Moolenaar assert_false(exists('g:name')) 4058a7d6542SBram Moolenaar 4068a7d6542SBram Moolenaar unlet g:result 4078a7d6542SBram Moolenaar unlet g:localname 4088a7d6542SBram Moolenaar unlet g:imported 4096e587dcbSBram Moolenaar unlet g:imported_added 4105381c7a1SBram Moolenaar unlet g:imported_later 4118a7d6542SBram Moolenaar unlet g:imported_func 4126e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 4138a7d6542SBram Moolenaar delete('Ximport.vim') 414f2d5c240SBram Moolenaar 4155381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 4165381c7a1SBram Moolenaar vim9script 4175381c7a1SBram Moolenaar def ImportInDef() 4185381c7a1SBram Moolenaar import exported from './Xexport.vim' 4195381c7a1SBram Moolenaar g:imported = exported 4205381c7a1SBram Moolenaar exported += 7 4215381c7a1SBram Moolenaar g:imported_added = exported 4225381c7a1SBram Moolenaar enddef 4235381c7a1SBram Moolenaar ImportInDef() 4245381c7a1SBram Moolenaar END 4255381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 4265381c7a1SBram Moolenaar source Ximport2.vim 4275381c7a1SBram Moolenaar " TODO: this should be 9879 4285381c7a1SBram Moolenaar assert_equal(9876, g:imported) 4295381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 4305381c7a1SBram Moolenaar unlet g:imported 4315381c7a1SBram Moolenaar unlet g:imported_added 4325381c7a1SBram Moolenaar delete('Ximport2.vim') 4335381c7a1SBram Moolenaar 434f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 435f2d5c240SBram Moolenaar vim9script 436f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 437f2d5c240SBram Moolenaar def UseExport() 438f2d5c240SBram Moolenaar g:imported = Export.exported 439f2d5c240SBram Moolenaar enddef 440f2d5c240SBram Moolenaar UseExport() 441f2d5c240SBram Moolenaar END 442f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 443f2d5c240SBram Moolenaar source Ximport.vim 4445381c7a1SBram Moolenaar assert_equal(9883, g:imported) 445f2d5c240SBram Moolenaar 446599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 447599c89c8SBram Moolenaar vim9script 448599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 449599c89c8SBram Moolenaar def Func() 450599c89c8SBram Moolenaar let dummy = 1 451599c89c8SBram Moolenaar let imported = Export + dummy 452599c89c8SBram Moolenaar enddef 453599c89c8SBram Moolenaar END 454599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 455599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 456599c89c8SBram Moolenaar 457599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 458599c89c8SBram Moolenaar vim9script 459599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 460599c89c8SBram Moolenaar def Func() 461599c89c8SBram Moolenaar let imported = Export . exported 462599c89c8SBram Moolenaar enddef 463599c89c8SBram Moolenaar END 464599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 465599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 466599c89c8SBram Moolenaar 467599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 468599c89c8SBram Moolenaar vim9script 469599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 470599c89c8SBram Moolenaar def Func() 471599c89c8SBram Moolenaar let imported = Export. 472599c89c8SBram Moolenaar enddef 473599c89c8SBram Moolenaar END 474599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 475599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 476599c89c8SBram Moolenaar 477f2d5c240SBram Moolenaar let import_star_lines =<< trim END 478f2d5c240SBram Moolenaar vim9script 479f2d5c240SBram Moolenaar import * from './Xexport.vim' 480f2d5c240SBram Moolenaar g:imported = exported 481f2d5c240SBram Moolenaar END 482f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 483f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 484f2d5c240SBram Moolenaar 485fa29c8abSBram Moolenaar " try to import something that exists but is not exported 486fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 487fa29c8abSBram Moolenaar vim9script 488fa29c8abSBram Moolenaar import name from './Xexport.vim' 489fa29c8abSBram Moolenaar END 490fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 491fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 492fa29c8abSBram Moolenaar 4935269bd2aSBram Moolenaar " try to import something that is already defined 4945269bd2aSBram Moolenaar let import_already_defined =<< trim END 4955269bd2aSBram Moolenaar vim9script 4965269bd2aSBram Moolenaar let exported = 'something' 4975269bd2aSBram Moolenaar import exported from './Xexport.vim' 4985269bd2aSBram Moolenaar END 4995269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5005269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5015269bd2aSBram Moolenaar 5025269bd2aSBram Moolenaar " try to import something that is already defined 5035269bd2aSBram Moolenaar import_already_defined =<< trim END 5045269bd2aSBram Moolenaar vim9script 5055269bd2aSBram Moolenaar let exported = 'something' 5065269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 5075269bd2aSBram Moolenaar END 5085269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5095269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5105269bd2aSBram Moolenaar 5115269bd2aSBram Moolenaar " try to import something that is already defined 5125269bd2aSBram Moolenaar import_already_defined =<< trim END 5135269bd2aSBram Moolenaar vim9script 5145269bd2aSBram Moolenaar let exported = 'something' 5155269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 5165269bd2aSBram Moolenaar END 5175269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 5185269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 5195269bd2aSBram Moolenaar 520fa29c8abSBram Moolenaar " import a very long name, requires making a copy 521fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 522fa29c8abSBram Moolenaar vim9script 523fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 524fa29c8abSBram Moolenaar END 525fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 526fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 527fa29c8abSBram Moolenaar 528fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 529fa29c8abSBram Moolenaar vim9script 530fa29c8abSBram Moolenaar import name './Xexport.vim' 531fa29c8abSBram Moolenaar END 532fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 533fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 534fa29c8abSBram Moolenaar 535fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 536fa29c8abSBram Moolenaar vim9script 537fa29c8abSBram Moolenaar import name from Xexport.vim 538fa29c8abSBram Moolenaar END 539fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 540fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 541fa29c8abSBram Moolenaar 542fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 543fa29c8abSBram Moolenaar vim9script 544fa29c8abSBram Moolenaar import name from './XnoExport.vim' 545fa29c8abSBram Moolenaar END 546fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 547fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 548fa29c8abSBram Moolenaar 549fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 550fa29c8abSBram Moolenaar vim9script 551fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 552fa29c8abSBram Moolenaar END 5535269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 5545269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 555fa29c8abSBram Moolenaar 556f2d5c240SBram Moolenaar delete('Ximport.vim') 5575269bd2aSBram Moolenaar delete('Ximport3.vim') 5588a7d6542SBram Moolenaar delete('Xexport.vim') 5598a7d6542SBram Moolenaar 560750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 561750802b5SBram Moolenaar set cpo&vi 562750802b5SBram Moolenaar let cpo_before = &cpo 563750802b5SBram Moolenaar let lines =<< trim END 564750802b5SBram Moolenaar vim9script 565750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 566750802b5SBram Moolenaar END 567750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 568750802b5SBram Moolenaar source Xvim9_script 569750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 570750802b5SBram Moolenaar set cpo&vim 571750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 572750802b5SBram Moolenaar delete('Xvim9_script') 573750802b5SBram Moolenaarenddef 574750802b5SBram Moolenaar 575750802b5SBram Moolenaardef Test_vim9script_fails() 5768a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 5778a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 578750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 579f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 580750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 581750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 582750802b5SBram Moolenaar 583750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 584750802b5SBram Moolenaar assert_fails('export something', 'E1042') 5858a7d6542SBram Moolenaarenddef 5868a7d6542SBram Moolenaar 5878a7d6542SBram Moolenaardef Test_vim9script_reload() 5888a7d6542SBram Moolenaar let lines =<< trim END 5898a7d6542SBram Moolenaar vim9script 5908a7d6542SBram Moolenaar const var = '' 5918a7d6542SBram Moolenaar let valone = 1234 5928a7d6542SBram Moolenaar def MyFunc(arg: string) 5938a7d6542SBram Moolenaar valone = 5678 5948a7d6542SBram Moolenaar enddef 5958a7d6542SBram Moolenaar END 5968a7d6542SBram Moolenaar let morelines =<< trim END 5978a7d6542SBram Moolenaar let valtwo = 222 5988a7d6542SBram Moolenaar export def GetValtwo(): number 5998a7d6542SBram Moolenaar return valtwo 6008a7d6542SBram Moolenaar enddef 6018a7d6542SBram Moolenaar END 602675f716eSBram Moolenaar writefile(lines + morelines, 603675f716eSBram Moolenaar 'Xreload.vim') 6048a7d6542SBram Moolenaar source Xreload.vim 6058a7d6542SBram Moolenaar source Xreload.vim 6068a7d6542SBram Moolenaar source Xreload.vim 6078a7d6542SBram Moolenaar 6088a7d6542SBram Moolenaar let testlines =<< trim END 6098a7d6542SBram Moolenaar vim9script 6108a7d6542SBram Moolenaar def TheFunc() 6118a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 6128a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 6138a7d6542SBram Moolenaar enddef 6148a7d6542SBram Moolenaar TheFunc() 6158a7d6542SBram Moolenaar END 6168a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 6178a7d6542SBram Moolenaar source Ximport.vim 6188a7d6542SBram Moolenaar 6198a7d6542SBram Moolenaar " test that when not using "morelines" valtwo is still defined 6208a7d6542SBram Moolenaar " need to source Xreload.vim again, import doesn't reload a script 6218a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6228a7d6542SBram Moolenaar source Xreload.vim 6238a7d6542SBram Moolenaar source Ximport.vim 6248a7d6542SBram Moolenaar 6258a7d6542SBram Moolenaar " cannot declare a var twice 6268a7d6542SBram Moolenaar lines =<< trim END 6278a7d6542SBram Moolenaar vim9script 6288a7d6542SBram Moolenaar let valone = 1234 6298a7d6542SBram Moolenaar let valone = 5678 6308a7d6542SBram Moolenaar END 6318a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 6328a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 6338a7d6542SBram Moolenaar 6348a7d6542SBram Moolenaar delete('Xreload.vim') 6358a7d6542SBram Moolenaar delete('Ximport.vim') 6368a7d6542SBram Moolenaarenddef 6378a7d6542SBram Moolenaar 6388a7d6542SBram Moolenaardef Test_import_absolute() 6398a7d6542SBram Moolenaar let import_lines = [ 640e6085c53SBram Moolenaar 'vim9script', 641e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 642e6085c53SBram Moolenaar 'def UseExported()', 643e6085c53SBram Moolenaar ' g:imported_abs = exported', 644e6085c53SBram Moolenaar ' exported = 8888', 645e6085c53SBram Moolenaar ' g:imported_after = exported', 646e6085c53SBram Moolenaar 'enddef', 647e6085c53SBram Moolenaar 'UseExported()', 648e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 649e6085c53SBram Moolenaar ] 6508a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 6518a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 6528a7d6542SBram Moolenaar 6538a7d6542SBram Moolenaar source Ximport_abs.vim 6548a7d6542SBram Moolenaar 6558a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 6564e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 657675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 658675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 659675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 660675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 661675f716eSBram Moolenaar 'exported = 8888.*' .. 662675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 663675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 664675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 665675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 666e6085c53SBram Moolenaar g:import_disassembled) 6678a7d6542SBram Moolenaar unlet g:imported_abs 6684e12a5dfSBram Moolenaar unlet g:import_disassembled 6698a7d6542SBram Moolenaar 6708a7d6542SBram Moolenaar delete('Ximport_abs.vim') 6718a7d6542SBram Moolenaar delete('Xexport_abs.vim') 6728a7d6542SBram Moolenaarenddef 6738a7d6542SBram Moolenaar 6748a7d6542SBram Moolenaardef Test_import_rtp() 6758a7d6542SBram Moolenaar let import_lines = [ 676e6085c53SBram Moolenaar 'vim9script', 677e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 678e6085c53SBram Moolenaar 'g:imported_rtp = exported', 679e6085c53SBram Moolenaar ] 6808a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 6818a7d6542SBram Moolenaar mkdir('import') 6828a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 6838a7d6542SBram Moolenaar 6848a7d6542SBram Moolenaar let save_rtp = &rtp 6858a7d6542SBram Moolenaar &rtp = getcwd() 6868a7d6542SBram Moolenaar source Ximport_rtp.vim 6878a7d6542SBram Moolenaar &rtp = save_rtp 6888a7d6542SBram Moolenaar 6898a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 6908a7d6542SBram Moolenaar unlet g:imported_rtp 6918a7d6542SBram Moolenaar 6928a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 6938a7d6542SBram Moolenaar delete('import/Xexport_rtp.vim') 6948a7d6542SBram Moolenaar delete('import', 'd') 6958a7d6542SBram Moolenaarenddef 6968a7d6542SBram Moolenaar 6978a7d6542SBram Moolenaardef Test_fixed_size_list() 6988a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 6998a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 7008a7d6542SBram Moolenaar l->remove(0) 7018a7d6542SBram Moolenaar l->add(5) 7028a7d6542SBram Moolenaar l->insert(99, 1) 7030f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 7048a7d6542SBram Moolenaarenddef 7058a7d6542SBram Moolenaar 706158906cfSBram Moolenaardef IfElse(what: number): string 707158906cfSBram Moolenaar let res = '' 708158906cfSBram Moolenaar if what == 1 709158906cfSBram Moolenaar res = "one" 710158906cfSBram Moolenaar elseif what == 2 711158906cfSBram Moolenaar res = "two" 712a259d8d3SBram Moolenaar else 713158906cfSBram Moolenaar res = "three" 714a259d8d3SBram Moolenaar endif 715158906cfSBram Moolenaar return res 716a259d8d3SBram Moolenaarenddef 717a259d8d3SBram Moolenaar 718158906cfSBram Moolenaardef Test_if_elseif_else() 719158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 720158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 721158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 7220f18b6d1SBram Moolenaarenddef 7230f18b6d1SBram Moolenaar 724e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 725e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 726e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 727e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 728e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 729585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 730e8c4abbbSBram Moolenaarenddef 731e8c4abbbSBram Moolenaar 7326d69bf60SBram Moolenaarlet g:bool_true = v:true 7336d69bf60SBram Moolenaarlet g:bool_false = v:false 7346d69bf60SBram Moolenaar 7356d69bf60SBram Moolenaardef Test_if_const_expr() 7366d69bf60SBram Moolenaar let res = false 7376d69bf60SBram Moolenaar if true ? true : false 7386d69bf60SBram Moolenaar res = true 7396d69bf60SBram Moolenaar endif 7406d69bf60SBram Moolenaar assert_equal(true, res) 7416d69bf60SBram Moolenaar 742585fea7bSBram Moolenaar g:glob = 2 743585fea7bSBram Moolenaar if false 744585fea7bSBram Moolenaar execute('let g:glob = 3') 745585fea7bSBram Moolenaar endif 746585fea7bSBram Moolenaar assert_equal(2, g:glob) 747585fea7bSBram Moolenaar if true 748585fea7bSBram Moolenaar execute('let g:glob = 3') 749585fea7bSBram Moolenaar endif 750585fea7bSBram Moolenaar assert_equal(3, g:glob) 751585fea7bSBram Moolenaar 7526d69bf60SBram Moolenaar res = false 7536d69bf60SBram Moolenaar if g:bool_true ? true : false 7546d69bf60SBram Moolenaar res = true 7556d69bf60SBram Moolenaar endif 7566d69bf60SBram Moolenaar assert_equal(true, res) 7576d69bf60SBram Moolenaar 7586d69bf60SBram Moolenaar res = false 7596d69bf60SBram Moolenaar if true ? g:bool_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 ? true : g:bool_false 7666d69bf60SBram Moolenaar res = true 7676d69bf60SBram Moolenaar endif 7686d69bf60SBram Moolenaar assert_equal(true, res) 7696d69bf60SBram Moolenaar 7706d69bf60SBram Moolenaar res = false 7716d69bf60SBram Moolenaar if true ? false : true 7726d69bf60SBram Moolenaar res = true 7736d69bf60SBram Moolenaar endif 7746d69bf60SBram Moolenaar assert_equal(false, res) 7756d69bf60SBram Moolenaar 7766d69bf60SBram Moolenaar res = false 7776d69bf60SBram Moolenaar if false ? false : true 7786d69bf60SBram Moolenaar res = true 7796d69bf60SBram Moolenaar endif 7806d69bf60SBram Moolenaar assert_equal(true, res) 7816d69bf60SBram Moolenaar 7826d69bf60SBram Moolenaar res = false 7836d69bf60SBram Moolenaar if false ? true : false 7846d69bf60SBram Moolenaar res = true 7856d69bf60SBram Moolenaar endif 7866d69bf60SBram Moolenaar assert_equal(false, res) 7876d69bf60SBram Moolenaar 7886d69bf60SBram Moolenaar res = false 789e8c4abbbSBram Moolenaar if has('xyz') ? true : false 790e8c4abbbSBram Moolenaar res = true 791e8c4abbbSBram Moolenaar endif 792e8c4abbbSBram Moolenaar assert_equal(false, res) 793e8c4abbbSBram Moolenaar 794e8c4abbbSBram Moolenaar res = false 7956d69bf60SBram Moolenaar if true && true 7966d69bf60SBram Moolenaar res = true 7976d69bf60SBram Moolenaar endif 7986d69bf60SBram Moolenaar assert_equal(true, res) 7996d69bf60SBram Moolenaar 8006d69bf60SBram Moolenaar res = false 8016d69bf60SBram Moolenaar if true && false 8026d69bf60SBram Moolenaar res = true 8036d69bf60SBram Moolenaar endif 8046d69bf60SBram Moolenaar assert_equal(false, res) 8056d69bf60SBram Moolenaar 8066d69bf60SBram Moolenaar res = false 8076d69bf60SBram Moolenaar if g:bool_true && false 8086d69bf60SBram Moolenaar res = true 8096d69bf60SBram Moolenaar endif 8106d69bf60SBram Moolenaar assert_equal(false, res) 8116d69bf60SBram Moolenaar 8126d69bf60SBram Moolenaar res = false 8136d69bf60SBram Moolenaar if true && g:bool_false 8146d69bf60SBram Moolenaar res = true 8156d69bf60SBram Moolenaar endif 8166d69bf60SBram Moolenaar assert_equal(false, res) 8176d69bf60SBram Moolenaar 8186d69bf60SBram Moolenaar res = false 8196d69bf60SBram Moolenaar if false && false 8206d69bf60SBram Moolenaar res = true 8216d69bf60SBram Moolenaar endif 8226d69bf60SBram Moolenaar assert_equal(false, res) 8236d69bf60SBram Moolenaar 8246d69bf60SBram Moolenaar res = false 8256d69bf60SBram Moolenaar if true || false 8266d69bf60SBram Moolenaar res = true 8276d69bf60SBram Moolenaar endif 8286d69bf60SBram Moolenaar assert_equal(true, res) 8296d69bf60SBram Moolenaar 8306d69bf60SBram Moolenaar res = false 8316d69bf60SBram Moolenaar if g:bool_true || false 8326d69bf60SBram Moolenaar res = true 8336d69bf60SBram Moolenaar endif 8346d69bf60SBram Moolenaar assert_equal(true, res) 8356d69bf60SBram Moolenaar 8366d69bf60SBram Moolenaar res = false 8376d69bf60SBram Moolenaar if true || g:bool_false 8386d69bf60SBram Moolenaar res = true 8396d69bf60SBram Moolenaar endif 8406d69bf60SBram Moolenaar assert_equal(true, res) 8416d69bf60SBram Moolenaar 8426d69bf60SBram Moolenaar res = false 8436d69bf60SBram Moolenaar if false || false 8446d69bf60SBram Moolenaar res = true 8456d69bf60SBram Moolenaar endif 8466d69bf60SBram Moolenaar assert_equal(false, res) 84780c34ca3SBram Moolenaarenddef 8486d69bf60SBram Moolenaar 84980c34ca3SBram Moolenaardef Test_if_const_expr_fails() 85080c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 85180c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 852e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 853e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 8546d69bf60SBram Moolenaarenddef 8556d69bf60SBram Moolenaar 856ad39c094SBram Moolenaardef Test_execute_cmd() 857ad39c094SBram Moolenaar new 858ad39c094SBram Moolenaar setline(1, 'default') 859ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 860ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 861ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 862ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 863ad39c094SBram Moolenaar execute cmd1 cmd2 864ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 865ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 866ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 867ad39c094SBram Moolenaar let cmd_first = 'call ' 868ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 869ad39c094SBram Moolenaar execute cmd_first .. cmd_last 870ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 871ad39c094SBram Moolenaar bwipe! 872585fea7bSBram Moolenaar 873585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 874ad39c094SBram Moolenaarenddef 875ad39c094SBram Moolenaar 876ad39c094SBram Moolenaardef Test_echo_cmd() 877585fea7bSBram Moolenaar echo 'some' 878585fea7bSBram Moolenaar echon 'thing' 879ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 880ad39c094SBram Moolenaar 881ad39c094SBram Moolenaar let str1 = 'some' 882ad39c094SBram Moolenaar let str2 = 'more' 883ad39c094SBram Moolenaar echo str1 str2 884ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 885ad39c094SBram Moolenaarenddef 886ad39c094SBram Moolenaar 88741fe0617SBram Moolenaardef Test_for_outside_of_function() 88841fe0617SBram Moolenaar let lines =<< trim END 88941fe0617SBram Moolenaar vim9script 89041fe0617SBram Moolenaar new 89141fe0617SBram Moolenaar for var in range(0, 3) 89241fe0617SBram Moolenaar append(line('$'), var) 89341fe0617SBram Moolenaar endfor 89441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 89541fe0617SBram Moolenaar bwipe! 89641fe0617SBram Moolenaar END 89741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 89841fe0617SBram Moolenaar source Xvim9for.vim 89941fe0617SBram Moolenaar delete('Xvim9for.vim') 90041fe0617SBram Moolenaarenddef 9018a7d6542SBram Moolenaar 902e8c4abbbSBram Moolenaardef Test_for_loop() 903e8c4abbbSBram Moolenaar let result = '' 904e8c4abbbSBram Moolenaar for cnt in range(7) 905e8c4abbbSBram Moolenaar if cnt == 4 906e8c4abbbSBram Moolenaar break 907e8c4abbbSBram Moolenaar endif 908e8c4abbbSBram Moolenaar if cnt == 2 909e8c4abbbSBram Moolenaar continue 910e8c4abbbSBram Moolenaar endif 911e8c4abbbSBram Moolenaar result ..= cnt .. '_' 912e8c4abbbSBram Moolenaar endfor 913e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 914e8c4abbbSBram Moolenaarenddef 915e8c4abbbSBram Moolenaar 916e8c4abbbSBram Moolenaardef Test_for_loop_fails() 917675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 918675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 919675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 920*6e949784SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:') 921675f716eSBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1024:') 922675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 923675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 924675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 925e8c4abbbSBram Moolenaarenddef 926e8c4abbbSBram Moolenaar 927d0df1aacSBram Moolenaardef Test_while_loop() 928d0df1aacSBram Moolenaar let result = '' 929d0df1aacSBram Moolenaar let cnt = 0 930d0df1aacSBram Moolenaar while cnt < 555 931d0df1aacSBram Moolenaar if cnt == 3 932d0df1aacSBram Moolenaar break 933d0df1aacSBram Moolenaar endif 934d0df1aacSBram Moolenaar cnt += 1 935d0df1aacSBram Moolenaar if cnt == 2 936d0df1aacSBram Moolenaar continue 937d0df1aacSBram Moolenaar endif 938d0df1aacSBram Moolenaar result ..= cnt .. '_' 939d0df1aacSBram Moolenaar endwhile 940d0df1aacSBram Moolenaar assert_equal('1_3_', result) 941d0df1aacSBram Moolenaarenddef 942d0df1aacSBram Moolenaar 943e8c4abbbSBram Moolenaardef Test_while_loop_fails() 944675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 945675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 946675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 947675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 948675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 949675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 950675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 951bd5da371SBram Moolenaarenddef 952bd5da371SBram Moolenaar 9539645e2d9SBram Moolenaardef Test_interrupt_loop() 95497acfc78SBram Moolenaar let caught = false 9559645e2d9SBram Moolenaar let x = 0 95697acfc78SBram Moolenaar try 9579645e2d9SBram Moolenaar while 1 9589645e2d9SBram Moolenaar x += 1 9599645e2d9SBram Moolenaar if x == 100 9609645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 9619645e2d9SBram Moolenaar endif 9629645e2d9SBram Moolenaar endwhile 96397acfc78SBram Moolenaar catch 96497acfc78SBram Moolenaar caught = true 96597acfc78SBram Moolenaar assert_equal(100, x) 96697acfc78SBram Moolenaar endtry 96797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 9689645e2d9SBram Moolenaarenddef 96920431c9dSBram Moolenaar 9704fdae999SBram Moolenaardef Test_automatic_line_continuation() 9714fdae999SBram Moolenaar let mylist = [ 9724fdae999SBram Moolenaar 'one', 9734fdae999SBram Moolenaar 'two', 9744fdae999SBram Moolenaar 'three', 9754fdae999SBram Moolenaar ] " comment 9764fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 9774fdae999SBram Moolenaar 9784fdae999SBram Moolenaar let mydict = { 9794fdae999SBram Moolenaar 'one': 1, 9804fdae999SBram Moolenaar 'two': 2, 9814fdae999SBram Moolenaar 'three': 9824fdae999SBram Moolenaar 3, 9834fdae999SBram Moolenaar } " comment 9844fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 9854fdae999SBram Moolenaar mydict = #{ 9862c330432SBram Moolenaar one: 1, # comment 9872c330432SBram Moolenaar two: # comment 9882c330432SBram Moolenaar 2, # comment 9892c330432SBram Moolenaar three: 3 # comment 9902c330432SBram Moolenaar } 9912c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 9922c330432SBram Moolenaar mydict = #{ 9932c330432SBram Moolenaar one: 1, 9944fdae999SBram Moolenaar two: 9954fdae999SBram Moolenaar 2, 9962c330432SBram Moolenaar three: 3 9974fdae999SBram Moolenaar } 9984fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 999e6085c53SBram Moolenaar 1000e6085c53SBram Moolenaar assert_equal( 1001e6085c53SBram Moolenaar ['one', 'two', 'three'], 1002e6085c53SBram Moolenaar split('one two three') 1003e6085c53SBram Moolenaar ) 10044fdae999SBram Moolenaarenddef 10054fdae999SBram Moolenaar 1006585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1007585fea7bSBram Moolenaardef Test_substitute_cmd() 1008585fea7bSBram Moolenaar new 1009585fea7bSBram Moolenaar setline(1, 'something') 1010585fea7bSBram Moolenaar :substitute(some(other( 1011585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1012585fea7bSBram Moolenaar bwipe! 1013585fea7bSBram Moolenaar 1014585fea7bSBram Moolenaar " also when the context is Vim9 script 1015585fea7bSBram Moolenaar let lines =<< trim END 1016585fea7bSBram Moolenaar vim9script 1017585fea7bSBram Moolenaar new 1018585fea7bSBram Moolenaar setline(1, 'something') 1019585fea7bSBram Moolenaar :substitute(some(other( 1020585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1021585fea7bSBram Moolenaar bwipe! 1022585fea7bSBram Moolenaar END 1023585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1024585fea7bSBram Moolenaar source Xvim9lines 1025585fea7bSBram Moolenaar 1026585fea7bSBram Moolenaar delete('Xvim9lines') 1027585fea7bSBram Moolenaarenddef 1028585fea7bSBram Moolenaar 10298a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1030