18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 78a7d6542SBram Moolenaar 88a7d6542SBram Moolenaardef Test_syntax() 98a7d6542SBram Moolenaar let var = 234 108a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 118a7d6542SBram Moolenaarenddef 128a7d6542SBram Moolenaar 136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 146e587dcbSBram Moolenaarlet s:addToMe = 111 15401d9ffbSBram Moolenaarlet g:existing = 'yes' 16a8c17704SBram Moolenaarlet g:inc_counter = 1 17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 18a6e67e4fSBram Moolenaarlet g:alist = [7] 19a6e67e4fSBram Moolenaarlet g:astring = 'text' 20f0b9f43cSBram Moolenaarlet g:anumber = 123 216e587dcbSBram Moolenaar 228a7d6542SBram Moolenaardef Test_assignment() 238a7d6542SBram Moolenaar let bool1: bool = true 248a7d6542SBram Moolenaar assert_equal(v:true, bool1) 258a7d6542SBram Moolenaar let bool2: bool = false 268a7d6542SBram Moolenaar assert_equal(v:false, bool2) 278a7d6542SBram Moolenaar 28f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 29f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 301cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 31f93c7feaSBram Moolenaar 324cdb13ceSBram Moolenaar let nr: number = 1234 334cdb13ceSBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:') 344cdb13ceSBram Moolenaar 35b209750bSBram Moolenaar let a: number = 6 #comment 369be61bbbSBram Moolenaar assert_equal(6, a) 379be61bbbSBram Moolenaar 3842a480bfSBram Moolenaar if has('channel') 3942a480bfSBram Moolenaar let chan1: channel 40fbdd08edSBram Moolenaar let job1: job 41f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 4242a480bfSBram Moolenaar endif 43fbdd08edSBram Moolenaar if has('float') 44fbdd08edSBram Moolenaar let float1: float = 3.4 45fbdd08edSBram Moolenaar endif 465deeb3f1SBram Moolenaar let Funky1: func 475deeb3f1SBram Moolenaar let Funky2: func = function('len') 484c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4942a480bfSBram Moolenaar 50b209750bSBram Moolenaar g:newvar = 'new' #comment 51401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 52401d9ffbSBram Moolenaar 53401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 54401d9ffbSBram Moolenaar g:existing = 'no' 55401d9ffbSBram Moolenaar assert_equal('no', g:existing) 56401d9ffbSBram Moolenaar 57b283a8a6SBram Moolenaar v:char = 'abc' 586e587dcbSBram Moolenaar assert_equal('abc', v:char) 59b283a8a6SBram Moolenaar 60b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 616e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 62b283a8a6SBram Moolenaar $ENVVAR = '' 636e587dcbSBram Moolenaar 64fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 65fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 66fd1823e0SBram Moolenaar s:addToMe += 222 67fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 680bbf722aSBram Moolenaar s:newVar = 'new' 690bbf722aSBram Moolenaar assert_equal('new', s:newVar) 70a8c17704SBram Moolenaar 71a8c17704SBram Moolenaar set ts=7 72a8c17704SBram Moolenaar &ts += 1 73a8c17704SBram Moolenaar assert_equal(8, &ts) 7480c34ca3SBram Moolenaar &ts -= 3 7580c34ca3SBram Moolenaar assert_equal(5, &ts) 7680c34ca3SBram Moolenaar &ts *= 2 7780c34ca3SBram Moolenaar assert_equal(10, &ts) 7880c34ca3SBram Moolenaar &ts /= 3 7980c34ca3SBram Moolenaar assert_equal(3, &ts) 8080c34ca3SBram Moolenaar set ts=10 8180c34ca3SBram Moolenaar &ts %= 4 8280c34ca3SBram Moolenaar assert_equal(2, &ts) 83a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 84a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 85a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 86a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 87a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 88a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 89a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 90a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 91cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 92585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 9380c34ca3SBram Moolenaar &ts = 8 94a8c17704SBram Moolenaar 95a8c17704SBram Moolenaar g:inc_counter += 1 96a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 97a8c17704SBram Moolenaar 98a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 99a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 100a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 101a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 102a8c17704SBram Moolenaar 103a8c17704SBram Moolenaar @a = 'areg' 104a8c17704SBram Moolenaar @a ..= 'add' 105a8c17704SBram Moolenaar assert_equal('aregadd', @a) 106a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 107a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 108e69f6d04SBram Moolenaar 109e69f6d04SBram Moolenaar v:errmsg = 'none' 110e69f6d04SBram Moolenaar v:errmsg ..= 'again' 111e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 112e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 113e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 1145deeb3f1SBram Moolenaarenddef 1155deeb3f1SBram Moolenaar 1163b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1173b74b6b4SBram Moolenaar let lines =<< trim END 1183b74b6b4SBram Moolenaar vim9script 1193b74b6b4SBram Moolenaar 120f5be8cdbSBram Moolenaar # single character variable declarations work 1213b74b6b4SBram Moolenaar let a: string 1223b74b6b4SBram Moolenaar let b: number 1233b74b6b4SBram Moolenaar let l: list<any> 1243b74b6b4SBram Moolenaar let s: string 1253b74b6b4SBram Moolenaar let t: number 1263b74b6b4SBram Moolenaar let v: number 1273b74b6b4SBram Moolenaar let w: number 1283b74b6b4SBram Moolenaar 129f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1303b74b6b4SBram Moolenaar a = 'script-a' 1313b74b6b4SBram Moolenaar b = 111 1323b74b6b4SBram Moolenaar l = [1, 2, 3] 1333b74b6b4SBram Moolenaar s = 'script-s' 1343b74b6b4SBram Moolenaar t = 222 1353b74b6b4SBram Moolenaar v = 333 1363b74b6b4SBram Moolenaar w = 444 1373b74b6b4SBram Moolenaar 1383b74b6b4SBram Moolenaar assert_equal('script-a', a) 1393b74b6b4SBram Moolenaar assert_equal(111, b) 1403b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 1413b74b6b4SBram Moolenaar assert_equal('script-s', s) 1423b74b6b4SBram Moolenaar assert_equal(222, t) 1433b74b6b4SBram Moolenaar assert_equal(333, v) 1443b74b6b4SBram Moolenaar assert_equal(444, w) 1453b74b6b4SBram Moolenaar END 1463b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 1473b74b6b4SBram Moolenaar source Xsinglechar 1483b74b6b4SBram Moolenaar delete('Xsinglechar') 1493b74b6b4SBram Moolenaarenddef 1503b74b6b4SBram Moolenaar 15184370087SBram Moolenaardef Test_assignment_list() 15284370087SBram Moolenaar let list1: list<bool> = [false, true, false] 15384370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 15484370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 15584370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 15684370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 15784370087SBram Moolenaar 15884370087SBram Moolenaar let listS: list<string> = [] 15984370087SBram Moolenaar let listN: list<number> = [] 16084370087SBram Moolenaar 16184370087SBram Moolenaar assert_equal([1, 2, 3], list2) 16284370087SBram Moolenaar list2[-1] = 99 16384370087SBram Moolenaar assert_equal([1, 2, 99], list2) 16484370087SBram Moolenaar list2[-2] = 88 16584370087SBram Moolenaar assert_equal([1, 88, 99], list2) 16684370087SBram Moolenaar list2[-3] = 77 16784370087SBram Moolenaar assert_equal([77, 88, 99], list2) 16884370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 169c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 17084370087SBram Moolenaar 17184370087SBram Moolenaar # type becomes list<any> 17284370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 17384370087SBram Moolenaarenddef 17484370087SBram Moolenaar 175b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 176b31be3f9SBram Moolenaar let lines =<< trim END 177b31be3f9SBram Moolenaar vim9script 178b31be3f9SBram Moolenaar let v1: number 179b31be3f9SBram Moolenaar let v2: number 180b31be3f9SBram Moolenaar let v3: number 181b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 182b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 183b31be3f9SBram Moolenaar END 184b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 185b31be3f9SBram Moolenaarenddef 186b31be3f9SBram Moolenaar 18784370087SBram Moolenaardef Test_assignment_dict() 18884370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 18984370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 19084370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 19184370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 19274fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 19384370087SBram Moolenaar 194f5be8cdbSBram Moolenaar # overwrite 195c785b9a7SBram Moolenaar dict3['key'] = 'another' 196c785b9a7SBram Moolenaar 19784370087SBram Moolenaar call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:') 19884370087SBram Moolenaar 19984370087SBram Moolenaar # type becomes dict<any> 20084370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 20184370087SBram Moolenaarenddef 20284370087SBram Moolenaar 203d3aac291SBram Moolenaardef Test_assignment_local() 204f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 205f5be8cdbSBram Moolenaar # changed. 206d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 207d3aac291SBram Moolenaar let b:existing = 'yes' 208d3aac291SBram Moolenaar let w:existing = 'yes' 209d3aac291SBram Moolenaar let t:existing = 'yes' 210d3aac291SBram Moolenaar 211d3aac291SBram Moolenaar def Test_assignment_local_internal() 212d3aac291SBram Moolenaar b:newvar = 'new' 213d3aac291SBram Moolenaar assert_equal('new', b:newvar) 214d3aac291SBram Moolenaar assert_equal('yes', b:existing) 215d3aac291SBram Moolenaar b:existing = 'no' 216d3aac291SBram Moolenaar assert_equal('no', b:existing) 217396f3138SBram Moolenaar b:existing ..= 'NO' 218396f3138SBram Moolenaar assert_equal('noNO', b:existing) 219d3aac291SBram Moolenaar 220d3aac291SBram Moolenaar w:newvar = 'new' 221d3aac291SBram Moolenaar assert_equal('new', w:newvar) 222d3aac291SBram Moolenaar assert_equal('yes', w:existing) 223d3aac291SBram Moolenaar w:existing = 'no' 224d3aac291SBram Moolenaar assert_equal('no', w:existing) 225396f3138SBram Moolenaar w:existing ..= 'NO' 226396f3138SBram Moolenaar assert_equal('noNO', w:existing) 227d3aac291SBram Moolenaar 228d3aac291SBram Moolenaar t:newvar = 'new' 229d3aac291SBram Moolenaar assert_equal('new', t:newvar) 230d3aac291SBram Moolenaar assert_equal('yes', t:existing) 231d3aac291SBram Moolenaar t:existing = 'no' 232d3aac291SBram Moolenaar assert_equal('no', t:existing) 233396f3138SBram Moolenaar t:existing ..= 'NO' 234396f3138SBram Moolenaar assert_equal('noNO', t:existing) 235d3aac291SBram Moolenaar enddef 236d3aac291SBram Moolenaar call Test_assignment_local_internal() 237d3aac291SBram Moolenaar END 238d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 239d3aac291SBram Moolenaarenddef 240d3aac291SBram Moolenaar 2415deeb3f1SBram Moolenaardef Test_assignment_default() 242e69f6d04SBram Moolenaar 243cb711abfSBram Moolenaar # Test default values. 244e69f6d04SBram Moolenaar let thebool: bool 245e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 246e69f6d04SBram Moolenaar 247e69f6d04SBram Moolenaar let thenumber: number 248e69f6d04SBram Moolenaar assert_equal(0, thenumber) 249e69f6d04SBram Moolenaar 250e69f6d04SBram Moolenaar if has('float') 251e69f6d04SBram Moolenaar let thefloat: float 252e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 253e69f6d04SBram Moolenaar endif 254e69f6d04SBram Moolenaar 255e69f6d04SBram Moolenaar let thestring: string 256e69f6d04SBram Moolenaar assert_equal('', thestring) 257e69f6d04SBram Moolenaar 258e69f6d04SBram Moolenaar let theblob: blob 259e69f6d04SBram Moolenaar assert_equal(0z, theblob) 260e69f6d04SBram Moolenaar 2615deeb3f1SBram Moolenaar let Thefunc: func 2625deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 263e69f6d04SBram Moolenaar 264e69f6d04SBram Moolenaar let thelist: list<any> 265e69f6d04SBram Moolenaar assert_equal([], thelist) 266e69f6d04SBram Moolenaar 267e69f6d04SBram Moolenaar let thedict: dict<any> 268e69f6d04SBram Moolenaar assert_equal({}, thedict) 269e69f6d04SBram Moolenaar 2702c869deeSBram Moolenaar if has('channel') 271e69f6d04SBram Moolenaar let thejob: job 272e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 273e69f6d04SBram Moolenaar 274e69f6d04SBram Moolenaar let thechannel: channel 275e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 276c785b9a7SBram Moolenaar 277c785b9a7SBram Moolenaar if has('unix') && executable('cat') 278f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 279c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 280c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 281c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 282c785b9a7SBram Moolenaar endif 2832c869deeSBram Moolenaar endif 284585fea7bSBram Moolenaar 285585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 286585fea7bSBram Moolenaar assert_equal(5678, nr) 2878a7d6542SBram Moolenaarenddef 2888a7d6542SBram Moolenaar 28947a519a9SBram Moolenaardef Test_assignment_var_list() 29047a519a9SBram Moolenaar let v1: string 29147a519a9SBram Moolenaar let v2: string 2929af78769SBram Moolenaar let vrem: list<string> 2939af78769SBram Moolenaar [v1] = ['aaa'] 2949af78769SBram Moolenaar assert_equal('aaa', v1) 2959af78769SBram Moolenaar 29647a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 29747a519a9SBram Moolenaar assert_equal('one', v1) 29847a519a9SBram Moolenaar assert_equal('two', v2) 2999af78769SBram Moolenaar 3009af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 3019af78769SBram Moolenaar assert_equal('one', v1) 3029af78769SBram Moolenaar assert_equal('two', v2) 3039af78769SBram Moolenaar assert_equal([], vrem) 3049af78769SBram Moolenaar 3059af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 3069af78769SBram Moolenaar assert_equal('one', v1) 3079af78769SBram Moolenaar assert_equal('two', v2) 3089af78769SBram Moolenaar assert_equal(['three'], vrem) 30947a519a9SBram Moolenaarenddef 31047a519a9SBram Moolenaar 311cab27678SBram Moolenaardef Mess(): string 312cab27678SBram Moolenaar v:foldstart = 123 313cab27678SBram Moolenaar return 'xxx' 314cab27678SBram Moolenaarenddef 315cab27678SBram Moolenaar 316d72c1bf0SBram Moolenaardef Test_assignment_failure() 3178a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 3188a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 3198a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 3208a7d6542SBram Moolenaar 32163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 32263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 32363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 32463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 32563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 32663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 32763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 32863be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 32963be3d4bSBram Moolenaar 3308a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 3318a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 3328a7d6542SBram Moolenaar 3339b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 3349af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3359af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 3369af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3379af78769SBram Moolenaar '[a] = []'], 'E1093:') 3389af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3399af78769SBram Moolenaar 'let y: number', 3409af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 3419af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3429af78769SBram Moolenaar 'let y: number', 3439af78769SBram Moolenaar 'let z: list<number>', 3449af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 3459be61bbbSBram Moolenaar 346e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 3479be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 3489be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 3499be61bbbSBram Moolenaar 350e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 3519be61bbbSBram Moolenaar 3529be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 3539be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 3549be61bbbSBram Moolenaar 355e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 356e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 357e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 358e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 3599be61bbbSBram Moolenaar 3609be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 3619be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 3629be61bbbSBram Moolenaar 363822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 36433fa29cfSBram Moolenaar 3658a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 3668a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 3678a7d6542SBram Moolenaar 3688a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 3698a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 3708a7d6542SBram Moolenaar 3718a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 3728a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 37342a480bfSBram Moolenaar 374d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 37542a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 376cab27678SBram Moolenaar 377cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 378cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 37943e969d3SBram Moolenaar 38043e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 38143e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 38243e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 38343e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 38443e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 38543e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 38643e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 38743e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 388d72c1bf0SBram Moolenaarenddef 389d72c1bf0SBram Moolenaar 390d72c1bf0SBram Moolenaardef Test_unlet() 391d72c1bf0SBram Moolenaar g:somevar = 'yes' 392d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 393d72c1bf0SBram Moolenaar unlet g:somevar 394d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 395d72c1bf0SBram Moolenaar unlet! g:somevar 396d72c1bf0SBram Moolenaar 397d72c1bf0SBram Moolenaar call CheckScriptFailure([ 398d72c1bf0SBram Moolenaar 'vim9script', 399d72c1bf0SBram Moolenaar 'let svar = 123', 400d72c1bf0SBram Moolenaar 'unlet svar', 401d72c1bf0SBram Moolenaar ], 'E1081:') 402d72c1bf0SBram Moolenaar call CheckScriptFailure([ 403d72c1bf0SBram Moolenaar 'vim9script', 404d72c1bf0SBram Moolenaar 'let svar = 123', 405d72c1bf0SBram Moolenaar 'unlet s:svar', 406d72c1bf0SBram Moolenaar ], 'E1081:') 407d72c1bf0SBram Moolenaar call CheckScriptFailure([ 408d72c1bf0SBram Moolenaar 'vim9script', 409d72c1bf0SBram Moolenaar 'let svar = 123', 410d72c1bf0SBram Moolenaar 'def Func()', 411d72c1bf0SBram Moolenaar ' unlet svar', 412d72c1bf0SBram Moolenaar 'enddef', 413822ba247SBram Moolenaar 'defcompile', 414d72c1bf0SBram Moolenaar ], 'E1081:') 415d72c1bf0SBram Moolenaar call CheckScriptFailure([ 416d72c1bf0SBram Moolenaar 'vim9script', 417d72c1bf0SBram Moolenaar 'let svar = 123', 418d72c1bf0SBram Moolenaar 'def Func()', 419d72c1bf0SBram Moolenaar ' unlet s:svar', 420d72c1bf0SBram Moolenaar 'enddef', 421822ba247SBram Moolenaar 'defcompile', 422d72c1bf0SBram Moolenaar ], 'E1081:') 4237bdaea6eSBram Moolenaar 4247bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 4257bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 4267bdaea6eSBram Moolenaar unlet $ENVVAR 4277bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 428d72c1bf0SBram Moolenaarenddef 429599c89c8SBram Moolenaar 4304c17ad94SBram Moolenaardef Test_delfunction() 431f5be8cdbSBram Moolenaar # Check function is defined in script namespace 4324c17ad94SBram Moolenaar CheckScriptSuccess([ 4334c17ad94SBram Moolenaar 'vim9script', 4344c17ad94SBram Moolenaar 'func CheckMe()', 4354c17ad94SBram Moolenaar ' return 123', 4364c17ad94SBram Moolenaar 'endfunc', 4374c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 4384c17ad94SBram Moolenaar ]) 4394c17ad94SBram Moolenaar 440f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 4414c17ad94SBram Moolenaar CheckScriptFailure([ 4424c17ad94SBram Moolenaar 'vim9script', 4434c17ad94SBram Moolenaar 'func DeleteMe1()', 4444c17ad94SBram Moolenaar 'endfunc', 4454c17ad94SBram Moolenaar 'delfunction DeleteMe1', 4464c17ad94SBram Moolenaar ], 'E1084:') 4474c17ad94SBram Moolenaar CheckScriptFailure([ 4484c17ad94SBram Moolenaar 'vim9script', 4494c17ad94SBram Moolenaar 'func DeleteMe2()', 4504c17ad94SBram Moolenaar 'endfunc', 4514c17ad94SBram Moolenaar 'def DoThat()', 4524c17ad94SBram Moolenaar ' delfunction DeleteMe2', 4534c17ad94SBram Moolenaar 'enddef', 4544c17ad94SBram Moolenaar 'DoThat()', 4554c17ad94SBram Moolenaar ], 'E1084:') 4564c17ad94SBram Moolenaar CheckScriptFailure([ 4574c17ad94SBram Moolenaar 'vim9script', 4584c17ad94SBram Moolenaar 'def DeleteMe3()', 4594c17ad94SBram Moolenaar 'enddef', 4604c17ad94SBram Moolenaar 'delfunction DeleteMe3', 4614c17ad94SBram Moolenaar ], 'E1084:') 4624c17ad94SBram Moolenaar CheckScriptFailure([ 4634c17ad94SBram Moolenaar 'vim9script', 4644c17ad94SBram Moolenaar 'def DeleteMe4()', 4654c17ad94SBram Moolenaar 'enddef', 4664c17ad94SBram Moolenaar 'def DoThat()', 4674c17ad94SBram Moolenaar ' delfunction DeleteMe4', 4684c17ad94SBram Moolenaar 'enddef', 4694c17ad94SBram Moolenaar 'DoThat()', 4704c17ad94SBram Moolenaar ], 'E1084:') 471925e9fd6SBram Moolenaar 472925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 473925e9fd6SBram Moolenaar let lines =<< trim END 474925e9fd6SBram Moolenaar vim9script 475925e9fd6SBram Moolenaar def g:Global(): string 476925e9fd6SBram Moolenaar return "yes" 477925e9fd6SBram Moolenaar enddef 478925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 479925e9fd6SBram Moolenaar def! g:Global(): string 480925e9fd6SBram Moolenaar return "no" 481925e9fd6SBram Moolenaar enddef 482925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 483925e9fd6SBram Moolenaar delfunc g:Global 484925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 485925e9fd6SBram Moolenaar END 486925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 487925e9fd6SBram Moolenaar 488925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 489925e9fd6SBram Moolenaar lines =<< trim END 490925e9fd6SBram Moolenaar vim9script 491925e9fd6SBram Moolenaar func g:Global() 492925e9fd6SBram Moolenaar return "yes" 493925e9fd6SBram Moolenaar endfunc 494925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 495925e9fd6SBram Moolenaar def! g:Global(): string 496925e9fd6SBram Moolenaar return "no" 497925e9fd6SBram Moolenaar enddef 498925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 499925e9fd6SBram Moolenaar delfunc g:Global 500925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 501925e9fd6SBram Moolenaar END 502925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 503925e9fd6SBram Moolenaar 504925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 505925e9fd6SBram Moolenaar lines =<< trim END 506925e9fd6SBram Moolenaar vim9script 507925e9fd6SBram Moolenaar def g:Global(): string 508925e9fd6SBram Moolenaar return "yes" 509925e9fd6SBram Moolenaar enddef 510925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 511925e9fd6SBram Moolenaar func! g:Global() 512925e9fd6SBram Moolenaar return "no" 513925e9fd6SBram Moolenaar endfunc 514925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 515925e9fd6SBram Moolenaar delfunc g:Global 516925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 517925e9fd6SBram Moolenaar END 518925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 5194c17ad94SBram Moolenaarenddef 5204c17ad94SBram Moolenaar 521599c89c8SBram Moolenaarfunc Test_wrong_type() 522599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 523599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 524599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 525599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 526599c89c8SBram Moolenaar 527599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 528599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 52942a480bfSBram Moolenaar 53042a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 53142a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 53242a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 53342a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 53442a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 53542a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 53642a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 53742a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 53842a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 53942a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 54042a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 541a0a9f43aSBram Moolenaar 542a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 543a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 5448a7d6542SBram Moolenaarendfunc 5458a7d6542SBram Moolenaar 5468a7d6542SBram Moolenaarfunc Test_const() 5478a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 5488a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 5498a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 5509be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 5518a7d6542SBram Moolenaarendfunc 5528a7d6542SBram Moolenaar 553df069eecSBram Moolenaardef Test_range_no_colon() 554df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 555df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 556df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 557df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 558df069eecSBram Moolenaarenddef 559df069eecSBram Moolenaar 560df069eecSBram Moolenaar 5618a7d6542SBram Moolenaardef Test_block() 5628a7d6542SBram Moolenaar let outer = 1 5638a7d6542SBram Moolenaar { 5648a7d6542SBram Moolenaar let inner = 2 5658a7d6542SBram Moolenaar assert_equal(1, outer) 5668a7d6542SBram Moolenaar assert_equal(2, inner) 5678a7d6542SBram Moolenaar } 5688a7d6542SBram Moolenaar assert_equal(1, outer) 5698a7d6542SBram Moolenaarenddef 5708a7d6542SBram Moolenaar 5718a7d6542SBram Moolenaarfunc Test_block_failure() 5728a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 573585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 574585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 5758a7d6542SBram Moolenaarendfunc 5768a7d6542SBram Moolenaar 577585fea7bSBram Moolenaardef Test_cmd_modifier() 578585fea7bSBram Moolenaar tab echo '0' 579585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 580585fea7bSBram Moolenaarenddef 581585fea7bSBram Moolenaar 582d032f34aSBram Moolenaarfunc g:NoSuchFunc() 583d032f34aSBram Moolenaar echo 'none' 584d032f34aSBram Moolenaarendfunc 585d032f34aSBram Moolenaar 5868a7d6542SBram Moolenaardef Test_try_catch() 5878a7d6542SBram Moolenaar let l = [] 5887a092245SBram Moolenaar try # comment 5898a7d6542SBram Moolenaar add(l, '1') 5908a7d6542SBram Moolenaar throw 'wrong' 5918a7d6542SBram Moolenaar add(l, '2') 5927a092245SBram Moolenaar catch # comment 5938a7d6542SBram Moolenaar add(l, v:exception) 5947a092245SBram Moolenaar finally # comment 5958a7d6542SBram Moolenaar add(l, '3') 5967a092245SBram Moolenaar endtry # comment 5978a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 59868d130c6SBram Moolenaar 599e859312eSBram Moolenaar l = [] 600e859312eSBram Moolenaar try 601e859312eSBram Moolenaar try 602e859312eSBram Moolenaar add(l, '1') 603e859312eSBram Moolenaar throw 'wrong' 604e859312eSBram Moolenaar add(l, '2') 605e859312eSBram Moolenaar catch /right/ 606e859312eSBram Moolenaar add(l, v:exception) 607e859312eSBram Moolenaar endtry 608e859312eSBram Moolenaar catch /wrong/ 609e859312eSBram Moolenaar add(l, 'caught') 610e859312eSBram Moolenaar finally 611e859312eSBram Moolenaar add(l, 'finally') 612e859312eSBram Moolenaar endtry 613e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 614e859312eSBram Moolenaar 61568d130c6SBram Moolenaar let n: number 61668d130c6SBram Moolenaar try 61768d130c6SBram Moolenaar n = l[3] 61868d130c6SBram Moolenaar catch /E684:/ 61968d130c6SBram Moolenaar n = 99 62068d130c6SBram Moolenaar endtry 62168d130c6SBram Moolenaar assert_equal(99, n) 62268d130c6SBram Moolenaar 62368d130c6SBram Moolenaar try 62468d130c6SBram Moolenaar n = g:astring[3] 62568d130c6SBram Moolenaar catch /E714:/ 62668d130c6SBram Moolenaar n = 77 62768d130c6SBram Moolenaar endtry 62868d130c6SBram Moolenaar assert_equal(77, n) 62968d130c6SBram Moolenaar 63068d130c6SBram Moolenaar try 63168d130c6SBram Moolenaar n = l[g:astring] 63268d130c6SBram Moolenaar catch /E39:/ 63368d130c6SBram Moolenaar n = 77 63468d130c6SBram Moolenaar endtry 63568d130c6SBram Moolenaar assert_equal(77, n) 63668d130c6SBram Moolenaar 63768d130c6SBram Moolenaar try 63868d130c6SBram Moolenaar n = s:does_not_exist 63968d130c6SBram Moolenaar catch /E121:/ 640f0b9f43cSBram Moolenaar n = 111 641f0b9f43cSBram Moolenaar endtry 642f0b9f43cSBram Moolenaar assert_equal(111, n) 643f0b9f43cSBram Moolenaar 644f0b9f43cSBram Moolenaar try 645f0b9f43cSBram Moolenaar n = g:does_not_exist 646f0b9f43cSBram Moolenaar catch /E121:/ 64768d130c6SBram Moolenaar n = 121 64868d130c6SBram Moolenaar endtry 64968d130c6SBram Moolenaar assert_equal(121, n) 65068d130c6SBram Moolenaar 65168d130c6SBram Moolenaar let d = #{one: 1} 65268d130c6SBram Moolenaar try 65368d130c6SBram Moolenaar n = d[g:astring] 65468d130c6SBram Moolenaar catch /E716:/ 65568d130c6SBram Moolenaar n = 222 65668d130c6SBram Moolenaar endtry 65768d130c6SBram Moolenaar assert_equal(222, n) 658f0b9f43cSBram Moolenaar 659f0b9f43cSBram Moolenaar try 660f0b9f43cSBram Moolenaar n = -g:astring 661f0b9f43cSBram Moolenaar catch /E39:/ 662f0b9f43cSBram Moolenaar n = 233 663f0b9f43cSBram Moolenaar endtry 664f0b9f43cSBram Moolenaar assert_equal(233, n) 665f0b9f43cSBram Moolenaar 666f0b9f43cSBram Moolenaar try 667f0b9f43cSBram Moolenaar n = +g:astring 668f0b9f43cSBram Moolenaar catch /E1030:/ 669f0b9f43cSBram Moolenaar n = 244 670f0b9f43cSBram Moolenaar endtry 671f0b9f43cSBram Moolenaar assert_equal(244, n) 672f0b9f43cSBram Moolenaar 673f0b9f43cSBram Moolenaar try 674f0b9f43cSBram Moolenaar n = +g:alist 675f0b9f43cSBram Moolenaar catch /E745:/ 676f0b9f43cSBram Moolenaar n = 255 677f0b9f43cSBram Moolenaar endtry 678f0b9f43cSBram Moolenaar assert_equal(255, n) 679f0b9f43cSBram Moolenaar 680f0b9f43cSBram Moolenaar let nd: dict<any> 681f0b9f43cSBram Moolenaar try 682f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 683f0b9f43cSBram Moolenaar catch /E1029:/ 684f0b9f43cSBram Moolenaar n = 266 685f0b9f43cSBram Moolenaar endtry 686f0b9f43cSBram Moolenaar assert_equal(266, n) 687f0b9f43cSBram Moolenaar 688f0b9f43cSBram Moolenaar try 689f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 690f0b9f43cSBram Moolenaar catch /E1093:/ 691f0b9f43cSBram Moolenaar n = 277 692f0b9f43cSBram Moolenaar endtry 693f0b9f43cSBram Moolenaar assert_equal(277, n) 694f0b9f43cSBram Moolenaar 695e859312eSBram Moolenaar try 696e859312eSBram Moolenaar &ts = g:astring 697e859312eSBram Moolenaar catch /E1029:/ 698e859312eSBram Moolenaar n = 288 699e859312eSBram Moolenaar endtry 700e859312eSBram Moolenaar assert_equal(288, n) 701e859312eSBram Moolenaar 702e859312eSBram Moolenaar try 703e859312eSBram Moolenaar &backspace = 'asdf' 704e859312eSBram Moolenaar catch /E474:/ 705e859312eSBram Moolenaar n = 299 706e859312eSBram Moolenaar endtry 707e859312eSBram Moolenaar assert_equal(299, n) 708e859312eSBram Moolenaar 709e859312eSBram Moolenaar l = [1] 710e859312eSBram Moolenaar try 711e859312eSBram Moolenaar l[3] = 3 712e859312eSBram Moolenaar catch /E684:/ 713e859312eSBram Moolenaar n = 300 714e859312eSBram Moolenaar endtry 715e859312eSBram Moolenaar assert_equal(300, n) 716e859312eSBram Moolenaar 717e859312eSBram Moolenaar try 718e859312eSBram Moolenaar d[''] = 3 719e859312eSBram Moolenaar catch /E713:/ 720e859312eSBram Moolenaar n = 311 721e859312eSBram Moolenaar endtry 722e859312eSBram Moolenaar assert_equal(311, n) 723e859312eSBram Moolenaar 724e859312eSBram Moolenaar try 725e859312eSBram Moolenaar unlet g:does_not_exist 726e859312eSBram Moolenaar catch /E108:/ 727e859312eSBram Moolenaar n = 322 728e859312eSBram Moolenaar endtry 729e859312eSBram Moolenaar assert_equal(322, n) 730e859312eSBram Moolenaar 731e859312eSBram Moolenaar try 732e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 733e859312eSBram Moolenaar catch /E721:/ 734e859312eSBram Moolenaar n = 333 735e859312eSBram Moolenaar endtry 736e859312eSBram Moolenaar assert_equal(333, n) 737e859312eSBram Moolenaar 738e859312eSBram Moolenaar try 739e859312eSBram Moolenaar l = DeletedFunc() 740e859312eSBram Moolenaar catch /E933:/ 741e859312eSBram Moolenaar n = 344 742e859312eSBram Moolenaar endtry 743e859312eSBram Moolenaar assert_equal(344, n) 744d032f34aSBram Moolenaar 745d032f34aSBram Moolenaar try 746d032f34aSBram Moolenaar echo len(v:true) 747d032f34aSBram Moolenaar catch /E701:/ 748d032f34aSBram Moolenaar n = 355 749d032f34aSBram Moolenaar endtry 750d032f34aSBram Moolenaar assert_equal(355, n) 751d032f34aSBram Moolenaar 752d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 753d032f34aSBram Moolenaar delfunc g:NoSuchFunc 754d032f34aSBram Moolenaar try 755d032f34aSBram Moolenaar echo P() 756d032f34aSBram Moolenaar catch /E117:/ 757d032f34aSBram Moolenaar n = 366 758d032f34aSBram Moolenaar endtry 759d032f34aSBram Moolenaar assert_equal(366, n) 760d032f34aSBram Moolenaar 761d032f34aSBram Moolenaar try 762d032f34aSBram Moolenaar echo g:NoSuchFunc() 763d032f34aSBram Moolenaar catch /E117:/ 764d032f34aSBram Moolenaar n = 377 765d032f34aSBram Moolenaar endtry 766d032f34aSBram Moolenaar assert_equal(377, n) 767d032f34aSBram Moolenaar 768d032f34aSBram Moolenaar try 769d032f34aSBram Moolenaar echo g:alist + 4 770d032f34aSBram Moolenaar catch /E745:/ 771d032f34aSBram Moolenaar n = 388 772d032f34aSBram Moolenaar endtry 773d032f34aSBram Moolenaar assert_equal(388, n) 774d032f34aSBram Moolenaar 775d032f34aSBram Moolenaar try 776d032f34aSBram Moolenaar echo 4 + g:alist 777d032f34aSBram Moolenaar catch /E745:/ 778d032f34aSBram Moolenaar n = 399 779d032f34aSBram Moolenaar endtry 780d032f34aSBram Moolenaar assert_equal(399, n) 781d032f34aSBram Moolenaar 782d032f34aSBram Moolenaar try 783d032f34aSBram Moolenaar echo g:alist.member 784d032f34aSBram Moolenaar catch /E715:/ 785d032f34aSBram Moolenaar n = 400 786d032f34aSBram Moolenaar endtry 787d032f34aSBram Moolenaar assert_equal(400, n) 788d032f34aSBram Moolenaar 789d032f34aSBram Moolenaar try 790d032f34aSBram Moolenaar echo d.member 791d032f34aSBram Moolenaar catch /E716:/ 792d032f34aSBram Moolenaar n = 411 793d032f34aSBram Moolenaar endtry 794d032f34aSBram Moolenaar assert_equal(411, n) 7958a7d6542SBram Moolenaarenddef 7968a7d6542SBram Moolenaar 797e859312eSBram Moolenaardef DeletedFunc(): list<any> 798e859312eSBram Moolenaar return ['delete me'] 799e859312eSBram Moolenaarenddef 800e859312eSBram Moolenaardefcompile 801e859312eSBram Moolenaardelfunc DeletedFunc 802e859312eSBram Moolenaar 803257cc5eeSBram Moolenaardef ThrowFromDef() 804a72cfb80SBram Moolenaar throw "getout" # comment 805257cc5eeSBram Moolenaarenddef 806257cc5eeSBram Moolenaar 807257cc5eeSBram Moolenaarfunc CatchInFunc() 808257cc5eeSBram Moolenaar try 809257cc5eeSBram Moolenaar call ThrowFromDef() 810257cc5eeSBram Moolenaar catch 811257cc5eeSBram Moolenaar let g:thrown_func = v:exception 812257cc5eeSBram Moolenaar endtry 813257cc5eeSBram Moolenaarendfunc 814257cc5eeSBram Moolenaar 815257cc5eeSBram Moolenaardef CatchInDef() 816257cc5eeSBram Moolenaar try 817257cc5eeSBram Moolenaar ThrowFromDef() 818257cc5eeSBram Moolenaar catch 819257cc5eeSBram Moolenaar g:thrown_def = v:exception 820257cc5eeSBram Moolenaar endtry 821257cc5eeSBram Moolenaarenddef 822257cc5eeSBram Moolenaar 823f575adffSBram Moolenaardef ReturnFinally(): string 824f575adffSBram Moolenaar try 825f575adffSBram Moolenaar return 'intry' 826f575adffSBram Moolenaar finally 827f575adffSBram Moolenaar g:in_finally = 'finally' 828f575adffSBram Moolenaar endtry 829f575adffSBram Moolenaar return 'end' 830f575adffSBram Moolenaarenddef 831f575adffSBram Moolenaar 832257cc5eeSBram Moolenaardef Test_try_catch_nested() 833257cc5eeSBram Moolenaar CatchInFunc() 834257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 835257cc5eeSBram Moolenaar 836257cc5eeSBram Moolenaar CatchInDef() 837257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 838f575adffSBram Moolenaar 839f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 840f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 841f575adffSBram Moolenaarenddef 842f575adffSBram Moolenaar 843f575adffSBram Moolenaardef Test_try_catch_match() 844f575adffSBram Moolenaar let seq = 'a' 845f575adffSBram Moolenaar try 846f575adffSBram Moolenaar throw 'something' 847f575adffSBram Moolenaar catch /nothing/ 848f575adffSBram Moolenaar seq ..= 'x' 849f575adffSBram Moolenaar catch /some/ 850f575adffSBram Moolenaar seq ..= 'b' 851f575adffSBram Moolenaar catch /asdf/ 852f575adffSBram Moolenaar seq ..= 'x' 853e8c4abbbSBram Moolenaar catch ?a\?sdf? 854e8c4abbbSBram Moolenaar seq ..= 'y' 855f575adffSBram Moolenaar finally 856f575adffSBram Moolenaar seq ..= 'c' 857f575adffSBram Moolenaar endtry 858f575adffSBram Moolenaar assert_equal('abc', seq) 859257cc5eeSBram Moolenaarenddef 860257cc5eeSBram Moolenaar 861e8c4abbbSBram Moolenaardef Test_try_catch_fails() 862e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 863e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 864e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 865585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 866585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 867585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 868585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 869585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 870585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 871585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 872585fea7bSBram Moolenaar 873a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 874585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 875e8c4abbbSBram Moolenaarenddef 876e8c4abbbSBram Moolenaar 877006ad48bSBram Moolenaardef Test_throw_vimscript() 878f5be8cdbSBram Moolenaar # only checks line continuation 879006ad48bSBram Moolenaar let lines =<< trim END 880006ad48bSBram Moolenaar vim9script 881006ad48bSBram Moolenaar try 882006ad48bSBram Moolenaar throw 'one' 883006ad48bSBram Moolenaar .. 'two' 884006ad48bSBram Moolenaar catch 885006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 886006ad48bSBram Moolenaar endtry 887006ad48bSBram Moolenaar END 888006ad48bSBram Moolenaar CheckScriptSuccess(lines) 889006ad48bSBram Moolenaarenddef 890006ad48bSBram Moolenaar 89137c83711SBram Moolenaardef Test_cexpr_vimscript() 892f5be8cdbSBram Moolenaar # only checks line continuation 89337c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 89437c83711SBram Moolenaar let lines =<< trim END 89537c83711SBram Moolenaar vim9script 89637c83711SBram Moolenaar cexpr 'File' 89737c83711SBram Moolenaar .. ' someFile' .. 89837c83711SBram Moolenaar ' line 19' 89937c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 90037c83711SBram Moolenaar END 90137c83711SBram Moolenaar CheckScriptSuccess(lines) 90237c83711SBram Moolenaar set errorformat& 90337c83711SBram Moolenaarenddef 90437c83711SBram Moolenaar 905b209750bSBram Moolenaardef Test_list_vimscript() 906b209750bSBram Moolenaar # checks line continuation and comments 907b209750bSBram Moolenaar let lines =<< trim END 908b209750bSBram Moolenaar vim9script 909b209750bSBram Moolenaar let mylist = [ 910b209750bSBram Moolenaar 'one', 911b209750bSBram Moolenaar # comment 912b209750bSBram Moolenaar 'two', # empty line follows 913b209750bSBram Moolenaar 914b209750bSBram Moolenaar 'three', 915b209750bSBram Moolenaar ] 916b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 917b209750bSBram Moolenaar END 918b209750bSBram Moolenaar CheckScriptSuccess(lines) 919b209750bSBram Moolenaarenddef 920b209750bSBram Moolenaar 9212a1381c3SBram Moolenaarif has('channel') 92240ee466cSBram Moolenaar let someJob = test_null_job() 92340ee466cSBram Moolenaar 92440ee466cSBram Moolenaar def FuncWithError() 92540ee466cSBram Moolenaar echomsg g:someJob 92640ee466cSBram Moolenaar enddef 92740ee466cSBram Moolenaar 92840ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 92940ee466cSBram Moolenaar try 93040ee466cSBram Moolenaar call FuncWithError() 93140ee466cSBram Moolenaar catch 93240ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 93340ee466cSBram Moolenaar endtry 93440ee466cSBram Moolenaar endfunc 9352a1381c3SBram Moolenaarendif 93640ee466cSBram Moolenaar 9378a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9388a7d6542SBram Moolenaar vim9script 9398a7d6542SBram Moolenaar let name: string = 'bob' 9408a7d6542SBram Moolenaar def Concat(arg: string): string 9418a7d6542SBram Moolenaar return name .. arg 9428a7d6542SBram Moolenaar enddef 943227a69deSBram Moolenaar g:result = Concat('bie') 944227a69deSBram Moolenaar g:localname = name 9458a7d6542SBram Moolenaar 9468a7d6542SBram Moolenaar export const CONST = 1234 9478a7d6542SBram Moolenaar export let exported = 9876 9486e587dcbSBram Moolenaar export let exp_name = 'John' 9498a7d6542SBram Moolenaar export def Exported(): string 9508a7d6542SBram Moolenaar return 'Exported' 9518a7d6542SBram Moolenaar enddef 9528a7d6542SBram MoolenaarEND 9538a7d6542SBram Moolenaar 9545269bd2aSBram Moolenaardef Test_vim9_import_export() 9558a7d6542SBram Moolenaar let import_script_lines =<< trim END 9568a7d6542SBram Moolenaar vim9script 9578a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9588a7d6542SBram Moolenaar g:imported = exported 9596e587dcbSBram Moolenaar exported += 3 9606e587dcbSBram Moolenaar g:imported_added = exported 9618a7d6542SBram Moolenaar g:imported_func = Exported() 9626e587dcbSBram Moolenaar 96340f4f7a4SBram Moolenaar def GetExported(): string 96440f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 96540f4f7a4SBram Moolenaar return local_dict.ref() 96640f4f7a4SBram Moolenaar enddef 96740f4f7a4SBram Moolenaar g:funcref_result = GetExported() 96840f4f7a4SBram Moolenaar 9696e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9706e587dcbSBram Moolenaar g:imported_name = exp_name 9716e587dcbSBram Moolenaar exp_name ..= ' Doe' 9726e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9735381c7a1SBram Moolenaar g:imported_later = exported 9748a7d6542SBram Moolenaar END 9758a7d6542SBram Moolenaar 9768a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9778a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9788a7d6542SBram Moolenaar 9798a7d6542SBram Moolenaar source Ximport.vim 9808a7d6542SBram Moolenaar 9818a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9828a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9838a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9846e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9855381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9868a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 98740f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9886e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9896e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9908a7d6542SBram Moolenaar assert_false(exists('g:name')) 9918a7d6542SBram Moolenaar 9928a7d6542SBram Moolenaar unlet g:result 9938a7d6542SBram Moolenaar unlet g:localname 9948a7d6542SBram Moolenaar unlet g:imported 9956e587dcbSBram Moolenaar unlet g:imported_added 9965381c7a1SBram Moolenaar unlet g:imported_later 9978a7d6542SBram Moolenaar unlet g:imported_func 9986e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9998a7d6542SBram Moolenaar delete('Ximport.vim') 1000f2d5c240SBram Moolenaar 10011c991144SBram Moolenaar # similar, with line breaks 10021c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 10031c991144SBram Moolenaar vim9script 10041c991144SBram Moolenaar import { 10051c991144SBram Moolenaar exported, 10061c991144SBram Moolenaar Exported, 10071c991144SBram Moolenaar } 10081c991144SBram Moolenaar from 10091c991144SBram Moolenaar './Xexport.vim' 10101c991144SBram Moolenaar g:imported = exported 10111c991144SBram Moolenaar exported += 5 10121c991144SBram Moolenaar g:imported_added = exported 10131c991144SBram Moolenaar g:imported_func = Exported() 10141c991144SBram Moolenaar END 10151c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 10161c991144SBram Moolenaar source Ximport_lbr.vim 10171c991144SBram Moolenaar 10181c991144SBram Moolenaar assert_equal(9876, g:imported) 10191c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10201c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10211c991144SBram Moolenaar 10221c991144SBram Moolenaar # exported script not sourced again 10231c991144SBram Moolenaar assert_false(exists('g:result')) 10241c991144SBram Moolenaar unlet g:imported 10251c991144SBram Moolenaar unlet g:imported_added 10261c991144SBram Moolenaar unlet g:imported_func 10271c991144SBram Moolenaar delete('Ximport_lbr.vim') 10281c991144SBram Moolenaar 10291c991144SBram Moolenaar # import inside :def function 10305381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 10315381c7a1SBram Moolenaar vim9script 10325381c7a1SBram Moolenaar def ImportInDef() 10335381c7a1SBram Moolenaar import exported from './Xexport.vim' 10345381c7a1SBram Moolenaar g:imported = exported 10355381c7a1SBram Moolenaar exported += 7 10365381c7a1SBram Moolenaar g:imported_added = exported 10375381c7a1SBram Moolenaar enddef 10385381c7a1SBram Moolenaar ImportInDef() 10395381c7a1SBram Moolenaar END 10405381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10415381c7a1SBram Moolenaar source Ximport2.vim 1042f5be8cdbSBram Moolenaar # TODO: this should be 9879 10435381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10445381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10455381c7a1SBram Moolenaar unlet g:imported 10465381c7a1SBram Moolenaar unlet g:imported_added 10475381c7a1SBram Moolenaar delete('Ximport2.vim') 10485381c7a1SBram Moolenaar 1049f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1050f2d5c240SBram Moolenaar vim9script 1051f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1052f2d5c240SBram Moolenaar def UseExport() 1053f2d5c240SBram Moolenaar g:imported = Export.exported 1054f2d5c240SBram Moolenaar enddef 1055f2d5c240SBram Moolenaar UseExport() 1056f2d5c240SBram Moolenaar END 1057f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1058f2d5c240SBram Moolenaar source Ximport.vim 10595381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1060f2d5c240SBram Moolenaar 1061599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1062599c89c8SBram Moolenaar vim9script 1063599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1064599c89c8SBram Moolenaar def Func() 1065599c89c8SBram Moolenaar let dummy = 1 1066599c89c8SBram Moolenaar let imported = Export + dummy 1067599c89c8SBram Moolenaar enddef 1068822ba247SBram Moolenaar defcompile 1069599c89c8SBram Moolenaar END 1070599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1071599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1072599c89c8SBram Moolenaar 1073599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1074599c89c8SBram Moolenaar vim9script 1075599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1076599c89c8SBram Moolenaar def Func() 1077599c89c8SBram Moolenaar let imported = Export . exported 1078599c89c8SBram Moolenaar enddef 1079822ba247SBram Moolenaar defcompile 1080599c89c8SBram Moolenaar END 1081599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1082599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1083599c89c8SBram Moolenaar 1084599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1085599c89c8SBram Moolenaar vim9script 1086599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1087599c89c8SBram Moolenaar def Func() 1088599c89c8SBram Moolenaar let imported = Export. 1089599c89c8SBram Moolenaar enddef 1090822ba247SBram Moolenaar defcompile 1091599c89c8SBram Moolenaar END 1092599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1093599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1094599c89c8SBram Moolenaar 10951c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 10961c991144SBram Moolenaar vim9script 10971c991144SBram Moolenaar import * 10981c991144SBram Moolenaar as Export 10991c991144SBram Moolenaar from 11001c991144SBram Moolenaar './Xexport.vim' 11011c991144SBram Moolenaar def UseExport() 11021c991144SBram Moolenaar g:imported = Export.exported 11031c991144SBram Moolenaar enddef 11041c991144SBram Moolenaar UseExport() 11051c991144SBram Moolenaar END 11061c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 11071c991144SBram Moolenaar source Ximport.vim 11081c991144SBram Moolenaar assert_equal(9883, g:imported) 11091c991144SBram Moolenaar 1110f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1111f2d5c240SBram Moolenaar vim9script 1112f2d5c240SBram Moolenaar import * from './Xexport.vim' 1113f2d5c240SBram Moolenaar END 1114f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1115f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1116f2d5c240SBram Moolenaar 1117f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1118fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1119fa29c8abSBram Moolenaar vim9script 1120fa29c8abSBram Moolenaar import name from './Xexport.vim' 1121fa29c8abSBram Moolenaar END 1122fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1123fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1124fa29c8abSBram Moolenaar 1125f5be8cdbSBram Moolenaar # try to import something that is already defined 11265269bd2aSBram Moolenaar let import_already_defined =<< trim END 11275269bd2aSBram Moolenaar vim9script 11285269bd2aSBram Moolenaar let exported = 'something' 11295269bd2aSBram Moolenaar import exported from './Xexport.vim' 11305269bd2aSBram Moolenaar END 11315269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 11325269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 11335269bd2aSBram Moolenaar 1134f5be8cdbSBram Moolenaar # try to import something that is already defined 11355269bd2aSBram Moolenaar import_already_defined =<< trim END 11365269bd2aSBram Moolenaar vim9script 11375269bd2aSBram Moolenaar let exported = 'something' 11385269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11395269bd2aSBram Moolenaar END 11405269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 11415269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 11425269bd2aSBram Moolenaar 1143f5be8cdbSBram Moolenaar # try to import something that is already defined 11445269bd2aSBram Moolenaar import_already_defined =<< trim END 11455269bd2aSBram Moolenaar vim9script 11465269bd2aSBram Moolenaar let exported = 'something' 11475269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11485269bd2aSBram Moolenaar END 11495269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 11505269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 11515269bd2aSBram Moolenaar 1152f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1153fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1154fa29c8abSBram Moolenaar vim9script 1155fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1156fa29c8abSBram Moolenaar END 1157fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1158fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1159fa29c8abSBram Moolenaar 1160fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1161fa29c8abSBram Moolenaar vim9script 1162fa29c8abSBram Moolenaar import name './Xexport.vim' 1163fa29c8abSBram Moolenaar END 1164fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1165fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1166fa29c8abSBram Moolenaar 1167fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1168fa29c8abSBram Moolenaar vim9script 1169fa29c8abSBram Moolenaar import name from Xexport.vim 1170fa29c8abSBram Moolenaar END 1171fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1172fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1173fa29c8abSBram Moolenaar 1174fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1175fa29c8abSBram Moolenaar vim9script 1176fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1177fa29c8abSBram Moolenaar END 1178fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1179fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1180fa29c8abSBram Moolenaar 1181fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1182fa29c8abSBram Moolenaar vim9script 1183fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1184fa29c8abSBram Moolenaar END 11855269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 11865269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1187fa29c8abSBram Moolenaar 1188f2d5c240SBram Moolenaar delete('Ximport.vim') 11895269bd2aSBram Moolenaar delete('Ximport3.vim') 11908a7d6542SBram Moolenaar delete('Xexport.vim') 11918a7d6542SBram Moolenaar 1192f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1193750802b5SBram Moolenaar set cpo&vi 1194750802b5SBram Moolenaar let cpo_before = &cpo 1195750802b5SBram Moolenaar let lines =<< trim END 1196750802b5SBram Moolenaar vim9script 1197750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1198750802b5SBram Moolenaar END 1199750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1200750802b5SBram Moolenaar source Xvim9_script 1201750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1202750802b5SBram Moolenaar set cpo&vim 1203750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1204750802b5SBram Moolenaar delete('Xvim9_script') 1205750802b5SBram Moolenaarenddef 1206750802b5SBram Moolenaar 1207750802b5SBram Moolenaardef Test_vim9script_fails() 12088a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12098a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1210750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 12119721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 12129b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1213750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1214750802b5SBram Moolenaar 1215c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1216c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1217c785b9a7SBram Moolenaar 1218750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1219a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 12208a7d6542SBram Moolenaarenddef 12218a7d6542SBram Moolenaar 1222f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1223101f4810SBram Moolenaar CheckRunVimInTerminal 1224101f4810SBram Moolenaar 12259bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1226c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 12279bb3eb3eSBram Moolenaarendfunc 12289bb3eb3eSBram Moolenaar 1229c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1230101f4810SBram Moolenaar let export =<< trim END 1231101f4810SBram Moolenaar vim9script 1232101f4810SBram Moolenaar export def Foo(): number 1233101f4810SBram Moolenaar return 0 1234101f4810SBram Moolenaar enddef 1235101f4810SBram Moolenaar END 12369bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1237101f4810SBram Moolenaar 12389bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 12399bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 12409bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1241101f4810SBram Moolenaar 12429bb3eb3eSBram Moolenaar delete('Xexport.vim') 12439bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 12449bb3eb3eSBram Moolenaarenddef 1245101f4810SBram Moolenaar 12464c17ad94SBram Moolenaardef Test_vim9script_reload_import() 12478a7d6542SBram Moolenaar let lines =<< trim END 12488a7d6542SBram Moolenaar vim9script 12498a7d6542SBram Moolenaar const var = '' 12508a7d6542SBram Moolenaar let valone = 1234 12518a7d6542SBram Moolenaar def MyFunc(arg: string) 12528a7d6542SBram Moolenaar valone = 5678 12538a7d6542SBram Moolenaar enddef 12548a7d6542SBram Moolenaar END 12558a7d6542SBram Moolenaar let morelines =<< trim END 12568a7d6542SBram Moolenaar let valtwo = 222 12578a7d6542SBram Moolenaar export def GetValtwo(): number 12588a7d6542SBram Moolenaar return valtwo 12598a7d6542SBram Moolenaar enddef 12608a7d6542SBram Moolenaar END 126103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 12628a7d6542SBram Moolenaar source Xreload.vim 12638a7d6542SBram Moolenaar source Xreload.vim 12648a7d6542SBram Moolenaar source Xreload.vim 12658a7d6542SBram Moolenaar 12668a7d6542SBram Moolenaar let testlines =<< trim END 12678a7d6542SBram Moolenaar vim9script 12688a7d6542SBram Moolenaar def TheFunc() 12698a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 12708a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 12718a7d6542SBram Moolenaar enddef 12728a7d6542SBram Moolenaar TheFunc() 12738a7d6542SBram Moolenaar END 12748a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 12758a7d6542SBram Moolenaar source Ximport.vim 12768a7d6542SBram Moolenaar 1277f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1278f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 12798a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12808a7d6542SBram Moolenaar source Ximport.vim 12818a7d6542SBram Moolenaar 1282f5be8cdbSBram Moolenaar # cannot declare a var twice 12838a7d6542SBram Moolenaar lines =<< trim END 12848a7d6542SBram Moolenaar vim9script 12858a7d6542SBram Moolenaar let valone = 1234 12868a7d6542SBram Moolenaar let valone = 5678 12878a7d6542SBram Moolenaar END 12888a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12898a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 12908a7d6542SBram Moolenaar 12918a7d6542SBram Moolenaar delete('Xreload.vim') 12928a7d6542SBram Moolenaar delete('Ximport.vim') 12938a7d6542SBram Moolenaarenddef 12948a7d6542SBram Moolenaar 1295fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1296fe465a01SBram Moolenaar" script-local name. 1297fe465a01SBram Moolenaardef Test_vim9script_funcref() 1298fe465a01SBram Moolenaar let sortlines =<< trim END 1299fe465a01SBram Moolenaar vim9script 1300fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1301bed36b93SBram Moolenaar return i2 - i1 1302fe465a01SBram Moolenaar enddef 1303fe465a01SBram Moolenaar 1304fe465a01SBram Moolenaar export def FastSort(): list<number> 1305fe465a01SBram Moolenaar return range(5)->sort(Compare) 1306fe465a01SBram Moolenaar enddef 1307fe465a01SBram Moolenaar END 1308fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1309fe465a01SBram Moolenaar 1310fe465a01SBram Moolenaar let lines =<< trim END 1311fe465a01SBram Moolenaar vim9script 1312fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1313fe465a01SBram Moolenaar def Test() 1314fe465a01SBram Moolenaar g:result = FastSort() 1315fe465a01SBram Moolenaar enddef 1316fe465a01SBram Moolenaar Test() 1317fe465a01SBram Moolenaar END 1318fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1319fe465a01SBram Moolenaar 1320fe465a01SBram Moolenaar source Xscript.vim 1321fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1322fe465a01SBram Moolenaar 1323fe465a01SBram Moolenaar unlet g:result 1324fe465a01SBram Moolenaar delete('Xsort.vim') 1325fe465a01SBram Moolenaar delete('Xscript.vim') 1326fe465a01SBram Moolenaarenddef 1327fe465a01SBram Moolenaar 1328c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1329c620c055SBram Moolenaar" script where FastFilter() is called from. 1330c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1331c620c055SBram Moolenaar let filterLines =<< trim END 1332c620c055SBram Moolenaar vim9script 1333c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1334c620c055SBram Moolenaar return idx % 2 == 1 1335c620c055SBram Moolenaar enddef 1336c620c055SBram Moolenaar export def FastFilter(): list<number> 1337c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1338c620c055SBram Moolenaar enddef 1339c620c055SBram Moolenaar END 1340c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1341c620c055SBram Moolenaar 1342c620c055SBram Moolenaar let lines =<< trim END 1343c620c055SBram Moolenaar vim9script 1344c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1345c620c055SBram Moolenaar def Test() 1346c620c055SBram Moolenaar let x: list<number> = FastFilter() 1347c620c055SBram Moolenaar enddef 1348c620c055SBram Moolenaar Test() 1349c620c055SBram Moolenaar END 1350c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1351c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1352c620c055SBram Moolenaar 1353c620c055SBram Moolenaar delete('Xfilter.vim') 1354c620c055SBram Moolenaar delete('Ximport.vim') 1355c620c055SBram Moolenaarenddef 1356c620c055SBram Moolenaar 13574c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 13584c17ad94SBram Moolenaar let first_lines =<< trim END 13594c17ad94SBram Moolenaar vim9script 13604c17ad94SBram Moolenaar def FuncYes(): string 13614c17ad94SBram Moolenaar return 'yes' 13624c17ad94SBram Moolenaar enddef 13634c17ad94SBram Moolenaar END 136403afdcf1SBram Moolenaar let withno_lines =<< trim END 13654c17ad94SBram Moolenaar def FuncNo(): string 13664c17ad94SBram Moolenaar return 'no' 13674c17ad94SBram Moolenaar enddef 13684c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 13694c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 13704c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 137103afdcf1SBram Moolenaar enddef 137203afdcf1SBram Moolenaar END 137303afdcf1SBram Moolenaar let nono_lines =<< trim END 137403afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 137503afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 13764c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 13774c17ad94SBram Moolenaar enddef 13784c17ad94SBram Moolenaar END 13794c17ad94SBram Moolenaar 13804c17ad94SBram Moolenaar # FuncNo() is defined 138103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13824c17ad94SBram Moolenaar source Xreloaded.vim 13834c17ad94SBram Moolenaar g:DoCheck(true) 13844c17ad94SBram Moolenaar 13854c17ad94SBram Moolenaar # FuncNo() is not redefined 138603afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 13874c17ad94SBram Moolenaar source Xreloaded.vim 138803afdcf1SBram Moolenaar g:DoCheck() 13894c17ad94SBram Moolenaar 13904c17ad94SBram Moolenaar # FuncNo() is back 139103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13924c17ad94SBram Moolenaar source Xreloaded.vim 139303afdcf1SBram Moolenaar g:DoCheck() 13944c17ad94SBram Moolenaar 13954c17ad94SBram Moolenaar delete('Xreloaded.vim') 13964c17ad94SBram Moolenaarenddef 13974c17ad94SBram Moolenaar 139889483d40SBram Moolenaardef Test_vim9script_reload_delvar() 139989483d40SBram Moolenaar # write the script with a script-local variable 140089483d40SBram Moolenaar let lines =<< trim END 140189483d40SBram Moolenaar vim9script 140289483d40SBram Moolenaar let var = 'string' 140389483d40SBram Moolenaar END 140489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 140589483d40SBram Moolenaar source XreloadVar.vim 140689483d40SBram Moolenaar 140789483d40SBram Moolenaar # now write the script using the same variable locally - works 140889483d40SBram Moolenaar lines =<< trim END 140989483d40SBram Moolenaar vim9script 141089483d40SBram Moolenaar def Func() 141189483d40SBram Moolenaar let var = 'string' 141289483d40SBram Moolenaar enddef 141389483d40SBram Moolenaar END 141489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 141589483d40SBram Moolenaar source XreloadVar.vim 141689483d40SBram Moolenaar 141789483d40SBram Moolenaar delete('XreloadVar.vim') 141889483d40SBram Moolenaarenddef 141989483d40SBram Moolenaar 14208a7d6542SBram Moolenaardef Test_import_absolute() 14218a7d6542SBram Moolenaar let import_lines = [ 1422e6085c53SBram Moolenaar 'vim9script', 1423e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1424e6085c53SBram Moolenaar 'def UseExported()', 1425e6085c53SBram Moolenaar ' g:imported_abs = exported', 1426e6085c53SBram Moolenaar ' exported = 8888', 1427e6085c53SBram Moolenaar ' g:imported_after = exported', 1428e6085c53SBram Moolenaar 'enddef', 1429e6085c53SBram Moolenaar 'UseExported()', 1430e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1431e6085c53SBram Moolenaar ] 14328a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 14338a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 14348a7d6542SBram Moolenaar 14358a7d6542SBram Moolenaar source Ximport_abs.vim 14368a7d6542SBram Moolenaar 14378a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 14384e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1439675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1440675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1441675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1442675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1443675f716eSBram Moolenaar 'exported = 8888.*' .. 1444675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1445675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1446675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1447675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1448e6085c53SBram Moolenaar g:import_disassembled) 14498a7d6542SBram Moolenaar unlet g:imported_abs 14504e12a5dfSBram Moolenaar unlet g:import_disassembled 14518a7d6542SBram Moolenaar 14528a7d6542SBram Moolenaar delete('Ximport_abs.vim') 14538a7d6542SBram Moolenaar delete('Xexport_abs.vim') 14548a7d6542SBram Moolenaarenddef 14558a7d6542SBram Moolenaar 14568a7d6542SBram Moolenaardef Test_import_rtp() 14578a7d6542SBram Moolenaar let import_lines = [ 1458e6085c53SBram Moolenaar 'vim9script', 1459e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1460e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1461e6085c53SBram Moolenaar ] 14628a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 14638a7d6542SBram Moolenaar mkdir('import') 14648a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 14658a7d6542SBram Moolenaar 14668a7d6542SBram Moolenaar let save_rtp = &rtp 14678a7d6542SBram Moolenaar &rtp = getcwd() 14688a7d6542SBram Moolenaar source Ximport_rtp.vim 14698a7d6542SBram Moolenaar &rtp = save_rtp 14708a7d6542SBram Moolenaar 14718a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 14728a7d6542SBram Moolenaar unlet g:imported_rtp 14738a7d6542SBram Moolenaar 14748a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 147589483d40SBram Moolenaar delete('import', 'rf') 14768a7d6542SBram Moolenaarenddef 14778a7d6542SBram Moolenaar 147825e0f586SBram Moolenaardef Test_import_compile_error() 147925e0f586SBram Moolenaar let export_lines = [ 148025e0f586SBram Moolenaar 'vim9script', 148125e0f586SBram Moolenaar 'export def ExpFunc(): string', 148225e0f586SBram Moolenaar ' return notDefined', 148325e0f586SBram Moolenaar 'enddef', 148425e0f586SBram Moolenaar ] 148525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 148625e0f586SBram Moolenaar 148725e0f586SBram Moolenaar let import_lines = [ 148825e0f586SBram Moolenaar 'vim9script', 148925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 149025e0f586SBram Moolenaar 'def ImpFunc()', 149125e0f586SBram Moolenaar ' echo ExpFunc()', 149225e0f586SBram Moolenaar 'enddef', 149325e0f586SBram Moolenaar 'defcompile', 149425e0f586SBram Moolenaar ] 149525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 149625e0f586SBram Moolenaar 149725e0f586SBram Moolenaar try 149825e0f586SBram Moolenaar source Ximport.vim 149925e0f586SBram Moolenaar catch /E1001/ 1500f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 150125e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 150225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 150325e0f586SBram Moolenaar endtry 150425e0f586SBram Moolenaar 150525e0f586SBram Moolenaar delete('Xexported.vim') 150625e0f586SBram Moolenaar delete('Ximport.vim') 150725e0f586SBram Moolenaarenddef 150825e0f586SBram Moolenaar 15098a7d6542SBram Moolenaardef Test_fixed_size_list() 1510f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 15118a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 15128a7d6542SBram Moolenaar l->remove(0) 15138a7d6542SBram Moolenaar l->add(5) 15148a7d6542SBram Moolenaar l->insert(99, 1) 15150f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 15168a7d6542SBram Moolenaarenddef 15178a7d6542SBram Moolenaar 1518*ae616494SBram Moolenaardef Test_no_insert_xit() 1519*ae616494SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1520*ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1521*ae616494SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1522*ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1523*ae616494SBram Moolenaar 1524*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1525*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1526*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1527*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1528*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1529*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1530*ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1531*ae616494SBram Moolenaarenddef 1532*ae616494SBram Moolenaar 1533158906cfSBram Moolenaardef IfElse(what: number): string 1534158906cfSBram Moolenaar let res = '' 1535158906cfSBram Moolenaar if what == 1 1536158906cfSBram Moolenaar res = "one" 1537158906cfSBram Moolenaar elseif what == 2 1538158906cfSBram Moolenaar res = "two" 1539a259d8d3SBram Moolenaar else 1540158906cfSBram Moolenaar res = "three" 1541a259d8d3SBram Moolenaar endif 1542158906cfSBram Moolenaar return res 1543a259d8d3SBram Moolenaarenddef 1544a259d8d3SBram Moolenaar 1545158906cfSBram Moolenaardef Test_if_elseif_else() 1546158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1547158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1548158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 15490f18b6d1SBram Moolenaarenddef 15500f18b6d1SBram Moolenaar 1551e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1552e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1553e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1554e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1555e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1556585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1557e8c4abbbSBram Moolenaarenddef 1558e8c4abbbSBram Moolenaar 15596d69bf60SBram Moolenaarlet g:bool_true = v:true 15606d69bf60SBram Moolenaarlet g:bool_false = v:false 15616d69bf60SBram Moolenaar 15626d69bf60SBram Moolenaardef Test_if_const_expr() 15636d69bf60SBram Moolenaar let res = false 15646d69bf60SBram Moolenaar if true ? true : false 15656d69bf60SBram Moolenaar res = true 15666d69bf60SBram Moolenaar endif 15676d69bf60SBram Moolenaar assert_equal(true, res) 15686d69bf60SBram Moolenaar 1569585fea7bSBram Moolenaar g:glob = 2 1570585fea7bSBram Moolenaar if false 15716797966dSBram Moolenaar execute('g:glob = 3') 1572585fea7bSBram Moolenaar endif 1573585fea7bSBram Moolenaar assert_equal(2, g:glob) 1574585fea7bSBram Moolenaar if true 15756797966dSBram Moolenaar execute('g:glob = 3') 1576585fea7bSBram Moolenaar endif 1577585fea7bSBram Moolenaar assert_equal(3, g:glob) 1578585fea7bSBram Moolenaar 15796d69bf60SBram Moolenaar res = false 15806d69bf60SBram Moolenaar if g:bool_true ? true : false 15816d69bf60SBram Moolenaar res = true 15826d69bf60SBram Moolenaar endif 15836d69bf60SBram Moolenaar assert_equal(true, res) 15846d69bf60SBram Moolenaar 15856d69bf60SBram Moolenaar res = false 15866d69bf60SBram Moolenaar if true ? g:bool_true : false 15876d69bf60SBram Moolenaar res = true 15886d69bf60SBram Moolenaar endif 15896d69bf60SBram Moolenaar assert_equal(true, res) 15906d69bf60SBram Moolenaar 15916d69bf60SBram Moolenaar res = false 15926d69bf60SBram Moolenaar if true ? true : g:bool_false 15936d69bf60SBram Moolenaar res = true 15946d69bf60SBram Moolenaar endif 15956d69bf60SBram Moolenaar assert_equal(true, res) 15966d69bf60SBram Moolenaar 15976d69bf60SBram Moolenaar res = false 15986d69bf60SBram Moolenaar if true ? false : true 15996d69bf60SBram Moolenaar res = true 16006d69bf60SBram Moolenaar endif 16016d69bf60SBram Moolenaar assert_equal(false, res) 16026d69bf60SBram Moolenaar 16036d69bf60SBram Moolenaar res = false 16046d69bf60SBram Moolenaar if false ? false : true 16056d69bf60SBram Moolenaar res = true 16066d69bf60SBram Moolenaar endif 16076d69bf60SBram Moolenaar assert_equal(true, res) 16086d69bf60SBram Moolenaar 16096d69bf60SBram Moolenaar res = false 16106d69bf60SBram Moolenaar if false ? true : false 16116d69bf60SBram Moolenaar res = true 16126d69bf60SBram Moolenaar endif 16136d69bf60SBram Moolenaar assert_equal(false, res) 16146d69bf60SBram Moolenaar 16156d69bf60SBram Moolenaar res = false 1616e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1617e8c4abbbSBram Moolenaar res = true 1618e8c4abbbSBram Moolenaar endif 1619e8c4abbbSBram Moolenaar assert_equal(false, res) 1620e8c4abbbSBram Moolenaar 1621e8c4abbbSBram Moolenaar res = false 16226d69bf60SBram Moolenaar if true && true 16236d69bf60SBram Moolenaar res = true 16246d69bf60SBram Moolenaar endif 16256d69bf60SBram Moolenaar assert_equal(true, res) 16266d69bf60SBram Moolenaar 16276d69bf60SBram Moolenaar res = false 16286d69bf60SBram Moolenaar if true && false 16296d69bf60SBram Moolenaar res = true 16306d69bf60SBram Moolenaar endif 16316d69bf60SBram Moolenaar assert_equal(false, res) 16326d69bf60SBram Moolenaar 16336d69bf60SBram Moolenaar res = false 16346d69bf60SBram Moolenaar if g:bool_true && false 16356d69bf60SBram Moolenaar res = true 16366d69bf60SBram Moolenaar endif 16376d69bf60SBram Moolenaar assert_equal(false, res) 16386d69bf60SBram Moolenaar 16396d69bf60SBram Moolenaar res = false 16406d69bf60SBram Moolenaar if true && g:bool_false 16416d69bf60SBram Moolenaar res = true 16426d69bf60SBram Moolenaar endif 16436d69bf60SBram Moolenaar assert_equal(false, res) 16446d69bf60SBram Moolenaar 16456d69bf60SBram Moolenaar res = false 16466d69bf60SBram Moolenaar if false && false 16476d69bf60SBram Moolenaar res = true 16486d69bf60SBram Moolenaar endif 16496d69bf60SBram Moolenaar assert_equal(false, res) 16506d69bf60SBram Moolenaar 16516d69bf60SBram Moolenaar res = false 16526d69bf60SBram Moolenaar if true || false 16536d69bf60SBram Moolenaar res = true 16546d69bf60SBram Moolenaar endif 16556d69bf60SBram Moolenaar assert_equal(true, res) 16566d69bf60SBram Moolenaar 16576d69bf60SBram Moolenaar res = false 16586d69bf60SBram Moolenaar if g:bool_true || false 16596d69bf60SBram Moolenaar res = true 16606d69bf60SBram Moolenaar endif 16616d69bf60SBram Moolenaar assert_equal(true, res) 16626d69bf60SBram Moolenaar 16636d69bf60SBram Moolenaar res = false 16646d69bf60SBram Moolenaar if true || g:bool_false 16656d69bf60SBram Moolenaar res = true 16666d69bf60SBram Moolenaar endif 16676d69bf60SBram Moolenaar assert_equal(true, res) 16686d69bf60SBram Moolenaar 16696d69bf60SBram Moolenaar res = false 16706d69bf60SBram Moolenaar if false || false 16716d69bf60SBram Moolenaar res = true 16726d69bf60SBram Moolenaar endif 16736d69bf60SBram Moolenaar assert_equal(false, res) 167480c34ca3SBram Moolenaarenddef 16756d69bf60SBram Moolenaar 167680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 167780c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 167880c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1679e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1680e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16816d69bf60SBram Moolenaarenddef 16826d69bf60SBram Moolenaar 168372abcf42SBram Moolenaardef RunNested(i: number): number 168472abcf42SBram Moolenaar let x: number = 0 168572abcf42SBram Moolenaar if i % 2 168672abcf42SBram Moolenaar if 1 1687f5be8cdbSBram Moolenaar # comment 168872abcf42SBram Moolenaar else 1689f5be8cdbSBram Moolenaar # comment 169072abcf42SBram Moolenaar endif 169172abcf42SBram Moolenaar x += 1 169272abcf42SBram Moolenaar else 169372abcf42SBram Moolenaar x += 1000 169472abcf42SBram Moolenaar endif 169572abcf42SBram Moolenaar return x 169672abcf42SBram Moolenaarenddef 169772abcf42SBram Moolenaar 169872abcf42SBram Moolenaardef Test_nested_if() 169972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 170072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 170172abcf42SBram Moolenaarenddef 170272abcf42SBram Moolenaar 1703ad39c094SBram Moolenaardef Test_execute_cmd() 1704ad39c094SBram Moolenaar new 1705ad39c094SBram Moolenaar setline(1, 'default') 1706ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1707ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1708a72cfb80SBram Moolenaar 1709a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1710a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1711a72cfb80SBram Moolenaar 1712ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1713ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1714a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1715ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1716a72cfb80SBram Moolenaar 1717ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1718ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1719a72cfb80SBram Moolenaar 1720ad39c094SBram Moolenaar let cmd_first = 'call ' 1721ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1722ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1723ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1724ad39c094SBram Moolenaar bwipe! 1725585fea7bSBram Moolenaar 17262d6b20d6SBram Moolenaar let n = true 17272d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 17282d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 17292d6b20d6SBram Moolenaar 1730585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1731a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1732ad39c094SBram Moolenaarenddef 1733ad39c094SBram Moolenaar 173447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1735f5be8cdbSBram Moolenaar # only checks line continuation 173647e880d6SBram Moolenaar let lines =<< trim END 173747e880d6SBram Moolenaar vim9script 173847e880d6SBram Moolenaar execute 'g:someVar' 173947e880d6SBram Moolenaar .. ' = ' .. 174047e880d6SBram Moolenaar '28' 174147e880d6SBram Moolenaar assert_equal(28, g:someVar) 174247e880d6SBram Moolenaar unlet g:someVar 174347e880d6SBram Moolenaar END 174447e880d6SBram Moolenaar CheckScriptSuccess(lines) 174547e880d6SBram Moolenaarenddef 174647e880d6SBram Moolenaar 1747ad39c094SBram Moolenaardef Test_echo_cmd() 1748a72cfb80SBram Moolenaar echo 'some' # comment 1749585fea7bSBram Moolenaar echon 'thing' 1750ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1751ad39c094SBram Moolenaar 1752a72cfb80SBram Moolenaar echo "some" # comment 1753a72cfb80SBram Moolenaar echon "thing" 1754a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1755a72cfb80SBram Moolenaar 1756ad39c094SBram Moolenaar let str1 = 'some' 1757ad39c094SBram Moolenaar let str2 = 'more' 1758ad39c094SBram Moolenaar echo str1 str2 1759ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1760a72cfb80SBram Moolenaar 1761a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1762ad39c094SBram Moolenaarenddef 1763ad39c094SBram Moolenaar 1764f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1765f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1766f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1767f93c7feaSBram Moolenaar echo 'clear' 1768df069eecSBram Moolenaar :1messages 1769f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1770f93c7feaSBram Moolenaar 1771f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1772f93c7feaSBram Moolenaarenddef 1773f93c7feaSBram Moolenaar 177447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1775f5be8cdbSBram Moolenaar # only checks line continuation 177647e880d6SBram Moolenaar let lines =<< trim END 177747e880d6SBram Moolenaar vim9script 177847e880d6SBram Moolenaar echomsg 'here' 177947e880d6SBram Moolenaar .. ' is ' .. 178047e880d6SBram Moolenaar 'a message' 178147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 178247e880d6SBram Moolenaar END 178347e880d6SBram Moolenaar CheckScriptSuccess(lines) 178447e880d6SBram Moolenaarenddef 178547e880d6SBram Moolenaar 1786f93c7feaSBram Moolenaardef Test_echoerr_cmd() 178740ee466cSBram Moolenaar try 178840ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 178940ee466cSBram Moolenaar catch 179040ee466cSBram Moolenaar assert_match('something wrong', v:exception) 179140ee466cSBram Moolenaar endtry 1792f93c7feaSBram Moolenaarenddef 1793f93c7feaSBram Moolenaar 179447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1795f5be8cdbSBram Moolenaar # only checks line continuation 179647e880d6SBram Moolenaar let lines =<< trim END 179747e880d6SBram Moolenaar vim9script 179847e880d6SBram Moolenaar try 179947e880d6SBram Moolenaar echoerr 'this' 180047e880d6SBram Moolenaar .. ' is ' .. 180147e880d6SBram Moolenaar 'wrong' 180247e880d6SBram Moolenaar catch 180347e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 180447e880d6SBram Moolenaar endtry 180547e880d6SBram Moolenaar END 180647e880d6SBram Moolenaar CheckScriptSuccess(lines) 180747e880d6SBram Moolenaarenddef 180847e880d6SBram Moolenaar 180941fe0617SBram Moolenaardef Test_for_outside_of_function() 181041fe0617SBram Moolenaar let lines =<< trim END 181141fe0617SBram Moolenaar vim9script 181241fe0617SBram Moolenaar new 181341fe0617SBram Moolenaar for var in range(0, 3) 181441fe0617SBram Moolenaar append(line('$'), var) 181541fe0617SBram Moolenaar endfor 181641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 181741fe0617SBram Moolenaar bwipe! 181841fe0617SBram Moolenaar END 181941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 182041fe0617SBram Moolenaar source Xvim9for.vim 182141fe0617SBram Moolenaar delete('Xvim9for.vim') 182241fe0617SBram Moolenaarenddef 18238a7d6542SBram Moolenaar 1824e8c4abbbSBram Moolenaardef Test_for_loop() 1825e8c4abbbSBram Moolenaar let result = '' 1826e8c4abbbSBram Moolenaar for cnt in range(7) 1827e8c4abbbSBram Moolenaar if cnt == 4 1828e8c4abbbSBram Moolenaar break 1829e8c4abbbSBram Moolenaar endif 1830e8c4abbbSBram Moolenaar if cnt == 2 1831e8c4abbbSBram Moolenaar continue 1832e8c4abbbSBram Moolenaar endif 1833e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1834e8c4abbbSBram Moolenaar endfor 1835e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 18360ad3e894SBram Moolenaar 18370ad3e894SBram Moolenaar let concat = '' 18380ad3e894SBram Moolenaar for str in eval('["one", "two"]') 18390ad3e894SBram Moolenaar concat ..= str 18400ad3e894SBram Moolenaar endfor 18410ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1842e8c4abbbSBram Moolenaarenddef 1843e8c4abbbSBram Moolenaar 1844e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1845675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1846675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1847675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1848822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 18490ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1850675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1851675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1852675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1853e8c4abbbSBram Moolenaarenddef 1854e8c4abbbSBram Moolenaar 1855d0df1aacSBram Moolenaardef Test_while_loop() 1856d0df1aacSBram Moolenaar let result = '' 1857d0df1aacSBram Moolenaar let cnt = 0 1858d0df1aacSBram Moolenaar while cnt < 555 1859d0df1aacSBram Moolenaar if cnt == 3 1860d0df1aacSBram Moolenaar break 1861d0df1aacSBram Moolenaar endif 1862d0df1aacSBram Moolenaar cnt += 1 1863d0df1aacSBram Moolenaar if cnt == 2 1864d0df1aacSBram Moolenaar continue 1865d0df1aacSBram Moolenaar endif 1866d0df1aacSBram Moolenaar result ..= cnt .. '_' 1867d0df1aacSBram Moolenaar endwhile 1868d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1869d0df1aacSBram Moolenaarenddef 1870d0df1aacSBram Moolenaar 1871e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1872675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1873675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1874675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1875675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1876675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1877675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1878675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1879bd5da371SBram Moolenaarenddef 1880bd5da371SBram Moolenaar 18819645e2d9SBram Moolenaardef Test_interrupt_loop() 188297acfc78SBram Moolenaar let caught = false 18839645e2d9SBram Moolenaar let x = 0 188497acfc78SBram Moolenaar try 18859645e2d9SBram Moolenaar while 1 18869645e2d9SBram Moolenaar x += 1 18879645e2d9SBram Moolenaar if x == 100 18889645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 18899645e2d9SBram Moolenaar endif 18909645e2d9SBram Moolenaar endwhile 189197acfc78SBram Moolenaar catch 189297acfc78SBram Moolenaar caught = true 189397acfc78SBram Moolenaar assert_equal(100, x) 189497acfc78SBram Moolenaar endtry 189597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 18969645e2d9SBram Moolenaarenddef 189720431c9dSBram Moolenaar 18984fdae999SBram Moolenaardef Test_automatic_line_continuation() 18994fdae999SBram Moolenaar let mylist = [ 19004fdae999SBram Moolenaar 'one', 19014fdae999SBram Moolenaar 'two', 19024fdae999SBram Moolenaar 'three', 1903f5be8cdbSBram Moolenaar ] # comment 19044fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 19054fdae999SBram Moolenaar 19064fdae999SBram Moolenaar let mydict = { 19074fdae999SBram Moolenaar 'one': 1, 19084fdae999SBram Moolenaar 'two': 2, 19094fdae999SBram Moolenaar 'three': 19104fdae999SBram Moolenaar 3, 1911f5be8cdbSBram Moolenaar } # comment 19124fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 19134fdae999SBram Moolenaar mydict = #{ 19142c330432SBram Moolenaar one: 1, # comment 19152c330432SBram Moolenaar two: # comment 19162c330432SBram Moolenaar 2, # comment 19172c330432SBram Moolenaar three: 3 # comment 19182c330432SBram Moolenaar } 19192c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 19202c330432SBram Moolenaar mydict = #{ 19212c330432SBram Moolenaar one: 1, 19224fdae999SBram Moolenaar two: 19234fdae999SBram Moolenaar 2, 19242c330432SBram Moolenaar three: 3 19254fdae999SBram Moolenaar } 19264fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1927e6085c53SBram Moolenaar 1928e6085c53SBram Moolenaar assert_equal( 1929e6085c53SBram Moolenaar ['one', 'two', 'three'], 1930e6085c53SBram Moolenaar split('one two three') 1931e6085c53SBram Moolenaar ) 19324fdae999SBram Moolenaarenddef 19334fdae999SBram Moolenaar 19347a092245SBram Moolenaardef Test_vim9_comment() 19357a092245SBram Moolenaar CheckScriptSuccess([ 19367a092245SBram Moolenaar 'vim9script', 19377a092245SBram Moolenaar '# something', 19387a092245SBram Moolenaar ]) 19397a092245SBram Moolenaar CheckScriptFailure([ 19407a092245SBram Moolenaar 'vim9script', 19417a092245SBram Moolenaar ':# something', 19427a092245SBram Moolenaar ], 'E488:') 19437a092245SBram Moolenaar CheckScriptFailure([ 19447a092245SBram Moolenaar '# something', 19457a092245SBram Moolenaar ], 'E488:') 19467a092245SBram Moolenaar CheckScriptFailure([ 19477a092245SBram Moolenaar ':# something', 19487a092245SBram Moolenaar ], 'E488:') 19497a092245SBram Moolenaar 19504a8d9f2eSBram Moolenaar { # block start 19514a8d9f2eSBram Moolenaar } # block end 19524a8d9f2eSBram Moolenaar CheckDefFailure([ 19534a8d9f2eSBram Moolenaar '{# comment', 19544a8d9f2eSBram Moolenaar ], 'E488:') 19554a8d9f2eSBram Moolenaar CheckDefFailure([ 19564a8d9f2eSBram Moolenaar '{', 19574a8d9f2eSBram Moolenaar '}# comment', 19584a8d9f2eSBram Moolenaar ], 'E488:') 19594a8d9f2eSBram Moolenaar 19604a8d9f2eSBram Moolenaar echo "yes" # comment 19614a8d9f2eSBram Moolenaar CheckDefFailure([ 19624a8d9f2eSBram Moolenaar 'echo "yes"# comment', 19634a8d9f2eSBram Moolenaar ], 'E488:') 19647a092245SBram Moolenaar CheckScriptSuccess([ 19657a092245SBram Moolenaar 'vim9script', 19667a092245SBram Moolenaar 'echo "yes" # something', 19677a092245SBram Moolenaar ]) 19687a092245SBram Moolenaar CheckScriptFailure([ 19697a092245SBram Moolenaar 'vim9script', 19707a092245SBram Moolenaar 'echo "yes"# something', 19717a092245SBram Moolenaar ], 'E121:') 19727a092245SBram Moolenaar CheckScriptFailure([ 19737a092245SBram Moolenaar 'vim9script', 19747a092245SBram Moolenaar 'echo# something', 19757a092245SBram Moolenaar ], 'E121:') 19767a092245SBram Moolenaar CheckScriptFailure([ 19777a092245SBram Moolenaar 'echo "yes" # something', 19787a092245SBram Moolenaar ], 'E121:') 19797a092245SBram Moolenaar 19804a8d9f2eSBram Moolenaar exe "echo" # comment 19814a8d9f2eSBram Moolenaar CheckDefFailure([ 19824a8d9f2eSBram Moolenaar 'exe "echo"# comment', 19834a8d9f2eSBram Moolenaar ], 'E488:') 19844a8d9f2eSBram Moolenaar CheckScriptSuccess([ 19854a8d9f2eSBram Moolenaar 'vim9script', 19864a8d9f2eSBram Moolenaar 'exe "echo" # something', 19874a8d9f2eSBram Moolenaar ]) 19884a8d9f2eSBram Moolenaar CheckScriptFailure([ 19894a8d9f2eSBram Moolenaar 'vim9script', 19904a8d9f2eSBram Moolenaar 'exe "echo"# something', 19914a8d9f2eSBram Moolenaar ], 'E121:') 19924a8d9f2eSBram Moolenaar CheckDefFailure([ 19934a8d9f2eSBram Moolenaar 'exe # comment', 19944a8d9f2eSBram Moolenaar ], 'E1015:') 19954a8d9f2eSBram Moolenaar CheckScriptFailure([ 19964a8d9f2eSBram Moolenaar 'vim9script', 19974a8d9f2eSBram Moolenaar 'exe# something', 19984a8d9f2eSBram Moolenaar ], 'E121:') 19994a8d9f2eSBram Moolenaar CheckScriptFailure([ 20004a8d9f2eSBram Moolenaar 'exe "echo" # something', 20014a8d9f2eSBram Moolenaar ], 'E121:') 20024a8d9f2eSBram Moolenaar 20037a092245SBram Moolenaar CheckDefFailure([ 20047a092245SBram Moolenaar 'try# comment', 20057a092245SBram Moolenaar ' echo "yes"', 20067a092245SBram Moolenaar 'catch', 20077a092245SBram Moolenaar 'endtry', 20087a092245SBram Moolenaar ], 'E488:') 20092c5ed4e3SBram Moolenaar CheckScriptFailure([ 20102c5ed4e3SBram Moolenaar 'vim9script', 20112c5ed4e3SBram Moolenaar 'try# comment', 20122c5ed4e3SBram Moolenaar 'echo "yes"', 20132c5ed4e3SBram Moolenaar ], 'E488:') 20147a092245SBram Moolenaar CheckDefFailure([ 20157a092245SBram Moolenaar 'try', 2016a72cfb80SBram Moolenaar ' throw#comment', 2017a72cfb80SBram Moolenaar 'catch', 2018a72cfb80SBram Moolenaar 'endtry', 2019a72cfb80SBram Moolenaar ], 'E1015:') 2020a72cfb80SBram Moolenaar CheckDefFailure([ 2021a72cfb80SBram Moolenaar 'try', 2022a72cfb80SBram Moolenaar ' throw "yes"#comment', 2023a72cfb80SBram Moolenaar 'catch', 2024a72cfb80SBram Moolenaar 'endtry', 2025a72cfb80SBram Moolenaar ], 'E488:') 2026a72cfb80SBram Moolenaar CheckDefFailure([ 2027a72cfb80SBram Moolenaar 'try', 20287a092245SBram Moolenaar ' echo "yes"', 20297a092245SBram Moolenaar 'catch# comment', 20307a092245SBram Moolenaar 'endtry', 20317a092245SBram Moolenaar ], 'E488:') 20322c5ed4e3SBram Moolenaar CheckScriptFailure([ 20332c5ed4e3SBram Moolenaar 'vim9script', 20342c5ed4e3SBram Moolenaar 'try', 20352c5ed4e3SBram Moolenaar ' echo "yes"', 20362c5ed4e3SBram Moolenaar 'catch# comment', 20372c5ed4e3SBram Moolenaar 'endtry', 20382c5ed4e3SBram Moolenaar ], 'E654:') 20392c5ed4e3SBram Moolenaar CheckDefFailure([ 20402c5ed4e3SBram Moolenaar 'try', 20412c5ed4e3SBram Moolenaar ' echo "yes"', 20422c5ed4e3SBram Moolenaar 'catch /pat/# comment', 20432c5ed4e3SBram Moolenaar 'endtry', 20442c5ed4e3SBram Moolenaar ], 'E488:') 20457a092245SBram Moolenaar CheckDefFailure([ 20467a092245SBram Moolenaar 'try', 20477a092245SBram Moolenaar 'echo "yes"', 20487a092245SBram Moolenaar 'catch', 20497a092245SBram Moolenaar 'endtry# comment', 20507a092245SBram Moolenaar ], 'E488:') 20512c5ed4e3SBram Moolenaar CheckScriptFailure([ 20522c5ed4e3SBram Moolenaar 'vim9script', 20532c5ed4e3SBram Moolenaar 'try', 20542c5ed4e3SBram Moolenaar ' echo "yes"', 20552c5ed4e3SBram Moolenaar 'catch', 20562c5ed4e3SBram Moolenaar 'endtry# comment', 20579b7bf9e9SBram Moolenaar ], 'E488:') 20582c5ed4e3SBram Moolenaar 20592c5ed4e3SBram Moolenaar CheckScriptSuccess([ 20602c5ed4e3SBram Moolenaar 'vim9script', 20612c5ed4e3SBram Moolenaar 'hi # comment', 20622c5ed4e3SBram Moolenaar ]) 20632c5ed4e3SBram Moolenaar CheckScriptFailure([ 20642c5ed4e3SBram Moolenaar 'vim9script', 20652c5ed4e3SBram Moolenaar 'hi# comment', 20662c5ed4e3SBram Moolenaar ], 'E416:') 20671966c248SBram Moolenaar CheckScriptSuccess([ 20681966c248SBram Moolenaar 'vim9script', 20691966c248SBram Moolenaar 'hi Search # comment', 20701966c248SBram Moolenaar ]) 20711966c248SBram Moolenaar CheckScriptFailure([ 20721966c248SBram Moolenaar 'vim9script', 20731966c248SBram Moolenaar 'hi Search# comment', 20741966c248SBram Moolenaar ], 'E416:') 20751966c248SBram Moolenaar CheckScriptSuccess([ 20761966c248SBram Moolenaar 'vim9script', 20771966c248SBram Moolenaar 'hi link This Search # comment', 20781966c248SBram Moolenaar ]) 20791966c248SBram Moolenaar CheckScriptFailure([ 20801966c248SBram Moolenaar 'vim9script', 20811966c248SBram Moolenaar 'hi link This That# comment', 20821966c248SBram Moolenaar ], 'E413:') 20831966c248SBram Moolenaar CheckScriptSuccess([ 20841966c248SBram Moolenaar 'vim9script', 20851966c248SBram Moolenaar 'hi clear This # comment', 20861966c248SBram Moolenaar 'hi clear # comment', 20871966c248SBram Moolenaar ]) 2088f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2089f5be8cdbSBram Moolenaar # hi clear This# comment', 20901966c248SBram Moolenaar CheckScriptFailure([ 20911966c248SBram Moolenaar 'vim9script', 20921966c248SBram Moolenaar 'hi clear# comment', 20931966c248SBram Moolenaar ], 'E416:') 20941966c248SBram Moolenaar 20951966c248SBram Moolenaar CheckScriptSuccess([ 20961966c248SBram Moolenaar 'vim9script', 20971966c248SBram Moolenaar 'hi Group term=bold', 20981966c248SBram Moolenaar 'match Group /todo/ # comment', 20991966c248SBram Moolenaar ]) 21001966c248SBram Moolenaar CheckScriptFailure([ 21011966c248SBram Moolenaar 'vim9script', 21021966c248SBram Moolenaar 'hi Group term=bold', 21031966c248SBram Moolenaar 'match Group /todo/# comment', 21041966c248SBram Moolenaar ], 'E488:') 21051966c248SBram Moolenaar CheckScriptSuccess([ 21061966c248SBram Moolenaar 'vim9script', 21071966c248SBram Moolenaar 'match # comment', 21081966c248SBram Moolenaar ]) 21091966c248SBram Moolenaar CheckScriptFailure([ 21101966c248SBram Moolenaar 'vim9script', 21111966c248SBram Moolenaar 'match# comment', 21121966c248SBram Moolenaar ], 'E475:') 21131966c248SBram Moolenaar CheckScriptSuccess([ 21141966c248SBram Moolenaar 'vim9script', 21151966c248SBram Moolenaar 'match none # comment', 21161966c248SBram Moolenaar ]) 21171966c248SBram Moolenaar CheckScriptFailure([ 21181966c248SBram Moolenaar 'vim9script', 21191966c248SBram Moolenaar 'match none# comment', 21201966c248SBram Moolenaar ], 'E475:') 21211966c248SBram Moolenaar 21221966c248SBram Moolenaar CheckScriptSuccess([ 21231966c248SBram Moolenaar 'vim9script', 21241966c248SBram Moolenaar 'menutrans clear # comment', 21251966c248SBram Moolenaar ]) 21261966c248SBram Moolenaar CheckScriptFailure([ 21271966c248SBram Moolenaar 'vim9script', 21281966c248SBram Moolenaar 'menutrans clear# comment text', 21291966c248SBram Moolenaar ], 'E474:') 21301966c248SBram Moolenaar 21311966c248SBram Moolenaar CheckScriptSuccess([ 21321966c248SBram Moolenaar 'vim9script', 21331966c248SBram Moolenaar 'syntax clear # comment', 21341966c248SBram Moolenaar ]) 21351966c248SBram Moolenaar CheckScriptFailure([ 21361966c248SBram Moolenaar 'vim9script', 21371966c248SBram Moolenaar 'syntax clear# comment text', 21381966c248SBram Moolenaar ], 'E28:') 21391966c248SBram Moolenaar CheckScriptSuccess([ 21401966c248SBram Moolenaar 'vim9script', 21411966c248SBram Moolenaar 'syntax keyword Word some', 21421966c248SBram Moolenaar 'syntax clear Word # comment', 21431966c248SBram Moolenaar ]) 21441966c248SBram Moolenaar CheckScriptFailure([ 21451966c248SBram Moolenaar 'vim9script', 21461966c248SBram Moolenaar 'syntax keyword Word some', 21471966c248SBram Moolenaar 'syntax clear Word# comment text', 21481966c248SBram Moolenaar ], 'E28:') 21491966c248SBram Moolenaar 21501966c248SBram Moolenaar CheckScriptSuccess([ 21511966c248SBram Moolenaar 'vim9script', 21521966c248SBram Moolenaar 'syntax list # comment', 21531966c248SBram Moolenaar ]) 21541966c248SBram Moolenaar CheckScriptFailure([ 21551966c248SBram Moolenaar 'vim9script', 21561966c248SBram Moolenaar 'syntax list# comment text', 21571966c248SBram Moolenaar ], 'E28:') 21581966c248SBram Moolenaar 21591966c248SBram Moolenaar CheckScriptSuccess([ 21601966c248SBram Moolenaar 'vim9script', 21611966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 21621966c248SBram Moolenaar ]) 21631966c248SBram Moolenaar CheckScriptFailure([ 21641966c248SBram Moolenaar 'vim9script', 21651966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 21661966c248SBram Moolenaar ], 'E475:') 21671966c248SBram Moolenaar 21681966c248SBram Moolenaar CheckScriptSuccess([ 21691966c248SBram Moolenaar 'vim9script', 21701966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 21711966c248SBram Moolenaar ]) 21721966c248SBram Moolenaar CheckScriptFailure([ 21731966c248SBram Moolenaar 'vim9script', 21741966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 21751966c248SBram Moolenaar ], 'E789:') 21761966c248SBram Moolenaar 21771966c248SBram Moolenaar CheckScriptSuccess([ 21781966c248SBram Moolenaar 'vim9script', 21791966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 21801966c248SBram Moolenaar ]) 21811966c248SBram Moolenaar CheckScriptFailure([ 21821966c248SBram Moolenaar 'vim9script', 21831966c248SBram Moolenaar 'syntax match Word /pat/# comment', 21841966c248SBram Moolenaar ], 'E402:') 21851966c248SBram Moolenaar 21861966c248SBram Moolenaar CheckScriptSuccess([ 21871966c248SBram Moolenaar 'vim9script', 21881966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 21891966c248SBram Moolenaar ]) 21901966c248SBram Moolenaar CheckScriptFailure([ 21911966c248SBram Moolenaar 'vim9script', 21921966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 21931966c248SBram Moolenaar ], 'E475:') 21941966c248SBram Moolenaar CheckScriptFailure([ 21951966c248SBram Moolenaar 'vim9script', 21961966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 21971966c248SBram Moolenaar ], 'E406:') 21981966c248SBram Moolenaar CheckScriptFailure([ 21991966c248SBram Moolenaar 'vim9script', 22001966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 22011966c248SBram Moolenaar ], 'E475:') 22021966c248SBram Moolenaar 22031966c248SBram Moolenaar CheckScriptSuccess([ 22041966c248SBram Moolenaar 'vim9script', 22051966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 22061966c248SBram Moolenaar ]) 22071966c248SBram Moolenaar CheckScriptFailure([ 22081966c248SBram Moolenaar 'vim9script', 22091966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2210d032f34aSBram Moolenaar ], 'E402:') 22111966c248SBram Moolenaar 22121966c248SBram Moolenaar CheckScriptSuccess([ 22131966c248SBram Moolenaar 'vim9script', 22141966c248SBram Moolenaar 'syntax sync # comment', 22151966c248SBram Moolenaar ]) 22161966c248SBram Moolenaar CheckScriptFailure([ 22171966c248SBram Moolenaar 'vim9script', 22181966c248SBram Moolenaar 'syntax sync# comment', 22191966c248SBram Moolenaar ], 'E404:') 22201966c248SBram Moolenaar CheckScriptSuccess([ 22211966c248SBram Moolenaar 'vim9script', 22221966c248SBram Moolenaar 'syntax sync ccomment # comment', 22231966c248SBram Moolenaar ]) 22241966c248SBram Moolenaar CheckScriptFailure([ 22251966c248SBram Moolenaar 'vim9script', 22261966c248SBram Moolenaar 'syntax sync ccomment# comment', 22271966c248SBram Moolenaar ], 'E404:') 22281966c248SBram Moolenaar 22291966c248SBram Moolenaar CheckScriptSuccess([ 22301966c248SBram Moolenaar 'vim9script', 22311966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 22321966c248SBram Moolenaar ]) 22331966c248SBram Moolenaar CheckScriptFailure([ 22341966c248SBram Moolenaar 'vim9script', 22351966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 22361966c248SBram Moolenaar ], 'E475:') 2237a72cfb80SBram Moolenaar 2238a72cfb80SBram Moolenaar CheckScriptSuccess([ 2239a72cfb80SBram Moolenaar 'vim9script', 2240a72cfb80SBram Moolenaar 'command Echo echo # comment', 2241a72cfb80SBram Moolenaar 'command Echo # comment', 2242a72cfb80SBram Moolenaar ]) 2243a72cfb80SBram Moolenaar CheckScriptFailure([ 2244a72cfb80SBram Moolenaar 'vim9script', 2245a72cfb80SBram Moolenaar 'command Echo echo# comment', 2246a72cfb80SBram Moolenaar 'Echo', 2247a72cfb80SBram Moolenaar ], 'E121:') 2248a72cfb80SBram Moolenaar CheckScriptFailure([ 2249a72cfb80SBram Moolenaar 'vim9script', 2250a72cfb80SBram Moolenaar 'command Echo# comment', 2251a72cfb80SBram Moolenaar ], 'E182:') 2252a72cfb80SBram Moolenaar CheckScriptFailure([ 2253a72cfb80SBram Moolenaar 'vim9script', 2254a72cfb80SBram Moolenaar 'command Echo echo', 2255a72cfb80SBram Moolenaar 'command Echo# comment', 2256a72cfb80SBram Moolenaar ], 'E182:') 2257a72cfb80SBram Moolenaar 2258a72cfb80SBram Moolenaar CheckScriptSuccess([ 2259a72cfb80SBram Moolenaar 'vim9script', 2260a72cfb80SBram Moolenaar 'function # comment', 2261a72cfb80SBram Moolenaar ]) 2262a72cfb80SBram Moolenaar CheckScriptFailure([ 2263a72cfb80SBram Moolenaar 'vim9script', 2264a72cfb80SBram Moolenaar 'function# comment', 2265a72cfb80SBram Moolenaar ], 'E129:') 2266a72cfb80SBram Moolenaar CheckScriptSuccess([ 2267a72cfb80SBram Moolenaar 'vim9script', 2268a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2269a72cfb80SBram Moolenaar ]) 2270a72cfb80SBram Moolenaar CheckScriptFailure([ 2271a72cfb80SBram Moolenaar 'vim9script', 2272a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2273a72cfb80SBram Moolenaar ], 'E488:') 2274a72cfb80SBram Moolenaar 2275a72cfb80SBram Moolenaar CheckScriptSuccess([ 2276a72cfb80SBram Moolenaar 'vim9script', 22774c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2278a72cfb80SBram Moolenaar 'endfunc', 22794c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2280a72cfb80SBram Moolenaar ]) 2281a72cfb80SBram Moolenaar CheckScriptFailure([ 2282a72cfb80SBram Moolenaar 'vim9script', 22834c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2284a72cfb80SBram Moolenaar 'endfunc', 22854c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2286a72cfb80SBram Moolenaar ], 'E488:') 2287a72cfb80SBram Moolenaar 2288a72cfb80SBram Moolenaar CheckScriptSuccess([ 2289a72cfb80SBram Moolenaar 'vim9script', 2290a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2291a72cfb80SBram Moolenaar ]) 2292a72cfb80SBram Moolenaar CheckScriptFailure([ 2293a72cfb80SBram Moolenaar 'vim9script', 2294a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2295a72cfb80SBram Moolenaar ], 'E488:') 2296e7e4838fSBram Moolenaar 2297e7e4838fSBram Moolenaar CheckScriptFailure([ 2298e7e4838fSBram Moolenaar 'def Test() " comment', 2299e7e4838fSBram Moolenaar 'enddef', 2300e7e4838fSBram Moolenaar ], 'E488:') 2301e7e4838fSBram Moolenaar CheckScriptFailure([ 2302e7e4838fSBram Moolenaar 'vim9script', 2303e7e4838fSBram Moolenaar 'def Test() " comment', 2304e7e4838fSBram Moolenaar 'enddef', 2305e7e4838fSBram Moolenaar ], 'E488:') 2306e7e4838fSBram Moolenaar 2307e7e4838fSBram Moolenaar CheckScriptSuccess([ 2308e7e4838fSBram Moolenaar 'func Test() " comment', 2309e7e4838fSBram Moolenaar 'endfunc', 2310e7e4838fSBram Moolenaar ]) 2311e7e4838fSBram Moolenaar CheckScriptFailure([ 2312e7e4838fSBram Moolenaar 'vim9script', 2313e7e4838fSBram Moolenaar 'func Test() " comment', 2314e7e4838fSBram Moolenaar 'endfunc', 2315e7e4838fSBram Moolenaar ], 'E488:') 2316e7e4838fSBram Moolenaar 2317e7e4838fSBram Moolenaar CheckScriptSuccess([ 2318e7e4838fSBram Moolenaar 'def Test() # comment', 2319e7e4838fSBram Moolenaar 'enddef', 2320e7e4838fSBram Moolenaar ]) 2321e7e4838fSBram Moolenaar CheckScriptFailure([ 2322e7e4838fSBram Moolenaar 'func Test() # comment', 2323e7e4838fSBram Moolenaar 'endfunc', 2324e7e4838fSBram Moolenaar ], 'E488:') 23252c5ed4e3SBram Moolenaarenddef 23262c5ed4e3SBram Moolenaar 23272c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 23282c5ed4e3SBram Moolenaar CheckCanRunGui 23292c5ed4e3SBram Moolenaar 23302c5ed4e3SBram Moolenaar CheckScriptFailure([ 23312c5ed4e3SBram Moolenaar 'vim9script', 23322c5ed4e3SBram Moolenaar 'gui#comment' 23332c5ed4e3SBram Moolenaar ], 'E499:') 23342c5ed4e3SBram Moolenaar CheckScriptFailure([ 23352c5ed4e3SBram Moolenaar 'vim9script', 23362c5ed4e3SBram Moolenaar 'gui -f#comment' 23372c5ed4e3SBram Moolenaar ], 'E499:') 23387a092245SBram Moolenaarenddef 23397a092245SBram Moolenaar 2340a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 23416797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 23426797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2343a26b9700SBram Moolenaar 2344a26b9700SBram Moolenaar edit test.vim 2345a26b9700SBram Moolenaar doautocmd TabEnter #comment 2346a26b9700SBram Moolenaar assert_equal(1, g:entered) 2347a26b9700SBram Moolenaar 2348a26b9700SBram Moolenaar doautocmd TabEnter f.x 2349a26b9700SBram Moolenaar assert_equal(2, g:entered) 2350a26b9700SBram Moolenaar 2351a26b9700SBram Moolenaar g:entered = 0 2352a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2353a26b9700SBram Moolenaar assert_equal(2, g:entered) 2354a26b9700SBram Moolenaar 2355a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2356a26b9700SBram Moolenaar 2357a26b9700SBram Moolenaar au! TabEnter 2358a26b9700SBram Moolenaar unlet g:entered 2359d72c1bf0SBram Moolenaar 2360d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2361d72c1bf0SBram Moolenaar 'vim9script', 23626797966dSBram Moolenaar 'g:var = 123', 2363e55b1c09SBram Moolenaar 'b:var = 456', 2364e55b1c09SBram Moolenaar 'w:var = 777', 2365e55b1c09SBram Moolenaar 't:var = 888', 2366d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2367d72c1bf0SBram Moolenaar ]) 2368d72c1bf0SBram Moolenaar 2369d72c1bf0SBram Moolenaar CheckScriptFailure([ 2370d72c1bf0SBram Moolenaar 'vim9script', 2371d72c1bf0SBram Moolenaar 'let g:var = 123', 2372e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2373e55b1c09SBram Moolenaar 2374e55b1c09SBram Moolenaar CheckScriptFailure([ 2375e55b1c09SBram Moolenaar 'vim9script', 2376e55b1c09SBram Moolenaar 'let b:var = 123', 2377e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2378e55b1c09SBram Moolenaar 2379e55b1c09SBram Moolenaar CheckScriptFailure([ 2380e55b1c09SBram Moolenaar 'vim9script', 2381e55b1c09SBram Moolenaar 'let w:var = 123', 2382e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2383e55b1c09SBram Moolenaar 2384e55b1c09SBram Moolenaar CheckScriptFailure([ 2385e55b1c09SBram Moolenaar 'vim9script', 2386e55b1c09SBram Moolenaar 'let t:var = 123', 2387e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2388e55b1c09SBram Moolenaar 2389e55b1c09SBram Moolenaar CheckScriptFailure([ 2390e55b1c09SBram Moolenaar 'vim9script', 2391e55b1c09SBram Moolenaar 'let v:version = 123', 2392e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2393e55b1c09SBram Moolenaar 2394e55b1c09SBram Moolenaar CheckScriptFailure([ 2395e55b1c09SBram Moolenaar 'vim9script', 2396e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2397e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 23986797966dSBram Moolenaar 23996797966dSBram Moolenaar CheckScriptFailure([ 24006797966dSBram Moolenaar 'vim9script', 24016797966dSBram Moolenaar 'g:var = 123', 240232e35117SBram Moolenaar 'unlet g:var# comment1', 2403d72c1bf0SBram Moolenaar ], 'E108:') 2404d72c1bf0SBram Moolenaar 2405d72c1bf0SBram Moolenaar CheckScriptFailure([ 2406d72c1bf0SBram Moolenaar 'let g:var = 123', 2407d72c1bf0SBram Moolenaar 'unlet g:var # something', 2408d72c1bf0SBram Moolenaar ], 'E488:') 2409faac4104SBram Moolenaar 2410faac4104SBram Moolenaar CheckScriptSuccess([ 2411faac4104SBram Moolenaar 'vim9script', 241232e35117SBram Moolenaar 'if 1 # comment2', 2413faac4104SBram Moolenaar ' echo "yes"', 2414faac4104SBram Moolenaar 'elseif 2 #comment', 2415faac4104SBram Moolenaar ' echo "no"', 2416faac4104SBram Moolenaar 'endif', 2417faac4104SBram Moolenaar ]) 2418faac4104SBram Moolenaar 2419faac4104SBram Moolenaar CheckScriptFailure([ 2420faac4104SBram Moolenaar 'vim9script', 242132e35117SBram Moolenaar 'if 1# comment3', 2422faac4104SBram Moolenaar ' echo "yes"', 2423faac4104SBram Moolenaar 'endif', 2424faac4104SBram Moolenaar ], 'E15:') 2425faac4104SBram Moolenaar 2426faac4104SBram Moolenaar CheckScriptFailure([ 2427faac4104SBram Moolenaar 'vim9script', 242832e35117SBram Moolenaar 'if 0 # comment4', 2429faac4104SBram Moolenaar ' echo "yes"', 2430faac4104SBram Moolenaar 'elseif 2#comment', 2431faac4104SBram Moolenaar ' echo "no"', 2432faac4104SBram Moolenaar 'endif', 2433faac4104SBram Moolenaar ], 'E15:') 2434faac4104SBram Moolenaar 2435faac4104SBram Moolenaar CheckScriptSuccess([ 2436faac4104SBram Moolenaar 'vim9script', 243732e35117SBram Moolenaar 'let v = 1 # comment5', 2438faac4104SBram Moolenaar ]) 2439faac4104SBram Moolenaar 2440faac4104SBram Moolenaar CheckScriptFailure([ 2441faac4104SBram Moolenaar 'vim9script', 244232e35117SBram Moolenaar 'let v = 1# comment6', 244332e35117SBram Moolenaar ], 'E15:') 2444faac4104SBram Moolenaar 2445faac4104SBram Moolenaar CheckScriptSuccess([ 2446faac4104SBram Moolenaar 'vim9script', 2447faac4104SBram Moolenaar 'new' 2448faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2449df069eecSBram Moolenaar ':$', 2450faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2451faac4104SBram Moolenaar 'bwipe!', 2452faac4104SBram Moolenaar ]) 2453faac4104SBram Moolenaar 2454f5be8cdbSBram Moolenaar CheckScriptFailure([ 2455f5be8cdbSBram Moolenaar 'vim9script', 2456f5be8cdbSBram Moolenaar 'new' 2457f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2458f5be8cdbSBram Moolenaar ':$', 2459f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2460f5be8cdbSBram Moolenaar 'bwipe!', 2461f5be8cdbSBram Moolenaar ], 'E488:') 2462f5be8cdbSBram Moolenaar 2463f5be8cdbSBram Moolenaar CheckScriptFailure([ 2464f5be8cdbSBram Moolenaar 'vim9script', 2465f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2466f5be8cdbSBram Moolenaar ], 'E477:') 2467a26b9700SBram Moolenaarenddef 2468a26b9700SBram Moolenaar 24697e5bd91dSBram Moolenaardef Test_finish() 24707e5bd91dSBram Moolenaar let lines =<< trim END 24717e5bd91dSBram Moolenaar vim9script 24726797966dSBram Moolenaar g:res = 'one' 24737e5bd91dSBram Moolenaar if v:false | finish | endif 24746797966dSBram Moolenaar g:res = 'two' 24757e5bd91dSBram Moolenaar finish 24766797966dSBram Moolenaar g:res = 'three' 24777e5bd91dSBram Moolenaar END 24787e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 24797e5bd91dSBram Moolenaar source Xfinished 24807e5bd91dSBram Moolenaar assert_equal('two', g:res) 24817e5bd91dSBram Moolenaar 24827e5bd91dSBram Moolenaar unlet g:res 24837e5bd91dSBram Moolenaar delete('Xfinished') 24847e5bd91dSBram Moolenaarenddef 24857e5bd91dSBram Moolenaar 248632e35117SBram Moolenaardef Test_let_func_call() 248732e35117SBram Moolenaar let lines =<< trim END 248832e35117SBram Moolenaar vim9script 248932e35117SBram Moolenaar func GetValue() 249032e35117SBram Moolenaar if exists('g:count') 249132e35117SBram Moolenaar let g:count += 1 249232e35117SBram Moolenaar else 249332e35117SBram Moolenaar let g:count = 1 249432e35117SBram Moolenaar endif 249532e35117SBram Moolenaar return 'this' 249632e35117SBram Moolenaar endfunc 249732e35117SBram Moolenaar let val: string = GetValue() 2498f5be8cdbSBram Moolenaar # env var is always a string 2499df671b46SBram Moolenaar let env = $TERM 250032e35117SBram Moolenaar END 250132e35117SBram Moolenaar writefile(lines, 'Xfinished') 250232e35117SBram Moolenaar source Xfinished 2503f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 250432e35117SBram Moolenaar assert_equal(1, g:count) 250532e35117SBram Moolenaar 250632e35117SBram Moolenaar unlet g:count 250732e35117SBram Moolenaar delete('Xfinished') 250832e35117SBram Moolenaarenddef 250932e35117SBram Moolenaar 251032e35117SBram Moolenaardef Test_let_missing_type() 251132e35117SBram Moolenaar let lines =<< trim END 251232e35117SBram Moolenaar vim9script 2513df671b46SBram Moolenaar let var = g:unknown 2514227a69deSBram Moolenaar END 2515822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2516227a69deSBram Moolenaar 2517227a69deSBram Moolenaar lines =<< trim END 2518227a69deSBram Moolenaar vim9script 2519227a69deSBram Moolenaar let nr: number = 123 2520227a69deSBram Moolenaar let var = nr 2521227a69deSBram Moolenaar END 2522822ba247SBram Moolenaar CheckScriptSuccess(lines) 252332e35117SBram Moolenaarenddef 252432e35117SBram Moolenaar 2525c82a5b5dSBram Moolenaardef Test_let_declaration() 2526c82a5b5dSBram Moolenaar let lines =<< trim END 2527c82a5b5dSBram Moolenaar vim9script 2528c82a5b5dSBram Moolenaar let var: string 2529c82a5b5dSBram Moolenaar g:var_uninit = var 2530c82a5b5dSBram Moolenaar var = 'text' 2531c82a5b5dSBram Moolenaar g:var_test = var 2532f5be8cdbSBram Moolenaar # prefixing s: is optional 2533984dddbeSBram Moolenaar s:var = 'prefixed' 2534984dddbeSBram Moolenaar g:var_prefixed = s:var 2535984dddbeSBram Moolenaar 2536984dddbeSBram Moolenaar let s:other: number 2537984dddbeSBram Moolenaar other = 1234 2538984dddbeSBram Moolenaar g:other_var = other 2539c82a5b5dSBram Moolenaar END 2540c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2541c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2542c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2543984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2544984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2545c82a5b5dSBram Moolenaar 2546c82a5b5dSBram Moolenaar unlet g:var_uninit 2547c82a5b5dSBram Moolenaar unlet g:var_test 2548984dddbeSBram Moolenaar unlet g:var_prefixed 2549984dddbeSBram Moolenaar unlet g:other_var 2550c82a5b5dSBram Moolenaarenddef 2551c82a5b5dSBram Moolenaar 2552c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2553c5b1c20bSBram Moolenaar let lines =<< trim END 2554c5b1c20bSBram Moolenaar vim9script 2555c5b1c20bSBram Moolenaar const var: string 2556c5b1c20bSBram Moolenaar END 2557c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2558c5b1c20bSBram Moolenaar 2559c5b1c20bSBram Moolenaar lines =<< trim END 2560c5b1c20bSBram Moolenaar vim9script 2561c5b1c20bSBram Moolenaar let 9var: string 2562c5b1c20bSBram Moolenaar END 2563c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2564c5b1c20bSBram Moolenaarenddef 2565c5b1c20bSBram Moolenaar 256634db91f7SBram Moolenaardef Test_let_type_check() 256734db91f7SBram Moolenaar let lines =<< trim END 256834db91f7SBram Moolenaar vim9script 256934db91f7SBram Moolenaar let var: string 257034db91f7SBram Moolenaar var = 1234 257134db91f7SBram Moolenaar END 257234db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2573984dddbeSBram Moolenaar 2574984dddbeSBram Moolenaar lines =<< trim END 2575984dddbeSBram Moolenaar vim9script 2576984dddbeSBram Moolenaar let var:string 2577984dddbeSBram Moolenaar END 2578984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2579c5b1c20bSBram Moolenaar 2580c5b1c20bSBram Moolenaar lines =<< trim END 2581c5b1c20bSBram Moolenaar vim9script 2582c5b1c20bSBram Moolenaar let var: asdf 2583c5b1c20bSBram Moolenaar END 2584c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 258534db91f7SBram Moolenaarenddef 258634db91f7SBram Moolenaar 2587a5d0077eSBram Moolenaardef Test_forward_declaration() 2588a5d0077eSBram Moolenaar let lines =<< trim END 2589a5d0077eSBram Moolenaar vim9script 2590a5d0077eSBram Moolenaar def GetValue(): string 2591a5d0077eSBram Moolenaar return theVal 2592a5d0077eSBram Moolenaar enddef 2593a5d0077eSBram Moolenaar let theVal = 'something' 2594822ba247SBram Moolenaar g:initVal = GetValue() 2595a5d0077eSBram Moolenaar theVal = 'else' 2596a5d0077eSBram Moolenaar g:laterVal = GetValue() 2597a5d0077eSBram Moolenaar END 2598a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2599a5d0077eSBram Moolenaar source Xforward 2600a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2601a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2602a5d0077eSBram Moolenaar 2603a5d0077eSBram Moolenaar unlet g:initVal 2604a5d0077eSBram Moolenaar unlet g:laterVal 2605a5d0077eSBram Moolenaar delete('Xforward') 2606a5d0077eSBram Moolenaarenddef 2607a5d0077eSBram Moolenaar 26089721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 26099721fb4eSBram Moolenaar let legacy_lines =<< trim END 26109721fb4eSBram Moolenaar source Xvim9_script.vim 26119721fb4eSBram Moolenaar 26129721fb4eSBram Moolenaar call assert_false(exists('local')) 26139721fb4eSBram Moolenaar call assert_false(exists('exported')) 26149721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 26159721fb4eSBram Moolenaar call assert_equal('global', global) 26169721fb4eSBram Moolenaar call assert_equal('global', g:global) 26179721fb4eSBram Moolenaar 26189721fb4eSBram Moolenaar " imported variable becomes script-local 26199721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 26209721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 26219721fb4eSBram Moolenaar call assert_false(exists('exported')) 26229721fb4eSBram Moolenaar 26239721fb4eSBram Moolenaar " imported function becomes script-local 26249721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 26259721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 26269721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 26279721fb4eSBram Moolenaar END 26289721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 26299721fb4eSBram Moolenaar 26309721fb4eSBram Moolenaar let vim9_lines =<< trim END 26319721fb4eSBram Moolenaar vim9script 26329721fb4eSBram Moolenaar let local = 'local' 26339721fb4eSBram Moolenaar g:global = 'global' 26349721fb4eSBram Moolenaar export let exported = 'exported' 26359721fb4eSBram Moolenaar export def GetText(): string 26369721fb4eSBram Moolenaar return 'text' 26379721fb4eSBram Moolenaar enddef 26389721fb4eSBram Moolenaar END 26399721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 26409721fb4eSBram Moolenaar 26419721fb4eSBram Moolenaar source Xlegacy_script.vim 26429721fb4eSBram Moolenaar 26439721fb4eSBram Moolenaar assert_equal('global', g:global) 2644f5be8cdbSBram Moolenaar unlet g:global 26459721fb4eSBram Moolenaar 26469721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 26479721fb4eSBram Moolenaar delete('Xvim9_script.vim') 26489721fb4eSBram Moolenaarenddef 2649a5d0077eSBram Moolenaar 2650eeb27bfeSBram Moolenaardef Test_vim9_copen() 2651eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2652eeb27bfeSBram Moolenaar copen 2653eeb27bfeSBram Moolenaar quit 2654eeb27bfeSBram Moolenaarenddef 2655eeb27bfeSBram Moolenaar 26562d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 26572d6b20d6SBram Moolenaardef Test_vim9_autoload() 26582d6b20d6SBram Moolenaar let lines =<< trim END 26592d6b20d6SBram Moolenaar vim9script 26602d6b20d6SBram Moolenaar def foo#test() 26612d6b20d6SBram Moolenaar echomsg getreg('"') 26622d6b20d6SBram Moolenaar enddef 26632d6b20d6SBram Moolenaar END 26642d6b20d6SBram Moolenaar 26652d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 26662d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 26672d6b20d6SBram Moolenaar let save_rtp = &rtp 26682d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 26692d6b20d6SBram Moolenaar augroup test 26702d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 26712d6b20d6SBram Moolenaar augroup END 26722d6b20d6SBram Moolenaar 26732d6b20d6SBram Moolenaar normal Y 26742d6b20d6SBram Moolenaar 26752d6b20d6SBram Moolenaar augroup test 26762d6b20d6SBram Moolenaar autocmd! 26772d6b20d6SBram Moolenaar augroup END 26782d6b20d6SBram Moolenaar delete('Xdir', 'rf') 26792d6b20d6SBram Moolenaar &rtp = save_rtp 26802d6b20d6SBram Moolenaarenddef 26812d6b20d6SBram Moolenaar 2682585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2683585fea7bSBram Moolenaardef Test_substitute_cmd() 2684585fea7bSBram Moolenaar new 2685585fea7bSBram Moolenaar setline(1, 'something') 2686585fea7bSBram Moolenaar :substitute(some(other( 2687585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2688585fea7bSBram Moolenaar bwipe! 2689585fea7bSBram Moolenaar 2690f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2691585fea7bSBram Moolenaar let lines =<< trim END 2692585fea7bSBram Moolenaar vim9script 2693585fea7bSBram Moolenaar new 2694585fea7bSBram Moolenaar setline(1, 'something') 2695585fea7bSBram Moolenaar :substitute(some(other( 2696585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2697585fea7bSBram Moolenaar bwipe! 2698585fea7bSBram Moolenaar END 2699585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2700585fea7bSBram Moolenaar source Xvim9lines 2701585fea7bSBram Moolenaar 2702585fea7bSBram Moolenaar delete('Xvim9lines') 2703585fea7bSBram Moolenaarenddef 2704585fea7bSBram Moolenaar 27058a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2706