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:') 1830aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 1840aae4809SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 1850aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1029: 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]) 834*71abe482SBram Moolenaar 835*71abe482SBram Moolenaar let varlist = [7, 8] 836*71abe482SBram Moolenaar const! constlist = [1, varlist, 3] 837*71abe482SBram Moolenaar varlist[0] = 77 838*71abe482SBram Moolenaar # TODO: does not work yet 839*71abe482SBram Moolenaar # constlist[1][1] = 88 840*71abe482SBram Moolenaar let cl = constlist[1] 841*71abe482SBram Moolenaar cl[1] = 88 842*71abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 843*71abe482SBram Moolenaar 844*71abe482SBram Moolenaar let vardict = #{five: 5, six: 6} 845*71abe482SBram Moolenaar const! constdict = #{one: 1, two: vardict, three: 3} 846*71abe482SBram Moolenaar vardict['five'] = 55 847*71abe482SBram Moolenaar # TODO: does not work yet 848*71abe482SBram Moolenaar # constdict['two']['six'] = 66 849*71abe482SBram Moolenaar let cd = constdict['two'] 850*71abe482SBram Moolenaar cd['six'] = 66 851*71abe482SBram 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] 96156acb094SBram Moolenaar catch /E1029:/ 96268d130c6SBram Moolenaar n = 77 96368d130c6SBram Moolenaar endtry 96468d130c6SBram Moolenaar assert_equal(77, n) 96568d130c6SBram Moolenaar 96668d130c6SBram Moolenaar try 96768d130c6SBram Moolenaar n = l[g:astring] 96856acb094SBram Moolenaar catch /E1029:/ 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} 1019f0b9f43cSBram Moolenaar catch /E1029:/ 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 1033e859312eSBram Moolenaar catch /E1029:/ 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 1172f575adffSBram Moolenaardef Test_try_catch_match() 1173f575adffSBram Moolenaar let seq = 'a' 1174f575adffSBram Moolenaar try 1175f575adffSBram Moolenaar throw 'something' 1176f575adffSBram Moolenaar catch /nothing/ 1177f575adffSBram Moolenaar seq ..= 'x' 1178f575adffSBram Moolenaar catch /some/ 1179f575adffSBram Moolenaar seq ..= 'b' 1180f575adffSBram Moolenaar catch /asdf/ 1181f575adffSBram Moolenaar seq ..= 'x' 1182e8c4abbbSBram Moolenaar catch ?a\?sdf? 1183e8c4abbbSBram Moolenaar seq ..= 'y' 1184f575adffSBram Moolenaar finally 1185f575adffSBram Moolenaar seq ..= 'c' 1186f575adffSBram Moolenaar endtry 1187f575adffSBram Moolenaar assert_equal('abc', seq) 1188257cc5eeSBram Moolenaarenddef 1189257cc5eeSBram Moolenaar 1190e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1191d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1192d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1193d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1194d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1195d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1196d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1197d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1198d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1199d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1200d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1201585fea7bSBram Moolenaar 1202d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1203d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1204e8c4abbbSBram Moolenaarenddef 1205e8c4abbbSBram Moolenaar 1206006ad48bSBram Moolenaardef Test_throw_vimscript() 1207f5be8cdbSBram Moolenaar # only checks line continuation 1208006ad48bSBram Moolenaar let lines =<< trim END 1209006ad48bSBram Moolenaar vim9script 1210006ad48bSBram Moolenaar try 1211006ad48bSBram Moolenaar throw 'one' 1212006ad48bSBram Moolenaar .. 'two' 1213006ad48bSBram Moolenaar catch 1214006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1215006ad48bSBram Moolenaar endtry 1216006ad48bSBram Moolenaar END 1217006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1218006ad48bSBram Moolenaarenddef 1219006ad48bSBram Moolenaar 1220ed677f55SBram Moolenaardef Test_error_in_nested_function() 1221ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1222ed677f55SBram Moolenaar let lines =<< trim END 1223ed677f55SBram Moolenaar vim9script 1224ed677f55SBram Moolenaar def Func() 1225ed677f55SBram Moolenaar Error() 1226ed677f55SBram Moolenaar g:test_var = 1 1227ed677f55SBram Moolenaar enddef 1228ed677f55SBram Moolenaar func Error() abort 1229ed677f55SBram Moolenaar eval [][0] 1230ed677f55SBram Moolenaar endfunc 1231ed677f55SBram Moolenaar Func() 1232ed677f55SBram Moolenaar END 1233ed677f55SBram Moolenaar g:test_var = 0 1234ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1235ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1236ed677f55SBram Moolenaarenddef 1237ed677f55SBram Moolenaar 123837c83711SBram Moolenaardef Test_cexpr_vimscript() 1239f5be8cdbSBram Moolenaar # only checks line continuation 124037c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 124137c83711SBram Moolenaar let lines =<< trim END 124237c83711SBram Moolenaar vim9script 124337c83711SBram Moolenaar cexpr 'File' 124437c83711SBram Moolenaar .. ' someFile' .. 124537c83711SBram Moolenaar ' line 19' 124637c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 124737c83711SBram Moolenaar END 124837c83711SBram Moolenaar CheckScriptSuccess(lines) 124937c83711SBram Moolenaar set errorformat& 125037c83711SBram Moolenaarenddef 125137c83711SBram Moolenaar 1252c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1253c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1254c9edd6b5SBram Moolenaar let lines =<< trim END 1255c9edd6b5SBram Moolenaar vim9script 1256c9edd6b5SBram Moolenaar func g:Status() 1257c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1258c9edd6b5SBram Moolenaar endfunc 1259c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1260c9edd6b5SBram Moolenaar redrawstatus 1261c9edd6b5SBram Moolenaar set laststatus statusline= 1262c9edd6b5SBram Moolenaar END 1263c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1264c9edd6b5SBram Moolenaarenddef 1265c9edd6b5SBram Moolenaar 1266b209750bSBram Moolenaardef Test_list_vimscript() 1267b209750bSBram Moolenaar # checks line continuation and comments 1268b209750bSBram Moolenaar let lines =<< trim END 1269b209750bSBram Moolenaar vim9script 1270b209750bSBram Moolenaar let mylist = [ 1271b209750bSBram Moolenaar 'one', 1272b209750bSBram Moolenaar # comment 1273b209750bSBram Moolenaar 'two', # empty line follows 1274b209750bSBram Moolenaar 1275b209750bSBram Moolenaar 'three', 1276b209750bSBram Moolenaar ] 1277b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1278b209750bSBram Moolenaar END 1279b209750bSBram Moolenaar CheckScriptSuccess(lines) 128066250c93SBram Moolenaar 128166250c93SBram Moolenaar # check all lines from heredoc are kept 128266250c93SBram Moolenaar lines =<< trim END 128366250c93SBram Moolenaar # comment 1 128466250c93SBram Moolenaar two 128566250c93SBram Moolenaar # comment 3 128666250c93SBram Moolenaar 128766250c93SBram Moolenaar five 128866250c93SBram Moolenaar # comment 6 128966250c93SBram Moolenaar END 129066250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1291b209750bSBram Moolenaarenddef 1292b209750bSBram Moolenaar 12932a1381c3SBram Moolenaarif has('channel') 129440ee466cSBram Moolenaar let someJob = test_null_job() 129540ee466cSBram Moolenaar 129640ee466cSBram Moolenaar def FuncWithError() 129740ee466cSBram Moolenaar echomsg g:someJob 129840ee466cSBram Moolenaar enddef 129940ee466cSBram Moolenaar 130040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 130140ee466cSBram Moolenaar try 130240ee466cSBram Moolenaar call FuncWithError() 130340ee466cSBram Moolenaar catch 130440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 130540ee466cSBram Moolenaar endtry 130640ee466cSBram Moolenaar endfunc 13072a1381c3SBram Moolenaarendif 130840ee466cSBram Moolenaar 13098a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 13108a7d6542SBram Moolenaar vim9script 13118a7d6542SBram Moolenaar let name: string = 'bob' 13128a7d6542SBram Moolenaar def Concat(arg: string): string 13138a7d6542SBram Moolenaar return name .. arg 13148a7d6542SBram Moolenaar enddef 1315227a69deSBram Moolenaar g:result = Concat('bie') 1316227a69deSBram Moolenaar g:localname = name 13178a7d6542SBram Moolenaar 13188a7d6542SBram Moolenaar export const CONST = 1234 13198a7d6542SBram Moolenaar export let exported = 9876 13206e587dcbSBram Moolenaar export let exp_name = 'John' 13218a7d6542SBram Moolenaar export def Exported(): string 13228a7d6542SBram Moolenaar return 'Exported' 13238a7d6542SBram Moolenaar enddef 13248a7d6542SBram MoolenaarEND 13258a7d6542SBram Moolenaar 1326b3ca9824SBram Moolenaardef Undo_export_script_lines() 1327b3ca9824SBram Moolenaar unlet g:result 1328b3ca9824SBram Moolenaar unlet g:localname 1329b3ca9824SBram Moolenaarenddef 1330b3ca9824SBram Moolenaar 13315269bd2aSBram Moolenaardef Test_vim9_import_export() 13328a7d6542SBram Moolenaar let import_script_lines =<< trim END 13338a7d6542SBram Moolenaar vim9script 13348a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 13358a7d6542SBram Moolenaar g:imported = exported 13366e587dcbSBram Moolenaar exported += 3 13376e587dcbSBram Moolenaar g:imported_added = exported 13388a7d6542SBram Moolenaar g:imported_func = Exported() 13396e587dcbSBram Moolenaar 134040f4f7a4SBram Moolenaar def GetExported(): string 134140f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 134240f4f7a4SBram Moolenaar return local_dict.ref() 134340f4f7a4SBram Moolenaar enddef 134440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 134540f4f7a4SBram Moolenaar 13466e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 13476e587dcbSBram Moolenaar g:imported_name = exp_name 13486e587dcbSBram Moolenaar exp_name ..= ' Doe' 13496e587dcbSBram Moolenaar g:imported_name_appended = exp_name 13505381c7a1SBram Moolenaar g:imported_later = exported 13518a7d6542SBram Moolenaar END 13528a7d6542SBram Moolenaar 13538a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 13548a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 13558a7d6542SBram Moolenaar 13568a7d6542SBram Moolenaar source Ximport.vim 13578a7d6542SBram Moolenaar 13588a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 13598a7d6542SBram Moolenaar assert_equal('bob', g:localname) 13608a7d6542SBram Moolenaar assert_equal(9876, g:imported) 13616e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 13625381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 13638a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 136440f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 13656e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 13666e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 13678a7d6542SBram Moolenaar assert_false(exists('g:name')) 13688a7d6542SBram Moolenaar 1369b3ca9824SBram Moolenaar Undo_export_script_lines() 13708a7d6542SBram Moolenaar unlet g:imported 13716e587dcbSBram Moolenaar unlet g:imported_added 13725381c7a1SBram Moolenaar unlet g:imported_later 13738a7d6542SBram Moolenaar unlet g:imported_func 13746e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 13758a7d6542SBram Moolenaar delete('Ximport.vim') 1376f2d5c240SBram Moolenaar 13771c991144SBram Moolenaar # similar, with line breaks 13781c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 13791c991144SBram Moolenaar vim9script 13801c991144SBram Moolenaar import { 13811c991144SBram Moolenaar exported, 13821c991144SBram Moolenaar Exported, 13831c991144SBram Moolenaar } 13841c991144SBram Moolenaar from 13851c991144SBram Moolenaar './Xexport.vim' 13861c991144SBram Moolenaar g:imported = exported 13871c991144SBram Moolenaar exported += 5 13881c991144SBram Moolenaar g:imported_added = exported 13891c991144SBram Moolenaar g:imported_func = Exported() 13901c991144SBram Moolenaar END 13911c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 13921c991144SBram Moolenaar source Ximport_lbr.vim 13931c991144SBram Moolenaar 13941c991144SBram Moolenaar assert_equal(9876, g:imported) 13951c991144SBram Moolenaar assert_equal(9881, g:imported_added) 13961c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 13971c991144SBram Moolenaar 13981c991144SBram Moolenaar # exported script not sourced again 13991c991144SBram Moolenaar assert_false(exists('g:result')) 14001c991144SBram Moolenaar unlet g:imported 14011c991144SBram Moolenaar unlet g:imported_added 14021c991144SBram Moolenaar unlet g:imported_func 14031c991144SBram Moolenaar delete('Ximport_lbr.vim') 14041c991144SBram Moolenaar 14051c991144SBram Moolenaar # import inside :def function 14065381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 14075381c7a1SBram Moolenaar vim9script 14085381c7a1SBram Moolenaar def ImportInDef() 14095381c7a1SBram Moolenaar import exported from './Xexport.vim' 14105381c7a1SBram Moolenaar g:imported = exported 14115381c7a1SBram Moolenaar exported += 7 14125381c7a1SBram Moolenaar g:imported_added = exported 14135381c7a1SBram Moolenaar enddef 14145381c7a1SBram Moolenaar ImportInDef() 14155381c7a1SBram Moolenaar END 14165381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 14175381c7a1SBram Moolenaar source Ximport2.vim 1418f5be8cdbSBram Moolenaar # TODO: this should be 9879 14195381c7a1SBram Moolenaar assert_equal(9876, g:imported) 14205381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 14215381c7a1SBram Moolenaar unlet g:imported 14225381c7a1SBram Moolenaar unlet g:imported_added 14235381c7a1SBram Moolenaar delete('Ximport2.vim') 14245381c7a1SBram Moolenaar 1425f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1426f2d5c240SBram Moolenaar vim9script 1427f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1428f2d5c240SBram Moolenaar def UseExport() 1429f2d5c240SBram Moolenaar g:imported = Export.exported 1430f2d5c240SBram Moolenaar enddef 1431f2d5c240SBram Moolenaar UseExport() 1432f2d5c240SBram Moolenaar END 1433f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1434f2d5c240SBram Moolenaar source Ximport.vim 14355381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1436f2d5c240SBram Moolenaar 1437599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1438599c89c8SBram Moolenaar vim9script 1439599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1440599c89c8SBram Moolenaar def Func() 1441599c89c8SBram Moolenaar let dummy = 1 1442599c89c8SBram Moolenaar let imported = Export + dummy 1443599c89c8SBram Moolenaar enddef 1444822ba247SBram Moolenaar defcompile 1445599c89c8SBram Moolenaar END 1446599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 144744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1448599c89c8SBram Moolenaar 1449599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1450599c89c8SBram Moolenaar vim9script 1451599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1452599c89c8SBram Moolenaar def Func() 1453599c89c8SBram Moolenaar let imported = Export . exported 1454599c89c8SBram Moolenaar enddef 1455822ba247SBram Moolenaar defcompile 1456599c89c8SBram Moolenaar END 1457599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 145844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1459599c89c8SBram Moolenaar 1460599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1461599c89c8SBram Moolenaar vim9script 1462599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1463599c89c8SBram Moolenaar def Func() 1464599c89c8SBram Moolenaar let imported = Export. 1465599c89c8SBram Moolenaar enddef 1466822ba247SBram Moolenaar defcompile 1467599c89c8SBram Moolenaar END 1468599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 146944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1470599c89c8SBram Moolenaar 14711c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 14721c991144SBram Moolenaar vim9script 14731c991144SBram Moolenaar import * 14741c991144SBram Moolenaar as Export 14751c991144SBram Moolenaar from 14761c991144SBram Moolenaar './Xexport.vim' 14771c991144SBram Moolenaar def UseExport() 14781c991144SBram Moolenaar g:imported = Export.exported 14791c991144SBram Moolenaar enddef 14801c991144SBram Moolenaar UseExport() 14811c991144SBram Moolenaar END 14821c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 14831c991144SBram Moolenaar source Ximport.vim 14841c991144SBram Moolenaar assert_equal(9883, g:imported) 14851c991144SBram Moolenaar 1486f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1487f2d5c240SBram Moolenaar vim9script 1488f2d5c240SBram Moolenaar import * from './Xexport.vim' 1489f2d5c240SBram Moolenaar END 1490f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 149144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1492f2d5c240SBram Moolenaar 1493f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1494fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1495fa29c8abSBram Moolenaar vim9script 1496fa29c8abSBram Moolenaar import name from './Xexport.vim' 1497fa29c8abSBram Moolenaar END 1498fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 149944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1500fa29c8abSBram Moolenaar 1501f5be8cdbSBram Moolenaar # try to import something that is already defined 15025269bd2aSBram Moolenaar let import_already_defined =<< trim END 15035269bd2aSBram Moolenaar vim9script 15045269bd2aSBram Moolenaar let exported = 'something' 15055269bd2aSBram Moolenaar import exported from './Xexport.vim' 15065269bd2aSBram Moolenaar END 15075269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 150844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15095269bd2aSBram Moolenaar 1510f5be8cdbSBram Moolenaar # try to import something that is already defined 15115269bd2aSBram Moolenaar import_already_defined =<< trim END 15125269bd2aSBram Moolenaar vim9script 15135269bd2aSBram Moolenaar let exported = 'something' 15145269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 15155269bd2aSBram Moolenaar END 15165269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 151744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15185269bd2aSBram Moolenaar 1519f5be8cdbSBram Moolenaar # try to import something that is already defined 15205269bd2aSBram Moolenaar import_already_defined =<< trim END 15215269bd2aSBram Moolenaar vim9script 15225269bd2aSBram Moolenaar let exported = 'something' 15235269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 15245269bd2aSBram Moolenaar END 15255269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 152644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 15275269bd2aSBram Moolenaar 1528f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1529fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1530fa29c8abSBram Moolenaar vim9script 1531fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1532fa29c8abSBram Moolenaar END 1533fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 153444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1535fa29c8abSBram Moolenaar 1536fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1537fa29c8abSBram Moolenaar vim9script 1538fa29c8abSBram Moolenaar import name './Xexport.vim' 1539fa29c8abSBram Moolenaar END 1540fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 154144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1542fa29c8abSBram Moolenaar 1543fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1544fa29c8abSBram Moolenaar vim9script 1545fa29c8abSBram Moolenaar import name from Xexport.vim 1546fa29c8abSBram Moolenaar END 1547fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 154844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1549fa29c8abSBram Moolenaar 1550fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1551fa29c8abSBram Moolenaar vim9script 1552fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1553fa29c8abSBram Moolenaar END 1554fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 155544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1556fa29c8abSBram Moolenaar 1557fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1558fa29c8abSBram Moolenaar vim9script 1559fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1560fa29c8abSBram Moolenaar END 15615269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 156244d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1563fa29c8abSBram Moolenaar 1564f2d5c240SBram Moolenaar delete('Ximport.vim') 15655269bd2aSBram Moolenaar delete('Ximport3.vim') 15668a7d6542SBram Moolenaar delete('Xexport.vim') 15678a7d6542SBram Moolenaar 1568f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1569750802b5SBram Moolenaar set cpo&vi 1570750802b5SBram Moolenaar let cpo_before = &cpo 1571750802b5SBram Moolenaar let lines =<< trim END 1572750802b5SBram Moolenaar vim9script 1573750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1574750802b5SBram Moolenaar END 1575750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1576750802b5SBram Moolenaar source Xvim9_script 1577750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1578750802b5SBram Moolenaar set cpo&vim 1579750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1580750802b5SBram Moolenaar delete('Xvim9_script') 1581750802b5SBram Moolenaarenddef 1582750802b5SBram Moolenaar 1583803af686SBram Moolenaarfunc g:Trigger() 1584803af686SBram Moolenaar source Ximport.vim 1585803af686SBram Moolenaar return "echo 'yes'\<CR>" 1586803af686SBram Moolenaarendfunc 1587803af686SBram Moolenaar 1588803af686SBram Moolenaardef Test_import_export_expr_map() 1589803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1590803af686SBram Moolenaar let export_lines =<< trim END 1591803af686SBram Moolenaar vim9script 1592803af686SBram Moolenaar export def That(): string 1593803af686SBram Moolenaar return 'yes' 1594803af686SBram Moolenaar enddef 1595803af686SBram Moolenaar END 1596803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1597803af686SBram Moolenaar 1598803af686SBram Moolenaar let import_lines =<< trim END 1599803af686SBram Moolenaar vim9script 1600803af686SBram Moolenaar import That from './Xexport_that.vim' 1601803af686SBram Moolenaar assert_equal('yes', That()) 1602803af686SBram Moolenaar END 1603803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1604803af686SBram Moolenaar 1605803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1606803af686SBram Moolenaar feedkeys('trigger', "xt") 1607803af686SBram Moolenaar 1608730b2483SBram Moolenaar delete('Xexport_that.vim') 1609803af686SBram Moolenaar delete('Ximport.vim') 1610803af686SBram Moolenaar nunmap trigger 1611803af686SBram Moolenaarenddef 1612803af686SBram Moolenaar 16138e1986e3SBram Moolenaardef Test_import_in_filetype() 16148e1986e3SBram Moolenaar # check that :import works when the buffer is locked 16158e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 16168e1986e3SBram Moolenaar let export_lines =<< trim END 16178e1986e3SBram Moolenaar vim9script 16188e1986e3SBram Moolenaar export let That = 'yes' 16198e1986e3SBram Moolenaar END 1620730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 16218e1986e3SBram Moolenaar 16228e1986e3SBram Moolenaar let import_lines =<< trim END 16238e1986e3SBram Moolenaar vim9script 1624730b2483SBram Moolenaar import That from './Xexport_ft.vim' 16258e1986e3SBram Moolenaar assert_equal('yes', That) 16268e1986e3SBram Moolenaar g:did_load_mytpe = 1 16278e1986e3SBram Moolenaar END 16288e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 16298e1986e3SBram Moolenaar 16308e1986e3SBram Moolenaar let save_rtp = &rtp 16318e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 16328e1986e3SBram Moolenaar 16338e1986e3SBram Moolenaar filetype plugin on 16348e1986e3SBram Moolenaar copen 16358e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 16368e1986e3SBram Moolenaar 16378e1986e3SBram Moolenaar quit! 1638730b2483SBram Moolenaar delete('Xexport_ft.vim') 16398e1986e3SBram Moolenaar delete('ftplugin', 'rf') 16408e1986e3SBram Moolenaar &rtp = save_rtp 16418e1986e3SBram Moolenaarenddef 16428e1986e3SBram Moolenaar 1643efa94447SBram Moolenaardef Test_use_import_in_mapping() 1644efa94447SBram Moolenaar let lines =<< trim END 1645efa94447SBram Moolenaar vim9script 1646efa94447SBram Moolenaar export def Funcx() 1647efa94447SBram Moolenaar g:result = 42 1648efa94447SBram Moolenaar enddef 1649efa94447SBram Moolenaar END 1650efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1651efa94447SBram Moolenaar lines =<< trim END 1652efa94447SBram Moolenaar vim9script 1653efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1654b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1655efa94447SBram Moolenaar END 1656efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1657efa94447SBram Moolenaar 1658efa94447SBram Moolenaar source Xmapscript.vim 1659b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1660efa94447SBram Moolenaar assert_equal(42, g:result) 1661efa94447SBram Moolenaar 1662efa94447SBram Moolenaar unlet g:result 1663efa94447SBram Moolenaar delete('XsomeExport.vim') 1664efa94447SBram Moolenaar delete('Xmapscript.vim') 1665b3ca9824SBram Moolenaar nunmap <F3> 1666efa94447SBram Moolenaarenddef 1667efa94447SBram Moolenaar 1668750802b5SBram Moolenaardef Test_vim9script_fails() 16698a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16708a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1671750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 16729721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 16739b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1674750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1675750802b5SBram Moolenaar 1676451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1677c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1678c785b9a7SBram Moolenaar 1679e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1680e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16818a7d6542SBram Moolenaarenddef 16828a7d6542SBram Moolenaar 1683f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1684101f4810SBram Moolenaar CheckRunVimInTerminal 1685101f4810SBram Moolenaar 16869bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1687c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16889bb3eb3eSBram Moolenaarendfunc 16899bb3eb3eSBram Moolenaar 1690c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1691101f4810SBram Moolenaar let export =<< trim END 1692101f4810SBram Moolenaar vim9script 1693101f4810SBram Moolenaar export def Foo(): number 1694101f4810SBram Moolenaar return 0 1695101f4810SBram Moolenaar enddef 1696101f4810SBram Moolenaar END 1697730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1698101f4810SBram Moolenaar 1699730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 17009bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 17019bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1702101f4810SBram Moolenaar 1703730b2483SBram Moolenaar delete('XexportCmd.vim') 17049bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 17059bb3eb3eSBram Moolenaarenddef 1706101f4810SBram Moolenaar 17074c17ad94SBram Moolenaardef Test_vim9script_reload_import() 17088a7d6542SBram Moolenaar let lines =<< trim END 17098a7d6542SBram Moolenaar vim9script 17108a7d6542SBram Moolenaar const var = '' 17118a7d6542SBram Moolenaar let valone = 1234 17128a7d6542SBram Moolenaar def MyFunc(arg: string) 17138a7d6542SBram Moolenaar valone = 5678 17148a7d6542SBram Moolenaar enddef 17158a7d6542SBram Moolenaar END 17168a7d6542SBram Moolenaar let morelines =<< trim END 17178a7d6542SBram Moolenaar let valtwo = 222 17188a7d6542SBram Moolenaar export def GetValtwo(): number 17198a7d6542SBram Moolenaar return valtwo 17208a7d6542SBram Moolenaar enddef 17218a7d6542SBram Moolenaar END 172203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17238a7d6542SBram Moolenaar source Xreload.vim 17248a7d6542SBram Moolenaar source Xreload.vim 17258a7d6542SBram Moolenaar source Xreload.vim 17268a7d6542SBram Moolenaar 17278a7d6542SBram Moolenaar let testlines =<< trim END 17288a7d6542SBram Moolenaar vim9script 17298a7d6542SBram Moolenaar def TheFunc() 17308a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 17318a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 17328a7d6542SBram Moolenaar enddef 17338a7d6542SBram Moolenaar TheFunc() 17348a7d6542SBram Moolenaar END 17358a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 17368a7d6542SBram Moolenaar source Ximport.vim 17378a7d6542SBram Moolenaar 1738f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1739f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 17408a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 17418a7d6542SBram Moolenaar source Ximport.vim 17428a7d6542SBram Moolenaar 1743f5be8cdbSBram Moolenaar # cannot declare a var twice 17448a7d6542SBram Moolenaar lines =<< trim END 17458a7d6542SBram Moolenaar vim9script 17468a7d6542SBram Moolenaar let valone = 1234 17478a7d6542SBram Moolenaar let valone = 5678 17488a7d6542SBram Moolenaar END 17498a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 175044d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17518a7d6542SBram Moolenaar 17528a7d6542SBram Moolenaar delete('Xreload.vim') 17538a7d6542SBram Moolenaar delete('Ximport.vim') 17548a7d6542SBram Moolenaarenddef 17558a7d6542SBram Moolenaar 175695006e3dSBram Moolenaardef s:RetSome(): string 175795006e3dSBram Moolenaar return 'some' 175895006e3dSBram Moolenaarenddef 175995006e3dSBram Moolenaar 1760fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1761fe465a01SBram Moolenaar" script-local name. 1762fe465a01SBram Moolenaardef Test_vim9script_funcref() 1763fe465a01SBram Moolenaar let sortlines =<< trim END 1764fe465a01SBram Moolenaar vim9script 1765fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1766bed36b93SBram Moolenaar return i2 - i1 1767fe465a01SBram Moolenaar enddef 1768fe465a01SBram Moolenaar 1769fe465a01SBram Moolenaar export def FastSort(): list<number> 1770fe465a01SBram Moolenaar return range(5)->sort(Compare) 1771fe465a01SBram Moolenaar enddef 1772fe465a01SBram Moolenaar END 1773fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1774fe465a01SBram Moolenaar 1775fe465a01SBram Moolenaar let lines =<< trim END 1776fe465a01SBram Moolenaar vim9script 1777fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1778fe465a01SBram Moolenaar def Test() 1779fe465a01SBram Moolenaar g:result = FastSort() 1780fe465a01SBram Moolenaar enddef 1781fe465a01SBram Moolenaar Test() 1782fe465a01SBram Moolenaar END 1783fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1784fe465a01SBram Moolenaar 1785fe465a01SBram Moolenaar source Xscript.vim 1786fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1787fe465a01SBram Moolenaar 1788fe465a01SBram Moolenaar unlet g:result 1789fe465a01SBram Moolenaar delete('Xsort.vim') 1790fe465a01SBram Moolenaar delete('Xscript.vim') 179195006e3dSBram Moolenaar 179295006e3dSBram Moolenaar let Funcref = function('s:RetSome') 179395006e3dSBram Moolenaar assert_equal('some', Funcref()) 1794fe465a01SBram Moolenaarenddef 1795fe465a01SBram Moolenaar 1796601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1797601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1798601e76acSBram Moolenaar" function reference. 1799c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1800c620c055SBram Moolenaar let filterLines =<< trim END 1801c620c055SBram Moolenaar vim9script 1802c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1803c620c055SBram Moolenaar return idx % 2 == 1 1804c620c055SBram Moolenaar enddef 1805c620c055SBram Moolenaar export def FastFilter(): list<number> 1806c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1807c620c055SBram Moolenaar enddef 1808601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1809601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1810601e76acSBram Moolenaar enddef 1811c620c055SBram Moolenaar END 1812c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1813c620c055SBram Moolenaar 1814c620c055SBram Moolenaar let lines =<< trim END 1815c620c055SBram Moolenaar vim9script 1816601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1817c620c055SBram Moolenaar def Test() 1818c620c055SBram Moolenaar let x: list<number> = FastFilter() 1819c620c055SBram Moolenaar enddef 1820c620c055SBram Moolenaar Test() 1821601e76acSBram Moolenaar def TestDirect() 1822601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1823601e76acSBram Moolenaar enddef 1824601e76acSBram Moolenaar TestDirect() 1825c620c055SBram Moolenaar END 1826601e76acSBram Moolenaar CheckScriptSuccess(lines) 1827c620c055SBram Moolenaar delete('Xfilter.vim') 1828c620c055SBram Moolenaarenddef 1829c620c055SBram Moolenaar 18304c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 18314c17ad94SBram Moolenaar let first_lines =<< trim END 18324c17ad94SBram Moolenaar vim9script 18334c17ad94SBram Moolenaar def FuncYes(): string 18344c17ad94SBram Moolenaar return 'yes' 18354c17ad94SBram Moolenaar enddef 18364c17ad94SBram Moolenaar END 183703afdcf1SBram Moolenaar let withno_lines =<< trim END 18384c17ad94SBram Moolenaar def FuncNo(): string 18394c17ad94SBram Moolenaar return 'no' 18404c17ad94SBram Moolenaar enddef 18414c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 18424c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 18434c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 184403afdcf1SBram Moolenaar enddef 184503afdcf1SBram Moolenaar END 184603afdcf1SBram Moolenaar let nono_lines =<< trim END 184703afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 184803afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 184944d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 18504c17ad94SBram Moolenaar enddef 18514c17ad94SBram Moolenaar END 18524c17ad94SBram Moolenaar 18534c17ad94SBram Moolenaar # FuncNo() is defined 185403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18554c17ad94SBram Moolenaar source Xreloaded.vim 18564c17ad94SBram Moolenaar g:DoCheck(true) 18574c17ad94SBram Moolenaar 18584c17ad94SBram Moolenaar # FuncNo() is not redefined 185903afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18604c17ad94SBram Moolenaar source Xreloaded.vim 186103afdcf1SBram Moolenaar g:DoCheck() 18624c17ad94SBram Moolenaar 18634c17ad94SBram Moolenaar # FuncNo() is back 186403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18654c17ad94SBram Moolenaar source Xreloaded.vim 186603afdcf1SBram Moolenaar g:DoCheck() 18674c17ad94SBram Moolenaar 18684c17ad94SBram Moolenaar delete('Xreloaded.vim') 18694c17ad94SBram Moolenaarenddef 18704c17ad94SBram Moolenaar 187189483d40SBram Moolenaardef Test_vim9script_reload_delvar() 187289483d40SBram Moolenaar # write the script with a script-local variable 187389483d40SBram Moolenaar let lines =<< trim END 187489483d40SBram Moolenaar vim9script 187589483d40SBram Moolenaar let var = 'string' 187689483d40SBram Moolenaar END 187789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 187889483d40SBram Moolenaar source XreloadVar.vim 187989483d40SBram Moolenaar 188089483d40SBram Moolenaar # now write the script using the same variable locally - works 188189483d40SBram Moolenaar lines =<< trim END 188289483d40SBram Moolenaar vim9script 188389483d40SBram Moolenaar def Func() 188489483d40SBram Moolenaar let var = 'string' 188589483d40SBram Moolenaar enddef 188689483d40SBram Moolenaar END 188789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 188889483d40SBram Moolenaar source XreloadVar.vim 188989483d40SBram Moolenaar 189089483d40SBram Moolenaar delete('XreloadVar.vim') 189189483d40SBram Moolenaarenddef 189289483d40SBram Moolenaar 18938a7d6542SBram Moolenaardef Test_import_absolute() 18948a7d6542SBram Moolenaar let import_lines = [ 1895e6085c53SBram Moolenaar 'vim9script', 1896e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1897e6085c53SBram Moolenaar 'def UseExported()', 1898e6085c53SBram Moolenaar ' g:imported_abs = exported', 1899e6085c53SBram Moolenaar ' exported = 8888', 1900e6085c53SBram Moolenaar ' g:imported_after = exported', 1901e6085c53SBram Moolenaar 'enddef', 1902e6085c53SBram Moolenaar 'UseExported()', 1903e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1904e6085c53SBram Moolenaar ] 19058a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19068a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19078a7d6542SBram Moolenaar 19088a7d6542SBram Moolenaar source Ximport_abs.vim 19098a7d6542SBram Moolenaar 19108a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19114e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1912675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1913675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1914675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1915675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1916675f716eSBram Moolenaar 'exported = 8888.*' .. 1917675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1918675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1919675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1920675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1921e6085c53SBram Moolenaar g:import_disassembled) 1922b3ca9824SBram Moolenaar 1923b3ca9824SBram Moolenaar Undo_export_script_lines() 19248a7d6542SBram Moolenaar unlet g:imported_abs 19254e12a5dfSBram Moolenaar unlet g:import_disassembled 19268a7d6542SBram Moolenaar 19278a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19288a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19298a7d6542SBram Moolenaarenddef 19308a7d6542SBram Moolenaar 19318a7d6542SBram Moolenaardef Test_import_rtp() 19328a7d6542SBram Moolenaar let import_lines = [ 1933e6085c53SBram Moolenaar 'vim9script', 1934e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1935e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1936e6085c53SBram Moolenaar ] 19378a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 19388a7d6542SBram Moolenaar mkdir('import') 19398a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 19408a7d6542SBram Moolenaar 19418a7d6542SBram Moolenaar let save_rtp = &rtp 19428a7d6542SBram Moolenaar &rtp = getcwd() 19438a7d6542SBram Moolenaar source Ximport_rtp.vim 19448a7d6542SBram Moolenaar &rtp = save_rtp 19458a7d6542SBram Moolenaar 19468a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 19478a7d6542SBram Moolenaar 1948b3ca9824SBram Moolenaar Undo_export_script_lines() 1949b3ca9824SBram Moolenaar unlet g:imported_rtp 19508a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 195189483d40SBram Moolenaar delete('import', 'rf') 19528a7d6542SBram Moolenaarenddef 19538a7d6542SBram Moolenaar 195425e0f586SBram Moolenaardef Test_import_compile_error() 195525e0f586SBram Moolenaar let export_lines = [ 195625e0f586SBram Moolenaar 'vim9script', 195725e0f586SBram Moolenaar 'export def ExpFunc(): string', 195825e0f586SBram Moolenaar ' return notDefined', 195925e0f586SBram Moolenaar 'enddef', 196025e0f586SBram Moolenaar ] 196125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 196225e0f586SBram Moolenaar 196325e0f586SBram Moolenaar let import_lines = [ 196425e0f586SBram Moolenaar 'vim9script', 196525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 196625e0f586SBram Moolenaar 'def ImpFunc()', 196725e0f586SBram Moolenaar ' echo ExpFunc()', 196825e0f586SBram Moolenaar 'enddef', 196925e0f586SBram Moolenaar 'defcompile', 197025e0f586SBram Moolenaar ] 197125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 197225e0f586SBram Moolenaar 197325e0f586SBram Moolenaar try 197425e0f586SBram Moolenaar source Ximport.vim 197525e0f586SBram Moolenaar catch /E1001/ 1976f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 197725e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 197825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 197925e0f586SBram Moolenaar endtry 198025e0f586SBram Moolenaar 198125e0f586SBram Moolenaar delete('Xexported.vim') 198225e0f586SBram Moolenaar delete('Ximport.vim') 198325e0f586SBram Moolenaarenddef 198425e0f586SBram Moolenaar 1985c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1986c4ce36d4SBram Moolenaar let lines = [ 1987c4ce36d4SBram Moolenaar 'vim9script', 1988c4ce36d4SBram Moolenaar 'def Func()', 1989c4ce36d4SBram Moolenaar ' eval [][0]', 1990c4ce36d4SBram Moolenaar 'enddef', 1991c4ce36d4SBram Moolenaar 'Func()', 1992c4ce36d4SBram Moolenaar ] 1993c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1994c4ce36d4SBram Moolenaar 1995c4ce36d4SBram Moolenaar for count in range(3) 1996c4ce36d4SBram Moolenaar try 1997c4ce36d4SBram Moolenaar source Xtestscript.vim 1998c4ce36d4SBram Moolenaar catch /E684/ 1999c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2000c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2001c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2002c4ce36d4SBram Moolenaar endtry 2003c4ce36d4SBram Moolenaar endfor 2004c4ce36d4SBram Moolenaar 2005c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2006c4ce36d4SBram Moolenaarenddef 2007c4ce36d4SBram Moolenaar 2008eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2009eef2102eSBram Moolenaar let export_lines =<< trim END 2010eef2102eSBram Moolenaar vim9script 2011eef2102eSBram Moolenaar export def Func() 2012eef2102eSBram Moolenaar echo 'imported' 2013eef2102eSBram Moolenaar enddef 2014eef2102eSBram Moolenaar END 2015eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2016eef2102eSBram Moolenaar 2017eef2102eSBram Moolenaar let lines =<< trim END 2018eef2102eSBram Moolenaar vim9script 2019eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2020eef2102eSBram Moolenaar def Func() 2021eef2102eSBram Moolenaar echo 'local to function' 2022eef2102eSBram Moolenaar enddef 2023eef2102eSBram Moolenaar END 2024eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2025eef2102eSBram Moolenaar 2026eef2102eSBram Moolenaar lines =<< trim END 2027eef2102eSBram Moolenaar vim9script 2028eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2029eef2102eSBram Moolenaar def Outer() 2030eef2102eSBram Moolenaar def Func() 2031eef2102eSBram Moolenaar echo 'local to function' 2032eef2102eSBram Moolenaar enddef 2033eef2102eSBram Moolenaar enddef 2034eef2102eSBram Moolenaar defcompile 2035eef2102eSBram Moolenaar END 2036eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2037eef2102eSBram Moolenaar 2038eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2039eef2102eSBram Moolenaarenddef 2040eef2102eSBram Moolenaar 2041b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2042b9a2cac3SBram Moolenaar let lines =<< trim END 2043b9a2cac3SBram Moolenaar vim9script 2044b9a2cac3SBram Moolenaar def Func() 2045b9a2cac3SBram Moolenaar echo 'one' 2046b9a2cac3SBram Moolenaar enddef 2047b9a2cac3SBram Moolenaar def Func() 2048b9a2cac3SBram Moolenaar echo 'two' 2049b9a2cac3SBram Moolenaar enddef 2050b9a2cac3SBram Moolenaar END 2051b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2052fa211f3cSBram Moolenaar 2053fa211f3cSBram Moolenaar lines =<< trim END 2054fa211f3cSBram Moolenaar vim9script 2055fa211f3cSBram Moolenaar def Foo(): string 2056fa211f3cSBram Moolenaar return 'foo' 2057fa211f3cSBram Moolenaar enddef 2058fa211f3cSBram Moolenaar def Func() 2059fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 2060fa211f3cSBram Moolenaar enddef 2061fa211f3cSBram Moolenaar defcompile 2062fa211f3cSBram Moolenaar END 2063fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2064b9a2cac3SBram Moolenaarenddef 2065b9a2cac3SBram Moolenaar 20668a7d6542SBram Moolenaardef Test_fixed_size_list() 2067f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 20688a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 20698a7d6542SBram Moolenaar l->remove(0) 20708a7d6542SBram Moolenaar l->add(5) 20718a7d6542SBram Moolenaar l->insert(99, 1) 20720f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20738a7d6542SBram Moolenaarenddef 20748a7d6542SBram Moolenaar 2075ae616494SBram Moolenaardef Test_no_insert_xit() 2076d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2077d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2078d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2079d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2080d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2081ae616494SBram Moolenaar 2082ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2083ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2084ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2085ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2086f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2087f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 2088f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2089f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2090f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2091ae616494SBram Moolenaarenddef 2092ae616494SBram Moolenaar 2093158906cfSBram Moolenaardef IfElse(what: number): string 2094158906cfSBram Moolenaar let res = '' 2095158906cfSBram Moolenaar if what == 1 2096158906cfSBram Moolenaar res = "one" 2097158906cfSBram Moolenaar elseif what == 2 2098158906cfSBram Moolenaar res = "two" 2099a259d8d3SBram Moolenaar else 2100158906cfSBram Moolenaar res = "three" 2101a259d8d3SBram Moolenaar endif 2102158906cfSBram Moolenaar return res 2103a259d8d3SBram Moolenaarenddef 2104a259d8d3SBram Moolenaar 2105158906cfSBram Moolenaardef Test_if_elseif_else() 2106158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2107158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2108158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21090f18b6d1SBram Moolenaarenddef 21100f18b6d1SBram Moolenaar 2111e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2112d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2113d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2114d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2115d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2116d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2117e8c4abbbSBram Moolenaarenddef 2118e8c4abbbSBram Moolenaar 21196d69bf60SBram Moolenaarlet g:bool_true = v:true 21206d69bf60SBram Moolenaarlet g:bool_false = v:false 21216d69bf60SBram Moolenaar 21226d69bf60SBram Moolenaardef Test_if_const_expr() 21236d69bf60SBram Moolenaar let res = false 21246d69bf60SBram Moolenaar if true ? true : false 21256d69bf60SBram Moolenaar res = true 21266d69bf60SBram Moolenaar endif 21276d69bf60SBram Moolenaar assert_equal(true, res) 21286d69bf60SBram Moolenaar 2129585fea7bSBram Moolenaar g:glob = 2 2130585fea7bSBram Moolenaar if false 21316797966dSBram Moolenaar execute('g:glob = 3') 2132585fea7bSBram Moolenaar endif 2133585fea7bSBram Moolenaar assert_equal(2, g:glob) 2134585fea7bSBram Moolenaar if true 21356797966dSBram Moolenaar execute('g:glob = 3') 2136585fea7bSBram Moolenaar endif 2137585fea7bSBram Moolenaar assert_equal(3, g:glob) 2138585fea7bSBram Moolenaar 21396d69bf60SBram Moolenaar res = false 21406d69bf60SBram Moolenaar if g:bool_true ? true : false 21416d69bf60SBram Moolenaar res = true 21426d69bf60SBram Moolenaar endif 21436d69bf60SBram Moolenaar assert_equal(true, res) 21446d69bf60SBram Moolenaar 21456d69bf60SBram Moolenaar res = false 21466d69bf60SBram Moolenaar if true ? g:bool_true : false 21476d69bf60SBram Moolenaar res = true 21486d69bf60SBram Moolenaar endif 21496d69bf60SBram Moolenaar assert_equal(true, res) 21506d69bf60SBram Moolenaar 21516d69bf60SBram Moolenaar res = false 21526d69bf60SBram Moolenaar if true ? true : g:bool_false 21536d69bf60SBram Moolenaar res = true 21546d69bf60SBram Moolenaar endif 21556d69bf60SBram Moolenaar assert_equal(true, res) 21566d69bf60SBram Moolenaar 21576d69bf60SBram Moolenaar res = false 21586d69bf60SBram Moolenaar if true ? false : true 21596d69bf60SBram Moolenaar res = true 21606d69bf60SBram Moolenaar endif 21616d69bf60SBram Moolenaar assert_equal(false, res) 21626d69bf60SBram Moolenaar 21636d69bf60SBram Moolenaar res = false 21646d69bf60SBram Moolenaar if false ? false : true 21656d69bf60SBram Moolenaar res = true 21666d69bf60SBram Moolenaar endif 21676d69bf60SBram Moolenaar assert_equal(true, res) 21686d69bf60SBram Moolenaar 21696d69bf60SBram Moolenaar res = false 21706d69bf60SBram Moolenaar if false ? true : false 21716d69bf60SBram Moolenaar res = true 21726d69bf60SBram Moolenaar endif 21736d69bf60SBram Moolenaar assert_equal(false, res) 21746d69bf60SBram Moolenaar 21756d69bf60SBram Moolenaar res = false 2176e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2177e8c4abbbSBram Moolenaar res = true 2178e8c4abbbSBram Moolenaar endif 2179e8c4abbbSBram Moolenaar assert_equal(false, res) 2180e8c4abbbSBram Moolenaar 2181e8c4abbbSBram Moolenaar res = false 21826d69bf60SBram Moolenaar if true && true 21836d69bf60SBram Moolenaar res = true 21846d69bf60SBram Moolenaar endif 21856d69bf60SBram Moolenaar assert_equal(true, res) 21866d69bf60SBram Moolenaar 21876d69bf60SBram Moolenaar res = false 21886d69bf60SBram Moolenaar if true && false 21896d69bf60SBram Moolenaar res = true 21906d69bf60SBram Moolenaar endif 21916d69bf60SBram Moolenaar assert_equal(false, res) 21926d69bf60SBram Moolenaar 21936d69bf60SBram Moolenaar res = false 21946d69bf60SBram Moolenaar if g:bool_true && false 21956d69bf60SBram Moolenaar res = true 21966d69bf60SBram Moolenaar endif 21976d69bf60SBram Moolenaar assert_equal(false, res) 21986d69bf60SBram Moolenaar 21996d69bf60SBram Moolenaar res = false 22006d69bf60SBram Moolenaar if true && g:bool_false 22016d69bf60SBram Moolenaar res = true 22026d69bf60SBram Moolenaar endif 22036d69bf60SBram Moolenaar assert_equal(false, res) 22046d69bf60SBram Moolenaar 22056d69bf60SBram Moolenaar res = false 22066d69bf60SBram Moolenaar if false && false 22076d69bf60SBram Moolenaar res = true 22086d69bf60SBram Moolenaar endif 22096d69bf60SBram Moolenaar assert_equal(false, res) 22106d69bf60SBram Moolenaar 22116d69bf60SBram Moolenaar res = false 22126d69bf60SBram Moolenaar if true || false 22136d69bf60SBram Moolenaar res = true 22146d69bf60SBram Moolenaar endif 22156d69bf60SBram Moolenaar assert_equal(true, res) 22166d69bf60SBram Moolenaar 22176d69bf60SBram Moolenaar res = false 22186d69bf60SBram Moolenaar if g:bool_true || false 22196d69bf60SBram Moolenaar res = true 22206d69bf60SBram Moolenaar endif 22216d69bf60SBram Moolenaar assert_equal(true, res) 22226d69bf60SBram Moolenaar 22236d69bf60SBram Moolenaar res = false 22246d69bf60SBram Moolenaar if true || g:bool_false 22256d69bf60SBram Moolenaar res = true 22266d69bf60SBram Moolenaar endif 22276d69bf60SBram Moolenaar assert_equal(true, res) 22286d69bf60SBram Moolenaar 22296d69bf60SBram Moolenaar res = false 22306d69bf60SBram Moolenaar if false || false 22316d69bf60SBram Moolenaar res = true 22326d69bf60SBram Moolenaar endif 22336d69bf60SBram Moolenaar assert_equal(false, res) 22343988f64fSBram Moolenaar 22353988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 22363988f64fSBram Moolenaar if false | eval 0 | endif 22373988f64fSBram Moolenaar if false | eval burp + 234 | endif 22383988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22393988f64fSBram Moolenaar if false 22403988f64fSBram Moolenaar burp 22413988f64fSBram Moolenaar endif 224280c34ca3SBram Moolenaarenddef 22436d69bf60SBram Moolenaar 224480c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2245d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2246d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2247d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2248d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 22496d69bf60SBram Moolenaarenddef 22506d69bf60SBram Moolenaar 225172abcf42SBram Moolenaardef RunNested(i: number): number 225272abcf42SBram Moolenaar let x: number = 0 225372abcf42SBram Moolenaar if i % 2 225472abcf42SBram Moolenaar if 1 2255f5be8cdbSBram Moolenaar # comment 225672abcf42SBram Moolenaar else 2257f5be8cdbSBram Moolenaar # comment 225872abcf42SBram Moolenaar endif 225972abcf42SBram Moolenaar x += 1 226072abcf42SBram Moolenaar else 226172abcf42SBram Moolenaar x += 1000 226272abcf42SBram Moolenaar endif 226372abcf42SBram Moolenaar return x 226472abcf42SBram Moolenaarenddef 226572abcf42SBram Moolenaar 226672abcf42SBram Moolenaardef Test_nested_if() 226772abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 226872abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 226972abcf42SBram Moolenaarenddef 227072abcf42SBram Moolenaar 2271ad39c094SBram Moolenaardef Test_execute_cmd() 2272ad39c094SBram Moolenaar new 2273ad39c094SBram Moolenaar setline(1, 'default') 2274d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2275ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2276a72cfb80SBram Moolenaar 2277d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2278a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2279a72cfb80SBram Moolenaar 2280d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2281ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2282a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2283ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2284a72cfb80SBram Moolenaar 2285d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2286ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2287a72cfb80SBram Moolenaar 2288ad39c094SBram Moolenaar let cmd_first = 'call ' 2289ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2290ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2291ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2292ad39c094SBram Moolenaar bwipe! 2293585fea7bSBram Moolenaar 22942d6b20d6SBram Moolenaar let n = true 22952d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22962d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22972d6b20d6SBram Moolenaar 2298e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2299e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2300e5abf7afSBram Moolenaar 2301d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2302d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2303d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2304ad39c094SBram Moolenaarenddef 2305ad39c094SBram Moolenaar 230647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2307f5be8cdbSBram Moolenaar # only checks line continuation 230847e880d6SBram Moolenaar let lines =<< trim END 230947e880d6SBram Moolenaar vim9script 231047e880d6SBram Moolenaar execute 'g:someVar' 231147e880d6SBram Moolenaar .. ' = ' .. 231247e880d6SBram Moolenaar '28' 231347e880d6SBram Moolenaar assert_equal(28, g:someVar) 231447e880d6SBram Moolenaar unlet g:someVar 231547e880d6SBram Moolenaar END 231647e880d6SBram Moolenaar CheckScriptSuccess(lines) 231747e880d6SBram Moolenaarenddef 231847e880d6SBram Moolenaar 2319ad39c094SBram Moolenaardef Test_echo_cmd() 2320a72cfb80SBram Moolenaar echo 'some' # comment 2321585fea7bSBram Moolenaar echon 'thing' 2322ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2323ad39c094SBram Moolenaar 2324a72cfb80SBram Moolenaar echo "some" # comment 2325a72cfb80SBram Moolenaar echon "thing" 2326a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2327a72cfb80SBram Moolenaar 2328ad39c094SBram Moolenaar let str1 = 'some' 2329ad39c094SBram Moolenaar let str2 = 'more' 2330ad39c094SBram Moolenaar echo str1 str2 2331ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2332a72cfb80SBram Moolenaar 2333d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2334ad39c094SBram Moolenaarenddef 2335ad39c094SBram Moolenaar 2336f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2337f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2338f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2339f93c7feaSBram Moolenaar echo 'clear' 2340df069eecSBram Moolenaar :1messages 2341f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2342f93c7feaSBram Moolenaar 2343d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2344f93c7feaSBram Moolenaarenddef 2345f93c7feaSBram Moolenaar 234647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2347f5be8cdbSBram Moolenaar # only checks line continuation 234847e880d6SBram Moolenaar let lines =<< trim END 234947e880d6SBram Moolenaar vim9script 235047e880d6SBram Moolenaar echomsg 'here' 235147e880d6SBram Moolenaar .. ' is ' .. 235247e880d6SBram Moolenaar 'a message' 235347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 235447e880d6SBram Moolenaar END 235547e880d6SBram Moolenaar CheckScriptSuccess(lines) 235647e880d6SBram Moolenaarenddef 235747e880d6SBram Moolenaar 2358f93c7feaSBram Moolenaardef Test_echoerr_cmd() 235940ee466cSBram Moolenaar try 236040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 236140ee466cSBram Moolenaar catch 236240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 236340ee466cSBram Moolenaar endtry 2364f93c7feaSBram Moolenaarenddef 2365f93c7feaSBram Moolenaar 236647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2367f5be8cdbSBram Moolenaar # only checks line continuation 236847e880d6SBram Moolenaar let lines =<< trim END 236947e880d6SBram Moolenaar vim9script 237047e880d6SBram Moolenaar try 237147e880d6SBram Moolenaar echoerr 'this' 237247e880d6SBram Moolenaar .. ' is ' .. 237347e880d6SBram Moolenaar 'wrong' 237447e880d6SBram Moolenaar catch 237547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 237647e880d6SBram Moolenaar endtry 237747e880d6SBram Moolenaar END 237847e880d6SBram Moolenaar CheckScriptSuccess(lines) 237947e880d6SBram Moolenaarenddef 238047e880d6SBram Moolenaar 238141fe0617SBram Moolenaardef Test_for_outside_of_function() 238241fe0617SBram Moolenaar let lines =<< trim END 238341fe0617SBram Moolenaar vim9script 238441fe0617SBram Moolenaar new 238541fe0617SBram Moolenaar for var in range(0, 3) 238641fe0617SBram Moolenaar append(line('$'), var) 238741fe0617SBram Moolenaar endfor 238841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 238941fe0617SBram Moolenaar bwipe! 239041fe0617SBram Moolenaar END 239141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 239241fe0617SBram Moolenaar source Xvim9for.vim 239341fe0617SBram Moolenaar delete('Xvim9for.vim') 239441fe0617SBram Moolenaarenddef 23958a7d6542SBram Moolenaar 2396e8c4abbbSBram Moolenaardef Test_for_loop() 2397e8c4abbbSBram Moolenaar let result = '' 2398e8c4abbbSBram Moolenaar for cnt in range(7) 2399e8c4abbbSBram Moolenaar if cnt == 4 2400e8c4abbbSBram Moolenaar break 2401e8c4abbbSBram Moolenaar endif 2402e8c4abbbSBram Moolenaar if cnt == 2 2403e8c4abbbSBram Moolenaar continue 2404e8c4abbbSBram Moolenaar endif 2405e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2406e8c4abbbSBram Moolenaar endfor 2407e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24080ad3e894SBram Moolenaar 24090ad3e894SBram Moolenaar let concat = '' 24100ad3e894SBram Moolenaar for str in eval('["one", "two"]') 24110ad3e894SBram Moolenaar concat ..= str 24120ad3e894SBram Moolenaar endfor 24130ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2414e8c4abbbSBram Moolenaarenddef 2415e8c4abbbSBram Moolenaar 2416e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2417675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2418675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2419451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2420822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2421451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2422675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2423675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2424675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2425e8c4abbbSBram Moolenaarenddef 2426e8c4abbbSBram Moolenaar 2427d0df1aacSBram Moolenaardef Test_while_loop() 2428d0df1aacSBram Moolenaar let result = '' 2429d0df1aacSBram Moolenaar let cnt = 0 2430d0df1aacSBram Moolenaar while cnt < 555 2431d0df1aacSBram Moolenaar if cnt == 3 2432d0df1aacSBram Moolenaar break 2433d0df1aacSBram Moolenaar endif 2434d0df1aacSBram Moolenaar cnt += 1 2435d0df1aacSBram Moolenaar if cnt == 2 2436d0df1aacSBram Moolenaar continue 2437d0df1aacSBram Moolenaar endif 2438d0df1aacSBram Moolenaar result ..= cnt .. '_' 2439d0df1aacSBram Moolenaar endwhile 2440d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2441d0df1aacSBram Moolenaarenddef 2442d0df1aacSBram Moolenaar 2443e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2444675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2445675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2446675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2447675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2448675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2449675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2450675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2451bd5da371SBram Moolenaarenddef 2452bd5da371SBram Moolenaar 24539645e2d9SBram Moolenaardef Test_interrupt_loop() 245497acfc78SBram Moolenaar let caught = false 24559645e2d9SBram Moolenaar let x = 0 245697acfc78SBram Moolenaar try 24579645e2d9SBram Moolenaar while 1 24589645e2d9SBram Moolenaar x += 1 24599645e2d9SBram Moolenaar if x == 100 24609645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 24619645e2d9SBram Moolenaar endif 24629645e2d9SBram Moolenaar endwhile 246397acfc78SBram Moolenaar catch 246497acfc78SBram Moolenaar caught = true 246597acfc78SBram Moolenaar assert_equal(100, x) 246697acfc78SBram Moolenaar endtry 246797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 246825859dd7SBram Moolenaar # consume the CTRL-C 246925859dd7SBram Moolenaar getchar(0) 24709645e2d9SBram Moolenaarenddef 247120431c9dSBram Moolenaar 24724fdae999SBram Moolenaardef Test_automatic_line_continuation() 24734fdae999SBram Moolenaar let mylist = [ 24744fdae999SBram Moolenaar 'one', 24754fdae999SBram Moolenaar 'two', 24764fdae999SBram Moolenaar 'three', 2477f5be8cdbSBram Moolenaar ] # comment 24784fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24794fdae999SBram Moolenaar 24804fdae999SBram Moolenaar let mydict = { 24814fdae999SBram Moolenaar 'one': 1, 24824fdae999SBram Moolenaar 'two': 2, 24834fdae999SBram Moolenaar 'three': 24844fdae999SBram Moolenaar 3, 2485f5be8cdbSBram Moolenaar } # comment 24864fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 24874fdae999SBram Moolenaar mydict = #{ 24882c330432SBram Moolenaar one: 1, # comment 24892c330432SBram Moolenaar two: # comment 24902c330432SBram Moolenaar 2, # comment 24912c330432SBram Moolenaar three: 3 # comment 24922c330432SBram Moolenaar } 24932c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 24942c330432SBram Moolenaar mydict = #{ 24952c330432SBram Moolenaar one: 1, 24964fdae999SBram Moolenaar two: 24974fdae999SBram Moolenaar 2, 24982c330432SBram Moolenaar three: 3 24994fdae999SBram Moolenaar } 25004fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2501e6085c53SBram Moolenaar 2502e6085c53SBram Moolenaar assert_equal( 2503e6085c53SBram Moolenaar ['one', 'two', 'three'], 2504e6085c53SBram Moolenaar split('one two three') 2505e6085c53SBram Moolenaar ) 25064fdae999SBram Moolenaarenddef 25074fdae999SBram Moolenaar 25087a092245SBram Moolenaardef Test_vim9_comment() 25097a092245SBram Moolenaar CheckScriptSuccess([ 25107a092245SBram Moolenaar 'vim9script', 25117a092245SBram Moolenaar '# something', 25127a092245SBram Moolenaar ]) 25137a092245SBram Moolenaar CheckScriptFailure([ 25147a092245SBram Moolenaar 'vim9script', 25157a092245SBram Moolenaar ':# something', 25167a092245SBram Moolenaar ], 'E488:') 25177a092245SBram Moolenaar CheckScriptFailure([ 25187a092245SBram Moolenaar '# something', 25197a092245SBram Moolenaar ], 'E488:') 25207a092245SBram Moolenaar CheckScriptFailure([ 25217a092245SBram Moolenaar ':# something', 25227a092245SBram Moolenaar ], 'E488:') 25237a092245SBram Moolenaar 25244a8d9f2eSBram Moolenaar { # block start 25254a8d9f2eSBram Moolenaar } # block end 25264a8d9f2eSBram Moolenaar CheckDefFailure([ 25274a8d9f2eSBram Moolenaar '{# comment', 25284a8d9f2eSBram Moolenaar ], 'E488:') 25294a8d9f2eSBram Moolenaar CheckDefFailure([ 25304a8d9f2eSBram Moolenaar '{', 25314a8d9f2eSBram Moolenaar '}# comment', 25324a8d9f2eSBram Moolenaar ], 'E488:') 25334a8d9f2eSBram Moolenaar 25344a8d9f2eSBram Moolenaar echo "yes" # comment 25354a8d9f2eSBram Moolenaar CheckDefFailure([ 25364a8d9f2eSBram Moolenaar 'echo "yes"# comment', 25374a8d9f2eSBram Moolenaar ], 'E488:') 25387a092245SBram Moolenaar CheckScriptSuccess([ 25397a092245SBram Moolenaar 'vim9script', 25407a092245SBram Moolenaar 'echo "yes" # something', 25417a092245SBram Moolenaar ]) 25427a092245SBram Moolenaar CheckScriptFailure([ 25437a092245SBram Moolenaar 'vim9script', 25447a092245SBram Moolenaar 'echo "yes"# something', 25457a092245SBram Moolenaar ], 'E121:') 25467a092245SBram Moolenaar CheckScriptFailure([ 25477a092245SBram Moolenaar 'vim9script', 25487a092245SBram Moolenaar 'echo# something', 25497a092245SBram Moolenaar ], 'E121:') 25507a092245SBram Moolenaar CheckScriptFailure([ 25517a092245SBram Moolenaar 'echo "yes" # something', 25527a092245SBram Moolenaar ], 'E121:') 25537a092245SBram Moolenaar 25544a8d9f2eSBram Moolenaar exe "echo" # comment 25554a8d9f2eSBram Moolenaar CheckDefFailure([ 25564a8d9f2eSBram Moolenaar 'exe "echo"# comment', 25574a8d9f2eSBram Moolenaar ], 'E488:') 25584a8d9f2eSBram Moolenaar CheckScriptSuccess([ 25594a8d9f2eSBram Moolenaar 'vim9script', 25604a8d9f2eSBram Moolenaar 'exe "echo" # something', 25614a8d9f2eSBram Moolenaar ]) 25624a8d9f2eSBram Moolenaar CheckScriptFailure([ 25634a8d9f2eSBram Moolenaar 'vim9script', 25644a8d9f2eSBram Moolenaar 'exe "echo"# something', 25654a8d9f2eSBram Moolenaar ], 'E121:') 25664a8d9f2eSBram Moolenaar CheckDefFailure([ 25674a8d9f2eSBram Moolenaar 'exe # comment', 25684a8d9f2eSBram Moolenaar ], 'E1015:') 25694a8d9f2eSBram Moolenaar CheckScriptFailure([ 25704a8d9f2eSBram Moolenaar 'vim9script', 25714a8d9f2eSBram Moolenaar 'exe# something', 25724a8d9f2eSBram Moolenaar ], 'E121:') 25734a8d9f2eSBram Moolenaar CheckScriptFailure([ 25744a8d9f2eSBram Moolenaar 'exe "echo" # something', 25754a8d9f2eSBram Moolenaar ], 'E121:') 25764a8d9f2eSBram Moolenaar 25777a092245SBram Moolenaar CheckDefFailure([ 25787a092245SBram Moolenaar 'try# comment', 25797a092245SBram Moolenaar ' echo "yes"', 25807a092245SBram Moolenaar 'catch', 25817a092245SBram Moolenaar 'endtry', 25827a092245SBram Moolenaar ], 'E488:') 25832c5ed4e3SBram Moolenaar CheckScriptFailure([ 25842c5ed4e3SBram Moolenaar 'vim9script', 25852c5ed4e3SBram Moolenaar 'try# comment', 25862c5ed4e3SBram Moolenaar 'echo "yes"', 25872c5ed4e3SBram Moolenaar ], 'E488:') 25887a092245SBram Moolenaar CheckDefFailure([ 25897a092245SBram Moolenaar 'try', 2590a72cfb80SBram Moolenaar ' throw#comment', 2591a72cfb80SBram Moolenaar 'catch', 2592a72cfb80SBram Moolenaar 'endtry', 2593a72cfb80SBram Moolenaar ], 'E1015:') 2594a72cfb80SBram Moolenaar CheckDefFailure([ 2595a72cfb80SBram Moolenaar 'try', 2596a72cfb80SBram Moolenaar ' throw "yes"#comment', 2597a72cfb80SBram Moolenaar 'catch', 2598a72cfb80SBram Moolenaar 'endtry', 2599a72cfb80SBram Moolenaar ], 'E488:') 2600a72cfb80SBram Moolenaar CheckDefFailure([ 2601a72cfb80SBram Moolenaar 'try', 26027a092245SBram Moolenaar ' echo "yes"', 26037a092245SBram Moolenaar 'catch# comment', 26047a092245SBram Moolenaar 'endtry', 26057a092245SBram Moolenaar ], 'E488:') 26062c5ed4e3SBram Moolenaar CheckScriptFailure([ 26072c5ed4e3SBram Moolenaar 'vim9script', 26082c5ed4e3SBram Moolenaar 'try', 26092c5ed4e3SBram Moolenaar ' echo "yes"', 26102c5ed4e3SBram Moolenaar 'catch# comment', 26112c5ed4e3SBram Moolenaar 'endtry', 26122c5ed4e3SBram Moolenaar ], 'E654:') 26132c5ed4e3SBram Moolenaar CheckDefFailure([ 26142c5ed4e3SBram Moolenaar 'try', 26152c5ed4e3SBram Moolenaar ' echo "yes"', 26162c5ed4e3SBram Moolenaar 'catch /pat/# comment', 26172c5ed4e3SBram Moolenaar 'endtry', 26182c5ed4e3SBram Moolenaar ], 'E488:') 26197a092245SBram Moolenaar CheckDefFailure([ 26207a092245SBram Moolenaar 'try', 26217a092245SBram Moolenaar 'echo "yes"', 26227a092245SBram Moolenaar 'catch', 26237a092245SBram Moolenaar 'endtry# comment', 26247a092245SBram Moolenaar ], 'E488:') 26252c5ed4e3SBram Moolenaar CheckScriptFailure([ 26262c5ed4e3SBram Moolenaar 'vim9script', 26272c5ed4e3SBram Moolenaar 'try', 26282c5ed4e3SBram Moolenaar ' echo "yes"', 26292c5ed4e3SBram Moolenaar 'catch', 26302c5ed4e3SBram Moolenaar 'endtry# comment', 26319b7bf9e9SBram Moolenaar ], 'E488:') 26322c5ed4e3SBram Moolenaar 26332c5ed4e3SBram Moolenaar CheckScriptSuccess([ 26342c5ed4e3SBram Moolenaar 'vim9script', 26352c5ed4e3SBram Moolenaar 'hi # comment', 26362c5ed4e3SBram Moolenaar ]) 26372c5ed4e3SBram Moolenaar CheckScriptFailure([ 26382c5ed4e3SBram Moolenaar 'vim9script', 26392c5ed4e3SBram Moolenaar 'hi# comment', 26402c5ed4e3SBram Moolenaar ], 'E416:') 26411966c248SBram Moolenaar CheckScriptSuccess([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'hi Search # comment', 26441966c248SBram Moolenaar ]) 26451966c248SBram Moolenaar CheckScriptFailure([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'hi Search# comment', 26481966c248SBram Moolenaar ], 'E416:') 26491966c248SBram Moolenaar CheckScriptSuccess([ 26501966c248SBram Moolenaar 'vim9script', 26511966c248SBram Moolenaar 'hi link This Search # comment', 26521966c248SBram Moolenaar ]) 26531966c248SBram Moolenaar CheckScriptFailure([ 26541966c248SBram Moolenaar 'vim9script', 26551966c248SBram Moolenaar 'hi link This That# comment', 26561966c248SBram Moolenaar ], 'E413:') 26571966c248SBram Moolenaar CheckScriptSuccess([ 26581966c248SBram Moolenaar 'vim9script', 26591966c248SBram Moolenaar 'hi clear This # comment', 26601966c248SBram Moolenaar 'hi clear # comment', 26611966c248SBram Moolenaar ]) 2662f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2663f5be8cdbSBram Moolenaar # hi clear This# comment', 26641966c248SBram Moolenaar CheckScriptFailure([ 26651966c248SBram Moolenaar 'vim9script', 26661966c248SBram Moolenaar 'hi clear# comment', 26671966c248SBram Moolenaar ], 'E416:') 26681966c248SBram Moolenaar 26691966c248SBram Moolenaar CheckScriptSuccess([ 26701966c248SBram Moolenaar 'vim9script', 26711966c248SBram Moolenaar 'hi Group term=bold', 26721966c248SBram Moolenaar 'match Group /todo/ # comment', 26731966c248SBram Moolenaar ]) 26741966c248SBram Moolenaar CheckScriptFailure([ 26751966c248SBram Moolenaar 'vim9script', 26761966c248SBram Moolenaar 'hi Group term=bold', 26771966c248SBram Moolenaar 'match Group /todo/# comment', 26781966c248SBram Moolenaar ], 'E488:') 26791966c248SBram Moolenaar CheckScriptSuccess([ 26801966c248SBram Moolenaar 'vim9script', 26811966c248SBram Moolenaar 'match # comment', 26821966c248SBram Moolenaar ]) 26831966c248SBram Moolenaar CheckScriptFailure([ 26841966c248SBram Moolenaar 'vim9script', 26851966c248SBram Moolenaar 'match# comment', 26861966c248SBram Moolenaar ], 'E475:') 26871966c248SBram Moolenaar CheckScriptSuccess([ 26881966c248SBram Moolenaar 'vim9script', 26891966c248SBram Moolenaar 'match none # comment', 26901966c248SBram Moolenaar ]) 26911966c248SBram Moolenaar CheckScriptFailure([ 26921966c248SBram Moolenaar 'vim9script', 26931966c248SBram Moolenaar 'match none# comment', 26941966c248SBram Moolenaar ], 'E475:') 26951966c248SBram Moolenaar 26961966c248SBram Moolenaar CheckScriptSuccess([ 26971966c248SBram Moolenaar 'vim9script', 26981966c248SBram Moolenaar 'menutrans clear # comment', 26991966c248SBram Moolenaar ]) 27001966c248SBram Moolenaar CheckScriptFailure([ 27011966c248SBram Moolenaar 'vim9script', 27021966c248SBram Moolenaar 'menutrans clear# comment text', 27031966c248SBram Moolenaar ], 'E474:') 27041966c248SBram Moolenaar 27051966c248SBram Moolenaar CheckScriptSuccess([ 27061966c248SBram Moolenaar 'vim9script', 27071966c248SBram Moolenaar 'syntax clear # comment', 27081966c248SBram Moolenaar ]) 27091966c248SBram Moolenaar CheckScriptFailure([ 27101966c248SBram Moolenaar 'vim9script', 27111966c248SBram Moolenaar 'syntax clear# comment text', 27121966c248SBram Moolenaar ], 'E28:') 27131966c248SBram Moolenaar CheckScriptSuccess([ 27141966c248SBram Moolenaar 'vim9script', 27151966c248SBram Moolenaar 'syntax keyword Word some', 27161966c248SBram Moolenaar 'syntax clear Word # comment', 27171966c248SBram Moolenaar ]) 27181966c248SBram Moolenaar CheckScriptFailure([ 27191966c248SBram Moolenaar 'vim9script', 27201966c248SBram Moolenaar 'syntax keyword Word some', 27211966c248SBram Moolenaar 'syntax clear Word# comment text', 27221966c248SBram Moolenaar ], 'E28:') 27231966c248SBram Moolenaar 27241966c248SBram Moolenaar CheckScriptSuccess([ 27251966c248SBram Moolenaar 'vim9script', 27261966c248SBram Moolenaar 'syntax list # comment', 27271966c248SBram Moolenaar ]) 27281966c248SBram Moolenaar CheckScriptFailure([ 27291966c248SBram Moolenaar 'vim9script', 27301966c248SBram Moolenaar 'syntax list# comment text', 27311966c248SBram Moolenaar ], 'E28:') 27321966c248SBram Moolenaar 27331966c248SBram Moolenaar CheckScriptSuccess([ 27341966c248SBram Moolenaar 'vim9script', 27351966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 27361966c248SBram Moolenaar ]) 27371966c248SBram Moolenaar CheckScriptFailure([ 27381966c248SBram Moolenaar 'vim9script', 27391966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 27401966c248SBram Moolenaar ], 'E475:') 27411966c248SBram Moolenaar 27421966c248SBram Moolenaar CheckScriptSuccess([ 27431966c248SBram Moolenaar 'vim9script', 27441966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 27451966c248SBram Moolenaar ]) 27461966c248SBram Moolenaar CheckScriptFailure([ 27471966c248SBram Moolenaar 'vim9script', 27481966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 27491966c248SBram Moolenaar ], 'E789:') 27501966c248SBram Moolenaar 27511966c248SBram Moolenaar CheckScriptSuccess([ 27521966c248SBram Moolenaar 'vim9script', 27531966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 27541966c248SBram Moolenaar ]) 27551966c248SBram Moolenaar CheckScriptFailure([ 27561966c248SBram Moolenaar 'vim9script', 27571966c248SBram Moolenaar 'syntax match Word /pat/# comment', 27581966c248SBram Moolenaar ], 'E402:') 27591966c248SBram Moolenaar 27601966c248SBram Moolenaar CheckScriptSuccess([ 27611966c248SBram Moolenaar 'vim9script', 27621966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 27631966c248SBram Moolenaar ]) 27641966c248SBram Moolenaar CheckScriptFailure([ 27651966c248SBram Moolenaar 'vim9script', 27661966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27671966c248SBram Moolenaar ], 'E475:') 27681966c248SBram Moolenaar CheckScriptFailure([ 27691966c248SBram Moolenaar 'vim9script', 27701966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27711966c248SBram Moolenaar ], 'E406:') 27721966c248SBram Moolenaar CheckScriptFailure([ 27731966c248SBram Moolenaar 'vim9script', 27741966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27751966c248SBram Moolenaar ], 'E475:') 27761966c248SBram Moolenaar 27771966c248SBram Moolenaar CheckScriptSuccess([ 27781966c248SBram Moolenaar 'vim9script', 27791966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27801966c248SBram Moolenaar ]) 27811966c248SBram Moolenaar CheckScriptFailure([ 27821966c248SBram Moolenaar 'vim9script', 27831966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2784d032f34aSBram Moolenaar ], 'E402:') 27851966c248SBram Moolenaar 27861966c248SBram Moolenaar CheckScriptSuccess([ 27871966c248SBram Moolenaar 'vim9script', 27881966c248SBram Moolenaar 'syntax sync # comment', 27891966c248SBram Moolenaar ]) 27901966c248SBram Moolenaar CheckScriptFailure([ 27911966c248SBram Moolenaar 'vim9script', 27921966c248SBram Moolenaar 'syntax sync# comment', 27931966c248SBram Moolenaar ], 'E404:') 27941966c248SBram Moolenaar CheckScriptSuccess([ 27951966c248SBram Moolenaar 'vim9script', 27961966c248SBram Moolenaar 'syntax sync ccomment # comment', 27971966c248SBram Moolenaar ]) 27981966c248SBram Moolenaar CheckScriptFailure([ 27991966c248SBram Moolenaar 'vim9script', 28001966c248SBram Moolenaar 'syntax sync ccomment# comment', 28011966c248SBram Moolenaar ], 'E404:') 28021966c248SBram Moolenaar 28031966c248SBram Moolenaar CheckScriptSuccess([ 28041966c248SBram Moolenaar 'vim9script', 28051966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 28061966c248SBram Moolenaar ]) 28071966c248SBram Moolenaar CheckScriptFailure([ 28081966c248SBram Moolenaar 'vim9script', 28091966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 28101966c248SBram Moolenaar ], 'E475:') 2811a72cfb80SBram Moolenaar 2812a72cfb80SBram Moolenaar CheckScriptSuccess([ 2813a72cfb80SBram Moolenaar 'vim9script', 2814a72cfb80SBram Moolenaar 'command Echo echo # comment', 2815a72cfb80SBram Moolenaar 'command Echo # comment', 2816a72cfb80SBram Moolenaar ]) 2817a72cfb80SBram Moolenaar CheckScriptFailure([ 2818a72cfb80SBram Moolenaar 'vim9script', 2819a72cfb80SBram Moolenaar 'command Echo echo# comment', 2820a72cfb80SBram Moolenaar 'Echo', 2821a72cfb80SBram Moolenaar ], 'E121:') 2822a72cfb80SBram Moolenaar CheckScriptFailure([ 2823a72cfb80SBram Moolenaar 'vim9script', 2824a72cfb80SBram Moolenaar 'command Echo# comment', 2825a72cfb80SBram Moolenaar ], 'E182:') 2826a72cfb80SBram Moolenaar CheckScriptFailure([ 2827a72cfb80SBram Moolenaar 'vim9script', 2828a72cfb80SBram Moolenaar 'command Echo echo', 2829a72cfb80SBram Moolenaar 'command Echo# comment', 2830a72cfb80SBram Moolenaar ], 'E182:') 2831a72cfb80SBram Moolenaar 2832a72cfb80SBram Moolenaar CheckScriptSuccess([ 2833a72cfb80SBram Moolenaar 'vim9script', 2834a72cfb80SBram Moolenaar 'function # comment', 2835a72cfb80SBram Moolenaar ]) 2836a72cfb80SBram Moolenaar CheckScriptFailure([ 2837a72cfb80SBram Moolenaar 'vim9script', 28389898107fSBram Moolenaar 'function " comment', 28399898107fSBram Moolenaar ], 'E129:') 28409898107fSBram Moolenaar CheckScriptFailure([ 28419898107fSBram Moolenaar 'vim9script', 2842a72cfb80SBram Moolenaar 'function# comment', 2843a72cfb80SBram Moolenaar ], 'E129:') 2844a72cfb80SBram Moolenaar CheckScriptSuccess([ 2845a72cfb80SBram Moolenaar 'vim9script', 2846a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2847a72cfb80SBram Moolenaar ]) 2848a72cfb80SBram Moolenaar CheckScriptFailure([ 2849a72cfb80SBram Moolenaar 'vim9script', 2850a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2851a72cfb80SBram Moolenaar ], 'E488:') 2852a72cfb80SBram Moolenaar 2853a72cfb80SBram Moolenaar CheckScriptSuccess([ 2854a72cfb80SBram Moolenaar 'vim9script', 28554c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2856a72cfb80SBram Moolenaar 'endfunc', 28574c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2858a72cfb80SBram Moolenaar ]) 2859a72cfb80SBram Moolenaar CheckScriptFailure([ 2860a72cfb80SBram Moolenaar 'vim9script', 28614c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2862a72cfb80SBram Moolenaar 'endfunc', 28634c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2864a72cfb80SBram Moolenaar ], 'E488:') 2865a72cfb80SBram Moolenaar 2866a72cfb80SBram Moolenaar CheckScriptSuccess([ 2867a72cfb80SBram Moolenaar 'vim9script', 2868a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2869a72cfb80SBram Moolenaar ]) 2870a72cfb80SBram Moolenaar CheckScriptFailure([ 2871a72cfb80SBram Moolenaar 'vim9script', 2872a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2873a72cfb80SBram Moolenaar ], 'E488:') 2874e7e4838fSBram Moolenaar 2875e7e4838fSBram Moolenaar CheckScriptFailure([ 2876e7e4838fSBram Moolenaar 'def Test() " comment', 2877e7e4838fSBram Moolenaar 'enddef', 2878e7e4838fSBram Moolenaar ], 'E488:') 2879e7e4838fSBram Moolenaar CheckScriptFailure([ 2880e7e4838fSBram Moolenaar 'vim9script', 2881e7e4838fSBram Moolenaar 'def Test() " comment', 2882e7e4838fSBram Moolenaar 'enddef', 2883e7e4838fSBram Moolenaar ], 'E488:') 2884e7e4838fSBram Moolenaar 2885e7e4838fSBram Moolenaar CheckScriptSuccess([ 2886e7e4838fSBram Moolenaar 'func Test() " comment', 2887e7e4838fSBram Moolenaar 'endfunc', 2888e7e4838fSBram Moolenaar ]) 28899898107fSBram Moolenaar CheckScriptSuccess([ 2890e7e4838fSBram Moolenaar 'vim9script', 2891e7e4838fSBram Moolenaar 'func Test() " comment', 2892e7e4838fSBram Moolenaar 'endfunc', 28939898107fSBram Moolenaar ]) 2894e7e4838fSBram Moolenaar 2895e7e4838fSBram Moolenaar CheckScriptSuccess([ 2896e7e4838fSBram Moolenaar 'def Test() # comment', 2897e7e4838fSBram Moolenaar 'enddef', 2898e7e4838fSBram Moolenaar ]) 2899e7e4838fSBram Moolenaar CheckScriptFailure([ 2900e7e4838fSBram Moolenaar 'func Test() # comment', 2901e7e4838fSBram Moolenaar 'endfunc', 2902e7e4838fSBram Moolenaar ], 'E488:') 29032c5ed4e3SBram Moolenaarenddef 29042c5ed4e3SBram Moolenaar 29052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 29062c5ed4e3SBram Moolenaar CheckCanRunGui 29072c5ed4e3SBram Moolenaar 29082c5ed4e3SBram Moolenaar CheckScriptFailure([ 29092c5ed4e3SBram Moolenaar 'vim9script', 29102c5ed4e3SBram Moolenaar 'gui#comment' 29112c5ed4e3SBram Moolenaar ], 'E499:') 29122c5ed4e3SBram Moolenaar CheckScriptFailure([ 29132c5ed4e3SBram Moolenaar 'vim9script', 29142c5ed4e3SBram Moolenaar 'gui -f#comment' 29152c5ed4e3SBram Moolenaar ], 'E499:') 29167a092245SBram Moolenaarenddef 29177a092245SBram Moolenaar 2918a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 29196797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 29206797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2921a26b9700SBram Moolenaar 2922a26b9700SBram Moolenaar edit test.vim 2923a26b9700SBram Moolenaar doautocmd TabEnter #comment 2924a26b9700SBram Moolenaar assert_equal(1, g:entered) 2925a26b9700SBram Moolenaar 2926a26b9700SBram Moolenaar doautocmd TabEnter f.x 2927a26b9700SBram Moolenaar assert_equal(2, g:entered) 2928a26b9700SBram Moolenaar 2929a26b9700SBram Moolenaar g:entered = 0 2930a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2931a26b9700SBram Moolenaar assert_equal(2, g:entered) 2932a26b9700SBram Moolenaar 2933a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2934a26b9700SBram Moolenaar 2935a26b9700SBram Moolenaar au! TabEnter 2936a26b9700SBram Moolenaar unlet g:entered 2937d72c1bf0SBram Moolenaar 2938d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2939d72c1bf0SBram Moolenaar 'vim9script', 29406797966dSBram Moolenaar 'g:var = 123', 2941e55b1c09SBram Moolenaar 'b:var = 456', 2942e55b1c09SBram Moolenaar 'w:var = 777', 2943e55b1c09SBram Moolenaar 't:var = 888', 2944d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2945d72c1bf0SBram Moolenaar ]) 2946d72c1bf0SBram Moolenaar 2947d72c1bf0SBram Moolenaar CheckScriptFailure([ 2948d72c1bf0SBram Moolenaar 'vim9script', 2949d72c1bf0SBram Moolenaar 'let g:var = 123', 2950e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2951e55b1c09SBram Moolenaar 2952e55b1c09SBram Moolenaar CheckScriptFailure([ 2953e55b1c09SBram Moolenaar 'vim9script', 2954e55b1c09SBram Moolenaar 'let b:var = 123', 2955e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2956e55b1c09SBram Moolenaar 2957e55b1c09SBram Moolenaar CheckScriptFailure([ 2958e55b1c09SBram Moolenaar 'vim9script', 2959e55b1c09SBram Moolenaar 'let w:var = 123', 2960e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2961e55b1c09SBram Moolenaar 2962e55b1c09SBram Moolenaar CheckScriptFailure([ 2963e55b1c09SBram Moolenaar 'vim9script', 2964e55b1c09SBram Moolenaar 'let t:var = 123', 2965e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2966e55b1c09SBram Moolenaar 2967e55b1c09SBram Moolenaar CheckScriptFailure([ 2968e55b1c09SBram Moolenaar 'vim9script', 2969e55b1c09SBram Moolenaar 'let v:version = 123', 2970e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2971e55b1c09SBram Moolenaar 2972e55b1c09SBram Moolenaar CheckScriptFailure([ 2973e55b1c09SBram Moolenaar 'vim9script', 2974e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2975e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29766797966dSBram Moolenaar 29776797966dSBram Moolenaar CheckScriptFailure([ 29786797966dSBram Moolenaar 'vim9script', 29796797966dSBram Moolenaar 'g:var = 123', 298032e35117SBram Moolenaar 'unlet g:var# comment1', 2981d72c1bf0SBram Moolenaar ], 'E108:') 2982d72c1bf0SBram Moolenaar 2983d72c1bf0SBram Moolenaar CheckScriptFailure([ 2984d72c1bf0SBram Moolenaar 'let g:var = 123', 2985d72c1bf0SBram Moolenaar 'unlet g:var # something', 2986d72c1bf0SBram Moolenaar ], 'E488:') 2987faac4104SBram Moolenaar 2988faac4104SBram Moolenaar CheckScriptSuccess([ 2989faac4104SBram Moolenaar 'vim9script', 299032e35117SBram Moolenaar 'if 1 # comment2', 2991faac4104SBram Moolenaar ' echo "yes"', 2992faac4104SBram Moolenaar 'elseif 2 #comment', 2993faac4104SBram Moolenaar ' echo "no"', 2994faac4104SBram Moolenaar 'endif', 2995faac4104SBram Moolenaar ]) 2996faac4104SBram Moolenaar 2997faac4104SBram Moolenaar CheckScriptFailure([ 2998faac4104SBram Moolenaar 'vim9script', 299932e35117SBram Moolenaar 'if 1# comment3', 3000faac4104SBram Moolenaar ' echo "yes"', 3001faac4104SBram Moolenaar 'endif', 3002faac4104SBram Moolenaar ], 'E15:') 3003faac4104SBram Moolenaar 3004faac4104SBram Moolenaar CheckScriptFailure([ 3005faac4104SBram Moolenaar 'vim9script', 300632e35117SBram Moolenaar 'if 0 # comment4', 3007faac4104SBram Moolenaar ' echo "yes"', 3008faac4104SBram Moolenaar 'elseif 2#comment', 3009faac4104SBram Moolenaar ' echo "no"', 3010faac4104SBram Moolenaar 'endif', 3011faac4104SBram Moolenaar ], 'E15:') 3012faac4104SBram Moolenaar 3013faac4104SBram Moolenaar CheckScriptSuccess([ 3014faac4104SBram Moolenaar 'vim9script', 301532e35117SBram Moolenaar 'let v = 1 # comment5', 3016faac4104SBram Moolenaar ]) 3017faac4104SBram Moolenaar 3018faac4104SBram Moolenaar CheckScriptFailure([ 3019faac4104SBram Moolenaar 'vim9script', 302032e35117SBram Moolenaar 'let v = 1# comment6', 302132e35117SBram Moolenaar ], 'E15:') 3022faac4104SBram Moolenaar 3023faac4104SBram Moolenaar CheckScriptSuccess([ 3024faac4104SBram Moolenaar 'vim9script', 3025faac4104SBram Moolenaar 'new' 3026d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3027df069eecSBram Moolenaar ':$', 3028faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3029faac4104SBram Moolenaar 'bwipe!', 3030faac4104SBram Moolenaar ]) 3031faac4104SBram Moolenaar 3032f5be8cdbSBram Moolenaar CheckScriptFailure([ 3033f5be8cdbSBram Moolenaar 'vim9script', 3034f5be8cdbSBram Moolenaar 'new' 3035d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3036f5be8cdbSBram Moolenaar ':$', 3037f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3038f5be8cdbSBram Moolenaar 'bwipe!', 3039f5be8cdbSBram Moolenaar ], 'E488:') 3040f5be8cdbSBram Moolenaar 3041f5be8cdbSBram Moolenaar CheckScriptFailure([ 3042f5be8cdbSBram Moolenaar 'vim9script', 3043f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3044f5be8cdbSBram Moolenaar ], 'E477:') 3045a26b9700SBram Moolenaarenddef 3046a26b9700SBram Moolenaar 30477e5bd91dSBram Moolenaardef Test_finish() 30487e5bd91dSBram Moolenaar let lines =<< trim END 30497e5bd91dSBram Moolenaar vim9script 30506797966dSBram Moolenaar g:res = 'one' 30517e5bd91dSBram Moolenaar if v:false | finish | endif 30526797966dSBram Moolenaar g:res = 'two' 30537e5bd91dSBram Moolenaar finish 30546797966dSBram Moolenaar g:res = 'three' 30557e5bd91dSBram Moolenaar END 30567e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 30577e5bd91dSBram Moolenaar source Xfinished 30587e5bd91dSBram Moolenaar assert_equal('two', g:res) 30597e5bd91dSBram Moolenaar 30607e5bd91dSBram Moolenaar unlet g:res 30617e5bd91dSBram Moolenaar delete('Xfinished') 30627e5bd91dSBram Moolenaarenddef 30637e5bd91dSBram Moolenaar 306432e35117SBram Moolenaardef Test_let_func_call() 306532e35117SBram Moolenaar let lines =<< trim END 306632e35117SBram Moolenaar vim9script 306732e35117SBram Moolenaar func GetValue() 306832e35117SBram Moolenaar if exists('g:count') 306932e35117SBram Moolenaar let g:count += 1 307032e35117SBram Moolenaar else 307132e35117SBram Moolenaar let g:count = 1 307232e35117SBram Moolenaar endif 307332e35117SBram Moolenaar return 'this' 307432e35117SBram Moolenaar endfunc 307532e35117SBram Moolenaar let val: string = GetValue() 3076f5be8cdbSBram Moolenaar # env var is always a string 3077df671b46SBram Moolenaar let env = $TERM 307832e35117SBram Moolenaar END 307932e35117SBram Moolenaar writefile(lines, 'Xfinished') 308032e35117SBram Moolenaar source Xfinished 3081f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 308232e35117SBram Moolenaar assert_equal(1, g:count) 308332e35117SBram Moolenaar 308432e35117SBram Moolenaar unlet g:count 308532e35117SBram Moolenaar delete('Xfinished') 308632e35117SBram Moolenaarenddef 308732e35117SBram Moolenaar 308832e35117SBram Moolenaardef Test_let_missing_type() 308932e35117SBram Moolenaar let lines =<< trim END 309032e35117SBram Moolenaar vim9script 3091df671b46SBram Moolenaar let var = g:unknown 3092227a69deSBram Moolenaar END 3093822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 3094227a69deSBram Moolenaar 3095227a69deSBram Moolenaar lines =<< trim END 3096227a69deSBram Moolenaar vim9script 3097227a69deSBram Moolenaar let nr: number = 123 3098227a69deSBram Moolenaar let var = nr 3099227a69deSBram Moolenaar END 3100822ba247SBram Moolenaar CheckScriptSuccess(lines) 310132e35117SBram Moolenaarenddef 310232e35117SBram Moolenaar 3103c82a5b5dSBram Moolenaardef Test_let_declaration() 3104c82a5b5dSBram Moolenaar let lines =<< trim END 3105c82a5b5dSBram Moolenaar vim9script 3106c82a5b5dSBram Moolenaar let var: string 3107c82a5b5dSBram Moolenaar g:var_uninit = var 3108c82a5b5dSBram Moolenaar var = 'text' 3109c82a5b5dSBram Moolenaar g:var_test = var 3110f5be8cdbSBram Moolenaar # prefixing s: is optional 3111984dddbeSBram Moolenaar s:var = 'prefixed' 3112984dddbeSBram Moolenaar g:var_prefixed = s:var 3113984dddbeSBram Moolenaar 3114984dddbeSBram Moolenaar let s:other: number 3115984dddbeSBram Moolenaar other = 1234 3116984dddbeSBram Moolenaar g:other_var = other 311753b29e48SBram Moolenaar 311853b29e48SBram Moolenaar # type is inferred 311953b29e48SBram Moolenaar s:dict = {'a': 222} 312053b29e48SBram Moolenaar def GetDictVal(key: any) 312153b29e48SBram Moolenaar g:dict_val = s:dict[key] 312253b29e48SBram Moolenaar enddef 312353b29e48SBram Moolenaar GetDictVal('a') 3124c82a5b5dSBram Moolenaar END 3125c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3126c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3127c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3128984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3129984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 313053b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3131c82a5b5dSBram Moolenaar 3132c82a5b5dSBram Moolenaar unlet g:var_uninit 3133c82a5b5dSBram Moolenaar unlet g:var_test 3134984dddbeSBram Moolenaar unlet g:var_prefixed 3135984dddbeSBram Moolenaar unlet g:other_var 3136c82a5b5dSBram Moolenaarenddef 3137c82a5b5dSBram Moolenaar 3138c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3139c5b1c20bSBram Moolenaar let lines =<< trim END 3140c5b1c20bSBram Moolenaar vim9script 3141c5b1c20bSBram Moolenaar const var: string 3142c5b1c20bSBram Moolenaar END 3143c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3144c5b1c20bSBram Moolenaar 3145c5b1c20bSBram Moolenaar lines =<< trim END 3146c5b1c20bSBram Moolenaar vim9script 3147c5b1c20bSBram Moolenaar let 9var: string 3148c5b1c20bSBram Moolenaar END 3149c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3150c5b1c20bSBram Moolenaarenddef 3151c5b1c20bSBram Moolenaar 315234db91f7SBram Moolenaardef Test_let_type_check() 315334db91f7SBram Moolenaar let lines =<< trim END 315434db91f7SBram Moolenaar vim9script 315534db91f7SBram Moolenaar let var: string 315634db91f7SBram Moolenaar var = 1234 315734db91f7SBram Moolenaar END 3158451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3159984dddbeSBram Moolenaar 3160984dddbeSBram Moolenaar lines =<< trim END 3161984dddbeSBram Moolenaar vim9script 3162984dddbeSBram Moolenaar let var:string 3163984dddbeSBram Moolenaar END 3164984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3165c5b1c20bSBram Moolenaar 3166c5b1c20bSBram Moolenaar lines =<< trim END 3167c5b1c20bSBram Moolenaar vim9script 3168c5b1c20bSBram Moolenaar let var: asdf 3169c5b1c20bSBram Moolenaar END 3170c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3171a71e2633SBram Moolenaar 3172a71e2633SBram Moolenaar lines =<< trim END 3173a71e2633SBram Moolenaar vim9script 3174a71e2633SBram Moolenaar let s:l: list<number> 3175a71e2633SBram Moolenaar s:l = [] 3176a71e2633SBram Moolenaar END 3177a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3178a71e2633SBram Moolenaar 3179a71e2633SBram Moolenaar lines =<< trim END 3180a71e2633SBram Moolenaar vim9script 3181a71e2633SBram Moolenaar let s:d: dict<number> 3182a71e2633SBram Moolenaar s:d = {} 3183a71e2633SBram Moolenaar END 3184a71e2633SBram Moolenaar CheckScriptSuccess(lines) 318534db91f7SBram Moolenaarenddef 318634db91f7SBram Moolenaar 3187a5d0077eSBram Moolenaardef Test_forward_declaration() 3188a5d0077eSBram Moolenaar let lines =<< trim END 3189a5d0077eSBram Moolenaar vim9script 3190a5d0077eSBram Moolenaar def GetValue(): string 3191a5d0077eSBram Moolenaar return theVal 3192a5d0077eSBram Moolenaar enddef 3193a5d0077eSBram Moolenaar let theVal = 'something' 3194822ba247SBram Moolenaar g:initVal = GetValue() 3195a5d0077eSBram Moolenaar theVal = 'else' 3196a5d0077eSBram Moolenaar g:laterVal = GetValue() 3197a5d0077eSBram Moolenaar END 3198a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3199a5d0077eSBram Moolenaar source Xforward 3200a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3201a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3202a5d0077eSBram Moolenaar 3203a5d0077eSBram Moolenaar unlet g:initVal 3204a5d0077eSBram Moolenaar unlet g:laterVal 3205a5d0077eSBram Moolenaar delete('Xforward') 3206a5d0077eSBram Moolenaarenddef 3207a5d0077eSBram Moolenaar 32089721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 32099721fb4eSBram Moolenaar let legacy_lines =<< trim END 32109721fb4eSBram Moolenaar source Xvim9_script.vim 32119721fb4eSBram Moolenaar 32129721fb4eSBram Moolenaar call assert_false(exists('local')) 32139721fb4eSBram Moolenaar call assert_false(exists('exported')) 32149721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 32159721fb4eSBram Moolenaar call assert_equal('global', global) 32169721fb4eSBram Moolenaar call assert_equal('global', g:global) 32179721fb4eSBram Moolenaar 32189721fb4eSBram Moolenaar " imported variable becomes script-local 32199721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 32209721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 32219721fb4eSBram Moolenaar call assert_false(exists('exported')) 32229721fb4eSBram Moolenaar 32239721fb4eSBram Moolenaar " imported function becomes script-local 32249721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 32259721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 32269721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 32279721fb4eSBram Moolenaar END 32289721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 32299721fb4eSBram Moolenaar 32309721fb4eSBram Moolenaar let vim9_lines =<< trim END 32319721fb4eSBram Moolenaar vim9script 32329721fb4eSBram Moolenaar let local = 'local' 32339721fb4eSBram Moolenaar g:global = 'global' 32349721fb4eSBram Moolenaar export let exported = 'exported' 32359721fb4eSBram Moolenaar export def GetText(): string 32369721fb4eSBram Moolenaar return 'text' 32379721fb4eSBram Moolenaar enddef 32389721fb4eSBram Moolenaar END 32399721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 32409721fb4eSBram Moolenaar 32419721fb4eSBram Moolenaar source Xlegacy_script.vim 32429721fb4eSBram Moolenaar 32439721fb4eSBram Moolenaar assert_equal('global', g:global) 3244f5be8cdbSBram Moolenaar unlet g:global 32459721fb4eSBram Moolenaar 32469721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 32479721fb4eSBram Moolenaar delete('Xvim9_script.vim') 32489721fb4eSBram Moolenaarenddef 3249a5d0077eSBram Moolenaar 32507d699701SBram Moolenaarfunc Test_vim9script_not_global() 32517d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 32527d699701SBram Moolenaar let vim9lines =<< trim END 32537d699701SBram Moolenaar vim9script 32547d699701SBram Moolenaar let var = 'local' 32557d699701SBram Moolenaar func TheFunc() 32567d699701SBram Moolenaar echo 'local' 32577d699701SBram Moolenaar endfunc 32587d699701SBram Moolenaar def DefFunc() 32597d699701SBram Moolenaar echo 'local' 32607d699701SBram Moolenaar enddef 32617d699701SBram Moolenaar END 32627d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 32637d699701SBram Moolenaar source Xvim9script.vim 32647d699701SBram Moolenaar try 32657d699701SBram Moolenaar echo g:var 32667d699701SBram Moolenaar assert_report('did not fail') 32677d699701SBram Moolenaar catch /E121:/ 32687d699701SBram Moolenaar " caught 32697d699701SBram Moolenaar endtry 32707d699701SBram Moolenaar try 32717d699701SBram Moolenaar call TheFunc() 32727d699701SBram Moolenaar assert_report('did not fail') 32737d699701SBram Moolenaar catch /E117:/ 32747d699701SBram Moolenaar " caught 32757d699701SBram Moolenaar endtry 32767d699701SBram Moolenaar try 32777d699701SBram Moolenaar call DefFunc() 32787d699701SBram Moolenaar assert_report('did not fail') 32797d699701SBram Moolenaar catch /E117:/ 32807d699701SBram Moolenaar " caught 32817d699701SBram Moolenaar endtry 32827d699701SBram Moolenaar 328325859dd7SBram Moolenaar call delete('Xvim9script.vim') 32847d699701SBram Moolenaarendfunc 32857d699701SBram Moolenaar 3286eeb27bfeSBram Moolenaardef Test_vim9_copen() 3287eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3288eeb27bfeSBram Moolenaar copen 3289eeb27bfeSBram Moolenaar quit 3290eeb27bfeSBram Moolenaarenddef 3291eeb27bfeSBram Moolenaar 32922d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 32932d6b20d6SBram Moolenaardef Test_vim9_autoload() 32942d6b20d6SBram Moolenaar let lines =<< trim END 32952d6b20d6SBram Moolenaar vim9script 32962d6b20d6SBram Moolenaar def foo#test() 32972d6b20d6SBram Moolenaar echomsg getreg('"') 32982d6b20d6SBram Moolenaar enddef 32992d6b20d6SBram Moolenaar END 33002d6b20d6SBram Moolenaar 33012d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 33022d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 33032d6b20d6SBram Moolenaar let save_rtp = &rtp 33042d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 33052d6b20d6SBram Moolenaar augroup test 33062d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 33072d6b20d6SBram Moolenaar augroup END 33082d6b20d6SBram Moolenaar 33092d6b20d6SBram Moolenaar normal Y 33102d6b20d6SBram Moolenaar 33112d6b20d6SBram Moolenaar augroup test 33122d6b20d6SBram Moolenaar autocmd! 33132d6b20d6SBram Moolenaar augroup END 33142d6b20d6SBram Moolenaar delete('Xdir', 'rf') 33152d6b20d6SBram Moolenaar &rtp = save_rtp 33162d6b20d6SBram Moolenaarenddef 33172d6b20d6SBram Moolenaar 331881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 331981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 332081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 332181e17fbeSBram Moolenaar let lines =<< trim END 332281e17fbeSBram Moolenaar let s:counter = 1 332381e17fbeSBram Moolenaar def s:Func() 332481e17fbeSBram Moolenaar au! CursorHold 332581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 332681e17fbeSBram Moolenaar enddef 332781e17fbeSBram Moolenaar call s:Func() 332881e17fbeSBram Moolenaar doau CursorHold 332981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 333081e17fbeSBram Moolenaar au! CursorHold 333181e17fbeSBram Moolenaar END 333281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 333381e17fbeSBram Moolenaarenddef 333481e17fbeSBram Moolenaar 33353896a105SBram Moolenaardef Test_cmdline_win() 33363896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 33373896a105SBram Moolenaar # the command line window. 33383896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 33393896a105SBram Moolenaar let export_lines =<< trim END 33403896a105SBram Moolenaar vim9script 33413896a105SBram Moolenaar export let That = 'yes' 33423896a105SBram Moolenaar END 33433896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 33443896a105SBram Moolenaar let import_lines =<< trim END 33453896a105SBram Moolenaar vim9script 33463896a105SBram Moolenaar import That from './Xexport.vim' 33473896a105SBram Moolenaar END 33483896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 33493896a105SBram Moolenaar let save_rtp = &rtp 33503896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 33513896a105SBram Moolenaar syntax on 33523896a105SBram Moolenaar augroup CmdWin 33533896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 33543896a105SBram Moolenaar augroup END 33553896a105SBram Moolenaar # this will open and also close the cmdline window 33563896a105SBram Moolenaar feedkeys('q:', 'xt') 33573896a105SBram Moolenaar assert_equal('yes', g:got_there) 33583896a105SBram Moolenaar 33593896a105SBram Moolenaar augroup CmdWin 33603896a105SBram Moolenaar au! 33613896a105SBram Moolenaar augroup END 33623896a105SBram Moolenaar &rtp = save_rtp 33633896a105SBram Moolenaar delete('rtp', 'rf') 33643896a105SBram Moolenaarenddef 33653896a105SBram Moolenaar 3366e3d4685fSBram Moolenaardef Test_invalid_sid() 3367e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 336825859dd7SBram Moolenaar 3369e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3370d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3371e3d4685fSBram Moolenaar endif 3372e3d4685fSBram Moolenaar delete('Xdidit') 3373e3d4685fSBram Moolenaarenddef 3374e3d4685fSBram Moolenaar 3375f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3376f0afd9e1SBram Moolenaar let lines =<< trim END 3377f0afd9e1SBram Moolenaar let var: any 3378f0afd9e1SBram Moolenaar assert_equal(0, var) 3379f0afd9e1SBram Moolenaar END 3380f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3381f0afd9e1SBram Moolenaarenddef 3382f0afd9e1SBram Moolenaar 3383585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3384585fea7bSBram Moolenaardef Test_substitute_cmd() 3385585fea7bSBram Moolenaar new 3386585fea7bSBram Moolenaar setline(1, 'something') 3387585fea7bSBram Moolenaar :substitute(some(other( 3388585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3389585fea7bSBram Moolenaar bwipe! 3390585fea7bSBram Moolenaar 3391f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3392585fea7bSBram Moolenaar let lines =<< trim END 3393585fea7bSBram Moolenaar vim9script 3394585fea7bSBram Moolenaar new 3395585fea7bSBram Moolenaar setline(1, 'something') 3396585fea7bSBram Moolenaar :substitute(some(other( 3397585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3398585fea7bSBram Moolenaar bwipe! 3399585fea7bSBram Moolenaar END 3400585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3401585fea7bSBram Moolenaar source Xvim9lines 3402585fea7bSBram Moolenaar 3403585fea7bSBram Moolenaar delete('Xvim9lines') 3404585fea7bSBram Moolenaarenddef 3405585fea7bSBram Moolenaar 34068a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3407