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:') 824*dbeecb2bSBram Moolenaar CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:') 82508052228SBram Moolenaar CheckDefFailure(['const two'], 'E1021:') 82608052228SBram Moolenaar CheckDefFailure(['const &option'], 'E996:') 827*dbeecb2bSBram Moolenaar 828*dbeecb2bSBram Moolenaar let lines =<< trim END 829*dbeecb2bSBram Moolenaar const list = [1, 2, 3] 830*dbeecb2bSBram Moolenaar list[0] = 4 831*dbeecb2bSBram Moolenaar END 832*dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 83308052228SBram Moolenaarenddef 8348a7d6542SBram Moolenaar 835df069eecSBram Moolenaardef Test_range_no_colon() 836d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 837d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 838d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 839d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 840df069eecSBram Moolenaarenddef 841df069eecSBram Moolenaar 842df069eecSBram Moolenaar 8438a7d6542SBram Moolenaardef Test_block() 8448a7d6542SBram Moolenaar let outer = 1 8458a7d6542SBram Moolenaar { 8468a7d6542SBram Moolenaar let inner = 2 8478a7d6542SBram Moolenaar assert_equal(1, outer) 8488a7d6542SBram Moolenaar assert_equal(2, inner) 8498a7d6542SBram Moolenaar } 8508a7d6542SBram Moolenaar assert_equal(1, outer) 8518a7d6542SBram Moolenaarenddef 8528a7d6542SBram Moolenaar 85308052228SBram Moolenaardef Test_block_failure() 85408052228SBram Moolenaar CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 85508052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 85608052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 85708052228SBram Moolenaarenddef 8588a7d6542SBram Moolenaar 859d032f34aSBram Moolenaarfunc g:NoSuchFunc() 860d032f34aSBram Moolenaar echo 'none' 861d032f34aSBram Moolenaarendfunc 862d032f34aSBram Moolenaar 8638a7d6542SBram Moolenaardef Test_try_catch() 8648a7d6542SBram Moolenaar let l = [] 8657a092245SBram Moolenaar try # comment 8668a7d6542SBram Moolenaar add(l, '1') 8678a7d6542SBram Moolenaar throw 'wrong' 8688a7d6542SBram Moolenaar add(l, '2') 8697a092245SBram Moolenaar catch # comment 8708a7d6542SBram Moolenaar add(l, v:exception) 8717a092245SBram Moolenaar finally # comment 8728a7d6542SBram Moolenaar add(l, '3') 8737a092245SBram Moolenaar endtry # comment 8748a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 87568d130c6SBram Moolenaar 876e859312eSBram Moolenaar l = [] 877e859312eSBram Moolenaar try 878e859312eSBram Moolenaar try 879e859312eSBram Moolenaar add(l, '1') 880e859312eSBram Moolenaar throw 'wrong' 881e859312eSBram Moolenaar add(l, '2') 882e859312eSBram Moolenaar catch /right/ 883e859312eSBram Moolenaar add(l, v:exception) 884e859312eSBram Moolenaar endtry 885e859312eSBram Moolenaar catch /wrong/ 886e859312eSBram Moolenaar add(l, 'caught') 887e859312eSBram Moolenaar finally 888e859312eSBram Moolenaar add(l, 'finally') 889e859312eSBram Moolenaar endtry 890e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 891e859312eSBram Moolenaar 89268d130c6SBram Moolenaar let n: number 89368d130c6SBram Moolenaar try 89468d130c6SBram Moolenaar n = l[3] 89568d130c6SBram Moolenaar catch /E684:/ 89668d130c6SBram Moolenaar n = 99 89768d130c6SBram Moolenaar endtry 89868d130c6SBram Moolenaar assert_equal(99, n) 89968d130c6SBram Moolenaar 90068d130c6SBram Moolenaar try 901cc673e74SBram Moolenaar # string slice returns a string, not a number 90268d130c6SBram Moolenaar n = g:astring[3] 90356acb094SBram Moolenaar catch /E1029:/ 90468d130c6SBram Moolenaar n = 77 90568d130c6SBram Moolenaar endtry 90668d130c6SBram Moolenaar assert_equal(77, n) 90768d130c6SBram Moolenaar 90868d130c6SBram Moolenaar try 90968d130c6SBram Moolenaar n = l[g:astring] 91056acb094SBram Moolenaar catch /E1029:/ 91156acb094SBram Moolenaar n = 88 91268d130c6SBram Moolenaar endtry 91356acb094SBram Moolenaar assert_equal(88, n) 91468d130c6SBram Moolenaar 91568d130c6SBram Moolenaar try 91668d130c6SBram Moolenaar n = s:does_not_exist 91768d130c6SBram Moolenaar catch /E121:/ 918f0b9f43cSBram Moolenaar n = 111 919f0b9f43cSBram Moolenaar endtry 920f0b9f43cSBram Moolenaar assert_equal(111, n) 921f0b9f43cSBram Moolenaar 922f0b9f43cSBram Moolenaar try 923f0b9f43cSBram Moolenaar n = g:does_not_exist 924f0b9f43cSBram Moolenaar catch /E121:/ 92568d130c6SBram Moolenaar n = 121 92668d130c6SBram Moolenaar endtry 92768d130c6SBram Moolenaar assert_equal(121, n) 92868d130c6SBram Moolenaar 92968d130c6SBram Moolenaar let d = #{one: 1} 93068d130c6SBram Moolenaar try 93168d130c6SBram Moolenaar n = d[g:astring] 93268d130c6SBram Moolenaar catch /E716:/ 93368d130c6SBram Moolenaar n = 222 93468d130c6SBram Moolenaar endtry 93568d130c6SBram Moolenaar assert_equal(222, n) 936f0b9f43cSBram Moolenaar 937f0b9f43cSBram Moolenaar try 938f0b9f43cSBram Moolenaar n = -g:astring 939f0b9f43cSBram Moolenaar catch /E39:/ 940f0b9f43cSBram Moolenaar n = 233 941f0b9f43cSBram Moolenaar endtry 942f0b9f43cSBram Moolenaar assert_equal(233, n) 943f0b9f43cSBram Moolenaar 944f0b9f43cSBram Moolenaar try 945f0b9f43cSBram Moolenaar n = +g:astring 946f0b9f43cSBram Moolenaar catch /E1030:/ 947f0b9f43cSBram Moolenaar n = 244 948f0b9f43cSBram Moolenaar endtry 949f0b9f43cSBram Moolenaar assert_equal(244, n) 950f0b9f43cSBram Moolenaar 951f0b9f43cSBram Moolenaar try 952f0b9f43cSBram Moolenaar n = +g:alist 953f0b9f43cSBram Moolenaar catch /E745:/ 954f0b9f43cSBram Moolenaar n = 255 955f0b9f43cSBram Moolenaar endtry 956f0b9f43cSBram Moolenaar assert_equal(255, n) 957f0b9f43cSBram Moolenaar 958f0b9f43cSBram Moolenaar let nd: dict<any> 959f0b9f43cSBram Moolenaar try 960f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 961f0b9f43cSBram Moolenaar catch /E1029:/ 962f0b9f43cSBram Moolenaar n = 266 963f0b9f43cSBram Moolenaar endtry 964f0b9f43cSBram Moolenaar assert_equal(266, n) 965f0b9f43cSBram Moolenaar 966f0b9f43cSBram Moolenaar try 967f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 968f0b9f43cSBram Moolenaar catch /E1093:/ 969f0b9f43cSBram Moolenaar n = 277 970f0b9f43cSBram Moolenaar endtry 971f0b9f43cSBram Moolenaar assert_equal(277, n) 972f0b9f43cSBram Moolenaar 973e859312eSBram Moolenaar try 974e859312eSBram Moolenaar &ts = g:astring 975e859312eSBram Moolenaar catch /E1029:/ 976e859312eSBram Moolenaar n = 288 977e859312eSBram Moolenaar endtry 978e859312eSBram Moolenaar assert_equal(288, n) 979e859312eSBram Moolenaar 980e859312eSBram Moolenaar try 981e859312eSBram Moolenaar &backspace = 'asdf' 982e859312eSBram Moolenaar catch /E474:/ 983e859312eSBram Moolenaar n = 299 984e859312eSBram Moolenaar endtry 985e859312eSBram Moolenaar assert_equal(299, n) 986e859312eSBram Moolenaar 987e859312eSBram Moolenaar l = [1] 988e859312eSBram Moolenaar try 989e859312eSBram Moolenaar l[3] = 3 990e859312eSBram Moolenaar catch /E684:/ 991e859312eSBram Moolenaar n = 300 992e859312eSBram Moolenaar endtry 993e859312eSBram Moolenaar assert_equal(300, n) 994e859312eSBram Moolenaar 995e859312eSBram Moolenaar try 996e859312eSBram Moolenaar unlet g:does_not_exist 997e859312eSBram Moolenaar catch /E108:/ 998e859312eSBram Moolenaar n = 322 999e859312eSBram Moolenaar endtry 1000e859312eSBram Moolenaar assert_equal(322, n) 1001e859312eSBram Moolenaar 1002e859312eSBram Moolenaar try 1003e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 1004e859312eSBram Moolenaar catch /E721:/ 1005e859312eSBram Moolenaar n = 333 1006e859312eSBram Moolenaar endtry 1007e859312eSBram Moolenaar assert_equal(333, n) 1008e859312eSBram Moolenaar 1009e859312eSBram Moolenaar try 1010e859312eSBram Moolenaar l = DeletedFunc() 1011e859312eSBram Moolenaar catch /E933:/ 1012e859312eSBram Moolenaar n = 344 1013e859312eSBram Moolenaar endtry 1014e859312eSBram Moolenaar assert_equal(344, n) 1015d032f34aSBram Moolenaar 1016d032f34aSBram Moolenaar try 1017d032f34aSBram Moolenaar echo len(v:true) 1018d032f34aSBram Moolenaar catch /E701:/ 1019d032f34aSBram Moolenaar n = 355 1020d032f34aSBram Moolenaar endtry 1021d032f34aSBram Moolenaar assert_equal(355, n) 1022d032f34aSBram Moolenaar 1023d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 1024d032f34aSBram Moolenaar delfunc g:NoSuchFunc 1025d032f34aSBram Moolenaar try 1026d032f34aSBram Moolenaar echo P() 1027d032f34aSBram Moolenaar catch /E117:/ 1028d032f34aSBram Moolenaar n = 366 1029d032f34aSBram Moolenaar endtry 1030d032f34aSBram Moolenaar assert_equal(366, n) 1031d032f34aSBram Moolenaar 1032d032f34aSBram Moolenaar try 1033d032f34aSBram Moolenaar echo g:NoSuchFunc() 1034d032f34aSBram Moolenaar catch /E117:/ 1035d032f34aSBram Moolenaar n = 377 1036d032f34aSBram Moolenaar endtry 1037d032f34aSBram Moolenaar assert_equal(377, n) 1038d032f34aSBram Moolenaar 1039d032f34aSBram Moolenaar try 1040d032f34aSBram Moolenaar echo g:alist + 4 1041d032f34aSBram Moolenaar catch /E745:/ 1042d032f34aSBram Moolenaar n = 388 1043d032f34aSBram Moolenaar endtry 1044d032f34aSBram Moolenaar assert_equal(388, n) 1045d032f34aSBram Moolenaar 1046d032f34aSBram Moolenaar try 1047d032f34aSBram Moolenaar echo 4 + g:alist 1048d032f34aSBram Moolenaar catch /E745:/ 1049d032f34aSBram Moolenaar n = 399 1050d032f34aSBram Moolenaar endtry 1051d032f34aSBram Moolenaar assert_equal(399, n) 1052d032f34aSBram Moolenaar 1053d032f34aSBram Moolenaar try 1054d032f34aSBram Moolenaar echo g:alist.member 1055d032f34aSBram Moolenaar catch /E715:/ 1056d032f34aSBram Moolenaar n = 400 1057d032f34aSBram Moolenaar endtry 1058d032f34aSBram Moolenaar assert_equal(400, n) 1059d032f34aSBram Moolenaar 1060d032f34aSBram Moolenaar try 1061d032f34aSBram Moolenaar echo d.member 1062d032f34aSBram Moolenaar catch /E716:/ 1063d032f34aSBram Moolenaar n = 411 1064d032f34aSBram Moolenaar endtry 1065d032f34aSBram Moolenaar assert_equal(411, n) 10668a7d6542SBram Moolenaarenddef 10678a7d6542SBram Moolenaar 1068e859312eSBram Moolenaardef DeletedFunc(): list<any> 1069e859312eSBram Moolenaar return ['delete me'] 1070e859312eSBram Moolenaarenddef 1071e859312eSBram Moolenaardefcompile 1072e859312eSBram Moolenaardelfunc DeletedFunc 1073e859312eSBram Moolenaar 1074257cc5eeSBram Moolenaardef ThrowFromDef() 1075a72cfb80SBram Moolenaar throw "getout" # comment 1076257cc5eeSBram Moolenaarenddef 1077257cc5eeSBram Moolenaar 1078257cc5eeSBram Moolenaarfunc CatchInFunc() 1079257cc5eeSBram Moolenaar try 1080257cc5eeSBram Moolenaar call ThrowFromDef() 1081257cc5eeSBram Moolenaar catch 1082257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1083257cc5eeSBram Moolenaar endtry 1084257cc5eeSBram Moolenaarendfunc 1085257cc5eeSBram Moolenaar 1086257cc5eeSBram Moolenaardef CatchInDef() 1087257cc5eeSBram Moolenaar try 1088257cc5eeSBram Moolenaar ThrowFromDef() 1089257cc5eeSBram Moolenaar catch 1090257cc5eeSBram Moolenaar g:thrown_def = v:exception 1091257cc5eeSBram Moolenaar endtry 1092257cc5eeSBram Moolenaarenddef 1093257cc5eeSBram Moolenaar 1094f575adffSBram Moolenaardef ReturnFinally(): string 1095f575adffSBram Moolenaar try 1096f575adffSBram Moolenaar return 'intry' 1097f575adffSBram Moolenaar finally 1098f575adffSBram Moolenaar g:in_finally = 'finally' 1099f575adffSBram Moolenaar endtry 1100f575adffSBram Moolenaar return 'end' 1101f575adffSBram Moolenaarenddef 1102f575adffSBram Moolenaar 1103257cc5eeSBram Moolenaardef Test_try_catch_nested() 1104257cc5eeSBram Moolenaar CatchInFunc() 1105257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1106257cc5eeSBram Moolenaar 1107257cc5eeSBram Moolenaar CatchInDef() 1108257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1109f575adffSBram Moolenaar 1110f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1111f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1112f575adffSBram Moolenaarenddef 1113f575adffSBram Moolenaar 1114f575adffSBram Moolenaardef Test_try_catch_match() 1115f575adffSBram Moolenaar let seq = 'a' 1116f575adffSBram Moolenaar try 1117f575adffSBram Moolenaar throw 'something' 1118f575adffSBram Moolenaar catch /nothing/ 1119f575adffSBram Moolenaar seq ..= 'x' 1120f575adffSBram Moolenaar catch /some/ 1121f575adffSBram Moolenaar seq ..= 'b' 1122f575adffSBram Moolenaar catch /asdf/ 1123f575adffSBram Moolenaar seq ..= 'x' 1124e8c4abbbSBram Moolenaar catch ?a\?sdf? 1125e8c4abbbSBram Moolenaar seq ..= 'y' 1126f575adffSBram Moolenaar finally 1127f575adffSBram Moolenaar seq ..= 'c' 1128f575adffSBram Moolenaar endtry 1129f575adffSBram Moolenaar assert_equal('abc', seq) 1130257cc5eeSBram Moolenaarenddef 1131257cc5eeSBram Moolenaar 1132e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1133d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1134d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1135d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1136d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1137d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1138d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1139d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1140d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1141d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1142d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1143585fea7bSBram Moolenaar 1144d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1145d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1146e8c4abbbSBram Moolenaarenddef 1147e8c4abbbSBram Moolenaar 1148006ad48bSBram Moolenaardef Test_throw_vimscript() 1149f5be8cdbSBram Moolenaar # only checks line continuation 1150006ad48bSBram Moolenaar let lines =<< trim END 1151006ad48bSBram Moolenaar vim9script 1152006ad48bSBram Moolenaar try 1153006ad48bSBram Moolenaar throw 'one' 1154006ad48bSBram Moolenaar .. 'two' 1155006ad48bSBram Moolenaar catch 1156006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1157006ad48bSBram Moolenaar endtry 1158006ad48bSBram Moolenaar END 1159006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1160006ad48bSBram Moolenaarenddef 1161006ad48bSBram Moolenaar 1162ed677f55SBram Moolenaardef Test_error_in_nested_function() 1163ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1164ed677f55SBram Moolenaar let lines =<< trim END 1165ed677f55SBram Moolenaar vim9script 1166ed677f55SBram Moolenaar def Func() 1167ed677f55SBram Moolenaar Error() 1168ed677f55SBram Moolenaar g:test_var = 1 1169ed677f55SBram Moolenaar enddef 1170ed677f55SBram Moolenaar func Error() abort 1171ed677f55SBram Moolenaar eval [][0] 1172ed677f55SBram Moolenaar endfunc 1173ed677f55SBram Moolenaar Func() 1174ed677f55SBram Moolenaar END 1175ed677f55SBram Moolenaar g:test_var = 0 1176ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1177ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1178ed677f55SBram Moolenaarenddef 1179ed677f55SBram Moolenaar 118037c83711SBram Moolenaardef Test_cexpr_vimscript() 1181f5be8cdbSBram Moolenaar # only checks line continuation 118237c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 118337c83711SBram Moolenaar let lines =<< trim END 118437c83711SBram Moolenaar vim9script 118537c83711SBram Moolenaar cexpr 'File' 118637c83711SBram Moolenaar .. ' someFile' .. 118737c83711SBram Moolenaar ' line 19' 118837c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 118937c83711SBram Moolenaar END 119037c83711SBram Moolenaar CheckScriptSuccess(lines) 119137c83711SBram Moolenaar set errorformat& 119237c83711SBram Moolenaarenddef 119337c83711SBram Moolenaar 1194c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1195c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1196c9edd6b5SBram Moolenaar let lines =<< trim END 1197c9edd6b5SBram Moolenaar vim9script 1198c9edd6b5SBram Moolenaar func g:Status() 1199c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1200c9edd6b5SBram Moolenaar endfunc 1201c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1202c9edd6b5SBram Moolenaar redrawstatus 1203c9edd6b5SBram Moolenaar set laststatus statusline= 1204c9edd6b5SBram Moolenaar END 1205c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1206c9edd6b5SBram Moolenaarenddef 1207c9edd6b5SBram Moolenaar 1208b209750bSBram Moolenaardef Test_list_vimscript() 1209b209750bSBram Moolenaar # checks line continuation and comments 1210b209750bSBram Moolenaar let lines =<< trim END 1211b209750bSBram Moolenaar vim9script 1212b209750bSBram Moolenaar let mylist = [ 1213b209750bSBram Moolenaar 'one', 1214b209750bSBram Moolenaar # comment 1215b209750bSBram Moolenaar 'two', # empty line follows 1216b209750bSBram Moolenaar 1217b209750bSBram Moolenaar 'three', 1218b209750bSBram Moolenaar ] 1219b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1220b209750bSBram Moolenaar END 1221b209750bSBram Moolenaar CheckScriptSuccess(lines) 122266250c93SBram Moolenaar 122366250c93SBram Moolenaar # check all lines from heredoc are kept 122466250c93SBram Moolenaar lines =<< trim END 122566250c93SBram Moolenaar # comment 1 122666250c93SBram Moolenaar two 122766250c93SBram Moolenaar # comment 3 122866250c93SBram Moolenaar 122966250c93SBram Moolenaar five 123066250c93SBram Moolenaar # comment 6 123166250c93SBram Moolenaar END 123266250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1233b209750bSBram Moolenaarenddef 1234b209750bSBram Moolenaar 12352a1381c3SBram Moolenaarif has('channel') 123640ee466cSBram Moolenaar let someJob = test_null_job() 123740ee466cSBram Moolenaar 123840ee466cSBram Moolenaar def FuncWithError() 123940ee466cSBram Moolenaar echomsg g:someJob 124040ee466cSBram Moolenaar enddef 124140ee466cSBram Moolenaar 124240ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 124340ee466cSBram Moolenaar try 124440ee466cSBram Moolenaar call FuncWithError() 124540ee466cSBram Moolenaar catch 124640ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 124740ee466cSBram Moolenaar endtry 124840ee466cSBram Moolenaar endfunc 12492a1381c3SBram Moolenaarendif 125040ee466cSBram Moolenaar 12518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 12528a7d6542SBram Moolenaar vim9script 12538a7d6542SBram Moolenaar let name: string = 'bob' 12548a7d6542SBram Moolenaar def Concat(arg: string): string 12558a7d6542SBram Moolenaar return name .. arg 12568a7d6542SBram Moolenaar enddef 1257227a69deSBram Moolenaar g:result = Concat('bie') 1258227a69deSBram Moolenaar g:localname = name 12598a7d6542SBram Moolenaar 12608a7d6542SBram Moolenaar export const CONST = 1234 12618a7d6542SBram Moolenaar export let exported = 9876 12626e587dcbSBram Moolenaar export let exp_name = 'John' 12638a7d6542SBram Moolenaar export def Exported(): string 12648a7d6542SBram Moolenaar return 'Exported' 12658a7d6542SBram Moolenaar enddef 12668a7d6542SBram MoolenaarEND 12678a7d6542SBram Moolenaar 1268b3ca9824SBram Moolenaardef Undo_export_script_lines() 1269b3ca9824SBram Moolenaar unlet g:result 1270b3ca9824SBram Moolenaar unlet g:localname 1271b3ca9824SBram Moolenaarenddef 1272b3ca9824SBram Moolenaar 12735269bd2aSBram Moolenaardef Test_vim9_import_export() 12748a7d6542SBram Moolenaar let import_script_lines =<< trim END 12758a7d6542SBram Moolenaar vim9script 12768a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 12778a7d6542SBram Moolenaar g:imported = exported 12786e587dcbSBram Moolenaar exported += 3 12796e587dcbSBram Moolenaar g:imported_added = exported 12808a7d6542SBram Moolenaar g:imported_func = Exported() 12816e587dcbSBram Moolenaar 128240f4f7a4SBram Moolenaar def GetExported(): string 128340f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 128440f4f7a4SBram Moolenaar return local_dict.ref() 128540f4f7a4SBram Moolenaar enddef 128640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 128740f4f7a4SBram Moolenaar 12886e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 12896e587dcbSBram Moolenaar g:imported_name = exp_name 12906e587dcbSBram Moolenaar exp_name ..= ' Doe' 12916e587dcbSBram Moolenaar g:imported_name_appended = exp_name 12925381c7a1SBram Moolenaar g:imported_later = exported 12938a7d6542SBram Moolenaar END 12948a7d6542SBram Moolenaar 12958a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 12968a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 12978a7d6542SBram Moolenaar 12988a7d6542SBram Moolenaar source Ximport.vim 12998a7d6542SBram Moolenaar 13008a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 13018a7d6542SBram Moolenaar assert_equal('bob', g:localname) 13028a7d6542SBram Moolenaar assert_equal(9876, g:imported) 13036e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 13045381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 13058a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 130640f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 13076e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 13086e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 13098a7d6542SBram Moolenaar assert_false(exists('g:name')) 13108a7d6542SBram Moolenaar 1311b3ca9824SBram Moolenaar Undo_export_script_lines() 13128a7d6542SBram Moolenaar unlet g:imported 13136e587dcbSBram Moolenaar unlet g:imported_added 13145381c7a1SBram Moolenaar unlet g:imported_later 13158a7d6542SBram Moolenaar unlet g:imported_func 13166e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 13178a7d6542SBram Moolenaar delete('Ximport.vim') 1318f2d5c240SBram Moolenaar 13191c991144SBram Moolenaar # similar, with line breaks 13201c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 13211c991144SBram Moolenaar vim9script 13221c991144SBram Moolenaar import { 13231c991144SBram Moolenaar exported, 13241c991144SBram Moolenaar Exported, 13251c991144SBram Moolenaar } 13261c991144SBram Moolenaar from 13271c991144SBram Moolenaar './Xexport.vim' 13281c991144SBram Moolenaar g:imported = exported 13291c991144SBram Moolenaar exported += 5 13301c991144SBram Moolenaar g:imported_added = exported 13311c991144SBram Moolenaar g:imported_func = Exported() 13321c991144SBram Moolenaar END 13331c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 13341c991144SBram Moolenaar source Ximport_lbr.vim 13351c991144SBram Moolenaar 13361c991144SBram Moolenaar assert_equal(9876, g:imported) 13371c991144SBram Moolenaar assert_equal(9881, g:imported_added) 13381c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 13391c991144SBram Moolenaar 13401c991144SBram Moolenaar # exported script not sourced again 13411c991144SBram Moolenaar assert_false(exists('g:result')) 13421c991144SBram Moolenaar unlet g:imported 13431c991144SBram Moolenaar unlet g:imported_added 13441c991144SBram Moolenaar unlet g:imported_func 13451c991144SBram Moolenaar delete('Ximport_lbr.vim') 13461c991144SBram Moolenaar 13471c991144SBram Moolenaar # import inside :def function 13485381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 13495381c7a1SBram Moolenaar vim9script 13505381c7a1SBram Moolenaar def ImportInDef() 13515381c7a1SBram Moolenaar import exported from './Xexport.vim' 13525381c7a1SBram Moolenaar g:imported = exported 13535381c7a1SBram Moolenaar exported += 7 13545381c7a1SBram Moolenaar g:imported_added = exported 13555381c7a1SBram Moolenaar enddef 13565381c7a1SBram Moolenaar ImportInDef() 13575381c7a1SBram Moolenaar END 13585381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 13595381c7a1SBram Moolenaar source Ximport2.vim 1360f5be8cdbSBram Moolenaar # TODO: this should be 9879 13615381c7a1SBram Moolenaar assert_equal(9876, g:imported) 13625381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 13635381c7a1SBram Moolenaar unlet g:imported 13645381c7a1SBram Moolenaar unlet g:imported_added 13655381c7a1SBram Moolenaar delete('Ximport2.vim') 13665381c7a1SBram Moolenaar 1367f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1368f2d5c240SBram Moolenaar vim9script 1369f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1370f2d5c240SBram Moolenaar def UseExport() 1371f2d5c240SBram Moolenaar g:imported = Export.exported 1372f2d5c240SBram Moolenaar enddef 1373f2d5c240SBram Moolenaar UseExport() 1374f2d5c240SBram Moolenaar END 1375f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1376f2d5c240SBram Moolenaar source Ximport.vim 13775381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1378f2d5c240SBram Moolenaar 1379599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1380599c89c8SBram Moolenaar vim9script 1381599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1382599c89c8SBram Moolenaar def Func() 1383599c89c8SBram Moolenaar let dummy = 1 1384599c89c8SBram Moolenaar let imported = Export + dummy 1385599c89c8SBram Moolenaar enddef 1386822ba247SBram Moolenaar defcompile 1387599c89c8SBram Moolenaar END 1388599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 138944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1390599c89c8SBram Moolenaar 1391599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1392599c89c8SBram Moolenaar vim9script 1393599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1394599c89c8SBram Moolenaar def Func() 1395599c89c8SBram Moolenaar let imported = Export . exported 1396599c89c8SBram Moolenaar enddef 1397822ba247SBram Moolenaar defcompile 1398599c89c8SBram Moolenaar END 1399599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 140044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1401599c89c8SBram Moolenaar 1402599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1403599c89c8SBram Moolenaar vim9script 1404599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1405599c89c8SBram Moolenaar def Func() 1406599c89c8SBram Moolenaar let imported = Export. 1407599c89c8SBram Moolenaar enddef 1408822ba247SBram Moolenaar defcompile 1409599c89c8SBram Moolenaar END 1410599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 141144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1412599c89c8SBram Moolenaar 14131c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 14141c991144SBram Moolenaar vim9script 14151c991144SBram Moolenaar import * 14161c991144SBram Moolenaar as Export 14171c991144SBram Moolenaar from 14181c991144SBram Moolenaar './Xexport.vim' 14191c991144SBram Moolenaar def UseExport() 14201c991144SBram Moolenaar g:imported = Export.exported 14211c991144SBram Moolenaar enddef 14221c991144SBram Moolenaar UseExport() 14231c991144SBram Moolenaar END 14241c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 14251c991144SBram Moolenaar source Ximport.vim 14261c991144SBram Moolenaar assert_equal(9883, g:imported) 14271c991144SBram Moolenaar 1428f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1429f2d5c240SBram Moolenaar vim9script 1430f2d5c240SBram Moolenaar import * from './Xexport.vim' 1431f2d5c240SBram Moolenaar END 1432f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 143344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1434f2d5c240SBram Moolenaar 1435f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1436fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1437fa29c8abSBram Moolenaar vim9script 1438fa29c8abSBram Moolenaar import name from './Xexport.vim' 1439fa29c8abSBram Moolenaar END 1440fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 144144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1442fa29c8abSBram Moolenaar 1443f5be8cdbSBram Moolenaar # try to import something that is already defined 14445269bd2aSBram Moolenaar let import_already_defined =<< trim END 14455269bd2aSBram Moolenaar vim9script 14465269bd2aSBram Moolenaar let exported = 'something' 14475269bd2aSBram Moolenaar import exported from './Xexport.vim' 14485269bd2aSBram Moolenaar END 14495269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 145044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14515269bd2aSBram Moolenaar 1452f5be8cdbSBram Moolenaar # try to import something that is already defined 14535269bd2aSBram Moolenaar import_already_defined =<< trim END 14545269bd2aSBram Moolenaar vim9script 14555269bd2aSBram Moolenaar let exported = 'something' 14565269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 14575269bd2aSBram Moolenaar END 14585269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 145944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14605269bd2aSBram Moolenaar 1461f5be8cdbSBram Moolenaar # try to import something that is already defined 14625269bd2aSBram Moolenaar import_already_defined =<< trim END 14635269bd2aSBram Moolenaar vim9script 14645269bd2aSBram Moolenaar let exported = 'something' 14655269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 14665269bd2aSBram Moolenaar END 14675269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 146844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14695269bd2aSBram Moolenaar 1470f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1471fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1472fa29c8abSBram Moolenaar vim9script 1473fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1474fa29c8abSBram Moolenaar END 1475fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 147644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1477fa29c8abSBram Moolenaar 1478fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1479fa29c8abSBram Moolenaar vim9script 1480fa29c8abSBram Moolenaar import name './Xexport.vim' 1481fa29c8abSBram Moolenaar END 1482fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 148344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1484fa29c8abSBram Moolenaar 1485fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1486fa29c8abSBram Moolenaar vim9script 1487fa29c8abSBram Moolenaar import name from Xexport.vim 1488fa29c8abSBram Moolenaar END 1489fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 149044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1491fa29c8abSBram Moolenaar 1492fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1493fa29c8abSBram Moolenaar vim9script 1494fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1495fa29c8abSBram Moolenaar END 1496fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 149744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1498fa29c8abSBram Moolenaar 1499fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1500fa29c8abSBram Moolenaar vim9script 1501fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1502fa29c8abSBram Moolenaar END 15035269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 150444d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1505fa29c8abSBram Moolenaar 1506f2d5c240SBram Moolenaar delete('Ximport.vim') 15075269bd2aSBram Moolenaar delete('Ximport3.vim') 15088a7d6542SBram Moolenaar delete('Xexport.vim') 15098a7d6542SBram Moolenaar 1510f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1511750802b5SBram Moolenaar set cpo&vi 1512750802b5SBram Moolenaar let cpo_before = &cpo 1513750802b5SBram Moolenaar let lines =<< trim END 1514750802b5SBram Moolenaar vim9script 1515750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1516750802b5SBram Moolenaar END 1517750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1518750802b5SBram Moolenaar source Xvim9_script 1519750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1520750802b5SBram Moolenaar set cpo&vim 1521750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1522750802b5SBram Moolenaar delete('Xvim9_script') 1523750802b5SBram Moolenaarenddef 1524750802b5SBram Moolenaar 1525803af686SBram Moolenaarfunc g:Trigger() 1526803af686SBram Moolenaar source Ximport.vim 1527803af686SBram Moolenaar return "echo 'yes'\<CR>" 1528803af686SBram Moolenaarendfunc 1529803af686SBram Moolenaar 1530803af686SBram Moolenaardef Test_import_export_expr_map() 1531803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1532803af686SBram Moolenaar let export_lines =<< trim END 1533803af686SBram Moolenaar vim9script 1534803af686SBram Moolenaar export def That(): string 1535803af686SBram Moolenaar return 'yes' 1536803af686SBram Moolenaar enddef 1537803af686SBram Moolenaar END 1538803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1539803af686SBram Moolenaar 1540803af686SBram Moolenaar let import_lines =<< trim END 1541803af686SBram Moolenaar vim9script 1542803af686SBram Moolenaar import That from './Xexport_that.vim' 1543803af686SBram Moolenaar assert_equal('yes', That()) 1544803af686SBram Moolenaar END 1545803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1546803af686SBram Moolenaar 1547803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1548803af686SBram Moolenaar feedkeys('trigger', "xt") 1549803af686SBram Moolenaar 1550730b2483SBram Moolenaar delete('Xexport_that.vim') 1551803af686SBram Moolenaar delete('Ximport.vim') 1552803af686SBram Moolenaar nunmap trigger 1553803af686SBram Moolenaarenddef 1554803af686SBram Moolenaar 15558e1986e3SBram Moolenaardef Test_import_in_filetype() 15568e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15578e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 15588e1986e3SBram Moolenaar let export_lines =<< trim END 15598e1986e3SBram Moolenaar vim9script 15608e1986e3SBram Moolenaar export let That = 'yes' 15618e1986e3SBram Moolenaar END 1562730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15638e1986e3SBram Moolenaar 15648e1986e3SBram Moolenaar let import_lines =<< trim END 15658e1986e3SBram Moolenaar vim9script 1566730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15678e1986e3SBram Moolenaar assert_equal('yes', That) 15688e1986e3SBram Moolenaar g:did_load_mytpe = 1 15698e1986e3SBram Moolenaar END 15708e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15718e1986e3SBram Moolenaar 15728e1986e3SBram Moolenaar let save_rtp = &rtp 15738e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15748e1986e3SBram Moolenaar 15758e1986e3SBram Moolenaar filetype plugin on 15768e1986e3SBram Moolenaar copen 15778e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15788e1986e3SBram Moolenaar 15798e1986e3SBram Moolenaar quit! 1580730b2483SBram Moolenaar delete('Xexport_ft.vim') 15818e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15828e1986e3SBram Moolenaar &rtp = save_rtp 15838e1986e3SBram Moolenaarenddef 15848e1986e3SBram Moolenaar 1585efa94447SBram Moolenaardef Test_use_import_in_mapping() 1586efa94447SBram Moolenaar let lines =<< trim END 1587efa94447SBram Moolenaar vim9script 1588efa94447SBram Moolenaar export def Funcx() 1589efa94447SBram Moolenaar g:result = 42 1590efa94447SBram Moolenaar enddef 1591efa94447SBram Moolenaar END 1592efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1593efa94447SBram Moolenaar lines =<< trim END 1594efa94447SBram Moolenaar vim9script 1595efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1596b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1597efa94447SBram Moolenaar END 1598efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1599efa94447SBram Moolenaar 1600efa94447SBram Moolenaar source Xmapscript.vim 1601b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1602efa94447SBram Moolenaar assert_equal(42, g:result) 1603efa94447SBram Moolenaar 1604efa94447SBram Moolenaar unlet g:result 1605efa94447SBram Moolenaar delete('XsomeExport.vim') 1606efa94447SBram Moolenaar delete('Xmapscript.vim') 1607b3ca9824SBram Moolenaar nunmap <F3> 1608efa94447SBram Moolenaarenddef 1609efa94447SBram Moolenaar 1610750802b5SBram Moolenaardef Test_vim9script_fails() 16118a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16128a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1613750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 16149721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 16159b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1616750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1617750802b5SBram Moolenaar 1618451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1619c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1620c785b9a7SBram Moolenaar 1621e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1622e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16238a7d6542SBram Moolenaarenddef 16248a7d6542SBram Moolenaar 1625f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1626101f4810SBram Moolenaar CheckRunVimInTerminal 1627101f4810SBram Moolenaar 16289bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1629c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16309bb3eb3eSBram Moolenaarendfunc 16319bb3eb3eSBram Moolenaar 1632c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1633101f4810SBram Moolenaar let export =<< trim END 1634101f4810SBram Moolenaar vim9script 1635101f4810SBram Moolenaar export def Foo(): number 1636101f4810SBram Moolenaar return 0 1637101f4810SBram Moolenaar enddef 1638101f4810SBram Moolenaar END 1639730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1640101f4810SBram Moolenaar 1641730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 16429bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16439bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1644101f4810SBram Moolenaar 1645730b2483SBram Moolenaar delete('XexportCmd.vim') 16469bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16479bb3eb3eSBram Moolenaarenddef 1648101f4810SBram Moolenaar 16494c17ad94SBram Moolenaardef Test_vim9script_reload_import() 16508a7d6542SBram Moolenaar let lines =<< trim END 16518a7d6542SBram Moolenaar vim9script 16528a7d6542SBram Moolenaar const var = '' 16538a7d6542SBram Moolenaar let valone = 1234 16548a7d6542SBram Moolenaar def MyFunc(arg: string) 16558a7d6542SBram Moolenaar valone = 5678 16568a7d6542SBram Moolenaar enddef 16578a7d6542SBram Moolenaar END 16588a7d6542SBram Moolenaar let morelines =<< trim END 16598a7d6542SBram Moolenaar let valtwo = 222 16608a7d6542SBram Moolenaar export def GetValtwo(): number 16618a7d6542SBram Moolenaar return valtwo 16628a7d6542SBram Moolenaar enddef 16638a7d6542SBram Moolenaar END 166403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16658a7d6542SBram Moolenaar source Xreload.vim 16668a7d6542SBram Moolenaar source Xreload.vim 16678a7d6542SBram Moolenaar source Xreload.vim 16688a7d6542SBram Moolenaar 16698a7d6542SBram Moolenaar let testlines =<< trim END 16708a7d6542SBram Moolenaar vim9script 16718a7d6542SBram Moolenaar def TheFunc() 16728a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16738a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16748a7d6542SBram Moolenaar enddef 16758a7d6542SBram Moolenaar TheFunc() 16768a7d6542SBram Moolenaar END 16778a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16788a7d6542SBram Moolenaar source Ximport.vim 16798a7d6542SBram Moolenaar 1680f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1681f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16828a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16838a7d6542SBram Moolenaar source Ximport.vim 16848a7d6542SBram Moolenaar 1685f5be8cdbSBram Moolenaar # cannot declare a var twice 16868a7d6542SBram Moolenaar lines =<< trim END 16878a7d6542SBram Moolenaar vim9script 16888a7d6542SBram Moolenaar let valone = 1234 16898a7d6542SBram Moolenaar let valone = 5678 16908a7d6542SBram Moolenaar END 16918a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 169244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16938a7d6542SBram Moolenaar 16948a7d6542SBram Moolenaar delete('Xreload.vim') 16958a7d6542SBram Moolenaar delete('Ximport.vim') 16968a7d6542SBram Moolenaarenddef 16978a7d6542SBram Moolenaar 169895006e3dSBram Moolenaardef s:RetSome(): string 169995006e3dSBram Moolenaar return 'some' 170095006e3dSBram Moolenaarenddef 170195006e3dSBram Moolenaar 1702fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1703fe465a01SBram Moolenaar" script-local name. 1704fe465a01SBram Moolenaardef Test_vim9script_funcref() 1705fe465a01SBram Moolenaar let sortlines =<< trim END 1706fe465a01SBram Moolenaar vim9script 1707fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1708bed36b93SBram Moolenaar return i2 - i1 1709fe465a01SBram Moolenaar enddef 1710fe465a01SBram Moolenaar 1711fe465a01SBram Moolenaar export def FastSort(): list<number> 1712fe465a01SBram Moolenaar return range(5)->sort(Compare) 1713fe465a01SBram Moolenaar enddef 1714fe465a01SBram Moolenaar END 1715fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1716fe465a01SBram Moolenaar 1717fe465a01SBram Moolenaar let lines =<< trim END 1718fe465a01SBram Moolenaar vim9script 1719fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1720fe465a01SBram Moolenaar def Test() 1721fe465a01SBram Moolenaar g:result = FastSort() 1722fe465a01SBram Moolenaar enddef 1723fe465a01SBram Moolenaar Test() 1724fe465a01SBram Moolenaar END 1725fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1726fe465a01SBram Moolenaar 1727fe465a01SBram Moolenaar source Xscript.vim 1728fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1729fe465a01SBram Moolenaar 1730fe465a01SBram Moolenaar unlet g:result 1731fe465a01SBram Moolenaar delete('Xsort.vim') 1732fe465a01SBram Moolenaar delete('Xscript.vim') 173395006e3dSBram Moolenaar 173495006e3dSBram Moolenaar let Funcref = function('s:RetSome') 173595006e3dSBram Moolenaar assert_equal('some', Funcref()) 1736fe465a01SBram Moolenaarenddef 1737fe465a01SBram Moolenaar 1738601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1739601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1740601e76acSBram Moolenaar" function reference. 1741c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1742c620c055SBram Moolenaar let filterLines =<< trim END 1743c620c055SBram Moolenaar vim9script 1744c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1745c620c055SBram Moolenaar return idx % 2 == 1 1746c620c055SBram Moolenaar enddef 1747c620c055SBram Moolenaar export def FastFilter(): list<number> 1748c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1749c620c055SBram Moolenaar enddef 1750601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1751601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1752601e76acSBram Moolenaar enddef 1753c620c055SBram Moolenaar END 1754c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1755c620c055SBram Moolenaar 1756c620c055SBram Moolenaar let lines =<< trim END 1757c620c055SBram Moolenaar vim9script 1758601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1759c620c055SBram Moolenaar def Test() 1760c620c055SBram Moolenaar let x: list<number> = FastFilter() 1761c620c055SBram Moolenaar enddef 1762c620c055SBram Moolenaar Test() 1763601e76acSBram Moolenaar def TestDirect() 1764601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1765601e76acSBram Moolenaar enddef 1766601e76acSBram Moolenaar TestDirect() 1767c620c055SBram Moolenaar END 1768601e76acSBram Moolenaar CheckScriptSuccess(lines) 1769c620c055SBram Moolenaar delete('Xfilter.vim') 1770c620c055SBram Moolenaarenddef 1771c620c055SBram Moolenaar 17724c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17734c17ad94SBram Moolenaar let first_lines =<< trim END 17744c17ad94SBram Moolenaar vim9script 17754c17ad94SBram Moolenaar def FuncYes(): string 17764c17ad94SBram Moolenaar return 'yes' 17774c17ad94SBram Moolenaar enddef 17784c17ad94SBram Moolenaar END 177903afdcf1SBram Moolenaar let withno_lines =<< trim END 17804c17ad94SBram Moolenaar def FuncNo(): string 17814c17ad94SBram Moolenaar return 'no' 17824c17ad94SBram Moolenaar enddef 17834c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17844c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17854c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 178603afdcf1SBram Moolenaar enddef 178703afdcf1SBram Moolenaar END 178803afdcf1SBram Moolenaar let nono_lines =<< trim END 178903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 179003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 179144d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17924c17ad94SBram Moolenaar enddef 17934c17ad94SBram Moolenaar END 17944c17ad94SBram Moolenaar 17954c17ad94SBram Moolenaar # FuncNo() is defined 179603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17974c17ad94SBram Moolenaar source Xreloaded.vim 17984c17ad94SBram Moolenaar g:DoCheck(true) 17994c17ad94SBram Moolenaar 18004c17ad94SBram Moolenaar # FuncNo() is not redefined 180103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18024c17ad94SBram Moolenaar source Xreloaded.vim 180303afdcf1SBram Moolenaar g:DoCheck() 18044c17ad94SBram Moolenaar 18054c17ad94SBram Moolenaar # FuncNo() is back 180603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18074c17ad94SBram Moolenaar source Xreloaded.vim 180803afdcf1SBram Moolenaar g:DoCheck() 18094c17ad94SBram Moolenaar 18104c17ad94SBram Moolenaar delete('Xreloaded.vim') 18114c17ad94SBram Moolenaarenddef 18124c17ad94SBram Moolenaar 181389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 181489483d40SBram Moolenaar # write the script with a script-local variable 181589483d40SBram Moolenaar let lines =<< trim END 181689483d40SBram Moolenaar vim9script 181789483d40SBram Moolenaar let var = 'string' 181889483d40SBram Moolenaar END 181989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 182089483d40SBram Moolenaar source XreloadVar.vim 182189483d40SBram Moolenaar 182289483d40SBram Moolenaar # now write the script using the same variable locally - works 182389483d40SBram Moolenaar lines =<< trim END 182489483d40SBram Moolenaar vim9script 182589483d40SBram Moolenaar def Func() 182689483d40SBram Moolenaar let var = 'string' 182789483d40SBram Moolenaar enddef 182889483d40SBram Moolenaar END 182989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 183089483d40SBram Moolenaar source XreloadVar.vim 183189483d40SBram Moolenaar 183289483d40SBram Moolenaar delete('XreloadVar.vim') 183389483d40SBram Moolenaarenddef 183489483d40SBram Moolenaar 18358a7d6542SBram Moolenaardef Test_import_absolute() 18368a7d6542SBram Moolenaar let import_lines = [ 1837e6085c53SBram Moolenaar 'vim9script', 1838e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1839e6085c53SBram Moolenaar 'def UseExported()', 1840e6085c53SBram Moolenaar ' g:imported_abs = exported', 1841e6085c53SBram Moolenaar ' exported = 8888', 1842e6085c53SBram Moolenaar ' g:imported_after = exported', 1843e6085c53SBram Moolenaar 'enddef', 1844e6085c53SBram Moolenaar 'UseExported()', 1845e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1846e6085c53SBram Moolenaar ] 18478a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18488a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18498a7d6542SBram Moolenaar 18508a7d6542SBram Moolenaar source Ximport_abs.vim 18518a7d6542SBram Moolenaar 18528a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18534e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1854675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1855675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1856675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1857675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1858675f716eSBram Moolenaar 'exported = 8888.*' .. 1859675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1860675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1861675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1862675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1863e6085c53SBram Moolenaar g:import_disassembled) 1864b3ca9824SBram Moolenaar 1865b3ca9824SBram Moolenaar Undo_export_script_lines() 18668a7d6542SBram Moolenaar unlet g:imported_abs 18674e12a5dfSBram Moolenaar unlet g:import_disassembled 18688a7d6542SBram Moolenaar 18698a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18708a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18718a7d6542SBram Moolenaarenddef 18728a7d6542SBram Moolenaar 18738a7d6542SBram Moolenaardef Test_import_rtp() 18748a7d6542SBram Moolenaar let import_lines = [ 1875e6085c53SBram Moolenaar 'vim9script', 1876e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1877e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1878e6085c53SBram Moolenaar ] 18798a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18808a7d6542SBram Moolenaar mkdir('import') 18818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18828a7d6542SBram Moolenaar 18838a7d6542SBram Moolenaar let save_rtp = &rtp 18848a7d6542SBram Moolenaar &rtp = getcwd() 18858a7d6542SBram Moolenaar source Ximport_rtp.vim 18868a7d6542SBram Moolenaar &rtp = save_rtp 18878a7d6542SBram Moolenaar 18888a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18898a7d6542SBram Moolenaar 1890b3ca9824SBram Moolenaar Undo_export_script_lines() 1891b3ca9824SBram Moolenaar unlet g:imported_rtp 18928a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 189389483d40SBram Moolenaar delete('import', 'rf') 18948a7d6542SBram Moolenaarenddef 18958a7d6542SBram Moolenaar 189625e0f586SBram Moolenaardef Test_import_compile_error() 189725e0f586SBram Moolenaar let export_lines = [ 189825e0f586SBram Moolenaar 'vim9script', 189925e0f586SBram Moolenaar 'export def ExpFunc(): string', 190025e0f586SBram Moolenaar ' return notDefined', 190125e0f586SBram Moolenaar 'enddef', 190225e0f586SBram Moolenaar ] 190325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 190425e0f586SBram Moolenaar 190525e0f586SBram Moolenaar let import_lines = [ 190625e0f586SBram Moolenaar 'vim9script', 190725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 190825e0f586SBram Moolenaar 'def ImpFunc()', 190925e0f586SBram Moolenaar ' echo ExpFunc()', 191025e0f586SBram Moolenaar 'enddef', 191125e0f586SBram Moolenaar 'defcompile', 191225e0f586SBram Moolenaar ] 191325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 191425e0f586SBram Moolenaar 191525e0f586SBram Moolenaar try 191625e0f586SBram Moolenaar source Ximport.vim 191725e0f586SBram Moolenaar catch /E1001/ 1918f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 191925e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 192025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 192125e0f586SBram Moolenaar endtry 192225e0f586SBram Moolenaar 192325e0f586SBram Moolenaar delete('Xexported.vim') 192425e0f586SBram Moolenaar delete('Ximport.vim') 192525e0f586SBram Moolenaarenddef 192625e0f586SBram Moolenaar 1927c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1928c4ce36d4SBram Moolenaar let lines = [ 1929c4ce36d4SBram Moolenaar 'vim9script', 1930c4ce36d4SBram Moolenaar 'def Func()', 1931c4ce36d4SBram Moolenaar ' eval [][0]', 1932c4ce36d4SBram Moolenaar 'enddef', 1933c4ce36d4SBram Moolenaar 'Func()', 1934c4ce36d4SBram Moolenaar ] 1935c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1936c4ce36d4SBram Moolenaar 1937c4ce36d4SBram Moolenaar for count in range(3) 1938c4ce36d4SBram Moolenaar try 1939c4ce36d4SBram Moolenaar source Xtestscript.vim 1940c4ce36d4SBram Moolenaar catch /E684/ 1941c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1942c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1943c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1944c4ce36d4SBram Moolenaar endtry 1945c4ce36d4SBram Moolenaar endfor 1946c4ce36d4SBram Moolenaar 1947c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1948c4ce36d4SBram Moolenaarenddef 1949c4ce36d4SBram Moolenaar 1950eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1951eef2102eSBram Moolenaar let export_lines =<< trim END 1952eef2102eSBram Moolenaar vim9script 1953eef2102eSBram Moolenaar export def Func() 1954eef2102eSBram Moolenaar echo 'imported' 1955eef2102eSBram Moolenaar enddef 1956eef2102eSBram Moolenaar END 1957eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1958eef2102eSBram Moolenaar 1959eef2102eSBram Moolenaar let lines =<< trim END 1960eef2102eSBram Moolenaar vim9script 1961eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1962eef2102eSBram Moolenaar def Func() 1963eef2102eSBram Moolenaar echo 'local to function' 1964eef2102eSBram Moolenaar enddef 1965eef2102eSBram Moolenaar END 1966eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1967eef2102eSBram Moolenaar 1968eef2102eSBram Moolenaar lines =<< trim END 1969eef2102eSBram Moolenaar vim9script 1970eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1971eef2102eSBram Moolenaar def Outer() 1972eef2102eSBram Moolenaar def Func() 1973eef2102eSBram Moolenaar echo 'local to function' 1974eef2102eSBram Moolenaar enddef 1975eef2102eSBram Moolenaar enddef 1976eef2102eSBram Moolenaar defcompile 1977eef2102eSBram Moolenaar END 1978eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1979eef2102eSBram Moolenaar 1980eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1981eef2102eSBram Moolenaarenddef 1982eef2102eSBram Moolenaar 1983b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1984b9a2cac3SBram Moolenaar let lines =<< trim END 1985b9a2cac3SBram Moolenaar vim9script 1986b9a2cac3SBram Moolenaar def Func() 1987b9a2cac3SBram Moolenaar echo 'one' 1988b9a2cac3SBram Moolenaar enddef 1989b9a2cac3SBram Moolenaar def Func() 1990b9a2cac3SBram Moolenaar echo 'two' 1991b9a2cac3SBram Moolenaar enddef 1992b9a2cac3SBram Moolenaar END 1993b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1994fa211f3cSBram Moolenaar 1995fa211f3cSBram Moolenaar lines =<< trim END 1996fa211f3cSBram Moolenaar vim9script 1997fa211f3cSBram Moolenaar def Foo(): string 1998fa211f3cSBram Moolenaar return 'foo' 1999fa211f3cSBram Moolenaar enddef 2000fa211f3cSBram Moolenaar def Func() 2001fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 2002fa211f3cSBram Moolenaar enddef 2003fa211f3cSBram Moolenaar defcompile 2004fa211f3cSBram Moolenaar END 2005fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2006b9a2cac3SBram Moolenaarenddef 2007b9a2cac3SBram Moolenaar 20088a7d6542SBram Moolenaardef Test_fixed_size_list() 2009f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 20108a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 20118a7d6542SBram Moolenaar l->remove(0) 20128a7d6542SBram Moolenaar l->add(5) 20138a7d6542SBram Moolenaar l->insert(99, 1) 20140f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20158a7d6542SBram Moolenaarenddef 20168a7d6542SBram Moolenaar 2017ae616494SBram Moolenaardef Test_no_insert_xit() 2018d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2019d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2020d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2021d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2022d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2023ae616494SBram Moolenaar 2024ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2025ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2026ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2027ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2028f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2029f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 2030f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2031f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2032f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2033ae616494SBram Moolenaarenddef 2034ae616494SBram Moolenaar 2035158906cfSBram Moolenaardef IfElse(what: number): string 2036158906cfSBram Moolenaar let res = '' 2037158906cfSBram Moolenaar if what == 1 2038158906cfSBram Moolenaar res = "one" 2039158906cfSBram Moolenaar elseif what == 2 2040158906cfSBram Moolenaar res = "two" 2041a259d8d3SBram Moolenaar else 2042158906cfSBram Moolenaar res = "three" 2043a259d8d3SBram Moolenaar endif 2044158906cfSBram Moolenaar return res 2045a259d8d3SBram Moolenaarenddef 2046a259d8d3SBram Moolenaar 2047158906cfSBram Moolenaardef Test_if_elseif_else() 2048158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2049158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2050158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20510f18b6d1SBram Moolenaarenddef 20520f18b6d1SBram Moolenaar 2053e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2054d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2055d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2056d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2057d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2058d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2059e8c4abbbSBram Moolenaarenddef 2060e8c4abbbSBram Moolenaar 20616d69bf60SBram Moolenaarlet g:bool_true = v:true 20626d69bf60SBram Moolenaarlet g:bool_false = v:false 20636d69bf60SBram Moolenaar 20646d69bf60SBram Moolenaardef Test_if_const_expr() 20656d69bf60SBram Moolenaar let res = false 20666d69bf60SBram Moolenaar if true ? true : false 20676d69bf60SBram Moolenaar res = true 20686d69bf60SBram Moolenaar endif 20696d69bf60SBram Moolenaar assert_equal(true, res) 20706d69bf60SBram Moolenaar 2071585fea7bSBram Moolenaar g:glob = 2 2072585fea7bSBram Moolenaar if false 20736797966dSBram Moolenaar execute('g:glob = 3') 2074585fea7bSBram Moolenaar endif 2075585fea7bSBram Moolenaar assert_equal(2, g:glob) 2076585fea7bSBram Moolenaar if true 20776797966dSBram Moolenaar execute('g:glob = 3') 2078585fea7bSBram Moolenaar endif 2079585fea7bSBram Moolenaar assert_equal(3, g:glob) 2080585fea7bSBram Moolenaar 20816d69bf60SBram Moolenaar res = false 20826d69bf60SBram Moolenaar if g:bool_true ? true : false 20836d69bf60SBram Moolenaar res = true 20846d69bf60SBram Moolenaar endif 20856d69bf60SBram Moolenaar assert_equal(true, res) 20866d69bf60SBram Moolenaar 20876d69bf60SBram Moolenaar res = false 20886d69bf60SBram Moolenaar if true ? g:bool_true : false 20896d69bf60SBram Moolenaar res = true 20906d69bf60SBram Moolenaar endif 20916d69bf60SBram Moolenaar assert_equal(true, res) 20926d69bf60SBram Moolenaar 20936d69bf60SBram Moolenaar res = false 20946d69bf60SBram Moolenaar if true ? true : g:bool_false 20956d69bf60SBram Moolenaar res = true 20966d69bf60SBram Moolenaar endif 20976d69bf60SBram Moolenaar assert_equal(true, res) 20986d69bf60SBram Moolenaar 20996d69bf60SBram Moolenaar res = false 21006d69bf60SBram Moolenaar if true ? false : true 21016d69bf60SBram Moolenaar res = true 21026d69bf60SBram Moolenaar endif 21036d69bf60SBram Moolenaar assert_equal(false, res) 21046d69bf60SBram Moolenaar 21056d69bf60SBram Moolenaar res = false 21066d69bf60SBram Moolenaar if false ? false : true 21076d69bf60SBram Moolenaar res = true 21086d69bf60SBram Moolenaar endif 21096d69bf60SBram Moolenaar assert_equal(true, res) 21106d69bf60SBram Moolenaar 21116d69bf60SBram Moolenaar res = false 21126d69bf60SBram Moolenaar if false ? true : false 21136d69bf60SBram Moolenaar res = true 21146d69bf60SBram Moolenaar endif 21156d69bf60SBram Moolenaar assert_equal(false, res) 21166d69bf60SBram Moolenaar 21176d69bf60SBram Moolenaar res = false 2118e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2119e8c4abbbSBram Moolenaar res = true 2120e8c4abbbSBram Moolenaar endif 2121e8c4abbbSBram Moolenaar assert_equal(false, res) 2122e8c4abbbSBram Moolenaar 2123e8c4abbbSBram Moolenaar res = false 21246d69bf60SBram Moolenaar if true && true 21256d69bf60SBram Moolenaar res = true 21266d69bf60SBram Moolenaar endif 21276d69bf60SBram Moolenaar assert_equal(true, res) 21286d69bf60SBram Moolenaar 21296d69bf60SBram Moolenaar res = false 21306d69bf60SBram Moolenaar if true && false 21316d69bf60SBram Moolenaar res = true 21326d69bf60SBram Moolenaar endif 21336d69bf60SBram Moolenaar assert_equal(false, res) 21346d69bf60SBram Moolenaar 21356d69bf60SBram Moolenaar res = false 21366d69bf60SBram Moolenaar if g:bool_true && false 21376d69bf60SBram Moolenaar res = true 21386d69bf60SBram Moolenaar endif 21396d69bf60SBram Moolenaar assert_equal(false, res) 21406d69bf60SBram Moolenaar 21416d69bf60SBram Moolenaar res = false 21426d69bf60SBram Moolenaar if true && g:bool_false 21436d69bf60SBram Moolenaar res = true 21446d69bf60SBram Moolenaar endif 21456d69bf60SBram Moolenaar assert_equal(false, res) 21466d69bf60SBram Moolenaar 21476d69bf60SBram Moolenaar res = false 21486d69bf60SBram Moolenaar if false && false 21496d69bf60SBram Moolenaar res = true 21506d69bf60SBram Moolenaar endif 21516d69bf60SBram Moolenaar assert_equal(false, res) 21526d69bf60SBram Moolenaar 21536d69bf60SBram Moolenaar res = false 21546d69bf60SBram Moolenaar if true || false 21556d69bf60SBram Moolenaar res = true 21566d69bf60SBram Moolenaar endif 21576d69bf60SBram Moolenaar assert_equal(true, res) 21586d69bf60SBram Moolenaar 21596d69bf60SBram Moolenaar res = false 21606d69bf60SBram Moolenaar if g:bool_true || false 21616d69bf60SBram Moolenaar res = true 21626d69bf60SBram Moolenaar endif 21636d69bf60SBram Moolenaar assert_equal(true, res) 21646d69bf60SBram Moolenaar 21656d69bf60SBram Moolenaar res = false 21666d69bf60SBram Moolenaar if true || g:bool_false 21676d69bf60SBram Moolenaar res = true 21686d69bf60SBram Moolenaar endif 21696d69bf60SBram Moolenaar assert_equal(true, res) 21706d69bf60SBram Moolenaar 21716d69bf60SBram Moolenaar res = false 21726d69bf60SBram Moolenaar if false || false 21736d69bf60SBram Moolenaar res = true 21746d69bf60SBram Moolenaar endif 21756d69bf60SBram Moolenaar assert_equal(false, res) 21763988f64fSBram Moolenaar 21773988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21783988f64fSBram Moolenaar if false | eval 0 | endif 21793988f64fSBram Moolenaar if false | eval burp + 234 | endif 21803988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21813988f64fSBram Moolenaar if false 21823988f64fSBram Moolenaar burp 21833988f64fSBram Moolenaar endif 218480c34ca3SBram Moolenaarenddef 21856d69bf60SBram Moolenaar 218680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2187d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2188d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2189d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2190d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21916d69bf60SBram Moolenaarenddef 21926d69bf60SBram Moolenaar 219372abcf42SBram Moolenaardef RunNested(i: number): number 219472abcf42SBram Moolenaar let x: number = 0 219572abcf42SBram Moolenaar if i % 2 219672abcf42SBram Moolenaar if 1 2197f5be8cdbSBram Moolenaar # comment 219872abcf42SBram Moolenaar else 2199f5be8cdbSBram Moolenaar # comment 220072abcf42SBram Moolenaar endif 220172abcf42SBram Moolenaar x += 1 220272abcf42SBram Moolenaar else 220372abcf42SBram Moolenaar x += 1000 220472abcf42SBram Moolenaar endif 220572abcf42SBram Moolenaar return x 220672abcf42SBram Moolenaarenddef 220772abcf42SBram Moolenaar 220872abcf42SBram Moolenaardef Test_nested_if() 220972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 221072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 221172abcf42SBram Moolenaarenddef 221272abcf42SBram Moolenaar 2213ad39c094SBram Moolenaardef Test_execute_cmd() 2214ad39c094SBram Moolenaar new 2215ad39c094SBram Moolenaar setline(1, 'default') 2216d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2217ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2218a72cfb80SBram Moolenaar 2219d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2220a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2221a72cfb80SBram Moolenaar 2222d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2223ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2224a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2225ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2226a72cfb80SBram Moolenaar 2227d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2228ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2229a72cfb80SBram Moolenaar 2230ad39c094SBram Moolenaar let cmd_first = 'call ' 2231ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2232ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2233ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2234ad39c094SBram Moolenaar bwipe! 2235585fea7bSBram Moolenaar 22362d6b20d6SBram Moolenaar let n = true 22372d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22382d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22392d6b20d6SBram Moolenaar 2240e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2241e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2242e5abf7afSBram Moolenaar 2243d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2244d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2245d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2246ad39c094SBram Moolenaarenddef 2247ad39c094SBram Moolenaar 224847e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2249f5be8cdbSBram Moolenaar # only checks line continuation 225047e880d6SBram Moolenaar let lines =<< trim END 225147e880d6SBram Moolenaar vim9script 225247e880d6SBram Moolenaar execute 'g:someVar' 225347e880d6SBram Moolenaar .. ' = ' .. 225447e880d6SBram Moolenaar '28' 225547e880d6SBram Moolenaar assert_equal(28, g:someVar) 225647e880d6SBram Moolenaar unlet g:someVar 225747e880d6SBram Moolenaar END 225847e880d6SBram Moolenaar CheckScriptSuccess(lines) 225947e880d6SBram Moolenaarenddef 226047e880d6SBram Moolenaar 2261ad39c094SBram Moolenaardef Test_echo_cmd() 2262a72cfb80SBram Moolenaar echo 'some' # comment 2263585fea7bSBram Moolenaar echon 'thing' 2264ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2265ad39c094SBram Moolenaar 2266a72cfb80SBram Moolenaar echo "some" # comment 2267a72cfb80SBram Moolenaar echon "thing" 2268a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2269a72cfb80SBram Moolenaar 2270ad39c094SBram Moolenaar let str1 = 'some' 2271ad39c094SBram Moolenaar let str2 = 'more' 2272ad39c094SBram Moolenaar echo str1 str2 2273ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2274a72cfb80SBram Moolenaar 2275d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2276ad39c094SBram Moolenaarenddef 2277ad39c094SBram Moolenaar 2278f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2279f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2280f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2281f93c7feaSBram Moolenaar echo 'clear' 2282df069eecSBram Moolenaar :1messages 2283f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2284f93c7feaSBram Moolenaar 2285d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2286f93c7feaSBram Moolenaarenddef 2287f93c7feaSBram Moolenaar 228847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2289f5be8cdbSBram Moolenaar # only checks line continuation 229047e880d6SBram Moolenaar let lines =<< trim END 229147e880d6SBram Moolenaar vim9script 229247e880d6SBram Moolenaar echomsg 'here' 229347e880d6SBram Moolenaar .. ' is ' .. 229447e880d6SBram Moolenaar 'a message' 229547e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 229647e880d6SBram Moolenaar END 229747e880d6SBram Moolenaar CheckScriptSuccess(lines) 229847e880d6SBram Moolenaarenddef 229947e880d6SBram Moolenaar 2300f93c7feaSBram Moolenaardef Test_echoerr_cmd() 230140ee466cSBram Moolenaar try 230240ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 230340ee466cSBram Moolenaar catch 230440ee466cSBram Moolenaar assert_match('something wrong', v:exception) 230540ee466cSBram Moolenaar endtry 2306f93c7feaSBram Moolenaarenddef 2307f93c7feaSBram Moolenaar 230847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2309f5be8cdbSBram Moolenaar # only checks line continuation 231047e880d6SBram Moolenaar let lines =<< trim END 231147e880d6SBram Moolenaar vim9script 231247e880d6SBram Moolenaar try 231347e880d6SBram Moolenaar echoerr 'this' 231447e880d6SBram Moolenaar .. ' is ' .. 231547e880d6SBram Moolenaar 'wrong' 231647e880d6SBram Moolenaar catch 231747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 231847e880d6SBram Moolenaar endtry 231947e880d6SBram Moolenaar END 232047e880d6SBram Moolenaar CheckScriptSuccess(lines) 232147e880d6SBram Moolenaarenddef 232247e880d6SBram Moolenaar 232341fe0617SBram Moolenaardef Test_for_outside_of_function() 232441fe0617SBram Moolenaar let lines =<< trim END 232541fe0617SBram Moolenaar vim9script 232641fe0617SBram Moolenaar new 232741fe0617SBram Moolenaar for var in range(0, 3) 232841fe0617SBram Moolenaar append(line('$'), var) 232941fe0617SBram Moolenaar endfor 233041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 233141fe0617SBram Moolenaar bwipe! 233241fe0617SBram Moolenaar END 233341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 233441fe0617SBram Moolenaar source Xvim9for.vim 233541fe0617SBram Moolenaar delete('Xvim9for.vim') 233641fe0617SBram Moolenaarenddef 23378a7d6542SBram Moolenaar 2338e8c4abbbSBram Moolenaardef Test_for_loop() 2339e8c4abbbSBram Moolenaar let result = '' 2340e8c4abbbSBram Moolenaar for cnt in range(7) 2341e8c4abbbSBram Moolenaar if cnt == 4 2342e8c4abbbSBram Moolenaar break 2343e8c4abbbSBram Moolenaar endif 2344e8c4abbbSBram Moolenaar if cnt == 2 2345e8c4abbbSBram Moolenaar continue 2346e8c4abbbSBram Moolenaar endif 2347e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2348e8c4abbbSBram Moolenaar endfor 2349e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23500ad3e894SBram Moolenaar 23510ad3e894SBram Moolenaar let concat = '' 23520ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23530ad3e894SBram Moolenaar concat ..= str 23540ad3e894SBram Moolenaar endfor 23550ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2356e8c4abbbSBram Moolenaarenddef 2357e8c4abbbSBram Moolenaar 2358e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2359675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2360675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2361451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2362822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2363451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2364675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2365675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2366675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2367e8c4abbbSBram Moolenaarenddef 2368e8c4abbbSBram Moolenaar 2369d0df1aacSBram Moolenaardef Test_while_loop() 2370d0df1aacSBram Moolenaar let result = '' 2371d0df1aacSBram Moolenaar let cnt = 0 2372d0df1aacSBram Moolenaar while cnt < 555 2373d0df1aacSBram Moolenaar if cnt == 3 2374d0df1aacSBram Moolenaar break 2375d0df1aacSBram Moolenaar endif 2376d0df1aacSBram Moolenaar cnt += 1 2377d0df1aacSBram Moolenaar if cnt == 2 2378d0df1aacSBram Moolenaar continue 2379d0df1aacSBram Moolenaar endif 2380d0df1aacSBram Moolenaar result ..= cnt .. '_' 2381d0df1aacSBram Moolenaar endwhile 2382d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2383d0df1aacSBram Moolenaarenddef 2384d0df1aacSBram Moolenaar 2385e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2386675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2387675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2388675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2389675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2390675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2391675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2392675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2393bd5da371SBram Moolenaarenddef 2394bd5da371SBram Moolenaar 23959645e2d9SBram Moolenaardef Test_interrupt_loop() 239697acfc78SBram Moolenaar let caught = false 23979645e2d9SBram Moolenaar let x = 0 239897acfc78SBram Moolenaar try 23999645e2d9SBram Moolenaar while 1 24009645e2d9SBram Moolenaar x += 1 24019645e2d9SBram Moolenaar if x == 100 24029645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 24039645e2d9SBram Moolenaar endif 24049645e2d9SBram Moolenaar endwhile 240597acfc78SBram Moolenaar catch 240697acfc78SBram Moolenaar caught = true 240797acfc78SBram Moolenaar assert_equal(100, x) 240897acfc78SBram Moolenaar endtry 240997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 241025859dd7SBram Moolenaar # consume the CTRL-C 241125859dd7SBram Moolenaar getchar(0) 24129645e2d9SBram Moolenaarenddef 241320431c9dSBram Moolenaar 24144fdae999SBram Moolenaardef Test_automatic_line_continuation() 24154fdae999SBram Moolenaar let mylist = [ 24164fdae999SBram Moolenaar 'one', 24174fdae999SBram Moolenaar 'two', 24184fdae999SBram Moolenaar 'three', 2419f5be8cdbSBram Moolenaar ] # comment 24204fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24214fdae999SBram Moolenaar 24224fdae999SBram Moolenaar let mydict = { 24234fdae999SBram Moolenaar 'one': 1, 24244fdae999SBram Moolenaar 'two': 2, 24254fdae999SBram Moolenaar 'three': 24264fdae999SBram Moolenaar 3, 2427f5be8cdbSBram Moolenaar } # comment 24284fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 24294fdae999SBram Moolenaar mydict = #{ 24302c330432SBram Moolenaar one: 1, # comment 24312c330432SBram Moolenaar two: # comment 24322c330432SBram Moolenaar 2, # comment 24332c330432SBram Moolenaar three: 3 # comment 24342c330432SBram Moolenaar } 24352c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 24362c330432SBram Moolenaar mydict = #{ 24372c330432SBram Moolenaar one: 1, 24384fdae999SBram Moolenaar two: 24394fdae999SBram Moolenaar 2, 24402c330432SBram Moolenaar three: 3 24414fdae999SBram Moolenaar } 24424fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2443e6085c53SBram Moolenaar 2444e6085c53SBram Moolenaar assert_equal( 2445e6085c53SBram Moolenaar ['one', 'two', 'three'], 2446e6085c53SBram Moolenaar split('one two three') 2447e6085c53SBram Moolenaar ) 24484fdae999SBram Moolenaarenddef 24494fdae999SBram Moolenaar 24507a092245SBram Moolenaardef Test_vim9_comment() 24517a092245SBram Moolenaar CheckScriptSuccess([ 24527a092245SBram Moolenaar 'vim9script', 24537a092245SBram Moolenaar '# something', 24547a092245SBram Moolenaar ]) 24557a092245SBram Moolenaar CheckScriptFailure([ 24567a092245SBram Moolenaar 'vim9script', 24577a092245SBram Moolenaar ':# something', 24587a092245SBram Moolenaar ], 'E488:') 24597a092245SBram Moolenaar CheckScriptFailure([ 24607a092245SBram Moolenaar '# something', 24617a092245SBram Moolenaar ], 'E488:') 24627a092245SBram Moolenaar CheckScriptFailure([ 24637a092245SBram Moolenaar ':# something', 24647a092245SBram Moolenaar ], 'E488:') 24657a092245SBram Moolenaar 24664a8d9f2eSBram Moolenaar { # block start 24674a8d9f2eSBram Moolenaar } # block end 24684a8d9f2eSBram Moolenaar CheckDefFailure([ 24694a8d9f2eSBram Moolenaar '{# comment', 24704a8d9f2eSBram Moolenaar ], 'E488:') 24714a8d9f2eSBram Moolenaar CheckDefFailure([ 24724a8d9f2eSBram Moolenaar '{', 24734a8d9f2eSBram Moolenaar '}# comment', 24744a8d9f2eSBram Moolenaar ], 'E488:') 24754a8d9f2eSBram Moolenaar 24764a8d9f2eSBram Moolenaar echo "yes" # comment 24774a8d9f2eSBram Moolenaar CheckDefFailure([ 24784a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24794a8d9f2eSBram Moolenaar ], 'E488:') 24807a092245SBram Moolenaar CheckScriptSuccess([ 24817a092245SBram Moolenaar 'vim9script', 24827a092245SBram Moolenaar 'echo "yes" # something', 24837a092245SBram Moolenaar ]) 24847a092245SBram Moolenaar CheckScriptFailure([ 24857a092245SBram Moolenaar 'vim9script', 24867a092245SBram Moolenaar 'echo "yes"# something', 24877a092245SBram Moolenaar ], 'E121:') 24887a092245SBram Moolenaar CheckScriptFailure([ 24897a092245SBram Moolenaar 'vim9script', 24907a092245SBram Moolenaar 'echo# something', 24917a092245SBram Moolenaar ], 'E121:') 24927a092245SBram Moolenaar CheckScriptFailure([ 24937a092245SBram Moolenaar 'echo "yes" # something', 24947a092245SBram Moolenaar ], 'E121:') 24957a092245SBram Moolenaar 24964a8d9f2eSBram Moolenaar exe "echo" # comment 24974a8d9f2eSBram Moolenaar CheckDefFailure([ 24984a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24994a8d9f2eSBram Moolenaar ], 'E488:') 25004a8d9f2eSBram Moolenaar CheckScriptSuccess([ 25014a8d9f2eSBram Moolenaar 'vim9script', 25024a8d9f2eSBram Moolenaar 'exe "echo" # something', 25034a8d9f2eSBram Moolenaar ]) 25044a8d9f2eSBram Moolenaar CheckScriptFailure([ 25054a8d9f2eSBram Moolenaar 'vim9script', 25064a8d9f2eSBram Moolenaar 'exe "echo"# something', 25074a8d9f2eSBram Moolenaar ], 'E121:') 25084a8d9f2eSBram Moolenaar CheckDefFailure([ 25094a8d9f2eSBram Moolenaar 'exe # comment', 25104a8d9f2eSBram Moolenaar ], 'E1015:') 25114a8d9f2eSBram Moolenaar CheckScriptFailure([ 25124a8d9f2eSBram Moolenaar 'vim9script', 25134a8d9f2eSBram Moolenaar 'exe# something', 25144a8d9f2eSBram Moolenaar ], 'E121:') 25154a8d9f2eSBram Moolenaar CheckScriptFailure([ 25164a8d9f2eSBram Moolenaar 'exe "echo" # something', 25174a8d9f2eSBram Moolenaar ], 'E121:') 25184a8d9f2eSBram Moolenaar 25197a092245SBram Moolenaar CheckDefFailure([ 25207a092245SBram Moolenaar 'try# comment', 25217a092245SBram Moolenaar ' echo "yes"', 25227a092245SBram Moolenaar 'catch', 25237a092245SBram Moolenaar 'endtry', 25247a092245SBram Moolenaar ], 'E488:') 25252c5ed4e3SBram Moolenaar CheckScriptFailure([ 25262c5ed4e3SBram Moolenaar 'vim9script', 25272c5ed4e3SBram Moolenaar 'try# comment', 25282c5ed4e3SBram Moolenaar 'echo "yes"', 25292c5ed4e3SBram Moolenaar ], 'E488:') 25307a092245SBram Moolenaar CheckDefFailure([ 25317a092245SBram Moolenaar 'try', 2532a72cfb80SBram Moolenaar ' throw#comment', 2533a72cfb80SBram Moolenaar 'catch', 2534a72cfb80SBram Moolenaar 'endtry', 2535a72cfb80SBram Moolenaar ], 'E1015:') 2536a72cfb80SBram Moolenaar CheckDefFailure([ 2537a72cfb80SBram Moolenaar 'try', 2538a72cfb80SBram Moolenaar ' throw "yes"#comment', 2539a72cfb80SBram Moolenaar 'catch', 2540a72cfb80SBram Moolenaar 'endtry', 2541a72cfb80SBram Moolenaar ], 'E488:') 2542a72cfb80SBram Moolenaar CheckDefFailure([ 2543a72cfb80SBram Moolenaar 'try', 25447a092245SBram Moolenaar ' echo "yes"', 25457a092245SBram Moolenaar 'catch# comment', 25467a092245SBram Moolenaar 'endtry', 25477a092245SBram Moolenaar ], 'E488:') 25482c5ed4e3SBram Moolenaar CheckScriptFailure([ 25492c5ed4e3SBram Moolenaar 'vim9script', 25502c5ed4e3SBram Moolenaar 'try', 25512c5ed4e3SBram Moolenaar ' echo "yes"', 25522c5ed4e3SBram Moolenaar 'catch# comment', 25532c5ed4e3SBram Moolenaar 'endtry', 25542c5ed4e3SBram Moolenaar ], 'E654:') 25552c5ed4e3SBram Moolenaar CheckDefFailure([ 25562c5ed4e3SBram Moolenaar 'try', 25572c5ed4e3SBram Moolenaar ' echo "yes"', 25582c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25592c5ed4e3SBram Moolenaar 'endtry', 25602c5ed4e3SBram Moolenaar ], 'E488:') 25617a092245SBram Moolenaar CheckDefFailure([ 25627a092245SBram Moolenaar 'try', 25637a092245SBram Moolenaar 'echo "yes"', 25647a092245SBram Moolenaar 'catch', 25657a092245SBram Moolenaar 'endtry# comment', 25667a092245SBram Moolenaar ], 'E488:') 25672c5ed4e3SBram Moolenaar CheckScriptFailure([ 25682c5ed4e3SBram Moolenaar 'vim9script', 25692c5ed4e3SBram Moolenaar 'try', 25702c5ed4e3SBram Moolenaar ' echo "yes"', 25712c5ed4e3SBram Moolenaar 'catch', 25722c5ed4e3SBram Moolenaar 'endtry# comment', 25739b7bf9e9SBram Moolenaar ], 'E488:') 25742c5ed4e3SBram Moolenaar 25752c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25762c5ed4e3SBram Moolenaar 'vim9script', 25772c5ed4e3SBram Moolenaar 'hi # comment', 25782c5ed4e3SBram Moolenaar ]) 25792c5ed4e3SBram Moolenaar CheckScriptFailure([ 25802c5ed4e3SBram Moolenaar 'vim9script', 25812c5ed4e3SBram Moolenaar 'hi# comment', 25822c5ed4e3SBram Moolenaar ], 'E416:') 25831966c248SBram Moolenaar CheckScriptSuccess([ 25841966c248SBram Moolenaar 'vim9script', 25851966c248SBram Moolenaar 'hi Search # comment', 25861966c248SBram Moolenaar ]) 25871966c248SBram Moolenaar CheckScriptFailure([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'hi Search# comment', 25901966c248SBram Moolenaar ], 'E416:') 25911966c248SBram Moolenaar CheckScriptSuccess([ 25921966c248SBram Moolenaar 'vim9script', 25931966c248SBram Moolenaar 'hi link This Search # comment', 25941966c248SBram Moolenaar ]) 25951966c248SBram Moolenaar CheckScriptFailure([ 25961966c248SBram Moolenaar 'vim9script', 25971966c248SBram Moolenaar 'hi link This That# comment', 25981966c248SBram Moolenaar ], 'E413:') 25991966c248SBram Moolenaar CheckScriptSuccess([ 26001966c248SBram Moolenaar 'vim9script', 26011966c248SBram Moolenaar 'hi clear This # comment', 26021966c248SBram Moolenaar 'hi clear # comment', 26031966c248SBram Moolenaar ]) 2604f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2605f5be8cdbSBram Moolenaar # hi clear This# comment', 26061966c248SBram Moolenaar CheckScriptFailure([ 26071966c248SBram Moolenaar 'vim9script', 26081966c248SBram Moolenaar 'hi clear# comment', 26091966c248SBram Moolenaar ], 'E416:') 26101966c248SBram Moolenaar 26111966c248SBram Moolenaar CheckScriptSuccess([ 26121966c248SBram Moolenaar 'vim9script', 26131966c248SBram Moolenaar 'hi Group term=bold', 26141966c248SBram Moolenaar 'match Group /todo/ # comment', 26151966c248SBram Moolenaar ]) 26161966c248SBram Moolenaar CheckScriptFailure([ 26171966c248SBram Moolenaar 'vim9script', 26181966c248SBram Moolenaar 'hi Group term=bold', 26191966c248SBram Moolenaar 'match Group /todo/# comment', 26201966c248SBram Moolenaar ], 'E488:') 26211966c248SBram Moolenaar CheckScriptSuccess([ 26221966c248SBram Moolenaar 'vim9script', 26231966c248SBram Moolenaar 'match # comment', 26241966c248SBram Moolenaar ]) 26251966c248SBram Moolenaar CheckScriptFailure([ 26261966c248SBram Moolenaar 'vim9script', 26271966c248SBram Moolenaar 'match# comment', 26281966c248SBram Moolenaar ], 'E475:') 26291966c248SBram Moolenaar CheckScriptSuccess([ 26301966c248SBram Moolenaar 'vim9script', 26311966c248SBram Moolenaar 'match none # comment', 26321966c248SBram Moolenaar ]) 26331966c248SBram Moolenaar CheckScriptFailure([ 26341966c248SBram Moolenaar 'vim9script', 26351966c248SBram Moolenaar 'match none# comment', 26361966c248SBram Moolenaar ], 'E475:') 26371966c248SBram Moolenaar 26381966c248SBram Moolenaar CheckScriptSuccess([ 26391966c248SBram Moolenaar 'vim9script', 26401966c248SBram Moolenaar 'menutrans clear # comment', 26411966c248SBram Moolenaar ]) 26421966c248SBram Moolenaar CheckScriptFailure([ 26431966c248SBram Moolenaar 'vim9script', 26441966c248SBram Moolenaar 'menutrans clear# comment text', 26451966c248SBram Moolenaar ], 'E474:') 26461966c248SBram Moolenaar 26471966c248SBram Moolenaar CheckScriptSuccess([ 26481966c248SBram Moolenaar 'vim9script', 26491966c248SBram Moolenaar 'syntax clear # comment', 26501966c248SBram Moolenaar ]) 26511966c248SBram Moolenaar CheckScriptFailure([ 26521966c248SBram Moolenaar 'vim9script', 26531966c248SBram Moolenaar 'syntax clear# comment text', 26541966c248SBram Moolenaar ], 'E28:') 26551966c248SBram Moolenaar CheckScriptSuccess([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax keyword Word some', 26581966c248SBram Moolenaar 'syntax clear Word # comment', 26591966c248SBram Moolenaar ]) 26601966c248SBram Moolenaar CheckScriptFailure([ 26611966c248SBram Moolenaar 'vim9script', 26621966c248SBram Moolenaar 'syntax keyword Word some', 26631966c248SBram Moolenaar 'syntax clear Word# comment text', 26641966c248SBram Moolenaar ], 'E28:') 26651966c248SBram Moolenaar 26661966c248SBram Moolenaar CheckScriptSuccess([ 26671966c248SBram Moolenaar 'vim9script', 26681966c248SBram Moolenaar 'syntax list # comment', 26691966c248SBram Moolenaar ]) 26701966c248SBram Moolenaar CheckScriptFailure([ 26711966c248SBram Moolenaar 'vim9script', 26721966c248SBram Moolenaar 'syntax list# comment text', 26731966c248SBram Moolenaar ], 'E28:') 26741966c248SBram Moolenaar 26751966c248SBram Moolenaar CheckScriptSuccess([ 26761966c248SBram Moolenaar 'vim9script', 26771966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26781966c248SBram Moolenaar ]) 26791966c248SBram Moolenaar CheckScriptFailure([ 26801966c248SBram Moolenaar 'vim9script', 26811966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26821966c248SBram Moolenaar ], 'E475:') 26831966c248SBram Moolenaar 26841966c248SBram Moolenaar CheckScriptSuccess([ 26851966c248SBram Moolenaar 'vim9script', 26861966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26871966c248SBram Moolenaar ]) 26881966c248SBram Moolenaar CheckScriptFailure([ 26891966c248SBram Moolenaar 'vim9script', 26901966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26911966c248SBram Moolenaar ], 'E789:') 26921966c248SBram Moolenaar 26931966c248SBram Moolenaar CheckScriptSuccess([ 26941966c248SBram Moolenaar 'vim9script', 26951966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26961966c248SBram Moolenaar ]) 26971966c248SBram Moolenaar CheckScriptFailure([ 26981966c248SBram Moolenaar 'vim9script', 26991966c248SBram Moolenaar 'syntax match Word /pat/# comment', 27001966c248SBram Moolenaar ], 'E402:') 27011966c248SBram Moolenaar 27021966c248SBram Moolenaar CheckScriptSuccess([ 27031966c248SBram Moolenaar 'vim9script', 27041966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 27051966c248SBram Moolenaar ]) 27061966c248SBram Moolenaar CheckScriptFailure([ 27071966c248SBram Moolenaar 'vim9script', 27081966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27091966c248SBram Moolenaar ], 'E475:') 27101966c248SBram Moolenaar CheckScriptFailure([ 27111966c248SBram Moolenaar 'vim9script', 27121966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27131966c248SBram Moolenaar ], 'E406:') 27141966c248SBram Moolenaar CheckScriptFailure([ 27151966c248SBram Moolenaar 'vim9script', 27161966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27171966c248SBram Moolenaar ], 'E475:') 27181966c248SBram Moolenaar 27191966c248SBram Moolenaar CheckScriptSuccess([ 27201966c248SBram Moolenaar 'vim9script', 27211966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27221966c248SBram Moolenaar ]) 27231966c248SBram Moolenaar CheckScriptFailure([ 27241966c248SBram Moolenaar 'vim9script', 27251966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2726d032f34aSBram Moolenaar ], 'E402:') 27271966c248SBram Moolenaar 27281966c248SBram Moolenaar CheckScriptSuccess([ 27291966c248SBram Moolenaar 'vim9script', 27301966c248SBram Moolenaar 'syntax sync # comment', 27311966c248SBram Moolenaar ]) 27321966c248SBram Moolenaar CheckScriptFailure([ 27331966c248SBram Moolenaar 'vim9script', 27341966c248SBram Moolenaar 'syntax sync# comment', 27351966c248SBram Moolenaar ], 'E404:') 27361966c248SBram Moolenaar CheckScriptSuccess([ 27371966c248SBram Moolenaar 'vim9script', 27381966c248SBram Moolenaar 'syntax sync ccomment # comment', 27391966c248SBram Moolenaar ]) 27401966c248SBram Moolenaar CheckScriptFailure([ 27411966c248SBram Moolenaar 'vim9script', 27421966c248SBram Moolenaar 'syntax sync ccomment# comment', 27431966c248SBram Moolenaar ], 'E404:') 27441966c248SBram Moolenaar 27451966c248SBram Moolenaar CheckScriptSuccess([ 27461966c248SBram Moolenaar 'vim9script', 27471966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27481966c248SBram Moolenaar ]) 27491966c248SBram Moolenaar CheckScriptFailure([ 27501966c248SBram Moolenaar 'vim9script', 27511966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27521966c248SBram Moolenaar ], 'E475:') 2753a72cfb80SBram Moolenaar 2754a72cfb80SBram Moolenaar CheckScriptSuccess([ 2755a72cfb80SBram Moolenaar 'vim9script', 2756a72cfb80SBram Moolenaar 'command Echo echo # comment', 2757a72cfb80SBram Moolenaar 'command Echo # comment', 2758a72cfb80SBram Moolenaar ]) 2759a72cfb80SBram Moolenaar CheckScriptFailure([ 2760a72cfb80SBram Moolenaar 'vim9script', 2761a72cfb80SBram Moolenaar 'command Echo echo# comment', 2762a72cfb80SBram Moolenaar 'Echo', 2763a72cfb80SBram Moolenaar ], 'E121:') 2764a72cfb80SBram Moolenaar CheckScriptFailure([ 2765a72cfb80SBram Moolenaar 'vim9script', 2766a72cfb80SBram Moolenaar 'command Echo# comment', 2767a72cfb80SBram Moolenaar ], 'E182:') 2768a72cfb80SBram Moolenaar CheckScriptFailure([ 2769a72cfb80SBram Moolenaar 'vim9script', 2770a72cfb80SBram Moolenaar 'command Echo echo', 2771a72cfb80SBram Moolenaar 'command Echo# comment', 2772a72cfb80SBram Moolenaar ], 'E182:') 2773a72cfb80SBram Moolenaar 2774a72cfb80SBram Moolenaar CheckScriptSuccess([ 2775a72cfb80SBram Moolenaar 'vim9script', 2776a72cfb80SBram Moolenaar 'function # comment', 2777a72cfb80SBram Moolenaar ]) 2778a72cfb80SBram Moolenaar CheckScriptFailure([ 2779a72cfb80SBram Moolenaar 'vim9script', 27809898107fSBram Moolenaar 'function " comment', 27819898107fSBram Moolenaar ], 'E129:') 27829898107fSBram Moolenaar CheckScriptFailure([ 27839898107fSBram Moolenaar 'vim9script', 2784a72cfb80SBram Moolenaar 'function# comment', 2785a72cfb80SBram Moolenaar ], 'E129:') 2786a72cfb80SBram Moolenaar CheckScriptSuccess([ 2787a72cfb80SBram Moolenaar 'vim9script', 2788a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2789a72cfb80SBram Moolenaar ]) 2790a72cfb80SBram Moolenaar CheckScriptFailure([ 2791a72cfb80SBram Moolenaar 'vim9script', 2792a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2793a72cfb80SBram Moolenaar ], 'E488:') 2794a72cfb80SBram Moolenaar 2795a72cfb80SBram Moolenaar CheckScriptSuccess([ 2796a72cfb80SBram Moolenaar 'vim9script', 27974c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2798a72cfb80SBram Moolenaar 'endfunc', 27994c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2800a72cfb80SBram Moolenaar ]) 2801a72cfb80SBram Moolenaar CheckScriptFailure([ 2802a72cfb80SBram Moolenaar 'vim9script', 28034c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2804a72cfb80SBram Moolenaar 'endfunc', 28054c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2806a72cfb80SBram Moolenaar ], 'E488:') 2807a72cfb80SBram Moolenaar 2808a72cfb80SBram Moolenaar CheckScriptSuccess([ 2809a72cfb80SBram Moolenaar 'vim9script', 2810a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2811a72cfb80SBram Moolenaar ]) 2812a72cfb80SBram Moolenaar CheckScriptFailure([ 2813a72cfb80SBram Moolenaar 'vim9script', 2814a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2815a72cfb80SBram Moolenaar ], 'E488:') 2816e7e4838fSBram Moolenaar 2817e7e4838fSBram Moolenaar CheckScriptFailure([ 2818e7e4838fSBram Moolenaar 'def Test() " comment', 2819e7e4838fSBram Moolenaar 'enddef', 2820e7e4838fSBram Moolenaar ], 'E488:') 2821e7e4838fSBram Moolenaar CheckScriptFailure([ 2822e7e4838fSBram Moolenaar 'vim9script', 2823e7e4838fSBram Moolenaar 'def Test() " comment', 2824e7e4838fSBram Moolenaar 'enddef', 2825e7e4838fSBram Moolenaar ], 'E488:') 2826e7e4838fSBram Moolenaar 2827e7e4838fSBram Moolenaar CheckScriptSuccess([ 2828e7e4838fSBram Moolenaar 'func Test() " comment', 2829e7e4838fSBram Moolenaar 'endfunc', 2830e7e4838fSBram Moolenaar ]) 28319898107fSBram Moolenaar CheckScriptSuccess([ 2832e7e4838fSBram Moolenaar 'vim9script', 2833e7e4838fSBram Moolenaar 'func Test() " comment', 2834e7e4838fSBram Moolenaar 'endfunc', 28359898107fSBram Moolenaar ]) 2836e7e4838fSBram Moolenaar 2837e7e4838fSBram Moolenaar CheckScriptSuccess([ 2838e7e4838fSBram Moolenaar 'def Test() # comment', 2839e7e4838fSBram Moolenaar 'enddef', 2840e7e4838fSBram Moolenaar ]) 2841e7e4838fSBram Moolenaar CheckScriptFailure([ 2842e7e4838fSBram Moolenaar 'func Test() # comment', 2843e7e4838fSBram Moolenaar 'endfunc', 2844e7e4838fSBram Moolenaar ], 'E488:') 28452c5ed4e3SBram Moolenaarenddef 28462c5ed4e3SBram Moolenaar 28472c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28482c5ed4e3SBram Moolenaar CheckCanRunGui 28492c5ed4e3SBram Moolenaar 28502c5ed4e3SBram Moolenaar CheckScriptFailure([ 28512c5ed4e3SBram Moolenaar 'vim9script', 28522c5ed4e3SBram Moolenaar 'gui#comment' 28532c5ed4e3SBram Moolenaar ], 'E499:') 28542c5ed4e3SBram Moolenaar CheckScriptFailure([ 28552c5ed4e3SBram Moolenaar 'vim9script', 28562c5ed4e3SBram Moolenaar 'gui -f#comment' 28572c5ed4e3SBram Moolenaar ], 'E499:') 28587a092245SBram Moolenaarenddef 28597a092245SBram Moolenaar 2860a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28616797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28626797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2863a26b9700SBram Moolenaar 2864a26b9700SBram Moolenaar edit test.vim 2865a26b9700SBram Moolenaar doautocmd TabEnter #comment 2866a26b9700SBram Moolenaar assert_equal(1, g:entered) 2867a26b9700SBram Moolenaar 2868a26b9700SBram Moolenaar doautocmd TabEnter f.x 2869a26b9700SBram Moolenaar assert_equal(2, g:entered) 2870a26b9700SBram Moolenaar 2871a26b9700SBram Moolenaar g:entered = 0 2872a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2873a26b9700SBram Moolenaar assert_equal(2, g:entered) 2874a26b9700SBram Moolenaar 2875a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2876a26b9700SBram Moolenaar 2877a26b9700SBram Moolenaar au! TabEnter 2878a26b9700SBram Moolenaar unlet g:entered 2879d72c1bf0SBram Moolenaar 2880d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2881d72c1bf0SBram Moolenaar 'vim9script', 28826797966dSBram Moolenaar 'g:var = 123', 2883e55b1c09SBram Moolenaar 'b:var = 456', 2884e55b1c09SBram Moolenaar 'w:var = 777', 2885e55b1c09SBram Moolenaar 't:var = 888', 2886d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2887d72c1bf0SBram Moolenaar ]) 2888d72c1bf0SBram Moolenaar 2889d72c1bf0SBram Moolenaar CheckScriptFailure([ 2890d72c1bf0SBram Moolenaar 'vim9script', 2891d72c1bf0SBram Moolenaar 'let g:var = 123', 2892e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2893e55b1c09SBram Moolenaar 2894e55b1c09SBram Moolenaar CheckScriptFailure([ 2895e55b1c09SBram Moolenaar 'vim9script', 2896e55b1c09SBram Moolenaar 'let b:var = 123', 2897e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2898e55b1c09SBram Moolenaar 2899e55b1c09SBram Moolenaar CheckScriptFailure([ 2900e55b1c09SBram Moolenaar 'vim9script', 2901e55b1c09SBram Moolenaar 'let w:var = 123', 2902e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2903e55b1c09SBram Moolenaar 2904e55b1c09SBram Moolenaar CheckScriptFailure([ 2905e55b1c09SBram Moolenaar 'vim9script', 2906e55b1c09SBram Moolenaar 'let t:var = 123', 2907e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2908e55b1c09SBram Moolenaar 2909e55b1c09SBram Moolenaar CheckScriptFailure([ 2910e55b1c09SBram Moolenaar 'vim9script', 2911e55b1c09SBram Moolenaar 'let v:version = 123', 2912e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2913e55b1c09SBram Moolenaar 2914e55b1c09SBram Moolenaar CheckScriptFailure([ 2915e55b1c09SBram Moolenaar 'vim9script', 2916e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2917e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29186797966dSBram Moolenaar 29196797966dSBram Moolenaar CheckScriptFailure([ 29206797966dSBram Moolenaar 'vim9script', 29216797966dSBram Moolenaar 'g:var = 123', 292232e35117SBram Moolenaar 'unlet g:var# comment1', 2923d72c1bf0SBram Moolenaar ], 'E108:') 2924d72c1bf0SBram Moolenaar 2925d72c1bf0SBram Moolenaar CheckScriptFailure([ 2926d72c1bf0SBram Moolenaar 'let g:var = 123', 2927d72c1bf0SBram Moolenaar 'unlet g:var # something', 2928d72c1bf0SBram Moolenaar ], 'E488:') 2929faac4104SBram Moolenaar 2930faac4104SBram Moolenaar CheckScriptSuccess([ 2931faac4104SBram Moolenaar 'vim9script', 293232e35117SBram Moolenaar 'if 1 # comment2', 2933faac4104SBram Moolenaar ' echo "yes"', 2934faac4104SBram Moolenaar 'elseif 2 #comment', 2935faac4104SBram Moolenaar ' echo "no"', 2936faac4104SBram Moolenaar 'endif', 2937faac4104SBram Moolenaar ]) 2938faac4104SBram Moolenaar 2939faac4104SBram Moolenaar CheckScriptFailure([ 2940faac4104SBram Moolenaar 'vim9script', 294132e35117SBram Moolenaar 'if 1# comment3', 2942faac4104SBram Moolenaar ' echo "yes"', 2943faac4104SBram Moolenaar 'endif', 2944faac4104SBram Moolenaar ], 'E15:') 2945faac4104SBram Moolenaar 2946faac4104SBram Moolenaar CheckScriptFailure([ 2947faac4104SBram Moolenaar 'vim9script', 294832e35117SBram Moolenaar 'if 0 # comment4', 2949faac4104SBram Moolenaar ' echo "yes"', 2950faac4104SBram Moolenaar 'elseif 2#comment', 2951faac4104SBram Moolenaar ' echo "no"', 2952faac4104SBram Moolenaar 'endif', 2953faac4104SBram Moolenaar ], 'E15:') 2954faac4104SBram Moolenaar 2955faac4104SBram Moolenaar CheckScriptSuccess([ 2956faac4104SBram Moolenaar 'vim9script', 295732e35117SBram Moolenaar 'let v = 1 # comment5', 2958faac4104SBram Moolenaar ]) 2959faac4104SBram Moolenaar 2960faac4104SBram Moolenaar CheckScriptFailure([ 2961faac4104SBram Moolenaar 'vim9script', 296232e35117SBram Moolenaar 'let v = 1# comment6', 296332e35117SBram Moolenaar ], 'E15:') 2964faac4104SBram Moolenaar 2965faac4104SBram Moolenaar CheckScriptSuccess([ 2966faac4104SBram Moolenaar 'vim9script', 2967faac4104SBram Moolenaar 'new' 2968d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2969df069eecSBram Moolenaar ':$', 2970faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2971faac4104SBram Moolenaar 'bwipe!', 2972faac4104SBram Moolenaar ]) 2973faac4104SBram Moolenaar 2974f5be8cdbSBram Moolenaar CheckScriptFailure([ 2975f5be8cdbSBram Moolenaar 'vim9script', 2976f5be8cdbSBram Moolenaar 'new' 2977d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2978f5be8cdbSBram Moolenaar ':$', 2979f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2980f5be8cdbSBram Moolenaar 'bwipe!', 2981f5be8cdbSBram Moolenaar ], 'E488:') 2982f5be8cdbSBram Moolenaar 2983f5be8cdbSBram Moolenaar CheckScriptFailure([ 2984f5be8cdbSBram Moolenaar 'vim9script', 2985f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2986f5be8cdbSBram Moolenaar ], 'E477:') 2987a26b9700SBram Moolenaarenddef 2988a26b9700SBram Moolenaar 29897e5bd91dSBram Moolenaardef Test_finish() 29907e5bd91dSBram Moolenaar let lines =<< trim END 29917e5bd91dSBram Moolenaar vim9script 29926797966dSBram Moolenaar g:res = 'one' 29937e5bd91dSBram Moolenaar if v:false | finish | endif 29946797966dSBram Moolenaar g:res = 'two' 29957e5bd91dSBram Moolenaar finish 29966797966dSBram Moolenaar g:res = 'three' 29977e5bd91dSBram Moolenaar END 29987e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29997e5bd91dSBram Moolenaar source Xfinished 30007e5bd91dSBram Moolenaar assert_equal('two', g:res) 30017e5bd91dSBram Moolenaar 30027e5bd91dSBram Moolenaar unlet g:res 30037e5bd91dSBram Moolenaar delete('Xfinished') 30047e5bd91dSBram Moolenaarenddef 30057e5bd91dSBram Moolenaar 300632e35117SBram Moolenaardef Test_let_func_call() 300732e35117SBram Moolenaar let lines =<< trim END 300832e35117SBram Moolenaar vim9script 300932e35117SBram Moolenaar func GetValue() 301032e35117SBram Moolenaar if exists('g:count') 301132e35117SBram Moolenaar let g:count += 1 301232e35117SBram Moolenaar else 301332e35117SBram Moolenaar let g:count = 1 301432e35117SBram Moolenaar endif 301532e35117SBram Moolenaar return 'this' 301632e35117SBram Moolenaar endfunc 301732e35117SBram Moolenaar let val: string = GetValue() 3018f5be8cdbSBram Moolenaar # env var is always a string 3019df671b46SBram Moolenaar let env = $TERM 302032e35117SBram Moolenaar END 302132e35117SBram Moolenaar writefile(lines, 'Xfinished') 302232e35117SBram Moolenaar source Xfinished 3023f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 302432e35117SBram Moolenaar assert_equal(1, g:count) 302532e35117SBram Moolenaar 302632e35117SBram Moolenaar unlet g:count 302732e35117SBram Moolenaar delete('Xfinished') 302832e35117SBram Moolenaarenddef 302932e35117SBram Moolenaar 303032e35117SBram Moolenaardef Test_let_missing_type() 303132e35117SBram Moolenaar let lines =<< trim END 303232e35117SBram Moolenaar vim9script 3033df671b46SBram Moolenaar let var = g:unknown 3034227a69deSBram Moolenaar END 3035822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 3036227a69deSBram Moolenaar 3037227a69deSBram Moolenaar lines =<< trim END 3038227a69deSBram Moolenaar vim9script 3039227a69deSBram Moolenaar let nr: number = 123 3040227a69deSBram Moolenaar let var = nr 3041227a69deSBram Moolenaar END 3042822ba247SBram Moolenaar CheckScriptSuccess(lines) 304332e35117SBram Moolenaarenddef 304432e35117SBram Moolenaar 3045c82a5b5dSBram Moolenaardef Test_let_declaration() 3046c82a5b5dSBram Moolenaar let lines =<< trim END 3047c82a5b5dSBram Moolenaar vim9script 3048c82a5b5dSBram Moolenaar let var: string 3049c82a5b5dSBram Moolenaar g:var_uninit = var 3050c82a5b5dSBram Moolenaar var = 'text' 3051c82a5b5dSBram Moolenaar g:var_test = var 3052f5be8cdbSBram Moolenaar # prefixing s: is optional 3053984dddbeSBram Moolenaar s:var = 'prefixed' 3054984dddbeSBram Moolenaar g:var_prefixed = s:var 3055984dddbeSBram Moolenaar 3056984dddbeSBram Moolenaar let s:other: number 3057984dddbeSBram Moolenaar other = 1234 3058984dddbeSBram Moolenaar g:other_var = other 305953b29e48SBram Moolenaar 306053b29e48SBram Moolenaar # type is inferred 306153b29e48SBram Moolenaar s:dict = {'a': 222} 306253b29e48SBram Moolenaar def GetDictVal(key: any) 306353b29e48SBram Moolenaar g:dict_val = s:dict[key] 306453b29e48SBram Moolenaar enddef 306553b29e48SBram Moolenaar GetDictVal('a') 3066c82a5b5dSBram Moolenaar END 3067c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3068c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3069c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3070984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3071984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 307253b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3073c82a5b5dSBram Moolenaar 3074c82a5b5dSBram Moolenaar unlet g:var_uninit 3075c82a5b5dSBram Moolenaar unlet g:var_test 3076984dddbeSBram Moolenaar unlet g:var_prefixed 3077984dddbeSBram Moolenaar unlet g:other_var 3078c82a5b5dSBram Moolenaarenddef 3079c82a5b5dSBram Moolenaar 3080c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3081c5b1c20bSBram Moolenaar let lines =<< trim END 3082c5b1c20bSBram Moolenaar vim9script 3083c5b1c20bSBram Moolenaar const var: string 3084c5b1c20bSBram Moolenaar END 3085c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3086c5b1c20bSBram Moolenaar 3087c5b1c20bSBram Moolenaar lines =<< trim END 3088c5b1c20bSBram Moolenaar vim9script 3089c5b1c20bSBram Moolenaar let 9var: string 3090c5b1c20bSBram Moolenaar END 3091c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3092c5b1c20bSBram Moolenaarenddef 3093c5b1c20bSBram Moolenaar 309434db91f7SBram Moolenaardef Test_let_type_check() 309534db91f7SBram Moolenaar let lines =<< trim END 309634db91f7SBram Moolenaar vim9script 309734db91f7SBram Moolenaar let var: string 309834db91f7SBram Moolenaar var = 1234 309934db91f7SBram Moolenaar END 3100451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3101984dddbeSBram Moolenaar 3102984dddbeSBram Moolenaar lines =<< trim END 3103984dddbeSBram Moolenaar vim9script 3104984dddbeSBram Moolenaar let var:string 3105984dddbeSBram Moolenaar END 3106984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3107c5b1c20bSBram Moolenaar 3108c5b1c20bSBram Moolenaar lines =<< trim END 3109c5b1c20bSBram Moolenaar vim9script 3110c5b1c20bSBram Moolenaar let var: asdf 3111c5b1c20bSBram Moolenaar END 3112c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3113a71e2633SBram Moolenaar 3114a71e2633SBram Moolenaar lines =<< trim END 3115a71e2633SBram Moolenaar vim9script 3116a71e2633SBram Moolenaar let s:l: list<number> 3117a71e2633SBram Moolenaar s:l = [] 3118a71e2633SBram Moolenaar END 3119a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3120a71e2633SBram Moolenaar 3121a71e2633SBram Moolenaar lines =<< trim END 3122a71e2633SBram Moolenaar vim9script 3123a71e2633SBram Moolenaar let s:d: dict<number> 3124a71e2633SBram Moolenaar s:d = {} 3125a71e2633SBram Moolenaar END 3126a71e2633SBram Moolenaar CheckScriptSuccess(lines) 312734db91f7SBram Moolenaarenddef 312834db91f7SBram Moolenaar 3129a5d0077eSBram Moolenaardef Test_forward_declaration() 3130a5d0077eSBram Moolenaar let lines =<< trim END 3131a5d0077eSBram Moolenaar vim9script 3132a5d0077eSBram Moolenaar def GetValue(): string 3133a5d0077eSBram Moolenaar return theVal 3134a5d0077eSBram Moolenaar enddef 3135a5d0077eSBram Moolenaar let theVal = 'something' 3136822ba247SBram Moolenaar g:initVal = GetValue() 3137a5d0077eSBram Moolenaar theVal = 'else' 3138a5d0077eSBram Moolenaar g:laterVal = GetValue() 3139a5d0077eSBram Moolenaar END 3140a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3141a5d0077eSBram Moolenaar source Xforward 3142a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3143a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3144a5d0077eSBram Moolenaar 3145a5d0077eSBram Moolenaar unlet g:initVal 3146a5d0077eSBram Moolenaar unlet g:laterVal 3147a5d0077eSBram Moolenaar delete('Xforward') 3148a5d0077eSBram Moolenaarenddef 3149a5d0077eSBram Moolenaar 31509721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 31519721fb4eSBram Moolenaar let legacy_lines =<< trim END 31529721fb4eSBram Moolenaar source Xvim9_script.vim 31539721fb4eSBram Moolenaar 31549721fb4eSBram Moolenaar call assert_false(exists('local')) 31559721fb4eSBram Moolenaar call assert_false(exists('exported')) 31569721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31579721fb4eSBram Moolenaar call assert_equal('global', global) 31589721fb4eSBram Moolenaar call assert_equal('global', g:global) 31599721fb4eSBram Moolenaar 31609721fb4eSBram Moolenaar " imported variable becomes script-local 31619721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31629721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31639721fb4eSBram Moolenaar call assert_false(exists('exported')) 31649721fb4eSBram Moolenaar 31659721fb4eSBram Moolenaar " imported function becomes script-local 31669721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31679721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31689721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31699721fb4eSBram Moolenaar END 31709721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31719721fb4eSBram Moolenaar 31729721fb4eSBram Moolenaar let vim9_lines =<< trim END 31739721fb4eSBram Moolenaar vim9script 31749721fb4eSBram Moolenaar let local = 'local' 31759721fb4eSBram Moolenaar g:global = 'global' 31769721fb4eSBram Moolenaar export let exported = 'exported' 31779721fb4eSBram Moolenaar export def GetText(): string 31789721fb4eSBram Moolenaar return 'text' 31799721fb4eSBram Moolenaar enddef 31809721fb4eSBram Moolenaar END 31819721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31829721fb4eSBram Moolenaar 31839721fb4eSBram Moolenaar source Xlegacy_script.vim 31849721fb4eSBram Moolenaar 31859721fb4eSBram Moolenaar assert_equal('global', g:global) 3186f5be8cdbSBram Moolenaar unlet g:global 31879721fb4eSBram Moolenaar 31889721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31899721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31909721fb4eSBram Moolenaarenddef 3191a5d0077eSBram Moolenaar 31927d699701SBram Moolenaarfunc Test_vim9script_not_global() 31937d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31947d699701SBram Moolenaar let vim9lines =<< trim END 31957d699701SBram Moolenaar vim9script 31967d699701SBram Moolenaar let var = 'local' 31977d699701SBram Moolenaar func TheFunc() 31987d699701SBram Moolenaar echo 'local' 31997d699701SBram Moolenaar endfunc 32007d699701SBram Moolenaar def DefFunc() 32017d699701SBram Moolenaar echo 'local' 32027d699701SBram Moolenaar enddef 32037d699701SBram Moolenaar END 32047d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 32057d699701SBram Moolenaar source Xvim9script.vim 32067d699701SBram Moolenaar try 32077d699701SBram Moolenaar echo g:var 32087d699701SBram Moolenaar assert_report('did not fail') 32097d699701SBram Moolenaar catch /E121:/ 32107d699701SBram Moolenaar " caught 32117d699701SBram Moolenaar endtry 32127d699701SBram Moolenaar try 32137d699701SBram Moolenaar call TheFunc() 32147d699701SBram Moolenaar assert_report('did not fail') 32157d699701SBram Moolenaar catch /E117:/ 32167d699701SBram Moolenaar " caught 32177d699701SBram Moolenaar endtry 32187d699701SBram Moolenaar try 32197d699701SBram Moolenaar call DefFunc() 32207d699701SBram Moolenaar assert_report('did not fail') 32217d699701SBram Moolenaar catch /E117:/ 32227d699701SBram Moolenaar " caught 32237d699701SBram Moolenaar endtry 32247d699701SBram Moolenaar 322525859dd7SBram Moolenaar call delete('Xvim9script.vim') 32267d699701SBram Moolenaarendfunc 32277d699701SBram Moolenaar 3228eeb27bfeSBram Moolenaardef Test_vim9_copen() 3229eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3230eeb27bfeSBram Moolenaar copen 3231eeb27bfeSBram Moolenaar quit 3232eeb27bfeSBram Moolenaarenddef 3233eeb27bfeSBram Moolenaar 32342d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 32352d6b20d6SBram Moolenaardef Test_vim9_autoload() 32362d6b20d6SBram Moolenaar let lines =<< trim END 32372d6b20d6SBram Moolenaar vim9script 32382d6b20d6SBram Moolenaar def foo#test() 32392d6b20d6SBram Moolenaar echomsg getreg('"') 32402d6b20d6SBram Moolenaar enddef 32412d6b20d6SBram Moolenaar END 32422d6b20d6SBram Moolenaar 32432d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32442d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 32452d6b20d6SBram Moolenaar let save_rtp = &rtp 32462d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32472d6b20d6SBram Moolenaar augroup test 32482d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32492d6b20d6SBram Moolenaar augroup END 32502d6b20d6SBram Moolenaar 32512d6b20d6SBram Moolenaar normal Y 32522d6b20d6SBram Moolenaar 32532d6b20d6SBram Moolenaar augroup test 32542d6b20d6SBram Moolenaar autocmd! 32552d6b20d6SBram Moolenaar augroup END 32562d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32572d6b20d6SBram Moolenaar &rtp = save_rtp 32582d6b20d6SBram Moolenaarenddef 32592d6b20d6SBram Moolenaar 326081e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 326181e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 326281e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 326381e17fbeSBram Moolenaar let lines =<< trim END 326481e17fbeSBram Moolenaar let s:counter = 1 326581e17fbeSBram Moolenaar def s:Func() 326681e17fbeSBram Moolenaar au! CursorHold 326781e17fbeSBram Moolenaar au CursorHold * s:counter += 1 326881e17fbeSBram Moolenaar enddef 326981e17fbeSBram Moolenaar call s:Func() 327081e17fbeSBram Moolenaar doau CursorHold 327181e17fbeSBram Moolenaar call assert_equal(2, s:counter) 327281e17fbeSBram Moolenaar au! CursorHold 327381e17fbeSBram Moolenaar END 327481e17fbeSBram Moolenaar CheckScriptSuccess(lines) 327581e17fbeSBram Moolenaarenddef 327681e17fbeSBram Moolenaar 32773896a105SBram Moolenaardef Test_cmdline_win() 32783896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32793896a105SBram Moolenaar # the command line window. 32803896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32813896a105SBram Moolenaar let export_lines =<< trim END 32823896a105SBram Moolenaar vim9script 32833896a105SBram Moolenaar export let That = 'yes' 32843896a105SBram Moolenaar END 32853896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32863896a105SBram Moolenaar let import_lines =<< trim END 32873896a105SBram Moolenaar vim9script 32883896a105SBram Moolenaar import That from './Xexport.vim' 32893896a105SBram Moolenaar END 32903896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32913896a105SBram Moolenaar let save_rtp = &rtp 32923896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32933896a105SBram Moolenaar syntax on 32943896a105SBram Moolenaar augroup CmdWin 32953896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32963896a105SBram Moolenaar augroup END 32973896a105SBram Moolenaar # this will open and also close the cmdline window 32983896a105SBram Moolenaar feedkeys('q:', 'xt') 32993896a105SBram Moolenaar assert_equal('yes', g:got_there) 33003896a105SBram Moolenaar 33013896a105SBram Moolenaar augroup CmdWin 33023896a105SBram Moolenaar au! 33033896a105SBram Moolenaar augroup END 33043896a105SBram Moolenaar &rtp = save_rtp 33053896a105SBram Moolenaar delete('rtp', 'rf') 33063896a105SBram Moolenaarenddef 33073896a105SBram Moolenaar 3308e3d4685fSBram Moolenaardef Test_invalid_sid() 3309e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 331025859dd7SBram Moolenaar 3311e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3312d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3313e3d4685fSBram Moolenaar endif 3314e3d4685fSBram Moolenaar delete('Xdidit') 3315e3d4685fSBram Moolenaarenddef 3316e3d4685fSBram Moolenaar 3317f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3318f0afd9e1SBram Moolenaar let lines =<< trim END 3319f0afd9e1SBram Moolenaar let var: any 3320f0afd9e1SBram Moolenaar assert_equal(0, var) 3321f0afd9e1SBram Moolenaar END 3322f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3323f0afd9e1SBram Moolenaarenddef 3324f0afd9e1SBram Moolenaar 3325585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3326585fea7bSBram Moolenaardef Test_substitute_cmd() 3327585fea7bSBram Moolenaar new 3328585fea7bSBram Moolenaar setline(1, 'something') 3329585fea7bSBram Moolenaar :substitute(some(other( 3330585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3331585fea7bSBram Moolenaar bwipe! 3332585fea7bSBram Moolenaar 3333f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3334585fea7bSBram Moolenaar let lines =<< trim END 3335585fea7bSBram Moolenaar vim9script 3336585fea7bSBram Moolenaar new 3337585fea7bSBram Moolenaar setline(1, 'something') 3338585fea7bSBram Moolenaar :substitute(some(other( 3339585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3340585fea7bSBram Moolenaar bwipe! 3341585fea7bSBram Moolenaar END 3342585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3343585fea7bSBram Moolenaar source Xvim9lines 3344585fea7bSBram Moolenaar 3345585fea7bSBram Moolenaar delete('Xvim9lines') 3346585fea7bSBram Moolenaarenddef 3347585fea7bSBram Moolenaar 33488a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3349