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 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 98a7d6542SBram Moolenaardef Test_syntax() 108a7d6542SBram Moolenaar let var = 234 118a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 128a7d6542SBram Moolenaarenddef 138a7d6542SBram Moolenaar 145d72ce69SBram Moolenaardef Test_range_only() 155d72ce69SBram Moolenaar new 165d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 175d72ce69SBram Moolenaar :/Blah/ 185d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 19c2af0affSBram Moolenaar bwipe! 20c2af0affSBram Moolenaar 21c2af0affSBram Moolenaar # without range commands use current line 22c2af0affSBram Moolenaar new 23c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 24c2af0affSBram Moolenaar :2 25c2af0affSBram Moolenaar print 26c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 27c2af0affSBram Moolenaar :3 28c2af0affSBram Moolenaar list 29c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 30c2af0affSBram Moolenaar bwipe! 315d72ce69SBram Moolenaarenddef 325d72ce69SBram Moolenaar 336e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 346e587dcbSBram Moolenaarlet s:addToMe = 111 35401d9ffbSBram Moolenaarlet g:existing = 'yes' 36a8c17704SBram Moolenaarlet g:inc_counter = 1 37a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 38a6e67e4fSBram Moolenaarlet g:alist = [7] 39a6e67e4fSBram Moolenaarlet g:astring = 'text' 40f0b9f43cSBram Moolenaarlet g:anumber = 123 416e587dcbSBram Moolenaar 428a7d6542SBram Moolenaardef Test_assignment() 438a7d6542SBram Moolenaar let bool1: bool = true 448a7d6542SBram Moolenaar assert_equal(v:true, bool1) 458a7d6542SBram Moolenaar let bool2: bool = false 468a7d6542SBram Moolenaar assert_equal(v:false, bool2) 478a7d6542SBram Moolenaar 48*29a86ffeSBram Moolenaar let bool3: bool = 0 49*29a86ffeSBram Moolenaar assert_equal(0, bool3) 50*29a86ffeSBram Moolenaar let bool4: bool = 1 51*29a86ffeSBram Moolenaar assert_equal(1, bool4) 52*29a86ffeSBram Moolenaar 53d2c61705SBram Moolenaar CheckDefFailure(['let x:string'], 'E1069:') 54d2c61705SBram Moolenaar CheckDefFailure(['let x:string = "x"'], 'E1069:') 55d2c61705SBram Moolenaar CheckDefFailure(['let a:string = "x"'], 'E1069:') 56d2c61705SBram Moolenaar CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 57f93c7feaSBram Moolenaar 584cdb13ceSBram Moolenaar let nr: number = 1234 59d2c61705SBram Moolenaar CheckDefFailure(['let nr: number = "asdf"'], 'E1012:') 604cdb13ceSBram Moolenaar 61b209750bSBram Moolenaar let a: number = 6 #comment 629be61bbbSBram Moolenaar assert_equal(6, a) 639be61bbbSBram Moolenaar 6442a480bfSBram Moolenaar if has('channel') 6542a480bfSBram Moolenaar let chan1: channel 66fbdd08edSBram Moolenaar let job1: job 67f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6842a480bfSBram Moolenaar endif 69fbdd08edSBram Moolenaar if has('float') 70fbdd08edSBram Moolenaar let float1: float = 3.4 71fbdd08edSBram Moolenaar endif 725deeb3f1SBram Moolenaar let Funky1: func 735deeb3f1SBram Moolenaar let Funky2: func = function('len') 744c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 7542a480bfSBram Moolenaar 76b209750bSBram Moolenaar g:newvar = 'new' #comment 77401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 78401d9ffbSBram Moolenaar 79401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 80401d9ffbSBram Moolenaar g:existing = 'no' 81401d9ffbSBram Moolenaar assert_equal('no', g:existing) 82401d9ffbSBram Moolenaar 83b283a8a6SBram Moolenaar v:char = 'abc' 846e587dcbSBram Moolenaar assert_equal('abc', v:char) 85b283a8a6SBram Moolenaar 86b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 876e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 88b283a8a6SBram Moolenaar $ENVVAR = '' 896e587dcbSBram Moolenaar 90b5ed2660SBram Moolenaar let lines =<< trim END 91b5ed2660SBram Moolenaar vim9script 92b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 93b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 94b5ed2660SBram Moolenaar $ENVVAR = '' 95b5ed2660SBram Moolenaar END 96d2c61705SBram Moolenaar CheckScriptSuccess(lines) 97b5ed2660SBram Moolenaar 98fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 99fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 100fd1823e0SBram Moolenaar s:addToMe += 222 101fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 1020bbf722aSBram Moolenaar s:newVar = 'new' 1030bbf722aSBram Moolenaar assert_equal('new', s:newVar) 104a8c17704SBram Moolenaar 105a8c17704SBram Moolenaar set ts=7 106a8c17704SBram Moolenaar &ts += 1 107a8c17704SBram Moolenaar assert_equal(8, &ts) 10880c34ca3SBram Moolenaar &ts -= 3 10980c34ca3SBram Moolenaar assert_equal(5, &ts) 11080c34ca3SBram Moolenaar &ts *= 2 11180c34ca3SBram Moolenaar assert_equal(10, &ts) 11280c34ca3SBram Moolenaar &ts /= 3 11380c34ca3SBram Moolenaar assert_equal(3, &ts) 11480c34ca3SBram Moolenaar set ts=10 11580c34ca3SBram Moolenaar &ts %= 4 11680c34ca3SBram Moolenaar assert_equal(2, &ts) 117b5ed2660SBram Moolenaar 11893ad1471SBram Moolenaar if has('float') 11993ad1471SBram Moolenaar let f100: float = 100.0 12093ad1471SBram Moolenaar f100 /= 5 12193ad1471SBram Moolenaar assert_equal(20.0, f100) 12293ad1471SBram Moolenaar 12393ad1471SBram Moolenaar let f200: float = 200.0 12493ad1471SBram Moolenaar f200 /= 5.0 12593ad1471SBram Moolenaar assert_equal(40.0, f200) 12693ad1471SBram Moolenaar 12793ad1471SBram Moolenaar CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:') 12893ad1471SBram Moolenaar endif 12993ad1471SBram Moolenaar 130b5ed2660SBram Moolenaar lines =<< trim END 131b5ed2660SBram Moolenaar &ts = 6 132b5ed2660SBram Moolenaar &ts += 3 133b5ed2660SBram Moolenaar assert_equal(9, &ts) 1342e800955SBram Moolenaar 1352e800955SBram Moolenaar &l:ts = 6 1362e800955SBram Moolenaar assert_equal(6, &ts) 1372e800955SBram Moolenaar &l:ts += 2 1382e800955SBram Moolenaar assert_equal(8, &ts) 1392e800955SBram Moolenaar 1402e800955SBram Moolenaar &g:ts = 6 1412e800955SBram Moolenaar assert_equal(6, &g:ts) 1422e800955SBram Moolenaar &g:ts += 2 1432e800955SBram Moolenaar assert_equal(8, &g:ts) 144b5ed2660SBram Moolenaar END 1452e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 146b5ed2660SBram Moolenaar 1470aae4809SBram Moolenaar CheckDefFailure(['¬ex += 3'], 'E113:') 1480aae4809SBram Moolenaar CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 1490aae4809SBram Moolenaar CheckDefFailure(['&ts = [7]'], 'E1012:') 1500aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 1510aae4809SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 1520aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 1530aae4809SBram Moolenaar CheckDefFailure(['&path += 3'], 'E1012:') 1540aae4809SBram Moolenaar CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 155cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 1560aae4809SBram Moolenaar CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 15780c34ca3SBram Moolenaar &ts = 8 158a8c17704SBram Moolenaar 1590aae4809SBram Moolenaar lines =<< trim END 1600aae4809SBram Moolenaar let save_TI = &t_TI 1610aae4809SBram Moolenaar &t_TI = '' 1620aae4809SBram Moolenaar assert_equal('', &t_TI) 1630aae4809SBram Moolenaar &t_TI = 'xxx' 1640aae4809SBram Moolenaar assert_equal('xxx', &t_TI) 1650aae4809SBram Moolenaar &t_TI = save_TI 1660aae4809SBram Moolenaar END 1670aae4809SBram Moolenaar CheckDefSuccess(lines) 1680aae4809SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 1690aae4809SBram Moolenaar 1700aae4809SBram Moolenaar CheckDefFailure(['&t_TI = 123'], 'E1012:') 1710aae4809SBram Moolenaar CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') 1720aae4809SBram Moolenaar 1730aae4809SBram Moolenaar CheckDefFailure(['let s:var = 123'], 'E1101:') 1740aae4809SBram Moolenaar CheckDefFailure(['let s:var: number'], 'E1101:') 17533afa244SBram Moolenaar 176f9b2b496SBram Moolenaar lines =<< trim END 177f9b2b496SBram Moolenaar vim9script 178f9b2b496SBram Moolenaar def SomeFunc() 179f9b2b496SBram Moolenaar s:var = 123 180f9b2b496SBram Moolenaar enddef 181f9b2b496SBram Moolenaar defcompile 182f9b2b496SBram Moolenaar END 183d2c61705SBram Moolenaar CheckScriptFailure(lines, 'E1089:') 184f9b2b496SBram Moolenaar 185a8c17704SBram Moolenaar g:inc_counter += 1 186a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 187a8c17704SBram Moolenaar 188a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 189a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 190d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 191d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 192a8c17704SBram Moolenaar 193b5ed2660SBram Moolenaar lines =<< trim END 194b5ed2660SBram Moolenaar @c = 'areg' 195b5ed2660SBram Moolenaar @c ..= 'add' 196b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 197b5ed2660SBram Moolenaar END 1982e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 1992e800955SBram Moolenaar 200d2c61705SBram Moolenaar CheckDefFailure(['@a += "more"'], 'E1051:') 201d2c61705SBram Moolenaar CheckDefFailure(['@a += 123'], 'E1012:') 202b5ed2660SBram Moolenaar 203e69f6d04SBram Moolenaar v:errmsg = 'none' 204e69f6d04SBram Moolenaar v:errmsg ..= 'again' 205e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 206d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 207d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += 123'], 'E1012:') 20833afa244SBram Moolenaar 20933afa244SBram Moolenaar # single letter variables 21033afa244SBram Moolenaar a = 123 21133afa244SBram Moolenaar assert_equal(123, a) 21233afa244SBram Moolenaar let b: number 21333afa244SBram Moolenaar b = 123 21433afa244SBram Moolenaar assert_equal(123, b) 21533afa244SBram Moolenaar let g: number 21633afa244SBram Moolenaar g = 123 21733afa244SBram Moolenaar assert_equal(123, g) 21833afa244SBram Moolenaar let s: number 21933afa244SBram Moolenaar s = 123 22033afa244SBram Moolenaar assert_equal(123, s) 22133afa244SBram Moolenaar let t: number 22233afa244SBram Moolenaar t = 123 22333afa244SBram Moolenaar assert_equal(123, t) 22433afa244SBram Moolenaar let v: number 22533afa244SBram Moolenaar v = 123 22633afa244SBram Moolenaar assert_equal(123, v) 22733afa244SBram Moolenaar let w: number 22833afa244SBram Moolenaar w = 123 22933afa244SBram Moolenaar assert_equal(123, w) 2305deeb3f1SBram Moolenaarenddef 2315deeb3f1SBram Moolenaar 2323b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 2333b74b6b4SBram Moolenaar let lines =<< trim END 2343b74b6b4SBram Moolenaar vim9script 2353b74b6b4SBram Moolenaar 236f5be8cdbSBram Moolenaar # single character variable declarations work 2373b74b6b4SBram Moolenaar let a: string 2383b74b6b4SBram Moolenaar let b: number 2393b74b6b4SBram Moolenaar let l: list<any> 2403b74b6b4SBram Moolenaar let s: string 2413b74b6b4SBram Moolenaar let t: number 2423b74b6b4SBram Moolenaar let v: number 2433b74b6b4SBram Moolenaar let w: number 2443b74b6b4SBram Moolenaar 245f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 2463b74b6b4SBram Moolenaar a = 'script-a' 2473b74b6b4SBram Moolenaar b = 111 2483b74b6b4SBram Moolenaar l = [1, 2, 3] 2493b74b6b4SBram Moolenaar s = 'script-s' 2503b74b6b4SBram Moolenaar t = 222 2513b74b6b4SBram Moolenaar v = 333 2523b74b6b4SBram Moolenaar w = 444 2533b74b6b4SBram Moolenaar 2543b74b6b4SBram Moolenaar assert_equal('script-a', a) 2553b74b6b4SBram Moolenaar assert_equal(111, b) 2563b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2573b74b6b4SBram Moolenaar assert_equal('script-s', s) 2583b74b6b4SBram Moolenaar assert_equal(222, t) 2593b74b6b4SBram Moolenaar assert_equal(333, v) 2603b74b6b4SBram Moolenaar assert_equal(444, w) 2613b74b6b4SBram Moolenaar END 2623b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2633b74b6b4SBram Moolenaar source Xsinglechar 2643b74b6b4SBram Moolenaar delete('Xsinglechar') 2653b74b6b4SBram Moolenaarenddef 2663b74b6b4SBram Moolenaar 26784370087SBram Moolenaardef Test_assignment_list() 26884370087SBram Moolenaar let list1: list<bool> = [false, true, false] 26984370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 27084370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 27184370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 27284370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 27384370087SBram Moolenaar 27484370087SBram Moolenaar let listS: list<string> = [] 27584370087SBram Moolenaar let listN: list<number> = [] 27684370087SBram Moolenaar 27784370087SBram Moolenaar assert_equal([1, 2, 3], list2) 27884370087SBram Moolenaar list2[-1] = 99 27984370087SBram Moolenaar assert_equal([1, 2, 99], list2) 28084370087SBram Moolenaar list2[-2] = 88 28184370087SBram Moolenaar assert_equal([1, 88, 99], list2) 28284370087SBram Moolenaar list2[-3] = 77 28384370087SBram Moolenaar assert_equal([77, 88, 99], list2) 284dd29f1b0SBram Moolenaar list2 += [100] 285dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 286dd29f1b0SBram Moolenaar 287dd29f1b0SBram Moolenaar list3 += ['end'] 288dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 289dd29f1b0SBram Moolenaar 290dd29f1b0SBram Moolenaar 291d2c61705SBram Moolenaar CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 292d2c61705SBram Moolenaar CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 29384370087SBram Moolenaar 29484370087SBram Moolenaar # type becomes list<any> 29584370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 29684370087SBram Moolenaarenddef 29784370087SBram Moolenaar 298b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 299b31be3f9SBram Moolenaar let lines =<< trim END 300b31be3f9SBram Moolenaar vim9script 301b31be3f9SBram Moolenaar let v1: number 302b31be3f9SBram Moolenaar let v2: number 303b31be3f9SBram Moolenaar let v3: number 304b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 305b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 306b31be3f9SBram Moolenaar END 307d2c61705SBram Moolenaar CheckScriptSuccess(lines) 308b31be3f9SBram Moolenaarenddef 309b31be3f9SBram Moolenaar 31084370087SBram Moolenaardef Test_assignment_dict() 31184370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 31284370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 31384370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 31484370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 31574fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 31684370087SBram Moolenaar 317f5be8cdbSBram Moolenaar # overwrite 318c785b9a7SBram Moolenaar dict3['key'] = 'another' 319c785b9a7SBram Moolenaar 32058626872SBram Moolenaar # empty key can be used 32158626872SBram Moolenaar let dd = {} 32258626872SBram Moolenaar dd[""] = 6 32358626872SBram Moolenaar assert_equal({'': 6}, dd) 32484370087SBram Moolenaar 32584370087SBram Moolenaar # type becomes dict<any> 32684370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 3278e4c8c85SBram Moolenaar 3288e4c8c85SBram Moolenaar # assignment to script-local dict 3298e4c8c85SBram Moolenaar let lines =<< trim END 3308e4c8c85SBram Moolenaar vim9script 3318e4c8c85SBram Moolenaar let test: dict<any> = {} 3328e4c8c85SBram Moolenaar def FillDict(): dict<any> 3338e4c8c85SBram Moolenaar test['a'] = 43 3348e4c8c85SBram Moolenaar return test 3358e4c8c85SBram Moolenaar enddef 3368e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3378e4c8c85SBram Moolenaar END 3388e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 3398e4c8c85SBram Moolenaar 3408e4c8c85SBram Moolenaar lines =<< trim END 3418e4c8c85SBram Moolenaar vim9script 3428e4c8c85SBram Moolenaar let test: dict<any> 3438e4c8c85SBram Moolenaar def FillDict(): dict<any> 3448e4c8c85SBram Moolenaar test['a'] = 43 3458e4c8c85SBram Moolenaar return test 3468e4c8c85SBram Moolenaar enddef 3478e4c8c85SBram Moolenaar FillDict() 3488e4c8c85SBram Moolenaar END 3498e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 3502caa1594SBram Moolenaar 3512caa1594SBram Moolenaar # assignment to global dict 3522caa1594SBram Moolenaar lines =<< trim END 3532caa1594SBram Moolenaar vim9script 3542caa1594SBram Moolenaar g:test = {} 3552caa1594SBram Moolenaar def FillDict(): dict<any> 3562caa1594SBram Moolenaar g:test['a'] = 43 3572caa1594SBram Moolenaar return g:test 3582caa1594SBram Moolenaar enddef 3592caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3602caa1594SBram Moolenaar END 3612caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3622caa1594SBram Moolenaar 3632caa1594SBram Moolenaar # assignment to buffer dict 3642caa1594SBram Moolenaar lines =<< trim END 3652caa1594SBram Moolenaar vim9script 3662caa1594SBram Moolenaar b:test = {} 3672caa1594SBram Moolenaar def FillDict(): dict<any> 3682caa1594SBram Moolenaar b:test['a'] = 43 3692caa1594SBram Moolenaar return b:test 3702caa1594SBram Moolenaar enddef 3712caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3722caa1594SBram Moolenaar END 3732caa1594SBram Moolenaar call CheckScriptSuccess(lines) 37484370087SBram Moolenaarenddef 37584370087SBram Moolenaar 376d3aac291SBram Moolenaardef Test_assignment_local() 377f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 378f5be8cdbSBram Moolenaar # changed. 379d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 380d3aac291SBram Moolenaar let b:existing = 'yes' 381d3aac291SBram Moolenaar let w:existing = 'yes' 382d3aac291SBram Moolenaar let t:existing = 'yes' 383d3aac291SBram Moolenaar 384d3aac291SBram Moolenaar def Test_assignment_local_internal() 385d3aac291SBram Moolenaar b:newvar = 'new' 386d3aac291SBram Moolenaar assert_equal('new', b:newvar) 387d3aac291SBram Moolenaar assert_equal('yes', b:existing) 388d3aac291SBram Moolenaar b:existing = 'no' 389d3aac291SBram Moolenaar assert_equal('no', b:existing) 390396f3138SBram Moolenaar b:existing ..= 'NO' 391396f3138SBram Moolenaar assert_equal('noNO', b:existing) 392d3aac291SBram Moolenaar 393d3aac291SBram Moolenaar w:newvar = 'new' 394d3aac291SBram Moolenaar assert_equal('new', w:newvar) 395d3aac291SBram Moolenaar assert_equal('yes', w:existing) 396d3aac291SBram Moolenaar w:existing = 'no' 397d3aac291SBram Moolenaar assert_equal('no', w:existing) 398396f3138SBram Moolenaar w:existing ..= 'NO' 399396f3138SBram Moolenaar assert_equal('noNO', w:existing) 400d3aac291SBram Moolenaar 401d3aac291SBram Moolenaar t:newvar = 'new' 402d3aac291SBram Moolenaar assert_equal('new', t:newvar) 403d3aac291SBram Moolenaar assert_equal('yes', t:existing) 404d3aac291SBram Moolenaar t:existing = 'no' 405d3aac291SBram Moolenaar assert_equal('no', t:existing) 406396f3138SBram Moolenaar t:existing ..= 'NO' 407396f3138SBram Moolenaar assert_equal('noNO', t:existing) 408d3aac291SBram Moolenaar enddef 409d3aac291SBram Moolenaar call Test_assignment_local_internal() 410d3aac291SBram Moolenaar END 411d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 412d3aac291SBram Moolenaarenddef 413d3aac291SBram Moolenaar 4145deeb3f1SBram Moolenaardef Test_assignment_default() 415e69f6d04SBram Moolenaar 416cb711abfSBram Moolenaar # Test default values. 417e69f6d04SBram Moolenaar let thebool: bool 418e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 419e69f6d04SBram Moolenaar 420e69f6d04SBram Moolenaar let thenumber: number 421e69f6d04SBram Moolenaar assert_equal(0, thenumber) 422e69f6d04SBram Moolenaar 423e69f6d04SBram Moolenaar if has('float') 424e69f6d04SBram Moolenaar let thefloat: float 425e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 426e69f6d04SBram Moolenaar endif 427e69f6d04SBram Moolenaar 428e69f6d04SBram Moolenaar let thestring: string 429e69f6d04SBram Moolenaar assert_equal('', thestring) 430e69f6d04SBram Moolenaar 431e69f6d04SBram Moolenaar let theblob: blob 432e69f6d04SBram Moolenaar assert_equal(0z, theblob) 433e69f6d04SBram Moolenaar 4345deeb3f1SBram Moolenaar let Thefunc: func 4355deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 436e69f6d04SBram Moolenaar 437e69f6d04SBram Moolenaar let thelist: list<any> 438e69f6d04SBram Moolenaar assert_equal([], thelist) 439e69f6d04SBram Moolenaar 440e69f6d04SBram Moolenaar let thedict: dict<any> 441e69f6d04SBram Moolenaar assert_equal({}, thedict) 442e69f6d04SBram Moolenaar 4432c869deeSBram Moolenaar if has('channel') 444e69f6d04SBram Moolenaar let thejob: job 445e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 446e69f6d04SBram Moolenaar 447e69f6d04SBram Moolenaar let thechannel: channel 448e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 449c785b9a7SBram Moolenaar 450c785b9a7SBram Moolenaar if has('unix') && executable('cat') 451f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 452c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 453c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 454c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 455c785b9a7SBram Moolenaar endif 4562c869deeSBram Moolenaar endif 457585fea7bSBram Moolenaar 458585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 459585fea7bSBram Moolenaar assert_equal(5678, nr) 4608a7d6542SBram Moolenaarenddef 4618a7d6542SBram Moolenaar 46247a519a9SBram Moolenaardef Test_assignment_var_list() 46347a519a9SBram Moolenaar let v1: string 46447a519a9SBram Moolenaar let v2: string 4659af78769SBram Moolenaar let vrem: list<string> 4669af78769SBram Moolenaar [v1] = ['aaa'] 4679af78769SBram Moolenaar assert_equal('aaa', v1) 4689af78769SBram Moolenaar 46947a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 47047a519a9SBram Moolenaar assert_equal('one', v1) 47147a519a9SBram Moolenaar assert_equal('two', v2) 4729af78769SBram Moolenaar 4739af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4749af78769SBram Moolenaar assert_equal('one', v1) 4759af78769SBram Moolenaar assert_equal('two', v2) 4769af78769SBram Moolenaar assert_equal([], vrem) 4779af78769SBram Moolenaar 4789af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4799af78769SBram Moolenaar assert_equal('one', v1) 4809af78769SBram Moolenaar assert_equal('two', v2) 4819af78769SBram Moolenaar assert_equal(['three'], vrem) 4821c199f9cSBram Moolenaar 4831c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 4841c199f9cSBram Moolenaar assert_equal(3, &ts) 4851c199f9cSBram Moolenaar assert_equal(4, &sw) 4861c199f9cSBram Moolenaar set ts=8 sw=4 48747a519a9SBram Moolenaarenddef 48847a519a9SBram Moolenaar 489c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 490c7e44a7eSBram Moolenaar let lines =<< trim END 491c7e44a7eSBram Moolenaar vim9script 492c7e44a7eSBram Moolenaar def Func(): list<number> 493c7e44a7eSBram Moolenaar return [1, 2] 494c7e44a7eSBram Moolenaar enddef 495c7e44a7eSBram Moolenaar let var1: number 496c7e44a7eSBram Moolenaar let var2: number 497c7e44a7eSBram Moolenaar [var1, var2] = 498c7e44a7eSBram Moolenaar Func() 499c7e44a7eSBram Moolenaar assert_equal(1, var1) 500c7e44a7eSBram Moolenaar assert_equal(2, var2) 501c7e44a7eSBram Moolenaar let ll = 502c7e44a7eSBram Moolenaar Func() 503c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 50483144546SBram Moolenaar 50583144546SBram Moolenaar @/ = 'text' 50683144546SBram Moolenaar assert_equal('text', @/) 50783144546SBram Moolenaar @0 = 'zero' 50883144546SBram Moolenaar assert_equal('zero', @0) 50983144546SBram Moolenaar @1 = 'one' 51083144546SBram Moolenaar assert_equal('one', @1) 51183144546SBram Moolenaar @9 = 'nine' 51283144546SBram Moolenaar assert_equal('nine', @9) 51383144546SBram Moolenaar @- = 'minus' 51483144546SBram Moolenaar assert_equal('minus', @-) 51583144546SBram Moolenaar if has('clipboard_working') 51683144546SBram Moolenaar @* = 'star' 51783144546SBram Moolenaar assert_equal('star', @*) 51883144546SBram Moolenaar @+ = 'plus' 51983144546SBram Moolenaar assert_equal('plus', @+) 52083144546SBram Moolenaar endif 52195dd9f25SBram Moolenaar 52295dd9f25SBram Moolenaar let a: number = 123 52395dd9f25SBram Moolenaar assert_equal(123, a) 52495dd9f25SBram Moolenaar let s: string = 'yes' 52595dd9f25SBram Moolenaar assert_equal('yes', s) 52695dd9f25SBram Moolenaar let b: number = 42 52795dd9f25SBram Moolenaar assert_equal(42, b) 52895dd9f25SBram Moolenaar let w: number = 43 52995dd9f25SBram Moolenaar assert_equal(43, w) 53095dd9f25SBram Moolenaar let t: number = 44 53195dd9f25SBram Moolenaar assert_equal(44, t) 532c7e44a7eSBram Moolenaar END 533c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 534c7e44a7eSBram Moolenaarenddef 535c7e44a7eSBram Moolenaar 536cab27678SBram Moolenaardef Mess(): string 537cab27678SBram Moolenaar v:foldstart = 123 538cab27678SBram Moolenaar return 'xxx' 539cab27678SBram Moolenaarenddef 540cab27678SBram Moolenaar 541d72c1bf0SBram Moolenaardef Test_assignment_failure() 542d2c61705SBram Moolenaar CheckDefFailure(['let var=234'], 'E1004:') 543d2c61705SBram Moolenaar CheckDefFailure(['let var =234'], 'E1004:') 544d2c61705SBram Moolenaar CheckDefFailure(['let var= 234'], 'E1004:') 5458a7d6542SBram Moolenaar 546d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 547d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 548d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 549d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 550d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 551d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 552d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 553d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 55463be3d4bSBram Moolenaar 555d2c61705SBram Moolenaar CheckDefFailure(['let true = 1'], 'E1034:') 556d2c61705SBram Moolenaar CheckDefFailure(['let false = 1'], 'E1034:') 5578a7d6542SBram Moolenaar 558d2c61705SBram Moolenaar CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 559d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5609af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 561d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5629af78769SBram Moolenaar '[a] = []'], 'E1093:') 563d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5649af78769SBram Moolenaar 'let y: number', 5659af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 566d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5679af78769SBram Moolenaar 'let y: number', 5689af78769SBram Moolenaar 'let z: list<number>', 5699af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5709be61bbbSBram Moolenaar 571d2c61705SBram Moolenaar CheckDefFailure(['let somevar'], "E1022:") 572d2c61705SBram Moolenaar CheckDefFailure(['let &tabstop = 4'], 'E1052:') 573d2c61705SBram Moolenaar CheckDefFailure(['&g:option = 5'], 'E113:') 574d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5759be61bbbSBram Moolenaar 576d2c61705SBram Moolenaar CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 577d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5789be61bbbSBram Moolenaar 579434d72cbSBram Moolenaar if has('dnd') 580d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E1066:') 581434d72cbSBram Moolenaar else 582d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E354:') 583d2c61705SBram Moolenaar CheckDefFailure(['@~ = 5'], 'E354:') 584434d72cbSBram Moolenaar endif 585d2c61705SBram Moolenaar CheckDefFailure(['let @a = 5'], 'E1066:') 586d2c61705SBram Moolenaar CheckDefFailure(['let @/ = "x"'], 'E1066:') 587d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5889be61bbbSBram Moolenaar 589d2c61705SBram Moolenaar CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 590d2c61705SBram Moolenaar CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 591d2c61705SBram Moolenaar CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 592d2c61705SBram Moolenaar CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5939be61bbbSBram Moolenaar 594d2c61705SBram Moolenaar CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 595d2c61705SBram Moolenaar CheckDefFailure(['let xnr += 4'], 'E1020:', 1) 596d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:') 597d2c61705SBram Moolenaar CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1) 598d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:') 5999be61bbbSBram Moolenaar 600d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 60133fa29cfSBram Moolenaar 602d2c61705SBram Moolenaar CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 603d2c61705SBram Moolenaar CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 6048a7d6542SBram Moolenaar 605d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 606d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 6078a7d6542SBram Moolenaar 608d2c61705SBram Moolenaar CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 609d2c61705SBram Moolenaar CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 61042a480bfSBram Moolenaar 611d2c61705SBram Moolenaar CheckDefFailure(['let var: dict <number>'], 'E1068:') 612d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 613cab27678SBram Moolenaar 614d2c61705SBram Moolenaar assert_fails('s/^/\=Mess()/n', 'E794:') 615d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 61643e969d3SBram Moolenaar 617d2c61705SBram Moolenaar CheckDefFailure(['w:foo: number = 10'], 61843e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 619d2c61705SBram Moolenaar CheckDefFailure(['t:foo: bool = true'], 62043e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 621d2c61705SBram Moolenaar CheckDefFailure(['b:foo: string = "x"'], 62243e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 623d2c61705SBram Moolenaar CheckDefFailure(['g:foo: number = 123'], 62443e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 625d72c1bf0SBram Moolenaarenddef 626d72c1bf0SBram Moolenaar 627d72c1bf0SBram Moolenaardef Test_unlet() 628d72c1bf0SBram Moolenaar g:somevar = 'yes' 629d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 630d72c1bf0SBram Moolenaar unlet g:somevar 631d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 632d72c1bf0SBram Moolenaar unlet! g:somevar 633d72c1bf0SBram Moolenaar 6348436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 6358436773fSBram Moolenaar s:somevar = 'legacy' 6368436773fSBram Moolenaar assert_true(exists('s:somevar')) 6378436773fSBram Moolenaar unlet s:somevar 6388436773fSBram Moolenaar assert_false(exists('s:somevar')) 6398436773fSBram Moolenaar unlet! s:somevar 6408436773fSBram Moolenaar 641d2c61705SBram Moolenaar CheckScriptFailure([ 642d72c1bf0SBram Moolenaar 'vim9script', 643d72c1bf0SBram Moolenaar 'let svar = 123', 644d72c1bf0SBram Moolenaar 'unlet svar', 645d72c1bf0SBram Moolenaar ], 'E1081:') 646d2c61705SBram Moolenaar CheckScriptFailure([ 647d72c1bf0SBram Moolenaar 'vim9script', 648d72c1bf0SBram Moolenaar 'let svar = 123', 649d72c1bf0SBram Moolenaar 'unlet s:svar', 650d72c1bf0SBram Moolenaar ], 'E1081:') 651d2c61705SBram Moolenaar CheckScriptFailure([ 652d72c1bf0SBram Moolenaar 'vim9script', 653d72c1bf0SBram Moolenaar 'let svar = 123', 654d72c1bf0SBram Moolenaar 'def Func()', 655d72c1bf0SBram Moolenaar ' unlet svar', 656d72c1bf0SBram Moolenaar 'enddef', 657822ba247SBram Moolenaar 'defcompile', 658d72c1bf0SBram Moolenaar ], 'E1081:') 659d2c61705SBram Moolenaar CheckScriptFailure([ 660d72c1bf0SBram Moolenaar 'vim9script', 661d72c1bf0SBram Moolenaar 'let svar = 123', 662d72c1bf0SBram Moolenaar 'def Func()', 663d72c1bf0SBram Moolenaar ' unlet s:svar', 664d72c1bf0SBram Moolenaar 'enddef', 665822ba247SBram Moolenaar 'defcompile', 666d72c1bf0SBram Moolenaar ], 'E1081:') 6677bdaea6eSBram Moolenaar 6687bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6697bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6707bdaea6eSBram Moolenaar unlet $ENVVAR 6717bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 672d72c1bf0SBram Moolenaarenddef 673599c89c8SBram Moolenaar 6744c17ad94SBram Moolenaardef Test_delfunction() 675f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6764c17ad94SBram Moolenaar CheckScriptSuccess([ 6774c17ad94SBram Moolenaar 'vim9script', 6784c17ad94SBram Moolenaar 'func CheckMe()', 6794c17ad94SBram Moolenaar ' return 123', 6804c17ad94SBram Moolenaar 'endfunc', 6814c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6824c17ad94SBram Moolenaar ]) 6834c17ad94SBram Moolenaar 684f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6854c17ad94SBram Moolenaar CheckScriptFailure([ 6864c17ad94SBram Moolenaar 'vim9script', 6874c17ad94SBram Moolenaar 'func DeleteMe1()', 6884c17ad94SBram Moolenaar 'endfunc', 6894c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6904c17ad94SBram Moolenaar ], 'E1084:') 6914c17ad94SBram Moolenaar CheckScriptFailure([ 6924c17ad94SBram Moolenaar 'vim9script', 6934c17ad94SBram Moolenaar 'func DeleteMe2()', 6944c17ad94SBram Moolenaar 'endfunc', 6954c17ad94SBram Moolenaar 'def DoThat()', 6964c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6974c17ad94SBram Moolenaar 'enddef', 6984c17ad94SBram Moolenaar 'DoThat()', 6994c17ad94SBram Moolenaar ], 'E1084:') 7004c17ad94SBram Moolenaar CheckScriptFailure([ 7014c17ad94SBram Moolenaar 'vim9script', 7024c17ad94SBram Moolenaar 'def DeleteMe3()', 7034c17ad94SBram Moolenaar 'enddef', 7044c17ad94SBram Moolenaar 'delfunction DeleteMe3', 7054c17ad94SBram Moolenaar ], 'E1084:') 7064c17ad94SBram Moolenaar CheckScriptFailure([ 7074c17ad94SBram Moolenaar 'vim9script', 7084c17ad94SBram Moolenaar 'def DeleteMe4()', 7094c17ad94SBram Moolenaar 'enddef', 7104c17ad94SBram Moolenaar 'def DoThat()', 7114c17ad94SBram Moolenaar ' delfunction DeleteMe4', 7124c17ad94SBram Moolenaar 'enddef', 7134c17ad94SBram Moolenaar 'DoThat()', 7144c17ad94SBram Moolenaar ], 'E1084:') 715925e9fd6SBram Moolenaar 716925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 717925e9fd6SBram Moolenaar let lines =<< trim END 718925e9fd6SBram Moolenaar vim9script 719925e9fd6SBram Moolenaar def g:Global(): string 720925e9fd6SBram Moolenaar return "yes" 721925e9fd6SBram Moolenaar enddef 722925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 723925e9fd6SBram Moolenaar def! g:Global(): string 724925e9fd6SBram Moolenaar return "no" 725925e9fd6SBram Moolenaar enddef 726925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 727925e9fd6SBram Moolenaar delfunc g:Global 728925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 729925e9fd6SBram Moolenaar END 730925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 731925e9fd6SBram Moolenaar 732925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 733925e9fd6SBram Moolenaar lines =<< trim END 734925e9fd6SBram Moolenaar vim9script 735925e9fd6SBram Moolenaar func g:Global() 736925e9fd6SBram Moolenaar return "yes" 737925e9fd6SBram Moolenaar endfunc 738925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 739925e9fd6SBram Moolenaar def! g:Global(): string 740925e9fd6SBram Moolenaar return "no" 741925e9fd6SBram Moolenaar enddef 742925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 743925e9fd6SBram Moolenaar delfunc g:Global 744925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 745925e9fd6SBram Moolenaar END 746925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 747925e9fd6SBram Moolenaar 748925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 749925e9fd6SBram Moolenaar lines =<< trim END 750925e9fd6SBram Moolenaar vim9script 751925e9fd6SBram Moolenaar def g:Global(): string 752925e9fd6SBram Moolenaar return "yes" 753925e9fd6SBram Moolenaar enddef 754925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 755925e9fd6SBram Moolenaar func! g:Global() 756925e9fd6SBram Moolenaar return "no" 757925e9fd6SBram Moolenaar endfunc 758925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 759925e9fd6SBram Moolenaar delfunc g:Global 760925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 761925e9fd6SBram Moolenaar END 762925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 7634c17ad94SBram Moolenaarenddef 7644c17ad94SBram Moolenaar 765599c89c8SBram Moolenaarfunc Test_wrong_type() 766599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 767599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 768599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 769599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 770599c89c8SBram Moolenaar 771599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 772599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 77342a480bfSBram Moolenaar 77442a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 77542a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 77642a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 77742a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 77842a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 77942a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 78042a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 78142a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 78242a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 78342a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 78442a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 785a0a9f43aSBram Moolenaar 786a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 787a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7888a7d6542SBram Moolenaarendfunc 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaarfunc Test_const() 7918a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7928a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7938a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7949be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7958a7d6542SBram Moolenaarendfunc 7968a7d6542SBram Moolenaar 797df069eecSBram Moolenaardef Test_range_no_colon() 798d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 799d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 800d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 801d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 802df069eecSBram Moolenaarenddef 803df069eecSBram Moolenaar 804df069eecSBram Moolenaar 8058a7d6542SBram Moolenaardef Test_block() 8068a7d6542SBram Moolenaar let outer = 1 8078a7d6542SBram Moolenaar { 8088a7d6542SBram Moolenaar let inner = 2 8098a7d6542SBram Moolenaar assert_equal(1, outer) 8108a7d6542SBram Moolenaar assert_equal(2, inner) 8118a7d6542SBram Moolenaar } 8128a7d6542SBram Moolenaar assert_equal(1, outer) 8138a7d6542SBram Moolenaarenddef 8148a7d6542SBram Moolenaar 8158a7d6542SBram Moolenaarfunc Test_block_failure() 8168a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 817585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 818585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 8198a7d6542SBram Moolenaarendfunc 8208a7d6542SBram Moolenaar 821d032f34aSBram Moolenaarfunc g:NoSuchFunc() 822d032f34aSBram Moolenaar echo 'none' 823d032f34aSBram Moolenaarendfunc 824d032f34aSBram Moolenaar 8258a7d6542SBram Moolenaardef Test_try_catch() 8268a7d6542SBram Moolenaar let l = [] 8277a092245SBram Moolenaar try # comment 8288a7d6542SBram Moolenaar add(l, '1') 8298a7d6542SBram Moolenaar throw 'wrong' 8308a7d6542SBram Moolenaar add(l, '2') 8317a092245SBram Moolenaar catch # comment 8328a7d6542SBram Moolenaar add(l, v:exception) 8337a092245SBram Moolenaar finally # comment 8348a7d6542SBram Moolenaar add(l, '3') 8357a092245SBram Moolenaar endtry # comment 8368a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 83768d130c6SBram Moolenaar 838e859312eSBram Moolenaar l = [] 839e859312eSBram Moolenaar try 840e859312eSBram Moolenaar try 841e859312eSBram Moolenaar add(l, '1') 842e859312eSBram Moolenaar throw 'wrong' 843e859312eSBram Moolenaar add(l, '2') 844e859312eSBram Moolenaar catch /right/ 845e859312eSBram Moolenaar add(l, v:exception) 846e859312eSBram Moolenaar endtry 847e859312eSBram Moolenaar catch /wrong/ 848e859312eSBram Moolenaar add(l, 'caught') 849e859312eSBram Moolenaar finally 850e859312eSBram Moolenaar add(l, 'finally') 851e859312eSBram Moolenaar endtry 852e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 853e859312eSBram Moolenaar 85468d130c6SBram Moolenaar let n: number 85568d130c6SBram Moolenaar try 85668d130c6SBram Moolenaar n = l[3] 85768d130c6SBram Moolenaar catch /E684:/ 85868d130c6SBram Moolenaar n = 99 85968d130c6SBram Moolenaar endtry 86068d130c6SBram Moolenaar assert_equal(99, n) 86168d130c6SBram Moolenaar 86268d130c6SBram Moolenaar try 863cc673e74SBram Moolenaar # string slice returns a string, not a number 86468d130c6SBram Moolenaar n = g:astring[3] 86556acb094SBram Moolenaar catch /E1029:/ 86668d130c6SBram Moolenaar n = 77 86768d130c6SBram Moolenaar endtry 86868d130c6SBram Moolenaar assert_equal(77, n) 86968d130c6SBram Moolenaar 87068d130c6SBram Moolenaar try 87168d130c6SBram Moolenaar n = l[g:astring] 87256acb094SBram Moolenaar catch /E1029:/ 87356acb094SBram Moolenaar n = 88 87468d130c6SBram Moolenaar endtry 87556acb094SBram Moolenaar assert_equal(88, n) 87668d130c6SBram Moolenaar 87768d130c6SBram Moolenaar try 87868d130c6SBram Moolenaar n = s:does_not_exist 87968d130c6SBram Moolenaar catch /E121:/ 880f0b9f43cSBram Moolenaar n = 111 881f0b9f43cSBram Moolenaar endtry 882f0b9f43cSBram Moolenaar assert_equal(111, n) 883f0b9f43cSBram Moolenaar 884f0b9f43cSBram Moolenaar try 885f0b9f43cSBram Moolenaar n = g:does_not_exist 886f0b9f43cSBram Moolenaar catch /E121:/ 88768d130c6SBram Moolenaar n = 121 88868d130c6SBram Moolenaar endtry 88968d130c6SBram Moolenaar assert_equal(121, n) 89068d130c6SBram Moolenaar 89168d130c6SBram Moolenaar let d = #{one: 1} 89268d130c6SBram Moolenaar try 89368d130c6SBram Moolenaar n = d[g:astring] 89468d130c6SBram Moolenaar catch /E716:/ 89568d130c6SBram Moolenaar n = 222 89668d130c6SBram Moolenaar endtry 89768d130c6SBram Moolenaar assert_equal(222, n) 898f0b9f43cSBram Moolenaar 899f0b9f43cSBram Moolenaar try 900f0b9f43cSBram Moolenaar n = -g:astring 901f0b9f43cSBram Moolenaar catch /E39:/ 902f0b9f43cSBram Moolenaar n = 233 903f0b9f43cSBram Moolenaar endtry 904f0b9f43cSBram Moolenaar assert_equal(233, n) 905f0b9f43cSBram Moolenaar 906f0b9f43cSBram Moolenaar try 907f0b9f43cSBram Moolenaar n = +g:astring 908f0b9f43cSBram Moolenaar catch /E1030:/ 909f0b9f43cSBram Moolenaar n = 244 910f0b9f43cSBram Moolenaar endtry 911f0b9f43cSBram Moolenaar assert_equal(244, n) 912f0b9f43cSBram Moolenaar 913f0b9f43cSBram Moolenaar try 914f0b9f43cSBram Moolenaar n = +g:alist 915f0b9f43cSBram Moolenaar catch /E745:/ 916f0b9f43cSBram Moolenaar n = 255 917f0b9f43cSBram Moolenaar endtry 918f0b9f43cSBram Moolenaar assert_equal(255, n) 919f0b9f43cSBram Moolenaar 920f0b9f43cSBram Moolenaar let nd: dict<any> 921f0b9f43cSBram Moolenaar try 922f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 923f0b9f43cSBram Moolenaar catch /E1029:/ 924f0b9f43cSBram Moolenaar n = 266 925f0b9f43cSBram Moolenaar endtry 926f0b9f43cSBram Moolenaar assert_equal(266, n) 927f0b9f43cSBram Moolenaar 928f0b9f43cSBram Moolenaar try 929f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 930f0b9f43cSBram Moolenaar catch /E1093:/ 931f0b9f43cSBram Moolenaar n = 277 932f0b9f43cSBram Moolenaar endtry 933f0b9f43cSBram Moolenaar assert_equal(277, n) 934f0b9f43cSBram Moolenaar 935e859312eSBram Moolenaar try 936e859312eSBram Moolenaar &ts = g:astring 937e859312eSBram Moolenaar catch /E1029:/ 938e859312eSBram Moolenaar n = 288 939e859312eSBram Moolenaar endtry 940e859312eSBram Moolenaar assert_equal(288, n) 941e859312eSBram Moolenaar 942e859312eSBram Moolenaar try 943e859312eSBram Moolenaar &backspace = 'asdf' 944e859312eSBram Moolenaar catch /E474:/ 945e859312eSBram Moolenaar n = 299 946e859312eSBram Moolenaar endtry 947e859312eSBram Moolenaar assert_equal(299, n) 948e859312eSBram Moolenaar 949e859312eSBram Moolenaar l = [1] 950e859312eSBram Moolenaar try 951e859312eSBram Moolenaar l[3] = 3 952e859312eSBram Moolenaar catch /E684:/ 953e859312eSBram Moolenaar n = 300 954e859312eSBram Moolenaar endtry 955e859312eSBram Moolenaar assert_equal(300, n) 956e859312eSBram Moolenaar 957e859312eSBram Moolenaar try 958e859312eSBram Moolenaar unlet g:does_not_exist 959e859312eSBram Moolenaar catch /E108:/ 960e859312eSBram Moolenaar n = 322 961e859312eSBram Moolenaar endtry 962e859312eSBram Moolenaar assert_equal(322, n) 963e859312eSBram Moolenaar 964e859312eSBram Moolenaar try 965e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 966e859312eSBram Moolenaar catch /E721:/ 967e859312eSBram Moolenaar n = 333 968e859312eSBram Moolenaar endtry 969e859312eSBram Moolenaar assert_equal(333, n) 970e859312eSBram Moolenaar 971e859312eSBram Moolenaar try 972e859312eSBram Moolenaar l = DeletedFunc() 973e859312eSBram Moolenaar catch /E933:/ 974e859312eSBram Moolenaar n = 344 975e859312eSBram Moolenaar endtry 976e859312eSBram Moolenaar assert_equal(344, n) 977d032f34aSBram Moolenaar 978d032f34aSBram Moolenaar try 979d032f34aSBram Moolenaar echo len(v:true) 980d032f34aSBram Moolenaar catch /E701:/ 981d032f34aSBram Moolenaar n = 355 982d032f34aSBram Moolenaar endtry 983d032f34aSBram Moolenaar assert_equal(355, n) 984d032f34aSBram Moolenaar 985d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 986d032f34aSBram Moolenaar delfunc g:NoSuchFunc 987d032f34aSBram Moolenaar try 988d032f34aSBram Moolenaar echo P() 989d032f34aSBram Moolenaar catch /E117:/ 990d032f34aSBram Moolenaar n = 366 991d032f34aSBram Moolenaar endtry 992d032f34aSBram Moolenaar assert_equal(366, n) 993d032f34aSBram Moolenaar 994d032f34aSBram Moolenaar try 995d032f34aSBram Moolenaar echo g:NoSuchFunc() 996d032f34aSBram Moolenaar catch /E117:/ 997d032f34aSBram Moolenaar n = 377 998d032f34aSBram Moolenaar endtry 999d032f34aSBram Moolenaar assert_equal(377, n) 1000d032f34aSBram Moolenaar 1001d032f34aSBram Moolenaar try 1002d032f34aSBram Moolenaar echo g:alist + 4 1003d032f34aSBram Moolenaar catch /E745:/ 1004d032f34aSBram Moolenaar n = 388 1005d032f34aSBram Moolenaar endtry 1006d032f34aSBram Moolenaar assert_equal(388, n) 1007d032f34aSBram Moolenaar 1008d032f34aSBram Moolenaar try 1009d032f34aSBram Moolenaar echo 4 + g:alist 1010d032f34aSBram Moolenaar catch /E745:/ 1011d032f34aSBram Moolenaar n = 399 1012d032f34aSBram Moolenaar endtry 1013d032f34aSBram Moolenaar assert_equal(399, n) 1014d032f34aSBram Moolenaar 1015d032f34aSBram Moolenaar try 1016d032f34aSBram Moolenaar echo g:alist.member 1017d032f34aSBram Moolenaar catch /E715:/ 1018d032f34aSBram Moolenaar n = 400 1019d032f34aSBram Moolenaar endtry 1020d032f34aSBram Moolenaar assert_equal(400, n) 1021d032f34aSBram Moolenaar 1022d032f34aSBram Moolenaar try 1023d032f34aSBram Moolenaar echo d.member 1024d032f34aSBram Moolenaar catch /E716:/ 1025d032f34aSBram Moolenaar n = 411 1026d032f34aSBram Moolenaar endtry 1027d032f34aSBram Moolenaar assert_equal(411, n) 10288a7d6542SBram Moolenaarenddef 10298a7d6542SBram Moolenaar 1030e859312eSBram Moolenaardef DeletedFunc(): list<any> 1031e859312eSBram Moolenaar return ['delete me'] 1032e859312eSBram Moolenaarenddef 1033e859312eSBram Moolenaardefcompile 1034e859312eSBram Moolenaardelfunc DeletedFunc 1035e859312eSBram Moolenaar 1036257cc5eeSBram Moolenaardef ThrowFromDef() 1037a72cfb80SBram Moolenaar throw "getout" # comment 1038257cc5eeSBram Moolenaarenddef 1039257cc5eeSBram Moolenaar 1040257cc5eeSBram Moolenaarfunc CatchInFunc() 1041257cc5eeSBram Moolenaar try 1042257cc5eeSBram Moolenaar call ThrowFromDef() 1043257cc5eeSBram Moolenaar catch 1044257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1045257cc5eeSBram Moolenaar endtry 1046257cc5eeSBram Moolenaarendfunc 1047257cc5eeSBram Moolenaar 1048257cc5eeSBram Moolenaardef CatchInDef() 1049257cc5eeSBram Moolenaar try 1050257cc5eeSBram Moolenaar ThrowFromDef() 1051257cc5eeSBram Moolenaar catch 1052257cc5eeSBram Moolenaar g:thrown_def = v:exception 1053257cc5eeSBram Moolenaar endtry 1054257cc5eeSBram Moolenaarenddef 1055257cc5eeSBram Moolenaar 1056f575adffSBram Moolenaardef ReturnFinally(): string 1057f575adffSBram Moolenaar try 1058f575adffSBram Moolenaar return 'intry' 1059f575adffSBram Moolenaar finally 1060f575adffSBram Moolenaar g:in_finally = 'finally' 1061f575adffSBram Moolenaar endtry 1062f575adffSBram Moolenaar return 'end' 1063f575adffSBram Moolenaarenddef 1064f575adffSBram Moolenaar 1065257cc5eeSBram Moolenaardef Test_try_catch_nested() 1066257cc5eeSBram Moolenaar CatchInFunc() 1067257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1068257cc5eeSBram Moolenaar 1069257cc5eeSBram Moolenaar CatchInDef() 1070257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1071f575adffSBram Moolenaar 1072f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1073f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1074f575adffSBram Moolenaarenddef 1075f575adffSBram Moolenaar 1076f575adffSBram Moolenaardef Test_try_catch_match() 1077f575adffSBram Moolenaar let seq = 'a' 1078f575adffSBram Moolenaar try 1079f575adffSBram Moolenaar throw 'something' 1080f575adffSBram Moolenaar catch /nothing/ 1081f575adffSBram Moolenaar seq ..= 'x' 1082f575adffSBram Moolenaar catch /some/ 1083f575adffSBram Moolenaar seq ..= 'b' 1084f575adffSBram Moolenaar catch /asdf/ 1085f575adffSBram Moolenaar seq ..= 'x' 1086e8c4abbbSBram Moolenaar catch ?a\?sdf? 1087e8c4abbbSBram Moolenaar seq ..= 'y' 1088f575adffSBram Moolenaar finally 1089f575adffSBram Moolenaar seq ..= 'c' 1090f575adffSBram Moolenaar endtry 1091f575adffSBram Moolenaar assert_equal('abc', seq) 1092257cc5eeSBram Moolenaarenddef 1093257cc5eeSBram Moolenaar 1094e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1095d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1096d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1097d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1098d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1099d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1100d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1101d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1102d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1103d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1104d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1105585fea7bSBram Moolenaar 1106d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1107d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1108e8c4abbbSBram Moolenaarenddef 1109e8c4abbbSBram Moolenaar 1110006ad48bSBram Moolenaardef Test_throw_vimscript() 1111f5be8cdbSBram Moolenaar # only checks line continuation 1112006ad48bSBram Moolenaar let lines =<< trim END 1113006ad48bSBram Moolenaar vim9script 1114006ad48bSBram Moolenaar try 1115006ad48bSBram Moolenaar throw 'one' 1116006ad48bSBram Moolenaar .. 'two' 1117006ad48bSBram Moolenaar catch 1118006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1119006ad48bSBram Moolenaar endtry 1120006ad48bSBram Moolenaar END 1121006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1122006ad48bSBram Moolenaarenddef 1123006ad48bSBram Moolenaar 1124ed677f55SBram Moolenaardef Test_error_in_nested_function() 1125ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1126ed677f55SBram Moolenaar let lines =<< trim END 1127ed677f55SBram Moolenaar vim9script 1128ed677f55SBram Moolenaar def Func() 1129ed677f55SBram Moolenaar Error() 1130ed677f55SBram Moolenaar g:test_var = 1 1131ed677f55SBram Moolenaar enddef 1132ed677f55SBram Moolenaar func Error() abort 1133ed677f55SBram Moolenaar eval [][0] 1134ed677f55SBram Moolenaar endfunc 1135ed677f55SBram Moolenaar Func() 1136ed677f55SBram Moolenaar END 1137ed677f55SBram Moolenaar g:test_var = 0 1138ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1139ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1140ed677f55SBram Moolenaarenddef 1141ed677f55SBram Moolenaar 114237c83711SBram Moolenaardef Test_cexpr_vimscript() 1143f5be8cdbSBram Moolenaar # only checks line continuation 114437c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 114537c83711SBram Moolenaar let lines =<< trim END 114637c83711SBram Moolenaar vim9script 114737c83711SBram Moolenaar cexpr 'File' 114837c83711SBram Moolenaar .. ' someFile' .. 114937c83711SBram Moolenaar ' line 19' 115037c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 115137c83711SBram Moolenaar END 115237c83711SBram Moolenaar CheckScriptSuccess(lines) 115337c83711SBram Moolenaar set errorformat& 115437c83711SBram Moolenaarenddef 115537c83711SBram Moolenaar 1156c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1157c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1158c9edd6b5SBram Moolenaar let lines =<< trim END 1159c9edd6b5SBram Moolenaar vim9script 1160c9edd6b5SBram Moolenaar func g:Status() 1161c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1162c9edd6b5SBram Moolenaar endfunc 1163c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1164c9edd6b5SBram Moolenaar redrawstatus 1165c9edd6b5SBram Moolenaar set laststatus statusline= 1166c9edd6b5SBram Moolenaar END 1167c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1168c9edd6b5SBram Moolenaarenddef 1169c9edd6b5SBram Moolenaar 1170b209750bSBram Moolenaardef Test_list_vimscript() 1171b209750bSBram Moolenaar # checks line continuation and comments 1172b209750bSBram Moolenaar let lines =<< trim END 1173b209750bSBram Moolenaar vim9script 1174b209750bSBram Moolenaar let mylist = [ 1175b209750bSBram Moolenaar 'one', 1176b209750bSBram Moolenaar # comment 1177b209750bSBram Moolenaar 'two', # empty line follows 1178b209750bSBram Moolenaar 1179b209750bSBram Moolenaar 'three', 1180b209750bSBram Moolenaar ] 1181b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1182b209750bSBram Moolenaar END 1183b209750bSBram Moolenaar CheckScriptSuccess(lines) 118466250c93SBram Moolenaar 118566250c93SBram Moolenaar # check all lines from heredoc are kept 118666250c93SBram Moolenaar lines =<< trim END 118766250c93SBram Moolenaar # comment 1 118866250c93SBram Moolenaar two 118966250c93SBram Moolenaar # comment 3 119066250c93SBram Moolenaar 119166250c93SBram Moolenaar five 119266250c93SBram Moolenaar # comment 6 119366250c93SBram Moolenaar END 119466250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1195b209750bSBram Moolenaarenddef 1196b209750bSBram Moolenaar 11972a1381c3SBram Moolenaarif has('channel') 119840ee466cSBram Moolenaar let someJob = test_null_job() 119940ee466cSBram Moolenaar 120040ee466cSBram Moolenaar def FuncWithError() 120140ee466cSBram Moolenaar echomsg g:someJob 120240ee466cSBram Moolenaar enddef 120340ee466cSBram Moolenaar 120440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 120540ee466cSBram Moolenaar try 120640ee466cSBram Moolenaar call FuncWithError() 120740ee466cSBram Moolenaar catch 120840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 120940ee466cSBram Moolenaar endtry 121040ee466cSBram Moolenaar endfunc 12112a1381c3SBram Moolenaarendif 121240ee466cSBram Moolenaar 12138a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 12148a7d6542SBram Moolenaar vim9script 12158a7d6542SBram Moolenaar let name: string = 'bob' 12168a7d6542SBram Moolenaar def Concat(arg: string): string 12178a7d6542SBram Moolenaar return name .. arg 12188a7d6542SBram Moolenaar enddef 1219227a69deSBram Moolenaar g:result = Concat('bie') 1220227a69deSBram Moolenaar g:localname = name 12218a7d6542SBram Moolenaar 12228a7d6542SBram Moolenaar export const CONST = 1234 12238a7d6542SBram Moolenaar export let exported = 9876 12246e587dcbSBram Moolenaar export let exp_name = 'John' 12258a7d6542SBram Moolenaar export def Exported(): string 12268a7d6542SBram Moolenaar return 'Exported' 12278a7d6542SBram Moolenaar enddef 12288a7d6542SBram MoolenaarEND 12298a7d6542SBram Moolenaar 1230b3ca9824SBram Moolenaardef Undo_export_script_lines() 1231b3ca9824SBram Moolenaar unlet g:result 1232b3ca9824SBram Moolenaar unlet g:localname 1233b3ca9824SBram Moolenaarenddef 1234b3ca9824SBram Moolenaar 12355269bd2aSBram Moolenaardef Test_vim9_import_export() 12368a7d6542SBram Moolenaar let import_script_lines =<< trim END 12378a7d6542SBram Moolenaar vim9script 12388a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 12398a7d6542SBram Moolenaar g:imported = exported 12406e587dcbSBram Moolenaar exported += 3 12416e587dcbSBram Moolenaar g:imported_added = exported 12428a7d6542SBram Moolenaar g:imported_func = Exported() 12436e587dcbSBram Moolenaar 124440f4f7a4SBram Moolenaar def GetExported(): string 124540f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 124640f4f7a4SBram Moolenaar return local_dict.ref() 124740f4f7a4SBram Moolenaar enddef 124840f4f7a4SBram Moolenaar g:funcref_result = GetExported() 124940f4f7a4SBram Moolenaar 12506e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 12516e587dcbSBram Moolenaar g:imported_name = exp_name 12526e587dcbSBram Moolenaar exp_name ..= ' Doe' 12536e587dcbSBram Moolenaar g:imported_name_appended = exp_name 12545381c7a1SBram Moolenaar g:imported_later = exported 12558a7d6542SBram Moolenaar END 12568a7d6542SBram Moolenaar 12578a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 12588a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 12598a7d6542SBram Moolenaar 12608a7d6542SBram Moolenaar source Ximport.vim 12618a7d6542SBram Moolenaar 12628a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 12638a7d6542SBram Moolenaar assert_equal('bob', g:localname) 12648a7d6542SBram Moolenaar assert_equal(9876, g:imported) 12656e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 12665381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 12678a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 126840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 12696e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 12706e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 12718a7d6542SBram Moolenaar assert_false(exists('g:name')) 12728a7d6542SBram Moolenaar 1273b3ca9824SBram Moolenaar Undo_export_script_lines() 12748a7d6542SBram Moolenaar unlet g:imported 12756e587dcbSBram Moolenaar unlet g:imported_added 12765381c7a1SBram Moolenaar unlet g:imported_later 12778a7d6542SBram Moolenaar unlet g:imported_func 12786e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 12798a7d6542SBram Moolenaar delete('Ximport.vim') 1280f2d5c240SBram Moolenaar 12811c991144SBram Moolenaar # similar, with line breaks 12821c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 12831c991144SBram Moolenaar vim9script 12841c991144SBram Moolenaar import { 12851c991144SBram Moolenaar exported, 12861c991144SBram Moolenaar Exported, 12871c991144SBram Moolenaar } 12881c991144SBram Moolenaar from 12891c991144SBram Moolenaar './Xexport.vim' 12901c991144SBram Moolenaar g:imported = exported 12911c991144SBram Moolenaar exported += 5 12921c991144SBram Moolenaar g:imported_added = exported 12931c991144SBram Moolenaar g:imported_func = Exported() 12941c991144SBram Moolenaar END 12951c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 12961c991144SBram Moolenaar source Ximport_lbr.vim 12971c991144SBram Moolenaar 12981c991144SBram Moolenaar assert_equal(9876, g:imported) 12991c991144SBram Moolenaar assert_equal(9881, g:imported_added) 13001c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 13011c991144SBram Moolenaar 13021c991144SBram Moolenaar # exported script not sourced again 13031c991144SBram Moolenaar assert_false(exists('g:result')) 13041c991144SBram Moolenaar unlet g:imported 13051c991144SBram Moolenaar unlet g:imported_added 13061c991144SBram Moolenaar unlet g:imported_func 13071c991144SBram Moolenaar delete('Ximport_lbr.vim') 13081c991144SBram Moolenaar 13091c991144SBram Moolenaar # import inside :def function 13105381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 13115381c7a1SBram Moolenaar vim9script 13125381c7a1SBram Moolenaar def ImportInDef() 13135381c7a1SBram Moolenaar import exported from './Xexport.vim' 13145381c7a1SBram Moolenaar g:imported = exported 13155381c7a1SBram Moolenaar exported += 7 13165381c7a1SBram Moolenaar g:imported_added = exported 13175381c7a1SBram Moolenaar enddef 13185381c7a1SBram Moolenaar ImportInDef() 13195381c7a1SBram Moolenaar END 13205381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 13215381c7a1SBram Moolenaar source Ximport2.vim 1322f5be8cdbSBram Moolenaar # TODO: this should be 9879 13235381c7a1SBram Moolenaar assert_equal(9876, g:imported) 13245381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 13255381c7a1SBram Moolenaar unlet g:imported 13265381c7a1SBram Moolenaar unlet g:imported_added 13275381c7a1SBram Moolenaar delete('Ximport2.vim') 13285381c7a1SBram Moolenaar 1329f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1330f2d5c240SBram Moolenaar vim9script 1331f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1332f2d5c240SBram Moolenaar def UseExport() 1333f2d5c240SBram Moolenaar g:imported = Export.exported 1334f2d5c240SBram Moolenaar enddef 1335f2d5c240SBram Moolenaar UseExport() 1336f2d5c240SBram Moolenaar END 1337f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1338f2d5c240SBram Moolenaar source Ximport.vim 13395381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1340f2d5c240SBram Moolenaar 1341599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1342599c89c8SBram Moolenaar vim9script 1343599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1344599c89c8SBram Moolenaar def Func() 1345599c89c8SBram Moolenaar let dummy = 1 1346599c89c8SBram Moolenaar let imported = Export + dummy 1347599c89c8SBram Moolenaar enddef 1348822ba247SBram Moolenaar defcompile 1349599c89c8SBram Moolenaar END 1350599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 135144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1352599c89c8SBram Moolenaar 1353599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1354599c89c8SBram Moolenaar vim9script 1355599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1356599c89c8SBram Moolenaar def Func() 1357599c89c8SBram Moolenaar let imported = Export . exported 1358599c89c8SBram Moolenaar enddef 1359822ba247SBram Moolenaar defcompile 1360599c89c8SBram Moolenaar END 1361599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 136244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1363599c89c8SBram Moolenaar 1364599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1365599c89c8SBram Moolenaar vim9script 1366599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1367599c89c8SBram Moolenaar def Func() 1368599c89c8SBram Moolenaar let imported = Export. 1369599c89c8SBram Moolenaar enddef 1370822ba247SBram Moolenaar defcompile 1371599c89c8SBram Moolenaar END 1372599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 137344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1374599c89c8SBram Moolenaar 13751c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 13761c991144SBram Moolenaar vim9script 13771c991144SBram Moolenaar import * 13781c991144SBram Moolenaar as Export 13791c991144SBram Moolenaar from 13801c991144SBram Moolenaar './Xexport.vim' 13811c991144SBram Moolenaar def UseExport() 13821c991144SBram Moolenaar g:imported = Export.exported 13831c991144SBram Moolenaar enddef 13841c991144SBram Moolenaar UseExport() 13851c991144SBram Moolenaar END 13861c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13871c991144SBram Moolenaar source Ximport.vim 13881c991144SBram Moolenaar assert_equal(9883, g:imported) 13891c991144SBram Moolenaar 1390f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1391f2d5c240SBram Moolenaar vim9script 1392f2d5c240SBram Moolenaar import * from './Xexport.vim' 1393f2d5c240SBram Moolenaar END 1394f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 139544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1396f2d5c240SBram Moolenaar 1397f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1398fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1399fa29c8abSBram Moolenaar vim9script 1400fa29c8abSBram Moolenaar import name from './Xexport.vim' 1401fa29c8abSBram Moolenaar END 1402fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 140344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1404fa29c8abSBram Moolenaar 1405f5be8cdbSBram Moolenaar # try to import something that is already defined 14065269bd2aSBram Moolenaar let import_already_defined =<< trim END 14075269bd2aSBram Moolenaar vim9script 14085269bd2aSBram Moolenaar let exported = 'something' 14095269bd2aSBram Moolenaar import exported from './Xexport.vim' 14105269bd2aSBram Moolenaar END 14115269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 141244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14135269bd2aSBram Moolenaar 1414f5be8cdbSBram Moolenaar # try to import something that is already defined 14155269bd2aSBram Moolenaar import_already_defined =<< trim END 14165269bd2aSBram Moolenaar vim9script 14175269bd2aSBram Moolenaar let exported = 'something' 14185269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 14195269bd2aSBram Moolenaar END 14205269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 142144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14225269bd2aSBram Moolenaar 1423f5be8cdbSBram Moolenaar # try to import something that is already defined 14245269bd2aSBram Moolenaar import_already_defined =<< trim END 14255269bd2aSBram Moolenaar vim9script 14265269bd2aSBram Moolenaar let exported = 'something' 14275269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 14285269bd2aSBram Moolenaar END 14295269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 143044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14315269bd2aSBram Moolenaar 1432f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1433fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1434fa29c8abSBram Moolenaar vim9script 1435fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1436fa29c8abSBram Moolenaar END 1437fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 143844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1439fa29c8abSBram Moolenaar 1440fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1441fa29c8abSBram Moolenaar vim9script 1442fa29c8abSBram Moolenaar import name './Xexport.vim' 1443fa29c8abSBram Moolenaar END 1444fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 144544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1446fa29c8abSBram Moolenaar 1447fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1448fa29c8abSBram Moolenaar vim9script 1449fa29c8abSBram Moolenaar import name from Xexport.vim 1450fa29c8abSBram Moolenaar END 1451fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 145244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1453fa29c8abSBram Moolenaar 1454fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1455fa29c8abSBram Moolenaar vim9script 1456fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1457fa29c8abSBram Moolenaar END 1458fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 145944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1460fa29c8abSBram Moolenaar 1461fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1462fa29c8abSBram Moolenaar vim9script 1463fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1464fa29c8abSBram Moolenaar END 14655269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 146644d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1467fa29c8abSBram Moolenaar 1468f2d5c240SBram Moolenaar delete('Ximport.vim') 14695269bd2aSBram Moolenaar delete('Ximport3.vim') 14708a7d6542SBram Moolenaar delete('Xexport.vim') 14718a7d6542SBram Moolenaar 1472f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1473750802b5SBram Moolenaar set cpo&vi 1474750802b5SBram Moolenaar let cpo_before = &cpo 1475750802b5SBram Moolenaar let lines =<< trim END 1476750802b5SBram Moolenaar vim9script 1477750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1478750802b5SBram Moolenaar END 1479750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1480750802b5SBram Moolenaar source Xvim9_script 1481750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1482750802b5SBram Moolenaar set cpo&vim 1483750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1484750802b5SBram Moolenaar delete('Xvim9_script') 1485750802b5SBram Moolenaarenddef 1486750802b5SBram Moolenaar 1487803af686SBram Moolenaarfunc g:Trigger() 1488803af686SBram Moolenaar source Ximport.vim 1489803af686SBram Moolenaar return "echo 'yes'\<CR>" 1490803af686SBram Moolenaarendfunc 1491803af686SBram Moolenaar 1492803af686SBram Moolenaardef Test_import_export_expr_map() 1493803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1494803af686SBram Moolenaar let export_lines =<< trim END 1495803af686SBram Moolenaar vim9script 1496803af686SBram Moolenaar export def That(): string 1497803af686SBram Moolenaar return 'yes' 1498803af686SBram Moolenaar enddef 1499803af686SBram Moolenaar END 1500803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1501803af686SBram Moolenaar 1502803af686SBram Moolenaar let import_lines =<< trim END 1503803af686SBram Moolenaar vim9script 1504803af686SBram Moolenaar import That from './Xexport_that.vim' 1505803af686SBram Moolenaar assert_equal('yes', That()) 1506803af686SBram Moolenaar END 1507803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1508803af686SBram Moolenaar 1509803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1510803af686SBram Moolenaar feedkeys('trigger', "xt") 1511803af686SBram Moolenaar 1512730b2483SBram Moolenaar delete('Xexport_that.vim') 1513803af686SBram Moolenaar delete('Ximport.vim') 1514803af686SBram Moolenaar nunmap trigger 1515803af686SBram Moolenaarenddef 1516803af686SBram Moolenaar 15178e1986e3SBram Moolenaardef Test_import_in_filetype() 15188e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15198e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 15208e1986e3SBram Moolenaar let export_lines =<< trim END 15218e1986e3SBram Moolenaar vim9script 15228e1986e3SBram Moolenaar export let That = 'yes' 15238e1986e3SBram Moolenaar END 1524730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15258e1986e3SBram Moolenaar 15268e1986e3SBram Moolenaar let import_lines =<< trim END 15278e1986e3SBram Moolenaar vim9script 1528730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15298e1986e3SBram Moolenaar assert_equal('yes', That) 15308e1986e3SBram Moolenaar g:did_load_mytpe = 1 15318e1986e3SBram Moolenaar END 15328e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15338e1986e3SBram Moolenaar 15348e1986e3SBram Moolenaar let save_rtp = &rtp 15358e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15368e1986e3SBram Moolenaar 15378e1986e3SBram Moolenaar filetype plugin on 15388e1986e3SBram Moolenaar copen 15398e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15408e1986e3SBram Moolenaar 15418e1986e3SBram Moolenaar quit! 1542730b2483SBram Moolenaar delete('Xexport_ft.vim') 15438e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15448e1986e3SBram Moolenaar &rtp = save_rtp 15458e1986e3SBram Moolenaarenddef 15468e1986e3SBram Moolenaar 1547efa94447SBram Moolenaardef Test_use_import_in_mapping() 1548efa94447SBram Moolenaar let lines =<< trim END 1549efa94447SBram Moolenaar vim9script 1550efa94447SBram Moolenaar export def Funcx() 1551efa94447SBram Moolenaar g:result = 42 1552efa94447SBram Moolenaar enddef 1553efa94447SBram Moolenaar END 1554efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1555efa94447SBram Moolenaar lines =<< trim END 1556efa94447SBram Moolenaar vim9script 1557efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1558b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1559efa94447SBram Moolenaar END 1560efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1561efa94447SBram Moolenaar 1562efa94447SBram Moolenaar source Xmapscript.vim 1563b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1564efa94447SBram Moolenaar assert_equal(42, g:result) 1565efa94447SBram Moolenaar 1566efa94447SBram Moolenaar unlet g:result 1567efa94447SBram Moolenaar delete('XsomeExport.vim') 1568efa94447SBram Moolenaar delete('Xmapscript.vim') 1569b3ca9824SBram Moolenaar nunmap <F3> 1570efa94447SBram Moolenaarenddef 1571efa94447SBram Moolenaar 1572750802b5SBram Moolenaardef Test_vim9script_fails() 15738a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15748a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1575750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 15769721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 15779b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1578750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1579750802b5SBram Moolenaar 1580451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1581c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1582c785b9a7SBram Moolenaar 1583e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1584e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15858a7d6542SBram Moolenaarenddef 15868a7d6542SBram Moolenaar 1587f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1588101f4810SBram Moolenaar CheckRunVimInTerminal 1589101f4810SBram Moolenaar 15909bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1591c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15929bb3eb3eSBram Moolenaarendfunc 15939bb3eb3eSBram Moolenaar 1594c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1595101f4810SBram Moolenaar let export =<< trim END 1596101f4810SBram Moolenaar vim9script 1597101f4810SBram Moolenaar export def Foo(): number 1598101f4810SBram Moolenaar return 0 1599101f4810SBram Moolenaar enddef 1600101f4810SBram Moolenaar END 1601730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1602101f4810SBram Moolenaar 1603730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 16049bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16059bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1606101f4810SBram Moolenaar 1607730b2483SBram Moolenaar delete('XexportCmd.vim') 16089bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16099bb3eb3eSBram Moolenaarenddef 1610101f4810SBram Moolenaar 16114c17ad94SBram Moolenaardef Test_vim9script_reload_import() 16128a7d6542SBram Moolenaar let lines =<< trim END 16138a7d6542SBram Moolenaar vim9script 16148a7d6542SBram Moolenaar const var = '' 16158a7d6542SBram Moolenaar let valone = 1234 16168a7d6542SBram Moolenaar def MyFunc(arg: string) 16178a7d6542SBram Moolenaar valone = 5678 16188a7d6542SBram Moolenaar enddef 16198a7d6542SBram Moolenaar END 16208a7d6542SBram Moolenaar let morelines =<< trim END 16218a7d6542SBram Moolenaar let valtwo = 222 16228a7d6542SBram Moolenaar export def GetValtwo(): number 16238a7d6542SBram Moolenaar return valtwo 16248a7d6542SBram Moolenaar enddef 16258a7d6542SBram Moolenaar END 162603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16278a7d6542SBram Moolenaar source Xreload.vim 16288a7d6542SBram Moolenaar source Xreload.vim 16298a7d6542SBram Moolenaar source Xreload.vim 16308a7d6542SBram Moolenaar 16318a7d6542SBram Moolenaar let testlines =<< trim END 16328a7d6542SBram Moolenaar vim9script 16338a7d6542SBram Moolenaar def TheFunc() 16348a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16358a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16368a7d6542SBram Moolenaar enddef 16378a7d6542SBram Moolenaar TheFunc() 16388a7d6542SBram Moolenaar END 16398a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16408a7d6542SBram Moolenaar source Ximport.vim 16418a7d6542SBram Moolenaar 1642f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1643f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16448a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16458a7d6542SBram Moolenaar source Ximport.vim 16468a7d6542SBram Moolenaar 1647f5be8cdbSBram Moolenaar # cannot declare a var twice 16488a7d6542SBram Moolenaar lines =<< trim END 16498a7d6542SBram Moolenaar vim9script 16508a7d6542SBram Moolenaar let valone = 1234 16518a7d6542SBram Moolenaar let valone = 5678 16528a7d6542SBram Moolenaar END 16538a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 165444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16558a7d6542SBram Moolenaar 16568a7d6542SBram Moolenaar delete('Xreload.vim') 16578a7d6542SBram Moolenaar delete('Ximport.vim') 16588a7d6542SBram Moolenaarenddef 16598a7d6542SBram Moolenaar 166095006e3dSBram Moolenaardef s:RetSome(): string 166195006e3dSBram Moolenaar return 'some' 166295006e3dSBram Moolenaarenddef 166395006e3dSBram Moolenaar 1664fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1665fe465a01SBram Moolenaar" script-local name. 1666fe465a01SBram Moolenaardef Test_vim9script_funcref() 1667fe465a01SBram Moolenaar let sortlines =<< trim END 1668fe465a01SBram Moolenaar vim9script 1669fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1670bed36b93SBram Moolenaar return i2 - i1 1671fe465a01SBram Moolenaar enddef 1672fe465a01SBram Moolenaar 1673fe465a01SBram Moolenaar export def FastSort(): list<number> 1674fe465a01SBram Moolenaar return range(5)->sort(Compare) 1675fe465a01SBram Moolenaar enddef 1676fe465a01SBram Moolenaar END 1677fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1678fe465a01SBram Moolenaar 1679fe465a01SBram Moolenaar let lines =<< trim END 1680fe465a01SBram Moolenaar vim9script 1681fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1682fe465a01SBram Moolenaar def Test() 1683fe465a01SBram Moolenaar g:result = FastSort() 1684fe465a01SBram Moolenaar enddef 1685fe465a01SBram Moolenaar Test() 1686fe465a01SBram Moolenaar END 1687fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1688fe465a01SBram Moolenaar 1689fe465a01SBram Moolenaar source Xscript.vim 1690fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1691fe465a01SBram Moolenaar 1692fe465a01SBram Moolenaar unlet g:result 1693fe465a01SBram Moolenaar delete('Xsort.vim') 1694fe465a01SBram Moolenaar delete('Xscript.vim') 169595006e3dSBram Moolenaar 169695006e3dSBram Moolenaar let Funcref = function('s:RetSome') 169795006e3dSBram Moolenaar assert_equal('some', Funcref()) 1698fe465a01SBram Moolenaarenddef 1699fe465a01SBram Moolenaar 1700601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1701601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1702601e76acSBram Moolenaar" function reference. 1703c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1704c620c055SBram Moolenaar let filterLines =<< trim END 1705c620c055SBram Moolenaar vim9script 1706c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1707c620c055SBram Moolenaar return idx % 2 == 1 1708c620c055SBram Moolenaar enddef 1709c620c055SBram Moolenaar export def FastFilter(): list<number> 1710c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1711c620c055SBram Moolenaar enddef 1712601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1713601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1714601e76acSBram Moolenaar enddef 1715c620c055SBram Moolenaar END 1716c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1717c620c055SBram Moolenaar 1718c620c055SBram Moolenaar let lines =<< trim END 1719c620c055SBram Moolenaar vim9script 1720601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1721c620c055SBram Moolenaar def Test() 1722c620c055SBram Moolenaar let x: list<number> = FastFilter() 1723c620c055SBram Moolenaar enddef 1724c620c055SBram Moolenaar Test() 1725601e76acSBram Moolenaar def TestDirect() 1726601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1727601e76acSBram Moolenaar enddef 1728601e76acSBram Moolenaar TestDirect() 1729c620c055SBram Moolenaar END 1730601e76acSBram Moolenaar CheckScriptSuccess(lines) 1731c620c055SBram Moolenaar delete('Xfilter.vim') 1732c620c055SBram Moolenaarenddef 1733c620c055SBram Moolenaar 17344c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17354c17ad94SBram Moolenaar let first_lines =<< trim END 17364c17ad94SBram Moolenaar vim9script 17374c17ad94SBram Moolenaar def FuncYes(): string 17384c17ad94SBram Moolenaar return 'yes' 17394c17ad94SBram Moolenaar enddef 17404c17ad94SBram Moolenaar END 174103afdcf1SBram Moolenaar let withno_lines =<< trim END 17424c17ad94SBram Moolenaar def FuncNo(): string 17434c17ad94SBram Moolenaar return 'no' 17444c17ad94SBram Moolenaar enddef 17454c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17464c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17474c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 174803afdcf1SBram Moolenaar enddef 174903afdcf1SBram Moolenaar END 175003afdcf1SBram Moolenaar let nono_lines =<< trim END 175103afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 175203afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 175344d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17544c17ad94SBram Moolenaar enddef 17554c17ad94SBram Moolenaar END 17564c17ad94SBram Moolenaar 17574c17ad94SBram Moolenaar # FuncNo() is defined 175803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17594c17ad94SBram Moolenaar source Xreloaded.vim 17604c17ad94SBram Moolenaar g:DoCheck(true) 17614c17ad94SBram Moolenaar 17624c17ad94SBram Moolenaar # FuncNo() is not redefined 176303afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17644c17ad94SBram Moolenaar source Xreloaded.vim 176503afdcf1SBram Moolenaar g:DoCheck() 17664c17ad94SBram Moolenaar 17674c17ad94SBram Moolenaar # FuncNo() is back 176803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17694c17ad94SBram Moolenaar source Xreloaded.vim 177003afdcf1SBram Moolenaar g:DoCheck() 17714c17ad94SBram Moolenaar 17724c17ad94SBram Moolenaar delete('Xreloaded.vim') 17734c17ad94SBram Moolenaarenddef 17744c17ad94SBram Moolenaar 177589483d40SBram Moolenaardef Test_vim9script_reload_delvar() 177689483d40SBram Moolenaar # write the script with a script-local variable 177789483d40SBram Moolenaar let lines =<< trim END 177889483d40SBram Moolenaar vim9script 177989483d40SBram Moolenaar let var = 'string' 178089483d40SBram Moolenaar END 178189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 178289483d40SBram Moolenaar source XreloadVar.vim 178389483d40SBram Moolenaar 178489483d40SBram Moolenaar # now write the script using the same variable locally - works 178589483d40SBram Moolenaar lines =<< trim END 178689483d40SBram Moolenaar vim9script 178789483d40SBram Moolenaar def Func() 178889483d40SBram Moolenaar let var = 'string' 178989483d40SBram Moolenaar enddef 179089483d40SBram Moolenaar END 179189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 179289483d40SBram Moolenaar source XreloadVar.vim 179389483d40SBram Moolenaar 179489483d40SBram Moolenaar delete('XreloadVar.vim') 179589483d40SBram Moolenaarenddef 179689483d40SBram Moolenaar 17978a7d6542SBram Moolenaardef Test_import_absolute() 17988a7d6542SBram Moolenaar let import_lines = [ 1799e6085c53SBram Moolenaar 'vim9script', 1800e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1801e6085c53SBram Moolenaar 'def UseExported()', 1802e6085c53SBram Moolenaar ' g:imported_abs = exported', 1803e6085c53SBram Moolenaar ' exported = 8888', 1804e6085c53SBram Moolenaar ' g:imported_after = exported', 1805e6085c53SBram Moolenaar 'enddef', 1806e6085c53SBram Moolenaar 'UseExported()', 1807e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1808e6085c53SBram Moolenaar ] 18098a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18108a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18118a7d6542SBram Moolenaar 18128a7d6542SBram Moolenaar source Ximport_abs.vim 18138a7d6542SBram Moolenaar 18148a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18154e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1816675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1817675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1818675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1819675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1820675f716eSBram Moolenaar 'exported = 8888.*' .. 1821675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1822675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1823675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1824675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1825e6085c53SBram Moolenaar g:import_disassembled) 1826b3ca9824SBram Moolenaar 1827b3ca9824SBram Moolenaar Undo_export_script_lines() 18288a7d6542SBram Moolenaar unlet g:imported_abs 18294e12a5dfSBram Moolenaar unlet g:import_disassembled 18308a7d6542SBram Moolenaar 18318a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18328a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18338a7d6542SBram Moolenaarenddef 18348a7d6542SBram Moolenaar 18358a7d6542SBram Moolenaardef Test_import_rtp() 18368a7d6542SBram Moolenaar let import_lines = [ 1837e6085c53SBram Moolenaar 'vim9script', 1838e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1839e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1840e6085c53SBram Moolenaar ] 18418a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18428a7d6542SBram Moolenaar mkdir('import') 18438a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18448a7d6542SBram Moolenaar 18458a7d6542SBram Moolenaar let save_rtp = &rtp 18468a7d6542SBram Moolenaar &rtp = getcwd() 18478a7d6542SBram Moolenaar source Ximport_rtp.vim 18488a7d6542SBram Moolenaar &rtp = save_rtp 18498a7d6542SBram Moolenaar 18508a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18518a7d6542SBram Moolenaar 1852b3ca9824SBram Moolenaar Undo_export_script_lines() 1853b3ca9824SBram Moolenaar unlet g:imported_rtp 18548a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 185589483d40SBram Moolenaar delete('import', 'rf') 18568a7d6542SBram Moolenaarenddef 18578a7d6542SBram Moolenaar 185825e0f586SBram Moolenaardef Test_import_compile_error() 185925e0f586SBram Moolenaar let export_lines = [ 186025e0f586SBram Moolenaar 'vim9script', 186125e0f586SBram Moolenaar 'export def ExpFunc(): string', 186225e0f586SBram Moolenaar ' return notDefined', 186325e0f586SBram Moolenaar 'enddef', 186425e0f586SBram Moolenaar ] 186525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 186625e0f586SBram Moolenaar 186725e0f586SBram Moolenaar let import_lines = [ 186825e0f586SBram Moolenaar 'vim9script', 186925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 187025e0f586SBram Moolenaar 'def ImpFunc()', 187125e0f586SBram Moolenaar ' echo ExpFunc()', 187225e0f586SBram Moolenaar 'enddef', 187325e0f586SBram Moolenaar 'defcompile', 187425e0f586SBram Moolenaar ] 187525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 187625e0f586SBram Moolenaar 187725e0f586SBram Moolenaar try 187825e0f586SBram Moolenaar source Ximport.vim 187925e0f586SBram Moolenaar catch /E1001/ 1880f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 188125e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 188225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 188325e0f586SBram Moolenaar endtry 188425e0f586SBram Moolenaar 188525e0f586SBram Moolenaar delete('Xexported.vim') 188625e0f586SBram Moolenaar delete('Ximport.vim') 188725e0f586SBram Moolenaarenddef 188825e0f586SBram Moolenaar 1889c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1890c4ce36d4SBram Moolenaar let lines = [ 1891c4ce36d4SBram Moolenaar 'vim9script', 1892c4ce36d4SBram Moolenaar 'def Func()', 1893c4ce36d4SBram Moolenaar ' eval [][0]', 1894c4ce36d4SBram Moolenaar 'enddef', 1895c4ce36d4SBram Moolenaar 'Func()', 1896c4ce36d4SBram Moolenaar ] 1897c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1898c4ce36d4SBram Moolenaar 1899c4ce36d4SBram Moolenaar for count in range(3) 1900c4ce36d4SBram Moolenaar try 1901c4ce36d4SBram Moolenaar source Xtestscript.vim 1902c4ce36d4SBram Moolenaar catch /E684/ 1903c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1904c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1905c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1906c4ce36d4SBram Moolenaar endtry 1907c4ce36d4SBram Moolenaar endfor 1908c4ce36d4SBram Moolenaar 1909c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1910c4ce36d4SBram Moolenaarenddef 1911c4ce36d4SBram Moolenaar 1912eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1913eef2102eSBram Moolenaar let export_lines =<< trim END 1914eef2102eSBram Moolenaar vim9script 1915eef2102eSBram Moolenaar export def Func() 1916eef2102eSBram Moolenaar echo 'imported' 1917eef2102eSBram Moolenaar enddef 1918eef2102eSBram Moolenaar END 1919eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1920eef2102eSBram Moolenaar 1921eef2102eSBram Moolenaar let lines =<< trim END 1922eef2102eSBram Moolenaar vim9script 1923eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1924eef2102eSBram Moolenaar def Func() 1925eef2102eSBram Moolenaar echo 'local to function' 1926eef2102eSBram Moolenaar enddef 1927eef2102eSBram Moolenaar END 1928eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1929eef2102eSBram Moolenaar 1930eef2102eSBram Moolenaar lines =<< trim END 1931eef2102eSBram Moolenaar vim9script 1932eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1933eef2102eSBram Moolenaar def Outer() 1934eef2102eSBram Moolenaar def Func() 1935eef2102eSBram Moolenaar echo 'local to function' 1936eef2102eSBram Moolenaar enddef 1937eef2102eSBram Moolenaar enddef 1938eef2102eSBram Moolenaar defcompile 1939eef2102eSBram Moolenaar END 1940eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1941eef2102eSBram Moolenaar 1942eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1943eef2102eSBram Moolenaarenddef 1944eef2102eSBram Moolenaar 1945b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1946b9a2cac3SBram Moolenaar let lines =<< trim END 1947b9a2cac3SBram Moolenaar vim9script 1948b9a2cac3SBram Moolenaar def Func() 1949b9a2cac3SBram Moolenaar echo 'one' 1950b9a2cac3SBram Moolenaar enddef 1951b9a2cac3SBram Moolenaar def Func() 1952b9a2cac3SBram Moolenaar echo 'two' 1953b9a2cac3SBram Moolenaar enddef 1954b9a2cac3SBram Moolenaar END 1955b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1956fa211f3cSBram Moolenaar 1957fa211f3cSBram Moolenaar lines =<< trim END 1958fa211f3cSBram Moolenaar vim9script 1959fa211f3cSBram Moolenaar def Foo(): string 1960fa211f3cSBram Moolenaar return 'foo' 1961fa211f3cSBram Moolenaar enddef 1962fa211f3cSBram Moolenaar def Func() 1963fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1964fa211f3cSBram Moolenaar enddef 1965fa211f3cSBram Moolenaar defcompile 1966fa211f3cSBram Moolenaar END 1967fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1968b9a2cac3SBram Moolenaarenddef 1969b9a2cac3SBram Moolenaar 19708a7d6542SBram Moolenaardef Test_fixed_size_list() 1971f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 19728a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 19738a7d6542SBram Moolenaar l->remove(0) 19748a7d6542SBram Moolenaar l->add(5) 19758a7d6542SBram Moolenaar l->insert(99, 1) 19760f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19778a7d6542SBram Moolenaarenddef 19788a7d6542SBram Moolenaar 1979ae616494SBram Moolenaardef Test_no_insert_xit() 1980d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1981d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1982d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1983d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1984d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1985ae616494SBram Moolenaar 1986ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1987ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1988ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1989ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1990f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1991f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1992f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1993f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1994f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1995ae616494SBram Moolenaarenddef 1996ae616494SBram Moolenaar 1997158906cfSBram Moolenaardef IfElse(what: number): string 1998158906cfSBram Moolenaar let res = '' 1999158906cfSBram Moolenaar if what == 1 2000158906cfSBram Moolenaar res = "one" 2001158906cfSBram Moolenaar elseif what == 2 2002158906cfSBram Moolenaar res = "two" 2003a259d8d3SBram Moolenaar else 2004158906cfSBram Moolenaar res = "three" 2005a259d8d3SBram Moolenaar endif 2006158906cfSBram Moolenaar return res 2007a259d8d3SBram Moolenaarenddef 2008a259d8d3SBram Moolenaar 2009158906cfSBram Moolenaardef Test_if_elseif_else() 2010158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2011158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2012158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20130f18b6d1SBram Moolenaarenddef 20140f18b6d1SBram Moolenaar 2015e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2016d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2017d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2018d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2019d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2020d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2021e8c4abbbSBram Moolenaarenddef 2022e8c4abbbSBram Moolenaar 20236d69bf60SBram Moolenaarlet g:bool_true = v:true 20246d69bf60SBram Moolenaarlet g:bool_false = v:false 20256d69bf60SBram Moolenaar 20266d69bf60SBram Moolenaardef Test_if_const_expr() 20276d69bf60SBram Moolenaar let res = false 20286d69bf60SBram Moolenaar if true ? true : false 20296d69bf60SBram Moolenaar res = true 20306d69bf60SBram Moolenaar endif 20316d69bf60SBram Moolenaar assert_equal(true, res) 20326d69bf60SBram Moolenaar 2033585fea7bSBram Moolenaar g:glob = 2 2034585fea7bSBram Moolenaar if false 20356797966dSBram Moolenaar execute('g:glob = 3') 2036585fea7bSBram Moolenaar endif 2037585fea7bSBram Moolenaar assert_equal(2, g:glob) 2038585fea7bSBram Moolenaar if true 20396797966dSBram Moolenaar execute('g:glob = 3') 2040585fea7bSBram Moolenaar endif 2041585fea7bSBram Moolenaar assert_equal(3, g:glob) 2042585fea7bSBram Moolenaar 20436d69bf60SBram Moolenaar res = false 20446d69bf60SBram Moolenaar if g:bool_true ? true : false 20456d69bf60SBram Moolenaar res = true 20466d69bf60SBram Moolenaar endif 20476d69bf60SBram Moolenaar assert_equal(true, res) 20486d69bf60SBram Moolenaar 20496d69bf60SBram Moolenaar res = false 20506d69bf60SBram Moolenaar if true ? g:bool_true : false 20516d69bf60SBram Moolenaar res = true 20526d69bf60SBram Moolenaar endif 20536d69bf60SBram Moolenaar assert_equal(true, res) 20546d69bf60SBram Moolenaar 20556d69bf60SBram Moolenaar res = false 20566d69bf60SBram Moolenaar if true ? true : g:bool_false 20576d69bf60SBram Moolenaar res = true 20586d69bf60SBram Moolenaar endif 20596d69bf60SBram Moolenaar assert_equal(true, res) 20606d69bf60SBram Moolenaar 20616d69bf60SBram Moolenaar res = false 20626d69bf60SBram Moolenaar if true ? false : true 20636d69bf60SBram Moolenaar res = true 20646d69bf60SBram Moolenaar endif 20656d69bf60SBram Moolenaar assert_equal(false, res) 20666d69bf60SBram Moolenaar 20676d69bf60SBram Moolenaar res = false 20686d69bf60SBram Moolenaar if false ? false : true 20696d69bf60SBram Moolenaar res = true 20706d69bf60SBram Moolenaar endif 20716d69bf60SBram Moolenaar assert_equal(true, res) 20726d69bf60SBram Moolenaar 20736d69bf60SBram Moolenaar res = false 20746d69bf60SBram Moolenaar if false ? true : false 20756d69bf60SBram Moolenaar res = true 20766d69bf60SBram Moolenaar endif 20776d69bf60SBram Moolenaar assert_equal(false, res) 20786d69bf60SBram Moolenaar 20796d69bf60SBram Moolenaar res = false 2080e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2081e8c4abbbSBram Moolenaar res = true 2082e8c4abbbSBram Moolenaar endif 2083e8c4abbbSBram Moolenaar assert_equal(false, res) 2084e8c4abbbSBram Moolenaar 2085e8c4abbbSBram Moolenaar res = false 20866d69bf60SBram Moolenaar if true && true 20876d69bf60SBram Moolenaar res = true 20886d69bf60SBram Moolenaar endif 20896d69bf60SBram Moolenaar assert_equal(true, res) 20906d69bf60SBram Moolenaar 20916d69bf60SBram Moolenaar res = false 20926d69bf60SBram Moolenaar if true && false 20936d69bf60SBram Moolenaar res = true 20946d69bf60SBram Moolenaar endif 20956d69bf60SBram Moolenaar assert_equal(false, res) 20966d69bf60SBram Moolenaar 20976d69bf60SBram Moolenaar res = false 20986d69bf60SBram Moolenaar if g:bool_true && false 20996d69bf60SBram Moolenaar res = true 21006d69bf60SBram Moolenaar endif 21016d69bf60SBram Moolenaar assert_equal(false, res) 21026d69bf60SBram Moolenaar 21036d69bf60SBram Moolenaar res = false 21046d69bf60SBram Moolenaar if true && g:bool_false 21056d69bf60SBram Moolenaar res = true 21066d69bf60SBram Moolenaar endif 21076d69bf60SBram Moolenaar assert_equal(false, res) 21086d69bf60SBram Moolenaar 21096d69bf60SBram Moolenaar res = false 21106d69bf60SBram Moolenaar if false && false 21116d69bf60SBram Moolenaar res = true 21126d69bf60SBram Moolenaar endif 21136d69bf60SBram Moolenaar assert_equal(false, res) 21146d69bf60SBram Moolenaar 21156d69bf60SBram Moolenaar res = false 21166d69bf60SBram Moolenaar if true || false 21176d69bf60SBram Moolenaar res = true 21186d69bf60SBram Moolenaar endif 21196d69bf60SBram Moolenaar assert_equal(true, res) 21206d69bf60SBram Moolenaar 21216d69bf60SBram Moolenaar res = false 21226d69bf60SBram Moolenaar if g:bool_true || false 21236d69bf60SBram Moolenaar res = true 21246d69bf60SBram Moolenaar endif 21256d69bf60SBram Moolenaar assert_equal(true, res) 21266d69bf60SBram Moolenaar 21276d69bf60SBram Moolenaar res = false 21286d69bf60SBram Moolenaar if true || g:bool_false 21296d69bf60SBram Moolenaar res = true 21306d69bf60SBram Moolenaar endif 21316d69bf60SBram Moolenaar assert_equal(true, res) 21326d69bf60SBram Moolenaar 21336d69bf60SBram Moolenaar res = false 21346d69bf60SBram Moolenaar if false || false 21356d69bf60SBram Moolenaar res = true 21366d69bf60SBram Moolenaar endif 21376d69bf60SBram Moolenaar assert_equal(false, res) 21383988f64fSBram Moolenaar 21393988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21403988f64fSBram Moolenaar if false | eval 0 | endif 21413988f64fSBram Moolenaar if false | eval burp + 234 | endif 21423988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21433988f64fSBram Moolenaar if false 21443988f64fSBram Moolenaar burp 21453988f64fSBram Moolenaar endif 214680c34ca3SBram Moolenaarenddef 21476d69bf60SBram Moolenaar 214880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2149d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2150d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2151d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2152d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21536d69bf60SBram Moolenaarenddef 21546d69bf60SBram Moolenaar 215572abcf42SBram Moolenaardef RunNested(i: number): number 215672abcf42SBram Moolenaar let x: number = 0 215772abcf42SBram Moolenaar if i % 2 215872abcf42SBram Moolenaar if 1 2159f5be8cdbSBram Moolenaar # comment 216072abcf42SBram Moolenaar else 2161f5be8cdbSBram Moolenaar # comment 216272abcf42SBram Moolenaar endif 216372abcf42SBram Moolenaar x += 1 216472abcf42SBram Moolenaar else 216572abcf42SBram Moolenaar x += 1000 216672abcf42SBram Moolenaar endif 216772abcf42SBram Moolenaar return x 216872abcf42SBram Moolenaarenddef 216972abcf42SBram Moolenaar 217072abcf42SBram Moolenaardef Test_nested_if() 217172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 217272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 217372abcf42SBram Moolenaarenddef 217472abcf42SBram Moolenaar 2175ad39c094SBram Moolenaardef Test_execute_cmd() 2176ad39c094SBram Moolenaar new 2177ad39c094SBram Moolenaar setline(1, 'default') 2178d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2179ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2180a72cfb80SBram Moolenaar 2181d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2182a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2183a72cfb80SBram Moolenaar 2184d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2185ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2186a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2187ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2188a72cfb80SBram Moolenaar 2189d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2190ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2191a72cfb80SBram Moolenaar 2192ad39c094SBram Moolenaar let cmd_first = 'call ' 2193ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2194ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2195ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2196ad39c094SBram Moolenaar bwipe! 2197585fea7bSBram Moolenaar 21982d6b20d6SBram Moolenaar let n = true 21992d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22002d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22012d6b20d6SBram Moolenaar 2202e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2203e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2204e5abf7afSBram Moolenaar 2205d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2206d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2207d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2208ad39c094SBram Moolenaarenddef 2209ad39c094SBram Moolenaar 221047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2211f5be8cdbSBram Moolenaar # only checks line continuation 221247e880d6SBram Moolenaar let lines =<< trim END 221347e880d6SBram Moolenaar vim9script 221447e880d6SBram Moolenaar execute 'g:someVar' 221547e880d6SBram Moolenaar .. ' = ' .. 221647e880d6SBram Moolenaar '28' 221747e880d6SBram Moolenaar assert_equal(28, g:someVar) 221847e880d6SBram Moolenaar unlet g:someVar 221947e880d6SBram Moolenaar END 222047e880d6SBram Moolenaar CheckScriptSuccess(lines) 222147e880d6SBram Moolenaarenddef 222247e880d6SBram Moolenaar 2223ad39c094SBram Moolenaardef Test_echo_cmd() 2224a72cfb80SBram Moolenaar echo 'some' # comment 2225585fea7bSBram Moolenaar echon 'thing' 2226ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2227ad39c094SBram Moolenaar 2228a72cfb80SBram Moolenaar echo "some" # comment 2229a72cfb80SBram Moolenaar echon "thing" 2230a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2231a72cfb80SBram Moolenaar 2232ad39c094SBram Moolenaar let str1 = 'some' 2233ad39c094SBram Moolenaar let str2 = 'more' 2234ad39c094SBram Moolenaar echo str1 str2 2235ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2236a72cfb80SBram Moolenaar 2237d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2238ad39c094SBram Moolenaarenddef 2239ad39c094SBram Moolenaar 2240f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2241f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2242f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2243f93c7feaSBram Moolenaar echo 'clear' 2244df069eecSBram Moolenaar :1messages 2245f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2246f93c7feaSBram Moolenaar 2247d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2248f93c7feaSBram Moolenaarenddef 2249f93c7feaSBram Moolenaar 225047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2251f5be8cdbSBram Moolenaar # only checks line continuation 225247e880d6SBram Moolenaar let lines =<< trim END 225347e880d6SBram Moolenaar vim9script 225447e880d6SBram Moolenaar echomsg 'here' 225547e880d6SBram Moolenaar .. ' is ' .. 225647e880d6SBram Moolenaar 'a message' 225747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 225847e880d6SBram Moolenaar END 225947e880d6SBram Moolenaar CheckScriptSuccess(lines) 226047e880d6SBram Moolenaarenddef 226147e880d6SBram Moolenaar 2262f93c7feaSBram Moolenaardef Test_echoerr_cmd() 226340ee466cSBram Moolenaar try 226440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 226540ee466cSBram Moolenaar catch 226640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 226740ee466cSBram Moolenaar endtry 2268f93c7feaSBram Moolenaarenddef 2269f93c7feaSBram Moolenaar 227047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2271f5be8cdbSBram Moolenaar # only checks line continuation 227247e880d6SBram Moolenaar let lines =<< trim END 227347e880d6SBram Moolenaar vim9script 227447e880d6SBram Moolenaar try 227547e880d6SBram Moolenaar echoerr 'this' 227647e880d6SBram Moolenaar .. ' is ' .. 227747e880d6SBram Moolenaar 'wrong' 227847e880d6SBram Moolenaar catch 227947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 228047e880d6SBram Moolenaar endtry 228147e880d6SBram Moolenaar END 228247e880d6SBram Moolenaar CheckScriptSuccess(lines) 228347e880d6SBram Moolenaarenddef 228447e880d6SBram Moolenaar 228541fe0617SBram Moolenaardef Test_for_outside_of_function() 228641fe0617SBram Moolenaar let lines =<< trim END 228741fe0617SBram Moolenaar vim9script 228841fe0617SBram Moolenaar new 228941fe0617SBram Moolenaar for var in range(0, 3) 229041fe0617SBram Moolenaar append(line('$'), var) 229141fe0617SBram Moolenaar endfor 229241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 229341fe0617SBram Moolenaar bwipe! 229441fe0617SBram Moolenaar END 229541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 229641fe0617SBram Moolenaar source Xvim9for.vim 229741fe0617SBram Moolenaar delete('Xvim9for.vim') 229841fe0617SBram Moolenaarenddef 22998a7d6542SBram Moolenaar 2300e8c4abbbSBram Moolenaardef Test_for_loop() 2301e8c4abbbSBram Moolenaar let result = '' 2302e8c4abbbSBram Moolenaar for cnt in range(7) 2303e8c4abbbSBram Moolenaar if cnt == 4 2304e8c4abbbSBram Moolenaar break 2305e8c4abbbSBram Moolenaar endif 2306e8c4abbbSBram Moolenaar if cnt == 2 2307e8c4abbbSBram Moolenaar continue 2308e8c4abbbSBram Moolenaar endif 2309e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2310e8c4abbbSBram Moolenaar endfor 2311e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23120ad3e894SBram Moolenaar 23130ad3e894SBram Moolenaar let concat = '' 23140ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23150ad3e894SBram Moolenaar concat ..= str 23160ad3e894SBram Moolenaar endfor 23170ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2318e8c4abbbSBram Moolenaarenddef 2319e8c4abbbSBram Moolenaar 2320e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2321675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2322675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2323451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2324822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2325451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2326675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2327675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2328675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2329e8c4abbbSBram Moolenaarenddef 2330e8c4abbbSBram Moolenaar 2331d0df1aacSBram Moolenaardef Test_while_loop() 2332d0df1aacSBram Moolenaar let result = '' 2333d0df1aacSBram Moolenaar let cnt = 0 2334d0df1aacSBram Moolenaar while cnt < 555 2335d0df1aacSBram Moolenaar if cnt == 3 2336d0df1aacSBram Moolenaar break 2337d0df1aacSBram Moolenaar endif 2338d0df1aacSBram Moolenaar cnt += 1 2339d0df1aacSBram Moolenaar if cnt == 2 2340d0df1aacSBram Moolenaar continue 2341d0df1aacSBram Moolenaar endif 2342d0df1aacSBram Moolenaar result ..= cnt .. '_' 2343d0df1aacSBram Moolenaar endwhile 2344d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2345d0df1aacSBram Moolenaarenddef 2346d0df1aacSBram Moolenaar 2347e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2348675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2349675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2350675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2351675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2352675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2353675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2354675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2355bd5da371SBram Moolenaarenddef 2356bd5da371SBram Moolenaar 23579645e2d9SBram Moolenaardef Test_interrupt_loop() 235897acfc78SBram Moolenaar let caught = false 23599645e2d9SBram Moolenaar let x = 0 236097acfc78SBram Moolenaar try 23619645e2d9SBram Moolenaar while 1 23629645e2d9SBram Moolenaar x += 1 23639645e2d9SBram Moolenaar if x == 100 23649645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23659645e2d9SBram Moolenaar endif 23669645e2d9SBram Moolenaar endwhile 236797acfc78SBram Moolenaar catch 236897acfc78SBram Moolenaar caught = true 236997acfc78SBram Moolenaar assert_equal(100, x) 237097acfc78SBram Moolenaar endtry 237197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 237225859dd7SBram Moolenaar # consume the CTRL-C 237325859dd7SBram Moolenaar getchar(0) 23749645e2d9SBram Moolenaarenddef 237520431c9dSBram Moolenaar 23764fdae999SBram Moolenaardef Test_automatic_line_continuation() 23774fdae999SBram Moolenaar let mylist = [ 23784fdae999SBram Moolenaar 'one', 23794fdae999SBram Moolenaar 'two', 23804fdae999SBram Moolenaar 'three', 2381f5be8cdbSBram Moolenaar ] # comment 23824fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23834fdae999SBram Moolenaar 23844fdae999SBram Moolenaar let mydict = { 23854fdae999SBram Moolenaar 'one': 1, 23864fdae999SBram Moolenaar 'two': 2, 23874fdae999SBram Moolenaar 'three': 23884fdae999SBram Moolenaar 3, 2389f5be8cdbSBram Moolenaar } # comment 23904fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 23914fdae999SBram Moolenaar mydict = #{ 23922c330432SBram Moolenaar one: 1, # comment 23932c330432SBram Moolenaar two: # comment 23942c330432SBram Moolenaar 2, # comment 23952c330432SBram Moolenaar three: 3 # comment 23962c330432SBram Moolenaar } 23972c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 23982c330432SBram Moolenaar mydict = #{ 23992c330432SBram Moolenaar one: 1, 24004fdae999SBram Moolenaar two: 24014fdae999SBram Moolenaar 2, 24022c330432SBram Moolenaar three: 3 24034fdae999SBram Moolenaar } 24044fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2405e6085c53SBram Moolenaar 2406e6085c53SBram Moolenaar assert_equal( 2407e6085c53SBram Moolenaar ['one', 'two', 'three'], 2408e6085c53SBram Moolenaar split('one two three') 2409e6085c53SBram Moolenaar ) 24104fdae999SBram Moolenaarenddef 24114fdae999SBram Moolenaar 24127a092245SBram Moolenaardef Test_vim9_comment() 24137a092245SBram Moolenaar CheckScriptSuccess([ 24147a092245SBram Moolenaar 'vim9script', 24157a092245SBram Moolenaar '# something', 24167a092245SBram Moolenaar ]) 24177a092245SBram Moolenaar CheckScriptFailure([ 24187a092245SBram Moolenaar 'vim9script', 24197a092245SBram Moolenaar ':# something', 24207a092245SBram Moolenaar ], 'E488:') 24217a092245SBram Moolenaar CheckScriptFailure([ 24227a092245SBram Moolenaar '# something', 24237a092245SBram Moolenaar ], 'E488:') 24247a092245SBram Moolenaar CheckScriptFailure([ 24257a092245SBram Moolenaar ':# something', 24267a092245SBram Moolenaar ], 'E488:') 24277a092245SBram Moolenaar 24284a8d9f2eSBram Moolenaar { # block start 24294a8d9f2eSBram Moolenaar } # block end 24304a8d9f2eSBram Moolenaar CheckDefFailure([ 24314a8d9f2eSBram Moolenaar '{# comment', 24324a8d9f2eSBram Moolenaar ], 'E488:') 24334a8d9f2eSBram Moolenaar CheckDefFailure([ 24344a8d9f2eSBram Moolenaar '{', 24354a8d9f2eSBram Moolenaar '}# comment', 24364a8d9f2eSBram Moolenaar ], 'E488:') 24374a8d9f2eSBram Moolenaar 24384a8d9f2eSBram Moolenaar echo "yes" # comment 24394a8d9f2eSBram Moolenaar CheckDefFailure([ 24404a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24414a8d9f2eSBram Moolenaar ], 'E488:') 24427a092245SBram Moolenaar CheckScriptSuccess([ 24437a092245SBram Moolenaar 'vim9script', 24447a092245SBram Moolenaar 'echo "yes" # something', 24457a092245SBram Moolenaar ]) 24467a092245SBram Moolenaar CheckScriptFailure([ 24477a092245SBram Moolenaar 'vim9script', 24487a092245SBram Moolenaar 'echo "yes"# something', 24497a092245SBram Moolenaar ], 'E121:') 24507a092245SBram Moolenaar CheckScriptFailure([ 24517a092245SBram Moolenaar 'vim9script', 24527a092245SBram Moolenaar 'echo# something', 24537a092245SBram Moolenaar ], 'E121:') 24547a092245SBram Moolenaar CheckScriptFailure([ 24557a092245SBram Moolenaar 'echo "yes" # something', 24567a092245SBram Moolenaar ], 'E121:') 24577a092245SBram Moolenaar 24584a8d9f2eSBram Moolenaar exe "echo" # comment 24594a8d9f2eSBram Moolenaar CheckDefFailure([ 24604a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24614a8d9f2eSBram Moolenaar ], 'E488:') 24624a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24634a8d9f2eSBram Moolenaar 'vim9script', 24644a8d9f2eSBram Moolenaar 'exe "echo" # something', 24654a8d9f2eSBram Moolenaar ]) 24664a8d9f2eSBram Moolenaar CheckScriptFailure([ 24674a8d9f2eSBram Moolenaar 'vim9script', 24684a8d9f2eSBram Moolenaar 'exe "echo"# something', 24694a8d9f2eSBram Moolenaar ], 'E121:') 24704a8d9f2eSBram Moolenaar CheckDefFailure([ 24714a8d9f2eSBram Moolenaar 'exe # comment', 24724a8d9f2eSBram Moolenaar ], 'E1015:') 24734a8d9f2eSBram Moolenaar CheckScriptFailure([ 24744a8d9f2eSBram Moolenaar 'vim9script', 24754a8d9f2eSBram Moolenaar 'exe# something', 24764a8d9f2eSBram Moolenaar ], 'E121:') 24774a8d9f2eSBram Moolenaar CheckScriptFailure([ 24784a8d9f2eSBram Moolenaar 'exe "echo" # something', 24794a8d9f2eSBram Moolenaar ], 'E121:') 24804a8d9f2eSBram Moolenaar 24817a092245SBram Moolenaar CheckDefFailure([ 24827a092245SBram Moolenaar 'try# comment', 24837a092245SBram Moolenaar ' echo "yes"', 24847a092245SBram Moolenaar 'catch', 24857a092245SBram Moolenaar 'endtry', 24867a092245SBram Moolenaar ], 'E488:') 24872c5ed4e3SBram Moolenaar CheckScriptFailure([ 24882c5ed4e3SBram Moolenaar 'vim9script', 24892c5ed4e3SBram Moolenaar 'try# comment', 24902c5ed4e3SBram Moolenaar 'echo "yes"', 24912c5ed4e3SBram Moolenaar ], 'E488:') 24927a092245SBram Moolenaar CheckDefFailure([ 24937a092245SBram Moolenaar 'try', 2494a72cfb80SBram Moolenaar ' throw#comment', 2495a72cfb80SBram Moolenaar 'catch', 2496a72cfb80SBram Moolenaar 'endtry', 2497a72cfb80SBram Moolenaar ], 'E1015:') 2498a72cfb80SBram Moolenaar CheckDefFailure([ 2499a72cfb80SBram Moolenaar 'try', 2500a72cfb80SBram Moolenaar ' throw "yes"#comment', 2501a72cfb80SBram Moolenaar 'catch', 2502a72cfb80SBram Moolenaar 'endtry', 2503a72cfb80SBram Moolenaar ], 'E488:') 2504a72cfb80SBram Moolenaar CheckDefFailure([ 2505a72cfb80SBram Moolenaar 'try', 25067a092245SBram Moolenaar ' echo "yes"', 25077a092245SBram Moolenaar 'catch# comment', 25087a092245SBram Moolenaar 'endtry', 25097a092245SBram Moolenaar ], 'E488:') 25102c5ed4e3SBram Moolenaar CheckScriptFailure([ 25112c5ed4e3SBram Moolenaar 'vim9script', 25122c5ed4e3SBram Moolenaar 'try', 25132c5ed4e3SBram Moolenaar ' echo "yes"', 25142c5ed4e3SBram Moolenaar 'catch# comment', 25152c5ed4e3SBram Moolenaar 'endtry', 25162c5ed4e3SBram Moolenaar ], 'E654:') 25172c5ed4e3SBram Moolenaar CheckDefFailure([ 25182c5ed4e3SBram Moolenaar 'try', 25192c5ed4e3SBram Moolenaar ' echo "yes"', 25202c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25212c5ed4e3SBram Moolenaar 'endtry', 25222c5ed4e3SBram Moolenaar ], 'E488:') 25237a092245SBram Moolenaar CheckDefFailure([ 25247a092245SBram Moolenaar 'try', 25257a092245SBram Moolenaar 'echo "yes"', 25267a092245SBram Moolenaar 'catch', 25277a092245SBram Moolenaar 'endtry# comment', 25287a092245SBram Moolenaar ], 'E488:') 25292c5ed4e3SBram Moolenaar CheckScriptFailure([ 25302c5ed4e3SBram Moolenaar 'vim9script', 25312c5ed4e3SBram Moolenaar 'try', 25322c5ed4e3SBram Moolenaar ' echo "yes"', 25332c5ed4e3SBram Moolenaar 'catch', 25342c5ed4e3SBram Moolenaar 'endtry# comment', 25359b7bf9e9SBram Moolenaar ], 'E488:') 25362c5ed4e3SBram Moolenaar 25372c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25382c5ed4e3SBram Moolenaar 'vim9script', 25392c5ed4e3SBram Moolenaar 'hi # comment', 25402c5ed4e3SBram Moolenaar ]) 25412c5ed4e3SBram Moolenaar CheckScriptFailure([ 25422c5ed4e3SBram Moolenaar 'vim9script', 25432c5ed4e3SBram Moolenaar 'hi# comment', 25442c5ed4e3SBram Moolenaar ], 'E416:') 25451966c248SBram Moolenaar CheckScriptSuccess([ 25461966c248SBram Moolenaar 'vim9script', 25471966c248SBram Moolenaar 'hi Search # comment', 25481966c248SBram Moolenaar ]) 25491966c248SBram Moolenaar CheckScriptFailure([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'hi Search# comment', 25521966c248SBram Moolenaar ], 'E416:') 25531966c248SBram Moolenaar CheckScriptSuccess([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'hi link This Search # comment', 25561966c248SBram Moolenaar ]) 25571966c248SBram Moolenaar CheckScriptFailure([ 25581966c248SBram Moolenaar 'vim9script', 25591966c248SBram Moolenaar 'hi link This That# comment', 25601966c248SBram Moolenaar ], 'E413:') 25611966c248SBram Moolenaar CheckScriptSuccess([ 25621966c248SBram Moolenaar 'vim9script', 25631966c248SBram Moolenaar 'hi clear This # comment', 25641966c248SBram Moolenaar 'hi clear # comment', 25651966c248SBram Moolenaar ]) 2566f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2567f5be8cdbSBram Moolenaar # hi clear This# comment', 25681966c248SBram Moolenaar CheckScriptFailure([ 25691966c248SBram Moolenaar 'vim9script', 25701966c248SBram Moolenaar 'hi clear# comment', 25711966c248SBram Moolenaar ], 'E416:') 25721966c248SBram Moolenaar 25731966c248SBram Moolenaar CheckScriptSuccess([ 25741966c248SBram Moolenaar 'vim9script', 25751966c248SBram Moolenaar 'hi Group term=bold', 25761966c248SBram Moolenaar 'match Group /todo/ # comment', 25771966c248SBram Moolenaar ]) 25781966c248SBram Moolenaar CheckScriptFailure([ 25791966c248SBram Moolenaar 'vim9script', 25801966c248SBram Moolenaar 'hi Group term=bold', 25811966c248SBram Moolenaar 'match Group /todo/# comment', 25821966c248SBram Moolenaar ], 'E488:') 25831966c248SBram Moolenaar CheckScriptSuccess([ 25841966c248SBram Moolenaar 'vim9script', 25851966c248SBram Moolenaar 'match # comment', 25861966c248SBram Moolenaar ]) 25871966c248SBram Moolenaar CheckScriptFailure([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'match# comment', 25901966c248SBram Moolenaar ], 'E475:') 25911966c248SBram Moolenaar CheckScriptSuccess([ 25921966c248SBram Moolenaar 'vim9script', 25931966c248SBram Moolenaar 'match none # comment', 25941966c248SBram Moolenaar ]) 25951966c248SBram Moolenaar CheckScriptFailure([ 25961966c248SBram Moolenaar 'vim9script', 25971966c248SBram Moolenaar 'match none# comment', 25981966c248SBram Moolenaar ], 'E475:') 25991966c248SBram Moolenaar 26001966c248SBram Moolenaar CheckScriptSuccess([ 26011966c248SBram Moolenaar 'vim9script', 26021966c248SBram Moolenaar 'menutrans clear # comment', 26031966c248SBram Moolenaar ]) 26041966c248SBram Moolenaar CheckScriptFailure([ 26051966c248SBram Moolenaar 'vim9script', 26061966c248SBram Moolenaar 'menutrans clear# comment text', 26071966c248SBram Moolenaar ], 'E474:') 26081966c248SBram Moolenaar 26091966c248SBram Moolenaar CheckScriptSuccess([ 26101966c248SBram Moolenaar 'vim9script', 26111966c248SBram Moolenaar 'syntax clear # comment', 26121966c248SBram Moolenaar ]) 26131966c248SBram Moolenaar CheckScriptFailure([ 26141966c248SBram Moolenaar 'vim9script', 26151966c248SBram Moolenaar 'syntax clear# comment text', 26161966c248SBram Moolenaar ], 'E28:') 26171966c248SBram Moolenaar CheckScriptSuccess([ 26181966c248SBram Moolenaar 'vim9script', 26191966c248SBram Moolenaar 'syntax keyword Word some', 26201966c248SBram Moolenaar 'syntax clear Word # comment', 26211966c248SBram Moolenaar ]) 26221966c248SBram Moolenaar CheckScriptFailure([ 26231966c248SBram Moolenaar 'vim9script', 26241966c248SBram Moolenaar 'syntax keyword Word some', 26251966c248SBram Moolenaar 'syntax clear Word# comment text', 26261966c248SBram Moolenaar ], 'E28:') 26271966c248SBram Moolenaar 26281966c248SBram Moolenaar CheckScriptSuccess([ 26291966c248SBram Moolenaar 'vim9script', 26301966c248SBram Moolenaar 'syntax list # comment', 26311966c248SBram Moolenaar ]) 26321966c248SBram Moolenaar CheckScriptFailure([ 26331966c248SBram Moolenaar 'vim9script', 26341966c248SBram Moolenaar 'syntax list# comment text', 26351966c248SBram Moolenaar ], 'E28:') 26361966c248SBram Moolenaar 26371966c248SBram Moolenaar CheckScriptSuccess([ 26381966c248SBram Moolenaar 'vim9script', 26391966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26401966c248SBram Moolenaar ]) 26411966c248SBram Moolenaar CheckScriptFailure([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26441966c248SBram Moolenaar ], 'E475:') 26451966c248SBram Moolenaar 26461966c248SBram Moolenaar CheckScriptSuccess([ 26471966c248SBram Moolenaar 'vim9script', 26481966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26491966c248SBram Moolenaar ]) 26501966c248SBram Moolenaar CheckScriptFailure([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26531966c248SBram Moolenaar ], 'E789:') 26541966c248SBram Moolenaar 26551966c248SBram Moolenaar CheckScriptSuccess([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26581966c248SBram Moolenaar ]) 26591966c248SBram Moolenaar CheckScriptFailure([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26621966c248SBram Moolenaar ], 'E402:') 26631966c248SBram Moolenaar 26641966c248SBram Moolenaar CheckScriptSuccess([ 26651966c248SBram Moolenaar 'vim9script', 26661966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26671966c248SBram Moolenaar ]) 26681966c248SBram Moolenaar CheckScriptFailure([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26711966c248SBram Moolenaar ], 'E475:') 26721966c248SBram Moolenaar CheckScriptFailure([ 26731966c248SBram Moolenaar 'vim9script', 26741966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26751966c248SBram Moolenaar ], 'E406:') 26761966c248SBram Moolenaar CheckScriptFailure([ 26771966c248SBram Moolenaar 'vim9script', 26781966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26791966c248SBram Moolenaar ], 'E475:') 26801966c248SBram Moolenaar 26811966c248SBram Moolenaar CheckScriptSuccess([ 26821966c248SBram Moolenaar 'vim9script', 26831966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26841966c248SBram Moolenaar ]) 26851966c248SBram Moolenaar CheckScriptFailure([ 26861966c248SBram Moolenaar 'vim9script', 26871966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2688d032f34aSBram Moolenaar ], 'E402:') 26891966c248SBram Moolenaar 26901966c248SBram Moolenaar CheckScriptSuccess([ 26911966c248SBram Moolenaar 'vim9script', 26921966c248SBram Moolenaar 'syntax sync # comment', 26931966c248SBram Moolenaar ]) 26941966c248SBram Moolenaar CheckScriptFailure([ 26951966c248SBram Moolenaar 'vim9script', 26961966c248SBram Moolenaar 'syntax sync# comment', 26971966c248SBram Moolenaar ], 'E404:') 26981966c248SBram Moolenaar CheckScriptSuccess([ 26991966c248SBram Moolenaar 'vim9script', 27001966c248SBram Moolenaar 'syntax sync ccomment # comment', 27011966c248SBram Moolenaar ]) 27021966c248SBram Moolenaar CheckScriptFailure([ 27031966c248SBram Moolenaar 'vim9script', 27041966c248SBram Moolenaar 'syntax sync ccomment# comment', 27051966c248SBram Moolenaar ], 'E404:') 27061966c248SBram Moolenaar 27071966c248SBram Moolenaar CheckScriptSuccess([ 27081966c248SBram Moolenaar 'vim9script', 27091966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27101966c248SBram Moolenaar ]) 27111966c248SBram Moolenaar CheckScriptFailure([ 27121966c248SBram Moolenaar 'vim9script', 27131966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27141966c248SBram Moolenaar ], 'E475:') 2715a72cfb80SBram Moolenaar 2716a72cfb80SBram Moolenaar CheckScriptSuccess([ 2717a72cfb80SBram Moolenaar 'vim9script', 2718a72cfb80SBram Moolenaar 'command Echo echo # comment', 2719a72cfb80SBram Moolenaar 'command Echo # comment', 2720a72cfb80SBram Moolenaar ]) 2721a72cfb80SBram Moolenaar CheckScriptFailure([ 2722a72cfb80SBram Moolenaar 'vim9script', 2723a72cfb80SBram Moolenaar 'command Echo echo# comment', 2724a72cfb80SBram Moolenaar 'Echo', 2725a72cfb80SBram Moolenaar ], 'E121:') 2726a72cfb80SBram Moolenaar CheckScriptFailure([ 2727a72cfb80SBram Moolenaar 'vim9script', 2728a72cfb80SBram Moolenaar 'command Echo# comment', 2729a72cfb80SBram Moolenaar ], 'E182:') 2730a72cfb80SBram Moolenaar CheckScriptFailure([ 2731a72cfb80SBram Moolenaar 'vim9script', 2732a72cfb80SBram Moolenaar 'command Echo echo', 2733a72cfb80SBram Moolenaar 'command Echo# comment', 2734a72cfb80SBram Moolenaar ], 'E182:') 2735a72cfb80SBram Moolenaar 2736a72cfb80SBram Moolenaar CheckScriptSuccess([ 2737a72cfb80SBram Moolenaar 'vim9script', 2738a72cfb80SBram Moolenaar 'function # comment', 2739a72cfb80SBram Moolenaar ]) 2740a72cfb80SBram Moolenaar CheckScriptFailure([ 2741a72cfb80SBram Moolenaar 'vim9script', 27429898107fSBram Moolenaar 'function " comment', 27439898107fSBram Moolenaar ], 'E129:') 27449898107fSBram Moolenaar CheckScriptFailure([ 27459898107fSBram Moolenaar 'vim9script', 2746a72cfb80SBram Moolenaar 'function# comment', 2747a72cfb80SBram Moolenaar ], 'E129:') 2748a72cfb80SBram Moolenaar CheckScriptSuccess([ 2749a72cfb80SBram Moolenaar 'vim9script', 2750a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2751a72cfb80SBram Moolenaar ]) 2752a72cfb80SBram Moolenaar CheckScriptFailure([ 2753a72cfb80SBram Moolenaar 'vim9script', 2754a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2755a72cfb80SBram Moolenaar ], 'E488:') 2756a72cfb80SBram Moolenaar 2757a72cfb80SBram Moolenaar CheckScriptSuccess([ 2758a72cfb80SBram Moolenaar 'vim9script', 27594c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2760a72cfb80SBram Moolenaar 'endfunc', 27614c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2762a72cfb80SBram Moolenaar ]) 2763a72cfb80SBram Moolenaar CheckScriptFailure([ 2764a72cfb80SBram Moolenaar 'vim9script', 27654c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2766a72cfb80SBram Moolenaar 'endfunc', 27674c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2768a72cfb80SBram Moolenaar ], 'E488:') 2769a72cfb80SBram Moolenaar 2770a72cfb80SBram Moolenaar CheckScriptSuccess([ 2771a72cfb80SBram Moolenaar 'vim9script', 2772a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2773a72cfb80SBram Moolenaar ]) 2774a72cfb80SBram Moolenaar CheckScriptFailure([ 2775a72cfb80SBram Moolenaar 'vim9script', 2776a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2777a72cfb80SBram Moolenaar ], 'E488:') 2778e7e4838fSBram Moolenaar 2779e7e4838fSBram Moolenaar CheckScriptFailure([ 2780e7e4838fSBram Moolenaar 'def Test() " comment', 2781e7e4838fSBram Moolenaar 'enddef', 2782e7e4838fSBram Moolenaar ], 'E488:') 2783e7e4838fSBram Moolenaar CheckScriptFailure([ 2784e7e4838fSBram Moolenaar 'vim9script', 2785e7e4838fSBram Moolenaar 'def Test() " comment', 2786e7e4838fSBram Moolenaar 'enddef', 2787e7e4838fSBram Moolenaar ], 'E488:') 2788e7e4838fSBram Moolenaar 2789e7e4838fSBram Moolenaar CheckScriptSuccess([ 2790e7e4838fSBram Moolenaar 'func Test() " comment', 2791e7e4838fSBram Moolenaar 'endfunc', 2792e7e4838fSBram Moolenaar ]) 27939898107fSBram Moolenaar CheckScriptSuccess([ 2794e7e4838fSBram Moolenaar 'vim9script', 2795e7e4838fSBram Moolenaar 'func Test() " comment', 2796e7e4838fSBram Moolenaar 'endfunc', 27979898107fSBram Moolenaar ]) 2798e7e4838fSBram Moolenaar 2799e7e4838fSBram Moolenaar CheckScriptSuccess([ 2800e7e4838fSBram Moolenaar 'def Test() # comment', 2801e7e4838fSBram Moolenaar 'enddef', 2802e7e4838fSBram Moolenaar ]) 2803e7e4838fSBram Moolenaar CheckScriptFailure([ 2804e7e4838fSBram Moolenaar 'func Test() # comment', 2805e7e4838fSBram Moolenaar 'endfunc', 2806e7e4838fSBram Moolenaar ], 'E488:') 28072c5ed4e3SBram Moolenaarenddef 28082c5ed4e3SBram Moolenaar 28092c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28102c5ed4e3SBram Moolenaar CheckCanRunGui 28112c5ed4e3SBram Moolenaar 28122c5ed4e3SBram Moolenaar CheckScriptFailure([ 28132c5ed4e3SBram Moolenaar 'vim9script', 28142c5ed4e3SBram Moolenaar 'gui#comment' 28152c5ed4e3SBram Moolenaar ], 'E499:') 28162c5ed4e3SBram Moolenaar CheckScriptFailure([ 28172c5ed4e3SBram Moolenaar 'vim9script', 28182c5ed4e3SBram Moolenaar 'gui -f#comment' 28192c5ed4e3SBram Moolenaar ], 'E499:') 28207a092245SBram Moolenaarenddef 28217a092245SBram Moolenaar 2822a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28236797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28246797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2825a26b9700SBram Moolenaar 2826a26b9700SBram Moolenaar edit test.vim 2827a26b9700SBram Moolenaar doautocmd TabEnter #comment 2828a26b9700SBram Moolenaar assert_equal(1, g:entered) 2829a26b9700SBram Moolenaar 2830a26b9700SBram Moolenaar doautocmd TabEnter f.x 2831a26b9700SBram Moolenaar assert_equal(2, g:entered) 2832a26b9700SBram Moolenaar 2833a26b9700SBram Moolenaar g:entered = 0 2834a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2835a26b9700SBram Moolenaar assert_equal(2, g:entered) 2836a26b9700SBram Moolenaar 2837a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2838a26b9700SBram Moolenaar 2839a26b9700SBram Moolenaar au! TabEnter 2840a26b9700SBram Moolenaar unlet g:entered 2841d72c1bf0SBram Moolenaar 2842d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2843d72c1bf0SBram Moolenaar 'vim9script', 28446797966dSBram Moolenaar 'g:var = 123', 2845e55b1c09SBram Moolenaar 'b:var = 456', 2846e55b1c09SBram Moolenaar 'w:var = 777', 2847e55b1c09SBram Moolenaar 't:var = 888', 2848d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2849d72c1bf0SBram Moolenaar ]) 2850d72c1bf0SBram Moolenaar 2851d72c1bf0SBram Moolenaar CheckScriptFailure([ 2852d72c1bf0SBram Moolenaar 'vim9script', 2853d72c1bf0SBram Moolenaar 'let g:var = 123', 2854e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2855e55b1c09SBram Moolenaar 2856e55b1c09SBram Moolenaar CheckScriptFailure([ 2857e55b1c09SBram Moolenaar 'vim9script', 2858e55b1c09SBram Moolenaar 'let b:var = 123', 2859e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2860e55b1c09SBram Moolenaar 2861e55b1c09SBram Moolenaar CheckScriptFailure([ 2862e55b1c09SBram Moolenaar 'vim9script', 2863e55b1c09SBram Moolenaar 'let w:var = 123', 2864e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2865e55b1c09SBram Moolenaar 2866e55b1c09SBram Moolenaar CheckScriptFailure([ 2867e55b1c09SBram Moolenaar 'vim9script', 2868e55b1c09SBram Moolenaar 'let t:var = 123', 2869e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2870e55b1c09SBram Moolenaar 2871e55b1c09SBram Moolenaar CheckScriptFailure([ 2872e55b1c09SBram Moolenaar 'vim9script', 2873e55b1c09SBram Moolenaar 'let v:version = 123', 2874e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2875e55b1c09SBram Moolenaar 2876e55b1c09SBram Moolenaar CheckScriptFailure([ 2877e55b1c09SBram Moolenaar 'vim9script', 2878e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2879e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28806797966dSBram Moolenaar 28816797966dSBram Moolenaar CheckScriptFailure([ 28826797966dSBram Moolenaar 'vim9script', 28836797966dSBram Moolenaar 'g:var = 123', 288432e35117SBram Moolenaar 'unlet g:var# comment1', 2885d72c1bf0SBram Moolenaar ], 'E108:') 2886d72c1bf0SBram Moolenaar 2887d72c1bf0SBram Moolenaar CheckScriptFailure([ 2888d72c1bf0SBram Moolenaar 'let g:var = 123', 2889d72c1bf0SBram Moolenaar 'unlet g:var # something', 2890d72c1bf0SBram Moolenaar ], 'E488:') 2891faac4104SBram Moolenaar 2892faac4104SBram Moolenaar CheckScriptSuccess([ 2893faac4104SBram Moolenaar 'vim9script', 289432e35117SBram Moolenaar 'if 1 # comment2', 2895faac4104SBram Moolenaar ' echo "yes"', 2896faac4104SBram Moolenaar 'elseif 2 #comment', 2897faac4104SBram Moolenaar ' echo "no"', 2898faac4104SBram Moolenaar 'endif', 2899faac4104SBram Moolenaar ]) 2900faac4104SBram Moolenaar 2901faac4104SBram Moolenaar CheckScriptFailure([ 2902faac4104SBram Moolenaar 'vim9script', 290332e35117SBram Moolenaar 'if 1# comment3', 2904faac4104SBram Moolenaar ' echo "yes"', 2905faac4104SBram Moolenaar 'endif', 2906faac4104SBram Moolenaar ], 'E15:') 2907faac4104SBram Moolenaar 2908faac4104SBram Moolenaar CheckScriptFailure([ 2909faac4104SBram Moolenaar 'vim9script', 291032e35117SBram Moolenaar 'if 0 # comment4', 2911faac4104SBram Moolenaar ' echo "yes"', 2912faac4104SBram Moolenaar 'elseif 2#comment', 2913faac4104SBram Moolenaar ' echo "no"', 2914faac4104SBram Moolenaar 'endif', 2915faac4104SBram Moolenaar ], 'E15:') 2916faac4104SBram Moolenaar 2917faac4104SBram Moolenaar CheckScriptSuccess([ 2918faac4104SBram Moolenaar 'vim9script', 291932e35117SBram Moolenaar 'let v = 1 # comment5', 2920faac4104SBram Moolenaar ]) 2921faac4104SBram Moolenaar 2922faac4104SBram Moolenaar CheckScriptFailure([ 2923faac4104SBram Moolenaar 'vim9script', 292432e35117SBram Moolenaar 'let v = 1# comment6', 292532e35117SBram Moolenaar ], 'E15:') 2926faac4104SBram Moolenaar 2927faac4104SBram Moolenaar CheckScriptSuccess([ 2928faac4104SBram Moolenaar 'vim9script', 2929faac4104SBram Moolenaar 'new' 2930d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2931df069eecSBram Moolenaar ':$', 2932faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2933faac4104SBram Moolenaar 'bwipe!', 2934faac4104SBram Moolenaar ]) 2935faac4104SBram Moolenaar 2936f5be8cdbSBram Moolenaar CheckScriptFailure([ 2937f5be8cdbSBram Moolenaar 'vim9script', 2938f5be8cdbSBram Moolenaar 'new' 2939d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2940f5be8cdbSBram Moolenaar ':$', 2941f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2942f5be8cdbSBram Moolenaar 'bwipe!', 2943f5be8cdbSBram Moolenaar ], 'E488:') 2944f5be8cdbSBram Moolenaar 2945f5be8cdbSBram Moolenaar CheckScriptFailure([ 2946f5be8cdbSBram Moolenaar 'vim9script', 2947f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2948f5be8cdbSBram Moolenaar ], 'E477:') 2949a26b9700SBram Moolenaarenddef 2950a26b9700SBram Moolenaar 29517e5bd91dSBram Moolenaardef Test_finish() 29527e5bd91dSBram Moolenaar let lines =<< trim END 29537e5bd91dSBram Moolenaar vim9script 29546797966dSBram Moolenaar g:res = 'one' 29557e5bd91dSBram Moolenaar if v:false | finish | endif 29566797966dSBram Moolenaar g:res = 'two' 29577e5bd91dSBram Moolenaar finish 29586797966dSBram Moolenaar g:res = 'three' 29597e5bd91dSBram Moolenaar END 29607e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29617e5bd91dSBram Moolenaar source Xfinished 29627e5bd91dSBram Moolenaar assert_equal('two', g:res) 29637e5bd91dSBram Moolenaar 29647e5bd91dSBram Moolenaar unlet g:res 29657e5bd91dSBram Moolenaar delete('Xfinished') 29667e5bd91dSBram Moolenaarenddef 29677e5bd91dSBram Moolenaar 296832e35117SBram Moolenaardef Test_let_func_call() 296932e35117SBram Moolenaar let lines =<< trim END 297032e35117SBram Moolenaar vim9script 297132e35117SBram Moolenaar func GetValue() 297232e35117SBram Moolenaar if exists('g:count') 297332e35117SBram Moolenaar let g:count += 1 297432e35117SBram Moolenaar else 297532e35117SBram Moolenaar let g:count = 1 297632e35117SBram Moolenaar endif 297732e35117SBram Moolenaar return 'this' 297832e35117SBram Moolenaar endfunc 297932e35117SBram Moolenaar let val: string = GetValue() 2980f5be8cdbSBram Moolenaar # env var is always a string 2981df671b46SBram Moolenaar let env = $TERM 298232e35117SBram Moolenaar END 298332e35117SBram Moolenaar writefile(lines, 'Xfinished') 298432e35117SBram Moolenaar source Xfinished 2985f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 298632e35117SBram Moolenaar assert_equal(1, g:count) 298732e35117SBram Moolenaar 298832e35117SBram Moolenaar unlet g:count 298932e35117SBram Moolenaar delete('Xfinished') 299032e35117SBram Moolenaarenddef 299132e35117SBram Moolenaar 299232e35117SBram Moolenaardef Test_let_missing_type() 299332e35117SBram Moolenaar let lines =<< trim END 299432e35117SBram Moolenaar vim9script 2995df671b46SBram Moolenaar let var = g:unknown 2996227a69deSBram Moolenaar END 2997822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2998227a69deSBram Moolenaar 2999227a69deSBram Moolenaar lines =<< trim END 3000227a69deSBram Moolenaar vim9script 3001227a69deSBram Moolenaar let nr: number = 123 3002227a69deSBram Moolenaar let var = nr 3003227a69deSBram Moolenaar END 3004822ba247SBram Moolenaar CheckScriptSuccess(lines) 300532e35117SBram Moolenaarenddef 300632e35117SBram Moolenaar 3007c82a5b5dSBram Moolenaardef Test_let_declaration() 3008c82a5b5dSBram Moolenaar let lines =<< trim END 3009c82a5b5dSBram Moolenaar vim9script 3010c82a5b5dSBram Moolenaar let var: string 3011c82a5b5dSBram Moolenaar g:var_uninit = var 3012c82a5b5dSBram Moolenaar var = 'text' 3013c82a5b5dSBram Moolenaar g:var_test = var 3014f5be8cdbSBram Moolenaar # prefixing s: is optional 3015984dddbeSBram Moolenaar s:var = 'prefixed' 3016984dddbeSBram Moolenaar g:var_prefixed = s:var 3017984dddbeSBram Moolenaar 3018984dddbeSBram Moolenaar let s:other: number 3019984dddbeSBram Moolenaar other = 1234 3020984dddbeSBram Moolenaar g:other_var = other 302153b29e48SBram Moolenaar 302253b29e48SBram Moolenaar # type is inferred 302353b29e48SBram Moolenaar s:dict = {'a': 222} 302453b29e48SBram Moolenaar def GetDictVal(key: any) 302553b29e48SBram Moolenaar g:dict_val = s:dict[key] 302653b29e48SBram Moolenaar enddef 302753b29e48SBram Moolenaar GetDictVal('a') 3028c82a5b5dSBram Moolenaar END 3029c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3030c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3031c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3032984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3033984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 303453b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3035c82a5b5dSBram Moolenaar 3036c82a5b5dSBram Moolenaar unlet g:var_uninit 3037c82a5b5dSBram Moolenaar unlet g:var_test 3038984dddbeSBram Moolenaar unlet g:var_prefixed 3039984dddbeSBram Moolenaar unlet g:other_var 3040c82a5b5dSBram Moolenaarenddef 3041c82a5b5dSBram Moolenaar 3042c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3043c5b1c20bSBram Moolenaar let lines =<< trim END 3044c5b1c20bSBram Moolenaar vim9script 3045c5b1c20bSBram Moolenaar const var: string 3046c5b1c20bSBram Moolenaar END 3047c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3048c5b1c20bSBram Moolenaar 3049c5b1c20bSBram Moolenaar lines =<< trim END 3050c5b1c20bSBram Moolenaar vim9script 3051c5b1c20bSBram Moolenaar let 9var: string 3052c5b1c20bSBram Moolenaar END 3053c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3054c5b1c20bSBram Moolenaarenddef 3055c5b1c20bSBram Moolenaar 305634db91f7SBram Moolenaardef Test_let_type_check() 305734db91f7SBram Moolenaar let lines =<< trim END 305834db91f7SBram Moolenaar vim9script 305934db91f7SBram Moolenaar let var: string 306034db91f7SBram Moolenaar var = 1234 306134db91f7SBram Moolenaar END 3062451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3063984dddbeSBram Moolenaar 3064984dddbeSBram Moolenaar lines =<< trim END 3065984dddbeSBram Moolenaar vim9script 3066984dddbeSBram Moolenaar let var:string 3067984dddbeSBram Moolenaar END 3068984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3069c5b1c20bSBram Moolenaar 3070c5b1c20bSBram Moolenaar lines =<< trim END 3071c5b1c20bSBram Moolenaar vim9script 3072c5b1c20bSBram Moolenaar let var: asdf 3073c5b1c20bSBram Moolenaar END 3074c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3075a71e2633SBram Moolenaar 3076a71e2633SBram Moolenaar lines =<< trim END 3077a71e2633SBram Moolenaar vim9script 3078a71e2633SBram Moolenaar let s:l: list<number> 3079a71e2633SBram Moolenaar s:l = [] 3080a71e2633SBram Moolenaar END 3081a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3082a71e2633SBram Moolenaar 3083a71e2633SBram Moolenaar lines =<< trim END 3084a71e2633SBram Moolenaar vim9script 3085a71e2633SBram Moolenaar let s:d: dict<number> 3086a71e2633SBram Moolenaar s:d = {} 3087a71e2633SBram Moolenaar END 3088a71e2633SBram Moolenaar CheckScriptSuccess(lines) 308934db91f7SBram Moolenaarenddef 309034db91f7SBram Moolenaar 3091a5d0077eSBram Moolenaardef Test_forward_declaration() 3092a5d0077eSBram Moolenaar let lines =<< trim END 3093a5d0077eSBram Moolenaar vim9script 3094a5d0077eSBram Moolenaar def GetValue(): string 3095a5d0077eSBram Moolenaar return theVal 3096a5d0077eSBram Moolenaar enddef 3097a5d0077eSBram Moolenaar let theVal = 'something' 3098822ba247SBram Moolenaar g:initVal = GetValue() 3099a5d0077eSBram Moolenaar theVal = 'else' 3100a5d0077eSBram Moolenaar g:laterVal = GetValue() 3101a5d0077eSBram Moolenaar END 3102a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3103a5d0077eSBram Moolenaar source Xforward 3104a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3105a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3106a5d0077eSBram Moolenaar 3107a5d0077eSBram Moolenaar unlet g:initVal 3108a5d0077eSBram Moolenaar unlet g:laterVal 3109a5d0077eSBram Moolenaar delete('Xforward') 3110a5d0077eSBram Moolenaarenddef 3111a5d0077eSBram Moolenaar 31129721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 31139721fb4eSBram Moolenaar let legacy_lines =<< trim END 31149721fb4eSBram Moolenaar source Xvim9_script.vim 31159721fb4eSBram Moolenaar 31169721fb4eSBram Moolenaar call assert_false(exists('local')) 31179721fb4eSBram Moolenaar call assert_false(exists('exported')) 31189721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31199721fb4eSBram Moolenaar call assert_equal('global', global) 31209721fb4eSBram Moolenaar call assert_equal('global', g:global) 31219721fb4eSBram Moolenaar 31229721fb4eSBram Moolenaar " imported variable becomes script-local 31239721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31249721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31259721fb4eSBram Moolenaar call assert_false(exists('exported')) 31269721fb4eSBram Moolenaar 31279721fb4eSBram Moolenaar " imported function becomes script-local 31289721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31299721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31309721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31319721fb4eSBram Moolenaar END 31329721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31339721fb4eSBram Moolenaar 31349721fb4eSBram Moolenaar let vim9_lines =<< trim END 31359721fb4eSBram Moolenaar vim9script 31369721fb4eSBram Moolenaar let local = 'local' 31379721fb4eSBram Moolenaar g:global = 'global' 31389721fb4eSBram Moolenaar export let exported = 'exported' 31399721fb4eSBram Moolenaar export def GetText(): string 31409721fb4eSBram Moolenaar return 'text' 31419721fb4eSBram Moolenaar enddef 31429721fb4eSBram Moolenaar END 31439721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31449721fb4eSBram Moolenaar 31459721fb4eSBram Moolenaar source Xlegacy_script.vim 31469721fb4eSBram Moolenaar 31479721fb4eSBram Moolenaar assert_equal('global', g:global) 3148f5be8cdbSBram Moolenaar unlet g:global 31499721fb4eSBram Moolenaar 31509721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31519721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31529721fb4eSBram Moolenaarenddef 3153a5d0077eSBram Moolenaar 31547d699701SBram Moolenaarfunc Test_vim9script_not_global() 31557d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31567d699701SBram Moolenaar let vim9lines =<< trim END 31577d699701SBram Moolenaar vim9script 31587d699701SBram Moolenaar let var = 'local' 31597d699701SBram Moolenaar func TheFunc() 31607d699701SBram Moolenaar echo 'local' 31617d699701SBram Moolenaar endfunc 31627d699701SBram Moolenaar def DefFunc() 31637d699701SBram Moolenaar echo 'local' 31647d699701SBram Moolenaar enddef 31657d699701SBram Moolenaar END 31667d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31677d699701SBram Moolenaar source Xvim9script.vim 31687d699701SBram Moolenaar try 31697d699701SBram Moolenaar echo g:var 31707d699701SBram Moolenaar assert_report('did not fail') 31717d699701SBram Moolenaar catch /E121:/ 31727d699701SBram Moolenaar " caught 31737d699701SBram Moolenaar endtry 31747d699701SBram Moolenaar try 31757d699701SBram Moolenaar call TheFunc() 31767d699701SBram Moolenaar assert_report('did not fail') 31777d699701SBram Moolenaar catch /E117:/ 31787d699701SBram Moolenaar " caught 31797d699701SBram Moolenaar endtry 31807d699701SBram Moolenaar try 31817d699701SBram Moolenaar call DefFunc() 31827d699701SBram Moolenaar assert_report('did not fail') 31837d699701SBram Moolenaar catch /E117:/ 31847d699701SBram Moolenaar " caught 31857d699701SBram Moolenaar endtry 31867d699701SBram Moolenaar 318725859dd7SBram Moolenaar call delete('Xvim9script.vim') 31887d699701SBram Moolenaarendfunc 31897d699701SBram Moolenaar 3190eeb27bfeSBram Moolenaardef Test_vim9_copen() 3191eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3192eeb27bfeSBram Moolenaar copen 3193eeb27bfeSBram Moolenaar quit 3194eeb27bfeSBram Moolenaarenddef 3195eeb27bfeSBram Moolenaar 31962d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 31972d6b20d6SBram Moolenaardef Test_vim9_autoload() 31982d6b20d6SBram Moolenaar let lines =<< trim END 31992d6b20d6SBram Moolenaar vim9script 32002d6b20d6SBram Moolenaar def foo#test() 32012d6b20d6SBram Moolenaar echomsg getreg('"') 32022d6b20d6SBram Moolenaar enddef 32032d6b20d6SBram Moolenaar END 32042d6b20d6SBram Moolenaar 32052d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32062d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 32072d6b20d6SBram Moolenaar let save_rtp = &rtp 32082d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32092d6b20d6SBram Moolenaar augroup test 32102d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32112d6b20d6SBram Moolenaar augroup END 32122d6b20d6SBram Moolenaar 32132d6b20d6SBram Moolenaar normal Y 32142d6b20d6SBram Moolenaar 32152d6b20d6SBram Moolenaar augroup test 32162d6b20d6SBram Moolenaar autocmd! 32172d6b20d6SBram Moolenaar augroup END 32182d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32192d6b20d6SBram Moolenaar &rtp = save_rtp 32202d6b20d6SBram Moolenaarenddef 32212d6b20d6SBram Moolenaar 322281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 322381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 322481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 322581e17fbeSBram Moolenaar let lines =<< trim END 322681e17fbeSBram Moolenaar let s:counter = 1 322781e17fbeSBram Moolenaar def s:Func() 322881e17fbeSBram Moolenaar au! CursorHold 322981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 323081e17fbeSBram Moolenaar enddef 323181e17fbeSBram Moolenaar call s:Func() 323281e17fbeSBram Moolenaar doau CursorHold 323381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 323481e17fbeSBram Moolenaar au! CursorHold 323581e17fbeSBram Moolenaar END 323681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 323781e17fbeSBram Moolenaarenddef 323881e17fbeSBram Moolenaar 32393896a105SBram Moolenaardef Test_cmdline_win() 32403896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32413896a105SBram Moolenaar # the command line window. 32423896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32433896a105SBram Moolenaar let export_lines =<< trim END 32443896a105SBram Moolenaar vim9script 32453896a105SBram Moolenaar export let That = 'yes' 32463896a105SBram Moolenaar END 32473896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32483896a105SBram Moolenaar let import_lines =<< trim END 32493896a105SBram Moolenaar vim9script 32503896a105SBram Moolenaar import That from './Xexport.vim' 32513896a105SBram Moolenaar END 32523896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32533896a105SBram Moolenaar let save_rtp = &rtp 32543896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32553896a105SBram Moolenaar syntax on 32563896a105SBram Moolenaar augroup CmdWin 32573896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32583896a105SBram Moolenaar augroup END 32593896a105SBram Moolenaar # this will open and also close the cmdline window 32603896a105SBram Moolenaar feedkeys('q:', 'xt') 32613896a105SBram Moolenaar assert_equal('yes', g:got_there) 32623896a105SBram Moolenaar 32633896a105SBram Moolenaar augroup CmdWin 32643896a105SBram Moolenaar au! 32653896a105SBram Moolenaar augroup END 32663896a105SBram Moolenaar &rtp = save_rtp 32673896a105SBram Moolenaar delete('rtp', 'rf') 32683896a105SBram Moolenaarenddef 32693896a105SBram Moolenaar 3270e3d4685fSBram Moolenaardef Test_invalid_sid() 3271e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 327225859dd7SBram Moolenaar 3273e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3274d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3275e3d4685fSBram Moolenaar endif 3276e3d4685fSBram Moolenaar delete('Xdidit') 3277e3d4685fSBram Moolenaarenddef 3278e3d4685fSBram Moolenaar 3279585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3280585fea7bSBram Moolenaardef Test_substitute_cmd() 3281585fea7bSBram Moolenaar new 3282585fea7bSBram Moolenaar setline(1, 'something') 3283585fea7bSBram Moolenaar :substitute(some(other( 3284585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3285585fea7bSBram Moolenaar bwipe! 3286585fea7bSBram Moolenaar 3287f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3288585fea7bSBram Moolenaar let lines =<< trim END 3289585fea7bSBram Moolenaar vim9script 3290585fea7bSBram Moolenaar new 3291585fea7bSBram Moolenaar setline(1, 'something') 3292585fea7bSBram Moolenaar :substitute(some(other( 3293585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3294585fea7bSBram Moolenaar bwipe! 3295585fea7bSBram Moolenaar END 3296585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3297585fea7bSBram Moolenaar source Xvim9lines 3298585fea7bSBram Moolenaar 3299585fea7bSBram Moolenaar delete('Xvim9lines') 3300585fea7bSBram Moolenaarenddef 3301585fea7bSBram Moolenaar 33028a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3303