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 116*f5be8cdbSBram 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 125*f5be8cdbSBram 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 178*f5be8cdbSBram 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() 188*f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 189*f5be8cdbSBram 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') 262*f5be8cdbSBram 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() 397*f5be8cdbSBram 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 406*f5be8cdbSBram 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) 5128a7d6542SBram Moolenaarenddef 5138a7d6542SBram Moolenaar 514257cc5eeSBram Moolenaardef ThrowFromDef() 515a72cfb80SBram Moolenaar throw "getout" # comment 516257cc5eeSBram Moolenaarenddef 517257cc5eeSBram Moolenaar 518257cc5eeSBram Moolenaarfunc CatchInFunc() 519257cc5eeSBram Moolenaar try 520257cc5eeSBram Moolenaar call ThrowFromDef() 521257cc5eeSBram Moolenaar catch 522257cc5eeSBram Moolenaar let g:thrown_func = v:exception 523257cc5eeSBram Moolenaar endtry 524257cc5eeSBram Moolenaarendfunc 525257cc5eeSBram Moolenaar 526257cc5eeSBram Moolenaardef CatchInDef() 527257cc5eeSBram Moolenaar try 528257cc5eeSBram Moolenaar ThrowFromDef() 529257cc5eeSBram Moolenaar catch 530257cc5eeSBram Moolenaar g:thrown_def = v:exception 531257cc5eeSBram Moolenaar endtry 532257cc5eeSBram Moolenaarenddef 533257cc5eeSBram Moolenaar 534f575adffSBram Moolenaardef ReturnFinally(): string 535f575adffSBram Moolenaar try 536f575adffSBram Moolenaar return 'intry' 537f575adffSBram Moolenaar finally 538f575adffSBram Moolenaar g:in_finally = 'finally' 539f575adffSBram Moolenaar endtry 540f575adffSBram Moolenaar return 'end' 541f575adffSBram Moolenaarenddef 542f575adffSBram Moolenaar 543257cc5eeSBram Moolenaardef Test_try_catch_nested() 544257cc5eeSBram Moolenaar CatchInFunc() 545257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 546257cc5eeSBram Moolenaar 547257cc5eeSBram Moolenaar CatchInDef() 548257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 549f575adffSBram Moolenaar 550f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 551f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 552f575adffSBram Moolenaarenddef 553f575adffSBram Moolenaar 554f575adffSBram Moolenaardef Test_try_catch_match() 555f575adffSBram Moolenaar let seq = 'a' 556f575adffSBram Moolenaar try 557f575adffSBram Moolenaar throw 'something' 558f575adffSBram Moolenaar catch /nothing/ 559f575adffSBram Moolenaar seq ..= 'x' 560f575adffSBram Moolenaar catch /some/ 561f575adffSBram Moolenaar seq ..= 'b' 562f575adffSBram Moolenaar catch /asdf/ 563f575adffSBram Moolenaar seq ..= 'x' 564e8c4abbbSBram Moolenaar catch ?a\?sdf? 565e8c4abbbSBram Moolenaar seq ..= 'y' 566f575adffSBram Moolenaar finally 567f575adffSBram Moolenaar seq ..= 'c' 568f575adffSBram Moolenaar endtry 569f575adffSBram Moolenaar assert_equal('abc', seq) 570257cc5eeSBram Moolenaarenddef 571257cc5eeSBram Moolenaar 572e8c4abbbSBram Moolenaardef Test_try_catch_fails() 573e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 574e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 575e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 576585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 577585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 578585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 579585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 580585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 581585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 582585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 583585fea7bSBram Moolenaar 584a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 585585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 586e8c4abbbSBram Moolenaarenddef 587e8c4abbbSBram Moolenaar 588006ad48bSBram Moolenaardef Test_throw_vimscript() 589*f5be8cdbSBram Moolenaar # only checks line continuation 590006ad48bSBram Moolenaar let lines =<< trim END 591006ad48bSBram Moolenaar vim9script 592006ad48bSBram Moolenaar try 593006ad48bSBram Moolenaar throw 'one' 594006ad48bSBram Moolenaar .. 'two' 595006ad48bSBram Moolenaar catch 596006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 597006ad48bSBram Moolenaar endtry 598006ad48bSBram Moolenaar END 599006ad48bSBram Moolenaar CheckScriptSuccess(lines) 600006ad48bSBram Moolenaarenddef 601006ad48bSBram Moolenaar 60237c83711SBram Moolenaardef Test_cexpr_vimscript() 603*f5be8cdbSBram Moolenaar # only checks line continuation 60437c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 60537c83711SBram Moolenaar let lines =<< trim END 60637c83711SBram Moolenaar vim9script 60737c83711SBram Moolenaar cexpr 'File' 60837c83711SBram Moolenaar .. ' someFile' .. 60937c83711SBram Moolenaar ' line 19' 61037c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 61137c83711SBram Moolenaar END 61237c83711SBram Moolenaar CheckScriptSuccess(lines) 61337c83711SBram Moolenaar set errorformat& 61437c83711SBram Moolenaarenddef 61537c83711SBram Moolenaar 6162a1381c3SBram Moolenaarif has('channel') 61740ee466cSBram Moolenaar let someJob = test_null_job() 61840ee466cSBram Moolenaar 61940ee466cSBram Moolenaar def FuncWithError() 62040ee466cSBram Moolenaar echomsg g:someJob 62140ee466cSBram Moolenaar enddef 62240ee466cSBram Moolenaar 62340ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 62440ee466cSBram Moolenaar try 62540ee466cSBram Moolenaar call FuncWithError() 62640ee466cSBram Moolenaar catch 62740ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 62840ee466cSBram Moolenaar endtry 62940ee466cSBram Moolenaar endfunc 6302a1381c3SBram Moolenaarendif 63140ee466cSBram Moolenaar 6328a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 6338a7d6542SBram Moolenaar vim9script 6348a7d6542SBram Moolenaar let name: string = 'bob' 6358a7d6542SBram Moolenaar def Concat(arg: string): string 6368a7d6542SBram Moolenaar return name .. arg 6378a7d6542SBram Moolenaar enddef 638227a69deSBram Moolenaar g:result = Concat('bie') 639227a69deSBram Moolenaar g:localname = name 6408a7d6542SBram Moolenaar 6418a7d6542SBram Moolenaar export const CONST = 1234 6428a7d6542SBram Moolenaar export let exported = 9876 6436e587dcbSBram Moolenaar export let exp_name = 'John' 6448a7d6542SBram Moolenaar export def Exported(): string 6458a7d6542SBram Moolenaar return 'Exported' 6468a7d6542SBram Moolenaar enddef 6478a7d6542SBram MoolenaarEND 6488a7d6542SBram Moolenaar 6495269bd2aSBram Moolenaardef Test_vim9_import_export() 6508a7d6542SBram Moolenaar let import_script_lines =<< trim END 6518a7d6542SBram Moolenaar vim9script 6528a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 6538a7d6542SBram Moolenaar g:imported = exported 6546e587dcbSBram Moolenaar exported += 3 6556e587dcbSBram Moolenaar g:imported_added = exported 6568a7d6542SBram Moolenaar g:imported_func = Exported() 6576e587dcbSBram Moolenaar 6586e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 6596e587dcbSBram Moolenaar g:imported_name = exp_name 6606e587dcbSBram Moolenaar exp_name ..= ' Doe' 6616e587dcbSBram Moolenaar g:imported_name_appended = exp_name 6625381c7a1SBram Moolenaar g:imported_later = exported 6638a7d6542SBram Moolenaar END 6648a7d6542SBram Moolenaar 6658a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 6668a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 6678a7d6542SBram Moolenaar 6688a7d6542SBram Moolenaar source Ximport.vim 6698a7d6542SBram Moolenaar 6708a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 6718a7d6542SBram Moolenaar assert_equal('bob', g:localname) 6728a7d6542SBram Moolenaar assert_equal(9876, g:imported) 6736e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 6745381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 6758a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 6766e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 6776e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 6788a7d6542SBram Moolenaar assert_false(exists('g:name')) 6798a7d6542SBram Moolenaar 6808a7d6542SBram Moolenaar unlet g:result 6818a7d6542SBram Moolenaar unlet g:localname 6828a7d6542SBram Moolenaar unlet g:imported 6836e587dcbSBram Moolenaar unlet g:imported_added 6845381c7a1SBram Moolenaar unlet g:imported_later 6858a7d6542SBram Moolenaar unlet g:imported_func 6866e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 6878a7d6542SBram Moolenaar delete('Ximport.vim') 688f2d5c240SBram Moolenaar 6891c991144SBram Moolenaar # similar, with line breaks 6901c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 6911c991144SBram Moolenaar vim9script 6921c991144SBram Moolenaar import { 6931c991144SBram Moolenaar exported, 6941c991144SBram Moolenaar Exported, 6951c991144SBram Moolenaar } 6961c991144SBram Moolenaar from 6971c991144SBram Moolenaar './Xexport.vim' 6981c991144SBram Moolenaar g:imported = exported 6991c991144SBram Moolenaar exported += 5 7001c991144SBram Moolenaar g:imported_added = exported 7011c991144SBram Moolenaar g:imported_func = Exported() 7021c991144SBram Moolenaar END 7031c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 7041c991144SBram Moolenaar source Ximport_lbr.vim 7051c991144SBram Moolenaar 7061c991144SBram Moolenaar assert_equal(9876, g:imported) 7071c991144SBram Moolenaar assert_equal(9881, g:imported_added) 7081c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 7091c991144SBram Moolenaar 7101c991144SBram Moolenaar # exported script not sourced again 7111c991144SBram Moolenaar assert_false(exists('g:result')) 7121c991144SBram Moolenaar unlet g:imported 7131c991144SBram Moolenaar unlet g:imported_added 7141c991144SBram Moolenaar unlet g:imported_func 7151c991144SBram Moolenaar delete('Ximport_lbr.vim') 7161c991144SBram Moolenaar 7171c991144SBram Moolenaar # import inside :def function 7185381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 7195381c7a1SBram Moolenaar vim9script 7205381c7a1SBram Moolenaar def ImportInDef() 7215381c7a1SBram Moolenaar import exported from './Xexport.vim' 7225381c7a1SBram Moolenaar g:imported = exported 7235381c7a1SBram Moolenaar exported += 7 7245381c7a1SBram Moolenaar g:imported_added = exported 7255381c7a1SBram Moolenaar enddef 7265381c7a1SBram Moolenaar ImportInDef() 7275381c7a1SBram Moolenaar END 7285381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 7295381c7a1SBram Moolenaar source Ximport2.vim 730*f5be8cdbSBram Moolenaar # TODO: this should be 9879 7315381c7a1SBram Moolenaar assert_equal(9876, g:imported) 7325381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 7335381c7a1SBram Moolenaar unlet g:imported 7345381c7a1SBram Moolenaar unlet g:imported_added 7355381c7a1SBram Moolenaar delete('Ximport2.vim') 7365381c7a1SBram Moolenaar 737f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 738f2d5c240SBram Moolenaar vim9script 739f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 740f2d5c240SBram Moolenaar def UseExport() 741f2d5c240SBram Moolenaar g:imported = Export.exported 742f2d5c240SBram Moolenaar enddef 743f2d5c240SBram Moolenaar UseExport() 744f2d5c240SBram Moolenaar END 745f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 746f2d5c240SBram Moolenaar source Ximport.vim 7475381c7a1SBram Moolenaar assert_equal(9883, g:imported) 748f2d5c240SBram Moolenaar 749599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 750599c89c8SBram Moolenaar vim9script 751599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 752599c89c8SBram Moolenaar def Func() 753599c89c8SBram Moolenaar let dummy = 1 754599c89c8SBram Moolenaar let imported = Export + dummy 755599c89c8SBram Moolenaar enddef 756822ba247SBram Moolenaar defcompile 757599c89c8SBram Moolenaar END 758599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 759599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 760599c89c8SBram Moolenaar 761599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 762599c89c8SBram Moolenaar vim9script 763599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 764599c89c8SBram Moolenaar def Func() 765599c89c8SBram Moolenaar let imported = Export . exported 766599c89c8SBram Moolenaar enddef 767822ba247SBram Moolenaar defcompile 768599c89c8SBram Moolenaar END 769599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 770599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 771599c89c8SBram Moolenaar 772599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 773599c89c8SBram Moolenaar vim9script 774599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 775599c89c8SBram Moolenaar def Func() 776599c89c8SBram Moolenaar let imported = Export. 777599c89c8SBram Moolenaar enddef 778822ba247SBram Moolenaar defcompile 779599c89c8SBram Moolenaar END 780599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 781599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 782599c89c8SBram Moolenaar 7831c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 7841c991144SBram Moolenaar vim9script 7851c991144SBram Moolenaar import * 7861c991144SBram Moolenaar as Export 7871c991144SBram Moolenaar from 7881c991144SBram Moolenaar './Xexport.vim' 7891c991144SBram Moolenaar def UseExport() 7901c991144SBram Moolenaar g:imported = Export.exported 7911c991144SBram Moolenaar enddef 7921c991144SBram Moolenaar UseExport() 7931c991144SBram Moolenaar END 7941c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 7951c991144SBram Moolenaar source Ximport.vim 7961c991144SBram Moolenaar assert_equal(9883, g:imported) 7971c991144SBram Moolenaar 798f2d5c240SBram Moolenaar let import_star_lines =<< trim END 799f2d5c240SBram Moolenaar vim9script 800f2d5c240SBram Moolenaar import * from './Xexport.vim' 801f2d5c240SBram Moolenaar END 802f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 803f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 804f2d5c240SBram Moolenaar 805*f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 806fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 807fa29c8abSBram Moolenaar vim9script 808fa29c8abSBram Moolenaar import name from './Xexport.vim' 809fa29c8abSBram Moolenaar END 810fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 811fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 812fa29c8abSBram Moolenaar 813*f5be8cdbSBram Moolenaar # try to import something that is already defined 8145269bd2aSBram Moolenaar let import_already_defined =<< trim END 8155269bd2aSBram Moolenaar vim9script 8165269bd2aSBram Moolenaar let exported = 'something' 8175269bd2aSBram Moolenaar import exported from './Xexport.vim' 8185269bd2aSBram Moolenaar END 8195269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8205269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8215269bd2aSBram Moolenaar 822*f5be8cdbSBram Moolenaar # try to import something that is already defined 8235269bd2aSBram Moolenaar import_already_defined =<< trim END 8245269bd2aSBram Moolenaar vim9script 8255269bd2aSBram Moolenaar let exported = 'something' 8265269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 8275269bd2aSBram Moolenaar END 8285269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8295269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8305269bd2aSBram Moolenaar 831*f5be8cdbSBram Moolenaar # try to import something that is already defined 8325269bd2aSBram Moolenaar import_already_defined =<< trim END 8335269bd2aSBram Moolenaar vim9script 8345269bd2aSBram Moolenaar let exported = 'something' 8355269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 8365269bd2aSBram Moolenaar END 8375269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 8385269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 8395269bd2aSBram Moolenaar 840*f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 841fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 842fa29c8abSBram Moolenaar vim9script 843fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 844fa29c8abSBram Moolenaar END 845fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 846fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 847fa29c8abSBram Moolenaar 848fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 849fa29c8abSBram Moolenaar vim9script 850fa29c8abSBram Moolenaar import name './Xexport.vim' 851fa29c8abSBram Moolenaar END 852fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 853fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 854fa29c8abSBram Moolenaar 855fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 856fa29c8abSBram Moolenaar vim9script 857fa29c8abSBram Moolenaar import name from Xexport.vim 858fa29c8abSBram Moolenaar END 859fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 860fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 861fa29c8abSBram Moolenaar 862fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 863fa29c8abSBram Moolenaar vim9script 864fa29c8abSBram Moolenaar import name from './XnoExport.vim' 865fa29c8abSBram Moolenaar END 866fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 867fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 868fa29c8abSBram Moolenaar 869fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 870fa29c8abSBram Moolenaar vim9script 871fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 872fa29c8abSBram Moolenaar END 8735269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 8745269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 875fa29c8abSBram Moolenaar 876f2d5c240SBram Moolenaar delete('Ximport.vim') 8775269bd2aSBram Moolenaar delete('Ximport3.vim') 8788a7d6542SBram Moolenaar delete('Xexport.vim') 8798a7d6542SBram Moolenaar 880*f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 881750802b5SBram Moolenaar set cpo&vi 882750802b5SBram Moolenaar let cpo_before = &cpo 883750802b5SBram Moolenaar let lines =<< trim END 884750802b5SBram Moolenaar vim9script 885750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 886750802b5SBram Moolenaar END 887750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 888750802b5SBram Moolenaar source Xvim9_script 889750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 890750802b5SBram Moolenaar set cpo&vim 891750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 892750802b5SBram Moolenaar delete('Xvim9_script') 893750802b5SBram Moolenaarenddef 894750802b5SBram Moolenaar 895750802b5SBram Moolenaardef Test_vim9script_fails() 8968a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 8978a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 898750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 8999721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 9009b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 901750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 902750802b5SBram Moolenaar 903c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 904c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 905c785b9a7SBram Moolenaar 906750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 907a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 9088a7d6542SBram Moolenaarenddef 9098a7d6542SBram Moolenaar 910f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 911101f4810SBram Moolenaar CheckRunVimInTerminal 912101f4810SBram Moolenaar 9139bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 914c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 9159bb3eb3eSBram Moolenaarendfunc 9169bb3eb3eSBram Moolenaar 917c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 918101f4810SBram Moolenaar let export =<< trim END 919101f4810SBram Moolenaar vim9script 920101f4810SBram Moolenaar export def Foo(): number 921101f4810SBram Moolenaar return 0 922101f4810SBram Moolenaar enddef 923101f4810SBram Moolenaar END 9249bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 925101f4810SBram Moolenaar 9269bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 9279bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 9289bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 929101f4810SBram Moolenaar 9309bb3eb3eSBram Moolenaar delete('Xexport.vim') 9319bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 9329bb3eb3eSBram Moolenaarenddef 933101f4810SBram Moolenaar 9344c17ad94SBram Moolenaardef Test_vim9script_reload_import() 9358a7d6542SBram Moolenaar let lines =<< trim END 9368a7d6542SBram Moolenaar vim9script 9378a7d6542SBram Moolenaar const var = '' 9388a7d6542SBram Moolenaar let valone = 1234 9398a7d6542SBram Moolenaar def MyFunc(arg: string) 9408a7d6542SBram Moolenaar valone = 5678 9418a7d6542SBram Moolenaar enddef 9428a7d6542SBram Moolenaar END 9438a7d6542SBram Moolenaar let morelines =<< trim END 9448a7d6542SBram Moolenaar let valtwo = 222 9458a7d6542SBram Moolenaar export def GetValtwo(): number 9468a7d6542SBram Moolenaar return valtwo 9478a7d6542SBram Moolenaar enddef 9488a7d6542SBram Moolenaar END 94903afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 9508a7d6542SBram Moolenaar source Xreload.vim 9518a7d6542SBram Moolenaar source Xreload.vim 9528a7d6542SBram Moolenaar source Xreload.vim 9538a7d6542SBram Moolenaar 9548a7d6542SBram Moolenaar let testlines =<< trim END 9558a7d6542SBram Moolenaar vim9script 9568a7d6542SBram Moolenaar def TheFunc() 9578a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 9588a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 9598a7d6542SBram Moolenaar enddef 9608a7d6542SBram Moolenaar TheFunc() 9618a7d6542SBram Moolenaar END 9628a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 9638a7d6542SBram Moolenaar source Ximport.vim 9648a7d6542SBram Moolenaar 965*f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 966*f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 9678a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 9688a7d6542SBram Moolenaar source Ximport.vim 9698a7d6542SBram Moolenaar 970*f5be8cdbSBram Moolenaar # cannot declare a var twice 9718a7d6542SBram Moolenaar lines =<< trim END 9728a7d6542SBram Moolenaar vim9script 9738a7d6542SBram Moolenaar let valone = 1234 9748a7d6542SBram Moolenaar let valone = 5678 9758a7d6542SBram Moolenaar END 9768a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 9778a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 9788a7d6542SBram Moolenaar 9798a7d6542SBram Moolenaar delete('Xreload.vim') 9808a7d6542SBram Moolenaar delete('Ximport.vim') 9818a7d6542SBram Moolenaarenddef 9828a7d6542SBram Moolenaar 983fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 984fe465a01SBram Moolenaar" script-local name. 985fe465a01SBram Moolenaardef Test_vim9script_funcref() 986fe465a01SBram Moolenaar let sortlines =<< trim END 987fe465a01SBram Moolenaar vim9script 988fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 989bed36b93SBram Moolenaar return i2 - i1 990fe465a01SBram Moolenaar enddef 991fe465a01SBram Moolenaar 992fe465a01SBram Moolenaar export def FastSort(): list<number> 993fe465a01SBram Moolenaar return range(5)->sort(Compare) 994fe465a01SBram Moolenaar enddef 995fe465a01SBram Moolenaar END 996fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 997fe465a01SBram Moolenaar 998fe465a01SBram Moolenaar let lines =<< trim END 999fe465a01SBram Moolenaar vim9script 1000fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1001fe465a01SBram Moolenaar def Test() 1002fe465a01SBram Moolenaar g:result = FastSort() 1003fe465a01SBram Moolenaar enddef 1004fe465a01SBram Moolenaar Test() 1005fe465a01SBram Moolenaar END 1006fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1007fe465a01SBram Moolenaar 1008fe465a01SBram Moolenaar source Xscript.vim 1009fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1010fe465a01SBram Moolenaar 1011fe465a01SBram Moolenaar unlet g:result 1012fe465a01SBram Moolenaar delete('Xsort.vim') 1013fe465a01SBram Moolenaar delete('Xscript.vim') 1014fe465a01SBram Moolenaarenddef 1015fe465a01SBram Moolenaar 1016c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1017c620c055SBram Moolenaar" script where FastFilter() is called from. 1018c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1019c620c055SBram Moolenaar let filterLines =<< trim END 1020c620c055SBram Moolenaar vim9script 1021c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1022c620c055SBram Moolenaar return idx % 2 == 1 1023c620c055SBram Moolenaar enddef 1024c620c055SBram Moolenaar export def FastFilter(): list<number> 1025c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1026c620c055SBram Moolenaar enddef 1027c620c055SBram Moolenaar END 1028c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1029c620c055SBram Moolenaar 1030c620c055SBram Moolenaar let lines =<< trim END 1031c620c055SBram Moolenaar vim9script 1032c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1033c620c055SBram Moolenaar def Test() 1034c620c055SBram Moolenaar let x: list<number> = FastFilter() 1035c620c055SBram Moolenaar enddef 1036c620c055SBram Moolenaar Test() 1037c620c055SBram Moolenaar END 1038c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1039c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1040c620c055SBram Moolenaar 1041c620c055SBram Moolenaar delete('Xfilter.vim') 1042c620c055SBram Moolenaar delete('Ximport.vim') 1043c620c055SBram Moolenaarenddef 1044c620c055SBram Moolenaar 10454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 10464c17ad94SBram Moolenaar let first_lines =<< trim END 10474c17ad94SBram Moolenaar vim9script 10484c17ad94SBram Moolenaar def FuncYes(): string 10494c17ad94SBram Moolenaar return 'yes' 10504c17ad94SBram Moolenaar enddef 10514c17ad94SBram Moolenaar END 105203afdcf1SBram Moolenaar let withno_lines =<< trim END 10534c17ad94SBram Moolenaar def FuncNo(): string 10544c17ad94SBram Moolenaar return 'no' 10554c17ad94SBram Moolenaar enddef 10564c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 10574c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 10584c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 105903afdcf1SBram Moolenaar enddef 106003afdcf1SBram Moolenaar END 106103afdcf1SBram Moolenaar let nono_lines =<< trim END 106203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 106303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 10644c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 10654c17ad94SBram Moolenaar enddef 10664c17ad94SBram Moolenaar END 10674c17ad94SBram Moolenaar 10684c17ad94SBram Moolenaar # FuncNo() is defined 106903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 10704c17ad94SBram Moolenaar source Xreloaded.vim 10714c17ad94SBram Moolenaar g:DoCheck(true) 10724c17ad94SBram Moolenaar 10734c17ad94SBram Moolenaar # FuncNo() is not redefined 107403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 10754c17ad94SBram Moolenaar source Xreloaded.vim 107603afdcf1SBram Moolenaar g:DoCheck() 10774c17ad94SBram Moolenaar 10784c17ad94SBram Moolenaar # FuncNo() is back 107903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 10804c17ad94SBram Moolenaar source Xreloaded.vim 108103afdcf1SBram Moolenaar g:DoCheck() 10824c17ad94SBram Moolenaar 10834c17ad94SBram Moolenaar delete('Xreloaded.vim') 10844c17ad94SBram Moolenaarenddef 10854c17ad94SBram Moolenaar 108689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 108789483d40SBram Moolenaar # write the script with a script-local variable 108889483d40SBram Moolenaar let lines =<< trim END 108989483d40SBram Moolenaar vim9script 109089483d40SBram Moolenaar let var = 'string' 109189483d40SBram Moolenaar END 109289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 109389483d40SBram Moolenaar source XreloadVar.vim 109489483d40SBram Moolenaar 109589483d40SBram Moolenaar # now write the script using the same variable locally - works 109689483d40SBram Moolenaar lines =<< trim END 109789483d40SBram Moolenaar vim9script 109889483d40SBram Moolenaar def Func() 109989483d40SBram Moolenaar let var = 'string' 110089483d40SBram Moolenaar enddef 110189483d40SBram Moolenaar END 110289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 110389483d40SBram Moolenaar source XreloadVar.vim 110489483d40SBram Moolenaar 110589483d40SBram Moolenaar delete('XreloadVar.vim') 110689483d40SBram Moolenaarenddef 110789483d40SBram Moolenaar 11088a7d6542SBram Moolenaardef Test_import_absolute() 11098a7d6542SBram Moolenaar let import_lines = [ 1110e6085c53SBram Moolenaar 'vim9script', 1111e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1112e6085c53SBram Moolenaar 'def UseExported()', 1113e6085c53SBram Moolenaar ' g:imported_abs = exported', 1114e6085c53SBram Moolenaar ' exported = 8888', 1115e6085c53SBram Moolenaar ' g:imported_after = exported', 1116e6085c53SBram Moolenaar 'enddef', 1117e6085c53SBram Moolenaar 'UseExported()', 1118e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1119e6085c53SBram Moolenaar ] 11208a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 11218a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 11228a7d6542SBram Moolenaar 11238a7d6542SBram Moolenaar source Ximport_abs.vim 11248a7d6542SBram Moolenaar 11258a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 11264e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1127675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1128675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1129675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1130675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1131675f716eSBram Moolenaar 'exported = 8888.*' .. 1132675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1133675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1134675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1135675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1136e6085c53SBram Moolenaar g:import_disassembled) 11378a7d6542SBram Moolenaar unlet g:imported_abs 11384e12a5dfSBram Moolenaar unlet g:import_disassembled 11398a7d6542SBram Moolenaar 11408a7d6542SBram Moolenaar delete('Ximport_abs.vim') 11418a7d6542SBram Moolenaar delete('Xexport_abs.vim') 11428a7d6542SBram Moolenaarenddef 11438a7d6542SBram Moolenaar 11448a7d6542SBram Moolenaardef Test_import_rtp() 11458a7d6542SBram Moolenaar let import_lines = [ 1146e6085c53SBram Moolenaar 'vim9script', 1147e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1148e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1149e6085c53SBram Moolenaar ] 11508a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 11518a7d6542SBram Moolenaar mkdir('import') 11528a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 11538a7d6542SBram Moolenaar 11548a7d6542SBram Moolenaar let save_rtp = &rtp 11558a7d6542SBram Moolenaar &rtp = getcwd() 11568a7d6542SBram Moolenaar source Ximport_rtp.vim 11578a7d6542SBram Moolenaar &rtp = save_rtp 11588a7d6542SBram Moolenaar 11598a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 11608a7d6542SBram Moolenaar unlet g:imported_rtp 11618a7d6542SBram Moolenaar 11628a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 116389483d40SBram Moolenaar delete('import', 'rf') 11648a7d6542SBram Moolenaarenddef 11658a7d6542SBram Moolenaar 116625e0f586SBram Moolenaardef Test_import_compile_error() 116725e0f586SBram Moolenaar let export_lines = [ 116825e0f586SBram Moolenaar 'vim9script', 116925e0f586SBram Moolenaar 'export def ExpFunc(): string', 117025e0f586SBram Moolenaar ' return notDefined', 117125e0f586SBram Moolenaar 'enddef', 117225e0f586SBram Moolenaar ] 117325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 117425e0f586SBram Moolenaar 117525e0f586SBram Moolenaar let import_lines = [ 117625e0f586SBram Moolenaar 'vim9script', 117725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 117825e0f586SBram Moolenaar 'def ImpFunc()', 117925e0f586SBram Moolenaar ' echo ExpFunc()', 118025e0f586SBram Moolenaar 'enddef', 118125e0f586SBram Moolenaar 'defcompile', 118225e0f586SBram Moolenaar ] 118325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 118425e0f586SBram Moolenaar 118525e0f586SBram Moolenaar try 118625e0f586SBram Moolenaar source Ximport.vim 118725e0f586SBram Moolenaar catch /E1001/ 1188*f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 118925e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 119025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 119125e0f586SBram Moolenaar endtry 119225e0f586SBram Moolenaar 119325e0f586SBram Moolenaar delete('Xexported.vim') 119425e0f586SBram Moolenaar delete('Ximport.vim') 119525e0f586SBram Moolenaarenddef 119625e0f586SBram Moolenaar 11978a7d6542SBram Moolenaardef Test_fixed_size_list() 1198*f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 11998a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 12008a7d6542SBram Moolenaar l->remove(0) 12018a7d6542SBram Moolenaar l->add(5) 12028a7d6542SBram Moolenaar l->insert(99, 1) 12030f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 12048a7d6542SBram Moolenaarenddef 12058a7d6542SBram Moolenaar 1206158906cfSBram Moolenaardef IfElse(what: number): string 1207158906cfSBram Moolenaar let res = '' 1208158906cfSBram Moolenaar if what == 1 1209158906cfSBram Moolenaar res = "one" 1210158906cfSBram Moolenaar elseif what == 2 1211158906cfSBram Moolenaar res = "two" 1212a259d8d3SBram Moolenaar else 1213158906cfSBram Moolenaar res = "three" 1214a259d8d3SBram Moolenaar endif 1215158906cfSBram Moolenaar return res 1216a259d8d3SBram Moolenaarenddef 1217a259d8d3SBram Moolenaar 1218158906cfSBram Moolenaardef Test_if_elseif_else() 1219158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1220158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1221158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 12220f18b6d1SBram Moolenaarenddef 12230f18b6d1SBram Moolenaar 1224e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1225e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1226e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1227e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1228e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1229585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1230e8c4abbbSBram Moolenaarenddef 1231e8c4abbbSBram Moolenaar 12326d69bf60SBram Moolenaarlet g:bool_true = v:true 12336d69bf60SBram Moolenaarlet g:bool_false = v:false 12346d69bf60SBram Moolenaar 12356d69bf60SBram Moolenaardef Test_if_const_expr() 12366d69bf60SBram Moolenaar let res = false 12376d69bf60SBram Moolenaar if true ? true : false 12386d69bf60SBram Moolenaar res = true 12396d69bf60SBram Moolenaar endif 12406d69bf60SBram Moolenaar assert_equal(true, res) 12416d69bf60SBram Moolenaar 1242585fea7bSBram Moolenaar g:glob = 2 1243585fea7bSBram Moolenaar if false 12446797966dSBram Moolenaar execute('g:glob = 3') 1245585fea7bSBram Moolenaar endif 1246585fea7bSBram Moolenaar assert_equal(2, g:glob) 1247585fea7bSBram Moolenaar if true 12486797966dSBram Moolenaar execute('g:glob = 3') 1249585fea7bSBram Moolenaar endif 1250585fea7bSBram Moolenaar assert_equal(3, g:glob) 1251585fea7bSBram Moolenaar 12526d69bf60SBram Moolenaar res = false 12536d69bf60SBram Moolenaar if g:bool_true ? true : false 12546d69bf60SBram Moolenaar res = true 12556d69bf60SBram Moolenaar endif 12566d69bf60SBram Moolenaar assert_equal(true, res) 12576d69bf60SBram Moolenaar 12586d69bf60SBram Moolenaar res = false 12596d69bf60SBram Moolenaar if true ? g:bool_true : false 12606d69bf60SBram Moolenaar res = true 12616d69bf60SBram Moolenaar endif 12626d69bf60SBram Moolenaar assert_equal(true, res) 12636d69bf60SBram Moolenaar 12646d69bf60SBram Moolenaar res = false 12656d69bf60SBram Moolenaar if true ? true : g:bool_false 12666d69bf60SBram Moolenaar res = true 12676d69bf60SBram Moolenaar endif 12686d69bf60SBram Moolenaar assert_equal(true, res) 12696d69bf60SBram Moolenaar 12706d69bf60SBram Moolenaar res = false 12716d69bf60SBram Moolenaar if true ? false : true 12726d69bf60SBram Moolenaar res = true 12736d69bf60SBram Moolenaar endif 12746d69bf60SBram Moolenaar assert_equal(false, res) 12756d69bf60SBram Moolenaar 12766d69bf60SBram Moolenaar res = false 12776d69bf60SBram Moolenaar if false ? false : true 12786d69bf60SBram Moolenaar res = true 12796d69bf60SBram Moolenaar endif 12806d69bf60SBram Moolenaar assert_equal(true, res) 12816d69bf60SBram Moolenaar 12826d69bf60SBram Moolenaar res = false 12836d69bf60SBram Moolenaar if false ? true : false 12846d69bf60SBram Moolenaar res = true 12856d69bf60SBram Moolenaar endif 12866d69bf60SBram Moolenaar assert_equal(false, res) 12876d69bf60SBram Moolenaar 12886d69bf60SBram Moolenaar res = false 1289e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1290e8c4abbbSBram Moolenaar res = true 1291e8c4abbbSBram Moolenaar endif 1292e8c4abbbSBram Moolenaar assert_equal(false, res) 1293e8c4abbbSBram Moolenaar 1294e8c4abbbSBram Moolenaar res = false 12956d69bf60SBram Moolenaar if true && true 12966d69bf60SBram Moolenaar res = true 12976d69bf60SBram Moolenaar endif 12986d69bf60SBram Moolenaar assert_equal(true, res) 12996d69bf60SBram Moolenaar 13006d69bf60SBram Moolenaar res = false 13016d69bf60SBram Moolenaar if true && false 13026d69bf60SBram Moolenaar res = true 13036d69bf60SBram Moolenaar endif 13046d69bf60SBram Moolenaar assert_equal(false, res) 13056d69bf60SBram Moolenaar 13066d69bf60SBram Moolenaar res = false 13076d69bf60SBram Moolenaar if g:bool_true && false 13086d69bf60SBram Moolenaar res = true 13096d69bf60SBram Moolenaar endif 13106d69bf60SBram Moolenaar assert_equal(false, res) 13116d69bf60SBram Moolenaar 13126d69bf60SBram Moolenaar res = false 13136d69bf60SBram Moolenaar if true && g:bool_false 13146d69bf60SBram Moolenaar res = true 13156d69bf60SBram Moolenaar endif 13166d69bf60SBram Moolenaar assert_equal(false, res) 13176d69bf60SBram Moolenaar 13186d69bf60SBram Moolenaar res = false 13196d69bf60SBram Moolenaar if false && false 13206d69bf60SBram Moolenaar res = true 13216d69bf60SBram Moolenaar endif 13226d69bf60SBram Moolenaar assert_equal(false, res) 13236d69bf60SBram Moolenaar 13246d69bf60SBram Moolenaar res = false 13256d69bf60SBram Moolenaar if true || false 13266d69bf60SBram Moolenaar res = true 13276d69bf60SBram Moolenaar endif 13286d69bf60SBram Moolenaar assert_equal(true, res) 13296d69bf60SBram Moolenaar 13306d69bf60SBram Moolenaar res = false 13316d69bf60SBram Moolenaar if g:bool_true || false 13326d69bf60SBram Moolenaar res = true 13336d69bf60SBram Moolenaar endif 13346d69bf60SBram Moolenaar assert_equal(true, res) 13356d69bf60SBram Moolenaar 13366d69bf60SBram Moolenaar res = false 13376d69bf60SBram Moolenaar if true || g:bool_false 13386d69bf60SBram Moolenaar res = true 13396d69bf60SBram Moolenaar endif 13406d69bf60SBram Moolenaar assert_equal(true, res) 13416d69bf60SBram Moolenaar 13426d69bf60SBram Moolenaar res = false 13436d69bf60SBram Moolenaar if false || false 13446d69bf60SBram Moolenaar res = true 13456d69bf60SBram Moolenaar endif 13466d69bf60SBram Moolenaar assert_equal(false, res) 134780c34ca3SBram Moolenaarenddef 13486d69bf60SBram Moolenaar 134980c34ca3SBram Moolenaardef Test_if_const_expr_fails() 135080c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 135180c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1352e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1353e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 13546d69bf60SBram Moolenaarenddef 13556d69bf60SBram Moolenaar 135672abcf42SBram Moolenaardef RunNested(i: number): number 135772abcf42SBram Moolenaar let x: number = 0 135872abcf42SBram Moolenaar if i % 2 135972abcf42SBram Moolenaar if 1 1360*f5be8cdbSBram Moolenaar # comment 136172abcf42SBram Moolenaar else 1362*f5be8cdbSBram Moolenaar # comment 136372abcf42SBram Moolenaar endif 136472abcf42SBram Moolenaar x += 1 136572abcf42SBram Moolenaar else 136672abcf42SBram Moolenaar x += 1000 136772abcf42SBram Moolenaar endif 136872abcf42SBram Moolenaar return x 136972abcf42SBram Moolenaarenddef 137072abcf42SBram Moolenaar 137172abcf42SBram Moolenaardef Test_nested_if() 137272abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 137372abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 137472abcf42SBram Moolenaarenddef 137572abcf42SBram Moolenaar 1376ad39c094SBram Moolenaardef Test_execute_cmd() 1377ad39c094SBram Moolenaar new 1378ad39c094SBram Moolenaar setline(1, 'default') 1379ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1380ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1381a72cfb80SBram Moolenaar 1382a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1383a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1384a72cfb80SBram Moolenaar 1385ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1386ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1387a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1388ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1389a72cfb80SBram Moolenaar 1390ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1391ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1392a72cfb80SBram Moolenaar 1393ad39c094SBram Moolenaar let cmd_first = 'call ' 1394ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1395ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1396ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1397ad39c094SBram Moolenaar bwipe! 1398585fea7bSBram Moolenaar 1399585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1400a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1401ad39c094SBram Moolenaarenddef 1402ad39c094SBram Moolenaar 140347e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1404*f5be8cdbSBram Moolenaar # only checks line continuation 140547e880d6SBram Moolenaar let lines =<< trim END 140647e880d6SBram Moolenaar vim9script 140747e880d6SBram Moolenaar execute 'g:someVar' 140847e880d6SBram Moolenaar .. ' = ' .. 140947e880d6SBram Moolenaar '28' 141047e880d6SBram Moolenaar assert_equal(28, g:someVar) 141147e880d6SBram Moolenaar unlet g:someVar 141247e880d6SBram Moolenaar END 141347e880d6SBram Moolenaar CheckScriptSuccess(lines) 141447e880d6SBram Moolenaarenddef 141547e880d6SBram Moolenaar 1416ad39c094SBram Moolenaardef Test_echo_cmd() 1417a72cfb80SBram Moolenaar echo 'some' # comment 1418585fea7bSBram Moolenaar echon 'thing' 1419ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1420ad39c094SBram Moolenaar 1421a72cfb80SBram Moolenaar echo "some" # comment 1422a72cfb80SBram Moolenaar echon "thing" 1423a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1424a72cfb80SBram Moolenaar 1425ad39c094SBram Moolenaar let str1 = 'some' 1426ad39c094SBram Moolenaar let str2 = 'more' 1427ad39c094SBram Moolenaar echo str1 str2 1428ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1429a72cfb80SBram Moolenaar 1430a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1431ad39c094SBram Moolenaarenddef 1432ad39c094SBram Moolenaar 1433f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1434f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1435f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1436f93c7feaSBram Moolenaar echo 'clear' 1437df069eecSBram Moolenaar :1messages 1438f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1439f93c7feaSBram Moolenaar 1440f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1441f93c7feaSBram Moolenaarenddef 1442f93c7feaSBram Moolenaar 144347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1444*f5be8cdbSBram Moolenaar # only checks line continuation 144547e880d6SBram Moolenaar let lines =<< trim END 144647e880d6SBram Moolenaar vim9script 144747e880d6SBram Moolenaar echomsg 'here' 144847e880d6SBram Moolenaar .. ' is ' .. 144947e880d6SBram Moolenaar 'a message' 145047e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 145147e880d6SBram Moolenaar END 145247e880d6SBram Moolenaar CheckScriptSuccess(lines) 145347e880d6SBram Moolenaarenddef 145447e880d6SBram Moolenaar 1455f93c7feaSBram Moolenaardef Test_echoerr_cmd() 145640ee466cSBram Moolenaar try 145740ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 145840ee466cSBram Moolenaar catch 145940ee466cSBram Moolenaar assert_match('something wrong', v:exception) 146040ee466cSBram Moolenaar endtry 1461f93c7feaSBram Moolenaarenddef 1462f93c7feaSBram Moolenaar 146347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1464*f5be8cdbSBram Moolenaar # only checks line continuation 146547e880d6SBram Moolenaar let lines =<< trim END 146647e880d6SBram Moolenaar vim9script 146747e880d6SBram Moolenaar try 146847e880d6SBram Moolenaar echoerr 'this' 146947e880d6SBram Moolenaar .. ' is ' .. 147047e880d6SBram Moolenaar 'wrong' 147147e880d6SBram Moolenaar catch 147247e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 147347e880d6SBram Moolenaar endtry 147447e880d6SBram Moolenaar END 147547e880d6SBram Moolenaar CheckScriptSuccess(lines) 147647e880d6SBram Moolenaarenddef 147747e880d6SBram Moolenaar 147841fe0617SBram Moolenaardef Test_for_outside_of_function() 147941fe0617SBram Moolenaar let lines =<< trim END 148041fe0617SBram Moolenaar vim9script 148141fe0617SBram Moolenaar new 148241fe0617SBram Moolenaar for var in range(0, 3) 148341fe0617SBram Moolenaar append(line('$'), var) 148441fe0617SBram Moolenaar endfor 148541fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 148641fe0617SBram Moolenaar bwipe! 148741fe0617SBram Moolenaar END 148841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 148941fe0617SBram Moolenaar source Xvim9for.vim 149041fe0617SBram Moolenaar delete('Xvim9for.vim') 149141fe0617SBram Moolenaarenddef 14928a7d6542SBram Moolenaar 1493e8c4abbbSBram Moolenaardef Test_for_loop() 1494e8c4abbbSBram Moolenaar let result = '' 1495e8c4abbbSBram Moolenaar for cnt in range(7) 1496e8c4abbbSBram Moolenaar if cnt == 4 1497e8c4abbbSBram Moolenaar break 1498e8c4abbbSBram Moolenaar endif 1499e8c4abbbSBram Moolenaar if cnt == 2 1500e8c4abbbSBram Moolenaar continue 1501e8c4abbbSBram Moolenaar endif 1502e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1503e8c4abbbSBram Moolenaar endfor 1504e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 15050ad3e894SBram Moolenaar 15060ad3e894SBram Moolenaar let concat = '' 15070ad3e894SBram Moolenaar for str in eval('["one", "two"]') 15080ad3e894SBram Moolenaar concat ..= str 15090ad3e894SBram Moolenaar endfor 15100ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1511e8c4abbbSBram Moolenaarenddef 1512e8c4abbbSBram Moolenaar 1513e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1514675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1515675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1516675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1517822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 15180ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1519675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1520675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1521675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1522e8c4abbbSBram Moolenaarenddef 1523e8c4abbbSBram Moolenaar 1524d0df1aacSBram Moolenaardef Test_while_loop() 1525d0df1aacSBram Moolenaar let result = '' 1526d0df1aacSBram Moolenaar let cnt = 0 1527d0df1aacSBram Moolenaar while cnt < 555 1528d0df1aacSBram Moolenaar if cnt == 3 1529d0df1aacSBram Moolenaar break 1530d0df1aacSBram Moolenaar endif 1531d0df1aacSBram Moolenaar cnt += 1 1532d0df1aacSBram Moolenaar if cnt == 2 1533d0df1aacSBram Moolenaar continue 1534d0df1aacSBram Moolenaar endif 1535d0df1aacSBram Moolenaar result ..= cnt .. '_' 1536d0df1aacSBram Moolenaar endwhile 1537d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1538d0df1aacSBram Moolenaarenddef 1539d0df1aacSBram Moolenaar 1540e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1541675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1542675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1543675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1544675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1545675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1546675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1547675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1548bd5da371SBram Moolenaarenddef 1549bd5da371SBram Moolenaar 15509645e2d9SBram Moolenaardef Test_interrupt_loop() 155197acfc78SBram Moolenaar let caught = false 15529645e2d9SBram Moolenaar let x = 0 155397acfc78SBram Moolenaar try 15549645e2d9SBram Moolenaar while 1 15559645e2d9SBram Moolenaar x += 1 15569645e2d9SBram Moolenaar if x == 100 15579645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 15589645e2d9SBram Moolenaar endif 15599645e2d9SBram Moolenaar endwhile 156097acfc78SBram Moolenaar catch 156197acfc78SBram Moolenaar caught = true 156297acfc78SBram Moolenaar assert_equal(100, x) 156397acfc78SBram Moolenaar endtry 156497acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 15659645e2d9SBram Moolenaarenddef 156620431c9dSBram Moolenaar 15674fdae999SBram Moolenaardef Test_automatic_line_continuation() 15684fdae999SBram Moolenaar let mylist = [ 15694fdae999SBram Moolenaar 'one', 15704fdae999SBram Moolenaar 'two', 15714fdae999SBram Moolenaar 'three', 1572*f5be8cdbSBram Moolenaar ] # comment 15734fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 15744fdae999SBram Moolenaar 15754fdae999SBram Moolenaar let mydict = { 15764fdae999SBram Moolenaar 'one': 1, 15774fdae999SBram Moolenaar 'two': 2, 15784fdae999SBram Moolenaar 'three': 15794fdae999SBram Moolenaar 3, 1580*f5be8cdbSBram Moolenaar } # comment 15814fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 15824fdae999SBram Moolenaar mydict = #{ 15832c330432SBram Moolenaar one: 1, # comment 15842c330432SBram Moolenaar two: # comment 15852c330432SBram Moolenaar 2, # comment 15862c330432SBram Moolenaar three: 3 # comment 15872c330432SBram Moolenaar } 15882c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 15892c330432SBram Moolenaar mydict = #{ 15902c330432SBram Moolenaar one: 1, 15914fdae999SBram Moolenaar two: 15924fdae999SBram Moolenaar 2, 15932c330432SBram Moolenaar three: 3 15944fdae999SBram Moolenaar } 15954fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1596e6085c53SBram Moolenaar 1597e6085c53SBram Moolenaar assert_equal( 1598e6085c53SBram Moolenaar ['one', 'two', 'three'], 1599e6085c53SBram Moolenaar split('one two three') 1600e6085c53SBram Moolenaar ) 16014fdae999SBram Moolenaarenddef 16024fdae999SBram Moolenaar 16037a092245SBram Moolenaardef Test_vim9_comment() 16047a092245SBram Moolenaar CheckScriptSuccess([ 16057a092245SBram Moolenaar 'vim9script', 16067a092245SBram Moolenaar '# something', 16077a092245SBram Moolenaar ]) 16087a092245SBram Moolenaar CheckScriptFailure([ 16097a092245SBram Moolenaar 'vim9script', 16107a092245SBram Moolenaar ':# something', 16117a092245SBram Moolenaar ], 'E488:') 16127a092245SBram Moolenaar CheckScriptFailure([ 16137a092245SBram Moolenaar '# something', 16147a092245SBram Moolenaar ], 'E488:') 16157a092245SBram Moolenaar CheckScriptFailure([ 16167a092245SBram Moolenaar ':# something', 16177a092245SBram Moolenaar ], 'E488:') 16187a092245SBram Moolenaar 16194a8d9f2eSBram Moolenaar { # block start 16204a8d9f2eSBram Moolenaar } # block end 16214a8d9f2eSBram Moolenaar CheckDefFailure([ 16224a8d9f2eSBram Moolenaar '{# comment', 16234a8d9f2eSBram Moolenaar ], 'E488:') 16244a8d9f2eSBram Moolenaar CheckDefFailure([ 16254a8d9f2eSBram Moolenaar '{', 16264a8d9f2eSBram Moolenaar '}# comment', 16274a8d9f2eSBram Moolenaar ], 'E488:') 16284a8d9f2eSBram Moolenaar 16294a8d9f2eSBram Moolenaar echo "yes" # comment 16304a8d9f2eSBram Moolenaar CheckDefFailure([ 16314a8d9f2eSBram Moolenaar 'echo "yes"# comment', 16324a8d9f2eSBram Moolenaar ], 'E488:') 16337a092245SBram Moolenaar CheckScriptSuccess([ 16347a092245SBram Moolenaar 'vim9script', 16357a092245SBram Moolenaar 'echo "yes" # something', 16367a092245SBram Moolenaar ]) 16377a092245SBram Moolenaar CheckScriptFailure([ 16387a092245SBram Moolenaar 'vim9script', 16397a092245SBram Moolenaar 'echo "yes"# something', 16407a092245SBram Moolenaar ], 'E121:') 16417a092245SBram Moolenaar CheckScriptFailure([ 16427a092245SBram Moolenaar 'vim9script', 16437a092245SBram Moolenaar 'echo# something', 16447a092245SBram Moolenaar ], 'E121:') 16457a092245SBram Moolenaar CheckScriptFailure([ 16467a092245SBram Moolenaar 'echo "yes" # something', 16477a092245SBram Moolenaar ], 'E121:') 16487a092245SBram Moolenaar 16494a8d9f2eSBram Moolenaar exe "echo" # comment 16504a8d9f2eSBram Moolenaar CheckDefFailure([ 16514a8d9f2eSBram Moolenaar 'exe "echo"# comment', 16524a8d9f2eSBram Moolenaar ], 'E488:') 16534a8d9f2eSBram Moolenaar CheckScriptSuccess([ 16544a8d9f2eSBram Moolenaar 'vim9script', 16554a8d9f2eSBram Moolenaar 'exe "echo" # something', 16564a8d9f2eSBram Moolenaar ]) 16574a8d9f2eSBram Moolenaar CheckScriptFailure([ 16584a8d9f2eSBram Moolenaar 'vim9script', 16594a8d9f2eSBram Moolenaar 'exe "echo"# something', 16604a8d9f2eSBram Moolenaar ], 'E121:') 16614a8d9f2eSBram Moolenaar CheckDefFailure([ 16624a8d9f2eSBram Moolenaar 'exe # comment', 16634a8d9f2eSBram Moolenaar ], 'E1015:') 16644a8d9f2eSBram Moolenaar CheckScriptFailure([ 16654a8d9f2eSBram Moolenaar 'vim9script', 16664a8d9f2eSBram Moolenaar 'exe# something', 16674a8d9f2eSBram Moolenaar ], 'E121:') 16684a8d9f2eSBram Moolenaar CheckScriptFailure([ 16694a8d9f2eSBram Moolenaar 'exe "echo" # something', 16704a8d9f2eSBram Moolenaar ], 'E121:') 16714a8d9f2eSBram Moolenaar 16727a092245SBram Moolenaar CheckDefFailure([ 16737a092245SBram Moolenaar 'try# comment', 16747a092245SBram Moolenaar ' echo "yes"', 16757a092245SBram Moolenaar 'catch', 16767a092245SBram Moolenaar 'endtry', 16777a092245SBram Moolenaar ], 'E488:') 16782c5ed4e3SBram Moolenaar CheckScriptFailure([ 16792c5ed4e3SBram Moolenaar 'vim9script', 16802c5ed4e3SBram Moolenaar 'try# comment', 16812c5ed4e3SBram Moolenaar 'echo "yes"', 16822c5ed4e3SBram Moolenaar ], 'E488:') 16837a092245SBram Moolenaar CheckDefFailure([ 16847a092245SBram Moolenaar 'try', 1685a72cfb80SBram Moolenaar ' throw#comment', 1686a72cfb80SBram Moolenaar 'catch', 1687a72cfb80SBram Moolenaar 'endtry', 1688a72cfb80SBram Moolenaar ], 'E1015:') 1689a72cfb80SBram Moolenaar CheckDefFailure([ 1690a72cfb80SBram Moolenaar 'try', 1691a72cfb80SBram Moolenaar ' throw "yes"#comment', 1692a72cfb80SBram Moolenaar 'catch', 1693a72cfb80SBram Moolenaar 'endtry', 1694a72cfb80SBram Moolenaar ], 'E488:') 1695a72cfb80SBram Moolenaar CheckDefFailure([ 1696a72cfb80SBram Moolenaar 'try', 16977a092245SBram Moolenaar ' echo "yes"', 16987a092245SBram Moolenaar 'catch# comment', 16997a092245SBram Moolenaar 'endtry', 17007a092245SBram Moolenaar ], 'E488:') 17012c5ed4e3SBram Moolenaar CheckScriptFailure([ 17022c5ed4e3SBram Moolenaar 'vim9script', 17032c5ed4e3SBram Moolenaar 'try', 17042c5ed4e3SBram Moolenaar ' echo "yes"', 17052c5ed4e3SBram Moolenaar 'catch# comment', 17062c5ed4e3SBram Moolenaar 'endtry', 17072c5ed4e3SBram Moolenaar ], 'E654:') 17082c5ed4e3SBram Moolenaar CheckDefFailure([ 17092c5ed4e3SBram Moolenaar 'try', 17102c5ed4e3SBram Moolenaar ' echo "yes"', 17112c5ed4e3SBram Moolenaar 'catch /pat/# comment', 17122c5ed4e3SBram Moolenaar 'endtry', 17132c5ed4e3SBram Moolenaar ], 'E488:') 17147a092245SBram Moolenaar CheckDefFailure([ 17157a092245SBram Moolenaar 'try', 17167a092245SBram Moolenaar 'echo "yes"', 17177a092245SBram Moolenaar 'catch', 17187a092245SBram Moolenaar 'endtry# comment', 17197a092245SBram Moolenaar ], 'E488:') 17202c5ed4e3SBram Moolenaar CheckScriptFailure([ 17212c5ed4e3SBram Moolenaar 'vim9script', 17222c5ed4e3SBram Moolenaar 'try', 17232c5ed4e3SBram Moolenaar ' echo "yes"', 17242c5ed4e3SBram Moolenaar 'catch', 17252c5ed4e3SBram Moolenaar 'endtry# comment', 17269b7bf9e9SBram Moolenaar ], 'E488:') 17272c5ed4e3SBram Moolenaar 17282c5ed4e3SBram Moolenaar CheckScriptSuccess([ 17292c5ed4e3SBram Moolenaar 'vim9script', 17302c5ed4e3SBram Moolenaar 'hi # comment', 17312c5ed4e3SBram Moolenaar ]) 17322c5ed4e3SBram Moolenaar CheckScriptFailure([ 17332c5ed4e3SBram Moolenaar 'vim9script', 17342c5ed4e3SBram Moolenaar 'hi# comment', 17352c5ed4e3SBram Moolenaar ], 'E416:') 17361966c248SBram Moolenaar CheckScriptSuccess([ 17371966c248SBram Moolenaar 'vim9script', 17381966c248SBram Moolenaar 'hi Search # comment', 17391966c248SBram Moolenaar ]) 17401966c248SBram Moolenaar CheckScriptFailure([ 17411966c248SBram Moolenaar 'vim9script', 17421966c248SBram Moolenaar 'hi Search# comment', 17431966c248SBram Moolenaar ], 'E416:') 17441966c248SBram Moolenaar CheckScriptSuccess([ 17451966c248SBram Moolenaar 'vim9script', 17461966c248SBram Moolenaar 'hi link This Search # comment', 17471966c248SBram Moolenaar ]) 17481966c248SBram Moolenaar CheckScriptFailure([ 17491966c248SBram Moolenaar 'vim9script', 17501966c248SBram Moolenaar 'hi link This That# comment', 17511966c248SBram Moolenaar ], 'E413:') 17521966c248SBram Moolenaar CheckScriptSuccess([ 17531966c248SBram Moolenaar 'vim9script', 17541966c248SBram Moolenaar 'hi clear This # comment', 17551966c248SBram Moolenaar 'hi clear # comment', 17561966c248SBram Moolenaar ]) 1757*f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 1758*f5be8cdbSBram Moolenaar # hi clear This# comment', 17591966c248SBram Moolenaar CheckScriptFailure([ 17601966c248SBram Moolenaar 'vim9script', 17611966c248SBram Moolenaar 'hi clear# comment', 17621966c248SBram Moolenaar ], 'E416:') 17631966c248SBram Moolenaar 17641966c248SBram Moolenaar CheckScriptSuccess([ 17651966c248SBram Moolenaar 'vim9script', 17661966c248SBram Moolenaar 'hi Group term=bold', 17671966c248SBram Moolenaar 'match Group /todo/ # comment', 17681966c248SBram Moolenaar ]) 17691966c248SBram Moolenaar CheckScriptFailure([ 17701966c248SBram Moolenaar 'vim9script', 17711966c248SBram Moolenaar 'hi Group term=bold', 17721966c248SBram Moolenaar 'match Group /todo/# comment', 17731966c248SBram Moolenaar ], 'E488:') 17741966c248SBram Moolenaar CheckScriptSuccess([ 17751966c248SBram Moolenaar 'vim9script', 17761966c248SBram Moolenaar 'match # comment', 17771966c248SBram Moolenaar ]) 17781966c248SBram Moolenaar CheckScriptFailure([ 17791966c248SBram Moolenaar 'vim9script', 17801966c248SBram Moolenaar 'match# comment', 17811966c248SBram Moolenaar ], 'E475:') 17821966c248SBram Moolenaar CheckScriptSuccess([ 17831966c248SBram Moolenaar 'vim9script', 17841966c248SBram Moolenaar 'match none # comment', 17851966c248SBram Moolenaar ]) 17861966c248SBram Moolenaar CheckScriptFailure([ 17871966c248SBram Moolenaar 'vim9script', 17881966c248SBram Moolenaar 'match none# comment', 17891966c248SBram Moolenaar ], 'E475:') 17901966c248SBram Moolenaar 17911966c248SBram Moolenaar CheckScriptSuccess([ 17921966c248SBram Moolenaar 'vim9script', 17931966c248SBram Moolenaar 'menutrans clear # comment', 17941966c248SBram Moolenaar ]) 17951966c248SBram Moolenaar CheckScriptFailure([ 17961966c248SBram Moolenaar 'vim9script', 17971966c248SBram Moolenaar 'menutrans clear# comment text', 17981966c248SBram Moolenaar ], 'E474:') 17991966c248SBram Moolenaar 18001966c248SBram Moolenaar CheckScriptSuccess([ 18011966c248SBram Moolenaar 'vim9script', 18021966c248SBram Moolenaar 'syntax clear # comment', 18031966c248SBram Moolenaar ]) 18041966c248SBram Moolenaar CheckScriptFailure([ 18051966c248SBram Moolenaar 'vim9script', 18061966c248SBram Moolenaar 'syntax clear# comment text', 18071966c248SBram Moolenaar ], 'E28:') 18081966c248SBram Moolenaar CheckScriptSuccess([ 18091966c248SBram Moolenaar 'vim9script', 18101966c248SBram Moolenaar 'syntax keyword Word some', 18111966c248SBram Moolenaar 'syntax clear Word # comment', 18121966c248SBram Moolenaar ]) 18131966c248SBram Moolenaar CheckScriptFailure([ 18141966c248SBram Moolenaar 'vim9script', 18151966c248SBram Moolenaar 'syntax keyword Word some', 18161966c248SBram Moolenaar 'syntax clear Word# comment text', 18171966c248SBram Moolenaar ], 'E28:') 18181966c248SBram Moolenaar 18191966c248SBram Moolenaar CheckScriptSuccess([ 18201966c248SBram Moolenaar 'vim9script', 18211966c248SBram Moolenaar 'syntax list # comment', 18221966c248SBram Moolenaar ]) 18231966c248SBram Moolenaar CheckScriptFailure([ 18241966c248SBram Moolenaar 'vim9script', 18251966c248SBram Moolenaar 'syntax list# comment text', 18261966c248SBram Moolenaar ], 'E28:') 18271966c248SBram Moolenaar 18281966c248SBram Moolenaar CheckScriptSuccess([ 18291966c248SBram Moolenaar 'vim9script', 18301966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 18311966c248SBram Moolenaar ]) 18321966c248SBram Moolenaar CheckScriptFailure([ 18331966c248SBram Moolenaar 'vim9script', 18341966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 18351966c248SBram Moolenaar ], 'E475:') 18361966c248SBram Moolenaar 18371966c248SBram Moolenaar CheckScriptSuccess([ 18381966c248SBram Moolenaar 'vim9script', 18391966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 18401966c248SBram Moolenaar ]) 18411966c248SBram Moolenaar CheckScriptFailure([ 18421966c248SBram Moolenaar 'vim9script', 18431966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 18441966c248SBram Moolenaar ], 'E789:') 18451966c248SBram Moolenaar 18461966c248SBram Moolenaar CheckScriptSuccess([ 18471966c248SBram Moolenaar 'vim9script', 18481966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 18491966c248SBram Moolenaar ]) 18501966c248SBram Moolenaar CheckScriptFailure([ 18511966c248SBram Moolenaar 'vim9script', 18521966c248SBram Moolenaar 'syntax match Word /pat/# comment', 18531966c248SBram Moolenaar ], 'E402:') 18541966c248SBram Moolenaar 18551966c248SBram Moolenaar CheckScriptSuccess([ 18561966c248SBram Moolenaar 'vim9script', 18571966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 18581966c248SBram Moolenaar ]) 18591966c248SBram Moolenaar CheckScriptFailure([ 18601966c248SBram Moolenaar 'vim9script', 18611966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 18621966c248SBram Moolenaar ], 'E475:') 18631966c248SBram Moolenaar CheckScriptFailure([ 18641966c248SBram Moolenaar 'vim9script', 18651966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 18661966c248SBram Moolenaar ], 'E406:') 18671966c248SBram Moolenaar CheckScriptFailure([ 18681966c248SBram Moolenaar 'vim9script', 18691966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 18701966c248SBram Moolenaar ], 'E475:') 18711966c248SBram Moolenaar 18721966c248SBram Moolenaar CheckScriptSuccess([ 18731966c248SBram Moolenaar 'vim9script', 18741966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 18751966c248SBram Moolenaar ]) 18761966c248SBram Moolenaar CheckScriptFailure([ 18771966c248SBram Moolenaar 'vim9script', 18781966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 18791966c248SBram Moolenaar ], 'E475:') 18801966c248SBram Moolenaar 18811966c248SBram Moolenaar CheckScriptSuccess([ 18821966c248SBram Moolenaar 'vim9script', 18831966c248SBram Moolenaar 'syntax sync # comment', 18841966c248SBram Moolenaar ]) 18851966c248SBram Moolenaar CheckScriptFailure([ 18861966c248SBram Moolenaar 'vim9script', 18871966c248SBram Moolenaar 'syntax sync# comment', 18881966c248SBram Moolenaar ], 'E404:') 18891966c248SBram Moolenaar CheckScriptSuccess([ 18901966c248SBram Moolenaar 'vim9script', 18911966c248SBram Moolenaar 'syntax sync ccomment # comment', 18921966c248SBram Moolenaar ]) 18931966c248SBram Moolenaar CheckScriptFailure([ 18941966c248SBram Moolenaar 'vim9script', 18951966c248SBram Moolenaar 'syntax sync ccomment# comment', 18961966c248SBram Moolenaar ], 'E404:') 18971966c248SBram Moolenaar 18981966c248SBram Moolenaar CheckScriptSuccess([ 18991966c248SBram Moolenaar 'vim9script', 19001966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 19011966c248SBram Moolenaar ]) 19021966c248SBram Moolenaar CheckScriptFailure([ 19031966c248SBram Moolenaar 'vim9script', 19041966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 19051966c248SBram Moolenaar ], 'E475:') 1906a72cfb80SBram Moolenaar 1907a72cfb80SBram Moolenaar CheckScriptSuccess([ 1908a72cfb80SBram Moolenaar 'vim9script', 1909a72cfb80SBram Moolenaar 'command Echo echo # comment', 1910a72cfb80SBram Moolenaar 'command Echo # comment', 1911a72cfb80SBram Moolenaar ]) 1912a72cfb80SBram Moolenaar CheckScriptFailure([ 1913a72cfb80SBram Moolenaar 'vim9script', 1914a72cfb80SBram Moolenaar 'command Echo echo# comment', 1915a72cfb80SBram Moolenaar 'Echo', 1916a72cfb80SBram Moolenaar ], 'E121:') 1917a72cfb80SBram Moolenaar CheckScriptFailure([ 1918a72cfb80SBram Moolenaar 'vim9script', 1919a72cfb80SBram Moolenaar 'command Echo# comment', 1920a72cfb80SBram Moolenaar ], 'E182:') 1921a72cfb80SBram Moolenaar CheckScriptFailure([ 1922a72cfb80SBram Moolenaar 'vim9script', 1923a72cfb80SBram Moolenaar 'command Echo echo', 1924a72cfb80SBram Moolenaar 'command Echo# comment', 1925a72cfb80SBram Moolenaar ], 'E182:') 1926a72cfb80SBram Moolenaar 1927a72cfb80SBram Moolenaar CheckScriptSuccess([ 1928a72cfb80SBram Moolenaar 'vim9script', 1929a72cfb80SBram Moolenaar 'function # comment', 1930a72cfb80SBram Moolenaar ]) 1931a72cfb80SBram Moolenaar CheckScriptFailure([ 1932a72cfb80SBram Moolenaar 'vim9script', 1933a72cfb80SBram Moolenaar 'function# comment', 1934a72cfb80SBram Moolenaar ], 'E129:') 1935a72cfb80SBram Moolenaar CheckScriptSuccess([ 1936a72cfb80SBram Moolenaar 'vim9script', 1937a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 1938a72cfb80SBram Moolenaar ]) 1939a72cfb80SBram Moolenaar CheckScriptFailure([ 1940a72cfb80SBram Moolenaar 'vim9script', 1941a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 1942a72cfb80SBram Moolenaar ], 'E488:') 1943a72cfb80SBram Moolenaar 1944a72cfb80SBram Moolenaar CheckScriptSuccess([ 1945a72cfb80SBram Moolenaar 'vim9script', 19464c17ad94SBram Moolenaar 'func g:DeleteMeA()', 1947a72cfb80SBram Moolenaar 'endfunc', 19484c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 1949a72cfb80SBram Moolenaar ]) 1950a72cfb80SBram Moolenaar CheckScriptFailure([ 1951a72cfb80SBram Moolenaar 'vim9script', 19524c17ad94SBram Moolenaar 'func g:DeleteMeB()', 1953a72cfb80SBram Moolenaar 'endfunc', 19544c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 1955a72cfb80SBram Moolenaar ], 'E488:') 1956a72cfb80SBram Moolenaar 1957a72cfb80SBram Moolenaar CheckScriptSuccess([ 1958a72cfb80SBram Moolenaar 'vim9script', 1959a72cfb80SBram Moolenaar 'call execute("ls") # comment', 1960a72cfb80SBram Moolenaar ]) 1961a72cfb80SBram Moolenaar CheckScriptFailure([ 1962a72cfb80SBram Moolenaar 'vim9script', 1963a72cfb80SBram Moolenaar 'call execute("ls")# comment', 1964a72cfb80SBram Moolenaar ], 'E488:') 19652c5ed4e3SBram Moolenaarenddef 19662c5ed4e3SBram Moolenaar 19672c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 19682c5ed4e3SBram Moolenaar CheckCanRunGui 19692c5ed4e3SBram Moolenaar 19702c5ed4e3SBram Moolenaar CheckScriptFailure([ 19712c5ed4e3SBram Moolenaar 'vim9script', 19722c5ed4e3SBram Moolenaar 'gui#comment' 19732c5ed4e3SBram Moolenaar ], 'E499:') 19742c5ed4e3SBram Moolenaar CheckScriptFailure([ 19752c5ed4e3SBram Moolenaar 'vim9script', 19762c5ed4e3SBram Moolenaar 'gui -f#comment' 19772c5ed4e3SBram Moolenaar ], 'E499:') 19787a092245SBram Moolenaarenddef 19797a092245SBram Moolenaar 1980a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 19816797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 19826797966dSBram Moolenaar au TabEnter *.x g:entered = 2 1983a26b9700SBram Moolenaar 1984a26b9700SBram Moolenaar edit test.vim 1985a26b9700SBram Moolenaar doautocmd TabEnter #comment 1986a26b9700SBram Moolenaar assert_equal(1, g:entered) 1987a26b9700SBram Moolenaar 1988a26b9700SBram Moolenaar doautocmd TabEnter f.x 1989a26b9700SBram Moolenaar assert_equal(2, g:entered) 1990a26b9700SBram Moolenaar 1991a26b9700SBram Moolenaar g:entered = 0 1992a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 1993a26b9700SBram Moolenaar assert_equal(2, g:entered) 1994a26b9700SBram Moolenaar 1995a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 1996a26b9700SBram Moolenaar 1997a26b9700SBram Moolenaar au! TabEnter 1998a26b9700SBram Moolenaar unlet g:entered 1999d72c1bf0SBram Moolenaar 2000d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2001d72c1bf0SBram Moolenaar 'vim9script', 20026797966dSBram Moolenaar 'g:var = 123', 2003e55b1c09SBram Moolenaar 'b:var = 456', 2004e55b1c09SBram Moolenaar 'w:var = 777', 2005e55b1c09SBram Moolenaar 't:var = 888', 2006d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2007d72c1bf0SBram Moolenaar ]) 2008d72c1bf0SBram Moolenaar 2009d72c1bf0SBram Moolenaar CheckScriptFailure([ 2010d72c1bf0SBram Moolenaar 'vim9script', 2011d72c1bf0SBram Moolenaar 'let g:var = 123', 2012e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2013e55b1c09SBram Moolenaar 2014e55b1c09SBram Moolenaar CheckScriptFailure([ 2015e55b1c09SBram Moolenaar 'vim9script', 2016e55b1c09SBram Moolenaar 'let b:var = 123', 2017e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2018e55b1c09SBram Moolenaar 2019e55b1c09SBram Moolenaar CheckScriptFailure([ 2020e55b1c09SBram Moolenaar 'vim9script', 2021e55b1c09SBram Moolenaar 'let w:var = 123', 2022e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2023e55b1c09SBram Moolenaar 2024e55b1c09SBram Moolenaar CheckScriptFailure([ 2025e55b1c09SBram Moolenaar 'vim9script', 2026e55b1c09SBram Moolenaar 'let t:var = 123', 2027e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2028e55b1c09SBram Moolenaar 2029e55b1c09SBram Moolenaar CheckScriptFailure([ 2030e55b1c09SBram Moolenaar 'vim9script', 2031e55b1c09SBram Moolenaar 'let v:version = 123', 2032e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2033e55b1c09SBram Moolenaar 2034e55b1c09SBram Moolenaar CheckScriptFailure([ 2035e55b1c09SBram Moolenaar 'vim9script', 2036e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2037e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 20386797966dSBram Moolenaar 20396797966dSBram Moolenaar CheckScriptFailure([ 20406797966dSBram Moolenaar 'vim9script', 20416797966dSBram Moolenaar 'g:var = 123', 204232e35117SBram Moolenaar 'unlet g:var# comment1', 2043d72c1bf0SBram Moolenaar ], 'E108:') 2044d72c1bf0SBram Moolenaar 2045d72c1bf0SBram Moolenaar CheckScriptFailure([ 2046d72c1bf0SBram Moolenaar 'let g:var = 123', 2047d72c1bf0SBram Moolenaar 'unlet g:var # something', 2048d72c1bf0SBram Moolenaar ], 'E488:') 2049faac4104SBram Moolenaar 2050faac4104SBram Moolenaar CheckScriptSuccess([ 2051faac4104SBram Moolenaar 'vim9script', 205232e35117SBram Moolenaar 'if 1 # comment2', 2053faac4104SBram Moolenaar ' echo "yes"', 2054faac4104SBram Moolenaar 'elseif 2 #comment', 2055faac4104SBram Moolenaar ' echo "no"', 2056faac4104SBram Moolenaar 'endif', 2057faac4104SBram Moolenaar ]) 2058faac4104SBram Moolenaar 2059faac4104SBram Moolenaar CheckScriptFailure([ 2060faac4104SBram Moolenaar 'vim9script', 206132e35117SBram Moolenaar 'if 1# comment3', 2062faac4104SBram Moolenaar ' echo "yes"', 2063faac4104SBram Moolenaar 'endif', 2064faac4104SBram Moolenaar ], 'E15:') 2065faac4104SBram Moolenaar 2066faac4104SBram Moolenaar CheckScriptFailure([ 2067faac4104SBram Moolenaar 'vim9script', 206832e35117SBram Moolenaar 'if 0 # comment4', 2069faac4104SBram Moolenaar ' echo "yes"', 2070faac4104SBram Moolenaar 'elseif 2#comment', 2071faac4104SBram Moolenaar ' echo "no"', 2072faac4104SBram Moolenaar 'endif', 2073faac4104SBram Moolenaar ], 'E15:') 2074faac4104SBram Moolenaar 2075faac4104SBram Moolenaar CheckScriptSuccess([ 2076faac4104SBram Moolenaar 'vim9script', 207732e35117SBram Moolenaar 'let v = 1 # comment5', 2078faac4104SBram Moolenaar ]) 2079faac4104SBram Moolenaar 2080faac4104SBram Moolenaar CheckScriptFailure([ 2081faac4104SBram Moolenaar 'vim9script', 208232e35117SBram Moolenaar 'let v = 1# comment6', 208332e35117SBram Moolenaar ], 'E15:') 2084faac4104SBram Moolenaar 2085faac4104SBram Moolenaar CheckScriptSuccess([ 2086faac4104SBram Moolenaar 'vim9script', 2087faac4104SBram Moolenaar 'new' 2088faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2089df069eecSBram Moolenaar ':$', 2090faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2091faac4104SBram Moolenaar 'bwipe!', 2092faac4104SBram Moolenaar ]) 2093faac4104SBram Moolenaar 2094*f5be8cdbSBram Moolenaar CheckScriptFailure([ 2095*f5be8cdbSBram Moolenaar 'vim9script', 2096*f5be8cdbSBram Moolenaar 'new' 2097*f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2098*f5be8cdbSBram Moolenaar ':$', 2099*f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2100*f5be8cdbSBram Moolenaar 'bwipe!', 2101*f5be8cdbSBram Moolenaar ], 'E488:') 2102*f5be8cdbSBram Moolenaar 2103*f5be8cdbSBram Moolenaar CheckScriptFailure([ 2104*f5be8cdbSBram Moolenaar 'vim9script', 2105*f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2106*f5be8cdbSBram Moolenaar ], 'E477:') 2107a26b9700SBram Moolenaarenddef 2108a26b9700SBram Moolenaar 21097e5bd91dSBram Moolenaardef Test_finish() 21107e5bd91dSBram Moolenaar let lines =<< trim END 21117e5bd91dSBram Moolenaar vim9script 21126797966dSBram Moolenaar g:res = 'one' 21137e5bd91dSBram Moolenaar if v:false | finish | endif 21146797966dSBram Moolenaar g:res = 'two' 21157e5bd91dSBram Moolenaar finish 21166797966dSBram Moolenaar g:res = 'three' 21177e5bd91dSBram Moolenaar END 21187e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 21197e5bd91dSBram Moolenaar source Xfinished 21207e5bd91dSBram Moolenaar assert_equal('two', g:res) 21217e5bd91dSBram Moolenaar 21227e5bd91dSBram Moolenaar unlet g:res 21237e5bd91dSBram Moolenaar delete('Xfinished') 21247e5bd91dSBram Moolenaarenddef 21257e5bd91dSBram Moolenaar 212632e35117SBram Moolenaardef Test_let_func_call() 212732e35117SBram Moolenaar let lines =<< trim END 212832e35117SBram Moolenaar vim9script 212932e35117SBram Moolenaar func GetValue() 213032e35117SBram Moolenaar if exists('g:count') 213132e35117SBram Moolenaar let g:count += 1 213232e35117SBram Moolenaar else 213332e35117SBram Moolenaar let g:count = 1 213432e35117SBram Moolenaar endif 213532e35117SBram Moolenaar return 'this' 213632e35117SBram Moolenaar endfunc 213732e35117SBram Moolenaar let val: string = GetValue() 2138*f5be8cdbSBram Moolenaar # env var is always a string 2139df671b46SBram Moolenaar let env = $TERM 214032e35117SBram Moolenaar END 214132e35117SBram Moolenaar writefile(lines, 'Xfinished') 214232e35117SBram Moolenaar source Xfinished 2143*f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 214432e35117SBram Moolenaar assert_equal(1, g:count) 214532e35117SBram Moolenaar 214632e35117SBram Moolenaar unlet g:count 214732e35117SBram Moolenaar delete('Xfinished') 214832e35117SBram Moolenaarenddef 214932e35117SBram Moolenaar 215032e35117SBram Moolenaardef Test_let_missing_type() 215132e35117SBram Moolenaar let lines =<< trim END 215232e35117SBram Moolenaar vim9script 2153df671b46SBram Moolenaar let var = g:unknown 2154227a69deSBram Moolenaar END 2155822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2156227a69deSBram Moolenaar 2157227a69deSBram Moolenaar lines =<< trim END 2158227a69deSBram Moolenaar vim9script 2159227a69deSBram Moolenaar let nr: number = 123 2160227a69deSBram Moolenaar let var = nr 2161227a69deSBram Moolenaar END 2162822ba247SBram Moolenaar CheckScriptSuccess(lines) 216332e35117SBram Moolenaarenddef 216432e35117SBram Moolenaar 2165c82a5b5dSBram Moolenaardef Test_let_declaration() 2166c82a5b5dSBram Moolenaar let lines =<< trim END 2167c82a5b5dSBram Moolenaar vim9script 2168c82a5b5dSBram Moolenaar let var: string 2169c82a5b5dSBram Moolenaar g:var_uninit = var 2170c82a5b5dSBram Moolenaar var = 'text' 2171c82a5b5dSBram Moolenaar g:var_test = var 2172*f5be8cdbSBram Moolenaar # prefixing s: is optional 2173984dddbeSBram Moolenaar s:var = 'prefixed' 2174984dddbeSBram Moolenaar g:var_prefixed = s:var 2175984dddbeSBram Moolenaar 2176984dddbeSBram Moolenaar let s:other: number 2177984dddbeSBram Moolenaar other = 1234 2178984dddbeSBram Moolenaar g:other_var = other 2179c82a5b5dSBram Moolenaar END 2180c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2181c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2182c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2183984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2184984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2185c82a5b5dSBram Moolenaar 2186c82a5b5dSBram Moolenaar unlet g:var_uninit 2187c82a5b5dSBram Moolenaar unlet g:var_test 2188984dddbeSBram Moolenaar unlet g:var_prefixed 2189984dddbeSBram Moolenaar unlet g:other_var 2190c82a5b5dSBram Moolenaarenddef 2191c82a5b5dSBram Moolenaar 2192c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2193c5b1c20bSBram Moolenaar let lines =<< trim END 2194c5b1c20bSBram Moolenaar vim9script 2195c5b1c20bSBram Moolenaar const var: string 2196c5b1c20bSBram Moolenaar END 2197c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2198c5b1c20bSBram Moolenaar 2199c5b1c20bSBram Moolenaar lines =<< trim END 2200c5b1c20bSBram Moolenaar vim9script 2201c5b1c20bSBram Moolenaar let 9var: string 2202c5b1c20bSBram Moolenaar END 2203c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2204c5b1c20bSBram Moolenaarenddef 2205c5b1c20bSBram Moolenaar 220634db91f7SBram Moolenaardef Test_let_type_check() 220734db91f7SBram Moolenaar let lines =<< trim END 220834db91f7SBram Moolenaar vim9script 220934db91f7SBram Moolenaar let var: string 221034db91f7SBram Moolenaar var = 1234 221134db91f7SBram Moolenaar END 221234db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2213984dddbeSBram Moolenaar 2214984dddbeSBram Moolenaar lines =<< trim END 2215984dddbeSBram Moolenaar vim9script 2216984dddbeSBram Moolenaar let var:string 2217984dddbeSBram Moolenaar END 2218984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2219c5b1c20bSBram Moolenaar 2220c5b1c20bSBram Moolenaar lines =<< trim END 2221c5b1c20bSBram Moolenaar vim9script 2222c5b1c20bSBram Moolenaar let var: asdf 2223c5b1c20bSBram Moolenaar END 2224c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 222534db91f7SBram Moolenaarenddef 222634db91f7SBram Moolenaar 2227a5d0077eSBram Moolenaardef Test_forward_declaration() 2228a5d0077eSBram Moolenaar let lines =<< trim END 2229a5d0077eSBram Moolenaar vim9script 2230a5d0077eSBram Moolenaar def GetValue(): string 2231a5d0077eSBram Moolenaar return theVal 2232a5d0077eSBram Moolenaar enddef 2233a5d0077eSBram Moolenaar let theVal = 'something' 2234822ba247SBram Moolenaar g:initVal = GetValue() 2235a5d0077eSBram Moolenaar theVal = 'else' 2236a5d0077eSBram Moolenaar g:laterVal = GetValue() 2237a5d0077eSBram Moolenaar END 2238a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2239a5d0077eSBram Moolenaar source Xforward 2240a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2241a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2242a5d0077eSBram Moolenaar 2243a5d0077eSBram Moolenaar unlet g:initVal 2244a5d0077eSBram Moolenaar unlet g:laterVal 2245a5d0077eSBram Moolenaar delete('Xforward') 2246a5d0077eSBram Moolenaarenddef 2247a5d0077eSBram Moolenaar 22489721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 22499721fb4eSBram Moolenaar let legacy_lines =<< trim END 22509721fb4eSBram Moolenaar source Xvim9_script.vim 22519721fb4eSBram Moolenaar 22529721fb4eSBram Moolenaar call assert_false(exists('local')) 22539721fb4eSBram Moolenaar call assert_false(exists('exported')) 22549721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 22559721fb4eSBram Moolenaar call assert_equal('global', global) 22569721fb4eSBram Moolenaar call assert_equal('global', g:global) 22579721fb4eSBram Moolenaar 22589721fb4eSBram Moolenaar " imported variable becomes script-local 22599721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 22609721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 22619721fb4eSBram Moolenaar call assert_false(exists('exported')) 22629721fb4eSBram Moolenaar 22639721fb4eSBram Moolenaar " imported function becomes script-local 22649721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 22659721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 22669721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 22679721fb4eSBram Moolenaar END 22689721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 22699721fb4eSBram Moolenaar 22709721fb4eSBram Moolenaar let vim9_lines =<< trim END 22719721fb4eSBram Moolenaar vim9script 22729721fb4eSBram Moolenaar let local = 'local' 22739721fb4eSBram Moolenaar g:global = 'global' 22749721fb4eSBram Moolenaar export let exported = 'exported' 22759721fb4eSBram Moolenaar export def GetText(): string 22769721fb4eSBram Moolenaar return 'text' 22779721fb4eSBram Moolenaar enddef 22789721fb4eSBram Moolenaar END 22799721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 22809721fb4eSBram Moolenaar 22819721fb4eSBram Moolenaar source Xlegacy_script.vim 22829721fb4eSBram Moolenaar 22839721fb4eSBram Moolenaar assert_equal('global', g:global) 2284*f5be8cdbSBram Moolenaar unlet g:global 22859721fb4eSBram Moolenaar 22869721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 22879721fb4eSBram Moolenaar delete('Xvim9_script.vim') 22889721fb4eSBram Moolenaarenddef 2289a5d0077eSBram Moolenaar 2290eeb27bfeSBram Moolenaardef Test_vim9_copen() 2291eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2292eeb27bfeSBram Moolenaar copen 2293eeb27bfeSBram Moolenaar quit 2294eeb27bfeSBram Moolenaarenddef 2295eeb27bfeSBram Moolenaar 2296585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2297585fea7bSBram Moolenaardef Test_substitute_cmd() 2298585fea7bSBram Moolenaar new 2299585fea7bSBram Moolenaar setline(1, 'something') 2300585fea7bSBram Moolenaar :substitute(some(other( 2301585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2302585fea7bSBram Moolenaar bwipe! 2303585fea7bSBram Moolenaar 2304*f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2305585fea7bSBram Moolenaar let lines =<< trim END 2306585fea7bSBram Moolenaar vim9script 2307585fea7bSBram Moolenaar new 2308585fea7bSBram Moolenaar setline(1, 'something') 2309585fea7bSBram Moolenaar :substitute(some(other( 2310585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2311585fea7bSBram Moolenaar bwipe! 2312585fea7bSBram Moolenaar END 2313585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2314585fea7bSBram Moolenaar source Xvim9lines 2315585fea7bSBram Moolenaar 2316585fea7bSBram Moolenaar delete('Xvim9lines') 2317585fea7bSBram Moolenaarenddef 2318585fea7bSBram Moolenaar 23198a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2320