18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4ad39c094SBram Moolenaarsource view_util.vim 5cfe435d7SBram Moolenaarsource vim9.vim 68a7d6542SBram Moolenaar 78a7d6542SBram Moolenaardef Test_syntax() 88a7d6542SBram Moolenaar let var = 234 98a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 108a7d6542SBram Moolenaarenddef 118a7d6542SBram Moolenaar 126e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 136e587dcbSBram Moolenaarlet s:addToMe = 111 14401d9ffbSBram Moolenaarlet g:existing = 'yes' 15a8c17704SBram Moolenaarlet g:inc_counter = 1 16a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 17a6e67e4fSBram Moolenaarlet g:alist = [7] 18a6e67e4fSBram Moolenaarlet g:astring = 'text' 196e587dcbSBram Moolenaar 208a7d6542SBram Moolenaardef Test_assignment() 218a7d6542SBram Moolenaar let bool1: bool = true 228a7d6542SBram Moolenaar assert_equal(v:true, bool1) 238a7d6542SBram Moolenaar let bool2: bool = false 248a7d6542SBram Moolenaar assert_equal(v:false, bool2) 258a7d6542SBram Moolenaar 26f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 27f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 281cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 29f93c7feaSBram Moolenaar 309be61bbbSBram Moolenaar let a: number = 6 319be61bbbSBram Moolenaar assert_equal(6, a) 329be61bbbSBram Moolenaar 3342a480bfSBram Moolenaar if has('channel') 3442a480bfSBram Moolenaar let chan1: channel 35fbdd08edSBram Moolenaar let job1: job 36f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 3742a480bfSBram Moolenaar endif 38fbdd08edSBram Moolenaar if has('float') 39fbdd08edSBram Moolenaar let float1: float = 3.4 40fbdd08edSBram Moolenaar endif 415deeb3f1SBram Moolenaar let Funky1: func 425deeb3f1SBram Moolenaar let Funky2: func = function('len') 434c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4442a480bfSBram Moolenaar 45401d9ffbSBram Moolenaar g:newvar = 'new' 46401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 47401d9ffbSBram Moolenaar 48401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 49401d9ffbSBram Moolenaar g:existing = 'no' 50401d9ffbSBram Moolenaar assert_equal('no', g:existing) 51401d9ffbSBram Moolenaar 52b283a8a6SBram Moolenaar v:char = 'abc' 536e587dcbSBram Moolenaar assert_equal('abc', v:char) 54b283a8a6SBram Moolenaar 55b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 566e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 57b283a8a6SBram Moolenaar $ENVVAR = '' 586e587dcbSBram Moolenaar 59fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 60fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 61fd1823e0SBram Moolenaar s:addToMe += 222 62fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 630bbf722aSBram Moolenaar s:newVar = 'new' 640bbf722aSBram Moolenaar assert_equal('new', s:newVar) 65a8c17704SBram Moolenaar 66a8c17704SBram Moolenaar set ts=7 67a8c17704SBram Moolenaar &ts += 1 68a8c17704SBram Moolenaar assert_equal(8, &ts) 6980c34ca3SBram Moolenaar &ts -= 3 7080c34ca3SBram Moolenaar assert_equal(5, &ts) 7180c34ca3SBram Moolenaar &ts *= 2 7280c34ca3SBram Moolenaar assert_equal(10, &ts) 7380c34ca3SBram Moolenaar &ts /= 3 7480c34ca3SBram Moolenaar assert_equal(3, &ts) 7580c34ca3SBram Moolenaar set ts=10 7680c34ca3SBram Moolenaar &ts %= 4 7780c34ca3SBram Moolenaar assert_equal(2, &ts) 78a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 79a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 80a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 81a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 82a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 83a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 84a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 85a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 86cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 87585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 8880c34ca3SBram Moolenaar &ts = 8 89a8c17704SBram Moolenaar 90a8c17704SBram Moolenaar g:inc_counter += 1 91a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 92a8c17704SBram Moolenaar 93a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 94a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 95a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 96a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 97a8c17704SBram Moolenaar 98a8c17704SBram Moolenaar @a = 'areg' 99a8c17704SBram Moolenaar @a ..= 'add' 100a8c17704SBram Moolenaar assert_equal('aregadd', @a) 101a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 102a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 103e69f6d04SBram Moolenaar 104e69f6d04SBram Moolenaar v:errmsg = 'none' 105e69f6d04SBram Moolenaar v:errmsg ..= 'again' 106e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 107e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 108e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 1095deeb3f1SBram Moolenaarenddef 1105deeb3f1SBram Moolenaar 11184370087SBram Moolenaardef Test_assignment_list() 11284370087SBram Moolenaar let list1: list<bool> = [false, true, false] 11384370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 11484370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 11584370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 11684370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 11784370087SBram Moolenaar 11884370087SBram Moolenaar let listS: list<string> = [] 11984370087SBram Moolenaar let listN: list<number> = [] 12084370087SBram Moolenaar 12184370087SBram Moolenaar assert_equal([1, 2, 3], list2) 12284370087SBram Moolenaar list2[-1] = 99 12384370087SBram Moolenaar assert_equal([1, 2, 99], list2) 12484370087SBram Moolenaar list2[-2] = 88 12584370087SBram Moolenaar assert_equal([1, 88, 99], list2) 12684370087SBram Moolenaar list2[-3] = 77 12784370087SBram Moolenaar assert_equal([77, 88, 99], list2) 12884370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 12984370087SBram Moolenaar 13084370087SBram Moolenaar # type becomes list<any> 13184370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 13284370087SBram Moolenaarenddef 13384370087SBram Moolenaar 13484370087SBram Moolenaardef Test_assignment_dict() 13584370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 13684370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 13784370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 13884370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 13974fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 14084370087SBram Moolenaar 14184370087SBram Moolenaar call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:') 14284370087SBram Moolenaar 14384370087SBram Moolenaar # type becomes dict<any> 14484370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 14584370087SBram Moolenaarenddef 14684370087SBram Moolenaar 147d3aac291SBram Moolenaardef Test_assignment_local() 148d3aac291SBram Moolenaar " Test in a separated file in order not to the current buffer/window/tab is 149d3aac291SBram Moolenaar " changed. 150d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 151d3aac291SBram Moolenaar let b:existing = 'yes' 152d3aac291SBram Moolenaar let w:existing = 'yes' 153d3aac291SBram Moolenaar let t:existing = 'yes' 154d3aac291SBram Moolenaar 155d3aac291SBram Moolenaar def Test_assignment_local_internal() 156d3aac291SBram Moolenaar b:newvar = 'new' 157d3aac291SBram Moolenaar assert_equal('new', b:newvar) 158d3aac291SBram Moolenaar assert_equal('yes', b:existing) 159d3aac291SBram Moolenaar b:existing = 'no' 160d3aac291SBram Moolenaar assert_equal('no', b:existing) 161396f3138SBram Moolenaar b:existing ..= 'NO' 162396f3138SBram Moolenaar assert_equal('noNO', b:existing) 163d3aac291SBram Moolenaar 164d3aac291SBram Moolenaar w:newvar = 'new' 165d3aac291SBram Moolenaar assert_equal('new', w:newvar) 166d3aac291SBram Moolenaar assert_equal('yes', w:existing) 167d3aac291SBram Moolenaar w:existing = 'no' 168d3aac291SBram Moolenaar assert_equal('no', w:existing) 169396f3138SBram Moolenaar w:existing ..= 'NO' 170396f3138SBram Moolenaar assert_equal('noNO', w:existing) 171d3aac291SBram Moolenaar 172d3aac291SBram Moolenaar t:newvar = 'new' 173d3aac291SBram Moolenaar assert_equal('new', t:newvar) 174d3aac291SBram Moolenaar assert_equal('yes', t:existing) 175d3aac291SBram Moolenaar t:existing = 'no' 176d3aac291SBram Moolenaar assert_equal('no', t:existing) 177396f3138SBram Moolenaar t:existing ..= 'NO' 178396f3138SBram Moolenaar assert_equal('noNO', t:existing) 179d3aac291SBram Moolenaar enddef 180d3aac291SBram Moolenaar call Test_assignment_local_internal() 181d3aac291SBram Moolenaar END 182d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 183d3aac291SBram Moolenaarenddef 184d3aac291SBram Moolenaar 1855deeb3f1SBram Moolenaardef Test_assignment_default() 186e69f6d04SBram Moolenaar 187cb711abfSBram Moolenaar # Test default values. 188e69f6d04SBram Moolenaar let thebool: bool 189e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 190e69f6d04SBram Moolenaar 191e69f6d04SBram Moolenaar let thenumber: number 192e69f6d04SBram Moolenaar assert_equal(0, thenumber) 193e69f6d04SBram Moolenaar 194e69f6d04SBram Moolenaar if has('float') 195e69f6d04SBram Moolenaar let thefloat: float 196e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 197e69f6d04SBram Moolenaar endif 198e69f6d04SBram Moolenaar 199e69f6d04SBram Moolenaar let thestring: string 200e69f6d04SBram Moolenaar assert_equal('', thestring) 201e69f6d04SBram Moolenaar 202e69f6d04SBram Moolenaar let theblob: blob 203e69f6d04SBram Moolenaar assert_equal(0z, theblob) 204e69f6d04SBram Moolenaar 2055deeb3f1SBram Moolenaar let Thefunc: func 2065deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 207e69f6d04SBram Moolenaar 208e69f6d04SBram Moolenaar let thelist: list<any> 209e69f6d04SBram Moolenaar assert_equal([], thelist) 210e69f6d04SBram Moolenaar 211e69f6d04SBram Moolenaar let thedict: dict<any> 212e69f6d04SBram Moolenaar assert_equal({}, thedict) 213e69f6d04SBram Moolenaar 2142c869deeSBram Moolenaar if has('channel') 215e69f6d04SBram Moolenaar let thejob: job 216e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 217e69f6d04SBram Moolenaar 218e69f6d04SBram Moolenaar let thechannel: channel 219e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 2202c869deeSBram Moolenaar endif 221585fea7bSBram Moolenaar 222585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 223585fea7bSBram Moolenaar assert_equal(5678, nr) 2248a7d6542SBram Moolenaarenddef 2258a7d6542SBram Moolenaar 226cab27678SBram Moolenaardef Mess(): string 227cab27678SBram Moolenaar v:foldstart = 123 228cab27678SBram Moolenaar return 'xxx' 229cab27678SBram Moolenaarenddef 230cab27678SBram Moolenaar 231d72c1bf0SBram Moolenaardef Test_assignment_failure() 2328a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 2338a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 2348a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 2358a7d6542SBram Moolenaar 2368a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 2378a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 2388a7d6542SBram Moolenaar 2399be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 2409be61bbbSBram Moolenaar 241e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 2429be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 2439be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 2449be61bbbSBram Moolenaar 2459be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 2469be61bbbSBram Moolenaar 2479be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 2489be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 2499be61bbbSBram Moolenaar 2509be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 251d3aac291SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1079:') 252d3aac291SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1078:') 253d3aac291SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1080:') 2549be61bbbSBram Moolenaar 2559be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 2569be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2579be61bbbSBram Moolenaar 258822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 25933fa29cfSBram Moolenaar 2608a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2618a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2628a7d6542SBram Moolenaar 2638a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2648a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2658a7d6542SBram Moolenaar 2668a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2678a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 26842a480bfSBram Moolenaar 269d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 27042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 271cab27678SBram Moolenaar 272cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 273cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 274d72c1bf0SBram Moolenaarenddef 275d72c1bf0SBram Moolenaar 276d72c1bf0SBram Moolenaardef Test_unlet() 277d72c1bf0SBram Moolenaar g:somevar = 'yes' 278d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 279d72c1bf0SBram Moolenaar unlet g:somevar 280d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 281d72c1bf0SBram Moolenaar unlet! g:somevar 282d72c1bf0SBram Moolenaar 283d72c1bf0SBram Moolenaar call CheckScriptFailure([ 284d72c1bf0SBram Moolenaar 'vim9script', 285d72c1bf0SBram Moolenaar 'let svar = 123', 286d72c1bf0SBram Moolenaar 'unlet svar', 287d72c1bf0SBram Moolenaar ], 'E1081:') 288d72c1bf0SBram Moolenaar call CheckScriptFailure([ 289d72c1bf0SBram Moolenaar 'vim9script', 290d72c1bf0SBram Moolenaar 'let svar = 123', 291d72c1bf0SBram Moolenaar 'unlet s:svar', 292d72c1bf0SBram Moolenaar ], 'E1081:') 293d72c1bf0SBram Moolenaar call CheckScriptFailure([ 294d72c1bf0SBram Moolenaar 'vim9script', 295d72c1bf0SBram Moolenaar 'let svar = 123', 296d72c1bf0SBram Moolenaar 'def Func()', 297d72c1bf0SBram Moolenaar ' unlet svar', 298d72c1bf0SBram Moolenaar 'enddef', 299822ba247SBram Moolenaar 'defcompile', 300d72c1bf0SBram Moolenaar ], 'E1081:') 301d72c1bf0SBram Moolenaar call CheckScriptFailure([ 302d72c1bf0SBram Moolenaar 'vim9script', 303d72c1bf0SBram Moolenaar 'let svar = 123', 304d72c1bf0SBram Moolenaar 'def Func()', 305d72c1bf0SBram Moolenaar ' unlet s:svar', 306d72c1bf0SBram Moolenaar 'enddef', 307822ba247SBram Moolenaar 'defcompile', 308d72c1bf0SBram Moolenaar ], 'E1081:') 3097bdaea6eSBram Moolenaar 3107bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 3117bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 3127bdaea6eSBram Moolenaar unlet $ENVVAR 3137bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 314d72c1bf0SBram Moolenaarenddef 315599c89c8SBram Moolenaar 3164c17ad94SBram Moolenaardef Test_delfunction() 3174c17ad94SBram Moolenaar " Check function is defined in script namespace 3184c17ad94SBram Moolenaar CheckScriptSuccess([ 3194c17ad94SBram Moolenaar 'vim9script', 3204c17ad94SBram Moolenaar 'func CheckMe()', 3214c17ad94SBram Moolenaar ' return 123', 3224c17ad94SBram Moolenaar 'endfunc', 3234c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 3244c17ad94SBram Moolenaar ]) 3254c17ad94SBram Moolenaar 3264c17ad94SBram Moolenaar " Check function in script namespace cannot be deleted 3274c17ad94SBram Moolenaar CheckScriptFailure([ 3284c17ad94SBram Moolenaar 'vim9script', 3294c17ad94SBram Moolenaar 'func DeleteMe1()', 3304c17ad94SBram Moolenaar 'endfunc', 3314c17ad94SBram Moolenaar 'delfunction DeleteMe1', 3324c17ad94SBram Moolenaar ], 'E1084:') 3334c17ad94SBram Moolenaar CheckScriptFailure([ 3344c17ad94SBram Moolenaar 'vim9script', 3354c17ad94SBram Moolenaar 'func DeleteMe2()', 3364c17ad94SBram Moolenaar 'endfunc', 3374c17ad94SBram Moolenaar 'def DoThat()', 3384c17ad94SBram Moolenaar ' delfunction DeleteMe2', 3394c17ad94SBram Moolenaar 'enddef', 3404c17ad94SBram Moolenaar 'DoThat()', 3414c17ad94SBram Moolenaar ], 'E1084:') 3424c17ad94SBram Moolenaar CheckScriptFailure([ 3434c17ad94SBram Moolenaar 'vim9script', 3444c17ad94SBram Moolenaar 'def DeleteMe3()', 3454c17ad94SBram Moolenaar 'enddef', 3464c17ad94SBram Moolenaar 'delfunction DeleteMe3', 3474c17ad94SBram Moolenaar ], 'E1084:') 3484c17ad94SBram Moolenaar CheckScriptFailure([ 3494c17ad94SBram Moolenaar 'vim9script', 3504c17ad94SBram Moolenaar 'def DeleteMe4()', 3514c17ad94SBram Moolenaar 'enddef', 3524c17ad94SBram Moolenaar 'def DoThat()', 3534c17ad94SBram Moolenaar ' delfunction DeleteMe4', 3544c17ad94SBram Moolenaar 'enddef', 3554c17ad94SBram Moolenaar 'DoThat()', 3564c17ad94SBram Moolenaar ], 'E1084:') 3574c17ad94SBram Moolenaarenddef 3584c17ad94SBram Moolenaar 359599c89c8SBram Moolenaarfunc Test_wrong_type() 360599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 361599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 362599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 363599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 364599c89c8SBram Moolenaar 365599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 366599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 36742a480bfSBram Moolenaar 36842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 36942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 37042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 37142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 37242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 37342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 37442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 37542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 37642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 37742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 37842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 379a0a9f43aSBram Moolenaar 380a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 381a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 3828a7d6542SBram Moolenaarendfunc 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaarfunc Test_const() 3858a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 3868a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 3878a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 3889be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 3898a7d6542SBram Moolenaarendfunc 3908a7d6542SBram Moolenaar 3918a7d6542SBram Moolenaardef Test_block() 3928a7d6542SBram Moolenaar let outer = 1 3938a7d6542SBram Moolenaar { 3948a7d6542SBram Moolenaar let inner = 2 3958a7d6542SBram Moolenaar assert_equal(1, outer) 3968a7d6542SBram Moolenaar assert_equal(2, inner) 3978a7d6542SBram Moolenaar } 3988a7d6542SBram Moolenaar assert_equal(1, outer) 3998a7d6542SBram Moolenaarenddef 4008a7d6542SBram Moolenaar 4018a7d6542SBram Moolenaarfunc Test_block_failure() 4028a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 403585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 404585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 4058a7d6542SBram Moolenaarendfunc 4068a7d6542SBram Moolenaar 407585fea7bSBram Moolenaardef Test_cmd_modifier() 408585fea7bSBram Moolenaar tab echo '0' 409585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 410585fea7bSBram Moolenaarenddef 411585fea7bSBram Moolenaar 4128a7d6542SBram Moolenaardef Test_try_catch() 4138a7d6542SBram Moolenaar let l = [] 4147a092245SBram Moolenaar try # comment 4158a7d6542SBram Moolenaar add(l, '1') 4168a7d6542SBram Moolenaar throw 'wrong' 4178a7d6542SBram Moolenaar add(l, '2') 4187a092245SBram Moolenaar catch # comment 4198a7d6542SBram Moolenaar add(l, v:exception) 4207a092245SBram Moolenaar finally # comment 4218a7d6542SBram Moolenaar add(l, '3') 4227a092245SBram Moolenaar endtry # comment 4238a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4248a7d6542SBram Moolenaarenddef 4258a7d6542SBram Moolenaar 426257cc5eeSBram Moolenaardef ThrowFromDef() 427a72cfb80SBram Moolenaar throw "getout" # comment 428257cc5eeSBram Moolenaarenddef 429257cc5eeSBram Moolenaar 430257cc5eeSBram Moolenaarfunc CatchInFunc() 431257cc5eeSBram Moolenaar try 432257cc5eeSBram Moolenaar call ThrowFromDef() 433257cc5eeSBram Moolenaar catch 434257cc5eeSBram Moolenaar let g:thrown_func = v:exception 435257cc5eeSBram Moolenaar endtry 436257cc5eeSBram Moolenaarendfunc 437257cc5eeSBram Moolenaar 438257cc5eeSBram Moolenaardef CatchInDef() 439257cc5eeSBram Moolenaar try 440257cc5eeSBram Moolenaar ThrowFromDef() 441257cc5eeSBram Moolenaar catch 442257cc5eeSBram Moolenaar g:thrown_def = v:exception 443257cc5eeSBram Moolenaar endtry 444257cc5eeSBram Moolenaarenddef 445257cc5eeSBram Moolenaar 446f575adffSBram Moolenaardef ReturnFinally(): string 447f575adffSBram Moolenaar try 448f575adffSBram Moolenaar return 'intry' 449f575adffSBram Moolenaar finally 450f575adffSBram Moolenaar g:in_finally = 'finally' 451f575adffSBram Moolenaar endtry 452f575adffSBram Moolenaar return 'end' 453f575adffSBram Moolenaarenddef 454f575adffSBram Moolenaar 455257cc5eeSBram Moolenaardef Test_try_catch_nested() 456257cc5eeSBram Moolenaar CatchInFunc() 457257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 458257cc5eeSBram Moolenaar 459257cc5eeSBram Moolenaar CatchInDef() 460257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 461f575adffSBram Moolenaar 462f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 463f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 464f575adffSBram Moolenaarenddef 465f575adffSBram Moolenaar 466f575adffSBram Moolenaardef Test_try_catch_match() 467f575adffSBram Moolenaar let seq = 'a' 468f575adffSBram Moolenaar try 469f575adffSBram Moolenaar throw 'something' 470f575adffSBram Moolenaar catch /nothing/ 471f575adffSBram Moolenaar seq ..= 'x' 472f575adffSBram Moolenaar catch /some/ 473f575adffSBram Moolenaar seq ..= 'b' 474f575adffSBram Moolenaar catch /asdf/ 475f575adffSBram Moolenaar seq ..= 'x' 476e8c4abbbSBram Moolenaar catch ?a\?sdf? 477e8c4abbbSBram Moolenaar seq ..= 'y' 478f575adffSBram Moolenaar finally 479f575adffSBram Moolenaar seq ..= 'c' 480f575adffSBram Moolenaar endtry 481f575adffSBram Moolenaar assert_equal('abc', seq) 482257cc5eeSBram Moolenaarenddef 483257cc5eeSBram Moolenaar 484e8c4abbbSBram Moolenaardef Test_try_catch_fails() 485e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 486e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 487e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 488585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 489585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 490585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 491585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 492585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 493585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 494585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 495585fea7bSBram Moolenaar 496a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 497585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 498e8c4abbbSBram Moolenaarenddef 499e8c4abbbSBram Moolenaar 5002a1381c3SBram Moolenaarif has('channel') 50140ee466cSBram Moolenaar let someJob = test_null_job() 50240ee466cSBram Moolenaar 50340ee466cSBram Moolenaar def FuncWithError() 50440ee466cSBram Moolenaar echomsg g:someJob 50540ee466cSBram Moolenaar enddef 50640ee466cSBram Moolenaar 50740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 50840ee466cSBram Moolenaar try 50940ee466cSBram Moolenaar call FuncWithError() 51040ee466cSBram Moolenaar catch 51140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 51240ee466cSBram Moolenaar endtry 51340ee466cSBram Moolenaar endfunc 5142a1381c3SBram Moolenaarendif 51540ee466cSBram Moolenaar 5168a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 5178a7d6542SBram Moolenaar vim9script 5188a7d6542SBram Moolenaar let name: string = 'bob' 5198a7d6542SBram Moolenaar def Concat(arg: string): string 5208a7d6542SBram Moolenaar return name .. arg 5218a7d6542SBram Moolenaar enddef 522227a69deSBram Moolenaar g:result = Concat('bie') 523227a69deSBram Moolenaar g:localname = name 5248a7d6542SBram Moolenaar 5258a7d6542SBram Moolenaar export const CONST = 1234 5268a7d6542SBram Moolenaar export let exported = 9876 5276e587dcbSBram Moolenaar export let exp_name = 'John' 5288a7d6542SBram Moolenaar export def Exported(): string 5298a7d6542SBram Moolenaar return 'Exported' 5308a7d6542SBram Moolenaar enddef 5318a7d6542SBram MoolenaarEND 5328a7d6542SBram Moolenaar 5335269bd2aSBram Moolenaardef Test_vim9_import_export() 5348a7d6542SBram Moolenaar let import_script_lines =<< trim END 5358a7d6542SBram Moolenaar vim9script 5368a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 5378a7d6542SBram Moolenaar g:imported = exported 5386e587dcbSBram Moolenaar exported += 3 5396e587dcbSBram Moolenaar g:imported_added = exported 5408a7d6542SBram Moolenaar g:imported_func = Exported() 5416e587dcbSBram Moolenaar 5426e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5436e587dcbSBram Moolenaar g:imported_name = exp_name 5446e587dcbSBram Moolenaar exp_name ..= ' Doe' 5456e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5465381c7a1SBram Moolenaar g:imported_later = exported 5478a7d6542SBram Moolenaar END 5488a7d6542SBram Moolenaar 5498a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5508a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5518a7d6542SBram Moolenaar 5528a7d6542SBram Moolenaar source Ximport.vim 5538a7d6542SBram Moolenaar 5548a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5558a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5568a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5576e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5585381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5598a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5606e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5616e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5628a7d6542SBram Moolenaar assert_false(exists('g:name')) 5638a7d6542SBram Moolenaar 5648a7d6542SBram Moolenaar unlet g:result 5658a7d6542SBram Moolenaar unlet g:localname 5668a7d6542SBram Moolenaar unlet g:imported 5676e587dcbSBram Moolenaar unlet g:imported_added 5685381c7a1SBram Moolenaar unlet g:imported_later 5698a7d6542SBram Moolenaar unlet g:imported_func 5706e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5718a7d6542SBram Moolenaar delete('Ximport.vim') 572f2d5c240SBram Moolenaar 5735381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5745381c7a1SBram Moolenaar vim9script 5755381c7a1SBram Moolenaar def ImportInDef() 5765381c7a1SBram Moolenaar import exported from './Xexport.vim' 5775381c7a1SBram Moolenaar g:imported = exported 5785381c7a1SBram Moolenaar exported += 7 5795381c7a1SBram Moolenaar g:imported_added = exported 5805381c7a1SBram Moolenaar enddef 5815381c7a1SBram Moolenaar ImportInDef() 5825381c7a1SBram Moolenaar END 5835381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5845381c7a1SBram Moolenaar source Ximport2.vim 5855381c7a1SBram Moolenaar " TODO: this should be 9879 5865381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5875381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5885381c7a1SBram Moolenaar unlet g:imported 5895381c7a1SBram Moolenaar unlet g:imported_added 5905381c7a1SBram Moolenaar delete('Ximport2.vim') 5915381c7a1SBram Moolenaar 592f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 593f2d5c240SBram Moolenaar vim9script 594f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 595f2d5c240SBram Moolenaar def UseExport() 596f2d5c240SBram Moolenaar g:imported = Export.exported 597f2d5c240SBram Moolenaar enddef 598f2d5c240SBram Moolenaar UseExport() 599f2d5c240SBram Moolenaar END 600f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 601f2d5c240SBram Moolenaar source Ximport.vim 6025381c7a1SBram Moolenaar assert_equal(9883, g:imported) 603f2d5c240SBram Moolenaar 604599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 605599c89c8SBram Moolenaar vim9script 606599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 607599c89c8SBram Moolenaar def Func() 608599c89c8SBram Moolenaar let dummy = 1 609599c89c8SBram Moolenaar let imported = Export + dummy 610599c89c8SBram Moolenaar enddef 611822ba247SBram Moolenaar defcompile 612599c89c8SBram Moolenaar END 613599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 614599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 615599c89c8SBram Moolenaar 616599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 617599c89c8SBram Moolenaar vim9script 618599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 619599c89c8SBram Moolenaar def Func() 620599c89c8SBram Moolenaar let imported = Export . exported 621599c89c8SBram Moolenaar enddef 622822ba247SBram Moolenaar defcompile 623599c89c8SBram Moolenaar END 624599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 625599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 626599c89c8SBram Moolenaar 627599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 628599c89c8SBram Moolenaar vim9script 629599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 630599c89c8SBram Moolenaar def Func() 631599c89c8SBram Moolenaar let imported = Export. 632599c89c8SBram Moolenaar enddef 633822ba247SBram Moolenaar defcompile 634599c89c8SBram Moolenaar END 635599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 636599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 637599c89c8SBram Moolenaar 638f2d5c240SBram Moolenaar let import_star_lines =<< trim END 639f2d5c240SBram Moolenaar vim9script 640f2d5c240SBram Moolenaar import * from './Xexport.vim' 641f2d5c240SBram Moolenaar END 642f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 643f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 644f2d5c240SBram Moolenaar 645fa29c8abSBram Moolenaar " try to import something that exists but is not exported 646fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 647fa29c8abSBram Moolenaar vim9script 648fa29c8abSBram Moolenaar import name from './Xexport.vim' 649fa29c8abSBram Moolenaar END 650fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 651fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 652fa29c8abSBram Moolenaar 6535269bd2aSBram Moolenaar " try to import something that is already defined 6545269bd2aSBram Moolenaar let import_already_defined =<< trim END 6555269bd2aSBram Moolenaar vim9script 6565269bd2aSBram Moolenaar let exported = 'something' 6575269bd2aSBram Moolenaar import exported from './Xexport.vim' 6585269bd2aSBram Moolenaar END 6595269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6605269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6615269bd2aSBram Moolenaar 6625269bd2aSBram Moolenaar " try to import something that is already defined 6635269bd2aSBram Moolenaar import_already_defined =<< trim END 6645269bd2aSBram Moolenaar vim9script 6655269bd2aSBram Moolenaar let exported = 'something' 6665269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6675269bd2aSBram Moolenaar END 6685269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6695269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6705269bd2aSBram Moolenaar 6715269bd2aSBram Moolenaar " try to import something that is already defined 6725269bd2aSBram Moolenaar import_already_defined =<< trim END 6735269bd2aSBram Moolenaar vim9script 6745269bd2aSBram Moolenaar let exported = 'something' 6755269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6765269bd2aSBram Moolenaar END 6775269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6785269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6795269bd2aSBram Moolenaar 680fa29c8abSBram Moolenaar " import a very long name, requires making a copy 681fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 682fa29c8abSBram Moolenaar vim9script 683fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 684fa29c8abSBram Moolenaar END 685fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 686fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 687fa29c8abSBram Moolenaar 688fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 689fa29c8abSBram Moolenaar vim9script 690fa29c8abSBram Moolenaar import name './Xexport.vim' 691fa29c8abSBram Moolenaar END 692fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 693fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 694fa29c8abSBram Moolenaar 695fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 696fa29c8abSBram Moolenaar vim9script 697fa29c8abSBram Moolenaar import name from Xexport.vim 698fa29c8abSBram Moolenaar END 699fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 700fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 701fa29c8abSBram Moolenaar 702fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 703fa29c8abSBram Moolenaar vim9script 704fa29c8abSBram Moolenaar import name from './XnoExport.vim' 705fa29c8abSBram Moolenaar END 706fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 707fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 708fa29c8abSBram Moolenaar 709fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 710fa29c8abSBram Moolenaar vim9script 711fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 712fa29c8abSBram Moolenaar END 7135269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 7145269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 715fa29c8abSBram Moolenaar 716f2d5c240SBram Moolenaar delete('Ximport.vim') 7175269bd2aSBram Moolenaar delete('Ximport3.vim') 7188a7d6542SBram Moolenaar delete('Xexport.vim') 7198a7d6542SBram Moolenaar 720750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 721750802b5SBram Moolenaar set cpo&vi 722750802b5SBram Moolenaar let cpo_before = &cpo 723750802b5SBram Moolenaar let lines =<< trim END 724750802b5SBram Moolenaar vim9script 725750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 726750802b5SBram Moolenaar END 727750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 728750802b5SBram Moolenaar source Xvim9_script 729750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 730750802b5SBram Moolenaar set cpo&vim 731750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 732750802b5SBram Moolenaar delete('Xvim9_script') 733750802b5SBram Moolenaarenddef 734750802b5SBram Moolenaar 735750802b5SBram Moolenaardef Test_vim9script_fails() 7368a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 7378a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 738750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 7399721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 740750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 741750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 742750802b5SBram Moolenaar 743750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 744a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 7458a7d6542SBram Moolenaarenddef 7468a7d6542SBram Moolenaar 7474c17ad94SBram Moolenaardef Test_vim9script_reload_import() 7488a7d6542SBram Moolenaar let lines =<< trim END 7498a7d6542SBram Moolenaar vim9script 7508a7d6542SBram Moolenaar const var = '' 7518a7d6542SBram Moolenaar let valone = 1234 7528a7d6542SBram Moolenaar def MyFunc(arg: string) 7538a7d6542SBram Moolenaar valone = 5678 7548a7d6542SBram Moolenaar enddef 7558a7d6542SBram Moolenaar END 7568a7d6542SBram Moolenaar let morelines =<< trim END 7578a7d6542SBram Moolenaar let valtwo = 222 7588a7d6542SBram Moolenaar export def GetValtwo(): number 7598a7d6542SBram Moolenaar return valtwo 7608a7d6542SBram Moolenaar enddef 7618a7d6542SBram Moolenaar END 76203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7638a7d6542SBram Moolenaar source Xreload.vim 7648a7d6542SBram Moolenaar source Xreload.vim 7658a7d6542SBram Moolenaar source Xreload.vim 7668a7d6542SBram Moolenaar 7678a7d6542SBram Moolenaar let testlines =<< trim END 7688a7d6542SBram Moolenaar vim9script 7698a7d6542SBram Moolenaar def TheFunc() 7708a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 7718a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 7728a7d6542SBram Moolenaar enddef 7738a7d6542SBram Moolenaar TheFunc() 7748a7d6542SBram Moolenaar END 7758a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 7768a7d6542SBram Moolenaar source Ximport.vim 7778a7d6542SBram Moolenaar 77803afdcf1SBram Moolenaar " Test that when not using "morelines" GetValtwo() and valtwo are still 77903afdcf1SBram Moolenaar " defined, because import doesn't reload a script. 7808a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7818a7d6542SBram Moolenaar source Ximport.vim 7828a7d6542SBram Moolenaar 7838a7d6542SBram Moolenaar " cannot declare a var twice 7848a7d6542SBram Moolenaar lines =<< trim END 7858a7d6542SBram Moolenaar vim9script 7868a7d6542SBram Moolenaar let valone = 1234 7878a7d6542SBram Moolenaar let valone = 5678 7888a7d6542SBram Moolenaar END 7898a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7908a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 7918a7d6542SBram Moolenaar 7928a7d6542SBram Moolenaar delete('Xreload.vim') 7938a7d6542SBram Moolenaar delete('Ximport.vim') 7948a7d6542SBram Moolenaarenddef 7958a7d6542SBram Moolenaar 7964c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 7974c17ad94SBram Moolenaar let first_lines =<< trim END 7984c17ad94SBram Moolenaar vim9script 7994c17ad94SBram Moolenaar def FuncYes(): string 8004c17ad94SBram Moolenaar return 'yes' 8014c17ad94SBram Moolenaar enddef 8024c17ad94SBram Moolenaar END 80303afdcf1SBram Moolenaar let withno_lines =<< trim END 8044c17ad94SBram Moolenaar def FuncNo(): string 8054c17ad94SBram Moolenaar return 'no' 8064c17ad94SBram Moolenaar enddef 8074c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 8084c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 8094c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 81003afdcf1SBram Moolenaar enddef 81103afdcf1SBram Moolenaar END 81203afdcf1SBram Moolenaar let nono_lines =<< trim END 81303afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 81403afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 8154c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 8164c17ad94SBram Moolenaar enddef 8174c17ad94SBram Moolenaar END 8184c17ad94SBram Moolenaar 8194c17ad94SBram Moolenaar # FuncNo() is defined 82003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 8214c17ad94SBram Moolenaar source Xreloaded.vim 8224c17ad94SBram Moolenaar g:DoCheck(true) 8234c17ad94SBram Moolenaar 8244c17ad94SBram Moolenaar # FuncNo() is not redefined 82503afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 8264c17ad94SBram Moolenaar source Xreloaded.vim 82703afdcf1SBram Moolenaar g:DoCheck() 8284c17ad94SBram Moolenaar 8294c17ad94SBram Moolenaar # FuncNo() is back 83003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 8314c17ad94SBram Moolenaar source Xreloaded.vim 83203afdcf1SBram Moolenaar g:DoCheck() 8334c17ad94SBram Moolenaar 8344c17ad94SBram Moolenaar delete('Xreloaded.vim') 8354c17ad94SBram Moolenaarenddef 8364c17ad94SBram Moolenaar 83789483d40SBram Moolenaardef Test_vim9script_reload_delvar() 83889483d40SBram Moolenaar # write the script with a script-local variable 83989483d40SBram Moolenaar let lines =<< trim END 84089483d40SBram Moolenaar vim9script 84189483d40SBram Moolenaar let var = 'string' 84289483d40SBram Moolenaar END 84389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 84489483d40SBram Moolenaar source XreloadVar.vim 84589483d40SBram Moolenaar 84689483d40SBram Moolenaar # now write the script using the same variable locally - works 84789483d40SBram Moolenaar lines =<< trim END 84889483d40SBram Moolenaar vim9script 84989483d40SBram Moolenaar def Func() 85089483d40SBram Moolenaar let var = 'string' 85189483d40SBram Moolenaar enddef 85289483d40SBram Moolenaar END 85389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 85489483d40SBram Moolenaar source XreloadVar.vim 85589483d40SBram Moolenaar 85689483d40SBram Moolenaar delete('XreloadVar.vim') 85789483d40SBram Moolenaarenddef 85889483d40SBram Moolenaar 8598a7d6542SBram Moolenaardef Test_import_absolute() 8608a7d6542SBram Moolenaar let import_lines = [ 861e6085c53SBram Moolenaar 'vim9script', 862e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 863e6085c53SBram Moolenaar 'def UseExported()', 864e6085c53SBram Moolenaar ' g:imported_abs = exported', 865e6085c53SBram Moolenaar ' exported = 8888', 866e6085c53SBram Moolenaar ' g:imported_after = exported', 867e6085c53SBram Moolenaar 'enddef', 868e6085c53SBram Moolenaar 'UseExported()', 869e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 870e6085c53SBram Moolenaar ] 8718a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8728a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8738a7d6542SBram Moolenaar 8748a7d6542SBram Moolenaar source Ximport_abs.vim 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8774e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 878675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 879675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 880675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 881675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 882675f716eSBram Moolenaar 'exported = 8888.*' .. 883675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 884675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 885675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 886675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 887e6085c53SBram Moolenaar g:import_disassembled) 8888a7d6542SBram Moolenaar unlet g:imported_abs 8894e12a5dfSBram Moolenaar unlet g:import_disassembled 8908a7d6542SBram Moolenaar 8918a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8928a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8938a7d6542SBram Moolenaarenddef 8948a7d6542SBram Moolenaar 8958a7d6542SBram Moolenaardef Test_import_rtp() 8968a7d6542SBram Moolenaar let import_lines = [ 897e6085c53SBram Moolenaar 'vim9script', 898e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 899e6085c53SBram Moolenaar 'g:imported_rtp = exported', 900e6085c53SBram Moolenaar ] 9018a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 9028a7d6542SBram Moolenaar mkdir('import') 9038a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 9048a7d6542SBram Moolenaar 9058a7d6542SBram Moolenaar let save_rtp = &rtp 9068a7d6542SBram Moolenaar &rtp = getcwd() 9078a7d6542SBram Moolenaar source Ximport_rtp.vim 9088a7d6542SBram Moolenaar &rtp = save_rtp 9098a7d6542SBram Moolenaar 9108a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 9118a7d6542SBram Moolenaar unlet g:imported_rtp 9128a7d6542SBram Moolenaar 9138a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 91489483d40SBram Moolenaar delete('import', 'rf') 9158a7d6542SBram Moolenaarenddef 9168a7d6542SBram Moolenaar 91725e0f586SBram Moolenaardef Test_import_compile_error() 91825e0f586SBram Moolenaar let export_lines = [ 91925e0f586SBram Moolenaar 'vim9script', 92025e0f586SBram Moolenaar 'export def ExpFunc(): string', 92125e0f586SBram Moolenaar ' return notDefined', 92225e0f586SBram Moolenaar 'enddef', 92325e0f586SBram Moolenaar ] 92425e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 92525e0f586SBram Moolenaar 92625e0f586SBram Moolenaar let import_lines = [ 92725e0f586SBram Moolenaar 'vim9script', 92825e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 92925e0f586SBram Moolenaar 'def ImpFunc()', 93025e0f586SBram Moolenaar ' echo ExpFunc()', 93125e0f586SBram Moolenaar 'enddef', 93225e0f586SBram Moolenaar 'defcompile', 93325e0f586SBram Moolenaar ] 93425e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 93525e0f586SBram Moolenaar 93625e0f586SBram Moolenaar try 93725e0f586SBram Moolenaar source Ximport.vim 93825e0f586SBram Moolenaar catch /E1001/ 93925e0f586SBram Moolenaar " Error should be fore the Xexported.vim file. 94025e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 94125e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 94225e0f586SBram Moolenaar endtry 94325e0f586SBram Moolenaar 94425e0f586SBram Moolenaar delete('Xexported.vim') 94525e0f586SBram Moolenaar delete('Ximport.vim') 94625e0f586SBram Moolenaarenddef 94725e0f586SBram Moolenaar 9488a7d6542SBram Moolenaardef Test_fixed_size_list() 9498a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 9508a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 9518a7d6542SBram Moolenaar l->remove(0) 9528a7d6542SBram Moolenaar l->add(5) 9538a7d6542SBram Moolenaar l->insert(99, 1) 9540f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 9558a7d6542SBram Moolenaarenddef 9568a7d6542SBram Moolenaar 957158906cfSBram Moolenaardef IfElse(what: number): string 958158906cfSBram Moolenaar let res = '' 959158906cfSBram Moolenaar if what == 1 960158906cfSBram Moolenaar res = "one" 961158906cfSBram Moolenaar elseif what == 2 962158906cfSBram Moolenaar res = "two" 963a259d8d3SBram Moolenaar else 964158906cfSBram Moolenaar res = "three" 965a259d8d3SBram Moolenaar endif 966158906cfSBram Moolenaar return res 967a259d8d3SBram Moolenaarenddef 968a259d8d3SBram Moolenaar 969158906cfSBram Moolenaardef Test_if_elseif_else() 970158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 971158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 972158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9730f18b6d1SBram Moolenaarenddef 9740f18b6d1SBram Moolenaar 975e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 976e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 977e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 978e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 979e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 980585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 981e8c4abbbSBram Moolenaarenddef 982e8c4abbbSBram Moolenaar 9836d69bf60SBram Moolenaarlet g:bool_true = v:true 9846d69bf60SBram Moolenaarlet g:bool_false = v:false 9856d69bf60SBram Moolenaar 9866d69bf60SBram Moolenaardef Test_if_const_expr() 9876d69bf60SBram Moolenaar let res = false 9886d69bf60SBram Moolenaar if true ? true : false 9896d69bf60SBram Moolenaar res = true 9906d69bf60SBram Moolenaar endif 9916d69bf60SBram Moolenaar assert_equal(true, res) 9926d69bf60SBram Moolenaar 993585fea7bSBram Moolenaar g:glob = 2 994585fea7bSBram Moolenaar if false 995585fea7bSBram Moolenaar execute('let g:glob = 3') 996585fea7bSBram Moolenaar endif 997585fea7bSBram Moolenaar assert_equal(2, g:glob) 998585fea7bSBram Moolenaar if true 999585fea7bSBram Moolenaar execute('let g:glob = 3') 1000585fea7bSBram Moolenaar endif 1001585fea7bSBram Moolenaar assert_equal(3, g:glob) 1002585fea7bSBram Moolenaar 10036d69bf60SBram Moolenaar res = false 10046d69bf60SBram Moolenaar if g:bool_true ? true : false 10056d69bf60SBram Moolenaar res = true 10066d69bf60SBram Moolenaar endif 10076d69bf60SBram Moolenaar assert_equal(true, res) 10086d69bf60SBram Moolenaar 10096d69bf60SBram Moolenaar res = false 10106d69bf60SBram Moolenaar if true ? g:bool_true : false 10116d69bf60SBram Moolenaar res = true 10126d69bf60SBram Moolenaar endif 10136d69bf60SBram Moolenaar assert_equal(true, res) 10146d69bf60SBram Moolenaar 10156d69bf60SBram Moolenaar res = false 10166d69bf60SBram Moolenaar if true ? true : g:bool_false 10176d69bf60SBram Moolenaar res = true 10186d69bf60SBram Moolenaar endif 10196d69bf60SBram Moolenaar assert_equal(true, res) 10206d69bf60SBram Moolenaar 10216d69bf60SBram Moolenaar res = false 10226d69bf60SBram Moolenaar if true ? false : true 10236d69bf60SBram Moolenaar res = true 10246d69bf60SBram Moolenaar endif 10256d69bf60SBram Moolenaar assert_equal(false, res) 10266d69bf60SBram Moolenaar 10276d69bf60SBram Moolenaar res = false 10286d69bf60SBram Moolenaar if false ? false : true 10296d69bf60SBram Moolenaar res = true 10306d69bf60SBram Moolenaar endif 10316d69bf60SBram Moolenaar assert_equal(true, res) 10326d69bf60SBram Moolenaar 10336d69bf60SBram Moolenaar res = false 10346d69bf60SBram Moolenaar if false ? true : false 10356d69bf60SBram Moolenaar res = true 10366d69bf60SBram Moolenaar endif 10376d69bf60SBram Moolenaar assert_equal(false, res) 10386d69bf60SBram Moolenaar 10396d69bf60SBram Moolenaar res = false 1040e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1041e8c4abbbSBram Moolenaar res = true 1042e8c4abbbSBram Moolenaar endif 1043e8c4abbbSBram Moolenaar assert_equal(false, res) 1044e8c4abbbSBram Moolenaar 1045e8c4abbbSBram Moolenaar res = false 10466d69bf60SBram Moolenaar if true && true 10476d69bf60SBram Moolenaar res = true 10486d69bf60SBram Moolenaar endif 10496d69bf60SBram Moolenaar assert_equal(true, res) 10506d69bf60SBram Moolenaar 10516d69bf60SBram Moolenaar res = false 10526d69bf60SBram Moolenaar if true && false 10536d69bf60SBram Moolenaar res = true 10546d69bf60SBram Moolenaar endif 10556d69bf60SBram Moolenaar assert_equal(false, res) 10566d69bf60SBram Moolenaar 10576d69bf60SBram Moolenaar res = false 10586d69bf60SBram Moolenaar if g:bool_true && false 10596d69bf60SBram Moolenaar res = true 10606d69bf60SBram Moolenaar endif 10616d69bf60SBram Moolenaar assert_equal(false, res) 10626d69bf60SBram Moolenaar 10636d69bf60SBram Moolenaar res = false 10646d69bf60SBram Moolenaar if true && g:bool_false 10656d69bf60SBram Moolenaar res = true 10666d69bf60SBram Moolenaar endif 10676d69bf60SBram Moolenaar assert_equal(false, res) 10686d69bf60SBram Moolenaar 10696d69bf60SBram Moolenaar res = false 10706d69bf60SBram Moolenaar if false && false 10716d69bf60SBram Moolenaar res = true 10726d69bf60SBram Moolenaar endif 10736d69bf60SBram Moolenaar assert_equal(false, res) 10746d69bf60SBram Moolenaar 10756d69bf60SBram Moolenaar res = false 10766d69bf60SBram Moolenaar if true || false 10776d69bf60SBram Moolenaar res = true 10786d69bf60SBram Moolenaar endif 10796d69bf60SBram Moolenaar assert_equal(true, res) 10806d69bf60SBram Moolenaar 10816d69bf60SBram Moolenaar res = false 10826d69bf60SBram Moolenaar if g:bool_true || false 10836d69bf60SBram Moolenaar res = true 10846d69bf60SBram Moolenaar endif 10856d69bf60SBram Moolenaar assert_equal(true, res) 10866d69bf60SBram Moolenaar 10876d69bf60SBram Moolenaar res = false 10886d69bf60SBram Moolenaar if true || g:bool_false 10896d69bf60SBram Moolenaar res = true 10906d69bf60SBram Moolenaar endif 10916d69bf60SBram Moolenaar assert_equal(true, res) 10926d69bf60SBram Moolenaar 10936d69bf60SBram Moolenaar res = false 10946d69bf60SBram Moolenaar if false || false 10956d69bf60SBram Moolenaar res = true 10966d69bf60SBram Moolenaar endif 10976d69bf60SBram Moolenaar assert_equal(false, res) 109880c34ca3SBram Moolenaarenddef 10996d69bf60SBram Moolenaar 110080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 110180c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 110280c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1103e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1104e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 11056d69bf60SBram Moolenaarenddef 11066d69bf60SBram Moolenaar 1107ad39c094SBram Moolenaardef Test_execute_cmd() 1108ad39c094SBram Moolenaar new 1109ad39c094SBram Moolenaar setline(1, 'default') 1110ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1111ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1112a72cfb80SBram Moolenaar 1113a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1114a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1115a72cfb80SBram Moolenaar 1116ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1117ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1118a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1119ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1120a72cfb80SBram Moolenaar 1121ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1122ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1123a72cfb80SBram Moolenaar 1124ad39c094SBram Moolenaar let cmd_first = 'call ' 1125ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1126ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1127ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1128ad39c094SBram Moolenaar bwipe! 1129585fea7bSBram Moolenaar 1130585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1131a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1132ad39c094SBram Moolenaarenddef 1133ad39c094SBram Moolenaar 1134ad39c094SBram Moolenaardef Test_echo_cmd() 1135a72cfb80SBram Moolenaar echo 'some' # comment 1136585fea7bSBram Moolenaar echon 'thing' 1137ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1138ad39c094SBram Moolenaar 1139a72cfb80SBram Moolenaar echo "some" # comment 1140a72cfb80SBram Moolenaar echon "thing" 1141a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1142a72cfb80SBram Moolenaar 1143ad39c094SBram Moolenaar let str1 = 'some' 1144ad39c094SBram Moolenaar let str2 = 'more' 1145ad39c094SBram Moolenaar echo str1 str2 1146ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1147a72cfb80SBram Moolenaar 1148a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1149ad39c094SBram Moolenaarenddef 1150ad39c094SBram Moolenaar 1151f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1152f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1153f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1154f93c7feaSBram Moolenaar echo 'clear' 1155f93c7feaSBram Moolenaar 1messages 1156f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1157f93c7feaSBram Moolenaar 1158f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1159f93c7feaSBram Moolenaarenddef 1160f93c7feaSBram Moolenaar 1161f93c7feaSBram Moolenaardef Test_echoerr_cmd() 116240ee466cSBram Moolenaar try 116340ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 116440ee466cSBram Moolenaar catch 116540ee466cSBram Moolenaar assert_match('something wrong', v:exception) 116640ee466cSBram Moolenaar endtry 1167f93c7feaSBram Moolenaarenddef 1168f93c7feaSBram Moolenaar 116941fe0617SBram Moolenaardef Test_for_outside_of_function() 117041fe0617SBram Moolenaar let lines =<< trim END 117141fe0617SBram Moolenaar vim9script 117241fe0617SBram Moolenaar new 117341fe0617SBram Moolenaar for var in range(0, 3) 117441fe0617SBram Moolenaar append(line('$'), var) 117541fe0617SBram Moolenaar endfor 117641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 117741fe0617SBram Moolenaar bwipe! 117841fe0617SBram Moolenaar END 117941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 118041fe0617SBram Moolenaar source Xvim9for.vim 118141fe0617SBram Moolenaar delete('Xvim9for.vim') 118241fe0617SBram Moolenaarenddef 11838a7d6542SBram Moolenaar 1184e8c4abbbSBram Moolenaardef Test_for_loop() 1185e8c4abbbSBram Moolenaar let result = '' 1186e8c4abbbSBram Moolenaar for cnt in range(7) 1187e8c4abbbSBram Moolenaar if cnt == 4 1188e8c4abbbSBram Moolenaar break 1189e8c4abbbSBram Moolenaar endif 1190e8c4abbbSBram Moolenaar if cnt == 2 1191e8c4abbbSBram Moolenaar continue 1192e8c4abbbSBram Moolenaar endif 1193e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1194e8c4abbbSBram Moolenaar endfor 1195e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 1196e8c4abbbSBram Moolenaarenddef 1197e8c4abbbSBram Moolenaar 1198e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1199675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1200675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1201675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1202822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 1203675f716eSBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1024:') 1204675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1205675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1206675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1207e8c4abbbSBram Moolenaarenddef 1208e8c4abbbSBram Moolenaar 1209d0df1aacSBram Moolenaardef Test_while_loop() 1210d0df1aacSBram Moolenaar let result = '' 1211d0df1aacSBram Moolenaar let cnt = 0 1212d0df1aacSBram Moolenaar while cnt < 555 1213d0df1aacSBram Moolenaar if cnt == 3 1214d0df1aacSBram Moolenaar break 1215d0df1aacSBram Moolenaar endif 1216d0df1aacSBram Moolenaar cnt += 1 1217d0df1aacSBram Moolenaar if cnt == 2 1218d0df1aacSBram Moolenaar continue 1219d0df1aacSBram Moolenaar endif 1220d0df1aacSBram Moolenaar result ..= cnt .. '_' 1221d0df1aacSBram Moolenaar endwhile 1222d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1223d0df1aacSBram Moolenaarenddef 1224d0df1aacSBram Moolenaar 1225e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1226675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1227675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1228675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1229675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1230675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1231675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1232675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1233bd5da371SBram Moolenaarenddef 1234bd5da371SBram Moolenaar 12359645e2d9SBram Moolenaardef Test_interrupt_loop() 123697acfc78SBram Moolenaar let caught = false 12379645e2d9SBram Moolenaar let x = 0 123897acfc78SBram Moolenaar try 12399645e2d9SBram Moolenaar while 1 12409645e2d9SBram Moolenaar x += 1 12419645e2d9SBram Moolenaar if x == 100 12429645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 12439645e2d9SBram Moolenaar endif 12449645e2d9SBram Moolenaar endwhile 124597acfc78SBram Moolenaar catch 124697acfc78SBram Moolenaar caught = true 124797acfc78SBram Moolenaar assert_equal(100, x) 124897acfc78SBram Moolenaar endtry 124997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 12509645e2d9SBram Moolenaarenddef 125120431c9dSBram Moolenaar 12524fdae999SBram Moolenaardef Test_automatic_line_continuation() 12534fdae999SBram Moolenaar let mylist = [ 12544fdae999SBram Moolenaar 'one', 12554fdae999SBram Moolenaar 'two', 12564fdae999SBram Moolenaar 'three', 12574fdae999SBram Moolenaar ] " comment 12584fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 12594fdae999SBram Moolenaar 12604fdae999SBram Moolenaar let mydict = { 12614fdae999SBram Moolenaar 'one': 1, 12624fdae999SBram Moolenaar 'two': 2, 12634fdae999SBram Moolenaar 'three': 12644fdae999SBram Moolenaar 3, 12654fdae999SBram Moolenaar } " comment 12664fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 12674fdae999SBram Moolenaar mydict = #{ 12682c330432SBram Moolenaar one: 1, # comment 12692c330432SBram Moolenaar two: # comment 12702c330432SBram Moolenaar 2, # comment 12712c330432SBram Moolenaar three: 3 # comment 12722c330432SBram Moolenaar } 12732c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 12742c330432SBram Moolenaar mydict = #{ 12752c330432SBram Moolenaar one: 1, 12764fdae999SBram Moolenaar two: 12774fdae999SBram Moolenaar 2, 12782c330432SBram Moolenaar three: 3 12794fdae999SBram Moolenaar } 12804fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1281e6085c53SBram Moolenaar 1282e6085c53SBram Moolenaar assert_equal( 1283e6085c53SBram Moolenaar ['one', 'two', 'three'], 1284e6085c53SBram Moolenaar split('one two three') 1285e6085c53SBram Moolenaar ) 12864fdae999SBram Moolenaarenddef 12874fdae999SBram Moolenaar 12887a092245SBram Moolenaardef Test_vim9_comment() 12897a092245SBram Moolenaar CheckScriptSuccess([ 12907a092245SBram Moolenaar 'vim9script', 12917a092245SBram Moolenaar '# something', 12927a092245SBram Moolenaar ]) 12937a092245SBram Moolenaar CheckScriptFailure([ 12947a092245SBram Moolenaar 'vim9script', 12957a092245SBram Moolenaar ':# something', 12967a092245SBram Moolenaar ], 'E488:') 12977a092245SBram Moolenaar CheckScriptFailure([ 12987a092245SBram Moolenaar '# something', 12997a092245SBram Moolenaar ], 'E488:') 13007a092245SBram Moolenaar CheckScriptFailure([ 13017a092245SBram Moolenaar ':# something', 13027a092245SBram Moolenaar ], 'E488:') 13037a092245SBram Moolenaar 13044a8d9f2eSBram Moolenaar { # block start 13054a8d9f2eSBram Moolenaar } # block end 13064a8d9f2eSBram Moolenaar CheckDefFailure([ 13074a8d9f2eSBram Moolenaar '{# comment', 13084a8d9f2eSBram Moolenaar ], 'E488:') 13094a8d9f2eSBram Moolenaar CheckDefFailure([ 13104a8d9f2eSBram Moolenaar '{', 13114a8d9f2eSBram Moolenaar '}# comment', 13124a8d9f2eSBram Moolenaar ], 'E488:') 13134a8d9f2eSBram Moolenaar 13144a8d9f2eSBram Moolenaar echo "yes" # comment 13154a8d9f2eSBram Moolenaar CheckDefFailure([ 13164a8d9f2eSBram Moolenaar 'echo "yes"# comment', 13174a8d9f2eSBram Moolenaar ], 'E488:') 13187a092245SBram Moolenaar CheckScriptSuccess([ 13197a092245SBram Moolenaar 'vim9script', 13207a092245SBram Moolenaar 'echo "yes" # something', 13217a092245SBram Moolenaar ]) 13227a092245SBram Moolenaar CheckScriptFailure([ 13237a092245SBram Moolenaar 'vim9script', 13247a092245SBram Moolenaar 'echo "yes"# something', 13257a092245SBram Moolenaar ], 'E121:') 13267a092245SBram Moolenaar CheckScriptFailure([ 13277a092245SBram Moolenaar 'vim9script', 13287a092245SBram Moolenaar 'echo# something', 13297a092245SBram Moolenaar ], 'E121:') 13307a092245SBram Moolenaar CheckScriptFailure([ 13317a092245SBram Moolenaar 'echo "yes" # something', 13327a092245SBram Moolenaar ], 'E121:') 13337a092245SBram Moolenaar 13344a8d9f2eSBram Moolenaar exe "echo" # comment 13354a8d9f2eSBram Moolenaar CheckDefFailure([ 13364a8d9f2eSBram Moolenaar 'exe "echo"# comment', 13374a8d9f2eSBram Moolenaar ], 'E488:') 13384a8d9f2eSBram Moolenaar CheckScriptSuccess([ 13394a8d9f2eSBram Moolenaar 'vim9script', 13404a8d9f2eSBram Moolenaar 'exe "echo" # something', 13414a8d9f2eSBram Moolenaar ]) 13424a8d9f2eSBram Moolenaar CheckScriptFailure([ 13434a8d9f2eSBram Moolenaar 'vim9script', 13444a8d9f2eSBram Moolenaar 'exe "echo"# something', 13454a8d9f2eSBram Moolenaar ], 'E121:') 13464a8d9f2eSBram Moolenaar CheckDefFailure([ 13474a8d9f2eSBram Moolenaar 'exe # comment', 13484a8d9f2eSBram Moolenaar ], 'E1015:') 13494a8d9f2eSBram Moolenaar CheckScriptFailure([ 13504a8d9f2eSBram Moolenaar 'vim9script', 13514a8d9f2eSBram Moolenaar 'exe# something', 13524a8d9f2eSBram Moolenaar ], 'E121:') 13534a8d9f2eSBram Moolenaar CheckScriptFailure([ 13544a8d9f2eSBram Moolenaar 'exe "echo" # something', 13554a8d9f2eSBram Moolenaar ], 'E121:') 13564a8d9f2eSBram Moolenaar 13577a092245SBram Moolenaar CheckDefFailure([ 13587a092245SBram Moolenaar 'try# comment', 13597a092245SBram Moolenaar ' echo "yes"', 13607a092245SBram Moolenaar 'catch', 13617a092245SBram Moolenaar 'endtry', 13627a092245SBram Moolenaar ], 'E488:') 13632c5ed4e3SBram Moolenaar CheckScriptFailure([ 13642c5ed4e3SBram Moolenaar 'vim9script', 13652c5ed4e3SBram Moolenaar 'try# comment', 13662c5ed4e3SBram Moolenaar 'echo "yes"', 13672c5ed4e3SBram Moolenaar ], 'E488:') 13687a092245SBram Moolenaar CheckDefFailure([ 13697a092245SBram Moolenaar 'try', 1370a72cfb80SBram Moolenaar ' throw#comment', 1371a72cfb80SBram Moolenaar 'catch', 1372a72cfb80SBram Moolenaar 'endtry', 1373a72cfb80SBram Moolenaar ], 'E1015:') 1374a72cfb80SBram Moolenaar CheckDefFailure([ 1375a72cfb80SBram Moolenaar 'try', 1376a72cfb80SBram Moolenaar ' throw "yes"#comment', 1377a72cfb80SBram Moolenaar 'catch', 1378a72cfb80SBram Moolenaar 'endtry', 1379a72cfb80SBram Moolenaar ], 'E488:') 1380a72cfb80SBram Moolenaar CheckDefFailure([ 1381a72cfb80SBram Moolenaar 'try', 13827a092245SBram Moolenaar ' echo "yes"', 13837a092245SBram Moolenaar 'catch# comment', 13847a092245SBram Moolenaar 'endtry', 13857a092245SBram Moolenaar ], 'E488:') 13862c5ed4e3SBram Moolenaar CheckScriptFailure([ 13872c5ed4e3SBram Moolenaar 'vim9script', 13882c5ed4e3SBram Moolenaar 'try', 13892c5ed4e3SBram Moolenaar ' echo "yes"', 13902c5ed4e3SBram Moolenaar 'catch# comment', 13912c5ed4e3SBram Moolenaar 'endtry', 13922c5ed4e3SBram Moolenaar ], 'E654:') 13932c5ed4e3SBram Moolenaar CheckDefFailure([ 13942c5ed4e3SBram Moolenaar 'try', 13952c5ed4e3SBram Moolenaar ' echo "yes"', 13962c5ed4e3SBram Moolenaar 'catch /pat/# comment', 13972c5ed4e3SBram Moolenaar 'endtry', 13982c5ed4e3SBram Moolenaar ], 'E488:') 13997a092245SBram Moolenaar CheckDefFailure([ 14007a092245SBram Moolenaar 'try', 14017a092245SBram Moolenaar 'echo "yes"', 14027a092245SBram Moolenaar 'catch', 14037a092245SBram Moolenaar 'endtry# comment', 14047a092245SBram Moolenaar ], 'E488:') 14052c5ed4e3SBram Moolenaar CheckScriptFailure([ 14062c5ed4e3SBram Moolenaar 'vim9script', 14072c5ed4e3SBram Moolenaar 'try', 14082c5ed4e3SBram Moolenaar ' echo "yes"', 14092c5ed4e3SBram Moolenaar 'catch', 14102c5ed4e3SBram Moolenaar 'endtry# comment', 14112c5ed4e3SBram Moolenaar ], 'E600:') 14122c5ed4e3SBram Moolenaar 14132c5ed4e3SBram Moolenaar CheckScriptSuccess([ 14142c5ed4e3SBram Moolenaar 'vim9script', 14152c5ed4e3SBram Moolenaar 'hi # comment', 14162c5ed4e3SBram Moolenaar ]) 14172c5ed4e3SBram Moolenaar CheckScriptFailure([ 14182c5ed4e3SBram Moolenaar 'vim9script', 14192c5ed4e3SBram Moolenaar 'hi# comment', 14202c5ed4e3SBram Moolenaar ], 'E416:') 14211966c248SBram Moolenaar CheckScriptSuccess([ 14221966c248SBram Moolenaar 'vim9script', 14231966c248SBram Moolenaar 'hi Search # comment', 14241966c248SBram Moolenaar ]) 14251966c248SBram Moolenaar CheckScriptFailure([ 14261966c248SBram Moolenaar 'vim9script', 14271966c248SBram Moolenaar 'hi Search# comment', 14281966c248SBram Moolenaar ], 'E416:') 14291966c248SBram Moolenaar CheckScriptSuccess([ 14301966c248SBram Moolenaar 'vim9script', 14311966c248SBram Moolenaar 'hi link This Search # comment', 14321966c248SBram Moolenaar ]) 14331966c248SBram Moolenaar CheckScriptFailure([ 14341966c248SBram Moolenaar 'vim9script', 14351966c248SBram Moolenaar 'hi link This That# comment', 14361966c248SBram Moolenaar ], 'E413:') 14371966c248SBram Moolenaar CheckScriptSuccess([ 14381966c248SBram Moolenaar 'vim9script', 14391966c248SBram Moolenaar 'hi clear This # comment', 14401966c248SBram Moolenaar 'hi clear # comment', 14411966c248SBram Moolenaar ]) 14421966c248SBram Moolenaar " not tested, because it doesn't give an error but a warning: 14431966c248SBram Moolenaar " hi clear This# comment', 14441966c248SBram Moolenaar CheckScriptFailure([ 14451966c248SBram Moolenaar 'vim9script', 14461966c248SBram Moolenaar 'hi clear# comment', 14471966c248SBram Moolenaar ], 'E416:') 14481966c248SBram Moolenaar 14491966c248SBram Moolenaar CheckScriptSuccess([ 14501966c248SBram Moolenaar 'vim9script', 14511966c248SBram Moolenaar 'hi Group term=bold', 14521966c248SBram Moolenaar 'match Group /todo/ # comment', 14531966c248SBram Moolenaar ]) 14541966c248SBram Moolenaar CheckScriptFailure([ 14551966c248SBram Moolenaar 'vim9script', 14561966c248SBram Moolenaar 'hi Group term=bold', 14571966c248SBram Moolenaar 'match Group /todo/# comment', 14581966c248SBram Moolenaar ], 'E488:') 14591966c248SBram Moolenaar CheckScriptSuccess([ 14601966c248SBram Moolenaar 'vim9script', 14611966c248SBram Moolenaar 'match # comment', 14621966c248SBram Moolenaar ]) 14631966c248SBram Moolenaar CheckScriptFailure([ 14641966c248SBram Moolenaar 'vim9script', 14651966c248SBram Moolenaar 'match# comment', 14661966c248SBram Moolenaar ], 'E475:') 14671966c248SBram Moolenaar CheckScriptSuccess([ 14681966c248SBram Moolenaar 'vim9script', 14691966c248SBram Moolenaar 'match none # comment', 14701966c248SBram Moolenaar ]) 14711966c248SBram Moolenaar CheckScriptFailure([ 14721966c248SBram Moolenaar 'vim9script', 14731966c248SBram Moolenaar 'match none# comment', 14741966c248SBram Moolenaar ], 'E475:') 14751966c248SBram Moolenaar 14761966c248SBram Moolenaar CheckScriptSuccess([ 14771966c248SBram Moolenaar 'vim9script', 14781966c248SBram Moolenaar 'menutrans clear # comment', 14791966c248SBram Moolenaar ]) 14801966c248SBram Moolenaar CheckScriptFailure([ 14811966c248SBram Moolenaar 'vim9script', 14821966c248SBram Moolenaar 'menutrans clear# comment text', 14831966c248SBram Moolenaar ], 'E474:') 14841966c248SBram Moolenaar 14851966c248SBram Moolenaar CheckScriptSuccess([ 14861966c248SBram Moolenaar 'vim9script', 14871966c248SBram Moolenaar 'syntax clear # comment', 14881966c248SBram Moolenaar ]) 14891966c248SBram Moolenaar CheckScriptFailure([ 14901966c248SBram Moolenaar 'vim9script', 14911966c248SBram Moolenaar 'syntax clear# comment text', 14921966c248SBram Moolenaar ], 'E28:') 14931966c248SBram Moolenaar CheckScriptSuccess([ 14941966c248SBram Moolenaar 'vim9script', 14951966c248SBram Moolenaar 'syntax keyword Word some', 14961966c248SBram Moolenaar 'syntax clear Word # comment', 14971966c248SBram Moolenaar ]) 14981966c248SBram Moolenaar CheckScriptFailure([ 14991966c248SBram Moolenaar 'vim9script', 15001966c248SBram Moolenaar 'syntax keyword Word some', 15011966c248SBram Moolenaar 'syntax clear Word# comment text', 15021966c248SBram Moolenaar ], 'E28:') 15031966c248SBram Moolenaar 15041966c248SBram Moolenaar CheckScriptSuccess([ 15051966c248SBram Moolenaar 'vim9script', 15061966c248SBram Moolenaar 'syntax list # comment', 15071966c248SBram Moolenaar ]) 15081966c248SBram Moolenaar CheckScriptFailure([ 15091966c248SBram Moolenaar 'vim9script', 15101966c248SBram Moolenaar 'syntax list# comment text', 15111966c248SBram Moolenaar ], 'E28:') 15121966c248SBram Moolenaar 15131966c248SBram Moolenaar CheckScriptSuccess([ 15141966c248SBram Moolenaar 'vim9script', 15151966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 15161966c248SBram Moolenaar ]) 15171966c248SBram Moolenaar CheckScriptFailure([ 15181966c248SBram Moolenaar 'vim9script', 15191966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 15201966c248SBram Moolenaar ], 'E475:') 15211966c248SBram Moolenaar 15221966c248SBram Moolenaar CheckScriptSuccess([ 15231966c248SBram Moolenaar 'vim9script', 15241966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 15251966c248SBram Moolenaar ]) 15261966c248SBram Moolenaar CheckScriptFailure([ 15271966c248SBram Moolenaar 'vim9script', 15281966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 15291966c248SBram Moolenaar ], 'E789:') 15301966c248SBram Moolenaar 15311966c248SBram Moolenaar CheckScriptSuccess([ 15321966c248SBram Moolenaar 'vim9script', 15331966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 15341966c248SBram Moolenaar ]) 15351966c248SBram Moolenaar CheckScriptFailure([ 15361966c248SBram Moolenaar 'vim9script', 15371966c248SBram Moolenaar 'syntax match Word /pat/# comment', 15381966c248SBram Moolenaar ], 'E402:') 15391966c248SBram Moolenaar 15401966c248SBram Moolenaar CheckScriptSuccess([ 15411966c248SBram Moolenaar 'vim9script', 15421966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 15431966c248SBram Moolenaar ]) 15441966c248SBram Moolenaar CheckScriptFailure([ 15451966c248SBram Moolenaar 'vim9script', 15461966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 15471966c248SBram Moolenaar ], 'E475:') 15481966c248SBram Moolenaar CheckScriptFailure([ 15491966c248SBram Moolenaar 'vim9script', 15501966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 15511966c248SBram Moolenaar ], 'E406:') 15521966c248SBram Moolenaar CheckScriptFailure([ 15531966c248SBram Moolenaar 'vim9script', 15541966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 15551966c248SBram Moolenaar ], 'E475:') 15561966c248SBram Moolenaar 15571966c248SBram Moolenaar CheckScriptSuccess([ 15581966c248SBram Moolenaar 'vim9script', 15591966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 15601966c248SBram Moolenaar ]) 15611966c248SBram Moolenaar CheckScriptFailure([ 15621966c248SBram Moolenaar 'vim9script', 15631966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 15641966c248SBram Moolenaar ], 'E475:') 15651966c248SBram Moolenaar 15661966c248SBram Moolenaar CheckScriptSuccess([ 15671966c248SBram Moolenaar 'vim9script', 15681966c248SBram Moolenaar 'syntax sync # comment', 15691966c248SBram Moolenaar ]) 15701966c248SBram Moolenaar CheckScriptFailure([ 15711966c248SBram Moolenaar 'vim9script', 15721966c248SBram Moolenaar 'syntax sync# comment', 15731966c248SBram Moolenaar ], 'E404:') 15741966c248SBram Moolenaar CheckScriptSuccess([ 15751966c248SBram Moolenaar 'vim9script', 15761966c248SBram Moolenaar 'syntax sync ccomment # comment', 15771966c248SBram Moolenaar ]) 15781966c248SBram Moolenaar CheckScriptFailure([ 15791966c248SBram Moolenaar 'vim9script', 15801966c248SBram Moolenaar 'syntax sync ccomment# comment', 15811966c248SBram Moolenaar ], 'E404:') 15821966c248SBram Moolenaar 15831966c248SBram Moolenaar CheckScriptSuccess([ 15841966c248SBram Moolenaar 'vim9script', 15851966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 15861966c248SBram Moolenaar ]) 15871966c248SBram Moolenaar CheckScriptFailure([ 15881966c248SBram Moolenaar 'vim9script', 15891966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 15901966c248SBram Moolenaar ], 'E475:') 1591a72cfb80SBram Moolenaar 1592a72cfb80SBram Moolenaar CheckScriptSuccess([ 1593a72cfb80SBram Moolenaar 'vim9script', 1594a72cfb80SBram Moolenaar 'command Echo echo # comment', 1595a72cfb80SBram Moolenaar 'command Echo # comment', 1596a72cfb80SBram Moolenaar ]) 1597a72cfb80SBram Moolenaar CheckScriptFailure([ 1598a72cfb80SBram Moolenaar 'vim9script', 1599a72cfb80SBram Moolenaar 'command Echo echo# comment', 1600a72cfb80SBram Moolenaar 'Echo', 1601a72cfb80SBram Moolenaar ], 'E121:') 1602a72cfb80SBram Moolenaar CheckScriptFailure([ 1603a72cfb80SBram Moolenaar 'vim9script', 1604a72cfb80SBram Moolenaar 'command Echo# comment', 1605a72cfb80SBram Moolenaar ], 'E182:') 1606a72cfb80SBram Moolenaar CheckScriptFailure([ 1607a72cfb80SBram Moolenaar 'vim9script', 1608a72cfb80SBram Moolenaar 'command Echo echo', 1609a72cfb80SBram Moolenaar 'command Echo# comment', 1610a72cfb80SBram Moolenaar ], 'E182:') 1611a72cfb80SBram Moolenaar 1612a72cfb80SBram Moolenaar CheckScriptSuccess([ 1613a72cfb80SBram Moolenaar 'vim9script', 1614a72cfb80SBram Moolenaar 'function # comment', 1615a72cfb80SBram Moolenaar ]) 1616a72cfb80SBram Moolenaar CheckScriptFailure([ 1617a72cfb80SBram Moolenaar 'vim9script', 1618a72cfb80SBram Moolenaar 'function# comment', 1619a72cfb80SBram Moolenaar ], 'E129:') 1620a72cfb80SBram Moolenaar CheckScriptSuccess([ 1621a72cfb80SBram Moolenaar 'vim9script', 1622a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 1623a72cfb80SBram Moolenaar ]) 1624a72cfb80SBram Moolenaar CheckScriptFailure([ 1625a72cfb80SBram Moolenaar 'vim9script', 1626a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 1627a72cfb80SBram Moolenaar ], 'E488:') 1628a72cfb80SBram Moolenaar 1629a72cfb80SBram Moolenaar CheckScriptSuccess([ 1630a72cfb80SBram Moolenaar 'vim9script', 16314c17ad94SBram Moolenaar 'func g:DeleteMeA()', 1632a72cfb80SBram Moolenaar 'endfunc', 16334c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 1634a72cfb80SBram Moolenaar ]) 1635a72cfb80SBram Moolenaar CheckScriptFailure([ 1636a72cfb80SBram Moolenaar 'vim9script', 16374c17ad94SBram Moolenaar 'func g:DeleteMeB()', 1638a72cfb80SBram Moolenaar 'endfunc', 16394c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 1640a72cfb80SBram Moolenaar ], 'E488:') 1641a72cfb80SBram Moolenaar 1642a72cfb80SBram Moolenaar CheckScriptSuccess([ 1643a72cfb80SBram Moolenaar 'vim9script', 1644a72cfb80SBram Moolenaar 'call execute("ls") # comment', 1645a72cfb80SBram Moolenaar ]) 1646a72cfb80SBram Moolenaar CheckScriptFailure([ 1647a72cfb80SBram Moolenaar 'vim9script', 1648a72cfb80SBram Moolenaar 'call execute("ls")# comment', 1649a72cfb80SBram Moolenaar ], 'E488:') 16502c5ed4e3SBram Moolenaarenddef 16512c5ed4e3SBram Moolenaar 16522c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 16532c5ed4e3SBram Moolenaar CheckCanRunGui 16542c5ed4e3SBram Moolenaar 16552c5ed4e3SBram Moolenaar CheckScriptFailure([ 16562c5ed4e3SBram Moolenaar 'vim9script', 16572c5ed4e3SBram Moolenaar 'gui#comment' 16582c5ed4e3SBram Moolenaar ], 'E499:') 16592c5ed4e3SBram Moolenaar CheckScriptFailure([ 16602c5ed4e3SBram Moolenaar 'vim9script', 16612c5ed4e3SBram Moolenaar 'gui -f#comment' 16622c5ed4e3SBram Moolenaar ], 'E499:') 16637a092245SBram Moolenaarenddef 16647a092245SBram Moolenaar 1665a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 1666a26b9700SBram Moolenaar au TabEnter *.vim let g:entered = 1 1667a26b9700SBram Moolenaar au TabEnter *.x let g:entered = 2 1668a26b9700SBram Moolenaar 1669a26b9700SBram Moolenaar edit test.vim 1670a26b9700SBram Moolenaar doautocmd TabEnter #comment 1671a26b9700SBram Moolenaar assert_equal(1, g:entered) 1672a26b9700SBram Moolenaar 1673a26b9700SBram Moolenaar doautocmd TabEnter f.x 1674a26b9700SBram Moolenaar assert_equal(2, g:entered) 1675a26b9700SBram Moolenaar 1676a26b9700SBram Moolenaar g:entered = 0 1677a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 1678a26b9700SBram Moolenaar assert_equal(2, g:entered) 1679a26b9700SBram Moolenaar 1680a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 1681a26b9700SBram Moolenaar 1682a26b9700SBram Moolenaar au! TabEnter 1683a26b9700SBram Moolenaar unlet g:entered 1684d72c1bf0SBram Moolenaar 1685d72c1bf0SBram Moolenaar CheckScriptSuccess([ 1686d72c1bf0SBram Moolenaar 'vim9script', 1687d72c1bf0SBram Moolenaar 'let g:var = 123', 1688d72c1bf0SBram Moolenaar 'let w:var = 777', 1689d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 1690d72c1bf0SBram Moolenaar ]) 1691d72c1bf0SBram Moolenaar 1692d72c1bf0SBram Moolenaar CheckScriptFailure([ 1693d72c1bf0SBram Moolenaar 'vim9script', 1694d72c1bf0SBram Moolenaar 'let g:var = 123', 169532e35117SBram Moolenaar 'unlet g:var# comment1', 1696d72c1bf0SBram Moolenaar ], 'E108:') 1697d72c1bf0SBram Moolenaar 1698d72c1bf0SBram Moolenaar CheckScriptFailure([ 1699d72c1bf0SBram Moolenaar 'let g:var = 123', 1700d72c1bf0SBram Moolenaar 'unlet g:var # something', 1701d72c1bf0SBram Moolenaar ], 'E488:') 1702faac4104SBram Moolenaar 1703faac4104SBram Moolenaar CheckScriptSuccess([ 1704faac4104SBram Moolenaar 'vim9script', 170532e35117SBram Moolenaar 'if 1 # comment2', 1706faac4104SBram Moolenaar ' echo "yes"', 1707faac4104SBram Moolenaar 'elseif 2 #comment', 1708faac4104SBram Moolenaar ' echo "no"', 1709faac4104SBram Moolenaar 'endif', 1710faac4104SBram Moolenaar ]) 1711faac4104SBram Moolenaar 1712faac4104SBram Moolenaar CheckScriptFailure([ 1713faac4104SBram Moolenaar 'vim9script', 171432e35117SBram Moolenaar 'if 1# comment3', 1715faac4104SBram Moolenaar ' echo "yes"', 1716faac4104SBram Moolenaar 'endif', 1717faac4104SBram Moolenaar ], 'E15:') 1718faac4104SBram Moolenaar 1719faac4104SBram Moolenaar CheckScriptFailure([ 1720faac4104SBram Moolenaar 'vim9script', 172132e35117SBram Moolenaar 'if 0 # comment4', 1722faac4104SBram Moolenaar ' echo "yes"', 1723faac4104SBram Moolenaar 'elseif 2#comment', 1724faac4104SBram Moolenaar ' echo "no"', 1725faac4104SBram Moolenaar 'endif', 1726faac4104SBram Moolenaar ], 'E15:') 1727faac4104SBram Moolenaar 1728faac4104SBram Moolenaar CheckScriptSuccess([ 1729faac4104SBram Moolenaar 'vim9script', 173032e35117SBram Moolenaar 'let v = 1 # comment5', 1731faac4104SBram Moolenaar ]) 1732faac4104SBram Moolenaar 1733faac4104SBram Moolenaar CheckScriptFailure([ 1734faac4104SBram Moolenaar 'vim9script', 173532e35117SBram Moolenaar 'let v = 1# comment6', 173632e35117SBram Moolenaar ], 'E15:') 1737faac4104SBram Moolenaar 1738faac4104SBram Moolenaar CheckScriptSuccess([ 1739faac4104SBram Moolenaar 'vim9script', 1740faac4104SBram Moolenaar 'new' 1741faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 1742faac4104SBram Moolenaar '$', 1743faac4104SBram Moolenaar 'dsearch /pat/ #comment', 1744faac4104SBram Moolenaar 'bwipe!', 1745faac4104SBram Moolenaar ]) 1746faac4104SBram Moolenaar 1747faac4104SBram Moolenaar CheckScriptFailure([ 1748faac4104SBram Moolenaar 'vim9script', 1749faac4104SBram Moolenaar 'new' 1750faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 1751faac4104SBram Moolenaar '$', 1752faac4104SBram Moolenaar 'dsearch /pat/#comment', 1753faac4104SBram Moolenaar 'bwipe!', 1754faac4104SBram Moolenaar ], 'E488:') 175574fae513SBram Moolenaar 175674fae513SBram Moolenaar CheckScriptFailure([ 175774fae513SBram Moolenaar 'vim9script', 175874fae513SBram Moolenaar 'func! SomeFunc()', 175974fae513SBram Moolenaar ], 'E477:') 1760a26b9700SBram Moolenaarenddef 1761a26b9700SBram Moolenaar 17627e5bd91dSBram Moolenaardef Test_finish() 17637e5bd91dSBram Moolenaar let lines =<< trim END 17647e5bd91dSBram Moolenaar vim9script 17657e5bd91dSBram Moolenaar let g:res = 'one' 17667e5bd91dSBram Moolenaar if v:false | finish | endif 17677e5bd91dSBram Moolenaar let g:res = 'two' 17687e5bd91dSBram Moolenaar finish 17697e5bd91dSBram Moolenaar let g:res = 'three' 17707e5bd91dSBram Moolenaar END 17717e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 17727e5bd91dSBram Moolenaar source Xfinished 17737e5bd91dSBram Moolenaar assert_equal('two', g:res) 17747e5bd91dSBram Moolenaar 17757e5bd91dSBram Moolenaar unlet g:res 17767e5bd91dSBram Moolenaar delete('Xfinished') 17777e5bd91dSBram Moolenaarenddef 17787e5bd91dSBram Moolenaar 177932e35117SBram Moolenaardef Test_let_func_call() 178032e35117SBram Moolenaar let lines =<< trim END 178132e35117SBram Moolenaar vim9script 178232e35117SBram Moolenaar func GetValue() 178332e35117SBram Moolenaar if exists('g:count') 178432e35117SBram Moolenaar let g:count += 1 178532e35117SBram Moolenaar else 178632e35117SBram Moolenaar let g:count = 1 178732e35117SBram Moolenaar endif 178832e35117SBram Moolenaar return 'this' 178932e35117SBram Moolenaar endfunc 179032e35117SBram Moolenaar let val: string = GetValue() 1791df671b46SBram Moolenaar " env var is always a string 1792df671b46SBram Moolenaar let env = $TERM 179332e35117SBram Moolenaar END 179432e35117SBram Moolenaar writefile(lines, 'Xfinished') 179532e35117SBram Moolenaar source Xfinished 1796a5d0077eSBram Moolenaar " GetValue() is not called during discovery phase 179732e35117SBram Moolenaar assert_equal(1, g:count) 179832e35117SBram Moolenaar 179932e35117SBram Moolenaar unlet g:count 180032e35117SBram Moolenaar delete('Xfinished') 180132e35117SBram Moolenaarenddef 180232e35117SBram Moolenaar 180332e35117SBram Moolenaardef Test_let_missing_type() 180432e35117SBram Moolenaar let lines =<< trim END 180532e35117SBram Moolenaar vim9script 1806df671b46SBram Moolenaar let var = g:unknown 1807227a69deSBram Moolenaar END 1808822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 1809227a69deSBram Moolenaar 1810227a69deSBram Moolenaar lines =<< trim END 1811227a69deSBram Moolenaar vim9script 1812227a69deSBram Moolenaar let nr: number = 123 1813227a69deSBram Moolenaar let var = nr 1814227a69deSBram Moolenaar END 1815822ba247SBram Moolenaar CheckScriptSuccess(lines) 181632e35117SBram Moolenaarenddef 181732e35117SBram Moolenaar 1818c82a5b5dSBram Moolenaardef Test_let_declaration() 1819c82a5b5dSBram Moolenaar let lines =<< trim END 1820c82a5b5dSBram Moolenaar vim9script 1821c82a5b5dSBram Moolenaar let var: string 1822c82a5b5dSBram Moolenaar g:var_uninit = var 1823c82a5b5dSBram Moolenaar var = 'text' 1824c82a5b5dSBram Moolenaar g:var_test = var 1825*984dddbeSBram Moolenaar " prefixing s: is optional 1826*984dddbeSBram Moolenaar s:var = 'prefixed' 1827*984dddbeSBram Moolenaar g:var_prefixed = s:var 1828*984dddbeSBram Moolenaar 1829*984dddbeSBram Moolenaar let s:other: number 1830*984dddbeSBram Moolenaar other = 1234 1831*984dddbeSBram Moolenaar g:other_var = other 1832c82a5b5dSBram Moolenaar END 1833c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 1834c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 1835c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 1836*984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 1837*984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 1838c82a5b5dSBram Moolenaar 1839c82a5b5dSBram Moolenaar unlet g:var_uninit 1840c82a5b5dSBram Moolenaar unlet g:var_test 1841*984dddbeSBram Moolenaar unlet g:var_prefixed 1842*984dddbeSBram Moolenaar unlet g:other_var 1843c82a5b5dSBram Moolenaarenddef 1844c82a5b5dSBram Moolenaar 184534db91f7SBram Moolenaardef Test_let_type_check() 184634db91f7SBram Moolenaar let lines =<< trim END 184734db91f7SBram Moolenaar vim9script 184834db91f7SBram Moolenaar let var: string 184934db91f7SBram Moolenaar var = 1234 185034db91f7SBram Moolenaar END 185134db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 1852*984dddbeSBram Moolenaar 1853*984dddbeSBram Moolenaar lines =<< trim END 1854*984dddbeSBram Moolenaar vim9script 1855*984dddbeSBram Moolenaar let var:string 1856*984dddbeSBram Moolenaar END 1857*984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 185834db91f7SBram Moolenaarenddef 185934db91f7SBram Moolenaar 1860a5d0077eSBram Moolenaardef Test_forward_declaration() 1861a5d0077eSBram Moolenaar let lines =<< trim END 1862a5d0077eSBram Moolenaar vim9script 1863a5d0077eSBram Moolenaar def GetValue(): string 1864a5d0077eSBram Moolenaar return theVal 1865a5d0077eSBram Moolenaar enddef 1866a5d0077eSBram Moolenaar let theVal = 'something' 1867822ba247SBram Moolenaar g:initVal = GetValue() 1868a5d0077eSBram Moolenaar theVal = 'else' 1869a5d0077eSBram Moolenaar g:laterVal = GetValue() 1870a5d0077eSBram Moolenaar END 1871a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 1872a5d0077eSBram Moolenaar source Xforward 1873a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 1874a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 1875a5d0077eSBram Moolenaar 1876a5d0077eSBram Moolenaar unlet g:initVal 1877a5d0077eSBram Moolenaar unlet g:laterVal 1878a5d0077eSBram Moolenaar delete('Xforward') 1879a5d0077eSBram Moolenaarenddef 1880a5d0077eSBram Moolenaar 18819721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 18829721fb4eSBram Moolenaar let legacy_lines =<< trim END 18839721fb4eSBram Moolenaar source Xvim9_script.vim 18849721fb4eSBram Moolenaar 18859721fb4eSBram Moolenaar call assert_false(exists('local')) 18869721fb4eSBram Moolenaar call assert_false(exists('exported')) 18879721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 18889721fb4eSBram Moolenaar call assert_equal('global', global) 18899721fb4eSBram Moolenaar call assert_equal('global', g:global) 18909721fb4eSBram Moolenaar 18919721fb4eSBram Moolenaar " imported variable becomes script-local 18929721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 18939721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 18949721fb4eSBram Moolenaar call assert_false(exists('exported')) 18959721fb4eSBram Moolenaar 18969721fb4eSBram Moolenaar " imported function becomes script-local 18979721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 18989721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 18999721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 19009721fb4eSBram Moolenaar END 19019721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 19029721fb4eSBram Moolenaar 19039721fb4eSBram Moolenaar let vim9_lines =<< trim END 19049721fb4eSBram Moolenaar vim9script 19059721fb4eSBram Moolenaar let local = 'local' 19069721fb4eSBram Moolenaar g:global = 'global' 19079721fb4eSBram Moolenaar export let exported = 'exported' 19089721fb4eSBram Moolenaar export def GetText(): string 19099721fb4eSBram Moolenaar return 'text' 19109721fb4eSBram Moolenaar enddef 19119721fb4eSBram Moolenaar END 19129721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 19139721fb4eSBram Moolenaar 19149721fb4eSBram Moolenaar source Xlegacy_script.vim 19159721fb4eSBram Moolenaar 19169721fb4eSBram Moolenaar assert_equal('global', g:global) 19179721fb4eSBram Moolenaar" unlet g:global 19189721fb4eSBram Moolenaar 19199721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 19209721fb4eSBram Moolenaar delete('Xvim9_script.vim') 19219721fb4eSBram Moolenaarenddef 1922a5d0077eSBram Moolenaar 1923585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1924585fea7bSBram Moolenaardef Test_substitute_cmd() 1925585fea7bSBram Moolenaar new 1926585fea7bSBram Moolenaar setline(1, 'something') 1927585fea7bSBram Moolenaar :substitute(some(other( 1928585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1929585fea7bSBram Moolenaar bwipe! 1930585fea7bSBram Moolenaar 1931585fea7bSBram Moolenaar " also when the context is Vim9 script 1932585fea7bSBram Moolenaar let lines =<< trim END 1933585fea7bSBram Moolenaar vim9script 1934585fea7bSBram Moolenaar new 1935585fea7bSBram Moolenaar setline(1, 'something') 1936585fea7bSBram Moolenaar :substitute(some(other( 1937585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1938585fea7bSBram Moolenaar bwipe! 1939585fea7bSBram Moolenaar END 1940585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1941585fea7bSBram Moolenaar source Xvim9lines 1942585fea7bSBram Moolenaar 1943585fea7bSBram Moolenaar delete('Xvim9lines') 1944585fea7bSBram Moolenaarenddef 1945585fea7bSBram Moolenaar 19468a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1947