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 329be61bbbSBram Moolenaar let a: number = 6 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 47401d9ffbSBram Moolenaar g:newvar = 'new' 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 501*d032f34aSBram Moolenaarfunc g:NoSuchFunc() 502*d032f34aSBram Moolenaar echo 'none' 503*d032f34aSBram Moolenaarendfunc 504*d032f34aSBram 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) 663*d032f34aSBram Moolenaar 664*d032f34aSBram Moolenaar try 665*d032f34aSBram Moolenaar echo len(v:true) 666*d032f34aSBram Moolenaar catch /E701:/ 667*d032f34aSBram Moolenaar n = 355 668*d032f34aSBram Moolenaar endtry 669*d032f34aSBram Moolenaar assert_equal(355, n) 670*d032f34aSBram Moolenaar 671*d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 672*d032f34aSBram Moolenaar delfunc g:NoSuchFunc 673*d032f34aSBram Moolenaar try 674*d032f34aSBram Moolenaar echo P() 675*d032f34aSBram Moolenaar catch /E117:/ 676*d032f34aSBram Moolenaar n = 366 677*d032f34aSBram Moolenaar endtry 678*d032f34aSBram Moolenaar assert_equal(366, n) 679*d032f34aSBram Moolenaar 680*d032f34aSBram Moolenaar try 681*d032f34aSBram Moolenaar echo g:NoSuchFunc() 682*d032f34aSBram Moolenaar catch /E117:/ 683*d032f34aSBram Moolenaar n = 377 684*d032f34aSBram Moolenaar endtry 685*d032f34aSBram Moolenaar assert_equal(377, n) 686*d032f34aSBram Moolenaar 687*d032f34aSBram Moolenaar try 688*d032f34aSBram Moolenaar echo g:alist + 4 689*d032f34aSBram Moolenaar catch /E745:/ 690*d032f34aSBram Moolenaar n = 388 691*d032f34aSBram Moolenaar endtry 692*d032f34aSBram Moolenaar assert_equal(388, n) 693*d032f34aSBram Moolenaar 694*d032f34aSBram Moolenaar try 695*d032f34aSBram Moolenaar echo 4 + g:alist 696*d032f34aSBram Moolenaar catch /E745:/ 697*d032f34aSBram Moolenaar n = 399 698*d032f34aSBram Moolenaar endtry 699*d032f34aSBram Moolenaar assert_equal(399, n) 700*d032f34aSBram Moolenaar 701*d032f34aSBram Moolenaar try 702*d032f34aSBram Moolenaar echo g:alist.member 703*d032f34aSBram Moolenaar catch /E715:/ 704*d032f34aSBram Moolenaar n = 400 705*d032f34aSBram Moolenaar endtry 706*d032f34aSBram Moolenaar assert_equal(400, n) 707*d032f34aSBram Moolenaar 708*d032f34aSBram Moolenaar try 709*d032f34aSBram Moolenaar echo d.member 710*d032f34aSBram Moolenaar catch /E716:/ 711*d032f34aSBram Moolenaar n = 411 712*d032f34aSBram Moolenaar endtry 713*d032f34aSBram 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 8242a1381c3SBram Moolenaarif has('channel') 82540ee466cSBram Moolenaar let someJob = test_null_job() 82640ee466cSBram Moolenaar 82740ee466cSBram Moolenaar def FuncWithError() 82840ee466cSBram Moolenaar echomsg g:someJob 82940ee466cSBram Moolenaar enddef 83040ee466cSBram Moolenaar 83140ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 83240ee466cSBram Moolenaar try 83340ee466cSBram Moolenaar call FuncWithError() 83440ee466cSBram Moolenaar catch 83540ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 83640ee466cSBram Moolenaar endtry 83740ee466cSBram Moolenaar endfunc 8382a1381c3SBram Moolenaarendif 83940ee466cSBram Moolenaar 8408a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8418a7d6542SBram Moolenaar vim9script 8428a7d6542SBram Moolenaar let name: string = 'bob' 8438a7d6542SBram Moolenaar def Concat(arg: string): string 8448a7d6542SBram Moolenaar return name .. arg 8458a7d6542SBram Moolenaar enddef 846227a69deSBram Moolenaar g:result = Concat('bie') 847227a69deSBram Moolenaar g:localname = name 8488a7d6542SBram Moolenaar 8498a7d6542SBram Moolenaar export const CONST = 1234 8508a7d6542SBram Moolenaar export let exported = 9876 8516e587dcbSBram Moolenaar export let exp_name = 'John' 8528a7d6542SBram Moolenaar export def Exported(): string 8538a7d6542SBram Moolenaar return 'Exported' 8548a7d6542SBram Moolenaar enddef 8558a7d6542SBram MoolenaarEND 8568a7d6542SBram Moolenaar 8575269bd2aSBram Moolenaardef Test_vim9_import_export() 8588a7d6542SBram Moolenaar let import_script_lines =<< trim END 8598a7d6542SBram Moolenaar vim9script 8608a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8618a7d6542SBram Moolenaar g:imported = exported 8626e587dcbSBram Moolenaar exported += 3 8636e587dcbSBram Moolenaar g:imported_added = exported 8648a7d6542SBram Moolenaar g:imported_func = Exported() 8656e587dcbSBram Moolenaar 8666e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8676e587dcbSBram Moolenaar g:imported_name = exp_name 8686e587dcbSBram Moolenaar exp_name ..= ' Doe' 8696e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8705381c7a1SBram Moolenaar g:imported_later = exported 8718a7d6542SBram Moolenaar END 8728a7d6542SBram Moolenaar 8738a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaar source Ximport.vim 8778a7d6542SBram Moolenaar 8788a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8798a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8808a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8816e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8825381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8838a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 8846e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8856e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8868a7d6542SBram Moolenaar assert_false(exists('g:name')) 8878a7d6542SBram Moolenaar 8888a7d6542SBram Moolenaar unlet g:result 8898a7d6542SBram Moolenaar unlet g:localname 8908a7d6542SBram Moolenaar unlet g:imported 8916e587dcbSBram Moolenaar unlet g:imported_added 8925381c7a1SBram Moolenaar unlet g:imported_later 8938a7d6542SBram Moolenaar unlet g:imported_func 8946e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 8958a7d6542SBram Moolenaar delete('Ximport.vim') 896f2d5c240SBram Moolenaar 8971c991144SBram Moolenaar # similar, with line breaks 8981c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 8991c991144SBram Moolenaar vim9script 9001c991144SBram Moolenaar import { 9011c991144SBram Moolenaar exported, 9021c991144SBram Moolenaar Exported, 9031c991144SBram Moolenaar } 9041c991144SBram Moolenaar from 9051c991144SBram Moolenaar './Xexport.vim' 9061c991144SBram Moolenaar g:imported = exported 9071c991144SBram Moolenaar exported += 5 9081c991144SBram Moolenaar g:imported_added = exported 9091c991144SBram Moolenaar g:imported_func = Exported() 9101c991144SBram Moolenaar END 9111c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9121c991144SBram Moolenaar source Ximport_lbr.vim 9131c991144SBram Moolenaar 9141c991144SBram Moolenaar assert_equal(9876, g:imported) 9151c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9161c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9171c991144SBram Moolenaar 9181c991144SBram Moolenaar # exported script not sourced again 9191c991144SBram Moolenaar assert_false(exists('g:result')) 9201c991144SBram Moolenaar unlet g:imported 9211c991144SBram Moolenaar unlet g:imported_added 9221c991144SBram Moolenaar unlet g:imported_func 9231c991144SBram Moolenaar delete('Ximport_lbr.vim') 9241c991144SBram Moolenaar 9251c991144SBram Moolenaar # import inside :def function 9265381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 9275381c7a1SBram Moolenaar vim9script 9285381c7a1SBram Moolenaar def ImportInDef() 9295381c7a1SBram Moolenaar import exported from './Xexport.vim' 9305381c7a1SBram Moolenaar g:imported = exported 9315381c7a1SBram Moolenaar exported += 7 9325381c7a1SBram Moolenaar g:imported_added = exported 9335381c7a1SBram Moolenaar enddef 9345381c7a1SBram Moolenaar ImportInDef() 9355381c7a1SBram Moolenaar END 9365381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9375381c7a1SBram Moolenaar source Ximport2.vim 938f5be8cdbSBram Moolenaar # TODO: this should be 9879 9395381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9405381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9415381c7a1SBram Moolenaar unlet g:imported 9425381c7a1SBram Moolenaar unlet g:imported_added 9435381c7a1SBram Moolenaar delete('Ximport2.vim') 9445381c7a1SBram Moolenaar 945f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 946f2d5c240SBram Moolenaar vim9script 947f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 948f2d5c240SBram Moolenaar def UseExport() 949f2d5c240SBram Moolenaar g:imported = Export.exported 950f2d5c240SBram Moolenaar enddef 951f2d5c240SBram Moolenaar UseExport() 952f2d5c240SBram Moolenaar END 953f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 954f2d5c240SBram Moolenaar source Ximport.vim 9555381c7a1SBram Moolenaar assert_equal(9883, g:imported) 956f2d5c240SBram Moolenaar 957599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 958599c89c8SBram Moolenaar vim9script 959599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 960599c89c8SBram Moolenaar def Func() 961599c89c8SBram Moolenaar let dummy = 1 962599c89c8SBram Moolenaar let imported = Export + dummy 963599c89c8SBram Moolenaar enddef 964822ba247SBram Moolenaar defcompile 965599c89c8SBram Moolenaar END 966599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 967599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 968599c89c8SBram Moolenaar 969599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 970599c89c8SBram Moolenaar vim9script 971599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 972599c89c8SBram Moolenaar def Func() 973599c89c8SBram Moolenaar let imported = Export . exported 974599c89c8SBram Moolenaar enddef 975822ba247SBram Moolenaar defcompile 976599c89c8SBram Moolenaar END 977599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 978599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 979599c89c8SBram Moolenaar 980599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 981599c89c8SBram Moolenaar vim9script 982599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 983599c89c8SBram Moolenaar def Func() 984599c89c8SBram Moolenaar let imported = Export. 985599c89c8SBram Moolenaar enddef 986822ba247SBram Moolenaar defcompile 987599c89c8SBram Moolenaar END 988599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 989599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 990599c89c8SBram Moolenaar 9911c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 9921c991144SBram Moolenaar vim9script 9931c991144SBram Moolenaar import * 9941c991144SBram Moolenaar as Export 9951c991144SBram Moolenaar from 9961c991144SBram Moolenaar './Xexport.vim' 9971c991144SBram Moolenaar def UseExport() 9981c991144SBram Moolenaar g:imported = Export.exported 9991c991144SBram Moolenaar enddef 10001c991144SBram Moolenaar UseExport() 10011c991144SBram Moolenaar END 10021c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10031c991144SBram Moolenaar source Ximport.vim 10041c991144SBram Moolenaar assert_equal(9883, g:imported) 10051c991144SBram Moolenaar 1006f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1007f2d5c240SBram Moolenaar vim9script 1008f2d5c240SBram Moolenaar import * from './Xexport.vim' 1009f2d5c240SBram Moolenaar END 1010f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1011f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1012f2d5c240SBram Moolenaar 1013f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1014fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1015fa29c8abSBram Moolenaar vim9script 1016fa29c8abSBram Moolenaar import name from './Xexport.vim' 1017fa29c8abSBram Moolenaar END 1018fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1019fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1020fa29c8abSBram Moolenaar 1021f5be8cdbSBram Moolenaar # try to import something that is already defined 10225269bd2aSBram Moolenaar let import_already_defined =<< trim END 10235269bd2aSBram Moolenaar vim9script 10245269bd2aSBram Moolenaar let exported = 'something' 10255269bd2aSBram Moolenaar import exported from './Xexport.vim' 10265269bd2aSBram Moolenaar END 10275269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10285269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10295269bd2aSBram Moolenaar 1030f5be8cdbSBram Moolenaar # try to import something that is already defined 10315269bd2aSBram Moolenaar import_already_defined =<< trim END 10325269bd2aSBram Moolenaar vim9script 10335269bd2aSBram Moolenaar let exported = 'something' 10345269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10355269bd2aSBram Moolenaar END 10365269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10375269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10385269bd2aSBram Moolenaar 1039f5be8cdbSBram Moolenaar # try to import something that is already defined 10405269bd2aSBram Moolenaar import_already_defined =<< trim END 10415269bd2aSBram Moolenaar vim9script 10425269bd2aSBram Moolenaar let exported = 'something' 10435269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10445269bd2aSBram Moolenaar END 10455269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 10465269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 10475269bd2aSBram Moolenaar 1048f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1049fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1050fa29c8abSBram Moolenaar vim9script 1051fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1052fa29c8abSBram Moolenaar END 1053fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1054fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1055fa29c8abSBram Moolenaar 1056fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1057fa29c8abSBram Moolenaar vim9script 1058fa29c8abSBram Moolenaar import name './Xexport.vim' 1059fa29c8abSBram Moolenaar END 1060fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1061fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1062fa29c8abSBram Moolenaar 1063fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1064fa29c8abSBram Moolenaar vim9script 1065fa29c8abSBram Moolenaar import name from Xexport.vim 1066fa29c8abSBram Moolenaar END 1067fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1068fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1069fa29c8abSBram Moolenaar 1070fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1071fa29c8abSBram Moolenaar vim9script 1072fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1073fa29c8abSBram Moolenaar END 1074fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1075fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1076fa29c8abSBram Moolenaar 1077fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1078fa29c8abSBram Moolenaar vim9script 1079fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1080fa29c8abSBram Moolenaar END 10815269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 10825269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1083fa29c8abSBram Moolenaar 1084f2d5c240SBram Moolenaar delete('Ximport.vim') 10855269bd2aSBram Moolenaar delete('Ximport3.vim') 10868a7d6542SBram Moolenaar delete('Xexport.vim') 10878a7d6542SBram Moolenaar 1088f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1089750802b5SBram Moolenaar set cpo&vi 1090750802b5SBram Moolenaar let cpo_before = &cpo 1091750802b5SBram Moolenaar let lines =<< trim END 1092750802b5SBram Moolenaar vim9script 1093750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1094750802b5SBram Moolenaar END 1095750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1096750802b5SBram Moolenaar source Xvim9_script 1097750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1098750802b5SBram Moolenaar set cpo&vim 1099750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1100750802b5SBram Moolenaar delete('Xvim9_script') 1101750802b5SBram Moolenaarenddef 1102750802b5SBram Moolenaar 1103750802b5SBram Moolenaardef Test_vim9script_fails() 11048a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11058a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1106750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 11079721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 11089b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1109750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1110750802b5SBram Moolenaar 1111c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1112c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1113c785b9a7SBram Moolenaar 1114750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1115a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 11168a7d6542SBram Moolenaarenddef 11178a7d6542SBram Moolenaar 1118f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1119101f4810SBram Moolenaar CheckRunVimInTerminal 1120101f4810SBram Moolenaar 11219bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1122c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11239bb3eb3eSBram Moolenaarendfunc 11249bb3eb3eSBram Moolenaar 1125c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1126101f4810SBram Moolenaar let export =<< trim END 1127101f4810SBram Moolenaar vim9script 1128101f4810SBram Moolenaar export def Foo(): number 1129101f4810SBram Moolenaar return 0 1130101f4810SBram Moolenaar enddef 1131101f4810SBram Moolenaar END 11329bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1133101f4810SBram Moolenaar 11349bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 11359bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11369bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1137101f4810SBram Moolenaar 11389bb3eb3eSBram Moolenaar delete('Xexport.vim') 11399bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11409bb3eb3eSBram Moolenaarenddef 1141101f4810SBram Moolenaar 11424c17ad94SBram Moolenaardef Test_vim9script_reload_import() 11438a7d6542SBram Moolenaar let lines =<< trim END 11448a7d6542SBram Moolenaar vim9script 11458a7d6542SBram Moolenaar const var = '' 11468a7d6542SBram Moolenaar let valone = 1234 11478a7d6542SBram Moolenaar def MyFunc(arg: string) 11488a7d6542SBram Moolenaar valone = 5678 11498a7d6542SBram Moolenaar enddef 11508a7d6542SBram Moolenaar END 11518a7d6542SBram Moolenaar let morelines =<< trim END 11528a7d6542SBram Moolenaar let valtwo = 222 11538a7d6542SBram Moolenaar export def GetValtwo(): number 11548a7d6542SBram Moolenaar return valtwo 11558a7d6542SBram Moolenaar enddef 11568a7d6542SBram Moolenaar END 115703afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11588a7d6542SBram Moolenaar source Xreload.vim 11598a7d6542SBram Moolenaar source Xreload.vim 11608a7d6542SBram Moolenaar source Xreload.vim 11618a7d6542SBram Moolenaar 11628a7d6542SBram Moolenaar let testlines =<< trim END 11638a7d6542SBram Moolenaar vim9script 11648a7d6542SBram Moolenaar def TheFunc() 11658a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11668a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11678a7d6542SBram Moolenaar enddef 11688a7d6542SBram Moolenaar TheFunc() 11698a7d6542SBram Moolenaar END 11708a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11718a7d6542SBram Moolenaar source Ximport.vim 11728a7d6542SBram Moolenaar 1173f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1174f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11758a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11768a7d6542SBram Moolenaar source Ximport.vim 11778a7d6542SBram Moolenaar 1178f5be8cdbSBram Moolenaar # cannot declare a var twice 11798a7d6542SBram Moolenaar lines =<< trim END 11808a7d6542SBram Moolenaar vim9script 11818a7d6542SBram Moolenaar let valone = 1234 11828a7d6542SBram Moolenaar let valone = 5678 11838a7d6542SBram Moolenaar END 11848a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11858a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 11868a7d6542SBram Moolenaar 11878a7d6542SBram Moolenaar delete('Xreload.vim') 11888a7d6542SBram Moolenaar delete('Ximport.vim') 11898a7d6542SBram Moolenaarenddef 11908a7d6542SBram Moolenaar 1191fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1192fe465a01SBram Moolenaar" script-local name. 1193fe465a01SBram Moolenaardef Test_vim9script_funcref() 1194fe465a01SBram Moolenaar let sortlines =<< trim END 1195fe465a01SBram Moolenaar vim9script 1196fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1197bed36b93SBram Moolenaar return i2 - i1 1198fe465a01SBram Moolenaar enddef 1199fe465a01SBram Moolenaar 1200fe465a01SBram Moolenaar export def FastSort(): list<number> 1201fe465a01SBram Moolenaar return range(5)->sort(Compare) 1202fe465a01SBram Moolenaar enddef 1203fe465a01SBram Moolenaar END 1204fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1205fe465a01SBram Moolenaar 1206fe465a01SBram Moolenaar let lines =<< trim END 1207fe465a01SBram Moolenaar vim9script 1208fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1209fe465a01SBram Moolenaar def Test() 1210fe465a01SBram Moolenaar g:result = FastSort() 1211fe465a01SBram Moolenaar enddef 1212fe465a01SBram Moolenaar Test() 1213fe465a01SBram Moolenaar END 1214fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1215fe465a01SBram Moolenaar 1216fe465a01SBram Moolenaar source Xscript.vim 1217fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1218fe465a01SBram Moolenaar 1219fe465a01SBram Moolenaar unlet g:result 1220fe465a01SBram Moolenaar delete('Xsort.vim') 1221fe465a01SBram Moolenaar delete('Xscript.vim') 1222fe465a01SBram Moolenaarenddef 1223fe465a01SBram Moolenaar 1224c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1225c620c055SBram Moolenaar" script where FastFilter() is called from. 1226c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1227c620c055SBram Moolenaar let filterLines =<< trim END 1228c620c055SBram Moolenaar vim9script 1229c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1230c620c055SBram Moolenaar return idx % 2 == 1 1231c620c055SBram Moolenaar enddef 1232c620c055SBram Moolenaar export def FastFilter(): list<number> 1233c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1234c620c055SBram Moolenaar enddef 1235c620c055SBram Moolenaar END 1236c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1237c620c055SBram Moolenaar 1238c620c055SBram Moolenaar let lines =<< trim END 1239c620c055SBram Moolenaar vim9script 1240c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1241c620c055SBram Moolenaar def Test() 1242c620c055SBram Moolenaar let x: list<number> = FastFilter() 1243c620c055SBram Moolenaar enddef 1244c620c055SBram Moolenaar Test() 1245c620c055SBram Moolenaar END 1246c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1247c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1248c620c055SBram Moolenaar 1249c620c055SBram Moolenaar delete('Xfilter.vim') 1250c620c055SBram Moolenaar delete('Ximport.vim') 1251c620c055SBram Moolenaarenddef 1252c620c055SBram Moolenaar 12534c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 12544c17ad94SBram Moolenaar let first_lines =<< trim END 12554c17ad94SBram Moolenaar vim9script 12564c17ad94SBram Moolenaar def FuncYes(): string 12574c17ad94SBram Moolenaar return 'yes' 12584c17ad94SBram Moolenaar enddef 12594c17ad94SBram Moolenaar END 126003afdcf1SBram Moolenaar let withno_lines =<< trim END 12614c17ad94SBram Moolenaar def FuncNo(): string 12624c17ad94SBram Moolenaar return 'no' 12634c17ad94SBram Moolenaar enddef 12644c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12654c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12664c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 126703afdcf1SBram Moolenaar enddef 126803afdcf1SBram Moolenaar END 126903afdcf1SBram Moolenaar let nono_lines =<< trim END 127003afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 127103afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 12724c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 12734c17ad94SBram Moolenaar enddef 12744c17ad94SBram Moolenaar END 12754c17ad94SBram Moolenaar 12764c17ad94SBram Moolenaar # FuncNo() is defined 127703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12784c17ad94SBram Moolenaar source Xreloaded.vim 12794c17ad94SBram Moolenaar g:DoCheck(true) 12804c17ad94SBram Moolenaar 12814c17ad94SBram Moolenaar # FuncNo() is not redefined 128203afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12834c17ad94SBram Moolenaar source Xreloaded.vim 128403afdcf1SBram Moolenaar g:DoCheck() 12854c17ad94SBram Moolenaar 12864c17ad94SBram Moolenaar # FuncNo() is back 128703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12884c17ad94SBram Moolenaar source Xreloaded.vim 128903afdcf1SBram Moolenaar g:DoCheck() 12904c17ad94SBram Moolenaar 12914c17ad94SBram Moolenaar delete('Xreloaded.vim') 12924c17ad94SBram Moolenaarenddef 12934c17ad94SBram Moolenaar 129489483d40SBram Moolenaardef Test_vim9script_reload_delvar() 129589483d40SBram Moolenaar # write the script with a script-local variable 129689483d40SBram Moolenaar let lines =<< trim END 129789483d40SBram Moolenaar vim9script 129889483d40SBram Moolenaar let var = 'string' 129989483d40SBram Moolenaar END 130089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 130189483d40SBram Moolenaar source XreloadVar.vim 130289483d40SBram Moolenaar 130389483d40SBram Moolenaar # now write the script using the same variable locally - works 130489483d40SBram Moolenaar lines =<< trim END 130589483d40SBram Moolenaar vim9script 130689483d40SBram Moolenaar def Func() 130789483d40SBram Moolenaar let var = 'string' 130889483d40SBram Moolenaar enddef 130989483d40SBram Moolenaar END 131089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 131189483d40SBram Moolenaar source XreloadVar.vim 131289483d40SBram Moolenaar 131389483d40SBram Moolenaar delete('XreloadVar.vim') 131489483d40SBram Moolenaarenddef 131589483d40SBram Moolenaar 13168a7d6542SBram Moolenaardef Test_import_absolute() 13178a7d6542SBram Moolenaar let import_lines = [ 1318e6085c53SBram Moolenaar 'vim9script', 1319e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1320e6085c53SBram Moolenaar 'def UseExported()', 1321e6085c53SBram Moolenaar ' g:imported_abs = exported', 1322e6085c53SBram Moolenaar ' exported = 8888', 1323e6085c53SBram Moolenaar ' g:imported_after = exported', 1324e6085c53SBram Moolenaar 'enddef', 1325e6085c53SBram Moolenaar 'UseExported()', 1326e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1327e6085c53SBram Moolenaar ] 13288a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13298a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13308a7d6542SBram Moolenaar 13318a7d6542SBram Moolenaar source Ximport_abs.vim 13328a7d6542SBram Moolenaar 13338a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13344e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1335675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1336675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1337675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1338675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1339675f716eSBram Moolenaar 'exported = 8888.*' .. 1340675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1341675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1342675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1343675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1344e6085c53SBram Moolenaar g:import_disassembled) 13458a7d6542SBram Moolenaar unlet g:imported_abs 13464e12a5dfSBram Moolenaar unlet g:import_disassembled 13478a7d6542SBram Moolenaar 13488a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13498a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13508a7d6542SBram Moolenaarenddef 13518a7d6542SBram Moolenaar 13528a7d6542SBram Moolenaardef Test_import_rtp() 13538a7d6542SBram Moolenaar let import_lines = [ 1354e6085c53SBram Moolenaar 'vim9script', 1355e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1356e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1357e6085c53SBram Moolenaar ] 13588a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13598a7d6542SBram Moolenaar mkdir('import') 13608a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13618a7d6542SBram Moolenaar 13628a7d6542SBram Moolenaar let save_rtp = &rtp 13638a7d6542SBram Moolenaar &rtp = getcwd() 13648a7d6542SBram Moolenaar source Ximport_rtp.vim 13658a7d6542SBram Moolenaar &rtp = save_rtp 13668a7d6542SBram Moolenaar 13678a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13688a7d6542SBram Moolenaar unlet g:imported_rtp 13698a7d6542SBram Moolenaar 13708a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 137189483d40SBram Moolenaar delete('import', 'rf') 13728a7d6542SBram Moolenaarenddef 13738a7d6542SBram Moolenaar 137425e0f586SBram Moolenaardef Test_import_compile_error() 137525e0f586SBram Moolenaar let export_lines = [ 137625e0f586SBram Moolenaar 'vim9script', 137725e0f586SBram Moolenaar 'export def ExpFunc(): string', 137825e0f586SBram Moolenaar ' return notDefined', 137925e0f586SBram Moolenaar 'enddef', 138025e0f586SBram Moolenaar ] 138125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 138225e0f586SBram Moolenaar 138325e0f586SBram Moolenaar let import_lines = [ 138425e0f586SBram Moolenaar 'vim9script', 138525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 138625e0f586SBram Moolenaar 'def ImpFunc()', 138725e0f586SBram Moolenaar ' echo ExpFunc()', 138825e0f586SBram Moolenaar 'enddef', 138925e0f586SBram Moolenaar 'defcompile', 139025e0f586SBram Moolenaar ] 139125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 139225e0f586SBram Moolenaar 139325e0f586SBram Moolenaar try 139425e0f586SBram Moolenaar source Ximport.vim 139525e0f586SBram Moolenaar catch /E1001/ 1396f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 139725e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 139825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 139925e0f586SBram Moolenaar endtry 140025e0f586SBram Moolenaar 140125e0f586SBram Moolenaar delete('Xexported.vim') 140225e0f586SBram Moolenaar delete('Ximport.vim') 140325e0f586SBram Moolenaarenddef 140425e0f586SBram Moolenaar 14058a7d6542SBram Moolenaardef Test_fixed_size_list() 1406f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 14078a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 14088a7d6542SBram Moolenaar l->remove(0) 14098a7d6542SBram Moolenaar l->add(5) 14108a7d6542SBram Moolenaar l->insert(99, 1) 14110f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14128a7d6542SBram Moolenaarenddef 14138a7d6542SBram Moolenaar 1414158906cfSBram Moolenaardef IfElse(what: number): string 1415158906cfSBram Moolenaar let res = '' 1416158906cfSBram Moolenaar if what == 1 1417158906cfSBram Moolenaar res = "one" 1418158906cfSBram Moolenaar elseif what == 2 1419158906cfSBram Moolenaar res = "two" 1420a259d8d3SBram Moolenaar else 1421158906cfSBram Moolenaar res = "three" 1422a259d8d3SBram Moolenaar endif 1423158906cfSBram Moolenaar return res 1424a259d8d3SBram Moolenaarenddef 1425a259d8d3SBram Moolenaar 1426158906cfSBram Moolenaardef Test_if_elseif_else() 1427158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1428158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1429158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 14300f18b6d1SBram Moolenaarenddef 14310f18b6d1SBram Moolenaar 1432e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1433e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1434e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1435e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1436e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1437585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1438e8c4abbbSBram Moolenaarenddef 1439e8c4abbbSBram Moolenaar 14406d69bf60SBram Moolenaarlet g:bool_true = v:true 14416d69bf60SBram Moolenaarlet g:bool_false = v:false 14426d69bf60SBram Moolenaar 14436d69bf60SBram Moolenaardef Test_if_const_expr() 14446d69bf60SBram Moolenaar let res = false 14456d69bf60SBram Moolenaar if true ? true : false 14466d69bf60SBram Moolenaar res = true 14476d69bf60SBram Moolenaar endif 14486d69bf60SBram Moolenaar assert_equal(true, res) 14496d69bf60SBram Moolenaar 1450585fea7bSBram Moolenaar g:glob = 2 1451585fea7bSBram Moolenaar if false 14526797966dSBram Moolenaar execute('g:glob = 3') 1453585fea7bSBram Moolenaar endif 1454585fea7bSBram Moolenaar assert_equal(2, g:glob) 1455585fea7bSBram Moolenaar if true 14566797966dSBram Moolenaar execute('g:glob = 3') 1457585fea7bSBram Moolenaar endif 1458585fea7bSBram Moolenaar assert_equal(3, g:glob) 1459585fea7bSBram Moolenaar 14606d69bf60SBram Moolenaar res = false 14616d69bf60SBram Moolenaar if g:bool_true ? true : false 14626d69bf60SBram Moolenaar res = true 14636d69bf60SBram Moolenaar endif 14646d69bf60SBram Moolenaar assert_equal(true, res) 14656d69bf60SBram Moolenaar 14666d69bf60SBram Moolenaar res = false 14676d69bf60SBram Moolenaar if true ? g:bool_true : false 14686d69bf60SBram Moolenaar res = true 14696d69bf60SBram Moolenaar endif 14706d69bf60SBram Moolenaar assert_equal(true, res) 14716d69bf60SBram Moolenaar 14726d69bf60SBram Moolenaar res = false 14736d69bf60SBram Moolenaar if true ? true : g:bool_false 14746d69bf60SBram Moolenaar res = true 14756d69bf60SBram Moolenaar endif 14766d69bf60SBram Moolenaar assert_equal(true, res) 14776d69bf60SBram Moolenaar 14786d69bf60SBram Moolenaar res = false 14796d69bf60SBram Moolenaar if true ? false : true 14806d69bf60SBram Moolenaar res = true 14816d69bf60SBram Moolenaar endif 14826d69bf60SBram Moolenaar assert_equal(false, res) 14836d69bf60SBram Moolenaar 14846d69bf60SBram Moolenaar res = false 14856d69bf60SBram Moolenaar if false ? false : true 14866d69bf60SBram Moolenaar res = true 14876d69bf60SBram Moolenaar endif 14886d69bf60SBram Moolenaar assert_equal(true, res) 14896d69bf60SBram Moolenaar 14906d69bf60SBram Moolenaar res = false 14916d69bf60SBram Moolenaar if false ? true : false 14926d69bf60SBram Moolenaar res = true 14936d69bf60SBram Moolenaar endif 14946d69bf60SBram Moolenaar assert_equal(false, res) 14956d69bf60SBram Moolenaar 14966d69bf60SBram Moolenaar res = false 1497e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1498e8c4abbbSBram Moolenaar res = true 1499e8c4abbbSBram Moolenaar endif 1500e8c4abbbSBram Moolenaar assert_equal(false, res) 1501e8c4abbbSBram Moolenaar 1502e8c4abbbSBram Moolenaar res = false 15036d69bf60SBram Moolenaar if true && true 15046d69bf60SBram Moolenaar res = true 15056d69bf60SBram Moolenaar endif 15066d69bf60SBram Moolenaar assert_equal(true, res) 15076d69bf60SBram Moolenaar 15086d69bf60SBram Moolenaar res = false 15096d69bf60SBram Moolenaar if true && false 15106d69bf60SBram Moolenaar res = true 15116d69bf60SBram Moolenaar endif 15126d69bf60SBram Moolenaar assert_equal(false, res) 15136d69bf60SBram Moolenaar 15146d69bf60SBram Moolenaar res = false 15156d69bf60SBram Moolenaar if g:bool_true && false 15166d69bf60SBram Moolenaar res = true 15176d69bf60SBram Moolenaar endif 15186d69bf60SBram Moolenaar assert_equal(false, res) 15196d69bf60SBram Moolenaar 15206d69bf60SBram Moolenaar res = false 15216d69bf60SBram Moolenaar if true && g:bool_false 15226d69bf60SBram Moolenaar res = true 15236d69bf60SBram Moolenaar endif 15246d69bf60SBram Moolenaar assert_equal(false, res) 15256d69bf60SBram Moolenaar 15266d69bf60SBram Moolenaar res = false 15276d69bf60SBram Moolenaar if false && false 15286d69bf60SBram Moolenaar res = true 15296d69bf60SBram Moolenaar endif 15306d69bf60SBram Moolenaar assert_equal(false, res) 15316d69bf60SBram Moolenaar 15326d69bf60SBram Moolenaar res = false 15336d69bf60SBram Moolenaar if true || false 15346d69bf60SBram Moolenaar res = true 15356d69bf60SBram Moolenaar endif 15366d69bf60SBram Moolenaar assert_equal(true, res) 15376d69bf60SBram Moolenaar 15386d69bf60SBram Moolenaar res = false 15396d69bf60SBram Moolenaar if g:bool_true || false 15406d69bf60SBram Moolenaar res = true 15416d69bf60SBram Moolenaar endif 15426d69bf60SBram Moolenaar assert_equal(true, res) 15436d69bf60SBram Moolenaar 15446d69bf60SBram Moolenaar res = false 15456d69bf60SBram Moolenaar if true || g:bool_false 15466d69bf60SBram Moolenaar res = true 15476d69bf60SBram Moolenaar endif 15486d69bf60SBram Moolenaar assert_equal(true, res) 15496d69bf60SBram Moolenaar 15506d69bf60SBram Moolenaar res = false 15516d69bf60SBram Moolenaar if false || false 15526d69bf60SBram Moolenaar res = true 15536d69bf60SBram Moolenaar endif 15546d69bf60SBram Moolenaar assert_equal(false, res) 155580c34ca3SBram Moolenaarenddef 15566d69bf60SBram Moolenaar 155780c34ca3SBram Moolenaardef Test_if_const_expr_fails() 155880c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 155980c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1560e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1561e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 15626d69bf60SBram Moolenaarenddef 15636d69bf60SBram Moolenaar 156472abcf42SBram Moolenaardef RunNested(i: number): number 156572abcf42SBram Moolenaar let x: number = 0 156672abcf42SBram Moolenaar if i % 2 156772abcf42SBram Moolenaar if 1 1568f5be8cdbSBram Moolenaar # comment 156972abcf42SBram Moolenaar else 1570f5be8cdbSBram Moolenaar # comment 157172abcf42SBram Moolenaar endif 157272abcf42SBram Moolenaar x += 1 157372abcf42SBram Moolenaar else 157472abcf42SBram Moolenaar x += 1000 157572abcf42SBram Moolenaar endif 157672abcf42SBram Moolenaar return x 157772abcf42SBram Moolenaarenddef 157872abcf42SBram Moolenaar 157972abcf42SBram Moolenaardef Test_nested_if() 158072abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 158172abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 158272abcf42SBram Moolenaarenddef 158372abcf42SBram Moolenaar 1584ad39c094SBram Moolenaardef Test_execute_cmd() 1585ad39c094SBram Moolenaar new 1586ad39c094SBram Moolenaar setline(1, 'default') 1587ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1588ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1589a72cfb80SBram Moolenaar 1590a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1591a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1592a72cfb80SBram Moolenaar 1593ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1594ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1595a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1596ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1597a72cfb80SBram Moolenaar 1598ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1599ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1600a72cfb80SBram Moolenaar 1601ad39c094SBram Moolenaar let cmd_first = 'call ' 1602ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1603ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1604ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1605ad39c094SBram Moolenaar bwipe! 1606585fea7bSBram Moolenaar 1607585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1608a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1609ad39c094SBram Moolenaarenddef 1610ad39c094SBram Moolenaar 161147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1612f5be8cdbSBram Moolenaar # only checks line continuation 161347e880d6SBram Moolenaar let lines =<< trim END 161447e880d6SBram Moolenaar vim9script 161547e880d6SBram Moolenaar execute 'g:someVar' 161647e880d6SBram Moolenaar .. ' = ' .. 161747e880d6SBram Moolenaar '28' 161847e880d6SBram Moolenaar assert_equal(28, g:someVar) 161947e880d6SBram Moolenaar unlet g:someVar 162047e880d6SBram Moolenaar END 162147e880d6SBram Moolenaar CheckScriptSuccess(lines) 162247e880d6SBram Moolenaarenddef 162347e880d6SBram Moolenaar 1624ad39c094SBram Moolenaardef Test_echo_cmd() 1625a72cfb80SBram Moolenaar echo 'some' # comment 1626585fea7bSBram Moolenaar echon 'thing' 1627ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1628ad39c094SBram Moolenaar 1629a72cfb80SBram Moolenaar echo "some" # comment 1630a72cfb80SBram Moolenaar echon "thing" 1631a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1632a72cfb80SBram Moolenaar 1633ad39c094SBram Moolenaar let str1 = 'some' 1634ad39c094SBram Moolenaar let str2 = 'more' 1635ad39c094SBram Moolenaar echo str1 str2 1636ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1637a72cfb80SBram Moolenaar 1638a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1639ad39c094SBram Moolenaarenddef 1640ad39c094SBram Moolenaar 1641f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1642f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1643f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1644f93c7feaSBram Moolenaar echo 'clear' 1645df069eecSBram Moolenaar :1messages 1646f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1647f93c7feaSBram Moolenaar 1648f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1649f93c7feaSBram Moolenaarenddef 1650f93c7feaSBram Moolenaar 165147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1652f5be8cdbSBram Moolenaar # only checks line continuation 165347e880d6SBram Moolenaar let lines =<< trim END 165447e880d6SBram Moolenaar vim9script 165547e880d6SBram Moolenaar echomsg 'here' 165647e880d6SBram Moolenaar .. ' is ' .. 165747e880d6SBram Moolenaar 'a message' 165847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 165947e880d6SBram Moolenaar END 166047e880d6SBram Moolenaar CheckScriptSuccess(lines) 166147e880d6SBram Moolenaarenddef 166247e880d6SBram Moolenaar 1663f93c7feaSBram Moolenaardef Test_echoerr_cmd() 166440ee466cSBram Moolenaar try 166540ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 166640ee466cSBram Moolenaar catch 166740ee466cSBram Moolenaar assert_match('something wrong', v:exception) 166840ee466cSBram Moolenaar endtry 1669f93c7feaSBram Moolenaarenddef 1670f93c7feaSBram Moolenaar 167147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1672f5be8cdbSBram Moolenaar # only checks line continuation 167347e880d6SBram Moolenaar let lines =<< trim END 167447e880d6SBram Moolenaar vim9script 167547e880d6SBram Moolenaar try 167647e880d6SBram Moolenaar echoerr 'this' 167747e880d6SBram Moolenaar .. ' is ' .. 167847e880d6SBram Moolenaar 'wrong' 167947e880d6SBram Moolenaar catch 168047e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 168147e880d6SBram Moolenaar endtry 168247e880d6SBram Moolenaar END 168347e880d6SBram Moolenaar CheckScriptSuccess(lines) 168447e880d6SBram Moolenaarenddef 168547e880d6SBram Moolenaar 168641fe0617SBram Moolenaardef Test_for_outside_of_function() 168741fe0617SBram Moolenaar let lines =<< trim END 168841fe0617SBram Moolenaar vim9script 168941fe0617SBram Moolenaar new 169041fe0617SBram Moolenaar for var in range(0, 3) 169141fe0617SBram Moolenaar append(line('$'), var) 169241fe0617SBram Moolenaar endfor 169341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 169441fe0617SBram Moolenaar bwipe! 169541fe0617SBram Moolenaar END 169641fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 169741fe0617SBram Moolenaar source Xvim9for.vim 169841fe0617SBram Moolenaar delete('Xvim9for.vim') 169941fe0617SBram Moolenaarenddef 17008a7d6542SBram Moolenaar 1701e8c4abbbSBram Moolenaardef Test_for_loop() 1702e8c4abbbSBram Moolenaar let result = '' 1703e8c4abbbSBram Moolenaar for cnt in range(7) 1704e8c4abbbSBram Moolenaar if cnt == 4 1705e8c4abbbSBram Moolenaar break 1706e8c4abbbSBram Moolenaar endif 1707e8c4abbbSBram Moolenaar if cnt == 2 1708e8c4abbbSBram Moolenaar continue 1709e8c4abbbSBram Moolenaar endif 1710e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1711e8c4abbbSBram Moolenaar endfor 1712e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 17130ad3e894SBram Moolenaar 17140ad3e894SBram Moolenaar let concat = '' 17150ad3e894SBram Moolenaar for str in eval('["one", "two"]') 17160ad3e894SBram Moolenaar concat ..= str 17170ad3e894SBram Moolenaar endfor 17180ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1719e8c4abbbSBram Moolenaarenddef 1720e8c4abbbSBram Moolenaar 1721e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1722675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1723675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1724675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1725822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 17260ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1727675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1728675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1729675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1730e8c4abbbSBram Moolenaarenddef 1731e8c4abbbSBram Moolenaar 1732d0df1aacSBram Moolenaardef Test_while_loop() 1733d0df1aacSBram Moolenaar let result = '' 1734d0df1aacSBram Moolenaar let cnt = 0 1735d0df1aacSBram Moolenaar while cnt < 555 1736d0df1aacSBram Moolenaar if cnt == 3 1737d0df1aacSBram Moolenaar break 1738d0df1aacSBram Moolenaar endif 1739d0df1aacSBram Moolenaar cnt += 1 1740d0df1aacSBram Moolenaar if cnt == 2 1741d0df1aacSBram Moolenaar continue 1742d0df1aacSBram Moolenaar endif 1743d0df1aacSBram Moolenaar result ..= cnt .. '_' 1744d0df1aacSBram Moolenaar endwhile 1745d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1746d0df1aacSBram Moolenaarenddef 1747d0df1aacSBram Moolenaar 1748e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1749675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1750675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1751675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1752675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1753675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1754675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1755675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1756bd5da371SBram Moolenaarenddef 1757bd5da371SBram Moolenaar 17589645e2d9SBram Moolenaardef Test_interrupt_loop() 175997acfc78SBram Moolenaar let caught = false 17609645e2d9SBram Moolenaar let x = 0 176197acfc78SBram Moolenaar try 17629645e2d9SBram Moolenaar while 1 17639645e2d9SBram Moolenaar x += 1 17649645e2d9SBram Moolenaar if x == 100 17659645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 17669645e2d9SBram Moolenaar endif 17679645e2d9SBram Moolenaar endwhile 176897acfc78SBram Moolenaar catch 176997acfc78SBram Moolenaar caught = true 177097acfc78SBram Moolenaar assert_equal(100, x) 177197acfc78SBram Moolenaar endtry 177297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 17739645e2d9SBram Moolenaarenddef 177420431c9dSBram Moolenaar 17754fdae999SBram Moolenaardef Test_automatic_line_continuation() 17764fdae999SBram Moolenaar let mylist = [ 17774fdae999SBram Moolenaar 'one', 17784fdae999SBram Moolenaar 'two', 17794fdae999SBram Moolenaar 'three', 1780f5be8cdbSBram Moolenaar ] # comment 17814fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 17824fdae999SBram Moolenaar 17834fdae999SBram Moolenaar let mydict = { 17844fdae999SBram Moolenaar 'one': 1, 17854fdae999SBram Moolenaar 'two': 2, 17864fdae999SBram Moolenaar 'three': 17874fdae999SBram Moolenaar 3, 1788f5be8cdbSBram Moolenaar } # comment 17894fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 17904fdae999SBram Moolenaar mydict = #{ 17912c330432SBram Moolenaar one: 1, # comment 17922c330432SBram Moolenaar two: # comment 17932c330432SBram Moolenaar 2, # comment 17942c330432SBram Moolenaar three: 3 # comment 17952c330432SBram Moolenaar } 17962c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 17972c330432SBram Moolenaar mydict = #{ 17982c330432SBram Moolenaar one: 1, 17994fdae999SBram Moolenaar two: 18004fdae999SBram Moolenaar 2, 18012c330432SBram Moolenaar three: 3 18024fdae999SBram Moolenaar } 18034fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1804e6085c53SBram Moolenaar 1805e6085c53SBram Moolenaar assert_equal( 1806e6085c53SBram Moolenaar ['one', 'two', 'three'], 1807e6085c53SBram Moolenaar split('one two three') 1808e6085c53SBram Moolenaar ) 18094fdae999SBram Moolenaarenddef 18104fdae999SBram Moolenaar 18117a092245SBram Moolenaardef Test_vim9_comment() 18127a092245SBram Moolenaar CheckScriptSuccess([ 18137a092245SBram Moolenaar 'vim9script', 18147a092245SBram Moolenaar '# something', 18157a092245SBram Moolenaar ]) 18167a092245SBram Moolenaar CheckScriptFailure([ 18177a092245SBram Moolenaar 'vim9script', 18187a092245SBram Moolenaar ':# something', 18197a092245SBram Moolenaar ], 'E488:') 18207a092245SBram Moolenaar CheckScriptFailure([ 18217a092245SBram Moolenaar '# something', 18227a092245SBram Moolenaar ], 'E488:') 18237a092245SBram Moolenaar CheckScriptFailure([ 18247a092245SBram Moolenaar ':# something', 18257a092245SBram Moolenaar ], 'E488:') 18267a092245SBram Moolenaar 18274a8d9f2eSBram Moolenaar { # block start 18284a8d9f2eSBram Moolenaar } # block end 18294a8d9f2eSBram Moolenaar CheckDefFailure([ 18304a8d9f2eSBram Moolenaar '{# comment', 18314a8d9f2eSBram Moolenaar ], 'E488:') 18324a8d9f2eSBram Moolenaar CheckDefFailure([ 18334a8d9f2eSBram Moolenaar '{', 18344a8d9f2eSBram Moolenaar '}# comment', 18354a8d9f2eSBram Moolenaar ], 'E488:') 18364a8d9f2eSBram Moolenaar 18374a8d9f2eSBram Moolenaar echo "yes" # comment 18384a8d9f2eSBram Moolenaar CheckDefFailure([ 18394a8d9f2eSBram Moolenaar 'echo "yes"# comment', 18404a8d9f2eSBram Moolenaar ], 'E488:') 18417a092245SBram Moolenaar CheckScriptSuccess([ 18427a092245SBram Moolenaar 'vim9script', 18437a092245SBram Moolenaar 'echo "yes" # something', 18447a092245SBram Moolenaar ]) 18457a092245SBram Moolenaar CheckScriptFailure([ 18467a092245SBram Moolenaar 'vim9script', 18477a092245SBram Moolenaar 'echo "yes"# something', 18487a092245SBram Moolenaar ], 'E121:') 18497a092245SBram Moolenaar CheckScriptFailure([ 18507a092245SBram Moolenaar 'vim9script', 18517a092245SBram Moolenaar 'echo# something', 18527a092245SBram Moolenaar ], 'E121:') 18537a092245SBram Moolenaar CheckScriptFailure([ 18547a092245SBram Moolenaar 'echo "yes" # something', 18557a092245SBram Moolenaar ], 'E121:') 18567a092245SBram Moolenaar 18574a8d9f2eSBram Moolenaar exe "echo" # comment 18584a8d9f2eSBram Moolenaar CheckDefFailure([ 18594a8d9f2eSBram Moolenaar 'exe "echo"# comment', 18604a8d9f2eSBram Moolenaar ], 'E488:') 18614a8d9f2eSBram Moolenaar CheckScriptSuccess([ 18624a8d9f2eSBram Moolenaar 'vim9script', 18634a8d9f2eSBram Moolenaar 'exe "echo" # something', 18644a8d9f2eSBram Moolenaar ]) 18654a8d9f2eSBram Moolenaar CheckScriptFailure([ 18664a8d9f2eSBram Moolenaar 'vim9script', 18674a8d9f2eSBram Moolenaar 'exe "echo"# something', 18684a8d9f2eSBram Moolenaar ], 'E121:') 18694a8d9f2eSBram Moolenaar CheckDefFailure([ 18704a8d9f2eSBram Moolenaar 'exe # comment', 18714a8d9f2eSBram Moolenaar ], 'E1015:') 18724a8d9f2eSBram Moolenaar CheckScriptFailure([ 18734a8d9f2eSBram Moolenaar 'vim9script', 18744a8d9f2eSBram Moolenaar 'exe# something', 18754a8d9f2eSBram Moolenaar ], 'E121:') 18764a8d9f2eSBram Moolenaar CheckScriptFailure([ 18774a8d9f2eSBram Moolenaar 'exe "echo" # something', 18784a8d9f2eSBram Moolenaar ], 'E121:') 18794a8d9f2eSBram Moolenaar 18807a092245SBram Moolenaar CheckDefFailure([ 18817a092245SBram Moolenaar 'try# comment', 18827a092245SBram Moolenaar ' echo "yes"', 18837a092245SBram Moolenaar 'catch', 18847a092245SBram Moolenaar 'endtry', 18857a092245SBram Moolenaar ], 'E488:') 18862c5ed4e3SBram Moolenaar CheckScriptFailure([ 18872c5ed4e3SBram Moolenaar 'vim9script', 18882c5ed4e3SBram Moolenaar 'try# comment', 18892c5ed4e3SBram Moolenaar 'echo "yes"', 18902c5ed4e3SBram Moolenaar ], 'E488:') 18917a092245SBram Moolenaar CheckDefFailure([ 18927a092245SBram Moolenaar 'try', 1893a72cfb80SBram Moolenaar ' throw#comment', 1894a72cfb80SBram Moolenaar 'catch', 1895a72cfb80SBram Moolenaar 'endtry', 1896a72cfb80SBram Moolenaar ], 'E1015:') 1897a72cfb80SBram Moolenaar CheckDefFailure([ 1898a72cfb80SBram Moolenaar 'try', 1899a72cfb80SBram Moolenaar ' throw "yes"#comment', 1900a72cfb80SBram Moolenaar 'catch', 1901a72cfb80SBram Moolenaar 'endtry', 1902a72cfb80SBram Moolenaar ], 'E488:') 1903a72cfb80SBram Moolenaar CheckDefFailure([ 1904a72cfb80SBram Moolenaar 'try', 19057a092245SBram Moolenaar ' echo "yes"', 19067a092245SBram Moolenaar 'catch# comment', 19077a092245SBram Moolenaar 'endtry', 19087a092245SBram Moolenaar ], 'E488:') 19092c5ed4e3SBram Moolenaar CheckScriptFailure([ 19102c5ed4e3SBram Moolenaar 'vim9script', 19112c5ed4e3SBram Moolenaar 'try', 19122c5ed4e3SBram Moolenaar ' echo "yes"', 19132c5ed4e3SBram Moolenaar 'catch# comment', 19142c5ed4e3SBram Moolenaar 'endtry', 19152c5ed4e3SBram Moolenaar ], 'E654:') 19162c5ed4e3SBram Moolenaar CheckDefFailure([ 19172c5ed4e3SBram Moolenaar 'try', 19182c5ed4e3SBram Moolenaar ' echo "yes"', 19192c5ed4e3SBram Moolenaar 'catch /pat/# comment', 19202c5ed4e3SBram Moolenaar 'endtry', 19212c5ed4e3SBram Moolenaar ], 'E488:') 19227a092245SBram Moolenaar CheckDefFailure([ 19237a092245SBram Moolenaar 'try', 19247a092245SBram Moolenaar 'echo "yes"', 19257a092245SBram Moolenaar 'catch', 19267a092245SBram Moolenaar 'endtry# comment', 19277a092245SBram Moolenaar ], 'E488:') 19282c5ed4e3SBram Moolenaar CheckScriptFailure([ 19292c5ed4e3SBram Moolenaar 'vim9script', 19302c5ed4e3SBram Moolenaar 'try', 19312c5ed4e3SBram Moolenaar ' echo "yes"', 19322c5ed4e3SBram Moolenaar 'catch', 19332c5ed4e3SBram Moolenaar 'endtry# comment', 19349b7bf9e9SBram Moolenaar ], 'E488:') 19352c5ed4e3SBram Moolenaar 19362c5ed4e3SBram Moolenaar CheckScriptSuccess([ 19372c5ed4e3SBram Moolenaar 'vim9script', 19382c5ed4e3SBram Moolenaar 'hi # comment', 19392c5ed4e3SBram Moolenaar ]) 19402c5ed4e3SBram Moolenaar CheckScriptFailure([ 19412c5ed4e3SBram Moolenaar 'vim9script', 19422c5ed4e3SBram Moolenaar 'hi# comment', 19432c5ed4e3SBram Moolenaar ], 'E416:') 19441966c248SBram Moolenaar CheckScriptSuccess([ 19451966c248SBram Moolenaar 'vim9script', 19461966c248SBram Moolenaar 'hi Search # comment', 19471966c248SBram Moolenaar ]) 19481966c248SBram Moolenaar CheckScriptFailure([ 19491966c248SBram Moolenaar 'vim9script', 19501966c248SBram Moolenaar 'hi Search# comment', 19511966c248SBram Moolenaar ], 'E416:') 19521966c248SBram Moolenaar CheckScriptSuccess([ 19531966c248SBram Moolenaar 'vim9script', 19541966c248SBram Moolenaar 'hi link This Search # comment', 19551966c248SBram Moolenaar ]) 19561966c248SBram Moolenaar CheckScriptFailure([ 19571966c248SBram Moolenaar 'vim9script', 19581966c248SBram Moolenaar 'hi link This That# comment', 19591966c248SBram Moolenaar ], 'E413:') 19601966c248SBram Moolenaar CheckScriptSuccess([ 19611966c248SBram Moolenaar 'vim9script', 19621966c248SBram Moolenaar 'hi clear This # comment', 19631966c248SBram Moolenaar 'hi clear # comment', 19641966c248SBram Moolenaar ]) 1965f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 1966f5be8cdbSBram Moolenaar # hi clear This# comment', 19671966c248SBram Moolenaar CheckScriptFailure([ 19681966c248SBram Moolenaar 'vim9script', 19691966c248SBram Moolenaar 'hi clear# comment', 19701966c248SBram Moolenaar ], 'E416:') 19711966c248SBram Moolenaar 19721966c248SBram Moolenaar CheckScriptSuccess([ 19731966c248SBram Moolenaar 'vim9script', 19741966c248SBram Moolenaar 'hi Group term=bold', 19751966c248SBram Moolenaar 'match Group /todo/ # comment', 19761966c248SBram Moolenaar ]) 19771966c248SBram Moolenaar CheckScriptFailure([ 19781966c248SBram Moolenaar 'vim9script', 19791966c248SBram Moolenaar 'hi Group term=bold', 19801966c248SBram Moolenaar 'match Group /todo/# comment', 19811966c248SBram Moolenaar ], 'E488:') 19821966c248SBram Moolenaar CheckScriptSuccess([ 19831966c248SBram Moolenaar 'vim9script', 19841966c248SBram Moolenaar 'match # comment', 19851966c248SBram Moolenaar ]) 19861966c248SBram Moolenaar CheckScriptFailure([ 19871966c248SBram Moolenaar 'vim9script', 19881966c248SBram Moolenaar 'match# comment', 19891966c248SBram Moolenaar ], 'E475:') 19901966c248SBram Moolenaar CheckScriptSuccess([ 19911966c248SBram Moolenaar 'vim9script', 19921966c248SBram Moolenaar 'match none # comment', 19931966c248SBram Moolenaar ]) 19941966c248SBram Moolenaar CheckScriptFailure([ 19951966c248SBram Moolenaar 'vim9script', 19961966c248SBram Moolenaar 'match none# comment', 19971966c248SBram Moolenaar ], 'E475:') 19981966c248SBram Moolenaar 19991966c248SBram Moolenaar CheckScriptSuccess([ 20001966c248SBram Moolenaar 'vim9script', 20011966c248SBram Moolenaar 'menutrans clear # comment', 20021966c248SBram Moolenaar ]) 20031966c248SBram Moolenaar CheckScriptFailure([ 20041966c248SBram Moolenaar 'vim9script', 20051966c248SBram Moolenaar 'menutrans clear# comment text', 20061966c248SBram Moolenaar ], 'E474:') 20071966c248SBram Moolenaar 20081966c248SBram Moolenaar CheckScriptSuccess([ 20091966c248SBram Moolenaar 'vim9script', 20101966c248SBram Moolenaar 'syntax clear # comment', 20111966c248SBram Moolenaar ]) 20121966c248SBram Moolenaar CheckScriptFailure([ 20131966c248SBram Moolenaar 'vim9script', 20141966c248SBram Moolenaar 'syntax clear# comment text', 20151966c248SBram Moolenaar ], 'E28:') 20161966c248SBram Moolenaar CheckScriptSuccess([ 20171966c248SBram Moolenaar 'vim9script', 20181966c248SBram Moolenaar 'syntax keyword Word some', 20191966c248SBram Moolenaar 'syntax clear Word # comment', 20201966c248SBram Moolenaar ]) 20211966c248SBram Moolenaar CheckScriptFailure([ 20221966c248SBram Moolenaar 'vim9script', 20231966c248SBram Moolenaar 'syntax keyword Word some', 20241966c248SBram Moolenaar 'syntax clear Word# comment text', 20251966c248SBram Moolenaar ], 'E28:') 20261966c248SBram Moolenaar 20271966c248SBram Moolenaar CheckScriptSuccess([ 20281966c248SBram Moolenaar 'vim9script', 20291966c248SBram Moolenaar 'syntax list # comment', 20301966c248SBram Moolenaar ]) 20311966c248SBram Moolenaar CheckScriptFailure([ 20321966c248SBram Moolenaar 'vim9script', 20331966c248SBram Moolenaar 'syntax list# comment text', 20341966c248SBram Moolenaar ], 'E28:') 20351966c248SBram Moolenaar 20361966c248SBram Moolenaar CheckScriptSuccess([ 20371966c248SBram Moolenaar 'vim9script', 20381966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 20391966c248SBram Moolenaar ]) 20401966c248SBram Moolenaar CheckScriptFailure([ 20411966c248SBram Moolenaar 'vim9script', 20421966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 20431966c248SBram Moolenaar ], 'E475:') 20441966c248SBram Moolenaar 20451966c248SBram Moolenaar CheckScriptSuccess([ 20461966c248SBram Moolenaar 'vim9script', 20471966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 20481966c248SBram Moolenaar ]) 20491966c248SBram Moolenaar CheckScriptFailure([ 20501966c248SBram Moolenaar 'vim9script', 20511966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 20521966c248SBram Moolenaar ], 'E789:') 20531966c248SBram Moolenaar 20541966c248SBram Moolenaar CheckScriptSuccess([ 20551966c248SBram Moolenaar 'vim9script', 20561966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 20571966c248SBram Moolenaar ]) 20581966c248SBram Moolenaar CheckScriptFailure([ 20591966c248SBram Moolenaar 'vim9script', 20601966c248SBram Moolenaar 'syntax match Word /pat/# comment', 20611966c248SBram Moolenaar ], 'E402:') 20621966c248SBram Moolenaar 20631966c248SBram Moolenaar CheckScriptSuccess([ 20641966c248SBram Moolenaar 'vim9script', 20651966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 20661966c248SBram Moolenaar ]) 20671966c248SBram Moolenaar CheckScriptFailure([ 20681966c248SBram Moolenaar 'vim9script', 20691966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 20701966c248SBram Moolenaar ], 'E475:') 20711966c248SBram Moolenaar CheckScriptFailure([ 20721966c248SBram Moolenaar 'vim9script', 20731966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 20741966c248SBram Moolenaar ], 'E406:') 20751966c248SBram Moolenaar CheckScriptFailure([ 20761966c248SBram Moolenaar 'vim9script', 20771966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 20781966c248SBram Moolenaar ], 'E475:') 20791966c248SBram Moolenaar 20801966c248SBram Moolenaar CheckScriptSuccess([ 20811966c248SBram Moolenaar 'vim9script', 20821966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 20831966c248SBram Moolenaar ]) 20841966c248SBram Moolenaar CheckScriptFailure([ 20851966c248SBram Moolenaar 'vim9script', 20861966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2087*d032f34aSBram Moolenaar ], 'E402:') 20881966c248SBram Moolenaar 20891966c248SBram Moolenaar CheckScriptSuccess([ 20901966c248SBram Moolenaar 'vim9script', 20911966c248SBram Moolenaar 'syntax sync # comment', 20921966c248SBram Moolenaar ]) 20931966c248SBram Moolenaar CheckScriptFailure([ 20941966c248SBram Moolenaar 'vim9script', 20951966c248SBram Moolenaar 'syntax sync# comment', 20961966c248SBram Moolenaar ], 'E404:') 20971966c248SBram Moolenaar CheckScriptSuccess([ 20981966c248SBram Moolenaar 'vim9script', 20991966c248SBram Moolenaar 'syntax sync ccomment # comment', 21001966c248SBram Moolenaar ]) 21011966c248SBram Moolenaar CheckScriptFailure([ 21021966c248SBram Moolenaar 'vim9script', 21031966c248SBram Moolenaar 'syntax sync ccomment# comment', 21041966c248SBram Moolenaar ], 'E404:') 21051966c248SBram Moolenaar 21061966c248SBram Moolenaar CheckScriptSuccess([ 21071966c248SBram Moolenaar 'vim9script', 21081966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 21091966c248SBram Moolenaar ]) 21101966c248SBram Moolenaar CheckScriptFailure([ 21111966c248SBram Moolenaar 'vim9script', 21121966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 21131966c248SBram Moolenaar ], 'E475:') 2114a72cfb80SBram Moolenaar 2115a72cfb80SBram Moolenaar CheckScriptSuccess([ 2116a72cfb80SBram Moolenaar 'vim9script', 2117a72cfb80SBram Moolenaar 'command Echo echo # comment', 2118a72cfb80SBram Moolenaar 'command Echo # comment', 2119a72cfb80SBram Moolenaar ]) 2120a72cfb80SBram Moolenaar CheckScriptFailure([ 2121a72cfb80SBram Moolenaar 'vim9script', 2122a72cfb80SBram Moolenaar 'command Echo echo# comment', 2123a72cfb80SBram Moolenaar 'Echo', 2124a72cfb80SBram Moolenaar ], 'E121:') 2125a72cfb80SBram Moolenaar CheckScriptFailure([ 2126a72cfb80SBram Moolenaar 'vim9script', 2127a72cfb80SBram Moolenaar 'command Echo# comment', 2128a72cfb80SBram Moolenaar ], 'E182:') 2129a72cfb80SBram Moolenaar CheckScriptFailure([ 2130a72cfb80SBram Moolenaar 'vim9script', 2131a72cfb80SBram Moolenaar 'command Echo echo', 2132a72cfb80SBram Moolenaar 'command Echo# comment', 2133a72cfb80SBram Moolenaar ], 'E182:') 2134a72cfb80SBram Moolenaar 2135a72cfb80SBram Moolenaar CheckScriptSuccess([ 2136a72cfb80SBram Moolenaar 'vim9script', 2137a72cfb80SBram Moolenaar 'function # comment', 2138a72cfb80SBram Moolenaar ]) 2139a72cfb80SBram Moolenaar CheckScriptFailure([ 2140a72cfb80SBram Moolenaar 'vim9script', 2141a72cfb80SBram Moolenaar 'function# comment', 2142a72cfb80SBram Moolenaar ], 'E129:') 2143a72cfb80SBram Moolenaar CheckScriptSuccess([ 2144a72cfb80SBram Moolenaar 'vim9script', 2145a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2146a72cfb80SBram Moolenaar ]) 2147a72cfb80SBram Moolenaar CheckScriptFailure([ 2148a72cfb80SBram Moolenaar 'vim9script', 2149a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2150a72cfb80SBram Moolenaar ], 'E488:') 2151a72cfb80SBram Moolenaar 2152a72cfb80SBram Moolenaar CheckScriptSuccess([ 2153a72cfb80SBram Moolenaar 'vim9script', 21544c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2155a72cfb80SBram Moolenaar 'endfunc', 21564c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2157a72cfb80SBram Moolenaar ]) 2158a72cfb80SBram Moolenaar CheckScriptFailure([ 2159a72cfb80SBram Moolenaar 'vim9script', 21604c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2161a72cfb80SBram Moolenaar 'endfunc', 21624c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2163a72cfb80SBram Moolenaar ], 'E488:') 2164a72cfb80SBram Moolenaar 2165a72cfb80SBram Moolenaar CheckScriptSuccess([ 2166a72cfb80SBram Moolenaar 'vim9script', 2167a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2168a72cfb80SBram Moolenaar ]) 2169a72cfb80SBram Moolenaar CheckScriptFailure([ 2170a72cfb80SBram Moolenaar 'vim9script', 2171a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2172a72cfb80SBram Moolenaar ], 'E488:') 21732c5ed4e3SBram Moolenaarenddef 21742c5ed4e3SBram Moolenaar 21752c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 21762c5ed4e3SBram Moolenaar CheckCanRunGui 21772c5ed4e3SBram Moolenaar 21782c5ed4e3SBram Moolenaar CheckScriptFailure([ 21792c5ed4e3SBram Moolenaar 'vim9script', 21802c5ed4e3SBram Moolenaar 'gui#comment' 21812c5ed4e3SBram Moolenaar ], 'E499:') 21822c5ed4e3SBram Moolenaar CheckScriptFailure([ 21832c5ed4e3SBram Moolenaar 'vim9script', 21842c5ed4e3SBram Moolenaar 'gui -f#comment' 21852c5ed4e3SBram Moolenaar ], 'E499:') 21867a092245SBram Moolenaarenddef 21877a092245SBram Moolenaar 2188a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 21896797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 21906797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2191a26b9700SBram Moolenaar 2192a26b9700SBram Moolenaar edit test.vim 2193a26b9700SBram Moolenaar doautocmd TabEnter #comment 2194a26b9700SBram Moolenaar assert_equal(1, g:entered) 2195a26b9700SBram Moolenaar 2196a26b9700SBram Moolenaar doautocmd TabEnter f.x 2197a26b9700SBram Moolenaar assert_equal(2, g:entered) 2198a26b9700SBram Moolenaar 2199a26b9700SBram Moolenaar g:entered = 0 2200a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2201a26b9700SBram Moolenaar assert_equal(2, g:entered) 2202a26b9700SBram Moolenaar 2203a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2204a26b9700SBram Moolenaar 2205a26b9700SBram Moolenaar au! TabEnter 2206a26b9700SBram Moolenaar unlet g:entered 2207d72c1bf0SBram Moolenaar 2208d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2209d72c1bf0SBram Moolenaar 'vim9script', 22106797966dSBram Moolenaar 'g:var = 123', 2211e55b1c09SBram Moolenaar 'b:var = 456', 2212e55b1c09SBram Moolenaar 'w:var = 777', 2213e55b1c09SBram Moolenaar 't:var = 888', 2214d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2215d72c1bf0SBram Moolenaar ]) 2216d72c1bf0SBram Moolenaar 2217d72c1bf0SBram Moolenaar CheckScriptFailure([ 2218d72c1bf0SBram Moolenaar 'vim9script', 2219d72c1bf0SBram Moolenaar 'let g:var = 123', 2220e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2221e55b1c09SBram Moolenaar 2222e55b1c09SBram Moolenaar CheckScriptFailure([ 2223e55b1c09SBram Moolenaar 'vim9script', 2224e55b1c09SBram Moolenaar 'let b:var = 123', 2225e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2226e55b1c09SBram Moolenaar 2227e55b1c09SBram Moolenaar CheckScriptFailure([ 2228e55b1c09SBram Moolenaar 'vim9script', 2229e55b1c09SBram Moolenaar 'let w:var = 123', 2230e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2231e55b1c09SBram Moolenaar 2232e55b1c09SBram Moolenaar CheckScriptFailure([ 2233e55b1c09SBram Moolenaar 'vim9script', 2234e55b1c09SBram Moolenaar 'let t:var = 123', 2235e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2236e55b1c09SBram Moolenaar 2237e55b1c09SBram Moolenaar CheckScriptFailure([ 2238e55b1c09SBram Moolenaar 'vim9script', 2239e55b1c09SBram Moolenaar 'let v:version = 123', 2240e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2241e55b1c09SBram Moolenaar 2242e55b1c09SBram Moolenaar CheckScriptFailure([ 2243e55b1c09SBram Moolenaar 'vim9script', 2244e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2245e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 22466797966dSBram Moolenaar 22476797966dSBram Moolenaar CheckScriptFailure([ 22486797966dSBram Moolenaar 'vim9script', 22496797966dSBram Moolenaar 'g:var = 123', 225032e35117SBram Moolenaar 'unlet g:var# comment1', 2251d72c1bf0SBram Moolenaar ], 'E108:') 2252d72c1bf0SBram Moolenaar 2253d72c1bf0SBram Moolenaar CheckScriptFailure([ 2254d72c1bf0SBram Moolenaar 'let g:var = 123', 2255d72c1bf0SBram Moolenaar 'unlet g:var # something', 2256d72c1bf0SBram Moolenaar ], 'E488:') 2257faac4104SBram Moolenaar 2258faac4104SBram Moolenaar CheckScriptSuccess([ 2259faac4104SBram Moolenaar 'vim9script', 226032e35117SBram Moolenaar 'if 1 # comment2', 2261faac4104SBram Moolenaar ' echo "yes"', 2262faac4104SBram Moolenaar 'elseif 2 #comment', 2263faac4104SBram Moolenaar ' echo "no"', 2264faac4104SBram Moolenaar 'endif', 2265faac4104SBram Moolenaar ]) 2266faac4104SBram Moolenaar 2267faac4104SBram Moolenaar CheckScriptFailure([ 2268faac4104SBram Moolenaar 'vim9script', 226932e35117SBram Moolenaar 'if 1# comment3', 2270faac4104SBram Moolenaar ' echo "yes"', 2271faac4104SBram Moolenaar 'endif', 2272faac4104SBram Moolenaar ], 'E15:') 2273faac4104SBram Moolenaar 2274faac4104SBram Moolenaar CheckScriptFailure([ 2275faac4104SBram Moolenaar 'vim9script', 227632e35117SBram Moolenaar 'if 0 # comment4', 2277faac4104SBram Moolenaar ' echo "yes"', 2278faac4104SBram Moolenaar 'elseif 2#comment', 2279faac4104SBram Moolenaar ' echo "no"', 2280faac4104SBram Moolenaar 'endif', 2281faac4104SBram Moolenaar ], 'E15:') 2282faac4104SBram Moolenaar 2283faac4104SBram Moolenaar CheckScriptSuccess([ 2284faac4104SBram Moolenaar 'vim9script', 228532e35117SBram Moolenaar 'let v = 1 # comment5', 2286faac4104SBram Moolenaar ]) 2287faac4104SBram Moolenaar 2288faac4104SBram Moolenaar CheckScriptFailure([ 2289faac4104SBram Moolenaar 'vim9script', 229032e35117SBram Moolenaar 'let v = 1# comment6', 229132e35117SBram Moolenaar ], 'E15:') 2292faac4104SBram Moolenaar 2293faac4104SBram Moolenaar CheckScriptSuccess([ 2294faac4104SBram Moolenaar 'vim9script', 2295faac4104SBram Moolenaar 'new' 2296faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2297df069eecSBram Moolenaar ':$', 2298faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2299faac4104SBram Moolenaar 'bwipe!', 2300faac4104SBram Moolenaar ]) 2301faac4104SBram Moolenaar 2302f5be8cdbSBram Moolenaar CheckScriptFailure([ 2303f5be8cdbSBram Moolenaar 'vim9script', 2304f5be8cdbSBram Moolenaar 'new' 2305f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2306f5be8cdbSBram Moolenaar ':$', 2307f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2308f5be8cdbSBram Moolenaar 'bwipe!', 2309f5be8cdbSBram Moolenaar ], 'E488:') 2310f5be8cdbSBram Moolenaar 2311f5be8cdbSBram Moolenaar CheckScriptFailure([ 2312f5be8cdbSBram Moolenaar 'vim9script', 2313f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2314f5be8cdbSBram Moolenaar ], 'E477:') 2315a26b9700SBram Moolenaarenddef 2316a26b9700SBram Moolenaar 23177e5bd91dSBram Moolenaardef Test_finish() 23187e5bd91dSBram Moolenaar let lines =<< trim END 23197e5bd91dSBram Moolenaar vim9script 23206797966dSBram Moolenaar g:res = 'one' 23217e5bd91dSBram Moolenaar if v:false | finish | endif 23226797966dSBram Moolenaar g:res = 'two' 23237e5bd91dSBram Moolenaar finish 23246797966dSBram Moolenaar g:res = 'three' 23257e5bd91dSBram Moolenaar END 23267e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 23277e5bd91dSBram Moolenaar source Xfinished 23287e5bd91dSBram Moolenaar assert_equal('two', g:res) 23297e5bd91dSBram Moolenaar 23307e5bd91dSBram Moolenaar unlet g:res 23317e5bd91dSBram Moolenaar delete('Xfinished') 23327e5bd91dSBram Moolenaarenddef 23337e5bd91dSBram Moolenaar 233432e35117SBram Moolenaardef Test_let_func_call() 233532e35117SBram Moolenaar let lines =<< trim END 233632e35117SBram Moolenaar vim9script 233732e35117SBram Moolenaar func GetValue() 233832e35117SBram Moolenaar if exists('g:count') 233932e35117SBram Moolenaar let g:count += 1 234032e35117SBram Moolenaar else 234132e35117SBram Moolenaar let g:count = 1 234232e35117SBram Moolenaar endif 234332e35117SBram Moolenaar return 'this' 234432e35117SBram Moolenaar endfunc 234532e35117SBram Moolenaar let val: string = GetValue() 2346f5be8cdbSBram Moolenaar # env var is always a string 2347df671b46SBram Moolenaar let env = $TERM 234832e35117SBram Moolenaar END 234932e35117SBram Moolenaar writefile(lines, 'Xfinished') 235032e35117SBram Moolenaar source Xfinished 2351f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 235232e35117SBram Moolenaar assert_equal(1, g:count) 235332e35117SBram Moolenaar 235432e35117SBram Moolenaar unlet g:count 235532e35117SBram Moolenaar delete('Xfinished') 235632e35117SBram Moolenaarenddef 235732e35117SBram Moolenaar 235832e35117SBram Moolenaardef Test_let_missing_type() 235932e35117SBram Moolenaar let lines =<< trim END 236032e35117SBram Moolenaar vim9script 2361df671b46SBram Moolenaar let var = g:unknown 2362227a69deSBram Moolenaar END 2363822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2364227a69deSBram Moolenaar 2365227a69deSBram Moolenaar lines =<< trim END 2366227a69deSBram Moolenaar vim9script 2367227a69deSBram Moolenaar let nr: number = 123 2368227a69deSBram Moolenaar let var = nr 2369227a69deSBram Moolenaar END 2370822ba247SBram Moolenaar CheckScriptSuccess(lines) 237132e35117SBram Moolenaarenddef 237232e35117SBram Moolenaar 2373c82a5b5dSBram Moolenaardef Test_let_declaration() 2374c82a5b5dSBram Moolenaar let lines =<< trim END 2375c82a5b5dSBram Moolenaar vim9script 2376c82a5b5dSBram Moolenaar let var: string 2377c82a5b5dSBram Moolenaar g:var_uninit = var 2378c82a5b5dSBram Moolenaar var = 'text' 2379c82a5b5dSBram Moolenaar g:var_test = var 2380f5be8cdbSBram Moolenaar # prefixing s: is optional 2381984dddbeSBram Moolenaar s:var = 'prefixed' 2382984dddbeSBram Moolenaar g:var_prefixed = s:var 2383984dddbeSBram Moolenaar 2384984dddbeSBram Moolenaar let s:other: number 2385984dddbeSBram Moolenaar other = 1234 2386984dddbeSBram Moolenaar g:other_var = other 2387c82a5b5dSBram Moolenaar END 2388c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2389c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2390c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2391984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2392984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2393c82a5b5dSBram Moolenaar 2394c82a5b5dSBram Moolenaar unlet g:var_uninit 2395c82a5b5dSBram Moolenaar unlet g:var_test 2396984dddbeSBram Moolenaar unlet g:var_prefixed 2397984dddbeSBram Moolenaar unlet g:other_var 2398c82a5b5dSBram Moolenaarenddef 2399c82a5b5dSBram Moolenaar 2400c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2401c5b1c20bSBram Moolenaar let lines =<< trim END 2402c5b1c20bSBram Moolenaar vim9script 2403c5b1c20bSBram Moolenaar const var: string 2404c5b1c20bSBram Moolenaar END 2405c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2406c5b1c20bSBram Moolenaar 2407c5b1c20bSBram Moolenaar lines =<< trim END 2408c5b1c20bSBram Moolenaar vim9script 2409c5b1c20bSBram Moolenaar let 9var: string 2410c5b1c20bSBram Moolenaar END 2411c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2412c5b1c20bSBram Moolenaarenddef 2413c5b1c20bSBram Moolenaar 241434db91f7SBram Moolenaardef Test_let_type_check() 241534db91f7SBram Moolenaar let lines =<< trim END 241634db91f7SBram Moolenaar vim9script 241734db91f7SBram Moolenaar let var: string 241834db91f7SBram Moolenaar var = 1234 241934db91f7SBram Moolenaar END 242034db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2421984dddbeSBram Moolenaar 2422984dddbeSBram Moolenaar lines =<< trim END 2423984dddbeSBram Moolenaar vim9script 2424984dddbeSBram Moolenaar let var:string 2425984dddbeSBram Moolenaar END 2426984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2427c5b1c20bSBram Moolenaar 2428c5b1c20bSBram Moolenaar lines =<< trim END 2429c5b1c20bSBram Moolenaar vim9script 2430c5b1c20bSBram Moolenaar let var: asdf 2431c5b1c20bSBram Moolenaar END 2432c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 243334db91f7SBram Moolenaarenddef 243434db91f7SBram Moolenaar 2435a5d0077eSBram Moolenaardef Test_forward_declaration() 2436a5d0077eSBram Moolenaar let lines =<< trim END 2437a5d0077eSBram Moolenaar vim9script 2438a5d0077eSBram Moolenaar def GetValue(): string 2439a5d0077eSBram Moolenaar return theVal 2440a5d0077eSBram Moolenaar enddef 2441a5d0077eSBram Moolenaar let theVal = 'something' 2442822ba247SBram Moolenaar g:initVal = GetValue() 2443a5d0077eSBram Moolenaar theVal = 'else' 2444a5d0077eSBram Moolenaar g:laterVal = GetValue() 2445a5d0077eSBram Moolenaar END 2446a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2447a5d0077eSBram Moolenaar source Xforward 2448a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2449a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2450a5d0077eSBram Moolenaar 2451a5d0077eSBram Moolenaar unlet g:initVal 2452a5d0077eSBram Moolenaar unlet g:laterVal 2453a5d0077eSBram Moolenaar delete('Xforward') 2454a5d0077eSBram Moolenaarenddef 2455a5d0077eSBram Moolenaar 24569721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 24579721fb4eSBram Moolenaar let legacy_lines =<< trim END 24589721fb4eSBram Moolenaar source Xvim9_script.vim 24599721fb4eSBram Moolenaar 24609721fb4eSBram Moolenaar call assert_false(exists('local')) 24619721fb4eSBram Moolenaar call assert_false(exists('exported')) 24629721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 24639721fb4eSBram Moolenaar call assert_equal('global', global) 24649721fb4eSBram Moolenaar call assert_equal('global', g:global) 24659721fb4eSBram Moolenaar 24669721fb4eSBram Moolenaar " imported variable becomes script-local 24679721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 24689721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 24699721fb4eSBram Moolenaar call assert_false(exists('exported')) 24709721fb4eSBram Moolenaar 24719721fb4eSBram Moolenaar " imported function becomes script-local 24729721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 24739721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 24749721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 24759721fb4eSBram Moolenaar END 24769721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 24779721fb4eSBram Moolenaar 24789721fb4eSBram Moolenaar let vim9_lines =<< trim END 24799721fb4eSBram Moolenaar vim9script 24809721fb4eSBram Moolenaar let local = 'local' 24819721fb4eSBram Moolenaar g:global = 'global' 24829721fb4eSBram Moolenaar export let exported = 'exported' 24839721fb4eSBram Moolenaar export def GetText(): string 24849721fb4eSBram Moolenaar return 'text' 24859721fb4eSBram Moolenaar enddef 24869721fb4eSBram Moolenaar END 24879721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 24889721fb4eSBram Moolenaar 24899721fb4eSBram Moolenaar source Xlegacy_script.vim 24909721fb4eSBram Moolenaar 24919721fb4eSBram Moolenaar assert_equal('global', g:global) 2492f5be8cdbSBram Moolenaar unlet g:global 24939721fb4eSBram Moolenaar 24949721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 24959721fb4eSBram Moolenaar delete('Xvim9_script.vim') 24969721fb4eSBram Moolenaarenddef 2497a5d0077eSBram Moolenaar 2498eeb27bfeSBram Moolenaardef Test_vim9_copen() 2499eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2500eeb27bfeSBram Moolenaar copen 2501eeb27bfeSBram Moolenaar quit 2502eeb27bfeSBram Moolenaarenddef 2503eeb27bfeSBram Moolenaar 2504585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2505585fea7bSBram Moolenaardef Test_substitute_cmd() 2506585fea7bSBram Moolenaar new 2507585fea7bSBram Moolenaar setline(1, 'something') 2508585fea7bSBram Moolenaar :substitute(some(other( 2509585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2510585fea7bSBram Moolenaar bwipe! 2511585fea7bSBram Moolenaar 2512f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2513585fea7bSBram Moolenaar let lines =<< trim END 2514585fea7bSBram Moolenaar vim9script 2515585fea7bSBram Moolenaar new 2516585fea7bSBram Moolenaar setline(1, 'something') 2517585fea7bSBram Moolenaar :substitute(some(other( 2518585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2519585fea7bSBram Moolenaar bwipe! 2520585fea7bSBram Moolenaar END 2521585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2522585fea7bSBram Moolenaar source Xvim9lines 2523585fea7bSBram Moolenaar 2524585fea7bSBram Moolenaar delete('Xvim9lines') 2525585fea7bSBram Moolenaarenddef 2526585fea7bSBram Moolenaar 25278a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2528