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 7*e3d4685fSBram 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 48f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 49f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 501cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 5198b4f145SBram Moolenaar call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 52f93c7feaSBram Moolenaar 534cdb13ceSBram Moolenaar let nr: number = 1234 54451c2e35SBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:') 554cdb13ceSBram Moolenaar 56b209750bSBram Moolenaar let a: number = 6 #comment 579be61bbbSBram Moolenaar assert_equal(6, a) 589be61bbbSBram Moolenaar 5942a480bfSBram Moolenaar if has('channel') 6042a480bfSBram Moolenaar let chan1: channel 61fbdd08edSBram Moolenaar let job1: job 62f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 6342a480bfSBram Moolenaar endif 64fbdd08edSBram Moolenaar if has('float') 65fbdd08edSBram Moolenaar let float1: float = 3.4 66fbdd08edSBram Moolenaar endif 675deeb3f1SBram Moolenaar let Funky1: func 685deeb3f1SBram Moolenaar let Funky2: func = function('len') 694c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 7042a480bfSBram Moolenaar 71b209750bSBram Moolenaar g:newvar = 'new' #comment 72401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 73401d9ffbSBram Moolenaar 74401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 75401d9ffbSBram Moolenaar g:existing = 'no' 76401d9ffbSBram Moolenaar assert_equal('no', g:existing) 77401d9ffbSBram Moolenaar 78b283a8a6SBram Moolenaar v:char = 'abc' 796e587dcbSBram Moolenaar assert_equal('abc', v:char) 80b283a8a6SBram Moolenaar 81b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 826e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 83b283a8a6SBram Moolenaar $ENVVAR = '' 846e587dcbSBram Moolenaar 85b5ed2660SBram Moolenaar let lines =<< trim END 86b5ed2660SBram Moolenaar vim9script 87b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 88b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 89b5ed2660SBram Moolenaar $ENVVAR = '' 90b5ed2660SBram Moolenaar END 91b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 92b5ed2660SBram Moolenaar 93fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 94fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 95fd1823e0SBram Moolenaar s:addToMe += 222 96fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 970bbf722aSBram Moolenaar s:newVar = 'new' 980bbf722aSBram Moolenaar assert_equal('new', s:newVar) 99a8c17704SBram Moolenaar 100a8c17704SBram Moolenaar set ts=7 101a8c17704SBram Moolenaar &ts += 1 102a8c17704SBram Moolenaar assert_equal(8, &ts) 10380c34ca3SBram Moolenaar &ts -= 3 10480c34ca3SBram Moolenaar assert_equal(5, &ts) 10580c34ca3SBram Moolenaar &ts *= 2 10680c34ca3SBram Moolenaar assert_equal(10, &ts) 10780c34ca3SBram Moolenaar &ts /= 3 10880c34ca3SBram Moolenaar assert_equal(3, &ts) 10980c34ca3SBram Moolenaar set ts=10 11080c34ca3SBram Moolenaar &ts %= 4 11180c34ca3SBram Moolenaar assert_equal(2, &ts) 112b5ed2660SBram Moolenaar 11393ad1471SBram Moolenaar if has('float') 11493ad1471SBram Moolenaar let f100: float = 100.0 11593ad1471SBram Moolenaar f100 /= 5 11693ad1471SBram Moolenaar assert_equal(20.0, f100) 11793ad1471SBram Moolenaar 11893ad1471SBram Moolenaar let f200: float = 200.0 11993ad1471SBram Moolenaar f200 /= 5.0 12093ad1471SBram Moolenaar assert_equal(40.0, f200) 12193ad1471SBram Moolenaar 12293ad1471SBram Moolenaar CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:') 12393ad1471SBram Moolenaar endif 12493ad1471SBram Moolenaar 125b5ed2660SBram Moolenaar lines =<< trim END 126b5ed2660SBram Moolenaar &ts = 6 127b5ed2660SBram Moolenaar &ts += 3 128b5ed2660SBram Moolenaar assert_equal(9, &ts) 1292e800955SBram Moolenaar 1302e800955SBram Moolenaar &l:ts = 6 1312e800955SBram Moolenaar assert_equal(6, &ts) 1322e800955SBram Moolenaar &l:ts += 2 1332e800955SBram Moolenaar assert_equal(8, &ts) 1342e800955SBram Moolenaar 1352e800955SBram Moolenaar &g:ts = 6 1362e800955SBram Moolenaar assert_equal(6, &g:ts) 1372e800955SBram Moolenaar &g:ts += 2 1382e800955SBram Moolenaar assert_equal(8, &g:ts) 139b5ed2660SBram Moolenaar END 1402e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 141b5ed2660SBram Moolenaar 1420aae4809SBram Moolenaar CheckDefFailure(['¬ex += 3'], 'E113:') 1430aae4809SBram Moolenaar CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 1440aae4809SBram Moolenaar CheckDefFailure(['&ts = [7]'], 'E1012:') 1450aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 1460aae4809SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 1470aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 1480aae4809SBram Moolenaar CheckDefFailure(['&path += 3'], 'E1012:') 1490aae4809SBram Moolenaar CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 150cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 1510aae4809SBram Moolenaar CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 15280c34ca3SBram Moolenaar &ts = 8 153a8c17704SBram Moolenaar 1540aae4809SBram Moolenaar lines =<< trim END 1550aae4809SBram Moolenaar let save_TI = &t_TI 1560aae4809SBram Moolenaar &t_TI = '' 1570aae4809SBram Moolenaar assert_equal('', &t_TI) 1580aae4809SBram Moolenaar &t_TI = 'xxx' 1590aae4809SBram Moolenaar assert_equal('xxx', &t_TI) 1600aae4809SBram Moolenaar &t_TI = save_TI 1610aae4809SBram Moolenaar END 1620aae4809SBram Moolenaar CheckDefSuccess(lines) 1630aae4809SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 1640aae4809SBram Moolenaar 1650aae4809SBram Moolenaar CheckDefFailure(['&t_TI = 123'], 'E1012:') 1660aae4809SBram Moolenaar CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') 1670aae4809SBram Moolenaar 1680aae4809SBram Moolenaar CheckDefFailure(['let s:var = 123'], 'E1101:') 1690aae4809SBram Moolenaar CheckDefFailure(['let s:var: number'], 'E1101:') 17033afa244SBram Moolenaar 171f9b2b496SBram Moolenaar lines =<< trim END 172f9b2b496SBram Moolenaar vim9script 173f9b2b496SBram Moolenaar def SomeFunc() 174f9b2b496SBram Moolenaar s:var = 123 175f9b2b496SBram Moolenaar enddef 176f9b2b496SBram Moolenaar defcompile 177f9b2b496SBram Moolenaar END 178f9b2b496SBram Moolenaar call CheckScriptFailure(lines, 'E1089:') 179f9b2b496SBram Moolenaar 180a8c17704SBram Moolenaar g:inc_counter += 1 181a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 182a8c17704SBram Moolenaar 183a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 184a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 185dd29f1b0SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 186451c2e35SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 187a8c17704SBram Moolenaar 188b5ed2660SBram Moolenaar lines =<< trim END 189b5ed2660SBram Moolenaar @c = 'areg' 190b5ed2660SBram Moolenaar @c ..= 'add' 191b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 192b5ed2660SBram Moolenaar END 1932e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 1942e800955SBram Moolenaar 1952e800955SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1051:') 1962e800955SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1012:') 197b5ed2660SBram Moolenaar 198e69f6d04SBram Moolenaar v:errmsg = 'none' 199e69f6d04SBram Moolenaar v:errmsg ..= 'again' 200e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 201dd29f1b0SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 202451c2e35SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1012:') 20333afa244SBram Moolenaar 20433afa244SBram Moolenaar # single letter variables 20533afa244SBram Moolenaar a = 123 20633afa244SBram Moolenaar assert_equal(123, a) 20733afa244SBram Moolenaar let b: number 20833afa244SBram Moolenaar b = 123 20933afa244SBram Moolenaar assert_equal(123, b) 21033afa244SBram Moolenaar let g: number 21133afa244SBram Moolenaar g = 123 21233afa244SBram Moolenaar assert_equal(123, g) 21333afa244SBram Moolenaar let s: number 21433afa244SBram Moolenaar s = 123 21533afa244SBram Moolenaar assert_equal(123, s) 21633afa244SBram Moolenaar let t: number 21733afa244SBram Moolenaar t = 123 21833afa244SBram Moolenaar assert_equal(123, t) 21933afa244SBram Moolenaar let v: number 22033afa244SBram Moolenaar v = 123 22133afa244SBram Moolenaar assert_equal(123, v) 22233afa244SBram Moolenaar let w: number 22333afa244SBram Moolenaar w = 123 22433afa244SBram Moolenaar assert_equal(123, w) 2255deeb3f1SBram Moolenaarenddef 2265deeb3f1SBram Moolenaar 2273b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 2283b74b6b4SBram Moolenaar let lines =<< trim END 2293b74b6b4SBram Moolenaar vim9script 2303b74b6b4SBram Moolenaar 231f5be8cdbSBram Moolenaar # single character variable declarations work 2323b74b6b4SBram Moolenaar let a: string 2333b74b6b4SBram Moolenaar let b: number 2343b74b6b4SBram Moolenaar let l: list<any> 2353b74b6b4SBram Moolenaar let s: string 2363b74b6b4SBram Moolenaar let t: number 2373b74b6b4SBram Moolenaar let v: number 2383b74b6b4SBram Moolenaar let w: number 2393b74b6b4SBram Moolenaar 240f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 2413b74b6b4SBram Moolenaar a = 'script-a' 2423b74b6b4SBram Moolenaar b = 111 2433b74b6b4SBram Moolenaar l = [1, 2, 3] 2443b74b6b4SBram Moolenaar s = 'script-s' 2453b74b6b4SBram Moolenaar t = 222 2463b74b6b4SBram Moolenaar v = 333 2473b74b6b4SBram Moolenaar w = 444 2483b74b6b4SBram Moolenaar 2493b74b6b4SBram Moolenaar assert_equal('script-a', a) 2503b74b6b4SBram Moolenaar assert_equal(111, b) 2513b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2523b74b6b4SBram Moolenaar assert_equal('script-s', s) 2533b74b6b4SBram Moolenaar assert_equal(222, t) 2543b74b6b4SBram Moolenaar assert_equal(333, v) 2553b74b6b4SBram Moolenaar assert_equal(444, w) 2563b74b6b4SBram Moolenaar END 2573b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2583b74b6b4SBram Moolenaar source Xsinglechar 2593b74b6b4SBram Moolenaar delete('Xsinglechar') 2603b74b6b4SBram Moolenaarenddef 2613b74b6b4SBram Moolenaar 26284370087SBram Moolenaardef Test_assignment_list() 26384370087SBram Moolenaar let list1: list<bool> = [false, true, false] 26484370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 26584370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 26684370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 26784370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 26884370087SBram Moolenaar 26984370087SBram Moolenaar let listS: list<string> = [] 27084370087SBram Moolenaar let listN: list<number> = [] 27184370087SBram Moolenaar 27284370087SBram Moolenaar assert_equal([1, 2, 3], list2) 27384370087SBram Moolenaar list2[-1] = 99 27484370087SBram Moolenaar assert_equal([1, 2, 99], list2) 27584370087SBram Moolenaar list2[-2] = 88 27684370087SBram Moolenaar assert_equal([1, 88, 99], list2) 27784370087SBram Moolenaar list2[-3] = 77 27884370087SBram Moolenaar assert_equal([77, 88, 99], list2) 279dd29f1b0SBram Moolenaar list2 += [100] 280dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 281dd29f1b0SBram Moolenaar 282dd29f1b0SBram Moolenaar list3 += ['end'] 283dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 284dd29f1b0SBram Moolenaar 285dd29f1b0SBram Moolenaar 28684370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 287c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 28884370087SBram Moolenaar 28984370087SBram Moolenaar # type becomes list<any> 29084370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 29184370087SBram Moolenaarenddef 29284370087SBram Moolenaar 293b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 294b31be3f9SBram Moolenaar let lines =<< trim END 295b31be3f9SBram Moolenaar vim9script 296b31be3f9SBram Moolenaar let v1: number 297b31be3f9SBram Moolenaar let v2: number 298b31be3f9SBram Moolenaar let v3: number 299b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 300b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 301b31be3f9SBram Moolenaar END 302b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 303b31be3f9SBram Moolenaarenddef 304b31be3f9SBram Moolenaar 30584370087SBram Moolenaardef Test_assignment_dict() 30684370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 30784370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 30884370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 30984370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 31074fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 31184370087SBram Moolenaar 312f5be8cdbSBram Moolenaar # overwrite 313c785b9a7SBram Moolenaar dict3['key'] = 'another' 314c785b9a7SBram Moolenaar 31558626872SBram Moolenaar # empty key can be used 31658626872SBram Moolenaar let dd = {} 31758626872SBram Moolenaar dd[""] = 6 31858626872SBram Moolenaar assert_equal({'': 6}, dd) 31984370087SBram Moolenaar 32084370087SBram Moolenaar # type becomes dict<any> 32184370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 3228e4c8c85SBram Moolenaar 3238e4c8c85SBram Moolenaar # assignment to script-local dict 3248e4c8c85SBram Moolenaar let lines =<< trim END 3258e4c8c85SBram Moolenaar vim9script 3268e4c8c85SBram Moolenaar let test: dict<any> = {} 3278e4c8c85SBram Moolenaar def FillDict(): dict<any> 3288e4c8c85SBram Moolenaar test['a'] = 43 3298e4c8c85SBram Moolenaar return test 3308e4c8c85SBram Moolenaar enddef 3318e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3328e4c8c85SBram Moolenaar END 3338e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 3348e4c8c85SBram Moolenaar 3358e4c8c85SBram Moolenaar lines =<< trim END 3368e4c8c85SBram Moolenaar vim9script 3378e4c8c85SBram Moolenaar let test: dict<any> 3388e4c8c85SBram Moolenaar def FillDict(): dict<any> 3398e4c8c85SBram Moolenaar test['a'] = 43 3408e4c8c85SBram Moolenaar return test 3418e4c8c85SBram Moolenaar enddef 3428e4c8c85SBram Moolenaar FillDict() 3438e4c8c85SBram Moolenaar END 3448e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 3452caa1594SBram Moolenaar 3462caa1594SBram Moolenaar # assignment to global dict 3472caa1594SBram Moolenaar lines =<< trim END 3482caa1594SBram Moolenaar vim9script 3492caa1594SBram Moolenaar g:test = {} 3502caa1594SBram Moolenaar def FillDict(): dict<any> 3512caa1594SBram Moolenaar g:test['a'] = 43 3522caa1594SBram Moolenaar return g:test 3532caa1594SBram Moolenaar enddef 3542caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3552caa1594SBram Moolenaar END 3562caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3572caa1594SBram Moolenaar 3582caa1594SBram Moolenaar # assignment to buffer dict 3592caa1594SBram Moolenaar lines =<< trim END 3602caa1594SBram Moolenaar vim9script 3612caa1594SBram Moolenaar b:test = {} 3622caa1594SBram Moolenaar def FillDict(): dict<any> 3632caa1594SBram Moolenaar b:test['a'] = 43 3642caa1594SBram Moolenaar return b:test 3652caa1594SBram Moolenaar enddef 3662caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3672caa1594SBram Moolenaar END 3682caa1594SBram Moolenaar call CheckScriptSuccess(lines) 36984370087SBram Moolenaarenddef 37084370087SBram Moolenaar 371d3aac291SBram Moolenaardef Test_assignment_local() 372f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 373f5be8cdbSBram Moolenaar # changed. 374d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 375d3aac291SBram Moolenaar let b:existing = 'yes' 376d3aac291SBram Moolenaar let w:existing = 'yes' 377d3aac291SBram Moolenaar let t:existing = 'yes' 378d3aac291SBram Moolenaar 379d3aac291SBram Moolenaar def Test_assignment_local_internal() 380d3aac291SBram Moolenaar b:newvar = 'new' 381d3aac291SBram Moolenaar assert_equal('new', b:newvar) 382d3aac291SBram Moolenaar assert_equal('yes', b:existing) 383d3aac291SBram Moolenaar b:existing = 'no' 384d3aac291SBram Moolenaar assert_equal('no', b:existing) 385396f3138SBram Moolenaar b:existing ..= 'NO' 386396f3138SBram Moolenaar assert_equal('noNO', b:existing) 387d3aac291SBram Moolenaar 388d3aac291SBram Moolenaar w:newvar = 'new' 389d3aac291SBram Moolenaar assert_equal('new', w:newvar) 390d3aac291SBram Moolenaar assert_equal('yes', w:existing) 391d3aac291SBram Moolenaar w:existing = 'no' 392d3aac291SBram Moolenaar assert_equal('no', w:existing) 393396f3138SBram Moolenaar w:existing ..= 'NO' 394396f3138SBram Moolenaar assert_equal('noNO', w:existing) 395d3aac291SBram Moolenaar 396d3aac291SBram Moolenaar t:newvar = 'new' 397d3aac291SBram Moolenaar assert_equal('new', t:newvar) 398d3aac291SBram Moolenaar assert_equal('yes', t:existing) 399d3aac291SBram Moolenaar t:existing = 'no' 400d3aac291SBram Moolenaar assert_equal('no', t:existing) 401396f3138SBram Moolenaar t:existing ..= 'NO' 402396f3138SBram Moolenaar assert_equal('noNO', t:existing) 403d3aac291SBram Moolenaar enddef 404d3aac291SBram Moolenaar call Test_assignment_local_internal() 405d3aac291SBram Moolenaar END 406d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 407d3aac291SBram Moolenaarenddef 408d3aac291SBram Moolenaar 4095deeb3f1SBram Moolenaardef Test_assignment_default() 410e69f6d04SBram Moolenaar 411cb711abfSBram Moolenaar # Test default values. 412e69f6d04SBram Moolenaar let thebool: bool 413e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 414e69f6d04SBram Moolenaar 415e69f6d04SBram Moolenaar let thenumber: number 416e69f6d04SBram Moolenaar assert_equal(0, thenumber) 417e69f6d04SBram Moolenaar 418e69f6d04SBram Moolenaar if has('float') 419e69f6d04SBram Moolenaar let thefloat: float 420e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 421e69f6d04SBram Moolenaar endif 422e69f6d04SBram Moolenaar 423e69f6d04SBram Moolenaar let thestring: string 424e69f6d04SBram Moolenaar assert_equal('', thestring) 425e69f6d04SBram Moolenaar 426e69f6d04SBram Moolenaar let theblob: blob 427e69f6d04SBram Moolenaar assert_equal(0z, theblob) 428e69f6d04SBram Moolenaar 4295deeb3f1SBram Moolenaar let Thefunc: func 4305deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 431e69f6d04SBram Moolenaar 432e69f6d04SBram Moolenaar let thelist: list<any> 433e69f6d04SBram Moolenaar assert_equal([], thelist) 434e69f6d04SBram Moolenaar 435e69f6d04SBram Moolenaar let thedict: dict<any> 436e69f6d04SBram Moolenaar assert_equal({}, thedict) 437e69f6d04SBram Moolenaar 4382c869deeSBram Moolenaar if has('channel') 439e69f6d04SBram Moolenaar let thejob: job 440e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 441e69f6d04SBram Moolenaar 442e69f6d04SBram Moolenaar let thechannel: channel 443e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 444c785b9a7SBram Moolenaar 445c785b9a7SBram Moolenaar if has('unix') && executable('cat') 446f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 447c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 448c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 449c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 450c785b9a7SBram Moolenaar endif 4512c869deeSBram Moolenaar endif 452585fea7bSBram Moolenaar 453585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 454585fea7bSBram Moolenaar assert_equal(5678, nr) 4558a7d6542SBram Moolenaarenddef 4568a7d6542SBram Moolenaar 45747a519a9SBram Moolenaardef Test_assignment_var_list() 45847a519a9SBram Moolenaar let v1: string 45947a519a9SBram Moolenaar let v2: string 4609af78769SBram Moolenaar let vrem: list<string> 4619af78769SBram Moolenaar [v1] = ['aaa'] 4629af78769SBram Moolenaar assert_equal('aaa', v1) 4639af78769SBram Moolenaar 46447a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 46547a519a9SBram Moolenaar assert_equal('one', v1) 46647a519a9SBram Moolenaar assert_equal('two', v2) 4679af78769SBram Moolenaar 4689af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4699af78769SBram Moolenaar assert_equal('one', v1) 4709af78769SBram Moolenaar assert_equal('two', v2) 4719af78769SBram Moolenaar assert_equal([], vrem) 4729af78769SBram Moolenaar 4739af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4749af78769SBram Moolenaar assert_equal('one', v1) 4759af78769SBram Moolenaar assert_equal('two', v2) 4769af78769SBram Moolenaar assert_equal(['three'], vrem) 4771c199f9cSBram Moolenaar 4781c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 4791c199f9cSBram Moolenaar assert_equal(3, &ts) 4801c199f9cSBram Moolenaar assert_equal(4, &sw) 4811c199f9cSBram Moolenaar set ts=8 sw=4 48247a519a9SBram Moolenaarenddef 48347a519a9SBram Moolenaar 484c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 485c7e44a7eSBram Moolenaar let lines =<< trim END 486c7e44a7eSBram Moolenaar vim9script 487c7e44a7eSBram Moolenaar def Func(): list<number> 488c7e44a7eSBram Moolenaar return [1, 2] 489c7e44a7eSBram Moolenaar enddef 490c7e44a7eSBram Moolenaar let var1: number 491c7e44a7eSBram Moolenaar let var2: number 492c7e44a7eSBram Moolenaar [var1, var2] = 493c7e44a7eSBram Moolenaar Func() 494c7e44a7eSBram Moolenaar assert_equal(1, var1) 495c7e44a7eSBram Moolenaar assert_equal(2, var2) 496c7e44a7eSBram Moolenaar let ll = 497c7e44a7eSBram Moolenaar Func() 498c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 49983144546SBram Moolenaar 50083144546SBram Moolenaar @/ = 'text' 50183144546SBram Moolenaar assert_equal('text', @/) 50283144546SBram Moolenaar @0 = 'zero' 50383144546SBram Moolenaar assert_equal('zero', @0) 50483144546SBram Moolenaar @1 = 'one' 50583144546SBram Moolenaar assert_equal('one', @1) 50683144546SBram Moolenaar @9 = 'nine' 50783144546SBram Moolenaar assert_equal('nine', @9) 50883144546SBram Moolenaar @- = 'minus' 50983144546SBram Moolenaar assert_equal('minus', @-) 51083144546SBram Moolenaar if has('clipboard_working') 51183144546SBram Moolenaar @* = 'star' 51283144546SBram Moolenaar assert_equal('star', @*) 51383144546SBram Moolenaar @+ = 'plus' 51483144546SBram Moolenaar assert_equal('plus', @+) 51583144546SBram Moolenaar endif 51695dd9f25SBram Moolenaar 51795dd9f25SBram Moolenaar let a: number = 123 51895dd9f25SBram Moolenaar assert_equal(123, a) 51995dd9f25SBram Moolenaar let s: string = 'yes' 52095dd9f25SBram Moolenaar assert_equal('yes', s) 52195dd9f25SBram Moolenaar let b: number = 42 52295dd9f25SBram Moolenaar assert_equal(42, b) 52395dd9f25SBram Moolenaar let w: number = 43 52495dd9f25SBram Moolenaar assert_equal(43, w) 52595dd9f25SBram Moolenaar let t: number = 44 52695dd9f25SBram Moolenaar assert_equal(44, t) 527c7e44a7eSBram Moolenaar END 528c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 529c7e44a7eSBram Moolenaarenddef 530c7e44a7eSBram Moolenaar 531cab27678SBram Moolenaardef Mess(): string 532cab27678SBram Moolenaar v:foldstart = 123 533cab27678SBram Moolenaar return 'xxx' 534cab27678SBram Moolenaarenddef 535cab27678SBram Moolenaar 536d72c1bf0SBram Moolenaardef Test_assignment_failure() 5378a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 5388a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 5398a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 5408a7d6542SBram Moolenaar 54163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 54263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 54363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 54463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 54563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 54663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 54763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 54863be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 54963be3d4bSBram Moolenaar 5508a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 5518a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 5528a7d6542SBram Moolenaar 5539b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 5549af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5559af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 5569af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5579af78769SBram Moolenaar '[a] = []'], 'E1093:') 5589af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5599af78769SBram Moolenaar 'let y: number', 5609af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 5619af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5629af78769SBram Moolenaar 'let y: number', 5639af78769SBram Moolenaar 'let z: list<number>', 5649af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5659be61bbbSBram Moolenaar 566e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 567c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5689be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 569c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5709be61bbbSBram Moolenaar 571e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 572c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5739be61bbbSBram Moolenaar 574434d72cbSBram Moolenaar if has('dnd') 57565821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 576434d72cbSBram Moolenaar else 577434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 578434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 579434d72cbSBram Moolenaar endif 5809be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 58165821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 582c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5839be61bbbSBram Moolenaar 584e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 585e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 586e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 587e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5889be61bbbSBram Moolenaar 5899be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 590122616d9SBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:', 1) 591122616d9SBram Moolenaar call CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:') 592122616d9SBram Moolenaar call CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1) 593122616d9SBram Moolenaar call CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:') 5949be61bbbSBram Moolenaar 595451c2e35SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 59633fa29cfSBram Moolenaar 5978a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5988a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5998a7d6542SBram Moolenaar 6008a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 6018a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 6028a7d6542SBram Moolenaar 6038a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 6048a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 60542a480bfSBram Moolenaar 606d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 60742a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 608cab27678SBram Moolenaar 609cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 610cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 61143e969d3SBram Moolenaar 61243e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 61343e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 61443e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 61543e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 61643e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 61743e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 61843e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 61943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 620d72c1bf0SBram Moolenaarenddef 621d72c1bf0SBram Moolenaar 622d72c1bf0SBram Moolenaardef Test_unlet() 623d72c1bf0SBram Moolenaar g:somevar = 'yes' 624d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 625d72c1bf0SBram Moolenaar unlet g:somevar 626d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 627d72c1bf0SBram Moolenaar unlet! g:somevar 628d72c1bf0SBram Moolenaar 6298436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 6308436773fSBram Moolenaar s:somevar = 'legacy' 6318436773fSBram Moolenaar assert_true(exists('s:somevar')) 6328436773fSBram Moolenaar unlet s:somevar 6338436773fSBram Moolenaar assert_false(exists('s:somevar')) 6348436773fSBram Moolenaar unlet! s:somevar 6358436773fSBram Moolenaar 636d72c1bf0SBram Moolenaar call CheckScriptFailure([ 637d72c1bf0SBram Moolenaar 'vim9script', 638d72c1bf0SBram Moolenaar 'let svar = 123', 639d72c1bf0SBram Moolenaar 'unlet svar', 640d72c1bf0SBram Moolenaar ], 'E1081:') 641d72c1bf0SBram Moolenaar call CheckScriptFailure([ 642d72c1bf0SBram Moolenaar 'vim9script', 643d72c1bf0SBram Moolenaar 'let svar = 123', 644d72c1bf0SBram Moolenaar 'unlet s:svar', 645d72c1bf0SBram Moolenaar ], 'E1081:') 646d72c1bf0SBram Moolenaar call CheckScriptFailure([ 647d72c1bf0SBram Moolenaar 'vim9script', 648d72c1bf0SBram Moolenaar 'let svar = 123', 649d72c1bf0SBram Moolenaar 'def Func()', 650d72c1bf0SBram Moolenaar ' unlet svar', 651d72c1bf0SBram Moolenaar 'enddef', 652822ba247SBram Moolenaar 'defcompile', 653d72c1bf0SBram Moolenaar ], 'E1081:') 654d72c1bf0SBram Moolenaar call CheckScriptFailure([ 655d72c1bf0SBram Moolenaar 'vim9script', 656d72c1bf0SBram Moolenaar 'let svar = 123', 657d72c1bf0SBram Moolenaar 'def Func()', 658d72c1bf0SBram Moolenaar ' unlet s:svar', 659d72c1bf0SBram Moolenaar 'enddef', 660822ba247SBram Moolenaar 'defcompile', 661d72c1bf0SBram Moolenaar ], 'E1081:') 6627bdaea6eSBram Moolenaar 6637bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6647bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6657bdaea6eSBram Moolenaar unlet $ENVVAR 6667bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 667d72c1bf0SBram Moolenaarenddef 668599c89c8SBram Moolenaar 6694c17ad94SBram Moolenaardef Test_delfunction() 670f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6714c17ad94SBram Moolenaar CheckScriptSuccess([ 6724c17ad94SBram Moolenaar 'vim9script', 6734c17ad94SBram Moolenaar 'func CheckMe()', 6744c17ad94SBram Moolenaar ' return 123', 6754c17ad94SBram Moolenaar 'endfunc', 6764c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6774c17ad94SBram Moolenaar ]) 6784c17ad94SBram Moolenaar 679f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6804c17ad94SBram Moolenaar CheckScriptFailure([ 6814c17ad94SBram Moolenaar 'vim9script', 6824c17ad94SBram Moolenaar 'func DeleteMe1()', 6834c17ad94SBram Moolenaar 'endfunc', 6844c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6854c17ad94SBram Moolenaar ], 'E1084:') 6864c17ad94SBram Moolenaar CheckScriptFailure([ 6874c17ad94SBram Moolenaar 'vim9script', 6884c17ad94SBram Moolenaar 'func DeleteMe2()', 6894c17ad94SBram Moolenaar 'endfunc', 6904c17ad94SBram Moolenaar 'def DoThat()', 6914c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6924c17ad94SBram Moolenaar 'enddef', 6934c17ad94SBram Moolenaar 'DoThat()', 6944c17ad94SBram Moolenaar ], 'E1084:') 6954c17ad94SBram Moolenaar CheckScriptFailure([ 6964c17ad94SBram Moolenaar 'vim9script', 6974c17ad94SBram Moolenaar 'def DeleteMe3()', 6984c17ad94SBram Moolenaar 'enddef', 6994c17ad94SBram Moolenaar 'delfunction DeleteMe3', 7004c17ad94SBram Moolenaar ], 'E1084:') 7014c17ad94SBram Moolenaar CheckScriptFailure([ 7024c17ad94SBram Moolenaar 'vim9script', 7034c17ad94SBram Moolenaar 'def DeleteMe4()', 7044c17ad94SBram Moolenaar 'enddef', 7054c17ad94SBram Moolenaar 'def DoThat()', 7064c17ad94SBram Moolenaar ' delfunction DeleteMe4', 7074c17ad94SBram Moolenaar 'enddef', 7084c17ad94SBram Moolenaar 'DoThat()', 7094c17ad94SBram Moolenaar ], 'E1084:') 710925e9fd6SBram Moolenaar 711925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 712925e9fd6SBram Moolenaar let lines =<< trim END 713925e9fd6SBram Moolenaar vim9script 714925e9fd6SBram Moolenaar def g:Global(): string 715925e9fd6SBram Moolenaar return "yes" 716925e9fd6SBram Moolenaar enddef 717925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 718925e9fd6SBram Moolenaar def! g:Global(): string 719925e9fd6SBram Moolenaar return "no" 720925e9fd6SBram Moolenaar enddef 721925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 722925e9fd6SBram Moolenaar delfunc g:Global 723925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 724925e9fd6SBram Moolenaar END 725925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 726925e9fd6SBram Moolenaar 727925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 728925e9fd6SBram Moolenaar lines =<< trim END 729925e9fd6SBram Moolenaar vim9script 730925e9fd6SBram Moolenaar func g:Global() 731925e9fd6SBram Moolenaar return "yes" 732925e9fd6SBram Moolenaar endfunc 733925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 734925e9fd6SBram Moolenaar def! g:Global(): string 735925e9fd6SBram Moolenaar return "no" 736925e9fd6SBram Moolenaar enddef 737925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 738925e9fd6SBram Moolenaar delfunc g:Global 739925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 740925e9fd6SBram Moolenaar END 741925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 742925e9fd6SBram Moolenaar 743925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 744925e9fd6SBram Moolenaar lines =<< trim END 745925e9fd6SBram Moolenaar vim9script 746925e9fd6SBram Moolenaar def g:Global(): string 747925e9fd6SBram Moolenaar return "yes" 748925e9fd6SBram Moolenaar enddef 749925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 750925e9fd6SBram Moolenaar func! g:Global() 751925e9fd6SBram Moolenaar return "no" 752925e9fd6SBram Moolenaar endfunc 753925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 754925e9fd6SBram Moolenaar delfunc g:Global 755925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 756925e9fd6SBram Moolenaar END 757925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 7584c17ad94SBram Moolenaarenddef 7594c17ad94SBram Moolenaar 760599c89c8SBram Moolenaarfunc Test_wrong_type() 761599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 762599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 763599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 764599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 765599c89c8SBram Moolenaar 766599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 767599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 76842a480bfSBram Moolenaar 76942a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 77042a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 77142a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 77242a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 77342a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 77442a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 77542a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 77642a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 77742a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 77842a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 77942a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 780a0a9f43aSBram Moolenaar 781a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 782a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7838a7d6542SBram Moolenaarendfunc 7848a7d6542SBram Moolenaar 7858a7d6542SBram Moolenaarfunc Test_const() 7868a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7878a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7888a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7899be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7908a7d6542SBram Moolenaarendfunc 7918a7d6542SBram Moolenaar 792df069eecSBram Moolenaardef Test_range_no_colon() 793df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 794df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 795df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 796df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 797df069eecSBram Moolenaarenddef 798df069eecSBram Moolenaar 799df069eecSBram Moolenaar 8008a7d6542SBram Moolenaardef Test_block() 8018a7d6542SBram Moolenaar let outer = 1 8028a7d6542SBram Moolenaar { 8038a7d6542SBram Moolenaar let inner = 2 8048a7d6542SBram Moolenaar assert_equal(1, outer) 8058a7d6542SBram Moolenaar assert_equal(2, inner) 8068a7d6542SBram Moolenaar } 8078a7d6542SBram Moolenaar assert_equal(1, outer) 8088a7d6542SBram Moolenaarenddef 8098a7d6542SBram Moolenaar 8108a7d6542SBram Moolenaarfunc Test_block_failure() 8118a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 812585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 813585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 8148a7d6542SBram Moolenaarendfunc 8158a7d6542SBram Moolenaar 816d032f34aSBram Moolenaarfunc g:NoSuchFunc() 817d032f34aSBram Moolenaar echo 'none' 818d032f34aSBram Moolenaarendfunc 819d032f34aSBram Moolenaar 8208a7d6542SBram Moolenaardef Test_try_catch() 8218a7d6542SBram Moolenaar let l = [] 8227a092245SBram Moolenaar try # comment 8238a7d6542SBram Moolenaar add(l, '1') 8248a7d6542SBram Moolenaar throw 'wrong' 8258a7d6542SBram Moolenaar add(l, '2') 8267a092245SBram Moolenaar catch # comment 8278a7d6542SBram Moolenaar add(l, v:exception) 8287a092245SBram Moolenaar finally # comment 8298a7d6542SBram Moolenaar add(l, '3') 8307a092245SBram Moolenaar endtry # comment 8318a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 83268d130c6SBram Moolenaar 833e859312eSBram Moolenaar l = [] 834e859312eSBram Moolenaar try 835e859312eSBram Moolenaar try 836e859312eSBram Moolenaar add(l, '1') 837e859312eSBram Moolenaar throw 'wrong' 838e859312eSBram Moolenaar add(l, '2') 839e859312eSBram Moolenaar catch /right/ 840e859312eSBram Moolenaar add(l, v:exception) 841e859312eSBram Moolenaar endtry 842e859312eSBram Moolenaar catch /wrong/ 843e859312eSBram Moolenaar add(l, 'caught') 844e859312eSBram Moolenaar finally 845e859312eSBram Moolenaar add(l, 'finally') 846e859312eSBram Moolenaar endtry 847e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 848e859312eSBram Moolenaar 84968d130c6SBram Moolenaar let n: number 85068d130c6SBram Moolenaar try 85168d130c6SBram Moolenaar n = l[3] 85268d130c6SBram Moolenaar catch /E684:/ 85368d130c6SBram Moolenaar n = 99 85468d130c6SBram Moolenaar endtry 85568d130c6SBram Moolenaar assert_equal(99, n) 85668d130c6SBram Moolenaar 85768d130c6SBram Moolenaar try 858cc673e74SBram Moolenaar # string slice returns a string, not a number 85968d130c6SBram Moolenaar n = g:astring[3] 86056acb094SBram Moolenaar catch /E1029:/ 86168d130c6SBram Moolenaar n = 77 86268d130c6SBram Moolenaar endtry 86368d130c6SBram Moolenaar assert_equal(77, n) 86468d130c6SBram Moolenaar 86568d130c6SBram Moolenaar try 86668d130c6SBram Moolenaar n = l[g:astring] 86756acb094SBram Moolenaar catch /E1029:/ 86856acb094SBram Moolenaar n = 88 86968d130c6SBram Moolenaar endtry 87056acb094SBram Moolenaar assert_equal(88, n) 87168d130c6SBram Moolenaar 87268d130c6SBram Moolenaar try 87368d130c6SBram Moolenaar n = s:does_not_exist 87468d130c6SBram Moolenaar catch /E121:/ 875f0b9f43cSBram Moolenaar n = 111 876f0b9f43cSBram Moolenaar endtry 877f0b9f43cSBram Moolenaar assert_equal(111, n) 878f0b9f43cSBram Moolenaar 879f0b9f43cSBram Moolenaar try 880f0b9f43cSBram Moolenaar n = g:does_not_exist 881f0b9f43cSBram Moolenaar catch /E121:/ 88268d130c6SBram Moolenaar n = 121 88368d130c6SBram Moolenaar endtry 88468d130c6SBram Moolenaar assert_equal(121, n) 88568d130c6SBram Moolenaar 88668d130c6SBram Moolenaar let d = #{one: 1} 88768d130c6SBram Moolenaar try 88868d130c6SBram Moolenaar n = d[g:astring] 88968d130c6SBram Moolenaar catch /E716:/ 89068d130c6SBram Moolenaar n = 222 89168d130c6SBram Moolenaar endtry 89268d130c6SBram Moolenaar assert_equal(222, n) 893f0b9f43cSBram Moolenaar 894f0b9f43cSBram Moolenaar try 895f0b9f43cSBram Moolenaar n = -g:astring 896f0b9f43cSBram Moolenaar catch /E39:/ 897f0b9f43cSBram Moolenaar n = 233 898f0b9f43cSBram Moolenaar endtry 899f0b9f43cSBram Moolenaar assert_equal(233, n) 900f0b9f43cSBram Moolenaar 901f0b9f43cSBram Moolenaar try 902f0b9f43cSBram Moolenaar n = +g:astring 903f0b9f43cSBram Moolenaar catch /E1030:/ 904f0b9f43cSBram Moolenaar n = 244 905f0b9f43cSBram Moolenaar endtry 906f0b9f43cSBram Moolenaar assert_equal(244, n) 907f0b9f43cSBram Moolenaar 908f0b9f43cSBram Moolenaar try 909f0b9f43cSBram Moolenaar n = +g:alist 910f0b9f43cSBram Moolenaar catch /E745:/ 911f0b9f43cSBram Moolenaar n = 255 912f0b9f43cSBram Moolenaar endtry 913f0b9f43cSBram Moolenaar assert_equal(255, n) 914f0b9f43cSBram Moolenaar 915f0b9f43cSBram Moolenaar let nd: dict<any> 916f0b9f43cSBram Moolenaar try 917f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 918f0b9f43cSBram Moolenaar catch /E1029:/ 919f0b9f43cSBram Moolenaar n = 266 920f0b9f43cSBram Moolenaar endtry 921f0b9f43cSBram Moolenaar assert_equal(266, n) 922f0b9f43cSBram Moolenaar 923f0b9f43cSBram Moolenaar try 924f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 925f0b9f43cSBram Moolenaar catch /E1093:/ 926f0b9f43cSBram Moolenaar n = 277 927f0b9f43cSBram Moolenaar endtry 928f0b9f43cSBram Moolenaar assert_equal(277, n) 929f0b9f43cSBram Moolenaar 930e859312eSBram Moolenaar try 931e859312eSBram Moolenaar &ts = g:astring 932e859312eSBram Moolenaar catch /E1029:/ 933e859312eSBram Moolenaar n = 288 934e859312eSBram Moolenaar endtry 935e859312eSBram Moolenaar assert_equal(288, n) 936e859312eSBram Moolenaar 937e859312eSBram Moolenaar try 938e859312eSBram Moolenaar &backspace = 'asdf' 939e859312eSBram Moolenaar catch /E474:/ 940e859312eSBram Moolenaar n = 299 941e859312eSBram Moolenaar endtry 942e859312eSBram Moolenaar assert_equal(299, n) 943e859312eSBram Moolenaar 944e859312eSBram Moolenaar l = [1] 945e859312eSBram Moolenaar try 946e859312eSBram Moolenaar l[3] = 3 947e859312eSBram Moolenaar catch /E684:/ 948e859312eSBram Moolenaar n = 300 949e859312eSBram Moolenaar endtry 950e859312eSBram Moolenaar assert_equal(300, n) 951e859312eSBram Moolenaar 952e859312eSBram Moolenaar try 953e859312eSBram Moolenaar unlet g:does_not_exist 954e859312eSBram Moolenaar catch /E108:/ 955e859312eSBram Moolenaar n = 322 956e859312eSBram Moolenaar endtry 957e859312eSBram Moolenaar assert_equal(322, n) 958e859312eSBram Moolenaar 959e859312eSBram Moolenaar try 960e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 961e859312eSBram Moolenaar catch /E721:/ 962e859312eSBram Moolenaar n = 333 963e859312eSBram Moolenaar endtry 964e859312eSBram Moolenaar assert_equal(333, n) 965e859312eSBram Moolenaar 966e859312eSBram Moolenaar try 967e859312eSBram Moolenaar l = DeletedFunc() 968e859312eSBram Moolenaar catch /E933:/ 969e859312eSBram Moolenaar n = 344 970e859312eSBram Moolenaar endtry 971e859312eSBram Moolenaar assert_equal(344, n) 972d032f34aSBram Moolenaar 973d032f34aSBram Moolenaar try 974d032f34aSBram Moolenaar echo len(v:true) 975d032f34aSBram Moolenaar catch /E701:/ 976d032f34aSBram Moolenaar n = 355 977d032f34aSBram Moolenaar endtry 978d032f34aSBram Moolenaar assert_equal(355, n) 979d032f34aSBram Moolenaar 980d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 981d032f34aSBram Moolenaar delfunc g:NoSuchFunc 982d032f34aSBram Moolenaar try 983d032f34aSBram Moolenaar echo P() 984d032f34aSBram Moolenaar catch /E117:/ 985d032f34aSBram Moolenaar n = 366 986d032f34aSBram Moolenaar endtry 987d032f34aSBram Moolenaar assert_equal(366, n) 988d032f34aSBram Moolenaar 989d032f34aSBram Moolenaar try 990d032f34aSBram Moolenaar echo g:NoSuchFunc() 991d032f34aSBram Moolenaar catch /E117:/ 992d032f34aSBram Moolenaar n = 377 993d032f34aSBram Moolenaar endtry 994d032f34aSBram Moolenaar assert_equal(377, n) 995d032f34aSBram Moolenaar 996d032f34aSBram Moolenaar try 997d032f34aSBram Moolenaar echo g:alist + 4 998d032f34aSBram Moolenaar catch /E745:/ 999d032f34aSBram Moolenaar n = 388 1000d032f34aSBram Moolenaar endtry 1001d032f34aSBram Moolenaar assert_equal(388, n) 1002d032f34aSBram Moolenaar 1003d032f34aSBram Moolenaar try 1004d032f34aSBram Moolenaar echo 4 + g:alist 1005d032f34aSBram Moolenaar catch /E745:/ 1006d032f34aSBram Moolenaar n = 399 1007d032f34aSBram Moolenaar endtry 1008d032f34aSBram Moolenaar assert_equal(399, n) 1009d032f34aSBram Moolenaar 1010d032f34aSBram Moolenaar try 1011d032f34aSBram Moolenaar echo g:alist.member 1012d032f34aSBram Moolenaar catch /E715:/ 1013d032f34aSBram Moolenaar n = 400 1014d032f34aSBram Moolenaar endtry 1015d032f34aSBram Moolenaar assert_equal(400, n) 1016d032f34aSBram Moolenaar 1017d032f34aSBram Moolenaar try 1018d032f34aSBram Moolenaar echo d.member 1019d032f34aSBram Moolenaar catch /E716:/ 1020d032f34aSBram Moolenaar n = 411 1021d032f34aSBram Moolenaar endtry 1022d032f34aSBram Moolenaar assert_equal(411, n) 10238a7d6542SBram Moolenaarenddef 10248a7d6542SBram Moolenaar 1025e859312eSBram Moolenaardef DeletedFunc(): list<any> 1026e859312eSBram Moolenaar return ['delete me'] 1027e859312eSBram Moolenaarenddef 1028e859312eSBram Moolenaardefcompile 1029e859312eSBram Moolenaardelfunc DeletedFunc 1030e859312eSBram Moolenaar 1031257cc5eeSBram Moolenaardef ThrowFromDef() 1032a72cfb80SBram Moolenaar throw "getout" # comment 1033257cc5eeSBram Moolenaarenddef 1034257cc5eeSBram Moolenaar 1035257cc5eeSBram Moolenaarfunc CatchInFunc() 1036257cc5eeSBram Moolenaar try 1037257cc5eeSBram Moolenaar call ThrowFromDef() 1038257cc5eeSBram Moolenaar catch 1039257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1040257cc5eeSBram Moolenaar endtry 1041257cc5eeSBram Moolenaarendfunc 1042257cc5eeSBram Moolenaar 1043257cc5eeSBram Moolenaardef CatchInDef() 1044257cc5eeSBram Moolenaar try 1045257cc5eeSBram Moolenaar ThrowFromDef() 1046257cc5eeSBram Moolenaar catch 1047257cc5eeSBram Moolenaar g:thrown_def = v:exception 1048257cc5eeSBram Moolenaar endtry 1049257cc5eeSBram Moolenaarenddef 1050257cc5eeSBram Moolenaar 1051f575adffSBram Moolenaardef ReturnFinally(): string 1052f575adffSBram Moolenaar try 1053f575adffSBram Moolenaar return 'intry' 1054f575adffSBram Moolenaar finally 1055f575adffSBram Moolenaar g:in_finally = 'finally' 1056f575adffSBram Moolenaar endtry 1057f575adffSBram Moolenaar return 'end' 1058f575adffSBram Moolenaarenddef 1059f575adffSBram Moolenaar 1060257cc5eeSBram Moolenaardef Test_try_catch_nested() 1061257cc5eeSBram Moolenaar CatchInFunc() 1062257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1063257cc5eeSBram Moolenaar 1064257cc5eeSBram Moolenaar CatchInDef() 1065257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1066f575adffSBram Moolenaar 1067f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1068f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1069f575adffSBram Moolenaarenddef 1070f575adffSBram Moolenaar 1071f575adffSBram Moolenaardef Test_try_catch_match() 1072f575adffSBram Moolenaar let seq = 'a' 1073f575adffSBram Moolenaar try 1074f575adffSBram Moolenaar throw 'something' 1075f575adffSBram Moolenaar catch /nothing/ 1076f575adffSBram Moolenaar seq ..= 'x' 1077f575adffSBram Moolenaar catch /some/ 1078f575adffSBram Moolenaar seq ..= 'b' 1079f575adffSBram Moolenaar catch /asdf/ 1080f575adffSBram Moolenaar seq ..= 'x' 1081e8c4abbbSBram Moolenaar catch ?a\?sdf? 1082e8c4abbbSBram Moolenaar seq ..= 'y' 1083f575adffSBram Moolenaar finally 1084f575adffSBram Moolenaar seq ..= 'c' 1085f575adffSBram Moolenaar endtry 1086f575adffSBram Moolenaar assert_equal('abc', seq) 1087257cc5eeSBram Moolenaarenddef 1088257cc5eeSBram Moolenaar 1089e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1090e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1091e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1092e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1093585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1094585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1095585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1096585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1097585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1098585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1099585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1100585fea7bSBram Moolenaar 1101a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1102585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1103e8c4abbbSBram Moolenaarenddef 1104e8c4abbbSBram Moolenaar 1105006ad48bSBram Moolenaardef Test_throw_vimscript() 1106f5be8cdbSBram Moolenaar # only checks line continuation 1107006ad48bSBram Moolenaar let lines =<< trim END 1108006ad48bSBram Moolenaar vim9script 1109006ad48bSBram Moolenaar try 1110006ad48bSBram Moolenaar throw 'one' 1111006ad48bSBram Moolenaar .. 'two' 1112006ad48bSBram Moolenaar catch 1113006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1114006ad48bSBram Moolenaar endtry 1115006ad48bSBram Moolenaar END 1116006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1117006ad48bSBram Moolenaarenddef 1118006ad48bSBram Moolenaar 1119ed677f55SBram Moolenaardef Test_error_in_nested_function() 1120ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1121ed677f55SBram Moolenaar let lines =<< trim END 1122ed677f55SBram Moolenaar vim9script 1123ed677f55SBram Moolenaar def Func() 1124ed677f55SBram Moolenaar Error() 1125ed677f55SBram Moolenaar g:test_var = 1 1126ed677f55SBram Moolenaar enddef 1127ed677f55SBram Moolenaar func Error() abort 1128ed677f55SBram Moolenaar eval [][0] 1129ed677f55SBram Moolenaar endfunc 1130ed677f55SBram Moolenaar Func() 1131ed677f55SBram Moolenaar END 1132ed677f55SBram Moolenaar g:test_var = 0 1133ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1134ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1135ed677f55SBram Moolenaarenddef 1136ed677f55SBram Moolenaar 113737c83711SBram Moolenaardef Test_cexpr_vimscript() 1138f5be8cdbSBram Moolenaar # only checks line continuation 113937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 114037c83711SBram Moolenaar let lines =<< trim END 114137c83711SBram Moolenaar vim9script 114237c83711SBram Moolenaar cexpr 'File' 114337c83711SBram Moolenaar .. ' someFile' .. 114437c83711SBram Moolenaar ' line 19' 114537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 114637c83711SBram Moolenaar END 114737c83711SBram Moolenaar CheckScriptSuccess(lines) 114837c83711SBram Moolenaar set errorformat& 114937c83711SBram Moolenaarenddef 115037c83711SBram Moolenaar 1151c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1152c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1153c9edd6b5SBram Moolenaar let lines =<< trim END 1154c9edd6b5SBram Moolenaar vim9script 1155c9edd6b5SBram Moolenaar func g:Status() 1156c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1157c9edd6b5SBram Moolenaar endfunc 1158c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1159c9edd6b5SBram Moolenaar redrawstatus 1160c9edd6b5SBram Moolenaar set laststatus statusline= 1161c9edd6b5SBram Moolenaar END 1162c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1163c9edd6b5SBram Moolenaarenddef 1164c9edd6b5SBram Moolenaar 1165b209750bSBram Moolenaardef Test_list_vimscript() 1166b209750bSBram Moolenaar # checks line continuation and comments 1167b209750bSBram Moolenaar let lines =<< trim END 1168b209750bSBram Moolenaar vim9script 1169b209750bSBram Moolenaar let mylist = [ 1170b209750bSBram Moolenaar 'one', 1171b209750bSBram Moolenaar # comment 1172b209750bSBram Moolenaar 'two', # empty line follows 1173b209750bSBram Moolenaar 1174b209750bSBram Moolenaar 'three', 1175b209750bSBram Moolenaar ] 1176b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1177b209750bSBram Moolenaar END 1178b209750bSBram Moolenaar CheckScriptSuccess(lines) 117966250c93SBram Moolenaar 118066250c93SBram Moolenaar # check all lines from heredoc are kept 118166250c93SBram Moolenaar lines =<< trim END 118266250c93SBram Moolenaar # comment 1 118366250c93SBram Moolenaar two 118466250c93SBram Moolenaar # comment 3 118566250c93SBram Moolenaar 118666250c93SBram Moolenaar five 118766250c93SBram Moolenaar # comment 6 118866250c93SBram Moolenaar END 118966250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1190b209750bSBram Moolenaarenddef 1191b209750bSBram Moolenaar 11922a1381c3SBram Moolenaarif has('channel') 119340ee466cSBram Moolenaar let someJob = test_null_job() 119440ee466cSBram Moolenaar 119540ee466cSBram Moolenaar def FuncWithError() 119640ee466cSBram Moolenaar echomsg g:someJob 119740ee466cSBram Moolenaar enddef 119840ee466cSBram Moolenaar 119940ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 120040ee466cSBram Moolenaar try 120140ee466cSBram Moolenaar call FuncWithError() 120240ee466cSBram Moolenaar catch 120340ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 120440ee466cSBram Moolenaar endtry 120540ee466cSBram Moolenaar endfunc 12062a1381c3SBram Moolenaarendif 120740ee466cSBram Moolenaar 12088a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 12098a7d6542SBram Moolenaar vim9script 12108a7d6542SBram Moolenaar let name: string = 'bob' 12118a7d6542SBram Moolenaar def Concat(arg: string): string 12128a7d6542SBram Moolenaar return name .. arg 12138a7d6542SBram Moolenaar enddef 1214227a69deSBram Moolenaar g:result = Concat('bie') 1215227a69deSBram Moolenaar g:localname = name 12168a7d6542SBram Moolenaar 12178a7d6542SBram Moolenaar export const CONST = 1234 12188a7d6542SBram Moolenaar export let exported = 9876 12196e587dcbSBram Moolenaar export let exp_name = 'John' 12208a7d6542SBram Moolenaar export def Exported(): string 12218a7d6542SBram Moolenaar return 'Exported' 12228a7d6542SBram Moolenaar enddef 12238a7d6542SBram MoolenaarEND 12248a7d6542SBram Moolenaar 1225b3ca9824SBram Moolenaardef Undo_export_script_lines() 1226b3ca9824SBram Moolenaar unlet g:result 1227b3ca9824SBram Moolenaar unlet g:localname 1228b3ca9824SBram Moolenaarenddef 1229b3ca9824SBram Moolenaar 12305269bd2aSBram Moolenaardef Test_vim9_import_export() 12318a7d6542SBram Moolenaar let import_script_lines =<< trim END 12328a7d6542SBram Moolenaar vim9script 12338a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 12348a7d6542SBram Moolenaar g:imported = exported 12356e587dcbSBram Moolenaar exported += 3 12366e587dcbSBram Moolenaar g:imported_added = exported 12378a7d6542SBram Moolenaar g:imported_func = Exported() 12386e587dcbSBram Moolenaar 123940f4f7a4SBram Moolenaar def GetExported(): string 124040f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 124140f4f7a4SBram Moolenaar return local_dict.ref() 124240f4f7a4SBram Moolenaar enddef 124340f4f7a4SBram Moolenaar g:funcref_result = GetExported() 124440f4f7a4SBram Moolenaar 12456e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 12466e587dcbSBram Moolenaar g:imported_name = exp_name 12476e587dcbSBram Moolenaar exp_name ..= ' Doe' 12486e587dcbSBram Moolenaar g:imported_name_appended = exp_name 12495381c7a1SBram Moolenaar g:imported_later = exported 12508a7d6542SBram Moolenaar END 12518a7d6542SBram Moolenaar 12528a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 12538a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 12548a7d6542SBram Moolenaar 12558a7d6542SBram Moolenaar source Ximport.vim 12568a7d6542SBram Moolenaar 12578a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 12588a7d6542SBram Moolenaar assert_equal('bob', g:localname) 12598a7d6542SBram Moolenaar assert_equal(9876, g:imported) 12606e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 12615381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 12628a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 126340f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 12646e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 12656e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 12668a7d6542SBram Moolenaar assert_false(exists('g:name')) 12678a7d6542SBram Moolenaar 1268b3ca9824SBram Moolenaar Undo_export_script_lines() 12698a7d6542SBram Moolenaar unlet g:imported 12706e587dcbSBram Moolenaar unlet g:imported_added 12715381c7a1SBram Moolenaar unlet g:imported_later 12728a7d6542SBram Moolenaar unlet g:imported_func 12736e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 12748a7d6542SBram Moolenaar delete('Ximport.vim') 1275f2d5c240SBram Moolenaar 12761c991144SBram Moolenaar # similar, with line breaks 12771c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 12781c991144SBram Moolenaar vim9script 12791c991144SBram Moolenaar import { 12801c991144SBram Moolenaar exported, 12811c991144SBram Moolenaar Exported, 12821c991144SBram Moolenaar } 12831c991144SBram Moolenaar from 12841c991144SBram Moolenaar './Xexport.vim' 12851c991144SBram Moolenaar g:imported = exported 12861c991144SBram Moolenaar exported += 5 12871c991144SBram Moolenaar g:imported_added = exported 12881c991144SBram Moolenaar g:imported_func = Exported() 12891c991144SBram Moolenaar END 12901c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 12911c991144SBram Moolenaar source Ximport_lbr.vim 12921c991144SBram Moolenaar 12931c991144SBram Moolenaar assert_equal(9876, g:imported) 12941c991144SBram Moolenaar assert_equal(9881, g:imported_added) 12951c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 12961c991144SBram Moolenaar 12971c991144SBram Moolenaar # exported script not sourced again 12981c991144SBram Moolenaar assert_false(exists('g:result')) 12991c991144SBram Moolenaar unlet g:imported 13001c991144SBram Moolenaar unlet g:imported_added 13011c991144SBram Moolenaar unlet g:imported_func 13021c991144SBram Moolenaar delete('Ximport_lbr.vim') 13031c991144SBram Moolenaar 13041c991144SBram Moolenaar # import inside :def function 13055381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 13065381c7a1SBram Moolenaar vim9script 13075381c7a1SBram Moolenaar def ImportInDef() 13085381c7a1SBram Moolenaar import exported from './Xexport.vim' 13095381c7a1SBram Moolenaar g:imported = exported 13105381c7a1SBram Moolenaar exported += 7 13115381c7a1SBram Moolenaar g:imported_added = exported 13125381c7a1SBram Moolenaar enddef 13135381c7a1SBram Moolenaar ImportInDef() 13145381c7a1SBram Moolenaar END 13155381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 13165381c7a1SBram Moolenaar source Ximport2.vim 1317f5be8cdbSBram Moolenaar # TODO: this should be 9879 13185381c7a1SBram Moolenaar assert_equal(9876, g:imported) 13195381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 13205381c7a1SBram Moolenaar unlet g:imported 13215381c7a1SBram Moolenaar unlet g:imported_added 13225381c7a1SBram Moolenaar delete('Ximport2.vim') 13235381c7a1SBram Moolenaar 1324f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1325f2d5c240SBram Moolenaar vim9script 1326f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1327f2d5c240SBram Moolenaar def UseExport() 1328f2d5c240SBram Moolenaar g:imported = Export.exported 1329f2d5c240SBram Moolenaar enddef 1330f2d5c240SBram Moolenaar UseExport() 1331f2d5c240SBram Moolenaar END 1332f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1333f2d5c240SBram Moolenaar source Ximport.vim 13345381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1335f2d5c240SBram Moolenaar 1336599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1337599c89c8SBram Moolenaar vim9script 1338599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1339599c89c8SBram Moolenaar def Func() 1340599c89c8SBram Moolenaar let dummy = 1 1341599c89c8SBram Moolenaar let imported = Export + dummy 1342599c89c8SBram Moolenaar enddef 1343822ba247SBram Moolenaar defcompile 1344599c89c8SBram Moolenaar END 1345599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1346599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1347599c89c8SBram Moolenaar 1348599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1349599c89c8SBram Moolenaar vim9script 1350599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1351599c89c8SBram Moolenaar def Func() 1352599c89c8SBram Moolenaar let imported = Export . exported 1353599c89c8SBram Moolenaar enddef 1354822ba247SBram Moolenaar defcompile 1355599c89c8SBram Moolenaar END 1356599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1357599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1358599c89c8SBram Moolenaar 1359599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1360599c89c8SBram Moolenaar vim9script 1361599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1362599c89c8SBram Moolenaar def Func() 1363599c89c8SBram Moolenaar let imported = Export. 1364599c89c8SBram Moolenaar enddef 1365822ba247SBram Moolenaar defcompile 1366599c89c8SBram Moolenaar END 1367599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1368599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1369599c89c8SBram Moolenaar 13701c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 13711c991144SBram Moolenaar vim9script 13721c991144SBram Moolenaar import * 13731c991144SBram Moolenaar as Export 13741c991144SBram Moolenaar from 13751c991144SBram Moolenaar './Xexport.vim' 13761c991144SBram Moolenaar def UseExport() 13771c991144SBram Moolenaar g:imported = Export.exported 13781c991144SBram Moolenaar enddef 13791c991144SBram Moolenaar UseExport() 13801c991144SBram Moolenaar END 13811c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13821c991144SBram Moolenaar source Ximport.vim 13831c991144SBram Moolenaar assert_equal(9883, g:imported) 13841c991144SBram Moolenaar 1385f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1386f2d5c240SBram Moolenaar vim9script 1387f2d5c240SBram Moolenaar import * from './Xexport.vim' 1388f2d5c240SBram Moolenaar END 1389f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1390f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1391f2d5c240SBram Moolenaar 1392f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1393fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1394fa29c8abSBram Moolenaar vim9script 1395fa29c8abSBram Moolenaar import name from './Xexport.vim' 1396fa29c8abSBram Moolenaar END 1397fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1398fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1399fa29c8abSBram Moolenaar 1400f5be8cdbSBram Moolenaar # try to import something that is already defined 14015269bd2aSBram Moolenaar let import_already_defined =<< trim END 14025269bd2aSBram Moolenaar vim9script 14035269bd2aSBram Moolenaar let exported = 'something' 14045269bd2aSBram Moolenaar import exported from './Xexport.vim' 14055269bd2aSBram Moolenaar END 14065269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 14075269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 14085269bd2aSBram Moolenaar 1409f5be8cdbSBram Moolenaar # try to import something that is already defined 14105269bd2aSBram Moolenaar import_already_defined =<< trim END 14115269bd2aSBram Moolenaar vim9script 14125269bd2aSBram Moolenaar let exported = 'something' 14135269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 14145269bd2aSBram Moolenaar END 14155269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 14165269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 14175269bd2aSBram Moolenaar 1418f5be8cdbSBram Moolenaar # try to import something that is already defined 14195269bd2aSBram Moolenaar import_already_defined =<< trim END 14205269bd2aSBram Moolenaar vim9script 14215269bd2aSBram Moolenaar let exported = 'something' 14225269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 14235269bd2aSBram Moolenaar END 14245269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 14255269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 14265269bd2aSBram Moolenaar 1427f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1428fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1429fa29c8abSBram Moolenaar vim9script 1430fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1431fa29c8abSBram Moolenaar END 1432fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1433fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1434fa29c8abSBram Moolenaar 1435fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1436fa29c8abSBram Moolenaar vim9script 1437fa29c8abSBram Moolenaar import name './Xexport.vim' 1438fa29c8abSBram Moolenaar END 1439fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1440fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1441fa29c8abSBram Moolenaar 1442fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1443fa29c8abSBram Moolenaar vim9script 1444fa29c8abSBram Moolenaar import name from Xexport.vim 1445fa29c8abSBram Moolenaar END 1446fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1447fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1448fa29c8abSBram Moolenaar 1449fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1450fa29c8abSBram Moolenaar vim9script 1451fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1452fa29c8abSBram Moolenaar END 1453fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1454fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1455fa29c8abSBram Moolenaar 1456fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1457fa29c8abSBram Moolenaar vim9script 1458fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1459fa29c8abSBram Moolenaar END 14605269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 14615269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1462fa29c8abSBram Moolenaar 1463f2d5c240SBram Moolenaar delete('Ximport.vim') 14645269bd2aSBram Moolenaar delete('Ximport3.vim') 14658a7d6542SBram Moolenaar delete('Xexport.vim') 14668a7d6542SBram Moolenaar 1467f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1468750802b5SBram Moolenaar set cpo&vi 1469750802b5SBram Moolenaar let cpo_before = &cpo 1470750802b5SBram Moolenaar let lines =<< trim END 1471750802b5SBram Moolenaar vim9script 1472750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1473750802b5SBram Moolenaar END 1474750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1475750802b5SBram Moolenaar source Xvim9_script 1476750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1477750802b5SBram Moolenaar set cpo&vim 1478750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1479750802b5SBram Moolenaar delete('Xvim9_script') 1480750802b5SBram Moolenaarenddef 1481750802b5SBram Moolenaar 1482803af686SBram Moolenaarfunc g:Trigger() 1483803af686SBram Moolenaar source Ximport.vim 1484803af686SBram Moolenaar return "echo 'yes'\<CR>" 1485803af686SBram Moolenaarendfunc 1486803af686SBram Moolenaar 1487803af686SBram Moolenaardef Test_import_export_expr_map() 1488803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1489803af686SBram Moolenaar let export_lines =<< trim END 1490803af686SBram Moolenaar vim9script 1491803af686SBram Moolenaar export def That(): string 1492803af686SBram Moolenaar return 'yes' 1493803af686SBram Moolenaar enddef 1494803af686SBram Moolenaar END 1495803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1496803af686SBram Moolenaar 1497803af686SBram Moolenaar let import_lines =<< trim END 1498803af686SBram Moolenaar vim9script 1499803af686SBram Moolenaar import That from './Xexport_that.vim' 1500803af686SBram Moolenaar assert_equal('yes', That()) 1501803af686SBram Moolenaar END 1502803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1503803af686SBram Moolenaar 1504803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1505803af686SBram Moolenaar feedkeys('trigger', "xt") 1506803af686SBram Moolenaar 1507730b2483SBram Moolenaar delete('Xexport_that.vim') 1508803af686SBram Moolenaar delete('Ximport.vim') 1509803af686SBram Moolenaar nunmap trigger 1510803af686SBram Moolenaarenddef 1511803af686SBram Moolenaar 15128e1986e3SBram Moolenaardef Test_import_in_filetype() 15138e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15148e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 15158e1986e3SBram Moolenaar let export_lines =<< trim END 15168e1986e3SBram Moolenaar vim9script 15178e1986e3SBram Moolenaar export let That = 'yes' 15188e1986e3SBram Moolenaar END 1519730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15208e1986e3SBram Moolenaar 15218e1986e3SBram Moolenaar let import_lines =<< trim END 15228e1986e3SBram Moolenaar vim9script 1523730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15248e1986e3SBram Moolenaar assert_equal('yes', That) 15258e1986e3SBram Moolenaar g:did_load_mytpe = 1 15268e1986e3SBram Moolenaar END 15278e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15288e1986e3SBram Moolenaar 15298e1986e3SBram Moolenaar let save_rtp = &rtp 15308e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15318e1986e3SBram Moolenaar 15328e1986e3SBram Moolenaar filetype plugin on 15338e1986e3SBram Moolenaar copen 15348e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15358e1986e3SBram Moolenaar 15368e1986e3SBram Moolenaar quit! 1537730b2483SBram Moolenaar delete('Xexport_ft.vim') 15388e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15398e1986e3SBram Moolenaar &rtp = save_rtp 15408e1986e3SBram Moolenaarenddef 15418e1986e3SBram Moolenaar 1542efa94447SBram Moolenaardef Test_use_import_in_mapping() 1543efa94447SBram Moolenaar let lines =<< trim END 1544efa94447SBram Moolenaar vim9script 1545efa94447SBram Moolenaar export def Funcx() 1546efa94447SBram Moolenaar g:result = 42 1547efa94447SBram Moolenaar enddef 1548efa94447SBram Moolenaar END 1549efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1550efa94447SBram Moolenaar lines =<< trim END 1551efa94447SBram Moolenaar vim9script 1552efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1553b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1554efa94447SBram Moolenaar END 1555efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1556efa94447SBram Moolenaar 1557efa94447SBram Moolenaar source Xmapscript.vim 1558b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1559efa94447SBram Moolenaar assert_equal(42, g:result) 1560efa94447SBram Moolenaar 1561efa94447SBram Moolenaar unlet g:result 1562efa94447SBram Moolenaar delete('XsomeExport.vim') 1563efa94447SBram Moolenaar delete('Xmapscript.vim') 1564b3ca9824SBram Moolenaar nunmap <F3> 1565efa94447SBram Moolenaarenddef 1566efa94447SBram Moolenaar 1567750802b5SBram Moolenaardef Test_vim9script_fails() 15688a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15698a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1570750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 15719721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 15729b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1573750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1574750802b5SBram Moolenaar 1575451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1576c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1577c785b9a7SBram Moolenaar 1578750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1579a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 15808a7d6542SBram Moolenaarenddef 15818a7d6542SBram Moolenaar 1582f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1583101f4810SBram Moolenaar CheckRunVimInTerminal 1584101f4810SBram Moolenaar 15859bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1586c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15879bb3eb3eSBram Moolenaarendfunc 15889bb3eb3eSBram Moolenaar 1589c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1590101f4810SBram Moolenaar let export =<< trim END 1591101f4810SBram Moolenaar vim9script 1592101f4810SBram Moolenaar export def Foo(): number 1593101f4810SBram Moolenaar return 0 1594101f4810SBram Moolenaar enddef 1595101f4810SBram Moolenaar END 1596730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1597101f4810SBram Moolenaar 1598730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 15999bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16009bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1601101f4810SBram Moolenaar 1602730b2483SBram Moolenaar delete('XexportCmd.vim') 16039bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16049bb3eb3eSBram Moolenaarenddef 1605101f4810SBram Moolenaar 16064c17ad94SBram Moolenaardef Test_vim9script_reload_import() 16078a7d6542SBram Moolenaar let lines =<< trim END 16088a7d6542SBram Moolenaar vim9script 16098a7d6542SBram Moolenaar const var = '' 16108a7d6542SBram Moolenaar let valone = 1234 16118a7d6542SBram Moolenaar def MyFunc(arg: string) 16128a7d6542SBram Moolenaar valone = 5678 16138a7d6542SBram Moolenaar enddef 16148a7d6542SBram Moolenaar END 16158a7d6542SBram Moolenaar let morelines =<< trim END 16168a7d6542SBram Moolenaar let valtwo = 222 16178a7d6542SBram Moolenaar export def GetValtwo(): number 16188a7d6542SBram Moolenaar return valtwo 16198a7d6542SBram Moolenaar enddef 16208a7d6542SBram Moolenaar END 162103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16228a7d6542SBram Moolenaar source Xreload.vim 16238a7d6542SBram Moolenaar source Xreload.vim 16248a7d6542SBram Moolenaar source Xreload.vim 16258a7d6542SBram Moolenaar 16268a7d6542SBram Moolenaar let testlines =<< trim END 16278a7d6542SBram Moolenaar vim9script 16288a7d6542SBram Moolenaar def TheFunc() 16298a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16308a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16318a7d6542SBram Moolenaar enddef 16328a7d6542SBram Moolenaar TheFunc() 16338a7d6542SBram Moolenaar END 16348a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16358a7d6542SBram Moolenaar source Ximport.vim 16368a7d6542SBram Moolenaar 1637f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1638f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16398a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16408a7d6542SBram Moolenaar source Ximport.vim 16418a7d6542SBram Moolenaar 1642f5be8cdbSBram Moolenaar # cannot declare a var twice 16438a7d6542SBram Moolenaar lines =<< trim END 16448a7d6542SBram Moolenaar vim9script 16458a7d6542SBram Moolenaar let valone = 1234 16468a7d6542SBram Moolenaar let valone = 5678 16478a7d6542SBram Moolenaar END 16488a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16498a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 16508a7d6542SBram Moolenaar 16518a7d6542SBram Moolenaar delete('Xreload.vim') 16528a7d6542SBram Moolenaar delete('Ximport.vim') 16538a7d6542SBram Moolenaarenddef 16548a7d6542SBram Moolenaar 1655fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1656fe465a01SBram Moolenaar" script-local name. 1657fe465a01SBram Moolenaardef Test_vim9script_funcref() 1658fe465a01SBram Moolenaar let sortlines =<< trim END 1659fe465a01SBram Moolenaar vim9script 1660fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1661bed36b93SBram Moolenaar return i2 - i1 1662fe465a01SBram Moolenaar enddef 1663fe465a01SBram Moolenaar 1664fe465a01SBram Moolenaar export def FastSort(): list<number> 1665fe465a01SBram Moolenaar return range(5)->sort(Compare) 1666fe465a01SBram Moolenaar enddef 1667fe465a01SBram Moolenaar END 1668fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1669fe465a01SBram Moolenaar 1670fe465a01SBram Moolenaar let lines =<< trim END 1671fe465a01SBram Moolenaar vim9script 1672fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1673fe465a01SBram Moolenaar def Test() 1674fe465a01SBram Moolenaar g:result = FastSort() 1675fe465a01SBram Moolenaar enddef 1676fe465a01SBram Moolenaar Test() 1677fe465a01SBram Moolenaar END 1678fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1679fe465a01SBram Moolenaar 1680fe465a01SBram Moolenaar source Xscript.vim 1681fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1682fe465a01SBram Moolenaar 1683fe465a01SBram Moolenaar unlet g:result 1684fe465a01SBram Moolenaar delete('Xsort.vim') 1685fe465a01SBram Moolenaar delete('Xscript.vim') 1686fe465a01SBram Moolenaarenddef 1687fe465a01SBram Moolenaar 1688601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1689601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1690601e76acSBram Moolenaar" function reference. 1691c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1692c620c055SBram Moolenaar let filterLines =<< trim END 1693c620c055SBram Moolenaar vim9script 1694c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1695c620c055SBram Moolenaar return idx % 2 == 1 1696c620c055SBram Moolenaar enddef 1697c620c055SBram Moolenaar export def FastFilter(): list<number> 1698c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1699c620c055SBram Moolenaar enddef 1700601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1701601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1702601e76acSBram Moolenaar enddef 1703c620c055SBram Moolenaar END 1704c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1705c620c055SBram Moolenaar 1706c620c055SBram Moolenaar let lines =<< trim END 1707c620c055SBram Moolenaar vim9script 1708601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1709c620c055SBram Moolenaar def Test() 1710c620c055SBram Moolenaar let x: list<number> = FastFilter() 1711c620c055SBram Moolenaar enddef 1712c620c055SBram Moolenaar Test() 1713601e76acSBram Moolenaar def TestDirect() 1714601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1715601e76acSBram Moolenaar enddef 1716601e76acSBram Moolenaar TestDirect() 1717c620c055SBram Moolenaar END 1718601e76acSBram Moolenaar CheckScriptSuccess(lines) 1719c620c055SBram Moolenaar delete('Xfilter.vim') 1720c620c055SBram Moolenaarenddef 1721c620c055SBram Moolenaar 17224c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17234c17ad94SBram Moolenaar let first_lines =<< trim END 17244c17ad94SBram Moolenaar vim9script 17254c17ad94SBram Moolenaar def FuncYes(): string 17264c17ad94SBram Moolenaar return 'yes' 17274c17ad94SBram Moolenaar enddef 17284c17ad94SBram Moolenaar END 172903afdcf1SBram Moolenaar let withno_lines =<< trim END 17304c17ad94SBram Moolenaar def FuncNo(): string 17314c17ad94SBram Moolenaar return 'no' 17324c17ad94SBram Moolenaar enddef 17334c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17344c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17354c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 173603afdcf1SBram Moolenaar enddef 173703afdcf1SBram Moolenaar END 173803afdcf1SBram Moolenaar let nono_lines =<< trim END 173903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 174003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 17414c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 17424c17ad94SBram Moolenaar enddef 17434c17ad94SBram Moolenaar END 17444c17ad94SBram Moolenaar 17454c17ad94SBram Moolenaar # FuncNo() is defined 174603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17474c17ad94SBram Moolenaar source Xreloaded.vim 17484c17ad94SBram Moolenaar g:DoCheck(true) 17494c17ad94SBram Moolenaar 17504c17ad94SBram Moolenaar # FuncNo() is not redefined 175103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17524c17ad94SBram Moolenaar source Xreloaded.vim 175303afdcf1SBram Moolenaar g:DoCheck() 17544c17ad94SBram Moolenaar 17554c17ad94SBram Moolenaar # FuncNo() is back 175603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17574c17ad94SBram Moolenaar source Xreloaded.vim 175803afdcf1SBram Moolenaar g:DoCheck() 17594c17ad94SBram Moolenaar 17604c17ad94SBram Moolenaar delete('Xreloaded.vim') 17614c17ad94SBram Moolenaarenddef 17624c17ad94SBram Moolenaar 176389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 176489483d40SBram Moolenaar # write the script with a script-local variable 176589483d40SBram Moolenaar let lines =<< trim END 176689483d40SBram Moolenaar vim9script 176789483d40SBram Moolenaar let var = 'string' 176889483d40SBram Moolenaar END 176989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 177089483d40SBram Moolenaar source XreloadVar.vim 177189483d40SBram Moolenaar 177289483d40SBram Moolenaar # now write the script using the same variable locally - works 177389483d40SBram Moolenaar lines =<< trim END 177489483d40SBram Moolenaar vim9script 177589483d40SBram Moolenaar def Func() 177689483d40SBram Moolenaar let var = 'string' 177789483d40SBram Moolenaar enddef 177889483d40SBram Moolenaar END 177989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 178089483d40SBram Moolenaar source XreloadVar.vim 178189483d40SBram Moolenaar 178289483d40SBram Moolenaar delete('XreloadVar.vim') 178389483d40SBram Moolenaarenddef 178489483d40SBram Moolenaar 17858a7d6542SBram Moolenaardef Test_import_absolute() 17868a7d6542SBram Moolenaar let import_lines = [ 1787e6085c53SBram Moolenaar 'vim9script', 1788e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1789e6085c53SBram Moolenaar 'def UseExported()', 1790e6085c53SBram Moolenaar ' g:imported_abs = exported', 1791e6085c53SBram Moolenaar ' exported = 8888', 1792e6085c53SBram Moolenaar ' g:imported_after = exported', 1793e6085c53SBram Moolenaar 'enddef', 1794e6085c53SBram Moolenaar 'UseExported()', 1795e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1796e6085c53SBram Moolenaar ] 17978a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 17988a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 17998a7d6542SBram Moolenaar 18008a7d6542SBram Moolenaar source Ximport_abs.vim 18018a7d6542SBram Moolenaar 18028a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18034e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1804675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1805675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1806675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1807675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1808675f716eSBram Moolenaar 'exported = 8888.*' .. 1809675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1810675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1811675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1812675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1813e6085c53SBram Moolenaar g:import_disassembled) 1814b3ca9824SBram Moolenaar 1815b3ca9824SBram Moolenaar Undo_export_script_lines() 18168a7d6542SBram Moolenaar unlet g:imported_abs 18174e12a5dfSBram Moolenaar unlet g:import_disassembled 18188a7d6542SBram Moolenaar 18198a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18208a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18218a7d6542SBram Moolenaarenddef 18228a7d6542SBram Moolenaar 18238a7d6542SBram Moolenaardef Test_import_rtp() 18248a7d6542SBram Moolenaar let import_lines = [ 1825e6085c53SBram Moolenaar 'vim9script', 1826e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1827e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1828e6085c53SBram Moolenaar ] 18298a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18308a7d6542SBram Moolenaar mkdir('import') 18318a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18328a7d6542SBram Moolenaar 18338a7d6542SBram Moolenaar let save_rtp = &rtp 18348a7d6542SBram Moolenaar &rtp = getcwd() 18358a7d6542SBram Moolenaar source Ximport_rtp.vim 18368a7d6542SBram Moolenaar &rtp = save_rtp 18378a7d6542SBram Moolenaar 18388a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18398a7d6542SBram Moolenaar 1840b3ca9824SBram Moolenaar Undo_export_script_lines() 1841b3ca9824SBram Moolenaar unlet g:imported_rtp 18428a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 184389483d40SBram Moolenaar delete('import', 'rf') 18448a7d6542SBram Moolenaarenddef 18458a7d6542SBram Moolenaar 184625e0f586SBram Moolenaardef Test_import_compile_error() 184725e0f586SBram Moolenaar let export_lines = [ 184825e0f586SBram Moolenaar 'vim9script', 184925e0f586SBram Moolenaar 'export def ExpFunc(): string', 185025e0f586SBram Moolenaar ' return notDefined', 185125e0f586SBram Moolenaar 'enddef', 185225e0f586SBram Moolenaar ] 185325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 185425e0f586SBram Moolenaar 185525e0f586SBram Moolenaar let import_lines = [ 185625e0f586SBram Moolenaar 'vim9script', 185725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 185825e0f586SBram Moolenaar 'def ImpFunc()', 185925e0f586SBram Moolenaar ' echo ExpFunc()', 186025e0f586SBram Moolenaar 'enddef', 186125e0f586SBram Moolenaar 'defcompile', 186225e0f586SBram Moolenaar ] 186325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 186425e0f586SBram Moolenaar 186525e0f586SBram Moolenaar try 186625e0f586SBram Moolenaar source Ximport.vim 186725e0f586SBram Moolenaar catch /E1001/ 1868f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 186925e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 187025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 187125e0f586SBram Moolenaar endtry 187225e0f586SBram Moolenaar 187325e0f586SBram Moolenaar delete('Xexported.vim') 187425e0f586SBram Moolenaar delete('Ximport.vim') 187525e0f586SBram Moolenaarenddef 187625e0f586SBram Moolenaar 1877c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1878c4ce36d4SBram Moolenaar let lines = [ 1879c4ce36d4SBram Moolenaar 'vim9script', 1880c4ce36d4SBram Moolenaar 'def Func()', 1881c4ce36d4SBram Moolenaar ' eval [][0]', 1882c4ce36d4SBram Moolenaar 'enddef', 1883c4ce36d4SBram Moolenaar 'Func()', 1884c4ce36d4SBram Moolenaar ] 1885c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1886c4ce36d4SBram Moolenaar 1887c4ce36d4SBram Moolenaar for count in range(3) 1888c4ce36d4SBram Moolenaar try 1889c4ce36d4SBram Moolenaar source Xtestscript.vim 1890c4ce36d4SBram Moolenaar catch /E684/ 1891c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1892c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1893c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1894c4ce36d4SBram Moolenaar endtry 1895c4ce36d4SBram Moolenaar endfor 1896c4ce36d4SBram Moolenaar 1897c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1898c4ce36d4SBram Moolenaarenddef 1899c4ce36d4SBram Moolenaar 1900eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1901eef2102eSBram Moolenaar let export_lines =<< trim END 1902eef2102eSBram Moolenaar vim9script 1903eef2102eSBram Moolenaar export def Func() 1904eef2102eSBram Moolenaar echo 'imported' 1905eef2102eSBram Moolenaar enddef 1906eef2102eSBram Moolenaar END 1907eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1908eef2102eSBram Moolenaar 1909eef2102eSBram Moolenaar let lines =<< trim END 1910eef2102eSBram Moolenaar vim9script 1911eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1912eef2102eSBram Moolenaar def Func() 1913eef2102eSBram Moolenaar echo 'local to function' 1914eef2102eSBram Moolenaar enddef 1915eef2102eSBram Moolenaar END 1916eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1917eef2102eSBram Moolenaar 1918eef2102eSBram Moolenaar lines =<< trim END 1919eef2102eSBram Moolenaar vim9script 1920eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1921eef2102eSBram Moolenaar def Outer() 1922eef2102eSBram Moolenaar def Func() 1923eef2102eSBram Moolenaar echo 'local to function' 1924eef2102eSBram Moolenaar enddef 1925eef2102eSBram Moolenaar enddef 1926eef2102eSBram Moolenaar defcompile 1927eef2102eSBram Moolenaar END 1928eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1929eef2102eSBram Moolenaar 1930eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1931eef2102eSBram Moolenaarenddef 1932eef2102eSBram Moolenaar 1933b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1934b9a2cac3SBram Moolenaar let lines =<< trim END 1935b9a2cac3SBram Moolenaar vim9script 1936b9a2cac3SBram Moolenaar def Func() 1937b9a2cac3SBram Moolenaar echo 'one' 1938b9a2cac3SBram Moolenaar enddef 1939b9a2cac3SBram Moolenaar def Func() 1940b9a2cac3SBram Moolenaar echo 'two' 1941b9a2cac3SBram Moolenaar enddef 1942b9a2cac3SBram Moolenaar END 1943b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1944fa211f3cSBram Moolenaar 1945fa211f3cSBram Moolenaar lines =<< trim END 1946fa211f3cSBram Moolenaar vim9script 1947fa211f3cSBram Moolenaar def Foo(): string 1948fa211f3cSBram Moolenaar return 'foo' 1949fa211f3cSBram Moolenaar enddef 1950fa211f3cSBram Moolenaar def Func() 1951fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1952fa211f3cSBram Moolenaar enddef 1953fa211f3cSBram Moolenaar defcompile 1954fa211f3cSBram Moolenaar END 1955fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1956b9a2cac3SBram Moolenaarenddef 1957b9a2cac3SBram Moolenaar 19588a7d6542SBram Moolenaardef Test_fixed_size_list() 1959f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 19608a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 19618a7d6542SBram Moolenaar l->remove(0) 19628a7d6542SBram Moolenaar l->add(5) 19638a7d6542SBram Moolenaar l->insert(99, 1) 19640f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19658a7d6542SBram Moolenaarenddef 19668a7d6542SBram Moolenaar 1967ae616494SBram Moolenaardef Test_no_insert_xit() 1968ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1969ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1970f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1971f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1972f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1973ae616494SBram Moolenaar 1974ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1975ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1976ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1977ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1978f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1979f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1980f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1981f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1982f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1983ae616494SBram Moolenaarenddef 1984ae616494SBram Moolenaar 1985158906cfSBram Moolenaardef IfElse(what: number): string 1986158906cfSBram Moolenaar let res = '' 1987158906cfSBram Moolenaar if what == 1 1988158906cfSBram Moolenaar res = "one" 1989158906cfSBram Moolenaar elseif what == 2 1990158906cfSBram Moolenaar res = "two" 1991a259d8d3SBram Moolenaar else 1992158906cfSBram Moolenaar res = "three" 1993a259d8d3SBram Moolenaar endif 1994158906cfSBram Moolenaar return res 1995a259d8d3SBram Moolenaarenddef 1996a259d8d3SBram Moolenaar 1997158906cfSBram Moolenaardef Test_if_elseif_else() 1998158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1999158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2000158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20010f18b6d1SBram Moolenaarenddef 20020f18b6d1SBram Moolenaar 2003e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2004e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 2005e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 2006e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 2007e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2008585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 2009e8c4abbbSBram Moolenaarenddef 2010e8c4abbbSBram Moolenaar 20116d69bf60SBram Moolenaarlet g:bool_true = v:true 20126d69bf60SBram Moolenaarlet g:bool_false = v:false 20136d69bf60SBram Moolenaar 20146d69bf60SBram Moolenaardef Test_if_const_expr() 20156d69bf60SBram Moolenaar let res = false 20166d69bf60SBram Moolenaar if true ? true : false 20176d69bf60SBram Moolenaar res = true 20186d69bf60SBram Moolenaar endif 20196d69bf60SBram Moolenaar assert_equal(true, res) 20206d69bf60SBram Moolenaar 2021585fea7bSBram Moolenaar g:glob = 2 2022585fea7bSBram Moolenaar if false 20236797966dSBram Moolenaar execute('g:glob = 3') 2024585fea7bSBram Moolenaar endif 2025585fea7bSBram Moolenaar assert_equal(2, g:glob) 2026585fea7bSBram Moolenaar if true 20276797966dSBram Moolenaar execute('g:glob = 3') 2028585fea7bSBram Moolenaar endif 2029585fea7bSBram Moolenaar assert_equal(3, g:glob) 2030585fea7bSBram Moolenaar 20316d69bf60SBram Moolenaar res = false 20326d69bf60SBram Moolenaar if g:bool_true ? true : false 20336d69bf60SBram Moolenaar res = true 20346d69bf60SBram Moolenaar endif 20356d69bf60SBram Moolenaar assert_equal(true, res) 20366d69bf60SBram Moolenaar 20376d69bf60SBram Moolenaar res = false 20386d69bf60SBram Moolenaar if true ? g:bool_true : false 20396d69bf60SBram Moolenaar res = true 20406d69bf60SBram Moolenaar endif 20416d69bf60SBram Moolenaar assert_equal(true, res) 20426d69bf60SBram Moolenaar 20436d69bf60SBram Moolenaar res = false 20446d69bf60SBram Moolenaar if true ? true : g:bool_false 20456d69bf60SBram Moolenaar res = true 20466d69bf60SBram Moolenaar endif 20476d69bf60SBram Moolenaar assert_equal(true, res) 20486d69bf60SBram Moolenaar 20496d69bf60SBram Moolenaar res = false 20506d69bf60SBram Moolenaar if true ? false : true 20516d69bf60SBram Moolenaar res = true 20526d69bf60SBram Moolenaar endif 20536d69bf60SBram Moolenaar assert_equal(false, res) 20546d69bf60SBram Moolenaar 20556d69bf60SBram Moolenaar res = false 20566d69bf60SBram Moolenaar if false ? false : true 20576d69bf60SBram Moolenaar res = true 20586d69bf60SBram Moolenaar endif 20596d69bf60SBram Moolenaar assert_equal(true, res) 20606d69bf60SBram Moolenaar 20616d69bf60SBram Moolenaar res = false 20626d69bf60SBram Moolenaar if false ? true : false 20636d69bf60SBram Moolenaar res = true 20646d69bf60SBram Moolenaar endif 20656d69bf60SBram Moolenaar assert_equal(false, res) 20666d69bf60SBram Moolenaar 20676d69bf60SBram Moolenaar res = false 2068e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2069e8c4abbbSBram Moolenaar res = true 2070e8c4abbbSBram Moolenaar endif 2071e8c4abbbSBram Moolenaar assert_equal(false, res) 2072e8c4abbbSBram Moolenaar 2073e8c4abbbSBram Moolenaar res = false 20746d69bf60SBram Moolenaar if true && true 20756d69bf60SBram Moolenaar res = true 20766d69bf60SBram Moolenaar endif 20776d69bf60SBram Moolenaar assert_equal(true, res) 20786d69bf60SBram Moolenaar 20796d69bf60SBram Moolenaar res = false 20806d69bf60SBram Moolenaar if true && false 20816d69bf60SBram Moolenaar res = true 20826d69bf60SBram Moolenaar endif 20836d69bf60SBram Moolenaar assert_equal(false, res) 20846d69bf60SBram Moolenaar 20856d69bf60SBram Moolenaar res = false 20866d69bf60SBram Moolenaar if g:bool_true && false 20876d69bf60SBram Moolenaar res = true 20886d69bf60SBram Moolenaar endif 20896d69bf60SBram Moolenaar assert_equal(false, res) 20906d69bf60SBram Moolenaar 20916d69bf60SBram Moolenaar res = false 20926d69bf60SBram Moolenaar if true && g:bool_false 20936d69bf60SBram Moolenaar res = true 20946d69bf60SBram Moolenaar endif 20956d69bf60SBram Moolenaar assert_equal(false, res) 20966d69bf60SBram Moolenaar 20976d69bf60SBram Moolenaar res = false 20986d69bf60SBram Moolenaar if false && false 20996d69bf60SBram Moolenaar res = true 21006d69bf60SBram Moolenaar endif 21016d69bf60SBram Moolenaar assert_equal(false, res) 21026d69bf60SBram Moolenaar 21036d69bf60SBram Moolenaar res = false 21046d69bf60SBram Moolenaar if true || false 21056d69bf60SBram Moolenaar res = true 21066d69bf60SBram Moolenaar endif 21076d69bf60SBram Moolenaar assert_equal(true, res) 21086d69bf60SBram Moolenaar 21096d69bf60SBram Moolenaar res = false 21106d69bf60SBram Moolenaar if g:bool_true || false 21116d69bf60SBram Moolenaar res = true 21126d69bf60SBram Moolenaar endif 21136d69bf60SBram Moolenaar assert_equal(true, res) 21146d69bf60SBram Moolenaar 21156d69bf60SBram Moolenaar res = false 21166d69bf60SBram Moolenaar if true || g:bool_false 21176d69bf60SBram Moolenaar res = true 21186d69bf60SBram Moolenaar endif 21196d69bf60SBram Moolenaar assert_equal(true, res) 21206d69bf60SBram Moolenaar 21216d69bf60SBram Moolenaar res = false 21226d69bf60SBram Moolenaar if false || false 21236d69bf60SBram Moolenaar res = true 21246d69bf60SBram Moolenaar endif 21256d69bf60SBram Moolenaar assert_equal(false, res) 21263988f64fSBram Moolenaar 21273988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21283988f64fSBram Moolenaar if false | eval 0 | endif 21293988f64fSBram Moolenaar if false | eval burp + 234 | endif 21303988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21313988f64fSBram Moolenaar if false 21323988f64fSBram Moolenaar burp 21333988f64fSBram Moolenaar endif 213480c34ca3SBram Moolenaarenddef 21356d69bf60SBram Moolenaar 213680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 213780c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 213880c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2139e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 2140e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21416d69bf60SBram Moolenaarenddef 21426d69bf60SBram Moolenaar 214372abcf42SBram Moolenaardef RunNested(i: number): number 214472abcf42SBram Moolenaar let x: number = 0 214572abcf42SBram Moolenaar if i % 2 214672abcf42SBram Moolenaar if 1 2147f5be8cdbSBram Moolenaar # comment 214872abcf42SBram Moolenaar else 2149f5be8cdbSBram Moolenaar # comment 215072abcf42SBram Moolenaar endif 215172abcf42SBram Moolenaar x += 1 215272abcf42SBram Moolenaar else 215372abcf42SBram Moolenaar x += 1000 215472abcf42SBram Moolenaar endif 215572abcf42SBram Moolenaar return x 215672abcf42SBram Moolenaarenddef 215772abcf42SBram Moolenaar 215872abcf42SBram Moolenaardef Test_nested_if() 215972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 216072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 216172abcf42SBram Moolenaarenddef 216272abcf42SBram Moolenaar 2163ad39c094SBram Moolenaardef Test_execute_cmd() 2164ad39c094SBram Moolenaar new 2165ad39c094SBram Moolenaar setline(1, 'default') 2166ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 2167ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2168a72cfb80SBram Moolenaar 2169a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 2170a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2171a72cfb80SBram Moolenaar 2172ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 2173ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2174a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2175ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2176a72cfb80SBram Moolenaar 2177ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 2178ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2179a72cfb80SBram Moolenaar 2180ad39c094SBram Moolenaar let cmd_first = 'call ' 2181ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2182ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2183ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2184ad39c094SBram Moolenaar bwipe! 2185585fea7bSBram Moolenaar 21862d6b20d6SBram Moolenaar let n = true 21872d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 21882d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 21892d6b20d6SBram Moolenaar 2190e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2191e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2192e5abf7afSBram Moolenaar 2193430deb19SBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:', 1) 2194430deb19SBram Moolenaar call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2195430deb19SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2196ad39c094SBram Moolenaarenddef 2197ad39c094SBram Moolenaar 219847e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2199f5be8cdbSBram Moolenaar # only checks line continuation 220047e880d6SBram Moolenaar let lines =<< trim END 220147e880d6SBram Moolenaar vim9script 220247e880d6SBram Moolenaar execute 'g:someVar' 220347e880d6SBram Moolenaar .. ' = ' .. 220447e880d6SBram Moolenaar '28' 220547e880d6SBram Moolenaar assert_equal(28, g:someVar) 220647e880d6SBram Moolenaar unlet g:someVar 220747e880d6SBram Moolenaar END 220847e880d6SBram Moolenaar CheckScriptSuccess(lines) 220947e880d6SBram Moolenaarenddef 221047e880d6SBram Moolenaar 2211ad39c094SBram Moolenaardef Test_echo_cmd() 2212a72cfb80SBram Moolenaar echo 'some' # comment 2213585fea7bSBram Moolenaar echon 'thing' 2214ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2215ad39c094SBram Moolenaar 2216a72cfb80SBram Moolenaar echo "some" # comment 2217a72cfb80SBram Moolenaar echon "thing" 2218a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2219a72cfb80SBram Moolenaar 2220ad39c094SBram Moolenaar let str1 = 'some' 2221ad39c094SBram Moolenaar let str2 = 'more' 2222ad39c094SBram Moolenaar echo str1 str2 2223ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2224a72cfb80SBram Moolenaar 2225a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2226ad39c094SBram Moolenaarenddef 2227ad39c094SBram Moolenaar 2228f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2229f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2230f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2231f93c7feaSBram Moolenaar echo 'clear' 2232df069eecSBram Moolenaar :1messages 2233f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2234f93c7feaSBram Moolenaar 2235f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2236f93c7feaSBram Moolenaarenddef 2237f93c7feaSBram Moolenaar 223847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2239f5be8cdbSBram Moolenaar # only checks line continuation 224047e880d6SBram Moolenaar let lines =<< trim END 224147e880d6SBram Moolenaar vim9script 224247e880d6SBram Moolenaar echomsg 'here' 224347e880d6SBram Moolenaar .. ' is ' .. 224447e880d6SBram Moolenaar 'a message' 224547e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 224647e880d6SBram Moolenaar END 224747e880d6SBram Moolenaar CheckScriptSuccess(lines) 224847e880d6SBram Moolenaarenddef 224947e880d6SBram Moolenaar 2250f93c7feaSBram Moolenaardef Test_echoerr_cmd() 225140ee466cSBram Moolenaar try 225240ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 225340ee466cSBram Moolenaar catch 225440ee466cSBram Moolenaar assert_match('something wrong', v:exception) 225540ee466cSBram Moolenaar endtry 2256f93c7feaSBram Moolenaarenddef 2257f93c7feaSBram Moolenaar 225847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2259f5be8cdbSBram Moolenaar # only checks line continuation 226047e880d6SBram Moolenaar let lines =<< trim END 226147e880d6SBram Moolenaar vim9script 226247e880d6SBram Moolenaar try 226347e880d6SBram Moolenaar echoerr 'this' 226447e880d6SBram Moolenaar .. ' is ' .. 226547e880d6SBram Moolenaar 'wrong' 226647e880d6SBram Moolenaar catch 226747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 226847e880d6SBram Moolenaar endtry 226947e880d6SBram Moolenaar END 227047e880d6SBram Moolenaar CheckScriptSuccess(lines) 227147e880d6SBram Moolenaarenddef 227247e880d6SBram Moolenaar 227341fe0617SBram Moolenaardef Test_for_outside_of_function() 227441fe0617SBram Moolenaar let lines =<< trim END 227541fe0617SBram Moolenaar vim9script 227641fe0617SBram Moolenaar new 227741fe0617SBram Moolenaar for var in range(0, 3) 227841fe0617SBram Moolenaar append(line('$'), var) 227941fe0617SBram Moolenaar endfor 228041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 228141fe0617SBram Moolenaar bwipe! 228241fe0617SBram Moolenaar END 228341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 228441fe0617SBram Moolenaar source Xvim9for.vim 228541fe0617SBram Moolenaar delete('Xvim9for.vim') 228641fe0617SBram Moolenaarenddef 22878a7d6542SBram Moolenaar 2288e8c4abbbSBram Moolenaardef Test_for_loop() 2289e8c4abbbSBram Moolenaar let result = '' 2290e8c4abbbSBram Moolenaar for cnt in range(7) 2291e8c4abbbSBram Moolenaar if cnt == 4 2292e8c4abbbSBram Moolenaar break 2293e8c4abbbSBram Moolenaar endif 2294e8c4abbbSBram Moolenaar if cnt == 2 2295e8c4abbbSBram Moolenaar continue 2296e8c4abbbSBram Moolenaar endif 2297e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2298e8c4abbbSBram Moolenaar endfor 2299e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23000ad3e894SBram Moolenaar 23010ad3e894SBram Moolenaar let concat = '' 23020ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23030ad3e894SBram Moolenaar concat ..= str 23040ad3e894SBram Moolenaar endfor 23050ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2306e8c4abbbSBram Moolenaarenddef 2307e8c4abbbSBram Moolenaar 2308e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2309675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2310675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2311451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2312822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2313451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2314675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2315675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2316675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2317e8c4abbbSBram Moolenaarenddef 2318e8c4abbbSBram Moolenaar 2319d0df1aacSBram Moolenaardef Test_while_loop() 2320d0df1aacSBram Moolenaar let result = '' 2321d0df1aacSBram Moolenaar let cnt = 0 2322d0df1aacSBram Moolenaar while cnt < 555 2323d0df1aacSBram Moolenaar if cnt == 3 2324d0df1aacSBram Moolenaar break 2325d0df1aacSBram Moolenaar endif 2326d0df1aacSBram Moolenaar cnt += 1 2327d0df1aacSBram Moolenaar if cnt == 2 2328d0df1aacSBram Moolenaar continue 2329d0df1aacSBram Moolenaar endif 2330d0df1aacSBram Moolenaar result ..= cnt .. '_' 2331d0df1aacSBram Moolenaar endwhile 2332d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2333d0df1aacSBram Moolenaarenddef 2334d0df1aacSBram Moolenaar 2335e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2336675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2337675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2338675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2339675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2340675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2341675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2342675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2343bd5da371SBram Moolenaarenddef 2344bd5da371SBram Moolenaar 23459645e2d9SBram Moolenaardef Test_interrupt_loop() 234697acfc78SBram Moolenaar let caught = false 23479645e2d9SBram Moolenaar let x = 0 234897acfc78SBram Moolenaar try 23499645e2d9SBram Moolenaar while 1 23509645e2d9SBram Moolenaar x += 1 23519645e2d9SBram Moolenaar if x == 100 23529645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23539645e2d9SBram Moolenaar endif 23549645e2d9SBram Moolenaar endwhile 235597acfc78SBram Moolenaar catch 235697acfc78SBram Moolenaar caught = true 235797acfc78SBram Moolenaar assert_equal(100, x) 235897acfc78SBram Moolenaar endtry 235997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 23609645e2d9SBram Moolenaarenddef 236120431c9dSBram Moolenaar 23624fdae999SBram Moolenaardef Test_automatic_line_continuation() 23634fdae999SBram Moolenaar let mylist = [ 23644fdae999SBram Moolenaar 'one', 23654fdae999SBram Moolenaar 'two', 23664fdae999SBram Moolenaar 'three', 2367f5be8cdbSBram Moolenaar ] # comment 23684fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23694fdae999SBram Moolenaar 23704fdae999SBram Moolenaar let mydict = { 23714fdae999SBram Moolenaar 'one': 1, 23724fdae999SBram Moolenaar 'two': 2, 23734fdae999SBram Moolenaar 'three': 23744fdae999SBram Moolenaar 3, 2375f5be8cdbSBram Moolenaar } # comment 23764fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 23774fdae999SBram Moolenaar mydict = #{ 23782c330432SBram Moolenaar one: 1, # comment 23792c330432SBram Moolenaar two: # comment 23802c330432SBram Moolenaar 2, # comment 23812c330432SBram Moolenaar three: 3 # comment 23822c330432SBram Moolenaar } 23832c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 23842c330432SBram Moolenaar mydict = #{ 23852c330432SBram Moolenaar one: 1, 23864fdae999SBram Moolenaar two: 23874fdae999SBram Moolenaar 2, 23882c330432SBram Moolenaar three: 3 23894fdae999SBram Moolenaar } 23904fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2391e6085c53SBram Moolenaar 2392e6085c53SBram Moolenaar assert_equal( 2393e6085c53SBram Moolenaar ['one', 'two', 'three'], 2394e6085c53SBram Moolenaar split('one two three') 2395e6085c53SBram Moolenaar ) 23964fdae999SBram Moolenaarenddef 23974fdae999SBram Moolenaar 23987a092245SBram Moolenaardef Test_vim9_comment() 23997a092245SBram Moolenaar CheckScriptSuccess([ 24007a092245SBram Moolenaar 'vim9script', 24017a092245SBram Moolenaar '# something', 24027a092245SBram Moolenaar ]) 24037a092245SBram Moolenaar CheckScriptFailure([ 24047a092245SBram Moolenaar 'vim9script', 24057a092245SBram Moolenaar ':# something', 24067a092245SBram Moolenaar ], 'E488:') 24077a092245SBram Moolenaar CheckScriptFailure([ 24087a092245SBram Moolenaar '# something', 24097a092245SBram Moolenaar ], 'E488:') 24107a092245SBram Moolenaar CheckScriptFailure([ 24117a092245SBram Moolenaar ':# something', 24127a092245SBram Moolenaar ], 'E488:') 24137a092245SBram Moolenaar 24144a8d9f2eSBram Moolenaar { # block start 24154a8d9f2eSBram Moolenaar } # block end 24164a8d9f2eSBram Moolenaar CheckDefFailure([ 24174a8d9f2eSBram Moolenaar '{# comment', 24184a8d9f2eSBram Moolenaar ], 'E488:') 24194a8d9f2eSBram Moolenaar CheckDefFailure([ 24204a8d9f2eSBram Moolenaar '{', 24214a8d9f2eSBram Moolenaar '}# comment', 24224a8d9f2eSBram Moolenaar ], 'E488:') 24234a8d9f2eSBram Moolenaar 24244a8d9f2eSBram Moolenaar echo "yes" # comment 24254a8d9f2eSBram Moolenaar CheckDefFailure([ 24264a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24274a8d9f2eSBram Moolenaar ], 'E488:') 24287a092245SBram Moolenaar CheckScriptSuccess([ 24297a092245SBram Moolenaar 'vim9script', 24307a092245SBram Moolenaar 'echo "yes" # something', 24317a092245SBram Moolenaar ]) 24327a092245SBram Moolenaar CheckScriptFailure([ 24337a092245SBram Moolenaar 'vim9script', 24347a092245SBram Moolenaar 'echo "yes"# something', 24357a092245SBram Moolenaar ], 'E121:') 24367a092245SBram Moolenaar CheckScriptFailure([ 24377a092245SBram Moolenaar 'vim9script', 24387a092245SBram Moolenaar 'echo# something', 24397a092245SBram Moolenaar ], 'E121:') 24407a092245SBram Moolenaar CheckScriptFailure([ 24417a092245SBram Moolenaar 'echo "yes" # something', 24427a092245SBram Moolenaar ], 'E121:') 24437a092245SBram Moolenaar 24444a8d9f2eSBram Moolenaar exe "echo" # comment 24454a8d9f2eSBram Moolenaar CheckDefFailure([ 24464a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24474a8d9f2eSBram Moolenaar ], 'E488:') 24484a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24494a8d9f2eSBram Moolenaar 'vim9script', 24504a8d9f2eSBram Moolenaar 'exe "echo" # something', 24514a8d9f2eSBram Moolenaar ]) 24524a8d9f2eSBram Moolenaar CheckScriptFailure([ 24534a8d9f2eSBram Moolenaar 'vim9script', 24544a8d9f2eSBram Moolenaar 'exe "echo"# something', 24554a8d9f2eSBram Moolenaar ], 'E121:') 24564a8d9f2eSBram Moolenaar CheckDefFailure([ 24574a8d9f2eSBram Moolenaar 'exe # comment', 24584a8d9f2eSBram Moolenaar ], 'E1015:') 24594a8d9f2eSBram Moolenaar CheckScriptFailure([ 24604a8d9f2eSBram Moolenaar 'vim9script', 24614a8d9f2eSBram Moolenaar 'exe# something', 24624a8d9f2eSBram Moolenaar ], 'E121:') 24634a8d9f2eSBram Moolenaar CheckScriptFailure([ 24644a8d9f2eSBram Moolenaar 'exe "echo" # something', 24654a8d9f2eSBram Moolenaar ], 'E121:') 24664a8d9f2eSBram Moolenaar 24677a092245SBram Moolenaar CheckDefFailure([ 24687a092245SBram Moolenaar 'try# comment', 24697a092245SBram Moolenaar ' echo "yes"', 24707a092245SBram Moolenaar 'catch', 24717a092245SBram Moolenaar 'endtry', 24727a092245SBram Moolenaar ], 'E488:') 24732c5ed4e3SBram Moolenaar CheckScriptFailure([ 24742c5ed4e3SBram Moolenaar 'vim9script', 24752c5ed4e3SBram Moolenaar 'try# comment', 24762c5ed4e3SBram Moolenaar 'echo "yes"', 24772c5ed4e3SBram Moolenaar ], 'E488:') 24787a092245SBram Moolenaar CheckDefFailure([ 24797a092245SBram Moolenaar 'try', 2480a72cfb80SBram Moolenaar ' throw#comment', 2481a72cfb80SBram Moolenaar 'catch', 2482a72cfb80SBram Moolenaar 'endtry', 2483a72cfb80SBram Moolenaar ], 'E1015:') 2484a72cfb80SBram Moolenaar CheckDefFailure([ 2485a72cfb80SBram Moolenaar 'try', 2486a72cfb80SBram Moolenaar ' throw "yes"#comment', 2487a72cfb80SBram Moolenaar 'catch', 2488a72cfb80SBram Moolenaar 'endtry', 2489a72cfb80SBram Moolenaar ], 'E488:') 2490a72cfb80SBram Moolenaar CheckDefFailure([ 2491a72cfb80SBram Moolenaar 'try', 24927a092245SBram Moolenaar ' echo "yes"', 24937a092245SBram Moolenaar 'catch# comment', 24947a092245SBram Moolenaar 'endtry', 24957a092245SBram Moolenaar ], 'E488:') 24962c5ed4e3SBram Moolenaar CheckScriptFailure([ 24972c5ed4e3SBram Moolenaar 'vim9script', 24982c5ed4e3SBram Moolenaar 'try', 24992c5ed4e3SBram Moolenaar ' echo "yes"', 25002c5ed4e3SBram Moolenaar 'catch# comment', 25012c5ed4e3SBram Moolenaar 'endtry', 25022c5ed4e3SBram Moolenaar ], 'E654:') 25032c5ed4e3SBram Moolenaar CheckDefFailure([ 25042c5ed4e3SBram Moolenaar 'try', 25052c5ed4e3SBram Moolenaar ' echo "yes"', 25062c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25072c5ed4e3SBram Moolenaar 'endtry', 25082c5ed4e3SBram Moolenaar ], 'E488:') 25097a092245SBram Moolenaar CheckDefFailure([ 25107a092245SBram Moolenaar 'try', 25117a092245SBram Moolenaar 'echo "yes"', 25127a092245SBram Moolenaar 'catch', 25137a092245SBram Moolenaar 'endtry# comment', 25147a092245SBram Moolenaar ], 'E488:') 25152c5ed4e3SBram Moolenaar CheckScriptFailure([ 25162c5ed4e3SBram Moolenaar 'vim9script', 25172c5ed4e3SBram Moolenaar 'try', 25182c5ed4e3SBram Moolenaar ' echo "yes"', 25192c5ed4e3SBram Moolenaar 'catch', 25202c5ed4e3SBram Moolenaar 'endtry# comment', 25219b7bf9e9SBram Moolenaar ], 'E488:') 25222c5ed4e3SBram Moolenaar 25232c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25242c5ed4e3SBram Moolenaar 'vim9script', 25252c5ed4e3SBram Moolenaar 'hi # comment', 25262c5ed4e3SBram Moolenaar ]) 25272c5ed4e3SBram Moolenaar CheckScriptFailure([ 25282c5ed4e3SBram Moolenaar 'vim9script', 25292c5ed4e3SBram Moolenaar 'hi# comment', 25302c5ed4e3SBram Moolenaar ], 'E416:') 25311966c248SBram Moolenaar CheckScriptSuccess([ 25321966c248SBram Moolenaar 'vim9script', 25331966c248SBram Moolenaar 'hi Search # comment', 25341966c248SBram Moolenaar ]) 25351966c248SBram Moolenaar CheckScriptFailure([ 25361966c248SBram Moolenaar 'vim9script', 25371966c248SBram Moolenaar 'hi Search# comment', 25381966c248SBram Moolenaar ], 'E416:') 25391966c248SBram Moolenaar CheckScriptSuccess([ 25401966c248SBram Moolenaar 'vim9script', 25411966c248SBram Moolenaar 'hi link This Search # comment', 25421966c248SBram Moolenaar ]) 25431966c248SBram Moolenaar CheckScriptFailure([ 25441966c248SBram Moolenaar 'vim9script', 25451966c248SBram Moolenaar 'hi link This That# comment', 25461966c248SBram Moolenaar ], 'E413:') 25471966c248SBram Moolenaar CheckScriptSuccess([ 25481966c248SBram Moolenaar 'vim9script', 25491966c248SBram Moolenaar 'hi clear This # comment', 25501966c248SBram Moolenaar 'hi clear # comment', 25511966c248SBram Moolenaar ]) 2552f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2553f5be8cdbSBram Moolenaar # hi clear This# comment', 25541966c248SBram Moolenaar CheckScriptFailure([ 25551966c248SBram Moolenaar 'vim9script', 25561966c248SBram Moolenaar 'hi clear# comment', 25571966c248SBram Moolenaar ], 'E416:') 25581966c248SBram Moolenaar 25591966c248SBram Moolenaar CheckScriptSuccess([ 25601966c248SBram Moolenaar 'vim9script', 25611966c248SBram Moolenaar 'hi Group term=bold', 25621966c248SBram Moolenaar 'match Group /todo/ # comment', 25631966c248SBram Moolenaar ]) 25641966c248SBram Moolenaar CheckScriptFailure([ 25651966c248SBram Moolenaar 'vim9script', 25661966c248SBram Moolenaar 'hi Group term=bold', 25671966c248SBram Moolenaar 'match Group /todo/# comment', 25681966c248SBram Moolenaar ], 'E488:') 25691966c248SBram Moolenaar CheckScriptSuccess([ 25701966c248SBram Moolenaar 'vim9script', 25711966c248SBram Moolenaar 'match # comment', 25721966c248SBram Moolenaar ]) 25731966c248SBram Moolenaar CheckScriptFailure([ 25741966c248SBram Moolenaar 'vim9script', 25751966c248SBram Moolenaar 'match# comment', 25761966c248SBram Moolenaar ], 'E475:') 25771966c248SBram Moolenaar CheckScriptSuccess([ 25781966c248SBram Moolenaar 'vim9script', 25791966c248SBram Moolenaar 'match none # comment', 25801966c248SBram Moolenaar ]) 25811966c248SBram Moolenaar CheckScriptFailure([ 25821966c248SBram Moolenaar 'vim9script', 25831966c248SBram Moolenaar 'match none# comment', 25841966c248SBram Moolenaar ], 'E475:') 25851966c248SBram Moolenaar 25861966c248SBram Moolenaar CheckScriptSuccess([ 25871966c248SBram Moolenaar 'vim9script', 25881966c248SBram Moolenaar 'menutrans clear # comment', 25891966c248SBram Moolenaar ]) 25901966c248SBram Moolenaar CheckScriptFailure([ 25911966c248SBram Moolenaar 'vim9script', 25921966c248SBram Moolenaar 'menutrans clear# comment text', 25931966c248SBram Moolenaar ], 'E474:') 25941966c248SBram Moolenaar 25951966c248SBram Moolenaar CheckScriptSuccess([ 25961966c248SBram Moolenaar 'vim9script', 25971966c248SBram Moolenaar 'syntax clear # comment', 25981966c248SBram Moolenaar ]) 25991966c248SBram Moolenaar CheckScriptFailure([ 26001966c248SBram Moolenaar 'vim9script', 26011966c248SBram Moolenaar 'syntax clear# comment text', 26021966c248SBram Moolenaar ], 'E28:') 26031966c248SBram Moolenaar CheckScriptSuccess([ 26041966c248SBram Moolenaar 'vim9script', 26051966c248SBram Moolenaar 'syntax keyword Word some', 26061966c248SBram Moolenaar 'syntax clear Word # comment', 26071966c248SBram Moolenaar ]) 26081966c248SBram Moolenaar CheckScriptFailure([ 26091966c248SBram Moolenaar 'vim9script', 26101966c248SBram Moolenaar 'syntax keyword Word some', 26111966c248SBram Moolenaar 'syntax clear Word# comment text', 26121966c248SBram Moolenaar ], 'E28:') 26131966c248SBram Moolenaar 26141966c248SBram Moolenaar CheckScriptSuccess([ 26151966c248SBram Moolenaar 'vim9script', 26161966c248SBram Moolenaar 'syntax list # comment', 26171966c248SBram Moolenaar ]) 26181966c248SBram Moolenaar CheckScriptFailure([ 26191966c248SBram Moolenaar 'vim9script', 26201966c248SBram Moolenaar 'syntax list# comment text', 26211966c248SBram Moolenaar ], 'E28:') 26221966c248SBram Moolenaar 26231966c248SBram Moolenaar CheckScriptSuccess([ 26241966c248SBram Moolenaar 'vim9script', 26251966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26261966c248SBram Moolenaar ]) 26271966c248SBram Moolenaar CheckScriptFailure([ 26281966c248SBram Moolenaar 'vim9script', 26291966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26301966c248SBram Moolenaar ], 'E475:') 26311966c248SBram Moolenaar 26321966c248SBram Moolenaar CheckScriptSuccess([ 26331966c248SBram Moolenaar 'vim9script', 26341966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26351966c248SBram Moolenaar ]) 26361966c248SBram Moolenaar CheckScriptFailure([ 26371966c248SBram Moolenaar 'vim9script', 26381966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26391966c248SBram Moolenaar ], 'E789:') 26401966c248SBram Moolenaar 26411966c248SBram Moolenaar CheckScriptSuccess([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26441966c248SBram Moolenaar ]) 26451966c248SBram Moolenaar CheckScriptFailure([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26481966c248SBram Moolenaar ], 'E402:') 26491966c248SBram Moolenaar 26501966c248SBram Moolenaar CheckScriptSuccess([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26531966c248SBram Moolenaar ]) 26541966c248SBram Moolenaar CheckScriptFailure([ 26551966c248SBram Moolenaar 'vim9script', 26561966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26571966c248SBram Moolenaar ], 'E475:') 26581966c248SBram Moolenaar CheckScriptFailure([ 26591966c248SBram Moolenaar 'vim9script', 26601966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26611966c248SBram Moolenaar ], 'E406:') 26621966c248SBram Moolenaar CheckScriptFailure([ 26631966c248SBram Moolenaar 'vim9script', 26641966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26651966c248SBram Moolenaar ], 'E475:') 26661966c248SBram Moolenaar 26671966c248SBram Moolenaar CheckScriptSuccess([ 26681966c248SBram Moolenaar 'vim9script', 26691966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26701966c248SBram Moolenaar ]) 26711966c248SBram Moolenaar CheckScriptFailure([ 26721966c248SBram Moolenaar 'vim9script', 26731966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2674d032f34aSBram Moolenaar ], 'E402:') 26751966c248SBram Moolenaar 26761966c248SBram Moolenaar CheckScriptSuccess([ 26771966c248SBram Moolenaar 'vim9script', 26781966c248SBram Moolenaar 'syntax sync # comment', 26791966c248SBram Moolenaar ]) 26801966c248SBram Moolenaar CheckScriptFailure([ 26811966c248SBram Moolenaar 'vim9script', 26821966c248SBram Moolenaar 'syntax sync# comment', 26831966c248SBram Moolenaar ], 'E404:') 26841966c248SBram Moolenaar CheckScriptSuccess([ 26851966c248SBram Moolenaar 'vim9script', 26861966c248SBram Moolenaar 'syntax sync ccomment # comment', 26871966c248SBram Moolenaar ]) 26881966c248SBram Moolenaar CheckScriptFailure([ 26891966c248SBram Moolenaar 'vim9script', 26901966c248SBram Moolenaar 'syntax sync ccomment# comment', 26911966c248SBram Moolenaar ], 'E404:') 26921966c248SBram Moolenaar 26931966c248SBram Moolenaar CheckScriptSuccess([ 26941966c248SBram Moolenaar 'vim9script', 26951966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26961966c248SBram Moolenaar ]) 26971966c248SBram Moolenaar CheckScriptFailure([ 26981966c248SBram Moolenaar 'vim9script', 26991966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27001966c248SBram Moolenaar ], 'E475:') 2701a72cfb80SBram Moolenaar 2702a72cfb80SBram Moolenaar CheckScriptSuccess([ 2703a72cfb80SBram Moolenaar 'vim9script', 2704a72cfb80SBram Moolenaar 'command Echo echo # comment', 2705a72cfb80SBram Moolenaar 'command Echo # comment', 2706a72cfb80SBram Moolenaar ]) 2707a72cfb80SBram Moolenaar CheckScriptFailure([ 2708a72cfb80SBram Moolenaar 'vim9script', 2709a72cfb80SBram Moolenaar 'command Echo echo# comment', 2710a72cfb80SBram Moolenaar 'Echo', 2711a72cfb80SBram Moolenaar ], 'E121:') 2712a72cfb80SBram Moolenaar CheckScriptFailure([ 2713a72cfb80SBram Moolenaar 'vim9script', 2714a72cfb80SBram Moolenaar 'command Echo# comment', 2715a72cfb80SBram Moolenaar ], 'E182:') 2716a72cfb80SBram Moolenaar CheckScriptFailure([ 2717a72cfb80SBram Moolenaar 'vim9script', 2718a72cfb80SBram Moolenaar 'command Echo echo', 2719a72cfb80SBram Moolenaar 'command Echo# comment', 2720a72cfb80SBram Moolenaar ], 'E182:') 2721a72cfb80SBram Moolenaar 2722a72cfb80SBram Moolenaar CheckScriptSuccess([ 2723a72cfb80SBram Moolenaar 'vim9script', 2724a72cfb80SBram Moolenaar 'function # comment', 2725a72cfb80SBram Moolenaar ]) 2726a72cfb80SBram Moolenaar CheckScriptFailure([ 2727a72cfb80SBram Moolenaar 'vim9script', 27289898107fSBram Moolenaar 'function " comment', 27299898107fSBram Moolenaar ], 'E129:') 27309898107fSBram Moolenaar CheckScriptFailure([ 27319898107fSBram Moolenaar 'vim9script', 2732a72cfb80SBram Moolenaar 'function# comment', 2733a72cfb80SBram Moolenaar ], 'E129:') 2734a72cfb80SBram Moolenaar CheckScriptSuccess([ 2735a72cfb80SBram Moolenaar 'vim9script', 2736a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2737a72cfb80SBram Moolenaar ]) 2738a72cfb80SBram Moolenaar CheckScriptFailure([ 2739a72cfb80SBram Moolenaar 'vim9script', 2740a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2741a72cfb80SBram Moolenaar ], 'E488:') 2742a72cfb80SBram Moolenaar 2743a72cfb80SBram Moolenaar CheckScriptSuccess([ 2744a72cfb80SBram Moolenaar 'vim9script', 27454c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2746a72cfb80SBram Moolenaar 'endfunc', 27474c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2748a72cfb80SBram Moolenaar ]) 2749a72cfb80SBram Moolenaar CheckScriptFailure([ 2750a72cfb80SBram Moolenaar 'vim9script', 27514c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2752a72cfb80SBram Moolenaar 'endfunc', 27534c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2754a72cfb80SBram Moolenaar ], 'E488:') 2755a72cfb80SBram Moolenaar 2756a72cfb80SBram Moolenaar CheckScriptSuccess([ 2757a72cfb80SBram Moolenaar 'vim9script', 2758a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2759a72cfb80SBram Moolenaar ]) 2760a72cfb80SBram Moolenaar CheckScriptFailure([ 2761a72cfb80SBram Moolenaar 'vim9script', 2762a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2763a72cfb80SBram Moolenaar ], 'E488:') 2764e7e4838fSBram Moolenaar 2765e7e4838fSBram Moolenaar CheckScriptFailure([ 2766e7e4838fSBram Moolenaar 'def Test() " comment', 2767e7e4838fSBram Moolenaar 'enddef', 2768e7e4838fSBram Moolenaar ], 'E488:') 2769e7e4838fSBram Moolenaar CheckScriptFailure([ 2770e7e4838fSBram Moolenaar 'vim9script', 2771e7e4838fSBram Moolenaar 'def Test() " comment', 2772e7e4838fSBram Moolenaar 'enddef', 2773e7e4838fSBram Moolenaar ], 'E488:') 2774e7e4838fSBram Moolenaar 2775e7e4838fSBram Moolenaar CheckScriptSuccess([ 2776e7e4838fSBram Moolenaar 'func Test() " comment', 2777e7e4838fSBram Moolenaar 'endfunc', 2778e7e4838fSBram Moolenaar ]) 27799898107fSBram Moolenaar CheckScriptSuccess([ 2780e7e4838fSBram Moolenaar 'vim9script', 2781e7e4838fSBram Moolenaar 'func Test() " comment', 2782e7e4838fSBram Moolenaar 'endfunc', 27839898107fSBram Moolenaar ]) 2784e7e4838fSBram Moolenaar 2785e7e4838fSBram Moolenaar CheckScriptSuccess([ 2786e7e4838fSBram Moolenaar 'def Test() # comment', 2787e7e4838fSBram Moolenaar 'enddef', 2788e7e4838fSBram Moolenaar ]) 2789e7e4838fSBram Moolenaar CheckScriptFailure([ 2790e7e4838fSBram Moolenaar 'func Test() # comment', 2791e7e4838fSBram Moolenaar 'endfunc', 2792e7e4838fSBram Moolenaar ], 'E488:') 27932c5ed4e3SBram Moolenaarenddef 27942c5ed4e3SBram Moolenaar 27952c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 27962c5ed4e3SBram Moolenaar CheckCanRunGui 27972c5ed4e3SBram Moolenaar 27982c5ed4e3SBram Moolenaar CheckScriptFailure([ 27992c5ed4e3SBram Moolenaar 'vim9script', 28002c5ed4e3SBram Moolenaar 'gui#comment' 28012c5ed4e3SBram Moolenaar ], 'E499:') 28022c5ed4e3SBram Moolenaar CheckScriptFailure([ 28032c5ed4e3SBram Moolenaar 'vim9script', 28042c5ed4e3SBram Moolenaar 'gui -f#comment' 28052c5ed4e3SBram Moolenaar ], 'E499:') 28067a092245SBram Moolenaarenddef 28077a092245SBram Moolenaar 2808a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28096797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28106797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2811a26b9700SBram Moolenaar 2812a26b9700SBram Moolenaar edit test.vim 2813a26b9700SBram Moolenaar doautocmd TabEnter #comment 2814a26b9700SBram Moolenaar assert_equal(1, g:entered) 2815a26b9700SBram Moolenaar 2816a26b9700SBram Moolenaar doautocmd TabEnter f.x 2817a26b9700SBram Moolenaar assert_equal(2, g:entered) 2818a26b9700SBram Moolenaar 2819a26b9700SBram Moolenaar g:entered = 0 2820a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2821a26b9700SBram Moolenaar assert_equal(2, g:entered) 2822a26b9700SBram Moolenaar 2823a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2824a26b9700SBram Moolenaar 2825a26b9700SBram Moolenaar au! TabEnter 2826a26b9700SBram Moolenaar unlet g:entered 2827d72c1bf0SBram Moolenaar 2828d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2829d72c1bf0SBram Moolenaar 'vim9script', 28306797966dSBram Moolenaar 'g:var = 123', 2831e55b1c09SBram Moolenaar 'b:var = 456', 2832e55b1c09SBram Moolenaar 'w:var = 777', 2833e55b1c09SBram Moolenaar 't:var = 888', 2834d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2835d72c1bf0SBram Moolenaar ]) 2836d72c1bf0SBram Moolenaar 2837d72c1bf0SBram Moolenaar CheckScriptFailure([ 2838d72c1bf0SBram Moolenaar 'vim9script', 2839d72c1bf0SBram Moolenaar 'let g:var = 123', 2840e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2841e55b1c09SBram Moolenaar 2842e55b1c09SBram Moolenaar CheckScriptFailure([ 2843e55b1c09SBram Moolenaar 'vim9script', 2844e55b1c09SBram Moolenaar 'let b:var = 123', 2845e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2846e55b1c09SBram Moolenaar 2847e55b1c09SBram Moolenaar CheckScriptFailure([ 2848e55b1c09SBram Moolenaar 'vim9script', 2849e55b1c09SBram Moolenaar 'let w:var = 123', 2850e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2851e55b1c09SBram Moolenaar 2852e55b1c09SBram Moolenaar CheckScriptFailure([ 2853e55b1c09SBram Moolenaar 'vim9script', 2854e55b1c09SBram Moolenaar 'let t:var = 123', 2855e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2856e55b1c09SBram Moolenaar 2857e55b1c09SBram Moolenaar CheckScriptFailure([ 2858e55b1c09SBram Moolenaar 'vim9script', 2859e55b1c09SBram Moolenaar 'let v:version = 123', 2860e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2861e55b1c09SBram Moolenaar 2862e55b1c09SBram Moolenaar CheckScriptFailure([ 2863e55b1c09SBram Moolenaar 'vim9script', 2864e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2865e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28666797966dSBram Moolenaar 28676797966dSBram Moolenaar CheckScriptFailure([ 28686797966dSBram Moolenaar 'vim9script', 28696797966dSBram Moolenaar 'g:var = 123', 287032e35117SBram Moolenaar 'unlet g:var# comment1', 2871d72c1bf0SBram Moolenaar ], 'E108:') 2872d72c1bf0SBram Moolenaar 2873d72c1bf0SBram Moolenaar CheckScriptFailure([ 2874d72c1bf0SBram Moolenaar 'let g:var = 123', 2875d72c1bf0SBram Moolenaar 'unlet g:var # something', 2876d72c1bf0SBram Moolenaar ], 'E488:') 2877faac4104SBram Moolenaar 2878faac4104SBram Moolenaar CheckScriptSuccess([ 2879faac4104SBram Moolenaar 'vim9script', 288032e35117SBram Moolenaar 'if 1 # comment2', 2881faac4104SBram Moolenaar ' echo "yes"', 2882faac4104SBram Moolenaar 'elseif 2 #comment', 2883faac4104SBram Moolenaar ' echo "no"', 2884faac4104SBram Moolenaar 'endif', 2885faac4104SBram Moolenaar ]) 2886faac4104SBram Moolenaar 2887faac4104SBram Moolenaar CheckScriptFailure([ 2888faac4104SBram Moolenaar 'vim9script', 288932e35117SBram Moolenaar 'if 1# comment3', 2890faac4104SBram Moolenaar ' echo "yes"', 2891faac4104SBram Moolenaar 'endif', 2892faac4104SBram Moolenaar ], 'E15:') 2893faac4104SBram Moolenaar 2894faac4104SBram Moolenaar CheckScriptFailure([ 2895faac4104SBram Moolenaar 'vim9script', 289632e35117SBram Moolenaar 'if 0 # comment4', 2897faac4104SBram Moolenaar ' echo "yes"', 2898faac4104SBram Moolenaar 'elseif 2#comment', 2899faac4104SBram Moolenaar ' echo "no"', 2900faac4104SBram Moolenaar 'endif', 2901faac4104SBram Moolenaar ], 'E15:') 2902faac4104SBram Moolenaar 2903faac4104SBram Moolenaar CheckScriptSuccess([ 2904faac4104SBram Moolenaar 'vim9script', 290532e35117SBram Moolenaar 'let v = 1 # comment5', 2906faac4104SBram Moolenaar ]) 2907faac4104SBram Moolenaar 2908faac4104SBram Moolenaar CheckScriptFailure([ 2909faac4104SBram Moolenaar 'vim9script', 291032e35117SBram Moolenaar 'let v = 1# comment6', 291132e35117SBram Moolenaar ], 'E15:') 2912faac4104SBram Moolenaar 2913faac4104SBram Moolenaar CheckScriptSuccess([ 2914faac4104SBram Moolenaar 'vim9script', 2915faac4104SBram Moolenaar 'new' 2916faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2917df069eecSBram Moolenaar ':$', 2918faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2919faac4104SBram Moolenaar 'bwipe!', 2920faac4104SBram Moolenaar ]) 2921faac4104SBram Moolenaar 2922f5be8cdbSBram Moolenaar CheckScriptFailure([ 2923f5be8cdbSBram Moolenaar 'vim9script', 2924f5be8cdbSBram Moolenaar 'new' 2925f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2926f5be8cdbSBram Moolenaar ':$', 2927f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2928f5be8cdbSBram Moolenaar 'bwipe!', 2929f5be8cdbSBram Moolenaar ], 'E488:') 2930f5be8cdbSBram Moolenaar 2931f5be8cdbSBram Moolenaar CheckScriptFailure([ 2932f5be8cdbSBram Moolenaar 'vim9script', 2933f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2934f5be8cdbSBram Moolenaar ], 'E477:') 2935a26b9700SBram Moolenaarenddef 2936a26b9700SBram Moolenaar 29377e5bd91dSBram Moolenaardef Test_finish() 29387e5bd91dSBram Moolenaar let lines =<< trim END 29397e5bd91dSBram Moolenaar vim9script 29406797966dSBram Moolenaar g:res = 'one' 29417e5bd91dSBram Moolenaar if v:false | finish | endif 29426797966dSBram Moolenaar g:res = 'two' 29437e5bd91dSBram Moolenaar finish 29446797966dSBram Moolenaar g:res = 'three' 29457e5bd91dSBram Moolenaar END 29467e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29477e5bd91dSBram Moolenaar source Xfinished 29487e5bd91dSBram Moolenaar assert_equal('two', g:res) 29497e5bd91dSBram Moolenaar 29507e5bd91dSBram Moolenaar unlet g:res 29517e5bd91dSBram Moolenaar delete('Xfinished') 29527e5bd91dSBram Moolenaarenddef 29537e5bd91dSBram Moolenaar 295432e35117SBram Moolenaardef Test_let_func_call() 295532e35117SBram Moolenaar let lines =<< trim END 295632e35117SBram Moolenaar vim9script 295732e35117SBram Moolenaar func GetValue() 295832e35117SBram Moolenaar if exists('g:count') 295932e35117SBram Moolenaar let g:count += 1 296032e35117SBram Moolenaar else 296132e35117SBram Moolenaar let g:count = 1 296232e35117SBram Moolenaar endif 296332e35117SBram Moolenaar return 'this' 296432e35117SBram Moolenaar endfunc 296532e35117SBram Moolenaar let val: string = GetValue() 2966f5be8cdbSBram Moolenaar # env var is always a string 2967df671b46SBram Moolenaar let env = $TERM 296832e35117SBram Moolenaar END 296932e35117SBram Moolenaar writefile(lines, 'Xfinished') 297032e35117SBram Moolenaar source Xfinished 2971f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 297232e35117SBram Moolenaar assert_equal(1, g:count) 297332e35117SBram Moolenaar 297432e35117SBram Moolenaar unlet g:count 297532e35117SBram Moolenaar delete('Xfinished') 297632e35117SBram Moolenaarenddef 297732e35117SBram Moolenaar 297832e35117SBram Moolenaardef Test_let_missing_type() 297932e35117SBram Moolenaar let lines =<< trim END 298032e35117SBram Moolenaar vim9script 2981df671b46SBram Moolenaar let var = g:unknown 2982227a69deSBram Moolenaar END 2983822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2984227a69deSBram Moolenaar 2985227a69deSBram Moolenaar lines =<< trim END 2986227a69deSBram Moolenaar vim9script 2987227a69deSBram Moolenaar let nr: number = 123 2988227a69deSBram Moolenaar let var = nr 2989227a69deSBram Moolenaar END 2990822ba247SBram Moolenaar CheckScriptSuccess(lines) 299132e35117SBram Moolenaarenddef 299232e35117SBram Moolenaar 2993c82a5b5dSBram Moolenaardef Test_let_declaration() 2994c82a5b5dSBram Moolenaar let lines =<< trim END 2995c82a5b5dSBram Moolenaar vim9script 2996c82a5b5dSBram Moolenaar let var: string 2997c82a5b5dSBram Moolenaar g:var_uninit = var 2998c82a5b5dSBram Moolenaar var = 'text' 2999c82a5b5dSBram Moolenaar g:var_test = var 3000f5be8cdbSBram Moolenaar # prefixing s: is optional 3001984dddbeSBram Moolenaar s:var = 'prefixed' 3002984dddbeSBram Moolenaar g:var_prefixed = s:var 3003984dddbeSBram Moolenaar 3004984dddbeSBram Moolenaar let s:other: number 3005984dddbeSBram Moolenaar other = 1234 3006984dddbeSBram Moolenaar g:other_var = other 300753b29e48SBram Moolenaar 300853b29e48SBram Moolenaar # type is inferred 300953b29e48SBram Moolenaar s:dict = {'a': 222} 301053b29e48SBram Moolenaar def GetDictVal(key: any) 301153b29e48SBram Moolenaar g:dict_val = s:dict[key] 301253b29e48SBram Moolenaar enddef 301353b29e48SBram Moolenaar GetDictVal('a') 3014c82a5b5dSBram Moolenaar END 3015c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3016c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3017c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3018984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3019984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 302053b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3021c82a5b5dSBram Moolenaar 3022c82a5b5dSBram Moolenaar unlet g:var_uninit 3023c82a5b5dSBram Moolenaar unlet g:var_test 3024984dddbeSBram Moolenaar unlet g:var_prefixed 3025984dddbeSBram Moolenaar unlet g:other_var 3026c82a5b5dSBram Moolenaarenddef 3027c82a5b5dSBram Moolenaar 3028c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3029c5b1c20bSBram Moolenaar let lines =<< trim END 3030c5b1c20bSBram Moolenaar vim9script 3031c5b1c20bSBram Moolenaar const var: string 3032c5b1c20bSBram Moolenaar END 3033c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3034c5b1c20bSBram Moolenaar 3035c5b1c20bSBram Moolenaar lines =<< trim END 3036c5b1c20bSBram Moolenaar vim9script 3037c5b1c20bSBram Moolenaar let 9var: string 3038c5b1c20bSBram Moolenaar END 3039c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3040c5b1c20bSBram Moolenaarenddef 3041c5b1c20bSBram Moolenaar 304234db91f7SBram Moolenaardef Test_let_type_check() 304334db91f7SBram Moolenaar let lines =<< trim END 304434db91f7SBram Moolenaar vim9script 304534db91f7SBram Moolenaar let var: string 304634db91f7SBram Moolenaar var = 1234 304734db91f7SBram Moolenaar END 3048451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3049984dddbeSBram Moolenaar 3050984dddbeSBram Moolenaar lines =<< trim END 3051984dddbeSBram Moolenaar vim9script 3052984dddbeSBram Moolenaar let var:string 3053984dddbeSBram Moolenaar END 3054984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3055c5b1c20bSBram Moolenaar 3056c5b1c20bSBram Moolenaar lines =<< trim END 3057c5b1c20bSBram Moolenaar vim9script 3058c5b1c20bSBram Moolenaar let var: asdf 3059c5b1c20bSBram Moolenaar END 3060c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3061a71e2633SBram Moolenaar 3062a71e2633SBram Moolenaar lines =<< trim END 3063a71e2633SBram Moolenaar vim9script 3064a71e2633SBram Moolenaar let s:l: list<number> 3065a71e2633SBram Moolenaar s:l = [] 3066a71e2633SBram Moolenaar END 3067a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3068a71e2633SBram Moolenaar 3069a71e2633SBram Moolenaar lines =<< trim END 3070a71e2633SBram Moolenaar vim9script 3071a71e2633SBram Moolenaar let s:d: dict<number> 3072a71e2633SBram Moolenaar s:d = {} 3073a71e2633SBram Moolenaar END 3074a71e2633SBram Moolenaar CheckScriptSuccess(lines) 307534db91f7SBram Moolenaarenddef 307634db91f7SBram Moolenaar 3077a5d0077eSBram Moolenaardef Test_forward_declaration() 3078a5d0077eSBram Moolenaar let lines =<< trim END 3079a5d0077eSBram Moolenaar vim9script 3080a5d0077eSBram Moolenaar def GetValue(): string 3081a5d0077eSBram Moolenaar return theVal 3082a5d0077eSBram Moolenaar enddef 3083a5d0077eSBram Moolenaar let theVal = 'something' 3084822ba247SBram Moolenaar g:initVal = GetValue() 3085a5d0077eSBram Moolenaar theVal = 'else' 3086a5d0077eSBram Moolenaar g:laterVal = GetValue() 3087a5d0077eSBram Moolenaar END 3088a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3089a5d0077eSBram Moolenaar source Xforward 3090a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3091a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3092a5d0077eSBram Moolenaar 3093a5d0077eSBram Moolenaar unlet g:initVal 3094a5d0077eSBram Moolenaar unlet g:laterVal 3095a5d0077eSBram Moolenaar delete('Xforward') 3096a5d0077eSBram Moolenaarenddef 3097a5d0077eSBram Moolenaar 30989721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 30999721fb4eSBram Moolenaar let legacy_lines =<< trim END 31009721fb4eSBram Moolenaar source Xvim9_script.vim 31019721fb4eSBram Moolenaar 31029721fb4eSBram Moolenaar call assert_false(exists('local')) 31039721fb4eSBram Moolenaar call assert_false(exists('exported')) 31049721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31059721fb4eSBram Moolenaar call assert_equal('global', global) 31069721fb4eSBram Moolenaar call assert_equal('global', g:global) 31079721fb4eSBram Moolenaar 31089721fb4eSBram Moolenaar " imported variable becomes script-local 31099721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31109721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31119721fb4eSBram Moolenaar call assert_false(exists('exported')) 31129721fb4eSBram Moolenaar 31139721fb4eSBram Moolenaar " imported function becomes script-local 31149721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31159721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31169721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31179721fb4eSBram Moolenaar END 31189721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31199721fb4eSBram Moolenaar 31209721fb4eSBram Moolenaar let vim9_lines =<< trim END 31219721fb4eSBram Moolenaar vim9script 31229721fb4eSBram Moolenaar let local = 'local' 31239721fb4eSBram Moolenaar g:global = 'global' 31249721fb4eSBram Moolenaar export let exported = 'exported' 31259721fb4eSBram Moolenaar export def GetText(): string 31269721fb4eSBram Moolenaar return 'text' 31279721fb4eSBram Moolenaar enddef 31289721fb4eSBram Moolenaar END 31299721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31309721fb4eSBram Moolenaar 31319721fb4eSBram Moolenaar source Xlegacy_script.vim 31329721fb4eSBram Moolenaar 31339721fb4eSBram Moolenaar assert_equal('global', g:global) 3134f5be8cdbSBram Moolenaar unlet g:global 31359721fb4eSBram Moolenaar 31369721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31379721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31389721fb4eSBram Moolenaarenddef 3139a5d0077eSBram Moolenaar 31407d699701SBram Moolenaarfunc Test_vim9script_not_global() 31417d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31427d699701SBram Moolenaar let vim9lines =<< trim END 31437d699701SBram Moolenaar vim9script 31447d699701SBram Moolenaar let var = 'local' 31457d699701SBram Moolenaar func TheFunc() 31467d699701SBram Moolenaar echo 'local' 31477d699701SBram Moolenaar endfunc 31487d699701SBram Moolenaar def DefFunc() 31497d699701SBram Moolenaar echo 'local' 31507d699701SBram Moolenaar enddef 31517d699701SBram Moolenaar END 31527d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31537d699701SBram Moolenaar source Xvim9script.vim 31547d699701SBram Moolenaar try 31557d699701SBram Moolenaar echo g:var 31567d699701SBram Moolenaar assert_report('did not fail') 31577d699701SBram Moolenaar catch /E121:/ 31587d699701SBram Moolenaar " caught 31597d699701SBram Moolenaar endtry 31607d699701SBram Moolenaar try 31617d699701SBram Moolenaar call TheFunc() 31627d699701SBram Moolenaar assert_report('did not fail') 31637d699701SBram Moolenaar catch /E117:/ 31647d699701SBram Moolenaar " caught 31657d699701SBram Moolenaar endtry 31667d699701SBram Moolenaar try 31677d699701SBram Moolenaar call DefFunc() 31687d699701SBram Moolenaar assert_report('did not fail') 31697d699701SBram Moolenaar catch /E117:/ 31707d699701SBram Moolenaar " caught 31717d699701SBram Moolenaar endtry 31727d699701SBram Moolenaar 31737d699701SBram Moolenaar call delete('Xvim9script.vium') 31747d699701SBram Moolenaarendfunc 31757d699701SBram Moolenaar 3176eeb27bfeSBram Moolenaardef Test_vim9_copen() 3177eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3178eeb27bfeSBram Moolenaar copen 3179eeb27bfeSBram Moolenaar quit 3180eeb27bfeSBram Moolenaarenddef 3181eeb27bfeSBram Moolenaar 31822d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 31832d6b20d6SBram Moolenaardef Test_vim9_autoload() 31842d6b20d6SBram Moolenaar let lines =<< trim END 31852d6b20d6SBram Moolenaar vim9script 31862d6b20d6SBram Moolenaar def foo#test() 31872d6b20d6SBram Moolenaar echomsg getreg('"') 31882d6b20d6SBram Moolenaar enddef 31892d6b20d6SBram Moolenaar END 31902d6b20d6SBram Moolenaar 31912d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31922d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 31932d6b20d6SBram Moolenaar let save_rtp = &rtp 31942d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31952d6b20d6SBram Moolenaar augroup test 31962d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31972d6b20d6SBram Moolenaar augroup END 31982d6b20d6SBram Moolenaar 31992d6b20d6SBram Moolenaar normal Y 32002d6b20d6SBram Moolenaar 32012d6b20d6SBram Moolenaar augroup test 32022d6b20d6SBram Moolenaar autocmd! 32032d6b20d6SBram Moolenaar augroup END 32042d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32052d6b20d6SBram Moolenaar &rtp = save_rtp 32062d6b20d6SBram Moolenaarenddef 32072d6b20d6SBram Moolenaar 320881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 320981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 321081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 321181e17fbeSBram Moolenaar let lines =<< trim END 321281e17fbeSBram Moolenaar let s:counter = 1 321381e17fbeSBram Moolenaar def s:Func() 321481e17fbeSBram Moolenaar au! CursorHold 321581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 321681e17fbeSBram Moolenaar enddef 321781e17fbeSBram Moolenaar call s:Func() 321881e17fbeSBram Moolenaar doau CursorHold 321981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 322081e17fbeSBram Moolenaar au! CursorHold 322181e17fbeSBram Moolenaar END 322281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 322381e17fbeSBram Moolenaarenddef 322481e17fbeSBram Moolenaar 32253896a105SBram Moolenaardef Test_cmdline_win() 32263896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32273896a105SBram Moolenaar # the command line window. 32283896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32293896a105SBram Moolenaar let export_lines =<< trim END 32303896a105SBram Moolenaar vim9script 32313896a105SBram Moolenaar export let That = 'yes' 32323896a105SBram Moolenaar END 32333896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32343896a105SBram Moolenaar let import_lines =<< trim END 32353896a105SBram Moolenaar vim9script 32363896a105SBram Moolenaar import That from './Xexport.vim' 32373896a105SBram Moolenaar END 32383896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32393896a105SBram Moolenaar let save_rtp = &rtp 32403896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32413896a105SBram Moolenaar syntax on 32423896a105SBram Moolenaar augroup CmdWin 32433896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32443896a105SBram Moolenaar augroup END 32453896a105SBram Moolenaar # this will open and also close the cmdline window 32463896a105SBram Moolenaar feedkeys('q:', 'xt') 32473896a105SBram Moolenaar assert_equal('yes', g:got_there) 32483896a105SBram Moolenaar 32493896a105SBram Moolenaar augroup CmdWin 32503896a105SBram Moolenaar au! 32513896a105SBram Moolenaar augroup END 32523896a105SBram Moolenaar &rtp = save_rtp 32533896a105SBram Moolenaar delete('rtp', 'rf') 32543896a105SBram Moolenaarenddef 32553896a105SBram Moolenaar 3256*e3d4685fSBram Moolenaardef Test_invalid_sid() 3257*e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 3258*e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3259*e3d4685fSBram Moolenaar call assert_equal([], readfile('Xdidit')) 3260*e3d4685fSBram Moolenaar endif 3261*e3d4685fSBram Moolenaar delete('Xdidit') 3262*e3d4685fSBram Moolenaarenddef 3263*e3d4685fSBram Moolenaar 3264585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3265585fea7bSBram Moolenaardef Test_substitute_cmd() 3266585fea7bSBram Moolenaar new 3267585fea7bSBram Moolenaar setline(1, 'something') 3268585fea7bSBram Moolenaar :substitute(some(other( 3269585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3270585fea7bSBram Moolenaar bwipe! 3271585fea7bSBram Moolenaar 3272f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3273585fea7bSBram Moolenaar let lines =<< trim END 3274585fea7bSBram Moolenaar vim9script 3275585fea7bSBram Moolenaar new 3276585fea7bSBram Moolenaar setline(1, 'something') 3277585fea7bSBram Moolenaar :substitute(some(other( 3278585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3279585fea7bSBram Moolenaar bwipe! 3280585fea7bSBram Moolenaar END 3281585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3282585fea7bSBram Moolenaar source Xvim9lines 3283585fea7bSBram Moolenaar 3284585fea7bSBram Moolenaar delete('Xvim9lines') 3285585fea7bSBram Moolenaarenddef 3286585fea7bSBram Moolenaar 32878a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3288