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 42ba7c0d7bSBram Moolenaardef Test_assignment_bool() 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 4829a86ffeSBram Moolenaar let bool3: bool = 0 494ed124ccSBram Moolenaar assert_equal(false, bool3) 5029a86ffeSBram Moolenaar let bool4: bool = 1 514ed124ccSBram Moolenaar assert_equal(true, bool4) 524ed124ccSBram Moolenaar 534ed124ccSBram Moolenaar let bool5: bool = 'yes' && 'no' 544ed124ccSBram Moolenaar assert_equal(true, bool5) 554ed124ccSBram Moolenaar let bool6: bool = [] && 99 564ed124ccSBram Moolenaar assert_equal(false, bool6) 574ed124ccSBram Moolenaar let bool7: bool = [] || #{a: 1} && 99 584ed124ccSBram Moolenaar assert_equal(true, bool7) 5929a86ffeSBram Moolenaar 60ba7c0d7bSBram Moolenaar let lines =<< trim END 61ba7c0d7bSBram Moolenaar vim9script 62ba7c0d7bSBram Moolenaar def GetFlag(): bool 63ba7c0d7bSBram Moolenaar let flag: bool = 1 64ba7c0d7bSBram Moolenaar return flag 65ba7c0d7bSBram Moolenaar enddef 66ba7c0d7bSBram Moolenaar let flag: bool = GetFlag() 674ed124ccSBram Moolenaar assert_equal(true, flag) 68ba7c0d7bSBram Moolenaar flag = 0 69c1ec0422SBram Moolenaar assert_equal(false, flag) 70ba7c0d7bSBram Moolenaar flag = 1 71c1ec0422SBram Moolenaar assert_equal(true, flag) 72c1ec0422SBram Moolenaar flag = 99 || 123 73c1ec0422SBram Moolenaar assert_equal(true, flag) 74c1ec0422SBram Moolenaar flag = 'yes' && [] 75c1ec0422SBram Moolenaar assert_equal(false, flag) 76ba7c0d7bSBram Moolenaar END 77ba7c0d7bSBram Moolenaar CheckScriptSuccess(lines) 78ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:') 79ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:') 80ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:') 81ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:') 82ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:') 83ba7c0d7bSBram Moolenaarenddef 84ba7c0d7bSBram Moolenaar 85ba7c0d7bSBram Moolenaardef Test_assignment() 86d2c61705SBram Moolenaar CheckDefFailure(['let x:string'], 'E1069:') 87d2c61705SBram Moolenaar CheckDefFailure(['let x:string = "x"'], 'E1069:') 88d2c61705SBram Moolenaar CheckDefFailure(['let a:string = "x"'], 'E1069:') 89d2c61705SBram Moolenaar CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 90f93c7feaSBram Moolenaar 914cdb13ceSBram Moolenaar let nr: number = 1234 92d2c61705SBram Moolenaar CheckDefFailure(['let nr: number = "asdf"'], 'E1012:') 934cdb13ceSBram Moolenaar 94b209750bSBram Moolenaar let a: number = 6 #comment 959be61bbbSBram Moolenaar assert_equal(6, a) 969be61bbbSBram Moolenaar 9742a480bfSBram Moolenaar if has('channel') 9842a480bfSBram Moolenaar let chan1: channel 99fbdd08edSBram Moolenaar let job1: job 100f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 10142a480bfSBram Moolenaar endif 102fbdd08edSBram Moolenaar if has('float') 103fbdd08edSBram Moolenaar let float1: float = 3.4 104fbdd08edSBram Moolenaar endif 1055deeb3f1SBram Moolenaar let Funky1: func 1065deeb3f1SBram Moolenaar let Funky2: func = function('len') 1074c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 10842a480bfSBram Moolenaar 109b209750bSBram Moolenaar g:newvar = 'new' #comment 110401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 111401d9ffbSBram Moolenaar 112401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 113401d9ffbSBram Moolenaar g:existing = 'no' 114401d9ffbSBram Moolenaar assert_equal('no', g:existing) 115401d9ffbSBram Moolenaar 116b283a8a6SBram Moolenaar v:char = 'abc' 1176e587dcbSBram Moolenaar assert_equal('abc', v:char) 118b283a8a6SBram Moolenaar 119b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 1206e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 121b283a8a6SBram Moolenaar $ENVVAR = '' 1226e587dcbSBram Moolenaar 123b5ed2660SBram Moolenaar let lines =<< trim END 124b5ed2660SBram Moolenaar vim9script 125b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 126b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 127b5ed2660SBram Moolenaar $ENVVAR = '' 128b5ed2660SBram Moolenaar END 129d2c61705SBram Moolenaar CheckScriptSuccess(lines) 130b5ed2660SBram Moolenaar 131fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 132fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 133fd1823e0SBram Moolenaar s:addToMe += 222 134fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 1350bbf722aSBram Moolenaar s:newVar = 'new' 1360bbf722aSBram Moolenaar assert_equal('new', s:newVar) 137a8c17704SBram Moolenaar 138a8c17704SBram Moolenaar set ts=7 139a8c17704SBram Moolenaar &ts += 1 140a8c17704SBram Moolenaar assert_equal(8, &ts) 14180c34ca3SBram Moolenaar &ts -= 3 14280c34ca3SBram Moolenaar assert_equal(5, &ts) 14380c34ca3SBram Moolenaar &ts *= 2 14480c34ca3SBram Moolenaar assert_equal(10, &ts) 14580c34ca3SBram Moolenaar &ts /= 3 14680c34ca3SBram Moolenaar assert_equal(3, &ts) 14780c34ca3SBram Moolenaar set ts=10 14880c34ca3SBram Moolenaar &ts %= 4 14980c34ca3SBram Moolenaar assert_equal(2, &ts) 150b5ed2660SBram Moolenaar 15193ad1471SBram Moolenaar if has('float') 15293ad1471SBram Moolenaar let f100: float = 100.0 15393ad1471SBram Moolenaar f100 /= 5 15493ad1471SBram Moolenaar assert_equal(20.0, f100) 15593ad1471SBram Moolenaar 15693ad1471SBram Moolenaar let f200: float = 200.0 15793ad1471SBram Moolenaar f200 /= 5.0 15893ad1471SBram Moolenaar assert_equal(40.0, f200) 15993ad1471SBram Moolenaar 16093ad1471SBram Moolenaar CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:') 16193ad1471SBram Moolenaar endif 16293ad1471SBram Moolenaar 163b5ed2660SBram Moolenaar lines =<< trim END 164b5ed2660SBram Moolenaar &ts = 6 165b5ed2660SBram Moolenaar &ts += 3 166b5ed2660SBram Moolenaar assert_equal(9, &ts) 1672e800955SBram Moolenaar 1682e800955SBram Moolenaar &l:ts = 6 1692e800955SBram Moolenaar assert_equal(6, &ts) 1702e800955SBram Moolenaar &l:ts += 2 1712e800955SBram Moolenaar assert_equal(8, &ts) 1722e800955SBram Moolenaar 1732e800955SBram Moolenaar &g:ts = 6 1742e800955SBram Moolenaar assert_equal(6, &g:ts) 1752e800955SBram Moolenaar &g:ts += 2 1762e800955SBram Moolenaar assert_equal(8, &g:ts) 177b5ed2660SBram Moolenaar END 1782e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 179b5ed2660SBram Moolenaar 1800aae4809SBram Moolenaar CheckDefFailure(['¬ex += 3'], 'E113:') 1810aae4809SBram Moolenaar CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 1820aae4809SBram Moolenaar CheckDefFailure(['&ts = [7]'], 'E1012:') 1835e654230SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>') 1840aae4809SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 1855e654230SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string') 1860aae4809SBram Moolenaar CheckDefFailure(['&path += 3'], 'E1012:') 1870aae4809SBram Moolenaar CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 188cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 1890aae4809SBram Moolenaar CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 19080c34ca3SBram Moolenaar &ts = 8 191a8c17704SBram Moolenaar 1920aae4809SBram Moolenaar lines =<< trim END 1930aae4809SBram Moolenaar let save_TI = &t_TI 1940aae4809SBram Moolenaar &t_TI = '' 1950aae4809SBram Moolenaar assert_equal('', &t_TI) 1960aae4809SBram Moolenaar &t_TI = 'xxx' 1970aae4809SBram Moolenaar assert_equal('xxx', &t_TI) 1980aae4809SBram Moolenaar &t_TI = save_TI 1990aae4809SBram Moolenaar END 200ba7c0d7bSBram Moolenaar CheckDefAndScriptSuccess(lines) 2010aae4809SBram Moolenaar 2020aae4809SBram Moolenaar CheckDefFailure(['&t_TI = 123'], 'E1012:') 2030aae4809SBram Moolenaar CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') 2040aae4809SBram Moolenaar 2050aae4809SBram Moolenaar CheckDefFailure(['let s:var = 123'], 'E1101:') 2060aae4809SBram Moolenaar CheckDefFailure(['let s:var: number'], 'E1101:') 20733afa244SBram Moolenaar 208f9b2b496SBram Moolenaar lines =<< trim END 209f9b2b496SBram Moolenaar vim9script 210f9b2b496SBram Moolenaar def SomeFunc() 211f9b2b496SBram Moolenaar s:var = 123 212f9b2b496SBram Moolenaar enddef 213f9b2b496SBram Moolenaar defcompile 214f9b2b496SBram Moolenaar END 215d2c61705SBram Moolenaar CheckScriptFailure(lines, 'E1089:') 216f9b2b496SBram Moolenaar 217a8c17704SBram Moolenaar g:inc_counter += 1 218a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 219a8c17704SBram Moolenaar 220a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 221a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 222d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 223d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 224a8c17704SBram Moolenaar 225b5ed2660SBram Moolenaar lines =<< trim END 226b5ed2660SBram Moolenaar @c = 'areg' 227b5ed2660SBram Moolenaar @c ..= 'add' 228b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 229b5ed2660SBram Moolenaar END 2302e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 2312e800955SBram Moolenaar 232d2c61705SBram Moolenaar CheckDefFailure(['@a += "more"'], 'E1051:') 233d2c61705SBram Moolenaar CheckDefFailure(['@a += 123'], 'E1012:') 234b5ed2660SBram Moolenaar 235e69f6d04SBram Moolenaar v:errmsg = 'none' 236e69f6d04SBram Moolenaar v:errmsg ..= 'again' 237e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 238d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 239d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += 123'], 'E1012:') 24033afa244SBram Moolenaar 24133afa244SBram Moolenaar # single letter variables 24233afa244SBram Moolenaar a = 123 24333afa244SBram Moolenaar assert_equal(123, a) 24433afa244SBram Moolenaar let b: number 24533afa244SBram Moolenaar b = 123 24633afa244SBram Moolenaar assert_equal(123, b) 24733afa244SBram Moolenaar let g: number 24833afa244SBram Moolenaar g = 123 24933afa244SBram Moolenaar assert_equal(123, g) 25033afa244SBram Moolenaar let s: number 25133afa244SBram Moolenaar s = 123 25233afa244SBram Moolenaar assert_equal(123, s) 25333afa244SBram Moolenaar let t: number 25433afa244SBram Moolenaar t = 123 25533afa244SBram Moolenaar assert_equal(123, t) 25633afa244SBram Moolenaar let v: number 25733afa244SBram Moolenaar v = 123 25833afa244SBram Moolenaar assert_equal(123, v) 25933afa244SBram Moolenaar let w: number 26033afa244SBram Moolenaar w = 123 26133afa244SBram Moolenaar assert_equal(123, w) 2625deeb3f1SBram Moolenaarenddef 2635deeb3f1SBram Moolenaar 2643b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 2653b74b6b4SBram Moolenaar let lines =<< trim END 2663b74b6b4SBram Moolenaar vim9script 2673b74b6b4SBram Moolenaar 268f5be8cdbSBram Moolenaar # single character variable declarations work 2693b74b6b4SBram Moolenaar let a: string 2703b74b6b4SBram Moolenaar let b: number 2713b74b6b4SBram Moolenaar let l: list<any> 2723b74b6b4SBram Moolenaar let s: string 2733b74b6b4SBram Moolenaar let t: number 2743b74b6b4SBram Moolenaar let v: number 2753b74b6b4SBram Moolenaar let w: number 2763b74b6b4SBram Moolenaar 277f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 2783b74b6b4SBram Moolenaar a = 'script-a' 2793b74b6b4SBram Moolenaar b = 111 2803b74b6b4SBram Moolenaar l = [1, 2, 3] 2813b74b6b4SBram Moolenaar s = 'script-s' 2823b74b6b4SBram Moolenaar t = 222 2833b74b6b4SBram Moolenaar v = 333 2843b74b6b4SBram Moolenaar w = 444 2853b74b6b4SBram Moolenaar 2863b74b6b4SBram Moolenaar assert_equal('script-a', a) 2873b74b6b4SBram Moolenaar assert_equal(111, b) 2883b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2893b74b6b4SBram Moolenaar assert_equal('script-s', s) 2903b74b6b4SBram Moolenaar assert_equal(222, t) 2913b74b6b4SBram Moolenaar assert_equal(333, v) 2923b74b6b4SBram Moolenaar assert_equal(444, w) 2933b74b6b4SBram Moolenaar END 2943b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2953b74b6b4SBram Moolenaar source Xsinglechar 2963b74b6b4SBram Moolenaar delete('Xsinglechar') 2973b74b6b4SBram Moolenaarenddef 2983b74b6b4SBram Moolenaar 29984370087SBram Moolenaardef Test_assignment_list() 30084370087SBram Moolenaar let list1: list<bool> = [false, true, false] 30184370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 30284370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 30384370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 30484370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 30584370087SBram Moolenaar 30684370087SBram Moolenaar let listS: list<string> = [] 30784370087SBram Moolenaar let listN: list<number> = [] 30884370087SBram Moolenaar 30984370087SBram Moolenaar assert_equal([1, 2, 3], list2) 31084370087SBram Moolenaar list2[-1] = 99 31184370087SBram Moolenaar assert_equal([1, 2, 99], list2) 31284370087SBram Moolenaar list2[-2] = 88 31384370087SBram Moolenaar assert_equal([1, 88, 99], list2) 31484370087SBram Moolenaar list2[-3] = 77 31584370087SBram Moolenaar assert_equal([77, 88, 99], list2) 316dd29f1b0SBram Moolenaar list2 += [100] 317dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 318dd29f1b0SBram Moolenaar 319dd29f1b0SBram Moolenaar list3 += ['end'] 320dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 321dd29f1b0SBram Moolenaar 322d2c61705SBram Moolenaar CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 323d2c61705SBram Moolenaar CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 32484370087SBram Moolenaar 32584370087SBram Moolenaar # type becomes list<any> 32684370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 32784370087SBram Moolenaarenddef 32884370087SBram Moolenaar 329b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 330b31be3f9SBram Moolenaar let lines =<< trim END 331b31be3f9SBram Moolenaar vim9script 332b31be3f9SBram Moolenaar let v1: number 333b31be3f9SBram Moolenaar let v2: number 334b31be3f9SBram Moolenaar let v3: number 335b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 336b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 337b31be3f9SBram Moolenaar END 338d2c61705SBram Moolenaar CheckScriptSuccess(lines) 339b31be3f9SBram Moolenaarenddef 340b31be3f9SBram Moolenaar 34184370087SBram Moolenaardef Test_assignment_dict() 34284370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 34384370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 34484370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 34584370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 34674fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 34784370087SBram Moolenaar 348f5be8cdbSBram Moolenaar # overwrite 349c785b9a7SBram Moolenaar dict3['key'] = 'another' 350c785b9a7SBram Moolenaar 35158626872SBram Moolenaar # empty key can be used 35258626872SBram Moolenaar let dd = {} 35358626872SBram Moolenaar dd[""] = 6 35458626872SBram Moolenaar assert_equal({'': 6}, dd) 35584370087SBram Moolenaar 35684370087SBram Moolenaar # type becomes dict<any> 35784370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 3588e4c8c85SBram Moolenaar 3598e4c8c85SBram Moolenaar # assignment to script-local dict 3608e4c8c85SBram Moolenaar let lines =<< trim END 3618e4c8c85SBram Moolenaar vim9script 3628e4c8c85SBram Moolenaar let test: dict<any> = {} 3638e4c8c85SBram Moolenaar def FillDict(): dict<any> 3648e4c8c85SBram Moolenaar test['a'] = 43 3658e4c8c85SBram Moolenaar return test 3668e4c8c85SBram Moolenaar enddef 3678e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3688e4c8c85SBram Moolenaar END 36908052228SBram Moolenaar CheckScriptSuccess(lines) 3708e4c8c85SBram Moolenaar 3718e4c8c85SBram Moolenaar lines =<< trim END 3728e4c8c85SBram Moolenaar vim9script 3738e4c8c85SBram Moolenaar let test: dict<any> 3748e4c8c85SBram Moolenaar def FillDict(): dict<any> 3758e4c8c85SBram Moolenaar test['a'] = 43 3768e4c8c85SBram Moolenaar return test 3778e4c8c85SBram Moolenaar enddef 3788e4c8c85SBram Moolenaar FillDict() 3798e4c8c85SBram Moolenaar END 38008052228SBram Moolenaar CheckScriptFailure(lines, 'E1103:') 3812caa1594SBram Moolenaar 3822caa1594SBram Moolenaar # assignment to global dict 3832caa1594SBram Moolenaar lines =<< trim END 3842caa1594SBram Moolenaar vim9script 3852caa1594SBram Moolenaar g:test = {} 3862caa1594SBram Moolenaar def FillDict(): dict<any> 3872caa1594SBram Moolenaar g:test['a'] = 43 3882caa1594SBram Moolenaar return g:test 3892caa1594SBram Moolenaar enddef 3902caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3912caa1594SBram Moolenaar END 39208052228SBram Moolenaar CheckScriptSuccess(lines) 3932caa1594SBram Moolenaar 3942caa1594SBram Moolenaar # assignment to buffer dict 3952caa1594SBram Moolenaar lines =<< trim END 3962caa1594SBram Moolenaar vim9script 3972caa1594SBram Moolenaar b:test = {} 3982caa1594SBram Moolenaar def FillDict(): dict<any> 3992caa1594SBram Moolenaar b:test['a'] = 43 4002caa1594SBram Moolenaar return b:test 4012caa1594SBram Moolenaar enddef 4022caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 4032caa1594SBram Moolenaar END 40408052228SBram Moolenaar CheckScriptSuccess(lines) 40584370087SBram Moolenaarenddef 40684370087SBram Moolenaar 407d3aac291SBram Moolenaardef Test_assignment_local() 408f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 409f5be8cdbSBram Moolenaar # changed. 410d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 411d3aac291SBram Moolenaar let b:existing = 'yes' 412d3aac291SBram Moolenaar let w:existing = 'yes' 413d3aac291SBram Moolenaar let t:existing = 'yes' 414d3aac291SBram Moolenaar 415d3aac291SBram Moolenaar def Test_assignment_local_internal() 416d3aac291SBram Moolenaar b:newvar = 'new' 417d3aac291SBram Moolenaar assert_equal('new', b:newvar) 418d3aac291SBram Moolenaar assert_equal('yes', b:existing) 419d3aac291SBram Moolenaar b:existing = 'no' 420d3aac291SBram Moolenaar assert_equal('no', b:existing) 421396f3138SBram Moolenaar b:existing ..= 'NO' 422396f3138SBram Moolenaar assert_equal('noNO', b:existing) 423d3aac291SBram Moolenaar 424d3aac291SBram Moolenaar w:newvar = 'new' 425d3aac291SBram Moolenaar assert_equal('new', w:newvar) 426d3aac291SBram Moolenaar assert_equal('yes', w:existing) 427d3aac291SBram Moolenaar w:existing = 'no' 428d3aac291SBram Moolenaar assert_equal('no', w:existing) 429396f3138SBram Moolenaar w:existing ..= 'NO' 430396f3138SBram Moolenaar assert_equal('noNO', w:existing) 431d3aac291SBram Moolenaar 432d3aac291SBram Moolenaar t:newvar = 'new' 433d3aac291SBram Moolenaar assert_equal('new', t:newvar) 434d3aac291SBram Moolenaar assert_equal('yes', t:existing) 435d3aac291SBram Moolenaar t:existing = 'no' 436d3aac291SBram Moolenaar assert_equal('no', t:existing) 437396f3138SBram Moolenaar t:existing ..= 'NO' 438396f3138SBram Moolenaar assert_equal('noNO', t:existing) 439d3aac291SBram Moolenaar enddef 440d3aac291SBram Moolenaar call Test_assignment_local_internal() 441d3aac291SBram Moolenaar END 44208052228SBram Moolenaar CheckScriptSuccess(script_lines) 443d3aac291SBram Moolenaarenddef 444d3aac291SBram Moolenaar 4455deeb3f1SBram Moolenaardef Test_assignment_default() 446e69f6d04SBram Moolenaar 447cb711abfSBram Moolenaar # Test default values. 448e69f6d04SBram Moolenaar let thebool: bool 449e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 450e69f6d04SBram Moolenaar 451e69f6d04SBram Moolenaar let thenumber: number 452e69f6d04SBram Moolenaar assert_equal(0, thenumber) 453e69f6d04SBram Moolenaar 454e69f6d04SBram Moolenaar if has('float') 455e69f6d04SBram Moolenaar let thefloat: float 456e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 457e69f6d04SBram Moolenaar endif 458e69f6d04SBram Moolenaar 459e69f6d04SBram Moolenaar let thestring: string 460e69f6d04SBram Moolenaar assert_equal('', thestring) 461e69f6d04SBram Moolenaar 462e69f6d04SBram Moolenaar let theblob: blob 463e69f6d04SBram Moolenaar assert_equal(0z, theblob) 464e69f6d04SBram Moolenaar 4655deeb3f1SBram Moolenaar let Thefunc: func 4665deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 467e69f6d04SBram Moolenaar 468e69f6d04SBram Moolenaar let thelist: list<any> 469e69f6d04SBram Moolenaar assert_equal([], thelist) 470e69f6d04SBram Moolenaar 471e69f6d04SBram Moolenaar let thedict: dict<any> 472e69f6d04SBram Moolenaar assert_equal({}, thedict) 473e69f6d04SBram Moolenaar 4742c869deeSBram Moolenaar if has('channel') 475e69f6d04SBram Moolenaar let thejob: job 476e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 477e69f6d04SBram Moolenaar 478e69f6d04SBram Moolenaar let thechannel: channel 479e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 480c785b9a7SBram Moolenaar 481c785b9a7SBram Moolenaar if has('unix') && executable('cat') 482f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 483c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 484c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 485c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 486c785b9a7SBram Moolenaar endif 4872c869deeSBram Moolenaar endif 488585fea7bSBram Moolenaar 489585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 490585fea7bSBram Moolenaar assert_equal(5678, nr) 4918a7d6542SBram Moolenaarenddef 4928a7d6542SBram Moolenaar 49347a519a9SBram Moolenaardef Test_assignment_var_list() 49447a519a9SBram Moolenaar let v1: string 49547a519a9SBram Moolenaar let v2: string 4969af78769SBram Moolenaar let vrem: list<string> 4979af78769SBram Moolenaar [v1] = ['aaa'] 4989af78769SBram Moolenaar assert_equal('aaa', v1) 4999af78769SBram Moolenaar 50047a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 50147a519a9SBram Moolenaar assert_equal('one', v1) 50247a519a9SBram Moolenaar assert_equal('two', v2) 5039af78769SBram Moolenaar 5049af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 5059af78769SBram Moolenaar assert_equal('one', v1) 5069af78769SBram Moolenaar assert_equal('two', v2) 5079af78769SBram Moolenaar assert_equal([], vrem) 5089af78769SBram Moolenaar 5099af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 5109af78769SBram Moolenaar assert_equal('one', v1) 5119af78769SBram Moolenaar assert_equal('two', v2) 5129af78769SBram Moolenaar assert_equal(['three'], vrem) 5131c199f9cSBram Moolenaar 5141c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 5151c199f9cSBram Moolenaar assert_equal(3, &ts) 5161c199f9cSBram Moolenaar assert_equal(4, &sw) 5171c199f9cSBram Moolenaar set ts=8 sw=4 51847a519a9SBram Moolenaarenddef 51947a519a9SBram Moolenaar 520c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 521c7e44a7eSBram Moolenaar let lines =<< trim END 522c7e44a7eSBram Moolenaar vim9script 523c7e44a7eSBram Moolenaar def Func(): list<number> 524c7e44a7eSBram Moolenaar return [1, 2] 525c7e44a7eSBram Moolenaar enddef 526c7e44a7eSBram Moolenaar let var1: number 527c7e44a7eSBram Moolenaar let var2: number 528c7e44a7eSBram Moolenaar [var1, var2] = 529c7e44a7eSBram Moolenaar Func() 530c7e44a7eSBram Moolenaar assert_equal(1, var1) 531c7e44a7eSBram Moolenaar assert_equal(2, var2) 532c7e44a7eSBram Moolenaar let ll = 533c7e44a7eSBram Moolenaar Func() 534c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 53583144546SBram Moolenaar 53683144546SBram Moolenaar @/ = 'text' 53783144546SBram Moolenaar assert_equal('text', @/) 53883144546SBram Moolenaar @0 = 'zero' 53983144546SBram Moolenaar assert_equal('zero', @0) 54083144546SBram Moolenaar @1 = 'one' 54183144546SBram Moolenaar assert_equal('one', @1) 54283144546SBram Moolenaar @9 = 'nine' 54383144546SBram Moolenaar assert_equal('nine', @9) 54483144546SBram Moolenaar @- = 'minus' 54583144546SBram Moolenaar assert_equal('minus', @-) 54683144546SBram Moolenaar if has('clipboard_working') 54783144546SBram Moolenaar @* = 'star' 54883144546SBram Moolenaar assert_equal('star', @*) 54983144546SBram Moolenaar @+ = 'plus' 55083144546SBram Moolenaar assert_equal('plus', @+) 55183144546SBram Moolenaar endif 55295dd9f25SBram Moolenaar 55395dd9f25SBram Moolenaar let a: number = 123 55495dd9f25SBram Moolenaar assert_equal(123, a) 55595dd9f25SBram Moolenaar let s: string = 'yes' 55695dd9f25SBram Moolenaar assert_equal('yes', s) 55795dd9f25SBram Moolenaar let b: number = 42 55895dd9f25SBram Moolenaar assert_equal(42, b) 55995dd9f25SBram Moolenaar let w: number = 43 56095dd9f25SBram Moolenaar assert_equal(43, w) 56195dd9f25SBram Moolenaar let t: number = 44 56295dd9f25SBram Moolenaar assert_equal(44, t) 563c7e44a7eSBram Moolenaar END 564c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 565c7e44a7eSBram Moolenaarenddef 566c7e44a7eSBram Moolenaar 567cab27678SBram Moolenaardef Mess(): string 568cab27678SBram Moolenaar v:foldstart = 123 569cab27678SBram Moolenaar return 'xxx' 570cab27678SBram Moolenaarenddef 571cab27678SBram Moolenaar 572d72c1bf0SBram Moolenaardef Test_assignment_failure() 573d2c61705SBram Moolenaar CheckDefFailure(['let var=234'], 'E1004:') 574d2c61705SBram Moolenaar CheckDefFailure(['let var =234'], 'E1004:') 575d2c61705SBram Moolenaar CheckDefFailure(['let var= 234'], 'E1004:') 5768a7d6542SBram Moolenaar 577d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 578d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 579d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 580d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 581d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 582d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 583d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 584d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 58563be3d4bSBram Moolenaar 586d2c61705SBram Moolenaar CheckDefFailure(['let true = 1'], 'E1034:') 587d2c61705SBram Moolenaar CheckDefFailure(['let false = 1'], 'E1034:') 5888a7d6542SBram Moolenaar 589d2c61705SBram Moolenaar CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 590d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5919af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 592d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5939af78769SBram Moolenaar '[a] = []'], 'E1093:') 594d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5959af78769SBram Moolenaar 'let y: number', 5969af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 597d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5989af78769SBram Moolenaar 'let y: number', 5999af78769SBram Moolenaar 'let z: list<number>', 6009af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 6019be61bbbSBram Moolenaar 602d2c61705SBram Moolenaar CheckDefFailure(['let somevar'], "E1022:") 603d2c61705SBram Moolenaar CheckDefFailure(['let &tabstop = 4'], 'E1052:') 604d2c61705SBram Moolenaar CheckDefFailure(['&g:option = 5'], 'E113:') 605d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 6069be61bbbSBram Moolenaar 607d2c61705SBram Moolenaar CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 608d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 6099be61bbbSBram Moolenaar 610434d72cbSBram Moolenaar if has('dnd') 611d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E1066:') 612434d72cbSBram Moolenaar else 613d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E354:') 614d2c61705SBram Moolenaar CheckDefFailure(['@~ = 5'], 'E354:') 615434d72cbSBram Moolenaar endif 616d2c61705SBram Moolenaar CheckDefFailure(['let @a = 5'], 'E1066:') 617d2c61705SBram Moolenaar CheckDefFailure(['let @/ = "x"'], 'E1066:') 618d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 6199be61bbbSBram Moolenaar 620d2c61705SBram Moolenaar CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 621d2c61705SBram Moolenaar CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 622d2c61705SBram Moolenaar CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 623d2c61705SBram Moolenaar CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 6249be61bbbSBram Moolenaar 625d2c61705SBram Moolenaar CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 626d2c61705SBram Moolenaar CheckDefFailure(['let xnr += 4'], 'E1020:', 1) 627d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:') 628d2c61705SBram Moolenaar CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1) 629d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:') 6309be61bbbSBram Moolenaar 631d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 63233fa29cfSBram Moolenaar 633d2c61705SBram Moolenaar CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 634d2c61705SBram Moolenaar CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 6358a7d6542SBram Moolenaar 636d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 637d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 6388a7d6542SBram Moolenaar 639d2c61705SBram Moolenaar CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 640d2c61705SBram Moolenaar CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 64142a480bfSBram Moolenaar 642d2c61705SBram Moolenaar CheckDefFailure(['let var: dict <number>'], 'E1068:') 643d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 644cab27678SBram Moolenaar 645d2c61705SBram Moolenaar assert_fails('s/^/\=Mess()/n', 'E794:') 646d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 64743e969d3SBram Moolenaar 648d2c61705SBram Moolenaar CheckDefFailure(['w:foo: number = 10'], 64943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 650d2c61705SBram Moolenaar CheckDefFailure(['t:foo: bool = true'], 65143e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 652d2c61705SBram Moolenaar CheckDefFailure(['b:foo: string = "x"'], 65343e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 654d2c61705SBram Moolenaar CheckDefFailure(['g:foo: number = 123'], 65543e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 656d72c1bf0SBram Moolenaarenddef 657d72c1bf0SBram Moolenaar 658d72c1bf0SBram Moolenaardef Test_unlet() 659d72c1bf0SBram Moolenaar g:somevar = 'yes' 660d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 661d72c1bf0SBram Moolenaar unlet g:somevar 662d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 663d72c1bf0SBram Moolenaar unlet! g:somevar 664d72c1bf0SBram Moolenaar 6658436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 6668436773fSBram Moolenaar s:somevar = 'legacy' 6678436773fSBram Moolenaar assert_true(exists('s:somevar')) 6688436773fSBram Moolenaar unlet s:somevar 6698436773fSBram Moolenaar assert_false(exists('s:somevar')) 6708436773fSBram Moolenaar unlet! s:somevar 6718436773fSBram Moolenaar 672d2c61705SBram Moolenaar CheckScriptFailure([ 673d72c1bf0SBram Moolenaar 'vim9script', 674d72c1bf0SBram Moolenaar 'let svar = 123', 675d72c1bf0SBram Moolenaar 'unlet svar', 676d72c1bf0SBram Moolenaar ], 'E1081:') 677d2c61705SBram Moolenaar CheckScriptFailure([ 678d72c1bf0SBram Moolenaar 'vim9script', 679d72c1bf0SBram Moolenaar 'let svar = 123', 680d72c1bf0SBram Moolenaar 'unlet s:svar', 681d72c1bf0SBram Moolenaar ], 'E1081:') 682d2c61705SBram Moolenaar CheckScriptFailure([ 683d72c1bf0SBram Moolenaar 'vim9script', 684d72c1bf0SBram Moolenaar 'let svar = 123', 685d72c1bf0SBram Moolenaar 'def Func()', 686d72c1bf0SBram Moolenaar ' unlet svar', 687d72c1bf0SBram Moolenaar 'enddef', 688822ba247SBram Moolenaar 'defcompile', 689d72c1bf0SBram Moolenaar ], 'E1081:') 690d2c61705SBram Moolenaar CheckScriptFailure([ 691d72c1bf0SBram Moolenaar 'vim9script', 692d72c1bf0SBram Moolenaar 'let svar = 123', 693d72c1bf0SBram Moolenaar 'def Func()', 694d72c1bf0SBram Moolenaar ' unlet s:svar', 695d72c1bf0SBram Moolenaar 'enddef', 696822ba247SBram Moolenaar 'defcompile', 697d72c1bf0SBram Moolenaar ], 'E1081:') 6987bdaea6eSBram Moolenaar 6997bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 7007bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 7017bdaea6eSBram Moolenaar unlet $ENVVAR 7027bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 703d72c1bf0SBram Moolenaarenddef 704599c89c8SBram Moolenaar 7054c17ad94SBram Moolenaardef Test_delfunction() 706f5be8cdbSBram Moolenaar # Check function is defined in script namespace 7074c17ad94SBram Moolenaar CheckScriptSuccess([ 7084c17ad94SBram Moolenaar 'vim9script', 7094c17ad94SBram Moolenaar 'func CheckMe()', 7104c17ad94SBram Moolenaar ' return 123', 7114c17ad94SBram Moolenaar 'endfunc', 7124c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 7134c17ad94SBram Moolenaar ]) 7144c17ad94SBram Moolenaar 715f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 7164c17ad94SBram Moolenaar CheckScriptFailure([ 7174c17ad94SBram Moolenaar 'vim9script', 7184c17ad94SBram Moolenaar 'func DeleteMe1()', 7194c17ad94SBram Moolenaar 'endfunc', 7204c17ad94SBram Moolenaar 'delfunction DeleteMe1', 7214c17ad94SBram Moolenaar ], 'E1084:') 7224c17ad94SBram Moolenaar CheckScriptFailure([ 7234c17ad94SBram Moolenaar 'vim9script', 7244c17ad94SBram Moolenaar 'func DeleteMe2()', 7254c17ad94SBram Moolenaar 'endfunc', 7264c17ad94SBram Moolenaar 'def DoThat()', 7274c17ad94SBram Moolenaar ' delfunction DeleteMe2', 7284c17ad94SBram Moolenaar 'enddef', 7294c17ad94SBram Moolenaar 'DoThat()', 7304c17ad94SBram Moolenaar ], 'E1084:') 7314c17ad94SBram Moolenaar CheckScriptFailure([ 7324c17ad94SBram Moolenaar 'vim9script', 7334c17ad94SBram Moolenaar 'def DeleteMe3()', 7344c17ad94SBram Moolenaar 'enddef', 7354c17ad94SBram Moolenaar 'delfunction DeleteMe3', 7364c17ad94SBram Moolenaar ], 'E1084:') 7374c17ad94SBram Moolenaar CheckScriptFailure([ 7384c17ad94SBram Moolenaar 'vim9script', 7394c17ad94SBram Moolenaar 'def DeleteMe4()', 7404c17ad94SBram Moolenaar 'enddef', 7414c17ad94SBram Moolenaar 'def DoThat()', 7424c17ad94SBram Moolenaar ' delfunction DeleteMe4', 7434c17ad94SBram Moolenaar 'enddef', 7444c17ad94SBram Moolenaar 'DoThat()', 7454c17ad94SBram Moolenaar ], 'E1084:') 746925e9fd6SBram Moolenaar 747925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 748925e9fd6SBram Moolenaar let lines =<< trim END 749925e9fd6SBram Moolenaar vim9script 750925e9fd6SBram Moolenaar def g:Global(): string 751925e9fd6SBram Moolenaar return "yes" 752925e9fd6SBram Moolenaar enddef 753925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 754925e9fd6SBram Moolenaar def! g:Global(): string 755925e9fd6SBram Moolenaar return "no" 756925e9fd6SBram Moolenaar enddef 757925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 758925e9fd6SBram Moolenaar delfunc g:Global 759925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 760925e9fd6SBram Moolenaar END 761925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 762925e9fd6SBram Moolenaar 763925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 764925e9fd6SBram Moolenaar lines =<< trim END 765925e9fd6SBram Moolenaar vim9script 766925e9fd6SBram Moolenaar func g:Global() 767925e9fd6SBram Moolenaar return "yes" 768925e9fd6SBram Moolenaar endfunc 769925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 770925e9fd6SBram Moolenaar def! g:Global(): string 771925e9fd6SBram Moolenaar return "no" 772925e9fd6SBram Moolenaar enddef 773925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 774925e9fd6SBram Moolenaar delfunc g:Global 775925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 776925e9fd6SBram Moolenaar END 777925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 778925e9fd6SBram Moolenaar 779925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 780925e9fd6SBram Moolenaar lines =<< trim END 781925e9fd6SBram Moolenaar vim9script 782925e9fd6SBram Moolenaar def g:Global(): string 783925e9fd6SBram Moolenaar return "yes" 784925e9fd6SBram Moolenaar enddef 785925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 786925e9fd6SBram Moolenaar func! g:Global() 787925e9fd6SBram Moolenaar return "no" 788925e9fd6SBram Moolenaar endfunc 789925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 790925e9fd6SBram Moolenaar delfunc g:Global 791925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 792925e9fd6SBram Moolenaar END 793925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 7944c17ad94SBram Moolenaarenddef 7954c17ad94SBram Moolenaar 79608052228SBram Moolenaardef Test_wrong_type() 79708052228SBram Moolenaar CheckDefFailure(['let var: list<nothing>'], 'E1010:') 79808052228SBram Moolenaar CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 79908052228SBram Moolenaar CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 80008052228SBram Moolenaar CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 801599c89c8SBram Moolenaar 80208052228SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 80308052228SBram Moolenaar CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 80442a480bfSBram Moolenaar 80508052228SBram Moolenaar CheckDefFailure(['let var: ally'], 'E1010:') 80608052228SBram Moolenaar CheckDefFailure(['let var: bram'], 'E1010:') 80708052228SBram Moolenaar CheckDefFailure(['let var: cathy'], 'E1010:') 80808052228SBram Moolenaar CheckDefFailure(['let var: dom'], 'E1010:') 80908052228SBram Moolenaar CheckDefFailure(['let var: freddy'], 'E1010:') 81008052228SBram Moolenaar CheckDefFailure(['let var: john'], 'E1010:') 81108052228SBram Moolenaar CheckDefFailure(['let var: larry'], 'E1010:') 81208052228SBram Moolenaar CheckDefFailure(['let var: ned'], 'E1010:') 81308052228SBram Moolenaar CheckDefFailure(['let var: pam'], 'E1010:') 81408052228SBram Moolenaar CheckDefFailure(['let var: sam'], 'E1010:') 81508052228SBram Moolenaar CheckDefFailure(['let var: vim'], 'E1010:') 816a0a9f43aSBram Moolenaar 81708052228SBram Moolenaar CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 81808052228SBram Moolenaar CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 81908052228SBram Moolenaarenddef 8208a7d6542SBram Moolenaar 82108052228SBram Moolenaardef Test_const() 82208052228SBram Moolenaar CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 82308052228SBram Moolenaar CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 824dbeecb2bSBram Moolenaar CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:') 82508052228SBram Moolenaar CheckDefFailure(['const two'], 'E1021:') 82608052228SBram Moolenaar CheckDefFailure(['const &option'], 'E996:') 827dbeecb2bSBram Moolenaar 828dbeecb2bSBram Moolenaar let lines =<< trim END 829dbeecb2bSBram Moolenaar const list = [1, 2, 3] 830dbeecb2bSBram Moolenaar list[0] = 4 8310b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 8320b4c66c6SBram Moolenaar const! other = [5, 6, 7] 8330b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 83471abe482SBram Moolenaar 83571abe482SBram Moolenaar let varlist = [7, 8] 83671abe482SBram Moolenaar const! constlist = [1, varlist, 3] 83771abe482SBram Moolenaar varlist[0] = 77 83871abe482SBram Moolenaar # TODO: does not work yet 83971abe482SBram Moolenaar # constlist[1][1] = 88 84071abe482SBram Moolenaar let cl = constlist[1] 84171abe482SBram Moolenaar cl[1] = 88 84271abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 84371abe482SBram Moolenaar 84471abe482SBram Moolenaar let vardict = #{five: 5, six: 6} 84571abe482SBram Moolenaar const! constdict = #{one: 1, two: vardict, three: 3} 84671abe482SBram Moolenaar vardict['five'] = 55 84771abe482SBram Moolenaar # TODO: does not work yet 84871abe482SBram Moolenaar # constdict['two']['six'] = 66 84971abe482SBram Moolenaar let cd = constdict['two'] 85071abe482SBram Moolenaar cd['six'] = 66 85171abe482SBram Moolenaar constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3}) 852dbeecb2bSBram Moolenaar END 853dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 85408052228SBram Moolenaarenddef 8558a7d6542SBram Moolenaar 8560b4c66c6SBram Moolenaardef Test_const_bang() 8570b4c66c6SBram Moolenaar let lines =<< trim END 8580b4c66c6SBram Moolenaar const! var = 234 8590b4c66c6SBram Moolenaar var = 99 8600b4c66c6SBram Moolenaar END 8610b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 8620b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 8630b4c66c6SBram Moolenaar 8640b4c66c6SBram Moolenaar lines =<< trim END 8650b4c66c6SBram Moolenaar const! ll = [2, 3, 4] 8660b4c66c6SBram Moolenaar ll[0] = 99 8670b4c66c6SBram Moolenaar END 8680b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 8690b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 8700b4c66c6SBram Moolenaar 8710b4c66c6SBram Moolenaar lines =<< trim END 8720b4c66c6SBram Moolenaar const! ll = [2, 3, 4] 8730b4c66c6SBram Moolenaar ll[3] = 99 8740b4c66c6SBram Moolenaar END 8750b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 8760b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 8770b4c66c6SBram Moolenaar 8780b4c66c6SBram Moolenaar lines =<< trim END 8790b4c66c6SBram Moolenaar const! dd = #{one: 1, two: 2} 8800b4c66c6SBram Moolenaar dd["one"] = 99 8810b4c66c6SBram Moolenaar END 8820b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 8830b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 8840b4c66c6SBram Moolenaar 8850b4c66c6SBram Moolenaar lines =<< trim END 8860b4c66c6SBram Moolenaar const! dd = #{one: 1, two: 2} 8870b4c66c6SBram Moolenaar dd["three"] = 99 8880b4c66c6SBram Moolenaar END 8890b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 8900b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 8910b4c66c6SBram Moolenaarenddef 8920b4c66c6SBram Moolenaar 893df069eecSBram Moolenaardef Test_range_no_colon() 894d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 895d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 896d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 897d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 898df069eecSBram Moolenaarenddef 899df069eecSBram Moolenaar 900df069eecSBram Moolenaar 9018a7d6542SBram Moolenaardef Test_block() 9028a7d6542SBram Moolenaar let outer = 1 9038a7d6542SBram Moolenaar { 9048a7d6542SBram Moolenaar let inner = 2 9058a7d6542SBram Moolenaar assert_equal(1, outer) 9068a7d6542SBram Moolenaar assert_equal(2, inner) 9078a7d6542SBram Moolenaar } 9088a7d6542SBram Moolenaar assert_equal(1, outer) 9098a7d6542SBram Moolenaarenddef 9108a7d6542SBram Moolenaar 91108052228SBram Moolenaardef Test_block_failure() 91208052228SBram Moolenaar CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 91308052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 91408052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 91508052228SBram Moolenaarenddef 9168a7d6542SBram Moolenaar 917d032f34aSBram Moolenaarfunc g:NoSuchFunc() 918d032f34aSBram Moolenaar echo 'none' 919d032f34aSBram Moolenaarendfunc 920d032f34aSBram Moolenaar 9218a7d6542SBram Moolenaardef Test_try_catch() 9228a7d6542SBram Moolenaar let l = [] 9237a092245SBram Moolenaar try # comment 9248a7d6542SBram Moolenaar add(l, '1') 9258a7d6542SBram Moolenaar throw 'wrong' 9268a7d6542SBram Moolenaar add(l, '2') 9277a092245SBram Moolenaar catch # comment 9288a7d6542SBram Moolenaar add(l, v:exception) 9297a092245SBram Moolenaar finally # comment 9308a7d6542SBram Moolenaar add(l, '3') 9317a092245SBram Moolenaar endtry # comment 9328a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 93368d130c6SBram Moolenaar 934e859312eSBram Moolenaar l = [] 935e859312eSBram Moolenaar try 936e859312eSBram Moolenaar try 937e859312eSBram Moolenaar add(l, '1') 938e859312eSBram Moolenaar throw 'wrong' 939e859312eSBram Moolenaar add(l, '2') 940e859312eSBram Moolenaar catch /right/ 941e859312eSBram Moolenaar add(l, v:exception) 942e859312eSBram Moolenaar endtry 943e859312eSBram Moolenaar catch /wrong/ 944e859312eSBram Moolenaar add(l, 'caught') 945e859312eSBram Moolenaar finally 946e859312eSBram Moolenaar add(l, 'finally') 947e859312eSBram Moolenaar endtry 948e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 949e859312eSBram Moolenaar 95068d130c6SBram Moolenaar let n: number 95168d130c6SBram Moolenaar try 95268d130c6SBram Moolenaar n = l[3] 95368d130c6SBram Moolenaar catch /E684:/ 95468d130c6SBram Moolenaar n = 99 95568d130c6SBram Moolenaar endtry 95668d130c6SBram Moolenaar assert_equal(99, n) 95768d130c6SBram Moolenaar 95868d130c6SBram Moolenaar try 959cc673e74SBram Moolenaar # string slice returns a string, not a number 96068d130c6SBram Moolenaar n = g:astring[3] 9615e654230SBram Moolenaar catch /E1012:/ 96268d130c6SBram Moolenaar n = 77 96368d130c6SBram Moolenaar endtry 96468d130c6SBram Moolenaar assert_equal(77, n) 96568d130c6SBram Moolenaar 96668d130c6SBram Moolenaar try 96768d130c6SBram Moolenaar n = l[g:astring] 9685e654230SBram Moolenaar catch /E1012:/ 96956acb094SBram Moolenaar n = 88 97068d130c6SBram Moolenaar endtry 97156acb094SBram Moolenaar assert_equal(88, n) 97268d130c6SBram Moolenaar 97368d130c6SBram Moolenaar try 97468d130c6SBram Moolenaar n = s:does_not_exist 97568d130c6SBram Moolenaar catch /E121:/ 976f0b9f43cSBram Moolenaar n = 111 977f0b9f43cSBram Moolenaar endtry 978f0b9f43cSBram Moolenaar assert_equal(111, n) 979f0b9f43cSBram Moolenaar 980f0b9f43cSBram Moolenaar try 981f0b9f43cSBram Moolenaar n = g:does_not_exist 982f0b9f43cSBram Moolenaar catch /E121:/ 98368d130c6SBram Moolenaar n = 121 98468d130c6SBram Moolenaar endtry 98568d130c6SBram Moolenaar assert_equal(121, n) 98668d130c6SBram Moolenaar 98768d130c6SBram Moolenaar let d = #{one: 1} 98868d130c6SBram Moolenaar try 98968d130c6SBram Moolenaar n = d[g:astring] 99068d130c6SBram Moolenaar catch /E716:/ 99168d130c6SBram Moolenaar n = 222 99268d130c6SBram Moolenaar endtry 99368d130c6SBram Moolenaar assert_equal(222, n) 994f0b9f43cSBram Moolenaar 995f0b9f43cSBram Moolenaar try 996f0b9f43cSBram Moolenaar n = -g:astring 997f0b9f43cSBram Moolenaar catch /E39:/ 998f0b9f43cSBram Moolenaar n = 233 999f0b9f43cSBram Moolenaar endtry 1000f0b9f43cSBram Moolenaar assert_equal(233, n) 1001f0b9f43cSBram Moolenaar 1002f0b9f43cSBram Moolenaar try 1003f0b9f43cSBram Moolenaar n = +g:astring 1004f0b9f43cSBram Moolenaar catch /E1030:/ 1005f0b9f43cSBram Moolenaar n = 244 1006f0b9f43cSBram Moolenaar endtry 1007f0b9f43cSBram Moolenaar assert_equal(244, n) 1008f0b9f43cSBram Moolenaar 1009f0b9f43cSBram Moolenaar try 1010f0b9f43cSBram Moolenaar n = +g:alist 1011f0b9f43cSBram Moolenaar catch /E745:/ 1012f0b9f43cSBram Moolenaar n = 255 1013f0b9f43cSBram Moolenaar endtry 1014f0b9f43cSBram Moolenaar assert_equal(255, n) 1015f0b9f43cSBram Moolenaar 1016f0b9f43cSBram Moolenaar let nd: dict<any> 1017f0b9f43cSBram Moolenaar try 1018f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 10195e654230SBram Moolenaar catch /E1012:/ 1020f0b9f43cSBram Moolenaar n = 266 1021f0b9f43cSBram Moolenaar endtry 1022f0b9f43cSBram Moolenaar assert_equal(266, n) 1023f0b9f43cSBram Moolenaar 1024f0b9f43cSBram Moolenaar try 1025f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 1026f0b9f43cSBram Moolenaar catch /E1093:/ 1027f0b9f43cSBram Moolenaar n = 277 1028f0b9f43cSBram Moolenaar endtry 1029f0b9f43cSBram Moolenaar assert_equal(277, n) 1030f0b9f43cSBram Moolenaar 1031e859312eSBram Moolenaar try 1032e859312eSBram Moolenaar &ts = g:astring 10335e654230SBram Moolenaar catch /E1012:/ 1034e859312eSBram Moolenaar n = 288 1035e859312eSBram Moolenaar endtry 1036e859312eSBram Moolenaar assert_equal(288, n) 1037e859312eSBram Moolenaar 1038e859312eSBram Moolenaar try 1039e859312eSBram Moolenaar &backspace = 'asdf' 1040e859312eSBram Moolenaar catch /E474:/ 1041e859312eSBram Moolenaar n = 299 1042e859312eSBram Moolenaar endtry 1043e859312eSBram Moolenaar assert_equal(299, n) 1044e859312eSBram Moolenaar 1045e859312eSBram Moolenaar l = [1] 1046e859312eSBram Moolenaar try 1047e859312eSBram Moolenaar l[3] = 3 1048e859312eSBram Moolenaar catch /E684:/ 1049e859312eSBram Moolenaar n = 300 1050e859312eSBram Moolenaar endtry 1051e859312eSBram Moolenaar assert_equal(300, n) 1052e859312eSBram Moolenaar 1053e859312eSBram Moolenaar try 1054e859312eSBram Moolenaar unlet g:does_not_exist 1055e859312eSBram Moolenaar catch /E108:/ 1056e859312eSBram Moolenaar n = 322 1057e859312eSBram Moolenaar endtry 1058e859312eSBram Moolenaar assert_equal(322, n) 1059e859312eSBram Moolenaar 1060e859312eSBram Moolenaar try 1061e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 1062e859312eSBram Moolenaar catch /E721:/ 1063e859312eSBram Moolenaar n = 333 1064e859312eSBram Moolenaar endtry 1065e859312eSBram Moolenaar assert_equal(333, n) 1066e859312eSBram Moolenaar 1067e859312eSBram Moolenaar try 1068e859312eSBram Moolenaar l = DeletedFunc() 1069e859312eSBram Moolenaar catch /E933:/ 1070e859312eSBram Moolenaar n = 344 1071e859312eSBram Moolenaar endtry 1072e859312eSBram Moolenaar assert_equal(344, n) 1073d032f34aSBram Moolenaar 1074d032f34aSBram Moolenaar try 1075d032f34aSBram Moolenaar echo len(v:true) 1076d032f34aSBram Moolenaar catch /E701:/ 1077d032f34aSBram Moolenaar n = 355 1078d032f34aSBram Moolenaar endtry 1079d032f34aSBram Moolenaar assert_equal(355, n) 1080d032f34aSBram Moolenaar 1081d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 1082d032f34aSBram Moolenaar delfunc g:NoSuchFunc 1083d032f34aSBram Moolenaar try 1084d032f34aSBram Moolenaar echo P() 1085d032f34aSBram Moolenaar catch /E117:/ 1086d032f34aSBram Moolenaar n = 366 1087d032f34aSBram Moolenaar endtry 1088d032f34aSBram Moolenaar assert_equal(366, n) 1089d032f34aSBram Moolenaar 1090d032f34aSBram Moolenaar try 1091d032f34aSBram Moolenaar echo g:NoSuchFunc() 1092d032f34aSBram Moolenaar catch /E117:/ 1093d032f34aSBram Moolenaar n = 377 1094d032f34aSBram Moolenaar endtry 1095d032f34aSBram Moolenaar assert_equal(377, n) 1096d032f34aSBram Moolenaar 1097d032f34aSBram Moolenaar try 1098d032f34aSBram Moolenaar echo g:alist + 4 1099d032f34aSBram Moolenaar catch /E745:/ 1100d032f34aSBram Moolenaar n = 388 1101d032f34aSBram Moolenaar endtry 1102d032f34aSBram Moolenaar assert_equal(388, n) 1103d032f34aSBram Moolenaar 1104d032f34aSBram Moolenaar try 1105d032f34aSBram Moolenaar echo 4 + g:alist 1106d032f34aSBram Moolenaar catch /E745:/ 1107d032f34aSBram Moolenaar n = 399 1108d032f34aSBram Moolenaar endtry 1109d032f34aSBram Moolenaar assert_equal(399, n) 1110d032f34aSBram Moolenaar 1111d032f34aSBram Moolenaar try 1112d032f34aSBram Moolenaar echo g:alist.member 1113d032f34aSBram Moolenaar catch /E715:/ 1114d032f34aSBram Moolenaar n = 400 1115d032f34aSBram Moolenaar endtry 1116d032f34aSBram Moolenaar assert_equal(400, n) 1117d032f34aSBram Moolenaar 1118d032f34aSBram Moolenaar try 1119d032f34aSBram Moolenaar echo d.member 1120d032f34aSBram Moolenaar catch /E716:/ 1121d032f34aSBram Moolenaar n = 411 1122d032f34aSBram Moolenaar endtry 1123d032f34aSBram Moolenaar assert_equal(411, n) 11248a7d6542SBram Moolenaarenddef 11258a7d6542SBram Moolenaar 1126e859312eSBram Moolenaardef DeletedFunc(): list<any> 1127e859312eSBram Moolenaar return ['delete me'] 1128e859312eSBram Moolenaarenddef 1129e859312eSBram Moolenaardefcompile 1130e859312eSBram Moolenaardelfunc DeletedFunc 1131e859312eSBram Moolenaar 1132257cc5eeSBram Moolenaardef ThrowFromDef() 1133a72cfb80SBram Moolenaar throw "getout" # comment 1134257cc5eeSBram Moolenaarenddef 1135257cc5eeSBram Moolenaar 1136257cc5eeSBram Moolenaarfunc CatchInFunc() 1137257cc5eeSBram Moolenaar try 1138257cc5eeSBram Moolenaar call ThrowFromDef() 1139257cc5eeSBram Moolenaar catch 1140257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1141257cc5eeSBram Moolenaar endtry 1142257cc5eeSBram Moolenaarendfunc 1143257cc5eeSBram Moolenaar 1144257cc5eeSBram Moolenaardef CatchInDef() 1145257cc5eeSBram Moolenaar try 1146257cc5eeSBram Moolenaar ThrowFromDef() 1147257cc5eeSBram Moolenaar catch 1148257cc5eeSBram Moolenaar g:thrown_def = v:exception 1149257cc5eeSBram Moolenaar endtry 1150257cc5eeSBram Moolenaarenddef 1151257cc5eeSBram Moolenaar 1152f575adffSBram Moolenaardef ReturnFinally(): string 1153f575adffSBram Moolenaar try 1154f575adffSBram Moolenaar return 'intry' 1155f575adffSBram Moolenaar finally 1156f575adffSBram Moolenaar g:in_finally = 'finally' 1157f575adffSBram Moolenaar endtry 1158f575adffSBram Moolenaar return 'end' 1159f575adffSBram Moolenaarenddef 1160f575adffSBram Moolenaar 1161257cc5eeSBram Moolenaardef Test_try_catch_nested() 1162257cc5eeSBram Moolenaar CatchInFunc() 1163257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1164257cc5eeSBram Moolenaar 1165257cc5eeSBram Moolenaar CatchInDef() 1166257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1167f575adffSBram Moolenaar 1168f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1169f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1170f575adffSBram Moolenaarenddef 1171f575adffSBram Moolenaar 11729939f57bSBram Moolenaardef TryOne(): number 11739939f57bSBram Moolenaar try 11749939f57bSBram Moolenaar return 0 11759939f57bSBram Moolenaar catch 11769939f57bSBram Moolenaar endtry 11779939f57bSBram Moolenaar return 0 11789939f57bSBram Moolenaarenddef 11799939f57bSBram Moolenaar 11809939f57bSBram Moolenaardef TryTwo(n: number): string 11819939f57bSBram Moolenaar try 11829939f57bSBram Moolenaar let x = {} 11839939f57bSBram Moolenaar catch 11849939f57bSBram Moolenaar endtry 11859939f57bSBram Moolenaar return 'text' 11869939f57bSBram Moolenaarenddef 11879939f57bSBram Moolenaar 11889939f57bSBram Moolenaardef Test_try_catch_twice() 11899939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 11909939f57bSBram Moolenaarenddef 11919939f57bSBram Moolenaar 1192f575adffSBram Moolenaardef Test_try_catch_match() 1193f575adffSBram Moolenaar let seq = 'a' 1194f575adffSBram Moolenaar try 1195f575adffSBram Moolenaar throw 'something' 1196f575adffSBram Moolenaar catch /nothing/ 1197f575adffSBram Moolenaar seq ..= 'x' 1198f575adffSBram Moolenaar catch /some/ 1199f575adffSBram Moolenaar seq ..= 'b' 1200f575adffSBram Moolenaar catch /asdf/ 1201f575adffSBram Moolenaar seq ..= 'x' 1202e8c4abbbSBram Moolenaar catch ?a\?sdf? 1203e8c4abbbSBram Moolenaar seq ..= 'y' 1204f575adffSBram Moolenaar finally 1205f575adffSBram Moolenaar seq ..= 'c' 1206f575adffSBram Moolenaar endtry 1207f575adffSBram Moolenaar assert_equal('abc', seq) 1208257cc5eeSBram Moolenaarenddef 1209257cc5eeSBram Moolenaar 1210e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1211d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1212d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1213d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1214d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1215d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1216d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1217d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1218d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1219d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1220d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1221585fea7bSBram Moolenaar 1222d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1223d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1224e8c4abbbSBram Moolenaarenddef 1225e8c4abbbSBram Moolenaar 1226006ad48bSBram Moolenaardef Test_throw_vimscript() 1227f5be8cdbSBram Moolenaar # only checks line continuation 1228006ad48bSBram Moolenaar let lines =<< trim END 1229006ad48bSBram Moolenaar vim9script 1230006ad48bSBram Moolenaar try 1231006ad48bSBram Moolenaar throw 'one' 1232006ad48bSBram Moolenaar .. 'two' 1233006ad48bSBram Moolenaar catch 1234006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1235006ad48bSBram Moolenaar endtry 1236006ad48bSBram Moolenaar END 1237006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1238006ad48bSBram Moolenaarenddef 1239006ad48bSBram Moolenaar 1240ed677f55SBram Moolenaardef Test_error_in_nested_function() 1241ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1242ed677f55SBram Moolenaar let lines =<< trim END 1243ed677f55SBram Moolenaar vim9script 1244ed677f55SBram Moolenaar def Func() 1245ed677f55SBram Moolenaar Error() 1246ed677f55SBram Moolenaar g:test_var = 1 1247ed677f55SBram Moolenaar enddef 1248ed677f55SBram Moolenaar func Error() abort 1249ed677f55SBram Moolenaar eval [][0] 1250ed677f55SBram Moolenaar endfunc 1251ed677f55SBram Moolenaar Func() 1252ed677f55SBram Moolenaar END 1253ed677f55SBram Moolenaar g:test_var = 0 1254ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1255ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1256ed677f55SBram Moolenaarenddef 1257ed677f55SBram Moolenaar 125837c83711SBram Moolenaardef Test_cexpr_vimscript() 1259f5be8cdbSBram Moolenaar # only checks line continuation 126037c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 126137c83711SBram Moolenaar let lines =<< trim END 126237c83711SBram Moolenaar vim9script 126337c83711SBram Moolenaar cexpr 'File' 126437c83711SBram Moolenaar .. ' someFile' .. 126537c83711SBram Moolenaar ' line 19' 126637c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 126737c83711SBram Moolenaar END 126837c83711SBram Moolenaar CheckScriptSuccess(lines) 126937c83711SBram Moolenaar set errorformat& 127037c83711SBram Moolenaarenddef 127137c83711SBram Moolenaar 1272c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1273c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1274c9edd6b5SBram Moolenaar let lines =<< trim END 1275c9edd6b5SBram Moolenaar vim9script 1276c9edd6b5SBram Moolenaar func g:Status() 1277c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1278c9edd6b5SBram Moolenaar endfunc 1279c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1280c9edd6b5SBram Moolenaar redrawstatus 1281c9edd6b5SBram Moolenaar set laststatus statusline= 1282c9edd6b5SBram Moolenaar END 1283c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1284c9edd6b5SBram Moolenaarenddef 1285c9edd6b5SBram Moolenaar 1286b209750bSBram Moolenaardef Test_list_vimscript() 1287b209750bSBram Moolenaar # checks line continuation and comments 1288b209750bSBram Moolenaar let lines =<< trim END 1289b209750bSBram Moolenaar vim9script 1290b209750bSBram Moolenaar let mylist = [ 1291b209750bSBram Moolenaar 'one', 1292b209750bSBram Moolenaar # comment 1293b209750bSBram Moolenaar 'two', # empty line follows 1294b209750bSBram Moolenaar 1295b209750bSBram Moolenaar 'three', 1296b209750bSBram Moolenaar ] 1297b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1298b209750bSBram Moolenaar END 1299b209750bSBram Moolenaar CheckScriptSuccess(lines) 130066250c93SBram Moolenaar 130166250c93SBram Moolenaar # check all lines from heredoc are kept 130266250c93SBram Moolenaar lines =<< trim END 130366250c93SBram Moolenaar # comment 1 130466250c93SBram Moolenaar two 130566250c93SBram Moolenaar # comment 3 130666250c93SBram Moolenaar 130766250c93SBram Moolenaar five 130866250c93SBram Moolenaar # comment 6 130966250c93SBram Moolenaar END 131066250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1311b209750bSBram Moolenaarenddef 1312b209750bSBram Moolenaar 13132a1381c3SBram Moolenaarif has('channel') 131440ee466cSBram Moolenaar let someJob = test_null_job() 131540ee466cSBram Moolenaar 131640ee466cSBram Moolenaar def FuncWithError() 131740ee466cSBram Moolenaar echomsg g:someJob 131840ee466cSBram Moolenaar enddef 131940ee466cSBram Moolenaar 132040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 132140ee466cSBram Moolenaar try 132240ee466cSBram Moolenaar call FuncWithError() 132340ee466cSBram Moolenaar catch 132440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 132540ee466cSBram Moolenaar endtry 132640ee466cSBram Moolenaar endfunc 13272a1381c3SBram Moolenaarendif 132840ee466cSBram Moolenaar 13298a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 13308a7d6542SBram Moolenaar vim9script 13318a7d6542SBram Moolenaar let name: string = 'bob' 13328a7d6542SBram Moolenaar def Concat(arg: string): string 13338a7d6542SBram Moolenaar return name .. arg 13348a7d6542SBram Moolenaar enddef 1335227a69deSBram Moolenaar g:result = Concat('bie') 1336227a69deSBram Moolenaar g:localname = name 13378a7d6542SBram Moolenaar 13388a7d6542SBram Moolenaar export const CONST = 1234 13398a7d6542SBram Moolenaar export let exported = 9876 13406e587dcbSBram Moolenaar export let exp_name = 'John' 13418a7d6542SBram Moolenaar export def Exported(): string 13428a7d6542SBram Moolenaar return 'Exported' 13438a7d6542SBram Moolenaar enddef 13448a7d6542SBram MoolenaarEND 13458a7d6542SBram Moolenaar 1346b3ca9824SBram Moolenaardef Undo_export_script_lines() 1347b3ca9824SBram Moolenaar unlet g:result 1348b3ca9824SBram Moolenaar unlet g:localname 1349b3ca9824SBram Moolenaarenddef 1350b3ca9824SBram Moolenaar 13515269bd2aSBram Moolenaardef Test_vim9_import_export() 13528a7d6542SBram Moolenaar let import_script_lines =<< trim END 13538a7d6542SBram Moolenaar vim9script 13548a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 13558a7d6542SBram Moolenaar g:imported = exported 13566e587dcbSBram Moolenaar exported += 3 13576e587dcbSBram Moolenaar g:imported_added = exported 13588a7d6542SBram Moolenaar g:imported_func = Exported() 13596e587dcbSBram Moolenaar 136040f4f7a4SBram Moolenaar def GetExported(): string 136140f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 136240f4f7a4SBram Moolenaar return local_dict.ref() 136340f4f7a4SBram Moolenaar enddef 136440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 136540f4f7a4SBram Moolenaar 13666e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 13676e587dcbSBram Moolenaar g:imported_name = exp_name 13686e587dcbSBram Moolenaar exp_name ..= ' Doe' 13696e587dcbSBram Moolenaar g:imported_name_appended = exp_name 13705381c7a1SBram Moolenaar g:imported_later = exported 13718a7d6542SBram Moolenaar END 13728a7d6542SBram Moolenaar 13738a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 13748a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 13758a7d6542SBram Moolenaar 13768a7d6542SBram Moolenaar source Ximport.vim 13778a7d6542SBram Moolenaar 13788a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 13798a7d6542SBram Moolenaar assert_equal('bob', g:localname) 13808a7d6542SBram Moolenaar assert_equal(9876, g:imported) 13816e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 13825381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 13838a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 138440f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 13856e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 13866e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 13878a7d6542SBram Moolenaar assert_false(exists('g:name')) 13888a7d6542SBram Moolenaar 1389b3ca9824SBram Moolenaar Undo_export_script_lines() 13908a7d6542SBram Moolenaar unlet g:imported 13916e587dcbSBram Moolenaar unlet g:imported_added 13925381c7a1SBram Moolenaar unlet g:imported_later 13938a7d6542SBram Moolenaar unlet g:imported_func 13946e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 13958a7d6542SBram Moolenaar delete('Ximport.vim') 1396f2d5c240SBram Moolenaar 13971c991144SBram Moolenaar # similar, with line breaks 13981c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 13991c991144SBram Moolenaar vim9script 14001c991144SBram Moolenaar import { 14011c991144SBram Moolenaar exported, 14021c991144SBram Moolenaar Exported, 14031c991144SBram Moolenaar } 14041c991144SBram Moolenaar from 14051c991144SBram Moolenaar './Xexport.vim' 14061c991144SBram Moolenaar g:imported = exported 14071c991144SBram Moolenaar exported += 5 14081c991144SBram Moolenaar g:imported_added = exported 14091c991144SBram Moolenaar g:imported_func = Exported() 14101c991144SBram Moolenaar END 14111c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 14121c991144SBram Moolenaar source Ximport_lbr.vim 14131c991144SBram Moolenaar 14141c991144SBram Moolenaar assert_equal(9876, g:imported) 14151c991144SBram Moolenaar assert_equal(9881, g:imported_added) 14161c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 14171c991144SBram Moolenaar 14181c991144SBram Moolenaar # exported script not sourced again 14191c991144SBram Moolenaar assert_false(exists('g:result')) 14201c991144SBram Moolenaar unlet g:imported 14211c991144SBram Moolenaar unlet g:imported_added 14221c991144SBram Moolenaar unlet g:imported_func 14231c991144SBram Moolenaar delete('Ximport_lbr.vim') 14241c991144SBram Moolenaar 14251c991144SBram Moolenaar # import inside :def function 14265381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 14275381c7a1SBram Moolenaar vim9script 14285381c7a1SBram Moolenaar def ImportInDef() 14295381c7a1SBram Moolenaar import exported from './Xexport.vim' 14305381c7a1SBram Moolenaar g:imported = exported 14315381c7a1SBram Moolenaar exported += 7 14325381c7a1SBram Moolenaar g:imported_added = exported 14335381c7a1SBram Moolenaar enddef 14345381c7a1SBram Moolenaar ImportInDef() 14355381c7a1SBram Moolenaar END 14365381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 14375381c7a1SBram Moolenaar source Ximport2.vim 1438f5be8cdbSBram Moolenaar # TODO: this should be 9879 14395381c7a1SBram Moolenaar assert_equal(9876, g:imported) 14405381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 14415381c7a1SBram Moolenaar unlet g:imported 14425381c7a1SBram Moolenaar unlet g:imported_added 14435381c7a1SBram Moolenaar delete('Ximport2.vim') 14445381c7a1SBram Moolenaar 1445f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1446f2d5c240SBram Moolenaar vim9script 1447f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1448f2d5c240SBram Moolenaar def UseExport() 1449f2d5c240SBram Moolenaar g:imported = Export.exported 1450f2d5c240SBram Moolenaar enddef 1451f2d5c240SBram Moolenaar UseExport() 1452f2d5c240SBram Moolenaar END 1453f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1454f2d5c240SBram Moolenaar source Ximport.vim 14555381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1456f2d5c240SBram Moolenaar 1457599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1458599c89c8SBram Moolenaar vim9script 1459599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1460599c89c8SBram Moolenaar def Func() 1461599c89c8SBram Moolenaar let dummy = 1 1462599c89c8SBram Moolenaar let imported = Export + dummy 1463599c89c8SBram Moolenaar enddef 1464822ba247SBram Moolenaar defcompile 1465599c89c8SBram Moolenaar END 1466599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 146744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1468599c89c8SBram Moolenaar 1469599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1470599c89c8SBram Moolenaar vim9script 1471599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1472599c89c8SBram Moolenaar def Func() 1473599c89c8SBram Moolenaar let imported = Export . exported 1474599c89c8SBram Moolenaar enddef 1475822ba247SBram Moolenaar defcompile 1476599c89c8SBram Moolenaar END 1477599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 147844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1479599c89c8SBram Moolenaar 1480599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1481599c89c8SBram Moolenaar vim9script 1482599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1483599c89c8SBram Moolenaar def Func() 1484599c89c8SBram Moolenaar let imported = Export. 1485599c89c8SBram Moolenaar enddef 1486822ba247SBram Moolenaar defcompile 1487599c89c8SBram Moolenaar END 1488599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 148944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1490599c89c8SBram Moolenaar 14911c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 14921c991144SBram Moolenaar vim9script 14931c991144SBram Moolenaar import * 14941c991144SBram Moolenaar as Export 14951c991144SBram Moolenaar from 14961c991144SBram Moolenaar './Xexport.vim' 14971c991144SBram Moolenaar def UseExport() 14981c991144SBram Moolenaar g:imported = Export.exported 14991c991144SBram Moolenaar enddef 15001c991144SBram Moolenaar UseExport() 15011c991144SBram Moolenaar END 15021c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 15031c991144SBram Moolenaar source Ximport.vim 15041c991144SBram Moolenaar assert_equal(9883, g:imported) 15051c991144SBram Moolenaar 1506f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1507f2d5c240SBram Moolenaar vim9script 1508f2d5c240SBram Moolenaar import * from './Xexport.vim' 1509f2d5c240SBram Moolenaar END 1510f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 151144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1512f2d5c240SBram Moolenaar 1513f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1514fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1515fa29c8abSBram Moolenaar vim9script 1516fa29c8abSBram Moolenaar import name from './Xexport.vim' 1517fa29c8abSBram Moolenaar END 1518fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 151944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1520fa29c8abSBram Moolenaar 1521f5be8cdbSBram Moolenaar # try to import something that is already defined 15225269bd2aSBram Moolenaar let import_already_defined =<< trim END 15235269bd2aSBram Moolenaar vim9script 15245269bd2aSBram Moolenaar let exported = 'something' 15255269bd2aSBram Moolenaar import exported from './Xexport.vim' 15265269bd2aSBram Moolenaar END 15275269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 152844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15295269bd2aSBram Moolenaar 1530f5be8cdbSBram Moolenaar # try to import something that is already defined 15315269bd2aSBram Moolenaar import_already_defined =<< trim END 15325269bd2aSBram Moolenaar vim9script 15335269bd2aSBram Moolenaar let exported = 'something' 15345269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 15355269bd2aSBram Moolenaar END 15365269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 153744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15385269bd2aSBram Moolenaar 1539f5be8cdbSBram Moolenaar # try to import something that is already defined 15405269bd2aSBram Moolenaar import_already_defined =<< trim END 15415269bd2aSBram Moolenaar vim9script 15425269bd2aSBram Moolenaar let exported = 'something' 15435269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 15445269bd2aSBram Moolenaar END 15455269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 154644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15475269bd2aSBram Moolenaar 1548f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1549fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1550fa29c8abSBram Moolenaar vim9script 1551fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1552fa29c8abSBram Moolenaar END 1553fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 155444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1555fa29c8abSBram Moolenaar 1556fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1557fa29c8abSBram Moolenaar vim9script 1558fa29c8abSBram Moolenaar import name './Xexport.vim' 1559fa29c8abSBram Moolenaar END 1560fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 156144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1562fa29c8abSBram Moolenaar 1563fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1564fa29c8abSBram Moolenaar vim9script 1565fa29c8abSBram Moolenaar import name from Xexport.vim 1566fa29c8abSBram Moolenaar END 1567fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 156844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1569fa29c8abSBram Moolenaar 1570fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1571fa29c8abSBram Moolenaar vim9script 1572fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1573fa29c8abSBram Moolenaar END 1574fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 157544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1576fa29c8abSBram Moolenaar 1577fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1578fa29c8abSBram Moolenaar vim9script 1579fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1580fa29c8abSBram Moolenaar END 15815269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 158244d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1583fa29c8abSBram Moolenaar 1584f2d5c240SBram Moolenaar delete('Ximport.vim') 15855269bd2aSBram Moolenaar delete('Ximport3.vim') 15868a7d6542SBram Moolenaar delete('Xexport.vim') 15878a7d6542SBram Moolenaar 1588f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1589750802b5SBram Moolenaar set cpo&vi 1590750802b5SBram Moolenaar let cpo_before = &cpo 1591750802b5SBram Moolenaar let lines =<< trim END 1592750802b5SBram Moolenaar vim9script 1593750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1594750802b5SBram Moolenaar END 1595750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1596750802b5SBram Moolenaar source Xvim9_script 1597750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1598750802b5SBram Moolenaar set cpo&vim 1599750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1600750802b5SBram Moolenaar delete('Xvim9_script') 1601750802b5SBram Moolenaarenddef 1602750802b5SBram Moolenaar 1603803af686SBram Moolenaarfunc g:Trigger() 1604803af686SBram Moolenaar source Ximport.vim 1605803af686SBram Moolenaar return "echo 'yes'\<CR>" 1606803af686SBram Moolenaarendfunc 1607803af686SBram Moolenaar 1608803af686SBram Moolenaardef Test_import_export_expr_map() 1609803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1610803af686SBram Moolenaar let export_lines =<< trim END 1611803af686SBram Moolenaar vim9script 1612803af686SBram Moolenaar export def That(): string 1613803af686SBram Moolenaar return 'yes' 1614803af686SBram Moolenaar enddef 1615803af686SBram Moolenaar END 1616803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1617803af686SBram Moolenaar 1618803af686SBram Moolenaar let import_lines =<< trim END 1619803af686SBram Moolenaar vim9script 1620803af686SBram Moolenaar import That from './Xexport_that.vim' 1621803af686SBram Moolenaar assert_equal('yes', That()) 1622803af686SBram Moolenaar END 1623803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1624803af686SBram Moolenaar 1625803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1626803af686SBram Moolenaar feedkeys('trigger', "xt") 1627803af686SBram Moolenaar 1628730b2483SBram Moolenaar delete('Xexport_that.vim') 1629803af686SBram Moolenaar delete('Ximport.vim') 1630803af686SBram Moolenaar nunmap trigger 1631803af686SBram Moolenaarenddef 1632803af686SBram Moolenaar 16338e1986e3SBram Moolenaardef Test_import_in_filetype() 16348e1986e3SBram Moolenaar # check that :import works when the buffer is locked 16358e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 16368e1986e3SBram Moolenaar let export_lines =<< trim END 16378e1986e3SBram Moolenaar vim9script 16388e1986e3SBram Moolenaar export let That = 'yes' 16398e1986e3SBram Moolenaar END 1640730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 16418e1986e3SBram Moolenaar 16428e1986e3SBram Moolenaar let import_lines =<< trim END 16438e1986e3SBram Moolenaar vim9script 1644730b2483SBram Moolenaar import That from './Xexport_ft.vim' 16458e1986e3SBram Moolenaar assert_equal('yes', That) 16468e1986e3SBram Moolenaar g:did_load_mytpe = 1 16478e1986e3SBram Moolenaar END 16488e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 16498e1986e3SBram Moolenaar 16508e1986e3SBram Moolenaar let save_rtp = &rtp 16518e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 16528e1986e3SBram Moolenaar 16538e1986e3SBram Moolenaar filetype plugin on 16548e1986e3SBram Moolenaar copen 16558e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 16568e1986e3SBram Moolenaar 16578e1986e3SBram Moolenaar quit! 1658730b2483SBram Moolenaar delete('Xexport_ft.vim') 16598e1986e3SBram Moolenaar delete('ftplugin', 'rf') 16608e1986e3SBram Moolenaar &rtp = save_rtp 16618e1986e3SBram Moolenaarenddef 16628e1986e3SBram Moolenaar 1663efa94447SBram Moolenaardef Test_use_import_in_mapping() 1664efa94447SBram Moolenaar let lines =<< trim END 1665efa94447SBram Moolenaar vim9script 1666efa94447SBram Moolenaar export def Funcx() 1667efa94447SBram Moolenaar g:result = 42 1668efa94447SBram Moolenaar enddef 1669efa94447SBram Moolenaar END 1670efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1671efa94447SBram Moolenaar lines =<< trim END 1672efa94447SBram Moolenaar vim9script 1673efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1674b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1675efa94447SBram Moolenaar END 1676efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1677efa94447SBram Moolenaar 1678efa94447SBram Moolenaar source Xmapscript.vim 1679b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1680efa94447SBram Moolenaar assert_equal(42, g:result) 1681efa94447SBram Moolenaar 1682efa94447SBram Moolenaar unlet g:result 1683efa94447SBram Moolenaar delete('XsomeExport.vim') 1684efa94447SBram Moolenaar delete('Xmapscript.vim') 1685b3ca9824SBram Moolenaar nunmap <F3> 1686efa94447SBram Moolenaarenddef 1687efa94447SBram Moolenaar 1688750802b5SBram Moolenaardef Test_vim9script_fails() 16898a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16908a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1691750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 16929721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 16939b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1694750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1695750802b5SBram Moolenaar 1696451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1697c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1698c785b9a7SBram Moolenaar 1699e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1700e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 17018a7d6542SBram Moolenaarenddef 17028a7d6542SBram Moolenaar 1703f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1704101f4810SBram Moolenaar CheckRunVimInTerminal 1705101f4810SBram Moolenaar 17069bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1707c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 17089bb3eb3eSBram Moolenaarendfunc 17099bb3eb3eSBram Moolenaar 1710c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1711101f4810SBram Moolenaar let export =<< trim END 1712101f4810SBram Moolenaar vim9script 1713101f4810SBram Moolenaar export def Foo(): number 1714101f4810SBram Moolenaar return 0 1715101f4810SBram Moolenaar enddef 1716101f4810SBram Moolenaar END 1717730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1718101f4810SBram Moolenaar 1719730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 17209bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 17219bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1722101f4810SBram Moolenaar 1723730b2483SBram Moolenaar delete('XexportCmd.vim') 17249bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 17259bb3eb3eSBram Moolenaarenddef 1726101f4810SBram Moolenaar 17274c17ad94SBram Moolenaardef Test_vim9script_reload_import() 17288a7d6542SBram Moolenaar let lines =<< trim END 17298a7d6542SBram Moolenaar vim9script 17308a7d6542SBram Moolenaar const var = '' 17318a7d6542SBram Moolenaar let valone = 1234 17328a7d6542SBram Moolenaar def MyFunc(arg: string) 17338a7d6542SBram Moolenaar valone = 5678 17348a7d6542SBram Moolenaar enddef 17358a7d6542SBram Moolenaar END 17368a7d6542SBram Moolenaar let morelines =<< trim END 17378a7d6542SBram Moolenaar let valtwo = 222 17388a7d6542SBram Moolenaar export def GetValtwo(): number 17398a7d6542SBram Moolenaar return valtwo 17408a7d6542SBram Moolenaar enddef 17418a7d6542SBram Moolenaar END 174203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17438a7d6542SBram Moolenaar source Xreload.vim 17448a7d6542SBram Moolenaar source Xreload.vim 17458a7d6542SBram Moolenaar source Xreload.vim 17468a7d6542SBram Moolenaar 17478a7d6542SBram Moolenaar let testlines =<< trim END 17488a7d6542SBram Moolenaar vim9script 17498a7d6542SBram Moolenaar def TheFunc() 17508a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 17518a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 17528a7d6542SBram Moolenaar enddef 17538a7d6542SBram Moolenaar TheFunc() 17548a7d6542SBram Moolenaar END 17558a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 17568a7d6542SBram Moolenaar source Ximport.vim 17578a7d6542SBram Moolenaar 1758f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1759f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 17608a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 17618a7d6542SBram Moolenaar source Ximport.vim 17628a7d6542SBram Moolenaar 1763f5be8cdbSBram Moolenaar # cannot declare a var twice 17648a7d6542SBram Moolenaar lines =<< trim END 17658a7d6542SBram Moolenaar vim9script 17668a7d6542SBram Moolenaar let valone = 1234 17678a7d6542SBram Moolenaar let valone = 5678 17688a7d6542SBram Moolenaar END 17698a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 177044d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17718a7d6542SBram Moolenaar 17728a7d6542SBram Moolenaar delete('Xreload.vim') 17738a7d6542SBram Moolenaar delete('Ximport.vim') 17748a7d6542SBram Moolenaarenddef 17758a7d6542SBram Moolenaar 177695006e3dSBram Moolenaardef s:RetSome(): string 177795006e3dSBram Moolenaar return 'some' 177895006e3dSBram Moolenaarenddef 177995006e3dSBram Moolenaar 1780fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1781fe465a01SBram Moolenaar" script-local name. 1782fe465a01SBram Moolenaardef Test_vim9script_funcref() 1783fe465a01SBram Moolenaar let sortlines =<< trim END 1784fe465a01SBram Moolenaar vim9script 1785fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1786bed36b93SBram Moolenaar return i2 - i1 1787fe465a01SBram Moolenaar enddef 1788fe465a01SBram Moolenaar 1789fe465a01SBram Moolenaar export def FastSort(): list<number> 1790fe465a01SBram Moolenaar return range(5)->sort(Compare) 1791fe465a01SBram Moolenaar enddef 1792fe465a01SBram Moolenaar END 1793fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1794fe465a01SBram Moolenaar 1795fe465a01SBram Moolenaar let lines =<< trim END 1796fe465a01SBram Moolenaar vim9script 1797fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1798fe465a01SBram Moolenaar def Test() 1799fe465a01SBram Moolenaar g:result = FastSort() 1800fe465a01SBram Moolenaar enddef 1801fe465a01SBram Moolenaar Test() 1802fe465a01SBram Moolenaar END 1803fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1804fe465a01SBram Moolenaar 1805fe465a01SBram Moolenaar source Xscript.vim 1806fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1807fe465a01SBram Moolenaar 1808fe465a01SBram Moolenaar unlet g:result 1809fe465a01SBram Moolenaar delete('Xsort.vim') 1810fe465a01SBram Moolenaar delete('Xscript.vim') 181195006e3dSBram Moolenaar 181295006e3dSBram Moolenaar let Funcref = function('s:RetSome') 181395006e3dSBram Moolenaar assert_equal('some', Funcref()) 1814fe465a01SBram Moolenaarenddef 1815fe465a01SBram Moolenaar 1816601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1817601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1818601e76acSBram Moolenaar" function reference. 1819c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1820c620c055SBram Moolenaar let filterLines =<< trim END 1821c620c055SBram Moolenaar vim9script 1822c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1823c620c055SBram Moolenaar return idx % 2 == 1 1824c620c055SBram Moolenaar enddef 1825c620c055SBram Moolenaar export def FastFilter(): list<number> 1826c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1827c620c055SBram Moolenaar enddef 1828601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1829601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1830601e76acSBram Moolenaar enddef 1831c620c055SBram Moolenaar END 1832c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1833c620c055SBram Moolenaar 1834c620c055SBram Moolenaar let lines =<< trim END 1835c620c055SBram Moolenaar vim9script 1836601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1837c620c055SBram Moolenaar def Test() 1838c620c055SBram Moolenaar let x: list<number> = FastFilter() 1839c620c055SBram Moolenaar enddef 1840c620c055SBram Moolenaar Test() 1841601e76acSBram Moolenaar def TestDirect() 1842601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1843601e76acSBram Moolenaar enddef 1844601e76acSBram Moolenaar TestDirect() 1845c620c055SBram Moolenaar END 1846601e76acSBram Moolenaar CheckScriptSuccess(lines) 1847c620c055SBram Moolenaar delete('Xfilter.vim') 1848c620c055SBram Moolenaarenddef 1849c620c055SBram Moolenaar 18504c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 18514c17ad94SBram Moolenaar let first_lines =<< trim END 18524c17ad94SBram Moolenaar vim9script 18534c17ad94SBram Moolenaar def FuncYes(): string 18544c17ad94SBram Moolenaar return 'yes' 18554c17ad94SBram Moolenaar enddef 18564c17ad94SBram Moolenaar END 185703afdcf1SBram Moolenaar let withno_lines =<< trim END 18584c17ad94SBram Moolenaar def FuncNo(): string 18594c17ad94SBram Moolenaar return 'no' 18604c17ad94SBram Moolenaar enddef 18614c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 18624c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 18634c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 186403afdcf1SBram Moolenaar enddef 186503afdcf1SBram Moolenaar END 186603afdcf1SBram Moolenaar let nono_lines =<< trim END 186703afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 186803afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 186944d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 18704c17ad94SBram Moolenaar enddef 18714c17ad94SBram Moolenaar END 18724c17ad94SBram Moolenaar 18734c17ad94SBram Moolenaar # FuncNo() is defined 187403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18754c17ad94SBram Moolenaar source Xreloaded.vim 18764c17ad94SBram Moolenaar g:DoCheck(true) 18774c17ad94SBram Moolenaar 18784c17ad94SBram Moolenaar # FuncNo() is not redefined 187903afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18804c17ad94SBram Moolenaar source Xreloaded.vim 188103afdcf1SBram Moolenaar g:DoCheck() 18824c17ad94SBram Moolenaar 18834c17ad94SBram Moolenaar # FuncNo() is back 188403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18854c17ad94SBram Moolenaar source Xreloaded.vim 188603afdcf1SBram Moolenaar g:DoCheck() 18874c17ad94SBram Moolenaar 18884c17ad94SBram Moolenaar delete('Xreloaded.vim') 18894c17ad94SBram Moolenaarenddef 18904c17ad94SBram Moolenaar 189189483d40SBram Moolenaardef Test_vim9script_reload_delvar() 189289483d40SBram Moolenaar # write the script with a script-local variable 189389483d40SBram Moolenaar let lines =<< trim END 189489483d40SBram Moolenaar vim9script 189589483d40SBram Moolenaar let var = 'string' 189689483d40SBram Moolenaar END 189789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 189889483d40SBram Moolenaar source XreloadVar.vim 189989483d40SBram Moolenaar 190089483d40SBram Moolenaar # now write the script using the same variable locally - works 190189483d40SBram Moolenaar lines =<< trim END 190289483d40SBram Moolenaar vim9script 190389483d40SBram Moolenaar def Func() 190489483d40SBram Moolenaar let var = 'string' 190589483d40SBram Moolenaar enddef 190689483d40SBram Moolenaar END 190789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 190889483d40SBram Moolenaar source XreloadVar.vim 190989483d40SBram Moolenaar 191089483d40SBram Moolenaar delete('XreloadVar.vim') 191189483d40SBram Moolenaarenddef 191289483d40SBram Moolenaar 19138a7d6542SBram Moolenaardef Test_import_absolute() 19148a7d6542SBram Moolenaar let import_lines = [ 1915e6085c53SBram Moolenaar 'vim9script', 1916e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1917e6085c53SBram Moolenaar 'def UseExported()', 1918e6085c53SBram Moolenaar ' g:imported_abs = exported', 1919e6085c53SBram Moolenaar ' exported = 8888', 1920e6085c53SBram Moolenaar ' g:imported_after = exported', 1921e6085c53SBram Moolenaar 'enddef', 1922e6085c53SBram Moolenaar 'UseExported()', 1923e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1924e6085c53SBram Moolenaar ] 19258a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19268a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19278a7d6542SBram Moolenaar 19288a7d6542SBram Moolenaar source Ximport_abs.vim 19298a7d6542SBram Moolenaar 19308a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19314e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1932675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1933675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1934675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1935675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1936675f716eSBram Moolenaar 'exported = 8888.*' .. 1937675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1938675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1939675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1940675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1941e6085c53SBram Moolenaar g:import_disassembled) 1942b3ca9824SBram Moolenaar 1943b3ca9824SBram Moolenaar Undo_export_script_lines() 19448a7d6542SBram Moolenaar unlet g:imported_abs 19454e12a5dfSBram Moolenaar unlet g:import_disassembled 19468a7d6542SBram Moolenaar 19478a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19488a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19498a7d6542SBram Moolenaarenddef 19508a7d6542SBram Moolenaar 19518a7d6542SBram Moolenaardef Test_import_rtp() 19528a7d6542SBram Moolenaar let import_lines = [ 1953e6085c53SBram Moolenaar 'vim9script', 1954e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1955e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1956e6085c53SBram Moolenaar ] 19578a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 19588a7d6542SBram Moolenaar mkdir('import') 19598a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 19608a7d6542SBram Moolenaar 19618a7d6542SBram Moolenaar let save_rtp = &rtp 19628a7d6542SBram Moolenaar &rtp = getcwd() 19638a7d6542SBram Moolenaar source Ximport_rtp.vim 19648a7d6542SBram Moolenaar &rtp = save_rtp 19658a7d6542SBram Moolenaar 19668a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 19678a7d6542SBram Moolenaar 1968b3ca9824SBram Moolenaar Undo_export_script_lines() 1969b3ca9824SBram Moolenaar unlet g:imported_rtp 19708a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 197189483d40SBram Moolenaar delete('import', 'rf') 19728a7d6542SBram Moolenaarenddef 19738a7d6542SBram Moolenaar 197425e0f586SBram Moolenaardef Test_import_compile_error() 197525e0f586SBram Moolenaar let export_lines = [ 197625e0f586SBram Moolenaar 'vim9script', 197725e0f586SBram Moolenaar 'export def ExpFunc(): string', 197825e0f586SBram Moolenaar ' return notDefined', 197925e0f586SBram Moolenaar 'enddef', 198025e0f586SBram Moolenaar ] 198125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 198225e0f586SBram Moolenaar 198325e0f586SBram Moolenaar let import_lines = [ 198425e0f586SBram Moolenaar 'vim9script', 198525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 198625e0f586SBram Moolenaar 'def ImpFunc()', 198725e0f586SBram Moolenaar ' echo ExpFunc()', 198825e0f586SBram Moolenaar 'enddef', 198925e0f586SBram Moolenaar 'defcompile', 199025e0f586SBram Moolenaar ] 199125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 199225e0f586SBram Moolenaar 199325e0f586SBram Moolenaar try 199425e0f586SBram Moolenaar source Ximport.vim 199525e0f586SBram Moolenaar catch /E1001/ 1996f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 19977707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 199825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 199925e0f586SBram Moolenaar endtry 200025e0f586SBram Moolenaar 200125e0f586SBram Moolenaar delete('Xexported.vim') 200225e0f586SBram Moolenaar delete('Ximport.vim') 200325e0f586SBram Moolenaarenddef 200425e0f586SBram Moolenaar 2005c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2006c4ce36d4SBram Moolenaar let lines = [ 2007c4ce36d4SBram Moolenaar 'vim9script', 2008c4ce36d4SBram Moolenaar 'def Func()', 2009c4ce36d4SBram Moolenaar ' eval [][0]', 2010c4ce36d4SBram Moolenaar 'enddef', 2011c4ce36d4SBram Moolenaar 'Func()', 2012c4ce36d4SBram Moolenaar ] 2013c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2014c4ce36d4SBram Moolenaar 2015c4ce36d4SBram Moolenaar for count in range(3) 2016c4ce36d4SBram Moolenaar try 2017c4ce36d4SBram Moolenaar source Xtestscript.vim 2018c4ce36d4SBram Moolenaar catch /E684/ 2019c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2020c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2021c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2022c4ce36d4SBram Moolenaar endtry 2023c4ce36d4SBram Moolenaar endfor 2024c4ce36d4SBram Moolenaar 2025c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2026c4ce36d4SBram Moolenaarenddef 2027c4ce36d4SBram Moolenaar 2028eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2029eef2102eSBram Moolenaar let export_lines =<< trim END 2030eef2102eSBram Moolenaar vim9script 2031eef2102eSBram Moolenaar export def Func() 2032eef2102eSBram Moolenaar echo 'imported' 2033eef2102eSBram Moolenaar enddef 2034eef2102eSBram Moolenaar END 2035eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2036eef2102eSBram Moolenaar 2037eef2102eSBram Moolenaar let lines =<< trim END 2038eef2102eSBram Moolenaar vim9script 2039eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2040eef2102eSBram Moolenaar def Func() 2041eef2102eSBram Moolenaar echo 'local to function' 2042eef2102eSBram Moolenaar enddef 2043eef2102eSBram Moolenaar END 2044eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2045eef2102eSBram Moolenaar 2046eef2102eSBram Moolenaar lines =<< trim END 2047eef2102eSBram Moolenaar vim9script 2048eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2049eef2102eSBram Moolenaar def Outer() 2050eef2102eSBram Moolenaar def Func() 2051eef2102eSBram Moolenaar echo 'local to function' 2052eef2102eSBram Moolenaar enddef 2053eef2102eSBram Moolenaar enddef 2054eef2102eSBram Moolenaar defcompile 2055eef2102eSBram Moolenaar END 2056eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2057eef2102eSBram Moolenaar 2058eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2059eef2102eSBram Moolenaarenddef 2060eef2102eSBram Moolenaar 2061b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2062b9a2cac3SBram Moolenaar let lines =<< trim END 2063b9a2cac3SBram Moolenaar vim9script 2064b9a2cac3SBram Moolenaar def Func() 2065b9a2cac3SBram Moolenaar echo 'one' 2066b9a2cac3SBram Moolenaar enddef 2067b9a2cac3SBram Moolenaar def Func() 2068b9a2cac3SBram Moolenaar echo 'two' 2069b9a2cac3SBram Moolenaar enddef 2070b9a2cac3SBram Moolenaar END 2071b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2072fa211f3cSBram Moolenaar 2073fa211f3cSBram Moolenaar lines =<< trim END 2074fa211f3cSBram Moolenaar vim9script 2075fa211f3cSBram Moolenaar def Foo(): string 2076fa211f3cSBram Moolenaar return 'foo' 2077fa211f3cSBram Moolenaar enddef 2078fa211f3cSBram Moolenaar def Func() 2079fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 2080fa211f3cSBram Moolenaar enddef 2081fa211f3cSBram Moolenaar defcompile 2082fa211f3cSBram Moolenaar END 2083fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2084b9a2cac3SBram Moolenaarenddef 2085b9a2cac3SBram Moolenaar 20868a7d6542SBram Moolenaardef Test_fixed_size_list() 2087f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 20888a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 20898a7d6542SBram Moolenaar l->remove(0) 20908a7d6542SBram Moolenaar l->add(5) 20918a7d6542SBram Moolenaar l->insert(99, 1) 20920f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20938a7d6542SBram Moolenaarenddef 20948a7d6542SBram Moolenaar 2095ae616494SBram Moolenaardef Test_no_insert_xit() 2096d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2097d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2098d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2099d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2100d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2101ae616494SBram Moolenaar 2102ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2103ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2104ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2105ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2106f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2107f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 2108f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2109f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2110f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2111ae616494SBram Moolenaarenddef 2112ae616494SBram Moolenaar 2113158906cfSBram Moolenaardef IfElse(what: number): string 2114158906cfSBram Moolenaar let res = '' 2115158906cfSBram Moolenaar if what == 1 2116158906cfSBram Moolenaar res = "one" 2117158906cfSBram Moolenaar elseif what == 2 2118158906cfSBram Moolenaar res = "two" 2119a259d8d3SBram Moolenaar else 2120158906cfSBram Moolenaar res = "three" 2121a259d8d3SBram Moolenaar endif 2122158906cfSBram Moolenaar return res 2123a259d8d3SBram Moolenaarenddef 2124a259d8d3SBram Moolenaar 2125158906cfSBram Moolenaardef Test_if_elseif_else() 2126158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2127158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2128158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21290f18b6d1SBram Moolenaarenddef 21300f18b6d1SBram Moolenaar 2131e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2132d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2133d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2134d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2135d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2136d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2137e8c4abbbSBram Moolenaarenddef 2138e8c4abbbSBram Moolenaar 21396d69bf60SBram Moolenaarlet g:bool_true = v:true 21406d69bf60SBram Moolenaarlet g:bool_false = v:false 21416d69bf60SBram Moolenaar 21426d69bf60SBram Moolenaardef Test_if_const_expr() 21436d69bf60SBram Moolenaar let res = false 21446d69bf60SBram Moolenaar if true ? true : false 21456d69bf60SBram Moolenaar res = true 21466d69bf60SBram Moolenaar endif 21476d69bf60SBram Moolenaar assert_equal(true, res) 21486d69bf60SBram Moolenaar 2149585fea7bSBram Moolenaar g:glob = 2 2150585fea7bSBram Moolenaar if false 21516797966dSBram Moolenaar execute('g:glob = 3') 2152585fea7bSBram Moolenaar endif 2153585fea7bSBram Moolenaar assert_equal(2, g:glob) 2154585fea7bSBram Moolenaar if true 21556797966dSBram Moolenaar execute('g:glob = 3') 2156585fea7bSBram Moolenaar endif 2157585fea7bSBram Moolenaar assert_equal(3, g:glob) 2158585fea7bSBram Moolenaar 21596d69bf60SBram Moolenaar res = false 21606d69bf60SBram Moolenaar if g:bool_true ? true : false 21616d69bf60SBram Moolenaar res = true 21626d69bf60SBram Moolenaar endif 21636d69bf60SBram Moolenaar assert_equal(true, res) 21646d69bf60SBram Moolenaar 21656d69bf60SBram Moolenaar res = false 21666d69bf60SBram Moolenaar if true ? g:bool_true : false 21676d69bf60SBram Moolenaar res = true 21686d69bf60SBram Moolenaar endif 21696d69bf60SBram Moolenaar assert_equal(true, res) 21706d69bf60SBram Moolenaar 21716d69bf60SBram Moolenaar res = false 21726d69bf60SBram Moolenaar if true ? true : g:bool_false 21736d69bf60SBram Moolenaar res = true 21746d69bf60SBram Moolenaar endif 21756d69bf60SBram Moolenaar assert_equal(true, res) 21766d69bf60SBram Moolenaar 21776d69bf60SBram Moolenaar res = false 21786d69bf60SBram Moolenaar if true ? false : true 21796d69bf60SBram Moolenaar res = true 21806d69bf60SBram Moolenaar endif 21816d69bf60SBram Moolenaar assert_equal(false, res) 21826d69bf60SBram Moolenaar 21836d69bf60SBram Moolenaar res = false 21846d69bf60SBram Moolenaar if false ? false : true 21856d69bf60SBram Moolenaar res = true 21866d69bf60SBram Moolenaar endif 21876d69bf60SBram Moolenaar assert_equal(true, res) 21886d69bf60SBram Moolenaar 21896d69bf60SBram Moolenaar res = false 21906d69bf60SBram Moolenaar if false ? true : false 21916d69bf60SBram Moolenaar res = true 21926d69bf60SBram Moolenaar endif 21936d69bf60SBram Moolenaar assert_equal(false, res) 21946d69bf60SBram Moolenaar 21956d69bf60SBram Moolenaar res = false 2196e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2197e8c4abbbSBram Moolenaar res = true 2198e8c4abbbSBram Moolenaar endif 2199e8c4abbbSBram Moolenaar assert_equal(false, res) 2200e8c4abbbSBram Moolenaar 2201e8c4abbbSBram Moolenaar res = false 22026d69bf60SBram Moolenaar if true && true 22036d69bf60SBram Moolenaar res = true 22046d69bf60SBram Moolenaar endif 22056d69bf60SBram Moolenaar assert_equal(true, res) 22066d69bf60SBram Moolenaar 22076d69bf60SBram Moolenaar res = false 22086d69bf60SBram Moolenaar if true && false 22096d69bf60SBram Moolenaar res = true 22106d69bf60SBram Moolenaar endif 22116d69bf60SBram Moolenaar assert_equal(false, res) 22126d69bf60SBram Moolenaar 22136d69bf60SBram Moolenaar res = false 22146d69bf60SBram Moolenaar if g:bool_true && false 22156d69bf60SBram Moolenaar res = true 22166d69bf60SBram Moolenaar endif 22176d69bf60SBram Moolenaar assert_equal(false, res) 22186d69bf60SBram Moolenaar 22196d69bf60SBram Moolenaar res = false 22206d69bf60SBram Moolenaar if true && g:bool_false 22216d69bf60SBram Moolenaar res = true 22226d69bf60SBram Moolenaar endif 22236d69bf60SBram Moolenaar assert_equal(false, res) 22246d69bf60SBram Moolenaar 22256d69bf60SBram Moolenaar res = false 22266d69bf60SBram Moolenaar if false && false 22276d69bf60SBram Moolenaar res = true 22286d69bf60SBram Moolenaar endif 22296d69bf60SBram Moolenaar assert_equal(false, res) 22306d69bf60SBram Moolenaar 22316d69bf60SBram Moolenaar res = false 22326d69bf60SBram Moolenaar if true || false 22336d69bf60SBram Moolenaar res = true 22346d69bf60SBram Moolenaar endif 22356d69bf60SBram Moolenaar assert_equal(true, res) 22366d69bf60SBram Moolenaar 22376d69bf60SBram Moolenaar res = false 22386d69bf60SBram Moolenaar if g:bool_true || false 22396d69bf60SBram Moolenaar res = true 22406d69bf60SBram Moolenaar endif 22416d69bf60SBram Moolenaar assert_equal(true, res) 22426d69bf60SBram Moolenaar 22436d69bf60SBram Moolenaar res = false 22446d69bf60SBram Moolenaar if true || g:bool_false 22456d69bf60SBram Moolenaar res = true 22466d69bf60SBram Moolenaar endif 22476d69bf60SBram Moolenaar assert_equal(true, res) 22486d69bf60SBram Moolenaar 22496d69bf60SBram Moolenaar res = false 22506d69bf60SBram Moolenaar if false || false 22516d69bf60SBram Moolenaar res = true 22526d69bf60SBram Moolenaar endif 22536d69bf60SBram Moolenaar assert_equal(false, res) 22543988f64fSBram Moolenaar 22553988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 22563988f64fSBram Moolenaar if false | eval 0 | endif 22573988f64fSBram Moolenaar if false | eval burp + 234 | endif 22583988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22593988f64fSBram Moolenaar if false 22603988f64fSBram Moolenaar burp 22613988f64fSBram Moolenaar endif 226280c34ca3SBram Moolenaarenddef 22636d69bf60SBram Moolenaar 226480c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2265d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2266d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2267d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2268d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 22696d69bf60SBram Moolenaarenddef 22706d69bf60SBram Moolenaar 227172abcf42SBram Moolenaardef RunNested(i: number): number 227272abcf42SBram Moolenaar let x: number = 0 227372abcf42SBram Moolenaar if i % 2 227472abcf42SBram Moolenaar if 1 2275f5be8cdbSBram Moolenaar # comment 227672abcf42SBram Moolenaar else 2277f5be8cdbSBram Moolenaar # comment 227872abcf42SBram Moolenaar endif 227972abcf42SBram Moolenaar x += 1 228072abcf42SBram Moolenaar else 228172abcf42SBram Moolenaar x += 1000 228272abcf42SBram Moolenaar endif 228372abcf42SBram Moolenaar return x 228472abcf42SBram Moolenaarenddef 228572abcf42SBram Moolenaar 228672abcf42SBram Moolenaardef Test_nested_if() 228772abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 228872abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 228972abcf42SBram Moolenaarenddef 229072abcf42SBram Moolenaar 2291ad39c094SBram Moolenaardef Test_execute_cmd() 2292ad39c094SBram Moolenaar new 2293ad39c094SBram Moolenaar setline(1, 'default') 2294d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2295ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2296a72cfb80SBram Moolenaar 2297d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2298a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2299a72cfb80SBram Moolenaar 2300d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2301ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2302a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2303ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2304a72cfb80SBram Moolenaar 2305d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2306ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2307a72cfb80SBram Moolenaar 2308ad39c094SBram Moolenaar let cmd_first = 'call ' 2309ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2310ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2311ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2312ad39c094SBram Moolenaar bwipe! 2313585fea7bSBram Moolenaar 23142d6b20d6SBram Moolenaar let n = true 23152d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23162d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23172d6b20d6SBram Moolenaar 2318e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2319e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2320e5abf7afSBram Moolenaar 2321d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2322d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2323d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2324ad39c094SBram Moolenaarenddef 2325ad39c094SBram Moolenaar 232647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2327f5be8cdbSBram Moolenaar # only checks line continuation 232847e880d6SBram Moolenaar let lines =<< trim END 232947e880d6SBram Moolenaar vim9script 233047e880d6SBram Moolenaar execute 'g:someVar' 233147e880d6SBram Moolenaar .. ' = ' .. 233247e880d6SBram Moolenaar '28' 233347e880d6SBram Moolenaar assert_equal(28, g:someVar) 233447e880d6SBram Moolenaar unlet g:someVar 233547e880d6SBram Moolenaar END 233647e880d6SBram Moolenaar CheckScriptSuccess(lines) 233747e880d6SBram Moolenaarenddef 233847e880d6SBram Moolenaar 2339ad39c094SBram Moolenaardef Test_echo_cmd() 2340a72cfb80SBram Moolenaar echo 'some' # comment 2341585fea7bSBram Moolenaar echon 'thing' 2342ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2343ad39c094SBram Moolenaar 2344a72cfb80SBram Moolenaar echo "some" # comment 2345a72cfb80SBram Moolenaar echon "thing" 2346a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2347a72cfb80SBram Moolenaar 2348ad39c094SBram Moolenaar let str1 = 'some' 2349ad39c094SBram Moolenaar let str2 = 'more' 2350ad39c094SBram Moolenaar echo str1 str2 2351ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2352a72cfb80SBram Moolenaar 2353d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2354ad39c094SBram Moolenaarenddef 2355ad39c094SBram Moolenaar 2356f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2357f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2358f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2359f93c7feaSBram Moolenaar echo 'clear' 2360df069eecSBram Moolenaar :1messages 2361f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2362f93c7feaSBram Moolenaar 2363d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2364f93c7feaSBram Moolenaarenddef 2365f93c7feaSBram Moolenaar 236647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2367f5be8cdbSBram Moolenaar # only checks line continuation 236847e880d6SBram Moolenaar let lines =<< trim END 236947e880d6SBram Moolenaar vim9script 237047e880d6SBram Moolenaar echomsg 'here' 237147e880d6SBram Moolenaar .. ' is ' .. 237247e880d6SBram Moolenaar 'a message' 237347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 237447e880d6SBram Moolenaar END 237547e880d6SBram Moolenaar CheckScriptSuccess(lines) 237647e880d6SBram Moolenaarenddef 237747e880d6SBram Moolenaar 2378f93c7feaSBram Moolenaardef Test_echoerr_cmd() 237940ee466cSBram Moolenaar try 238040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 238140ee466cSBram Moolenaar catch 238240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 238340ee466cSBram Moolenaar endtry 2384f93c7feaSBram Moolenaarenddef 2385f93c7feaSBram Moolenaar 238647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2387f5be8cdbSBram Moolenaar # only checks line continuation 238847e880d6SBram Moolenaar let lines =<< trim END 238947e880d6SBram Moolenaar vim9script 239047e880d6SBram Moolenaar try 239147e880d6SBram Moolenaar echoerr 'this' 239247e880d6SBram Moolenaar .. ' is ' .. 239347e880d6SBram Moolenaar 'wrong' 239447e880d6SBram Moolenaar catch 239547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 239647e880d6SBram Moolenaar endtry 239747e880d6SBram Moolenaar END 239847e880d6SBram Moolenaar CheckScriptSuccess(lines) 239947e880d6SBram Moolenaarenddef 240047e880d6SBram Moolenaar 240141fe0617SBram Moolenaardef Test_for_outside_of_function() 240241fe0617SBram Moolenaar let lines =<< trim END 240341fe0617SBram Moolenaar vim9script 240441fe0617SBram Moolenaar new 240541fe0617SBram Moolenaar for var in range(0, 3) 240641fe0617SBram Moolenaar append(line('$'), var) 240741fe0617SBram Moolenaar endfor 240841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 240941fe0617SBram Moolenaar bwipe! 241041fe0617SBram Moolenaar END 241141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 241241fe0617SBram Moolenaar source Xvim9for.vim 241341fe0617SBram Moolenaar delete('Xvim9for.vim') 241441fe0617SBram Moolenaarenddef 24158a7d6542SBram Moolenaar 2416e8c4abbbSBram Moolenaardef Test_for_loop() 2417e8c4abbbSBram Moolenaar let result = '' 2418e8c4abbbSBram Moolenaar for cnt in range(7) 2419e8c4abbbSBram Moolenaar if cnt == 4 2420e8c4abbbSBram Moolenaar break 2421e8c4abbbSBram Moolenaar endif 2422e8c4abbbSBram Moolenaar if cnt == 2 2423e8c4abbbSBram Moolenaar continue 2424e8c4abbbSBram Moolenaar endif 2425e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2426e8c4abbbSBram Moolenaar endfor 2427e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24280ad3e894SBram Moolenaar 24290ad3e894SBram Moolenaar let concat = '' 24300ad3e894SBram Moolenaar for str in eval('["one", "two"]') 24310ad3e894SBram Moolenaar concat ..= str 24320ad3e894SBram Moolenaar endfor 24330ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2434e8c4abbbSBram Moolenaarenddef 2435e8c4abbbSBram Moolenaar 2436e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2437675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2438675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2439451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2440822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2441451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2442675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2443675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2444675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2445e8c4abbbSBram Moolenaarenddef 2446e8c4abbbSBram Moolenaar 2447d0df1aacSBram Moolenaardef Test_while_loop() 2448d0df1aacSBram Moolenaar let result = '' 2449d0df1aacSBram Moolenaar let cnt = 0 2450d0df1aacSBram Moolenaar while cnt < 555 2451d0df1aacSBram Moolenaar if cnt == 3 2452d0df1aacSBram Moolenaar break 2453d0df1aacSBram Moolenaar endif 2454d0df1aacSBram Moolenaar cnt += 1 2455d0df1aacSBram Moolenaar if cnt == 2 2456d0df1aacSBram Moolenaar continue 2457d0df1aacSBram Moolenaar endif 2458d0df1aacSBram Moolenaar result ..= cnt .. '_' 2459d0df1aacSBram Moolenaar endwhile 2460d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2461d0df1aacSBram Moolenaarenddef 2462d0df1aacSBram Moolenaar 2463e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2464675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2465675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2466675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2467675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2468675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2469675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2470675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2471bd5da371SBram Moolenaarenddef 2472bd5da371SBram Moolenaar 24739645e2d9SBram Moolenaardef Test_interrupt_loop() 247497acfc78SBram Moolenaar let caught = false 24759645e2d9SBram Moolenaar let x = 0 247697acfc78SBram Moolenaar try 24779645e2d9SBram Moolenaar while 1 24789645e2d9SBram Moolenaar x += 1 24799645e2d9SBram Moolenaar if x == 100 24809645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 24819645e2d9SBram Moolenaar endif 24829645e2d9SBram Moolenaar endwhile 248397acfc78SBram Moolenaar catch 248497acfc78SBram Moolenaar caught = true 248597acfc78SBram Moolenaar assert_equal(100, x) 248697acfc78SBram Moolenaar endtry 248797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 248825859dd7SBram Moolenaar # consume the CTRL-C 248925859dd7SBram Moolenaar getchar(0) 24909645e2d9SBram Moolenaarenddef 249120431c9dSBram Moolenaar 24924fdae999SBram Moolenaardef Test_automatic_line_continuation() 24934fdae999SBram Moolenaar let mylist = [ 24944fdae999SBram Moolenaar 'one', 24954fdae999SBram Moolenaar 'two', 24964fdae999SBram Moolenaar 'three', 2497f5be8cdbSBram Moolenaar ] # comment 24984fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24994fdae999SBram Moolenaar 25004fdae999SBram Moolenaar let mydict = { 25014fdae999SBram Moolenaar 'one': 1, 25024fdae999SBram Moolenaar 'two': 2, 25034fdae999SBram Moolenaar 'three': 25044fdae999SBram Moolenaar 3, 2505f5be8cdbSBram Moolenaar } # comment 25064fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 25074fdae999SBram Moolenaar mydict = #{ 25082c330432SBram Moolenaar one: 1, # comment 25092c330432SBram Moolenaar two: # comment 25102c330432SBram Moolenaar 2, # comment 25112c330432SBram Moolenaar three: 3 # comment 25122c330432SBram Moolenaar } 25132c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 25142c330432SBram Moolenaar mydict = #{ 25152c330432SBram Moolenaar one: 1, 25164fdae999SBram Moolenaar two: 25174fdae999SBram Moolenaar 2, 25182c330432SBram Moolenaar three: 3 25194fdae999SBram Moolenaar } 25204fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2521e6085c53SBram Moolenaar 2522e6085c53SBram Moolenaar assert_equal( 2523e6085c53SBram Moolenaar ['one', 'two', 'three'], 2524e6085c53SBram Moolenaar split('one two three') 2525e6085c53SBram Moolenaar ) 25264fdae999SBram Moolenaarenddef 25274fdae999SBram Moolenaar 25287a092245SBram Moolenaardef Test_vim9_comment() 25297a092245SBram Moolenaar CheckScriptSuccess([ 25307a092245SBram Moolenaar 'vim9script', 25317a092245SBram Moolenaar '# something', 25327a092245SBram Moolenaar ]) 25337a092245SBram Moolenaar CheckScriptFailure([ 25347a092245SBram Moolenaar 'vim9script', 25357a092245SBram Moolenaar ':# something', 25367a092245SBram Moolenaar ], 'E488:') 25377a092245SBram Moolenaar CheckScriptFailure([ 25387a092245SBram Moolenaar '# something', 25397a092245SBram Moolenaar ], 'E488:') 25407a092245SBram Moolenaar CheckScriptFailure([ 25417a092245SBram Moolenaar ':# something', 25427a092245SBram Moolenaar ], 'E488:') 25437a092245SBram Moolenaar 25444a8d9f2eSBram Moolenaar { # block start 25454a8d9f2eSBram Moolenaar } # block end 25464a8d9f2eSBram Moolenaar CheckDefFailure([ 25474a8d9f2eSBram Moolenaar '{# comment', 25484a8d9f2eSBram Moolenaar ], 'E488:') 25494a8d9f2eSBram Moolenaar CheckDefFailure([ 25504a8d9f2eSBram Moolenaar '{', 25514a8d9f2eSBram Moolenaar '}# comment', 25524a8d9f2eSBram Moolenaar ], 'E488:') 25534a8d9f2eSBram Moolenaar 25544a8d9f2eSBram Moolenaar echo "yes" # comment 25554a8d9f2eSBram Moolenaar CheckDefFailure([ 25564a8d9f2eSBram Moolenaar 'echo "yes"# comment', 25574a8d9f2eSBram Moolenaar ], 'E488:') 25587a092245SBram Moolenaar CheckScriptSuccess([ 25597a092245SBram Moolenaar 'vim9script', 25607a092245SBram Moolenaar 'echo "yes" # something', 25617a092245SBram Moolenaar ]) 25627a092245SBram Moolenaar CheckScriptFailure([ 25637a092245SBram Moolenaar 'vim9script', 25647a092245SBram Moolenaar 'echo "yes"# something', 25657a092245SBram Moolenaar ], 'E121:') 25667a092245SBram Moolenaar CheckScriptFailure([ 25677a092245SBram Moolenaar 'vim9script', 25687a092245SBram Moolenaar 'echo# something', 25697a092245SBram Moolenaar ], 'E121:') 25707a092245SBram Moolenaar CheckScriptFailure([ 25717a092245SBram Moolenaar 'echo "yes" # something', 25727a092245SBram Moolenaar ], 'E121:') 25737a092245SBram Moolenaar 25744a8d9f2eSBram Moolenaar exe "echo" # comment 25754a8d9f2eSBram Moolenaar CheckDefFailure([ 25764a8d9f2eSBram Moolenaar 'exe "echo"# comment', 25774a8d9f2eSBram Moolenaar ], 'E488:') 25784a8d9f2eSBram Moolenaar CheckScriptSuccess([ 25794a8d9f2eSBram Moolenaar 'vim9script', 25804a8d9f2eSBram Moolenaar 'exe "echo" # something', 25814a8d9f2eSBram Moolenaar ]) 25824a8d9f2eSBram Moolenaar CheckScriptFailure([ 25834a8d9f2eSBram Moolenaar 'vim9script', 25844a8d9f2eSBram Moolenaar 'exe "echo"# something', 25854a8d9f2eSBram Moolenaar ], 'E121:') 25864a8d9f2eSBram Moolenaar CheckDefFailure([ 25874a8d9f2eSBram Moolenaar 'exe # comment', 25884a8d9f2eSBram Moolenaar ], 'E1015:') 25894a8d9f2eSBram Moolenaar CheckScriptFailure([ 25904a8d9f2eSBram Moolenaar 'vim9script', 25914a8d9f2eSBram Moolenaar 'exe# something', 25924a8d9f2eSBram Moolenaar ], 'E121:') 25934a8d9f2eSBram Moolenaar CheckScriptFailure([ 25944a8d9f2eSBram Moolenaar 'exe "echo" # something', 25954a8d9f2eSBram Moolenaar ], 'E121:') 25964a8d9f2eSBram Moolenaar 25977a092245SBram Moolenaar CheckDefFailure([ 25987a092245SBram Moolenaar 'try# comment', 25997a092245SBram Moolenaar ' echo "yes"', 26007a092245SBram Moolenaar 'catch', 26017a092245SBram Moolenaar 'endtry', 26027a092245SBram Moolenaar ], 'E488:') 26032c5ed4e3SBram Moolenaar CheckScriptFailure([ 26042c5ed4e3SBram Moolenaar 'vim9script', 26052c5ed4e3SBram Moolenaar 'try# comment', 26062c5ed4e3SBram Moolenaar 'echo "yes"', 26072c5ed4e3SBram Moolenaar ], 'E488:') 26087a092245SBram Moolenaar CheckDefFailure([ 26097a092245SBram Moolenaar 'try', 2610a72cfb80SBram Moolenaar ' throw#comment', 2611a72cfb80SBram Moolenaar 'catch', 2612a72cfb80SBram Moolenaar 'endtry', 2613a72cfb80SBram Moolenaar ], 'E1015:') 2614a72cfb80SBram Moolenaar CheckDefFailure([ 2615a72cfb80SBram Moolenaar 'try', 2616a72cfb80SBram Moolenaar ' throw "yes"#comment', 2617a72cfb80SBram Moolenaar 'catch', 2618a72cfb80SBram Moolenaar 'endtry', 2619a72cfb80SBram Moolenaar ], 'E488:') 2620a72cfb80SBram Moolenaar CheckDefFailure([ 2621a72cfb80SBram Moolenaar 'try', 26227a092245SBram Moolenaar ' echo "yes"', 26237a092245SBram Moolenaar 'catch# comment', 26247a092245SBram Moolenaar 'endtry', 26257a092245SBram Moolenaar ], 'E488:') 26262c5ed4e3SBram Moolenaar CheckScriptFailure([ 26272c5ed4e3SBram Moolenaar 'vim9script', 26282c5ed4e3SBram Moolenaar 'try', 26292c5ed4e3SBram Moolenaar ' echo "yes"', 26302c5ed4e3SBram Moolenaar 'catch# comment', 26312c5ed4e3SBram Moolenaar 'endtry', 26322c5ed4e3SBram Moolenaar ], 'E654:') 26332c5ed4e3SBram Moolenaar CheckDefFailure([ 26342c5ed4e3SBram Moolenaar 'try', 26352c5ed4e3SBram Moolenaar ' echo "yes"', 26362c5ed4e3SBram Moolenaar 'catch /pat/# comment', 26372c5ed4e3SBram Moolenaar 'endtry', 26382c5ed4e3SBram Moolenaar ], 'E488:') 26397a092245SBram Moolenaar CheckDefFailure([ 26407a092245SBram Moolenaar 'try', 26417a092245SBram Moolenaar 'echo "yes"', 26427a092245SBram Moolenaar 'catch', 26437a092245SBram Moolenaar 'endtry# comment', 26447a092245SBram Moolenaar ], 'E488:') 26452c5ed4e3SBram Moolenaar CheckScriptFailure([ 26462c5ed4e3SBram Moolenaar 'vim9script', 26472c5ed4e3SBram Moolenaar 'try', 26482c5ed4e3SBram Moolenaar ' echo "yes"', 26492c5ed4e3SBram Moolenaar 'catch', 26502c5ed4e3SBram Moolenaar 'endtry# comment', 26519b7bf9e9SBram Moolenaar ], 'E488:') 26522c5ed4e3SBram Moolenaar 26532c5ed4e3SBram Moolenaar CheckScriptSuccess([ 26542c5ed4e3SBram Moolenaar 'vim9script', 26552c5ed4e3SBram Moolenaar 'hi # comment', 26562c5ed4e3SBram Moolenaar ]) 26572c5ed4e3SBram Moolenaar CheckScriptFailure([ 26582c5ed4e3SBram Moolenaar 'vim9script', 26592c5ed4e3SBram Moolenaar 'hi# comment', 26602c5ed4e3SBram Moolenaar ], 'E416:') 26611966c248SBram Moolenaar CheckScriptSuccess([ 26621966c248SBram Moolenaar 'vim9script', 26631966c248SBram Moolenaar 'hi Search # comment', 26641966c248SBram Moolenaar ]) 26651966c248SBram Moolenaar CheckScriptFailure([ 26661966c248SBram Moolenaar 'vim9script', 26671966c248SBram Moolenaar 'hi Search# comment', 26681966c248SBram Moolenaar ], 'E416:') 26691966c248SBram Moolenaar CheckScriptSuccess([ 26701966c248SBram Moolenaar 'vim9script', 26711966c248SBram Moolenaar 'hi link This Search # comment', 26721966c248SBram Moolenaar ]) 26731966c248SBram Moolenaar CheckScriptFailure([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'hi link This That# comment', 26761966c248SBram Moolenaar ], 'E413:') 26771966c248SBram Moolenaar CheckScriptSuccess([ 26781966c248SBram Moolenaar 'vim9script', 26791966c248SBram Moolenaar 'hi clear This # comment', 26801966c248SBram Moolenaar 'hi clear # comment', 26811966c248SBram Moolenaar ]) 2682f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2683f5be8cdbSBram Moolenaar # hi clear This# comment', 26841966c248SBram Moolenaar CheckScriptFailure([ 26851966c248SBram Moolenaar 'vim9script', 26861966c248SBram Moolenaar 'hi clear# comment', 26871966c248SBram Moolenaar ], 'E416:') 26881966c248SBram Moolenaar 26891966c248SBram Moolenaar CheckScriptSuccess([ 26901966c248SBram Moolenaar 'vim9script', 26911966c248SBram Moolenaar 'hi Group term=bold', 26921966c248SBram Moolenaar 'match Group /todo/ # comment', 26931966c248SBram Moolenaar ]) 26941966c248SBram Moolenaar CheckScriptFailure([ 26951966c248SBram Moolenaar 'vim9script', 26961966c248SBram Moolenaar 'hi Group term=bold', 26971966c248SBram Moolenaar 'match Group /todo/# comment', 26981966c248SBram Moolenaar ], 'E488:') 26991966c248SBram Moolenaar CheckScriptSuccess([ 27001966c248SBram Moolenaar 'vim9script', 27011966c248SBram Moolenaar 'match # comment', 27021966c248SBram Moolenaar ]) 27031966c248SBram Moolenaar CheckScriptFailure([ 27041966c248SBram Moolenaar 'vim9script', 27051966c248SBram Moolenaar 'match# comment', 27061966c248SBram Moolenaar ], 'E475:') 27071966c248SBram Moolenaar CheckScriptSuccess([ 27081966c248SBram Moolenaar 'vim9script', 27091966c248SBram Moolenaar 'match none # comment', 27101966c248SBram Moolenaar ]) 27111966c248SBram Moolenaar CheckScriptFailure([ 27121966c248SBram Moolenaar 'vim9script', 27131966c248SBram Moolenaar 'match none# comment', 27141966c248SBram Moolenaar ], 'E475:') 27151966c248SBram Moolenaar 27161966c248SBram Moolenaar CheckScriptSuccess([ 27171966c248SBram Moolenaar 'vim9script', 27181966c248SBram Moolenaar 'menutrans clear # comment', 27191966c248SBram Moolenaar ]) 27201966c248SBram Moolenaar CheckScriptFailure([ 27211966c248SBram Moolenaar 'vim9script', 27221966c248SBram Moolenaar 'menutrans clear# comment text', 27231966c248SBram Moolenaar ], 'E474:') 27241966c248SBram Moolenaar 27251966c248SBram Moolenaar CheckScriptSuccess([ 27261966c248SBram Moolenaar 'vim9script', 27271966c248SBram Moolenaar 'syntax clear # comment', 27281966c248SBram Moolenaar ]) 27291966c248SBram Moolenaar CheckScriptFailure([ 27301966c248SBram Moolenaar 'vim9script', 27311966c248SBram Moolenaar 'syntax clear# comment text', 27321966c248SBram Moolenaar ], 'E28:') 27331966c248SBram Moolenaar CheckScriptSuccess([ 27341966c248SBram Moolenaar 'vim9script', 27351966c248SBram Moolenaar 'syntax keyword Word some', 27361966c248SBram Moolenaar 'syntax clear Word # comment', 27371966c248SBram Moolenaar ]) 27381966c248SBram Moolenaar CheckScriptFailure([ 27391966c248SBram Moolenaar 'vim9script', 27401966c248SBram Moolenaar 'syntax keyword Word some', 27411966c248SBram Moolenaar 'syntax clear Word# comment text', 27421966c248SBram Moolenaar ], 'E28:') 27431966c248SBram Moolenaar 27441966c248SBram Moolenaar CheckScriptSuccess([ 27451966c248SBram Moolenaar 'vim9script', 27461966c248SBram Moolenaar 'syntax list # comment', 27471966c248SBram Moolenaar ]) 27481966c248SBram Moolenaar CheckScriptFailure([ 27491966c248SBram Moolenaar 'vim9script', 27501966c248SBram Moolenaar 'syntax list# comment text', 27511966c248SBram Moolenaar ], 'E28:') 27521966c248SBram Moolenaar 27531966c248SBram Moolenaar CheckScriptSuccess([ 27541966c248SBram Moolenaar 'vim9script', 27551966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 27561966c248SBram Moolenaar ]) 27571966c248SBram Moolenaar CheckScriptFailure([ 27581966c248SBram Moolenaar 'vim9script', 27591966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 27601966c248SBram Moolenaar ], 'E475:') 27611966c248SBram Moolenaar 27621966c248SBram Moolenaar CheckScriptSuccess([ 27631966c248SBram Moolenaar 'vim9script', 27641966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 27651966c248SBram Moolenaar ]) 27661966c248SBram Moolenaar CheckScriptFailure([ 27671966c248SBram Moolenaar 'vim9script', 27681966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 27691966c248SBram Moolenaar ], 'E789:') 27701966c248SBram Moolenaar 27711966c248SBram Moolenaar CheckScriptSuccess([ 27721966c248SBram Moolenaar 'vim9script', 27731966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 27741966c248SBram Moolenaar ]) 27751966c248SBram Moolenaar CheckScriptFailure([ 27761966c248SBram Moolenaar 'vim9script', 27771966c248SBram Moolenaar 'syntax match Word /pat/# comment', 27781966c248SBram Moolenaar ], 'E402:') 27791966c248SBram Moolenaar 27801966c248SBram Moolenaar CheckScriptSuccess([ 27811966c248SBram Moolenaar 'vim9script', 27821966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 27831966c248SBram Moolenaar ]) 27841966c248SBram Moolenaar CheckScriptFailure([ 27851966c248SBram Moolenaar 'vim9script', 27861966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27871966c248SBram Moolenaar ], 'E475:') 27881966c248SBram Moolenaar CheckScriptFailure([ 27891966c248SBram Moolenaar 'vim9script', 27901966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27911966c248SBram Moolenaar ], 'E406:') 27921966c248SBram Moolenaar CheckScriptFailure([ 27931966c248SBram Moolenaar 'vim9script', 27941966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27951966c248SBram Moolenaar ], 'E475:') 27961966c248SBram Moolenaar 27971966c248SBram Moolenaar CheckScriptSuccess([ 27981966c248SBram Moolenaar 'vim9script', 27991966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 28001966c248SBram Moolenaar ]) 28011966c248SBram Moolenaar CheckScriptFailure([ 28021966c248SBram Moolenaar 'vim9script', 28031966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2804d032f34aSBram Moolenaar ], 'E402:') 28051966c248SBram Moolenaar 28061966c248SBram Moolenaar CheckScriptSuccess([ 28071966c248SBram Moolenaar 'vim9script', 28081966c248SBram Moolenaar 'syntax sync # comment', 28091966c248SBram Moolenaar ]) 28101966c248SBram Moolenaar CheckScriptFailure([ 28111966c248SBram Moolenaar 'vim9script', 28121966c248SBram Moolenaar 'syntax sync# comment', 28131966c248SBram Moolenaar ], 'E404:') 28141966c248SBram Moolenaar CheckScriptSuccess([ 28151966c248SBram Moolenaar 'vim9script', 28161966c248SBram Moolenaar 'syntax sync ccomment # comment', 28171966c248SBram Moolenaar ]) 28181966c248SBram Moolenaar CheckScriptFailure([ 28191966c248SBram Moolenaar 'vim9script', 28201966c248SBram Moolenaar 'syntax sync ccomment# comment', 28211966c248SBram Moolenaar ], 'E404:') 28221966c248SBram Moolenaar 28231966c248SBram Moolenaar CheckScriptSuccess([ 28241966c248SBram Moolenaar 'vim9script', 28251966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 28261966c248SBram Moolenaar ]) 28271966c248SBram Moolenaar CheckScriptFailure([ 28281966c248SBram Moolenaar 'vim9script', 28291966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 28301966c248SBram Moolenaar ], 'E475:') 2831a72cfb80SBram Moolenaar 2832a72cfb80SBram Moolenaar CheckScriptSuccess([ 2833a72cfb80SBram Moolenaar 'vim9script', 2834a72cfb80SBram Moolenaar 'command Echo echo # comment', 2835a72cfb80SBram Moolenaar 'command Echo # comment', 2836a72cfb80SBram Moolenaar ]) 2837a72cfb80SBram Moolenaar CheckScriptFailure([ 2838a72cfb80SBram Moolenaar 'vim9script', 2839a72cfb80SBram Moolenaar 'command Echo echo# comment', 2840a72cfb80SBram Moolenaar 'Echo', 2841a72cfb80SBram Moolenaar ], 'E121:') 2842a72cfb80SBram Moolenaar CheckScriptFailure([ 2843a72cfb80SBram Moolenaar 'vim9script', 2844a72cfb80SBram Moolenaar 'command Echo# comment', 2845a72cfb80SBram Moolenaar ], 'E182:') 2846a72cfb80SBram Moolenaar CheckScriptFailure([ 2847a72cfb80SBram Moolenaar 'vim9script', 2848a72cfb80SBram Moolenaar 'command Echo echo', 2849a72cfb80SBram Moolenaar 'command Echo# comment', 2850a72cfb80SBram Moolenaar ], 'E182:') 2851a72cfb80SBram Moolenaar 2852a72cfb80SBram Moolenaar CheckScriptSuccess([ 2853a72cfb80SBram Moolenaar 'vim9script', 2854a72cfb80SBram Moolenaar 'function # comment', 2855a72cfb80SBram Moolenaar ]) 2856a72cfb80SBram Moolenaar CheckScriptFailure([ 2857a72cfb80SBram Moolenaar 'vim9script', 28589898107fSBram Moolenaar 'function " comment', 28599898107fSBram Moolenaar ], 'E129:') 28609898107fSBram Moolenaar CheckScriptFailure([ 28619898107fSBram Moolenaar 'vim9script', 2862a72cfb80SBram Moolenaar 'function# comment', 2863a72cfb80SBram Moolenaar ], 'E129:') 2864a72cfb80SBram Moolenaar CheckScriptSuccess([ 2865a72cfb80SBram Moolenaar 'vim9script', 2866a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2867a72cfb80SBram Moolenaar ]) 2868a72cfb80SBram Moolenaar CheckScriptFailure([ 2869a72cfb80SBram Moolenaar 'vim9script', 2870a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2871a72cfb80SBram Moolenaar ], 'E488:') 2872a72cfb80SBram Moolenaar 2873a72cfb80SBram Moolenaar CheckScriptSuccess([ 2874a72cfb80SBram Moolenaar 'vim9script', 28754c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2876a72cfb80SBram Moolenaar 'endfunc', 28774c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2878a72cfb80SBram Moolenaar ]) 2879a72cfb80SBram Moolenaar CheckScriptFailure([ 2880a72cfb80SBram Moolenaar 'vim9script', 28814c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2882a72cfb80SBram Moolenaar 'endfunc', 28834c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2884a72cfb80SBram Moolenaar ], 'E488:') 2885a72cfb80SBram Moolenaar 2886a72cfb80SBram Moolenaar CheckScriptSuccess([ 2887a72cfb80SBram Moolenaar 'vim9script', 2888a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2889a72cfb80SBram Moolenaar ]) 2890a72cfb80SBram Moolenaar CheckScriptFailure([ 2891a72cfb80SBram Moolenaar 'vim9script', 2892a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2893a72cfb80SBram Moolenaar ], 'E488:') 2894e7e4838fSBram Moolenaar 2895e7e4838fSBram Moolenaar CheckScriptFailure([ 2896e7e4838fSBram Moolenaar 'def Test() " comment', 2897e7e4838fSBram Moolenaar 'enddef', 2898e7e4838fSBram Moolenaar ], 'E488:') 2899e7e4838fSBram Moolenaar CheckScriptFailure([ 2900e7e4838fSBram Moolenaar 'vim9script', 2901e7e4838fSBram Moolenaar 'def Test() " comment', 2902e7e4838fSBram Moolenaar 'enddef', 2903e7e4838fSBram Moolenaar ], 'E488:') 2904e7e4838fSBram Moolenaar 2905e7e4838fSBram Moolenaar CheckScriptSuccess([ 2906e7e4838fSBram Moolenaar 'func Test() " comment', 2907e7e4838fSBram Moolenaar 'endfunc', 2908e7e4838fSBram Moolenaar ]) 29099898107fSBram Moolenaar CheckScriptSuccess([ 2910e7e4838fSBram Moolenaar 'vim9script', 2911e7e4838fSBram Moolenaar 'func Test() " comment', 2912e7e4838fSBram Moolenaar 'endfunc', 29139898107fSBram Moolenaar ]) 2914e7e4838fSBram Moolenaar 2915e7e4838fSBram Moolenaar CheckScriptSuccess([ 2916e7e4838fSBram Moolenaar 'def Test() # comment', 2917e7e4838fSBram Moolenaar 'enddef', 2918e7e4838fSBram Moolenaar ]) 2919e7e4838fSBram Moolenaar CheckScriptFailure([ 2920e7e4838fSBram Moolenaar 'func Test() # comment', 2921e7e4838fSBram Moolenaar 'endfunc', 2922e7e4838fSBram Moolenaar ], 'E488:') 29232c5ed4e3SBram Moolenaarenddef 29242c5ed4e3SBram Moolenaar 29252c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 29262c5ed4e3SBram Moolenaar CheckCanRunGui 29272c5ed4e3SBram Moolenaar 29282c5ed4e3SBram Moolenaar CheckScriptFailure([ 29292c5ed4e3SBram Moolenaar 'vim9script', 29302c5ed4e3SBram Moolenaar 'gui#comment' 29312c5ed4e3SBram Moolenaar ], 'E499:') 29322c5ed4e3SBram Moolenaar CheckScriptFailure([ 29332c5ed4e3SBram Moolenaar 'vim9script', 29342c5ed4e3SBram Moolenaar 'gui -f#comment' 29352c5ed4e3SBram Moolenaar ], 'E499:') 29367a092245SBram Moolenaarenddef 29377a092245SBram Moolenaar 2938a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 29396797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 29406797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2941a26b9700SBram Moolenaar 2942a26b9700SBram Moolenaar edit test.vim 2943a26b9700SBram Moolenaar doautocmd TabEnter #comment 2944a26b9700SBram Moolenaar assert_equal(1, g:entered) 2945a26b9700SBram Moolenaar 2946a26b9700SBram Moolenaar doautocmd TabEnter f.x 2947a26b9700SBram Moolenaar assert_equal(2, g:entered) 2948a26b9700SBram Moolenaar 2949a26b9700SBram Moolenaar g:entered = 0 2950a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2951a26b9700SBram Moolenaar assert_equal(2, g:entered) 2952a26b9700SBram Moolenaar 2953a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2954a26b9700SBram Moolenaar 2955a26b9700SBram Moolenaar au! TabEnter 2956a26b9700SBram Moolenaar unlet g:entered 2957d72c1bf0SBram Moolenaar 2958d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2959d72c1bf0SBram Moolenaar 'vim9script', 29606797966dSBram Moolenaar 'g:var = 123', 2961e55b1c09SBram Moolenaar 'b:var = 456', 2962e55b1c09SBram Moolenaar 'w:var = 777', 2963e55b1c09SBram Moolenaar 't:var = 888', 2964d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2965d72c1bf0SBram Moolenaar ]) 2966d72c1bf0SBram Moolenaar 2967d72c1bf0SBram Moolenaar CheckScriptFailure([ 2968d72c1bf0SBram Moolenaar 'vim9script', 2969d72c1bf0SBram Moolenaar 'let g:var = 123', 2970e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2971e55b1c09SBram Moolenaar 2972e55b1c09SBram Moolenaar CheckScriptFailure([ 2973e55b1c09SBram Moolenaar 'vim9script', 2974e55b1c09SBram Moolenaar 'let b:var = 123', 2975e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2976e55b1c09SBram Moolenaar 2977e55b1c09SBram Moolenaar CheckScriptFailure([ 2978e55b1c09SBram Moolenaar 'vim9script', 2979e55b1c09SBram Moolenaar 'let w:var = 123', 2980e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2981e55b1c09SBram Moolenaar 2982e55b1c09SBram Moolenaar CheckScriptFailure([ 2983e55b1c09SBram Moolenaar 'vim9script', 2984e55b1c09SBram Moolenaar 'let t:var = 123', 2985e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2986e55b1c09SBram Moolenaar 2987e55b1c09SBram Moolenaar CheckScriptFailure([ 2988e55b1c09SBram Moolenaar 'vim9script', 2989e55b1c09SBram Moolenaar 'let v:version = 123', 2990e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2991e55b1c09SBram Moolenaar 2992e55b1c09SBram Moolenaar CheckScriptFailure([ 2993e55b1c09SBram Moolenaar 'vim9script', 2994e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2995e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29966797966dSBram Moolenaar 29976797966dSBram Moolenaar CheckScriptFailure([ 29986797966dSBram Moolenaar 'vim9script', 29996797966dSBram Moolenaar 'g:var = 123', 300032e35117SBram Moolenaar 'unlet g:var# comment1', 3001d72c1bf0SBram Moolenaar ], 'E108:') 3002d72c1bf0SBram Moolenaar 3003d72c1bf0SBram Moolenaar CheckScriptFailure([ 3004d72c1bf0SBram Moolenaar 'let g:var = 123', 3005d72c1bf0SBram Moolenaar 'unlet g:var # something', 3006d72c1bf0SBram Moolenaar ], 'E488:') 3007faac4104SBram Moolenaar 3008faac4104SBram Moolenaar CheckScriptSuccess([ 3009faac4104SBram Moolenaar 'vim9script', 301032e35117SBram Moolenaar 'if 1 # comment2', 3011faac4104SBram Moolenaar ' echo "yes"', 3012faac4104SBram Moolenaar 'elseif 2 #comment', 3013faac4104SBram Moolenaar ' echo "no"', 3014faac4104SBram Moolenaar 'endif', 3015faac4104SBram Moolenaar ]) 3016faac4104SBram Moolenaar 3017faac4104SBram Moolenaar CheckScriptFailure([ 3018faac4104SBram Moolenaar 'vim9script', 301932e35117SBram Moolenaar 'if 1# comment3', 3020faac4104SBram Moolenaar ' echo "yes"', 3021faac4104SBram Moolenaar 'endif', 3022faac4104SBram Moolenaar ], 'E15:') 3023faac4104SBram Moolenaar 3024faac4104SBram Moolenaar CheckScriptFailure([ 3025faac4104SBram Moolenaar 'vim9script', 302632e35117SBram Moolenaar 'if 0 # comment4', 3027faac4104SBram Moolenaar ' echo "yes"', 3028faac4104SBram Moolenaar 'elseif 2#comment', 3029faac4104SBram Moolenaar ' echo "no"', 3030faac4104SBram Moolenaar 'endif', 3031faac4104SBram Moolenaar ], 'E15:') 3032faac4104SBram Moolenaar 3033faac4104SBram Moolenaar CheckScriptSuccess([ 3034faac4104SBram Moolenaar 'vim9script', 303532e35117SBram Moolenaar 'let v = 1 # comment5', 3036faac4104SBram Moolenaar ]) 3037faac4104SBram Moolenaar 3038faac4104SBram Moolenaar CheckScriptFailure([ 3039faac4104SBram Moolenaar 'vim9script', 304032e35117SBram Moolenaar 'let v = 1# comment6', 304132e35117SBram Moolenaar ], 'E15:') 3042faac4104SBram Moolenaar 3043faac4104SBram Moolenaar CheckScriptSuccess([ 3044faac4104SBram Moolenaar 'vim9script', 3045faac4104SBram Moolenaar 'new' 3046d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3047df069eecSBram Moolenaar ':$', 3048faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3049faac4104SBram Moolenaar 'bwipe!', 3050faac4104SBram Moolenaar ]) 3051faac4104SBram Moolenaar 3052f5be8cdbSBram Moolenaar CheckScriptFailure([ 3053f5be8cdbSBram Moolenaar 'vim9script', 3054f5be8cdbSBram Moolenaar 'new' 3055d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3056f5be8cdbSBram Moolenaar ':$', 3057f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3058f5be8cdbSBram Moolenaar 'bwipe!', 3059f5be8cdbSBram Moolenaar ], 'E488:') 3060f5be8cdbSBram Moolenaar 3061f5be8cdbSBram Moolenaar CheckScriptFailure([ 3062f5be8cdbSBram Moolenaar 'vim9script', 3063f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3064f5be8cdbSBram Moolenaar ], 'E477:') 3065a26b9700SBram Moolenaarenddef 3066a26b9700SBram Moolenaar 30677e5bd91dSBram Moolenaardef Test_finish() 30687e5bd91dSBram Moolenaar let lines =<< trim END 30697e5bd91dSBram Moolenaar vim9script 30706797966dSBram Moolenaar g:res = 'one' 30717e5bd91dSBram Moolenaar if v:false | finish | endif 30726797966dSBram Moolenaar g:res = 'two' 30737e5bd91dSBram Moolenaar finish 30746797966dSBram Moolenaar g:res = 'three' 30757e5bd91dSBram Moolenaar END 30767e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 30777e5bd91dSBram Moolenaar source Xfinished 30787e5bd91dSBram Moolenaar assert_equal('two', g:res) 30797e5bd91dSBram Moolenaar 30807e5bd91dSBram Moolenaar unlet g:res 30817e5bd91dSBram Moolenaar delete('Xfinished') 30827e5bd91dSBram Moolenaarenddef 30837e5bd91dSBram Moolenaar 308432e35117SBram Moolenaardef Test_let_func_call() 308532e35117SBram Moolenaar let lines =<< trim END 308632e35117SBram Moolenaar vim9script 308732e35117SBram Moolenaar func GetValue() 308832e35117SBram Moolenaar if exists('g:count') 308932e35117SBram Moolenaar let g:count += 1 309032e35117SBram Moolenaar else 309132e35117SBram Moolenaar let g:count = 1 309232e35117SBram Moolenaar endif 309332e35117SBram Moolenaar return 'this' 309432e35117SBram Moolenaar endfunc 309532e35117SBram Moolenaar let val: string = GetValue() 3096f5be8cdbSBram Moolenaar # env var is always a string 3097df671b46SBram Moolenaar let env = $TERM 309832e35117SBram Moolenaar END 309932e35117SBram Moolenaar writefile(lines, 'Xfinished') 310032e35117SBram Moolenaar source Xfinished 3101f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 310232e35117SBram Moolenaar assert_equal(1, g:count) 310332e35117SBram Moolenaar 310432e35117SBram Moolenaar unlet g:count 310532e35117SBram Moolenaar delete('Xfinished') 310632e35117SBram Moolenaarenddef 310732e35117SBram Moolenaar 310832e35117SBram Moolenaardef Test_let_missing_type() 310932e35117SBram Moolenaar let lines =<< trim END 311032e35117SBram Moolenaar vim9script 3111df671b46SBram Moolenaar let var = g:unknown 3112227a69deSBram Moolenaar END 3113822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 3114227a69deSBram Moolenaar 3115227a69deSBram Moolenaar lines =<< trim END 3116227a69deSBram Moolenaar vim9script 3117227a69deSBram Moolenaar let nr: number = 123 3118227a69deSBram Moolenaar let var = nr 3119227a69deSBram Moolenaar END 3120822ba247SBram Moolenaar CheckScriptSuccess(lines) 312132e35117SBram Moolenaarenddef 312232e35117SBram Moolenaar 3123c82a5b5dSBram Moolenaardef Test_let_declaration() 3124c82a5b5dSBram Moolenaar let lines =<< trim END 3125c82a5b5dSBram Moolenaar vim9script 3126c82a5b5dSBram Moolenaar let var: string 3127c82a5b5dSBram Moolenaar g:var_uninit = var 3128c82a5b5dSBram Moolenaar var = 'text' 3129c82a5b5dSBram Moolenaar g:var_test = var 3130f5be8cdbSBram Moolenaar # prefixing s: is optional 3131984dddbeSBram Moolenaar s:var = 'prefixed' 3132984dddbeSBram Moolenaar g:var_prefixed = s:var 3133984dddbeSBram Moolenaar 3134984dddbeSBram Moolenaar let s:other: number 3135984dddbeSBram Moolenaar other = 1234 3136984dddbeSBram Moolenaar g:other_var = other 313753b29e48SBram Moolenaar 313853b29e48SBram Moolenaar # type is inferred 313953b29e48SBram Moolenaar s:dict = {'a': 222} 314053b29e48SBram Moolenaar def GetDictVal(key: any) 314153b29e48SBram Moolenaar g:dict_val = s:dict[key] 314253b29e48SBram Moolenaar enddef 314353b29e48SBram Moolenaar GetDictVal('a') 3144c82a5b5dSBram Moolenaar END 3145c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3146c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3147c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3148984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3149984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 315053b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3151c82a5b5dSBram Moolenaar 3152c82a5b5dSBram Moolenaar unlet g:var_uninit 3153c82a5b5dSBram Moolenaar unlet g:var_test 3154984dddbeSBram Moolenaar unlet g:var_prefixed 3155984dddbeSBram Moolenaar unlet g:other_var 3156c82a5b5dSBram Moolenaarenddef 3157c82a5b5dSBram Moolenaar 3158c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3159c5b1c20bSBram Moolenaar let lines =<< trim END 3160c5b1c20bSBram Moolenaar vim9script 3161c5b1c20bSBram Moolenaar const var: string 3162c5b1c20bSBram Moolenaar END 3163c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3164c5b1c20bSBram Moolenaar 3165c5b1c20bSBram Moolenaar lines =<< trim END 3166c5b1c20bSBram Moolenaar vim9script 3167c5b1c20bSBram Moolenaar let 9var: string 3168c5b1c20bSBram Moolenaar END 3169c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3170c5b1c20bSBram Moolenaarenddef 3171c5b1c20bSBram Moolenaar 317234db91f7SBram Moolenaardef Test_let_type_check() 317334db91f7SBram Moolenaar let lines =<< trim END 317434db91f7SBram Moolenaar vim9script 317534db91f7SBram Moolenaar let var: string 317634db91f7SBram Moolenaar var = 1234 317734db91f7SBram Moolenaar END 3178451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3179984dddbeSBram Moolenaar 3180984dddbeSBram Moolenaar lines =<< trim END 3181984dddbeSBram Moolenaar vim9script 3182984dddbeSBram Moolenaar let var:string 3183984dddbeSBram Moolenaar END 3184984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3185c5b1c20bSBram Moolenaar 3186c5b1c20bSBram Moolenaar lines =<< trim END 3187c5b1c20bSBram Moolenaar vim9script 3188c5b1c20bSBram Moolenaar let var: asdf 3189c5b1c20bSBram Moolenaar END 3190c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3191a71e2633SBram Moolenaar 3192a71e2633SBram Moolenaar lines =<< trim END 3193a71e2633SBram Moolenaar vim9script 3194a71e2633SBram Moolenaar let s:l: list<number> 3195a71e2633SBram Moolenaar s:l = [] 3196a71e2633SBram Moolenaar END 3197a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3198a71e2633SBram Moolenaar 3199a71e2633SBram Moolenaar lines =<< trim END 3200a71e2633SBram Moolenaar vim9script 3201a71e2633SBram Moolenaar let s:d: dict<number> 3202a71e2633SBram Moolenaar s:d = {} 3203a71e2633SBram Moolenaar END 3204a71e2633SBram Moolenaar CheckScriptSuccess(lines) 320534db91f7SBram Moolenaarenddef 320634db91f7SBram Moolenaar 32075e654230SBram Moolenaarlet g:dict_number = #{one: 1, two: 2} 32085e654230SBram Moolenaar 32095e654230SBram Moolenaardef Test_let_list_dict_type() 32105e654230SBram Moolenaar let ll: list<number> 32115e654230SBram Moolenaar ll = [1, 2, 2, 3, 3, 3]->uniq() 32125e654230SBram Moolenaar ll->assert_equal([1, 2, 3]) 32135e654230SBram Moolenaar 32145e654230SBram Moolenaar let dd: dict<number> 32155e654230SBram Moolenaar dd = g:dict_number 32165e654230SBram Moolenaar dd->assert_equal(g:dict_number) 32175e654230SBram Moolenaar 32185e654230SBram Moolenaar let lines =<< trim END 32195e654230SBram Moolenaar let ll: list<number> 32205e654230SBram Moolenaar ll = [1, 2, 3]->map('"one"') 32215e654230SBram Moolenaar END 32225e654230SBram Moolenaar CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>') 32235e654230SBram Moolenaarenddef 32245e654230SBram Moolenaar 3225a5d0077eSBram Moolenaardef Test_forward_declaration() 3226a5d0077eSBram Moolenaar let lines =<< trim END 3227a5d0077eSBram Moolenaar vim9script 3228a5d0077eSBram Moolenaar def GetValue(): string 3229a5d0077eSBram Moolenaar return theVal 3230a5d0077eSBram Moolenaar enddef 3231a5d0077eSBram Moolenaar let theVal = 'something' 3232822ba247SBram Moolenaar g:initVal = GetValue() 3233a5d0077eSBram Moolenaar theVal = 'else' 3234a5d0077eSBram Moolenaar g:laterVal = GetValue() 3235a5d0077eSBram Moolenaar END 3236a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3237a5d0077eSBram Moolenaar source Xforward 3238a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3239a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3240a5d0077eSBram Moolenaar 3241a5d0077eSBram Moolenaar unlet g:initVal 3242a5d0077eSBram Moolenaar unlet g:laterVal 3243a5d0077eSBram Moolenaar delete('Xforward') 3244a5d0077eSBram Moolenaarenddef 3245a5d0077eSBram Moolenaar 32469721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 32479721fb4eSBram Moolenaar let legacy_lines =<< trim END 32489721fb4eSBram Moolenaar source Xvim9_script.vim 32499721fb4eSBram Moolenaar 32509721fb4eSBram Moolenaar call assert_false(exists('local')) 32519721fb4eSBram Moolenaar call assert_false(exists('exported')) 32529721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 32539721fb4eSBram Moolenaar call assert_equal('global', global) 32549721fb4eSBram Moolenaar call assert_equal('global', g:global) 32559721fb4eSBram Moolenaar 32569721fb4eSBram Moolenaar " imported variable becomes script-local 32579721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 32589721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 32599721fb4eSBram Moolenaar call assert_false(exists('exported')) 32609721fb4eSBram Moolenaar 32619721fb4eSBram Moolenaar " imported function becomes script-local 32629721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 32639721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 32649721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 32659721fb4eSBram Moolenaar END 32669721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 32679721fb4eSBram Moolenaar 32689721fb4eSBram Moolenaar let vim9_lines =<< trim END 32699721fb4eSBram Moolenaar vim9script 32709721fb4eSBram Moolenaar let local = 'local' 32719721fb4eSBram Moolenaar g:global = 'global' 32729721fb4eSBram Moolenaar export let exported = 'exported' 32739721fb4eSBram Moolenaar export def GetText(): string 32749721fb4eSBram Moolenaar return 'text' 32759721fb4eSBram Moolenaar enddef 32769721fb4eSBram Moolenaar END 32779721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 32789721fb4eSBram Moolenaar 32799721fb4eSBram Moolenaar source Xlegacy_script.vim 32809721fb4eSBram Moolenaar 32819721fb4eSBram Moolenaar assert_equal('global', g:global) 3282f5be8cdbSBram Moolenaar unlet g:global 32839721fb4eSBram Moolenaar 32849721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 32859721fb4eSBram Moolenaar delete('Xvim9_script.vim') 32869721fb4eSBram Moolenaarenddef 3287a5d0077eSBram Moolenaar 32887d699701SBram Moolenaarfunc Test_vim9script_not_global() 32897d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 32907d699701SBram Moolenaar let vim9lines =<< trim END 32917d699701SBram Moolenaar vim9script 32927d699701SBram Moolenaar let var = 'local' 32937d699701SBram Moolenaar func TheFunc() 32947d699701SBram Moolenaar echo 'local' 32957d699701SBram Moolenaar endfunc 32967d699701SBram Moolenaar def DefFunc() 32977d699701SBram Moolenaar echo 'local' 32987d699701SBram Moolenaar enddef 32997d699701SBram Moolenaar END 33007d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 33017d699701SBram Moolenaar source Xvim9script.vim 33027d699701SBram Moolenaar try 33037d699701SBram Moolenaar echo g:var 33047d699701SBram Moolenaar assert_report('did not fail') 33057d699701SBram Moolenaar catch /E121:/ 33067d699701SBram Moolenaar " caught 33077d699701SBram Moolenaar endtry 33087d699701SBram Moolenaar try 33097d699701SBram Moolenaar call TheFunc() 33107d699701SBram Moolenaar assert_report('did not fail') 33117d699701SBram Moolenaar catch /E117:/ 33127d699701SBram Moolenaar " caught 33137d699701SBram Moolenaar endtry 33147d699701SBram Moolenaar try 33157d699701SBram Moolenaar call DefFunc() 33167d699701SBram Moolenaar assert_report('did not fail') 33177d699701SBram Moolenaar catch /E117:/ 33187d699701SBram Moolenaar " caught 33197d699701SBram Moolenaar endtry 33207d699701SBram Moolenaar 332125859dd7SBram Moolenaar call delete('Xvim9script.vim') 33227d699701SBram Moolenaarendfunc 33237d699701SBram Moolenaar 3324eeb27bfeSBram Moolenaardef Test_vim9_copen() 3325eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3326eeb27bfeSBram Moolenaar copen 3327eeb27bfeSBram Moolenaar quit 3328eeb27bfeSBram Moolenaarenddef 3329eeb27bfeSBram Moolenaar 33302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 33312d6b20d6SBram Moolenaardef Test_vim9_autoload() 33322d6b20d6SBram Moolenaar let lines =<< trim END 33332d6b20d6SBram Moolenaar vim9script 33342d6b20d6SBram Moolenaar def foo#test() 33352d6b20d6SBram Moolenaar echomsg getreg('"') 33362d6b20d6SBram Moolenaar enddef 33372d6b20d6SBram Moolenaar END 33382d6b20d6SBram Moolenaar 33392d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 33402d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 33412d6b20d6SBram Moolenaar let save_rtp = &rtp 33422d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 33432d6b20d6SBram Moolenaar augroup test 33442d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 33452d6b20d6SBram Moolenaar augroup END 33462d6b20d6SBram Moolenaar 33472d6b20d6SBram Moolenaar normal Y 33482d6b20d6SBram Moolenaar 33492d6b20d6SBram Moolenaar augroup test 33502d6b20d6SBram Moolenaar autocmd! 33512d6b20d6SBram Moolenaar augroup END 33522d6b20d6SBram Moolenaar delete('Xdir', 'rf') 33532d6b20d6SBram Moolenaar &rtp = save_rtp 33542d6b20d6SBram Moolenaarenddef 33552d6b20d6SBram Moolenaar 3356*77e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 3357*77e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3358*77e5dcc3SBram Moolenaar let lines =<< trim END 3359*77e5dcc3SBram Moolenaar vim9script 3360*77e5dcc3SBram Moolenaar def crash#func() 3361*77e5dcc3SBram Moolenaar try 3362*77e5dcc3SBram Moolenaar for x in List() 3363*77e5dcc3SBram Moolenaar endfor 3364*77e5dcc3SBram Moolenaar catch 3365*77e5dcc3SBram Moolenaar endtry 3366*77e5dcc3SBram Moolenaar g:ok = true 3367*77e5dcc3SBram Moolenaar enddef 3368*77e5dcc3SBram Moolenaar fu List() 3369*77e5dcc3SBram Moolenaar invalid 3370*77e5dcc3SBram Moolenaar endfu 3371*77e5dcc3SBram Moolenaar try 3372*77e5dcc3SBram Moolenaar invalid 3373*77e5dcc3SBram Moolenaar catch /wontmatch/ 3374*77e5dcc3SBram Moolenaar endtry 3375*77e5dcc3SBram Moolenaar END 3376*77e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 3377*77e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 3378*77e5dcc3SBram Moolenaar 3379*77e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 3380*77e5dcc3SBram Moolenaar lines =<< trim END 3381*77e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 3382*77e5dcc3SBram Moolenaar call crash#func() 3383*77e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 3384*77e5dcc3SBram Moolenaar qall 3385*77e5dcc3SBram Moolenaar END 3386*77e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 3387*77e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 3388*77e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 3389*77e5dcc3SBram Moolenaar 3390*77e5dcc3SBram Moolenaar delete('Xdidit') 3391*77e5dcc3SBram Moolenaar delete('Xscript') 3392*77e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 3393*77e5dcc3SBram Moolenaarenddef 3394*77e5dcc3SBram Moolenaar 339581e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 339681e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 339781e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 339881e17fbeSBram Moolenaar let lines =<< trim END 339981e17fbeSBram Moolenaar let s:counter = 1 340081e17fbeSBram Moolenaar def s:Func() 340181e17fbeSBram Moolenaar au! CursorHold 340281e17fbeSBram Moolenaar au CursorHold * s:counter += 1 340381e17fbeSBram Moolenaar enddef 340481e17fbeSBram Moolenaar call s:Func() 340581e17fbeSBram Moolenaar doau CursorHold 340681e17fbeSBram Moolenaar call assert_equal(2, s:counter) 340781e17fbeSBram Moolenaar au! CursorHold 340881e17fbeSBram Moolenaar END 340981e17fbeSBram Moolenaar CheckScriptSuccess(lines) 341081e17fbeSBram Moolenaarenddef 341181e17fbeSBram Moolenaar 34123896a105SBram Moolenaardef Test_cmdline_win() 34133896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 34143896a105SBram Moolenaar # the command line window. 34153896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 34163896a105SBram Moolenaar let export_lines =<< trim END 34173896a105SBram Moolenaar vim9script 34183896a105SBram Moolenaar export let That = 'yes' 34193896a105SBram Moolenaar END 34203896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 34213896a105SBram Moolenaar let import_lines =<< trim END 34223896a105SBram Moolenaar vim9script 34233896a105SBram Moolenaar import That from './Xexport.vim' 34243896a105SBram Moolenaar END 34253896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 34263896a105SBram Moolenaar let save_rtp = &rtp 34273896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 34283896a105SBram Moolenaar syntax on 34293896a105SBram Moolenaar augroup CmdWin 34303896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 34313896a105SBram Moolenaar augroup END 34323896a105SBram Moolenaar # this will open and also close the cmdline window 34333896a105SBram Moolenaar feedkeys('q:', 'xt') 34343896a105SBram Moolenaar assert_equal('yes', g:got_there) 34353896a105SBram Moolenaar 34363896a105SBram Moolenaar augroup CmdWin 34373896a105SBram Moolenaar au! 34383896a105SBram Moolenaar augroup END 34393896a105SBram Moolenaar &rtp = save_rtp 34403896a105SBram Moolenaar delete('rtp', 'rf') 34413896a105SBram Moolenaarenddef 34423896a105SBram Moolenaar 3443e3d4685fSBram Moolenaardef Test_invalid_sid() 3444e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 344525859dd7SBram Moolenaar 3446e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3447d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3448e3d4685fSBram Moolenaar endif 3449e3d4685fSBram Moolenaar delete('Xdidit') 3450e3d4685fSBram Moolenaarenddef 3451e3d4685fSBram Moolenaar 3452f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3453f0afd9e1SBram Moolenaar let lines =<< trim END 3454f0afd9e1SBram Moolenaar let var: any 3455f0afd9e1SBram Moolenaar assert_equal(0, var) 3456f0afd9e1SBram Moolenaar END 3457f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3458f0afd9e1SBram Moolenaarenddef 3459f0afd9e1SBram Moolenaar 3460585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3461585fea7bSBram Moolenaardef Test_substitute_cmd() 3462585fea7bSBram Moolenaar new 3463585fea7bSBram Moolenaar setline(1, 'something') 3464585fea7bSBram Moolenaar :substitute(some(other( 3465585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3466585fea7bSBram Moolenaar bwipe! 3467585fea7bSBram Moolenaar 3468f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3469585fea7bSBram Moolenaar let lines =<< trim END 3470585fea7bSBram Moolenaar vim9script 3471585fea7bSBram Moolenaar new 3472585fea7bSBram Moolenaar setline(1, 'something') 3473585fea7bSBram Moolenaar :substitute(some(other( 3474585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3475585fea7bSBram Moolenaar bwipe! 3476585fea7bSBram Moolenaar END 3477585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3478585fea7bSBram Moolenaar source Xvim9lines 3479585fea7bSBram Moolenaar 3480585fea7bSBram Moolenaar delete('Xvim9lines') 3481585fea7bSBram Moolenaarenddef 3482585fea7bSBram Moolenaar 34838a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3484