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 5018a7d6542SBram Moolenaardef Test_try_catch() 5028a7d6542SBram Moolenaar let l = [] 5037a092245SBram Moolenaar try # comment 5048a7d6542SBram Moolenaar add(l, '1') 5058a7d6542SBram Moolenaar throw 'wrong' 5068a7d6542SBram Moolenaar add(l, '2') 5077a092245SBram Moolenaar catch # comment 5088a7d6542SBram Moolenaar add(l, v:exception) 5097a092245SBram Moolenaar finally # comment 5108a7d6542SBram Moolenaar add(l, '3') 5117a092245SBram Moolenaar endtry # comment 5128a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 51368d130c6SBram Moolenaar 514*e859312eSBram Moolenaar l = [] 515*e859312eSBram Moolenaar try 516*e859312eSBram Moolenaar try 517*e859312eSBram Moolenaar add(l, '1') 518*e859312eSBram Moolenaar throw 'wrong' 519*e859312eSBram Moolenaar add(l, '2') 520*e859312eSBram Moolenaar catch /right/ 521*e859312eSBram Moolenaar add(l, v:exception) 522*e859312eSBram Moolenaar endtry 523*e859312eSBram Moolenaar catch /wrong/ 524*e859312eSBram Moolenaar add(l, 'caught') 525*e859312eSBram Moolenaar finally 526*e859312eSBram Moolenaar add(l, 'finally') 527*e859312eSBram Moolenaar endtry 528*e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 529*e859312eSBram Moolenaar 53068d130c6SBram Moolenaar let n: number 53168d130c6SBram Moolenaar try 53268d130c6SBram Moolenaar n = l[3] 53368d130c6SBram Moolenaar catch /E684:/ 53468d130c6SBram Moolenaar n = 99 53568d130c6SBram Moolenaar endtry 53668d130c6SBram Moolenaar assert_equal(99, n) 53768d130c6SBram Moolenaar 53868d130c6SBram Moolenaar try 53968d130c6SBram Moolenaar n = g:astring[3] 54068d130c6SBram Moolenaar catch /E714:/ 54168d130c6SBram Moolenaar n = 77 54268d130c6SBram Moolenaar endtry 54368d130c6SBram Moolenaar assert_equal(77, n) 54468d130c6SBram Moolenaar 54568d130c6SBram Moolenaar try 54668d130c6SBram Moolenaar n = l[g:astring] 54768d130c6SBram Moolenaar catch /E39:/ 54868d130c6SBram Moolenaar n = 77 54968d130c6SBram Moolenaar endtry 55068d130c6SBram Moolenaar assert_equal(77, n) 55168d130c6SBram Moolenaar 55268d130c6SBram Moolenaar try 55368d130c6SBram Moolenaar n = s:does_not_exist 55468d130c6SBram Moolenaar catch /E121:/ 555f0b9f43cSBram Moolenaar n = 111 556f0b9f43cSBram Moolenaar endtry 557f0b9f43cSBram Moolenaar assert_equal(111, n) 558f0b9f43cSBram Moolenaar 559f0b9f43cSBram Moolenaar try 560f0b9f43cSBram Moolenaar n = g:does_not_exist 561f0b9f43cSBram Moolenaar catch /E121:/ 56268d130c6SBram Moolenaar n = 121 56368d130c6SBram Moolenaar endtry 56468d130c6SBram Moolenaar assert_equal(121, n) 56568d130c6SBram Moolenaar 56668d130c6SBram Moolenaar let d = #{one: 1} 56768d130c6SBram Moolenaar try 56868d130c6SBram Moolenaar n = d[g:astring] 56968d130c6SBram Moolenaar catch /E716:/ 57068d130c6SBram Moolenaar n = 222 57168d130c6SBram Moolenaar endtry 57268d130c6SBram Moolenaar assert_equal(222, n) 573f0b9f43cSBram Moolenaar 574f0b9f43cSBram Moolenaar try 575f0b9f43cSBram Moolenaar n = -g:astring 576f0b9f43cSBram Moolenaar catch /E39:/ 577f0b9f43cSBram Moolenaar n = 233 578f0b9f43cSBram Moolenaar endtry 579f0b9f43cSBram Moolenaar assert_equal(233, n) 580f0b9f43cSBram Moolenaar 581f0b9f43cSBram Moolenaar try 582f0b9f43cSBram Moolenaar n = +g:astring 583f0b9f43cSBram Moolenaar catch /E1030:/ 584f0b9f43cSBram Moolenaar n = 244 585f0b9f43cSBram Moolenaar endtry 586f0b9f43cSBram Moolenaar assert_equal(244, n) 587f0b9f43cSBram Moolenaar 588f0b9f43cSBram Moolenaar try 589f0b9f43cSBram Moolenaar n = +g:alist 590f0b9f43cSBram Moolenaar catch /E745:/ 591f0b9f43cSBram Moolenaar n = 255 592f0b9f43cSBram Moolenaar endtry 593f0b9f43cSBram Moolenaar assert_equal(255, n) 594f0b9f43cSBram Moolenaar 595f0b9f43cSBram Moolenaar let nd: dict<any> 596f0b9f43cSBram Moolenaar try 597f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 598f0b9f43cSBram Moolenaar catch /E1029:/ 599f0b9f43cSBram Moolenaar n = 266 600f0b9f43cSBram Moolenaar endtry 601f0b9f43cSBram Moolenaar assert_equal(266, n) 602f0b9f43cSBram Moolenaar 603f0b9f43cSBram Moolenaar try 604f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 605f0b9f43cSBram Moolenaar catch /E1093:/ 606f0b9f43cSBram Moolenaar n = 277 607f0b9f43cSBram Moolenaar endtry 608f0b9f43cSBram Moolenaar assert_equal(277, n) 609f0b9f43cSBram Moolenaar 610*e859312eSBram Moolenaar try 611*e859312eSBram Moolenaar &ts = g:astring 612*e859312eSBram Moolenaar catch /E1029:/ 613*e859312eSBram Moolenaar n = 288 614*e859312eSBram Moolenaar endtry 615*e859312eSBram Moolenaar assert_equal(288, n) 616*e859312eSBram Moolenaar 617*e859312eSBram Moolenaar try 618*e859312eSBram Moolenaar &backspace = 'asdf' 619*e859312eSBram Moolenaar catch /E474:/ 620*e859312eSBram Moolenaar n = 299 621*e859312eSBram Moolenaar endtry 622*e859312eSBram Moolenaar assert_equal(299, n) 623*e859312eSBram Moolenaar 624*e859312eSBram Moolenaar l = [1] 625*e859312eSBram Moolenaar try 626*e859312eSBram Moolenaar l[3] = 3 627*e859312eSBram Moolenaar catch /E684:/ 628*e859312eSBram Moolenaar n = 300 629*e859312eSBram Moolenaar endtry 630*e859312eSBram Moolenaar assert_equal(300, n) 631*e859312eSBram Moolenaar 632*e859312eSBram Moolenaar try 633*e859312eSBram Moolenaar d[''] = 3 634*e859312eSBram Moolenaar catch /E713:/ 635*e859312eSBram Moolenaar n = 311 636*e859312eSBram Moolenaar endtry 637*e859312eSBram Moolenaar assert_equal(311, n) 638*e859312eSBram Moolenaar 639*e859312eSBram Moolenaar try 640*e859312eSBram Moolenaar unlet g:does_not_exist 641*e859312eSBram Moolenaar catch /E108:/ 642*e859312eSBram Moolenaar n = 322 643*e859312eSBram Moolenaar endtry 644*e859312eSBram Moolenaar assert_equal(322, n) 645*e859312eSBram Moolenaar 646*e859312eSBram Moolenaar try 647*e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 648*e859312eSBram Moolenaar catch /E721:/ 649*e859312eSBram Moolenaar n = 333 650*e859312eSBram Moolenaar endtry 651*e859312eSBram Moolenaar assert_equal(333, n) 652*e859312eSBram Moolenaar 653*e859312eSBram Moolenaar try 654*e859312eSBram Moolenaar l = DeletedFunc() 655*e859312eSBram Moolenaar catch /E933:/ 656*e859312eSBram Moolenaar n = 344 657*e859312eSBram Moolenaar endtry 658*e859312eSBram Moolenaar assert_equal(344, n) 6598a7d6542SBram Moolenaarenddef 6608a7d6542SBram Moolenaar 661*e859312eSBram Moolenaardef DeletedFunc(): list<any> 662*e859312eSBram Moolenaar return ['delete me'] 663*e859312eSBram Moolenaarenddef 664*e859312eSBram Moolenaardefcompile 665*e859312eSBram Moolenaardelfunc DeletedFunc 666*e859312eSBram Moolenaar 667257cc5eeSBram Moolenaardef ThrowFromDef() 668a72cfb80SBram Moolenaar throw "getout" # comment 669257cc5eeSBram Moolenaarenddef 670257cc5eeSBram Moolenaar 671257cc5eeSBram Moolenaarfunc CatchInFunc() 672257cc5eeSBram Moolenaar try 673257cc5eeSBram Moolenaar call ThrowFromDef() 674257cc5eeSBram Moolenaar catch 675257cc5eeSBram Moolenaar let g:thrown_func = v:exception 676257cc5eeSBram Moolenaar endtry 677257cc5eeSBram Moolenaarendfunc 678257cc5eeSBram Moolenaar 679257cc5eeSBram Moolenaardef CatchInDef() 680257cc5eeSBram Moolenaar try 681257cc5eeSBram Moolenaar ThrowFromDef() 682257cc5eeSBram Moolenaar catch 683257cc5eeSBram Moolenaar g:thrown_def = v:exception 684257cc5eeSBram Moolenaar endtry 685257cc5eeSBram Moolenaarenddef 686257cc5eeSBram Moolenaar 687f575adffSBram Moolenaardef ReturnFinally(): string 688f575adffSBram Moolenaar try 689f575adffSBram Moolenaar return 'intry' 690f575adffSBram Moolenaar finally 691f575adffSBram Moolenaar g:in_finally = 'finally' 692f575adffSBram Moolenaar endtry 693f575adffSBram Moolenaar return 'end' 694f575adffSBram Moolenaarenddef 695f575adffSBram Moolenaar 696257cc5eeSBram Moolenaardef Test_try_catch_nested() 697257cc5eeSBram Moolenaar CatchInFunc() 698257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 699257cc5eeSBram Moolenaar 700257cc5eeSBram Moolenaar CatchInDef() 701257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 702f575adffSBram Moolenaar 703f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 704f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 705f575adffSBram Moolenaarenddef 706f575adffSBram Moolenaar 707f575adffSBram Moolenaardef Test_try_catch_match() 708f575adffSBram Moolenaar let seq = 'a' 709f575adffSBram Moolenaar try 710f575adffSBram Moolenaar throw 'something' 711f575adffSBram Moolenaar catch /nothing/ 712f575adffSBram Moolenaar seq ..= 'x' 713f575adffSBram Moolenaar catch /some/ 714f575adffSBram Moolenaar seq ..= 'b' 715f575adffSBram Moolenaar catch /asdf/ 716f575adffSBram Moolenaar seq ..= 'x' 717e8c4abbbSBram Moolenaar catch ?a\?sdf? 718e8c4abbbSBram Moolenaar seq ..= 'y' 719f575adffSBram Moolenaar finally 720f575adffSBram Moolenaar seq ..= 'c' 721f575adffSBram Moolenaar endtry 722f575adffSBram Moolenaar assert_equal('abc', seq) 723257cc5eeSBram Moolenaarenddef 724257cc5eeSBram Moolenaar 725e8c4abbbSBram Moolenaardef Test_try_catch_fails() 726e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 727e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 728e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 729585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 730585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 731585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 732585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 733585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 734585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 735585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 736585fea7bSBram Moolenaar 737a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 738585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 739e8c4abbbSBram Moolenaarenddef 740e8c4abbbSBram Moolenaar 741006ad48bSBram Moolenaardef Test_throw_vimscript() 742f5be8cdbSBram Moolenaar # only checks line continuation 743006ad48bSBram Moolenaar let lines =<< trim END 744006ad48bSBram Moolenaar vim9script 745006ad48bSBram Moolenaar try 746006ad48bSBram Moolenaar throw 'one' 747006ad48bSBram Moolenaar .. 'two' 748006ad48bSBram Moolenaar catch 749006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 750006ad48bSBram Moolenaar endtry 751006ad48bSBram Moolenaar END 752006ad48bSBram Moolenaar CheckScriptSuccess(lines) 753006ad48bSBram Moolenaarenddef 754006ad48bSBram Moolenaar 75537c83711SBram Moolenaardef Test_cexpr_vimscript() 756f5be8cdbSBram Moolenaar # only checks line continuation 75737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 75837c83711SBram Moolenaar let lines =<< trim END 75937c83711SBram Moolenaar vim9script 76037c83711SBram Moolenaar cexpr 'File' 76137c83711SBram Moolenaar .. ' someFile' .. 76237c83711SBram Moolenaar ' line 19' 76337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 76437c83711SBram Moolenaar END 76537c83711SBram Moolenaar CheckScriptSuccess(lines) 76637c83711SBram Moolenaar set errorformat& 76737c83711SBram Moolenaarenddef 76837c83711SBram Moolenaar 7692a1381c3SBram Moolenaarif has('channel') 77040ee466cSBram Moolenaar let someJob = test_null_job() 77140ee466cSBram Moolenaar 77240ee466cSBram Moolenaar def FuncWithError() 77340ee466cSBram Moolenaar echomsg g:someJob 77440ee466cSBram Moolenaar enddef 77540ee466cSBram Moolenaar 77640ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 77740ee466cSBram Moolenaar try 77840ee466cSBram Moolenaar call FuncWithError() 77940ee466cSBram Moolenaar catch 78040ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 78140ee466cSBram Moolenaar endtry 78240ee466cSBram Moolenaar endfunc 7832a1381c3SBram Moolenaarendif 78440ee466cSBram Moolenaar 7858a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 7868a7d6542SBram Moolenaar vim9script 7878a7d6542SBram Moolenaar let name: string = 'bob' 7888a7d6542SBram Moolenaar def Concat(arg: string): string 7898a7d6542SBram Moolenaar return name .. arg 7908a7d6542SBram Moolenaar enddef 791227a69deSBram Moolenaar g:result = Concat('bie') 792227a69deSBram Moolenaar g:localname = name 7938a7d6542SBram Moolenaar 7948a7d6542SBram Moolenaar export const CONST = 1234 7958a7d6542SBram Moolenaar export let exported = 9876 7966e587dcbSBram Moolenaar export let exp_name = 'John' 7978a7d6542SBram Moolenaar export def Exported(): string 7988a7d6542SBram Moolenaar return 'Exported' 7998a7d6542SBram Moolenaar enddef 8008a7d6542SBram MoolenaarEND 8018a7d6542SBram Moolenaar 8025269bd2aSBram Moolenaardef Test_vim9_import_export() 8038a7d6542SBram Moolenaar let import_script_lines =<< trim END 8048a7d6542SBram Moolenaar vim9script 8058a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8068a7d6542SBram Moolenaar g:imported = exported 8076e587dcbSBram Moolenaar exported += 3 8086e587dcbSBram Moolenaar g:imported_added = exported 8098a7d6542SBram Moolenaar g:imported_func = Exported() 8106e587dcbSBram Moolenaar 8116e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8126e587dcbSBram Moolenaar g:imported_name = exp_name 8136e587dcbSBram Moolenaar exp_name ..= ' Doe' 8146e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8155381c7a1SBram Moolenaar g:imported_later = exported 8168a7d6542SBram Moolenaar END 8178a7d6542SBram Moolenaar 8188a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8198a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8208a7d6542SBram Moolenaar 8218a7d6542SBram Moolenaar source Ximport.vim 8228a7d6542SBram Moolenaar 8238a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8248a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8258a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8266e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8275381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8288a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 8296e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8306e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8318a7d6542SBram Moolenaar assert_false(exists('g:name')) 8328a7d6542SBram Moolenaar 8338a7d6542SBram Moolenaar unlet g:result 8348a7d6542SBram Moolenaar unlet g:localname 8358a7d6542SBram Moolenaar unlet g:imported 8366e587dcbSBram Moolenaar unlet g:imported_added 8375381c7a1SBram Moolenaar unlet g:imported_later 8388a7d6542SBram Moolenaar unlet g:imported_func 8396e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 8408a7d6542SBram Moolenaar delete('Ximport.vim') 841f2d5c240SBram Moolenaar 8421c991144SBram Moolenaar # similar, with line breaks 8431c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 8441c991144SBram Moolenaar vim9script 8451c991144SBram Moolenaar import { 8461c991144SBram Moolenaar exported, 8471c991144SBram Moolenaar Exported, 8481c991144SBram Moolenaar } 8491c991144SBram Moolenaar from 8501c991144SBram Moolenaar './Xexport.vim' 8511c991144SBram Moolenaar g:imported = exported 8521c991144SBram Moolenaar exported += 5 8531c991144SBram Moolenaar g:imported_added = exported 8541c991144SBram Moolenaar g:imported_func = Exported() 8551c991144SBram Moolenaar END 8561c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 8571c991144SBram Moolenaar source Ximport_lbr.vim 8581c991144SBram Moolenaar 8591c991144SBram Moolenaar assert_equal(9876, g:imported) 8601c991144SBram Moolenaar assert_equal(9881, g:imported_added) 8611c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 8621c991144SBram Moolenaar 8631c991144SBram Moolenaar # exported script not sourced again 8641c991144SBram Moolenaar assert_false(exists('g:result')) 8651c991144SBram Moolenaar unlet g:imported 8661c991144SBram Moolenaar unlet g:imported_added 8671c991144SBram Moolenaar unlet g:imported_func 8681c991144SBram Moolenaar delete('Ximport_lbr.vim') 8691c991144SBram Moolenaar 8701c991144SBram Moolenaar # import inside :def function 8715381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 8725381c7a1SBram Moolenaar vim9script 8735381c7a1SBram Moolenaar def ImportInDef() 8745381c7a1SBram Moolenaar import exported from './Xexport.vim' 8755381c7a1SBram Moolenaar g:imported = exported 8765381c7a1SBram Moolenaar exported += 7 8775381c7a1SBram Moolenaar g:imported_added = exported 8785381c7a1SBram Moolenaar enddef 8795381c7a1SBram Moolenaar ImportInDef() 8805381c7a1SBram Moolenaar END 8815381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8825381c7a1SBram Moolenaar source Ximport2.vim 883f5be8cdbSBram Moolenaar # TODO: this should be 9879 8845381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8855381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8865381c7a1SBram Moolenaar unlet g:imported 8875381c7a1SBram Moolenaar unlet g:imported_added 8885381c7a1SBram Moolenaar delete('Ximport2.vim') 8895381c7a1SBram Moolenaar 890f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 891f2d5c240SBram Moolenaar vim9script 892f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 893f2d5c240SBram Moolenaar def UseExport() 894f2d5c240SBram Moolenaar g:imported = Export.exported 895f2d5c240SBram Moolenaar enddef 896f2d5c240SBram Moolenaar UseExport() 897f2d5c240SBram Moolenaar END 898f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 899f2d5c240SBram Moolenaar source Ximport.vim 9005381c7a1SBram Moolenaar assert_equal(9883, g:imported) 901f2d5c240SBram Moolenaar 902599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 903599c89c8SBram Moolenaar vim9script 904599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 905599c89c8SBram Moolenaar def Func() 906599c89c8SBram Moolenaar let dummy = 1 907599c89c8SBram Moolenaar let imported = Export + dummy 908599c89c8SBram Moolenaar enddef 909822ba247SBram Moolenaar defcompile 910599c89c8SBram Moolenaar END 911599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 912599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 913599c89c8SBram Moolenaar 914599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 915599c89c8SBram Moolenaar vim9script 916599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 917599c89c8SBram Moolenaar def Func() 918599c89c8SBram Moolenaar let imported = Export . exported 919599c89c8SBram Moolenaar enddef 920822ba247SBram Moolenaar defcompile 921599c89c8SBram Moolenaar END 922599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 923599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 924599c89c8SBram Moolenaar 925599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 926599c89c8SBram Moolenaar vim9script 927599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 928599c89c8SBram Moolenaar def Func() 929599c89c8SBram Moolenaar let imported = Export. 930599c89c8SBram Moolenaar enddef 931822ba247SBram Moolenaar defcompile 932599c89c8SBram Moolenaar END 933599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 934599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 935599c89c8SBram Moolenaar 9361c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 9371c991144SBram Moolenaar vim9script 9381c991144SBram Moolenaar import * 9391c991144SBram Moolenaar as Export 9401c991144SBram Moolenaar from 9411c991144SBram Moolenaar './Xexport.vim' 9421c991144SBram Moolenaar def UseExport() 9431c991144SBram Moolenaar g:imported = Export.exported 9441c991144SBram Moolenaar enddef 9451c991144SBram Moolenaar UseExport() 9461c991144SBram Moolenaar END 9471c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 9481c991144SBram Moolenaar source Ximport.vim 9491c991144SBram Moolenaar assert_equal(9883, g:imported) 9501c991144SBram Moolenaar 951f2d5c240SBram Moolenaar let import_star_lines =<< trim END 952f2d5c240SBram Moolenaar vim9script 953f2d5c240SBram Moolenaar import * from './Xexport.vim' 954f2d5c240SBram Moolenaar END 955f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 956f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 957f2d5c240SBram Moolenaar 958f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 959fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 960fa29c8abSBram Moolenaar vim9script 961fa29c8abSBram Moolenaar import name from './Xexport.vim' 962fa29c8abSBram Moolenaar END 963fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 964fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 965fa29c8abSBram Moolenaar 966f5be8cdbSBram Moolenaar # try to import something that is already defined 9675269bd2aSBram Moolenaar let import_already_defined =<< trim END 9685269bd2aSBram Moolenaar vim9script 9695269bd2aSBram Moolenaar let exported = 'something' 9705269bd2aSBram Moolenaar import exported from './Xexport.vim' 9715269bd2aSBram Moolenaar END 9725269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 9735269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 9745269bd2aSBram Moolenaar 975f5be8cdbSBram Moolenaar # try to import something that is already defined 9765269bd2aSBram Moolenaar import_already_defined =<< trim END 9775269bd2aSBram Moolenaar vim9script 9785269bd2aSBram Moolenaar let exported = 'something' 9795269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9805269bd2aSBram Moolenaar END 9815269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 9825269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 9835269bd2aSBram Moolenaar 984f5be8cdbSBram Moolenaar # try to import something that is already defined 9855269bd2aSBram Moolenaar import_already_defined =<< trim END 9865269bd2aSBram Moolenaar vim9script 9875269bd2aSBram Moolenaar let exported = 'something' 9885269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9895269bd2aSBram Moolenaar END 9905269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 9915269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 9925269bd2aSBram Moolenaar 993f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 994fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 995fa29c8abSBram Moolenaar vim9script 996fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 997fa29c8abSBram Moolenaar END 998fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 999fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1000fa29c8abSBram Moolenaar 1001fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1002fa29c8abSBram Moolenaar vim9script 1003fa29c8abSBram Moolenaar import name './Xexport.vim' 1004fa29c8abSBram Moolenaar END 1005fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1006fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1007fa29c8abSBram Moolenaar 1008fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1009fa29c8abSBram Moolenaar vim9script 1010fa29c8abSBram Moolenaar import name from Xexport.vim 1011fa29c8abSBram Moolenaar END 1012fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1013fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1014fa29c8abSBram Moolenaar 1015fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1016fa29c8abSBram Moolenaar vim9script 1017fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1018fa29c8abSBram Moolenaar END 1019fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1020fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1021fa29c8abSBram Moolenaar 1022fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1023fa29c8abSBram Moolenaar vim9script 1024fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1025fa29c8abSBram Moolenaar END 10265269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 10275269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1028fa29c8abSBram Moolenaar 1029f2d5c240SBram Moolenaar delete('Ximport.vim') 10305269bd2aSBram Moolenaar delete('Ximport3.vim') 10318a7d6542SBram Moolenaar delete('Xexport.vim') 10328a7d6542SBram Moolenaar 1033f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1034750802b5SBram Moolenaar set cpo&vi 1035750802b5SBram Moolenaar let cpo_before = &cpo 1036750802b5SBram Moolenaar let lines =<< trim END 1037750802b5SBram Moolenaar vim9script 1038750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1039750802b5SBram Moolenaar END 1040750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1041750802b5SBram Moolenaar source Xvim9_script 1042750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1043750802b5SBram Moolenaar set cpo&vim 1044750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1045750802b5SBram Moolenaar delete('Xvim9_script') 1046750802b5SBram Moolenaarenddef 1047750802b5SBram Moolenaar 1048750802b5SBram Moolenaardef Test_vim9script_fails() 10498a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 10508a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1051750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 10529721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 10539b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1054750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1055750802b5SBram Moolenaar 1056c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1057c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1058c785b9a7SBram Moolenaar 1059750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1060a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 10618a7d6542SBram Moolenaarenddef 10628a7d6542SBram Moolenaar 1063f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1064101f4810SBram Moolenaar CheckRunVimInTerminal 1065101f4810SBram Moolenaar 10669bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1067c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 10689bb3eb3eSBram Moolenaarendfunc 10699bb3eb3eSBram Moolenaar 1070c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1071101f4810SBram Moolenaar let export =<< trim END 1072101f4810SBram Moolenaar vim9script 1073101f4810SBram Moolenaar export def Foo(): number 1074101f4810SBram Moolenaar return 0 1075101f4810SBram Moolenaar enddef 1076101f4810SBram Moolenaar END 10779bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1078101f4810SBram Moolenaar 10799bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 10809bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 10819bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1082101f4810SBram Moolenaar 10839bb3eb3eSBram Moolenaar delete('Xexport.vim') 10849bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 10859bb3eb3eSBram Moolenaarenddef 1086101f4810SBram Moolenaar 10874c17ad94SBram Moolenaardef Test_vim9script_reload_import() 10888a7d6542SBram Moolenaar let lines =<< trim END 10898a7d6542SBram Moolenaar vim9script 10908a7d6542SBram Moolenaar const var = '' 10918a7d6542SBram Moolenaar let valone = 1234 10928a7d6542SBram Moolenaar def MyFunc(arg: string) 10938a7d6542SBram Moolenaar valone = 5678 10948a7d6542SBram Moolenaar enddef 10958a7d6542SBram Moolenaar END 10968a7d6542SBram Moolenaar let morelines =<< trim END 10978a7d6542SBram Moolenaar let valtwo = 222 10988a7d6542SBram Moolenaar export def GetValtwo(): number 10998a7d6542SBram Moolenaar return valtwo 11008a7d6542SBram Moolenaar enddef 11018a7d6542SBram Moolenaar END 110203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11038a7d6542SBram Moolenaar source Xreload.vim 11048a7d6542SBram Moolenaar source Xreload.vim 11058a7d6542SBram Moolenaar source Xreload.vim 11068a7d6542SBram Moolenaar 11078a7d6542SBram Moolenaar let testlines =<< trim END 11088a7d6542SBram Moolenaar vim9script 11098a7d6542SBram Moolenaar def TheFunc() 11108a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11118a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11128a7d6542SBram Moolenaar enddef 11138a7d6542SBram Moolenaar TheFunc() 11148a7d6542SBram Moolenaar END 11158a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11168a7d6542SBram Moolenaar source Ximport.vim 11178a7d6542SBram Moolenaar 1118f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1119f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11208a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11218a7d6542SBram Moolenaar source Ximport.vim 11228a7d6542SBram Moolenaar 1123f5be8cdbSBram Moolenaar # cannot declare a var twice 11248a7d6542SBram Moolenaar lines =<< trim END 11258a7d6542SBram Moolenaar vim9script 11268a7d6542SBram Moolenaar let valone = 1234 11278a7d6542SBram Moolenaar let valone = 5678 11288a7d6542SBram Moolenaar END 11298a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11308a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 11318a7d6542SBram Moolenaar 11328a7d6542SBram Moolenaar delete('Xreload.vim') 11338a7d6542SBram Moolenaar delete('Ximport.vim') 11348a7d6542SBram Moolenaarenddef 11358a7d6542SBram Moolenaar 1136fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1137fe465a01SBram Moolenaar" script-local name. 1138fe465a01SBram Moolenaardef Test_vim9script_funcref() 1139fe465a01SBram Moolenaar let sortlines =<< trim END 1140fe465a01SBram Moolenaar vim9script 1141fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1142bed36b93SBram Moolenaar return i2 - i1 1143fe465a01SBram Moolenaar enddef 1144fe465a01SBram Moolenaar 1145fe465a01SBram Moolenaar export def FastSort(): list<number> 1146fe465a01SBram Moolenaar return range(5)->sort(Compare) 1147fe465a01SBram Moolenaar enddef 1148fe465a01SBram Moolenaar END 1149fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1150fe465a01SBram Moolenaar 1151fe465a01SBram Moolenaar let lines =<< trim END 1152fe465a01SBram Moolenaar vim9script 1153fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1154fe465a01SBram Moolenaar def Test() 1155fe465a01SBram Moolenaar g:result = FastSort() 1156fe465a01SBram Moolenaar enddef 1157fe465a01SBram Moolenaar Test() 1158fe465a01SBram Moolenaar END 1159fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1160fe465a01SBram Moolenaar 1161fe465a01SBram Moolenaar source Xscript.vim 1162fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1163fe465a01SBram Moolenaar 1164fe465a01SBram Moolenaar unlet g:result 1165fe465a01SBram Moolenaar delete('Xsort.vim') 1166fe465a01SBram Moolenaar delete('Xscript.vim') 1167fe465a01SBram Moolenaarenddef 1168fe465a01SBram Moolenaar 1169c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1170c620c055SBram Moolenaar" script where FastFilter() is called from. 1171c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1172c620c055SBram Moolenaar let filterLines =<< trim END 1173c620c055SBram Moolenaar vim9script 1174c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1175c620c055SBram Moolenaar return idx % 2 == 1 1176c620c055SBram Moolenaar enddef 1177c620c055SBram Moolenaar export def FastFilter(): list<number> 1178c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1179c620c055SBram Moolenaar enddef 1180c620c055SBram Moolenaar END 1181c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1182c620c055SBram Moolenaar 1183c620c055SBram Moolenaar let lines =<< trim END 1184c620c055SBram Moolenaar vim9script 1185c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1186c620c055SBram Moolenaar def Test() 1187c620c055SBram Moolenaar let x: list<number> = FastFilter() 1188c620c055SBram Moolenaar enddef 1189c620c055SBram Moolenaar Test() 1190c620c055SBram Moolenaar END 1191c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1192c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1193c620c055SBram Moolenaar 1194c620c055SBram Moolenaar delete('Xfilter.vim') 1195c620c055SBram Moolenaar delete('Ximport.vim') 1196c620c055SBram Moolenaarenddef 1197c620c055SBram Moolenaar 11984c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 11994c17ad94SBram Moolenaar let first_lines =<< trim END 12004c17ad94SBram Moolenaar vim9script 12014c17ad94SBram Moolenaar def FuncYes(): string 12024c17ad94SBram Moolenaar return 'yes' 12034c17ad94SBram Moolenaar enddef 12044c17ad94SBram Moolenaar END 120503afdcf1SBram Moolenaar let withno_lines =<< trim END 12064c17ad94SBram Moolenaar def FuncNo(): string 12074c17ad94SBram Moolenaar return 'no' 12084c17ad94SBram Moolenaar enddef 12094c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12104c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12114c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 121203afdcf1SBram Moolenaar enddef 121303afdcf1SBram Moolenaar END 121403afdcf1SBram Moolenaar let nono_lines =<< trim END 121503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 121603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 12174c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 12184c17ad94SBram Moolenaar enddef 12194c17ad94SBram Moolenaar END 12204c17ad94SBram Moolenaar 12214c17ad94SBram Moolenaar # FuncNo() is defined 122203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12234c17ad94SBram Moolenaar source Xreloaded.vim 12244c17ad94SBram Moolenaar g:DoCheck(true) 12254c17ad94SBram Moolenaar 12264c17ad94SBram Moolenaar # FuncNo() is not redefined 122703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12284c17ad94SBram Moolenaar source Xreloaded.vim 122903afdcf1SBram Moolenaar g:DoCheck() 12304c17ad94SBram Moolenaar 12314c17ad94SBram Moolenaar # FuncNo() is back 123203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12334c17ad94SBram Moolenaar source Xreloaded.vim 123403afdcf1SBram Moolenaar g:DoCheck() 12354c17ad94SBram Moolenaar 12364c17ad94SBram Moolenaar delete('Xreloaded.vim') 12374c17ad94SBram Moolenaarenddef 12384c17ad94SBram Moolenaar 123989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 124089483d40SBram Moolenaar # write the script with a script-local variable 124189483d40SBram Moolenaar let lines =<< trim END 124289483d40SBram Moolenaar vim9script 124389483d40SBram Moolenaar let var = 'string' 124489483d40SBram Moolenaar END 124589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 124689483d40SBram Moolenaar source XreloadVar.vim 124789483d40SBram Moolenaar 124889483d40SBram Moolenaar # now write the script using the same variable locally - works 124989483d40SBram Moolenaar lines =<< trim END 125089483d40SBram Moolenaar vim9script 125189483d40SBram Moolenaar def Func() 125289483d40SBram Moolenaar let var = 'string' 125389483d40SBram Moolenaar enddef 125489483d40SBram Moolenaar END 125589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 125689483d40SBram Moolenaar source XreloadVar.vim 125789483d40SBram Moolenaar 125889483d40SBram Moolenaar delete('XreloadVar.vim') 125989483d40SBram Moolenaarenddef 126089483d40SBram Moolenaar 12618a7d6542SBram Moolenaardef Test_import_absolute() 12628a7d6542SBram Moolenaar let import_lines = [ 1263e6085c53SBram Moolenaar 'vim9script', 1264e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1265e6085c53SBram Moolenaar 'def UseExported()', 1266e6085c53SBram Moolenaar ' g:imported_abs = exported', 1267e6085c53SBram Moolenaar ' exported = 8888', 1268e6085c53SBram Moolenaar ' g:imported_after = exported', 1269e6085c53SBram Moolenaar 'enddef', 1270e6085c53SBram Moolenaar 'UseExported()', 1271e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1272e6085c53SBram Moolenaar ] 12738a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 12748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 12758a7d6542SBram Moolenaar 12768a7d6542SBram Moolenaar source Ximport_abs.vim 12778a7d6542SBram Moolenaar 12788a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 12794e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1280675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1281675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1282675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1283675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1284675f716eSBram Moolenaar 'exported = 8888.*' .. 1285675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1286675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1287675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1288675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1289e6085c53SBram Moolenaar g:import_disassembled) 12908a7d6542SBram Moolenaar unlet g:imported_abs 12914e12a5dfSBram Moolenaar unlet g:import_disassembled 12928a7d6542SBram Moolenaar 12938a7d6542SBram Moolenaar delete('Ximport_abs.vim') 12948a7d6542SBram Moolenaar delete('Xexport_abs.vim') 12958a7d6542SBram Moolenaarenddef 12968a7d6542SBram Moolenaar 12978a7d6542SBram Moolenaardef Test_import_rtp() 12988a7d6542SBram Moolenaar let import_lines = [ 1299e6085c53SBram Moolenaar 'vim9script', 1300e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1301e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1302e6085c53SBram Moolenaar ] 13038a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13048a7d6542SBram Moolenaar mkdir('import') 13058a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13068a7d6542SBram Moolenaar 13078a7d6542SBram Moolenaar let save_rtp = &rtp 13088a7d6542SBram Moolenaar &rtp = getcwd() 13098a7d6542SBram Moolenaar source Ximport_rtp.vim 13108a7d6542SBram Moolenaar &rtp = save_rtp 13118a7d6542SBram Moolenaar 13128a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13138a7d6542SBram Moolenaar unlet g:imported_rtp 13148a7d6542SBram Moolenaar 13158a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 131689483d40SBram Moolenaar delete('import', 'rf') 13178a7d6542SBram Moolenaarenddef 13188a7d6542SBram Moolenaar 131925e0f586SBram Moolenaardef Test_import_compile_error() 132025e0f586SBram Moolenaar let export_lines = [ 132125e0f586SBram Moolenaar 'vim9script', 132225e0f586SBram Moolenaar 'export def ExpFunc(): string', 132325e0f586SBram Moolenaar ' return notDefined', 132425e0f586SBram Moolenaar 'enddef', 132525e0f586SBram Moolenaar ] 132625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 132725e0f586SBram Moolenaar 132825e0f586SBram Moolenaar let import_lines = [ 132925e0f586SBram Moolenaar 'vim9script', 133025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 133125e0f586SBram Moolenaar 'def ImpFunc()', 133225e0f586SBram Moolenaar ' echo ExpFunc()', 133325e0f586SBram Moolenaar 'enddef', 133425e0f586SBram Moolenaar 'defcompile', 133525e0f586SBram Moolenaar ] 133625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 133725e0f586SBram Moolenaar 133825e0f586SBram Moolenaar try 133925e0f586SBram Moolenaar source Ximport.vim 134025e0f586SBram Moolenaar catch /E1001/ 1341f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 134225e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 134325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 134425e0f586SBram Moolenaar endtry 134525e0f586SBram Moolenaar 134625e0f586SBram Moolenaar delete('Xexported.vim') 134725e0f586SBram Moolenaar delete('Ximport.vim') 134825e0f586SBram Moolenaarenddef 134925e0f586SBram Moolenaar 13508a7d6542SBram Moolenaardef Test_fixed_size_list() 1351f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 13528a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 13538a7d6542SBram Moolenaar l->remove(0) 13548a7d6542SBram Moolenaar l->add(5) 13558a7d6542SBram Moolenaar l->insert(99, 1) 13560f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 13578a7d6542SBram Moolenaarenddef 13588a7d6542SBram Moolenaar 1359158906cfSBram Moolenaardef IfElse(what: number): string 1360158906cfSBram Moolenaar let res = '' 1361158906cfSBram Moolenaar if what == 1 1362158906cfSBram Moolenaar res = "one" 1363158906cfSBram Moolenaar elseif what == 2 1364158906cfSBram Moolenaar res = "two" 1365a259d8d3SBram Moolenaar else 1366158906cfSBram Moolenaar res = "three" 1367a259d8d3SBram Moolenaar endif 1368158906cfSBram Moolenaar return res 1369a259d8d3SBram Moolenaarenddef 1370a259d8d3SBram Moolenaar 1371158906cfSBram Moolenaardef Test_if_elseif_else() 1372158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1373158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1374158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 13750f18b6d1SBram Moolenaarenddef 13760f18b6d1SBram Moolenaar 1377e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1378e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1379e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1380e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1381e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1382585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1383e8c4abbbSBram Moolenaarenddef 1384e8c4abbbSBram Moolenaar 13856d69bf60SBram Moolenaarlet g:bool_true = v:true 13866d69bf60SBram Moolenaarlet g:bool_false = v:false 13876d69bf60SBram Moolenaar 13886d69bf60SBram Moolenaardef Test_if_const_expr() 13896d69bf60SBram Moolenaar let res = false 13906d69bf60SBram Moolenaar if true ? true : false 13916d69bf60SBram Moolenaar res = true 13926d69bf60SBram Moolenaar endif 13936d69bf60SBram Moolenaar assert_equal(true, res) 13946d69bf60SBram Moolenaar 1395585fea7bSBram Moolenaar g:glob = 2 1396585fea7bSBram Moolenaar if false 13976797966dSBram Moolenaar execute('g:glob = 3') 1398585fea7bSBram Moolenaar endif 1399585fea7bSBram Moolenaar assert_equal(2, g:glob) 1400585fea7bSBram Moolenaar if true 14016797966dSBram Moolenaar execute('g:glob = 3') 1402585fea7bSBram Moolenaar endif 1403585fea7bSBram Moolenaar assert_equal(3, g:glob) 1404585fea7bSBram Moolenaar 14056d69bf60SBram Moolenaar res = false 14066d69bf60SBram Moolenaar if g:bool_true ? true : false 14076d69bf60SBram Moolenaar res = true 14086d69bf60SBram Moolenaar endif 14096d69bf60SBram Moolenaar assert_equal(true, res) 14106d69bf60SBram Moolenaar 14116d69bf60SBram Moolenaar res = false 14126d69bf60SBram Moolenaar if true ? g:bool_true : false 14136d69bf60SBram Moolenaar res = true 14146d69bf60SBram Moolenaar endif 14156d69bf60SBram Moolenaar assert_equal(true, res) 14166d69bf60SBram Moolenaar 14176d69bf60SBram Moolenaar res = false 14186d69bf60SBram Moolenaar if true ? true : g:bool_false 14196d69bf60SBram Moolenaar res = true 14206d69bf60SBram Moolenaar endif 14216d69bf60SBram Moolenaar assert_equal(true, res) 14226d69bf60SBram Moolenaar 14236d69bf60SBram Moolenaar res = false 14246d69bf60SBram Moolenaar if true ? false : true 14256d69bf60SBram Moolenaar res = true 14266d69bf60SBram Moolenaar endif 14276d69bf60SBram Moolenaar assert_equal(false, res) 14286d69bf60SBram Moolenaar 14296d69bf60SBram Moolenaar res = false 14306d69bf60SBram Moolenaar if false ? false : true 14316d69bf60SBram Moolenaar res = true 14326d69bf60SBram Moolenaar endif 14336d69bf60SBram Moolenaar assert_equal(true, res) 14346d69bf60SBram Moolenaar 14356d69bf60SBram Moolenaar res = false 14366d69bf60SBram Moolenaar if false ? true : false 14376d69bf60SBram Moolenaar res = true 14386d69bf60SBram Moolenaar endif 14396d69bf60SBram Moolenaar assert_equal(false, res) 14406d69bf60SBram Moolenaar 14416d69bf60SBram Moolenaar res = false 1442e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1443e8c4abbbSBram Moolenaar res = true 1444e8c4abbbSBram Moolenaar endif 1445e8c4abbbSBram Moolenaar assert_equal(false, res) 1446e8c4abbbSBram Moolenaar 1447e8c4abbbSBram Moolenaar res = false 14486d69bf60SBram Moolenaar if true && true 14496d69bf60SBram Moolenaar res = true 14506d69bf60SBram Moolenaar endif 14516d69bf60SBram Moolenaar assert_equal(true, res) 14526d69bf60SBram Moolenaar 14536d69bf60SBram Moolenaar res = false 14546d69bf60SBram Moolenaar if true && false 14556d69bf60SBram Moolenaar res = true 14566d69bf60SBram Moolenaar endif 14576d69bf60SBram Moolenaar assert_equal(false, res) 14586d69bf60SBram Moolenaar 14596d69bf60SBram Moolenaar res = false 14606d69bf60SBram Moolenaar if g:bool_true && false 14616d69bf60SBram Moolenaar res = true 14626d69bf60SBram Moolenaar endif 14636d69bf60SBram Moolenaar assert_equal(false, res) 14646d69bf60SBram Moolenaar 14656d69bf60SBram Moolenaar res = false 14666d69bf60SBram Moolenaar if true && g:bool_false 14676d69bf60SBram Moolenaar res = true 14686d69bf60SBram Moolenaar endif 14696d69bf60SBram Moolenaar assert_equal(false, res) 14706d69bf60SBram Moolenaar 14716d69bf60SBram Moolenaar res = false 14726d69bf60SBram Moolenaar if false && false 14736d69bf60SBram Moolenaar res = true 14746d69bf60SBram Moolenaar endif 14756d69bf60SBram Moolenaar assert_equal(false, res) 14766d69bf60SBram Moolenaar 14776d69bf60SBram Moolenaar res = false 14786d69bf60SBram Moolenaar if true || false 14796d69bf60SBram Moolenaar res = true 14806d69bf60SBram Moolenaar endif 14816d69bf60SBram Moolenaar assert_equal(true, res) 14826d69bf60SBram Moolenaar 14836d69bf60SBram Moolenaar res = false 14846d69bf60SBram Moolenaar if g:bool_true || false 14856d69bf60SBram Moolenaar res = true 14866d69bf60SBram Moolenaar endif 14876d69bf60SBram Moolenaar assert_equal(true, res) 14886d69bf60SBram Moolenaar 14896d69bf60SBram Moolenaar res = false 14906d69bf60SBram Moolenaar if true || g:bool_false 14916d69bf60SBram Moolenaar res = true 14926d69bf60SBram Moolenaar endif 14936d69bf60SBram Moolenaar assert_equal(true, res) 14946d69bf60SBram Moolenaar 14956d69bf60SBram Moolenaar res = false 14966d69bf60SBram Moolenaar if false || false 14976d69bf60SBram Moolenaar res = true 14986d69bf60SBram Moolenaar endif 14996d69bf60SBram Moolenaar assert_equal(false, res) 150080c34ca3SBram Moolenaarenddef 15016d69bf60SBram Moolenaar 150280c34ca3SBram Moolenaardef Test_if_const_expr_fails() 150380c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 150480c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1505e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1506e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 15076d69bf60SBram Moolenaarenddef 15086d69bf60SBram Moolenaar 150972abcf42SBram Moolenaardef RunNested(i: number): number 151072abcf42SBram Moolenaar let x: number = 0 151172abcf42SBram Moolenaar if i % 2 151272abcf42SBram Moolenaar if 1 1513f5be8cdbSBram Moolenaar # comment 151472abcf42SBram Moolenaar else 1515f5be8cdbSBram Moolenaar # comment 151672abcf42SBram Moolenaar endif 151772abcf42SBram Moolenaar x += 1 151872abcf42SBram Moolenaar else 151972abcf42SBram Moolenaar x += 1000 152072abcf42SBram Moolenaar endif 152172abcf42SBram Moolenaar return x 152272abcf42SBram Moolenaarenddef 152372abcf42SBram Moolenaar 152472abcf42SBram Moolenaardef Test_nested_if() 152572abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 152672abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 152772abcf42SBram Moolenaarenddef 152872abcf42SBram Moolenaar 1529ad39c094SBram Moolenaardef Test_execute_cmd() 1530ad39c094SBram Moolenaar new 1531ad39c094SBram Moolenaar setline(1, 'default') 1532ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1533ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1534a72cfb80SBram Moolenaar 1535a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1536a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1537a72cfb80SBram Moolenaar 1538ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1539ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1540a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1541ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1542a72cfb80SBram Moolenaar 1543ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1544ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1545a72cfb80SBram Moolenaar 1546ad39c094SBram Moolenaar let cmd_first = 'call ' 1547ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1548ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1549ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1550ad39c094SBram Moolenaar bwipe! 1551585fea7bSBram Moolenaar 1552585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1553a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1554ad39c094SBram Moolenaarenddef 1555ad39c094SBram Moolenaar 155647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1557f5be8cdbSBram Moolenaar # only checks line continuation 155847e880d6SBram Moolenaar let lines =<< trim END 155947e880d6SBram Moolenaar vim9script 156047e880d6SBram Moolenaar execute 'g:someVar' 156147e880d6SBram Moolenaar .. ' = ' .. 156247e880d6SBram Moolenaar '28' 156347e880d6SBram Moolenaar assert_equal(28, g:someVar) 156447e880d6SBram Moolenaar unlet g:someVar 156547e880d6SBram Moolenaar END 156647e880d6SBram Moolenaar CheckScriptSuccess(lines) 156747e880d6SBram Moolenaarenddef 156847e880d6SBram Moolenaar 1569ad39c094SBram Moolenaardef Test_echo_cmd() 1570a72cfb80SBram Moolenaar echo 'some' # comment 1571585fea7bSBram Moolenaar echon 'thing' 1572ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1573ad39c094SBram Moolenaar 1574a72cfb80SBram Moolenaar echo "some" # comment 1575a72cfb80SBram Moolenaar echon "thing" 1576a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1577a72cfb80SBram Moolenaar 1578ad39c094SBram Moolenaar let str1 = 'some' 1579ad39c094SBram Moolenaar let str2 = 'more' 1580ad39c094SBram Moolenaar echo str1 str2 1581ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1582a72cfb80SBram Moolenaar 1583a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1584ad39c094SBram Moolenaarenddef 1585ad39c094SBram Moolenaar 1586f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1587f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1588f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1589f93c7feaSBram Moolenaar echo 'clear' 1590df069eecSBram Moolenaar :1messages 1591f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1592f93c7feaSBram Moolenaar 1593f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1594f93c7feaSBram Moolenaarenddef 1595f93c7feaSBram Moolenaar 159647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1597f5be8cdbSBram Moolenaar # only checks line continuation 159847e880d6SBram Moolenaar let lines =<< trim END 159947e880d6SBram Moolenaar vim9script 160047e880d6SBram Moolenaar echomsg 'here' 160147e880d6SBram Moolenaar .. ' is ' .. 160247e880d6SBram Moolenaar 'a message' 160347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 160447e880d6SBram Moolenaar END 160547e880d6SBram Moolenaar CheckScriptSuccess(lines) 160647e880d6SBram Moolenaarenddef 160747e880d6SBram Moolenaar 1608f93c7feaSBram Moolenaardef Test_echoerr_cmd() 160940ee466cSBram Moolenaar try 161040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 161140ee466cSBram Moolenaar catch 161240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 161340ee466cSBram Moolenaar endtry 1614f93c7feaSBram Moolenaarenddef 1615f93c7feaSBram Moolenaar 161647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1617f5be8cdbSBram Moolenaar # only checks line continuation 161847e880d6SBram Moolenaar let lines =<< trim END 161947e880d6SBram Moolenaar vim9script 162047e880d6SBram Moolenaar try 162147e880d6SBram Moolenaar echoerr 'this' 162247e880d6SBram Moolenaar .. ' is ' .. 162347e880d6SBram Moolenaar 'wrong' 162447e880d6SBram Moolenaar catch 162547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 162647e880d6SBram Moolenaar endtry 162747e880d6SBram Moolenaar END 162847e880d6SBram Moolenaar CheckScriptSuccess(lines) 162947e880d6SBram Moolenaarenddef 163047e880d6SBram Moolenaar 163141fe0617SBram Moolenaardef Test_for_outside_of_function() 163241fe0617SBram Moolenaar let lines =<< trim END 163341fe0617SBram Moolenaar vim9script 163441fe0617SBram Moolenaar new 163541fe0617SBram Moolenaar for var in range(0, 3) 163641fe0617SBram Moolenaar append(line('$'), var) 163741fe0617SBram Moolenaar endfor 163841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 163941fe0617SBram Moolenaar bwipe! 164041fe0617SBram Moolenaar END 164141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 164241fe0617SBram Moolenaar source Xvim9for.vim 164341fe0617SBram Moolenaar delete('Xvim9for.vim') 164441fe0617SBram Moolenaarenddef 16458a7d6542SBram Moolenaar 1646e8c4abbbSBram Moolenaardef Test_for_loop() 1647e8c4abbbSBram Moolenaar let result = '' 1648e8c4abbbSBram Moolenaar for cnt in range(7) 1649e8c4abbbSBram Moolenaar if cnt == 4 1650e8c4abbbSBram Moolenaar break 1651e8c4abbbSBram Moolenaar endif 1652e8c4abbbSBram Moolenaar if cnt == 2 1653e8c4abbbSBram Moolenaar continue 1654e8c4abbbSBram Moolenaar endif 1655e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1656e8c4abbbSBram Moolenaar endfor 1657e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 16580ad3e894SBram Moolenaar 16590ad3e894SBram Moolenaar let concat = '' 16600ad3e894SBram Moolenaar for str in eval('["one", "two"]') 16610ad3e894SBram Moolenaar concat ..= str 16620ad3e894SBram Moolenaar endfor 16630ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1664e8c4abbbSBram Moolenaarenddef 1665e8c4abbbSBram Moolenaar 1666e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1667675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1668675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1669675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1670822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 16710ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1672675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1673675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1674675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1675e8c4abbbSBram Moolenaarenddef 1676e8c4abbbSBram Moolenaar 1677d0df1aacSBram Moolenaardef Test_while_loop() 1678d0df1aacSBram Moolenaar let result = '' 1679d0df1aacSBram Moolenaar let cnt = 0 1680d0df1aacSBram Moolenaar while cnt < 555 1681d0df1aacSBram Moolenaar if cnt == 3 1682d0df1aacSBram Moolenaar break 1683d0df1aacSBram Moolenaar endif 1684d0df1aacSBram Moolenaar cnt += 1 1685d0df1aacSBram Moolenaar if cnt == 2 1686d0df1aacSBram Moolenaar continue 1687d0df1aacSBram Moolenaar endif 1688d0df1aacSBram Moolenaar result ..= cnt .. '_' 1689d0df1aacSBram Moolenaar endwhile 1690d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1691d0df1aacSBram Moolenaarenddef 1692d0df1aacSBram Moolenaar 1693e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1694675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1695675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1696675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1697675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1698675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1699675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1700675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1701bd5da371SBram Moolenaarenddef 1702bd5da371SBram Moolenaar 17039645e2d9SBram Moolenaardef Test_interrupt_loop() 170497acfc78SBram Moolenaar let caught = false 17059645e2d9SBram Moolenaar let x = 0 170697acfc78SBram Moolenaar try 17079645e2d9SBram Moolenaar while 1 17089645e2d9SBram Moolenaar x += 1 17099645e2d9SBram Moolenaar if x == 100 17109645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 17119645e2d9SBram Moolenaar endif 17129645e2d9SBram Moolenaar endwhile 171397acfc78SBram Moolenaar catch 171497acfc78SBram Moolenaar caught = true 171597acfc78SBram Moolenaar assert_equal(100, x) 171697acfc78SBram Moolenaar endtry 171797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 17189645e2d9SBram Moolenaarenddef 171920431c9dSBram Moolenaar 17204fdae999SBram Moolenaardef Test_automatic_line_continuation() 17214fdae999SBram Moolenaar let mylist = [ 17224fdae999SBram Moolenaar 'one', 17234fdae999SBram Moolenaar 'two', 17244fdae999SBram Moolenaar 'three', 1725f5be8cdbSBram Moolenaar ] # comment 17264fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 17274fdae999SBram Moolenaar 17284fdae999SBram Moolenaar let mydict = { 17294fdae999SBram Moolenaar 'one': 1, 17304fdae999SBram Moolenaar 'two': 2, 17314fdae999SBram Moolenaar 'three': 17324fdae999SBram Moolenaar 3, 1733f5be8cdbSBram Moolenaar } # comment 17344fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 17354fdae999SBram Moolenaar mydict = #{ 17362c330432SBram Moolenaar one: 1, # comment 17372c330432SBram Moolenaar two: # comment 17382c330432SBram Moolenaar 2, # comment 17392c330432SBram Moolenaar three: 3 # comment 17402c330432SBram Moolenaar } 17412c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 17422c330432SBram Moolenaar mydict = #{ 17432c330432SBram Moolenaar one: 1, 17444fdae999SBram Moolenaar two: 17454fdae999SBram Moolenaar 2, 17462c330432SBram Moolenaar three: 3 17474fdae999SBram Moolenaar } 17484fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1749e6085c53SBram Moolenaar 1750e6085c53SBram Moolenaar assert_equal( 1751e6085c53SBram Moolenaar ['one', 'two', 'three'], 1752e6085c53SBram Moolenaar split('one two three') 1753e6085c53SBram Moolenaar ) 17544fdae999SBram Moolenaarenddef 17554fdae999SBram Moolenaar 17567a092245SBram Moolenaardef Test_vim9_comment() 17577a092245SBram Moolenaar CheckScriptSuccess([ 17587a092245SBram Moolenaar 'vim9script', 17597a092245SBram Moolenaar '# something', 17607a092245SBram Moolenaar ]) 17617a092245SBram Moolenaar CheckScriptFailure([ 17627a092245SBram Moolenaar 'vim9script', 17637a092245SBram Moolenaar ':# something', 17647a092245SBram Moolenaar ], 'E488:') 17657a092245SBram Moolenaar CheckScriptFailure([ 17667a092245SBram Moolenaar '# something', 17677a092245SBram Moolenaar ], 'E488:') 17687a092245SBram Moolenaar CheckScriptFailure([ 17697a092245SBram Moolenaar ':# something', 17707a092245SBram Moolenaar ], 'E488:') 17717a092245SBram Moolenaar 17724a8d9f2eSBram Moolenaar { # block start 17734a8d9f2eSBram Moolenaar } # block end 17744a8d9f2eSBram Moolenaar CheckDefFailure([ 17754a8d9f2eSBram Moolenaar '{# comment', 17764a8d9f2eSBram Moolenaar ], 'E488:') 17774a8d9f2eSBram Moolenaar CheckDefFailure([ 17784a8d9f2eSBram Moolenaar '{', 17794a8d9f2eSBram Moolenaar '}# comment', 17804a8d9f2eSBram Moolenaar ], 'E488:') 17814a8d9f2eSBram Moolenaar 17824a8d9f2eSBram Moolenaar echo "yes" # comment 17834a8d9f2eSBram Moolenaar CheckDefFailure([ 17844a8d9f2eSBram Moolenaar 'echo "yes"# comment', 17854a8d9f2eSBram Moolenaar ], 'E488:') 17867a092245SBram Moolenaar CheckScriptSuccess([ 17877a092245SBram Moolenaar 'vim9script', 17887a092245SBram Moolenaar 'echo "yes" # something', 17897a092245SBram Moolenaar ]) 17907a092245SBram Moolenaar CheckScriptFailure([ 17917a092245SBram Moolenaar 'vim9script', 17927a092245SBram Moolenaar 'echo "yes"# something', 17937a092245SBram Moolenaar ], 'E121:') 17947a092245SBram Moolenaar CheckScriptFailure([ 17957a092245SBram Moolenaar 'vim9script', 17967a092245SBram Moolenaar 'echo# something', 17977a092245SBram Moolenaar ], 'E121:') 17987a092245SBram Moolenaar CheckScriptFailure([ 17997a092245SBram Moolenaar 'echo "yes" # something', 18007a092245SBram Moolenaar ], 'E121:') 18017a092245SBram Moolenaar 18024a8d9f2eSBram Moolenaar exe "echo" # comment 18034a8d9f2eSBram Moolenaar CheckDefFailure([ 18044a8d9f2eSBram Moolenaar 'exe "echo"# comment', 18054a8d9f2eSBram Moolenaar ], 'E488:') 18064a8d9f2eSBram Moolenaar CheckScriptSuccess([ 18074a8d9f2eSBram Moolenaar 'vim9script', 18084a8d9f2eSBram Moolenaar 'exe "echo" # something', 18094a8d9f2eSBram Moolenaar ]) 18104a8d9f2eSBram Moolenaar CheckScriptFailure([ 18114a8d9f2eSBram Moolenaar 'vim9script', 18124a8d9f2eSBram Moolenaar 'exe "echo"# something', 18134a8d9f2eSBram Moolenaar ], 'E121:') 18144a8d9f2eSBram Moolenaar CheckDefFailure([ 18154a8d9f2eSBram Moolenaar 'exe # comment', 18164a8d9f2eSBram Moolenaar ], 'E1015:') 18174a8d9f2eSBram Moolenaar CheckScriptFailure([ 18184a8d9f2eSBram Moolenaar 'vim9script', 18194a8d9f2eSBram Moolenaar 'exe# something', 18204a8d9f2eSBram Moolenaar ], 'E121:') 18214a8d9f2eSBram Moolenaar CheckScriptFailure([ 18224a8d9f2eSBram Moolenaar 'exe "echo" # something', 18234a8d9f2eSBram Moolenaar ], 'E121:') 18244a8d9f2eSBram Moolenaar 18257a092245SBram Moolenaar CheckDefFailure([ 18267a092245SBram Moolenaar 'try# comment', 18277a092245SBram Moolenaar ' echo "yes"', 18287a092245SBram Moolenaar 'catch', 18297a092245SBram Moolenaar 'endtry', 18307a092245SBram Moolenaar ], 'E488:') 18312c5ed4e3SBram Moolenaar CheckScriptFailure([ 18322c5ed4e3SBram Moolenaar 'vim9script', 18332c5ed4e3SBram Moolenaar 'try# comment', 18342c5ed4e3SBram Moolenaar 'echo "yes"', 18352c5ed4e3SBram Moolenaar ], 'E488:') 18367a092245SBram Moolenaar CheckDefFailure([ 18377a092245SBram Moolenaar 'try', 1838a72cfb80SBram Moolenaar ' throw#comment', 1839a72cfb80SBram Moolenaar 'catch', 1840a72cfb80SBram Moolenaar 'endtry', 1841a72cfb80SBram Moolenaar ], 'E1015:') 1842a72cfb80SBram Moolenaar CheckDefFailure([ 1843a72cfb80SBram Moolenaar 'try', 1844a72cfb80SBram Moolenaar ' throw "yes"#comment', 1845a72cfb80SBram Moolenaar 'catch', 1846a72cfb80SBram Moolenaar 'endtry', 1847a72cfb80SBram Moolenaar ], 'E488:') 1848a72cfb80SBram Moolenaar CheckDefFailure([ 1849a72cfb80SBram Moolenaar 'try', 18507a092245SBram Moolenaar ' echo "yes"', 18517a092245SBram Moolenaar 'catch# comment', 18527a092245SBram Moolenaar 'endtry', 18537a092245SBram Moolenaar ], 'E488:') 18542c5ed4e3SBram Moolenaar CheckScriptFailure([ 18552c5ed4e3SBram Moolenaar 'vim9script', 18562c5ed4e3SBram Moolenaar 'try', 18572c5ed4e3SBram Moolenaar ' echo "yes"', 18582c5ed4e3SBram Moolenaar 'catch# comment', 18592c5ed4e3SBram Moolenaar 'endtry', 18602c5ed4e3SBram Moolenaar ], 'E654:') 18612c5ed4e3SBram Moolenaar CheckDefFailure([ 18622c5ed4e3SBram Moolenaar 'try', 18632c5ed4e3SBram Moolenaar ' echo "yes"', 18642c5ed4e3SBram Moolenaar 'catch /pat/# comment', 18652c5ed4e3SBram Moolenaar 'endtry', 18662c5ed4e3SBram Moolenaar ], 'E488:') 18677a092245SBram Moolenaar CheckDefFailure([ 18687a092245SBram Moolenaar 'try', 18697a092245SBram Moolenaar 'echo "yes"', 18707a092245SBram Moolenaar 'catch', 18717a092245SBram Moolenaar 'endtry# comment', 18727a092245SBram Moolenaar ], 'E488:') 18732c5ed4e3SBram Moolenaar CheckScriptFailure([ 18742c5ed4e3SBram Moolenaar 'vim9script', 18752c5ed4e3SBram Moolenaar 'try', 18762c5ed4e3SBram Moolenaar ' echo "yes"', 18772c5ed4e3SBram Moolenaar 'catch', 18782c5ed4e3SBram Moolenaar 'endtry# comment', 18799b7bf9e9SBram Moolenaar ], 'E488:') 18802c5ed4e3SBram Moolenaar 18812c5ed4e3SBram Moolenaar CheckScriptSuccess([ 18822c5ed4e3SBram Moolenaar 'vim9script', 18832c5ed4e3SBram Moolenaar 'hi # comment', 18842c5ed4e3SBram Moolenaar ]) 18852c5ed4e3SBram Moolenaar CheckScriptFailure([ 18862c5ed4e3SBram Moolenaar 'vim9script', 18872c5ed4e3SBram Moolenaar 'hi# comment', 18882c5ed4e3SBram Moolenaar ], 'E416:') 18891966c248SBram Moolenaar CheckScriptSuccess([ 18901966c248SBram Moolenaar 'vim9script', 18911966c248SBram Moolenaar 'hi Search # comment', 18921966c248SBram Moolenaar ]) 18931966c248SBram Moolenaar CheckScriptFailure([ 18941966c248SBram Moolenaar 'vim9script', 18951966c248SBram Moolenaar 'hi Search# comment', 18961966c248SBram Moolenaar ], 'E416:') 18971966c248SBram Moolenaar CheckScriptSuccess([ 18981966c248SBram Moolenaar 'vim9script', 18991966c248SBram Moolenaar 'hi link This Search # comment', 19001966c248SBram Moolenaar ]) 19011966c248SBram Moolenaar CheckScriptFailure([ 19021966c248SBram Moolenaar 'vim9script', 19031966c248SBram Moolenaar 'hi link This That# comment', 19041966c248SBram Moolenaar ], 'E413:') 19051966c248SBram Moolenaar CheckScriptSuccess([ 19061966c248SBram Moolenaar 'vim9script', 19071966c248SBram Moolenaar 'hi clear This # comment', 19081966c248SBram Moolenaar 'hi clear # comment', 19091966c248SBram Moolenaar ]) 1910f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 1911f5be8cdbSBram Moolenaar # hi clear This# comment', 19121966c248SBram Moolenaar CheckScriptFailure([ 19131966c248SBram Moolenaar 'vim9script', 19141966c248SBram Moolenaar 'hi clear# comment', 19151966c248SBram Moolenaar ], 'E416:') 19161966c248SBram Moolenaar 19171966c248SBram Moolenaar CheckScriptSuccess([ 19181966c248SBram Moolenaar 'vim9script', 19191966c248SBram Moolenaar 'hi Group term=bold', 19201966c248SBram Moolenaar 'match Group /todo/ # comment', 19211966c248SBram Moolenaar ]) 19221966c248SBram Moolenaar CheckScriptFailure([ 19231966c248SBram Moolenaar 'vim9script', 19241966c248SBram Moolenaar 'hi Group term=bold', 19251966c248SBram Moolenaar 'match Group /todo/# comment', 19261966c248SBram Moolenaar ], 'E488:') 19271966c248SBram Moolenaar CheckScriptSuccess([ 19281966c248SBram Moolenaar 'vim9script', 19291966c248SBram Moolenaar 'match # comment', 19301966c248SBram Moolenaar ]) 19311966c248SBram Moolenaar CheckScriptFailure([ 19321966c248SBram Moolenaar 'vim9script', 19331966c248SBram Moolenaar 'match# comment', 19341966c248SBram Moolenaar ], 'E475:') 19351966c248SBram Moolenaar CheckScriptSuccess([ 19361966c248SBram Moolenaar 'vim9script', 19371966c248SBram Moolenaar 'match none # comment', 19381966c248SBram Moolenaar ]) 19391966c248SBram Moolenaar CheckScriptFailure([ 19401966c248SBram Moolenaar 'vim9script', 19411966c248SBram Moolenaar 'match none# comment', 19421966c248SBram Moolenaar ], 'E475:') 19431966c248SBram Moolenaar 19441966c248SBram Moolenaar CheckScriptSuccess([ 19451966c248SBram Moolenaar 'vim9script', 19461966c248SBram Moolenaar 'menutrans clear # comment', 19471966c248SBram Moolenaar ]) 19481966c248SBram Moolenaar CheckScriptFailure([ 19491966c248SBram Moolenaar 'vim9script', 19501966c248SBram Moolenaar 'menutrans clear# comment text', 19511966c248SBram Moolenaar ], 'E474:') 19521966c248SBram Moolenaar 19531966c248SBram Moolenaar CheckScriptSuccess([ 19541966c248SBram Moolenaar 'vim9script', 19551966c248SBram Moolenaar 'syntax clear # comment', 19561966c248SBram Moolenaar ]) 19571966c248SBram Moolenaar CheckScriptFailure([ 19581966c248SBram Moolenaar 'vim9script', 19591966c248SBram Moolenaar 'syntax clear# comment text', 19601966c248SBram Moolenaar ], 'E28:') 19611966c248SBram Moolenaar CheckScriptSuccess([ 19621966c248SBram Moolenaar 'vim9script', 19631966c248SBram Moolenaar 'syntax keyword Word some', 19641966c248SBram Moolenaar 'syntax clear Word # comment', 19651966c248SBram Moolenaar ]) 19661966c248SBram Moolenaar CheckScriptFailure([ 19671966c248SBram Moolenaar 'vim9script', 19681966c248SBram Moolenaar 'syntax keyword Word some', 19691966c248SBram Moolenaar 'syntax clear Word# comment text', 19701966c248SBram Moolenaar ], 'E28:') 19711966c248SBram Moolenaar 19721966c248SBram Moolenaar CheckScriptSuccess([ 19731966c248SBram Moolenaar 'vim9script', 19741966c248SBram Moolenaar 'syntax list # comment', 19751966c248SBram Moolenaar ]) 19761966c248SBram Moolenaar CheckScriptFailure([ 19771966c248SBram Moolenaar 'vim9script', 19781966c248SBram Moolenaar 'syntax list# comment text', 19791966c248SBram Moolenaar ], 'E28:') 19801966c248SBram Moolenaar 19811966c248SBram Moolenaar CheckScriptSuccess([ 19821966c248SBram Moolenaar 'vim9script', 19831966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 19841966c248SBram Moolenaar ]) 19851966c248SBram Moolenaar CheckScriptFailure([ 19861966c248SBram Moolenaar 'vim9script', 19871966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 19881966c248SBram Moolenaar ], 'E475:') 19891966c248SBram Moolenaar 19901966c248SBram Moolenaar CheckScriptSuccess([ 19911966c248SBram Moolenaar 'vim9script', 19921966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 19931966c248SBram Moolenaar ]) 19941966c248SBram Moolenaar CheckScriptFailure([ 19951966c248SBram Moolenaar 'vim9script', 19961966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 19971966c248SBram Moolenaar ], 'E789:') 19981966c248SBram Moolenaar 19991966c248SBram Moolenaar CheckScriptSuccess([ 20001966c248SBram Moolenaar 'vim9script', 20011966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 20021966c248SBram Moolenaar ]) 20031966c248SBram Moolenaar CheckScriptFailure([ 20041966c248SBram Moolenaar 'vim9script', 20051966c248SBram Moolenaar 'syntax match Word /pat/# comment', 20061966c248SBram Moolenaar ], 'E402:') 20071966c248SBram Moolenaar 20081966c248SBram Moolenaar CheckScriptSuccess([ 20091966c248SBram Moolenaar 'vim9script', 20101966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 20111966c248SBram Moolenaar ]) 20121966c248SBram Moolenaar CheckScriptFailure([ 20131966c248SBram Moolenaar 'vim9script', 20141966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 20151966c248SBram Moolenaar ], 'E475:') 20161966c248SBram Moolenaar CheckScriptFailure([ 20171966c248SBram Moolenaar 'vim9script', 20181966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 20191966c248SBram Moolenaar ], 'E406:') 20201966c248SBram Moolenaar CheckScriptFailure([ 20211966c248SBram Moolenaar 'vim9script', 20221966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 20231966c248SBram Moolenaar ], 'E475:') 20241966c248SBram Moolenaar 20251966c248SBram Moolenaar CheckScriptSuccess([ 20261966c248SBram Moolenaar 'vim9script', 20271966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 20281966c248SBram Moolenaar ]) 20291966c248SBram Moolenaar CheckScriptFailure([ 20301966c248SBram Moolenaar 'vim9script', 20311966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 20321966c248SBram Moolenaar ], 'E475:') 20331966c248SBram Moolenaar 20341966c248SBram Moolenaar CheckScriptSuccess([ 20351966c248SBram Moolenaar 'vim9script', 20361966c248SBram Moolenaar 'syntax sync # comment', 20371966c248SBram Moolenaar ]) 20381966c248SBram Moolenaar CheckScriptFailure([ 20391966c248SBram Moolenaar 'vim9script', 20401966c248SBram Moolenaar 'syntax sync# comment', 20411966c248SBram Moolenaar ], 'E404:') 20421966c248SBram Moolenaar CheckScriptSuccess([ 20431966c248SBram Moolenaar 'vim9script', 20441966c248SBram Moolenaar 'syntax sync ccomment # comment', 20451966c248SBram Moolenaar ]) 20461966c248SBram Moolenaar CheckScriptFailure([ 20471966c248SBram Moolenaar 'vim9script', 20481966c248SBram Moolenaar 'syntax sync ccomment# comment', 20491966c248SBram Moolenaar ], 'E404:') 20501966c248SBram Moolenaar 20511966c248SBram Moolenaar CheckScriptSuccess([ 20521966c248SBram Moolenaar 'vim9script', 20531966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 20541966c248SBram Moolenaar ]) 20551966c248SBram Moolenaar CheckScriptFailure([ 20561966c248SBram Moolenaar 'vim9script', 20571966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 20581966c248SBram Moolenaar ], 'E475:') 2059a72cfb80SBram Moolenaar 2060a72cfb80SBram Moolenaar CheckScriptSuccess([ 2061a72cfb80SBram Moolenaar 'vim9script', 2062a72cfb80SBram Moolenaar 'command Echo echo # comment', 2063a72cfb80SBram Moolenaar 'command Echo # comment', 2064a72cfb80SBram Moolenaar ]) 2065a72cfb80SBram Moolenaar CheckScriptFailure([ 2066a72cfb80SBram Moolenaar 'vim9script', 2067a72cfb80SBram Moolenaar 'command Echo echo# comment', 2068a72cfb80SBram Moolenaar 'Echo', 2069a72cfb80SBram Moolenaar ], 'E121:') 2070a72cfb80SBram Moolenaar CheckScriptFailure([ 2071a72cfb80SBram Moolenaar 'vim9script', 2072a72cfb80SBram Moolenaar 'command Echo# comment', 2073a72cfb80SBram Moolenaar ], 'E182:') 2074a72cfb80SBram Moolenaar CheckScriptFailure([ 2075a72cfb80SBram Moolenaar 'vim9script', 2076a72cfb80SBram Moolenaar 'command Echo echo', 2077a72cfb80SBram Moolenaar 'command Echo# comment', 2078a72cfb80SBram Moolenaar ], 'E182:') 2079a72cfb80SBram Moolenaar 2080a72cfb80SBram Moolenaar CheckScriptSuccess([ 2081a72cfb80SBram Moolenaar 'vim9script', 2082a72cfb80SBram Moolenaar 'function # comment', 2083a72cfb80SBram Moolenaar ]) 2084a72cfb80SBram Moolenaar CheckScriptFailure([ 2085a72cfb80SBram Moolenaar 'vim9script', 2086a72cfb80SBram Moolenaar 'function# comment', 2087a72cfb80SBram Moolenaar ], 'E129:') 2088a72cfb80SBram Moolenaar CheckScriptSuccess([ 2089a72cfb80SBram Moolenaar 'vim9script', 2090a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2091a72cfb80SBram Moolenaar ]) 2092a72cfb80SBram Moolenaar CheckScriptFailure([ 2093a72cfb80SBram Moolenaar 'vim9script', 2094a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2095a72cfb80SBram Moolenaar ], 'E488:') 2096a72cfb80SBram Moolenaar 2097a72cfb80SBram Moolenaar CheckScriptSuccess([ 2098a72cfb80SBram Moolenaar 'vim9script', 20994c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2100a72cfb80SBram Moolenaar 'endfunc', 21014c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2102a72cfb80SBram Moolenaar ]) 2103a72cfb80SBram Moolenaar CheckScriptFailure([ 2104a72cfb80SBram Moolenaar 'vim9script', 21054c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2106a72cfb80SBram Moolenaar 'endfunc', 21074c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2108a72cfb80SBram Moolenaar ], 'E488:') 2109a72cfb80SBram Moolenaar 2110a72cfb80SBram Moolenaar CheckScriptSuccess([ 2111a72cfb80SBram Moolenaar 'vim9script', 2112a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2113a72cfb80SBram Moolenaar ]) 2114a72cfb80SBram Moolenaar CheckScriptFailure([ 2115a72cfb80SBram Moolenaar 'vim9script', 2116a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2117a72cfb80SBram Moolenaar ], 'E488:') 21182c5ed4e3SBram Moolenaarenddef 21192c5ed4e3SBram Moolenaar 21202c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 21212c5ed4e3SBram Moolenaar CheckCanRunGui 21222c5ed4e3SBram Moolenaar 21232c5ed4e3SBram Moolenaar CheckScriptFailure([ 21242c5ed4e3SBram Moolenaar 'vim9script', 21252c5ed4e3SBram Moolenaar 'gui#comment' 21262c5ed4e3SBram Moolenaar ], 'E499:') 21272c5ed4e3SBram Moolenaar CheckScriptFailure([ 21282c5ed4e3SBram Moolenaar 'vim9script', 21292c5ed4e3SBram Moolenaar 'gui -f#comment' 21302c5ed4e3SBram Moolenaar ], 'E499:') 21317a092245SBram Moolenaarenddef 21327a092245SBram Moolenaar 2133a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 21346797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 21356797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2136a26b9700SBram Moolenaar 2137a26b9700SBram Moolenaar edit test.vim 2138a26b9700SBram Moolenaar doautocmd TabEnter #comment 2139a26b9700SBram Moolenaar assert_equal(1, g:entered) 2140a26b9700SBram Moolenaar 2141a26b9700SBram Moolenaar doautocmd TabEnter f.x 2142a26b9700SBram Moolenaar assert_equal(2, g:entered) 2143a26b9700SBram Moolenaar 2144a26b9700SBram Moolenaar g:entered = 0 2145a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2146a26b9700SBram Moolenaar assert_equal(2, g:entered) 2147a26b9700SBram Moolenaar 2148a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2149a26b9700SBram Moolenaar 2150a26b9700SBram Moolenaar au! TabEnter 2151a26b9700SBram Moolenaar unlet g:entered 2152d72c1bf0SBram Moolenaar 2153d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2154d72c1bf0SBram Moolenaar 'vim9script', 21556797966dSBram Moolenaar 'g:var = 123', 2156e55b1c09SBram Moolenaar 'b:var = 456', 2157e55b1c09SBram Moolenaar 'w:var = 777', 2158e55b1c09SBram Moolenaar 't:var = 888', 2159d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2160d72c1bf0SBram Moolenaar ]) 2161d72c1bf0SBram Moolenaar 2162d72c1bf0SBram Moolenaar CheckScriptFailure([ 2163d72c1bf0SBram Moolenaar 'vim9script', 2164d72c1bf0SBram Moolenaar 'let g:var = 123', 2165e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2166e55b1c09SBram Moolenaar 2167e55b1c09SBram Moolenaar CheckScriptFailure([ 2168e55b1c09SBram Moolenaar 'vim9script', 2169e55b1c09SBram Moolenaar 'let b:var = 123', 2170e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2171e55b1c09SBram Moolenaar 2172e55b1c09SBram Moolenaar CheckScriptFailure([ 2173e55b1c09SBram Moolenaar 'vim9script', 2174e55b1c09SBram Moolenaar 'let w:var = 123', 2175e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2176e55b1c09SBram Moolenaar 2177e55b1c09SBram Moolenaar CheckScriptFailure([ 2178e55b1c09SBram Moolenaar 'vim9script', 2179e55b1c09SBram Moolenaar 'let t:var = 123', 2180e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2181e55b1c09SBram Moolenaar 2182e55b1c09SBram Moolenaar CheckScriptFailure([ 2183e55b1c09SBram Moolenaar 'vim9script', 2184e55b1c09SBram Moolenaar 'let v:version = 123', 2185e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2186e55b1c09SBram Moolenaar 2187e55b1c09SBram Moolenaar CheckScriptFailure([ 2188e55b1c09SBram Moolenaar 'vim9script', 2189e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2190e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 21916797966dSBram Moolenaar 21926797966dSBram Moolenaar CheckScriptFailure([ 21936797966dSBram Moolenaar 'vim9script', 21946797966dSBram Moolenaar 'g:var = 123', 219532e35117SBram Moolenaar 'unlet g:var# comment1', 2196d72c1bf0SBram Moolenaar ], 'E108:') 2197d72c1bf0SBram Moolenaar 2198d72c1bf0SBram Moolenaar CheckScriptFailure([ 2199d72c1bf0SBram Moolenaar 'let g:var = 123', 2200d72c1bf0SBram Moolenaar 'unlet g:var # something', 2201d72c1bf0SBram Moolenaar ], 'E488:') 2202faac4104SBram Moolenaar 2203faac4104SBram Moolenaar CheckScriptSuccess([ 2204faac4104SBram Moolenaar 'vim9script', 220532e35117SBram Moolenaar 'if 1 # comment2', 2206faac4104SBram Moolenaar ' echo "yes"', 2207faac4104SBram Moolenaar 'elseif 2 #comment', 2208faac4104SBram Moolenaar ' echo "no"', 2209faac4104SBram Moolenaar 'endif', 2210faac4104SBram Moolenaar ]) 2211faac4104SBram Moolenaar 2212faac4104SBram Moolenaar CheckScriptFailure([ 2213faac4104SBram Moolenaar 'vim9script', 221432e35117SBram Moolenaar 'if 1# comment3', 2215faac4104SBram Moolenaar ' echo "yes"', 2216faac4104SBram Moolenaar 'endif', 2217faac4104SBram Moolenaar ], 'E15:') 2218faac4104SBram Moolenaar 2219faac4104SBram Moolenaar CheckScriptFailure([ 2220faac4104SBram Moolenaar 'vim9script', 222132e35117SBram Moolenaar 'if 0 # comment4', 2222faac4104SBram Moolenaar ' echo "yes"', 2223faac4104SBram Moolenaar 'elseif 2#comment', 2224faac4104SBram Moolenaar ' echo "no"', 2225faac4104SBram Moolenaar 'endif', 2226faac4104SBram Moolenaar ], 'E15:') 2227faac4104SBram Moolenaar 2228faac4104SBram Moolenaar CheckScriptSuccess([ 2229faac4104SBram Moolenaar 'vim9script', 223032e35117SBram Moolenaar 'let v = 1 # comment5', 2231faac4104SBram Moolenaar ]) 2232faac4104SBram Moolenaar 2233faac4104SBram Moolenaar CheckScriptFailure([ 2234faac4104SBram Moolenaar 'vim9script', 223532e35117SBram Moolenaar 'let v = 1# comment6', 223632e35117SBram Moolenaar ], 'E15:') 2237faac4104SBram Moolenaar 2238faac4104SBram Moolenaar CheckScriptSuccess([ 2239faac4104SBram Moolenaar 'vim9script', 2240faac4104SBram Moolenaar 'new' 2241faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2242df069eecSBram Moolenaar ':$', 2243faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2244faac4104SBram Moolenaar 'bwipe!', 2245faac4104SBram Moolenaar ]) 2246faac4104SBram Moolenaar 2247f5be8cdbSBram Moolenaar CheckScriptFailure([ 2248f5be8cdbSBram Moolenaar 'vim9script', 2249f5be8cdbSBram Moolenaar 'new' 2250f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2251f5be8cdbSBram Moolenaar ':$', 2252f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2253f5be8cdbSBram Moolenaar 'bwipe!', 2254f5be8cdbSBram Moolenaar ], 'E488:') 2255f5be8cdbSBram Moolenaar 2256f5be8cdbSBram Moolenaar CheckScriptFailure([ 2257f5be8cdbSBram Moolenaar 'vim9script', 2258f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2259f5be8cdbSBram Moolenaar ], 'E477:') 2260a26b9700SBram Moolenaarenddef 2261a26b9700SBram Moolenaar 22627e5bd91dSBram Moolenaardef Test_finish() 22637e5bd91dSBram Moolenaar let lines =<< trim END 22647e5bd91dSBram Moolenaar vim9script 22656797966dSBram Moolenaar g:res = 'one' 22667e5bd91dSBram Moolenaar if v:false | finish | endif 22676797966dSBram Moolenaar g:res = 'two' 22687e5bd91dSBram Moolenaar finish 22696797966dSBram Moolenaar g:res = 'three' 22707e5bd91dSBram Moolenaar END 22717e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 22727e5bd91dSBram Moolenaar source Xfinished 22737e5bd91dSBram Moolenaar assert_equal('two', g:res) 22747e5bd91dSBram Moolenaar 22757e5bd91dSBram Moolenaar unlet g:res 22767e5bd91dSBram Moolenaar delete('Xfinished') 22777e5bd91dSBram Moolenaarenddef 22787e5bd91dSBram Moolenaar 227932e35117SBram Moolenaardef Test_let_func_call() 228032e35117SBram Moolenaar let lines =<< trim END 228132e35117SBram Moolenaar vim9script 228232e35117SBram Moolenaar func GetValue() 228332e35117SBram Moolenaar if exists('g:count') 228432e35117SBram Moolenaar let g:count += 1 228532e35117SBram Moolenaar else 228632e35117SBram Moolenaar let g:count = 1 228732e35117SBram Moolenaar endif 228832e35117SBram Moolenaar return 'this' 228932e35117SBram Moolenaar endfunc 229032e35117SBram Moolenaar let val: string = GetValue() 2291f5be8cdbSBram Moolenaar # env var is always a string 2292df671b46SBram Moolenaar let env = $TERM 229332e35117SBram Moolenaar END 229432e35117SBram Moolenaar writefile(lines, 'Xfinished') 229532e35117SBram Moolenaar source Xfinished 2296f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 229732e35117SBram Moolenaar assert_equal(1, g:count) 229832e35117SBram Moolenaar 229932e35117SBram Moolenaar unlet g:count 230032e35117SBram Moolenaar delete('Xfinished') 230132e35117SBram Moolenaarenddef 230232e35117SBram Moolenaar 230332e35117SBram Moolenaardef Test_let_missing_type() 230432e35117SBram Moolenaar let lines =<< trim END 230532e35117SBram Moolenaar vim9script 2306df671b46SBram Moolenaar let var = g:unknown 2307227a69deSBram Moolenaar END 2308822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2309227a69deSBram Moolenaar 2310227a69deSBram Moolenaar lines =<< trim END 2311227a69deSBram Moolenaar vim9script 2312227a69deSBram Moolenaar let nr: number = 123 2313227a69deSBram Moolenaar let var = nr 2314227a69deSBram Moolenaar END 2315822ba247SBram Moolenaar CheckScriptSuccess(lines) 231632e35117SBram Moolenaarenddef 231732e35117SBram Moolenaar 2318c82a5b5dSBram Moolenaardef Test_let_declaration() 2319c82a5b5dSBram Moolenaar let lines =<< trim END 2320c82a5b5dSBram Moolenaar vim9script 2321c82a5b5dSBram Moolenaar let var: string 2322c82a5b5dSBram Moolenaar g:var_uninit = var 2323c82a5b5dSBram Moolenaar var = 'text' 2324c82a5b5dSBram Moolenaar g:var_test = var 2325f5be8cdbSBram Moolenaar # prefixing s: is optional 2326984dddbeSBram Moolenaar s:var = 'prefixed' 2327984dddbeSBram Moolenaar g:var_prefixed = s:var 2328984dddbeSBram Moolenaar 2329984dddbeSBram Moolenaar let s:other: number 2330984dddbeSBram Moolenaar other = 1234 2331984dddbeSBram Moolenaar g:other_var = other 2332c82a5b5dSBram Moolenaar END 2333c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2334c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2335c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2336984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2337984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2338c82a5b5dSBram Moolenaar 2339c82a5b5dSBram Moolenaar unlet g:var_uninit 2340c82a5b5dSBram Moolenaar unlet g:var_test 2341984dddbeSBram Moolenaar unlet g:var_prefixed 2342984dddbeSBram Moolenaar unlet g:other_var 2343c82a5b5dSBram Moolenaarenddef 2344c82a5b5dSBram Moolenaar 2345c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2346c5b1c20bSBram Moolenaar let lines =<< trim END 2347c5b1c20bSBram Moolenaar vim9script 2348c5b1c20bSBram Moolenaar const var: string 2349c5b1c20bSBram Moolenaar END 2350c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2351c5b1c20bSBram Moolenaar 2352c5b1c20bSBram Moolenaar lines =<< trim END 2353c5b1c20bSBram Moolenaar vim9script 2354c5b1c20bSBram Moolenaar let 9var: string 2355c5b1c20bSBram Moolenaar END 2356c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2357c5b1c20bSBram Moolenaarenddef 2358c5b1c20bSBram Moolenaar 235934db91f7SBram Moolenaardef Test_let_type_check() 236034db91f7SBram Moolenaar let lines =<< trim END 236134db91f7SBram Moolenaar vim9script 236234db91f7SBram Moolenaar let var: string 236334db91f7SBram Moolenaar var = 1234 236434db91f7SBram Moolenaar END 236534db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2366984dddbeSBram Moolenaar 2367984dddbeSBram Moolenaar lines =<< trim END 2368984dddbeSBram Moolenaar vim9script 2369984dddbeSBram Moolenaar let var:string 2370984dddbeSBram Moolenaar END 2371984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2372c5b1c20bSBram Moolenaar 2373c5b1c20bSBram Moolenaar lines =<< trim END 2374c5b1c20bSBram Moolenaar vim9script 2375c5b1c20bSBram Moolenaar let var: asdf 2376c5b1c20bSBram Moolenaar END 2377c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 237834db91f7SBram Moolenaarenddef 237934db91f7SBram Moolenaar 2380a5d0077eSBram Moolenaardef Test_forward_declaration() 2381a5d0077eSBram Moolenaar let lines =<< trim END 2382a5d0077eSBram Moolenaar vim9script 2383a5d0077eSBram Moolenaar def GetValue(): string 2384a5d0077eSBram Moolenaar return theVal 2385a5d0077eSBram Moolenaar enddef 2386a5d0077eSBram Moolenaar let theVal = 'something' 2387822ba247SBram Moolenaar g:initVal = GetValue() 2388a5d0077eSBram Moolenaar theVal = 'else' 2389a5d0077eSBram Moolenaar g:laterVal = GetValue() 2390a5d0077eSBram Moolenaar END 2391a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2392a5d0077eSBram Moolenaar source Xforward 2393a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2394a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2395a5d0077eSBram Moolenaar 2396a5d0077eSBram Moolenaar unlet g:initVal 2397a5d0077eSBram Moolenaar unlet g:laterVal 2398a5d0077eSBram Moolenaar delete('Xforward') 2399a5d0077eSBram Moolenaarenddef 2400a5d0077eSBram Moolenaar 24019721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 24029721fb4eSBram Moolenaar let legacy_lines =<< trim END 24039721fb4eSBram Moolenaar source Xvim9_script.vim 24049721fb4eSBram Moolenaar 24059721fb4eSBram Moolenaar call assert_false(exists('local')) 24069721fb4eSBram Moolenaar call assert_false(exists('exported')) 24079721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 24089721fb4eSBram Moolenaar call assert_equal('global', global) 24099721fb4eSBram Moolenaar call assert_equal('global', g:global) 24109721fb4eSBram Moolenaar 24119721fb4eSBram Moolenaar " imported variable becomes script-local 24129721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 24139721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 24149721fb4eSBram Moolenaar call assert_false(exists('exported')) 24159721fb4eSBram Moolenaar 24169721fb4eSBram Moolenaar " imported function becomes script-local 24179721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 24189721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 24199721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 24209721fb4eSBram Moolenaar END 24219721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 24229721fb4eSBram Moolenaar 24239721fb4eSBram Moolenaar let vim9_lines =<< trim END 24249721fb4eSBram Moolenaar vim9script 24259721fb4eSBram Moolenaar let local = 'local' 24269721fb4eSBram Moolenaar g:global = 'global' 24279721fb4eSBram Moolenaar export let exported = 'exported' 24289721fb4eSBram Moolenaar export def GetText(): string 24299721fb4eSBram Moolenaar return 'text' 24309721fb4eSBram Moolenaar enddef 24319721fb4eSBram Moolenaar END 24329721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 24339721fb4eSBram Moolenaar 24349721fb4eSBram Moolenaar source Xlegacy_script.vim 24359721fb4eSBram Moolenaar 24369721fb4eSBram Moolenaar assert_equal('global', g:global) 2437f5be8cdbSBram Moolenaar unlet g:global 24389721fb4eSBram Moolenaar 24399721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 24409721fb4eSBram Moolenaar delete('Xvim9_script.vim') 24419721fb4eSBram Moolenaarenddef 2442a5d0077eSBram Moolenaar 2443eeb27bfeSBram Moolenaardef Test_vim9_copen() 2444eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2445eeb27bfeSBram Moolenaar copen 2446eeb27bfeSBram Moolenaar quit 2447eeb27bfeSBram Moolenaarenddef 2448eeb27bfeSBram Moolenaar 2449585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2450585fea7bSBram Moolenaardef Test_substitute_cmd() 2451585fea7bSBram Moolenaar new 2452585fea7bSBram Moolenaar setline(1, 'something') 2453585fea7bSBram Moolenaar :substitute(some(other( 2454585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2455585fea7bSBram Moolenaar bwipe! 2456585fea7bSBram Moolenaar 2457f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2458585fea7bSBram Moolenaar let lines =<< trim END 2459585fea7bSBram Moolenaar vim9script 2460585fea7bSBram Moolenaar new 2461585fea7bSBram Moolenaar setline(1, 'something') 2462585fea7bSBram Moolenaar :substitute(some(other( 2463585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2464585fea7bSBram Moolenaar bwipe! 2465585fea7bSBram Moolenaar END 2466585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2467585fea7bSBram Moolenaar source Xvim9lines 2468585fea7bSBram Moolenaar 2469585fea7bSBram Moolenaar delete('Xvim9lines') 2470585fea7bSBram Moolenaarenddef 2471585fea7bSBram Moolenaar 24728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2473