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' 206e587dcbSBram Moolenaar 218a7d6542SBram Moolenaardef Test_assignment() 228a7d6542SBram Moolenaar let bool1: bool = true 238a7d6542SBram Moolenaar assert_equal(v:true, bool1) 248a7d6542SBram Moolenaar let bool2: bool = false 258a7d6542SBram Moolenaar assert_equal(v:false, bool2) 268a7d6542SBram Moolenaar 27f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 28f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 291cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 30f93c7feaSBram Moolenaar 319be61bbbSBram Moolenaar let a: number = 6 329be61bbbSBram Moolenaar assert_equal(6, a) 339be61bbbSBram Moolenaar 3442a480bfSBram Moolenaar if has('channel') 3542a480bfSBram Moolenaar let chan1: channel 36fbdd08edSBram Moolenaar let job1: job 37f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 3842a480bfSBram Moolenaar endif 39fbdd08edSBram Moolenaar if has('float') 40fbdd08edSBram Moolenaar let float1: float = 3.4 41fbdd08edSBram Moolenaar endif 425deeb3f1SBram Moolenaar let Funky1: func 435deeb3f1SBram Moolenaar let Funky2: func = function('len') 444c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4542a480bfSBram Moolenaar 46401d9ffbSBram Moolenaar g:newvar = 'new' 47401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 48401d9ffbSBram Moolenaar 49401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 50401d9ffbSBram Moolenaar g:existing = 'no' 51401d9ffbSBram Moolenaar assert_equal('no', g:existing) 52401d9ffbSBram Moolenaar 53b283a8a6SBram Moolenaar v:char = 'abc' 546e587dcbSBram Moolenaar assert_equal('abc', v:char) 55b283a8a6SBram Moolenaar 56b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 576e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 58b283a8a6SBram Moolenaar $ENVVAR = '' 596e587dcbSBram Moolenaar 60fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 61fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 62fd1823e0SBram Moolenaar s:addToMe += 222 63fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 640bbf722aSBram Moolenaar s:newVar = 'new' 650bbf722aSBram Moolenaar assert_equal('new', s:newVar) 66a8c17704SBram Moolenaar 67a8c17704SBram Moolenaar set ts=7 68a8c17704SBram Moolenaar &ts += 1 69a8c17704SBram Moolenaar assert_equal(8, &ts) 7080c34ca3SBram Moolenaar &ts -= 3 7180c34ca3SBram Moolenaar assert_equal(5, &ts) 7280c34ca3SBram Moolenaar &ts *= 2 7380c34ca3SBram Moolenaar assert_equal(10, &ts) 7480c34ca3SBram Moolenaar &ts /= 3 7580c34ca3SBram Moolenaar assert_equal(3, &ts) 7680c34ca3SBram Moolenaar set ts=10 7780c34ca3SBram Moolenaar &ts %= 4 7880c34ca3SBram Moolenaar assert_equal(2, &ts) 79a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 80a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 81a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 82a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 83a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 84a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 85a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 86a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 87cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 88585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 8980c34ca3SBram Moolenaar &ts = 8 90a8c17704SBram Moolenaar 91a8c17704SBram Moolenaar g:inc_counter += 1 92a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 93a8c17704SBram Moolenaar 94a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 95a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 96a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 97a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 98a8c17704SBram Moolenaar 99a8c17704SBram Moolenaar @a = 'areg' 100a8c17704SBram Moolenaar @a ..= 'add' 101a8c17704SBram Moolenaar assert_equal('aregadd', @a) 102a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 103a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 104e69f6d04SBram Moolenaar 105e69f6d04SBram Moolenaar v:errmsg = 'none' 106e69f6d04SBram Moolenaar v:errmsg ..= 'again' 107e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 108e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 109e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 1105deeb3f1SBram Moolenaarenddef 1115deeb3f1SBram Moolenaar 1123b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1133b74b6b4SBram Moolenaar let lines =<< trim END 1143b74b6b4SBram Moolenaar vim9script 1153b74b6b4SBram Moolenaar 116f5be8cdbSBram Moolenaar # single character variable declarations work 1173b74b6b4SBram Moolenaar let a: string 1183b74b6b4SBram Moolenaar let b: number 1193b74b6b4SBram Moolenaar let l: list<any> 1203b74b6b4SBram Moolenaar let s: string 1213b74b6b4SBram Moolenaar let t: number 1223b74b6b4SBram Moolenaar let v: number 1233b74b6b4SBram Moolenaar let w: number 1243b74b6b4SBram Moolenaar 125f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1263b74b6b4SBram Moolenaar a = 'script-a' 1273b74b6b4SBram Moolenaar b = 111 1283b74b6b4SBram Moolenaar l = [1, 2, 3] 1293b74b6b4SBram Moolenaar s = 'script-s' 1303b74b6b4SBram Moolenaar t = 222 1313b74b6b4SBram Moolenaar v = 333 1323b74b6b4SBram Moolenaar w = 444 1333b74b6b4SBram Moolenaar 1343b74b6b4SBram Moolenaar assert_equal('script-a', a) 1353b74b6b4SBram Moolenaar assert_equal(111, b) 1363b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 1373b74b6b4SBram Moolenaar assert_equal('script-s', s) 1383b74b6b4SBram Moolenaar assert_equal(222, t) 1393b74b6b4SBram Moolenaar assert_equal(333, v) 1403b74b6b4SBram Moolenaar assert_equal(444, w) 1413b74b6b4SBram Moolenaar END 1423b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 1433b74b6b4SBram Moolenaar source Xsinglechar 1443b74b6b4SBram Moolenaar delete('Xsinglechar') 1453b74b6b4SBram Moolenaarenddef 1463b74b6b4SBram Moolenaar 14784370087SBram Moolenaardef Test_assignment_list() 14884370087SBram Moolenaar let list1: list<bool> = [false, true, false] 14984370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 15084370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 15184370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 15284370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 15384370087SBram Moolenaar 15484370087SBram Moolenaar let listS: list<string> = [] 15584370087SBram Moolenaar let listN: list<number> = [] 15684370087SBram Moolenaar 15784370087SBram Moolenaar assert_equal([1, 2, 3], list2) 15884370087SBram Moolenaar list2[-1] = 99 15984370087SBram Moolenaar assert_equal([1, 2, 99], list2) 16084370087SBram Moolenaar list2[-2] = 88 16184370087SBram Moolenaar assert_equal([1, 88, 99], list2) 16284370087SBram Moolenaar list2[-3] = 77 16384370087SBram Moolenaar assert_equal([77, 88, 99], list2) 16484370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 165c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 16684370087SBram Moolenaar 16784370087SBram Moolenaar # type becomes list<any> 16884370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 16984370087SBram Moolenaarenddef 17084370087SBram Moolenaar 17184370087SBram Moolenaardef Test_assignment_dict() 17284370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 17384370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 17484370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 17584370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 17674fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 17784370087SBram Moolenaar 178f5be8cdbSBram Moolenaar # overwrite 179c785b9a7SBram Moolenaar dict3['key'] = 'another' 180c785b9a7SBram Moolenaar 18184370087SBram Moolenaar call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:') 18284370087SBram Moolenaar 18384370087SBram Moolenaar # type becomes dict<any> 18484370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 18584370087SBram Moolenaarenddef 18684370087SBram Moolenaar 187d3aac291SBram Moolenaardef Test_assignment_local() 188f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 189f5be8cdbSBram Moolenaar # changed. 190d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 191d3aac291SBram Moolenaar let b:existing = 'yes' 192d3aac291SBram Moolenaar let w:existing = 'yes' 193d3aac291SBram Moolenaar let t:existing = 'yes' 194d3aac291SBram Moolenaar 195d3aac291SBram Moolenaar def Test_assignment_local_internal() 196d3aac291SBram Moolenaar b:newvar = 'new' 197d3aac291SBram Moolenaar assert_equal('new', b:newvar) 198d3aac291SBram Moolenaar assert_equal('yes', b:existing) 199d3aac291SBram Moolenaar b:existing = 'no' 200d3aac291SBram Moolenaar assert_equal('no', b:existing) 201396f3138SBram Moolenaar b:existing ..= 'NO' 202396f3138SBram Moolenaar assert_equal('noNO', b:existing) 203d3aac291SBram Moolenaar 204d3aac291SBram Moolenaar w:newvar = 'new' 205d3aac291SBram Moolenaar assert_equal('new', w:newvar) 206d3aac291SBram Moolenaar assert_equal('yes', w:existing) 207d3aac291SBram Moolenaar w:existing = 'no' 208d3aac291SBram Moolenaar assert_equal('no', w:existing) 209396f3138SBram Moolenaar w:existing ..= 'NO' 210396f3138SBram Moolenaar assert_equal('noNO', w:existing) 211d3aac291SBram Moolenaar 212d3aac291SBram Moolenaar t:newvar = 'new' 213d3aac291SBram Moolenaar assert_equal('new', t:newvar) 214d3aac291SBram Moolenaar assert_equal('yes', t:existing) 215d3aac291SBram Moolenaar t:existing = 'no' 216d3aac291SBram Moolenaar assert_equal('no', t:existing) 217396f3138SBram Moolenaar t:existing ..= 'NO' 218396f3138SBram Moolenaar assert_equal('noNO', t:existing) 219d3aac291SBram Moolenaar enddef 220d3aac291SBram Moolenaar call Test_assignment_local_internal() 221d3aac291SBram Moolenaar END 222d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 223d3aac291SBram Moolenaarenddef 224d3aac291SBram Moolenaar 2255deeb3f1SBram Moolenaardef Test_assignment_default() 226e69f6d04SBram Moolenaar 227cb711abfSBram Moolenaar # Test default values. 228e69f6d04SBram Moolenaar let thebool: bool 229e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 230e69f6d04SBram Moolenaar 231e69f6d04SBram Moolenaar let thenumber: number 232e69f6d04SBram Moolenaar assert_equal(0, thenumber) 233e69f6d04SBram Moolenaar 234e69f6d04SBram Moolenaar if has('float') 235e69f6d04SBram Moolenaar let thefloat: float 236e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 237e69f6d04SBram Moolenaar endif 238e69f6d04SBram Moolenaar 239e69f6d04SBram Moolenaar let thestring: string 240e69f6d04SBram Moolenaar assert_equal('', thestring) 241e69f6d04SBram Moolenaar 242e69f6d04SBram Moolenaar let theblob: blob 243e69f6d04SBram Moolenaar assert_equal(0z, theblob) 244e69f6d04SBram Moolenaar 2455deeb3f1SBram Moolenaar let Thefunc: func 2465deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 247e69f6d04SBram Moolenaar 248e69f6d04SBram Moolenaar let thelist: list<any> 249e69f6d04SBram Moolenaar assert_equal([], thelist) 250e69f6d04SBram Moolenaar 251e69f6d04SBram Moolenaar let thedict: dict<any> 252e69f6d04SBram Moolenaar assert_equal({}, thedict) 253e69f6d04SBram Moolenaar 2542c869deeSBram Moolenaar if has('channel') 255e69f6d04SBram Moolenaar let thejob: job 256e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 257e69f6d04SBram Moolenaar 258e69f6d04SBram Moolenaar let thechannel: channel 259e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 260c785b9a7SBram Moolenaar 261c785b9a7SBram Moolenaar if has('unix') && executable('cat') 262f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 263c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 264c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 265c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 266c785b9a7SBram Moolenaar endif 2672c869deeSBram Moolenaar endif 268585fea7bSBram Moolenaar 269585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 270585fea7bSBram Moolenaar assert_equal(5678, nr) 2718a7d6542SBram Moolenaarenddef 2728a7d6542SBram Moolenaar 27347a519a9SBram Moolenaardef Test_assignment_var_list() 27447a519a9SBram Moolenaar let v1: string 27547a519a9SBram Moolenaar let v2: string 2769af78769SBram Moolenaar let vrem: list<string> 2779af78769SBram Moolenaar [v1] = ['aaa'] 2789af78769SBram Moolenaar assert_equal('aaa', v1) 2799af78769SBram Moolenaar 28047a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 28147a519a9SBram Moolenaar assert_equal('one', v1) 28247a519a9SBram Moolenaar assert_equal('two', v2) 2839af78769SBram Moolenaar 2849af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 2859af78769SBram Moolenaar assert_equal('one', v1) 2869af78769SBram Moolenaar assert_equal('two', v2) 2879af78769SBram Moolenaar assert_equal([], vrem) 2889af78769SBram Moolenaar 2899af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 2909af78769SBram Moolenaar assert_equal('one', v1) 2919af78769SBram Moolenaar assert_equal('two', v2) 2929af78769SBram Moolenaar assert_equal(['three'], vrem) 29347a519a9SBram Moolenaarenddef 29447a519a9SBram Moolenaar 295cab27678SBram Moolenaardef Mess(): string 296cab27678SBram Moolenaar v:foldstart = 123 297cab27678SBram Moolenaar return 'xxx' 298cab27678SBram Moolenaarenddef 299cab27678SBram Moolenaar 300d72c1bf0SBram Moolenaardef Test_assignment_failure() 3018a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 3028a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 3038a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 3048a7d6542SBram Moolenaar 3058a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 3068a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 3078a7d6542SBram Moolenaar 3089b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 3099af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3109af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 3119af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 3129af78769SBram Moolenaar '[a] = []'], 'E1093:') 3139af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3149af78769SBram Moolenaar 'let y: number', 3159af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 3169af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 3179af78769SBram Moolenaar 'let y: number', 3189af78769SBram Moolenaar 'let z: list<number>', 3199af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 3209be61bbbSBram Moolenaar 321e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 3229be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 3239be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 3249be61bbbSBram Moolenaar 325e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 3269be61bbbSBram Moolenaar 3279be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 3289be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 3299be61bbbSBram Moolenaar 330e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 331e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 332e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 333e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 3349be61bbbSBram Moolenaar 3359be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 3369be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 3379be61bbbSBram Moolenaar 338822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 33933fa29cfSBram Moolenaar 3408a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 3418a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 3428a7d6542SBram Moolenaar 3438a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 3448a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 3458a7d6542SBram Moolenaar 3468a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 3478a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 34842a480bfSBram Moolenaar 349d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 35042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 351cab27678SBram Moolenaar 352cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 353cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 354d72c1bf0SBram Moolenaarenddef 355d72c1bf0SBram Moolenaar 356d72c1bf0SBram Moolenaardef Test_unlet() 357d72c1bf0SBram Moolenaar g:somevar = 'yes' 358d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 359d72c1bf0SBram Moolenaar unlet g:somevar 360d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 361d72c1bf0SBram Moolenaar unlet! g:somevar 362d72c1bf0SBram Moolenaar 363d72c1bf0SBram Moolenaar call CheckScriptFailure([ 364d72c1bf0SBram Moolenaar 'vim9script', 365d72c1bf0SBram Moolenaar 'let svar = 123', 366d72c1bf0SBram Moolenaar 'unlet svar', 367d72c1bf0SBram Moolenaar ], 'E1081:') 368d72c1bf0SBram Moolenaar call CheckScriptFailure([ 369d72c1bf0SBram Moolenaar 'vim9script', 370d72c1bf0SBram Moolenaar 'let svar = 123', 371d72c1bf0SBram Moolenaar 'unlet s:svar', 372d72c1bf0SBram Moolenaar ], 'E1081:') 373d72c1bf0SBram Moolenaar call CheckScriptFailure([ 374d72c1bf0SBram Moolenaar 'vim9script', 375d72c1bf0SBram Moolenaar 'let svar = 123', 376d72c1bf0SBram Moolenaar 'def Func()', 377d72c1bf0SBram Moolenaar ' unlet svar', 378d72c1bf0SBram Moolenaar 'enddef', 379822ba247SBram Moolenaar 'defcompile', 380d72c1bf0SBram Moolenaar ], 'E1081:') 381d72c1bf0SBram Moolenaar call CheckScriptFailure([ 382d72c1bf0SBram Moolenaar 'vim9script', 383d72c1bf0SBram Moolenaar 'let svar = 123', 384d72c1bf0SBram Moolenaar 'def Func()', 385d72c1bf0SBram Moolenaar ' unlet s:svar', 386d72c1bf0SBram Moolenaar 'enddef', 387822ba247SBram Moolenaar 'defcompile', 388d72c1bf0SBram Moolenaar ], 'E1081:') 3897bdaea6eSBram Moolenaar 3907bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 3917bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 3927bdaea6eSBram Moolenaar unlet $ENVVAR 3937bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 394d72c1bf0SBram Moolenaarenddef 395599c89c8SBram Moolenaar 3964c17ad94SBram Moolenaardef Test_delfunction() 397f5be8cdbSBram Moolenaar # Check function is defined in script namespace 3984c17ad94SBram Moolenaar CheckScriptSuccess([ 3994c17ad94SBram Moolenaar 'vim9script', 4004c17ad94SBram Moolenaar 'func CheckMe()', 4014c17ad94SBram Moolenaar ' return 123', 4024c17ad94SBram Moolenaar 'endfunc', 4034c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 4044c17ad94SBram Moolenaar ]) 4054c17ad94SBram Moolenaar 406f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 4074c17ad94SBram Moolenaar CheckScriptFailure([ 4084c17ad94SBram Moolenaar 'vim9script', 4094c17ad94SBram Moolenaar 'func DeleteMe1()', 4104c17ad94SBram Moolenaar 'endfunc', 4114c17ad94SBram Moolenaar 'delfunction DeleteMe1', 4124c17ad94SBram Moolenaar ], 'E1084:') 4134c17ad94SBram Moolenaar CheckScriptFailure([ 4144c17ad94SBram Moolenaar 'vim9script', 4154c17ad94SBram Moolenaar 'func DeleteMe2()', 4164c17ad94SBram Moolenaar 'endfunc', 4174c17ad94SBram Moolenaar 'def DoThat()', 4184c17ad94SBram Moolenaar ' delfunction DeleteMe2', 4194c17ad94SBram Moolenaar 'enddef', 4204c17ad94SBram Moolenaar 'DoThat()', 4214c17ad94SBram Moolenaar ], 'E1084:') 4224c17ad94SBram Moolenaar CheckScriptFailure([ 4234c17ad94SBram Moolenaar 'vim9script', 4244c17ad94SBram Moolenaar 'def DeleteMe3()', 4254c17ad94SBram Moolenaar 'enddef', 4264c17ad94SBram Moolenaar 'delfunction DeleteMe3', 4274c17ad94SBram Moolenaar ], 'E1084:') 4284c17ad94SBram Moolenaar CheckScriptFailure([ 4294c17ad94SBram Moolenaar 'vim9script', 4304c17ad94SBram Moolenaar 'def DeleteMe4()', 4314c17ad94SBram Moolenaar 'enddef', 4324c17ad94SBram Moolenaar 'def DoThat()', 4334c17ad94SBram Moolenaar ' delfunction DeleteMe4', 4344c17ad94SBram Moolenaar 'enddef', 4354c17ad94SBram Moolenaar 'DoThat()', 4364c17ad94SBram Moolenaar ], 'E1084:') 4374c17ad94SBram Moolenaarenddef 4384c17ad94SBram Moolenaar 439599c89c8SBram Moolenaarfunc Test_wrong_type() 440599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 441599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 442599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 443599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 444599c89c8SBram Moolenaar 445599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 446599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 44742a480bfSBram Moolenaar 44842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 44942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 45042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 45142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 45242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 45342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 45442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 45542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 45642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 45742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 45842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 459a0a9f43aSBram Moolenaar 460a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 461a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 4628a7d6542SBram Moolenaarendfunc 4638a7d6542SBram Moolenaar 4648a7d6542SBram Moolenaarfunc Test_const() 4658a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 4668a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 4678a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 4689be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 4698a7d6542SBram Moolenaarendfunc 4708a7d6542SBram Moolenaar 471df069eecSBram Moolenaardef Test_range_no_colon() 472df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 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 Moolenaarenddef 477df069eecSBram Moolenaar 478df069eecSBram Moolenaar 4798a7d6542SBram Moolenaardef Test_block() 4808a7d6542SBram Moolenaar let outer = 1 4818a7d6542SBram Moolenaar { 4828a7d6542SBram Moolenaar let inner = 2 4838a7d6542SBram Moolenaar assert_equal(1, outer) 4848a7d6542SBram Moolenaar assert_equal(2, inner) 4858a7d6542SBram Moolenaar } 4868a7d6542SBram Moolenaar assert_equal(1, outer) 4878a7d6542SBram Moolenaarenddef 4888a7d6542SBram Moolenaar 4898a7d6542SBram Moolenaarfunc Test_block_failure() 4908a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 491585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 492585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 4938a7d6542SBram Moolenaarendfunc 4948a7d6542SBram Moolenaar 495585fea7bSBram Moolenaardef Test_cmd_modifier() 496585fea7bSBram Moolenaar tab echo '0' 497585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 498585fea7bSBram Moolenaarenddef 499585fea7bSBram Moolenaar 5008a7d6542SBram Moolenaardef Test_try_catch() 5018a7d6542SBram Moolenaar let l = [] 5027a092245SBram Moolenaar try # comment 5038a7d6542SBram Moolenaar add(l, '1') 5048a7d6542SBram Moolenaar throw 'wrong' 5058a7d6542SBram Moolenaar add(l, '2') 5067a092245SBram Moolenaar catch # comment 5078a7d6542SBram Moolenaar add(l, v:exception) 5087a092245SBram Moolenaar finally # comment 5098a7d6542SBram Moolenaar add(l, '3') 5107a092245SBram Moolenaar endtry # comment 5118a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 512*68d130c6SBram Moolenaar 513*68d130c6SBram Moolenaar let n: number 514*68d130c6SBram Moolenaar try 515*68d130c6SBram Moolenaar n = l[3] 516*68d130c6SBram Moolenaar catch /E684:/ 517*68d130c6SBram Moolenaar n = 99 518*68d130c6SBram Moolenaar endtry 519*68d130c6SBram Moolenaar assert_equal(99, n) 520*68d130c6SBram Moolenaar 521*68d130c6SBram Moolenaar try 522*68d130c6SBram Moolenaar n = g:astring[3] 523*68d130c6SBram Moolenaar catch /E714:/ 524*68d130c6SBram Moolenaar n = 77 525*68d130c6SBram Moolenaar endtry 526*68d130c6SBram Moolenaar assert_equal(77, n) 527*68d130c6SBram Moolenaar 528*68d130c6SBram Moolenaar try 529*68d130c6SBram Moolenaar n = l[g:astring] 530*68d130c6SBram Moolenaar catch /E39:/ 531*68d130c6SBram Moolenaar n = 77 532*68d130c6SBram Moolenaar endtry 533*68d130c6SBram Moolenaar assert_equal(77, n) 534*68d130c6SBram Moolenaar 535*68d130c6SBram Moolenaar try 536*68d130c6SBram Moolenaar n = s:does_not_exist 537*68d130c6SBram Moolenaar catch /E121:/ 538*68d130c6SBram Moolenaar n = 121 539*68d130c6SBram Moolenaar endtry 540*68d130c6SBram Moolenaar assert_equal(121, n) 541*68d130c6SBram Moolenaar 542*68d130c6SBram Moolenaar let d = #{one: 1} 543*68d130c6SBram Moolenaar try 544*68d130c6SBram Moolenaar n = d[g:astring] 545*68d130c6SBram Moolenaar catch /E716:/ 546*68d130c6SBram Moolenaar n = 222 547*68d130c6SBram Moolenaar endtry 548*68d130c6SBram Moolenaar assert_equal(222, n) 5498a7d6542SBram Moolenaarenddef 5508a7d6542SBram Moolenaar 551257cc5eeSBram Moolenaardef ThrowFromDef() 552a72cfb80SBram Moolenaar throw "getout" # comment 553257cc5eeSBram Moolenaarenddef 554257cc5eeSBram Moolenaar 555257cc5eeSBram Moolenaarfunc CatchInFunc() 556257cc5eeSBram Moolenaar try 557257cc5eeSBram Moolenaar call ThrowFromDef() 558257cc5eeSBram Moolenaar catch 559257cc5eeSBram Moolenaar let g:thrown_func = v:exception 560257cc5eeSBram Moolenaar endtry 561257cc5eeSBram Moolenaarendfunc 562257cc5eeSBram Moolenaar 563257cc5eeSBram Moolenaardef CatchInDef() 564257cc5eeSBram Moolenaar try 565257cc5eeSBram Moolenaar ThrowFromDef() 566257cc5eeSBram Moolenaar catch 567257cc5eeSBram Moolenaar g:thrown_def = v:exception 568257cc5eeSBram Moolenaar endtry 569257cc5eeSBram Moolenaarenddef 570257cc5eeSBram Moolenaar 571f575adffSBram Moolenaardef ReturnFinally(): string 572f575adffSBram Moolenaar try 573f575adffSBram Moolenaar return 'intry' 574f575adffSBram Moolenaar finally 575f575adffSBram Moolenaar g:in_finally = 'finally' 576f575adffSBram Moolenaar endtry 577f575adffSBram Moolenaar return 'end' 578f575adffSBram Moolenaarenddef 579f575adffSBram Moolenaar 580257cc5eeSBram Moolenaardef Test_try_catch_nested() 581257cc5eeSBram Moolenaar CatchInFunc() 582257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 583257cc5eeSBram Moolenaar 584257cc5eeSBram Moolenaar CatchInDef() 585257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 586f575adffSBram Moolenaar 587f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 588f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 589f575adffSBram Moolenaarenddef 590f575adffSBram Moolenaar 591f575adffSBram Moolenaardef Test_try_catch_match() 592f575adffSBram Moolenaar let seq = 'a' 593f575adffSBram Moolenaar try 594f575adffSBram Moolenaar throw 'something' 595f575adffSBram Moolenaar catch /nothing/ 596f575adffSBram Moolenaar seq ..= 'x' 597f575adffSBram Moolenaar catch /some/ 598f575adffSBram Moolenaar seq ..= 'b' 599f575adffSBram Moolenaar catch /asdf/ 600f575adffSBram Moolenaar seq ..= 'x' 601e8c4abbbSBram Moolenaar catch ?a\?sdf? 602e8c4abbbSBram Moolenaar seq ..= 'y' 603f575adffSBram Moolenaar finally 604f575adffSBram Moolenaar seq ..= 'c' 605f575adffSBram Moolenaar endtry 606f575adffSBram Moolenaar assert_equal('abc', seq) 607257cc5eeSBram Moolenaarenddef 608257cc5eeSBram Moolenaar 609e8c4abbbSBram Moolenaardef Test_try_catch_fails() 610e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 611e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 612e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 613585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 614585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 615585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 616585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 617585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 618585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 619585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 620585fea7bSBram Moolenaar 621a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 622585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 623e8c4abbbSBram Moolenaarenddef 624e8c4abbbSBram Moolenaar 625006ad48bSBram Moolenaardef Test_throw_vimscript() 626f5be8cdbSBram Moolenaar # only checks line continuation 627006ad48bSBram Moolenaar let lines =<< trim END 628006ad48bSBram Moolenaar vim9script 629006ad48bSBram Moolenaar try 630006ad48bSBram Moolenaar throw 'one' 631006ad48bSBram Moolenaar .. 'two' 632006ad48bSBram Moolenaar catch 633006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 634006ad48bSBram Moolenaar endtry 635006ad48bSBram Moolenaar END 636006ad48bSBram Moolenaar CheckScriptSuccess(lines) 637006ad48bSBram Moolenaarenddef 638006ad48bSBram Moolenaar 63937c83711SBram Moolenaardef Test_cexpr_vimscript() 640f5be8cdbSBram Moolenaar # only checks line continuation 64137c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 64237c83711SBram Moolenaar let lines =<< trim END 64337c83711SBram Moolenaar vim9script 64437c83711SBram Moolenaar cexpr 'File' 64537c83711SBram Moolenaar .. ' someFile' .. 64637c83711SBram Moolenaar ' line 19' 64737c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 64837c83711SBram Moolenaar END 64937c83711SBram Moolenaar CheckScriptSuccess(lines) 65037c83711SBram Moolenaar set errorformat& 65137c83711SBram Moolenaarenddef 65237c83711SBram Moolenaar 6532a1381c3SBram Moolenaarif has('channel') 65440ee466cSBram Moolenaar let someJob = test_null_job() 65540ee466cSBram Moolenaar 65640ee466cSBram Moolenaar def FuncWithError() 65740ee466cSBram Moolenaar echomsg g:someJob 65840ee466cSBram Moolenaar enddef 65940ee466cSBram Moolenaar 66040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 66140ee466cSBram Moolenaar try 66240ee466cSBram Moolenaar call FuncWithError() 66340ee466cSBram Moolenaar catch 66440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 66540ee466cSBram Moolenaar endtry 66640ee466cSBram Moolenaar endfunc 6672a1381c3SBram Moolenaarendif 66840ee466cSBram Moolenaar 6698a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 6708a7d6542SBram Moolenaar vim9script 6718a7d6542SBram Moolenaar let name: string = 'bob' 6728a7d6542SBram Moolenaar def Concat(arg: string): string 6738a7d6542SBram Moolenaar return name .. arg 6748a7d6542SBram Moolenaar enddef 675227a69deSBram Moolenaar g:result = Concat('bie') 676227a69deSBram Moolenaar g:localname = name 6778a7d6542SBram Moolenaar 6788a7d6542SBram Moolenaar export const CONST = 1234 6798a7d6542SBram Moolenaar export let exported = 9876 6806e587dcbSBram Moolenaar export let exp_name = 'John' 6818a7d6542SBram Moolenaar export def Exported(): string 6828a7d6542SBram Moolenaar return 'Exported' 6838a7d6542SBram Moolenaar enddef 6848a7d6542SBram MoolenaarEND 6858a7d6542SBram Moolenaar 6865269bd2aSBram Moolenaardef Test_vim9_import_export() 6878a7d6542SBram Moolenaar let import_script_lines =<< trim END 6888a7d6542SBram Moolenaar vim9script 6898a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 6908a7d6542SBram Moolenaar g:imported = exported 6916e587dcbSBram Moolenaar exported += 3 6926e587dcbSBram Moolenaar g:imported_added = exported 6938a7d6542SBram Moolenaar g:imported_func = Exported() 6946e587dcbSBram Moolenaar 6956e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 6966e587dcbSBram Moolenaar g:imported_name = exp_name 6976e587dcbSBram Moolenaar exp_name ..= ' Doe' 6986e587dcbSBram Moolenaar g:imported_name_appended = exp_name 6995381c7a1SBram Moolenaar g:imported_later = exported 7008a7d6542SBram Moolenaar END 7018a7d6542SBram Moolenaar 7028a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7038a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7048a7d6542SBram Moolenaar 7058a7d6542SBram Moolenaar source Ximport.vim 7068a7d6542SBram Moolenaar 7078a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7088a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7098a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7106e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7115381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 7128a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 7136e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 7146e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 7158a7d6542SBram Moolenaar assert_false(exists('g:name')) 7168a7d6542SBram Moolenaar 7178a7d6542SBram Moolenaar unlet g:result 7188a7d6542SBram Moolenaar unlet g:localname 7198a7d6542SBram Moolenaar unlet g:imported 7206e587dcbSBram Moolenaar unlet g:imported_added 7215381c7a1SBram Moolenaar unlet g:imported_later 7228a7d6542SBram Moolenaar unlet g:imported_func 7236e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 7248a7d6542SBram Moolenaar delete('Ximport.vim') 725f2d5c240SBram Moolenaar 7261c991144SBram Moolenaar # similar, with line breaks 7271c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 7281c991144SBram Moolenaar vim9script 7291c991144SBram Moolenaar import { 7301c991144SBram Moolenaar exported, 7311c991144SBram Moolenaar Exported, 7321c991144SBram Moolenaar } 7331c991144SBram Moolenaar from 7341c991144SBram Moolenaar './Xexport.vim' 7351c991144SBram Moolenaar g:imported = exported 7361c991144SBram Moolenaar exported += 5 7371c991144SBram Moolenaar g:imported_added = exported 7381c991144SBram Moolenaar g:imported_func = Exported() 7391c991144SBram Moolenaar END 7401c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 7411c991144SBram Moolenaar source Ximport_lbr.vim 7421c991144SBram Moolenaar 7431c991144SBram Moolenaar assert_equal(9876, g:imported) 7441c991144SBram Moolenaar assert_equal(9881, g:imported_added) 7451c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 7461c991144SBram Moolenaar 7471c991144SBram Moolenaar # exported script not sourced again 7481c991144SBram Moolenaar assert_false(exists('g:result')) 7491c991144SBram Moolenaar unlet g:imported 7501c991144SBram Moolenaar unlet g:imported_added 7511c991144SBram Moolenaar unlet g:imported_func 7521c991144SBram Moolenaar delete('Ximport_lbr.vim') 7531c991144SBram Moolenaar 7541c991144SBram Moolenaar # import inside :def function 7555381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 7565381c7a1SBram Moolenaar vim9script 7575381c7a1SBram Moolenaar def ImportInDef() 7585381c7a1SBram Moolenaar import exported from './Xexport.vim' 7595381c7a1SBram Moolenaar g:imported = exported 7605381c7a1SBram Moolenaar exported += 7 7615381c7a1SBram Moolenaar g:imported_added = exported 7625381c7a1SBram Moolenaar enddef 7635381c7a1SBram Moolenaar ImportInDef() 7645381c7a1SBram Moolenaar END 7655381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 7665381c7a1SBram Moolenaar source Ximport2.vim 767f5be8cdbSBram Moolenaar # TODO: this should be 9879 7685381c7a1SBram Moolenaar assert_equal(9876, g:imported) 7695381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 7705381c7a1SBram Moolenaar unlet g:imported 7715381c7a1SBram Moolenaar unlet g:imported_added 7725381c7a1SBram Moolenaar delete('Ximport2.vim') 7735381c7a1SBram Moolenaar 774f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 775f2d5c240SBram Moolenaar vim9script 776f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 777f2d5c240SBram Moolenaar def UseExport() 778f2d5c240SBram Moolenaar g:imported = Export.exported 779f2d5c240SBram Moolenaar enddef 780f2d5c240SBram Moolenaar UseExport() 781f2d5c240SBram Moolenaar END 782f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 783f2d5c240SBram Moolenaar source Ximport.vim 7845381c7a1SBram Moolenaar assert_equal(9883, g:imported) 785f2d5c240SBram Moolenaar 786599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 787599c89c8SBram Moolenaar vim9script 788599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 789599c89c8SBram Moolenaar def Func() 790599c89c8SBram Moolenaar let dummy = 1 791599c89c8SBram Moolenaar let imported = Export + dummy 792599c89c8SBram Moolenaar enddef 793822ba247SBram Moolenaar defcompile 794599c89c8SBram Moolenaar END 795599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 796599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 797599c89c8SBram Moolenaar 798599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 799599c89c8SBram Moolenaar vim9script 800599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 801599c89c8SBram Moolenaar def Func() 802599c89c8SBram Moolenaar let imported = Export . exported 803599c89c8SBram Moolenaar enddef 804822ba247SBram Moolenaar defcompile 805599c89c8SBram Moolenaar END 806599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 807599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 808599c89c8SBram Moolenaar 809599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 810599c89c8SBram Moolenaar vim9script 811599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 812599c89c8SBram Moolenaar def Func() 813599c89c8SBram Moolenaar let imported = Export. 814599c89c8SBram Moolenaar enddef 815822ba247SBram Moolenaar defcompile 816599c89c8SBram Moolenaar END 817599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 818599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 819599c89c8SBram Moolenaar 8201c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 8211c991144SBram Moolenaar vim9script 8221c991144SBram Moolenaar import * 8231c991144SBram Moolenaar as Export 8241c991144SBram Moolenaar from 8251c991144SBram Moolenaar './Xexport.vim' 8261c991144SBram Moolenaar def UseExport() 8271c991144SBram Moolenaar g:imported = Export.exported 8281c991144SBram Moolenaar enddef 8291c991144SBram Moolenaar UseExport() 8301c991144SBram Moolenaar END 8311c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 8321c991144SBram Moolenaar source Ximport.vim 8331c991144SBram Moolenaar assert_equal(9883, g:imported) 8341c991144SBram Moolenaar 835f2d5c240SBram Moolenaar let import_star_lines =<< trim END 836f2d5c240SBram Moolenaar vim9script 837f2d5c240SBram Moolenaar import * from './Xexport.vim' 838f2d5c240SBram Moolenaar END 839f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 840f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 841f2d5c240SBram Moolenaar 842f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 843fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 844fa29c8abSBram Moolenaar vim9script 845fa29c8abSBram Moolenaar import name from './Xexport.vim' 846fa29c8abSBram Moolenaar END 847fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 848fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 849fa29c8abSBram Moolenaar 850f5be8cdbSBram Moolenaar # try to import something that is already defined 8515269bd2aSBram Moolenaar let import_already_defined =<< trim END 8525269bd2aSBram Moolenaar vim9script 8535269bd2aSBram Moolenaar let exported = 'something' 8545269bd2aSBram Moolenaar import exported from './Xexport.vim' 8555269bd2aSBram Moolenaar END 8565269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8575269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8585269bd2aSBram Moolenaar 859f5be8cdbSBram Moolenaar # try to import something that is already defined 8605269bd2aSBram Moolenaar import_already_defined =<< trim END 8615269bd2aSBram Moolenaar vim9script 8625269bd2aSBram Moolenaar let exported = 'something' 8635269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 8645269bd2aSBram Moolenaar END 8655269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8665269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8675269bd2aSBram Moolenaar 868f5be8cdbSBram Moolenaar # try to import something that is already defined 8695269bd2aSBram Moolenaar import_already_defined =<< trim END 8705269bd2aSBram Moolenaar vim9script 8715269bd2aSBram Moolenaar let exported = 'something' 8725269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 8735269bd2aSBram Moolenaar END 8745269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8755269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8765269bd2aSBram Moolenaar 877f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 878fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 879fa29c8abSBram Moolenaar vim9script 880fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 881fa29c8abSBram Moolenaar END 882fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 883fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 884fa29c8abSBram Moolenaar 885fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 886fa29c8abSBram Moolenaar vim9script 887fa29c8abSBram Moolenaar import name './Xexport.vim' 888fa29c8abSBram Moolenaar END 889fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 890fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 891fa29c8abSBram Moolenaar 892fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 893fa29c8abSBram Moolenaar vim9script 894fa29c8abSBram Moolenaar import name from Xexport.vim 895fa29c8abSBram Moolenaar END 896fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 897fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 898fa29c8abSBram Moolenaar 899fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 900fa29c8abSBram Moolenaar vim9script 901fa29c8abSBram Moolenaar import name from './XnoExport.vim' 902fa29c8abSBram Moolenaar END 903fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 904fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 905fa29c8abSBram Moolenaar 906fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 907fa29c8abSBram Moolenaar vim9script 908fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 909fa29c8abSBram Moolenaar END 9105269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 9115269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 912fa29c8abSBram Moolenaar 913f2d5c240SBram Moolenaar delete('Ximport.vim') 9145269bd2aSBram Moolenaar delete('Ximport3.vim') 9158a7d6542SBram Moolenaar delete('Xexport.vim') 9168a7d6542SBram Moolenaar 917f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 918750802b5SBram Moolenaar set cpo&vi 919750802b5SBram Moolenaar let cpo_before = &cpo 920750802b5SBram Moolenaar let lines =<< trim END 921750802b5SBram Moolenaar vim9script 922750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 923750802b5SBram Moolenaar END 924750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 925750802b5SBram Moolenaar source Xvim9_script 926750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 927750802b5SBram Moolenaar set cpo&vim 928750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 929750802b5SBram Moolenaar delete('Xvim9_script') 930750802b5SBram Moolenaarenddef 931750802b5SBram Moolenaar 932750802b5SBram Moolenaardef Test_vim9script_fails() 9338a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 9348a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 935750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 9369721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 9379b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 938750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 939750802b5SBram Moolenaar 940c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 941c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 942c785b9a7SBram Moolenaar 943750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 944a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 9458a7d6542SBram Moolenaarenddef 9468a7d6542SBram Moolenaar 947f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 948101f4810SBram Moolenaar CheckRunVimInTerminal 949101f4810SBram Moolenaar 9509bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 951c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 9529bb3eb3eSBram Moolenaarendfunc 9539bb3eb3eSBram Moolenaar 954c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 955101f4810SBram Moolenaar let export =<< trim END 956101f4810SBram Moolenaar vim9script 957101f4810SBram Moolenaar export def Foo(): number 958101f4810SBram Moolenaar return 0 959101f4810SBram Moolenaar enddef 960101f4810SBram Moolenaar END 9619bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 962101f4810SBram Moolenaar 9639bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 9649bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 9659bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 966101f4810SBram Moolenaar 9679bb3eb3eSBram Moolenaar delete('Xexport.vim') 9689bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 9699bb3eb3eSBram Moolenaarenddef 970101f4810SBram Moolenaar 9714c17ad94SBram Moolenaardef Test_vim9script_reload_import() 9728a7d6542SBram Moolenaar let lines =<< trim END 9738a7d6542SBram Moolenaar vim9script 9748a7d6542SBram Moolenaar const var = '' 9758a7d6542SBram Moolenaar let valone = 1234 9768a7d6542SBram Moolenaar def MyFunc(arg: string) 9778a7d6542SBram Moolenaar valone = 5678 9788a7d6542SBram Moolenaar enddef 9798a7d6542SBram Moolenaar END 9808a7d6542SBram Moolenaar let morelines =<< trim END 9818a7d6542SBram Moolenaar let valtwo = 222 9828a7d6542SBram Moolenaar export def GetValtwo(): number 9838a7d6542SBram Moolenaar return valtwo 9848a7d6542SBram Moolenaar enddef 9858a7d6542SBram Moolenaar END 98603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 9878a7d6542SBram Moolenaar source Xreload.vim 9888a7d6542SBram Moolenaar source Xreload.vim 9898a7d6542SBram Moolenaar source Xreload.vim 9908a7d6542SBram Moolenaar 9918a7d6542SBram Moolenaar let testlines =<< trim END 9928a7d6542SBram Moolenaar vim9script 9938a7d6542SBram Moolenaar def TheFunc() 9948a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 9958a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 9968a7d6542SBram Moolenaar enddef 9978a7d6542SBram Moolenaar TheFunc() 9988a7d6542SBram Moolenaar END 9998a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 10008a7d6542SBram Moolenaar source Ximport.vim 10018a7d6542SBram Moolenaar 1002f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1003f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 10048a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 10058a7d6542SBram Moolenaar source Ximport.vim 10068a7d6542SBram Moolenaar 1007f5be8cdbSBram Moolenaar # cannot declare a var twice 10088a7d6542SBram Moolenaar lines =<< trim END 10098a7d6542SBram Moolenaar vim9script 10108a7d6542SBram Moolenaar let valone = 1234 10118a7d6542SBram Moolenaar let valone = 5678 10128a7d6542SBram Moolenaar END 10138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 10148a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 10158a7d6542SBram Moolenaar 10168a7d6542SBram Moolenaar delete('Xreload.vim') 10178a7d6542SBram Moolenaar delete('Ximport.vim') 10188a7d6542SBram Moolenaarenddef 10198a7d6542SBram Moolenaar 1020fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1021fe465a01SBram Moolenaar" script-local name. 1022fe465a01SBram Moolenaardef Test_vim9script_funcref() 1023fe465a01SBram Moolenaar let sortlines =<< trim END 1024fe465a01SBram Moolenaar vim9script 1025fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1026bed36b93SBram Moolenaar return i2 - i1 1027fe465a01SBram Moolenaar enddef 1028fe465a01SBram Moolenaar 1029fe465a01SBram Moolenaar export def FastSort(): list<number> 1030fe465a01SBram Moolenaar return range(5)->sort(Compare) 1031fe465a01SBram Moolenaar enddef 1032fe465a01SBram Moolenaar END 1033fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1034fe465a01SBram Moolenaar 1035fe465a01SBram Moolenaar let lines =<< trim END 1036fe465a01SBram Moolenaar vim9script 1037fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1038fe465a01SBram Moolenaar def Test() 1039fe465a01SBram Moolenaar g:result = FastSort() 1040fe465a01SBram Moolenaar enddef 1041fe465a01SBram Moolenaar Test() 1042fe465a01SBram Moolenaar END 1043fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1044fe465a01SBram Moolenaar 1045fe465a01SBram Moolenaar source Xscript.vim 1046fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1047fe465a01SBram Moolenaar 1048fe465a01SBram Moolenaar unlet g:result 1049fe465a01SBram Moolenaar delete('Xsort.vim') 1050fe465a01SBram Moolenaar delete('Xscript.vim') 1051fe465a01SBram Moolenaarenddef 1052fe465a01SBram Moolenaar 1053c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1054c620c055SBram Moolenaar" script where FastFilter() is called from. 1055c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1056c620c055SBram Moolenaar let filterLines =<< trim END 1057c620c055SBram Moolenaar vim9script 1058c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1059c620c055SBram Moolenaar return idx % 2 == 1 1060c620c055SBram Moolenaar enddef 1061c620c055SBram Moolenaar export def FastFilter(): list<number> 1062c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1063c620c055SBram Moolenaar enddef 1064c620c055SBram Moolenaar END 1065c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1066c620c055SBram Moolenaar 1067c620c055SBram Moolenaar let lines =<< trim END 1068c620c055SBram Moolenaar vim9script 1069c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1070c620c055SBram Moolenaar def Test() 1071c620c055SBram Moolenaar let x: list<number> = FastFilter() 1072c620c055SBram Moolenaar enddef 1073c620c055SBram Moolenaar Test() 1074c620c055SBram Moolenaar END 1075c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1076c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1077c620c055SBram Moolenaar 1078c620c055SBram Moolenaar delete('Xfilter.vim') 1079c620c055SBram Moolenaar delete('Ximport.vim') 1080c620c055SBram Moolenaarenddef 1081c620c055SBram Moolenaar 10824c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 10834c17ad94SBram Moolenaar let first_lines =<< trim END 10844c17ad94SBram Moolenaar vim9script 10854c17ad94SBram Moolenaar def FuncYes(): string 10864c17ad94SBram Moolenaar return 'yes' 10874c17ad94SBram Moolenaar enddef 10884c17ad94SBram Moolenaar END 108903afdcf1SBram Moolenaar let withno_lines =<< trim END 10904c17ad94SBram Moolenaar def FuncNo(): string 10914c17ad94SBram Moolenaar return 'no' 10924c17ad94SBram Moolenaar enddef 10934c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 10944c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 10954c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 109603afdcf1SBram Moolenaar enddef 109703afdcf1SBram Moolenaar END 109803afdcf1SBram Moolenaar let nono_lines =<< trim END 109903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 110003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 11014c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 11024c17ad94SBram Moolenaar enddef 11034c17ad94SBram Moolenaar END 11044c17ad94SBram Moolenaar 11054c17ad94SBram Moolenaar # FuncNo() is defined 110603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 11074c17ad94SBram Moolenaar source Xreloaded.vim 11084c17ad94SBram Moolenaar g:DoCheck(true) 11094c17ad94SBram Moolenaar 11104c17ad94SBram Moolenaar # FuncNo() is not redefined 111103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 11124c17ad94SBram Moolenaar source Xreloaded.vim 111303afdcf1SBram Moolenaar g:DoCheck() 11144c17ad94SBram Moolenaar 11154c17ad94SBram Moolenaar # FuncNo() is back 111603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 11174c17ad94SBram Moolenaar source Xreloaded.vim 111803afdcf1SBram Moolenaar g:DoCheck() 11194c17ad94SBram Moolenaar 11204c17ad94SBram Moolenaar delete('Xreloaded.vim') 11214c17ad94SBram Moolenaarenddef 11224c17ad94SBram Moolenaar 112389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 112489483d40SBram Moolenaar # write the script with a script-local variable 112589483d40SBram Moolenaar let lines =<< trim END 112689483d40SBram Moolenaar vim9script 112789483d40SBram Moolenaar let var = 'string' 112889483d40SBram Moolenaar END 112989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 113089483d40SBram Moolenaar source XreloadVar.vim 113189483d40SBram Moolenaar 113289483d40SBram Moolenaar # now write the script using the same variable locally - works 113389483d40SBram Moolenaar lines =<< trim END 113489483d40SBram Moolenaar vim9script 113589483d40SBram Moolenaar def Func() 113689483d40SBram Moolenaar let var = 'string' 113789483d40SBram Moolenaar enddef 113889483d40SBram Moolenaar END 113989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 114089483d40SBram Moolenaar source XreloadVar.vim 114189483d40SBram Moolenaar 114289483d40SBram Moolenaar delete('XreloadVar.vim') 114389483d40SBram Moolenaarenddef 114489483d40SBram Moolenaar 11458a7d6542SBram Moolenaardef Test_import_absolute() 11468a7d6542SBram Moolenaar let import_lines = [ 1147e6085c53SBram Moolenaar 'vim9script', 1148e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1149e6085c53SBram Moolenaar 'def UseExported()', 1150e6085c53SBram Moolenaar ' g:imported_abs = exported', 1151e6085c53SBram Moolenaar ' exported = 8888', 1152e6085c53SBram Moolenaar ' g:imported_after = exported', 1153e6085c53SBram Moolenaar 'enddef', 1154e6085c53SBram Moolenaar 'UseExported()', 1155e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1156e6085c53SBram Moolenaar ] 11578a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 11588a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 11598a7d6542SBram Moolenaar 11608a7d6542SBram Moolenaar source Ximport_abs.vim 11618a7d6542SBram Moolenaar 11628a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 11634e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1164675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1165675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1166675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1167675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1168675f716eSBram Moolenaar 'exported = 8888.*' .. 1169675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1170675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1171675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1172675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1173e6085c53SBram Moolenaar g:import_disassembled) 11748a7d6542SBram Moolenaar unlet g:imported_abs 11754e12a5dfSBram Moolenaar unlet g:import_disassembled 11768a7d6542SBram Moolenaar 11778a7d6542SBram Moolenaar delete('Ximport_abs.vim') 11788a7d6542SBram Moolenaar delete('Xexport_abs.vim') 11798a7d6542SBram Moolenaarenddef 11808a7d6542SBram Moolenaar 11818a7d6542SBram Moolenaardef Test_import_rtp() 11828a7d6542SBram Moolenaar let import_lines = [ 1183e6085c53SBram Moolenaar 'vim9script', 1184e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1185e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1186e6085c53SBram Moolenaar ] 11878a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 11888a7d6542SBram Moolenaar mkdir('import') 11898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 11908a7d6542SBram Moolenaar 11918a7d6542SBram Moolenaar let save_rtp = &rtp 11928a7d6542SBram Moolenaar &rtp = getcwd() 11938a7d6542SBram Moolenaar source Ximport_rtp.vim 11948a7d6542SBram Moolenaar &rtp = save_rtp 11958a7d6542SBram Moolenaar 11968a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 11978a7d6542SBram Moolenaar unlet g:imported_rtp 11988a7d6542SBram Moolenaar 11998a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 120089483d40SBram Moolenaar delete('import', 'rf') 12018a7d6542SBram Moolenaarenddef 12028a7d6542SBram Moolenaar 120325e0f586SBram Moolenaardef Test_import_compile_error() 120425e0f586SBram Moolenaar let export_lines = [ 120525e0f586SBram Moolenaar 'vim9script', 120625e0f586SBram Moolenaar 'export def ExpFunc(): string', 120725e0f586SBram Moolenaar ' return notDefined', 120825e0f586SBram Moolenaar 'enddef', 120925e0f586SBram Moolenaar ] 121025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 121125e0f586SBram Moolenaar 121225e0f586SBram Moolenaar let import_lines = [ 121325e0f586SBram Moolenaar 'vim9script', 121425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 121525e0f586SBram Moolenaar 'def ImpFunc()', 121625e0f586SBram Moolenaar ' echo ExpFunc()', 121725e0f586SBram Moolenaar 'enddef', 121825e0f586SBram Moolenaar 'defcompile', 121925e0f586SBram Moolenaar ] 122025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 122125e0f586SBram Moolenaar 122225e0f586SBram Moolenaar try 122325e0f586SBram Moolenaar source Ximport.vim 122425e0f586SBram Moolenaar catch /E1001/ 1225f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 122625e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 122725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 122825e0f586SBram Moolenaar endtry 122925e0f586SBram Moolenaar 123025e0f586SBram Moolenaar delete('Xexported.vim') 123125e0f586SBram Moolenaar delete('Ximport.vim') 123225e0f586SBram Moolenaarenddef 123325e0f586SBram Moolenaar 12348a7d6542SBram Moolenaardef Test_fixed_size_list() 1235f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 12368a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 12378a7d6542SBram Moolenaar l->remove(0) 12388a7d6542SBram Moolenaar l->add(5) 12398a7d6542SBram Moolenaar l->insert(99, 1) 12400f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 12418a7d6542SBram Moolenaarenddef 12428a7d6542SBram Moolenaar 1243158906cfSBram Moolenaardef IfElse(what: number): string 1244158906cfSBram Moolenaar let res = '' 1245158906cfSBram Moolenaar if what == 1 1246158906cfSBram Moolenaar res = "one" 1247158906cfSBram Moolenaar elseif what == 2 1248158906cfSBram Moolenaar res = "two" 1249a259d8d3SBram Moolenaar else 1250158906cfSBram Moolenaar res = "three" 1251a259d8d3SBram Moolenaar endif 1252158906cfSBram Moolenaar return res 1253a259d8d3SBram Moolenaarenddef 1254a259d8d3SBram Moolenaar 1255158906cfSBram Moolenaardef Test_if_elseif_else() 1256158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1257158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1258158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 12590f18b6d1SBram Moolenaarenddef 12600f18b6d1SBram Moolenaar 1261e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1262e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1263e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1264e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1265e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1266585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1267e8c4abbbSBram Moolenaarenddef 1268e8c4abbbSBram Moolenaar 12696d69bf60SBram Moolenaarlet g:bool_true = v:true 12706d69bf60SBram Moolenaarlet g:bool_false = v:false 12716d69bf60SBram Moolenaar 12726d69bf60SBram Moolenaardef Test_if_const_expr() 12736d69bf60SBram Moolenaar let res = false 12746d69bf60SBram Moolenaar if true ? true : false 12756d69bf60SBram Moolenaar res = true 12766d69bf60SBram Moolenaar endif 12776d69bf60SBram Moolenaar assert_equal(true, res) 12786d69bf60SBram Moolenaar 1279585fea7bSBram Moolenaar g:glob = 2 1280585fea7bSBram Moolenaar if false 12816797966dSBram Moolenaar execute('g:glob = 3') 1282585fea7bSBram Moolenaar endif 1283585fea7bSBram Moolenaar assert_equal(2, g:glob) 1284585fea7bSBram Moolenaar if true 12856797966dSBram Moolenaar execute('g:glob = 3') 1286585fea7bSBram Moolenaar endif 1287585fea7bSBram Moolenaar assert_equal(3, g:glob) 1288585fea7bSBram Moolenaar 12896d69bf60SBram Moolenaar res = false 12906d69bf60SBram Moolenaar if g:bool_true ? true : false 12916d69bf60SBram Moolenaar res = true 12926d69bf60SBram Moolenaar endif 12936d69bf60SBram Moolenaar assert_equal(true, res) 12946d69bf60SBram Moolenaar 12956d69bf60SBram Moolenaar res = false 12966d69bf60SBram Moolenaar if true ? g:bool_true : false 12976d69bf60SBram Moolenaar res = true 12986d69bf60SBram Moolenaar endif 12996d69bf60SBram Moolenaar assert_equal(true, res) 13006d69bf60SBram Moolenaar 13016d69bf60SBram Moolenaar res = false 13026d69bf60SBram Moolenaar if true ? true : g:bool_false 13036d69bf60SBram Moolenaar res = true 13046d69bf60SBram Moolenaar endif 13056d69bf60SBram Moolenaar assert_equal(true, res) 13066d69bf60SBram Moolenaar 13076d69bf60SBram Moolenaar res = false 13086d69bf60SBram Moolenaar if true ? false : true 13096d69bf60SBram Moolenaar res = true 13106d69bf60SBram Moolenaar endif 13116d69bf60SBram Moolenaar assert_equal(false, res) 13126d69bf60SBram Moolenaar 13136d69bf60SBram Moolenaar res = false 13146d69bf60SBram Moolenaar if false ? false : true 13156d69bf60SBram Moolenaar res = true 13166d69bf60SBram Moolenaar endif 13176d69bf60SBram Moolenaar assert_equal(true, res) 13186d69bf60SBram Moolenaar 13196d69bf60SBram Moolenaar res = false 13206d69bf60SBram Moolenaar if false ? true : false 13216d69bf60SBram Moolenaar res = true 13226d69bf60SBram Moolenaar endif 13236d69bf60SBram Moolenaar assert_equal(false, res) 13246d69bf60SBram Moolenaar 13256d69bf60SBram Moolenaar res = false 1326e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1327e8c4abbbSBram Moolenaar res = true 1328e8c4abbbSBram Moolenaar endif 1329e8c4abbbSBram Moolenaar assert_equal(false, res) 1330e8c4abbbSBram Moolenaar 1331e8c4abbbSBram Moolenaar res = false 13326d69bf60SBram Moolenaar if true && true 13336d69bf60SBram Moolenaar res = true 13346d69bf60SBram Moolenaar endif 13356d69bf60SBram Moolenaar assert_equal(true, res) 13366d69bf60SBram Moolenaar 13376d69bf60SBram Moolenaar res = false 13386d69bf60SBram Moolenaar if true && false 13396d69bf60SBram Moolenaar res = true 13406d69bf60SBram Moolenaar endif 13416d69bf60SBram Moolenaar assert_equal(false, res) 13426d69bf60SBram Moolenaar 13436d69bf60SBram Moolenaar res = false 13446d69bf60SBram Moolenaar if g:bool_true && false 13456d69bf60SBram Moolenaar res = true 13466d69bf60SBram Moolenaar endif 13476d69bf60SBram Moolenaar assert_equal(false, res) 13486d69bf60SBram Moolenaar 13496d69bf60SBram Moolenaar res = false 13506d69bf60SBram Moolenaar if true && g:bool_false 13516d69bf60SBram Moolenaar res = true 13526d69bf60SBram Moolenaar endif 13536d69bf60SBram Moolenaar assert_equal(false, res) 13546d69bf60SBram Moolenaar 13556d69bf60SBram Moolenaar res = false 13566d69bf60SBram Moolenaar if false && false 13576d69bf60SBram Moolenaar res = true 13586d69bf60SBram Moolenaar endif 13596d69bf60SBram Moolenaar assert_equal(false, res) 13606d69bf60SBram Moolenaar 13616d69bf60SBram Moolenaar res = false 13626d69bf60SBram Moolenaar if true || false 13636d69bf60SBram Moolenaar res = true 13646d69bf60SBram Moolenaar endif 13656d69bf60SBram Moolenaar assert_equal(true, res) 13666d69bf60SBram Moolenaar 13676d69bf60SBram Moolenaar res = false 13686d69bf60SBram Moolenaar if g:bool_true || false 13696d69bf60SBram Moolenaar res = true 13706d69bf60SBram Moolenaar endif 13716d69bf60SBram Moolenaar assert_equal(true, res) 13726d69bf60SBram Moolenaar 13736d69bf60SBram Moolenaar res = false 13746d69bf60SBram Moolenaar if true || g:bool_false 13756d69bf60SBram Moolenaar res = true 13766d69bf60SBram Moolenaar endif 13776d69bf60SBram Moolenaar assert_equal(true, res) 13786d69bf60SBram Moolenaar 13796d69bf60SBram Moolenaar res = false 13806d69bf60SBram Moolenaar if false || false 13816d69bf60SBram Moolenaar res = true 13826d69bf60SBram Moolenaar endif 13836d69bf60SBram Moolenaar assert_equal(false, res) 138480c34ca3SBram Moolenaarenddef 13856d69bf60SBram Moolenaar 138680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 138780c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 138880c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1389e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1390e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 13916d69bf60SBram Moolenaarenddef 13926d69bf60SBram Moolenaar 139372abcf42SBram Moolenaardef RunNested(i: number): number 139472abcf42SBram Moolenaar let x: number = 0 139572abcf42SBram Moolenaar if i % 2 139672abcf42SBram Moolenaar if 1 1397f5be8cdbSBram Moolenaar # comment 139872abcf42SBram Moolenaar else 1399f5be8cdbSBram Moolenaar # comment 140072abcf42SBram Moolenaar endif 140172abcf42SBram Moolenaar x += 1 140272abcf42SBram Moolenaar else 140372abcf42SBram Moolenaar x += 1000 140472abcf42SBram Moolenaar endif 140572abcf42SBram Moolenaar return x 140672abcf42SBram Moolenaarenddef 140772abcf42SBram Moolenaar 140872abcf42SBram Moolenaardef Test_nested_if() 140972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 141072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 141172abcf42SBram Moolenaarenddef 141272abcf42SBram Moolenaar 1413ad39c094SBram Moolenaardef Test_execute_cmd() 1414ad39c094SBram Moolenaar new 1415ad39c094SBram Moolenaar setline(1, 'default') 1416ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1417ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1418a72cfb80SBram Moolenaar 1419a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1420a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1421a72cfb80SBram Moolenaar 1422ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1423ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1424a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1425ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1426a72cfb80SBram Moolenaar 1427ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1428ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1429a72cfb80SBram Moolenaar 1430ad39c094SBram Moolenaar let cmd_first = 'call ' 1431ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1432ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1433ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1434ad39c094SBram Moolenaar bwipe! 1435585fea7bSBram Moolenaar 1436585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1437a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1438ad39c094SBram Moolenaarenddef 1439ad39c094SBram Moolenaar 144047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1441f5be8cdbSBram Moolenaar # only checks line continuation 144247e880d6SBram Moolenaar let lines =<< trim END 144347e880d6SBram Moolenaar vim9script 144447e880d6SBram Moolenaar execute 'g:someVar' 144547e880d6SBram Moolenaar .. ' = ' .. 144647e880d6SBram Moolenaar '28' 144747e880d6SBram Moolenaar assert_equal(28, g:someVar) 144847e880d6SBram Moolenaar unlet g:someVar 144947e880d6SBram Moolenaar END 145047e880d6SBram Moolenaar CheckScriptSuccess(lines) 145147e880d6SBram Moolenaarenddef 145247e880d6SBram Moolenaar 1453ad39c094SBram Moolenaardef Test_echo_cmd() 1454a72cfb80SBram Moolenaar echo 'some' # comment 1455585fea7bSBram Moolenaar echon 'thing' 1456ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1457ad39c094SBram Moolenaar 1458a72cfb80SBram Moolenaar echo "some" # comment 1459a72cfb80SBram Moolenaar echon "thing" 1460a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1461a72cfb80SBram Moolenaar 1462ad39c094SBram Moolenaar let str1 = 'some' 1463ad39c094SBram Moolenaar let str2 = 'more' 1464ad39c094SBram Moolenaar echo str1 str2 1465ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1466a72cfb80SBram Moolenaar 1467a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1468ad39c094SBram Moolenaarenddef 1469ad39c094SBram Moolenaar 1470f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1471f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1472f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1473f93c7feaSBram Moolenaar echo 'clear' 1474df069eecSBram Moolenaar :1messages 1475f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1476f93c7feaSBram Moolenaar 1477f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1478f93c7feaSBram Moolenaarenddef 1479f93c7feaSBram Moolenaar 148047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1481f5be8cdbSBram Moolenaar # only checks line continuation 148247e880d6SBram Moolenaar let lines =<< trim END 148347e880d6SBram Moolenaar vim9script 148447e880d6SBram Moolenaar echomsg 'here' 148547e880d6SBram Moolenaar .. ' is ' .. 148647e880d6SBram Moolenaar 'a message' 148747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 148847e880d6SBram Moolenaar END 148947e880d6SBram Moolenaar CheckScriptSuccess(lines) 149047e880d6SBram Moolenaarenddef 149147e880d6SBram Moolenaar 1492f93c7feaSBram Moolenaardef Test_echoerr_cmd() 149340ee466cSBram Moolenaar try 149440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 149540ee466cSBram Moolenaar catch 149640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 149740ee466cSBram Moolenaar endtry 1498f93c7feaSBram Moolenaarenddef 1499f93c7feaSBram Moolenaar 150047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1501f5be8cdbSBram Moolenaar # only checks line continuation 150247e880d6SBram Moolenaar let lines =<< trim END 150347e880d6SBram Moolenaar vim9script 150447e880d6SBram Moolenaar try 150547e880d6SBram Moolenaar echoerr 'this' 150647e880d6SBram Moolenaar .. ' is ' .. 150747e880d6SBram Moolenaar 'wrong' 150847e880d6SBram Moolenaar catch 150947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 151047e880d6SBram Moolenaar endtry 151147e880d6SBram Moolenaar END 151247e880d6SBram Moolenaar CheckScriptSuccess(lines) 151347e880d6SBram Moolenaarenddef 151447e880d6SBram Moolenaar 151541fe0617SBram Moolenaardef Test_for_outside_of_function() 151641fe0617SBram Moolenaar let lines =<< trim END 151741fe0617SBram Moolenaar vim9script 151841fe0617SBram Moolenaar new 151941fe0617SBram Moolenaar for var in range(0, 3) 152041fe0617SBram Moolenaar append(line('$'), var) 152141fe0617SBram Moolenaar endfor 152241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 152341fe0617SBram Moolenaar bwipe! 152441fe0617SBram Moolenaar END 152541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 152641fe0617SBram Moolenaar source Xvim9for.vim 152741fe0617SBram Moolenaar delete('Xvim9for.vim') 152841fe0617SBram Moolenaarenddef 15298a7d6542SBram Moolenaar 1530e8c4abbbSBram Moolenaardef Test_for_loop() 1531e8c4abbbSBram Moolenaar let result = '' 1532e8c4abbbSBram Moolenaar for cnt in range(7) 1533e8c4abbbSBram Moolenaar if cnt == 4 1534e8c4abbbSBram Moolenaar break 1535e8c4abbbSBram Moolenaar endif 1536e8c4abbbSBram Moolenaar if cnt == 2 1537e8c4abbbSBram Moolenaar continue 1538e8c4abbbSBram Moolenaar endif 1539e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1540e8c4abbbSBram Moolenaar endfor 1541e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 15420ad3e894SBram Moolenaar 15430ad3e894SBram Moolenaar let concat = '' 15440ad3e894SBram Moolenaar for str in eval('["one", "two"]') 15450ad3e894SBram Moolenaar concat ..= str 15460ad3e894SBram Moolenaar endfor 15470ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1548e8c4abbbSBram Moolenaarenddef 1549e8c4abbbSBram Moolenaar 1550e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1551675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1552675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1553675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1554822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 15550ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1556675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1557675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1558675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1559e8c4abbbSBram Moolenaarenddef 1560e8c4abbbSBram Moolenaar 1561d0df1aacSBram Moolenaardef Test_while_loop() 1562d0df1aacSBram Moolenaar let result = '' 1563d0df1aacSBram Moolenaar let cnt = 0 1564d0df1aacSBram Moolenaar while cnt < 555 1565d0df1aacSBram Moolenaar if cnt == 3 1566d0df1aacSBram Moolenaar break 1567d0df1aacSBram Moolenaar endif 1568d0df1aacSBram Moolenaar cnt += 1 1569d0df1aacSBram Moolenaar if cnt == 2 1570d0df1aacSBram Moolenaar continue 1571d0df1aacSBram Moolenaar endif 1572d0df1aacSBram Moolenaar result ..= cnt .. '_' 1573d0df1aacSBram Moolenaar endwhile 1574d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1575d0df1aacSBram Moolenaarenddef 1576d0df1aacSBram Moolenaar 1577e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1578675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1579675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1580675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1581675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1582675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1583675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1584675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1585bd5da371SBram Moolenaarenddef 1586bd5da371SBram Moolenaar 15879645e2d9SBram Moolenaardef Test_interrupt_loop() 158897acfc78SBram Moolenaar let caught = false 15899645e2d9SBram Moolenaar let x = 0 159097acfc78SBram Moolenaar try 15919645e2d9SBram Moolenaar while 1 15929645e2d9SBram Moolenaar x += 1 15939645e2d9SBram Moolenaar if x == 100 15949645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 15959645e2d9SBram Moolenaar endif 15969645e2d9SBram Moolenaar endwhile 159797acfc78SBram Moolenaar catch 159897acfc78SBram Moolenaar caught = true 159997acfc78SBram Moolenaar assert_equal(100, x) 160097acfc78SBram Moolenaar endtry 160197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 16029645e2d9SBram Moolenaarenddef 160320431c9dSBram Moolenaar 16044fdae999SBram Moolenaardef Test_automatic_line_continuation() 16054fdae999SBram Moolenaar let mylist = [ 16064fdae999SBram Moolenaar 'one', 16074fdae999SBram Moolenaar 'two', 16084fdae999SBram Moolenaar 'three', 1609f5be8cdbSBram Moolenaar ] # comment 16104fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 16114fdae999SBram Moolenaar 16124fdae999SBram Moolenaar let mydict = { 16134fdae999SBram Moolenaar 'one': 1, 16144fdae999SBram Moolenaar 'two': 2, 16154fdae999SBram Moolenaar 'three': 16164fdae999SBram Moolenaar 3, 1617f5be8cdbSBram Moolenaar } # comment 16184fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 16194fdae999SBram Moolenaar mydict = #{ 16202c330432SBram Moolenaar one: 1, # comment 16212c330432SBram Moolenaar two: # comment 16222c330432SBram Moolenaar 2, # comment 16232c330432SBram Moolenaar three: 3 # comment 16242c330432SBram Moolenaar } 16252c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 16262c330432SBram Moolenaar mydict = #{ 16272c330432SBram Moolenaar one: 1, 16284fdae999SBram Moolenaar two: 16294fdae999SBram Moolenaar 2, 16302c330432SBram Moolenaar three: 3 16314fdae999SBram Moolenaar } 16324fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1633e6085c53SBram Moolenaar 1634e6085c53SBram Moolenaar assert_equal( 1635e6085c53SBram Moolenaar ['one', 'two', 'three'], 1636e6085c53SBram Moolenaar split('one two three') 1637e6085c53SBram Moolenaar ) 16384fdae999SBram Moolenaarenddef 16394fdae999SBram Moolenaar 16407a092245SBram Moolenaardef Test_vim9_comment() 16417a092245SBram Moolenaar CheckScriptSuccess([ 16427a092245SBram Moolenaar 'vim9script', 16437a092245SBram Moolenaar '# something', 16447a092245SBram Moolenaar ]) 16457a092245SBram Moolenaar CheckScriptFailure([ 16467a092245SBram Moolenaar 'vim9script', 16477a092245SBram Moolenaar ':# something', 16487a092245SBram Moolenaar ], 'E488:') 16497a092245SBram Moolenaar CheckScriptFailure([ 16507a092245SBram Moolenaar '# something', 16517a092245SBram Moolenaar ], 'E488:') 16527a092245SBram Moolenaar CheckScriptFailure([ 16537a092245SBram Moolenaar ':# something', 16547a092245SBram Moolenaar ], 'E488:') 16557a092245SBram Moolenaar 16564a8d9f2eSBram Moolenaar { # block start 16574a8d9f2eSBram Moolenaar } # block end 16584a8d9f2eSBram Moolenaar CheckDefFailure([ 16594a8d9f2eSBram Moolenaar '{# comment', 16604a8d9f2eSBram Moolenaar ], 'E488:') 16614a8d9f2eSBram Moolenaar CheckDefFailure([ 16624a8d9f2eSBram Moolenaar '{', 16634a8d9f2eSBram Moolenaar '}# comment', 16644a8d9f2eSBram Moolenaar ], 'E488:') 16654a8d9f2eSBram Moolenaar 16664a8d9f2eSBram Moolenaar echo "yes" # comment 16674a8d9f2eSBram Moolenaar CheckDefFailure([ 16684a8d9f2eSBram Moolenaar 'echo "yes"# comment', 16694a8d9f2eSBram Moolenaar ], 'E488:') 16707a092245SBram Moolenaar CheckScriptSuccess([ 16717a092245SBram Moolenaar 'vim9script', 16727a092245SBram Moolenaar 'echo "yes" # something', 16737a092245SBram Moolenaar ]) 16747a092245SBram Moolenaar CheckScriptFailure([ 16757a092245SBram Moolenaar 'vim9script', 16767a092245SBram Moolenaar 'echo "yes"# something', 16777a092245SBram Moolenaar ], 'E121:') 16787a092245SBram Moolenaar CheckScriptFailure([ 16797a092245SBram Moolenaar 'vim9script', 16807a092245SBram Moolenaar 'echo# something', 16817a092245SBram Moolenaar ], 'E121:') 16827a092245SBram Moolenaar CheckScriptFailure([ 16837a092245SBram Moolenaar 'echo "yes" # something', 16847a092245SBram Moolenaar ], 'E121:') 16857a092245SBram Moolenaar 16864a8d9f2eSBram Moolenaar exe "echo" # comment 16874a8d9f2eSBram Moolenaar CheckDefFailure([ 16884a8d9f2eSBram Moolenaar 'exe "echo"# comment', 16894a8d9f2eSBram Moolenaar ], 'E488:') 16904a8d9f2eSBram Moolenaar CheckScriptSuccess([ 16914a8d9f2eSBram Moolenaar 'vim9script', 16924a8d9f2eSBram Moolenaar 'exe "echo" # something', 16934a8d9f2eSBram Moolenaar ]) 16944a8d9f2eSBram Moolenaar CheckScriptFailure([ 16954a8d9f2eSBram Moolenaar 'vim9script', 16964a8d9f2eSBram Moolenaar 'exe "echo"# something', 16974a8d9f2eSBram Moolenaar ], 'E121:') 16984a8d9f2eSBram Moolenaar CheckDefFailure([ 16994a8d9f2eSBram Moolenaar 'exe # comment', 17004a8d9f2eSBram Moolenaar ], 'E1015:') 17014a8d9f2eSBram Moolenaar CheckScriptFailure([ 17024a8d9f2eSBram Moolenaar 'vim9script', 17034a8d9f2eSBram Moolenaar 'exe# something', 17044a8d9f2eSBram Moolenaar ], 'E121:') 17054a8d9f2eSBram Moolenaar CheckScriptFailure([ 17064a8d9f2eSBram Moolenaar 'exe "echo" # something', 17074a8d9f2eSBram Moolenaar ], 'E121:') 17084a8d9f2eSBram Moolenaar 17097a092245SBram Moolenaar CheckDefFailure([ 17107a092245SBram Moolenaar 'try# comment', 17117a092245SBram Moolenaar ' echo "yes"', 17127a092245SBram Moolenaar 'catch', 17137a092245SBram Moolenaar 'endtry', 17147a092245SBram Moolenaar ], 'E488:') 17152c5ed4e3SBram Moolenaar CheckScriptFailure([ 17162c5ed4e3SBram Moolenaar 'vim9script', 17172c5ed4e3SBram Moolenaar 'try# comment', 17182c5ed4e3SBram Moolenaar 'echo "yes"', 17192c5ed4e3SBram Moolenaar ], 'E488:') 17207a092245SBram Moolenaar CheckDefFailure([ 17217a092245SBram Moolenaar 'try', 1722a72cfb80SBram Moolenaar ' throw#comment', 1723a72cfb80SBram Moolenaar 'catch', 1724a72cfb80SBram Moolenaar 'endtry', 1725a72cfb80SBram Moolenaar ], 'E1015:') 1726a72cfb80SBram Moolenaar CheckDefFailure([ 1727a72cfb80SBram Moolenaar 'try', 1728a72cfb80SBram Moolenaar ' throw "yes"#comment', 1729a72cfb80SBram Moolenaar 'catch', 1730a72cfb80SBram Moolenaar 'endtry', 1731a72cfb80SBram Moolenaar ], 'E488:') 1732a72cfb80SBram Moolenaar CheckDefFailure([ 1733a72cfb80SBram Moolenaar 'try', 17347a092245SBram Moolenaar ' echo "yes"', 17357a092245SBram Moolenaar 'catch# comment', 17367a092245SBram Moolenaar 'endtry', 17377a092245SBram Moolenaar ], 'E488:') 17382c5ed4e3SBram Moolenaar CheckScriptFailure([ 17392c5ed4e3SBram Moolenaar 'vim9script', 17402c5ed4e3SBram Moolenaar 'try', 17412c5ed4e3SBram Moolenaar ' echo "yes"', 17422c5ed4e3SBram Moolenaar 'catch# comment', 17432c5ed4e3SBram Moolenaar 'endtry', 17442c5ed4e3SBram Moolenaar ], 'E654:') 17452c5ed4e3SBram Moolenaar CheckDefFailure([ 17462c5ed4e3SBram Moolenaar 'try', 17472c5ed4e3SBram Moolenaar ' echo "yes"', 17482c5ed4e3SBram Moolenaar 'catch /pat/# comment', 17492c5ed4e3SBram Moolenaar 'endtry', 17502c5ed4e3SBram Moolenaar ], 'E488:') 17517a092245SBram Moolenaar CheckDefFailure([ 17527a092245SBram Moolenaar 'try', 17537a092245SBram Moolenaar 'echo "yes"', 17547a092245SBram Moolenaar 'catch', 17557a092245SBram Moolenaar 'endtry# comment', 17567a092245SBram Moolenaar ], 'E488:') 17572c5ed4e3SBram Moolenaar CheckScriptFailure([ 17582c5ed4e3SBram Moolenaar 'vim9script', 17592c5ed4e3SBram Moolenaar 'try', 17602c5ed4e3SBram Moolenaar ' echo "yes"', 17612c5ed4e3SBram Moolenaar 'catch', 17622c5ed4e3SBram Moolenaar 'endtry# comment', 17639b7bf9e9SBram Moolenaar ], 'E488:') 17642c5ed4e3SBram Moolenaar 17652c5ed4e3SBram Moolenaar CheckScriptSuccess([ 17662c5ed4e3SBram Moolenaar 'vim9script', 17672c5ed4e3SBram Moolenaar 'hi # comment', 17682c5ed4e3SBram Moolenaar ]) 17692c5ed4e3SBram Moolenaar CheckScriptFailure([ 17702c5ed4e3SBram Moolenaar 'vim9script', 17712c5ed4e3SBram Moolenaar 'hi# comment', 17722c5ed4e3SBram Moolenaar ], 'E416:') 17731966c248SBram Moolenaar CheckScriptSuccess([ 17741966c248SBram Moolenaar 'vim9script', 17751966c248SBram Moolenaar 'hi Search # comment', 17761966c248SBram Moolenaar ]) 17771966c248SBram Moolenaar CheckScriptFailure([ 17781966c248SBram Moolenaar 'vim9script', 17791966c248SBram Moolenaar 'hi Search# comment', 17801966c248SBram Moolenaar ], 'E416:') 17811966c248SBram Moolenaar CheckScriptSuccess([ 17821966c248SBram Moolenaar 'vim9script', 17831966c248SBram Moolenaar 'hi link This Search # comment', 17841966c248SBram Moolenaar ]) 17851966c248SBram Moolenaar CheckScriptFailure([ 17861966c248SBram Moolenaar 'vim9script', 17871966c248SBram Moolenaar 'hi link This That# comment', 17881966c248SBram Moolenaar ], 'E413:') 17891966c248SBram Moolenaar CheckScriptSuccess([ 17901966c248SBram Moolenaar 'vim9script', 17911966c248SBram Moolenaar 'hi clear This # comment', 17921966c248SBram Moolenaar 'hi clear # comment', 17931966c248SBram Moolenaar ]) 1794f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 1795f5be8cdbSBram Moolenaar # hi clear This# comment', 17961966c248SBram Moolenaar CheckScriptFailure([ 17971966c248SBram Moolenaar 'vim9script', 17981966c248SBram Moolenaar 'hi clear# comment', 17991966c248SBram Moolenaar ], 'E416:') 18001966c248SBram Moolenaar 18011966c248SBram Moolenaar CheckScriptSuccess([ 18021966c248SBram Moolenaar 'vim9script', 18031966c248SBram Moolenaar 'hi Group term=bold', 18041966c248SBram Moolenaar 'match Group /todo/ # comment', 18051966c248SBram Moolenaar ]) 18061966c248SBram Moolenaar CheckScriptFailure([ 18071966c248SBram Moolenaar 'vim9script', 18081966c248SBram Moolenaar 'hi Group term=bold', 18091966c248SBram Moolenaar 'match Group /todo/# comment', 18101966c248SBram Moolenaar ], 'E488:') 18111966c248SBram Moolenaar CheckScriptSuccess([ 18121966c248SBram Moolenaar 'vim9script', 18131966c248SBram Moolenaar 'match # comment', 18141966c248SBram Moolenaar ]) 18151966c248SBram Moolenaar CheckScriptFailure([ 18161966c248SBram Moolenaar 'vim9script', 18171966c248SBram Moolenaar 'match# comment', 18181966c248SBram Moolenaar ], 'E475:') 18191966c248SBram Moolenaar CheckScriptSuccess([ 18201966c248SBram Moolenaar 'vim9script', 18211966c248SBram Moolenaar 'match none # comment', 18221966c248SBram Moolenaar ]) 18231966c248SBram Moolenaar CheckScriptFailure([ 18241966c248SBram Moolenaar 'vim9script', 18251966c248SBram Moolenaar 'match none# comment', 18261966c248SBram Moolenaar ], 'E475:') 18271966c248SBram Moolenaar 18281966c248SBram Moolenaar CheckScriptSuccess([ 18291966c248SBram Moolenaar 'vim9script', 18301966c248SBram Moolenaar 'menutrans clear # comment', 18311966c248SBram Moolenaar ]) 18321966c248SBram Moolenaar CheckScriptFailure([ 18331966c248SBram Moolenaar 'vim9script', 18341966c248SBram Moolenaar 'menutrans clear# comment text', 18351966c248SBram Moolenaar ], 'E474:') 18361966c248SBram Moolenaar 18371966c248SBram Moolenaar CheckScriptSuccess([ 18381966c248SBram Moolenaar 'vim9script', 18391966c248SBram Moolenaar 'syntax clear # comment', 18401966c248SBram Moolenaar ]) 18411966c248SBram Moolenaar CheckScriptFailure([ 18421966c248SBram Moolenaar 'vim9script', 18431966c248SBram Moolenaar 'syntax clear# comment text', 18441966c248SBram Moolenaar ], 'E28:') 18451966c248SBram Moolenaar CheckScriptSuccess([ 18461966c248SBram Moolenaar 'vim9script', 18471966c248SBram Moolenaar 'syntax keyword Word some', 18481966c248SBram Moolenaar 'syntax clear Word # comment', 18491966c248SBram Moolenaar ]) 18501966c248SBram Moolenaar CheckScriptFailure([ 18511966c248SBram Moolenaar 'vim9script', 18521966c248SBram Moolenaar 'syntax keyword Word some', 18531966c248SBram Moolenaar 'syntax clear Word# comment text', 18541966c248SBram Moolenaar ], 'E28:') 18551966c248SBram Moolenaar 18561966c248SBram Moolenaar CheckScriptSuccess([ 18571966c248SBram Moolenaar 'vim9script', 18581966c248SBram Moolenaar 'syntax list # comment', 18591966c248SBram Moolenaar ]) 18601966c248SBram Moolenaar CheckScriptFailure([ 18611966c248SBram Moolenaar 'vim9script', 18621966c248SBram Moolenaar 'syntax list# comment text', 18631966c248SBram Moolenaar ], 'E28:') 18641966c248SBram Moolenaar 18651966c248SBram Moolenaar CheckScriptSuccess([ 18661966c248SBram Moolenaar 'vim9script', 18671966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 18681966c248SBram Moolenaar ]) 18691966c248SBram Moolenaar CheckScriptFailure([ 18701966c248SBram Moolenaar 'vim9script', 18711966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 18721966c248SBram Moolenaar ], 'E475:') 18731966c248SBram Moolenaar 18741966c248SBram Moolenaar CheckScriptSuccess([ 18751966c248SBram Moolenaar 'vim9script', 18761966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 18771966c248SBram Moolenaar ]) 18781966c248SBram Moolenaar CheckScriptFailure([ 18791966c248SBram Moolenaar 'vim9script', 18801966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 18811966c248SBram Moolenaar ], 'E789:') 18821966c248SBram Moolenaar 18831966c248SBram Moolenaar CheckScriptSuccess([ 18841966c248SBram Moolenaar 'vim9script', 18851966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 18861966c248SBram Moolenaar ]) 18871966c248SBram Moolenaar CheckScriptFailure([ 18881966c248SBram Moolenaar 'vim9script', 18891966c248SBram Moolenaar 'syntax match Word /pat/# comment', 18901966c248SBram Moolenaar ], 'E402:') 18911966c248SBram Moolenaar 18921966c248SBram Moolenaar CheckScriptSuccess([ 18931966c248SBram Moolenaar 'vim9script', 18941966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 18951966c248SBram Moolenaar ]) 18961966c248SBram Moolenaar CheckScriptFailure([ 18971966c248SBram Moolenaar 'vim9script', 18981966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 18991966c248SBram Moolenaar ], 'E475:') 19001966c248SBram Moolenaar CheckScriptFailure([ 19011966c248SBram Moolenaar 'vim9script', 19021966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 19031966c248SBram Moolenaar ], 'E406:') 19041966c248SBram Moolenaar CheckScriptFailure([ 19051966c248SBram Moolenaar 'vim9script', 19061966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 19071966c248SBram Moolenaar ], 'E475:') 19081966c248SBram Moolenaar 19091966c248SBram Moolenaar CheckScriptSuccess([ 19101966c248SBram Moolenaar 'vim9script', 19111966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 19121966c248SBram Moolenaar ]) 19131966c248SBram Moolenaar CheckScriptFailure([ 19141966c248SBram Moolenaar 'vim9script', 19151966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 19161966c248SBram Moolenaar ], 'E475:') 19171966c248SBram Moolenaar 19181966c248SBram Moolenaar CheckScriptSuccess([ 19191966c248SBram Moolenaar 'vim9script', 19201966c248SBram Moolenaar 'syntax sync # comment', 19211966c248SBram Moolenaar ]) 19221966c248SBram Moolenaar CheckScriptFailure([ 19231966c248SBram Moolenaar 'vim9script', 19241966c248SBram Moolenaar 'syntax sync# comment', 19251966c248SBram Moolenaar ], 'E404:') 19261966c248SBram Moolenaar CheckScriptSuccess([ 19271966c248SBram Moolenaar 'vim9script', 19281966c248SBram Moolenaar 'syntax sync ccomment # comment', 19291966c248SBram Moolenaar ]) 19301966c248SBram Moolenaar CheckScriptFailure([ 19311966c248SBram Moolenaar 'vim9script', 19321966c248SBram Moolenaar 'syntax sync ccomment# comment', 19331966c248SBram Moolenaar ], 'E404:') 19341966c248SBram Moolenaar 19351966c248SBram Moolenaar CheckScriptSuccess([ 19361966c248SBram Moolenaar 'vim9script', 19371966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 19381966c248SBram Moolenaar ]) 19391966c248SBram Moolenaar CheckScriptFailure([ 19401966c248SBram Moolenaar 'vim9script', 19411966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 19421966c248SBram Moolenaar ], 'E475:') 1943a72cfb80SBram Moolenaar 1944a72cfb80SBram Moolenaar CheckScriptSuccess([ 1945a72cfb80SBram Moolenaar 'vim9script', 1946a72cfb80SBram Moolenaar 'command Echo echo # comment', 1947a72cfb80SBram Moolenaar 'command Echo # comment', 1948a72cfb80SBram Moolenaar ]) 1949a72cfb80SBram Moolenaar CheckScriptFailure([ 1950a72cfb80SBram Moolenaar 'vim9script', 1951a72cfb80SBram Moolenaar 'command Echo echo# comment', 1952a72cfb80SBram Moolenaar 'Echo', 1953a72cfb80SBram Moolenaar ], 'E121:') 1954a72cfb80SBram Moolenaar CheckScriptFailure([ 1955a72cfb80SBram Moolenaar 'vim9script', 1956a72cfb80SBram Moolenaar 'command Echo# comment', 1957a72cfb80SBram Moolenaar ], 'E182:') 1958a72cfb80SBram Moolenaar CheckScriptFailure([ 1959a72cfb80SBram Moolenaar 'vim9script', 1960a72cfb80SBram Moolenaar 'command Echo echo', 1961a72cfb80SBram Moolenaar 'command Echo# comment', 1962a72cfb80SBram Moolenaar ], 'E182:') 1963a72cfb80SBram Moolenaar 1964a72cfb80SBram Moolenaar CheckScriptSuccess([ 1965a72cfb80SBram Moolenaar 'vim9script', 1966a72cfb80SBram Moolenaar 'function # comment', 1967a72cfb80SBram Moolenaar ]) 1968a72cfb80SBram Moolenaar CheckScriptFailure([ 1969a72cfb80SBram Moolenaar 'vim9script', 1970a72cfb80SBram Moolenaar 'function# comment', 1971a72cfb80SBram Moolenaar ], 'E129:') 1972a72cfb80SBram Moolenaar CheckScriptSuccess([ 1973a72cfb80SBram Moolenaar 'vim9script', 1974a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 1975a72cfb80SBram Moolenaar ]) 1976a72cfb80SBram Moolenaar CheckScriptFailure([ 1977a72cfb80SBram Moolenaar 'vim9script', 1978a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 1979a72cfb80SBram Moolenaar ], 'E488:') 1980a72cfb80SBram Moolenaar 1981a72cfb80SBram Moolenaar CheckScriptSuccess([ 1982a72cfb80SBram Moolenaar 'vim9script', 19834c17ad94SBram Moolenaar 'func g:DeleteMeA()', 1984a72cfb80SBram Moolenaar 'endfunc', 19854c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 1986a72cfb80SBram Moolenaar ]) 1987a72cfb80SBram Moolenaar CheckScriptFailure([ 1988a72cfb80SBram Moolenaar 'vim9script', 19894c17ad94SBram Moolenaar 'func g:DeleteMeB()', 1990a72cfb80SBram Moolenaar 'endfunc', 19914c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 1992a72cfb80SBram Moolenaar ], 'E488:') 1993a72cfb80SBram Moolenaar 1994a72cfb80SBram Moolenaar CheckScriptSuccess([ 1995a72cfb80SBram Moolenaar 'vim9script', 1996a72cfb80SBram Moolenaar 'call execute("ls") # comment', 1997a72cfb80SBram Moolenaar ]) 1998a72cfb80SBram Moolenaar CheckScriptFailure([ 1999a72cfb80SBram Moolenaar 'vim9script', 2000a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2001a72cfb80SBram Moolenaar ], 'E488:') 20022c5ed4e3SBram Moolenaarenddef 20032c5ed4e3SBram Moolenaar 20042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 20052c5ed4e3SBram Moolenaar CheckCanRunGui 20062c5ed4e3SBram Moolenaar 20072c5ed4e3SBram Moolenaar CheckScriptFailure([ 20082c5ed4e3SBram Moolenaar 'vim9script', 20092c5ed4e3SBram Moolenaar 'gui#comment' 20102c5ed4e3SBram Moolenaar ], 'E499:') 20112c5ed4e3SBram Moolenaar CheckScriptFailure([ 20122c5ed4e3SBram Moolenaar 'vim9script', 20132c5ed4e3SBram Moolenaar 'gui -f#comment' 20142c5ed4e3SBram Moolenaar ], 'E499:') 20157a092245SBram Moolenaarenddef 20167a092245SBram Moolenaar 2017a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 20186797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 20196797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2020a26b9700SBram Moolenaar 2021a26b9700SBram Moolenaar edit test.vim 2022a26b9700SBram Moolenaar doautocmd TabEnter #comment 2023a26b9700SBram Moolenaar assert_equal(1, g:entered) 2024a26b9700SBram Moolenaar 2025a26b9700SBram Moolenaar doautocmd TabEnter f.x 2026a26b9700SBram Moolenaar assert_equal(2, g:entered) 2027a26b9700SBram Moolenaar 2028a26b9700SBram Moolenaar g:entered = 0 2029a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2030a26b9700SBram Moolenaar assert_equal(2, g:entered) 2031a26b9700SBram Moolenaar 2032a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2033a26b9700SBram Moolenaar 2034a26b9700SBram Moolenaar au! TabEnter 2035a26b9700SBram Moolenaar unlet g:entered 2036d72c1bf0SBram Moolenaar 2037d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2038d72c1bf0SBram Moolenaar 'vim9script', 20396797966dSBram Moolenaar 'g:var = 123', 2040e55b1c09SBram Moolenaar 'b:var = 456', 2041e55b1c09SBram Moolenaar 'w:var = 777', 2042e55b1c09SBram Moolenaar 't:var = 888', 2043d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2044d72c1bf0SBram Moolenaar ]) 2045d72c1bf0SBram Moolenaar 2046d72c1bf0SBram Moolenaar CheckScriptFailure([ 2047d72c1bf0SBram Moolenaar 'vim9script', 2048d72c1bf0SBram Moolenaar 'let g:var = 123', 2049e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2050e55b1c09SBram Moolenaar 2051e55b1c09SBram Moolenaar CheckScriptFailure([ 2052e55b1c09SBram Moolenaar 'vim9script', 2053e55b1c09SBram Moolenaar 'let b:var = 123', 2054e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2055e55b1c09SBram Moolenaar 2056e55b1c09SBram Moolenaar CheckScriptFailure([ 2057e55b1c09SBram Moolenaar 'vim9script', 2058e55b1c09SBram Moolenaar 'let w:var = 123', 2059e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2060e55b1c09SBram Moolenaar 2061e55b1c09SBram Moolenaar CheckScriptFailure([ 2062e55b1c09SBram Moolenaar 'vim9script', 2063e55b1c09SBram Moolenaar 'let t:var = 123', 2064e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2065e55b1c09SBram Moolenaar 2066e55b1c09SBram Moolenaar CheckScriptFailure([ 2067e55b1c09SBram Moolenaar 'vim9script', 2068e55b1c09SBram Moolenaar 'let v:version = 123', 2069e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2070e55b1c09SBram Moolenaar 2071e55b1c09SBram Moolenaar CheckScriptFailure([ 2072e55b1c09SBram Moolenaar 'vim9script', 2073e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2074e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 20756797966dSBram Moolenaar 20766797966dSBram Moolenaar CheckScriptFailure([ 20776797966dSBram Moolenaar 'vim9script', 20786797966dSBram Moolenaar 'g:var = 123', 207932e35117SBram Moolenaar 'unlet g:var# comment1', 2080d72c1bf0SBram Moolenaar ], 'E108:') 2081d72c1bf0SBram Moolenaar 2082d72c1bf0SBram Moolenaar CheckScriptFailure([ 2083d72c1bf0SBram Moolenaar 'let g:var = 123', 2084d72c1bf0SBram Moolenaar 'unlet g:var # something', 2085d72c1bf0SBram Moolenaar ], 'E488:') 2086faac4104SBram Moolenaar 2087faac4104SBram Moolenaar CheckScriptSuccess([ 2088faac4104SBram Moolenaar 'vim9script', 208932e35117SBram Moolenaar 'if 1 # comment2', 2090faac4104SBram Moolenaar ' echo "yes"', 2091faac4104SBram Moolenaar 'elseif 2 #comment', 2092faac4104SBram Moolenaar ' echo "no"', 2093faac4104SBram Moolenaar 'endif', 2094faac4104SBram Moolenaar ]) 2095faac4104SBram Moolenaar 2096faac4104SBram Moolenaar CheckScriptFailure([ 2097faac4104SBram Moolenaar 'vim9script', 209832e35117SBram Moolenaar 'if 1# comment3', 2099faac4104SBram Moolenaar ' echo "yes"', 2100faac4104SBram Moolenaar 'endif', 2101faac4104SBram Moolenaar ], 'E15:') 2102faac4104SBram Moolenaar 2103faac4104SBram Moolenaar CheckScriptFailure([ 2104faac4104SBram Moolenaar 'vim9script', 210532e35117SBram Moolenaar 'if 0 # comment4', 2106faac4104SBram Moolenaar ' echo "yes"', 2107faac4104SBram Moolenaar 'elseif 2#comment', 2108faac4104SBram Moolenaar ' echo "no"', 2109faac4104SBram Moolenaar 'endif', 2110faac4104SBram Moolenaar ], 'E15:') 2111faac4104SBram Moolenaar 2112faac4104SBram Moolenaar CheckScriptSuccess([ 2113faac4104SBram Moolenaar 'vim9script', 211432e35117SBram Moolenaar 'let v = 1 # comment5', 2115faac4104SBram Moolenaar ]) 2116faac4104SBram Moolenaar 2117faac4104SBram Moolenaar CheckScriptFailure([ 2118faac4104SBram Moolenaar 'vim9script', 211932e35117SBram Moolenaar 'let v = 1# comment6', 212032e35117SBram Moolenaar ], 'E15:') 2121faac4104SBram Moolenaar 2122faac4104SBram Moolenaar CheckScriptSuccess([ 2123faac4104SBram Moolenaar 'vim9script', 2124faac4104SBram Moolenaar 'new' 2125faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2126df069eecSBram Moolenaar ':$', 2127faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2128faac4104SBram Moolenaar 'bwipe!', 2129faac4104SBram Moolenaar ]) 2130faac4104SBram Moolenaar 2131f5be8cdbSBram Moolenaar CheckScriptFailure([ 2132f5be8cdbSBram Moolenaar 'vim9script', 2133f5be8cdbSBram Moolenaar 'new' 2134f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2135f5be8cdbSBram Moolenaar ':$', 2136f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2137f5be8cdbSBram Moolenaar 'bwipe!', 2138f5be8cdbSBram Moolenaar ], 'E488:') 2139f5be8cdbSBram Moolenaar 2140f5be8cdbSBram Moolenaar CheckScriptFailure([ 2141f5be8cdbSBram Moolenaar 'vim9script', 2142f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2143f5be8cdbSBram Moolenaar ], 'E477:') 2144a26b9700SBram Moolenaarenddef 2145a26b9700SBram Moolenaar 21467e5bd91dSBram Moolenaardef Test_finish() 21477e5bd91dSBram Moolenaar let lines =<< trim END 21487e5bd91dSBram Moolenaar vim9script 21496797966dSBram Moolenaar g:res = 'one' 21507e5bd91dSBram Moolenaar if v:false | finish | endif 21516797966dSBram Moolenaar g:res = 'two' 21527e5bd91dSBram Moolenaar finish 21536797966dSBram Moolenaar g:res = 'three' 21547e5bd91dSBram Moolenaar END 21557e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 21567e5bd91dSBram Moolenaar source Xfinished 21577e5bd91dSBram Moolenaar assert_equal('two', g:res) 21587e5bd91dSBram Moolenaar 21597e5bd91dSBram Moolenaar unlet g:res 21607e5bd91dSBram Moolenaar delete('Xfinished') 21617e5bd91dSBram Moolenaarenddef 21627e5bd91dSBram Moolenaar 216332e35117SBram Moolenaardef Test_let_func_call() 216432e35117SBram Moolenaar let lines =<< trim END 216532e35117SBram Moolenaar vim9script 216632e35117SBram Moolenaar func GetValue() 216732e35117SBram Moolenaar if exists('g:count') 216832e35117SBram Moolenaar let g:count += 1 216932e35117SBram Moolenaar else 217032e35117SBram Moolenaar let g:count = 1 217132e35117SBram Moolenaar endif 217232e35117SBram Moolenaar return 'this' 217332e35117SBram Moolenaar endfunc 217432e35117SBram Moolenaar let val: string = GetValue() 2175f5be8cdbSBram Moolenaar # env var is always a string 2176df671b46SBram Moolenaar let env = $TERM 217732e35117SBram Moolenaar END 217832e35117SBram Moolenaar writefile(lines, 'Xfinished') 217932e35117SBram Moolenaar source Xfinished 2180f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 218132e35117SBram Moolenaar assert_equal(1, g:count) 218232e35117SBram Moolenaar 218332e35117SBram Moolenaar unlet g:count 218432e35117SBram Moolenaar delete('Xfinished') 218532e35117SBram Moolenaarenddef 218632e35117SBram Moolenaar 218732e35117SBram Moolenaardef Test_let_missing_type() 218832e35117SBram Moolenaar let lines =<< trim END 218932e35117SBram Moolenaar vim9script 2190df671b46SBram Moolenaar let var = g:unknown 2191227a69deSBram Moolenaar END 2192822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2193227a69deSBram Moolenaar 2194227a69deSBram Moolenaar lines =<< trim END 2195227a69deSBram Moolenaar vim9script 2196227a69deSBram Moolenaar let nr: number = 123 2197227a69deSBram Moolenaar let var = nr 2198227a69deSBram Moolenaar END 2199822ba247SBram Moolenaar CheckScriptSuccess(lines) 220032e35117SBram Moolenaarenddef 220132e35117SBram Moolenaar 2202c82a5b5dSBram Moolenaardef Test_let_declaration() 2203c82a5b5dSBram Moolenaar let lines =<< trim END 2204c82a5b5dSBram Moolenaar vim9script 2205c82a5b5dSBram Moolenaar let var: string 2206c82a5b5dSBram Moolenaar g:var_uninit = var 2207c82a5b5dSBram Moolenaar var = 'text' 2208c82a5b5dSBram Moolenaar g:var_test = var 2209f5be8cdbSBram Moolenaar # prefixing s: is optional 2210984dddbeSBram Moolenaar s:var = 'prefixed' 2211984dddbeSBram Moolenaar g:var_prefixed = s:var 2212984dddbeSBram Moolenaar 2213984dddbeSBram Moolenaar let s:other: number 2214984dddbeSBram Moolenaar other = 1234 2215984dddbeSBram Moolenaar g:other_var = other 2216c82a5b5dSBram Moolenaar END 2217c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2218c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2219c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2220984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2221984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2222c82a5b5dSBram Moolenaar 2223c82a5b5dSBram Moolenaar unlet g:var_uninit 2224c82a5b5dSBram Moolenaar unlet g:var_test 2225984dddbeSBram Moolenaar unlet g:var_prefixed 2226984dddbeSBram Moolenaar unlet g:other_var 2227c82a5b5dSBram Moolenaarenddef 2228c82a5b5dSBram Moolenaar 2229c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2230c5b1c20bSBram Moolenaar let lines =<< trim END 2231c5b1c20bSBram Moolenaar vim9script 2232c5b1c20bSBram Moolenaar const var: string 2233c5b1c20bSBram Moolenaar END 2234c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2235c5b1c20bSBram Moolenaar 2236c5b1c20bSBram Moolenaar lines =<< trim END 2237c5b1c20bSBram Moolenaar vim9script 2238c5b1c20bSBram Moolenaar let 9var: string 2239c5b1c20bSBram Moolenaar END 2240c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2241c5b1c20bSBram Moolenaarenddef 2242c5b1c20bSBram Moolenaar 224334db91f7SBram Moolenaardef Test_let_type_check() 224434db91f7SBram Moolenaar let lines =<< trim END 224534db91f7SBram Moolenaar vim9script 224634db91f7SBram Moolenaar let var: string 224734db91f7SBram Moolenaar var = 1234 224834db91f7SBram Moolenaar END 224934db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2250984dddbeSBram Moolenaar 2251984dddbeSBram Moolenaar lines =<< trim END 2252984dddbeSBram Moolenaar vim9script 2253984dddbeSBram Moolenaar let var:string 2254984dddbeSBram Moolenaar END 2255984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2256c5b1c20bSBram Moolenaar 2257c5b1c20bSBram Moolenaar lines =<< trim END 2258c5b1c20bSBram Moolenaar vim9script 2259c5b1c20bSBram Moolenaar let var: asdf 2260c5b1c20bSBram Moolenaar END 2261c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 226234db91f7SBram Moolenaarenddef 226334db91f7SBram Moolenaar 2264a5d0077eSBram Moolenaardef Test_forward_declaration() 2265a5d0077eSBram Moolenaar let lines =<< trim END 2266a5d0077eSBram Moolenaar vim9script 2267a5d0077eSBram Moolenaar def GetValue(): string 2268a5d0077eSBram Moolenaar return theVal 2269a5d0077eSBram Moolenaar enddef 2270a5d0077eSBram Moolenaar let theVal = 'something' 2271822ba247SBram Moolenaar g:initVal = GetValue() 2272a5d0077eSBram Moolenaar theVal = 'else' 2273a5d0077eSBram Moolenaar g:laterVal = GetValue() 2274a5d0077eSBram Moolenaar END 2275a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2276a5d0077eSBram Moolenaar source Xforward 2277a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2278a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2279a5d0077eSBram Moolenaar 2280a5d0077eSBram Moolenaar unlet g:initVal 2281a5d0077eSBram Moolenaar unlet g:laterVal 2282a5d0077eSBram Moolenaar delete('Xforward') 2283a5d0077eSBram Moolenaarenddef 2284a5d0077eSBram Moolenaar 22859721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 22869721fb4eSBram Moolenaar let legacy_lines =<< trim END 22879721fb4eSBram Moolenaar source Xvim9_script.vim 22889721fb4eSBram Moolenaar 22899721fb4eSBram Moolenaar call assert_false(exists('local')) 22909721fb4eSBram Moolenaar call assert_false(exists('exported')) 22919721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 22929721fb4eSBram Moolenaar call assert_equal('global', global) 22939721fb4eSBram Moolenaar call assert_equal('global', g:global) 22949721fb4eSBram Moolenaar 22959721fb4eSBram Moolenaar " imported variable becomes script-local 22969721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 22979721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 22989721fb4eSBram Moolenaar call assert_false(exists('exported')) 22999721fb4eSBram Moolenaar 23009721fb4eSBram Moolenaar " imported function becomes script-local 23019721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 23029721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 23039721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 23049721fb4eSBram Moolenaar END 23059721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 23069721fb4eSBram Moolenaar 23079721fb4eSBram Moolenaar let vim9_lines =<< trim END 23089721fb4eSBram Moolenaar vim9script 23099721fb4eSBram Moolenaar let local = 'local' 23109721fb4eSBram Moolenaar g:global = 'global' 23119721fb4eSBram Moolenaar export let exported = 'exported' 23129721fb4eSBram Moolenaar export def GetText(): string 23139721fb4eSBram Moolenaar return 'text' 23149721fb4eSBram Moolenaar enddef 23159721fb4eSBram Moolenaar END 23169721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 23179721fb4eSBram Moolenaar 23189721fb4eSBram Moolenaar source Xlegacy_script.vim 23199721fb4eSBram Moolenaar 23209721fb4eSBram Moolenaar assert_equal('global', g:global) 2321f5be8cdbSBram Moolenaar unlet g:global 23229721fb4eSBram Moolenaar 23239721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 23249721fb4eSBram Moolenaar delete('Xvim9_script.vim') 23259721fb4eSBram Moolenaarenddef 2326a5d0077eSBram Moolenaar 2327eeb27bfeSBram Moolenaardef Test_vim9_copen() 2328eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2329eeb27bfeSBram Moolenaar copen 2330eeb27bfeSBram Moolenaar quit 2331eeb27bfeSBram Moolenaarenddef 2332eeb27bfeSBram Moolenaar 2333585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2334585fea7bSBram Moolenaardef Test_substitute_cmd() 2335585fea7bSBram Moolenaar new 2336585fea7bSBram Moolenaar setline(1, 'something') 2337585fea7bSBram Moolenaar :substitute(some(other( 2338585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2339585fea7bSBram Moolenaar bwipe! 2340585fea7bSBram Moolenaar 2341f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2342585fea7bSBram Moolenaar let lines =<< trim END 2343585fea7bSBram Moolenaar vim9script 2344585fea7bSBram Moolenaar new 2345585fea7bSBram Moolenaar setline(1, 'something') 2346585fea7bSBram Moolenaar :substitute(some(other( 2347585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2348585fea7bSBram Moolenaar bwipe! 2349585fea7bSBram Moolenaar END 2350585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2351585fea7bSBram Moolenaar source Xvim9lines 2352585fea7bSBram Moolenaar 2353585fea7bSBram Moolenaar delete('Xvim9lines') 2354585fea7bSBram Moolenaarenddef 2355585fea7bSBram Moolenaar 23568a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2357