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:') 379*43e969d3SBram Moolenaar 380*43e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 381*43e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 382*43e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 383*43e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 384*43e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 385*43e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 386*43e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 387*43e969d3SBram 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:') 4714c17ad94SBram Moolenaarenddef 4724c17ad94SBram Moolenaar 473599c89c8SBram Moolenaarfunc Test_wrong_type() 474599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 475599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 476599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 477599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 478599c89c8SBram Moolenaar 479599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 480599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 48142a480bfSBram Moolenaar 48242a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 48342a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 48442a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 48542a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 48642a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 48742a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 48842a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 48942a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 49042a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 49142a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 49242a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 493a0a9f43aSBram Moolenaar 494a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 495a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 4968a7d6542SBram Moolenaarendfunc 4978a7d6542SBram Moolenaar 4988a7d6542SBram Moolenaarfunc Test_const() 4998a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 5008a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 5018a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 5029be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 5038a7d6542SBram Moolenaarendfunc 5048a7d6542SBram Moolenaar 505df069eecSBram Moolenaardef Test_range_no_colon() 506df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 507df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 508df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 509df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 510df069eecSBram Moolenaarenddef 511df069eecSBram Moolenaar 512df069eecSBram Moolenaar 5138a7d6542SBram Moolenaardef Test_block() 5148a7d6542SBram Moolenaar let outer = 1 5158a7d6542SBram Moolenaar { 5168a7d6542SBram Moolenaar let inner = 2 5178a7d6542SBram Moolenaar assert_equal(1, outer) 5188a7d6542SBram Moolenaar assert_equal(2, inner) 5198a7d6542SBram Moolenaar } 5208a7d6542SBram Moolenaar assert_equal(1, outer) 5218a7d6542SBram Moolenaarenddef 5228a7d6542SBram Moolenaar 5238a7d6542SBram Moolenaarfunc Test_block_failure() 5248a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 525585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 526585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 5278a7d6542SBram Moolenaarendfunc 5288a7d6542SBram Moolenaar 529585fea7bSBram Moolenaardef Test_cmd_modifier() 530585fea7bSBram Moolenaar tab echo '0' 531585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 532585fea7bSBram Moolenaarenddef 533585fea7bSBram Moolenaar 534d032f34aSBram Moolenaarfunc g:NoSuchFunc() 535d032f34aSBram Moolenaar echo 'none' 536d032f34aSBram Moolenaarendfunc 537d032f34aSBram Moolenaar 5388a7d6542SBram Moolenaardef Test_try_catch() 5398a7d6542SBram Moolenaar let l = [] 5407a092245SBram Moolenaar try # comment 5418a7d6542SBram Moolenaar add(l, '1') 5428a7d6542SBram Moolenaar throw 'wrong' 5438a7d6542SBram Moolenaar add(l, '2') 5447a092245SBram Moolenaar catch # comment 5458a7d6542SBram Moolenaar add(l, v:exception) 5467a092245SBram Moolenaar finally # comment 5478a7d6542SBram Moolenaar add(l, '3') 5487a092245SBram Moolenaar endtry # comment 5498a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 55068d130c6SBram Moolenaar 551e859312eSBram Moolenaar l = [] 552e859312eSBram Moolenaar try 553e859312eSBram Moolenaar try 554e859312eSBram Moolenaar add(l, '1') 555e859312eSBram Moolenaar throw 'wrong' 556e859312eSBram Moolenaar add(l, '2') 557e859312eSBram Moolenaar catch /right/ 558e859312eSBram Moolenaar add(l, v:exception) 559e859312eSBram Moolenaar endtry 560e859312eSBram Moolenaar catch /wrong/ 561e859312eSBram Moolenaar add(l, 'caught') 562e859312eSBram Moolenaar finally 563e859312eSBram Moolenaar add(l, 'finally') 564e859312eSBram Moolenaar endtry 565e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 566e859312eSBram Moolenaar 56768d130c6SBram Moolenaar let n: number 56868d130c6SBram Moolenaar try 56968d130c6SBram Moolenaar n = l[3] 57068d130c6SBram Moolenaar catch /E684:/ 57168d130c6SBram Moolenaar n = 99 57268d130c6SBram Moolenaar endtry 57368d130c6SBram Moolenaar assert_equal(99, n) 57468d130c6SBram Moolenaar 57568d130c6SBram Moolenaar try 57668d130c6SBram Moolenaar n = g:astring[3] 57768d130c6SBram Moolenaar catch /E714:/ 57868d130c6SBram Moolenaar n = 77 57968d130c6SBram Moolenaar endtry 58068d130c6SBram Moolenaar assert_equal(77, n) 58168d130c6SBram Moolenaar 58268d130c6SBram Moolenaar try 58368d130c6SBram Moolenaar n = l[g:astring] 58468d130c6SBram Moolenaar catch /E39:/ 58568d130c6SBram Moolenaar n = 77 58668d130c6SBram Moolenaar endtry 58768d130c6SBram Moolenaar assert_equal(77, n) 58868d130c6SBram Moolenaar 58968d130c6SBram Moolenaar try 59068d130c6SBram Moolenaar n = s:does_not_exist 59168d130c6SBram Moolenaar catch /E121:/ 592f0b9f43cSBram Moolenaar n = 111 593f0b9f43cSBram Moolenaar endtry 594f0b9f43cSBram Moolenaar assert_equal(111, n) 595f0b9f43cSBram Moolenaar 596f0b9f43cSBram Moolenaar try 597f0b9f43cSBram Moolenaar n = g:does_not_exist 598f0b9f43cSBram Moolenaar catch /E121:/ 59968d130c6SBram Moolenaar n = 121 60068d130c6SBram Moolenaar endtry 60168d130c6SBram Moolenaar assert_equal(121, n) 60268d130c6SBram Moolenaar 60368d130c6SBram Moolenaar let d = #{one: 1} 60468d130c6SBram Moolenaar try 60568d130c6SBram Moolenaar n = d[g:astring] 60668d130c6SBram Moolenaar catch /E716:/ 60768d130c6SBram Moolenaar n = 222 60868d130c6SBram Moolenaar endtry 60968d130c6SBram Moolenaar assert_equal(222, n) 610f0b9f43cSBram Moolenaar 611f0b9f43cSBram Moolenaar try 612f0b9f43cSBram Moolenaar n = -g:astring 613f0b9f43cSBram Moolenaar catch /E39:/ 614f0b9f43cSBram Moolenaar n = 233 615f0b9f43cSBram Moolenaar endtry 616f0b9f43cSBram Moolenaar assert_equal(233, n) 617f0b9f43cSBram Moolenaar 618f0b9f43cSBram Moolenaar try 619f0b9f43cSBram Moolenaar n = +g:astring 620f0b9f43cSBram Moolenaar catch /E1030:/ 621f0b9f43cSBram Moolenaar n = 244 622f0b9f43cSBram Moolenaar endtry 623f0b9f43cSBram Moolenaar assert_equal(244, n) 624f0b9f43cSBram Moolenaar 625f0b9f43cSBram Moolenaar try 626f0b9f43cSBram Moolenaar n = +g:alist 627f0b9f43cSBram Moolenaar catch /E745:/ 628f0b9f43cSBram Moolenaar n = 255 629f0b9f43cSBram Moolenaar endtry 630f0b9f43cSBram Moolenaar assert_equal(255, n) 631f0b9f43cSBram Moolenaar 632f0b9f43cSBram Moolenaar let nd: dict<any> 633f0b9f43cSBram Moolenaar try 634f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 635f0b9f43cSBram Moolenaar catch /E1029:/ 636f0b9f43cSBram Moolenaar n = 266 637f0b9f43cSBram Moolenaar endtry 638f0b9f43cSBram Moolenaar assert_equal(266, n) 639f0b9f43cSBram Moolenaar 640f0b9f43cSBram Moolenaar try 641f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 642f0b9f43cSBram Moolenaar catch /E1093:/ 643f0b9f43cSBram Moolenaar n = 277 644f0b9f43cSBram Moolenaar endtry 645f0b9f43cSBram Moolenaar assert_equal(277, n) 646f0b9f43cSBram Moolenaar 647e859312eSBram Moolenaar try 648e859312eSBram Moolenaar &ts = g:astring 649e859312eSBram Moolenaar catch /E1029:/ 650e859312eSBram Moolenaar n = 288 651e859312eSBram Moolenaar endtry 652e859312eSBram Moolenaar assert_equal(288, n) 653e859312eSBram Moolenaar 654e859312eSBram Moolenaar try 655e859312eSBram Moolenaar &backspace = 'asdf' 656e859312eSBram Moolenaar catch /E474:/ 657e859312eSBram Moolenaar n = 299 658e859312eSBram Moolenaar endtry 659e859312eSBram Moolenaar assert_equal(299, n) 660e859312eSBram Moolenaar 661e859312eSBram Moolenaar l = [1] 662e859312eSBram Moolenaar try 663e859312eSBram Moolenaar l[3] = 3 664e859312eSBram Moolenaar catch /E684:/ 665e859312eSBram Moolenaar n = 300 666e859312eSBram Moolenaar endtry 667e859312eSBram Moolenaar assert_equal(300, n) 668e859312eSBram Moolenaar 669e859312eSBram Moolenaar try 670e859312eSBram Moolenaar d[''] = 3 671e859312eSBram Moolenaar catch /E713:/ 672e859312eSBram Moolenaar n = 311 673e859312eSBram Moolenaar endtry 674e859312eSBram Moolenaar assert_equal(311, n) 675e859312eSBram Moolenaar 676e859312eSBram Moolenaar try 677e859312eSBram Moolenaar unlet g:does_not_exist 678e859312eSBram Moolenaar catch /E108:/ 679e859312eSBram Moolenaar n = 322 680e859312eSBram Moolenaar endtry 681e859312eSBram Moolenaar assert_equal(322, n) 682e859312eSBram Moolenaar 683e859312eSBram Moolenaar try 684e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 685e859312eSBram Moolenaar catch /E721:/ 686e859312eSBram Moolenaar n = 333 687e859312eSBram Moolenaar endtry 688e859312eSBram Moolenaar assert_equal(333, n) 689e859312eSBram Moolenaar 690e859312eSBram Moolenaar try 691e859312eSBram Moolenaar l = DeletedFunc() 692e859312eSBram Moolenaar catch /E933:/ 693e859312eSBram Moolenaar n = 344 694e859312eSBram Moolenaar endtry 695e859312eSBram Moolenaar assert_equal(344, n) 696d032f34aSBram Moolenaar 697d032f34aSBram Moolenaar try 698d032f34aSBram Moolenaar echo len(v:true) 699d032f34aSBram Moolenaar catch /E701:/ 700d032f34aSBram Moolenaar n = 355 701d032f34aSBram Moolenaar endtry 702d032f34aSBram Moolenaar assert_equal(355, n) 703d032f34aSBram Moolenaar 704d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 705d032f34aSBram Moolenaar delfunc g:NoSuchFunc 706d032f34aSBram Moolenaar try 707d032f34aSBram Moolenaar echo P() 708d032f34aSBram Moolenaar catch /E117:/ 709d032f34aSBram Moolenaar n = 366 710d032f34aSBram Moolenaar endtry 711d032f34aSBram Moolenaar assert_equal(366, n) 712d032f34aSBram Moolenaar 713d032f34aSBram Moolenaar try 714d032f34aSBram Moolenaar echo g:NoSuchFunc() 715d032f34aSBram Moolenaar catch /E117:/ 716d032f34aSBram Moolenaar n = 377 717d032f34aSBram Moolenaar endtry 718d032f34aSBram Moolenaar assert_equal(377, n) 719d032f34aSBram Moolenaar 720d032f34aSBram Moolenaar try 721d032f34aSBram Moolenaar echo g:alist + 4 722d032f34aSBram Moolenaar catch /E745:/ 723d032f34aSBram Moolenaar n = 388 724d032f34aSBram Moolenaar endtry 725d032f34aSBram Moolenaar assert_equal(388, n) 726d032f34aSBram Moolenaar 727d032f34aSBram Moolenaar try 728d032f34aSBram Moolenaar echo 4 + g:alist 729d032f34aSBram Moolenaar catch /E745:/ 730d032f34aSBram Moolenaar n = 399 731d032f34aSBram Moolenaar endtry 732d032f34aSBram Moolenaar assert_equal(399, n) 733d032f34aSBram Moolenaar 734d032f34aSBram Moolenaar try 735d032f34aSBram Moolenaar echo g:alist.member 736d032f34aSBram Moolenaar catch /E715:/ 737d032f34aSBram Moolenaar n = 400 738d032f34aSBram Moolenaar endtry 739d032f34aSBram Moolenaar assert_equal(400, n) 740d032f34aSBram Moolenaar 741d032f34aSBram Moolenaar try 742d032f34aSBram Moolenaar echo d.member 743d032f34aSBram Moolenaar catch /E716:/ 744d032f34aSBram Moolenaar n = 411 745d032f34aSBram Moolenaar endtry 746d032f34aSBram Moolenaar assert_equal(411, n) 7478a7d6542SBram Moolenaarenddef 7488a7d6542SBram Moolenaar 749e859312eSBram Moolenaardef DeletedFunc(): list<any> 750e859312eSBram Moolenaar return ['delete me'] 751e859312eSBram Moolenaarenddef 752e859312eSBram Moolenaardefcompile 753e859312eSBram Moolenaardelfunc DeletedFunc 754e859312eSBram Moolenaar 755257cc5eeSBram Moolenaardef ThrowFromDef() 756a72cfb80SBram Moolenaar throw "getout" # comment 757257cc5eeSBram Moolenaarenddef 758257cc5eeSBram Moolenaar 759257cc5eeSBram Moolenaarfunc CatchInFunc() 760257cc5eeSBram Moolenaar try 761257cc5eeSBram Moolenaar call ThrowFromDef() 762257cc5eeSBram Moolenaar catch 763257cc5eeSBram Moolenaar let g:thrown_func = v:exception 764257cc5eeSBram Moolenaar endtry 765257cc5eeSBram Moolenaarendfunc 766257cc5eeSBram Moolenaar 767257cc5eeSBram Moolenaardef CatchInDef() 768257cc5eeSBram Moolenaar try 769257cc5eeSBram Moolenaar ThrowFromDef() 770257cc5eeSBram Moolenaar catch 771257cc5eeSBram Moolenaar g:thrown_def = v:exception 772257cc5eeSBram Moolenaar endtry 773257cc5eeSBram Moolenaarenddef 774257cc5eeSBram Moolenaar 775f575adffSBram Moolenaardef ReturnFinally(): string 776f575adffSBram Moolenaar try 777f575adffSBram Moolenaar return 'intry' 778f575adffSBram Moolenaar finally 779f575adffSBram Moolenaar g:in_finally = 'finally' 780f575adffSBram Moolenaar endtry 781f575adffSBram Moolenaar return 'end' 782f575adffSBram Moolenaarenddef 783f575adffSBram Moolenaar 784257cc5eeSBram Moolenaardef Test_try_catch_nested() 785257cc5eeSBram Moolenaar CatchInFunc() 786257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 787257cc5eeSBram Moolenaar 788257cc5eeSBram Moolenaar CatchInDef() 789257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 790f575adffSBram Moolenaar 791f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 792f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 793f575adffSBram Moolenaarenddef 794f575adffSBram Moolenaar 795f575adffSBram Moolenaardef Test_try_catch_match() 796f575adffSBram Moolenaar let seq = 'a' 797f575adffSBram Moolenaar try 798f575adffSBram Moolenaar throw 'something' 799f575adffSBram Moolenaar catch /nothing/ 800f575adffSBram Moolenaar seq ..= 'x' 801f575adffSBram Moolenaar catch /some/ 802f575adffSBram Moolenaar seq ..= 'b' 803f575adffSBram Moolenaar catch /asdf/ 804f575adffSBram Moolenaar seq ..= 'x' 805e8c4abbbSBram Moolenaar catch ?a\?sdf? 806e8c4abbbSBram Moolenaar seq ..= 'y' 807f575adffSBram Moolenaar finally 808f575adffSBram Moolenaar seq ..= 'c' 809f575adffSBram Moolenaar endtry 810f575adffSBram Moolenaar assert_equal('abc', seq) 811257cc5eeSBram Moolenaarenddef 812257cc5eeSBram Moolenaar 813e8c4abbbSBram Moolenaardef Test_try_catch_fails() 814e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 815e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 816e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 817585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 818585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 819585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 820585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 821585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 822585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 823585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 824585fea7bSBram Moolenaar 825a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 826585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 827e8c4abbbSBram Moolenaarenddef 828e8c4abbbSBram Moolenaar 829006ad48bSBram Moolenaardef Test_throw_vimscript() 830f5be8cdbSBram Moolenaar # only checks line continuation 831006ad48bSBram Moolenaar let lines =<< trim END 832006ad48bSBram Moolenaar vim9script 833006ad48bSBram Moolenaar try 834006ad48bSBram Moolenaar throw 'one' 835006ad48bSBram Moolenaar .. 'two' 836006ad48bSBram Moolenaar catch 837006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 838006ad48bSBram Moolenaar endtry 839006ad48bSBram Moolenaar END 840006ad48bSBram Moolenaar CheckScriptSuccess(lines) 841006ad48bSBram Moolenaarenddef 842006ad48bSBram Moolenaar 84337c83711SBram Moolenaardef Test_cexpr_vimscript() 844f5be8cdbSBram Moolenaar # only checks line continuation 84537c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 84637c83711SBram Moolenaar let lines =<< trim END 84737c83711SBram Moolenaar vim9script 84837c83711SBram Moolenaar cexpr 'File' 84937c83711SBram Moolenaar .. ' someFile' .. 85037c83711SBram Moolenaar ' line 19' 85137c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 85237c83711SBram Moolenaar END 85337c83711SBram Moolenaar CheckScriptSuccess(lines) 85437c83711SBram Moolenaar set errorformat& 85537c83711SBram Moolenaarenddef 85637c83711SBram Moolenaar 857b209750bSBram Moolenaardef Test_list_vimscript() 858b209750bSBram Moolenaar # checks line continuation and comments 859b209750bSBram Moolenaar let lines =<< trim END 860b209750bSBram Moolenaar vim9script 861b209750bSBram Moolenaar let mylist = [ 862b209750bSBram Moolenaar 'one', 863b209750bSBram Moolenaar # comment 864b209750bSBram Moolenaar 'two', # empty line follows 865b209750bSBram Moolenaar 866b209750bSBram Moolenaar 'three', 867b209750bSBram Moolenaar ] 868b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 869b209750bSBram Moolenaar END 870b209750bSBram Moolenaar CheckScriptSuccess(lines) 871b209750bSBram Moolenaarenddef 872b209750bSBram Moolenaar 8732a1381c3SBram Moolenaarif has('channel') 87440ee466cSBram Moolenaar let someJob = test_null_job() 87540ee466cSBram Moolenaar 87640ee466cSBram Moolenaar def FuncWithError() 87740ee466cSBram Moolenaar echomsg g:someJob 87840ee466cSBram Moolenaar enddef 87940ee466cSBram Moolenaar 88040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 88140ee466cSBram Moolenaar try 88240ee466cSBram Moolenaar call FuncWithError() 88340ee466cSBram Moolenaar catch 88440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 88540ee466cSBram Moolenaar endtry 88640ee466cSBram Moolenaar endfunc 8872a1381c3SBram Moolenaarendif 88840ee466cSBram Moolenaar 8898a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8908a7d6542SBram Moolenaar vim9script 8918a7d6542SBram Moolenaar let name: string = 'bob' 8928a7d6542SBram Moolenaar def Concat(arg: string): string 8938a7d6542SBram Moolenaar return name .. arg 8948a7d6542SBram Moolenaar enddef 895227a69deSBram Moolenaar g:result = Concat('bie') 896227a69deSBram Moolenaar g:localname = name 8978a7d6542SBram Moolenaar 8988a7d6542SBram Moolenaar export const CONST = 1234 8998a7d6542SBram Moolenaar export let exported = 9876 9006e587dcbSBram Moolenaar export let exp_name = 'John' 9018a7d6542SBram Moolenaar export def Exported(): string 9028a7d6542SBram Moolenaar return 'Exported' 9038a7d6542SBram Moolenaar enddef 9048a7d6542SBram MoolenaarEND 9058a7d6542SBram Moolenaar 9065269bd2aSBram Moolenaardef Test_vim9_import_export() 9078a7d6542SBram Moolenaar let import_script_lines =<< trim END 9088a7d6542SBram Moolenaar vim9script 9098a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9108a7d6542SBram Moolenaar g:imported = exported 9116e587dcbSBram Moolenaar exported += 3 9126e587dcbSBram Moolenaar g:imported_added = exported 9138a7d6542SBram Moolenaar g:imported_func = Exported() 9146e587dcbSBram Moolenaar 9156e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9166e587dcbSBram Moolenaar g:imported_name = exp_name 9176e587dcbSBram Moolenaar exp_name ..= ' Doe' 9186e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9195381c7a1SBram Moolenaar g:imported_later = exported 9208a7d6542SBram Moolenaar END 9218a7d6542SBram Moolenaar 9228a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9238a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9248a7d6542SBram Moolenaar 9258a7d6542SBram Moolenaar source Ximport.vim 9268a7d6542SBram Moolenaar 9278a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9288a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9298a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9306e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9315381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9328a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 9336e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9346e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9358a7d6542SBram Moolenaar assert_false(exists('g:name')) 9368a7d6542SBram Moolenaar 9378a7d6542SBram Moolenaar unlet g:result 9388a7d6542SBram Moolenaar unlet g:localname 9398a7d6542SBram Moolenaar unlet g:imported 9406e587dcbSBram Moolenaar unlet g:imported_added 9415381c7a1SBram Moolenaar unlet g:imported_later 9428a7d6542SBram Moolenaar unlet g:imported_func 9436e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9448a7d6542SBram Moolenaar delete('Ximport.vim') 945f2d5c240SBram Moolenaar 9461c991144SBram Moolenaar # similar, with line breaks 9471c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 9481c991144SBram Moolenaar vim9script 9491c991144SBram Moolenaar import { 9501c991144SBram Moolenaar exported, 9511c991144SBram Moolenaar Exported, 9521c991144SBram Moolenaar } 9531c991144SBram Moolenaar from 9541c991144SBram Moolenaar './Xexport.vim' 9551c991144SBram Moolenaar g:imported = exported 9561c991144SBram Moolenaar exported += 5 9571c991144SBram Moolenaar g:imported_added = exported 9581c991144SBram Moolenaar g:imported_func = Exported() 9591c991144SBram Moolenaar END 9601c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9611c991144SBram Moolenaar source Ximport_lbr.vim 9621c991144SBram Moolenaar 9631c991144SBram Moolenaar assert_equal(9876, g:imported) 9641c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9651c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9661c991144SBram Moolenaar 9671c991144SBram Moolenaar # exported script not sourced again 9681c991144SBram Moolenaar assert_false(exists('g:result')) 9691c991144SBram Moolenaar unlet g:imported 9701c991144SBram Moolenaar unlet g:imported_added 9711c991144SBram Moolenaar unlet g:imported_func 9721c991144SBram Moolenaar delete('Ximport_lbr.vim') 9731c991144SBram Moolenaar 9741c991144SBram Moolenaar # import inside :def function 9755381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 9765381c7a1SBram Moolenaar vim9script 9775381c7a1SBram Moolenaar def ImportInDef() 9785381c7a1SBram Moolenaar import exported from './Xexport.vim' 9795381c7a1SBram Moolenaar g:imported = exported 9805381c7a1SBram Moolenaar exported += 7 9815381c7a1SBram Moolenaar g:imported_added = exported 9825381c7a1SBram Moolenaar enddef 9835381c7a1SBram Moolenaar ImportInDef() 9845381c7a1SBram Moolenaar END 9855381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9865381c7a1SBram Moolenaar source Ximport2.vim 987f5be8cdbSBram Moolenaar # TODO: this should be 9879 9885381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9895381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9905381c7a1SBram Moolenaar unlet g:imported 9915381c7a1SBram Moolenaar unlet g:imported_added 9925381c7a1SBram Moolenaar delete('Ximport2.vim') 9935381c7a1SBram Moolenaar 994f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 995f2d5c240SBram Moolenaar vim9script 996f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 997f2d5c240SBram Moolenaar def UseExport() 998f2d5c240SBram Moolenaar g:imported = Export.exported 999f2d5c240SBram Moolenaar enddef 1000f2d5c240SBram Moolenaar UseExport() 1001f2d5c240SBram Moolenaar END 1002f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1003f2d5c240SBram Moolenaar source Ximport.vim 10045381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1005f2d5c240SBram Moolenaar 1006599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1007599c89c8SBram Moolenaar vim9script 1008599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1009599c89c8SBram Moolenaar def Func() 1010599c89c8SBram Moolenaar let dummy = 1 1011599c89c8SBram Moolenaar let imported = Export + dummy 1012599c89c8SBram Moolenaar enddef 1013822ba247SBram Moolenaar defcompile 1014599c89c8SBram Moolenaar END 1015599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1016599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1017599c89c8SBram Moolenaar 1018599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1019599c89c8SBram Moolenaar vim9script 1020599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1021599c89c8SBram Moolenaar def Func() 1022599c89c8SBram Moolenaar let imported = Export . exported 1023599c89c8SBram Moolenaar enddef 1024822ba247SBram Moolenaar defcompile 1025599c89c8SBram Moolenaar END 1026599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1027599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1028599c89c8SBram Moolenaar 1029599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1030599c89c8SBram Moolenaar vim9script 1031599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1032599c89c8SBram Moolenaar def Func() 1033599c89c8SBram Moolenaar let imported = Export. 1034599c89c8SBram Moolenaar enddef 1035822ba247SBram Moolenaar defcompile 1036599c89c8SBram Moolenaar END 1037599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1038599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1039599c89c8SBram Moolenaar 10401c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 10411c991144SBram Moolenaar vim9script 10421c991144SBram Moolenaar import * 10431c991144SBram Moolenaar as Export 10441c991144SBram Moolenaar from 10451c991144SBram Moolenaar './Xexport.vim' 10461c991144SBram Moolenaar def UseExport() 10471c991144SBram Moolenaar g:imported = Export.exported 10481c991144SBram Moolenaar enddef 10491c991144SBram Moolenaar UseExport() 10501c991144SBram Moolenaar END 10511c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10521c991144SBram Moolenaar source Ximport.vim 10531c991144SBram Moolenaar assert_equal(9883, g:imported) 10541c991144SBram Moolenaar 1055f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1056f2d5c240SBram Moolenaar vim9script 1057f2d5c240SBram Moolenaar import * from './Xexport.vim' 1058f2d5c240SBram Moolenaar END 1059f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1060f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1061f2d5c240SBram Moolenaar 1062f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1063fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1064fa29c8abSBram Moolenaar vim9script 1065fa29c8abSBram Moolenaar import name from './Xexport.vim' 1066fa29c8abSBram Moolenaar END 1067fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1068fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1069fa29c8abSBram Moolenaar 1070f5be8cdbSBram Moolenaar # try to import something that is already defined 10715269bd2aSBram Moolenaar let import_already_defined =<< trim END 10725269bd2aSBram Moolenaar vim9script 10735269bd2aSBram Moolenaar let exported = 'something' 10745269bd2aSBram Moolenaar import exported from './Xexport.vim' 10755269bd2aSBram Moolenaar END 10765269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10775269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10785269bd2aSBram Moolenaar 1079f5be8cdbSBram Moolenaar # try to import something that is already defined 10805269bd2aSBram Moolenaar import_already_defined =<< trim END 10815269bd2aSBram Moolenaar vim9script 10825269bd2aSBram Moolenaar let exported = 'something' 10835269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10845269bd2aSBram Moolenaar END 10855269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10865269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10875269bd2aSBram Moolenaar 1088f5be8cdbSBram Moolenaar # try to import something that is already defined 10895269bd2aSBram Moolenaar import_already_defined =<< trim END 10905269bd2aSBram Moolenaar vim9script 10915269bd2aSBram Moolenaar let exported = 'something' 10925269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10935269bd2aSBram Moolenaar END 10945269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10955269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10965269bd2aSBram Moolenaar 1097f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1098fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1099fa29c8abSBram Moolenaar vim9script 1100fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1101fa29c8abSBram Moolenaar END 1102fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1103fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1104fa29c8abSBram Moolenaar 1105fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1106fa29c8abSBram Moolenaar vim9script 1107fa29c8abSBram Moolenaar import name './Xexport.vim' 1108fa29c8abSBram Moolenaar END 1109fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1110fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1111fa29c8abSBram Moolenaar 1112fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1113fa29c8abSBram Moolenaar vim9script 1114fa29c8abSBram Moolenaar import name from Xexport.vim 1115fa29c8abSBram Moolenaar END 1116fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1117fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1118fa29c8abSBram Moolenaar 1119fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1120fa29c8abSBram Moolenaar vim9script 1121fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1122fa29c8abSBram Moolenaar END 1123fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1124fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1125fa29c8abSBram Moolenaar 1126fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1127fa29c8abSBram Moolenaar vim9script 1128fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1129fa29c8abSBram Moolenaar END 11305269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 11315269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1132fa29c8abSBram Moolenaar 1133f2d5c240SBram Moolenaar delete('Ximport.vim') 11345269bd2aSBram Moolenaar delete('Ximport3.vim') 11358a7d6542SBram Moolenaar delete('Xexport.vim') 11368a7d6542SBram Moolenaar 1137f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1138750802b5SBram Moolenaar set cpo&vi 1139750802b5SBram Moolenaar let cpo_before = &cpo 1140750802b5SBram Moolenaar let lines =<< trim END 1141750802b5SBram Moolenaar vim9script 1142750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1143750802b5SBram Moolenaar END 1144750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1145750802b5SBram Moolenaar source Xvim9_script 1146750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1147750802b5SBram Moolenaar set cpo&vim 1148750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1149750802b5SBram Moolenaar delete('Xvim9_script') 1150750802b5SBram Moolenaarenddef 1151750802b5SBram Moolenaar 1152750802b5SBram Moolenaardef Test_vim9script_fails() 11538a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11548a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1155750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 11569721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 11579b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1158750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1159750802b5SBram Moolenaar 1160c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1161c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1162c785b9a7SBram Moolenaar 1163750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1164a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 11658a7d6542SBram Moolenaarenddef 11668a7d6542SBram Moolenaar 1167f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1168101f4810SBram Moolenaar CheckRunVimInTerminal 1169101f4810SBram Moolenaar 11709bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1171c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11729bb3eb3eSBram Moolenaarendfunc 11739bb3eb3eSBram Moolenaar 1174c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1175101f4810SBram Moolenaar let export =<< trim END 1176101f4810SBram Moolenaar vim9script 1177101f4810SBram Moolenaar export def Foo(): number 1178101f4810SBram Moolenaar return 0 1179101f4810SBram Moolenaar enddef 1180101f4810SBram Moolenaar END 11819bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1182101f4810SBram Moolenaar 11839bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 11849bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11859bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1186101f4810SBram Moolenaar 11879bb3eb3eSBram Moolenaar delete('Xexport.vim') 11889bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11899bb3eb3eSBram Moolenaarenddef 1190101f4810SBram Moolenaar 11914c17ad94SBram Moolenaardef Test_vim9script_reload_import() 11928a7d6542SBram Moolenaar let lines =<< trim END 11938a7d6542SBram Moolenaar vim9script 11948a7d6542SBram Moolenaar const var = '' 11958a7d6542SBram Moolenaar let valone = 1234 11968a7d6542SBram Moolenaar def MyFunc(arg: string) 11978a7d6542SBram Moolenaar valone = 5678 11988a7d6542SBram Moolenaar enddef 11998a7d6542SBram Moolenaar END 12008a7d6542SBram Moolenaar let morelines =<< trim END 12018a7d6542SBram Moolenaar let valtwo = 222 12028a7d6542SBram Moolenaar export def GetValtwo(): number 12038a7d6542SBram Moolenaar return valtwo 12048a7d6542SBram Moolenaar enddef 12058a7d6542SBram Moolenaar END 120603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 12078a7d6542SBram Moolenaar source Xreload.vim 12088a7d6542SBram Moolenaar source Xreload.vim 12098a7d6542SBram Moolenaar source Xreload.vim 12108a7d6542SBram Moolenaar 12118a7d6542SBram Moolenaar let testlines =<< trim END 12128a7d6542SBram Moolenaar vim9script 12138a7d6542SBram Moolenaar def TheFunc() 12148a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 12158a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 12168a7d6542SBram Moolenaar enddef 12178a7d6542SBram Moolenaar TheFunc() 12188a7d6542SBram Moolenaar END 12198a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 12208a7d6542SBram Moolenaar source Ximport.vim 12218a7d6542SBram Moolenaar 1222f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1223f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 12248a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12258a7d6542SBram Moolenaar source Ximport.vim 12268a7d6542SBram Moolenaar 1227f5be8cdbSBram Moolenaar # cannot declare a var twice 12288a7d6542SBram Moolenaar lines =<< trim END 12298a7d6542SBram Moolenaar vim9script 12308a7d6542SBram Moolenaar let valone = 1234 12318a7d6542SBram Moolenaar let valone = 5678 12328a7d6542SBram Moolenaar END 12338a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12348a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 12358a7d6542SBram Moolenaar 12368a7d6542SBram Moolenaar delete('Xreload.vim') 12378a7d6542SBram Moolenaar delete('Ximport.vim') 12388a7d6542SBram Moolenaarenddef 12398a7d6542SBram Moolenaar 1240fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1241fe465a01SBram Moolenaar" script-local name. 1242fe465a01SBram Moolenaardef Test_vim9script_funcref() 1243fe465a01SBram Moolenaar let sortlines =<< trim END 1244fe465a01SBram Moolenaar vim9script 1245fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1246bed36b93SBram Moolenaar return i2 - i1 1247fe465a01SBram Moolenaar enddef 1248fe465a01SBram Moolenaar 1249fe465a01SBram Moolenaar export def FastSort(): list<number> 1250fe465a01SBram Moolenaar return range(5)->sort(Compare) 1251fe465a01SBram Moolenaar enddef 1252fe465a01SBram Moolenaar END 1253fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1254fe465a01SBram Moolenaar 1255fe465a01SBram Moolenaar let lines =<< trim END 1256fe465a01SBram Moolenaar vim9script 1257fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1258fe465a01SBram Moolenaar def Test() 1259fe465a01SBram Moolenaar g:result = FastSort() 1260fe465a01SBram Moolenaar enddef 1261fe465a01SBram Moolenaar Test() 1262fe465a01SBram Moolenaar END 1263fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1264fe465a01SBram Moolenaar 1265fe465a01SBram Moolenaar source Xscript.vim 1266fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1267fe465a01SBram Moolenaar 1268fe465a01SBram Moolenaar unlet g:result 1269fe465a01SBram Moolenaar delete('Xsort.vim') 1270fe465a01SBram Moolenaar delete('Xscript.vim') 1271fe465a01SBram Moolenaarenddef 1272fe465a01SBram Moolenaar 1273c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1274c620c055SBram Moolenaar" script where FastFilter() is called from. 1275c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1276c620c055SBram Moolenaar let filterLines =<< trim END 1277c620c055SBram Moolenaar vim9script 1278c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1279c620c055SBram Moolenaar return idx % 2 == 1 1280c620c055SBram Moolenaar enddef 1281c620c055SBram Moolenaar export def FastFilter(): list<number> 1282c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1283c620c055SBram Moolenaar enddef 1284c620c055SBram Moolenaar END 1285c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1286c620c055SBram Moolenaar 1287c620c055SBram Moolenaar let lines =<< trim END 1288c620c055SBram Moolenaar vim9script 1289c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1290c620c055SBram Moolenaar def Test() 1291c620c055SBram Moolenaar let x: list<number> = FastFilter() 1292c620c055SBram Moolenaar enddef 1293c620c055SBram Moolenaar Test() 1294c620c055SBram Moolenaar END 1295c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1296c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1297c620c055SBram Moolenaar 1298c620c055SBram Moolenaar delete('Xfilter.vim') 1299c620c055SBram Moolenaar delete('Ximport.vim') 1300c620c055SBram Moolenaarenddef 1301c620c055SBram Moolenaar 13024c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 13034c17ad94SBram Moolenaar let first_lines =<< trim END 13044c17ad94SBram Moolenaar vim9script 13054c17ad94SBram Moolenaar def FuncYes(): string 13064c17ad94SBram Moolenaar return 'yes' 13074c17ad94SBram Moolenaar enddef 13084c17ad94SBram Moolenaar END 130903afdcf1SBram Moolenaar let withno_lines =<< trim END 13104c17ad94SBram Moolenaar def FuncNo(): string 13114c17ad94SBram Moolenaar return 'no' 13124c17ad94SBram Moolenaar enddef 13134c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 13144c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 13154c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 131603afdcf1SBram Moolenaar enddef 131703afdcf1SBram Moolenaar END 131803afdcf1SBram Moolenaar let nono_lines =<< trim END 131903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 132003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 13214c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 13224c17ad94SBram Moolenaar enddef 13234c17ad94SBram Moolenaar END 13244c17ad94SBram Moolenaar 13254c17ad94SBram Moolenaar # FuncNo() is defined 132603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13274c17ad94SBram Moolenaar source Xreloaded.vim 13284c17ad94SBram Moolenaar g:DoCheck(true) 13294c17ad94SBram Moolenaar 13304c17ad94SBram Moolenaar # FuncNo() is not redefined 133103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 13324c17ad94SBram Moolenaar source Xreloaded.vim 133303afdcf1SBram Moolenaar g:DoCheck() 13344c17ad94SBram Moolenaar 13354c17ad94SBram Moolenaar # FuncNo() is back 133603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13374c17ad94SBram Moolenaar source Xreloaded.vim 133803afdcf1SBram Moolenaar g:DoCheck() 13394c17ad94SBram Moolenaar 13404c17ad94SBram Moolenaar delete('Xreloaded.vim') 13414c17ad94SBram Moolenaarenddef 13424c17ad94SBram Moolenaar 134389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 134489483d40SBram Moolenaar # write the script with a script-local variable 134589483d40SBram Moolenaar let lines =<< trim END 134689483d40SBram Moolenaar vim9script 134789483d40SBram Moolenaar let var = 'string' 134889483d40SBram Moolenaar END 134989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 135089483d40SBram Moolenaar source XreloadVar.vim 135189483d40SBram Moolenaar 135289483d40SBram Moolenaar # now write the script using the same variable locally - works 135389483d40SBram Moolenaar lines =<< trim END 135489483d40SBram Moolenaar vim9script 135589483d40SBram Moolenaar def Func() 135689483d40SBram Moolenaar let var = 'string' 135789483d40SBram Moolenaar enddef 135889483d40SBram Moolenaar END 135989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 136089483d40SBram Moolenaar source XreloadVar.vim 136189483d40SBram Moolenaar 136289483d40SBram Moolenaar delete('XreloadVar.vim') 136389483d40SBram Moolenaarenddef 136489483d40SBram Moolenaar 13658a7d6542SBram Moolenaardef Test_import_absolute() 13668a7d6542SBram Moolenaar let import_lines = [ 1367e6085c53SBram Moolenaar 'vim9script', 1368e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1369e6085c53SBram Moolenaar 'def UseExported()', 1370e6085c53SBram Moolenaar ' g:imported_abs = exported', 1371e6085c53SBram Moolenaar ' exported = 8888', 1372e6085c53SBram Moolenaar ' g:imported_after = exported', 1373e6085c53SBram Moolenaar 'enddef', 1374e6085c53SBram Moolenaar 'UseExported()', 1375e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1376e6085c53SBram Moolenaar ] 13778a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13788a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13798a7d6542SBram Moolenaar 13808a7d6542SBram Moolenaar source Ximport_abs.vim 13818a7d6542SBram Moolenaar 13828a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13834e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1384675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1385675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1386675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1387675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1388675f716eSBram Moolenaar 'exported = 8888.*' .. 1389675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1390675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1391675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1392675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1393e6085c53SBram Moolenaar g:import_disassembled) 13948a7d6542SBram Moolenaar unlet g:imported_abs 13954e12a5dfSBram Moolenaar unlet g:import_disassembled 13968a7d6542SBram Moolenaar 13978a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13988a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13998a7d6542SBram Moolenaarenddef 14008a7d6542SBram Moolenaar 14018a7d6542SBram Moolenaardef Test_import_rtp() 14028a7d6542SBram Moolenaar let import_lines = [ 1403e6085c53SBram Moolenaar 'vim9script', 1404e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1405e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1406e6085c53SBram Moolenaar ] 14078a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 14088a7d6542SBram Moolenaar mkdir('import') 14098a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 14108a7d6542SBram Moolenaar 14118a7d6542SBram Moolenaar let save_rtp = &rtp 14128a7d6542SBram Moolenaar &rtp = getcwd() 14138a7d6542SBram Moolenaar source Ximport_rtp.vim 14148a7d6542SBram Moolenaar &rtp = save_rtp 14158a7d6542SBram Moolenaar 14168a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 14178a7d6542SBram Moolenaar unlet g:imported_rtp 14188a7d6542SBram Moolenaar 14198a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 142089483d40SBram Moolenaar delete('import', 'rf') 14218a7d6542SBram Moolenaarenddef 14228a7d6542SBram Moolenaar 142325e0f586SBram Moolenaardef Test_import_compile_error() 142425e0f586SBram Moolenaar let export_lines = [ 142525e0f586SBram Moolenaar 'vim9script', 142625e0f586SBram Moolenaar 'export def ExpFunc(): string', 142725e0f586SBram Moolenaar ' return notDefined', 142825e0f586SBram Moolenaar 'enddef', 142925e0f586SBram Moolenaar ] 143025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 143125e0f586SBram Moolenaar 143225e0f586SBram Moolenaar let import_lines = [ 143325e0f586SBram Moolenaar 'vim9script', 143425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 143525e0f586SBram Moolenaar 'def ImpFunc()', 143625e0f586SBram Moolenaar ' echo ExpFunc()', 143725e0f586SBram Moolenaar 'enddef', 143825e0f586SBram Moolenaar 'defcompile', 143925e0f586SBram Moolenaar ] 144025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 144125e0f586SBram Moolenaar 144225e0f586SBram Moolenaar try 144325e0f586SBram Moolenaar source Ximport.vim 144425e0f586SBram Moolenaar catch /E1001/ 1445f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 144625e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 144725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 144825e0f586SBram Moolenaar endtry 144925e0f586SBram Moolenaar 145025e0f586SBram Moolenaar delete('Xexported.vim') 145125e0f586SBram Moolenaar delete('Ximport.vim') 145225e0f586SBram Moolenaarenddef 145325e0f586SBram Moolenaar 14548a7d6542SBram Moolenaardef Test_fixed_size_list() 1455f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 14568a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 14578a7d6542SBram Moolenaar l->remove(0) 14588a7d6542SBram Moolenaar l->add(5) 14598a7d6542SBram Moolenaar l->insert(99, 1) 14600f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14618a7d6542SBram Moolenaarenddef 14628a7d6542SBram Moolenaar 1463158906cfSBram Moolenaardef IfElse(what: number): string 1464158906cfSBram Moolenaar let res = '' 1465158906cfSBram Moolenaar if what == 1 1466158906cfSBram Moolenaar res = "one" 1467158906cfSBram Moolenaar elseif what == 2 1468158906cfSBram Moolenaar res = "two" 1469a259d8d3SBram Moolenaar else 1470158906cfSBram Moolenaar res = "three" 1471a259d8d3SBram Moolenaar endif 1472158906cfSBram Moolenaar return res 1473a259d8d3SBram Moolenaarenddef 1474a259d8d3SBram Moolenaar 1475158906cfSBram Moolenaardef Test_if_elseif_else() 1476158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1477158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1478158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 14790f18b6d1SBram Moolenaarenddef 14800f18b6d1SBram Moolenaar 1481e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1482e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1483e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1484e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1485e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1486585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1487e8c4abbbSBram Moolenaarenddef 1488e8c4abbbSBram Moolenaar 14896d69bf60SBram Moolenaarlet g:bool_true = v:true 14906d69bf60SBram Moolenaarlet g:bool_false = v:false 14916d69bf60SBram Moolenaar 14926d69bf60SBram Moolenaardef Test_if_const_expr() 14936d69bf60SBram Moolenaar let res = false 14946d69bf60SBram Moolenaar if true ? true : false 14956d69bf60SBram Moolenaar res = true 14966d69bf60SBram Moolenaar endif 14976d69bf60SBram Moolenaar assert_equal(true, res) 14986d69bf60SBram Moolenaar 1499585fea7bSBram Moolenaar g:glob = 2 1500585fea7bSBram Moolenaar if false 15016797966dSBram Moolenaar execute('g:glob = 3') 1502585fea7bSBram Moolenaar endif 1503585fea7bSBram Moolenaar assert_equal(2, g:glob) 1504585fea7bSBram Moolenaar if true 15056797966dSBram Moolenaar execute('g:glob = 3') 1506585fea7bSBram Moolenaar endif 1507585fea7bSBram Moolenaar assert_equal(3, g:glob) 1508585fea7bSBram Moolenaar 15096d69bf60SBram Moolenaar res = false 15106d69bf60SBram Moolenaar if g:bool_true ? true : false 15116d69bf60SBram Moolenaar res = true 15126d69bf60SBram Moolenaar endif 15136d69bf60SBram Moolenaar assert_equal(true, res) 15146d69bf60SBram Moolenaar 15156d69bf60SBram Moolenaar res = false 15166d69bf60SBram Moolenaar if true ? g:bool_true : false 15176d69bf60SBram Moolenaar res = true 15186d69bf60SBram Moolenaar endif 15196d69bf60SBram Moolenaar assert_equal(true, res) 15206d69bf60SBram Moolenaar 15216d69bf60SBram Moolenaar res = false 15226d69bf60SBram Moolenaar if true ? true : g:bool_false 15236d69bf60SBram Moolenaar res = true 15246d69bf60SBram Moolenaar endif 15256d69bf60SBram Moolenaar assert_equal(true, res) 15266d69bf60SBram Moolenaar 15276d69bf60SBram Moolenaar res = false 15286d69bf60SBram Moolenaar if true ? false : true 15296d69bf60SBram Moolenaar res = true 15306d69bf60SBram Moolenaar endif 15316d69bf60SBram Moolenaar assert_equal(false, res) 15326d69bf60SBram Moolenaar 15336d69bf60SBram Moolenaar res = false 15346d69bf60SBram Moolenaar if false ? false : true 15356d69bf60SBram Moolenaar res = true 15366d69bf60SBram Moolenaar endif 15376d69bf60SBram Moolenaar assert_equal(true, res) 15386d69bf60SBram Moolenaar 15396d69bf60SBram Moolenaar res = false 15406d69bf60SBram Moolenaar if false ? true : false 15416d69bf60SBram Moolenaar res = true 15426d69bf60SBram Moolenaar endif 15436d69bf60SBram Moolenaar assert_equal(false, res) 15446d69bf60SBram Moolenaar 15456d69bf60SBram Moolenaar res = false 1546e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1547e8c4abbbSBram Moolenaar res = true 1548e8c4abbbSBram Moolenaar endif 1549e8c4abbbSBram Moolenaar assert_equal(false, res) 1550e8c4abbbSBram Moolenaar 1551e8c4abbbSBram Moolenaar res = false 15526d69bf60SBram Moolenaar if true && true 15536d69bf60SBram Moolenaar res = true 15546d69bf60SBram Moolenaar endif 15556d69bf60SBram Moolenaar assert_equal(true, res) 15566d69bf60SBram Moolenaar 15576d69bf60SBram Moolenaar res = false 15586d69bf60SBram Moolenaar if true && false 15596d69bf60SBram Moolenaar res = true 15606d69bf60SBram Moolenaar endif 15616d69bf60SBram Moolenaar assert_equal(false, res) 15626d69bf60SBram Moolenaar 15636d69bf60SBram Moolenaar res = false 15646d69bf60SBram Moolenaar if g:bool_true && false 15656d69bf60SBram Moolenaar res = true 15666d69bf60SBram Moolenaar endif 15676d69bf60SBram Moolenaar assert_equal(false, res) 15686d69bf60SBram Moolenaar 15696d69bf60SBram Moolenaar res = false 15706d69bf60SBram Moolenaar if true && g:bool_false 15716d69bf60SBram Moolenaar res = true 15726d69bf60SBram Moolenaar endif 15736d69bf60SBram Moolenaar assert_equal(false, res) 15746d69bf60SBram Moolenaar 15756d69bf60SBram Moolenaar res = false 15766d69bf60SBram Moolenaar if false && false 15776d69bf60SBram Moolenaar res = true 15786d69bf60SBram Moolenaar endif 15796d69bf60SBram Moolenaar assert_equal(false, res) 15806d69bf60SBram Moolenaar 15816d69bf60SBram Moolenaar res = false 15826d69bf60SBram Moolenaar if true || false 15836d69bf60SBram Moolenaar res = true 15846d69bf60SBram Moolenaar endif 15856d69bf60SBram Moolenaar assert_equal(true, res) 15866d69bf60SBram Moolenaar 15876d69bf60SBram Moolenaar res = false 15886d69bf60SBram Moolenaar if g:bool_true || false 15896d69bf60SBram Moolenaar res = true 15906d69bf60SBram Moolenaar endif 15916d69bf60SBram Moolenaar assert_equal(true, res) 15926d69bf60SBram Moolenaar 15936d69bf60SBram Moolenaar res = false 15946d69bf60SBram Moolenaar if true || g:bool_false 15956d69bf60SBram Moolenaar res = true 15966d69bf60SBram Moolenaar endif 15976d69bf60SBram Moolenaar assert_equal(true, res) 15986d69bf60SBram Moolenaar 15996d69bf60SBram Moolenaar res = false 16006d69bf60SBram Moolenaar if false || false 16016d69bf60SBram Moolenaar res = true 16026d69bf60SBram Moolenaar endif 16036d69bf60SBram Moolenaar assert_equal(false, res) 160480c34ca3SBram Moolenaarenddef 16056d69bf60SBram Moolenaar 160680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 160780c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 160880c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1609e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1610e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16116d69bf60SBram Moolenaarenddef 16126d69bf60SBram Moolenaar 161372abcf42SBram Moolenaardef RunNested(i: number): number 161472abcf42SBram Moolenaar let x: number = 0 161572abcf42SBram Moolenaar if i % 2 161672abcf42SBram Moolenaar if 1 1617f5be8cdbSBram Moolenaar # comment 161872abcf42SBram Moolenaar else 1619f5be8cdbSBram Moolenaar # comment 162072abcf42SBram Moolenaar endif 162172abcf42SBram Moolenaar x += 1 162272abcf42SBram Moolenaar else 162372abcf42SBram Moolenaar x += 1000 162472abcf42SBram Moolenaar endif 162572abcf42SBram Moolenaar return x 162672abcf42SBram Moolenaarenddef 162772abcf42SBram Moolenaar 162872abcf42SBram Moolenaardef Test_nested_if() 162972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 163072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 163172abcf42SBram Moolenaarenddef 163272abcf42SBram Moolenaar 1633ad39c094SBram Moolenaardef Test_execute_cmd() 1634ad39c094SBram Moolenaar new 1635ad39c094SBram Moolenaar setline(1, 'default') 1636ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1637ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1638a72cfb80SBram Moolenaar 1639a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1640a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1641a72cfb80SBram Moolenaar 1642ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1643ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1644a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1645ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1646a72cfb80SBram Moolenaar 1647ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1648ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1649a72cfb80SBram Moolenaar 1650ad39c094SBram Moolenaar let cmd_first = 'call ' 1651ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1652ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1653ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1654ad39c094SBram Moolenaar bwipe! 1655585fea7bSBram Moolenaar 1656585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1657a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1658ad39c094SBram Moolenaarenddef 1659ad39c094SBram Moolenaar 166047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1661f5be8cdbSBram Moolenaar # only checks line continuation 166247e880d6SBram Moolenaar let lines =<< trim END 166347e880d6SBram Moolenaar vim9script 166447e880d6SBram Moolenaar execute 'g:someVar' 166547e880d6SBram Moolenaar .. ' = ' .. 166647e880d6SBram Moolenaar '28' 166747e880d6SBram Moolenaar assert_equal(28, g:someVar) 166847e880d6SBram Moolenaar unlet g:someVar 166947e880d6SBram Moolenaar END 167047e880d6SBram Moolenaar CheckScriptSuccess(lines) 167147e880d6SBram Moolenaarenddef 167247e880d6SBram Moolenaar 1673ad39c094SBram Moolenaardef Test_echo_cmd() 1674a72cfb80SBram Moolenaar echo 'some' # comment 1675585fea7bSBram Moolenaar echon 'thing' 1676ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1677ad39c094SBram Moolenaar 1678a72cfb80SBram Moolenaar echo "some" # comment 1679a72cfb80SBram Moolenaar echon "thing" 1680a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1681a72cfb80SBram Moolenaar 1682ad39c094SBram Moolenaar let str1 = 'some' 1683ad39c094SBram Moolenaar let str2 = 'more' 1684ad39c094SBram Moolenaar echo str1 str2 1685ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1686a72cfb80SBram Moolenaar 1687a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1688ad39c094SBram Moolenaarenddef 1689ad39c094SBram Moolenaar 1690f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1691f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1692f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1693f93c7feaSBram Moolenaar echo 'clear' 1694df069eecSBram Moolenaar :1messages 1695f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1696f93c7feaSBram Moolenaar 1697f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1698f93c7feaSBram Moolenaarenddef 1699f93c7feaSBram Moolenaar 170047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1701f5be8cdbSBram Moolenaar # only checks line continuation 170247e880d6SBram Moolenaar let lines =<< trim END 170347e880d6SBram Moolenaar vim9script 170447e880d6SBram Moolenaar echomsg 'here' 170547e880d6SBram Moolenaar .. ' is ' .. 170647e880d6SBram Moolenaar 'a message' 170747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 170847e880d6SBram Moolenaar END 170947e880d6SBram Moolenaar CheckScriptSuccess(lines) 171047e880d6SBram Moolenaarenddef 171147e880d6SBram Moolenaar 1712f93c7feaSBram Moolenaardef Test_echoerr_cmd() 171340ee466cSBram Moolenaar try 171440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 171540ee466cSBram Moolenaar catch 171640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 171740ee466cSBram Moolenaar endtry 1718f93c7feaSBram Moolenaarenddef 1719f93c7feaSBram Moolenaar 172047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1721f5be8cdbSBram Moolenaar # only checks line continuation 172247e880d6SBram Moolenaar let lines =<< trim END 172347e880d6SBram Moolenaar vim9script 172447e880d6SBram Moolenaar try 172547e880d6SBram Moolenaar echoerr 'this' 172647e880d6SBram Moolenaar .. ' is ' .. 172747e880d6SBram Moolenaar 'wrong' 172847e880d6SBram Moolenaar catch 172947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 173047e880d6SBram Moolenaar endtry 173147e880d6SBram Moolenaar END 173247e880d6SBram Moolenaar CheckScriptSuccess(lines) 173347e880d6SBram Moolenaarenddef 173447e880d6SBram Moolenaar 173541fe0617SBram Moolenaardef Test_for_outside_of_function() 173641fe0617SBram Moolenaar let lines =<< trim END 173741fe0617SBram Moolenaar vim9script 173841fe0617SBram Moolenaar new 173941fe0617SBram Moolenaar for var in range(0, 3) 174041fe0617SBram Moolenaar append(line('$'), var) 174141fe0617SBram Moolenaar endfor 174241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 174341fe0617SBram Moolenaar bwipe! 174441fe0617SBram Moolenaar END 174541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 174641fe0617SBram Moolenaar source Xvim9for.vim 174741fe0617SBram Moolenaar delete('Xvim9for.vim') 174841fe0617SBram Moolenaarenddef 17498a7d6542SBram Moolenaar 1750e8c4abbbSBram Moolenaardef Test_for_loop() 1751e8c4abbbSBram Moolenaar let result = '' 1752e8c4abbbSBram Moolenaar for cnt in range(7) 1753e8c4abbbSBram Moolenaar if cnt == 4 1754e8c4abbbSBram Moolenaar break 1755e8c4abbbSBram Moolenaar endif 1756e8c4abbbSBram Moolenaar if cnt == 2 1757e8c4abbbSBram Moolenaar continue 1758e8c4abbbSBram Moolenaar endif 1759e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1760e8c4abbbSBram Moolenaar endfor 1761e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 17620ad3e894SBram Moolenaar 17630ad3e894SBram Moolenaar let concat = '' 17640ad3e894SBram Moolenaar for str in eval('["one", "two"]') 17650ad3e894SBram Moolenaar concat ..= str 17660ad3e894SBram Moolenaar endfor 17670ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1768e8c4abbbSBram Moolenaarenddef 1769e8c4abbbSBram Moolenaar 1770e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1771675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1772675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1773675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1774822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 17750ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1776675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1777675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1778675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1779e8c4abbbSBram Moolenaarenddef 1780e8c4abbbSBram Moolenaar 1781d0df1aacSBram Moolenaardef Test_while_loop() 1782d0df1aacSBram Moolenaar let result = '' 1783d0df1aacSBram Moolenaar let cnt = 0 1784d0df1aacSBram Moolenaar while cnt < 555 1785d0df1aacSBram Moolenaar if cnt == 3 1786d0df1aacSBram Moolenaar break 1787d0df1aacSBram Moolenaar endif 1788d0df1aacSBram Moolenaar cnt += 1 1789d0df1aacSBram Moolenaar if cnt == 2 1790d0df1aacSBram Moolenaar continue 1791d0df1aacSBram Moolenaar endif 1792d0df1aacSBram Moolenaar result ..= cnt .. '_' 1793d0df1aacSBram Moolenaar endwhile 1794d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1795d0df1aacSBram Moolenaarenddef 1796d0df1aacSBram Moolenaar 1797e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1798675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1799675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1800675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1801675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1802675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1803675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1804675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1805bd5da371SBram Moolenaarenddef 1806bd5da371SBram Moolenaar 18079645e2d9SBram Moolenaardef Test_interrupt_loop() 180897acfc78SBram Moolenaar let caught = false 18099645e2d9SBram Moolenaar let x = 0 181097acfc78SBram Moolenaar try 18119645e2d9SBram Moolenaar while 1 18129645e2d9SBram Moolenaar x += 1 18139645e2d9SBram Moolenaar if x == 100 18149645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 18159645e2d9SBram Moolenaar endif 18169645e2d9SBram Moolenaar endwhile 181797acfc78SBram Moolenaar catch 181897acfc78SBram Moolenaar caught = true 181997acfc78SBram Moolenaar assert_equal(100, x) 182097acfc78SBram Moolenaar endtry 182197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 18229645e2d9SBram Moolenaarenddef 182320431c9dSBram Moolenaar 18244fdae999SBram Moolenaardef Test_automatic_line_continuation() 18254fdae999SBram Moolenaar let mylist = [ 18264fdae999SBram Moolenaar 'one', 18274fdae999SBram Moolenaar 'two', 18284fdae999SBram Moolenaar 'three', 1829f5be8cdbSBram Moolenaar ] # comment 18304fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 18314fdae999SBram Moolenaar 18324fdae999SBram Moolenaar let mydict = { 18334fdae999SBram Moolenaar 'one': 1, 18344fdae999SBram Moolenaar 'two': 2, 18354fdae999SBram Moolenaar 'three': 18364fdae999SBram Moolenaar 3, 1837f5be8cdbSBram Moolenaar } # comment 18384fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 18394fdae999SBram Moolenaar mydict = #{ 18402c330432SBram Moolenaar one: 1, # comment 18412c330432SBram Moolenaar two: # comment 18422c330432SBram Moolenaar 2, # comment 18432c330432SBram Moolenaar three: 3 # comment 18442c330432SBram Moolenaar } 18452c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 18462c330432SBram Moolenaar mydict = #{ 18472c330432SBram Moolenaar one: 1, 18484fdae999SBram Moolenaar two: 18494fdae999SBram Moolenaar 2, 18502c330432SBram Moolenaar three: 3 18514fdae999SBram Moolenaar } 18524fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1853e6085c53SBram Moolenaar 1854e6085c53SBram Moolenaar assert_equal( 1855e6085c53SBram Moolenaar ['one', 'two', 'three'], 1856e6085c53SBram Moolenaar split('one two three') 1857e6085c53SBram Moolenaar ) 18584fdae999SBram Moolenaarenddef 18594fdae999SBram Moolenaar 18607a092245SBram Moolenaardef Test_vim9_comment() 18617a092245SBram Moolenaar CheckScriptSuccess([ 18627a092245SBram Moolenaar 'vim9script', 18637a092245SBram Moolenaar '# something', 18647a092245SBram Moolenaar ]) 18657a092245SBram Moolenaar CheckScriptFailure([ 18667a092245SBram Moolenaar 'vim9script', 18677a092245SBram Moolenaar ':# something', 18687a092245SBram Moolenaar ], 'E488:') 18697a092245SBram Moolenaar CheckScriptFailure([ 18707a092245SBram Moolenaar '# something', 18717a092245SBram Moolenaar ], 'E488:') 18727a092245SBram Moolenaar CheckScriptFailure([ 18737a092245SBram Moolenaar ':# something', 18747a092245SBram Moolenaar ], 'E488:') 18757a092245SBram Moolenaar 18764a8d9f2eSBram Moolenaar { # block start 18774a8d9f2eSBram Moolenaar } # block end 18784a8d9f2eSBram Moolenaar CheckDefFailure([ 18794a8d9f2eSBram Moolenaar '{# comment', 18804a8d9f2eSBram Moolenaar ], 'E488:') 18814a8d9f2eSBram Moolenaar CheckDefFailure([ 18824a8d9f2eSBram Moolenaar '{', 18834a8d9f2eSBram Moolenaar '}# comment', 18844a8d9f2eSBram Moolenaar ], 'E488:') 18854a8d9f2eSBram Moolenaar 18864a8d9f2eSBram Moolenaar echo "yes" # comment 18874a8d9f2eSBram Moolenaar CheckDefFailure([ 18884a8d9f2eSBram Moolenaar 'echo "yes"# comment', 18894a8d9f2eSBram Moolenaar ], 'E488:') 18907a092245SBram Moolenaar CheckScriptSuccess([ 18917a092245SBram Moolenaar 'vim9script', 18927a092245SBram Moolenaar 'echo "yes" # something', 18937a092245SBram Moolenaar ]) 18947a092245SBram Moolenaar CheckScriptFailure([ 18957a092245SBram Moolenaar 'vim9script', 18967a092245SBram Moolenaar 'echo "yes"# something', 18977a092245SBram Moolenaar ], 'E121:') 18987a092245SBram Moolenaar CheckScriptFailure([ 18997a092245SBram Moolenaar 'vim9script', 19007a092245SBram Moolenaar 'echo# something', 19017a092245SBram Moolenaar ], 'E121:') 19027a092245SBram Moolenaar CheckScriptFailure([ 19037a092245SBram Moolenaar 'echo "yes" # something', 19047a092245SBram Moolenaar ], 'E121:') 19057a092245SBram Moolenaar 19064a8d9f2eSBram Moolenaar exe "echo" # comment 19074a8d9f2eSBram Moolenaar CheckDefFailure([ 19084a8d9f2eSBram Moolenaar 'exe "echo"# comment', 19094a8d9f2eSBram Moolenaar ], 'E488:') 19104a8d9f2eSBram Moolenaar CheckScriptSuccess([ 19114a8d9f2eSBram Moolenaar 'vim9script', 19124a8d9f2eSBram Moolenaar 'exe "echo" # something', 19134a8d9f2eSBram Moolenaar ]) 19144a8d9f2eSBram Moolenaar CheckScriptFailure([ 19154a8d9f2eSBram Moolenaar 'vim9script', 19164a8d9f2eSBram Moolenaar 'exe "echo"# something', 19174a8d9f2eSBram Moolenaar ], 'E121:') 19184a8d9f2eSBram Moolenaar CheckDefFailure([ 19194a8d9f2eSBram Moolenaar 'exe # comment', 19204a8d9f2eSBram Moolenaar ], 'E1015:') 19214a8d9f2eSBram Moolenaar CheckScriptFailure([ 19224a8d9f2eSBram Moolenaar 'vim9script', 19234a8d9f2eSBram Moolenaar 'exe# something', 19244a8d9f2eSBram Moolenaar ], 'E121:') 19254a8d9f2eSBram Moolenaar CheckScriptFailure([ 19264a8d9f2eSBram Moolenaar 'exe "echo" # something', 19274a8d9f2eSBram Moolenaar ], 'E121:') 19284a8d9f2eSBram Moolenaar 19297a092245SBram Moolenaar CheckDefFailure([ 19307a092245SBram Moolenaar 'try# comment', 19317a092245SBram Moolenaar ' echo "yes"', 19327a092245SBram Moolenaar 'catch', 19337a092245SBram Moolenaar 'endtry', 19347a092245SBram Moolenaar ], 'E488:') 19352c5ed4e3SBram Moolenaar CheckScriptFailure([ 19362c5ed4e3SBram Moolenaar 'vim9script', 19372c5ed4e3SBram Moolenaar 'try# comment', 19382c5ed4e3SBram Moolenaar 'echo "yes"', 19392c5ed4e3SBram Moolenaar ], 'E488:') 19407a092245SBram Moolenaar CheckDefFailure([ 19417a092245SBram Moolenaar 'try', 1942a72cfb80SBram Moolenaar ' throw#comment', 1943a72cfb80SBram Moolenaar 'catch', 1944a72cfb80SBram Moolenaar 'endtry', 1945a72cfb80SBram Moolenaar ], 'E1015:') 1946a72cfb80SBram Moolenaar CheckDefFailure([ 1947a72cfb80SBram Moolenaar 'try', 1948a72cfb80SBram Moolenaar ' throw "yes"#comment', 1949a72cfb80SBram Moolenaar 'catch', 1950a72cfb80SBram Moolenaar 'endtry', 1951a72cfb80SBram Moolenaar ], 'E488:') 1952a72cfb80SBram Moolenaar CheckDefFailure([ 1953a72cfb80SBram Moolenaar 'try', 19547a092245SBram Moolenaar ' echo "yes"', 19557a092245SBram Moolenaar 'catch# comment', 19567a092245SBram Moolenaar 'endtry', 19577a092245SBram Moolenaar ], 'E488:') 19582c5ed4e3SBram Moolenaar CheckScriptFailure([ 19592c5ed4e3SBram Moolenaar 'vim9script', 19602c5ed4e3SBram Moolenaar 'try', 19612c5ed4e3SBram Moolenaar ' echo "yes"', 19622c5ed4e3SBram Moolenaar 'catch# comment', 19632c5ed4e3SBram Moolenaar 'endtry', 19642c5ed4e3SBram Moolenaar ], 'E654:') 19652c5ed4e3SBram Moolenaar CheckDefFailure([ 19662c5ed4e3SBram Moolenaar 'try', 19672c5ed4e3SBram Moolenaar ' echo "yes"', 19682c5ed4e3SBram Moolenaar 'catch /pat/# comment', 19692c5ed4e3SBram Moolenaar 'endtry', 19702c5ed4e3SBram Moolenaar ], 'E488:') 19717a092245SBram Moolenaar CheckDefFailure([ 19727a092245SBram Moolenaar 'try', 19737a092245SBram Moolenaar 'echo "yes"', 19747a092245SBram Moolenaar 'catch', 19757a092245SBram Moolenaar 'endtry# comment', 19767a092245SBram Moolenaar ], 'E488:') 19772c5ed4e3SBram Moolenaar CheckScriptFailure([ 19782c5ed4e3SBram Moolenaar 'vim9script', 19792c5ed4e3SBram Moolenaar 'try', 19802c5ed4e3SBram Moolenaar ' echo "yes"', 19812c5ed4e3SBram Moolenaar 'catch', 19822c5ed4e3SBram Moolenaar 'endtry# comment', 19839b7bf9e9SBram Moolenaar ], 'E488:') 19842c5ed4e3SBram Moolenaar 19852c5ed4e3SBram Moolenaar CheckScriptSuccess([ 19862c5ed4e3SBram Moolenaar 'vim9script', 19872c5ed4e3SBram Moolenaar 'hi # comment', 19882c5ed4e3SBram Moolenaar ]) 19892c5ed4e3SBram Moolenaar CheckScriptFailure([ 19902c5ed4e3SBram Moolenaar 'vim9script', 19912c5ed4e3SBram Moolenaar 'hi# comment', 19922c5ed4e3SBram Moolenaar ], 'E416:') 19931966c248SBram Moolenaar CheckScriptSuccess([ 19941966c248SBram Moolenaar 'vim9script', 19951966c248SBram Moolenaar 'hi Search # comment', 19961966c248SBram Moolenaar ]) 19971966c248SBram Moolenaar CheckScriptFailure([ 19981966c248SBram Moolenaar 'vim9script', 19991966c248SBram Moolenaar 'hi Search# comment', 20001966c248SBram Moolenaar ], 'E416:') 20011966c248SBram Moolenaar CheckScriptSuccess([ 20021966c248SBram Moolenaar 'vim9script', 20031966c248SBram Moolenaar 'hi link This Search # comment', 20041966c248SBram Moolenaar ]) 20051966c248SBram Moolenaar CheckScriptFailure([ 20061966c248SBram Moolenaar 'vim9script', 20071966c248SBram Moolenaar 'hi link This That# comment', 20081966c248SBram Moolenaar ], 'E413:') 20091966c248SBram Moolenaar CheckScriptSuccess([ 20101966c248SBram Moolenaar 'vim9script', 20111966c248SBram Moolenaar 'hi clear This # comment', 20121966c248SBram Moolenaar 'hi clear # comment', 20131966c248SBram Moolenaar ]) 2014f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2015f5be8cdbSBram Moolenaar # hi clear This# comment', 20161966c248SBram Moolenaar CheckScriptFailure([ 20171966c248SBram Moolenaar 'vim9script', 20181966c248SBram Moolenaar 'hi clear# comment', 20191966c248SBram Moolenaar ], 'E416:') 20201966c248SBram Moolenaar 20211966c248SBram Moolenaar CheckScriptSuccess([ 20221966c248SBram Moolenaar 'vim9script', 20231966c248SBram Moolenaar 'hi Group term=bold', 20241966c248SBram Moolenaar 'match Group /todo/ # comment', 20251966c248SBram Moolenaar ]) 20261966c248SBram Moolenaar CheckScriptFailure([ 20271966c248SBram Moolenaar 'vim9script', 20281966c248SBram Moolenaar 'hi Group term=bold', 20291966c248SBram Moolenaar 'match Group /todo/# comment', 20301966c248SBram Moolenaar ], 'E488:') 20311966c248SBram Moolenaar CheckScriptSuccess([ 20321966c248SBram Moolenaar 'vim9script', 20331966c248SBram Moolenaar 'match # comment', 20341966c248SBram Moolenaar ]) 20351966c248SBram Moolenaar CheckScriptFailure([ 20361966c248SBram Moolenaar 'vim9script', 20371966c248SBram Moolenaar 'match# comment', 20381966c248SBram Moolenaar ], 'E475:') 20391966c248SBram Moolenaar CheckScriptSuccess([ 20401966c248SBram Moolenaar 'vim9script', 20411966c248SBram Moolenaar 'match none # comment', 20421966c248SBram Moolenaar ]) 20431966c248SBram Moolenaar CheckScriptFailure([ 20441966c248SBram Moolenaar 'vim9script', 20451966c248SBram Moolenaar 'match none# comment', 20461966c248SBram Moolenaar ], 'E475:') 20471966c248SBram Moolenaar 20481966c248SBram Moolenaar CheckScriptSuccess([ 20491966c248SBram Moolenaar 'vim9script', 20501966c248SBram Moolenaar 'menutrans clear # comment', 20511966c248SBram Moolenaar ]) 20521966c248SBram Moolenaar CheckScriptFailure([ 20531966c248SBram Moolenaar 'vim9script', 20541966c248SBram Moolenaar 'menutrans clear# comment text', 20551966c248SBram Moolenaar ], 'E474:') 20561966c248SBram Moolenaar 20571966c248SBram Moolenaar CheckScriptSuccess([ 20581966c248SBram Moolenaar 'vim9script', 20591966c248SBram Moolenaar 'syntax clear # comment', 20601966c248SBram Moolenaar ]) 20611966c248SBram Moolenaar CheckScriptFailure([ 20621966c248SBram Moolenaar 'vim9script', 20631966c248SBram Moolenaar 'syntax clear# comment text', 20641966c248SBram Moolenaar ], 'E28:') 20651966c248SBram Moolenaar CheckScriptSuccess([ 20661966c248SBram Moolenaar 'vim9script', 20671966c248SBram Moolenaar 'syntax keyword Word some', 20681966c248SBram Moolenaar 'syntax clear Word # comment', 20691966c248SBram Moolenaar ]) 20701966c248SBram Moolenaar CheckScriptFailure([ 20711966c248SBram Moolenaar 'vim9script', 20721966c248SBram Moolenaar 'syntax keyword Word some', 20731966c248SBram Moolenaar 'syntax clear Word# comment text', 20741966c248SBram Moolenaar ], 'E28:') 20751966c248SBram Moolenaar 20761966c248SBram Moolenaar CheckScriptSuccess([ 20771966c248SBram Moolenaar 'vim9script', 20781966c248SBram Moolenaar 'syntax list # comment', 20791966c248SBram Moolenaar ]) 20801966c248SBram Moolenaar CheckScriptFailure([ 20811966c248SBram Moolenaar 'vim9script', 20821966c248SBram Moolenaar 'syntax list# comment text', 20831966c248SBram Moolenaar ], 'E28:') 20841966c248SBram Moolenaar 20851966c248SBram Moolenaar CheckScriptSuccess([ 20861966c248SBram Moolenaar 'vim9script', 20871966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 20881966c248SBram Moolenaar ]) 20891966c248SBram Moolenaar CheckScriptFailure([ 20901966c248SBram Moolenaar 'vim9script', 20911966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 20921966c248SBram Moolenaar ], 'E475:') 20931966c248SBram Moolenaar 20941966c248SBram Moolenaar CheckScriptSuccess([ 20951966c248SBram Moolenaar 'vim9script', 20961966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 20971966c248SBram Moolenaar ]) 20981966c248SBram Moolenaar CheckScriptFailure([ 20991966c248SBram Moolenaar 'vim9script', 21001966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 21011966c248SBram Moolenaar ], 'E789:') 21021966c248SBram Moolenaar 21031966c248SBram Moolenaar CheckScriptSuccess([ 21041966c248SBram Moolenaar 'vim9script', 21051966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 21061966c248SBram Moolenaar ]) 21071966c248SBram Moolenaar CheckScriptFailure([ 21081966c248SBram Moolenaar 'vim9script', 21091966c248SBram Moolenaar 'syntax match Word /pat/# comment', 21101966c248SBram Moolenaar ], 'E402:') 21111966c248SBram Moolenaar 21121966c248SBram Moolenaar CheckScriptSuccess([ 21131966c248SBram Moolenaar 'vim9script', 21141966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 21151966c248SBram Moolenaar ]) 21161966c248SBram Moolenaar CheckScriptFailure([ 21171966c248SBram Moolenaar 'vim9script', 21181966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 21191966c248SBram Moolenaar ], 'E475:') 21201966c248SBram Moolenaar CheckScriptFailure([ 21211966c248SBram Moolenaar 'vim9script', 21221966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 21231966c248SBram Moolenaar ], 'E406:') 21241966c248SBram Moolenaar CheckScriptFailure([ 21251966c248SBram Moolenaar 'vim9script', 21261966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 21271966c248SBram Moolenaar ], 'E475:') 21281966c248SBram Moolenaar 21291966c248SBram Moolenaar CheckScriptSuccess([ 21301966c248SBram Moolenaar 'vim9script', 21311966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 21321966c248SBram Moolenaar ]) 21331966c248SBram Moolenaar CheckScriptFailure([ 21341966c248SBram Moolenaar 'vim9script', 21351966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2136d032f34aSBram Moolenaar ], 'E402:') 21371966c248SBram Moolenaar 21381966c248SBram Moolenaar CheckScriptSuccess([ 21391966c248SBram Moolenaar 'vim9script', 21401966c248SBram Moolenaar 'syntax sync # comment', 21411966c248SBram Moolenaar ]) 21421966c248SBram Moolenaar CheckScriptFailure([ 21431966c248SBram Moolenaar 'vim9script', 21441966c248SBram Moolenaar 'syntax sync# comment', 21451966c248SBram Moolenaar ], 'E404:') 21461966c248SBram Moolenaar CheckScriptSuccess([ 21471966c248SBram Moolenaar 'vim9script', 21481966c248SBram Moolenaar 'syntax sync ccomment # comment', 21491966c248SBram Moolenaar ]) 21501966c248SBram Moolenaar CheckScriptFailure([ 21511966c248SBram Moolenaar 'vim9script', 21521966c248SBram Moolenaar 'syntax sync ccomment# comment', 21531966c248SBram Moolenaar ], 'E404:') 21541966c248SBram Moolenaar 21551966c248SBram Moolenaar CheckScriptSuccess([ 21561966c248SBram Moolenaar 'vim9script', 21571966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 21581966c248SBram Moolenaar ]) 21591966c248SBram Moolenaar CheckScriptFailure([ 21601966c248SBram Moolenaar 'vim9script', 21611966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 21621966c248SBram Moolenaar ], 'E475:') 2163a72cfb80SBram Moolenaar 2164a72cfb80SBram Moolenaar CheckScriptSuccess([ 2165a72cfb80SBram Moolenaar 'vim9script', 2166a72cfb80SBram Moolenaar 'command Echo echo # comment', 2167a72cfb80SBram Moolenaar 'command Echo # comment', 2168a72cfb80SBram Moolenaar ]) 2169a72cfb80SBram Moolenaar CheckScriptFailure([ 2170a72cfb80SBram Moolenaar 'vim9script', 2171a72cfb80SBram Moolenaar 'command Echo echo# comment', 2172a72cfb80SBram Moolenaar 'Echo', 2173a72cfb80SBram Moolenaar ], 'E121:') 2174a72cfb80SBram Moolenaar CheckScriptFailure([ 2175a72cfb80SBram Moolenaar 'vim9script', 2176a72cfb80SBram Moolenaar 'command Echo# comment', 2177a72cfb80SBram Moolenaar ], 'E182:') 2178a72cfb80SBram Moolenaar CheckScriptFailure([ 2179a72cfb80SBram Moolenaar 'vim9script', 2180a72cfb80SBram Moolenaar 'command Echo echo', 2181a72cfb80SBram Moolenaar 'command Echo# comment', 2182a72cfb80SBram Moolenaar ], 'E182:') 2183a72cfb80SBram Moolenaar 2184a72cfb80SBram Moolenaar CheckScriptSuccess([ 2185a72cfb80SBram Moolenaar 'vim9script', 2186a72cfb80SBram Moolenaar 'function # comment', 2187a72cfb80SBram Moolenaar ]) 2188a72cfb80SBram Moolenaar CheckScriptFailure([ 2189a72cfb80SBram Moolenaar 'vim9script', 2190a72cfb80SBram Moolenaar 'function# comment', 2191a72cfb80SBram Moolenaar ], 'E129:') 2192a72cfb80SBram Moolenaar CheckScriptSuccess([ 2193a72cfb80SBram Moolenaar 'vim9script', 2194a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2195a72cfb80SBram Moolenaar ]) 2196a72cfb80SBram Moolenaar CheckScriptFailure([ 2197a72cfb80SBram Moolenaar 'vim9script', 2198a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2199a72cfb80SBram Moolenaar ], 'E488:') 2200a72cfb80SBram Moolenaar 2201a72cfb80SBram Moolenaar CheckScriptSuccess([ 2202a72cfb80SBram Moolenaar 'vim9script', 22034c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2204a72cfb80SBram Moolenaar 'endfunc', 22054c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2206a72cfb80SBram Moolenaar ]) 2207a72cfb80SBram Moolenaar CheckScriptFailure([ 2208a72cfb80SBram Moolenaar 'vim9script', 22094c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2210a72cfb80SBram Moolenaar 'endfunc', 22114c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2212a72cfb80SBram Moolenaar ], 'E488:') 2213a72cfb80SBram Moolenaar 2214a72cfb80SBram Moolenaar CheckScriptSuccess([ 2215a72cfb80SBram Moolenaar 'vim9script', 2216a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2217a72cfb80SBram Moolenaar ]) 2218a72cfb80SBram Moolenaar CheckScriptFailure([ 2219a72cfb80SBram Moolenaar 'vim9script', 2220a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2221a72cfb80SBram Moolenaar ], 'E488:') 2222e7e4838fSBram Moolenaar 2223e7e4838fSBram Moolenaar CheckScriptFailure([ 2224e7e4838fSBram Moolenaar 'def Test() " comment', 2225e7e4838fSBram Moolenaar 'enddef', 2226e7e4838fSBram Moolenaar ], 'E488:') 2227e7e4838fSBram Moolenaar CheckScriptFailure([ 2228e7e4838fSBram Moolenaar 'vim9script', 2229e7e4838fSBram Moolenaar 'def Test() " comment', 2230e7e4838fSBram Moolenaar 'enddef', 2231e7e4838fSBram Moolenaar ], 'E488:') 2232e7e4838fSBram Moolenaar 2233e7e4838fSBram Moolenaar CheckScriptSuccess([ 2234e7e4838fSBram Moolenaar 'func Test() " comment', 2235e7e4838fSBram Moolenaar 'endfunc', 2236e7e4838fSBram Moolenaar ]) 2237e7e4838fSBram Moolenaar CheckScriptFailure([ 2238e7e4838fSBram Moolenaar 'vim9script', 2239e7e4838fSBram Moolenaar 'func Test() " comment', 2240e7e4838fSBram Moolenaar 'endfunc', 2241e7e4838fSBram Moolenaar ], 'E488:') 2242e7e4838fSBram Moolenaar 2243e7e4838fSBram Moolenaar CheckScriptSuccess([ 2244e7e4838fSBram Moolenaar 'def Test() # comment', 2245e7e4838fSBram Moolenaar 'enddef', 2246e7e4838fSBram Moolenaar ]) 2247e7e4838fSBram Moolenaar CheckScriptFailure([ 2248e7e4838fSBram Moolenaar 'func Test() # comment', 2249e7e4838fSBram Moolenaar 'endfunc', 2250e7e4838fSBram Moolenaar ], 'E488:') 22512c5ed4e3SBram Moolenaarenddef 22522c5ed4e3SBram Moolenaar 22532c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 22542c5ed4e3SBram Moolenaar CheckCanRunGui 22552c5ed4e3SBram Moolenaar 22562c5ed4e3SBram Moolenaar CheckScriptFailure([ 22572c5ed4e3SBram Moolenaar 'vim9script', 22582c5ed4e3SBram Moolenaar 'gui#comment' 22592c5ed4e3SBram Moolenaar ], 'E499:') 22602c5ed4e3SBram Moolenaar CheckScriptFailure([ 22612c5ed4e3SBram Moolenaar 'vim9script', 22622c5ed4e3SBram Moolenaar 'gui -f#comment' 22632c5ed4e3SBram Moolenaar ], 'E499:') 22647a092245SBram Moolenaarenddef 22657a092245SBram Moolenaar 2266a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 22676797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 22686797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2269a26b9700SBram Moolenaar 2270a26b9700SBram Moolenaar edit test.vim 2271a26b9700SBram Moolenaar doautocmd TabEnter #comment 2272a26b9700SBram Moolenaar assert_equal(1, g:entered) 2273a26b9700SBram Moolenaar 2274a26b9700SBram Moolenaar doautocmd TabEnter f.x 2275a26b9700SBram Moolenaar assert_equal(2, g:entered) 2276a26b9700SBram Moolenaar 2277a26b9700SBram Moolenaar g:entered = 0 2278a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2279a26b9700SBram Moolenaar assert_equal(2, g:entered) 2280a26b9700SBram Moolenaar 2281a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2282a26b9700SBram Moolenaar 2283a26b9700SBram Moolenaar au! TabEnter 2284a26b9700SBram Moolenaar unlet g:entered 2285d72c1bf0SBram Moolenaar 2286d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2287d72c1bf0SBram Moolenaar 'vim9script', 22886797966dSBram Moolenaar 'g:var = 123', 2289e55b1c09SBram Moolenaar 'b:var = 456', 2290e55b1c09SBram Moolenaar 'w:var = 777', 2291e55b1c09SBram Moolenaar 't:var = 888', 2292d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2293d72c1bf0SBram Moolenaar ]) 2294d72c1bf0SBram Moolenaar 2295d72c1bf0SBram Moolenaar CheckScriptFailure([ 2296d72c1bf0SBram Moolenaar 'vim9script', 2297d72c1bf0SBram Moolenaar 'let g:var = 123', 2298e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2299e55b1c09SBram Moolenaar 2300e55b1c09SBram Moolenaar CheckScriptFailure([ 2301e55b1c09SBram Moolenaar 'vim9script', 2302e55b1c09SBram Moolenaar 'let b:var = 123', 2303e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2304e55b1c09SBram Moolenaar 2305e55b1c09SBram Moolenaar CheckScriptFailure([ 2306e55b1c09SBram Moolenaar 'vim9script', 2307e55b1c09SBram Moolenaar 'let w:var = 123', 2308e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2309e55b1c09SBram Moolenaar 2310e55b1c09SBram Moolenaar CheckScriptFailure([ 2311e55b1c09SBram Moolenaar 'vim9script', 2312e55b1c09SBram Moolenaar 'let t:var = 123', 2313e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2314e55b1c09SBram Moolenaar 2315e55b1c09SBram Moolenaar CheckScriptFailure([ 2316e55b1c09SBram Moolenaar 'vim9script', 2317e55b1c09SBram Moolenaar 'let v:version = 123', 2318e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2319e55b1c09SBram Moolenaar 2320e55b1c09SBram Moolenaar CheckScriptFailure([ 2321e55b1c09SBram Moolenaar 'vim9script', 2322e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2323e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 23246797966dSBram Moolenaar 23256797966dSBram Moolenaar CheckScriptFailure([ 23266797966dSBram Moolenaar 'vim9script', 23276797966dSBram Moolenaar 'g:var = 123', 232832e35117SBram Moolenaar 'unlet g:var# comment1', 2329d72c1bf0SBram Moolenaar ], 'E108:') 2330d72c1bf0SBram Moolenaar 2331d72c1bf0SBram Moolenaar CheckScriptFailure([ 2332d72c1bf0SBram Moolenaar 'let g:var = 123', 2333d72c1bf0SBram Moolenaar 'unlet g:var # something', 2334d72c1bf0SBram Moolenaar ], 'E488:') 2335faac4104SBram Moolenaar 2336faac4104SBram Moolenaar CheckScriptSuccess([ 2337faac4104SBram Moolenaar 'vim9script', 233832e35117SBram Moolenaar 'if 1 # comment2', 2339faac4104SBram Moolenaar ' echo "yes"', 2340faac4104SBram Moolenaar 'elseif 2 #comment', 2341faac4104SBram Moolenaar ' echo "no"', 2342faac4104SBram Moolenaar 'endif', 2343faac4104SBram Moolenaar ]) 2344faac4104SBram Moolenaar 2345faac4104SBram Moolenaar CheckScriptFailure([ 2346faac4104SBram Moolenaar 'vim9script', 234732e35117SBram Moolenaar 'if 1# comment3', 2348faac4104SBram Moolenaar ' echo "yes"', 2349faac4104SBram Moolenaar 'endif', 2350faac4104SBram Moolenaar ], 'E15:') 2351faac4104SBram Moolenaar 2352faac4104SBram Moolenaar CheckScriptFailure([ 2353faac4104SBram Moolenaar 'vim9script', 235432e35117SBram Moolenaar 'if 0 # comment4', 2355faac4104SBram Moolenaar ' echo "yes"', 2356faac4104SBram Moolenaar 'elseif 2#comment', 2357faac4104SBram Moolenaar ' echo "no"', 2358faac4104SBram Moolenaar 'endif', 2359faac4104SBram Moolenaar ], 'E15:') 2360faac4104SBram Moolenaar 2361faac4104SBram Moolenaar CheckScriptSuccess([ 2362faac4104SBram Moolenaar 'vim9script', 236332e35117SBram Moolenaar 'let v = 1 # comment5', 2364faac4104SBram Moolenaar ]) 2365faac4104SBram Moolenaar 2366faac4104SBram Moolenaar CheckScriptFailure([ 2367faac4104SBram Moolenaar 'vim9script', 236832e35117SBram Moolenaar 'let v = 1# comment6', 236932e35117SBram Moolenaar ], 'E15:') 2370faac4104SBram Moolenaar 2371faac4104SBram Moolenaar CheckScriptSuccess([ 2372faac4104SBram Moolenaar 'vim9script', 2373faac4104SBram Moolenaar 'new' 2374faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2375df069eecSBram Moolenaar ':$', 2376faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2377faac4104SBram Moolenaar 'bwipe!', 2378faac4104SBram Moolenaar ]) 2379faac4104SBram Moolenaar 2380f5be8cdbSBram Moolenaar CheckScriptFailure([ 2381f5be8cdbSBram Moolenaar 'vim9script', 2382f5be8cdbSBram Moolenaar 'new' 2383f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2384f5be8cdbSBram Moolenaar ':$', 2385f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2386f5be8cdbSBram Moolenaar 'bwipe!', 2387f5be8cdbSBram Moolenaar ], 'E488:') 2388f5be8cdbSBram Moolenaar 2389f5be8cdbSBram Moolenaar CheckScriptFailure([ 2390f5be8cdbSBram Moolenaar 'vim9script', 2391f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2392f5be8cdbSBram Moolenaar ], 'E477:') 2393a26b9700SBram Moolenaarenddef 2394a26b9700SBram Moolenaar 23957e5bd91dSBram Moolenaardef Test_finish() 23967e5bd91dSBram Moolenaar let lines =<< trim END 23977e5bd91dSBram Moolenaar vim9script 23986797966dSBram Moolenaar g:res = 'one' 23997e5bd91dSBram Moolenaar if v:false | finish | endif 24006797966dSBram Moolenaar g:res = 'two' 24017e5bd91dSBram Moolenaar finish 24026797966dSBram Moolenaar g:res = 'three' 24037e5bd91dSBram Moolenaar END 24047e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 24057e5bd91dSBram Moolenaar source Xfinished 24067e5bd91dSBram Moolenaar assert_equal('two', g:res) 24077e5bd91dSBram Moolenaar 24087e5bd91dSBram Moolenaar unlet g:res 24097e5bd91dSBram Moolenaar delete('Xfinished') 24107e5bd91dSBram Moolenaarenddef 24117e5bd91dSBram Moolenaar 241232e35117SBram Moolenaardef Test_let_func_call() 241332e35117SBram Moolenaar let lines =<< trim END 241432e35117SBram Moolenaar vim9script 241532e35117SBram Moolenaar func GetValue() 241632e35117SBram Moolenaar if exists('g:count') 241732e35117SBram Moolenaar let g:count += 1 241832e35117SBram Moolenaar else 241932e35117SBram Moolenaar let g:count = 1 242032e35117SBram Moolenaar endif 242132e35117SBram Moolenaar return 'this' 242232e35117SBram Moolenaar endfunc 242332e35117SBram Moolenaar let val: string = GetValue() 2424f5be8cdbSBram Moolenaar # env var is always a string 2425df671b46SBram Moolenaar let env = $TERM 242632e35117SBram Moolenaar END 242732e35117SBram Moolenaar writefile(lines, 'Xfinished') 242832e35117SBram Moolenaar source Xfinished 2429f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 243032e35117SBram Moolenaar assert_equal(1, g:count) 243132e35117SBram Moolenaar 243232e35117SBram Moolenaar unlet g:count 243332e35117SBram Moolenaar delete('Xfinished') 243432e35117SBram Moolenaarenddef 243532e35117SBram Moolenaar 243632e35117SBram Moolenaardef Test_let_missing_type() 243732e35117SBram Moolenaar let lines =<< trim END 243832e35117SBram Moolenaar vim9script 2439df671b46SBram Moolenaar let var = g:unknown 2440227a69deSBram Moolenaar END 2441822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2442227a69deSBram Moolenaar 2443227a69deSBram Moolenaar lines =<< trim END 2444227a69deSBram Moolenaar vim9script 2445227a69deSBram Moolenaar let nr: number = 123 2446227a69deSBram Moolenaar let var = nr 2447227a69deSBram Moolenaar END 2448822ba247SBram Moolenaar CheckScriptSuccess(lines) 244932e35117SBram Moolenaarenddef 245032e35117SBram Moolenaar 2451c82a5b5dSBram Moolenaardef Test_let_declaration() 2452c82a5b5dSBram Moolenaar let lines =<< trim END 2453c82a5b5dSBram Moolenaar vim9script 2454c82a5b5dSBram Moolenaar let var: string 2455c82a5b5dSBram Moolenaar g:var_uninit = var 2456c82a5b5dSBram Moolenaar var = 'text' 2457c82a5b5dSBram Moolenaar g:var_test = var 2458f5be8cdbSBram Moolenaar # prefixing s: is optional 2459984dddbeSBram Moolenaar s:var = 'prefixed' 2460984dddbeSBram Moolenaar g:var_prefixed = s:var 2461984dddbeSBram Moolenaar 2462984dddbeSBram Moolenaar let s:other: number 2463984dddbeSBram Moolenaar other = 1234 2464984dddbeSBram Moolenaar g:other_var = other 2465c82a5b5dSBram Moolenaar END 2466c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2467c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2468c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2469984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2470984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2471c82a5b5dSBram Moolenaar 2472c82a5b5dSBram Moolenaar unlet g:var_uninit 2473c82a5b5dSBram Moolenaar unlet g:var_test 2474984dddbeSBram Moolenaar unlet g:var_prefixed 2475984dddbeSBram Moolenaar unlet g:other_var 2476c82a5b5dSBram Moolenaarenddef 2477c82a5b5dSBram Moolenaar 2478c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2479c5b1c20bSBram Moolenaar let lines =<< trim END 2480c5b1c20bSBram Moolenaar vim9script 2481c5b1c20bSBram Moolenaar const var: string 2482c5b1c20bSBram Moolenaar END 2483c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2484c5b1c20bSBram Moolenaar 2485c5b1c20bSBram Moolenaar lines =<< trim END 2486c5b1c20bSBram Moolenaar vim9script 2487c5b1c20bSBram Moolenaar let 9var: string 2488c5b1c20bSBram Moolenaar END 2489c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2490c5b1c20bSBram Moolenaarenddef 2491c5b1c20bSBram Moolenaar 249234db91f7SBram Moolenaardef Test_let_type_check() 249334db91f7SBram Moolenaar let lines =<< trim END 249434db91f7SBram Moolenaar vim9script 249534db91f7SBram Moolenaar let var: string 249634db91f7SBram Moolenaar var = 1234 249734db91f7SBram Moolenaar END 249834db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2499984dddbeSBram Moolenaar 2500984dddbeSBram Moolenaar lines =<< trim END 2501984dddbeSBram Moolenaar vim9script 2502984dddbeSBram Moolenaar let var:string 2503984dddbeSBram Moolenaar END 2504984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2505c5b1c20bSBram Moolenaar 2506c5b1c20bSBram Moolenaar lines =<< trim END 2507c5b1c20bSBram Moolenaar vim9script 2508c5b1c20bSBram Moolenaar let var: asdf 2509c5b1c20bSBram Moolenaar END 2510c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 251134db91f7SBram Moolenaarenddef 251234db91f7SBram Moolenaar 2513a5d0077eSBram Moolenaardef Test_forward_declaration() 2514a5d0077eSBram Moolenaar let lines =<< trim END 2515a5d0077eSBram Moolenaar vim9script 2516a5d0077eSBram Moolenaar def GetValue(): string 2517a5d0077eSBram Moolenaar return theVal 2518a5d0077eSBram Moolenaar enddef 2519a5d0077eSBram Moolenaar let theVal = 'something' 2520822ba247SBram Moolenaar g:initVal = GetValue() 2521a5d0077eSBram Moolenaar theVal = 'else' 2522a5d0077eSBram Moolenaar g:laterVal = GetValue() 2523a5d0077eSBram Moolenaar END 2524a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2525a5d0077eSBram Moolenaar source Xforward 2526a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2527a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2528a5d0077eSBram Moolenaar 2529a5d0077eSBram Moolenaar unlet g:initVal 2530a5d0077eSBram Moolenaar unlet g:laterVal 2531a5d0077eSBram Moolenaar delete('Xforward') 2532a5d0077eSBram Moolenaarenddef 2533a5d0077eSBram Moolenaar 25349721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 25359721fb4eSBram Moolenaar let legacy_lines =<< trim END 25369721fb4eSBram Moolenaar source Xvim9_script.vim 25379721fb4eSBram Moolenaar 25389721fb4eSBram Moolenaar call assert_false(exists('local')) 25399721fb4eSBram Moolenaar call assert_false(exists('exported')) 25409721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 25419721fb4eSBram Moolenaar call assert_equal('global', global) 25429721fb4eSBram Moolenaar call assert_equal('global', g:global) 25439721fb4eSBram Moolenaar 25449721fb4eSBram Moolenaar " imported variable becomes script-local 25459721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 25469721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 25479721fb4eSBram Moolenaar call assert_false(exists('exported')) 25489721fb4eSBram Moolenaar 25499721fb4eSBram Moolenaar " imported function becomes script-local 25509721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 25519721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 25529721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 25539721fb4eSBram Moolenaar END 25549721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 25559721fb4eSBram Moolenaar 25569721fb4eSBram Moolenaar let vim9_lines =<< trim END 25579721fb4eSBram Moolenaar vim9script 25589721fb4eSBram Moolenaar let local = 'local' 25599721fb4eSBram Moolenaar g:global = 'global' 25609721fb4eSBram Moolenaar export let exported = 'exported' 25619721fb4eSBram Moolenaar export def GetText(): string 25629721fb4eSBram Moolenaar return 'text' 25639721fb4eSBram Moolenaar enddef 25649721fb4eSBram Moolenaar END 25659721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 25669721fb4eSBram Moolenaar 25679721fb4eSBram Moolenaar source Xlegacy_script.vim 25689721fb4eSBram Moolenaar 25699721fb4eSBram Moolenaar assert_equal('global', g:global) 2570f5be8cdbSBram Moolenaar unlet g:global 25719721fb4eSBram Moolenaar 25729721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 25739721fb4eSBram Moolenaar delete('Xvim9_script.vim') 25749721fb4eSBram Moolenaarenddef 2575a5d0077eSBram Moolenaar 2576eeb27bfeSBram Moolenaardef Test_vim9_copen() 2577eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2578eeb27bfeSBram Moolenaar copen 2579eeb27bfeSBram Moolenaar quit 2580eeb27bfeSBram Moolenaarenddef 2581eeb27bfeSBram Moolenaar 2582585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2583585fea7bSBram Moolenaardef Test_substitute_cmd() 2584585fea7bSBram Moolenaar new 2585585fea7bSBram Moolenaar setline(1, 'something') 2586585fea7bSBram Moolenaar :substitute(some(other( 2587585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2588585fea7bSBram Moolenaar bwipe! 2589585fea7bSBram Moolenaar 2590f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2591585fea7bSBram Moolenaar let lines =<< trim END 2592585fea7bSBram Moolenaar vim9script 2593585fea7bSBram Moolenaar new 2594585fea7bSBram Moolenaar setline(1, 'something') 2595585fea7bSBram Moolenaar :substitute(some(other( 2596585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2597585fea7bSBram Moolenaar bwipe! 2598585fea7bSBram Moolenaar END 2599585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2600585fea7bSBram Moolenaar source Xvim9lines 2601585fea7bSBram Moolenaar 2602585fea7bSBram Moolenaar delete('Xvim9lines') 2603585fea7bSBram Moolenaarenddef 2604585fea7bSBram Moolenaar 26058a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2606