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 32*b209750bSBram Moolenaar let a: number = 6 #comment 339be61bbbSBram Moolenaar assert_equal(6, a) 349be61bbbSBram Moolenaar 3542a480bfSBram Moolenaar if has('channel') 3642a480bfSBram Moolenaar let chan1: channel 37fbdd08edSBram Moolenaar let job1: job 38f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 3942a480bfSBram Moolenaar endif 40fbdd08edSBram Moolenaar if has('float') 41fbdd08edSBram Moolenaar let float1: float = 3.4 42fbdd08edSBram Moolenaar endif 435deeb3f1SBram Moolenaar let Funky1: func 445deeb3f1SBram Moolenaar let Funky2: func = function('len') 454c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4642a480bfSBram Moolenaar 47*b209750bSBram Moolenaar g:newvar = 'new' #comment 48401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 49401d9ffbSBram Moolenaar 50401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 51401d9ffbSBram Moolenaar g:existing = 'no' 52401d9ffbSBram Moolenaar assert_equal('no', g:existing) 53401d9ffbSBram Moolenaar 54b283a8a6SBram Moolenaar v:char = 'abc' 556e587dcbSBram Moolenaar assert_equal('abc', v:char) 56b283a8a6SBram Moolenaar 57b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 586e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 59b283a8a6SBram Moolenaar $ENVVAR = '' 606e587dcbSBram Moolenaar 61fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 62fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 63fd1823e0SBram Moolenaar s:addToMe += 222 64fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 650bbf722aSBram Moolenaar s:newVar = 'new' 660bbf722aSBram Moolenaar assert_equal('new', s:newVar) 67a8c17704SBram Moolenaar 68a8c17704SBram Moolenaar set ts=7 69a8c17704SBram Moolenaar &ts += 1 70a8c17704SBram Moolenaar assert_equal(8, &ts) 7180c34ca3SBram Moolenaar &ts -= 3 7280c34ca3SBram Moolenaar assert_equal(5, &ts) 7380c34ca3SBram Moolenaar &ts *= 2 7480c34ca3SBram Moolenaar assert_equal(10, &ts) 7580c34ca3SBram Moolenaar &ts /= 3 7680c34ca3SBram Moolenaar assert_equal(3, &ts) 7780c34ca3SBram Moolenaar set ts=10 7880c34ca3SBram Moolenaar &ts %= 4 7980c34ca3SBram Moolenaar assert_equal(2, &ts) 80a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 81a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 82a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 83a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 84a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 85a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 86a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 87a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 88cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 89585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 9080c34ca3SBram Moolenaar &ts = 8 91a8c17704SBram Moolenaar 92a8c17704SBram Moolenaar g:inc_counter += 1 93a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 94a8c17704SBram Moolenaar 95a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 96a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 97a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 98a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 99a8c17704SBram Moolenaar 100a8c17704SBram Moolenaar @a = 'areg' 101a8c17704SBram Moolenaar @a ..= 'add' 102a8c17704SBram Moolenaar assert_equal('aregadd', @a) 103a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 104a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 105e69f6d04SBram Moolenaar 106e69f6d04SBram Moolenaar v:errmsg = 'none' 107e69f6d04SBram Moolenaar v:errmsg ..= 'again' 108e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 109e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 110e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 1115deeb3f1SBram Moolenaarenddef 1125deeb3f1SBram Moolenaar 1133b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1143b74b6b4SBram Moolenaar let lines =<< trim END 1153b74b6b4SBram Moolenaar vim9script 1163b74b6b4SBram Moolenaar 117f5be8cdbSBram Moolenaar # single character variable declarations work 1183b74b6b4SBram Moolenaar let a: string 1193b74b6b4SBram Moolenaar let b: number 1203b74b6b4SBram Moolenaar let l: list<any> 1213b74b6b4SBram Moolenaar let s: string 1223b74b6b4SBram Moolenaar let t: number 1233b74b6b4SBram Moolenaar let v: number 1243b74b6b4SBram Moolenaar let w: number 1253b74b6b4SBram Moolenaar 126f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1273b74b6b4SBram Moolenaar a = 'script-a' 1283b74b6b4SBram Moolenaar b = 111 1293b74b6b4SBram Moolenaar l = [1, 2, 3] 1303b74b6b4SBram Moolenaar s = 'script-s' 1313b74b6b4SBram Moolenaar t = 222 1323b74b6b4SBram Moolenaar v = 333 1333b74b6b4SBram Moolenaar w = 444 1343b74b6b4SBram Moolenaar 1353b74b6b4SBram Moolenaar assert_equal('script-a', a) 1363b74b6b4SBram Moolenaar assert_equal(111, b) 1373b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 1383b74b6b4SBram Moolenaar assert_equal('script-s', s) 1393b74b6b4SBram Moolenaar assert_equal(222, t) 1403b74b6b4SBram Moolenaar assert_equal(333, v) 1413b74b6b4SBram Moolenaar assert_equal(444, w) 1423b74b6b4SBram Moolenaar END 1433b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 1443b74b6b4SBram Moolenaar source Xsinglechar 1453b74b6b4SBram Moolenaar delete('Xsinglechar') 1463b74b6b4SBram Moolenaarenddef 1473b74b6b4SBram Moolenaar 14884370087SBram Moolenaardef Test_assignment_list() 14984370087SBram Moolenaar let list1: list<bool> = [false, true, false] 15084370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 15184370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 15284370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 15384370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 15484370087SBram Moolenaar 15584370087SBram Moolenaar let listS: list<string> = [] 15684370087SBram Moolenaar let listN: list<number> = [] 15784370087SBram Moolenaar 15884370087SBram Moolenaar assert_equal([1, 2, 3], list2) 15984370087SBram Moolenaar list2[-1] = 99 16084370087SBram Moolenaar assert_equal([1, 2, 99], list2) 16184370087SBram Moolenaar list2[-2] = 88 16284370087SBram Moolenaar assert_equal([1, 88, 99], list2) 16384370087SBram Moolenaar list2[-3] = 77 16484370087SBram Moolenaar assert_equal([77, 88, 99], list2) 16584370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 166c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 16784370087SBram Moolenaar 16884370087SBram Moolenaar # type becomes list<any> 16984370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 17084370087SBram Moolenaarenddef 17184370087SBram Moolenaar 17284370087SBram Moolenaardef Test_assignment_dict() 17384370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 17484370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 17584370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 17684370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 17774fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 17884370087SBram Moolenaar 179f5be8cdbSBram Moolenaar # overwrite 180c785b9a7SBram Moolenaar dict3['key'] = 'another' 181c785b9a7SBram Moolenaar 18284370087SBram Moolenaar call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:') 18384370087SBram Moolenaar 18484370087SBram Moolenaar # type becomes dict<any> 18584370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 18684370087SBram Moolenaarenddef 18784370087SBram Moolenaar 188d3aac291SBram Moolenaardef Test_assignment_local() 189f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 190f5be8cdbSBram Moolenaar # changed. 191d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 192d3aac291SBram Moolenaar let b:existing = 'yes' 193d3aac291SBram Moolenaar let w:existing = 'yes' 194d3aac291SBram Moolenaar let t:existing = 'yes' 195d3aac291SBram Moolenaar 196d3aac291SBram Moolenaar def Test_assignment_local_internal() 197d3aac291SBram Moolenaar b:newvar = 'new' 198d3aac291SBram Moolenaar assert_equal('new', b:newvar) 199d3aac291SBram Moolenaar assert_equal('yes', b:existing) 200d3aac291SBram Moolenaar b:existing = 'no' 201d3aac291SBram Moolenaar assert_equal('no', b:existing) 202396f3138SBram Moolenaar b:existing ..= 'NO' 203396f3138SBram Moolenaar assert_equal('noNO', b:existing) 204d3aac291SBram Moolenaar 205d3aac291SBram Moolenaar w:newvar = 'new' 206d3aac291SBram Moolenaar assert_equal('new', w:newvar) 207d3aac291SBram Moolenaar assert_equal('yes', w:existing) 208d3aac291SBram Moolenaar w:existing = 'no' 209d3aac291SBram Moolenaar assert_equal('no', w:existing) 210396f3138SBram Moolenaar w:existing ..= 'NO' 211396f3138SBram Moolenaar assert_equal('noNO', w:existing) 212d3aac291SBram Moolenaar 213d3aac291SBram Moolenaar t:newvar = 'new' 214d3aac291SBram Moolenaar assert_equal('new', t:newvar) 215d3aac291SBram Moolenaar assert_equal('yes', t:existing) 216d3aac291SBram Moolenaar t:existing = 'no' 217d3aac291SBram Moolenaar assert_equal('no', t:existing) 218396f3138SBram Moolenaar t:existing ..= 'NO' 219396f3138SBram Moolenaar assert_equal('noNO', t:existing) 220d3aac291SBram Moolenaar enddef 221d3aac291SBram Moolenaar call Test_assignment_local_internal() 222d3aac291SBram Moolenaar END 223d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 224d3aac291SBram Moolenaarenddef 225d3aac291SBram Moolenaar 2265deeb3f1SBram Moolenaardef Test_assignment_default() 227e69f6d04SBram Moolenaar 228cb711abfSBram Moolenaar # Test default values. 229e69f6d04SBram Moolenaar let thebool: bool 230e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 231e69f6d04SBram Moolenaar 232e69f6d04SBram Moolenaar let thenumber: number 233e69f6d04SBram Moolenaar assert_equal(0, thenumber) 234e69f6d04SBram Moolenaar 235e69f6d04SBram Moolenaar if has('float') 236e69f6d04SBram Moolenaar let thefloat: float 237e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 238e69f6d04SBram Moolenaar endif 239e69f6d04SBram Moolenaar 240e69f6d04SBram Moolenaar let thestring: string 241e69f6d04SBram Moolenaar assert_equal('', thestring) 242e69f6d04SBram Moolenaar 243e69f6d04SBram Moolenaar let theblob: blob 244e69f6d04SBram Moolenaar assert_equal(0z, theblob) 245e69f6d04SBram Moolenaar 2465deeb3f1SBram Moolenaar let Thefunc: func 2475deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 248e69f6d04SBram Moolenaar 249e69f6d04SBram Moolenaar let thelist: list<any> 250e69f6d04SBram Moolenaar assert_equal([], thelist) 251e69f6d04SBram Moolenaar 252e69f6d04SBram Moolenaar let thedict: dict<any> 253e69f6d04SBram Moolenaar assert_equal({}, thedict) 254e69f6d04SBram Moolenaar 2552c869deeSBram Moolenaar if has('channel') 256e69f6d04SBram Moolenaar let thejob: job 257e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 258e69f6d04SBram Moolenaar 259e69f6d04SBram Moolenaar let thechannel: channel 260e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 261c785b9a7SBram Moolenaar 262c785b9a7SBram Moolenaar if has('unix') && executable('cat') 263f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 264c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 265c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 266c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 267c785b9a7SBram Moolenaar endif 2682c869deeSBram Moolenaar endif 269585fea7bSBram Moolenaar 270585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 271585fea7bSBram Moolenaar assert_equal(5678, nr) 2728a7d6542SBram Moolenaarenddef 2738a7d6542SBram Moolenaar 27447a519a9SBram Moolenaardef Test_assignment_var_list() 27547a519a9SBram Moolenaar let v1: string 27647a519a9SBram Moolenaar let v2: string 2779af78769SBram Moolenaar let vrem: list<string> 2789af78769SBram Moolenaar [v1] = ['aaa'] 2799af78769SBram Moolenaar assert_equal('aaa', v1) 2809af78769SBram Moolenaar 28147a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 28247a519a9SBram Moolenaar assert_equal('one', v1) 28347a519a9SBram Moolenaar assert_equal('two', v2) 2849af78769SBram Moolenaar 2859af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 2869af78769SBram Moolenaar assert_equal('one', v1) 2879af78769SBram Moolenaar assert_equal('two', v2) 2889af78769SBram Moolenaar assert_equal([], vrem) 2899af78769SBram Moolenaar 2909af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 2919af78769SBram Moolenaar assert_equal('one', v1) 2929af78769SBram Moolenaar assert_equal('two', v2) 2939af78769SBram Moolenaar assert_equal(['three'], vrem) 29447a519a9SBram Moolenaarenddef 29547a519a9SBram Moolenaar 296cab27678SBram Moolenaardef Mess(): string 297cab27678SBram Moolenaar v:foldstart = 123 298cab27678SBram Moolenaar return 'xxx' 299cab27678SBram Moolenaarenddef 300cab27678SBram Moolenaar 301d72c1bf0SBram Moolenaardef Test_assignment_failure() 3028a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 3038a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 3048a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 3058a7d6542SBram Moolenaar 3068a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 3078a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 3088a7d6542SBram Moolenaar 3099b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 3109af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3119af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 3129af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3139af78769SBram Moolenaar '[a] = []'], 'E1093:') 3149af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3159af78769SBram Moolenaar 'let y: number', 3169af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 3179af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3189af78769SBram Moolenaar 'let y: number', 3199af78769SBram Moolenaar 'let z: list<number>', 3209af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 3219be61bbbSBram Moolenaar 322e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 3239be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 3249be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 3259be61bbbSBram Moolenaar 326e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 3279be61bbbSBram Moolenaar 3289be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 3299be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 3309be61bbbSBram Moolenaar 331e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 332e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 333e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 334e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 3359be61bbbSBram Moolenaar 3369be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 3379be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 3389be61bbbSBram Moolenaar 339822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 34033fa29cfSBram Moolenaar 3418a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 3428a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 3438a7d6542SBram Moolenaar 3448a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 3458a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 3468a7d6542SBram Moolenaar 3478a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 3488a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 34942a480bfSBram Moolenaar 350d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 35142a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 352cab27678SBram Moolenaar 353cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 354cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 355d72c1bf0SBram Moolenaarenddef 356d72c1bf0SBram Moolenaar 357d72c1bf0SBram Moolenaardef Test_unlet() 358d72c1bf0SBram Moolenaar g:somevar = 'yes' 359d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 360d72c1bf0SBram Moolenaar unlet g:somevar 361d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 362d72c1bf0SBram Moolenaar unlet! g:somevar 363d72c1bf0SBram Moolenaar 364d72c1bf0SBram Moolenaar call CheckScriptFailure([ 365d72c1bf0SBram Moolenaar 'vim9script', 366d72c1bf0SBram Moolenaar 'let svar = 123', 367d72c1bf0SBram Moolenaar 'unlet svar', 368d72c1bf0SBram Moolenaar ], 'E1081:') 369d72c1bf0SBram Moolenaar call CheckScriptFailure([ 370d72c1bf0SBram Moolenaar 'vim9script', 371d72c1bf0SBram Moolenaar 'let svar = 123', 372d72c1bf0SBram Moolenaar 'unlet s:svar', 373d72c1bf0SBram Moolenaar ], 'E1081:') 374d72c1bf0SBram Moolenaar call CheckScriptFailure([ 375d72c1bf0SBram Moolenaar 'vim9script', 376d72c1bf0SBram Moolenaar 'let svar = 123', 377d72c1bf0SBram Moolenaar 'def Func()', 378d72c1bf0SBram Moolenaar ' unlet svar', 379d72c1bf0SBram Moolenaar 'enddef', 380822ba247SBram Moolenaar 'defcompile', 381d72c1bf0SBram Moolenaar ], 'E1081:') 382d72c1bf0SBram Moolenaar call CheckScriptFailure([ 383d72c1bf0SBram Moolenaar 'vim9script', 384d72c1bf0SBram Moolenaar 'let svar = 123', 385d72c1bf0SBram Moolenaar 'def Func()', 386d72c1bf0SBram Moolenaar ' unlet s:svar', 387d72c1bf0SBram Moolenaar 'enddef', 388822ba247SBram Moolenaar 'defcompile', 389d72c1bf0SBram Moolenaar ], 'E1081:') 3907bdaea6eSBram Moolenaar 3917bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 3927bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 3937bdaea6eSBram Moolenaar unlet $ENVVAR 3947bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 395d72c1bf0SBram Moolenaarenddef 396599c89c8SBram Moolenaar 3974c17ad94SBram Moolenaardef Test_delfunction() 398f5be8cdbSBram Moolenaar # Check function is defined in script namespace 3994c17ad94SBram Moolenaar CheckScriptSuccess([ 4004c17ad94SBram Moolenaar 'vim9script', 4014c17ad94SBram Moolenaar 'func CheckMe()', 4024c17ad94SBram Moolenaar ' return 123', 4034c17ad94SBram Moolenaar 'endfunc', 4044c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 4054c17ad94SBram Moolenaar ]) 4064c17ad94SBram Moolenaar 407f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 4084c17ad94SBram Moolenaar CheckScriptFailure([ 4094c17ad94SBram Moolenaar 'vim9script', 4104c17ad94SBram Moolenaar 'func DeleteMe1()', 4114c17ad94SBram Moolenaar 'endfunc', 4124c17ad94SBram Moolenaar 'delfunction DeleteMe1', 4134c17ad94SBram Moolenaar ], 'E1084:') 4144c17ad94SBram Moolenaar CheckScriptFailure([ 4154c17ad94SBram Moolenaar 'vim9script', 4164c17ad94SBram Moolenaar 'func DeleteMe2()', 4174c17ad94SBram Moolenaar 'endfunc', 4184c17ad94SBram Moolenaar 'def DoThat()', 4194c17ad94SBram Moolenaar ' delfunction DeleteMe2', 4204c17ad94SBram Moolenaar 'enddef', 4214c17ad94SBram Moolenaar 'DoThat()', 4224c17ad94SBram Moolenaar ], 'E1084:') 4234c17ad94SBram Moolenaar CheckScriptFailure([ 4244c17ad94SBram Moolenaar 'vim9script', 4254c17ad94SBram Moolenaar 'def DeleteMe3()', 4264c17ad94SBram Moolenaar 'enddef', 4274c17ad94SBram Moolenaar 'delfunction DeleteMe3', 4284c17ad94SBram Moolenaar ], 'E1084:') 4294c17ad94SBram Moolenaar CheckScriptFailure([ 4304c17ad94SBram Moolenaar 'vim9script', 4314c17ad94SBram Moolenaar 'def DeleteMe4()', 4324c17ad94SBram Moolenaar 'enddef', 4334c17ad94SBram Moolenaar 'def DoThat()', 4344c17ad94SBram Moolenaar ' delfunction DeleteMe4', 4354c17ad94SBram Moolenaar 'enddef', 4364c17ad94SBram Moolenaar 'DoThat()', 4374c17ad94SBram Moolenaar ], 'E1084:') 4384c17ad94SBram Moolenaarenddef 4394c17ad94SBram Moolenaar 440599c89c8SBram Moolenaarfunc Test_wrong_type() 441599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 442599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 443599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 444599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 445599c89c8SBram Moolenaar 446599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 447599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 44842a480bfSBram Moolenaar 44942a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 45042a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 45142a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 45242a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 45342a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 45442a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 45542a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 45642a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 45742a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 45842a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 45942a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 460a0a9f43aSBram Moolenaar 461a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 462a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 4638a7d6542SBram Moolenaarendfunc 4648a7d6542SBram Moolenaar 4658a7d6542SBram Moolenaarfunc Test_const() 4668a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 4678a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 4688a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 4699be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 4708a7d6542SBram Moolenaarendfunc 4718a7d6542SBram Moolenaar 472df069eecSBram Moolenaardef Test_range_no_colon() 473df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 474df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 475df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 476df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 477df069eecSBram Moolenaarenddef 478df069eecSBram Moolenaar 479df069eecSBram Moolenaar 4808a7d6542SBram Moolenaardef Test_block() 4818a7d6542SBram Moolenaar let outer = 1 4828a7d6542SBram Moolenaar { 4838a7d6542SBram Moolenaar let inner = 2 4848a7d6542SBram Moolenaar assert_equal(1, outer) 4858a7d6542SBram Moolenaar assert_equal(2, inner) 4868a7d6542SBram Moolenaar } 4878a7d6542SBram Moolenaar assert_equal(1, outer) 4888a7d6542SBram Moolenaarenddef 4898a7d6542SBram Moolenaar 4908a7d6542SBram Moolenaarfunc Test_block_failure() 4918a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 492585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 493585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 4948a7d6542SBram Moolenaarendfunc 4958a7d6542SBram Moolenaar 496585fea7bSBram Moolenaardef Test_cmd_modifier() 497585fea7bSBram Moolenaar tab echo '0' 498585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 499585fea7bSBram Moolenaarenddef 500585fea7bSBram Moolenaar 501d032f34aSBram Moolenaarfunc g:NoSuchFunc() 502d032f34aSBram Moolenaar echo 'none' 503d032f34aSBram Moolenaarendfunc 504d032f34aSBram Moolenaar 5058a7d6542SBram Moolenaardef Test_try_catch() 5068a7d6542SBram Moolenaar let l = [] 5077a092245SBram Moolenaar try # comment 5088a7d6542SBram Moolenaar add(l, '1') 5098a7d6542SBram Moolenaar throw 'wrong' 5108a7d6542SBram Moolenaar add(l, '2') 5117a092245SBram Moolenaar catch # comment 5128a7d6542SBram Moolenaar add(l, v:exception) 5137a092245SBram Moolenaar finally # comment 5148a7d6542SBram Moolenaar add(l, '3') 5157a092245SBram Moolenaar endtry # comment 5168a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 51768d130c6SBram Moolenaar 518e859312eSBram Moolenaar l = [] 519e859312eSBram Moolenaar try 520e859312eSBram Moolenaar try 521e859312eSBram Moolenaar add(l, '1') 522e859312eSBram Moolenaar throw 'wrong' 523e859312eSBram Moolenaar add(l, '2') 524e859312eSBram Moolenaar catch /right/ 525e859312eSBram Moolenaar add(l, v:exception) 526e859312eSBram Moolenaar endtry 527e859312eSBram Moolenaar catch /wrong/ 528e859312eSBram Moolenaar add(l, 'caught') 529e859312eSBram Moolenaar finally 530e859312eSBram Moolenaar add(l, 'finally') 531e859312eSBram Moolenaar endtry 532e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 533e859312eSBram Moolenaar 53468d130c6SBram Moolenaar let n: number 53568d130c6SBram Moolenaar try 53668d130c6SBram Moolenaar n = l[3] 53768d130c6SBram Moolenaar catch /E684:/ 53868d130c6SBram Moolenaar n = 99 53968d130c6SBram Moolenaar endtry 54068d130c6SBram Moolenaar assert_equal(99, n) 54168d130c6SBram Moolenaar 54268d130c6SBram Moolenaar try 54368d130c6SBram Moolenaar n = g:astring[3] 54468d130c6SBram Moolenaar catch /E714:/ 54568d130c6SBram Moolenaar n = 77 54668d130c6SBram Moolenaar endtry 54768d130c6SBram Moolenaar assert_equal(77, n) 54868d130c6SBram Moolenaar 54968d130c6SBram Moolenaar try 55068d130c6SBram Moolenaar n = l[g:astring] 55168d130c6SBram Moolenaar catch /E39:/ 55268d130c6SBram Moolenaar n = 77 55368d130c6SBram Moolenaar endtry 55468d130c6SBram Moolenaar assert_equal(77, n) 55568d130c6SBram Moolenaar 55668d130c6SBram Moolenaar try 55768d130c6SBram Moolenaar n = s:does_not_exist 55868d130c6SBram Moolenaar catch /E121:/ 559f0b9f43cSBram Moolenaar n = 111 560f0b9f43cSBram Moolenaar endtry 561f0b9f43cSBram Moolenaar assert_equal(111, n) 562f0b9f43cSBram Moolenaar 563f0b9f43cSBram Moolenaar try 564f0b9f43cSBram Moolenaar n = g:does_not_exist 565f0b9f43cSBram Moolenaar catch /E121:/ 56668d130c6SBram Moolenaar n = 121 56768d130c6SBram Moolenaar endtry 56868d130c6SBram Moolenaar assert_equal(121, n) 56968d130c6SBram Moolenaar 57068d130c6SBram Moolenaar let d = #{one: 1} 57168d130c6SBram Moolenaar try 57268d130c6SBram Moolenaar n = d[g:astring] 57368d130c6SBram Moolenaar catch /E716:/ 57468d130c6SBram Moolenaar n = 222 57568d130c6SBram Moolenaar endtry 57668d130c6SBram Moolenaar assert_equal(222, n) 577f0b9f43cSBram Moolenaar 578f0b9f43cSBram Moolenaar try 579f0b9f43cSBram Moolenaar n = -g:astring 580f0b9f43cSBram Moolenaar catch /E39:/ 581f0b9f43cSBram Moolenaar n = 233 582f0b9f43cSBram Moolenaar endtry 583f0b9f43cSBram Moolenaar assert_equal(233, n) 584f0b9f43cSBram Moolenaar 585f0b9f43cSBram Moolenaar try 586f0b9f43cSBram Moolenaar n = +g:astring 587f0b9f43cSBram Moolenaar catch /E1030:/ 588f0b9f43cSBram Moolenaar n = 244 589f0b9f43cSBram Moolenaar endtry 590f0b9f43cSBram Moolenaar assert_equal(244, n) 591f0b9f43cSBram Moolenaar 592f0b9f43cSBram Moolenaar try 593f0b9f43cSBram Moolenaar n = +g:alist 594f0b9f43cSBram Moolenaar catch /E745:/ 595f0b9f43cSBram Moolenaar n = 255 596f0b9f43cSBram Moolenaar endtry 597f0b9f43cSBram Moolenaar assert_equal(255, n) 598f0b9f43cSBram Moolenaar 599f0b9f43cSBram Moolenaar let nd: dict<any> 600f0b9f43cSBram Moolenaar try 601f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 602f0b9f43cSBram Moolenaar catch /E1029:/ 603f0b9f43cSBram Moolenaar n = 266 604f0b9f43cSBram Moolenaar endtry 605f0b9f43cSBram Moolenaar assert_equal(266, n) 606f0b9f43cSBram Moolenaar 607f0b9f43cSBram Moolenaar try 608f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 609f0b9f43cSBram Moolenaar catch /E1093:/ 610f0b9f43cSBram Moolenaar n = 277 611f0b9f43cSBram Moolenaar endtry 612f0b9f43cSBram Moolenaar assert_equal(277, n) 613f0b9f43cSBram Moolenaar 614e859312eSBram Moolenaar try 615e859312eSBram Moolenaar &ts = g:astring 616e859312eSBram Moolenaar catch /E1029:/ 617e859312eSBram Moolenaar n = 288 618e859312eSBram Moolenaar endtry 619e859312eSBram Moolenaar assert_equal(288, n) 620e859312eSBram Moolenaar 621e859312eSBram Moolenaar try 622e859312eSBram Moolenaar &backspace = 'asdf' 623e859312eSBram Moolenaar catch /E474:/ 624e859312eSBram Moolenaar n = 299 625e859312eSBram Moolenaar endtry 626e859312eSBram Moolenaar assert_equal(299, n) 627e859312eSBram Moolenaar 628e859312eSBram Moolenaar l = [1] 629e859312eSBram Moolenaar try 630e859312eSBram Moolenaar l[3] = 3 631e859312eSBram Moolenaar catch /E684:/ 632e859312eSBram Moolenaar n = 300 633e859312eSBram Moolenaar endtry 634e859312eSBram Moolenaar assert_equal(300, n) 635e859312eSBram Moolenaar 636e859312eSBram Moolenaar try 637e859312eSBram Moolenaar d[''] = 3 638e859312eSBram Moolenaar catch /E713:/ 639e859312eSBram Moolenaar n = 311 640e859312eSBram Moolenaar endtry 641e859312eSBram Moolenaar assert_equal(311, n) 642e859312eSBram Moolenaar 643e859312eSBram Moolenaar try 644e859312eSBram Moolenaar unlet g:does_not_exist 645e859312eSBram Moolenaar catch /E108:/ 646e859312eSBram Moolenaar n = 322 647e859312eSBram Moolenaar endtry 648e859312eSBram Moolenaar assert_equal(322, n) 649e859312eSBram Moolenaar 650e859312eSBram Moolenaar try 651e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 652e859312eSBram Moolenaar catch /E721:/ 653e859312eSBram Moolenaar n = 333 654e859312eSBram Moolenaar endtry 655e859312eSBram Moolenaar assert_equal(333, n) 656e859312eSBram Moolenaar 657e859312eSBram Moolenaar try 658e859312eSBram Moolenaar l = DeletedFunc() 659e859312eSBram Moolenaar catch /E933:/ 660e859312eSBram Moolenaar n = 344 661e859312eSBram Moolenaar endtry 662e859312eSBram Moolenaar assert_equal(344, n) 663d032f34aSBram Moolenaar 664d032f34aSBram Moolenaar try 665d032f34aSBram Moolenaar echo len(v:true) 666d032f34aSBram Moolenaar catch /E701:/ 667d032f34aSBram Moolenaar n = 355 668d032f34aSBram Moolenaar endtry 669d032f34aSBram Moolenaar assert_equal(355, n) 670d032f34aSBram Moolenaar 671d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 672d032f34aSBram Moolenaar delfunc g:NoSuchFunc 673d032f34aSBram Moolenaar try 674d032f34aSBram Moolenaar echo P() 675d032f34aSBram Moolenaar catch /E117:/ 676d032f34aSBram Moolenaar n = 366 677d032f34aSBram Moolenaar endtry 678d032f34aSBram Moolenaar assert_equal(366, n) 679d032f34aSBram Moolenaar 680d032f34aSBram Moolenaar try 681d032f34aSBram Moolenaar echo g:NoSuchFunc() 682d032f34aSBram Moolenaar catch /E117:/ 683d032f34aSBram Moolenaar n = 377 684d032f34aSBram Moolenaar endtry 685d032f34aSBram Moolenaar assert_equal(377, n) 686d032f34aSBram Moolenaar 687d032f34aSBram Moolenaar try 688d032f34aSBram Moolenaar echo g:alist + 4 689d032f34aSBram Moolenaar catch /E745:/ 690d032f34aSBram Moolenaar n = 388 691d032f34aSBram Moolenaar endtry 692d032f34aSBram Moolenaar assert_equal(388, n) 693d032f34aSBram Moolenaar 694d032f34aSBram Moolenaar try 695d032f34aSBram Moolenaar echo 4 + g:alist 696d032f34aSBram Moolenaar catch /E745:/ 697d032f34aSBram Moolenaar n = 399 698d032f34aSBram Moolenaar endtry 699d032f34aSBram Moolenaar assert_equal(399, n) 700d032f34aSBram Moolenaar 701d032f34aSBram Moolenaar try 702d032f34aSBram Moolenaar echo g:alist.member 703d032f34aSBram Moolenaar catch /E715:/ 704d032f34aSBram Moolenaar n = 400 705d032f34aSBram Moolenaar endtry 706d032f34aSBram Moolenaar assert_equal(400, n) 707d032f34aSBram Moolenaar 708d032f34aSBram Moolenaar try 709d032f34aSBram Moolenaar echo d.member 710d032f34aSBram Moolenaar catch /E716:/ 711d032f34aSBram Moolenaar n = 411 712d032f34aSBram Moolenaar endtry 713d032f34aSBram Moolenaar assert_equal(411, n) 7148a7d6542SBram Moolenaarenddef 7158a7d6542SBram Moolenaar 716e859312eSBram Moolenaardef DeletedFunc(): list<any> 717e859312eSBram Moolenaar return ['delete me'] 718e859312eSBram Moolenaarenddef 719e859312eSBram Moolenaardefcompile 720e859312eSBram Moolenaardelfunc DeletedFunc 721e859312eSBram Moolenaar 722257cc5eeSBram Moolenaardef ThrowFromDef() 723a72cfb80SBram Moolenaar throw "getout" # comment 724257cc5eeSBram Moolenaarenddef 725257cc5eeSBram Moolenaar 726257cc5eeSBram Moolenaarfunc CatchInFunc() 727257cc5eeSBram Moolenaar try 728257cc5eeSBram Moolenaar call ThrowFromDef() 729257cc5eeSBram Moolenaar catch 730257cc5eeSBram Moolenaar let g:thrown_func = v:exception 731257cc5eeSBram Moolenaar endtry 732257cc5eeSBram Moolenaarendfunc 733257cc5eeSBram Moolenaar 734257cc5eeSBram Moolenaardef CatchInDef() 735257cc5eeSBram Moolenaar try 736257cc5eeSBram Moolenaar ThrowFromDef() 737257cc5eeSBram Moolenaar catch 738257cc5eeSBram Moolenaar g:thrown_def = v:exception 739257cc5eeSBram Moolenaar endtry 740257cc5eeSBram Moolenaarenddef 741257cc5eeSBram Moolenaar 742f575adffSBram Moolenaardef ReturnFinally(): string 743f575adffSBram Moolenaar try 744f575adffSBram Moolenaar return 'intry' 745f575adffSBram Moolenaar finally 746f575adffSBram Moolenaar g:in_finally = 'finally' 747f575adffSBram Moolenaar endtry 748f575adffSBram Moolenaar return 'end' 749f575adffSBram Moolenaarenddef 750f575adffSBram Moolenaar 751257cc5eeSBram Moolenaardef Test_try_catch_nested() 752257cc5eeSBram Moolenaar CatchInFunc() 753257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 754257cc5eeSBram Moolenaar 755257cc5eeSBram Moolenaar CatchInDef() 756257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 757f575adffSBram Moolenaar 758f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 759f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 760f575adffSBram Moolenaarenddef 761f575adffSBram Moolenaar 762f575adffSBram Moolenaardef Test_try_catch_match() 763f575adffSBram Moolenaar let seq = 'a' 764f575adffSBram Moolenaar try 765f575adffSBram Moolenaar throw 'something' 766f575adffSBram Moolenaar catch /nothing/ 767f575adffSBram Moolenaar seq ..= 'x' 768f575adffSBram Moolenaar catch /some/ 769f575adffSBram Moolenaar seq ..= 'b' 770f575adffSBram Moolenaar catch /asdf/ 771f575adffSBram Moolenaar seq ..= 'x' 772e8c4abbbSBram Moolenaar catch ?a\?sdf? 773e8c4abbbSBram Moolenaar seq ..= 'y' 774f575adffSBram Moolenaar finally 775f575adffSBram Moolenaar seq ..= 'c' 776f575adffSBram Moolenaar endtry 777f575adffSBram Moolenaar assert_equal('abc', seq) 778257cc5eeSBram Moolenaarenddef 779257cc5eeSBram Moolenaar 780e8c4abbbSBram Moolenaardef Test_try_catch_fails() 781e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 782e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 783e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 784585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 785585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 786585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 787585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 788585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 789585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 790585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 791585fea7bSBram Moolenaar 792a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 793585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 794e8c4abbbSBram Moolenaarenddef 795e8c4abbbSBram Moolenaar 796006ad48bSBram Moolenaardef Test_throw_vimscript() 797f5be8cdbSBram Moolenaar # only checks line continuation 798006ad48bSBram Moolenaar let lines =<< trim END 799006ad48bSBram Moolenaar vim9script 800006ad48bSBram Moolenaar try 801006ad48bSBram Moolenaar throw 'one' 802006ad48bSBram Moolenaar .. 'two' 803006ad48bSBram Moolenaar catch 804006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 805006ad48bSBram Moolenaar endtry 806006ad48bSBram Moolenaar END 807006ad48bSBram Moolenaar CheckScriptSuccess(lines) 808006ad48bSBram Moolenaarenddef 809006ad48bSBram Moolenaar 81037c83711SBram Moolenaardef Test_cexpr_vimscript() 811f5be8cdbSBram Moolenaar # only checks line continuation 81237c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 81337c83711SBram Moolenaar let lines =<< trim END 81437c83711SBram Moolenaar vim9script 81537c83711SBram Moolenaar cexpr 'File' 81637c83711SBram Moolenaar .. ' someFile' .. 81737c83711SBram Moolenaar ' line 19' 81837c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 81937c83711SBram Moolenaar END 82037c83711SBram Moolenaar CheckScriptSuccess(lines) 82137c83711SBram Moolenaar set errorformat& 82237c83711SBram Moolenaarenddef 82337c83711SBram Moolenaar 824*b209750bSBram Moolenaardef Test_list_vimscript() 825*b209750bSBram Moolenaar # checks line continuation and comments 826*b209750bSBram Moolenaar let lines =<< trim END 827*b209750bSBram Moolenaar vim9script 828*b209750bSBram Moolenaar let mylist = [ 829*b209750bSBram Moolenaar 'one', 830*b209750bSBram Moolenaar # comment 831*b209750bSBram Moolenaar 'two', # empty line follows 832*b209750bSBram Moolenaar 833*b209750bSBram Moolenaar 'three', 834*b209750bSBram Moolenaar ] 835*b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 836*b209750bSBram Moolenaar END 837*b209750bSBram Moolenaar CheckScriptSuccess(lines) 838*b209750bSBram Moolenaarenddef 839*b209750bSBram Moolenaar 8402a1381c3SBram Moolenaarif has('channel') 84140ee466cSBram Moolenaar let someJob = test_null_job() 84240ee466cSBram Moolenaar 84340ee466cSBram Moolenaar def FuncWithError() 84440ee466cSBram Moolenaar echomsg g:someJob 84540ee466cSBram Moolenaar enddef 84640ee466cSBram Moolenaar 84740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 84840ee466cSBram Moolenaar try 84940ee466cSBram Moolenaar call FuncWithError() 85040ee466cSBram Moolenaar catch 85140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 85240ee466cSBram Moolenaar endtry 85340ee466cSBram Moolenaar endfunc 8542a1381c3SBram Moolenaarendif 85540ee466cSBram Moolenaar 8568a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8578a7d6542SBram Moolenaar vim9script 8588a7d6542SBram Moolenaar let name: string = 'bob' 8598a7d6542SBram Moolenaar def Concat(arg: string): string 8608a7d6542SBram Moolenaar return name .. arg 8618a7d6542SBram Moolenaar enddef 862227a69deSBram Moolenaar g:result = Concat('bie') 863227a69deSBram Moolenaar g:localname = name 8648a7d6542SBram Moolenaar 8658a7d6542SBram Moolenaar export const CONST = 1234 8668a7d6542SBram Moolenaar export let exported = 9876 8676e587dcbSBram Moolenaar export let exp_name = 'John' 8688a7d6542SBram Moolenaar export def Exported(): string 8698a7d6542SBram Moolenaar return 'Exported' 8708a7d6542SBram Moolenaar enddef 8718a7d6542SBram MoolenaarEND 8728a7d6542SBram Moolenaar 8735269bd2aSBram Moolenaardef Test_vim9_import_export() 8748a7d6542SBram Moolenaar let import_script_lines =<< trim END 8758a7d6542SBram Moolenaar vim9script 8768a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8778a7d6542SBram Moolenaar g:imported = exported 8786e587dcbSBram Moolenaar exported += 3 8796e587dcbSBram Moolenaar g:imported_added = exported 8808a7d6542SBram Moolenaar g:imported_func = Exported() 8816e587dcbSBram Moolenaar 8826e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8836e587dcbSBram Moolenaar g:imported_name = exp_name 8846e587dcbSBram Moolenaar exp_name ..= ' Doe' 8856e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8865381c7a1SBram Moolenaar g:imported_later = exported 8878a7d6542SBram Moolenaar END 8888a7d6542SBram Moolenaar 8898a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8908a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8918a7d6542SBram Moolenaar 8928a7d6542SBram Moolenaar source Ximport.vim 8938a7d6542SBram Moolenaar 8948a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8958a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8968a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8976e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8985381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8998a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 9006e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9016e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9028a7d6542SBram Moolenaar assert_false(exists('g:name')) 9038a7d6542SBram Moolenaar 9048a7d6542SBram Moolenaar unlet g:result 9058a7d6542SBram Moolenaar unlet g:localname 9068a7d6542SBram Moolenaar unlet g:imported 9076e587dcbSBram Moolenaar unlet g:imported_added 9085381c7a1SBram Moolenaar unlet g:imported_later 9098a7d6542SBram Moolenaar unlet g:imported_func 9106e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9118a7d6542SBram Moolenaar delete('Ximport.vim') 912f2d5c240SBram Moolenaar 9131c991144SBram Moolenaar # similar, with line breaks 9141c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 9151c991144SBram Moolenaar vim9script 9161c991144SBram Moolenaar import { 9171c991144SBram Moolenaar exported, 9181c991144SBram Moolenaar Exported, 9191c991144SBram Moolenaar } 9201c991144SBram Moolenaar from 9211c991144SBram Moolenaar './Xexport.vim' 9221c991144SBram Moolenaar g:imported = exported 9231c991144SBram Moolenaar exported += 5 9241c991144SBram Moolenaar g:imported_added = exported 9251c991144SBram Moolenaar g:imported_func = Exported() 9261c991144SBram Moolenaar END 9271c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9281c991144SBram Moolenaar source Ximport_lbr.vim 9291c991144SBram Moolenaar 9301c991144SBram Moolenaar assert_equal(9876, g:imported) 9311c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9321c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9331c991144SBram Moolenaar 9341c991144SBram Moolenaar # exported script not sourced again 9351c991144SBram Moolenaar assert_false(exists('g:result')) 9361c991144SBram Moolenaar unlet g:imported 9371c991144SBram Moolenaar unlet g:imported_added 9381c991144SBram Moolenaar unlet g:imported_func 9391c991144SBram Moolenaar delete('Ximport_lbr.vim') 9401c991144SBram Moolenaar 9411c991144SBram Moolenaar # import inside :def function 9425381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 9435381c7a1SBram Moolenaar vim9script 9445381c7a1SBram Moolenaar def ImportInDef() 9455381c7a1SBram Moolenaar import exported from './Xexport.vim' 9465381c7a1SBram Moolenaar g:imported = exported 9475381c7a1SBram Moolenaar exported += 7 9485381c7a1SBram Moolenaar g:imported_added = exported 9495381c7a1SBram Moolenaar enddef 9505381c7a1SBram Moolenaar ImportInDef() 9515381c7a1SBram Moolenaar END 9525381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9535381c7a1SBram Moolenaar source Ximport2.vim 954f5be8cdbSBram Moolenaar # TODO: this should be 9879 9555381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9565381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9575381c7a1SBram Moolenaar unlet g:imported 9585381c7a1SBram Moolenaar unlet g:imported_added 9595381c7a1SBram Moolenaar delete('Ximport2.vim') 9605381c7a1SBram Moolenaar 961f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 962f2d5c240SBram Moolenaar vim9script 963f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 964f2d5c240SBram Moolenaar def UseExport() 965f2d5c240SBram Moolenaar g:imported = Export.exported 966f2d5c240SBram Moolenaar enddef 967f2d5c240SBram Moolenaar UseExport() 968f2d5c240SBram Moolenaar END 969f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 970f2d5c240SBram Moolenaar source Ximport.vim 9715381c7a1SBram Moolenaar assert_equal(9883, g:imported) 972f2d5c240SBram Moolenaar 973599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 974599c89c8SBram Moolenaar vim9script 975599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 976599c89c8SBram Moolenaar def Func() 977599c89c8SBram Moolenaar let dummy = 1 978599c89c8SBram Moolenaar let imported = Export + dummy 979599c89c8SBram Moolenaar enddef 980822ba247SBram Moolenaar defcompile 981599c89c8SBram Moolenaar END 982599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 983599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 984599c89c8SBram Moolenaar 985599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 986599c89c8SBram Moolenaar vim9script 987599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 988599c89c8SBram Moolenaar def Func() 989599c89c8SBram Moolenaar let imported = Export . exported 990599c89c8SBram Moolenaar enddef 991822ba247SBram Moolenaar defcompile 992599c89c8SBram Moolenaar END 993599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 994599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 995599c89c8SBram Moolenaar 996599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 997599c89c8SBram Moolenaar vim9script 998599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 999599c89c8SBram Moolenaar def Func() 1000599c89c8SBram Moolenaar let imported = Export. 1001599c89c8SBram Moolenaar enddef 1002822ba247SBram Moolenaar defcompile 1003599c89c8SBram Moolenaar END 1004599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1005599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1006599c89c8SBram Moolenaar 10071c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 10081c991144SBram Moolenaar vim9script 10091c991144SBram Moolenaar import * 10101c991144SBram Moolenaar as Export 10111c991144SBram Moolenaar from 10121c991144SBram Moolenaar './Xexport.vim' 10131c991144SBram Moolenaar def UseExport() 10141c991144SBram Moolenaar g:imported = Export.exported 10151c991144SBram Moolenaar enddef 10161c991144SBram Moolenaar UseExport() 10171c991144SBram Moolenaar END 10181c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10191c991144SBram Moolenaar source Ximport.vim 10201c991144SBram Moolenaar assert_equal(9883, g:imported) 10211c991144SBram Moolenaar 1022f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1023f2d5c240SBram Moolenaar vim9script 1024f2d5c240SBram Moolenaar import * from './Xexport.vim' 1025f2d5c240SBram Moolenaar END 1026f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1027f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1028f2d5c240SBram Moolenaar 1029f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1030fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1031fa29c8abSBram Moolenaar vim9script 1032fa29c8abSBram Moolenaar import name from './Xexport.vim' 1033fa29c8abSBram Moolenaar END 1034fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1035fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1036fa29c8abSBram Moolenaar 1037f5be8cdbSBram Moolenaar # try to import something that is already defined 10385269bd2aSBram Moolenaar let import_already_defined =<< trim END 10395269bd2aSBram Moolenaar vim9script 10405269bd2aSBram Moolenaar let exported = 'something' 10415269bd2aSBram Moolenaar import exported from './Xexport.vim' 10425269bd2aSBram Moolenaar END 10435269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10445269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10455269bd2aSBram Moolenaar 1046f5be8cdbSBram Moolenaar # try to import something that is already defined 10475269bd2aSBram Moolenaar import_already_defined =<< trim END 10485269bd2aSBram Moolenaar vim9script 10495269bd2aSBram Moolenaar let exported = 'something' 10505269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10515269bd2aSBram Moolenaar END 10525269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10535269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10545269bd2aSBram Moolenaar 1055f5be8cdbSBram Moolenaar # try to import something that is already defined 10565269bd2aSBram Moolenaar import_already_defined =<< trim END 10575269bd2aSBram Moolenaar vim9script 10585269bd2aSBram Moolenaar let exported = 'something' 10595269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10605269bd2aSBram Moolenaar END 10615269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10625269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10635269bd2aSBram Moolenaar 1064f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1065fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1066fa29c8abSBram Moolenaar vim9script 1067fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1068fa29c8abSBram Moolenaar END 1069fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1070fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1071fa29c8abSBram Moolenaar 1072fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1073fa29c8abSBram Moolenaar vim9script 1074fa29c8abSBram Moolenaar import name './Xexport.vim' 1075fa29c8abSBram Moolenaar END 1076fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1077fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1078fa29c8abSBram Moolenaar 1079fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1080fa29c8abSBram Moolenaar vim9script 1081fa29c8abSBram Moolenaar import name from Xexport.vim 1082fa29c8abSBram Moolenaar END 1083fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1084fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1085fa29c8abSBram Moolenaar 1086fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1087fa29c8abSBram Moolenaar vim9script 1088fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1089fa29c8abSBram Moolenaar END 1090fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1091fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1092fa29c8abSBram Moolenaar 1093fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1094fa29c8abSBram Moolenaar vim9script 1095fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1096fa29c8abSBram Moolenaar END 10975269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 10985269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1099fa29c8abSBram Moolenaar 1100f2d5c240SBram Moolenaar delete('Ximport.vim') 11015269bd2aSBram Moolenaar delete('Ximport3.vim') 11028a7d6542SBram Moolenaar delete('Xexport.vim') 11038a7d6542SBram Moolenaar 1104f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1105750802b5SBram Moolenaar set cpo&vi 1106750802b5SBram Moolenaar let cpo_before = &cpo 1107750802b5SBram Moolenaar let lines =<< trim END 1108750802b5SBram Moolenaar vim9script 1109750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1110750802b5SBram Moolenaar END 1111750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1112750802b5SBram Moolenaar source Xvim9_script 1113750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1114750802b5SBram Moolenaar set cpo&vim 1115750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1116750802b5SBram Moolenaar delete('Xvim9_script') 1117750802b5SBram Moolenaarenddef 1118750802b5SBram Moolenaar 1119750802b5SBram Moolenaardef Test_vim9script_fails() 11208a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11218a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1122750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 11239721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 11249b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1125750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1126750802b5SBram Moolenaar 1127c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1128c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1129c785b9a7SBram Moolenaar 1130750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1131a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 11328a7d6542SBram Moolenaarenddef 11338a7d6542SBram Moolenaar 1134f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1135101f4810SBram Moolenaar CheckRunVimInTerminal 1136101f4810SBram Moolenaar 11379bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1138c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11399bb3eb3eSBram Moolenaarendfunc 11409bb3eb3eSBram Moolenaar 1141c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1142101f4810SBram Moolenaar let export =<< trim END 1143101f4810SBram Moolenaar vim9script 1144101f4810SBram Moolenaar export def Foo(): number 1145101f4810SBram Moolenaar return 0 1146101f4810SBram Moolenaar enddef 1147101f4810SBram Moolenaar END 11489bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1149101f4810SBram Moolenaar 11509bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 11519bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11529bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1153101f4810SBram Moolenaar 11549bb3eb3eSBram Moolenaar delete('Xexport.vim') 11559bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11569bb3eb3eSBram Moolenaarenddef 1157101f4810SBram Moolenaar 11584c17ad94SBram Moolenaardef Test_vim9script_reload_import() 11598a7d6542SBram Moolenaar let lines =<< trim END 11608a7d6542SBram Moolenaar vim9script 11618a7d6542SBram Moolenaar const var = '' 11628a7d6542SBram Moolenaar let valone = 1234 11638a7d6542SBram Moolenaar def MyFunc(arg: string) 11648a7d6542SBram Moolenaar valone = 5678 11658a7d6542SBram Moolenaar enddef 11668a7d6542SBram Moolenaar END 11678a7d6542SBram Moolenaar let morelines =<< trim END 11688a7d6542SBram Moolenaar let valtwo = 222 11698a7d6542SBram Moolenaar export def GetValtwo(): number 11708a7d6542SBram Moolenaar return valtwo 11718a7d6542SBram Moolenaar enddef 11728a7d6542SBram Moolenaar END 117303afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11748a7d6542SBram Moolenaar source Xreload.vim 11758a7d6542SBram Moolenaar source Xreload.vim 11768a7d6542SBram Moolenaar source Xreload.vim 11778a7d6542SBram Moolenaar 11788a7d6542SBram Moolenaar let testlines =<< trim END 11798a7d6542SBram Moolenaar vim9script 11808a7d6542SBram Moolenaar def TheFunc() 11818a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11828a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11838a7d6542SBram Moolenaar enddef 11848a7d6542SBram Moolenaar TheFunc() 11858a7d6542SBram Moolenaar END 11868a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11878a7d6542SBram Moolenaar source Ximport.vim 11888a7d6542SBram Moolenaar 1189f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1190f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11918a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11928a7d6542SBram Moolenaar source Ximport.vim 11938a7d6542SBram Moolenaar 1194f5be8cdbSBram Moolenaar # cannot declare a var twice 11958a7d6542SBram Moolenaar lines =<< trim END 11968a7d6542SBram Moolenaar vim9script 11978a7d6542SBram Moolenaar let valone = 1234 11988a7d6542SBram Moolenaar let valone = 5678 11998a7d6542SBram Moolenaar END 12008a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12018a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 12028a7d6542SBram Moolenaar 12038a7d6542SBram Moolenaar delete('Xreload.vim') 12048a7d6542SBram Moolenaar delete('Ximport.vim') 12058a7d6542SBram Moolenaarenddef 12068a7d6542SBram Moolenaar 1207fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1208fe465a01SBram Moolenaar" script-local name. 1209fe465a01SBram Moolenaardef Test_vim9script_funcref() 1210fe465a01SBram Moolenaar let sortlines =<< trim END 1211fe465a01SBram Moolenaar vim9script 1212fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1213bed36b93SBram Moolenaar return i2 - i1 1214fe465a01SBram Moolenaar enddef 1215fe465a01SBram Moolenaar 1216fe465a01SBram Moolenaar export def FastSort(): list<number> 1217fe465a01SBram Moolenaar return range(5)->sort(Compare) 1218fe465a01SBram Moolenaar enddef 1219fe465a01SBram Moolenaar END 1220fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1221fe465a01SBram Moolenaar 1222fe465a01SBram Moolenaar let lines =<< trim END 1223fe465a01SBram Moolenaar vim9script 1224fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1225fe465a01SBram Moolenaar def Test() 1226fe465a01SBram Moolenaar g:result = FastSort() 1227fe465a01SBram Moolenaar enddef 1228fe465a01SBram Moolenaar Test() 1229fe465a01SBram Moolenaar END 1230fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1231fe465a01SBram Moolenaar 1232fe465a01SBram Moolenaar source Xscript.vim 1233fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1234fe465a01SBram Moolenaar 1235fe465a01SBram Moolenaar unlet g:result 1236fe465a01SBram Moolenaar delete('Xsort.vim') 1237fe465a01SBram Moolenaar delete('Xscript.vim') 1238fe465a01SBram Moolenaarenddef 1239fe465a01SBram Moolenaar 1240c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1241c620c055SBram Moolenaar" script where FastFilter() is called from. 1242c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1243c620c055SBram Moolenaar let filterLines =<< trim END 1244c620c055SBram Moolenaar vim9script 1245c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1246c620c055SBram Moolenaar return idx % 2 == 1 1247c620c055SBram Moolenaar enddef 1248c620c055SBram Moolenaar export def FastFilter(): list<number> 1249c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1250c620c055SBram Moolenaar enddef 1251c620c055SBram Moolenaar END 1252c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1253c620c055SBram Moolenaar 1254c620c055SBram Moolenaar let lines =<< trim END 1255c620c055SBram Moolenaar vim9script 1256c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1257c620c055SBram Moolenaar def Test() 1258c620c055SBram Moolenaar let x: list<number> = FastFilter() 1259c620c055SBram Moolenaar enddef 1260c620c055SBram Moolenaar Test() 1261c620c055SBram Moolenaar END 1262c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1263c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1264c620c055SBram Moolenaar 1265c620c055SBram Moolenaar delete('Xfilter.vim') 1266c620c055SBram Moolenaar delete('Ximport.vim') 1267c620c055SBram Moolenaarenddef 1268c620c055SBram Moolenaar 12694c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 12704c17ad94SBram Moolenaar let first_lines =<< trim END 12714c17ad94SBram Moolenaar vim9script 12724c17ad94SBram Moolenaar def FuncYes(): string 12734c17ad94SBram Moolenaar return 'yes' 12744c17ad94SBram Moolenaar enddef 12754c17ad94SBram Moolenaar END 127603afdcf1SBram Moolenaar let withno_lines =<< trim END 12774c17ad94SBram Moolenaar def FuncNo(): string 12784c17ad94SBram Moolenaar return 'no' 12794c17ad94SBram Moolenaar enddef 12804c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12814c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12824c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 128303afdcf1SBram Moolenaar enddef 128403afdcf1SBram Moolenaar END 128503afdcf1SBram Moolenaar let nono_lines =<< trim END 128603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 128703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 12884c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 12894c17ad94SBram Moolenaar enddef 12904c17ad94SBram Moolenaar END 12914c17ad94SBram Moolenaar 12924c17ad94SBram Moolenaar # FuncNo() is defined 129303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12944c17ad94SBram Moolenaar source Xreloaded.vim 12954c17ad94SBram Moolenaar g:DoCheck(true) 12964c17ad94SBram Moolenaar 12974c17ad94SBram Moolenaar # FuncNo() is not redefined 129803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12994c17ad94SBram Moolenaar source Xreloaded.vim 130003afdcf1SBram Moolenaar g:DoCheck() 13014c17ad94SBram Moolenaar 13024c17ad94SBram Moolenaar # FuncNo() is back 130303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13044c17ad94SBram Moolenaar source Xreloaded.vim 130503afdcf1SBram Moolenaar g:DoCheck() 13064c17ad94SBram Moolenaar 13074c17ad94SBram Moolenaar delete('Xreloaded.vim') 13084c17ad94SBram Moolenaarenddef 13094c17ad94SBram Moolenaar 131089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 131189483d40SBram Moolenaar # write the script with a script-local variable 131289483d40SBram Moolenaar let lines =<< trim END 131389483d40SBram Moolenaar vim9script 131489483d40SBram Moolenaar let var = 'string' 131589483d40SBram Moolenaar END 131689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 131789483d40SBram Moolenaar source XreloadVar.vim 131889483d40SBram Moolenaar 131989483d40SBram Moolenaar # now write the script using the same variable locally - works 132089483d40SBram Moolenaar lines =<< trim END 132189483d40SBram Moolenaar vim9script 132289483d40SBram Moolenaar def Func() 132389483d40SBram Moolenaar let var = 'string' 132489483d40SBram Moolenaar enddef 132589483d40SBram Moolenaar END 132689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 132789483d40SBram Moolenaar source XreloadVar.vim 132889483d40SBram Moolenaar 132989483d40SBram Moolenaar delete('XreloadVar.vim') 133089483d40SBram Moolenaarenddef 133189483d40SBram Moolenaar 13328a7d6542SBram Moolenaardef Test_import_absolute() 13338a7d6542SBram Moolenaar let import_lines = [ 1334e6085c53SBram Moolenaar 'vim9script', 1335e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1336e6085c53SBram Moolenaar 'def UseExported()', 1337e6085c53SBram Moolenaar ' g:imported_abs = exported', 1338e6085c53SBram Moolenaar ' exported = 8888', 1339e6085c53SBram Moolenaar ' g:imported_after = exported', 1340e6085c53SBram Moolenaar 'enddef', 1341e6085c53SBram Moolenaar 'UseExported()', 1342e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1343e6085c53SBram Moolenaar ] 13448a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13458a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13468a7d6542SBram Moolenaar 13478a7d6542SBram Moolenaar source Ximport_abs.vim 13488a7d6542SBram Moolenaar 13498a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13504e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1351675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1352675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1353675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1354675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1355675f716eSBram Moolenaar 'exported = 8888.*' .. 1356675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1357675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1358675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1359675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1360e6085c53SBram Moolenaar g:import_disassembled) 13618a7d6542SBram Moolenaar unlet g:imported_abs 13624e12a5dfSBram Moolenaar unlet g:import_disassembled 13638a7d6542SBram Moolenaar 13648a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13658a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13668a7d6542SBram Moolenaarenddef 13678a7d6542SBram Moolenaar 13688a7d6542SBram Moolenaardef Test_import_rtp() 13698a7d6542SBram Moolenaar let import_lines = [ 1370e6085c53SBram Moolenaar 'vim9script', 1371e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1372e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1373e6085c53SBram Moolenaar ] 13748a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13758a7d6542SBram Moolenaar mkdir('import') 13768a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13778a7d6542SBram Moolenaar 13788a7d6542SBram Moolenaar let save_rtp = &rtp 13798a7d6542SBram Moolenaar &rtp = getcwd() 13808a7d6542SBram Moolenaar source Ximport_rtp.vim 13818a7d6542SBram Moolenaar &rtp = save_rtp 13828a7d6542SBram Moolenaar 13838a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13848a7d6542SBram Moolenaar unlet g:imported_rtp 13858a7d6542SBram Moolenaar 13868a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 138789483d40SBram Moolenaar delete('import', 'rf') 13888a7d6542SBram Moolenaarenddef 13898a7d6542SBram Moolenaar 139025e0f586SBram Moolenaardef Test_import_compile_error() 139125e0f586SBram Moolenaar let export_lines = [ 139225e0f586SBram Moolenaar 'vim9script', 139325e0f586SBram Moolenaar 'export def ExpFunc(): string', 139425e0f586SBram Moolenaar ' return notDefined', 139525e0f586SBram Moolenaar 'enddef', 139625e0f586SBram Moolenaar ] 139725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 139825e0f586SBram Moolenaar 139925e0f586SBram Moolenaar let import_lines = [ 140025e0f586SBram Moolenaar 'vim9script', 140125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 140225e0f586SBram Moolenaar 'def ImpFunc()', 140325e0f586SBram Moolenaar ' echo ExpFunc()', 140425e0f586SBram Moolenaar 'enddef', 140525e0f586SBram Moolenaar 'defcompile', 140625e0f586SBram Moolenaar ] 140725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 140825e0f586SBram Moolenaar 140925e0f586SBram Moolenaar try 141025e0f586SBram Moolenaar source Ximport.vim 141125e0f586SBram Moolenaar catch /E1001/ 1412f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 141325e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 141425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 141525e0f586SBram Moolenaar endtry 141625e0f586SBram Moolenaar 141725e0f586SBram Moolenaar delete('Xexported.vim') 141825e0f586SBram Moolenaar delete('Ximport.vim') 141925e0f586SBram Moolenaarenddef 142025e0f586SBram Moolenaar 14218a7d6542SBram Moolenaardef Test_fixed_size_list() 1422f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 14238a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 14248a7d6542SBram Moolenaar l->remove(0) 14258a7d6542SBram Moolenaar l->add(5) 14268a7d6542SBram Moolenaar l->insert(99, 1) 14270f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14288a7d6542SBram Moolenaarenddef 14298a7d6542SBram Moolenaar 1430158906cfSBram Moolenaardef IfElse(what: number): string 1431158906cfSBram Moolenaar let res = '' 1432158906cfSBram Moolenaar if what == 1 1433158906cfSBram Moolenaar res = "one" 1434158906cfSBram Moolenaar elseif what == 2 1435158906cfSBram Moolenaar res = "two" 1436a259d8d3SBram Moolenaar else 1437158906cfSBram Moolenaar res = "three" 1438a259d8d3SBram Moolenaar endif 1439158906cfSBram Moolenaar return res 1440a259d8d3SBram Moolenaarenddef 1441a259d8d3SBram Moolenaar 1442158906cfSBram Moolenaardef Test_if_elseif_else() 1443158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1444158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1445158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 14460f18b6d1SBram Moolenaarenddef 14470f18b6d1SBram Moolenaar 1448e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1449e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1450e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1451e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1452e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1453585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1454e8c4abbbSBram Moolenaarenddef 1455e8c4abbbSBram Moolenaar 14566d69bf60SBram Moolenaarlet g:bool_true = v:true 14576d69bf60SBram Moolenaarlet g:bool_false = v:false 14586d69bf60SBram Moolenaar 14596d69bf60SBram Moolenaardef Test_if_const_expr() 14606d69bf60SBram Moolenaar let res = false 14616d69bf60SBram Moolenaar if true ? true : false 14626d69bf60SBram Moolenaar res = true 14636d69bf60SBram Moolenaar endif 14646d69bf60SBram Moolenaar assert_equal(true, res) 14656d69bf60SBram Moolenaar 1466585fea7bSBram Moolenaar g:glob = 2 1467585fea7bSBram Moolenaar if false 14686797966dSBram Moolenaar execute('g:glob = 3') 1469585fea7bSBram Moolenaar endif 1470585fea7bSBram Moolenaar assert_equal(2, g:glob) 1471585fea7bSBram Moolenaar if true 14726797966dSBram Moolenaar execute('g:glob = 3') 1473585fea7bSBram Moolenaar endif 1474585fea7bSBram Moolenaar assert_equal(3, g:glob) 1475585fea7bSBram Moolenaar 14766d69bf60SBram Moolenaar res = false 14776d69bf60SBram Moolenaar if g:bool_true ? true : false 14786d69bf60SBram Moolenaar res = true 14796d69bf60SBram Moolenaar endif 14806d69bf60SBram Moolenaar assert_equal(true, res) 14816d69bf60SBram Moolenaar 14826d69bf60SBram Moolenaar res = false 14836d69bf60SBram Moolenaar if true ? g:bool_true : false 14846d69bf60SBram Moolenaar res = true 14856d69bf60SBram Moolenaar endif 14866d69bf60SBram Moolenaar assert_equal(true, res) 14876d69bf60SBram Moolenaar 14886d69bf60SBram Moolenaar res = false 14896d69bf60SBram Moolenaar if true ? true : g:bool_false 14906d69bf60SBram Moolenaar res = true 14916d69bf60SBram Moolenaar endif 14926d69bf60SBram Moolenaar assert_equal(true, res) 14936d69bf60SBram Moolenaar 14946d69bf60SBram Moolenaar res = false 14956d69bf60SBram Moolenaar if true ? false : true 14966d69bf60SBram Moolenaar res = true 14976d69bf60SBram Moolenaar endif 14986d69bf60SBram Moolenaar assert_equal(false, res) 14996d69bf60SBram Moolenaar 15006d69bf60SBram Moolenaar res = false 15016d69bf60SBram Moolenaar if false ? false : true 15026d69bf60SBram Moolenaar res = true 15036d69bf60SBram Moolenaar endif 15046d69bf60SBram Moolenaar assert_equal(true, res) 15056d69bf60SBram Moolenaar 15066d69bf60SBram Moolenaar res = false 15076d69bf60SBram Moolenaar if false ? true : false 15086d69bf60SBram Moolenaar res = true 15096d69bf60SBram Moolenaar endif 15106d69bf60SBram Moolenaar assert_equal(false, res) 15116d69bf60SBram Moolenaar 15126d69bf60SBram Moolenaar res = false 1513e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1514e8c4abbbSBram Moolenaar res = true 1515e8c4abbbSBram Moolenaar endif 1516e8c4abbbSBram Moolenaar assert_equal(false, res) 1517e8c4abbbSBram Moolenaar 1518e8c4abbbSBram Moolenaar res = false 15196d69bf60SBram Moolenaar if true && true 15206d69bf60SBram Moolenaar res = true 15216d69bf60SBram Moolenaar endif 15226d69bf60SBram Moolenaar assert_equal(true, res) 15236d69bf60SBram Moolenaar 15246d69bf60SBram Moolenaar res = false 15256d69bf60SBram Moolenaar if true && false 15266d69bf60SBram Moolenaar res = true 15276d69bf60SBram Moolenaar endif 15286d69bf60SBram Moolenaar assert_equal(false, res) 15296d69bf60SBram Moolenaar 15306d69bf60SBram Moolenaar res = false 15316d69bf60SBram Moolenaar if g:bool_true && false 15326d69bf60SBram Moolenaar res = true 15336d69bf60SBram Moolenaar endif 15346d69bf60SBram Moolenaar assert_equal(false, res) 15356d69bf60SBram Moolenaar 15366d69bf60SBram Moolenaar res = false 15376d69bf60SBram Moolenaar if true && g:bool_false 15386d69bf60SBram Moolenaar res = true 15396d69bf60SBram Moolenaar endif 15406d69bf60SBram Moolenaar assert_equal(false, res) 15416d69bf60SBram Moolenaar 15426d69bf60SBram Moolenaar res = false 15436d69bf60SBram Moolenaar if false && false 15446d69bf60SBram Moolenaar res = true 15456d69bf60SBram Moolenaar endif 15466d69bf60SBram Moolenaar assert_equal(false, res) 15476d69bf60SBram Moolenaar 15486d69bf60SBram Moolenaar res = false 15496d69bf60SBram Moolenaar if true || false 15506d69bf60SBram Moolenaar res = true 15516d69bf60SBram Moolenaar endif 15526d69bf60SBram Moolenaar assert_equal(true, res) 15536d69bf60SBram Moolenaar 15546d69bf60SBram Moolenaar res = false 15556d69bf60SBram Moolenaar if g:bool_true || false 15566d69bf60SBram Moolenaar res = true 15576d69bf60SBram Moolenaar endif 15586d69bf60SBram Moolenaar assert_equal(true, res) 15596d69bf60SBram Moolenaar 15606d69bf60SBram Moolenaar res = false 15616d69bf60SBram Moolenaar if true || g:bool_false 15626d69bf60SBram Moolenaar res = true 15636d69bf60SBram Moolenaar endif 15646d69bf60SBram Moolenaar assert_equal(true, res) 15656d69bf60SBram Moolenaar 15666d69bf60SBram Moolenaar res = false 15676d69bf60SBram Moolenaar if false || false 15686d69bf60SBram Moolenaar res = true 15696d69bf60SBram Moolenaar endif 15706d69bf60SBram Moolenaar assert_equal(false, res) 157180c34ca3SBram Moolenaarenddef 15726d69bf60SBram Moolenaar 157380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 157480c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 157580c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1576e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1577e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 15786d69bf60SBram Moolenaarenddef 15796d69bf60SBram Moolenaar 158072abcf42SBram Moolenaardef RunNested(i: number): number 158172abcf42SBram Moolenaar let x: number = 0 158272abcf42SBram Moolenaar if i % 2 158372abcf42SBram Moolenaar if 1 1584f5be8cdbSBram Moolenaar # comment 158572abcf42SBram Moolenaar else 1586f5be8cdbSBram Moolenaar # comment 158772abcf42SBram Moolenaar endif 158872abcf42SBram Moolenaar x += 1 158972abcf42SBram Moolenaar else 159072abcf42SBram Moolenaar x += 1000 159172abcf42SBram Moolenaar endif 159272abcf42SBram Moolenaar return x 159372abcf42SBram Moolenaarenddef 159472abcf42SBram Moolenaar 159572abcf42SBram Moolenaardef Test_nested_if() 159672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 159772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 159872abcf42SBram Moolenaarenddef 159972abcf42SBram Moolenaar 1600ad39c094SBram Moolenaardef Test_execute_cmd() 1601ad39c094SBram Moolenaar new 1602ad39c094SBram Moolenaar setline(1, 'default') 1603ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1604ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1605a72cfb80SBram Moolenaar 1606a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1607a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1608a72cfb80SBram Moolenaar 1609ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1610ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1611a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1612ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1613a72cfb80SBram Moolenaar 1614ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1615ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1616a72cfb80SBram Moolenaar 1617ad39c094SBram Moolenaar let cmd_first = 'call ' 1618ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1619ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1620ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1621ad39c094SBram Moolenaar bwipe! 1622585fea7bSBram Moolenaar 1623585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1624a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1625ad39c094SBram Moolenaarenddef 1626ad39c094SBram Moolenaar 162747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1628f5be8cdbSBram Moolenaar # only checks line continuation 162947e880d6SBram Moolenaar let lines =<< trim END 163047e880d6SBram Moolenaar vim9script 163147e880d6SBram Moolenaar execute 'g:someVar' 163247e880d6SBram Moolenaar .. ' = ' .. 163347e880d6SBram Moolenaar '28' 163447e880d6SBram Moolenaar assert_equal(28, g:someVar) 163547e880d6SBram Moolenaar unlet g:someVar 163647e880d6SBram Moolenaar END 163747e880d6SBram Moolenaar CheckScriptSuccess(lines) 163847e880d6SBram Moolenaarenddef 163947e880d6SBram Moolenaar 1640ad39c094SBram Moolenaardef Test_echo_cmd() 1641a72cfb80SBram Moolenaar echo 'some' # comment 1642585fea7bSBram Moolenaar echon 'thing' 1643ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1644ad39c094SBram Moolenaar 1645a72cfb80SBram Moolenaar echo "some" # comment 1646a72cfb80SBram Moolenaar echon "thing" 1647a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1648a72cfb80SBram Moolenaar 1649ad39c094SBram Moolenaar let str1 = 'some' 1650ad39c094SBram Moolenaar let str2 = 'more' 1651ad39c094SBram Moolenaar echo str1 str2 1652ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1653a72cfb80SBram Moolenaar 1654a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1655ad39c094SBram Moolenaarenddef 1656ad39c094SBram Moolenaar 1657f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1658f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1659f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1660f93c7feaSBram Moolenaar echo 'clear' 1661df069eecSBram Moolenaar :1messages 1662f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1663f93c7feaSBram Moolenaar 1664f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1665f93c7feaSBram Moolenaarenddef 1666f93c7feaSBram Moolenaar 166747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1668f5be8cdbSBram Moolenaar # only checks line continuation 166947e880d6SBram Moolenaar let lines =<< trim END 167047e880d6SBram Moolenaar vim9script 167147e880d6SBram Moolenaar echomsg 'here' 167247e880d6SBram Moolenaar .. ' is ' .. 167347e880d6SBram Moolenaar 'a message' 167447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 167547e880d6SBram Moolenaar END 167647e880d6SBram Moolenaar CheckScriptSuccess(lines) 167747e880d6SBram Moolenaarenddef 167847e880d6SBram Moolenaar 1679f93c7feaSBram Moolenaardef Test_echoerr_cmd() 168040ee466cSBram Moolenaar try 168140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 168240ee466cSBram Moolenaar catch 168340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 168440ee466cSBram Moolenaar endtry 1685f93c7feaSBram Moolenaarenddef 1686f93c7feaSBram Moolenaar 168747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1688f5be8cdbSBram Moolenaar # only checks line continuation 168947e880d6SBram Moolenaar let lines =<< trim END 169047e880d6SBram Moolenaar vim9script 169147e880d6SBram Moolenaar try 169247e880d6SBram Moolenaar echoerr 'this' 169347e880d6SBram Moolenaar .. ' is ' .. 169447e880d6SBram Moolenaar 'wrong' 169547e880d6SBram Moolenaar catch 169647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 169747e880d6SBram Moolenaar endtry 169847e880d6SBram Moolenaar END 169947e880d6SBram Moolenaar CheckScriptSuccess(lines) 170047e880d6SBram Moolenaarenddef 170147e880d6SBram Moolenaar 170241fe0617SBram Moolenaardef Test_for_outside_of_function() 170341fe0617SBram Moolenaar let lines =<< trim END 170441fe0617SBram Moolenaar vim9script 170541fe0617SBram Moolenaar new 170641fe0617SBram Moolenaar for var in range(0, 3) 170741fe0617SBram Moolenaar append(line('$'), var) 170841fe0617SBram Moolenaar endfor 170941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 171041fe0617SBram Moolenaar bwipe! 171141fe0617SBram Moolenaar END 171241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 171341fe0617SBram Moolenaar source Xvim9for.vim 171441fe0617SBram Moolenaar delete('Xvim9for.vim') 171541fe0617SBram Moolenaarenddef 17168a7d6542SBram Moolenaar 1717e8c4abbbSBram Moolenaardef Test_for_loop() 1718e8c4abbbSBram Moolenaar let result = '' 1719e8c4abbbSBram Moolenaar for cnt in range(7) 1720e8c4abbbSBram Moolenaar if cnt == 4 1721e8c4abbbSBram Moolenaar break 1722e8c4abbbSBram Moolenaar endif 1723e8c4abbbSBram Moolenaar if cnt == 2 1724e8c4abbbSBram Moolenaar continue 1725e8c4abbbSBram Moolenaar endif 1726e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1727e8c4abbbSBram Moolenaar endfor 1728e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 17290ad3e894SBram Moolenaar 17300ad3e894SBram Moolenaar let concat = '' 17310ad3e894SBram Moolenaar for str in eval('["one", "two"]') 17320ad3e894SBram Moolenaar concat ..= str 17330ad3e894SBram Moolenaar endfor 17340ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1735e8c4abbbSBram Moolenaarenddef 1736e8c4abbbSBram Moolenaar 1737e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1738675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1739675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1740675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1741822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 17420ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1743675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1744675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1745675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1746e8c4abbbSBram Moolenaarenddef 1747e8c4abbbSBram Moolenaar 1748d0df1aacSBram Moolenaardef Test_while_loop() 1749d0df1aacSBram Moolenaar let result = '' 1750d0df1aacSBram Moolenaar let cnt = 0 1751d0df1aacSBram Moolenaar while cnt < 555 1752d0df1aacSBram Moolenaar if cnt == 3 1753d0df1aacSBram Moolenaar break 1754d0df1aacSBram Moolenaar endif 1755d0df1aacSBram Moolenaar cnt += 1 1756d0df1aacSBram Moolenaar if cnt == 2 1757d0df1aacSBram Moolenaar continue 1758d0df1aacSBram Moolenaar endif 1759d0df1aacSBram Moolenaar result ..= cnt .. '_' 1760d0df1aacSBram Moolenaar endwhile 1761d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1762d0df1aacSBram Moolenaarenddef 1763d0df1aacSBram Moolenaar 1764e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1765675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1766675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1767675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1768675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1769675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1770675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1771675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1772bd5da371SBram Moolenaarenddef 1773bd5da371SBram Moolenaar 17749645e2d9SBram Moolenaardef Test_interrupt_loop() 177597acfc78SBram Moolenaar let caught = false 17769645e2d9SBram Moolenaar let x = 0 177797acfc78SBram Moolenaar try 17789645e2d9SBram Moolenaar while 1 17799645e2d9SBram Moolenaar x += 1 17809645e2d9SBram Moolenaar if x == 100 17819645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 17829645e2d9SBram Moolenaar endif 17839645e2d9SBram Moolenaar endwhile 178497acfc78SBram Moolenaar catch 178597acfc78SBram Moolenaar caught = true 178697acfc78SBram Moolenaar assert_equal(100, x) 178797acfc78SBram Moolenaar endtry 178897acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 17899645e2d9SBram Moolenaarenddef 179020431c9dSBram Moolenaar 17914fdae999SBram Moolenaardef Test_automatic_line_continuation() 17924fdae999SBram Moolenaar let mylist = [ 17934fdae999SBram Moolenaar 'one', 17944fdae999SBram Moolenaar 'two', 17954fdae999SBram Moolenaar 'three', 1796f5be8cdbSBram Moolenaar ] # comment 17974fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 17984fdae999SBram Moolenaar 17994fdae999SBram Moolenaar let mydict = { 18004fdae999SBram Moolenaar 'one': 1, 18014fdae999SBram Moolenaar 'two': 2, 18024fdae999SBram Moolenaar 'three': 18034fdae999SBram Moolenaar 3, 1804f5be8cdbSBram Moolenaar } # comment 18054fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 18064fdae999SBram Moolenaar mydict = #{ 18072c330432SBram Moolenaar one: 1, # comment 18082c330432SBram Moolenaar two: # comment 18092c330432SBram Moolenaar 2, # comment 18102c330432SBram Moolenaar three: 3 # comment 18112c330432SBram Moolenaar } 18122c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 18132c330432SBram Moolenaar mydict = #{ 18142c330432SBram Moolenaar one: 1, 18154fdae999SBram Moolenaar two: 18164fdae999SBram Moolenaar 2, 18172c330432SBram Moolenaar three: 3 18184fdae999SBram Moolenaar } 18194fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1820e6085c53SBram Moolenaar 1821e6085c53SBram Moolenaar assert_equal( 1822e6085c53SBram Moolenaar ['one', 'two', 'three'], 1823e6085c53SBram Moolenaar split('one two three') 1824e6085c53SBram Moolenaar ) 18254fdae999SBram Moolenaarenddef 18264fdae999SBram Moolenaar 18277a092245SBram Moolenaardef Test_vim9_comment() 18287a092245SBram Moolenaar CheckScriptSuccess([ 18297a092245SBram Moolenaar 'vim9script', 18307a092245SBram Moolenaar '# something', 18317a092245SBram Moolenaar ]) 18327a092245SBram Moolenaar CheckScriptFailure([ 18337a092245SBram Moolenaar 'vim9script', 18347a092245SBram Moolenaar ':# something', 18357a092245SBram Moolenaar ], 'E488:') 18367a092245SBram Moolenaar CheckScriptFailure([ 18377a092245SBram Moolenaar '# something', 18387a092245SBram Moolenaar ], 'E488:') 18397a092245SBram Moolenaar CheckScriptFailure([ 18407a092245SBram Moolenaar ':# something', 18417a092245SBram Moolenaar ], 'E488:') 18427a092245SBram Moolenaar 18434a8d9f2eSBram Moolenaar { # block start 18444a8d9f2eSBram Moolenaar } # block end 18454a8d9f2eSBram Moolenaar CheckDefFailure([ 18464a8d9f2eSBram Moolenaar '{# comment', 18474a8d9f2eSBram Moolenaar ], 'E488:') 18484a8d9f2eSBram Moolenaar CheckDefFailure([ 18494a8d9f2eSBram Moolenaar '{', 18504a8d9f2eSBram Moolenaar '}# comment', 18514a8d9f2eSBram Moolenaar ], 'E488:') 18524a8d9f2eSBram Moolenaar 18534a8d9f2eSBram Moolenaar echo "yes" # comment 18544a8d9f2eSBram Moolenaar CheckDefFailure([ 18554a8d9f2eSBram Moolenaar 'echo "yes"# comment', 18564a8d9f2eSBram Moolenaar ], 'E488:') 18577a092245SBram Moolenaar CheckScriptSuccess([ 18587a092245SBram Moolenaar 'vim9script', 18597a092245SBram Moolenaar 'echo "yes" # something', 18607a092245SBram Moolenaar ]) 18617a092245SBram Moolenaar CheckScriptFailure([ 18627a092245SBram Moolenaar 'vim9script', 18637a092245SBram Moolenaar 'echo "yes"# something', 18647a092245SBram Moolenaar ], 'E121:') 18657a092245SBram Moolenaar CheckScriptFailure([ 18667a092245SBram Moolenaar 'vim9script', 18677a092245SBram Moolenaar 'echo# something', 18687a092245SBram Moolenaar ], 'E121:') 18697a092245SBram Moolenaar CheckScriptFailure([ 18707a092245SBram Moolenaar 'echo "yes" # something', 18717a092245SBram Moolenaar ], 'E121:') 18727a092245SBram Moolenaar 18734a8d9f2eSBram Moolenaar exe "echo" # comment 18744a8d9f2eSBram Moolenaar CheckDefFailure([ 18754a8d9f2eSBram Moolenaar 'exe "echo"# comment', 18764a8d9f2eSBram Moolenaar ], 'E488:') 18774a8d9f2eSBram Moolenaar CheckScriptSuccess([ 18784a8d9f2eSBram Moolenaar 'vim9script', 18794a8d9f2eSBram Moolenaar 'exe "echo" # something', 18804a8d9f2eSBram Moolenaar ]) 18814a8d9f2eSBram Moolenaar CheckScriptFailure([ 18824a8d9f2eSBram Moolenaar 'vim9script', 18834a8d9f2eSBram Moolenaar 'exe "echo"# something', 18844a8d9f2eSBram Moolenaar ], 'E121:') 18854a8d9f2eSBram Moolenaar CheckDefFailure([ 18864a8d9f2eSBram Moolenaar 'exe # comment', 18874a8d9f2eSBram Moolenaar ], 'E1015:') 18884a8d9f2eSBram Moolenaar CheckScriptFailure([ 18894a8d9f2eSBram Moolenaar 'vim9script', 18904a8d9f2eSBram Moolenaar 'exe# something', 18914a8d9f2eSBram Moolenaar ], 'E121:') 18924a8d9f2eSBram Moolenaar CheckScriptFailure([ 18934a8d9f2eSBram Moolenaar 'exe "echo" # something', 18944a8d9f2eSBram Moolenaar ], 'E121:') 18954a8d9f2eSBram Moolenaar 18967a092245SBram Moolenaar CheckDefFailure([ 18977a092245SBram Moolenaar 'try# comment', 18987a092245SBram Moolenaar ' echo "yes"', 18997a092245SBram Moolenaar 'catch', 19007a092245SBram Moolenaar 'endtry', 19017a092245SBram Moolenaar ], 'E488:') 19022c5ed4e3SBram Moolenaar CheckScriptFailure([ 19032c5ed4e3SBram Moolenaar 'vim9script', 19042c5ed4e3SBram Moolenaar 'try# comment', 19052c5ed4e3SBram Moolenaar 'echo "yes"', 19062c5ed4e3SBram Moolenaar ], 'E488:') 19077a092245SBram Moolenaar CheckDefFailure([ 19087a092245SBram Moolenaar 'try', 1909a72cfb80SBram Moolenaar ' throw#comment', 1910a72cfb80SBram Moolenaar 'catch', 1911a72cfb80SBram Moolenaar 'endtry', 1912a72cfb80SBram Moolenaar ], 'E1015:') 1913a72cfb80SBram Moolenaar CheckDefFailure([ 1914a72cfb80SBram Moolenaar 'try', 1915a72cfb80SBram Moolenaar ' throw "yes"#comment', 1916a72cfb80SBram Moolenaar 'catch', 1917a72cfb80SBram Moolenaar 'endtry', 1918a72cfb80SBram Moolenaar ], 'E488:') 1919a72cfb80SBram Moolenaar CheckDefFailure([ 1920a72cfb80SBram Moolenaar 'try', 19217a092245SBram Moolenaar ' echo "yes"', 19227a092245SBram Moolenaar 'catch# comment', 19237a092245SBram Moolenaar 'endtry', 19247a092245SBram Moolenaar ], 'E488:') 19252c5ed4e3SBram Moolenaar CheckScriptFailure([ 19262c5ed4e3SBram Moolenaar 'vim9script', 19272c5ed4e3SBram Moolenaar 'try', 19282c5ed4e3SBram Moolenaar ' echo "yes"', 19292c5ed4e3SBram Moolenaar 'catch# comment', 19302c5ed4e3SBram Moolenaar 'endtry', 19312c5ed4e3SBram Moolenaar ], 'E654:') 19322c5ed4e3SBram Moolenaar CheckDefFailure([ 19332c5ed4e3SBram Moolenaar 'try', 19342c5ed4e3SBram Moolenaar ' echo "yes"', 19352c5ed4e3SBram Moolenaar 'catch /pat/# comment', 19362c5ed4e3SBram Moolenaar 'endtry', 19372c5ed4e3SBram Moolenaar ], 'E488:') 19387a092245SBram Moolenaar CheckDefFailure([ 19397a092245SBram Moolenaar 'try', 19407a092245SBram Moolenaar 'echo "yes"', 19417a092245SBram Moolenaar 'catch', 19427a092245SBram Moolenaar 'endtry# comment', 19437a092245SBram Moolenaar ], 'E488:') 19442c5ed4e3SBram Moolenaar CheckScriptFailure([ 19452c5ed4e3SBram Moolenaar 'vim9script', 19462c5ed4e3SBram Moolenaar 'try', 19472c5ed4e3SBram Moolenaar ' echo "yes"', 19482c5ed4e3SBram Moolenaar 'catch', 19492c5ed4e3SBram Moolenaar 'endtry# comment', 19509b7bf9e9SBram Moolenaar ], 'E488:') 19512c5ed4e3SBram Moolenaar 19522c5ed4e3SBram Moolenaar CheckScriptSuccess([ 19532c5ed4e3SBram Moolenaar 'vim9script', 19542c5ed4e3SBram Moolenaar 'hi # comment', 19552c5ed4e3SBram Moolenaar ]) 19562c5ed4e3SBram Moolenaar CheckScriptFailure([ 19572c5ed4e3SBram Moolenaar 'vim9script', 19582c5ed4e3SBram Moolenaar 'hi# comment', 19592c5ed4e3SBram Moolenaar ], 'E416:') 19601966c248SBram Moolenaar CheckScriptSuccess([ 19611966c248SBram Moolenaar 'vim9script', 19621966c248SBram Moolenaar 'hi Search # comment', 19631966c248SBram Moolenaar ]) 19641966c248SBram Moolenaar CheckScriptFailure([ 19651966c248SBram Moolenaar 'vim9script', 19661966c248SBram Moolenaar 'hi Search# comment', 19671966c248SBram Moolenaar ], 'E416:') 19681966c248SBram Moolenaar CheckScriptSuccess([ 19691966c248SBram Moolenaar 'vim9script', 19701966c248SBram Moolenaar 'hi link This Search # comment', 19711966c248SBram Moolenaar ]) 19721966c248SBram Moolenaar CheckScriptFailure([ 19731966c248SBram Moolenaar 'vim9script', 19741966c248SBram Moolenaar 'hi link This That# comment', 19751966c248SBram Moolenaar ], 'E413:') 19761966c248SBram Moolenaar CheckScriptSuccess([ 19771966c248SBram Moolenaar 'vim9script', 19781966c248SBram Moolenaar 'hi clear This # comment', 19791966c248SBram Moolenaar 'hi clear # comment', 19801966c248SBram Moolenaar ]) 1981f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 1982f5be8cdbSBram Moolenaar # hi clear This# comment', 19831966c248SBram Moolenaar CheckScriptFailure([ 19841966c248SBram Moolenaar 'vim9script', 19851966c248SBram Moolenaar 'hi clear# comment', 19861966c248SBram Moolenaar ], 'E416:') 19871966c248SBram Moolenaar 19881966c248SBram Moolenaar CheckScriptSuccess([ 19891966c248SBram Moolenaar 'vim9script', 19901966c248SBram Moolenaar 'hi Group term=bold', 19911966c248SBram Moolenaar 'match Group /todo/ # comment', 19921966c248SBram Moolenaar ]) 19931966c248SBram Moolenaar CheckScriptFailure([ 19941966c248SBram Moolenaar 'vim9script', 19951966c248SBram Moolenaar 'hi Group term=bold', 19961966c248SBram Moolenaar 'match Group /todo/# comment', 19971966c248SBram Moolenaar ], 'E488:') 19981966c248SBram Moolenaar CheckScriptSuccess([ 19991966c248SBram Moolenaar 'vim9script', 20001966c248SBram Moolenaar 'match # comment', 20011966c248SBram Moolenaar ]) 20021966c248SBram Moolenaar CheckScriptFailure([ 20031966c248SBram Moolenaar 'vim9script', 20041966c248SBram Moolenaar 'match# comment', 20051966c248SBram Moolenaar ], 'E475:') 20061966c248SBram Moolenaar CheckScriptSuccess([ 20071966c248SBram Moolenaar 'vim9script', 20081966c248SBram Moolenaar 'match none # comment', 20091966c248SBram Moolenaar ]) 20101966c248SBram Moolenaar CheckScriptFailure([ 20111966c248SBram Moolenaar 'vim9script', 20121966c248SBram Moolenaar 'match none# comment', 20131966c248SBram Moolenaar ], 'E475:') 20141966c248SBram Moolenaar 20151966c248SBram Moolenaar CheckScriptSuccess([ 20161966c248SBram Moolenaar 'vim9script', 20171966c248SBram Moolenaar 'menutrans clear # comment', 20181966c248SBram Moolenaar ]) 20191966c248SBram Moolenaar CheckScriptFailure([ 20201966c248SBram Moolenaar 'vim9script', 20211966c248SBram Moolenaar 'menutrans clear# comment text', 20221966c248SBram Moolenaar ], 'E474:') 20231966c248SBram Moolenaar 20241966c248SBram Moolenaar CheckScriptSuccess([ 20251966c248SBram Moolenaar 'vim9script', 20261966c248SBram Moolenaar 'syntax clear # comment', 20271966c248SBram Moolenaar ]) 20281966c248SBram Moolenaar CheckScriptFailure([ 20291966c248SBram Moolenaar 'vim9script', 20301966c248SBram Moolenaar 'syntax clear# comment text', 20311966c248SBram Moolenaar ], 'E28:') 20321966c248SBram Moolenaar CheckScriptSuccess([ 20331966c248SBram Moolenaar 'vim9script', 20341966c248SBram Moolenaar 'syntax keyword Word some', 20351966c248SBram Moolenaar 'syntax clear Word # comment', 20361966c248SBram Moolenaar ]) 20371966c248SBram Moolenaar CheckScriptFailure([ 20381966c248SBram Moolenaar 'vim9script', 20391966c248SBram Moolenaar 'syntax keyword Word some', 20401966c248SBram Moolenaar 'syntax clear Word# comment text', 20411966c248SBram Moolenaar ], 'E28:') 20421966c248SBram Moolenaar 20431966c248SBram Moolenaar CheckScriptSuccess([ 20441966c248SBram Moolenaar 'vim9script', 20451966c248SBram Moolenaar 'syntax list # comment', 20461966c248SBram Moolenaar ]) 20471966c248SBram Moolenaar CheckScriptFailure([ 20481966c248SBram Moolenaar 'vim9script', 20491966c248SBram Moolenaar 'syntax list# comment text', 20501966c248SBram Moolenaar ], 'E28:') 20511966c248SBram Moolenaar 20521966c248SBram Moolenaar CheckScriptSuccess([ 20531966c248SBram Moolenaar 'vim9script', 20541966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 20551966c248SBram Moolenaar ]) 20561966c248SBram Moolenaar CheckScriptFailure([ 20571966c248SBram Moolenaar 'vim9script', 20581966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 20591966c248SBram Moolenaar ], 'E475:') 20601966c248SBram Moolenaar 20611966c248SBram Moolenaar CheckScriptSuccess([ 20621966c248SBram Moolenaar 'vim9script', 20631966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 20641966c248SBram Moolenaar ]) 20651966c248SBram Moolenaar CheckScriptFailure([ 20661966c248SBram Moolenaar 'vim9script', 20671966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 20681966c248SBram Moolenaar ], 'E789:') 20691966c248SBram Moolenaar 20701966c248SBram Moolenaar CheckScriptSuccess([ 20711966c248SBram Moolenaar 'vim9script', 20721966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 20731966c248SBram Moolenaar ]) 20741966c248SBram Moolenaar CheckScriptFailure([ 20751966c248SBram Moolenaar 'vim9script', 20761966c248SBram Moolenaar 'syntax match Word /pat/# comment', 20771966c248SBram Moolenaar ], 'E402:') 20781966c248SBram Moolenaar 20791966c248SBram Moolenaar CheckScriptSuccess([ 20801966c248SBram Moolenaar 'vim9script', 20811966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 20821966c248SBram Moolenaar ]) 20831966c248SBram Moolenaar CheckScriptFailure([ 20841966c248SBram Moolenaar 'vim9script', 20851966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 20861966c248SBram Moolenaar ], 'E475:') 20871966c248SBram Moolenaar CheckScriptFailure([ 20881966c248SBram Moolenaar 'vim9script', 20891966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 20901966c248SBram Moolenaar ], 'E406:') 20911966c248SBram Moolenaar CheckScriptFailure([ 20921966c248SBram Moolenaar 'vim9script', 20931966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 20941966c248SBram Moolenaar ], 'E475:') 20951966c248SBram Moolenaar 20961966c248SBram Moolenaar CheckScriptSuccess([ 20971966c248SBram Moolenaar 'vim9script', 20981966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 20991966c248SBram Moolenaar ]) 21001966c248SBram Moolenaar CheckScriptFailure([ 21011966c248SBram Moolenaar 'vim9script', 21021966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2103d032f34aSBram Moolenaar ], 'E402:') 21041966c248SBram Moolenaar 21051966c248SBram Moolenaar CheckScriptSuccess([ 21061966c248SBram Moolenaar 'vim9script', 21071966c248SBram Moolenaar 'syntax sync # comment', 21081966c248SBram Moolenaar ]) 21091966c248SBram Moolenaar CheckScriptFailure([ 21101966c248SBram Moolenaar 'vim9script', 21111966c248SBram Moolenaar 'syntax sync# comment', 21121966c248SBram Moolenaar ], 'E404:') 21131966c248SBram Moolenaar CheckScriptSuccess([ 21141966c248SBram Moolenaar 'vim9script', 21151966c248SBram Moolenaar 'syntax sync ccomment # comment', 21161966c248SBram Moolenaar ]) 21171966c248SBram Moolenaar CheckScriptFailure([ 21181966c248SBram Moolenaar 'vim9script', 21191966c248SBram Moolenaar 'syntax sync ccomment# comment', 21201966c248SBram Moolenaar ], 'E404:') 21211966c248SBram Moolenaar 21221966c248SBram Moolenaar CheckScriptSuccess([ 21231966c248SBram Moolenaar 'vim9script', 21241966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 21251966c248SBram Moolenaar ]) 21261966c248SBram Moolenaar CheckScriptFailure([ 21271966c248SBram Moolenaar 'vim9script', 21281966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 21291966c248SBram Moolenaar ], 'E475:') 2130a72cfb80SBram Moolenaar 2131a72cfb80SBram Moolenaar CheckScriptSuccess([ 2132a72cfb80SBram Moolenaar 'vim9script', 2133a72cfb80SBram Moolenaar 'command Echo echo # comment', 2134a72cfb80SBram Moolenaar 'command Echo # comment', 2135a72cfb80SBram Moolenaar ]) 2136a72cfb80SBram Moolenaar CheckScriptFailure([ 2137a72cfb80SBram Moolenaar 'vim9script', 2138a72cfb80SBram Moolenaar 'command Echo echo# comment', 2139a72cfb80SBram Moolenaar 'Echo', 2140a72cfb80SBram Moolenaar ], 'E121:') 2141a72cfb80SBram Moolenaar CheckScriptFailure([ 2142a72cfb80SBram Moolenaar 'vim9script', 2143a72cfb80SBram Moolenaar 'command Echo# comment', 2144a72cfb80SBram Moolenaar ], 'E182:') 2145a72cfb80SBram Moolenaar CheckScriptFailure([ 2146a72cfb80SBram Moolenaar 'vim9script', 2147a72cfb80SBram Moolenaar 'command Echo echo', 2148a72cfb80SBram Moolenaar 'command Echo# comment', 2149a72cfb80SBram Moolenaar ], 'E182:') 2150a72cfb80SBram Moolenaar 2151a72cfb80SBram Moolenaar CheckScriptSuccess([ 2152a72cfb80SBram Moolenaar 'vim9script', 2153a72cfb80SBram Moolenaar 'function # comment', 2154a72cfb80SBram Moolenaar ]) 2155a72cfb80SBram Moolenaar CheckScriptFailure([ 2156a72cfb80SBram Moolenaar 'vim9script', 2157a72cfb80SBram Moolenaar 'function# comment', 2158a72cfb80SBram Moolenaar ], 'E129:') 2159a72cfb80SBram Moolenaar CheckScriptSuccess([ 2160a72cfb80SBram Moolenaar 'vim9script', 2161a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2162a72cfb80SBram Moolenaar ]) 2163a72cfb80SBram Moolenaar CheckScriptFailure([ 2164a72cfb80SBram Moolenaar 'vim9script', 2165a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2166a72cfb80SBram Moolenaar ], 'E488:') 2167a72cfb80SBram Moolenaar 2168a72cfb80SBram Moolenaar CheckScriptSuccess([ 2169a72cfb80SBram Moolenaar 'vim9script', 21704c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2171a72cfb80SBram Moolenaar 'endfunc', 21724c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2173a72cfb80SBram Moolenaar ]) 2174a72cfb80SBram Moolenaar CheckScriptFailure([ 2175a72cfb80SBram Moolenaar 'vim9script', 21764c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2177a72cfb80SBram Moolenaar 'endfunc', 21784c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2179a72cfb80SBram Moolenaar ], 'E488:') 2180a72cfb80SBram Moolenaar 2181a72cfb80SBram Moolenaar CheckScriptSuccess([ 2182a72cfb80SBram Moolenaar 'vim9script', 2183a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2184a72cfb80SBram Moolenaar ]) 2185a72cfb80SBram Moolenaar CheckScriptFailure([ 2186a72cfb80SBram Moolenaar 'vim9script', 2187a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2188a72cfb80SBram Moolenaar ], 'E488:') 21892c5ed4e3SBram Moolenaarenddef 21902c5ed4e3SBram Moolenaar 21912c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 21922c5ed4e3SBram Moolenaar CheckCanRunGui 21932c5ed4e3SBram Moolenaar 21942c5ed4e3SBram Moolenaar CheckScriptFailure([ 21952c5ed4e3SBram Moolenaar 'vim9script', 21962c5ed4e3SBram Moolenaar 'gui#comment' 21972c5ed4e3SBram Moolenaar ], 'E499:') 21982c5ed4e3SBram Moolenaar CheckScriptFailure([ 21992c5ed4e3SBram Moolenaar 'vim9script', 22002c5ed4e3SBram Moolenaar 'gui -f#comment' 22012c5ed4e3SBram Moolenaar ], 'E499:') 22027a092245SBram Moolenaarenddef 22037a092245SBram Moolenaar 2204a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 22056797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 22066797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2207a26b9700SBram Moolenaar 2208a26b9700SBram Moolenaar edit test.vim 2209a26b9700SBram Moolenaar doautocmd TabEnter #comment 2210a26b9700SBram Moolenaar assert_equal(1, g:entered) 2211a26b9700SBram Moolenaar 2212a26b9700SBram Moolenaar doautocmd TabEnter f.x 2213a26b9700SBram Moolenaar assert_equal(2, g:entered) 2214a26b9700SBram Moolenaar 2215a26b9700SBram Moolenaar g:entered = 0 2216a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2217a26b9700SBram Moolenaar assert_equal(2, g:entered) 2218a26b9700SBram Moolenaar 2219a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2220a26b9700SBram Moolenaar 2221a26b9700SBram Moolenaar au! TabEnter 2222a26b9700SBram Moolenaar unlet g:entered 2223d72c1bf0SBram Moolenaar 2224d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2225d72c1bf0SBram Moolenaar 'vim9script', 22266797966dSBram Moolenaar 'g:var = 123', 2227e55b1c09SBram Moolenaar 'b:var = 456', 2228e55b1c09SBram Moolenaar 'w:var = 777', 2229e55b1c09SBram Moolenaar 't:var = 888', 2230d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2231d72c1bf0SBram Moolenaar ]) 2232d72c1bf0SBram Moolenaar 2233d72c1bf0SBram Moolenaar CheckScriptFailure([ 2234d72c1bf0SBram Moolenaar 'vim9script', 2235d72c1bf0SBram Moolenaar 'let g:var = 123', 2236e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2237e55b1c09SBram Moolenaar 2238e55b1c09SBram Moolenaar CheckScriptFailure([ 2239e55b1c09SBram Moolenaar 'vim9script', 2240e55b1c09SBram Moolenaar 'let b:var = 123', 2241e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2242e55b1c09SBram Moolenaar 2243e55b1c09SBram Moolenaar CheckScriptFailure([ 2244e55b1c09SBram Moolenaar 'vim9script', 2245e55b1c09SBram Moolenaar 'let w:var = 123', 2246e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2247e55b1c09SBram Moolenaar 2248e55b1c09SBram Moolenaar CheckScriptFailure([ 2249e55b1c09SBram Moolenaar 'vim9script', 2250e55b1c09SBram Moolenaar 'let t:var = 123', 2251e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2252e55b1c09SBram Moolenaar 2253e55b1c09SBram Moolenaar CheckScriptFailure([ 2254e55b1c09SBram Moolenaar 'vim9script', 2255e55b1c09SBram Moolenaar 'let v:version = 123', 2256e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2257e55b1c09SBram Moolenaar 2258e55b1c09SBram Moolenaar CheckScriptFailure([ 2259e55b1c09SBram Moolenaar 'vim9script', 2260e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2261e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 22626797966dSBram Moolenaar 22636797966dSBram Moolenaar CheckScriptFailure([ 22646797966dSBram Moolenaar 'vim9script', 22656797966dSBram Moolenaar 'g:var = 123', 226632e35117SBram Moolenaar 'unlet g:var# comment1', 2267d72c1bf0SBram Moolenaar ], 'E108:') 2268d72c1bf0SBram Moolenaar 2269d72c1bf0SBram Moolenaar CheckScriptFailure([ 2270d72c1bf0SBram Moolenaar 'let g:var = 123', 2271d72c1bf0SBram Moolenaar 'unlet g:var # something', 2272d72c1bf0SBram Moolenaar ], 'E488:') 2273faac4104SBram Moolenaar 2274faac4104SBram Moolenaar CheckScriptSuccess([ 2275faac4104SBram Moolenaar 'vim9script', 227632e35117SBram Moolenaar 'if 1 # comment2', 2277faac4104SBram Moolenaar ' echo "yes"', 2278faac4104SBram Moolenaar 'elseif 2 #comment', 2279faac4104SBram Moolenaar ' echo "no"', 2280faac4104SBram Moolenaar 'endif', 2281faac4104SBram Moolenaar ]) 2282faac4104SBram Moolenaar 2283faac4104SBram Moolenaar CheckScriptFailure([ 2284faac4104SBram Moolenaar 'vim9script', 228532e35117SBram Moolenaar 'if 1# comment3', 2286faac4104SBram Moolenaar ' echo "yes"', 2287faac4104SBram Moolenaar 'endif', 2288faac4104SBram Moolenaar ], 'E15:') 2289faac4104SBram Moolenaar 2290faac4104SBram Moolenaar CheckScriptFailure([ 2291faac4104SBram Moolenaar 'vim9script', 229232e35117SBram Moolenaar 'if 0 # comment4', 2293faac4104SBram Moolenaar ' echo "yes"', 2294faac4104SBram Moolenaar 'elseif 2#comment', 2295faac4104SBram Moolenaar ' echo "no"', 2296faac4104SBram Moolenaar 'endif', 2297faac4104SBram Moolenaar ], 'E15:') 2298faac4104SBram Moolenaar 2299faac4104SBram Moolenaar CheckScriptSuccess([ 2300faac4104SBram Moolenaar 'vim9script', 230132e35117SBram Moolenaar 'let v = 1 # comment5', 2302faac4104SBram Moolenaar ]) 2303faac4104SBram Moolenaar 2304faac4104SBram Moolenaar CheckScriptFailure([ 2305faac4104SBram Moolenaar 'vim9script', 230632e35117SBram Moolenaar 'let v = 1# comment6', 230732e35117SBram Moolenaar ], 'E15:') 2308faac4104SBram Moolenaar 2309faac4104SBram Moolenaar CheckScriptSuccess([ 2310faac4104SBram Moolenaar 'vim9script', 2311faac4104SBram Moolenaar 'new' 2312faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2313df069eecSBram Moolenaar ':$', 2314faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2315faac4104SBram Moolenaar 'bwipe!', 2316faac4104SBram Moolenaar ]) 2317faac4104SBram Moolenaar 2318f5be8cdbSBram Moolenaar CheckScriptFailure([ 2319f5be8cdbSBram Moolenaar 'vim9script', 2320f5be8cdbSBram Moolenaar 'new' 2321f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2322f5be8cdbSBram Moolenaar ':$', 2323f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2324f5be8cdbSBram Moolenaar 'bwipe!', 2325f5be8cdbSBram Moolenaar ], 'E488:') 2326f5be8cdbSBram Moolenaar 2327f5be8cdbSBram Moolenaar CheckScriptFailure([ 2328f5be8cdbSBram Moolenaar 'vim9script', 2329f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2330f5be8cdbSBram Moolenaar ], 'E477:') 2331a26b9700SBram Moolenaarenddef 2332a26b9700SBram Moolenaar 23337e5bd91dSBram Moolenaardef Test_finish() 23347e5bd91dSBram Moolenaar let lines =<< trim END 23357e5bd91dSBram Moolenaar vim9script 23366797966dSBram Moolenaar g:res = 'one' 23377e5bd91dSBram Moolenaar if v:false | finish | endif 23386797966dSBram Moolenaar g:res = 'two' 23397e5bd91dSBram Moolenaar finish 23406797966dSBram Moolenaar g:res = 'three' 23417e5bd91dSBram Moolenaar END 23427e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 23437e5bd91dSBram Moolenaar source Xfinished 23447e5bd91dSBram Moolenaar assert_equal('two', g:res) 23457e5bd91dSBram Moolenaar 23467e5bd91dSBram Moolenaar unlet g:res 23477e5bd91dSBram Moolenaar delete('Xfinished') 23487e5bd91dSBram Moolenaarenddef 23497e5bd91dSBram Moolenaar 235032e35117SBram Moolenaardef Test_let_func_call() 235132e35117SBram Moolenaar let lines =<< trim END 235232e35117SBram Moolenaar vim9script 235332e35117SBram Moolenaar func GetValue() 235432e35117SBram Moolenaar if exists('g:count') 235532e35117SBram Moolenaar let g:count += 1 235632e35117SBram Moolenaar else 235732e35117SBram Moolenaar let g:count = 1 235832e35117SBram Moolenaar endif 235932e35117SBram Moolenaar return 'this' 236032e35117SBram Moolenaar endfunc 236132e35117SBram Moolenaar let val: string = GetValue() 2362f5be8cdbSBram Moolenaar # env var is always a string 2363df671b46SBram Moolenaar let env = $TERM 236432e35117SBram Moolenaar END 236532e35117SBram Moolenaar writefile(lines, 'Xfinished') 236632e35117SBram Moolenaar source Xfinished 2367f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 236832e35117SBram Moolenaar assert_equal(1, g:count) 236932e35117SBram Moolenaar 237032e35117SBram Moolenaar unlet g:count 237132e35117SBram Moolenaar delete('Xfinished') 237232e35117SBram Moolenaarenddef 237332e35117SBram Moolenaar 237432e35117SBram Moolenaardef Test_let_missing_type() 237532e35117SBram Moolenaar let lines =<< trim END 237632e35117SBram Moolenaar vim9script 2377df671b46SBram Moolenaar let var = g:unknown 2378227a69deSBram Moolenaar END 2379822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2380227a69deSBram Moolenaar 2381227a69deSBram Moolenaar lines =<< trim END 2382227a69deSBram Moolenaar vim9script 2383227a69deSBram Moolenaar let nr: number = 123 2384227a69deSBram Moolenaar let var = nr 2385227a69deSBram Moolenaar END 2386822ba247SBram Moolenaar CheckScriptSuccess(lines) 238732e35117SBram Moolenaarenddef 238832e35117SBram Moolenaar 2389c82a5b5dSBram Moolenaardef Test_let_declaration() 2390c82a5b5dSBram Moolenaar let lines =<< trim END 2391c82a5b5dSBram Moolenaar vim9script 2392c82a5b5dSBram Moolenaar let var: string 2393c82a5b5dSBram Moolenaar g:var_uninit = var 2394c82a5b5dSBram Moolenaar var = 'text' 2395c82a5b5dSBram Moolenaar g:var_test = var 2396f5be8cdbSBram Moolenaar # prefixing s: is optional 2397984dddbeSBram Moolenaar s:var = 'prefixed' 2398984dddbeSBram Moolenaar g:var_prefixed = s:var 2399984dddbeSBram Moolenaar 2400984dddbeSBram Moolenaar let s:other: number 2401984dddbeSBram Moolenaar other = 1234 2402984dddbeSBram Moolenaar g:other_var = other 2403c82a5b5dSBram Moolenaar END 2404c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2405c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2406c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2407984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2408984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2409c82a5b5dSBram Moolenaar 2410c82a5b5dSBram Moolenaar unlet g:var_uninit 2411c82a5b5dSBram Moolenaar unlet g:var_test 2412984dddbeSBram Moolenaar unlet g:var_prefixed 2413984dddbeSBram Moolenaar unlet g:other_var 2414c82a5b5dSBram Moolenaarenddef 2415c82a5b5dSBram Moolenaar 2416c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2417c5b1c20bSBram Moolenaar let lines =<< trim END 2418c5b1c20bSBram Moolenaar vim9script 2419c5b1c20bSBram Moolenaar const var: string 2420c5b1c20bSBram Moolenaar END 2421c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2422c5b1c20bSBram Moolenaar 2423c5b1c20bSBram Moolenaar lines =<< trim END 2424c5b1c20bSBram Moolenaar vim9script 2425c5b1c20bSBram Moolenaar let 9var: string 2426c5b1c20bSBram Moolenaar END 2427c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2428c5b1c20bSBram Moolenaarenddef 2429c5b1c20bSBram Moolenaar 243034db91f7SBram Moolenaardef Test_let_type_check() 243134db91f7SBram Moolenaar let lines =<< trim END 243234db91f7SBram Moolenaar vim9script 243334db91f7SBram Moolenaar let var: string 243434db91f7SBram Moolenaar var = 1234 243534db91f7SBram Moolenaar END 243634db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2437984dddbeSBram Moolenaar 2438984dddbeSBram Moolenaar lines =<< trim END 2439984dddbeSBram Moolenaar vim9script 2440984dddbeSBram Moolenaar let var:string 2441984dddbeSBram Moolenaar END 2442984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2443c5b1c20bSBram Moolenaar 2444c5b1c20bSBram Moolenaar lines =<< trim END 2445c5b1c20bSBram Moolenaar vim9script 2446c5b1c20bSBram Moolenaar let var: asdf 2447c5b1c20bSBram Moolenaar END 2448c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 244934db91f7SBram Moolenaarenddef 245034db91f7SBram Moolenaar 2451a5d0077eSBram Moolenaardef Test_forward_declaration() 2452a5d0077eSBram Moolenaar let lines =<< trim END 2453a5d0077eSBram Moolenaar vim9script 2454a5d0077eSBram Moolenaar def GetValue(): string 2455a5d0077eSBram Moolenaar return theVal 2456a5d0077eSBram Moolenaar enddef 2457a5d0077eSBram Moolenaar let theVal = 'something' 2458822ba247SBram Moolenaar g:initVal = GetValue() 2459a5d0077eSBram Moolenaar theVal = 'else' 2460a5d0077eSBram Moolenaar g:laterVal = GetValue() 2461a5d0077eSBram Moolenaar END 2462a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2463a5d0077eSBram Moolenaar source Xforward 2464a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2465a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2466a5d0077eSBram Moolenaar 2467a5d0077eSBram Moolenaar unlet g:initVal 2468a5d0077eSBram Moolenaar unlet g:laterVal 2469a5d0077eSBram Moolenaar delete('Xforward') 2470a5d0077eSBram Moolenaarenddef 2471a5d0077eSBram Moolenaar 24729721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 24739721fb4eSBram Moolenaar let legacy_lines =<< trim END 24749721fb4eSBram Moolenaar source Xvim9_script.vim 24759721fb4eSBram Moolenaar 24769721fb4eSBram Moolenaar call assert_false(exists('local')) 24779721fb4eSBram Moolenaar call assert_false(exists('exported')) 24789721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 24799721fb4eSBram Moolenaar call assert_equal('global', global) 24809721fb4eSBram Moolenaar call assert_equal('global', g:global) 24819721fb4eSBram Moolenaar 24829721fb4eSBram Moolenaar " imported variable becomes script-local 24839721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 24849721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 24859721fb4eSBram Moolenaar call assert_false(exists('exported')) 24869721fb4eSBram Moolenaar 24879721fb4eSBram Moolenaar " imported function becomes script-local 24889721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 24899721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 24909721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 24919721fb4eSBram Moolenaar END 24929721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 24939721fb4eSBram Moolenaar 24949721fb4eSBram Moolenaar let vim9_lines =<< trim END 24959721fb4eSBram Moolenaar vim9script 24969721fb4eSBram Moolenaar let local = 'local' 24979721fb4eSBram Moolenaar g:global = 'global' 24989721fb4eSBram Moolenaar export let exported = 'exported' 24999721fb4eSBram Moolenaar export def GetText(): string 25009721fb4eSBram Moolenaar return 'text' 25019721fb4eSBram Moolenaar enddef 25029721fb4eSBram Moolenaar END 25039721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 25049721fb4eSBram Moolenaar 25059721fb4eSBram Moolenaar source Xlegacy_script.vim 25069721fb4eSBram Moolenaar 25079721fb4eSBram Moolenaar assert_equal('global', g:global) 2508f5be8cdbSBram Moolenaar unlet g:global 25099721fb4eSBram Moolenaar 25109721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 25119721fb4eSBram Moolenaar delete('Xvim9_script.vim') 25129721fb4eSBram Moolenaarenddef 2513a5d0077eSBram Moolenaar 2514eeb27bfeSBram Moolenaardef Test_vim9_copen() 2515eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2516eeb27bfeSBram Moolenaar copen 2517eeb27bfeSBram Moolenaar quit 2518eeb27bfeSBram Moolenaarenddef 2519eeb27bfeSBram Moolenaar 2520585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2521585fea7bSBram Moolenaardef Test_substitute_cmd() 2522585fea7bSBram Moolenaar new 2523585fea7bSBram Moolenaar setline(1, 'something') 2524585fea7bSBram Moolenaar :substitute(some(other( 2525585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2526585fea7bSBram Moolenaar bwipe! 2527585fea7bSBram Moolenaar 2528f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2529585fea7bSBram Moolenaar let lines =<< trim END 2530585fea7bSBram Moolenaar vim9script 2531585fea7bSBram Moolenaar new 2532585fea7bSBram Moolenaar setline(1, 'something') 2533585fea7bSBram Moolenaar :substitute(some(other( 2534585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2535585fea7bSBram Moolenaar bwipe! 2536585fea7bSBram Moolenaar END 2537585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2538585fea7bSBram Moolenaar source Xvim9lines 2539585fea7bSBram Moolenaar 2540585fea7bSBram Moolenaar delete('Xvim9lines') 2541585fea7bSBram Moolenaarenddef 2542585fea7bSBram Moolenaar 25438a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2544