18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 98a7d6542SBram Moolenaardef Test_syntax() 108a7d6542SBram Moolenaar let var = 234 118a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 128a7d6542SBram Moolenaarenddef 138a7d6542SBram Moolenaar 145d72ce69SBram Moolenaardef Test_range_only() 155d72ce69SBram Moolenaar new 165d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 175d72ce69SBram Moolenaar :/Blah/ 185d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 19c2af0affSBram Moolenaar bwipe! 20c2af0affSBram Moolenaar 21c2af0affSBram Moolenaar # without range commands use current line 22c2af0affSBram Moolenaar new 23c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 24c2af0affSBram Moolenaar :2 25c2af0affSBram Moolenaar print 26c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 27c2af0affSBram Moolenaar :3 28c2af0affSBram Moolenaar list 29c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 30c2af0affSBram Moolenaar bwipe! 315d72ce69SBram Moolenaarenddef 325d72ce69SBram Moolenaar 336e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 346e587dcbSBram Moolenaarlet s:addToMe = 111 35401d9ffbSBram Moolenaarlet g:existing = 'yes' 36a8c17704SBram Moolenaarlet g:inc_counter = 1 37a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 38a6e67e4fSBram Moolenaarlet g:alist = [7] 39a6e67e4fSBram Moolenaarlet g:astring = 'text' 40f0b9f43cSBram Moolenaarlet g:anumber = 123 416e587dcbSBram Moolenaar 428a7d6542SBram Moolenaardef Test_assignment() 438a7d6542SBram Moolenaar let bool1: bool = true 448a7d6542SBram Moolenaar assert_equal(v:true, bool1) 458a7d6542SBram Moolenaar let bool2: bool = false 468a7d6542SBram Moolenaar assert_equal(v:false, bool2) 478a7d6542SBram Moolenaar 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 1578*e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1579*e2e4075fSBram 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 165595006e3dSBram Moolenaardef s:RetSome(): string 165695006e3dSBram Moolenaar return 'some' 165795006e3dSBram Moolenaarenddef 165895006e3dSBram Moolenaar 1659fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1660fe465a01SBram Moolenaar" script-local name. 1661fe465a01SBram Moolenaardef Test_vim9script_funcref() 1662fe465a01SBram Moolenaar let sortlines =<< trim END 1663fe465a01SBram Moolenaar vim9script 1664fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1665bed36b93SBram Moolenaar return i2 - i1 1666fe465a01SBram Moolenaar enddef 1667fe465a01SBram Moolenaar 1668fe465a01SBram Moolenaar export def FastSort(): list<number> 1669fe465a01SBram Moolenaar return range(5)->sort(Compare) 1670fe465a01SBram Moolenaar enddef 1671fe465a01SBram Moolenaar END 1672fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1673fe465a01SBram Moolenaar 1674fe465a01SBram Moolenaar let lines =<< trim END 1675fe465a01SBram Moolenaar vim9script 1676fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1677fe465a01SBram Moolenaar def Test() 1678fe465a01SBram Moolenaar g:result = FastSort() 1679fe465a01SBram Moolenaar enddef 1680fe465a01SBram Moolenaar Test() 1681fe465a01SBram Moolenaar END 1682fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1683fe465a01SBram Moolenaar 1684fe465a01SBram Moolenaar source Xscript.vim 1685fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1686fe465a01SBram Moolenaar 1687fe465a01SBram Moolenaar unlet g:result 1688fe465a01SBram Moolenaar delete('Xsort.vim') 1689fe465a01SBram Moolenaar delete('Xscript.vim') 169095006e3dSBram Moolenaar 169195006e3dSBram Moolenaar let Funcref = function('s:RetSome') 169295006e3dSBram Moolenaar assert_equal('some', Funcref()) 1693fe465a01SBram Moolenaarenddef 1694fe465a01SBram Moolenaar 1695601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1696601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1697601e76acSBram Moolenaar" function reference. 1698c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1699c620c055SBram Moolenaar let filterLines =<< trim END 1700c620c055SBram Moolenaar vim9script 1701c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1702c620c055SBram Moolenaar return idx % 2 == 1 1703c620c055SBram Moolenaar enddef 1704c620c055SBram Moolenaar export def FastFilter(): list<number> 1705c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1706c620c055SBram Moolenaar enddef 1707601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1708601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1709601e76acSBram Moolenaar enddef 1710c620c055SBram Moolenaar END 1711c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1712c620c055SBram Moolenaar 1713c620c055SBram Moolenaar let lines =<< trim END 1714c620c055SBram Moolenaar vim9script 1715601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1716c620c055SBram Moolenaar def Test() 1717c620c055SBram Moolenaar let x: list<number> = FastFilter() 1718c620c055SBram Moolenaar enddef 1719c620c055SBram Moolenaar Test() 1720601e76acSBram Moolenaar def TestDirect() 1721601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1722601e76acSBram Moolenaar enddef 1723601e76acSBram Moolenaar TestDirect() 1724c620c055SBram Moolenaar END 1725601e76acSBram Moolenaar CheckScriptSuccess(lines) 1726c620c055SBram Moolenaar delete('Xfilter.vim') 1727c620c055SBram Moolenaarenddef 1728c620c055SBram Moolenaar 17294c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17304c17ad94SBram Moolenaar let first_lines =<< trim END 17314c17ad94SBram Moolenaar vim9script 17324c17ad94SBram Moolenaar def FuncYes(): string 17334c17ad94SBram Moolenaar return 'yes' 17344c17ad94SBram Moolenaar enddef 17354c17ad94SBram Moolenaar END 173603afdcf1SBram Moolenaar let withno_lines =<< trim END 17374c17ad94SBram Moolenaar def FuncNo(): string 17384c17ad94SBram Moolenaar return 'no' 17394c17ad94SBram Moolenaar enddef 17404c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17414c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17424c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 174303afdcf1SBram Moolenaar enddef 174403afdcf1SBram Moolenaar END 174503afdcf1SBram Moolenaar let nono_lines =<< trim END 174603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 174703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 17484c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 17494c17ad94SBram Moolenaar enddef 17504c17ad94SBram Moolenaar END 17514c17ad94SBram Moolenaar 17524c17ad94SBram Moolenaar # FuncNo() is defined 175303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17544c17ad94SBram Moolenaar source Xreloaded.vim 17554c17ad94SBram Moolenaar g:DoCheck(true) 17564c17ad94SBram Moolenaar 17574c17ad94SBram Moolenaar # FuncNo() is not redefined 175803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17594c17ad94SBram Moolenaar source Xreloaded.vim 176003afdcf1SBram Moolenaar g:DoCheck() 17614c17ad94SBram Moolenaar 17624c17ad94SBram Moolenaar # FuncNo() is back 176303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17644c17ad94SBram Moolenaar source Xreloaded.vim 176503afdcf1SBram Moolenaar g:DoCheck() 17664c17ad94SBram Moolenaar 17674c17ad94SBram Moolenaar delete('Xreloaded.vim') 17684c17ad94SBram Moolenaarenddef 17694c17ad94SBram Moolenaar 177089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 177189483d40SBram Moolenaar # write the script with a script-local variable 177289483d40SBram Moolenaar let lines =<< trim END 177389483d40SBram Moolenaar vim9script 177489483d40SBram Moolenaar let var = 'string' 177589483d40SBram Moolenaar END 177689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 177789483d40SBram Moolenaar source XreloadVar.vim 177889483d40SBram Moolenaar 177989483d40SBram Moolenaar # now write the script using the same variable locally - works 178089483d40SBram Moolenaar lines =<< trim END 178189483d40SBram Moolenaar vim9script 178289483d40SBram Moolenaar def Func() 178389483d40SBram Moolenaar let var = 'string' 178489483d40SBram Moolenaar enddef 178589483d40SBram Moolenaar END 178689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 178789483d40SBram Moolenaar source XreloadVar.vim 178889483d40SBram Moolenaar 178989483d40SBram Moolenaar delete('XreloadVar.vim') 179089483d40SBram Moolenaarenddef 179189483d40SBram Moolenaar 17928a7d6542SBram Moolenaardef Test_import_absolute() 17938a7d6542SBram Moolenaar let import_lines = [ 1794e6085c53SBram Moolenaar 'vim9script', 1795e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1796e6085c53SBram Moolenaar 'def UseExported()', 1797e6085c53SBram Moolenaar ' g:imported_abs = exported', 1798e6085c53SBram Moolenaar ' exported = 8888', 1799e6085c53SBram Moolenaar ' g:imported_after = exported', 1800e6085c53SBram Moolenaar 'enddef', 1801e6085c53SBram Moolenaar 'UseExported()', 1802e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1803e6085c53SBram Moolenaar ] 18048a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18058a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18068a7d6542SBram Moolenaar 18078a7d6542SBram Moolenaar source Ximport_abs.vim 18088a7d6542SBram Moolenaar 18098a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18104e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1811675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1812675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1813675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1814675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1815675f716eSBram Moolenaar 'exported = 8888.*' .. 1816675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1817675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1818675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1819675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1820e6085c53SBram Moolenaar g:import_disassembled) 1821b3ca9824SBram Moolenaar 1822b3ca9824SBram Moolenaar Undo_export_script_lines() 18238a7d6542SBram Moolenaar unlet g:imported_abs 18244e12a5dfSBram Moolenaar unlet g:import_disassembled 18258a7d6542SBram Moolenaar 18268a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18278a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18288a7d6542SBram Moolenaarenddef 18298a7d6542SBram Moolenaar 18308a7d6542SBram Moolenaardef Test_import_rtp() 18318a7d6542SBram Moolenaar let import_lines = [ 1832e6085c53SBram Moolenaar 'vim9script', 1833e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1834e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1835e6085c53SBram Moolenaar ] 18368a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18378a7d6542SBram Moolenaar mkdir('import') 18388a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18398a7d6542SBram Moolenaar 18408a7d6542SBram Moolenaar let save_rtp = &rtp 18418a7d6542SBram Moolenaar &rtp = getcwd() 18428a7d6542SBram Moolenaar source Ximport_rtp.vim 18438a7d6542SBram Moolenaar &rtp = save_rtp 18448a7d6542SBram Moolenaar 18458a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18468a7d6542SBram Moolenaar 1847b3ca9824SBram Moolenaar Undo_export_script_lines() 1848b3ca9824SBram Moolenaar unlet g:imported_rtp 18498a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 185089483d40SBram Moolenaar delete('import', 'rf') 18518a7d6542SBram Moolenaarenddef 18528a7d6542SBram Moolenaar 185325e0f586SBram Moolenaardef Test_import_compile_error() 185425e0f586SBram Moolenaar let export_lines = [ 185525e0f586SBram Moolenaar 'vim9script', 185625e0f586SBram Moolenaar 'export def ExpFunc(): string', 185725e0f586SBram Moolenaar ' return notDefined', 185825e0f586SBram Moolenaar 'enddef', 185925e0f586SBram Moolenaar ] 186025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 186125e0f586SBram Moolenaar 186225e0f586SBram Moolenaar let import_lines = [ 186325e0f586SBram Moolenaar 'vim9script', 186425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 186525e0f586SBram Moolenaar 'def ImpFunc()', 186625e0f586SBram Moolenaar ' echo ExpFunc()', 186725e0f586SBram Moolenaar 'enddef', 186825e0f586SBram Moolenaar 'defcompile', 186925e0f586SBram Moolenaar ] 187025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 187125e0f586SBram Moolenaar 187225e0f586SBram Moolenaar try 187325e0f586SBram Moolenaar source Ximport.vim 187425e0f586SBram Moolenaar catch /E1001/ 1875f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 187625e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 187725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 187825e0f586SBram Moolenaar endtry 187925e0f586SBram Moolenaar 188025e0f586SBram Moolenaar delete('Xexported.vim') 188125e0f586SBram Moolenaar delete('Ximport.vim') 188225e0f586SBram Moolenaarenddef 188325e0f586SBram Moolenaar 1884c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1885c4ce36d4SBram Moolenaar let lines = [ 1886c4ce36d4SBram Moolenaar 'vim9script', 1887c4ce36d4SBram Moolenaar 'def Func()', 1888c4ce36d4SBram Moolenaar ' eval [][0]', 1889c4ce36d4SBram Moolenaar 'enddef', 1890c4ce36d4SBram Moolenaar 'Func()', 1891c4ce36d4SBram Moolenaar ] 1892c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1893c4ce36d4SBram Moolenaar 1894c4ce36d4SBram Moolenaar for count in range(3) 1895c4ce36d4SBram Moolenaar try 1896c4ce36d4SBram Moolenaar source Xtestscript.vim 1897c4ce36d4SBram Moolenaar catch /E684/ 1898c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1899c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1900c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1901c4ce36d4SBram Moolenaar endtry 1902c4ce36d4SBram Moolenaar endfor 1903c4ce36d4SBram Moolenaar 1904c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1905c4ce36d4SBram Moolenaarenddef 1906c4ce36d4SBram Moolenaar 1907eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1908eef2102eSBram Moolenaar let export_lines =<< trim END 1909eef2102eSBram Moolenaar vim9script 1910eef2102eSBram Moolenaar export def Func() 1911eef2102eSBram Moolenaar echo 'imported' 1912eef2102eSBram Moolenaar enddef 1913eef2102eSBram Moolenaar END 1914eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1915eef2102eSBram Moolenaar 1916eef2102eSBram Moolenaar let lines =<< trim END 1917eef2102eSBram Moolenaar vim9script 1918eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1919eef2102eSBram Moolenaar def Func() 1920eef2102eSBram Moolenaar echo 'local to function' 1921eef2102eSBram Moolenaar enddef 1922eef2102eSBram Moolenaar END 1923eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1924eef2102eSBram Moolenaar 1925eef2102eSBram Moolenaar lines =<< trim END 1926eef2102eSBram Moolenaar vim9script 1927eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1928eef2102eSBram Moolenaar def Outer() 1929eef2102eSBram Moolenaar def Func() 1930eef2102eSBram Moolenaar echo 'local to function' 1931eef2102eSBram Moolenaar enddef 1932eef2102eSBram Moolenaar enddef 1933eef2102eSBram Moolenaar defcompile 1934eef2102eSBram Moolenaar END 1935eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1936eef2102eSBram Moolenaar 1937eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1938eef2102eSBram Moolenaarenddef 1939eef2102eSBram Moolenaar 1940b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1941b9a2cac3SBram Moolenaar let lines =<< trim END 1942b9a2cac3SBram Moolenaar vim9script 1943b9a2cac3SBram Moolenaar def Func() 1944b9a2cac3SBram Moolenaar echo 'one' 1945b9a2cac3SBram Moolenaar enddef 1946b9a2cac3SBram Moolenaar def Func() 1947b9a2cac3SBram Moolenaar echo 'two' 1948b9a2cac3SBram Moolenaar enddef 1949b9a2cac3SBram Moolenaar END 1950b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1951fa211f3cSBram Moolenaar 1952fa211f3cSBram Moolenaar lines =<< trim END 1953fa211f3cSBram Moolenaar vim9script 1954fa211f3cSBram Moolenaar def Foo(): string 1955fa211f3cSBram Moolenaar return 'foo' 1956fa211f3cSBram Moolenaar enddef 1957fa211f3cSBram Moolenaar def Func() 1958fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1959fa211f3cSBram Moolenaar enddef 1960fa211f3cSBram Moolenaar defcompile 1961fa211f3cSBram Moolenaar END 1962fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1963b9a2cac3SBram Moolenaarenddef 1964b9a2cac3SBram Moolenaar 19658a7d6542SBram Moolenaardef Test_fixed_size_list() 1966f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 19678a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 19688a7d6542SBram Moolenaar l->remove(0) 19698a7d6542SBram Moolenaar l->add(5) 19708a7d6542SBram Moolenaar l->insert(99, 1) 19710f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19728a7d6542SBram Moolenaarenddef 19738a7d6542SBram Moolenaar 1974ae616494SBram Moolenaardef Test_no_insert_xit() 1975ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1976ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1977f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1978f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1979f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1980ae616494SBram Moolenaar 1981ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1982ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1983ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1984ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1985f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1986f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1987f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1988f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1989f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1990ae616494SBram Moolenaarenddef 1991ae616494SBram Moolenaar 1992158906cfSBram Moolenaardef IfElse(what: number): string 1993158906cfSBram Moolenaar let res = '' 1994158906cfSBram Moolenaar if what == 1 1995158906cfSBram Moolenaar res = "one" 1996158906cfSBram Moolenaar elseif what == 2 1997158906cfSBram Moolenaar res = "two" 1998a259d8d3SBram Moolenaar else 1999158906cfSBram Moolenaar res = "three" 2000a259d8d3SBram Moolenaar endif 2001158906cfSBram Moolenaar return res 2002a259d8d3SBram Moolenaarenddef 2003a259d8d3SBram Moolenaar 2004158906cfSBram Moolenaardef Test_if_elseif_else() 2005158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2006158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2007158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20080f18b6d1SBram Moolenaarenddef 20090f18b6d1SBram Moolenaar 2010e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2011e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 2012e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 2013e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 2014e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2015585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 2016e8c4abbbSBram Moolenaarenddef 2017e8c4abbbSBram Moolenaar 20186d69bf60SBram Moolenaarlet g:bool_true = v:true 20196d69bf60SBram Moolenaarlet g:bool_false = v:false 20206d69bf60SBram Moolenaar 20216d69bf60SBram Moolenaardef Test_if_const_expr() 20226d69bf60SBram Moolenaar let res = false 20236d69bf60SBram Moolenaar if true ? true : false 20246d69bf60SBram Moolenaar res = true 20256d69bf60SBram Moolenaar endif 20266d69bf60SBram Moolenaar assert_equal(true, res) 20276d69bf60SBram Moolenaar 2028585fea7bSBram Moolenaar g:glob = 2 2029585fea7bSBram Moolenaar if false 20306797966dSBram Moolenaar execute('g:glob = 3') 2031585fea7bSBram Moolenaar endif 2032585fea7bSBram Moolenaar assert_equal(2, g:glob) 2033585fea7bSBram Moolenaar if true 20346797966dSBram Moolenaar execute('g:glob = 3') 2035585fea7bSBram Moolenaar endif 2036585fea7bSBram Moolenaar assert_equal(3, g:glob) 2037585fea7bSBram Moolenaar 20386d69bf60SBram Moolenaar res = false 20396d69bf60SBram Moolenaar if g:bool_true ? true : false 20406d69bf60SBram Moolenaar res = true 20416d69bf60SBram Moolenaar endif 20426d69bf60SBram Moolenaar assert_equal(true, res) 20436d69bf60SBram Moolenaar 20446d69bf60SBram Moolenaar res = false 20456d69bf60SBram Moolenaar if true ? g:bool_true : false 20466d69bf60SBram Moolenaar res = true 20476d69bf60SBram Moolenaar endif 20486d69bf60SBram Moolenaar assert_equal(true, res) 20496d69bf60SBram Moolenaar 20506d69bf60SBram Moolenaar res = false 20516d69bf60SBram Moolenaar if true ? true : g:bool_false 20526d69bf60SBram Moolenaar res = true 20536d69bf60SBram Moolenaar endif 20546d69bf60SBram Moolenaar assert_equal(true, res) 20556d69bf60SBram Moolenaar 20566d69bf60SBram Moolenaar res = false 20576d69bf60SBram Moolenaar if true ? false : true 20586d69bf60SBram Moolenaar res = true 20596d69bf60SBram Moolenaar endif 20606d69bf60SBram Moolenaar assert_equal(false, res) 20616d69bf60SBram Moolenaar 20626d69bf60SBram Moolenaar res = false 20636d69bf60SBram Moolenaar if false ? false : true 20646d69bf60SBram Moolenaar res = true 20656d69bf60SBram Moolenaar endif 20666d69bf60SBram Moolenaar assert_equal(true, res) 20676d69bf60SBram Moolenaar 20686d69bf60SBram Moolenaar res = false 20696d69bf60SBram Moolenaar if false ? true : false 20706d69bf60SBram Moolenaar res = true 20716d69bf60SBram Moolenaar endif 20726d69bf60SBram Moolenaar assert_equal(false, res) 20736d69bf60SBram Moolenaar 20746d69bf60SBram Moolenaar res = false 2075e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2076e8c4abbbSBram Moolenaar res = true 2077e8c4abbbSBram Moolenaar endif 2078e8c4abbbSBram Moolenaar assert_equal(false, res) 2079e8c4abbbSBram Moolenaar 2080e8c4abbbSBram Moolenaar res = false 20816d69bf60SBram Moolenaar if true && true 20826d69bf60SBram Moolenaar res = true 20836d69bf60SBram Moolenaar endif 20846d69bf60SBram Moolenaar assert_equal(true, res) 20856d69bf60SBram Moolenaar 20866d69bf60SBram Moolenaar res = false 20876d69bf60SBram Moolenaar if true && false 20886d69bf60SBram Moolenaar res = true 20896d69bf60SBram Moolenaar endif 20906d69bf60SBram Moolenaar assert_equal(false, res) 20916d69bf60SBram Moolenaar 20926d69bf60SBram Moolenaar res = false 20936d69bf60SBram Moolenaar if g:bool_true && false 20946d69bf60SBram Moolenaar res = true 20956d69bf60SBram Moolenaar endif 20966d69bf60SBram Moolenaar assert_equal(false, res) 20976d69bf60SBram Moolenaar 20986d69bf60SBram Moolenaar res = false 20996d69bf60SBram Moolenaar if true && g:bool_false 21006d69bf60SBram Moolenaar res = true 21016d69bf60SBram Moolenaar endif 21026d69bf60SBram Moolenaar assert_equal(false, res) 21036d69bf60SBram Moolenaar 21046d69bf60SBram Moolenaar res = false 21056d69bf60SBram Moolenaar if false && false 21066d69bf60SBram Moolenaar res = true 21076d69bf60SBram Moolenaar endif 21086d69bf60SBram Moolenaar assert_equal(false, res) 21096d69bf60SBram Moolenaar 21106d69bf60SBram Moolenaar res = false 21116d69bf60SBram Moolenaar if true || false 21126d69bf60SBram Moolenaar res = true 21136d69bf60SBram Moolenaar endif 21146d69bf60SBram Moolenaar assert_equal(true, res) 21156d69bf60SBram Moolenaar 21166d69bf60SBram Moolenaar res = false 21176d69bf60SBram Moolenaar if g:bool_true || false 21186d69bf60SBram Moolenaar res = true 21196d69bf60SBram Moolenaar endif 21206d69bf60SBram Moolenaar assert_equal(true, res) 21216d69bf60SBram Moolenaar 21226d69bf60SBram Moolenaar res = false 21236d69bf60SBram Moolenaar if true || g:bool_false 21246d69bf60SBram Moolenaar res = true 21256d69bf60SBram Moolenaar endif 21266d69bf60SBram Moolenaar assert_equal(true, res) 21276d69bf60SBram Moolenaar 21286d69bf60SBram Moolenaar res = false 21296d69bf60SBram Moolenaar if false || false 21306d69bf60SBram Moolenaar res = true 21316d69bf60SBram Moolenaar endif 21326d69bf60SBram Moolenaar assert_equal(false, res) 21333988f64fSBram Moolenaar 21343988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21353988f64fSBram Moolenaar if false | eval 0 | endif 21363988f64fSBram Moolenaar if false | eval burp + 234 | endif 21373988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21383988f64fSBram Moolenaar if false 21393988f64fSBram Moolenaar burp 21403988f64fSBram Moolenaar endif 214180c34ca3SBram Moolenaarenddef 21426d69bf60SBram Moolenaar 214380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 214480c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 214580c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2146e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 2147e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21486d69bf60SBram Moolenaarenddef 21496d69bf60SBram Moolenaar 215072abcf42SBram Moolenaardef RunNested(i: number): number 215172abcf42SBram Moolenaar let x: number = 0 215272abcf42SBram Moolenaar if i % 2 215372abcf42SBram Moolenaar if 1 2154f5be8cdbSBram Moolenaar # comment 215572abcf42SBram Moolenaar else 2156f5be8cdbSBram Moolenaar # comment 215772abcf42SBram Moolenaar endif 215872abcf42SBram Moolenaar x += 1 215972abcf42SBram Moolenaar else 216072abcf42SBram Moolenaar x += 1000 216172abcf42SBram Moolenaar endif 216272abcf42SBram Moolenaar return x 216372abcf42SBram Moolenaarenddef 216472abcf42SBram Moolenaar 216572abcf42SBram Moolenaardef Test_nested_if() 216672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 216772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 216872abcf42SBram Moolenaarenddef 216972abcf42SBram Moolenaar 2170ad39c094SBram Moolenaardef Test_execute_cmd() 2171ad39c094SBram Moolenaar new 2172ad39c094SBram Moolenaar setline(1, 'default') 2173ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 2174ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2175a72cfb80SBram Moolenaar 2176a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 2177a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2178a72cfb80SBram Moolenaar 2179ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 2180ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2181a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2182ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2183a72cfb80SBram Moolenaar 2184ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 2185ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2186a72cfb80SBram Moolenaar 2187ad39c094SBram Moolenaar let cmd_first = 'call ' 2188ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2189ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2190ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2191ad39c094SBram Moolenaar bwipe! 2192585fea7bSBram Moolenaar 21932d6b20d6SBram Moolenaar let n = true 21942d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 21952d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 21962d6b20d6SBram Moolenaar 2197e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2198e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2199e5abf7afSBram Moolenaar 2200430deb19SBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:', 1) 2201430deb19SBram Moolenaar call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2202430deb19SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2203ad39c094SBram Moolenaarenddef 2204ad39c094SBram Moolenaar 220547e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2206f5be8cdbSBram Moolenaar # only checks line continuation 220747e880d6SBram Moolenaar let lines =<< trim END 220847e880d6SBram Moolenaar vim9script 220947e880d6SBram Moolenaar execute 'g:someVar' 221047e880d6SBram Moolenaar .. ' = ' .. 221147e880d6SBram Moolenaar '28' 221247e880d6SBram Moolenaar assert_equal(28, g:someVar) 221347e880d6SBram Moolenaar unlet g:someVar 221447e880d6SBram Moolenaar END 221547e880d6SBram Moolenaar CheckScriptSuccess(lines) 221647e880d6SBram Moolenaarenddef 221747e880d6SBram Moolenaar 2218ad39c094SBram Moolenaardef Test_echo_cmd() 2219a72cfb80SBram Moolenaar echo 'some' # comment 2220585fea7bSBram Moolenaar echon 'thing' 2221ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2222ad39c094SBram Moolenaar 2223a72cfb80SBram Moolenaar echo "some" # comment 2224a72cfb80SBram Moolenaar echon "thing" 2225a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2226a72cfb80SBram Moolenaar 2227ad39c094SBram Moolenaar let str1 = 'some' 2228ad39c094SBram Moolenaar let str2 = 'more' 2229ad39c094SBram Moolenaar echo str1 str2 2230ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2231a72cfb80SBram Moolenaar 2232a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2233ad39c094SBram Moolenaarenddef 2234ad39c094SBram Moolenaar 2235f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2236f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2237f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2238f93c7feaSBram Moolenaar echo 'clear' 2239df069eecSBram Moolenaar :1messages 2240f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2241f93c7feaSBram Moolenaar 2242f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2243f93c7feaSBram Moolenaarenddef 2244f93c7feaSBram Moolenaar 224547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2246f5be8cdbSBram Moolenaar # only checks line continuation 224747e880d6SBram Moolenaar let lines =<< trim END 224847e880d6SBram Moolenaar vim9script 224947e880d6SBram Moolenaar echomsg 'here' 225047e880d6SBram Moolenaar .. ' is ' .. 225147e880d6SBram Moolenaar 'a message' 225247e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 225347e880d6SBram Moolenaar END 225447e880d6SBram Moolenaar CheckScriptSuccess(lines) 225547e880d6SBram Moolenaarenddef 225647e880d6SBram Moolenaar 2257f93c7feaSBram Moolenaardef Test_echoerr_cmd() 225840ee466cSBram Moolenaar try 225940ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 226040ee466cSBram Moolenaar catch 226140ee466cSBram Moolenaar assert_match('something wrong', v:exception) 226240ee466cSBram Moolenaar endtry 2263f93c7feaSBram Moolenaarenddef 2264f93c7feaSBram Moolenaar 226547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2266f5be8cdbSBram Moolenaar # only checks line continuation 226747e880d6SBram Moolenaar let lines =<< trim END 226847e880d6SBram Moolenaar vim9script 226947e880d6SBram Moolenaar try 227047e880d6SBram Moolenaar echoerr 'this' 227147e880d6SBram Moolenaar .. ' is ' .. 227247e880d6SBram Moolenaar 'wrong' 227347e880d6SBram Moolenaar catch 227447e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 227547e880d6SBram Moolenaar endtry 227647e880d6SBram Moolenaar END 227747e880d6SBram Moolenaar CheckScriptSuccess(lines) 227847e880d6SBram Moolenaarenddef 227947e880d6SBram Moolenaar 228041fe0617SBram Moolenaardef Test_for_outside_of_function() 228141fe0617SBram Moolenaar let lines =<< trim END 228241fe0617SBram Moolenaar vim9script 228341fe0617SBram Moolenaar new 228441fe0617SBram Moolenaar for var in range(0, 3) 228541fe0617SBram Moolenaar append(line('$'), var) 228641fe0617SBram Moolenaar endfor 228741fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 228841fe0617SBram Moolenaar bwipe! 228941fe0617SBram Moolenaar END 229041fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 229141fe0617SBram Moolenaar source Xvim9for.vim 229241fe0617SBram Moolenaar delete('Xvim9for.vim') 229341fe0617SBram Moolenaarenddef 22948a7d6542SBram Moolenaar 2295e8c4abbbSBram Moolenaardef Test_for_loop() 2296e8c4abbbSBram Moolenaar let result = '' 2297e8c4abbbSBram Moolenaar for cnt in range(7) 2298e8c4abbbSBram Moolenaar if cnt == 4 2299e8c4abbbSBram Moolenaar break 2300e8c4abbbSBram Moolenaar endif 2301e8c4abbbSBram Moolenaar if cnt == 2 2302e8c4abbbSBram Moolenaar continue 2303e8c4abbbSBram Moolenaar endif 2304e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2305e8c4abbbSBram Moolenaar endfor 2306e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23070ad3e894SBram Moolenaar 23080ad3e894SBram Moolenaar let concat = '' 23090ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23100ad3e894SBram Moolenaar concat ..= str 23110ad3e894SBram Moolenaar endfor 23120ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2313e8c4abbbSBram Moolenaarenddef 2314e8c4abbbSBram Moolenaar 2315e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2316675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2317675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2318451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2319822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2320451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2321675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2322675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2323675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2324e8c4abbbSBram Moolenaarenddef 2325e8c4abbbSBram Moolenaar 2326d0df1aacSBram Moolenaardef Test_while_loop() 2327d0df1aacSBram Moolenaar let result = '' 2328d0df1aacSBram Moolenaar let cnt = 0 2329d0df1aacSBram Moolenaar while cnt < 555 2330d0df1aacSBram Moolenaar if cnt == 3 2331d0df1aacSBram Moolenaar break 2332d0df1aacSBram Moolenaar endif 2333d0df1aacSBram Moolenaar cnt += 1 2334d0df1aacSBram Moolenaar if cnt == 2 2335d0df1aacSBram Moolenaar continue 2336d0df1aacSBram Moolenaar endif 2337d0df1aacSBram Moolenaar result ..= cnt .. '_' 2338d0df1aacSBram Moolenaar endwhile 2339d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2340d0df1aacSBram Moolenaarenddef 2341d0df1aacSBram Moolenaar 2342e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2343675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2344675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2345675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2346675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2347675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2348675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2349675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2350bd5da371SBram Moolenaarenddef 2351bd5da371SBram Moolenaar 23529645e2d9SBram Moolenaardef Test_interrupt_loop() 235397acfc78SBram Moolenaar let caught = false 23549645e2d9SBram Moolenaar let x = 0 235597acfc78SBram Moolenaar try 23569645e2d9SBram Moolenaar while 1 23579645e2d9SBram Moolenaar x += 1 23589645e2d9SBram Moolenaar if x == 100 23599645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23609645e2d9SBram Moolenaar endif 23619645e2d9SBram Moolenaar endwhile 236297acfc78SBram Moolenaar catch 236397acfc78SBram Moolenaar caught = true 236497acfc78SBram Moolenaar assert_equal(100, x) 236597acfc78SBram Moolenaar endtry 236697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 236725859dd7SBram Moolenaar # consume the CTRL-C 236825859dd7SBram Moolenaar getchar(0) 23699645e2d9SBram Moolenaarenddef 237020431c9dSBram Moolenaar 23714fdae999SBram Moolenaardef Test_automatic_line_continuation() 23724fdae999SBram Moolenaar let mylist = [ 23734fdae999SBram Moolenaar 'one', 23744fdae999SBram Moolenaar 'two', 23754fdae999SBram Moolenaar 'three', 2376f5be8cdbSBram Moolenaar ] # comment 23774fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23784fdae999SBram Moolenaar 23794fdae999SBram Moolenaar let mydict = { 23804fdae999SBram Moolenaar 'one': 1, 23814fdae999SBram Moolenaar 'two': 2, 23824fdae999SBram Moolenaar 'three': 23834fdae999SBram Moolenaar 3, 2384f5be8cdbSBram Moolenaar } # comment 23854fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 23864fdae999SBram Moolenaar mydict = #{ 23872c330432SBram Moolenaar one: 1, # comment 23882c330432SBram Moolenaar two: # comment 23892c330432SBram Moolenaar 2, # comment 23902c330432SBram Moolenaar three: 3 # comment 23912c330432SBram Moolenaar } 23922c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 23932c330432SBram Moolenaar mydict = #{ 23942c330432SBram Moolenaar one: 1, 23954fdae999SBram Moolenaar two: 23964fdae999SBram Moolenaar 2, 23972c330432SBram Moolenaar three: 3 23984fdae999SBram Moolenaar } 23994fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2400e6085c53SBram Moolenaar 2401e6085c53SBram Moolenaar assert_equal( 2402e6085c53SBram Moolenaar ['one', 'two', 'three'], 2403e6085c53SBram Moolenaar split('one two three') 2404e6085c53SBram Moolenaar ) 24054fdae999SBram Moolenaarenddef 24064fdae999SBram Moolenaar 24077a092245SBram Moolenaardef Test_vim9_comment() 24087a092245SBram Moolenaar CheckScriptSuccess([ 24097a092245SBram Moolenaar 'vim9script', 24107a092245SBram Moolenaar '# something', 24117a092245SBram Moolenaar ]) 24127a092245SBram Moolenaar CheckScriptFailure([ 24137a092245SBram Moolenaar 'vim9script', 24147a092245SBram Moolenaar ':# something', 24157a092245SBram Moolenaar ], 'E488:') 24167a092245SBram Moolenaar CheckScriptFailure([ 24177a092245SBram Moolenaar '# something', 24187a092245SBram Moolenaar ], 'E488:') 24197a092245SBram Moolenaar CheckScriptFailure([ 24207a092245SBram Moolenaar ':# something', 24217a092245SBram Moolenaar ], 'E488:') 24227a092245SBram Moolenaar 24234a8d9f2eSBram Moolenaar { # block start 24244a8d9f2eSBram Moolenaar } # block end 24254a8d9f2eSBram Moolenaar CheckDefFailure([ 24264a8d9f2eSBram Moolenaar '{# comment', 24274a8d9f2eSBram Moolenaar ], 'E488:') 24284a8d9f2eSBram Moolenaar CheckDefFailure([ 24294a8d9f2eSBram Moolenaar '{', 24304a8d9f2eSBram Moolenaar '}# comment', 24314a8d9f2eSBram Moolenaar ], 'E488:') 24324a8d9f2eSBram Moolenaar 24334a8d9f2eSBram Moolenaar echo "yes" # comment 24344a8d9f2eSBram Moolenaar CheckDefFailure([ 24354a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24364a8d9f2eSBram Moolenaar ], 'E488:') 24377a092245SBram Moolenaar CheckScriptSuccess([ 24387a092245SBram Moolenaar 'vim9script', 24397a092245SBram Moolenaar 'echo "yes" # something', 24407a092245SBram Moolenaar ]) 24417a092245SBram Moolenaar CheckScriptFailure([ 24427a092245SBram Moolenaar 'vim9script', 24437a092245SBram Moolenaar 'echo "yes"# something', 24447a092245SBram Moolenaar ], 'E121:') 24457a092245SBram Moolenaar CheckScriptFailure([ 24467a092245SBram Moolenaar 'vim9script', 24477a092245SBram Moolenaar 'echo# something', 24487a092245SBram Moolenaar ], 'E121:') 24497a092245SBram Moolenaar CheckScriptFailure([ 24507a092245SBram Moolenaar 'echo "yes" # something', 24517a092245SBram Moolenaar ], 'E121:') 24527a092245SBram Moolenaar 24534a8d9f2eSBram Moolenaar exe "echo" # comment 24544a8d9f2eSBram Moolenaar CheckDefFailure([ 24554a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24564a8d9f2eSBram Moolenaar ], 'E488:') 24574a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24584a8d9f2eSBram Moolenaar 'vim9script', 24594a8d9f2eSBram Moolenaar 'exe "echo" # something', 24604a8d9f2eSBram Moolenaar ]) 24614a8d9f2eSBram Moolenaar CheckScriptFailure([ 24624a8d9f2eSBram Moolenaar 'vim9script', 24634a8d9f2eSBram Moolenaar 'exe "echo"# something', 24644a8d9f2eSBram Moolenaar ], 'E121:') 24654a8d9f2eSBram Moolenaar CheckDefFailure([ 24664a8d9f2eSBram Moolenaar 'exe # comment', 24674a8d9f2eSBram Moolenaar ], 'E1015:') 24684a8d9f2eSBram Moolenaar CheckScriptFailure([ 24694a8d9f2eSBram Moolenaar 'vim9script', 24704a8d9f2eSBram Moolenaar 'exe# something', 24714a8d9f2eSBram Moolenaar ], 'E121:') 24724a8d9f2eSBram Moolenaar CheckScriptFailure([ 24734a8d9f2eSBram Moolenaar 'exe "echo" # something', 24744a8d9f2eSBram Moolenaar ], 'E121:') 24754a8d9f2eSBram Moolenaar 24767a092245SBram Moolenaar CheckDefFailure([ 24777a092245SBram Moolenaar 'try# comment', 24787a092245SBram Moolenaar ' echo "yes"', 24797a092245SBram Moolenaar 'catch', 24807a092245SBram Moolenaar 'endtry', 24817a092245SBram Moolenaar ], 'E488:') 24822c5ed4e3SBram Moolenaar CheckScriptFailure([ 24832c5ed4e3SBram Moolenaar 'vim9script', 24842c5ed4e3SBram Moolenaar 'try# comment', 24852c5ed4e3SBram Moolenaar 'echo "yes"', 24862c5ed4e3SBram Moolenaar ], 'E488:') 24877a092245SBram Moolenaar CheckDefFailure([ 24887a092245SBram Moolenaar 'try', 2489a72cfb80SBram Moolenaar ' throw#comment', 2490a72cfb80SBram Moolenaar 'catch', 2491a72cfb80SBram Moolenaar 'endtry', 2492a72cfb80SBram Moolenaar ], 'E1015:') 2493a72cfb80SBram Moolenaar CheckDefFailure([ 2494a72cfb80SBram Moolenaar 'try', 2495a72cfb80SBram Moolenaar ' throw "yes"#comment', 2496a72cfb80SBram Moolenaar 'catch', 2497a72cfb80SBram Moolenaar 'endtry', 2498a72cfb80SBram Moolenaar ], 'E488:') 2499a72cfb80SBram Moolenaar CheckDefFailure([ 2500a72cfb80SBram Moolenaar 'try', 25017a092245SBram Moolenaar ' echo "yes"', 25027a092245SBram Moolenaar 'catch# comment', 25037a092245SBram Moolenaar 'endtry', 25047a092245SBram Moolenaar ], 'E488:') 25052c5ed4e3SBram Moolenaar CheckScriptFailure([ 25062c5ed4e3SBram Moolenaar 'vim9script', 25072c5ed4e3SBram Moolenaar 'try', 25082c5ed4e3SBram Moolenaar ' echo "yes"', 25092c5ed4e3SBram Moolenaar 'catch# comment', 25102c5ed4e3SBram Moolenaar 'endtry', 25112c5ed4e3SBram Moolenaar ], 'E654:') 25122c5ed4e3SBram Moolenaar CheckDefFailure([ 25132c5ed4e3SBram Moolenaar 'try', 25142c5ed4e3SBram Moolenaar ' echo "yes"', 25152c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25162c5ed4e3SBram Moolenaar 'endtry', 25172c5ed4e3SBram Moolenaar ], 'E488:') 25187a092245SBram Moolenaar CheckDefFailure([ 25197a092245SBram Moolenaar 'try', 25207a092245SBram Moolenaar 'echo "yes"', 25217a092245SBram Moolenaar 'catch', 25227a092245SBram Moolenaar 'endtry# comment', 25237a092245SBram Moolenaar ], 'E488:') 25242c5ed4e3SBram Moolenaar CheckScriptFailure([ 25252c5ed4e3SBram Moolenaar 'vim9script', 25262c5ed4e3SBram Moolenaar 'try', 25272c5ed4e3SBram Moolenaar ' echo "yes"', 25282c5ed4e3SBram Moolenaar 'catch', 25292c5ed4e3SBram Moolenaar 'endtry# comment', 25309b7bf9e9SBram Moolenaar ], 'E488:') 25312c5ed4e3SBram Moolenaar 25322c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25332c5ed4e3SBram Moolenaar 'vim9script', 25342c5ed4e3SBram Moolenaar 'hi # comment', 25352c5ed4e3SBram Moolenaar ]) 25362c5ed4e3SBram Moolenaar CheckScriptFailure([ 25372c5ed4e3SBram Moolenaar 'vim9script', 25382c5ed4e3SBram Moolenaar 'hi# comment', 25392c5ed4e3SBram Moolenaar ], 'E416:') 25401966c248SBram Moolenaar CheckScriptSuccess([ 25411966c248SBram Moolenaar 'vim9script', 25421966c248SBram Moolenaar 'hi Search # comment', 25431966c248SBram Moolenaar ]) 25441966c248SBram Moolenaar CheckScriptFailure([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'hi Search# comment', 25471966c248SBram Moolenaar ], 'E416:') 25481966c248SBram Moolenaar CheckScriptSuccess([ 25491966c248SBram Moolenaar 'vim9script', 25501966c248SBram Moolenaar 'hi link This Search # comment', 25511966c248SBram Moolenaar ]) 25521966c248SBram Moolenaar CheckScriptFailure([ 25531966c248SBram Moolenaar 'vim9script', 25541966c248SBram Moolenaar 'hi link This That# comment', 25551966c248SBram Moolenaar ], 'E413:') 25561966c248SBram Moolenaar CheckScriptSuccess([ 25571966c248SBram Moolenaar 'vim9script', 25581966c248SBram Moolenaar 'hi clear This # comment', 25591966c248SBram Moolenaar 'hi clear # comment', 25601966c248SBram Moolenaar ]) 2561f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2562f5be8cdbSBram Moolenaar # hi clear This# comment', 25631966c248SBram Moolenaar CheckScriptFailure([ 25641966c248SBram Moolenaar 'vim9script', 25651966c248SBram Moolenaar 'hi clear# comment', 25661966c248SBram Moolenaar ], 'E416:') 25671966c248SBram Moolenaar 25681966c248SBram Moolenaar CheckScriptSuccess([ 25691966c248SBram Moolenaar 'vim9script', 25701966c248SBram Moolenaar 'hi Group term=bold', 25711966c248SBram Moolenaar 'match Group /todo/ # comment', 25721966c248SBram Moolenaar ]) 25731966c248SBram Moolenaar CheckScriptFailure([ 25741966c248SBram Moolenaar 'vim9script', 25751966c248SBram Moolenaar 'hi Group term=bold', 25761966c248SBram Moolenaar 'match Group /todo/# comment', 25771966c248SBram Moolenaar ], 'E488:') 25781966c248SBram Moolenaar CheckScriptSuccess([ 25791966c248SBram Moolenaar 'vim9script', 25801966c248SBram Moolenaar 'match # comment', 25811966c248SBram Moolenaar ]) 25821966c248SBram Moolenaar CheckScriptFailure([ 25831966c248SBram Moolenaar 'vim9script', 25841966c248SBram Moolenaar 'match# comment', 25851966c248SBram Moolenaar ], 'E475:') 25861966c248SBram Moolenaar CheckScriptSuccess([ 25871966c248SBram Moolenaar 'vim9script', 25881966c248SBram Moolenaar 'match none # comment', 25891966c248SBram Moolenaar ]) 25901966c248SBram Moolenaar CheckScriptFailure([ 25911966c248SBram Moolenaar 'vim9script', 25921966c248SBram Moolenaar 'match none# comment', 25931966c248SBram Moolenaar ], 'E475:') 25941966c248SBram Moolenaar 25951966c248SBram Moolenaar CheckScriptSuccess([ 25961966c248SBram Moolenaar 'vim9script', 25971966c248SBram Moolenaar 'menutrans clear # comment', 25981966c248SBram Moolenaar ]) 25991966c248SBram Moolenaar CheckScriptFailure([ 26001966c248SBram Moolenaar 'vim9script', 26011966c248SBram Moolenaar 'menutrans clear# comment text', 26021966c248SBram Moolenaar ], 'E474:') 26031966c248SBram Moolenaar 26041966c248SBram Moolenaar CheckScriptSuccess([ 26051966c248SBram Moolenaar 'vim9script', 26061966c248SBram Moolenaar 'syntax clear # comment', 26071966c248SBram Moolenaar ]) 26081966c248SBram Moolenaar CheckScriptFailure([ 26091966c248SBram Moolenaar 'vim9script', 26101966c248SBram Moolenaar 'syntax clear# comment text', 26111966c248SBram Moolenaar ], 'E28:') 26121966c248SBram Moolenaar CheckScriptSuccess([ 26131966c248SBram Moolenaar 'vim9script', 26141966c248SBram Moolenaar 'syntax keyword Word some', 26151966c248SBram Moolenaar 'syntax clear Word # comment', 26161966c248SBram Moolenaar ]) 26171966c248SBram Moolenaar CheckScriptFailure([ 26181966c248SBram Moolenaar 'vim9script', 26191966c248SBram Moolenaar 'syntax keyword Word some', 26201966c248SBram Moolenaar 'syntax clear Word# comment text', 26211966c248SBram Moolenaar ], 'E28:') 26221966c248SBram Moolenaar 26231966c248SBram Moolenaar CheckScriptSuccess([ 26241966c248SBram Moolenaar 'vim9script', 26251966c248SBram Moolenaar 'syntax list # comment', 26261966c248SBram Moolenaar ]) 26271966c248SBram Moolenaar CheckScriptFailure([ 26281966c248SBram Moolenaar 'vim9script', 26291966c248SBram Moolenaar 'syntax list# comment text', 26301966c248SBram Moolenaar ], 'E28:') 26311966c248SBram Moolenaar 26321966c248SBram Moolenaar CheckScriptSuccess([ 26331966c248SBram Moolenaar 'vim9script', 26341966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26351966c248SBram Moolenaar ]) 26361966c248SBram Moolenaar CheckScriptFailure([ 26371966c248SBram Moolenaar 'vim9script', 26381966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26391966c248SBram Moolenaar ], 'E475:') 26401966c248SBram Moolenaar 26411966c248SBram Moolenaar CheckScriptSuccess([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26441966c248SBram Moolenaar ]) 26451966c248SBram Moolenaar CheckScriptFailure([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26481966c248SBram Moolenaar ], 'E789:') 26491966c248SBram Moolenaar 26501966c248SBram Moolenaar CheckScriptSuccess([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26531966c248SBram Moolenaar ]) 26541966c248SBram Moolenaar CheckScriptFailure([ 26551966c248SBram Moolenaar 'vim9script', 26561966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26571966c248SBram Moolenaar ], 'E402:') 26581966c248SBram Moolenaar 26591966c248SBram Moolenaar CheckScriptSuccess([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26621966c248SBram Moolenaar ]) 26631966c248SBram Moolenaar CheckScriptFailure([ 26641966c248SBram Moolenaar 'vim9script', 26651966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26661966c248SBram Moolenaar ], 'E475:') 26671966c248SBram Moolenaar CheckScriptFailure([ 26681966c248SBram Moolenaar 'vim9script', 26691966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26701966c248SBram Moolenaar ], 'E406:') 26711966c248SBram Moolenaar CheckScriptFailure([ 26721966c248SBram Moolenaar 'vim9script', 26731966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26741966c248SBram Moolenaar ], 'E475:') 26751966c248SBram Moolenaar 26761966c248SBram Moolenaar CheckScriptSuccess([ 26771966c248SBram Moolenaar 'vim9script', 26781966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26791966c248SBram Moolenaar ]) 26801966c248SBram Moolenaar CheckScriptFailure([ 26811966c248SBram Moolenaar 'vim9script', 26821966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2683d032f34aSBram Moolenaar ], 'E402:') 26841966c248SBram Moolenaar 26851966c248SBram Moolenaar CheckScriptSuccess([ 26861966c248SBram Moolenaar 'vim9script', 26871966c248SBram Moolenaar 'syntax sync # comment', 26881966c248SBram Moolenaar ]) 26891966c248SBram Moolenaar CheckScriptFailure([ 26901966c248SBram Moolenaar 'vim9script', 26911966c248SBram Moolenaar 'syntax sync# comment', 26921966c248SBram Moolenaar ], 'E404:') 26931966c248SBram Moolenaar CheckScriptSuccess([ 26941966c248SBram Moolenaar 'vim9script', 26951966c248SBram Moolenaar 'syntax sync ccomment # comment', 26961966c248SBram Moolenaar ]) 26971966c248SBram Moolenaar CheckScriptFailure([ 26981966c248SBram Moolenaar 'vim9script', 26991966c248SBram Moolenaar 'syntax sync ccomment# comment', 27001966c248SBram Moolenaar ], 'E404:') 27011966c248SBram Moolenaar 27021966c248SBram Moolenaar CheckScriptSuccess([ 27031966c248SBram Moolenaar 'vim9script', 27041966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27051966c248SBram Moolenaar ]) 27061966c248SBram Moolenaar CheckScriptFailure([ 27071966c248SBram Moolenaar 'vim9script', 27081966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27091966c248SBram Moolenaar ], 'E475:') 2710a72cfb80SBram Moolenaar 2711a72cfb80SBram Moolenaar CheckScriptSuccess([ 2712a72cfb80SBram Moolenaar 'vim9script', 2713a72cfb80SBram Moolenaar 'command Echo echo # comment', 2714a72cfb80SBram Moolenaar 'command Echo # comment', 2715a72cfb80SBram Moolenaar ]) 2716a72cfb80SBram Moolenaar CheckScriptFailure([ 2717a72cfb80SBram Moolenaar 'vim9script', 2718a72cfb80SBram Moolenaar 'command Echo echo# comment', 2719a72cfb80SBram Moolenaar 'Echo', 2720a72cfb80SBram Moolenaar ], 'E121:') 2721a72cfb80SBram Moolenaar CheckScriptFailure([ 2722a72cfb80SBram Moolenaar 'vim9script', 2723a72cfb80SBram Moolenaar 'command Echo# comment', 2724a72cfb80SBram Moolenaar ], 'E182:') 2725a72cfb80SBram Moolenaar CheckScriptFailure([ 2726a72cfb80SBram Moolenaar 'vim9script', 2727a72cfb80SBram Moolenaar 'command Echo echo', 2728a72cfb80SBram Moolenaar 'command Echo# comment', 2729a72cfb80SBram Moolenaar ], 'E182:') 2730a72cfb80SBram Moolenaar 2731a72cfb80SBram Moolenaar CheckScriptSuccess([ 2732a72cfb80SBram Moolenaar 'vim9script', 2733a72cfb80SBram Moolenaar 'function # comment', 2734a72cfb80SBram Moolenaar ]) 2735a72cfb80SBram Moolenaar CheckScriptFailure([ 2736a72cfb80SBram Moolenaar 'vim9script', 27379898107fSBram Moolenaar 'function " comment', 27389898107fSBram Moolenaar ], 'E129:') 27399898107fSBram Moolenaar CheckScriptFailure([ 27409898107fSBram Moolenaar 'vim9script', 2741a72cfb80SBram Moolenaar 'function# comment', 2742a72cfb80SBram Moolenaar ], 'E129:') 2743a72cfb80SBram Moolenaar CheckScriptSuccess([ 2744a72cfb80SBram Moolenaar 'vim9script', 2745a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2746a72cfb80SBram Moolenaar ]) 2747a72cfb80SBram Moolenaar CheckScriptFailure([ 2748a72cfb80SBram Moolenaar 'vim9script', 2749a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2750a72cfb80SBram Moolenaar ], 'E488:') 2751a72cfb80SBram Moolenaar 2752a72cfb80SBram Moolenaar CheckScriptSuccess([ 2753a72cfb80SBram Moolenaar 'vim9script', 27544c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2755a72cfb80SBram Moolenaar 'endfunc', 27564c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2757a72cfb80SBram Moolenaar ]) 2758a72cfb80SBram Moolenaar CheckScriptFailure([ 2759a72cfb80SBram Moolenaar 'vim9script', 27604c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2761a72cfb80SBram Moolenaar 'endfunc', 27624c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2763a72cfb80SBram Moolenaar ], 'E488:') 2764a72cfb80SBram Moolenaar 2765a72cfb80SBram Moolenaar CheckScriptSuccess([ 2766a72cfb80SBram Moolenaar 'vim9script', 2767a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2768a72cfb80SBram Moolenaar ]) 2769a72cfb80SBram Moolenaar CheckScriptFailure([ 2770a72cfb80SBram Moolenaar 'vim9script', 2771a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2772a72cfb80SBram Moolenaar ], 'E488:') 2773e7e4838fSBram Moolenaar 2774e7e4838fSBram Moolenaar CheckScriptFailure([ 2775e7e4838fSBram Moolenaar 'def Test() " comment', 2776e7e4838fSBram Moolenaar 'enddef', 2777e7e4838fSBram Moolenaar ], 'E488:') 2778e7e4838fSBram Moolenaar CheckScriptFailure([ 2779e7e4838fSBram Moolenaar 'vim9script', 2780e7e4838fSBram Moolenaar 'def Test() " comment', 2781e7e4838fSBram Moolenaar 'enddef', 2782e7e4838fSBram Moolenaar ], 'E488:') 2783e7e4838fSBram Moolenaar 2784e7e4838fSBram Moolenaar CheckScriptSuccess([ 2785e7e4838fSBram Moolenaar 'func Test() " comment', 2786e7e4838fSBram Moolenaar 'endfunc', 2787e7e4838fSBram Moolenaar ]) 27889898107fSBram Moolenaar CheckScriptSuccess([ 2789e7e4838fSBram Moolenaar 'vim9script', 2790e7e4838fSBram Moolenaar 'func Test() " comment', 2791e7e4838fSBram Moolenaar 'endfunc', 27929898107fSBram Moolenaar ]) 2793e7e4838fSBram Moolenaar 2794e7e4838fSBram Moolenaar CheckScriptSuccess([ 2795e7e4838fSBram Moolenaar 'def Test() # comment', 2796e7e4838fSBram Moolenaar 'enddef', 2797e7e4838fSBram Moolenaar ]) 2798e7e4838fSBram Moolenaar CheckScriptFailure([ 2799e7e4838fSBram Moolenaar 'func Test() # comment', 2800e7e4838fSBram Moolenaar 'endfunc', 2801e7e4838fSBram Moolenaar ], 'E488:') 28022c5ed4e3SBram Moolenaarenddef 28032c5ed4e3SBram Moolenaar 28042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28052c5ed4e3SBram Moolenaar CheckCanRunGui 28062c5ed4e3SBram Moolenaar 28072c5ed4e3SBram Moolenaar CheckScriptFailure([ 28082c5ed4e3SBram Moolenaar 'vim9script', 28092c5ed4e3SBram Moolenaar 'gui#comment' 28102c5ed4e3SBram Moolenaar ], 'E499:') 28112c5ed4e3SBram Moolenaar CheckScriptFailure([ 28122c5ed4e3SBram Moolenaar 'vim9script', 28132c5ed4e3SBram Moolenaar 'gui -f#comment' 28142c5ed4e3SBram Moolenaar ], 'E499:') 28157a092245SBram Moolenaarenddef 28167a092245SBram Moolenaar 2817a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28186797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28196797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2820a26b9700SBram Moolenaar 2821a26b9700SBram Moolenaar edit test.vim 2822a26b9700SBram Moolenaar doautocmd TabEnter #comment 2823a26b9700SBram Moolenaar assert_equal(1, g:entered) 2824a26b9700SBram Moolenaar 2825a26b9700SBram Moolenaar doautocmd TabEnter f.x 2826a26b9700SBram Moolenaar assert_equal(2, g:entered) 2827a26b9700SBram Moolenaar 2828a26b9700SBram Moolenaar g:entered = 0 2829a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2830a26b9700SBram Moolenaar assert_equal(2, g:entered) 2831a26b9700SBram Moolenaar 2832a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2833a26b9700SBram Moolenaar 2834a26b9700SBram Moolenaar au! TabEnter 2835a26b9700SBram Moolenaar unlet g:entered 2836d72c1bf0SBram Moolenaar 2837d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2838d72c1bf0SBram Moolenaar 'vim9script', 28396797966dSBram Moolenaar 'g:var = 123', 2840e55b1c09SBram Moolenaar 'b:var = 456', 2841e55b1c09SBram Moolenaar 'w:var = 777', 2842e55b1c09SBram Moolenaar 't:var = 888', 2843d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2844d72c1bf0SBram Moolenaar ]) 2845d72c1bf0SBram Moolenaar 2846d72c1bf0SBram Moolenaar CheckScriptFailure([ 2847d72c1bf0SBram Moolenaar 'vim9script', 2848d72c1bf0SBram Moolenaar 'let g:var = 123', 2849e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2850e55b1c09SBram Moolenaar 2851e55b1c09SBram Moolenaar CheckScriptFailure([ 2852e55b1c09SBram Moolenaar 'vim9script', 2853e55b1c09SBram Moolenaar 'let b:var = 123', 2854e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2855e55b1c09SBram Moolenaar 2856e55b1c09SBram Moolenaar CheckScriptFailure([ 2857e55b1c09SBram Moolenaar 'vim9script', 2858e55b1c09SBram Moolenaar 'let w:var = 123', 2859e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2860e55b1c09SBram Moolenaar 2861e55b1c09SBram Moolenaar CheckScriptFailure([ 2862e55b1c09SBram Moolenaar 'vim9script', 2863e55b1c09SBram Moolenaar 'let t:var = 123', 2864e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2865e55b1c09SBram Moolenaar 2866e55b1c09SBram Moolenaar CheckScriptFailure([ 2867e55b1c09SBram Moolenaar 'vim9script', 2868e55b1c09SBram Moolenaar 'let v:version = 123', 2869e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2870e55b1c09SBram Moolenaar 2871e55b1c09SBram Moolenaar CheckScriptFailure([ 2872e55b1c09SBram Moolenaar 'vim9script', 2873e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2874e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28756797966dSBram Moolenaar 28766797966dSBram Moolenaar CheckScriptFailure([ 28776797966dSBram Moolenaar 'vim9script', 28786797966dSBram Moolenaar 'g:var = 123', 287932e35117SBram Moolenaar 'unlet g:var# comment1', 2880d72c1bf0SBram Moolenaar ], 'E108:') 2881d72c1bf0SBram Moolenaar 2882d72c1bf0SBram Moolenaar CheckScriptFailure([ 2883d72c1bf0SBram Moolenaar 'let g:var = 123', 2884d72c1bf0SBram Moolenaar 'unlet g:var # something', 2885d72c1bf0SBram Moolenaar ], 'E488:') 2886faac4104SBram Moolenaar 2887faac4104SBram Moolenaar CheckScriptSuccess([ 2888faac4104SBram Moolenaar 'vim9script', 288932e35117SBram Moolenaar 'if 1 # comment2', 2890faac4104SBram Moolenaar ' echo "yes"', 2891faac4104SBram Moolenaar 'elseif 2 #comment', 2892faac4104SBram Moolenaar ' echo "no"', 2893faac4104SBram Moolenaar 'endif', 2894faac4104SBram Moolenaar ]) 2895faac4104SBram Moolenaar 2896faac4104SBram Moolenaar CheckScriptFailure([ 2897faac4104SBram Moolenaar 'vim9script', 289832e35117SBram Moolenaar 'if 1# comment3', 2899faac4104SBram Moolenaar ' echo "yes"', 2900faac4104SBram Moolenaar 'endif', 2901faac4104SBram Moolenaar ], 'E15:') 2902faac4104SBram Moolenaar 2903faac4104SBram Moolenaar CheckScriptFailure([ 2904faac4104SBram Moolenaar 'vim9script', 290532e35117SBram Moolenaar 'if 0 # comment4', 2906faac4104SBram Moolenaar ' echo "yes"', 2907faac4104SBram Moolenaar 'elseif 2#comment', 2908faac4104SBram Moolenaar ' echo "no"', 2909faac4104SBram Moolenaar 'endif', 2910faac4104SBram Moolenaar ], 'E15:') 2911faac4104SBram Moolenaar 2912faac4104SBram Moolenaar CheckScriptSuccess([ 2913faac4104SBram Moolenaar 'vim9script', 291432e35117SBram Moolenaar 'let v = 1 # comment5', 2915faac4104SBram Moolenaar ]) 2916faac4104SBram Moolenaar 2917faac4104SBram Moolenaar CheckScriptFailure([ 2918faac4104SBram Moolenaar 'vim9script', 291932e35117SBram Moolenaar 'let v = 1# comment6', 292032e35117SBram Moolenaar ], 'E15:') 2921faac4104SBram Moolenaar 2922faac4104SBram Moolenaar CheckScriptSuccess([ 2923faac4104SBram Moolenaar 'vim9script', 2924faac4104SBram Moolenaar 'new' 2925faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2926df069eecSBram Moolenaar ':$', 2927faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2928faac4104SBram Moolenaar 'bwipe!', 2929faac4104SBram Moolenaar ]) 2930faac4104SBram Moolenaar 2931f5be8cdbSBram Moolenaar CheckScriptFailure([ 2932f5be8cdbSBram Moolenaar 'vim9script', 2933f5be8cdbSBram Moolenaar 'new' 2934f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2935f5be8cdbSBram Moolenaar ':$', 2936f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2937f5be8cdbSBram Moolenaar 'bwipe!', 2938f5be8cdbSBram Moolenaar ], 'E488:') 2939f5be8cdbSBram Moolenaar 2940f5be8cdbSBram Moolenaar CheckScriptFailure([ 2941f5be8cdbSBram Moolenaar 'vim9script', 2942f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2943f5be8cdbSBram Moolenaar ], 'E477:') 2944a26b9700SBram Moolenaarenddef 2945a26b9700SBram Moolenaar 29467e5bd91dSBram Moolenaardef Test_finish() 29477e5bd91dSBram Moolenaar let lines =<< trim END 29487e5bd91dSBram Moolenaar vim9script 29496797966dSBram Moolenaar g:res = 'one' 29507e5bd91dSBram Moolenaar if v:false | finish | endif 29516797966dSBram Moolenaar g:res = 'two' 29527e5bd91dSBram Moolenaar finish 29536797966dSBram Moolenaar g:res = 'three' 29547e5bd91dSBram Moolenaar END 29557e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29567e5bd91dSBram Moolenaar source Xfinished 29577e5bd91dSBram Moolenaar assert_equal('two', g:res) 29587e5bd91dSBram Moolenaar 29597e5bd91dSBram Moolenaar unlet g:res 29607e5bd91dSBram Moolenaar delete('Xfinished') 29617e5bd91dSBram Moolenaarenddef 29627e5bd91dSBram Moolenaar 296332e35117SBram Moolenaardef Test_let_func_call() 296432e35117SBram Moolenaar let lines =<< trim END 296532e35117SBram Moolenaar vim9script 296632e35117SBram Moolenaar func GetValue() 296732e35117SBram Moolenaar if exists('g:count') 296832e35117SBram Moolenaar let g:count += 1 296932e35117SBram Moolenaar else 297032e35117SBram Moolenaar let g:count = 1 297132e35117SBram Moolenaar endif 297232e35117SBram Moolenaar return 'this' 297332e35117SBram Moolenaar endfunc 297432e35117SBram Moolenaar let val: string = GetValue() 2975f5be8cdbSBram Moolenaar # env var is always a string 2976df671b46SBram Moolenaar let env = $TERM 297732e35117SBram Moolenaar END 297832e35117SBram Moolenaar writefile(lines, 'Xfinished') 297932e35117SBram Moolenaar source Xfinished 2980f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 298132e35117SBram Moolenaar assert_equal(1, g:count) 298232e35117SBram Moolenaar 298332e35117SBram Moolenaar unlet g:count 298432e35117SBram Moolenaar delete('Xfinished') 298532e35117SBram Moolenaarenddef 298632e35117SBram Moolenaar 298732e35117SBram Moolenaardef Test_let_missing_type() 298832e35117SBram Moolenaar let lines =<< trim END 298932e35117SBram Moolenaar vim9script 2990df671b46SBram Moolenaar let var = g:unknown 2991227a69deSBram Moolenaar END 2992822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2993227a69deSBram Moolenaar 2994227a69deSBram Moolenaar lines =<< trim END 2995227a69deSBram Moolenaar vim9script 2996227a69deSBram Moolenaar let nr: number = 123 2997227a69deSBram Moolenaar let var = nr 2998227a69deSBram Moolenaar END 2999822ba247SBram Moolenaar CheckScriptSuccess(lines) 300032e35117SBram Moolenaarenddef 300132e35117SBram Moolenaar 3002c82a5b5dSBram Moolenaardef Test_let_declaration() 3003c82a5b5dSBram Moolenaar let lines =<< trim END 3004c82a5b5dSBram Moolenaar vim9script 3005c82a5b5dSBram Moolenaar let var: string 3006c82a5b5dSBram Moolenaar g:var_uninit = var 3007c82a5b5dSBram Moolenaar var = 'text' 3008c82a5b5dSBram Moolenaar g:var_test = var 3009f5be8cdbSBram Moolenaar # prefixing s: is optional 3010984dddbeSBram Moolenaar s:var = 'prefixed' 3011984dddbeSBram Moolenaar g:var_prefixed = s:var 3012984dddbeSBram Moolenaar 3013984dddbeSBram Moolenaar let s:other: number 3014984dddbeSBram Moolenaar other = 1234 3015984dddbeSBram Moolenaar g:other_var = other 301653b29e48SBram Moolenaar 301753b29e48SBram Moolenaar # type is inferred 301853b29e48SBram Moolenaar s:dict = {'a': 222} 301953b29e48SBram Moolenaar def GetDictVal(key: any) 302053b29e48SBram Moolenaar g:dict_val = s:dict[key] 302153b29e48SBram Moolenaar enddef 302253b29e48SBram Moolenaar GetDictVal('a') 3023c82a5b5dSBram Moolenaar END 3024c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3025c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3026c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3027984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3028984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 302953b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3030c82a5b5dSBram Moolenaar 3031c82a5b5dSBram Moolenaar unlet g:var_uninit 3032c82a5b5dSBram Moolenaar unlet g:var_test 3033984dddbeSBram Moolenaar unlet g:var_prefixed 3034984dddbeSBram Moolenaar unlet g:other_var 3035c82a5b5dSBram Moolenaarenddef 3036c82a5b5dSBram Moolenaar 3037c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3038c5b1c20bSBram Moolenaar let lines =<< trim END 3039c5b1c20bSBram Moolenaar vim9script 3040c5b1c20bSBram Moolenaar const var: string 3041c5b1c20bSBram Moolenaar END 3042c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3043c5b1c20bSBram Moolenaar 3044c5b1c20bSBram Moolenaar lines =<< trim END 3045c5b1c20bSBram Moolenaar vim9script 3046c5b1c20bSBram Moolenaar let 9var: string 3047c5b1c20bSBram Moolenaar END 3048c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3049c5b1c20bSBram Moolenaarenddef 3050c5b1c20bSBram Moolenaar 305134db91f7SBram Moolenaardef Test_let_type_check() 305234db91f7SBram Moolenaar let lines =<< trim END 305334db91f7SBram Moolenaar vim9script 305434db91f7SBram Moolenaar let var: string 305534db91f7SBram Moolenaar var = 1234 305634db91f7SBram Moolenaar END 3057451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3058984dddbeSBram Moolenaar 3059984dddbeSBram Moolenaar lines =<< trim END 3060984dddbeSBram Moolenaar vim9script 3061984dddbeSBram Moolenaar let var:string 3062984dddbeSBram Moolenaar END 3063984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3064c5b1c20bSBram Moolenaar 3065c5b1c20bSBram Moolenaar lines =<< trim END 3066c5b1c20bSBram Moolenaar vim9script 3067c5b1c20bSBram Moolenaar let var: asdf 3068c5b1c20bSBram Moolenaar END 3069c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3070a71e2633SBram Moolenaar 3071a71e2633SBram Moolenaar lines =<< trim END 3072a71e2633SBram Moolenaar vim9script 3073a71e2633SBram Moolenaar let s:l: list<number> 3074a71e2633SBram Moolenaar s:l = [] 3075a71e2633SBram Moolenaar END 3076a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3077a71e2633SBram Moolenaar 3078a71e2633SBram Moolenaar lines =<< trim END 3079a71e2633SBram Moolenaar vim9script 3080a71e2633SBram Moolenaar let s:d: dict<number> 3081a71e2633SBram Moolenaar s:d = {} 3082a71e2633SBram Moolenaar END 3083a71e2633SBram Moolenaar CheckScriptSuccess(lines) 308434db91f7SBram Moolenaarenddef 308534db91f7SBram Moolenaar 3086a5d0077eSBram Moolenaardef Test_forward_declaration() 3087a5d0077eSBram Moolenaar let lines =<< trim END 3088a5d0077eSBram Moolenaar vim9script 3089a5d0077eSBram Moolenaar def GetValue(): string 3090a5d0077eSBram Moolenaar return theVal 3091a5d0077eSBram Moolenaar enddef 3092a5d0077eSBram Moolenaar let theVal = 'something' 3093822ba247SBram Moolenaar g:initVal = GetValue() 3094a5d0077eSBram Moolenaar theVal = 'else' 3095a5d0077eSBram Moolenaar g:laterVal = GetValue() 3096a5d0077eSBram Moolenaar END 3097a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3098a5d0077eSBram Moolenaar source Xforward 3099a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3100a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3101a5d0077eSBram Moolenaar 3102a5d0077eSBram Moolenaar unlet g:initVal 3103a5d0077eSBram Moolenaar unlet g:laterVal 3104a5d0077eSBram Moolenaar delete('Xforward') 3105a5d0077eSBram Moolenaarenddef 3106a5d0077eSBram Moolenaar 31079721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 31089721fb4eSBram Moolenaar let legacy_lines =<< trim END 31099721fb4eSBram Moolenaar source Xvim9_script.vim 31109721fb4eSBram Moolenaar 31119721fb4eSBram Moolenaar call assert_false(exists('local')) 31129721fb4eSBram Moolenaar call assert_false(exists('exported')) 31139721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31149721fb4eSBram Moolenaar call assert_equal('global', global) 31159721fb4eSBram Moolenaar call assert_equal('global', g:global) 31169721fb4eSBram Moolenaar 31179721fb4eSBram Moolenaar " imported variable becomes script-local 31189721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31199721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31209721fb4eSBram Moolenaar call assert_false(exists('exported')) 31219721fb4eSBram Moolenaar 31229721fb4eSBram Moolenaar " imported function becomes script-local 31239721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31249721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31259721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31269721fb4eSBram Moolenaar END 31279721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31289721fb4eSBram Moolenaar 31299721fb4eSBram Moolenaar let vim9_lines =<< trim END 31309721fb4eSBram Moolenaar vim9script 31319721fb4eSBram Moolenaar let local = 'local' 31329721fb4eSBram Moolenaar g:global = 'global' 31339721fb4eSBram Moolenaar export let exported = 'exported' 31349721fb4eSBram Moolenaar export def GetText(): string 31359721fb4eSBram Moolenaar return 'text' 31369721fb4eSBram Moolenaar enddef 31379721fb4eSBram Moolenaar END 31389721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31399721fb4eSBram Moolenaar 31409721fb4eSBram Moolenaar source Xlegacy_script.vim 31419721fb4eSBram Moolenaar 31429721fb4eSBram Moolenaar assert_equal('global', g:global) 3143f5be8cdbSBram Moolenaar unlet g:global 31449721fb4eSBram Moolenaar 31459721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31469721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31479721fb4eSBram Moolenaarenddef 3148a5d0077eSBram Moolenaar 31497d699701SBram Moolenaarfunc Test_vim9script_not_global() 31507d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31517d699701SBram Moolenaar let vim9lines =<< trim END 31527d699701SBram Moolenaar vim9script 31537d699701SBram Moolenaar let var = 'local' 31547d699701SBram Moolenaar func TheFunc() 31557d699701SBram Moolenaar echo 'local' 31567d699701SBram Moolenaar endfunc 31577d699701SBram Moolenaar def DefFunc() 31587d699701SBram Moolenaar echo 'local' 31597d699701SBram Moolenaar enddef 31607d699701SBram Moolenaar END 31617d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31627d699701SBram Moolenaar source Xvim9script.vim 31637d699701SBram Moolenaar try 31647d699701SBram Moolenaar echo g:var 31657d699701SBram Moolenaar assert_report('did not fail') 31667d699701SBram Moolenaar catch /E121:/ 31677d699701SBram Moolenaar " caught 31687d699701SBram Moolenaar endtry 31697d699701SBram Moolenaar try 31707d699701SBram Moolenaar call TheFunc() 31717d699701SBram Moolenaar assert_report('did not fail') 31727d699701SBram Moolenaar catch /E117:/ 31737d699701SBram Moolenaar " caught 31747d699701SBram Moolenaar endtry 31757d699701SBram Moolenaar try 31767d699701SBram Moolenaar call DefFunc() 31777d699701SBram Moolenaar assert_report('did not fail') 31787d699701SBram Moolenaar catch /E117:/ 31797d699701SBram Moolenaar " caught 31807d699701SBram Moolenaar endtry 31817d699701SBram Moolenaar 318225859dd7SBram Moolenaar call delete('Xvim9script.vim') 31837d699701SBram Moolenaarendfunc 31847d699701SBram Moolenaar 3185eeb27bfeSBram Moolenaardef Test_vim9_copen() 3186eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3187eeb27bfeSBram Moolenaar copen 3188eeb27bfeSBram Moolenaar quit 3189eeb27bfeSBram Moolenaarenddef 3190eeb27bfeSBram Moolenaar 31912d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 31922d6b20d6SBram Moolenaardef Test_vim9_autoload() 31932d6b20d6SBram Moolenaar let lines =<< trim END 31942d6b20d6SBram Moolenaar vim9script 31952d6b20d6SBram Moolenaar def foo#test() 31962d6b20d6SBram Moolenaar echomsg getreg('"') 31972d6b20d6SBram Moolenaar enddef 31982d6b20d6SBram Moolenaar END 31992d6b20d6SBram Moolenaar 32002d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32012d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 32022d6b20d6SBram Moolenaar let save_rtp = &rtp 32032d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32042d6b20d6SBram Moolenaar augroup test 32052d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32062d6b20d6SBram Moolenaar augroup END 32072d6b20d6SBram Moolenaar 32082d6b20d6SBram Moolenaar normal Y 32092d6b20d6SBram Moolenaar 32102d6b20d6SBram Moolenaar augroup test 32112d6b20d6SBram Moolenaar autocmd! 32122d6b20d6SBram Moolenaar augroup END 32132d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32142d6b20d6SBram Moolenaar &rtp = save_rtp 32152d6b20d6SBram Moolenaarenddef 32162d6b20d6SBram Moolenaar 321781e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 321881e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 321981e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 322081e17fbeSBram Moolenaar let lines =<< trim END 322181e17fbeSBram Moolenaar let s:counter = 1 322281e17fbeSBram Moolenaar def s:Func() 322381e17fbeSBram Moolenaar au! CursorHold 322481e17fbeSBram Moolenaar au CursorHold * s:counter += 1 322581e17fbeSBram Moolenaar enddef 322681e17fbeSBram Moolenaar call s:Func() 322781e17fbeSBram Moolenaar doau CursorHold 322881e17fbeSBram Moolenaar call assert_equal(2, s:counter) 322981e17fbeSBram Moolenaar au! CursorHold 323081e17fbeSBram Moolenaar END 323181e17fbeSBram Moolenaar CheckScriptSuccess(lines) 323281e17fbeSBram Moolenaarenddef 323381e17fbeSBram Moolenaar 32343896a105SBram Moolenaardef Test_cmdline_win() 32353896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32363896a105SBram Moolenaar # the command line window. 32373896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32383896a105SBram Moolenaar let export_lines =<< trim END 32393896a105SBram Moolenaar vim9script 32403896a105SBram Moolenaar export let That = 'yes' 32413896a105SBram Moolenaar END 32423896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32433896a105SBram Moolenaar let import_lines =<< trim END 32443896a105SBram Moolenaar vim9script 32453896a105SBram Moolenaar import That from './Xexport.vim' 32463896a105SBram Moolenaar END 32473896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32483896a105SBram Moolenaar let save_rtp = &rtp 32493896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32503896a105SBram Moolenaar syntax on 32513896a105SBram Moolenaar augroup CmdWin 32523896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32533896a105SBram Moolenaar augroup END 32543896a105SBram Moolenaar # this will open and also close the cmdline window 32553896a105SBram Moolenaar feedkeys('q:', 'xt') 32563896a105SBram Moolenaar assert_equal('yes', g:got_there) 32573896a105SBram Moolenaar 32583896a105SBram Moolenaar augroup CmdWin 32593896a105SBram Moolenaar au! 32603896a105SBram Moolenaar augroup END 32613896a105SBram Moolenaar &rtp = save_rtp 32623896a105SBram Moolenaar delete('rtp', 'rf') 32633896a105SBram Moolenaarenddef 32643896a105SBram Moolenaar 3265e3d4685fSBram Moolenaardef Test_invalid_sid() 3266e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 326725859dd7SBram Moolenaar 3268e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3269e3d4685fSBram Moolenaar call assert_equal([], readfile('Xdidit')) 3270e3d4685fSBram Moolenaar endif 3271e3d4685fSBram Moolenaar delete('Xdidit') 3272e3d4685fSBram Moolenaarenddef 3273e3d4685fSBram Moolenaar 3274585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3275585fea7bSBram Moolenaardef Test_substitute_cmd() 3276585fea7bSBram Moolenaar new 3277585fea7bSBram Moolenaar setline(1, 'something') 3278585fea7bSBram Moolenaar :substitute(some(other( 3279585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3280585fea7bSBram Moolenaar bwipe! 3281585fea7bSBram Moolenaar 3282f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3283585fea7bSBram Moolenaar let lines =<< trim END 3284585fea7bSBram Moolenaar vim9script 3285585fea7bSBram Moolenaar new 3286585fea7bSBram Moolenaar setline(1, 'something') 3287585fea7bSBram Moolenaar :substitute(some(other( 3288585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3289585fea7bSBram Moolenaar bwipe! 3290585fea7bSBram Moolenaar END 3291585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3292585fea7bSBram Moolenaar source Xvim9lines 3293585fea7bSBram Moolenaar 3294585fea7bSBram Moolenaar delete('Xvim9lines') 3295585fea7bSBram Moolenaarenddef 3296585fea7bSBram Moolenaar 32978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3298