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 260c2ca58eSBram Moolenaar let list1: list<bool> = [false, true, false] 278a7d6542SBram Moolenaar let list2: list<number> = [1, 2, 3] 280c2ca58eSBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 290c2ca58eSBram Moolenaar let list4: list<any> = ['yes', true, 1234] 300c2ca58eSBram Moolenaar let list5: list<blob> = [0z01, 0z02] 318a7d6542SBram Moolenaar 32436472f5SBram Moolenaar let listS: list<string> = [] 33436472f5SBram Moolenaar let listN: list<number> = [] 348a7d6542SBram Moolenaar 350c2ca58eSBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 368a7d6542SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 370c2ca58eSBram Moolenaar let dict3: dict<string> = #{key: 'value'} 380c2ca58eSBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 390c2ca58eSBram Moolenaar let dict5: dict<blob> = #{one: 0z01, tw: 0z02} 40b283a8a6SBram Moolenaar 41f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 42f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 431cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 44f93c7feaSBram Moolenaar 459be61bbbSBram Moolenaar let a: number = 6 469be61bbbSBram Moolenaar assert_equal(6, a) 479be61bbbSBram Moolenaar 4842a480bfSBram Moolenaar if has('channel') 4942a480bfSBram Moolenaar let chan1: channel 50fbdd08edSBram Moolenaar let job1: job 51f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 5242a480bfSBram Moolenaar endif 53fbdd08edSBram Moolenaar if has('float') 54fbdd08edSBram Moolenaar let float1: float = 3.4 55fbdd08edSBram Moolenaar endif 565deeb3f1SBram Moolenaar let Funky1: func 575deeb3f1SBram Moolenaar let Funky2: func = function('len') 584c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 5942a480bfSBram Moolenaar 60cb711abfSBram Moolenaar # type becomes list<any> 6161a6d4e4SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 62cb711abfSBram Moolenaar # type becomes dict<any> 635381c7a1SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 6461a6d4e4SBram Moolenaar 65401d9ffbSBram Moolenaar g:newvar = 'new' 66401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 67401d9ffbSBram Moolenaar 68401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 69401d9ffbSBram Moolenaar g:existing = 'no' 70401d9ffbSBram Moolenaar assert_equal('no', g:existing) 71401d9ffbSBram Moolenaar 72b283a8a6SBram Moolenaar v:char = 'abc' 736e587dcbSBram Moolenaar assert_equal('abc', v:char) 74b283a8a6SBram Moolenaar 75b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 766e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 77b283a8a6SBram Moolenaar $ENVVAR = '' 786e587dcbSBram Moolenaar 79fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 80fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 81fd1823e0SBram Moolenaar s:addToMe += 222 82fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 830bbf722aSBram Moolenaar s:newVar = 'new' 840bbf722aSBram Moolenaar assert_equal('new', s:newVar) 85a8c17704SBram Moolenaar 86a8c17704SBram Moolenaar set ts=7 87a8c17704SBram Moolenaar &ts += 1 88a8c17704SBram Moolenaar assert_equal(8, &ts) 8980c34ca3SBram Moolenaar &ts -= 3 9080c34ca3SBram Moolenaar assert_equal(5, &ts) 9180c34ca3SBram Moolenaar &ts *= 2 9280c34ca3SBram Moolenaar assert_equal(10, &ts) 9380c34ca3SBram Moolenaar &ts /= 3 9480c34ca3SBram Moolenaar assert_equal(3, &ts) 9580c34ca3SBram Moolenaar set ts=10 9680c34ca3SBram Moolenaar &ts %= 4 9780c34ca3SBram Moolenaar assert_equal(2, &ts) 98a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 99a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 100a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 101a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 102a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 103a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 104a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 105a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 106cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 107585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 10880c34ca3SBram Moolenaar &ts = 8 109a8c17704SBram Moolenaar 110a8c17704SBram Moolenaar g:inc_counter += 1 111a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 112a8c17704SBram Moolenaar 113a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 114a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 115a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 116a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 117a8c17704SBram Moolenaar 118a8c17704SBram Moolenaar @a = 'areg' 119a8c17704SBram Moolenaar @a ..= 'add' 120a8c17704SBram Moolenaar assert_equal('aregadd', @a) 121a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 122a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 123e69f6d04SBram Moolenaar 124e69f6d04SBram Moolenaar v:errmsg = 'none' 125e69f6d04SBram Moolenaar v:errmsg ..= 'again' 126e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 127e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 128e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 1295deeb3f1SBram Moolenaarenddef 1305deeb3f1SBram Moolenaar 131d3aac291SBram Moolenaardef Test_assignment_local() 132d3aac291SBram Moolenaar " Test in a separated file in order not to the current buffer/window/tab is 133d3aac291SBram Moolenaar " changed. 134d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 135d3aac291SBram Moolenaar let b:existing = 'yes' 136d3aac291SBram Moolenaar let w:existing = 'yes' 137d3aac291SBram Moolenaar let t:existing = 'yes' 138d3aac291SBram Moolenaar 139d3aac291SBram Moolenaar def Test_assignment_local_internal() 140d3aac291SBram Moolenaar b:newvar = 'new' 141d3aac291SBram Moolenaar assert_equal('new', b:newvar) 142d3aac291SBram Moolenaar assert_equal('yes', b:existing) 143d3aac291SBram Moolenaar b:existing = 'no' 144d3aac291SBram Moolenaar assert_equal('no', b:existing) 145396f3138SBram Moolenaar b:existing ..= 'NO' 146396f3138SBram Moolenaar assert_equal('noNO', b:existing) 147d3aac291SBram Moolenaar 148d3aac291SBram Moolenaar w:newvar = 'new' 149d3aac291SBram Moolenaar assert_equal('new', w:newvar) 150d3aac291SBram Moolenaar assert_equal('yes', w:existing) 151d3aac291SBram Moolenaar w:existing = 'no' 152d3aac291SBram Moolenaar assert_equal('no', w:existing) 153396f3138SBram Moolenaar w:existing ..= 'NO' 154396f3138SBram Moolenaar assert_equal('noNO', w:existing) 155d3aac291SBram Moolenaar 156d3aac291SBram Moolenaar t:newvar = 'new' 157d3aac291SBram Moolenaar assert_equal('new', t:newvar) 158d3aac291SBram Moolenaar assert_equal('yes', t:existing) 159d3aac291SBram Moolenaar t:existing = 'no' 160d3aac291SBram Moolenaar assert_equal('no', t:existing) 161396f3138SBram Moolenaar t:existing ..= 'NO' 162396f3138SBram Moolenaar assert_equal('noNO', t:existing) 163d3aac291SBram Moolenaar enddef 164d3aac291SBram Moolenaar call Test_assignment_local_internal() 165d3aac291SBram Moolenaar END 166d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 167d3aac291SBram Moolenaarenddef 168d3aac291SBram Moolenaar 1695deeb3f1SBram Moolenaardef Test_assignment_default() 170e69f6d04SBram Moolenaar 171cb711abfSBram Moolenaar # Test default values. 172e69f6d04SBram Moolenaar let thebool: bool 173e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 174e69f6d04SBram Moolenaar 175e69f6d04SBram Moolenaar let thenumber: number 176e69f6d04SBram Moolenaar assert_equal(0, thenumber) 177e69f6d04SBram Moolenaar 178e69f6d04SBram Moolenaar if has('float') 179e69f6d04SBram Moolenaar let thefloat: float 180e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 181e69f6d04SBram Moolenaar endif 182e69f6d04SBram Moolenaar 183e69f6d04SBram Moolenaar let thestring: string 184e69f6d04SBram Moolenaar assert_equal('', thestring) 185e69f6d04SBram Moolenaar 186e69f6d04SBram Moolenaar let theblob: blob 187e69f6d04SBram Moolenaar assert_equal(0z, theblob) 188e69f6d04SBram Moolenaar 1895deeb3f1SBram Moolenaar let Thefunc: func 1905deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 191e69f6d04SBram Moolenaar 192e69f6d04SBram Moolenaar let thelist: list<any> 193e69f6d04SBram Moolenaar assert_equal([], thelist) 194e69f6d04SBram Moolenaar 195e69f6d04SBram Moolenaar let thedict: dict<any> 196e69f6d04SBram Moolenaar assert_equal({}, thedict) 197e69f6d04SBram Moolenaar 1982c869deeSBram Moolenaar if has('channel') 199e69f6d04SBram Moolenaar let thejob: job 200e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 201e69f6d04SBram Moolenaar 202e69f6d04SBram Moolenaar let thechannel: channel 203e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 2042c869deeSBram Moolenaar endif 205585fea7bSBram Moolenaar 206585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 207585fea7bSBram Moolenaar assert_equal(5678, nr) 2088a7d6542SBram Moolenaarenddef 2098a7d6542SBram Moolenaar 210cab27678SBram Moolenaardef Mess(): string 211cab27678SBram Moolenaar v:foldstart = 123 212cab27678SBram Moolenaar return 'xxx' 213cab27678SBram Moolenaarenddef 214cab27678SBram Moolenaar 215d72c1bf0SBram Moolenaardef Test_assignment_failure() 2168a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 2178a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 2188a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 2198a7d6542SBram Moolenaar 2208a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 2218a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 2228a7d6542SBram Moolenaar 2239be61bbbSBram Moolenaar call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:') 2249be61bbbSBram Moolenaar 225e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 2269be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 2279be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 2289be61bbbSBram Moolenaar 2299be61bbbSBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1065:') 2309be61bbbSBram Moolenaar 2319be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 2329be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 2339be61bbbSBram Moolenaar 2349be61bbbSBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016:') 235d3aac291SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1079:') 236d3aac291SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1078:') 237d3aac291SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1080:') 2389be61bbbSBram Moolenaar 2399be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 2409be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 2419be61bbbSBram Moolenaar 24233fa29cfSBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:') 24333fa29cfSBram Moolenaar 2448a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 2458a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 2468a7d6542SBram Moolenaar 2478a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 2488a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 2498a7d6542SBram Moolenaar 2508a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 2518a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 25242a480bfSBram Moolenaar 253d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 25442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 255cab27678SBram Moolenaar 256cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 257cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 258d72c1bf0SBram Moolenaarenddef 259d72c1bf0SBram Moolenaar 260d72c1bf0SBram Moolenaardef Test_unlet() 261d72c1bf0SBram Moolenaar g:somevar = 'yes' 262d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 263d72c1bf0SBram Moolenaar unlet g:somevar 264d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 265d72c1bf0SBram Moolenaar unlet! g:somevar 266d72c1bf0SBram Moolenaar 267d72c1bf0SBram Moolenaar call CheckScriptFailure([ 268d72c1bf0SBram Moolenaar 'vim9script', 269d72c1bf0SBram Moolenaar 'let svar = 123', 270d72c1bf0SBram Moolenaar 'unlet svar', 271d72c1bf0SBram Moolenaar ], 'E1081:') 272d72c1bf0SBram Moolenaar call CheckScriptFailure([ 273d72c1bf0SBram Moolenaar 'vim9script', 274d72c1bf0SBram Moolenaar 'let svar = 123', 275d72c1bf0SBram Moolenaar 'unlet s:svar', 276d72c1bf0SBram Moolenaar ], 'E1081:') 277d72c1bf0SBram Moolenaar call CheckScriptFailure([ 278d72c1bf0SBram Moolenaar 'vim9script', 279d72c1bf0SBram Moolenaar 'let svar = 123', 280d72c1bf0SBram Moolenaar 'def Func()', 281d72c1bf0SBram Moolenaar ' unlet svar', 282d72c1bf0SBram Moolenaar 'enddef', 283d72c1bf0SBram Moolenaar ], 'E1081:') 284d72c1bf0SBram Moolenaar call CheckScriptFailure([ 285d72c1bf0SBram Moolenaar 'vim9script', 286d72c1bf0SBram Moolenaar 'let svar = 123', 287d72c1bf0SBram Moolenaar 'def Func()', 288d72c1bf0SBram Moolenaar ' unlet s:svar', 289d72c1bf0SBram Moolenaar 'enddef', 290d72c1bf0SBram Moolenaar ], 'E1081:') 2917bdaea6eSBram Moolenaar 2927bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 2937bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 2947bdaea6eSBram Moolenaar unlet $ENVVAR 2957bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 296d72c1bf0SBram Moolenaarenddef 297599c89c8SBram Moolenaar 2984c17ad94SBram Moolenaardef Test_delfunction() 2994c17ad94SBram Moolenaar " Check function is defined in script namespace 3004c17ad94SBram Moolenaar CheckScriptSuccess([ 3014c17ad94SBram Moolenaar 'vim9script', 3024c17ad94SBram Moolenaar 'func CheckMe()', 3034c17ad94SBram Moolenaar ' return 123', 3044c17ad94SBram Moolenaar 'endfunc', 3054c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 3064c17ad94SBram Moolenaar ]) 3074c17ad94SBram Moolenaar 3084c17ad94SBram Moolenaar " Check function in script namespace cannot be deleted 3094c17ad94SBram Moolenaar CheckScriptFailure([ 3104c17ad94SBram Moolenaar 'vim9script', 3114c17ad94SBram Moolenaar 'func DeleteMe1()', 3124c17ad94SBram Moolenaar 'endfunc', 3134c17ad94SBram Moolenaar 'delfunction DeleteMe1', 3144c17ad94SBram Moolenaar ], 'E1084:') 3154c17ad94SBram Moolenaar CheckScriptFailure([ 3164c17ad94SBram Moolenaar 'vim9script', 3174c17ad94SBram Moolenaar 'func DeleteMe2()', 3184c17ad94SBram Moolenaar 'endfunc', 3194c17ad94SBram Moolenaar 'def DoThat()', 3204c17ad94SBram Moolenaar ' delfunction DeleteMe2', 3214c17ad94SBram Moolenaar 'enddef', 3224c17ad94SBram Moolenaar 'DoThat()', 3234c17ad94SBram Moolenaar ], 'E1084:') 3244c17ad94SBram Moolenaar CheckScriptFailure([ 3254c17ad94SBram Moolenaar 'vim9script', 3264c17ad94SBram Moolenaar 'def DeleteMe3()', 3274c17ad94SBram Moolenaar 'enddef', 3284c17ad94SBram Moolenaar 'delfunction DeleteMe3', 3294c17ad94SBram Moolenaar ], 'E1084:') 3304c17ad94SBram Moolenaar CheckScriptFailure([ 3314c17ad94SBram Moolenaar 'vim9script', 3324c17ad94SBram Moolenaar 'def DeleteMe4()', 3334c17ad94SBram Moolenaar 'enddef', 3344c17ad94SBram Moolenaar 'def DoThat()', 3354c17ad94SBram Moolenaar ' delfunction DeleteMe4', 3364c17ad94SBram Moolenaar 'enddef', 3374c17ad94SBram Moolenaar 'DoThat()', 3384c17ad94SBram Moolenaar ], 'E1084:') 3394c17ad94SBram Moolenaarenddef 3404c17ad94SBram Moolenaar 341599c89c8SBram Moolenaarfunc Test_wrong_type() 342599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 343599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 344599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 345599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 346599c89c8SBram Moolenaar 347599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 348599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 34942a480bfSBram Moolenaar 35042a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 35142a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 35242a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 35342a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 35442a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 35542a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 35642a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 35742a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 35842a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 35942a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 36042a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 361a0a9f43aSBram Moolenaar 362a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 363a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 3648a7d6542SBram Moolenaarendfunc 3658a7d6542SBram Moolenaar 3668a7d6542SBram Moolenaarfunc Test_const() 3678a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 3688a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 3698a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 3709be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 3718a7d6542SBram Moolenaarendfunc 3728a7d6542SBram Moolenaar 3738a7d6542SBram Moolenaardef Test_block() 3748a7d6542SBram Moolenaar let outer = 1 3758a7d6542SBram Moolenaar { 3768a7d6542SBram Moolenaar let inner = 2 3778a7d6542SBram Moolenaar assert_equal(1, outer) 3788a7d6542SBram Moolenaar assert_equal(2, inner) 3798a7d6542SBram Moolenaar } 3808a7d6542SBram Moolenaar assert_equal(1, outer) 3818a7d6542SBram Moolenaarenddef 3828a7d6542SBram Moolenaar 3838a7d6542SBram Moolenaarfunc Test_block_failure() 3848a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 385585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 386585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 3878a7d6542SBram Moolenaarendfunc 3888a7d6542SBram Moolenaar 389585fea7bSBram Moolenaardef Test_cmd_modifier() 390585fea7bSBram Moolenaar tab echo '0' 391585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 392585fea7bSBram Moolenaarenddef 393585fea7bSBram Moolenaar 3948a7d6542SBram Moolenaardef Test_try_catch() 3958a7d6542SBram Moolenaar let l = [] 3967a092245SBram Moolenaar try # comment 3978a7d6542SBram Moolenaar add(l, '1') 3988a7d6542SBram Moolenaar throw 'wrong' 3998a7d6542SBram Moolenaar add(l, '2') 4007a092245SBram Moolenaar catch # comment 4018a7d6542SBram Moolenaar add(l, v:exception) 4027a092245SBram Moolenaar finally # comment 4038a7d6542SBram Moolenaar add(l, '3') 4047a092245SBram Moolenaar endtry # comment 4058a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 4068a7d6542SBram Moolenaarenddef 4078a7d6542SBram Moolenaar 408257cc5eeSBram Moolenaardef ThrowFromDef() 409a72cfb80SBram Moolenaar throw "getout" # comment 410257cc5eeSBram Moolenaarenddef 411257cc5eeSBram Moolenaar 412257cc5eeSBram Moolenaarfunc CatchInFunc() 413257cc5eeSBram Moolenaar try 414257cc5eeSBram Moolenaar call ThrowFromDef() 415257cc5eeSBram Moolenaar catch 416257cc5eeSBram Moolenaar let g:thrown_func = v:exception 417257cc5eeSBram Moolenaar endtry 418257cc5eeSBram Moolenaarendfunc 419257cc5eeSBram Moolenaar 420257cc5eeSBram Moolenaardef CatchInDef() 421257cc5eeSBram Moolenaar try 422257cc5eeSBram Moolenaar ThrowFromDef() 423257cc5eeSBram Moolenaar catch 424257cc5eeSBram Moolenaar g:thrown_def = v:exception 425257cc5eeSBram Moolenaar endtry 426257cc5eeSBram Moolenaarenddef 427257cc5eeSBram Moolenaar 428f575adffSBram Moolenaardef ReturnFinally(): string 429f575adffSBram Moolenaar try 430f575adffSBram Moolenaar return 'intry' 431f575adffSBram Moolenaar finally 432f575adffSBram Moolenaar g:in_finally = 'finally' 433f575adffSBram Moolenaar endtry 434f575adffSBram Moolenaar return 'end' 435f575adffSBram Moolenaarenddef 436f575adffSBram Moolenaar 437257cc5eeSBram Moolenaardef Test_try_catch_nested() 438257cc5eeSBram Moolenaar CatchInFunc() 439257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 440257cc5eeSBram Moolenaar 441257cc5eeSBram Moolenaar CatchInDef() 442257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 443f575adffSBram Moolenaar 444f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 445f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 446f575adffSBram Moolenaarenddef 447f575adffSBram Moolenaar 448f575adffSBram Moolenaardef Test_try_catch_match() 449f575adffSBram Moolenaar let seq = 'a' 450f575adffSBram Moolenaar try 451f575adffSBram Moolenaar throw 'something' 452f575adffSBram Moolenaar catch /nothing/ 453f575adffSBram Moolenaar seq ..= 'x' 454f575adffSBram Moolenaar catch /some/ 455f575adffSBram Moolenaar seq ..= 'b' 456f575adffSBram Moolenaar catch /asdf/ 457f575adffSBram Moolenaar seq ..= 'x' 458e8c4abbbSBram Moolenaar catch ?a\?sdf? 459e8c4abbbSBram Moolenaar seq ..= 'y' 460f575adffSBram Moolenaar finally 461f575adffSBram Moolenaar seq ..= 'c' 462f575adffSBram Moolenaar endtry 463f575adffSBram Moolenaar assert_equal('abc', seq) 464257cc5eeSBram Moolenaarenddef 465257cc5eeSBram Moolenaar 466e8c4abbbSBram Moolenaardef Test_try_catch_fails() 467e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 468e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:') 469e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 470585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 471585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 472585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 473585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 474585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 475585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 476585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 477585fea7bSBram Moolenaar 478a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 479585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 480e8c4abbbSBram Moolenaarenddef 481e8c4abbbSBram Moolenaar 4822a1381c3SBram Moolenaarif has('channel') 48340ee466cSBram Moolenaar let someJob = test_null_job() 48440ee466cSBram Moolenaar 48540ee466cSBram Moolenaar def FuncWithError() 48640ee466cSBram Moolenaar echomsg g:someJob 48740ee466cSBram Moolenaar enddef 48840ee466cSBram Moolenaar 48940ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 49040ee466cSBram Moolenaar try 49140ee466cSBram Moolenaar call FuncWithError() 49240ee466cSBram Moolenaar catch 49340ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 49440ee466cSBram Moolenaar endtry 49540ee466cSBram Moolenaar endfunc 4962a1381c3SBram Moolenaarendif 49740ee466cSBram Moolenaar 4988a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 4998a7d6542SBram Moolenaar vim9script 5008a7d6542SBram Moolenaar let name: string = 'bob' 5018a7d6542SBram Moolenaar def Concat(arg: string): string 5028a7d6542SBram Moolenaar return name .. arg 5038a7d6542SBram Moolenaar enddef 504227a69deSBram Moolenaar g:result = Concat('bie') 505227a69deSBram Moolenaar g:localname = name 5068a7d6542SBram Moolenaar 5078a7d6542SBram Moolenaar export const CONST = 1234 5088a7d6542SBram Moolenaar export let exported = 9876 5096e587dcbSBram Moolenaar export let exp_name = 'John' 5108a7d6542SBram Moolenaar export def Exported(): string 5118a7d6542SBram Moolenaar return 'Exported' 5128a7d6542SBram Moolenaar enddef 5138a7d6542SBram MoolenaarEND 5148a7d6542SBram Moolenaar 5155269bd2aSBram Moolenaardef Test_vim9_import_export() 5168a7d6542SBram Moolenaar let import_script_lines =<< trim END 5178a7d6542SBram Moolenaar vim9script 5188a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 5198a7d6542SBram Moolenaar g:imported = exported 5206e587dcbSBram Moolenaar exported += 3 5216e587dcbSBram Moolenaar g:imported_added = exported 5228a7d6542SBram Moolenaar g:imported_func = Exported() 5236e587dcbSBram Moolenaar 5246e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 5256e587dcbSBram Moolenaar g:imported_name = exp_name 5266e587dcbSBram Moolenaar exp_name ..= ' Doe' 5276e587dcbSBram Moolenaar g:imported_name_appended = exp_name 5285381c7a1SBram Moolenaar g:imported_later = exported 5298a7d6542SBram Moolenaar END 5308a7d6542SBram Moolenaar 5318a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 5328a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 5338a7d6542SBram Moolenaar 5348a7d6542SBram Moolenaar source Ximport.vim 5358a7d6542SBram Moolenaar 5368a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 5378a7d6542SBram Moolenaar assert_equal('bob', g:localname) 5388a7d6542SBram Moolenaar assert_equal(9876, g:imported) 5396e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 5405381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 5418a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 5426e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 5436e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 5448a7d6542SBram Moolenaar assert_false(exists('g:name')) 5458a7d6542SBram Moolenaar 5468a7d6542SBram Moolenaar unlet g:result 5478a7d6542SBram Moolenaar unlet g:localname 5488a7d6542SBram Moolenaar unlet g:imported 5496e587dcbSBram Moolenaar unlet g:imported_added 5505381c7a1SBram Moolenaar unlet g:imported_later 5518a7d6542SBram Moolenaar unlet g:imported_func 5526e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 5538a7d6542SBram Moolenaar delete('Ximport.vim') 554f2d5c240SBram Moolenaar 5555381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 5565381c7a1SBram Moolenaar vim9script 5575381c7a1SBram Moolenaar def ImportInDef() 5585381c7a1SBram Moolenaar import exported from './Xexport.vim' 5595381c7a1SBram Moolenaar g:imported = exported 5605381c7a1SBram Moolenaar exported += 7 5615381c7a1SBram Moolenaar g:imported_added = exported 5625381c7a1SBram Moolenaar enddef 5635381c7a1SBram Moolenaar ImportInDef() 5645381c7a1SBram Moolenaar END 5655381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 5665381c7a1SBram Moolenaar source Ximport2.vim 5675381c7a1SBram Moolenaar " TODO: this should be 9879 5685381c7a1SBram Moolenaar assert_equal(9876, g:imported) 5695381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 5705381c7a1SBram Moolenaar unlet g:imported 5715381c7a1SBram Moolenaar unlet g:imported_added 5725381c7a1SBram Moolenaar delete('Ximport2.vim') 5735381c7a1SBram Moolenaar 574f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 575f2d5c240SBram Moolenaar vim9script 576f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 577f2d5c240SBram Moolenaar def UseExport() 578f2d5c240SBram Moolenaar g:imported = Export.exported 579f2d5c240SBram Moolenaar enddef 580f2d5c240SBram Moolenaar UseExport() 581f2d5c240SBram Moolenaar END 582f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 583f2d5c240SBram Moolenaar source Ximport.vim 5845381c7a1SBram Moolenaar assert_equal(9883, g:imported) 585f2d5c240SBram Moolenaar 586599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 587599c89c8SBram Moolenaar vim9script 588599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 589599c89c8SBram Moolenaar def Func() 590599c89c8SBram Moolenaar let dummy = 1 591599c89c8SBram Moolenaar let imported = Export + dummy 592599c89c8SBram Moolenaar enddef 593599c89c8SBram Moolenaar END 594599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 595599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 596599c89c8SBram Moolenaar 597599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 598599c89c8SBram Moolenaar vim9script 599599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 600599c89c8SBram Moolenaar def Func() 601599c89c8SBram Moolenaar let imported = Export . exported 602599c89c8SBram Moolenaar enddef 603599c89c8SBram Moolenaar END 604599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 605599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 606599c89c8SBram Moolenaar 607599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 608599c89c8SBram Moolenaar vim9script 609599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 610599c89c8SBram Moolenaar def Func() 611599c89c8SBram Moolenaar let imported = Export. 612599c89c8SBram Moolenaar enddef 613599c89c8SBram Moolenaar END 614599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 615599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 616599c89c8SBram Moolenaar 617f2d5c240SBram Moolenaar let import_star_lines =<< trim END 618f2d5c240SBram Moolenaar vim9script 619f2d5c240SBram Moolenaar import * from './Xexport.vim' 620f2d5c240SBram Moolenaar END 621f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 622f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 623f2d5c240SBram Moolenaar 624fa29c8abSBram Moolenaar " try to import something that exists but is not exported 625fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 626fa29c8abSBram Moolenaar vim9script 627fa29c8abSBram Moolenaar import name from './Xexport.vim' 628fa29c8abSBram Moolenaar END 629fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 630fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 631fa29c8abSBram Moolenaar 6325269bd2aSBram Moolenaar " try to import something that is already defined 6335269bd2aSBram Moolenaar let import_already_defined =<< trim END 6345269bd2aSBram Moolenaar vim9script 6355269bd2aSBram Moolenaar let exported = 'something' 6365269bd2aSBram Moolenaar import exported from './Xexport.vim' 6375269bd2aSBram Moolenaar END 6385269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6395269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6405269bd2aSBram Moolenaar 6415269bd2aSBram Moolenaar " try to import something that is already defined 6425269bd2aSBram Moolenaar import_already_defined =<< trim END 6435269bd2aSBram Moolenaar vim9script 6445269bd2aSBram Moolenaar let exported = 'something' 6455269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 6465269bd2aSBram Moolenaar END 6475269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6485269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6495269bd2aSBram Moolenaar 6505269bd2aSBram Moolenaar " try to import something that is already defined 6515269bd2aSBram Moolenaar import_already_defined =<< trim END 6525269bd2aSBram Moolenaar vim9script 6535269bd2aSBram Moolenaar let exported = 'something' 6545269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 6555269bd2aSBram Moolenaar END 6565269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 6575269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 6585269bd2aSBram Moolenaar 659fa29c8abSBram Moolenaar " import a very long name, requires making a copy 660fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 661fa29c8abSBram Moolenaar vim9script 662fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 663fa29c8abSBram Moolenaar END 664fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 665fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 666fa29c8abSBram Moolenaar 667fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 668fa29c8abSBram Moolenaar vim9script 669fa29c8abSBram Moolenaar import name './Xexport.vim' 670fa29c8abSBram Moolenaar END 671fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 672fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 673fa29c8abSBram Moolenaar 674fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 675fa29c8abSBram Moolenaar vim9script 676fa29c8abSBram Moolenaar import name from Xexport.vim 677fa29c8abSBram Moolenaar END 678fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 679fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 680fa29c8abSBram Moolenaar 681fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 682fa29c8abSBram Moolenaar vim9script 683fa29c8abSBram Moolenaar import name from './XnoExport.vim' 684fa29c8abSBram Moolenaar END 685fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 686fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 687fa29c8abSBram Moolenaar 688fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 689fa29c8abSBram Moolenaar vim9script 690fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 691fa29c8abSBram Moolenaar END 6925269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 6935269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 694fa29c8abSBram Moolenaar 695f2d5c240SBram Moolenaar delete('Ximport.vim') 6965269bd2aSBram Moolenaar delete('Ximport3.vim') 6978a7d6542SBram Moolenaar delete('Xexport.vim') 6988a7d6542SBram Moolenaar 699750802b5SBram Moolenaar " Check that in a Vim9 script 'cpo' is set to the Vim default. 700750802b5SBram Moolenaar set cpo&vi 701750802b5SBram Moolenaar let cpo_before = &cpo 702750802b5SBram Moolenaar let lines =<< trim END 703750802b5SBram Moolenaar vim9script 704750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 705750802b5SBram Moolenaar END 706750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 707750802b5SBram Moolenaar source Xvim9_script 708750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 709750802b5SBram Moolenaar set cpo&vim 710750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 711750802b5SBram Moolenaar delete('Xvim9_script') 712750802b5SBram Moolenaarenddef 713750802b5SBram Moolenaar 714750802b5SBram Moolenaardef Test_vim9script_fails() 7158a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 7168a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 717750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 718f2d5c240SBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:') 719750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:') 720750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 721750802b5SBram Moolenaar 722750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 723a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 7248a7d6542SBram Moolenaarenddef 7258a7d6542SBram Moolenaar 7264c17ad94SBram Moolenaardef Test_vim9script_reload_import() 7278a7d6542SBram Moolenaar let lines =<< trim END 7288a7d6542SBram Moolenaar vim9script 7298a7d6542SBram Moolenaar const var = '' 7308a7d6542SBram Moolenaar let valone = 1234 7318a7d6542SBram Moolenaar def MyFunc(arg: string) 7328a7d6542SBram Moolenaar valone = 5678 7338a7d6542SBram Moolenaar enddef 7348a7d6542SBram Moolenaar END 7358a7d6542SBram Moolenaar let morelines =<< trim END 7368a7d6542SBram Moolenaar let valtwo = 222 7378a7d6542SBram Moolenaar export def GetValtwo(): number 7388a7d6542SBram Moolenaar return valtwo 7398a7d6542SBram Moolenaar enddef 7408a7d6542SBram Moolenaar END 74103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 7428a7d6542SBram Moolenaar source Xreload.vim 7438a7d6542SBram Moolenaar source Xreload.vim 7448a7d6542SBram Moolenaar source Xreload.vim 7458a7d6542SBram Moolenaar 7468a7d6542SBram Moolenaar let testlines =<< trim END 7478a7d6542SBram Moolenaar vim9script 7488a7d6542SBram Moolenaar def TheFunc() 7498a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 7508a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 7518a7d6542SBram Moolenaar enddef 7528a7d6542SBram Moolenaar TheFunc() 7538a7d6542SBram Moolenaar END 7548a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 7558a7d6542SBram Moolenaar source Ximport.vim 7568a7d6542SBram Moolenaar 75703afdcf1SBram Moolenaar " Test that when not using "morelines" GetValtwo() and valtwo are still 75803afdcf1SBram Moolenaar " defined, because import doesn't reload a script. 7598a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7608a7d6542SBram Moolenaar source Ximport.vim 7618a7d6542SBram Moolenaar 7628a7d6542SBram Moolenaar " cannot declare a var twice 7638a7d6542SBram Moolenaar lines =<< trim END 7648a7d6542SBram Moolenaar vim9script 7658a7d6542SBram Moolenaar let valone = 1234 7668a7d6542SBram Moolenaar let valone = 5678 7678a7d6542SBram Moolenaar END 7688a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 7698a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 7708a7d6542SBram Moolenaar 7718a7d6542SBram Moolenaar delete('Xreload.vim') 7728a7d6542SBram Moolenaar delete('Ximport.vim') 7738a7d6542SBram Moolenaarenddef 7748a7d6542SBram Moolenaar 7754c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 7764c17ad94SBram Moolenaar let first_lines =<< trim END 7774c17ad94SBram Moolenaar vim9script 7784c17ad94SBram Moolenaar def FuncYes(): string 7794c17ad94SBram Moolenaar return 'yes' 7804c17ad94SBram Moolenaar enddef 7814c17ad94SBram Moolenaar END 78203afdcf1SBram Moolenaar let withno_lines =<< trim END 7834c17ad94SBram Moolenaar def FuncNo(): string 7844c17ad94SBram Moolenaar return 'no' 7854c17ad94SBram Moolenaar enddef 7864c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 7874c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 7884c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 78903afdcf1SBram Moolenaar enddef 79003afdcf1SBram Moolenaar END 79103afdcf1SBram Moolenaar let nono_lines =<< trim END 79203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 79303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 7944c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 7954c17ad94SBram Moolenaar enddef 7964c17ad94SBram Moolenaar END 7974c17ad94SBram Moolenaar 7984c17ad94SBram Moolenaar # FuncNo() is defined 79903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 8004c17ad94SBram Moolenaar source Xreloaded.vim 8014c17ad94SBram Moolenaar g:DoCheck(true) 8024c17ad94SBram Moolenaar 8034c17ad94SBram Moolenaar # FuncNo() is not redefined 80403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 8054c17ad94SBram Moolenaar source Xreloaded.vim 80603afdcf1SBram Moolenaar g:DoCheck() 8074c17ad94SBram Moolenaar 8084c17ad94SBram Moolenaar # FuncNo() is back 80903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 8104c17ad94SBram Moolenaar source Xreloaded.vim 81103afdcf1SBram Moolenaar g:DoCheck() 8124c17ad94SBram Moolenaar 8134c17ad94SBram Moolenaar delete('Xreloaded.vim') 8144c17ad94SBram Moolenaarenddef 8154c17ad94SBram Moolenaar 81689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 81789483d40SBram Moolenaar # write the script with a script-local variable 81889483d40SBram Moolenaar let lines =<< trim END 81989483d40SBram Moolenaar vim9script 82089483d40SBram Moolenaar let var = 'string' 82189483d40SBram Moolenaar END 82289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 82389483d40SBram Moolenaar source XreloadVar.vim 82489483d40SBram Moolenaar 82589483d40SBram Moolenaar # now write the script using the same variable locally - works 82689483d40SBram Moolenaar lines =<< trim END 82789483d40SBram Moolenaar vim9script 82889483d40SBram Moolenaar def Func() 82989483d40SBram Moolenaar let var = 'string' 83089483d40SBram Moolenaar enddef 83189483d40SBram Moolenaar END 83289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 83389483d40SBram Moolenaar source XreloadVar.vim 83489483d40SBram Moolenaar 83589483d40SBram Moolenaar delete('XreloadVar.vim') 83689483d40SBram Moolenaarenddef 83789483d40SBram Moolenaar 8388a7d6542SBram Moolenaardef Test_import_absolute() 8398a7d6542SBram Moolenaar let import_lines = [ 840e6085c53SBram Moolenaar 'vim9script', 841e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 842e6085c53SBram Moolenaar 'def UseExported()', 843e6085c53SBram Moolenaar ' g:imported_abs = exported', 844e6085c53SBram Moolenaar ' exported = 8888', 845e6085c53SBram Moolenaar ' g:imported_after = exported', 846e6085c53SBram Moolenaar 'enddef', 847e6085c53SBram Moolenaar 'UseExported()', 848e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 849e6085c53SBram Moolenaar ] 8508a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 8518a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 8528a7d6542SBram Moolenaar 8538a7d6542SBram Moolenaar source Ximport_abs.vim 8548a7d6542SBram Moolenaar 8558a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 8564e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 857675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 858675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 859675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 860675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 861675f716eSBram Moolenaar 'exported = 8888.*' .. 862675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 863675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 864675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 865675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 866e6085c53SBram Moolenaar g:import_disassembled) 8678a7d6542SBram Moolenaar unlet g:imported_abs 8684e12a5dfSBram Moolenaar unlet g:import_disassembled 8698a7d6542SBram Moolenaar 8708a7d6542SBram Moolenaar delete('Ximport_abs.vim') 8718a7d6542SBram Moolenaar delete('Xexport_abs.vim') 8728a7d6542SBram Moolenaarenddef 8738a7d6542SBram Moolenaar 8748a7d6542SBram Moolenaardef Test_import_rtp() 8758a7d6542SBram Moolenaar let import_lines = [ 876e6085c53SBram Moolenaar 'vim9script', 877e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 878e6085c53SBram Moolenaar 'g:imported_rtp = exported', 879e6085c53SBram Moolenaar ] 8808a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 8818a7d6542SBram Moolenaar mkdir('import') 8828a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 8838a7d6542SBram Moolenaar 8848a7d6542SBram Moolenaar let save_rtp = &rtp 8858a7d6542SBram Moolenaar &rtp = getcwd() 8868a7d6542SBram Moolenaar source Ximport_rtp.vim 8878a7d6542SBram Moolenaar &rtp = save_rtp 8888a7d6542SBram Moolenaar 8898a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 8908a7d6542SBram Moolenaar unlet g:imported_rtp 8918a7d6542SBram Moolenaar 8928a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 89389483d40SBram Moolenaar delete('import', 'rf') 8948a7d6542SBram Moolenaarenddef 8958a7d6542SBram Moolenaar 8968a7d6542SBram Moolenaardef Test_fixed_size_list() 8978a7d6542SBram Moolenaar " will be allocated as one piece of memory, check that changes work 8988a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 8998a7d6542SBram Moolenaar l->remove(0) 9008a7d6542SBram Moolenaar l->add(5) 9018a7d6542SBram Moolenaar l->insert(99, 1) 9020f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 9038a7d6542SBram Moolenaarenddef 9048a7d6542SBram Moolenaar 905158906cfSBram Moolenaardef IfElse(what: number): string 906158906cfSBram Moolenaar let res = '' 907158906cfSBram Moolenaar if what == 1 908158906cfSBram Moolenaar res = "one" 909158906cfSBram Moolenaar elseif what == 2 910158906cfSBram Moolenaar res = "two" 911a259d8d3SBram Moolenaar else 912158906cfSBram Moolenaar res = "three" 913a259d8d3SBram Moolenaar endif 914158906cfSBram Moolenaar return res 915a259d8d3SBram Moolenaarenddef 916a259d8d3SBram Moolenaar 917158906cfSBram Moolenaardef Test_if_elseif_else() 918158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 919158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 920158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 9210f18b6d1SBram Moolenaarenddef 9220f18b6d1SBram Moolenaar 923e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 924e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 925e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 926e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 927e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 928585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 929e8c4abbbSBram Moolenaarenddef 930e8c4abbbSBram Moolenaar 9316d69bf60SBram Moolenaarlet g:bool_true = v:true 9326d69bf60SBram Moolenaarlet g:bool_false = v:false 9336d69bf60SBram Moolenaar 9346d69bf60SBram Moolenaardef Test_if_const_expr() 9356d69bf60SBram Moolenaar let res = false 9366d69bf60SBram Moolenaar if true ? true : false 9376d69bf60SBram Moolenaar res = true 9386d69bf60SBram Moolenaar endif 9396d69bf60SBram Moolenaar assert_equal(true, res) 9406d69bf60SBram Moolenaar 941585fea7bSBram Moolenaar g:glob = 2 942585fea7bSBram Moolenaar if false 943585fea7bSBram Moolenaar execute('let g:glob = 3') 944585fea7bSBram Moolenaar endif 945585fea7bSBram Moolenaar assert_equal(2, g:glob) 946585fea7bSBram Moolenaar if true 947585fea7bSBram Moolenaar execute('let g:glob = 3') 948585fea7bSBram Moolenaar endif 949585fea7bSBram Moolenaar assert_equal(3, g:glob) 950585fea7bSBram Moolenaar 9516d69bf60SBram Moolenaar res = false 9526d69bf60SBram Moolenaar if g:bool_true ? true : false 9536d69bf60SBram Moolenaar res = true 9546d69bf60SBram Moolenaar endif 9556d69bf60SBram Moolenaar assert_equal(true, res) 9566d69bf60SBram Moolenaar 9576d69bf60SBram Moolenaar res = false 9586d69bf60SBram Moolenaar if true ? g:bool_true : false 9596d69bf60SBram Moolenaar res = true 9606d69bf60SBram Moolenaar endif 9616d69bf60SBram Moolenaar assert_equal(true, res) 9626d69bf60SBram Moolenaar 9636d69bf60SBram Moolenaar res = false 9646d69bf60SBram Moolenaar if true ? true : g:bool_false 9656d69bf60SBram Moolenaar res = true 9666d69bf60SBram Moolenaar endif 9676d69bf60SBram Moolenaar assert_equal(true, res) 9686d69bf60SBram Moolenaar 9696d69bf60SBram Moolenaar res = false 9706d69bf60SBram Moolenaar if true ? false : true 9716d69bf60SBram Moolenaar res = true 9726d69bf60SBram Moolenaar endif 9736d69bf60SBram Moolenaar assert_equal(false, res) 9746d69bf60SBram Moolenaar 9756d69bf60SBram Moolenaar res = false 9766d69bf60SBram Moolenaar if false ? false : true 9776d69bf60SBram Moolenaar res = true 9786d69bf60SBram Moolenaar endif 9796d69bf60SBram Moolenaar assert_equal(true, res) 9806d69bf60SBram Moolenaar 9816d69bf60SBram Moolenaar res = false 9826d69bf60SBram Moolenaar if false ? true : false 9836d69bf60SBram Moolenaar res = true 9846d69bf60SBram Moolenaar endif 9856d69bf60SBram Moolenaar assert_equal(false, res) 9866d69bf60SBram Moolenaar 9876d69bf60SBram Moolenaar res = false 988e8c4abbbSBram Moolenaar if has('xyz') ? true : false 989e8c4abbbSBram Moolenaar res = true 990e8c4abbbSBram Moolenaar endif 991e8c4abbbSBram Moolenaar assert_equal(false, res) 992e8c4abbbSBram Moolenaar 993e8c4abbbSBram Moolenaar res = false 9946d69bf60SBram Moolenaar if true && true 9956d69bf60SBram Moolenaar res = true 9966d69bf60SBram Moolenaar endif 9976d69bf60SBram Moolenaar assert_equal(true, res) 9986d69bf60SBram Moolenaar 9996d69bf60SBram Moolenaar res = false 10006d69bf60SBram Moolenaar if true && false 10016d69bf60SBram Moolenaar res = true 10026d69bf60SBram Moolenaar endif 10036d69bf60SBram Moolenaar assert_equal(false, res) 10046d69bf60SBram Moolenaar 10056d69bf60SBram Moolenaar res = false 10066d69bf60SBram Moolenaar if g:bool_true && false 10076d69bf60SBram Moolenaar res = true 10086d69bf60SBram Moolenaar endif 10096d69bf60SBram Moolenaar assert_equal(false, res) 10106d69bf60SBram Moolenaar 10116d69bf60SBram Moolenaar res = false 10126d69bf60SBram Moolenaar if true && g:bool_false 10136d69bf60SBram Moolenaar res = true 10146d69bf60SBram Moolenaar endif 10156d69bf60SBram Moolenaar assert_equal(false, res) 10166d69bf60SBram Moolenaar 10176d69bf60SBram Moolenaar res = false 10186d69bf60SBram Moolenaar if false && false 10196d69bf60SBram Moolenaar res = true 10206d69bf60SBram Moolenaar endif 10216d69bf60SBram Moolenaar assert_equal(false, res) 10226d69bf60SBram Moolenaar 10236d69bf60SBram Moolenaar res = false 10246d69bf60SBram Moolenaar if true || false 10256d69bf60SBram Moolenaar res = true 10266d69bf60SBram Moolenaar endif 10276d69bf60SBram Moolenaar assert_equal(true, res) 10286d69bf60SBram Moolenaar 10296d69bf60SBram Moolenaar res = false 10306d69bf60SBram Moolenaar if g:bool_true || false 10316d69bf60SBram Moolenaar res = true 10326d69bf60SBram Moolenaar endif 10336d69bf60SBram Moolenaar assert_equal(true, res) 10346d69bf60SBram Moolenaar 10356d69bf60SBram Moolenaar res = false 10366d69bf60SBram Moolenaar if true || g:bool_false 10376d69bf60SBram Moolenaar res = true 10386d69bf60SBram Moolenaar endif 10396d69bf60SBram Moolenaar assert_equal(true, res) 10406d69bf60SBram Moolenaar 10416d69bf60SBram Moolenaar res = false 10426d69bf60SBram Moolenaar if false || false 10436d69bf60SBram Moolenaar res = true 10446d69bf60SBram Moolenaar endif 10456d69bf60SBram Moolenaar assert_equal(false, res) 104680c34ca3SBram Moolenaarenddef 10476d69bf60SBram Moolenaar 104880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 104980c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 105080c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1051e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1052e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 10536d69bf60SBram Moolenaarenddef 10546d69bf60SBram Moolenaar 1055ad39c094SBram Moolenaardef Test_execute_cmd() 1056ad39c094SBram Moolenaar new 1057ad39c094SBram Moolenaar setline(1, 'default') 1058ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1059ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1060a72cfb80SBram Moolenaar 1061a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1062a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1063a72cfb80SBram Moolenaar 1064ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1065ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1066a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1067ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1068a72cfb80SBram Moolenaar 1069ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1070ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1071a72cfb80SBram Moolenaar 1072ad39c094SBram Moolenaar let cmd_first = 'call ' 1073ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1074ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1075ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1076ad39c094SBram Moolenaar bwipe! 1077585fea7bSBram Moolenaar 1078585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1079a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1080ad39c094SBram Moolenaarenddef 1081ad39c094SBram Moolenaar 1082ad39c094SBram Moolenaardef Test_echo_cmd() 1083a72cfb80SBram Moolenaar echo 'some' # comment 1084585fea7bSBram Moolenaar echon 'thing' 1085ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1086ad39c094SBram Moolenaar 1087a72cfb80SBram Moolenaar echo "some" # comment 1088a72cfb80SBram Moolenaar echon "thing" 1089a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1090a72cfb80SBram Moolenaar 1091ad39c094SBram Moolenaar let str1 = 'some' 1092ad39c094SBram Moolenaar let str2 = 'more' 1093ad39c094SBram Moolenaar echo str1 str2 1094ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1095a72cfb80SBram Moolenaar 1096a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1097ad39c094SBram Moolenaarenddef 1098ad39c094SBram Moolenaar 1099f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1100f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1101f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1102f93c7feaSBram Moolenaar echo 'clear' 1103f93c7feaSBram Moolenaar 1messages 1104f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1105f93c7feaSBram Moolenaar 1106f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1107f93c7feaSBram Moolenaarenddef 1108f93c7feaSBram Moolenaar 1109f93c7feaSBram Moolenaardef Test_echoerr_cmd() 111040ee466cSBram Moolenaar try 111140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 111240ee466cSBram Moolenaar catch 111340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 111440ee466cSBram Moolenaar endtry 1115f93c7feaSBram Moolenaarenddef 1116f93c7feaSBram Moolenaar 111741fe0617SBram Moolenaardef Test_for_outside_of_function() 111841fe0617SBram Moolenaar let lines =<< trim END 111941fe0617SBram Moolenaar vim9script 112041fe0617SBram Moolenaar new 112141fe0617SBram Moolenaar for var in range(0, 3) 112241fe0617SBram Moolenaar append(line('$'), var) 112341fe0617SBram Moolenaar endfor 112441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 112541fe0617SBram Moolenaar bwipe! 112641fe0617SBram Moolenaar END 112741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 112841fe0617SBram Moolenaar source Xvim9for.vim 112941fe0617SBram Moolenaar delete('Xvim9for.vim') 113041fe0617SBram Moolenaarenddef 11318a7d6542SBram Moolenaar 1132e8c4abbbSBram Moolenaardef Test_for_loop() 1133e8c4abbbSBram Moolenaar let result = '' 1134e8c4abbbSBram Moolenaar for cnt in range(7) 1135e8c4abbbSBram Moolenaar if cnt == 4 1136e8c4abbbSBram Moolenaar break 1137e8c4abbbSBram Moolenaar endif 1138e8c4abbbSBram Moolenaar if cnt == 2 1139e8c4abbbSBram Moolenaar continue 1140e8c4abbbSBram Moolenaar endif 1141e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1142e8c4abbbSBram Moolenaar endfor 1143e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 1144e8c4abbbSBram Moolenaarenddef 1145e8c4abbbSBram Moolenaar 1146e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1147675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1148675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1149675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 11506e949784SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:') 1151675f716eSBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1024:') 1152675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1153675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1154675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1155e8c4abbbSBram Moolenaarenddef 1156e8c4abbbSBram Moolenaar 1157d0df1aacSBram Moolenaardef Test_while_loop() 1158d0df1aacSBram Moolenaar let result = '' 1159d0df1aacSBram Moolenaar let cnt = 0 1160d0df1aacSBram Moolenaar while cnt < 555 1161d0df1aacSBram Moolenaar if cnt == 3 1162d0df1aacSBram Moolenaar break 1163d0df1aacSBram Moolenaar endif 1164d0df1aacSBram Moolenaar cnt += 1 1165d0df1aacSBram Moolenaar if cnt == 2 1166d0df1aacSBram Moolenaar continue 1167d0df1aacSBram Moolenaar endif 1168d0df1aacSBram Moolenaar result ..= cnt .. '_' 1169d0df1aacSBram Moolenaar endwhile 1170d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1171d0df1aacSBram Moolenaarenddef 1172d0df1aacSBram Moolenaar 1173e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1174675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1175675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1176675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1177675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1178675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1179675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1180675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1181bd5da371SBram Moolenaarenddef 1182bd5da371SBram Moolenaar 11839645e2d9SBram Moolenaardef Test_interrupt_loop() 118497acfc78SBram Moolenaar let caught = false 11859645e2d9SBram Moolenaar let x = 0 118697acfc78SBram Moolenaar try 11879645e2d9SBram Moolenaar while 1 11889645e2d9SBram Moolenaar x += 1 11899645e2d9SBram Moolenaar if x == 100 11909645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 11919645e2d9SBram Moolenaar endif 11929645e2d9SBram Moolenaar endwhile 119397acfc78SBram Moolenaar catch 119497acfc78SBram Moolenaar caught = true 119597acfc78SBram Moolenaar assert_equal(100, x) 119697acfc78SBram Moolenaar endtry 119797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 11989645e2d9SBram Moolenaarenddef 119920431c9dSBram Moolenaar 12004fdae999SBram Moolenaardef Test_automatic_line_continuation() 12014fdae999SBram Moolenaar let mylist = [ 12024fdae999SBram Moolenaar 'one', 12034fdae999SBram Moolenaar 'two', 12044fdae999SBram Moolenaar 'three', 12054fdae999SBram Moolenaar ] " comment 12064fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 12074fdae999SBram Moolenaar 12084fdae999SBram Moolenaar let mydict = { 12094fdae999SBram Moolenaar 'one': 1, 12104fdae999SBram Moolenaar 'two': 2, 12114fdae999SBram Moolenaar 'three': 12124fdae999SBram Moolenaar 3, 12134fdae999SBram Moolenaar } " comment 12144fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 12154fdae999SBram Moolenaar mydict = #{ 12162c330432SBram Moolenaar one: 1, # comment 12172c330432SBram Moolenaar two: # comment 12182c330432SBram Moolenaar 2, # comment 12192c330432SBram Moolenaar three: 3 # comment 12202c330432SBram Moolenaar } 12212c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 12222c330432SBram Moolenaar mydict = #{ 12232c330432SBram Moolenaar one: 1, 12244fdae999SBram Moolenaar two: 12254fdae999SBram Moolenaar 2, 12262c330432SBram Moolenaar three: 3 12274fdae999SBram Moolenaar } 12284fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1229e6085c53SBram Moolenaar 1230e6085c53SBram Moolenaar assert_equal( 1231e6085c53SBram Moolenaar ['one', 'two', 'three'], 1232e6085c53SBram Moolenaar split('one two three') 1233e6085c53SBram Moolenaar ) 12344fdae999SBram Moolenaarenddef 12354fdae999SBram Moolenaar 12367a092245SBram Moolenaardef Test_vim9_comment() 12377a092245SBram Moolenaar CheckScriptSuccess([ 12387a092245SBram Moolenaar 'vim9script', 12397a092245SBram Moolenaar '# something', 12407a092245SBram Moolenaar ]) 12417a092245SBram Moolenaar CheckScriptFailure([ 12427a092245SBram Moolenaar 'vim9script', 12437a092245SBram Moolenaar ':# something', 12447a092245SBram Moolenaar ], 'E488:') 12457a092245SBram Moolenaar CheckScriptFailure([ 12467a092245SBram Moolenaar '# something', 12477a092245SBram Moolenaar ], 'E488:') 12487a092245SBram Moolenaar CheckScriptFailure([ 12497a092245SBram Moolenaar ':# something', 12507a092245SBram Moolenaar ], 'E488:') 12517a092245SBram Moolenaar 12524a8d9f2eSBram Moolenaar { # block start 12534a8d9f2eSBram Moolenaar } # block end 12544a8d9f2eSBram Moolenaar CheckDefFailure([ 12554a8d9f2eSBram Moolenaar '{# comment', 12564a8d9f2eSBram Moolenaar ], 'E488:') 12574a8d9f2eSBram Moolenaar CheckDefFailure([ 12584a8d9f2eSBram Moolenaar '{', 12594a8d9f2eSBram Moolenaar '}# comment', 12604a8d9f2eSBram Moolenaar ], 'E488:') 12614a8d9f2eSBram Moolenaar 12624a8d9f2eSBram Moolenaar echo "yes" # comment 12634a8d9f2eSBram Moolenaar CheckDefFailure([ 12644a8d9f2eSBram Moolenaar 'echo "yes"# comment', 12654a8d9f2eSBram Moolenaar ], 'E488:') 12667a092245SBram Moolenaar CheckScriptSuccess([ 12677a092245SBram Moolenaar 'vim9script', 12687a092245SBram Moolenaar 'echo "yes" # something', 12697a092245SBram Moolenaar ]) 12707a092245SBram Moolenaar CheckScriptFailure([ 12717a092245SBram Moolenaar 'vim9script', 12727a092245SBram Moolenaar 'echo "yes"# something', 12737a092245SBram Moolenaar ], 'E121:') 12747a092245SBram Moolenaar CheckScriptFailure([ 12757a092245SBram Moolenaar 'vim9script', 12767a092245SBram Moolenaar 'echo# something', 12777a092245SBram Moolenaar ], 'E121:') 12787a092245SBram Moolenaar CheckScriptFailure([ 12797a092245SBram Moolenaar 'echo "yes" # something', 12807a092245SBram Moolenaar ], 'E121:') 12817a092245SBram Moolenaar 12824a8d9f2eSBram Moolenaar exe "echo" # comment 12834a8d9f2eSBram Moolenaar CheckDefFailure([ 12844a8d9f2eSBram Moolenaar 'exe "echo"# comment', 12854a8d9f2eSBram Moolenaar ], 'E488:') 12864a8d9f2eSBram Moolenaar CheckScriptSuccess([ 12874a8d9f2eSBram Moolenaar 'vim9script', 12884a8d9f2eSBram Moolenaar 'exe "echo" # something', 12894a8d9f2eSBram Moolenaar ]) 12904a8d9f2eSBram Moolenaar CheckScriptFailure([ 12914a8d9f2eSBram Moolenaar 'vim9script', 12924a8d9f2eSBram Moolenaar 'exe "echo"# something', 12934a8d9f2eSBram Moolenaar ], 'E121:') 12944a8d9f2eSBram Moolenaar CheckDefFailure([ 12954a8d9f2eSBram Moolenaar 'exe # comment', 12964a8d9f2eSBram Moolenaar ], 'E1015:') 12974a8d9f2eSBram Moolenaar CheckScriptFailure([ 12984a8d9f2eSBram Moolenaar 'vim9script', 12994a8d9f2eSBram Moolenaar 'exe# something', 13004a8d9f2eSBram Moolenaar ], 'E121:') 13014a8d9f2eSBram Moolenaar CheckScriptFailure([ 13024a8d9f2eSBram Moolenaar 'exe "echo" # something', 13034a8d9f2eSBram Moolenaar ], 'E121:') 13044a8d9f2eSBram Moolenaar 13057a092245SBram Moolenaar CheckDefFailure([ 13067a092245SBram Moolenaar 'try# comment', 13077a092245SBram Moolenaar ' echo "yes"', 13087a092245SBram Moolenaar 'catch', 13097a092245SBram Moolenaar 'endtry', 13107a092245SBram Moolenaar ], 'E488:') 13112c5ed4e3SBram Moolenaar CheckScriptFailure([ 13122c5ed4e3SBram Moolenaar 'vim9script', 13132c5ed4e3SBram Moolenaar 'try# comment', 13142c5ed4e3SBram Moolenaar 'echo "yes"', 13152c5ed4e3SBram Moolenaar ], 'E488:') 13167a092245SBram Moolenaar CheckDefFailure([ 13177a092245SBram Moolenaar 'try', 1318a72cfb80SBram Moolenaar ' throw#comment', 1319a72cfb80SBram Moolenaar 'catch', 1320a72cfb80SBram Moolenaar 'endtry', 1321a72cfb80SBram Moolenaar ], 'E1015:') 1322a72cfb80SBram Moolenaar CheckDefFailure([ 1323a72cfb80SBram Moolenaar 'try', 1324a72cfb80SBram Moolenaar ' throw "yes"#comment', 1325a72cfb80SBram Moolenaar 'catch', 1326a72cfb80SBram Moolenaar 'endtry', 1327a72cfb80SBram Moolenaar ], 'E488:') 1328a72cfb80SBram Moolenaar CheckDefFailure([ 1329a72cfb80SBram Moolenaar 'try', 13307a092245SBram Moolenaar ' echo "yes"', 13317a092245SBram Moolenaar 'catch# comment', 13327a092245SBram Moolenaar 'endtry', 13337a092245SBram Moolenaar ], 'E488:') 13342c5ed4e3SBram Moolenaar CheckScriptFailure([ 13352c5ed4e3SBram Moolenaar 'vim9script', 13362c5ed4e3SBram Moolenaar 'try', 13372c5ed4e3SBram Moolenaar ' echo "yes"', 13382c5ed4e3SBram Moolenaar 'catch# comment', 13392c5ed4e3SBram Moolenaar 'endtry', 13402c5ed4e3SBram Moolenaar ], 'E654:') 13412c5ed4e3SBram Moolenaar CheckDefFailure([ 13422c5ed4e3SBram Moolenaar 'try', 13432c5ed4e3SBram Moolenaar ' echo "yes"', 13442c5ed4e3SBram Moolenaar 'catch /pat/# comment', 13452c5ed4e3SBram Moolenaar 'endtry', 13462c5ed4e3SBram Moolenaar ], 'E488:') 13477a092245SBram Moolenaar CheckDefFailure([ 13487a092245SBram Moolenaar 'try', 13497a092245SBram Moolenaar 'echo "yes"', 13507a092245SBram Moolenaar 'catch', 13517a092245SBram Moolenaar 'endtry# comment', 13527a092245SBram Moolenaar ], 'E488:') 13532c5ed4e3SBram Moolenaar CheckScriptFailure([ 13542c5ed4e3SBram Moolenaar 'vim9script', 13552c5ed4e3SBram Moolenaar 'try', 13562c5ed4e3SBram Moolenaar ' echo "yes"', 13572c5ed4e3SBram Moolenaar 'catch', 13582c5ed4e3SBram Moolenaar 'endtry# comment', 13592c5ed4e3SBram Moolenaar ], 'E600:') 13602c5ed4e3SBram Moolenaar 13612c5ed4e3SBram Moolenaar CheckScriptSuccess([ 13622c5ed4e3SBram Moolenaar 'vim9script', 13632c5ed4e3SBram Moolenaar 'hi # comment', 13642c5ed4e3SBram Moolenaar ]) 13652c5ed4e3SBram Moolenaar CheckScriptFailure([ 13662c5ed4e3SBram Moolenaar 'vim9script', 13672c5ed4e3SBram Moolenaar 'hi# comment', 13682c5ed4e3SBram Moolenaar ], 'E416:') 13691966c248SBram Moolenaar CheckScriptSuccess([ 13701966c248SBram Moolenaar 'vim9script', 13711966c248SBram Moolenaar 'hi Search # comment', 13721966c248SBram Moolenaar ]) 13731966c248SBram Moolenaar CheckScriptFailure([ 13741966c248SBram Moolenaar 'vim9script', 13751966c248SBram Moolenaar 'hi Search# comment', 13761966c248SBram Moolenaar ], 'E416:') 13771966c248SBram Moolenaar CheckScriptSuccess([ 13781966c248SBram Moolenaar 'vim9script', 13791966c248SBram Moolenaar 'hi link This Search # comment', 13801966c248SBram Moolenaar ]) 13811966c248SBram Moolenaar CheckScriptFailure([ 13821966c248SBram Moolenaar 'vim9script', 13831966c248SBram Moolenaar 'hi link This That# comment', 13841966c248SBram Moolenaar ], 'E413:') 13851966c248SBram Moolenaar CheckScriptSuccess([ 13861966c248SBram Moolenaar 'vim9script', 13871966c248SBram Moolenaar 'hi clear This # comment', 13881966c248SBram Moolenaar 'hi clear # comment', 13891966c248SBram Moolenaar ]) 13901966c248SBram Moolenaar " not tested, because it doesn't give an error but a warning: 13911966c248SBram Moolenaar " hi clear This# comment', 13921966c248SBram Moolenaar CheckScriptFailure([ 13931966c248SBram Moolenaar 'vim9script', 13941966c248SBram Moolenaar 'hi clear# comment', 13951966c248SBram Moolenaar ], 'E416:') 13961966c248SBram Moolenaar 13971966c248SBram Moolenaar CheckScriptSuccess([ 13981966c248SBram Moolenaar 'vim9script', 13991966c248SBram Moolenaar 'hi Group term=bold', 14001966c248SBram Moolenaar 'match Group /todo/ # comment', 14011966c248SBram Moolenaar ]) 14021966c248SBram Moolenaar CheckScriptFailure([ 14031966c248SBram Moolenaar 'vim9script', 14041966c248SBram Moolenaar 'hi Group term=bold', 14051966c248SBram Moolenaar 'match Group /todo/# comment', 14061966c248SBram Moolenaar ], 'E488:') 14071966c248SBram Moolenaar CheckScriptSuccess([ 14081966c248SBram Moolenaar 'vim9script', 14091966c248SBram Moolenaar 'match # comment', 14101966c248SBram Moolenaar ]) 14111966c248SBram Moolenaar CheckScriptFailure([ 14121966c248SBram Moolenaar 'vim9script', 14131966c248SBram Moolenaar 'match# comment', 14141966c248SBram Moolenaar ], 'E475:') 14151966c248SBram Moolenaar CheckScriptSuccess([ 14161966c248SBram Moolenaar 'vim9script', 14171966c248SBram Moolenaar 'match none # comment', 14181966c248SBram Moolenaar ]) 14191966c248SBram Moolenaar CheckScriptFailure([ 14201966c248SBram Moolenaar 'vim9script', 14211966c248SBram Moolenaar 'match none# comment', 14221966c248SBram Moolenaar ], 'E475:') 14231966c248SBram Moolenaar 14241966c248SBram Moolenaar CheckScriptSuccess([ 14251966c248SBram Moolenaar 'vim9script', 14261966c248SBram Moolenaar 'menutrans clear # comment', 14271966c248SBram Moolenaar ]) 14281966c248SBram Moolenaar CheckScriptFailure([ 14291966c248SBram Moolenaar 'vim9script', 14301966c248SBram Moolenaar 'menutrans clear# comment text', 14311966c248SBram Moolenaar ], 'E474:') 14321966c248SBram Moolenaar 14331966c248SBram Moolenaar CheckScriptSuccess([ 14341966c248SBram Moolenaar 'vim9script', 14351966c248SBram Moolenaar 'syntax clear # comment', 14361966c248SBram Moolenaar ]) 14371966c248SBram Moolenaar CheckScriptFailure([ 14381966c248SBram Moolenaar 'vim9script', 14391966c248SBram Moolenaar 'syntax clear# comment text', 14401966c248SBram Moolenaar ], 'E28:') 14411966c248SBram Moolenaar CheckScriptSuccess([ 14421966c248SBram Moolenaar 'vim9script', 14431966c248SBram Moolenaar 'syntax keyword Word some', 14441966c248SBram Moolenaar 'syntax clear Word # comment', 14451966c248SBram Moolenaar ]) 14461966c248SBram Moolenaar CheckScriptFailure([ 14471966c248SBram Moolenaar 'vim9script', 14481966c248SBram Moolenaar 'syntax keyword Word some', 14491966c248SBram Moolenaar 'syntax clear Word# comment text', 14501966c248SBram Moolenaar ], 'E28:') 14511966c248SBram Moolenaar 14521966c248SBram Moolenaar CheckScriptSuccess([ 14531966c248SBram Moolenaar 'vim9script', 14541966c248SBram Moolenaar 'syntax list # comment', 14551966c248SBram Moolenaar ]) 14561966c248SBram Moolenaar CheckScriptFailure([ 14571966c248SBram Moolenaar 'vim9script', 14581966c248SBram Moolenaar 'syntax list# comment text', 14591966c248SBram Moolenaar ], 'E28:') 14601966c248SBram Moolenaar 14611966c248SBram Moolenaar CheckScriptSuccess([ 14621966c248SBram Moolenaar 'vim9script', 14631966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 14641966c248SBram Moolenaar ]) 14651966c248SBram Moolenaar CheckScriptFailure([ 14661966c248SBram Moolenaar 'vim9script', 14671966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 14681966c248SBram Moolenaar ], 'E475:') 14691966c248SBram Moolenaar 14701966c248SBram Moolenaar CheckScriptSuccess([ 14711966c248SBram Moolenaar 'vim9script', 14721966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 14731966c248SBram Moolenaar ]) 14741966c248SBram Moolenaar CheckScriptFailure([ 14751966c248SBram Moolenaar 'vim9script', 14761966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 14771966c248SBram Moolenaar ], 'E789:') 14781966c248SBram Moolenaar 14791966c248SBram Moolenaar CheckScriptSuccess([ 14801966c248SBram Moolenaar 'vim9script', 14811966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 14821966c248SBram Moolenaar ]) 14831966c248SBram Moolenaar CheckScriptFailure([ 14841966c248SBram Moolenaar 'vim9script', 14851966c248SBram Moolenaar 'syntax match Word /pat/# comment', 14861966c248SBram Moolenaar ], 'E402:') 14871966c248SBram Moolenaar 14881966c248SBram Moolenaar CheckScriptSuccess([ 14891966c248SBram Moolenaar 'vim9script', 14901966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 14911966c248SBram Moolenaar ]) 14921966c248SBram Moolenaar CheckScriptFailure([ 14931966c248SBram Moolenaar 'vim9script', 14941966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 14951966c248SBram Moolenaar ], 'E475:') 14961966c248SBram Moolenaar CheckScriptFailure([ 14971966c248SBram Moolenaar 'vim9script', 14981966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 14991966c248SBram Moolenaar ], 'E406:') 15001966c248SBram Moolenaar CheckScriptFailure([ 15011966c248SBram Moolenaar 'vim9script', 15021966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 15031966c248SBram Moolenaar ], 'E475:') 15041966c248SBram Moolenaar 15051966c248SBram Moolenaar CheckScriptSuccess([ 15061966c248SBram Moolenaar 'vim9script', 15071966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 15081966c248SBram Moolenaar ]) 15091966c248SBram Moolenaar CheckScriptFailure([ 15101966c248SBram Moolenaar 'vim9script', 15111966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 15121966c248SBram Moolenaar ], 'E475:') 15131966c248SBram Moolenaar 15141966c248SBram Moolenaar CheckScriptSuccess([ 15151966c248SBram Moolenaar 'vim9script', 15161966c248SBram Moolenaar 'syntax sync # comment', 15171966c248SBram Moolenaar ]) 15181966c248SBram Moolenaar CheckScriptFailure([ 15191966c248SBram Moolenaar 'vim9script', 15201966c248SBram Moolenaar 'syntax sync# comment', 15211966c248SBram Moolenaar ], 'E404:') 15221966c248SBram Moolenaar CheckScriptSuccess([ 15231966c248SBram Moolenaar 'vim9script', 15241966c248SBram Moolenaar 'syntax sync ccomment # comment', 15251966c248SBram Moolenaar ]) 15261966c248SBram Moolenaar CheckScriptFailure([ 15271966c248SBram Moolenaar 'vim9script', 15281966c248SBram Moolenaar 'syntax sync ccomment# comment', 15291966c248SBram Moolenaar ], 'E404:') 15301966c248SBram Moolenaar 15311966c248SBram Moolenaar CheckScriptSuccess([ 15321966c248SBram Moolenaar 'vim9script', 15331966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 15341966c248SBram Moolenaar ]) 15351966c248SBram Moolenaar CheckScriptFailure([ 15361966c248SBram Moolenaar 'vim9script', 15371966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 15381966c248SBram Moolenaar ], 'E475:') 1539a72cfb80SBram Moolenaar 1540a72cfb80SBram Moolenaar CheckScriptSuccess([ 1541a72cfb80SBram Moolenaar 'vim9script', 1542a72cfb80SBram Moolenaar 'command Echo echo # comment', 1543a72cfb80SBram Moolenaar 'command Echo # comment', 1544a72cfb80SBram Moolenaar ]) 1545a72cfb80SBram Moolenaar CheckScriptFailure([ 1546a72cfb80SBram Moolenaar 'vim9script', 1547a72cfb80SBram Moolenaar 'command Echo echo# comment', 1548a72cfb80SBram Moolenaar 'Echo', 1549a72cfb80SBram Moolenaar ], 'E121:') 1550a72cfb80SBram Moolenaar CheckScriptFailure([ 1551a72cfb80SBram Moolenaar 'vim9script', 1552a72cfb80SBram Moolenaar 'command Echo# comment', 1553a72cfb80SBram Moolenaar ], 'E182:') 1554a72cfb80SBram Moolenaar CheckScriptFailure([ 1555a72cfb80SBram Moolenaar 'vim9script', 1556a72cfb80SBram Moolenaar 'command Echo echo', 1557a72cfb80SBram Moolenaar 'command Echo# comment', 1558a72cfb80SBram Moolenaar ], 'E182:') 1559a72cfb80SBram Moolenaar 1560a72cfb80SBram Moolenaar CheckScriptSuccess([ 1561a72cfb80SBram Moolenaar 'vim9script', 1562a72cfb80SBram Moolenaar 'function # comment', 1563a72cfb80SBram Moolenaar ]) 1564a72cfb80SBram Moolenaar CheckScriptFailure([ 1565a72cfb80SBram Moolenaar 'vim9script', 1566a72cfb80SBram Moolenaar 'function# comment', 1567a72cfb80SBram Moolenaar ], 'E129:') 1568a72cfb80SBram Moolenaar CheckScriptSuccess([ 1569a72cfb80SBram Moolenaar 'vim9script', 1570a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 1571a72cfb80SBram Moolenaar ]) 1572a72cfb80SBram Moolenaar CheckScriptFailure([ 1573a72cfb80SBram Moolenaar 'vim9script', 1574a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 1575a72cfb80SBram Moolenaar ], 'E488:') 1576a72cfb80SBram Moolenaar 1577a72cfb80SBram Moolenaar CheckScriptSuccess([ 1578a72cfb80SBram Moolenaar 'vim9script', 15794c17ad94SBram Moolenaar 'func g:DeleteMeA()', 1580a72cfb80SBram Moolenaar 'endfunc', 15814c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 1582a72cfb80SBram Moolenaar ]) 1583a72cfb80SBram Moolenaar CheckScriptFailure([ 1584a72cfb80SBram Moolenaar 'vim9script', 15854c17ad94SBram Moolenaar 'func g:DeleteMeB()', 1586a72cfb80SBram Moolenaar 'endfunc', 15874c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 1588a72cfb80SBram Moolenaar ], 'E488:') 1589a72cfb80SBram Moolenaar 1590a72cfb80SBram Moolenaar CheckScriptSuccess([ 1591a72cfb80SBram Moolenaar 'vim9script', 1592a72cfb80SBram Moolenaar 'call execute("ls") # comment', 1593a72cfb80SBram Moolenaar ]) 1594a72cfb80SBram Moolenaar CheckScriptFailure([ 1595a72cfb80SBram Moolenaar 'vim9script', 1596a72cfb80SBram Moolenaar 'call execute("ls")# comment', 1597a72cfb80SBram Moolenaar ], 'E488:') 15982c5ed4e3SBram Moolenaarenddef 15992c5ed4e3SBram Moolenaar 16002c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 16012c5ed4e3SBram Moolenaar CheckCanRunGui 16022c5ed4e3SBram Moolenaar 16032c5ed4e3SBram Moolenaar CheckScriptFailure([ 16042c5ed4e3SBram Moolenaar 'vim9script', 16052c5ed4e3SBram Moolenaar 'gui#comment' 16062c5ed4e3SBram Moolenaar ], 'E499:') 16072c5ed4e3SBram Moolenaar CheckScriptFailure([ 16082c5ed4e3SBram Moolenaar 'vim9script', 16092c5ed4e3SBram Moolenaar 'gui -f#comment' 16102c5ed4e3SBram Moolenaar ], 'E499:') 16117a092245SBram Moolenaarenddef 16127a092245SBram Moolenaar 1613a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 1614a26b9700SBram Moolenaar au TabEnter *.vim let g:entered = 1 1615a26b9700SBram Moolenaar au TabEnter *.x let g:entered = 2 1616a26b9700SBram Moolenaar 1617a26b9700SBram Moolenaar edit test.vim 1618a26b9700SBram Moolenaar doautocmd TabEnter #comment 1619a26b9700SBram Moolenaar assert_equal(1, g:entered) 1620a26b9700SBram Moolenaar 1621a26b9700SBram Moolenaar doautocmd TabEnter f.x 1622a26b9700SBram Moolenaar assert_equal(2, g:entered) 1623a26b9700SBram Moolenaar 1624a26b9700SBram Moolenaar g:entered = 0 1625a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 1626a26b9700SBram Moolenaar assert_equal(2, g:entered) 1627a26b9700SBram Moolenaar 1628a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 1629a26b9700SBram Moolenaar 1630a26b9700SBram Moolenaar au! TabEnter 1631a26b9700SBram Moolenaar unlet g:entered 1632d72c1bf0SBram Moolenaar 1633d72c1bf0SBram Moolenaar CheckScriptSuccess([ 1634d72c1bf0SBram Moolenaar 'vim9script', 1635d72c1bf0SBram Moolenaar 'let g:var = 123', 1636d72c1bf0SBram Moolenaar 'let w:var = 777', 1637d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 1638d72c1bf0SBram Moolenaar ]) 1639d72c1bf0SBram Moolenaar 1640d72c1bf0SBram Moolenaar CheckScriptFailure([ 1641d72c1bf0SBram Moolenaar 'vim9script', 1642d72c1bf0SBram Moolenaar 'let g:var = 123', 164332e35117SBram Moolenaar 'unlet g:var# comment1', 1644d72c1bf0SBram Moolenaar ], 'E108:') 1645d72c1bf0SBram Moolenaar 1646d72c1bf0SBram Moolenaar CheckScriptFailure([ 1647d72c1bf0SBram Moolenaar 'let g:var = 123', 1648d72c1bf0SBram Moolenaar 'unlet g:var # something', 1649d72c1bf0SBram Moolenaar ], 'E488:') 1650faac4104SBram Moolenaar 1651faac4104SBram Moolenaar CheckScriptSuccess([ 1652faac4104SBram Moolenaar 'vim9script', 165332e35117SBram Moolenaar 'if 1 # comment2', 1654faac4104SBram Moolenaar ' echo "yes"', 1655faac4104SBram Moolenaar 'elseif 2 #comment', 1656faac4104SBram Moolenaar ' echo "no"', 1657faac4104SBram Moolenaar 'endif', 1658faac4104SBram Moolenaar ]) 1659faac4104SBram Moolenaar 1660faac4104SBram Moolenaar CheckScriptFailure([ 1661faac4104SBram Moolenaar 'vim9script', 166232e35117SBram Moolenaar 'if 1# comment3', 1663faac4104SBram Moolenaar ' echo "yes"', 1664faac4104SBram Moolenaar 'endif', 1665faac4104SBram Moolenaar ], 'E15:') 1666faac4104SBram Moolenaar 1667faac4104SBram Moolenaar CheckScriptFailure([ 1668faac4104SBram Moolenaar 'vim9script', 166932e35117SBram Moolenaar 'if 0 # comment4', 1670faac4104SBram Moolenaar ' echo "yes"', 1671faac4104SBram Moolenaar 'elseif 2#comment', 1672faac4104SBram Moolenaar ' echo "no"', 1673faac4104SBram Moolenaar 'endif', 1674faac4104SBram Moolenaar ], 'E15:') 1675faac4104SBram Moolenaar 1676faac4104SBram Moolenaar CheckScriptSuccess([ 1677faac4104SBram Moolenaar 'vim9script', 167832e35117SBram Moolenaar 'let v = 1 # comment5', 1679faac4104SBram Moolenaar ]) 1680faac4104SBram Moolenaar 1681faac4104SBram Moolenaar CheckScriptFailure([ 1682faac4104SBram Moolenaar 'vim9script', 168332e35117SBram Moolenaar 'let v = 1# comment6', 168432e35117SBram Moolenaar ], 'E15:') 1685faac4104SBram Moolenaar 1686faac4104SBram Moolenaar CheckScriptFailure([ 1687faac4104SBram Moolenaar 'vim9script', 168832e35117SBram Moolenaar 'let v:version', 168932e35117SBram Moolenaar ], 'E1091:') 1690faac4104SBram Moolenaar 1691faac4104SBram Moolenaar CheckScriptSuccess([ 1692faac4104SBram Moolenaar 'vim9script', 1693faac4104SBram Moolenaar 'new' 1694faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 1695faac4104SBram Moolenaar '$', 1696faac4104SBram Moolenaar 'dsearch /pat/ #comment', 1697faac4104SBram Moolenaar 'bwipe!', 1698faac4104SBram Moolenaar ]) 1699faac4104SBram Moolenaar 1700faac4104SBram Moolenaar CheckScriptFailure([ 1701faac4104SBram Moolenaar 'vim9script', 1702faac4104SBram Moolenaar 'new' 1703faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 1704faac4104SBram Moolenaar '$', 1705faac4104SBram Moolenaar 'dsearch /pat/#comment', 1706faac4104SBram Moolenaar 'bwipe!', 1707faac4104SBram Moolenaar ], 'E488:') 1708a26b9700SBram Moolenaarenddef 1709a26b9700SBram Moolenaar 17107e5bd91dSBram Moolenaardef Test_finish() 17117e5bd91dSBram Moolenaar let lines =<< trim END 17127e5bd91dSBram Moolenaar vim9script 17137e5bd91dSBram Moolenaar let g:res = 'one' 17147e5bd91dSBram Moolenaar if v:false | finish | endif 17157e5bd91dSBram Moolenaar let g:res = 'two' 17167e5bd91dSBram Moolenaar finish 17177e5bd91dSBram Moolenaar let g:res = 'three' 17187e5bd91dSBram Moolenaar END 17197e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 17207e5bd91dSBram Moolenaar source Xfinished 17217e5bd91dSBram Moolenaar assert_equal('two', g:res) 17227e5bd91dSBram Moolenaar 17237e5bd91dSBram Moolenaar unlet g:res 17247e5bd91dSBram Moolenaar delete('Xfinished') 17257e5bd91dSBram Moolenaarenddef 17267e5bd91dSBram Moolenaar 172732e35117SBram Moolenaardef Test_let_func_call() 172832e35117SBram Moolenaar let lines =<< trim END 172932e35117SBram Moolenaar vim9script 173032e35117SBram Moolenaar func GetValue() 173132e35117SBram Moolenaar if exists('g:count') 173232e35117SBram Moolenaar let g:count += 1 173332e35117SBram Moolenaar else 173432e35117SBram Moolenaar let g:count = 1 173532e35117SBram Moolenaar endif 173632e35117SBram Moolenaar return 'this' 173732e35117SBram Moolenaar endfunc 173832e35117SBram Moolenaar let val: string = GetValue() 1739*df671b46SBram Moolenaar " env var is always a string 1740*df671b46SBram Moolenaar let env = $TERM 174132e35117SBram Moolenaar END 174232e35117SBram Moolenaar writefile(lines, 'Xfinished') 174332e35117SBram Moolenaar source Xfinished 1744a5d0077eSBram Moolenaar " GetValue() is not called during discovery phase 174532e35117SBram Moolenaar assert_equal(1, g:count) 174632e35117SBram Moolenaar 174732e35117SBram Moolenaar unlet g:count 174832e35117SBram Moolenaar delete('Xfinished') 174932e35117SBram Moolenaarenddef 175032e35117SBram Moolenaar 175132e35117SBram Moolenaardef Test_let_missing_type() 175232e35117SBram Moolenaar let lines =<< trim END 175332e35117SBram Moolenaar vim9script 175432e35117SBram Moolenaar func GetValue() 175532e35117SBram Moolenaar return 'this' 175632e35117SBram Moolenaar endfunc 175732e35117SBram Moolenaar let val = GetValue() 175832e35117SBram Moolenaar END 1759227a69deSBram Moolenaar CheckScriptFailure(lines, 'E1091:') 176032e35117SBram Moolenaar 1761227a69deSBram Moolenaar lines =<< trim END 1762227a69deSBram Moolenaar vim9script 1763*df671b46SBram Moolenaar func GetValue() 1764*df671b46SBram Moolenaar return 'this' 1765*df671b46SBram Moolenaar endfunc 1766*df671b46SBram Moolenaar let val = [GetValue()] 1767*df671b46SBram Moolenaar END 1768*df671b46SBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1769*df671b46SBram Moolenaar 1770*df671b46SBram Moolenaar lines =<< trim END 1771*df671b46SBram Moolenaar vim9script 1772*df671b46SBram Moolenaar func GetValue() 1773*df671b46SBram Moolenaar return 'this' 1774*df671b46SBram Moolenaar endfunc 1775*df671b46SBram Moolenaar let val = {GetValue(): 123} 1776*df671b46SBram Moolenaar END 1777*df671b46SBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1778*df671b46SBram Moolenaar 1779*df671b46SBram Moolenaar lines =<< trim END 1780*df671b46SBram Moolenaar vim9script 1781*df671b46SBram Moolenaar func GetValue() 1782*df671b46SBram Moolenaar return 'this' 1783*df671b46SBram Moolenaar endfunc 1784*df671b46SBram Moolenaar let val = {'a': GetValue()} 1785*df671b46SBram Moolenaar END 1786*df671b46SBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1787*df671b46SBram Moolenaar 1788*df671b46SBram Moolenaar lines =<< trim END 1789*df671b46SBram Moolenaar vim9script 1790*df671b46SBram Moolenaar let var = g:unknown 1791227a69deSBram Moolenaar END 1792227a69deSBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1793227a69deSBram Moolenaar 1794227a69deSBram Moolenaar " TODO: eventually this would work 1795227a69deSBram Moolenaar lines =<< trim END 1796227a69deSBram Moolenaar vim9script 1797227a69deSBram Moolenaar let var = has('eval') 1798227a69deSBram Moolenaar END 1799227a69deSBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1800227a69deSBram Moolenaar 1801227a69deSBram Moolenaar " TODO: eventually this would work 1802227a69deSBram Moolenaar lines =<< trim END 1803227a69deSBram Moolenaar vim9script 1804227a69deSBram Moolenaar let var = len('string') 1805227a69deSBram Moolenaar END 1806227a69deSBram Moolenaar CheckScriptFailure(lines, 'E1091:') 1807227a69deSBram Moolenaar 1808227a69deSBram Moolenaar lines =<< trim END 1809227a69deSBram Moolenaar vim9script 1810227a69deSBram Moolenaar let nr: number = 123 1811227a69deSBram Moolenaar let var = nr 1812227a69deSBram Moolenaar END 1813227a69deSBram Moolenaar CheckScriptFailure(lines, 'E1091:') 181432e35117SBram Moolenaarenddef 181532e35117SBram Moolenaar 1816a5d0077eSBram Moolenaardef Test_forward_declaration() 1817a5d0077eSBram Moolenaar let lines =<< trim END 1818a5d0077eSBram Moolenaar vim9script 1819a5d0077eSBram Moolenaar g:initVal = GetValue() 1820a5d0077eSBram Moolenaar def GetValue(): string 1821a5d0077eSBram Moolenaar return theVal 1822a5d0077eSBram Moolenaar enddef 1823a5d0077eSBram Moolenaar let theVal = 'something' 1824a5d0077eSBram Moolenaar theVal = 'else' 1825a5d0077eSBram Moolenaar g:laterVal = GetValue() 1826a5d0077eSBram Moolenaar END 1827a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 1828a5d0077eSBram Moolenaar source Xforward 1829a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 1830a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 1831a5d0077eSBram Moolenaar 1832a5d0077eSBram Moolenaar unlet g:initVal 1833a5d0077eSBram Moolenaar unlet g:laterVal 1834a5d0077eSBram Moolenaar delete('Xforward') 1835a5d0077eSBram Moolenaarenddef 1836a5d0077eSBram Moolenaar 1837a5d0077eSBram Moolenaar 1838585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 1839585fea7bSBram Moolenaardef Test_substitute_cmd() 1840585fea7bSBram Moolenaar new 1841585fea7bSBram Moolenaar setline(1, 'something') 1842585fea7bSBram Moolenaar :substitute(some(other( 1843585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1844585fea7bSBram Moolenaar bwipe! 1845585fea7bSBram Moolenaar 1846585fea7bSBram Moolenaar " also when the context is Vim9 script 1847585fea7bSBram Moolenaar let lines =<< trim END 1848585fea7bSBram Moolenaar vim9script 1849585fea7bSBram Moolenaar new 1850585fea7bSBram Moolenaar setline(1, 'something') 1851585fea7bSBram Moolenaar :substitute(some(other( 1852585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 1853585fea7bSBram Moolenaar bwipe! 1854585fea7bSBram Moolenaar END 1855585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 1856585fea7bSBram Moolenaar source Xvim9lines 1857585fea7bSBram Moolenaar 1858585fea7bSBram Moolenaar delete('Xvim9lines') 1859585fea7bSBram Moolenaarenddef 1860585fea7bSBram Moolenaar 18618a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1862