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 49*4ed124ccSBram Moolenaar assert_equal(false, bool3) 5029a86ffeSBram Moolenaar let bool4: bool = 1 51*4ed124ccSBram Moolenaar assert_equal(true, bool4) 52*4ed124ccSBram Moolenaar 53*4ed124ccSBram Moolenaar let bool5: bool = 'yes' && 'no' 54*4ed124ccSBram Moolenaar assert_equal(true, bool5) 55*4ed124ccSBram Moolenaar let bool6: bool = [] && 99 56*4ed124ccSBram Moolenaar assert_equal(false, bool6) 57*4ed124ccSBram Moolenaar let bool7: bool = [] || #{a: 1} && 99 58*4ed124ccSBram 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() 67*4ed124ccSBram Moolenaar assert_equal(true, flag) 68ba7c0d7bSBram Moolenaar flag = 0 69*4ed124ccSBram Moolenaar # assert_equal(false, flag) 70ba7c0d7bSBram Moolenaar flag = 1 71*4ed124ccSBram Moolenaar # assert_equal(true, flag) 72*4ed124ccSBram Moolenaar # flag = 99 || 123 73*4ed124ccSBram Moolenaar # assert_equal(true, flag) 74*4ed124ccSBram Moolenaar # flag = 'yes' && [] 75*4ed124ccSBram 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 322dd29f1b0SBram Moolenaar 323d2c61705SBram Moolenaar CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 324d2c61705SBram Moolenaar CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 32584370087SBram Moolenaar 32684370087SBram Moolenaar # type becomes list<any> 32784370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 32884370087SBram Moolenaarenddef 32984370087SBram Moolenaar 330b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 331b31be3f9SBram Moolenaar let lines =<< trim END 332b31be3f9SBram Moolenaar vim9script 333b31be3f9SBram Moolenaar let v1: number 334b31be3f9SBram Moolenaar let v2: number 335b31be3f9SBram Moolenaar let v3: number 336b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 337b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 338b31be3f9SBram Moolenaar END 339d2c61705SBram Moolenaar CheckScriptSuccess(lines) 340b31be3f9SBram Moolenaarenddef 341b31be3f9SBram Moolenaar 34284370087SBram Moolenaardef Test_assignment_dict() 34384370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 34484370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 34584370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 34684370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 34774fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 34884370087SBram Moolenaar 349f5be8cdbSBram Moolenaar # overwrite 350c785b9a7SBram Moolenaar dict3['key'] = 'another' 351c785b9a7SBram Moolenaar 35258626872SBram Moolenaar # empty key can be used 35358626872SBram Moolenaar let dd = {} 35458626872SBram Moolenaar dd[""] = 6 35558626872SBram Moolenaar assert_equal({'': 6}, dd) 35684370087SBram Moolenaar 35784370087SBram Moolenaar # type becomes dict<any> 35884370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 3598e4c8c85SBram Moolenaar 3608e4c8c85SBram Moolenaar # assignment to script-local dict 3618e4c8c85SBram Moolenaar let lines =<< trim END 3628e4c8c85SBram Moolenaar vim9script 3638e4c8c85SBram Moolenaar let test: dict<any> = {} 3648e4c8c85SBram Moolenaar def FillDict(): dict<any> 3658e4c8c85SBram Moolenaar test['a'] = 43 3668e4c8c85SBram Moolenaar return test 3678e4c8c85SBram Moolenaar enddef 3688e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3698e4c8c85SBram Moolenaar END 3708e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 3718e4c8c85SBram Moolenaar 3728e4c8c85SBram Moolenaar lines =<< trim END 3738e4c8c85SBram Moolenaar vim9script 3748e4c8c85SBram Moolenaar let test: dict<any> 3758e4c8c85SBram Moolenaar def FillDict(): dict<any> 3768e4c8c85SBram Moolenaar test['a'] = 43 3778e4c8c85SBram Moolenaar return test 3788e4c8c85SBram Moolenaar enddef 3798e4c8c85SBram Moolenaar FillDict() 3808e4c8c85SBram Moolenaar END 3818e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 3822caa1594SBram Moolenaar 3832caa1594SBram Moolenaar # assignment to global dict 3842caa1594SBram Moolenaar lines =<< trim END 3852caa1594SBram Moolenaar vim9script 3862caa1594SBram Moolenaar g:test = {} 3872caa1594SBram Moolenaar def FillDict(): dict<any> 3882caa1594SBram Moolenaar g:test['a'] = 43 3892caa1594SBram Moolenaar return g:test 3902caa1594SBram Moolenaar enddef 3912caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3922caa1594SBram Moolenaar END 3932caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3942caa1594SBram Moolenaar 3952caa1594SBram Moolenaar # assignment to buffer dict 3962caa1594SBram Moolenaar lines =<< trim END 3972caa1594SBram Moolenaar vim9script 3982caa1594SBram Moolenaar b:test = {} 3992caa1594SBram Moolenaar def FillDict(): dict<any> 4002caa1594SBram Moolenaar b:test['a'] = 43 4012caa1594SBram Moolenaar return b:test 4022caa1594SBram Moolenaar enddef 4032caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 4042caa1594SBram Moolenaar END 4052caa1594SBram Moolenaar call CheckScriptSuccess(lines) 40684370087SBram Moolenaarenddef 40784370087SBram Moolenaar 408d3aac291SBram Moolenaardef Test_assignment_local() 409f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 410f5be8cdbSBram Moolenaar # changed. 411d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 412d3aac291SBram Moolenaar let b:existing = 'yes' 413d3aac291SBram Moolenaar let w:existing = 'yes' 414d3aac291SBram Moolenaar let t:existing = 'yes' 415d3aac291SBram Moolenaar 416d3aac291SBram Moolenaar def Test_assignment_local_internal() 417d3aac291SBram Moolenaar b:newvar = 'new' 418d3aac291SBram Moolenaar assert_equal('new', b:newvar) 419d3aac291SBram Moolenaar assert_equal('yes', b:existing) 420d3aac291SBram Moolenaar b:existing = 'no' 421d3aac291SBram Moolenaar assert_equal('no', b:existing) 422396f3138SBram Moolenaar b:existing ..= 'NO' 423396f3138SBram Moolenaar assert_equal('noNO', b:existing) 424d3aac291SBram Moolenaar 425d3aac291SBram Moolenaar w:newvar = 'new' 426d3aac291SBram Moolenaar assert_equal('new', w:newvar) 427d3aac291SBram Moolenaar assert_equal('yes', w:existing) 428d3aac291SBram Moolenaar w:existing = 'no' 429d3aac291SBram Moolenaar assert_equal('no', w:existing) 430396f3138SBram Moolenaar w:existing ..= 'NO' 431396f3138SBram Moolenaar assert_equal('noNO', w:existing) 432d3aac291SBram Moolenaar 433d3aac291SBram Moolenaar t:newvar = 'new' 434d3aac291SBram Moolenaar assert_equal('new', t:newvar) 435d3aac291SBram Moolenaar assert_equal('yes', t:existing) 436d3aac291SBram Moolenaar t:existing = 'no' 437d3aac291SBram Moolenaar assert_equal('no', t:existing) 438396f3138SBram Moolenaar t:existing ..= 'NO' 439396f3138SBram Moolenaar assert_equal('noNO', t:existing) 440d3aac291SBram Moolenaar enddef 441d3aac291SBram Moolenaar call Test_assignment_local_internal() 442d3aac291SBram Moolenaar END 443d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 444d3aac291SBram Moolenaarenddef 445d3aac291SBram Moolenaar 4465deeb3f1SBram Moolenaardef Test_assignment_default() 447e69f6d04SBram Moolenaar 448cb711abfSBram Moolenaar # Test default values. 449e69f6d04SBram Moolenaar let thebool: bool 450e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 451e69f6d04SBram Moolenaar 452e69f6d04SBram Moolenaar let thenumber: number 453e69f6d04SBram Moolenaar assert_equal(0, thenumber) 454e69f6d04SBram Moolenaar 455e69f6d04SBram Moolenaar if has('float') 456e69f6d04SBram Moolenaar let thefloat: float 457e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 458e69f6d04SBram Moolenaar endif 459e69f6d04SBram Moolenaar 460e69f6d04SBram Moolenaar let thestring: string 461e69f6d04SBram Moolenaar assert_equal('', thestring) 462e69f6d04SBram Moolenaar 463e69f6d04SBram Moolenaar let theblob: blob 464e69f6d04SBram Moolenaar assert_equal(0z, theblob) 465e69f6d04SBram Moolenaar 4665deeb3f1SBram Moolenaar let Thefunc: func 4675deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 468e69f6d04SBram Moolenaar 469e69f6d04SBram Moolenaar let thelist: list<any> 470e69f6d04SBram Moolenaar assert_equal([], thelist) 471e69f6d04SBram Moolenaar 472e69f6d04SBram Moolenaar let thedict: dict<any> 473e69f6d04SBram Moolenaar assert_equal({}, thedict) 474e69f6d04SBram Moolenaar 4752c869deeSBram Moolenaar if has('channel') 476e69f6d04SBram Moolenaar let thejob: job 477e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 478e69f6d04SBram Moolenaar 479e69f6d04SBram Moolenaar let thechannel: channel 480e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 481c785b9a7SBram Moolenaar 482c785b9a7SBram Moolenaar if has('unix') && executable('cat') 483f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 484c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 485c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 486c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 487c785b9a7SBram Moolenaar endif 4882c869deeSBram Moolenaar endif 489585fea7bSBram Moolenaar 490585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 491585fea7bSBram Moolenaar assert_equal(5678, nr) 4928a7d6542SBram Moolenaarenddef 4938a7d6542SBram Moolenaar 49447a519a9SBram Moolenaardef Test_assignment_var_list() 49547a519a9SBram Moolenaar let v1: string 49647a519a9SBram Moolenaar let v2: string 4979af78769SBram Moolenaar let vrem: list<string> 4989af78769SBram Moolenaar [v1] = ['aaa'] 4999af78769SBram Moolenaar assert_equal('aaa', v1) 5009af78769SBram Moolenaar 50147a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 50247a519a9SBram Moolenaar assert_equal('one', v1) 50347a519a9SBram Moolenaar assert_equal('two', v2) 5049af78769SBram Moolenaar 5059af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 5069af78769SBram Moolenaar assert_equal('one', v1) 5079af78769SBram Moolenaar assert_equal('two', v2) 5089af78769SBram Moolenaar assert_equal([], vrem) 5099af78769SBram Moolenaar 5109af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 5119af78769SBram Moolenaar assert_equal('one', v1) 5129af78769SBram Moolenaar assert_equal('two', v2) 5139af78769SBram Moolenaar assert_equal(['three'], vrem) 5141c199f9cSBram Moolenaar 5151c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 5161c199f9cSBram Moolenaar assert_equal(3, &ts) 5171c199f9cSBram Moolenaar assert_equal(4, &sw) 5181c199f9cSBram Moolenaar set ts=8 sw=4 51947a519a9SBram Moolenaarenddef 52047a519a9SBram Moolenaar 521c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 522c7e44a7eSBram Moolenaar let lines =<< trim END 523c7e44a7eSBram Moolenaar vim9script 524c7e44a7eSBram Moolenaar def Func(): list<number> 525c7e44a7eSBram Moolenaar return [1, 2] 526c7e44a7eSBram Moolenaar enddef 527c7e44a7eSBram Moolenaar let var1: number 528c7e44a7eSBram Moolenaar let var2: number 529c7e44a7eSBram Moolenaar [var1, var2] = 530c7e44a7eSBram Moolenaar Func() 531c7e44a7eSBram Moolenaar assert_equal(1, var1) 532c7e44a7eSBram Moolenaar assert_equal(2, var2) 533c7e44a7eSBram Moolenaar let ll = 534c7e44a7eSBram Moolenaar Func() 535c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 53683144546SBram Moolenaar 53783144546SBram Moolenaar @/ = 'text' 53883144546SBram Moolenaar assert_equal('text', @/) 53983144546SBram Moolenaar @0 = 'zero' 54083144546SBram Moolenaar assert_equal('zero', @0) 54183144546SBram Moolenaar @1 = 'one' 54283144546SBram Moolenaar assert_equal('one', @1) 54383144546SBram Moolenaar @9 = 'nine' 54483144546SBram Moolenaar assert_equal('nine', @9) 54583144546SBram Moolenaar @- = 'minus' 54683144546SBram Moolenaar assert_equal('minus', @-) 54783144546SBram Moolenaar if has('clipboard_working') 54883144546SBram Moolenaar @* = 'star' 54983144546SBram Moolenaar assert_equal('star', @*) 55083144546SBram Moolenaar @+ = 'plus' 55183144546SBram Moolenaar assert_equal('plus', @+) 55283144546SBram Moolenaar endif 55395dd9f25SBram Moolenaar 55495dd9f25SBram Moolenaar let a: number = 123 55595dd9f25SBram Moolenaar assert_equal(123, a) 55695dd9f25SBram Moolenaar let s: string = 'yes' 55795dd9f25SBram Moolenaar assert_equal('yes', s) 55895dd9f25SBram Moolenaar let b: number = 42 55995dd9f25SBram Moolenaar assert_equal(42, b) 56095dd9f25SBram Moolenaar let w: number = 43 56195dd9f25SBram Moolenaar assert_equal(43, w) 56295dd9f25SBram Moolenaar let t: number = 44 56395dd9f25SBram Moolenaar assert_equal(44, t) 564c7e44a7eSBram Moolenaar END 565c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 566c7e44a7eSBram Moolenaarenddef 567c7e44a7eSBram Moolenaar 568cab27678SBram Moolenaardef Mess(): string 569cab27678SBram Moolenaar v:foldstart = 123 570cab27678SBram Moolenaar return 'xxx' 571cab27678SBram Moolenaarenddef 572cab27678SBram Moolenaar 573d72c1bf0SBram Moolenaardef Test_assignment_failure() 574d2c61705SBram Moolenaar CheckDefFailure(['let var=234'], 'E1004:') 575d2c61705SBram Moolenaar CheckDefFailure(['let var =234'], 'E1004:') 576d2c61705SBram Moolenaar CheckDefFailure(['let var= 234'], 'E1004:') 5778a7d6542SBram Moolenaar 578d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 579d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 580d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 581d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 582d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 583d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 584d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 585d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 58663be3d4bSBram Moolenaar 587d2c61705SBram Moolenaar CheckDefFailure(['let true = 1'], 'E1034:') 588d2c61705SBram Moolenaar CheckDefFailure(['let false = 1'], 'E1034:') 5898a7d6542SBram Moolenaar 590d2c61705SBram Moolenaar CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 591d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5929af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 593d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5949af78769SBram Moolenaar '[a] = []'], 'E1093:') 595d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5969af78769SBram Moolenaar 'let y: number', 5979af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 598d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5999af78769SBram Moolenaar 'let y: number', 6009af78769SBram Moolenaar 'let z: list<number>', 6019af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 6029be61bbbSBram Moolenaar 603d2c61705SBram Moolenaar CheckDefFailure(['let somevar'], "E1022:") 604d2c61705SBram Moolenaar CheckDefFailure(['let &tabstop = 4'], 'E1052:') 605d2c61705SBram Moolenaar CheckDefFailure(['&g:option = 5'], 'E113:') 606d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 6079be61bbbSBram Moolenaar 608d2c61705SBram Moolenaar CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 609d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 6109be61bbbSBram Moolenaar 611434d72cbSBram Moolenaar if has('dnd') 612d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E1066:') 613434d72cbSBram Moolenaar else 614d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E354:') 615d2c61705SBram Moolenaar CheckDefFailure(['@~ = 5'], 'E354:') 616434d72cbSBram Moolenaar endif 617d2c61705SBram Moolenaar CheckDefFailure(['let @a = 5'], 'E1066:') 618d2c61705SBram Moolenaar CheckDefFailure(['let @/ = "x"'], 'E1066:') 619d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 6209be61bbbSBram Moolenaar 621d2c61705SBram Moolenaar CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 622d2c61705SBram Moolenaar CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 623d2c61705SBram Moolenaar CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 624d2c61705SBram Moolenaar CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 6259be61bbbSBram Moolenaar 626d2c61705SBram Moolenaar CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 627d2c61705SBram Moolenaar CheckDefFailure(['let xnr += 4'], 'E1020:', 1) 628d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:') 629d2c61705SBram Moolenaar CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1) 630d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:') 6319be61bbbSBram Moolenaar 632d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 63333fa29cfSBram Moolenaar 634d2c61705SBram Moolenaar CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 635d2c61705SBram Moolenaar CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 6368a7d6542SBram Moolenaar 637d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 638d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 6398a7d6542SBram Moolenaar 640d2c61705SBram Moolenaar CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 641d2c61705SBram Moolenaar CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 64242a480bfSBram Moolenaar 643d2c61705SBram Moolenaar CheckDefFailure(['let var: dict <number>'], 'E1068:') 644d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 645cab27678SBram Moolenaar 646d2c61705SBram Moolenaar assert_fails('s/^/\=Mess()/n', 'E794:') 647d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 64843e969d3SBram Moolenaar 649d2c61705SBram Moolenaar CheckDefFailure(['w:foo: number = 10'], 65043e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 651d2c61705SBram Moolenaar CheckDefFailure(['t:foo: bool = true'], 65243e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 653d2c61705SBram Moolenaar CheckDefFailure(['b:foo: string = "x"'], 65443e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 655d2c61705SBram Moolenaar CheckDefFailure(['g:foo: number = 123'], 65643e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 657d72c1bf0SBram Moolenaarenddef 658d72c1bf0SBram Moolenaar 659d72c1bf0SBram Moolenaardef Test_unlet() 660d72c1bf0SBram Moolenaar g:somevar = 'yes' 661d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 662d72c1bf0SBram Moolenaar unlet g:somevar 663d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 664d72c1bf0SBram Moolenaar unlet! g:somevar 665d72c1bf0SBram Moolenaar 6668436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 6678436773fSBram Moolenaar s:somevar = 'legacy' 6688436773fSBram Moolenaar assert_true(exists('s:somevar')) 6698436773fSBram Moolenaar unlet s:somevar 6708436773fSBram Moolenaar assert_false(exists('s:somevar')) 6718436773fSBram Moolenaar unlet! s:somevar 6728436773fSBram Moolenaar 673d2c61705SBram Moolenaar CheckScriptFailure([ 674d72c1bf0SBram Moolenaar 'vim9script', 675d72c1bf0SBram Moolenaar 'let svar = 123', 676d72c1bf0SBram Moolenaar 'unlet svar', 677d72c1bf0SBram Moolenaar ], 'E1081:') 678d2c61705SBram Moolenaar CheckScriptFailure([ 679d72c1bf0SBram Moolenaar 'vim9script', 680d72c1bf0SBram Moolenaar 'let svar = 123', 681d72c1bf0SBram Moolenaar 'unlet s:svar', 682d72c1bf0SBram Moolenaar ], 'E1081:') 683d2c61705SBram Moolenaar CheckScriptFailure([ 684d72c1bf0SBram Moolenaar 'vim9script', 685d72c1bf0SBram Moolenaar 'let svar = 123', 686d72c1bf0SBram Moolenaar 'def Func()', 687d72c1bf0SBram Moolenaar ' unlet svar', 688d72c1bf0SBram Moolenaar 'enddef', 689822ba247SBram Moolenaar 'defcompile', 690d72c1bf0SBram Moolenaar ], 'E1081:') 691d2c61705SBram Moolenaar CheckScriptFailure([ 692d72c1bf0SBram Moolenaar 'vim9script', 693d72c1bf0SBram Moolenaar 'let svar = 123', 694d72c1bf0SBram Moolenaar 'def Func()', 695d72c1bf0SBram Moolenaar ' unlet s:svar', 696d72c1bf0SBram Moolenaar 'enddef', 697822ba247SBram Moolenaar 'defcompile', 698d72c1bf0SBram Moolenaar ], 'E1081:') 6997bdaea6eSBram Moolenaar 7007bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 7017bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 7027bdaea6eSBram Moolenaar unlet $ENVVAR 7037bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 704d72c1bf0SBram Moolenaarenddef 705599c89c8SBram Moolenaar 7064c17ad94SBram Moolenaardef Test_delfunction() 707f5be8cdbSBram Moolenaar # Check function is defined in script namespace 7084c17ad94SBram Moolenaar CheckScriptSuccess([ 7094c17ad94SBram Moolenaar 'vim9script', 7104c17ad94SBram Moolenaar 'func CheckMe()', 7114c17ad94SBram Moolenaar ' return 123', 7124c17ad94SBram Moolenaar 'endfunc', 7134c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 7144c17ad94SBram Moolenaar ]) 7154c17ad94SBram Moolenaar 716f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 7174c17ad94SBram Moolenaar CheckScriptFailure([ 7184c17ad94SBram Moolenaar 'vim9script', 7194c17ad94SBram Moolenaar 'func DeleteMe1()', 7204c17ad94SBram Moolenaar 'endfunc', 7214c17ad94SBram Moolenaar 'delfunction DeleteMe1', 7224c17ad94SBram Moolenaar ], 'E1084:') 7234c17ad94SBram Moolenaar CheckScriptFailure([ 7244c17ad94SBram Moolenaar 'vim9script', 7254c17ad94SBram Moolenaar 'func DeleteMe2()', 7264c17ad94SBram Moolenaar 'endfunc', 7274c17ad94SBram Moolenaar 'def DoThat()', 7284c17ad94SBram Moolenaar ' delfunction DeleteMe2', 7294c17ad94SBram Moolenaar 'enddef', 7304c17ad94SBram Moolenaar 'DoThat()', 7314c17ad94SBram Moolenaar ], 'E1084:') 7324c17ad94SBram Moolenaar CheckScriptFailure([ 7334c17ad94SBram Moolenaar 'vim9script', 7344c17ad94SBram Moolenaar 'def DeleteMe3()', 7354c17ad94SBram Moolenaar 'enddef', 7364c17ad94SBram Moolenaar 'delfunction DeleteMe3', 7374c17ad94SBram Moolenaar ], 'E1084:') 7384c17ad94SBram Moolenaar CheckScriptFailure([ 7394c17ad94SBram Moolenaar 'vim9script', 7404c17ad94SBram Moolenaar 'def DeleteMe4()', 7414c17ad94SBram Moolenaar 'enddef', 7424c17ad94SBram Moolenaar 'def DoThat()', 7434c17ad94SBram Moolenaar ' delfunction DeleteMe4', 7444c17ad94SBram Moolenaar 'enddef', 7454c17ad94SBram Moolenaar 'DoThat()', 7464c17ad94SBram Moolenaar ], 'E1084:') 747925e9fd6SBram Moolenaar 748925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 749925e9fd6SBram Moolenaar let lines =<< trim END 750925e9fd6SBram Moolenaar vim9script 751925e9fd6SBram Moolenaar def g:Global(): string 752925e9fd6SBram Moolenaar return "yes" 753925e9fd6SBram Moolenaar enddef 754925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 755925e9fd6SBram Moolenaar def! g:Global(): string 756925e9fd6SBram Moolenaar return "no" 757925e9fd6SBram Moolenaar enddef 758925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 759925e9fd6SBram Moolenaar delfunc g:Global 760925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 761925e9fd6SBram Moolenaar END 762925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 763925e9fd6SBram Moolenaar 764925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 765925e9fd6SBram Moolenaar lines =<< trim END 766925e9fd6SBram Moolenaar vim9script 767925e9fd6SBram Moolenaar func g:Global() 768925e9fd6SBram Moolenaar return "yes" 769925e9fd6SBram Moolenaar endfunc 770925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 771925e9fd6SBram Moolenaar def! g:Global(): string 772925e9fd6SBram Moolenaar return "no" 773925e9fd6SBram Moolenaar enddef 774925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 775925e9fd6SBram Moolenaar delfunc g:Global 776925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 777925e9fd6SBram Moolenaar END 778925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 779925e9fd6SBram Moolenaar 780925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 781925e9fd6SBram Moolenaar lines =<< trim END 782925e9fd6SBram Moolenaar vim9script 783925e9fd6SBram Moolenaar def g:Global(): string 784925e9fd6SBram Moolenaar return "yes" 785925e9fd6SBram Moolenaar enddef 786925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 787925e9fd6SBram Moolenaar func! g:Global() 788925e9fd6SBram Moolenaar return "no" 789925e9fd6SBram Moolenaar endfunc 790925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 791925e9fd6SBram Moolenaar delfunc g:Global 792925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 793925e9fd6SBram Moolenaar END 794925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 7954c17ad94SBram Moolenaarenddef 7964c17ad94SBram Moolenaar 797599c89c8SBram Moolenaarfunc Test_wrong_type() 798599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 799599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 800599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 801599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 802599c89c8SBram Moolenaar 803599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 804599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 80542a480bfSBram Moolenaar 80642a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 80742a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 80842a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 80942a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 81042a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 81142a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 81242a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 81342a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 81442a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 81542a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 81642a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 817a0a9f43aSBram Moolenaar 818a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 819a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 8208a7d6542SBram Moolenaarendfunc 8218a7d6542SBram Moolenaar 8228a7d6542SBram Moolenaarfunc Test_const() 8238a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 8248a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 8258a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 8269be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 8278a7d6542SBram Moolenaarendfunc 8288a7d6542SBram Moolenaar 829df069eecSBram Moolenaardef Test_range_no_colon() 830d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 831d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 832d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 833d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 834df069eecSBram Moolenaarenddef 835df069eecSBram Moolenaar 836df069eecSBram Moolenaar 8378a7d6542SBram Moolenaardef Test_block() 8388a7d6542SBram Moolenaar let outer = 1 8398a7d6542SBram Moolenaar { 8408a7d6542SBram Moolenaar let inner = 2 8418a7d6542SBram Moolenaar assert_equal(1, outer) 8428a7d6542SBram Moolenaar assert_equal(2, inner) 8438a7d6542SBram Moolenaar } 8448a7d6542SBram Moolenaar assert_equal(1, outer) 8458a7d6542SBram Moolenaarenddef 8468a7d6542SBram Moolenaar 8478a7d6542SBram Moolenaarfunc Test_block_failure() 8488a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 849585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 850585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 8518a7d6542SBram Moolenaarendfunc 8528a7d6542SBram Moolenaar 853d032f34aSBram Moolenaarfunc g:NoSuchFunc() 854d032f34aSBram Moolenaar echo 'none' 855d032f34aSBram Moolenaarendfunc 856d032f34aSBram Moolenaar 8578a7d6542SBram Moolenaardef Test_try_catch() 8588a7d6542SBram Moolenaar let l = [] 8597a092245SBram Moolenaar try # comment 8608a7d6542SBram Moolenaar add(l, '1') 8618a7d6542SBram Moolenaar throw 'wrong' 8628a7d6542SBram Moolenaar add(l, '2') 8637a092245SBram Moolenaar catch # comment 8648a7d6542SBram Moolenaar add(l, v:exception) 8657a092245SBram Moolenaar finally # comment 8668a7d6542SBram Moolenaar add(l, '3') 8677a092245SBram Moolenaar endtry # comment 8688a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 86968d130c6SBram Moolenaar 870e859312eSBram Moolenaar l = [] 871e859312eSBram Moolenaar try 872e859312eSBram Moolenaar try 873e859312eSBram Moolenaar add(l, '1') 874e859312eSBram Moolenaar throw 'wrong' 875e859312eSBram Moolenaar add(l, '2') 876e859312eSBram Moolenaar catch /right/ 877e859312eSBram Moolenaar add(l, v:exception) 878e859312eSBram Moolenaar endtry 879e859312eSBram Moolenaar catch /wrong/ 880e859312eSBram Moolenaar add(l, 'caught') 881e859312eSBram Moolenaar finally 882e859312eSBram Moolenaar add(l, 'finally') 883e859312eSBram Moolenaar endtry 884e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 885e859312eSBram Moolenaar 88668d130c6SBram Moolenaar let n: number 88768d130c6SBram Moolenaar try 88868d130c6SBram Moolenaar n = l[3] 88968d130c6SBram Moolenaar catch /E684:/ 89068d130c6SBram Moolenaar n = 99 89168d130c6SBram Moolenaar endtry 89268d130c6SBram Moolenaar assert_equal(99, n) 89368d130c6SBram Moolenaar 89468d130c6SBram Moolenaar try 895cc673e74SBram Moolenaar # string slice returns a string, not a number 89668d130c6SBram Moolenaar n = g:astring[3] 89756acb094SBram Moolenaar catch /E1029:/ 89868d130c6SBram Moolenaar n = 77 89968d130c6SBram Moolenaar endtry 90068d130c6SBram Moolenaar assert_equal(77, n) 90168d130c6SBram Moolenaar 90268d130c6SBram Moolenaar try 90368d130c6SBram Moolenaar n = l[g:astring] 90456acb094SBram Moolenaar catch /E1029:/ 90556acb094SBram Moolenaar n = 88 90668d130c6SBram Moolenaar endtry 90756acb094SBram Moolenaar assert_equal(88, n) 90868d130c6SBram Moolenaar 90968d130c6SBram Moolenaar try 91068d130c6SBram Moolenaar n = s:does_not_exist 91168d130c6SBram Moolenaar catch /E121:/ 912f0b9f43cSBram Moolenaar n = 111 913f0b9f43cSBram Moolenaar endtry 914f0b9f43cSBram Moolenaar assert_equal(111, n) 915f0b9f43cSBram Moolenaar 916f0b9f43cSBram Moolenaar try 917f0b9f43cSBram Moolenaar n = g:does_not_exist 918f0b9f43cSBram Moolenaar catch /E121:/ 91968d130c6SBram Moolenaar n = 121 92068d130c6SBram Moolenaar endtry 92168d130c6SBram Moolenaar assert_equal(121, n) 92268d130c6SBram Moolenaar 92368d130c6SBram Moolenaar let d = #{one: 1} 92468d130c6SBram Moolenaar try 92568d130c6SBram Moolenaar n = d[g:astring] 92668d130c6SBram Moolenaar catch /E716:/ 92768d130c6SBram Moolenaar n = 222 92868d130c6SBram Moolenaar endtry 92968d130c6SBram Moolenaar assert_equal(222, n) 930f0b9f43cSBram Moolenaar 931f0b9f43cSBram Moolenaar try 932f0b9f43cSBram Moolenaar n = -g:astring 933f0b9f43cSBram Moolenaar catch /E39:/ 934f0b9f43cSBram Moolenaar n = 233 935f0b9f43cSBram Moolenaar endtry 936f0b9f43cSBram Moolenaar assert_equal(233, n) 937f0b9f43cSBram Moolenaar 938f0b9f43cSBram Moolenaar try 939f0b9f43cSBram Moolenaar n = +g:astring 940f0b9f43cSBram Moolenaar catch /E1030:/ 941f0b9f43cSBram Moolenaar n = 244 942f0b9f43cSBram Moolenaar endtry 943f0b9f43cSBram Moolenaar assert_equal(244, n) 944f0b9f43cSBram Moolenaar 945f0b9f43cSBram Moolenaar try 946f0b9f43cSBram Moolenaar n = +g:alist 947f0b9f43cSBram Moolenaar catch /E745:/ 948f0b9f43cSBram Moolenaar n = 255 949f0b9f43cSBram Moolenaar endtry 950f0b9f43cSBram Moolenaar assert_equal(255, n) 951f0b9f43cSBram Moolenaar 952f0b9f43cSBram Moolenaar let nd: dict<any> 953f0b9f43cSBram Moolenaar try 954f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 955f0b9f43cSBram Moolenaar catch /E1029:/ 956f0b9f43cSBram Moolenaar n = 266 957f0b9f43cSBram Moolenaar endtry 958f0b9f43cSBram Moolenaar assert_equal(266, n) 959f0b9f43cSBram Moolenaar 960f0b9f43cSBram Moolenaar try 961f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 962f0b9f43cSBram Moolenaar catch /E1093:/ 963f0b9f43cSBram Moolenaar n = 277 964f0b9f43cSBram Moolenaar endtry 965f0b9f43cSBram Moolenaar assert_equal(277, n) 966f0b9f43cSBram Moolenaar 967e859312eSBram Moolenaar try 968e859312eSBram Moolenaar &ts = g:astring 969e859312eSBram Moolenaar catch /E1029:/ 970e859312eSBram Moolenaar n = 288 971e859312eSBram Moolenaar endtry 972e859312eSBram Moolenaar assert_equal(288, n) 973e859312eSBram Moolenaar 974e859312eSBram Moolenaar try 975e859312eSBram Moolenaar &backspace = 'asdf' 976e859312eSBram Moolenaar catch /E474:/ 977e859312eSBram Moolenaar n = 299 978e859312eSBram Moolenaar endtry 979e859312eSBram Moolenaar assert_equal(299, n) 980e859312eSBram Moolenaar 981e859312eSBram Moolenaar l = [1] 982e859312eSBram Moolenaar try 983e859312eSBram Moolenaar l[3] = 3 984e859312eSBram Moolenaar catch /E684:/ 985e859312eSBram Moolenaar n = 300 986e859312eSBram Moolenaar endtry 987e859312eSBram Moolenaar assert_equal(300, n) 988e859312eSBram Moolenaar 989e859312eSBram Moolenaar try 990e859312eSBram Moolenaar unlet g:does_not_exist 991e859312eSBram Moolenaar catch /E108:/ 992e859312eSBram Moolenaar n = 322 993e859312eSBram Moolenaar endtry 994e859312eSBram Moolenaar assert_equal(322, n) 995e859312eSBram Moolenaar 996e859312eSBram Moolenaar try 997e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 998e859312eSBram Moolenaar catch /E721:/ 999e859312eSBram Moolenaar n = 333 1000e859312eSBram Moolenaar endtry 1001e859312eSBram Moolenaar assert_equal(333, n) 1002e859312eSBram Moolenaar 1003e859312eSBram Moolenaar try 1004e859312eSBram Moolenaar l = DeletedFunc() 1005e859312eSBram Moolenaar catch /E933:/ 1006e859312eSBram Moolenaar n = 344 1007e859312eSBram Moolenaar endtry 1008e859312eSBram Moolenaar assert_equal(344, n) 1009d032f34aSBram Moolenaar 1010d032f34aSBram Moolenaar try 1011d032f34aSBram Moolenaar echo len(v:true) 1012d032f34aSBram Moolenaar catch /E701:/ 1013d032f34aSBram Moolenaar n = 355 1014d032f34aSBram Moolenaar endtry 1015d032f34aSBram Moolenaar assert_equal(355, n) 1016d032f34aSBram Moolenaar 1017d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 1018d032f34aSBram Moolenaar delfunc g:NoSuchFunc 1019d032f34aSBram Moolenaar try 1020d032f34aSBram Moolenaar echo P() 1021d032f34aSBram Moolenaar catch /E117:/ 1022d032f34aSBram Moolenaar n = 366 1023d032f34aSBram Moolenaar endtry 1024d032f34aSBram Moolenaar assert_equal(366, n) 1025d032f34aSBram Moolenaar 1026d032f34aSBram Moolenaar try 1027d032f34aSBram Moolenaar echo g:NoSuchFunc() 1028d032f34aSBram Moolenaar catch /E117:/ 1029d032f34aSBram Moolenaar n = 377 1030d032f34aSBram Moolenaar endtry 1031d032f34aSBram Moolenaar assert_equal(377, n) 1032d032f34aSBram Moolenaar 1033d032f34aSBram Moolenaar try 1034d032f34aSBram Moolenaar echo g:alist + 4 1035d032f34aSBram Moolenaar catch /E745:/ 1036d032f34aSBram Moolenaar n = 388 1037d032f34aSBram Moolenaar endtry 1038d032f34aSBram Moolenaar assert_equal(388, n) 1039d032f34aSBram Moolenaar 1040d032f34aSBram Moolenaar try 1041d032f34aSBram Moolenaar echo 4 + g:alist 1042d032f34aSBram Moolenaar catch /E745:/ 1043d032f34aSBram Moolenaar n = 399 1044d032f34aSBram Moolenaar endtry 1045d032f34aSBram Moolenaar assert_equal(399, n) 1046d032f34aSBram Moolenaar 1047d032f34aSBram Moolenaar try 1048d032f34aSBram Moolenaar echo g:alist.member 1049d032f34aSBram Moolenaar catch /E715:/ 1050d032f34aSBram Moolenaar n = 400 1051d032f34aSBram Moolenaar endtry 1052d032f34aSBram Moolenaar assert_equal(400, n) 1053d032f34aSBram Moolenaar 1054d032f34aSBram Moolenaar try 1055d032f34aSBram Moolenaar echo d.member 1056d032f34aSBram Moolenaar catch /E716:/ 1057d032f34aSBram Moolenaar n = 411 1058d032f34aSBram Moolenaar endtry 1059d032f34aSBram Moolenaar assert_equal(411, n) 10608a7d6542SBram Moolenaarenddef 10618a7d6542SBram Moolenaar 1062e859312eSBram Moolenaardef DeletedFunc(): list<any> 1063e859312eSBram Moolenaar return ['delete me'] 1064e859312eSBram Moolenaarenddef 1065e859312eSBram Moolenaardefcompile 1066e859312eSBram Moolenaardelfunc DeletedFunc 1067e859312eSBram Moolenaar 1068257cc5eeSBram Moolenaardef ThrowFromDef() 1069a72cfb80SBram Moolenaar throw "getout" # comment 1070257cc5eeSBram Moolenaarenddef 1071257cc5eeSBram Moolenaar 1072257cc5eeSBram Moolenaarfunc CatchInFunc() 1073257cc5eeSBram Moolenaar try 1074257cc5eeSBram Moolenaar call ThrowFromDef() 1075257cc5eeSBram Moolenaar catch 1076257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1077257cc5eeSBram Moolenaar endtry 1078257cc5eeSBram Moolenaarendfunc 1079257cc5eeSBram Moolenaar 1080257cc5eeSBram Moolenaardef CatchInDef() 1081257cc5eeSBram Moolenaar try 1082257cc5eeSBram Moolenaar ThrowFromDef() 1083257cc5eeSBram Moolenaar catch 1084257cc5eeSBram Moolenaar g:thrown_def = v:exception 1085257cc5eeSBram Moolenaar endtry 1086257cc5eeSBram Moolenaarenddef 1087257cc5eeSBram Moolenaar 1088f575adffSBram Moolenaardef ReturnFinally(): string 1089f575adffSBram Moolenaar try 1090f575adffSBram Moolenaar return 'intry' 1091f575adffSBram Moolenaar finally 1092f575adffSBram Moolenaar g:in_finally = 'finally' 1093f575adffSBram Moolenaar endtry 1094f575adffSBram Moolenaar return 'end' 1095f575adffSBram Moolenaarenddef 1096f575adffSBram Moolenaar 1097257cc5eeSBram Moolenaardef Test_try_catch_nested() 1098257cc5eeSBram Moolenaar CatchInFunc() 1099257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1100257cc5eeSBram Moolenaar 1101257cc5eeSBram Moolenaar CatchInDef() 1102257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1103f575adffSBram Moolenaar 1104f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1105f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1106f575adffSBram Moolenaarenddef 1107f575adffSBram Moolenaar 1108f575adffSBram Moolenaardef Test_try_catch_match() 1109f575adffSBram Moolenaar let seq = 'a' 1110f575adffSBram Moolenaar try 1111f575adffSBram Moolenaar throw 'something' 1112f575adffSBram Moolenaar catch /nothing/ 1113f575adffSBram Moolenaar seq ..= 'x' 1114f575adffSBram Moolenaar catch /some/ 1115f575adffSBram Moolenaar seq ..= 'b' 1116f575adffSBram Moolenaar catch /asdf/ 1117f575adffSBram Moolenaar seq ..= 'x' 1118e8c4abbbSBram Moolenaar catch ?a\?sdf? 1119e8c4abbbSBram Moolenaar seq ..= 'y' 1120f575adffSBram Moolenaar finally 1121f575adffSBram Moolenaar seq ..= 'c' 1122f575adffSBram Moolenaar endtry 1123f575adffSBram Moolenaar assert_equal('abc', seq) 1124257cc5eeSBram Moolenaarenddef 1125257cc5eeSBram Moolenaar 1126e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1127d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1128d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1129d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1130d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1131d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1132d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1133d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1134d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1135d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1136d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1137585fea7bSBram Moolenaar 1138d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1139d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1140e8c4abbbSBram Moolenaarenddef 1141e8c4abbbSBram Moolenaar 1142006ad48bSBram Moolenaardef Test_throw_vimscript() 1143f5be8cdbSBram Moolenaar # only checks line continuation 1144006ad48bSBram Moolenaar let lines =<< trim END 1145006ad48bSBram Moolenaar vim9script 1146006ad48bSBram Moolenaar try 1147006ad48bSBram Moolenaar throw 'one' 1148006ad48bSBram Moolenaar .. 'two' 1149006ad48bSBram Moolenaar catch 1150006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1151006ad48bSBram Moolenaar endtry 1152006ad48bSBram Moolenaar END 1153006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1154006ad48bSBram Moolenaarenddef 1155006ad48bSBram Moolenaar 1156ed677f55SBram Moolenaardef Test_error_in_nested_function() 1157ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1158ed677f55SBram Moolenaar let lines =<< trim END 1159ed677f55SBram Moolenaar vim9script 1160ed677f55SBram Moolenaar def Func() 1161ed677f55SBram Moolenaar Error() 1162ed677f55SBram Moolenaar g:test_var = 1 1163ed677f55SBram Moolenaar enddef 1164ed677f55SBram Moolenaar func Error() abort 1165ed677f55SBram Moolenaar eval [][0] 1166ed677f55SBram Moolenaar endfunc 1167ed677f55SBram Moolenaar Func() 1168ed677f55SBram Moolenaar END 1169ed677f55SBram Moolenaar g:test_var = 0 1170ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1171ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1172ed677f55SBram Moolenaarenddef 1173ed677f55SBram Moolenaar 117437c83711SBram Moolenaardef Test_cexpr_vimscript() 1175f5be8cdbSBram Moolenaar # only checks line continuation 117637c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 117737c83711SBram Moolenaar let lines =<< trim END 117837c83711SBram Moolenaar vim9script 117937c83711SBram Moolenaar cexpr 'File' 118037c83711SBram Moolenaar .. ' someFile' .. 118137c83711SBram Moolenaar ' line 19' 118237c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 118337c83711SBram Moolenaar END 118437c83711SBram Moolenaar CheckScriptSuccess(lines) 118537c83711SBram Moolenaar set errorformat& 118637c83711SBram Moolenaarenddef 118737c83711SBram Moolenaar 1188c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1189c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1190c9edd6b5SBram Moolenaar let lines =<< trim END 1191c9edd6b5SBram Moolenaar vim9script 1192c9edd6b5SBram Moolenaar func g:Status() 1193c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1194c9edd6b5SBram Moolenaar endfunc 1195c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1196c9edd6b5SBram Moolenaar redrawstatus 1197c9edd6b5SBram Moolenaar set laststatus statusline= 1198c9edd6b5SBram Moolenaar END 1199c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1200c9edd6b5SBram Moolenaarenddef 1201c9edd6b5SBram Moolenaar 1202b209750bSBram Moolenaardef Test_list_vimscript() 1203b209750bSBram Moolenaar # checks line continuation and comments 1204b209750bSBram Moolenaar let lines =<< trim END 1205b209750bSBram Moolenaar vim9script 1206b209750bSBram Moolenaar let mylist = [ 1207b209750bSBram Moolenaar 'one', 1208b209750bSBram Moolenaar # comment 1209b209750bSBram Moolenaar 'two', # empty line follows 1210b209750bSBram Moolenaar 1211b209750bSBram Moolenaar 'three', 1212b209750bSBram Moolenaar ] 1213b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1214b209750bSBram Moolenaar END 1215b209750bSBram Moolenaar CheckScriptSuccess(lines) 121666250c93SBram Moolenaar 121766250c93SBram Moolenaar # check all lines from heredoc are kept 121866250c93SBram Moolenaar lines =<< trim END 121966250c93SBram Moolenaar # comment 1 122066250c93SBram Moolenaar two 122166250c93SBram Moolenaar # comment 3 122266250c93SBram Moolenaar 122366250c93SBram Moolenaar five 122466250c93SBram Moolenaar # comment 6 122566250c93SBram Moolenaar END 122666250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1227b209750bSBram Moolenaarenddef 1228b209750bSBram Moolenaar 12292a1381c3SBram Moolenaarif has('channel') 123040ee466cSBram Moolenaar let someJob = test_null_job() 123140ee466cSBram Moolenaar 123240ee466cSBram Moolenaar def FuncWithError() 123340ee466cSBram Moolenaar echomsg g:someJob 123440ee466cSBram Moolenaar enddef 123540ee466cSBram Moolenaar 123640ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 123740ee466cSBram Moolenaar try 123840ee466cSBram Moolenaar call FuncWithError() 123940ee466cSBram Moolenaar catch 124040ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 124140ee466cSBram Moolenaar endtry 124240ee466cSBram Moolenaar endfunc 12432a1381c3SBram Moolenaarendif 124440ee466cSBram Moolenaar 12458a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 12468a7d6542SBram Moolenaar vim9script 12478a7d6542SBram Moolenaar let name: string = 'bob' 12488a7d6542SBram Moolenaar def Concat(arg: string): string 12498a7d6542SBram Moolenaar return name .. arg 12508a7d6542SBram Moolenaar enddef 1251227a69deSBram Moolenaar g:result = Concat('bie') 1252227a69deSBram Moolenaar g:localname = name 12538a7d6542SBram Moolenaar 12548a7d6542SBram Moolenaar export const CONST = 1234 12558a7d6542SBram Moolenaar export let exported = 9876 12566e587dcbSBram Moolenaar export let exp_name = 'John' 12578a7d6542SBram Moolenaar export def Exported(): string 12588a7d6542SBram Moolenaar return 'Exported' 12598a7d6542SBram Moolenaar enddef 12608a7d6542SBram MoolenaarEND 12618a7d6542SBram Moolenaar 1262b3ca9824SBram Moolenaardef Undo_export_script_lines() 1263b3ca9824SBram Moolenaar unlet g:result 1264b3ca9824SBram Moolenaar unlet g:localname 1265b3ca9824SBram Moolenaarenddef 1266b3ca9824SBram Moolenaar 12675269bd2aSBram Moolenaardef Test_vim9_import_export() 12688a7d6542SBram Moolenaar let import_script_lines =<< trim END 12698a7d6542SBram Moolenaar vim9script 12708a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 12718a7d6542SBram Moolenaar g:imported = exported 12726e587dcbSBram Moolenaar exported += 3 12736e587dcbSBram Moolenaar g:imported_added = exported 12748a7d6542SBram Moolenaar g:imported_func = Exported() 12756e587dcbSBram Moolenaar 127640f4f7a4SBram Moolenaar def GetExported(): string 127740f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 127840f4f7a4SBram Moolenaar return local_dict.ref() 127940f4f7a4SBram Moolenaar enddef 128040f4f7a4SBram Moolenaar g:funcref_result = GetExported() 128140f4f7a4SBram Moolenaar 12826e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 12836e587dcbSBram Moolenaar g:imported_name = exp_name 12846e587dcbSBram Moolenaar exp_name ..= ' Doe' 12856e587dcbSBram Moolenaar g:imported_name_appended = exp_name 12865381c7a1SBram Moolenaar g:imported_later = exported 12878a7d6542SBram Moolenaar END 12888a7d6542SBram Moolenaar 12898a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 12908a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 12918a7d6542SBram Moolenaar 12928a7d6542SBram Moolenaar source Ximport.vim 12938a7d6542SBram Moolenaar 12948a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 12958a7d6542SBram Moolenaar assert_equal('bob', g:localname) 12968a7d6542SBram Moolenaar assert_equal(9876, g:imported) 12976e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 12985381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 12998a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 130040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 13016e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 13026e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 13038a7d6542SBram Moolenaar assert_false(exists('g:name')) 13048a7d6542SBram Moolenaar 1305b3ca9824SBram Moolenaar Undo_export_script_lines() 13068a7d6542SBram Moolenaar unlet g:imported 13076e587dcbSBram Moolenaar unlet g:imported_added 13085381c7a1SBram Moolenaar unlet g:imported_later 13098a7d6542SBram Moolenaar unlet g:imported_func 13106e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 13118a7d6542SBram Moolenaar delete('Ximport.vim') 1312f2d5c240SBram Moolenaar 13131c991144SBram Moolenaar # similar, with line breaks 13141c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 13151c991144SBram Moolenaar vim9script 13161c991144SBram Moolenaar import { 13171c991144SBram Moolenaar exported, 13181c991144SBram Moolenaar Exported, 13191c991144SBram Moolenaar } 13201c991144SBram Moolenaar from 13211c991144SBram Moolenaar './Xexport.vim' 13221c991144SBram Moolenaar g:imported = exported 13231c991144SBram Moolenaar exported += 5 13241c991144SBram Moolenaar g:imported_added = exported 13251c991144SBram Moolenaar g:imported_func = Exported() 13261c991144SBram Moolenaar END 13271c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 13281c991144SBram Moolenaar source Ximport_lbr.vim 13291c991144SBram Moolenaar 13301c991144SBram Moolenaar assert_equal(9876, g:imported) 13311c991144SBram Moolenaar assert_equal(9881, g:imported_added) 13321c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 13331c991144SBram Moolenaar 13341c991144SBram Moolenaar # exported script not sourced again 13351c991144SBram Moolenaar assert_false(exists('g:result')) 13361c991144SBram Moolenaar unlet g:imported 13371c991144SBram Moolenaar unlet g:imported_added 13381c991144SBram Moolenaar unlet g:imported_func 13391c991144SBram Moolenaar delete('Ximport_lbr.vim') 13401c991144SBram Moolenaar 13411c991144SBram Moolenaar # import inside :def function 13425381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 13435381c7a1SBram Moolenaar vim9script 13445381c7a1SBram Moolenaar def ImportInDef() 13455381c7a1SBram Moolenaar import exported from './Xexport.vim' 13465381c7a1SBram Moolenaar g:imported = exported 13475381c7a1SBram Moolenaar exported += 7 13485381c7a1SBram Moolenaar g:imported_added = exported 13495381c7a1SBram Moolenaar enddef 13505381c7a1SBram Moolenaar ImportInDef() 13515381c7a1SBram Moolenaar END 13525381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 13535381c7a1SBram Moolenaar source Ximport2.vim 1354f5be8cdbSBram Moolenaar # TODO: this should be 9879 13555381c7a1SBram Moolenaar assert_equal(9876, g:imported) 13565381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 13575381c7a1SBram Moolenaar unlet g:imported 13585381c7a1SBram Moolenaar unlet g:imported_added 13595381c7a1SBram Moolenaar delete('Ximport2.vim') 13605381c7a1SBram Moolenaar 1361f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1362f2d5c240SBram Moolenaar vim9script 1363f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1364f2d5c240SBram Moolenaar def UseExport() 1365f2d5c240SBram Moolenaar g:imported = Export.exported 1366f2d5c240SBram Moolenaar enddef 1367f2d5c240SBram Moolenaar UseExport() 1368f2d5c240SBram Moolenaar END 1369f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1370f2d5c240SBram Moolenaar source Ximport.vim 13715381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1372f2d5c240SBram Moolenaar 1373599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1374599c89c8SBram Moolenaar vim9script 1375599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1376599c89c8SBram Moolenaar def Func() 1377599c89c8SBram Moolenaar let dummy = 1 1378599c89c8SBram Moolenaar let imported = Export + dummy 1379599c89c8SBram Moolenaar enddef 1380822ba247SBram Moolenaar defcompile 1381599c89c8SBram Moolenaar END 1382599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 138344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1384599c89c8SBram Moolenaar 1385599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1386599c89c8SBram Moolenaar vim9script 1387599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1388599c89c8SBram Moolenaar def Func() 1389599c89c8SBram Moolenaar let imported = Export . exported 1390599c89c8SBram Moolenaar enddef 1391822ba247SBram Moolenaar defcompile 1392599c89c8SBram Moolenaar END 1393599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 139444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1395599c89c8SBram Moolenaar 1396599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1397599c89c8SBram Moolenaar vim9script 1398599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1399599c89c8SBram Moolenaar def Func() 1400599c89c8SBram Moolenaar let imported = Export. 1401599c89c8SBram Moolenaar enddef 1402822ba247SBram Moolenaar defcompile 1403599c89c8SBram Moolenaar END 1404599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 140544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1406599c89c8SBram Moolenaar 14071c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 14081c991144SBram Moolenaar vim9script 14091c991144SBram Moolenaar import * 14101c991144SBram Moolenaar as Export 14111c991144SBram Moolenaar from 14121c991144SBram Moolenaar './Xexport.vim' 14131c991144SBram Moolenaar def UseExport() 14141c991144SBram Moolenaar g:imported = Export.exported 14151c991144SBram Moolenaar enddef 14161c991144SBram Moolenaar UseExport() 14171c991144SBram Moolenaar END 14181c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 14191c991144SBram Moolenaar source Ximport.vim 14201c991144SBram Moolenaar assert_equal(9883, g:imported) 14211c991144SBram Moolenaar 1422f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1423f2d5c240SBram Moolenaar vim9script 1424f2d5c240SBram Moolenaar import * from './Xexport.vim' 1425f2d5c240SBram Moolenaar END 1426f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 142744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1428f2d5c240SBram Moolenaar 1429f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1430fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1431fa29c8abSBram Moolenaar vim9script 1432fa29c8abSBram Moolenaar import name from './Xexport.vim' 1433fa29c8abSBram Moolenaar END 1434fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 143544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1436fa29c8abSBram Moolenaar 1437f5be8cdbSBram Moolenaar # try to import something that is already defined 14385269bd2aSBram Moolenaar let import_already_defined =<< trim END 14395269bd2aSBram Moolenaar vim9script 14405269bd2aSBram Moolenaar let exported = 'something' 14415269bd2aSBram Moolenaar import exported from './Xexport.vim' 14425269bd2aSBram Moolenaar END 14435269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 144444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14455269bd2aSBram Moolenaar 1446f5be8cdbSBram Moolenaar # try to import something that is already defined 14475269bd2aSBram Moolenaar import_already_defined =<< trim END 14485269bd2aSBram Moolenaar vim9script 14495269bd2aSBram Moolenaar let exported = 'something' 14505269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 14515269bd2aSBram Moolenaar END 14525269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 145344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14545269bd2aSBram Moolenaar 1455f5be8cdbSBram Moolenaar # try to import something that is already defined 14565269bd2aSBram Moolenaar import_already_defined =<< trim END 14575269bd2aSBram Moolenaar vim9script 14585269bd2aSBram Moolenaar let exported = 'something' 14595269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 14605269bd2aSBram Moolenaar END 14615269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 146244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14635269bd2aSBram Moolenaar 1464f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1465fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1466fa29c8abSBram Moolenaar vim9script 1467fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1468fa29c8abSBram Moolenaar END 1469fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 147044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1471fa29c8abSBram Moolenaar 1472fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1473fa29c8abSBram Moolenaar vim9script 1474fa29c8abSBram Moolenaar import name './Xexport.vim' 1475fa29c8abSBram Moolenaar END 1476fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 147744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1478fa29c8abSBram Moolenaar 1479fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1480fa29c8abSBram Moolenaar vim9script 1481fa29c8abSBram Moolenaar import name from Xexport.vim 1482fa29c8abSBram Moolenaar END 1483fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 148444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1485fa29c8abSBram Moolenaar 1486fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1487fa29c8abSBram Moolenaar vim9script 1488fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1489fa29c8abSBram Moolenaar END 1490fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 149144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1492fa29c8abSBram Moolenaar 1493fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1494fa29c8abSBram Moolenaar vim9script 1495fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1496fa29c8abSBram Moolenaar END 14975269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 149844d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1499fa29c8abSBram Moolenaar 1500f2d5c240SBram Moolenaar delete('Ximport.vim') 15015269bd2aSBram Moolenaar delete('Ximport3.vim') 15028a7d6542SBram Moolenaar delete('Xexport.vim') 15038a7d6542SBram Moolenaar 1504f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1505750802b5SBram Moolenaar set cpo&vi 1506750802b5SBram Moolenaar let cpo_before = &cpo 1507750802b5SBram Moolenaar let lines =<< trim END 1508750802b5SBram Moolenaar vim9script 1509750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1510750802b5SBram Moolenaar END 1511750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1512750802b5SBram Moolenaar source Xvim9_script 1513750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1514750802b5SBram Moolenaar set cpo&vim 1515750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1516750802b5SBram Moolenaar delete('Xvim9_script') 1517750802b5SBram Moolenaarenddef 1518750802b5SBram Moolenaar 1519803af686SBram Moolenaarfunc g:Trigger() 1520803af686SBram Moolenaar source Ximport.vim 1521803af686SBram Moolenaar return "echo 'yes'\<CR>" 1522803af686SBram Moolenaarendfunc 1523803af686SBram Moolenaar 1524803af686SBram Moolenaardef Test_import_export_expr_map() 1525803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1526803af686SBram Moolenaar let export_lines =<< trim END 1527803af686SBram Moolenaar vim9script 1528803af686SBram Moolenaar export def That(): string 1529803af686SBram Moolenaar return 'yes' 1530803af686SBram Moolenaar enddef 1531803af686SBram Moolenaar END 1532803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1533803af686SBram Moolenaar 1534803af686SBram Moolenaar let import_lines =<< trim END 1535803af686SBram Moolenaar vim9script 1536803af686SBram Moolenaar import That from './Xexport_that.vim' 1537803af686SBram Moolenaar assert_equal('yes', That()) 1538803af686SBram Moolenaar END 1539803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1540803af686SBram Moolenaar 1541803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1542803af686SBram Moolenaar feedkeys('trigger', "xt") 1543803af686SBram Moolenaar 1544730b2483SBram Moolenaar delete('Xexport_that.vim') 1545803af686SBram Moolenaar delete('Ximport.vim') 1546803af686SBram Moolenaar nunmap trigger 1547803af686SBram Moolenaarenddef 1548803af686SBram Moolenaar 15498e1986e3SBram Moolenaardef Test_import_in_filetype() 15508e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15518e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 15528e1986e3SBram Moolenaar let export_lines =<< trim END 15538e1986e3SBram Moolenaar vim9script 15548e1986e3SBram Moolenaar export let That = 'yes' 15558e1986e3SBram Moolenaar END 1556730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15578e1986e3SBram Moolenaar 15588e1986e3SBram Moolenaar let import_lines =<< trim END 15598e1986e3SBram Moolenaar vim9script 1560730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15618e1986e3SBram Moolenaar assert_equal('yes', That) 15628e1986e3SBram Moolenaar g:did_load_mytpe = 1 15638e1986e3SBram Moolenaar END 15648e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15658e1986e3SBram Moolenaar 15668e1986e3SBram Moolenaar let save_rtp = &rtp 15678e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15688e1986e3SBram Moolenaar 15698e1986e3SBram Moolenaar filetype plugin on 15708e1986e3SBram Moolenaar copen 15718e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15728e1986e3SBram Moolenaar 15738e1986e3SBram Moolenaar quit! 1574730b2483SBram Moolenaar delete('Xexport_ft.vim') 15758e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15768e1986e3SBram Moolenaar &rtp = save_rtp 15778e1986e3SBram Moolenaarenddef 15788e1986e3SBram Moolenaar 1579efa94447SBram Moolenaardef Test_use_import_in_mapping() 1580efa94447SBram Moolenaar let lines =<< trim END 1581efa94447SBram Moolenaar vim9script 1582efa94447SBram Moolenaar export def Funcx() 1583efa94447SBram Moolenaar g:result = 42 1584efa94447SBram Moolenaar enddef 1585efa94447SBram Moolenaar END 1586efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1587efa94447SBram Moolenaar lines =<< trim END 1588efa94447SBram Moolenaar vim9script 1589efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1590b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1591efa94447SBram Moolenaar END 1592efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1593efa94447SBram Moolenaar 1594efa94447SBram Moolenaar source Xmapscript.vim 1595b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1596efa94447SBram Moolenaar assert_equal(42, g:result) 1597efa94447SBram Moolenaar 1598efa94447SBram Moolenaar unlet g:result 1599efa94447SBram Moolenaar delete('XsomeExport.vim') 1600efa94447SBram Moolenaar delete('Xmapscript.vim') 1601b3ca9824SBram Moolenaar nunmap <F3> 1602efa94447SBram Moolenaarenddef 1603efa94447SBram Moolenaar 1604750802b5SBram Moolenaardef Test_vim9script_fails() 16058a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16068a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1607750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 16089721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 16099b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1610750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1611750802b5SBram Moolenaar 1612451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1613c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1614c785b9a7SBram Moolenaar 1615e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1616e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16178a7d6542SBram Moolenaarenddef 16188a7d6542SBram Moolenaar 1619f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1620101f4810SBram Moolenaar CheckRunVimInTerminal 1621101f4810SBram Moolenaar 16229bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1623c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16249bb3eb3eSBram Moolenaarendfunc 16259bb3eb3eSBram Moolenaar 1626c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1627101f4810SBram Moolenaar let export =<< trim END 1628101f4810SBram Moolenaar vim9script 1629101f4810SBram Moolenaar export def Foo(): number 1630101f4810SBram Moolenaar return 0 1631101f4810SBram Moolenaar enddef 1632101f4810SBram Moolenaar END 1633730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1634101f4810SBram Moolenaar 1635730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 16369bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16379bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1638101f4810SBram Moolenaar 1639730b2483SBram Moolenaar delete('XexportCmd.vim') 16409bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16419bb3eb3eSBram Moolenaarenddef 1642101f4810SBram Moolenaar 16434c17ad94SBram Moolenaardef Test_vim9script_reload_import() 16448a7d6542SBram Moolenaar let lines =<< trim END 16458a7d6542SBram Moolenaar vim9script 16468a7d6542SBram Moolenaar const var = '' 16478a7d6542SBram Moolenaar let valone = 1234 16488a7d6542SBram Moolenaar def MyFunc(arg: string) 16498a7d6542SBram Moolenaar valone = 5678 16508a7d6542SBram Moolenaar enddef 16518a7d6542SBram Moolenaar END 16528a7d6542SBram Moolenaar let morelines =<< trim END 16538a7d6542SBram Moolenaar let valtwo = 222 16548a7d6542SBram Moolenaar export def GetValtwo(): number 16558a7d6542SBram Moolenaar return valtwo 16568a7d6542SBram Moolenaar enddef 16578a7d6542SBram Moolenaar END 165803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16598a7d6542SBram Moolenaar source Xreload.vim 16608a7d6542SBram Moolenaar source Xreload.vim 16618a7d6542SBram Moolenaar source Xreload.vim 16628a7d6542SBram Moolenaar 16638a7d6542SBram Moolenaar let testlines =<< trim END 16648a7d6542SBram Moolenaar vim9script 16658a7d6542SBram Moolenaar def TheFunc() 16668a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16678a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16688a7d6542SBram Moolenaar enddef 16698a7d6542SBram Moolenaar TheFunc() 16708a7d6542SBram Moolenaar END 16718a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16728a7d6542SBram Moolenaar source Ximport.vim 16738a7d6542SBram Moolenaar 1674f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1675f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16768a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16778a7d6542SBram Moolenaar source Ximport.vim 16788a7d6542SBram Moolenaar 1679f5be8cdbSBram Moolenaar # cannot declare a var twice 16808a7d6542SBram Moolenaar lines =<< trim END 16818a7d6542SBram Moolenaar vim9script 16828a7d6542SBram Moolenaar let valone = 1234 16838a7d6542SBram Moolenaar let valone = 5678 16848a7d6542SBram Moolenaar END 16858a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 168644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16878a7d6542SBram Moolenaar 16888a7d6542SBram Moolenaar delete('Xreload.vim') 16898a7d6542SBram Moolenaar delete('Ximport.vim') 16908a7d6542SBram Moolenaarenddef 16918a7d6542SBram Moolenaar 169295006e3dSBram Moolenaardef s:RetSome(): string 169395006e3dSBram Moolenaar return 'some' 169495006e3dSBram Moolenaarenddef 169595006e3dSBram Moolenaar 1696fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1697fe465a01SBram Moolenaar" script-local name. 1698fe465a01SBram Moolenaardef Test_vim9script_funcref() 1699fe465a01SBram Moolenaar let sortlines =<< trim END 1700fe465a01SBram Moolenaar vim9script 1701fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1702bed36b93SBram Moolenaar return i2 - i1 1703fe465a01SBram Moolenaar enddef 1704fe465a01SBram Moolenaar 1705fe465a01SBram Moolenaar export def FastSort(): list<number> 1706fe465a01SBram Moolenaar return range(5)->sort(Compare) 1707fe465a01SBram Moolenaar enddef 1708fe465a01SBram Moolenaar END 1709fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1710fe465a01SBram Moolenaar 1711fe465a01SBram Moolenaar let lines =<< trim END 1712fe465a01SBram Moolenaar vim9script 1713fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1714fe465a01SBram Moolenaar def Test() 1715fe465a01SBram Moolenaar g:result = FastSort() 1716fe465a01SBram Moolenaar enddef 1717fe465a01SBram Moolenaar Test() 1718fe465a01SBram Moolenaar END 1719fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1720fe465a01SBram Moolenaar 1721fe465a01SBram Moolenaar source Xscript.vim 1722fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1723fe465a01SBram Moolenaar 1724fe465a01SBram Moolenaar unlet g:result 1725fe465a01SBram Moolenaar delete('Xsort.vim') 1726fe465a01SBram Moolenaar delete('Xscript.vim') 172795006e3dSBram Moolenaar 172895006e3dSBram Moolenaar let Funcref = function('s:RetSome') 172995006e3dSBram Moolenaar assert_equal('some', Funcref()) 1730fe465a01SBram Moolenaarenddef 1731fe465a01SBram Moolenaar 1732601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1733601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1734601e76acSBram Moolenaar" function reference. 1735c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1736c620c055SBram Moolenaar let filterLines =<< trim END 1737c620c055SBram Moolenaar vim9script 1738c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1739c620c055SBram Moolenaar return idx % 2 == 1 1740c620c055SBram Moolenaar enddef 1741c620c055SBram Moolenaar export def FastFilter(): list<number> 1742c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1743c620c055SBram Moolenaar enddef 1744601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1745601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1746601e76acSBram Moolenaar enddef 1747c620c055SBram Moolenaar END 1748c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1749c620c055SBram Moolenaar 1750c620c055SBram Moolenaar let lines =<< trim END 1751c620c055SBram Moolenaar vim9script 1752601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1753c620c055SBram Moolenaar def Test() 1754c620c055SBram Moolenaar let x: list<number> = FastFilter() 1755c620c055SBram Moolenaar enddef 1756c620c055SBram Moolenaar Test() 1757601e76acSBram Moolenaar def TestDirect() 1758601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1759601e76acSBram Moolenaar enddef 1760601e76acSBram Moolenaar TestDirect() 1761c620c055SBram Moolenaar END 1762601e76acSBram Moolenaar CheckScriptSuccess(lines) 1763c620c055SBram Moolenaar delete('Xfilter.vim') 1764c620c055SBram Moolenaarenddef 1765c620c055SBram Moolenaar 17664c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17674c17ad94SBram Moolenaar let first_lines =<< trim END 17684c17ad94SBram Moolenaar vim9script 17694c17ad94SBram Moolenaar def FuncYes(): string 17704c17ad94SBram Moolenaar return 'yes' 17714c17ad94SBram Moolenaar enddef 17724c17ad94SBram Moolenaar END 177303afdcf1SBram Moolenaar let withno_lines =<< trim END 17744c17ad94SBram Moolenaar def FuncNo(): string 17754c17ad94SBram Moolenaar return 'no' 17764c17ad94SBram Moolenaar enddef 17774c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17784c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17794c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 178003afdcf1SBram Moolenaar enddef 178103afdcf1SBram Moolenaar END 178203afdcf1SBram Moolenaar let nono_lines =<< trim END 178303afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 178403afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 178544d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17864c17ad94SBram Moolenaar enddef 17874c17ad94SBram Moolenaar END 17884c17ad94SBram Moolenaar 17894c17ad94SBram Moolenaar # FuncNo() is defined 179003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17914c17ad94SBram Moolenaar source Xreloaded.vim 17924c17ad94SBram Moolenaar g:DoCheck(true) 17934c17ad94SBram Moolenaar 17944c17ad94SBram Moolenaar # FuncNo() is not redefined 179503afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17964c17ad94SBram Moolenaar source Xreloaded.vim 179703afdcf1SBram Moolenaar g:DoCheck() 17984c17ad94SBram Moolenaar 17994c17ad94SBram Moolenaar # FuncNo() is back 180003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18014c17ad94SBram Moolenaar source Xreloaded.vim 180203afdcf1SBram Moolenaar g:DoCheck() 18034c17ad94SBram Moolenaar 18044c17ad94SBram Moolenaar delete('Xreloaded.vim') 18054c17ad94SBram Moolenaarenddef 18064c17ad94SBram Moolenaar 180789483d40SBram Moolenaardef Test_vim9script_reload_delvar() 180889483d40SBram Moolenaar # write the script with a script-local variable 180989483d40SBram Moolenaar let lines =<< trim END 181089483d40SBram Moolenaar vim9script 181189483d40SBram Moolenaar let var = 'string' 181289483d40SBram Moolenaar END 181389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 181489483d40SBram Moolenaar source XreloadVar.vim 181589483d40SBram Moolenaar 181689483d40SBram Moolenaar # now write the script using the same variable locally - works 181789483d40SBram Moolenaar lines =<< trim END 181889483d40SBram Moolenaar vim9script 181989483d40SBram Moolenaar def Func() 182089483d40SBram Moolenaar let var = 'string' 182189483d40SBram Moolenaar enddef 182289483d40SBram Moolenaar END 182389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 182489483d40SBram Moolenaar source XreloadVar.vim 182589483d40SBram Moolenaar 182689483d40SBram Moolenaar delete('XreloadVar.vim') 182789483d40SBram Moolenaarenddef 182889483d40SBram Moolenaar 18298a7d6542SBram Moolenaardef Test_import_absolute() 18308a7d6542SBram Moolenaar let import_lines = [ 1831e6085c53SBram Moolenaar 'vim9script', 1832e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1833e6085c53SBram Moolenaar 'def UseExported()', 1834e6085c53SBram Moolenaar ' g:imported_abs = exported', 1835e6085c53SBram Moolenaar ' exported = 8888', 1836e6085c53SBram Moolenaar ' g:imported_after = exported', 1837e6085c53SBram Moolenaar 'enddef', 1838e6085c53SBram Moolenaar 'UseExported()', 1839e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1840e6085c53SBram Moolenaar ] 18418a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18428a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18438a7d6542SBram Moolenaar 18448a7d6542SBram Moolenaar source Ximport_abs.vim 18458a7d6542SBram Moolenaar 18468a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18474e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1848675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1849675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1850675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1851675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1852675f716eSBram Moolenaar 'exported = 8888.*' .. 1853675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1854675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1855675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1856675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1857e6085c53SBram Moolenaar g:import_disassembled) 1858b3ca9824SBram Moolenaar 1859b3ca9824SBram Moolenaar Undo_export_script_lines() 18608a7d6542SBram Moolenaar unlet g:imported_abs 18614e12a5dfSBram Moolenaar unlet g:import_disassembled 18628a7d6542SBram Moolenaar 18638a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18648a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18658a7d6542SBram Moolenaarenddef 18668a7d6542SBram Moolenaar 18678a7d6542SBram Moolenaardef Test_import_rtp() 18688a7d6542SBram Moolenaar let import_lines = [ 1869e6085c53SBram Moolenaar 'vim9script', 1870e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1871e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1872e6085c53SBram Moolenaar ] 18738a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18748a7d6542SBram Moolenaar mkdir('import') 18758a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18768a7d6542SBram Moolenaar 18778a7d6542SBram Moolenaar let save_rtp = &rtp 18788a7d6542SBram Moolenaar &rtp = getcwd() 18798a7d6542SBram Moolenaar source Ximport_rtp.vim 18808a7d6542SBram Moolenaar &rtp = save_rtp 18818a7d6542SBram Moolenaar 18828a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18838a7d6542SBram Moolenaar 1884b3ca9824SBram Moolenaar Undo_export_script_lines() 1885b3ca9824SBram Moolenaar unlet g:imported_rtp 18868a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 188789483d40SBram Moolenaar delete('import', 'rf') 18888a7d6542SBram Moolenaarenddef 18898a7d6542SBram Moolenaar 189025e0f586SBram Moolenaardef Test_import_compile_error() 189125e0f586SBram Moolenaar let export_lines = [ 189225e0f586SBram Moolenaar 'vim9script', 189325e0f586SBram Moolenaar 'export def ExpFunc(): string', 189425e0f586SBram Moolenaar ' return notDefined', 189525e0f586SBram Moolenaar 'enddef', 189625e0f586SBram Moolenaar ] 189725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 189825e0f586SBram Moolenaar 189925e0f586SBram Moolenaar let import_lines = [ 190025e0f586SBram Moolenaar 'vim9script', 190125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 190225e0f586SBram Moolenaar 'def ImpFunc()', 190325e0f586SBram Moolenaar ' echo ExpFunc()', 190425e0f586SBram Moolenaar 'enddef', 190525e0f586SBram Moolenaar 'defcompile', 190625e0f586SBram Moolenaar ] 190725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 190825e0f586SBram Moolenaar 190925e0f586SBram Moolenaar try 191025e0f586SBram Moolenaar source Ximport.vim 191125e0f586SBram Moolenaar catch /E1001/ 1912f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 191325e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 191425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 191525e0f586SBram Moolenaar endtry 191625e0f586SBram Moolenaar 191725e0f586SBram Moolenaar delete('Xexported.vim') 191825e0f586SBram Moolenaar delete('Ximport.vim') 191925e0f586SBram Moolenaarenddef 192025e0f586SBram Moolenaar 1921c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1922c4ce36d4SBram Moolenaar let lines = [ 1923c4ce36d4SBram Moolenaar 'vim9script', 1924c4ce36d4SBram Moolenaar 'def Func()', 1925c4ce36d4SBram Moolenaar ' eval [][0]', 1926c4ce36d4SBram Moolenaar 'enddef', 1927c4ce36d4SBram Moolenaar 'Func()', 1928c4ce36d4SBram Moolenaar ] 1929c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1930c4ce36d4SBram Moolenaar 1931c4ce36d4SBram Moolenaar for count in range(3) 1932c4ce36d4SBram Moolenaar try 1933c4ce36d4SBram Moolenaar source Xtestscript.vim 1934c4ce36d4SBram Moolenaar catch /E684/ 1935c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1936c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1937c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1938c4ce36d4SBram Moolenaar endtry 1939c4ce36d4SBram Moolenaar endfor 1940c4ce36d4SBram Moolenaar 1941c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1942c4ce36d4SBram Moolenaarenddef 1943c4ce36d4SBram Moolenaar 1944eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1945eef2102eSBram Moolenaar let export_lines =<< trim END 1946eef2102eSBram Moolenaar vim9script 1947eef2102eSBram Moolenaar export def Func() 1948eef2102eSBram Moolenaar echo 'imported' 1949eef2102eSBram Moolenaar enddef 1950eef2102eSBram Moolenaar END 1951eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1952eef2102eSBram Moolenaar 1953eef2102eSBram Moolenaar let lines =<< trim END 1954eef2102eSBram Moolenaar vim9script 1955eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1956eef2102eSBram Moolenaar def Func() 1957eef2102eSBram Moolenaar echo 'local to function' 1958eef2102eSBram Moolenaar enddef 1959eef2102eSBram Moolenaar END 1960eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1961eef2102eSBram Moolenaar 1962eef2102eSBram Moolenaar lines =<< trim END 1963eef2102eSBram Moolenaar vim9script 1964eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1965eef2102eSBram Moolenaar def Outer() 1966eef2102eSBram Moolenaar def Func() 1967eef2102eSBram Moolenaar echo 'local to function' 1968eef2102eSBram Moolenaar enddef 1969eef2102eSBram Moolenaar enddef 1970eef2102eSBram Moolenaar defcompile 1971eef2102eSBram Moolenaar END 1972eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1973eef2102eSBram Moolenaar 1974eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1975eef2102eSBram Moolenaarenddef 1976eef2102eSBram Moolenaar 1977b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1978b9a2cac3SBram Moolenaar let lines =<< trim END 1979b9a2cac3SBram Moolenaar vim9script 1980b9a2cac3SBram Moolenaar def Func() 1981b9a2cac3SBram Moolenaar echo 'one' 1982b9a2cac3SBram Moolenaar enddef 1983b9a2cac3SBram Moolenaar def Func() 1984b9a2cac3SBram Moolenaar echo 'two' 1985b9a2cac3SBram Moolenaar enddef 1986b9a2cac3SBram Moolenaar END 1987b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1988fa211f3cSBram Moolenaar 1989fa211f3cSBram Moolenaar lines =<< trim END 1990fa211f3cSBram Moolenaar vim9script 1991fa211f3cSBram Moolenaar def Foo(): string 1992fa211f3cSBram Moolenaar return 'foo' 1993fa211f3cSBram Moolenaar enddef 1994fa211f3cSBram Moolenaar def Func() 1995fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1996fa211f3cSBram Moolenaar enddef 1997fa211f3cSBram Moolenaar defcompile 1998fa211f3cSBram Moolenaar END 1999fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2000b9a2cac3SBram Moolenaarenddef 2001b9a2cac3SBram Moolenaar 20028a7d6542SBram Moolenaardef Test_fixed_size_list() 2003f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 20048a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 20058a7d6542SBram Moolenaar l->remove(0) 20068a7d6542SBram Moolenaar l->add(5) 20078a7d6542SBram Moolenaar l->insert(99, 1) 20080f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20098a7d6542SBram Moolenaarenddef 20108a7d6542SBram Moolenaar 2011ae616494SBram Moolenaardef Test_no_insert_xit() 2012d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2013d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2014d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2015d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2016d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2017ae616494SBram Moolenaar 2018ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2019ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2020ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2021ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2022f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2023f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 2024f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2025f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2026f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2027ae616494SBram Moolenaarenddef 2028ae616494SBram Moolenaar 2029158906cfSBram Moolenaardef IfElse(what: number): string 2030158906cfSBram Moolenaar let res = '' 2031158906cfSBram Moolenaar if what == 1 2032158906cfSBram Moolenaar res = "one" 2033158906cfSBram Moolenaar elseif what == 2 2034158906cfSBram Moolenaar res = "two" 2035a259d8d3SBram Moolenaar else 2036158906cfSBram Moolenaar res = "three" 2037a259d8d3SBram Moolenaar endif 2038158906cfSBram Moolenaar return res 2039a259d8d3SBram Moolenaarenddef 2040a259d8d3SBram Moolenaar 2041158906cfSBram Moolenaardef Test_if_elseif_else() 2042158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2043158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2044158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20450f18b6d1SBram Moolenaarenddef 20460f18b6d1SBram Moolenaar 2047e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2048d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2049d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2050d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2051d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2052d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2053e8c4abbbSBram Moolenaarenddef 2054e8c4abbbSBram Moolenaar 20556d69bf60SBram Moolenaarlet g:bool_true = v:true 20566d69bf60SBram Moolenaarlet g:bool_false = v:false 20576d69bf60SBram Moolenaar 20586d69bf60SBram Moolenaardef Test_if_const_expr() 20596d69bf60SBram Moolenaar let res = false 20606d69bf60SBram Moolenaar if true ? true : false 20616d69bf60SBram Moolenaar res = true 20626d69bf60SBram Moolenaar endif 20636d69bf60SBram Moolenaar assert_equal(true, res) 20646d69bf60SBram Moolenaar 2065585fea7bSBram Moolenaar g:glob = 2 2066585fea7bSBram Moolenaar if false 20676797966dSBram Moolenaar execute('g:glob = 3') 2068585fea7bSBram Moolenaar endif 2069585fea7bSBram Moolenaar assert_equal(2, g:glob) 2070585fea7bSBram Moolenaar if true 20716797966dSBram Moolenaar execute('g:glob = 3') 2072585fea7bSBram Moolenaar endif 2073585fea7bSBram Moolenaar assert_equal(3, g:glob) 2074585fea7bSBram Moolenaar 20756d69bf60SBram Moolenaar res = false 20766d69bf60SBram Moolenaar if g:bool_true ? true : false 20776d69bf60SBram Moolenaar res = true 20786d69bf60SBram Moolenaar endif 20796d69bf60SBram Moolenaar assert_equal(true, res) 20806d69bf60SBram Moolenaar 20816d69bf60SBram Moolenaar res = false 20826d69bf60SBram Moolenaar if true ? g:bool_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 ? true : g:bool_false 20896d69bf60SBram Moolenaar res = true 20906d69bf60SBram Moolenaar endif 20916d69bf60SBram Moolenaar assert_equal(true, res) 20926d69bf60SBram Moolenaar 20936d69bf60SBram Moolenaar res = false 20946d69bf60SBram Moolenaar if true ? false : true 20956d69bf60SBram Moolenaar res = true 20966d69bf60SBram Moolenaar endif 20976d69bf60SBram Moolenaar assert_equal(false, res) 20986d69bf60SBram Moolenaar 20996d69bf60SBram Moolenaar res = false 21006d69bf60SBram Moolenaar if false ? false : true 21016d69bf60SBram Moolenaar res = true 21026d69bf60SBram Moolenaar endif 21036d69bf60SBram Moolenaar assert_equal(true, res) 21046d69bf60SBram Moolenaar 21056d69bf60SBram Moolenaar res = false 21066d69bf60SBram Moolenaar if false ? true : false 21076d69bf60SBram Moolenaar res = true 21086d69bf60SBram Moolenaar endif 21096d69bf60SBram Moolenaar assert_equal(false, res) 21106d69bf60SBram Moolenaar 21116d69bf60SBram Moolenaar res = false 2112e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2113e8c4abbbSBram Moolenaar res = true 2114e8c4abbbSBram Moolenaar endif 2115e8c4abbbSBram Moolenaar assert_equal(false, res) 2116e8c4abbbSBram Moolenaar 2117e8c4abbbSBram Moolenaar res = false 21186d69bf60SBram Moolenaar if true && true 21196d69bf60SBram Moolenaar res = true 21206d69bf60SBram Moolenaar endif 21216d69bf60SBram Moolenaar assert_equal(true, res) 21226d69bf60SBram Moolenaar 21236d69bf60SBram Moolenaar res = false 21246d69bf60SBram Moolenaar if true && false 21256d69bf60SBram Moolenaar res = true 21266d69bf60SBram Moolenaar endif 21276d69bf60SBram Moolenaar assert_equal(false, res) 21286d69bf60SBram Moolenaar 21296d69bf60SBram Moolenaar res = false 21306d69bf60SBram Moolenaar if g:bool_true && false 21316d69bf60SBram Moolenaar res = true 21326d69bf60SBram Moolenaar endif 21336d69bf60SBram Moolenaar assert_equal(false, res) 21346d69bf60SBram Moolenaar 21356d69bf60SBram Moolenaar res = false 21366d69bf60SBram Moolenaar if true && g:bool_false 21376d69bf60SBram Moolenaar res = true 21386d69bf60SBram Moolenaar endif 21396d69bf60SBram Moolenaar assert_equal(false, res) 21406d69bf60SBram Moolenaar 21416d69bf60SBram Moolenaar res = false 21426d69bf60SBram Moolenaar if false && false 21436d69bf60SBram Moolenaar res = true 21446d69bf60SBram Moolenaar endif 21456d69bf60SBram Moolenaar assert_equal(false, res) 21466d69bf60SBram Moolenaar 21476d69bf60SBram Moolenaar res = false 21486d69bf60SBram Moolenaar if true || false 21496d69bf60SBram Moolenaar res = true 21506d69bf60SBram Moolenaar endif 21516d69bf60SBram Moolenaar assert_equal(true, res) 21526d69bf60SBram Moolenaar 21536d69bf60SBram Moolenaar res = false 21546d69bf60SBram Moolenaar if g:bool_true || false 21556d69bf60SBram Moolenaar res = true 21566d69bf60SBram Moolenaar endif 21576d69bf60SBram Moolenaar assert_equal(true, res) 21586d69bf60SBram Moolenaar 21596d69bf60SBram Moolenaar res = false 21606d69bf60SBram Moolenaar if true || g:bool_false 21616d69bf60SBram Moolenaar res = true 21626d69bf60SBram Moolenaar endif 21636d69bf60SBram Moolenaar assert_equal(true, res) 21646d69bf60SBram Moolenaar 21656d69bf60SBram Moolenaar res = false 21666d69bf60SBram Moolenaar if false || false 21676d69bf60SBram Moolenaar res = true 21686d69bf60SBram Moolenaar endif 21696d69bf60SBram Moolenaar assert_equal(false, res) 21703988f64fSBram Moolenaar 21713988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21723988f64fSBram Moolenaar if false | eval 0 | endif 21733988f64fSBram Moolenaar if false | eval burp + 234 | endif 21743988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21753988f64fSBram Moolenaar if false 21763988f64fSBram Moolenaar burp 21773988f64fSBram Moolenaar endif 217880c34ca3SBram Moolenaarenddef 21796d69bf60SBram Moolenaar 218080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2181d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2182d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2183d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2184d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21856d69bf60SBram Moolenaarenddef 21866d69bf60SBram Moolenaar 218772abcf42SBram Moolenaardef RunNested(i: number): number 218872abcf42SBram Moolenaar let x: number = 0 218972abcf42SBram Moolenaar if i % 2 219072abcf42SBram Moolenaar if 1 2191f5be8cdbSBram Moolenaar # comment 219272abcf42SBram Moolenaar else 2193f5be8cdbSBram Moolenaar # comment 219472abcf42SBram Moolenaar endif 219572abcf42SBram Moolenaar x += 1 219672abcf42SBram Moolenaar else 219772abcf42SBram Moolenaar x += 1000 219872abcf42SBram Moolenaar endif 219972abcf42SBram Moolenaar return x 220072abcf42SBram Moolenaarenddef 220172abcf42SBram Moolenaar 220272abcf42SBram Moolenaardef Test_nested_if() 220372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 220472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 220572abcf42SBram Moolenaarenddef 220672abcf42SBram Moolenaar 2207ad39c094SBram Moolenaardef Test_execute_cmd() 2208ad39c094SBram Moolenaar new 2209ad39c094SBram Moolenaar setline(1, 'default') 2210d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2211ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2212a72cfb80SBram Moolenaar 2213d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2214a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2215a72cfb80SBram Moolenaar 2216d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2217ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2218a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2219ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2220a72cfb80SBram Moolenaar 2221d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2222ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2223a72cfb80SBram Moolenaar 2224ad39c094SBram Moolenaar let cmd_first = 'call ' 2225ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2226ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2227ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2228ad39c094SBram Moolenaar bwipe! 2229585fea7bSBram Moolenaar 22302d6b20d6SBram Moolenaar let n = true 22312d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22322d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22332d6b20d6SBram Moolenaar 2234e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2235e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2236e5abf7afSBram Moolenaar 2237d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2238d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2239d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2240ad39c094SBram Moolenaarenddef 2241ad39c094SBram Moolenaar 224247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2243f5be8cdbSBram Moolenaar # only checks line continuation 224447e880d6SBram Moolenaar let lines =<< trim END 224547e880d6SBram Moolenaar vim9script 224647e880d6SBram Moolenaar execute 'g:someVar' 224747e880d6SBram Moolenaar .. ' = ' .. 224847e880d6SBram Moolenaar '28' 224947e880d6SBram Moolenaar assert_equal(28, g:someVar) 225047e880d6SBram Moolenaar unlet g:someVar 225147e880d6SBram Moolenaar END 225247e880d6SBram Moolenaar CheckScriptSuccess(lines) 225347e880d6SBram Moolenaarenddef 225447e880d6SBram Moolenaar 2255ad39c094SBram Moolenaardef Test_echo_cmd() 2256a72cfb80SBram Moolenaar echo 'some' # comment 2257585fea7bSBram Moolenaar echon 'thing' 2258ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2259ad39c094SBram Moolenaar 2260a72cfb80SBram Moolenaar echo "some" # comment 2261a72cfb80SBram Moolenaar echon "thing" 2262a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2263a72cfb80SBram Moolenaar 2264ad39c094SBram Moolenaar let str1 = 'some' 2265ad39c094SBram Moolenaar let str2 = 'more' 2266ad39c094SBram Moolenaar echo str1 str2 2267ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2268a72cfb80SBram Moolenaar 2269d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2270ad39c094SBram Moolenaarenddef 2271ad39c094SBram Moolenaar 2272f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2273f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2274f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2275f93c7feaSBram Moolenaar echo 'clear' 2276df069eecSBram Moolenaar :1messages 2277f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2278f93c7feaSBram Moolenaar 2279d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2280f93c7feaSBram Moolenaarenddef 2281f93c7feaSBram Moolenaar 228247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2283f5be8cdbSBram Moolenaar # only checks line continuation 228447e880d6SBram Moolenaar let lines =<< trim END 228547e880d6SBram Moolenaar vim9script 228647e880d6SBram Moolenaar echomsg 'here' 228747e880d6SBram Moolenaar .. ' is ' .. 228847e880d6SBram Moolenaar 'a message' 228947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 229047e880d6SBram Moolenaar END 229147e880d6SBram Moolenaar CheckScriptSuccess(lines) 229247e880d6SBram Moolenaarenddef 229347e880d6SBram Moolenaar 2294f93c7feaSBram Moolenaardef Test_echoerr_cmd() 229540ee466cSBram Moolenaar try 229640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 229740ee466cSBram Moolenaar catch 229840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 229940ee466cSBram Moolenaar endtry 2300f93c7feaSBram Moolenaarenddef 2301f93c7feaSBram Moolenaar 230247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2303f5be8cdbSBram Moolenaar # only checks line continuation 230447e880d6SBram Moolenaar let lines =<< trim END 230547e880d6SBram Moolenaar vim9script 230647e880d6SBram Moolenaar try 230747e880d6SBram Moolenaar echoerr 'this' 230847e880d6SBram Moolenaar .. ' is ' .. 230947e880d6SBram Moolenaar 'wrong' 231047e880d6SBram Moolenaar catch 231147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 231247e880d6SBram Moolenaar endtry 231347e880d6SBram Moolenaar END 231447e880d6SBram Moolenaar CheckScriptSuccess(lines) 231547e880d6SBram Moolenaarenddef 231647e880d6SBram Moolenaar 231741fe0617SBram Moolenaardef Test_for_outside_of_function() 231841fe0617SBram Moolenaar let lines =<< trim END 231941fe0617SBram Moolenaar vim9script 232041fe0617SBram Moolenaar new 232141fe0617SBram Moolenaar for var in range(0, 3) 232241fe0617SBram Moolenaar append(line('$'), var) 232341fe0617SBram Moolenaar endfor 232441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 232541fe0617SBram Moolenaar bwipe! 232641fe0617SBram Moolenaar END 232741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 232841fe0617SBram Moolenaar source Xvim9for.vim 232941fe0617SBram Moolenaar delete('Xvim9for.vim') 233041fe0617SBram Moolenaarenddef 23318a7d6542SBram Moolenaar 2332e8c4abbbSBram Moolenaardef Test_for_loop() 2333e8c4abbbSBram Moolenaar let result = '' 2334e8c4abbbSBram Moolenaar for cnt in range(7) 2335e8c4abbbSBram Moolenaar if cnt == 4 2336e8c4abbbSBram Moolenaar break 2337e8c4abbbSBram Moolenaar endif 2338e8c4abbbSBram Moolenaar if cnt == 2 2339e8c4abbbSBram Moolenaar continue 2340e8c4abbbSBram Moolenaar endif 2341e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2342e8c4abbbSBram Moolenaar endfor 2343e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23440ad3e894SBram Moolenaar 23450ad3e894SBram Moolenaar let concat = '' 23460ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23470ad3e894SBram Moolenaar concat ..= str 23480ad3e894SBram Moolenaar endfor 23490ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2350e8c4abbbSBram Moolenaarenddef 2351e8c4abbbSBram Moolenaar 2352e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2353675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2354675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2355451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2356822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2357451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2358675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2359675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2360675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2361e8c4abbbSBram Moolenaarenddef 2362e8c4abbbSBram Moolenaar 2363d0df1aacSBram Moolenaardef Test_while_loop() 2364d0df1aacSBram Moolenaar let result = '' 2365d0df1aacSBram Moolenaar let cnt = 0 2366d0df1aacSBram Moolenaar while cnt < 555 2367d0df1aacSBram Moolenaar if cnt == 3 2368d0df1aacSBram Moolenaar break 2369d0df1aacSBram Moolenaar endif 2370d0df1aacSBram Moolenaar cnt += 1 2371d0df1aacSBram Moolenaar if cnt == 2 2372d0df1aacSBram Moolenaar continue 2373d0df1aacSBram Moolenaar endif 2374d0df1aacSBram Moolenaar result ..= cnt .. '_' 2375d0df1aacSBram Moolenaar endwhile 2376d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2377d0df1aacSBram Moolenaarenddef 2378d0df1aacSBram Moolenaar 2379e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2380675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2381675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2382675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2383675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2384675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2385675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2386675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2387bd5da371SBram Moolenaarenddef 2388bd5da371SBram Moolenaar 23899645e2d9SBram Moolenaardef Test_interrupt_loop() 239097acfc78SBram Moolenaar let caught = false 23919645e2d9SBram Moolenaar let x = 0 239297acfc78SBram Moolenaar try 23939645e2d9SBram Moolenaar while 1 23949645e2d9SBram Moolenaar x += 1 23959645e2d9SBram Moolenaar if x == 100 23969645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23979645e2d9SBram Moolenaar endif 23989645e2d9SBram Moolenaar endwhile 239997acfc78SBram Moolenaar catch 240097acfc78SBram Moolenaar caught = true 240197acfc78SBram Moolenaar assert_equal(100, x) 240297acfc78SBram Moolenaar endtry 240397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 240425859dd7SBram Moolenaar # consume the CTRL-C 240525859dd7SBram Moolenaar getchar(0) 24069645e2d9SBram Moolenaarenddef 240720431c9dSBram Moolenaar 24084fdae999SBram Moolenaardef Test_automatic_line_continuation() 24094fdae999SBram Moolenaar let mylist = [ 24104fdae999SBram Moolenaar 'one', 24114fdae999SBram Moolenaar 'two', 24124fdae999SBram Moolenaar 'three', 2413f5be8cdbSBram Moolenaar ] # comment 24144fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24154fdae999SBram Moolenaar 24164fdae999SBram Moolenaar let mydict = { 24174fdae999SBram Moolenaar 'one': 1, 24184fdae999SBram Moolenaar 'two': 2, 24194fdae999SBram Moolenaar 'three': 24204fdae999SBram Moolenaar 3, 2421f5be8cdbSBram Moolenaar } # comment 24224fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 24234fdae999SBram Moolenaar mydict = #{ 24242c330432SBram Moolenaar one: 1, # comment 24252c330432SBram Moolenaar two: # comment 24262c330432SBram Moolenaar 2, # comment 24272c330432SBram Moolenaar three: 3 # comment 24282c330432SBram Moolenaar } 24292c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 24302c330432SBram Moolenaar mydict = #{ 24312c330432SBram Moolenaar one: 1, 24324fdae999SBram Moolenaar two: 24334fdae999SBram Moolenaar 2, 24342c330432SBram Moolenaar three: 3 24354fdae999SBram Moolenaar } 24364fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2437e6085c53SBram Moolenaar 2438e6085c53SBram Moolenaar assert_equal( 2439e6085c53SBram Moolenaar ['one', 'two', 'three'], 2440e6085c53SBram Moolenaar split('one two three') 2441e6085c53SBram Moolenaar ) 24424fdae999SBram Moolenaarenddef 24434fdae999SBram Moolenaar 24447a092245SBram Moolenaardef Test_vim9_comment() 24457a092245SBram Moolenaar CheckScriptSuccess([ 24467a092245SBram Moolenaar 'vim9script', 24477a092245SBram Moolenaar '# something', 24487a092245SBram Moolenaar ]) 24497a092245SBram Moolenaar CheckScriptFailure([ 24507a092245SBram Moolenaar 'vim9script', 24517a092245SBram Moolenaar ':# something', 24527a092245SBram Moolenaar ], 'E488:') 24537a092245SBram Moolenaar CheckScriptFailure([ 24547a092245SBram Moolenaar '# something', 24557a092245SBram Moolenaar ], 'E488:') 24567a092245SBram Moolenaar CheckScriptFailure([ 24577a092245SBram Moolenaar ':# something', 24587a092245SBram Moolenaar ], 'E488:') 24597a092245SBram Moolenaar 24604a8d9f2eSBram Moolenaar { # block start 24614a8d9f2eSBram Moolenaar } # block end 24624a8d9f2eSBram Moolenaar CheckDefFailure([ 24634a8d9f2eSBram Moolenaar '{# comment', 24644a8d9f2eSBram Moolenaar ], 'E488:') 24654a8d9f2eSBram Moolenaar CheckDefFailure([ 24664a8d9f2eSBram Moolenaar '{', 24674a8d9f2eSBram Moolenaar '}# comment', 24684a8d9f2eSBram Moolenaar ], 'E488:') 24694a8d9f2eSBram Moolenaar 24704a8d9f2eSBram Moolenaar echo "yes" # comment 24714a8d9f2eSBram Moolenaar CheckDefFailure([ 24724a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24734a8d9f2eSBram Moolenaar ], 'E488:') 24747a092245SBram Moolenaar CheckScriptSuccess([ 24757a092245SBram Moolenaar 'vim9script', 24767a092245SBram Moolenaar 'echo "yes" # something', 24777a092245SBram Moolenaar ]) 24787a092245SBram Moolenaar CheckScriptFailure([ 24797a092245SBram Moolenaar 'vim9script', 24807a092245SBram Moolenaar 'echo "yes"# something', 24817a092245SBram Moolenaar ], 'E121:') 24827a092245SBram Moolenaar CheckScriptFailure([ 24837a092245SBram Moolenaar 'vim9script', 24847a092245SBram Moolenaar 'echo# something', 24857a092245SBram Moolenaar ], 'E121:') 24867a092245SBram Moolenaar CheckScriptFailure([ 24877a092245SBram Moolenaar 'echo "yes" # something', 24887a092245SBram Moolenaar ], 'E121:') 24897a092245SBram Moolenaar 24904a8d9f2eSBram Moolenaar exe "echo" # comment 24914a8d9f2eSBram Moolenaar CheckDefFailure([ 24924a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24934a8d9f2eSBram Moolenaar ], 'E488:') 24944a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24954a8d9f2eSBram Moolenaar 'vim9script', 24964a8d9f2eSBram Moolenaar 'exe "echo" # something', 24974a8d9f2eSBram Moolenaar ]) 24984a8d9f2eSBram Moolenaar CheckScriptFailure([ 24994a8d9f2eSBram Moolenaar 'vim9script', 25004a8d9f2eSBram Moolenaar 'exe "echo"# something', 25014a8d9f2eSBram Moolenaar ], 'E121:') 25024a8d9f2eSBram Moolenaar CheckDefFailure([ 25034a8d9f2eSBram Moolenaar 'exe # comment', 25044a8d9f2eSBram Moolenaar ], 'E1015:') 25054a8d9f2eSBram Moolenaar CheckScriptFailure([ 25064a8d9f2eSBram Moolenaar 'vim9script', 25074a8d9f2eSBram Moolenaar 'exe# something', 25084a8d9f2eSBram Moolenaar ], 'E121:') 25094a8d9f2eSBram Moolenaar CheckScriptFailure([ 25104a8d9f2eSBram Moolenaar 'exe "echo" # something', 25114a8d9f2eSBram Moolenaar ], 'E121:') 25124a8d9f2eSBram Moolenaar 25137a092245SBram Moolenaar CheckDefFailure([ 25147a092245SBram Moolenaar 'try# comment', 25157a092245SBram Moolenaar ' echo "yes"', 25167a092245SBram Moolenaar 'catch', 25177a092245SBram Moolenaar 'endtry', 25187a092245SBram Moolenaar ], 'E488:') 25192c5ed4e3SBram Moolenaar CheckScriptFailure([ 25202c5ed4e3SBram Moolenaar 'vim9script', 25212c5ed4e3SBram Moolenaar 'try# comment', 25222c5ed4e3SBram Moolenaar 'echo "yes"', 25232c5ed4e3SBram Moolenaar ], 'E488:') 25247a092245SBram Moolenaar CheckDefFailure([ 25257a092245SBram Moolenaar 'try', 2526a72cfb80SBram Moolenaar ' throw#comment', 2527a72cfb80SBram Moolenaar 'catch', 2528a72cfb80SBram Moolenaar 'endtry', 2529a72cfb80SBram Moolenaar ], 'E1015:') 2530a72cfb80SBram Moolenaar CheckDefFailure([ 2531a72cfb80SBram Moolenaar 'try', 2532a72cfb80SBram Moolenaar ' throw "yes"#comment', 2533a72cfb80SBram Moolenaar 'catch', 2534a72cfb80SBram Moolenaar 'endtry', 2535a72cfb80SBram Moolenaar ], 'E488:') 2536a72cfb80SBram Moolenaar CheckDefFailure([ 2537a72cfb80SBram Moolenaar 'try', 25387a092245SBram Moolenaar ' echo "yes"', 25397a092245SBram Moolenaar 'catch# comment', 25407a092245SBram Moolenaar 'endtry', 25417a092245SBram Moolenaar ], 'E488:') 25422c5ed4e3SBram Moolenaar CheckScriptFailure([ 25432c5ed4e3SBram Moolenaar 'vim9script', 25442c5ed4e3SBram Moolenaar 'try', 25452c5ed4e3SBram Moolenaar ' echo "yes"', 25462c5ed4e3SBram Moolenaar 'catch# comment', 25472c5ed4e3SBram Moolenaar 'endtry', 25482c5ed4e3SBram Moolenaar ], 'E654:') 25492c5ed4e3SBram Moolenaar CheckDefFailure([ 25502c5ed4e3SBram Moolenaar 'try', 25512c5ed4e3SBram Moolenaar ' echo "yes"', 25522c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25532c5ed4e3SBram Moolenaar 'endtry', 25542c5ed4e3SBram Moolenaar ], 'E488:') 25557a092245SBram Moolenaar CheckDefFailure([ 25567a092245SBram Moolenaar 'try', 25577a092245SBram Moolenaar 'echo "yes"', 25587a092245SBram Moolenaar 'catch', 25597a092245SBram Moolenaar 'endtry# comment', 25607a092245SBram Moolenaar ], 'E488:') 25612c5ed4e3SBram Moolenaar CheckScriptFailure([ 25622c5ed4e3SBram Moolenaar 'vim9script', 25632c5ed4e3SBram Moolenaar 'try', 25642c5ed4e3SBram Moolenaar ' echo "yes"', 25652c5ed4e3SBram Moolenaar 'catch', 25662c5ed4e3SBram Moolenaar 'endtry# comment', 25679b7bf9e9SBram Moolenaar ], 'E488:') 25682c5ed4e3SBram Moolenaar 25692c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25702c5ed4e3SBram Moolenaar 'vim9script', 25712c5ed4e3SBram Moolenaar 'hi # comment', 25722c5ed4e3SBram Moolenaar ]) 25732c5ed4e3SBram Moolenaar CheckScriptFailure([ 25742c5ed4e3SBram Moolenaar 'vim9script', 25752c5ed4e3SBram Moolenaar 'hi# comment', 25762c5ed4e3SBram Moolenaar ], 'E416:') 25771966c248SBram Moolenaar CheckScriptSuccess([ 25781966c248SBram Moolenaar 'vim9script', 25791966c248SBram Moolenaar 'hi Search # comment', 25801966c248SBram Moolenaar ]) 25811966c248SBram Moolenaar CheckScriptFailure([ 25821966c248SBram Moolenaar 'vim9script', 25831966c248SBram Moolenaar 'hi Search# comment', 25841966c248SBram Moolenaar ], 'E416:') 25851966c248SBram Moolenaar CheckScriptSuccess([ 25861966c248SBram Moolenaar 'vim9script', 25871966c248SBram Moolenaar 'hi link This Search # comment', 25881966c248SBram Moolenaar ]) 25891966c248SBram Moolenaar CheckScriptFailure([ 25901966c248SBram Moolenaar 'vim9script', 25911966c248SBram Moolenaar 'hi link This That# comment', 25921966c248SBram Moolenaar ], 'E413:') 25931966c248SBram Moolenaar CheckScriptSuccess([ 25941966c248SBram Moolenaar 'vim9script', 25951966c248SBram Moolenaar 'hi clear This # comment', 25961966c248SBram Moolenaar 'hi clear # comment', 25971966c248SBram Moolenaar ]) 2598f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2599f5be8cdbSBram Moolenaar # hi clear This# comment', 26001966c248SBram Moolenaar CheckScriptFailure([ 26011966c248SBram Moolenaar 'vim9script', 26021966c248SBram Moolenaar 'hi clear# comment', 26031966c248SBram Moolenaar ], 'E416:') 26041966c248SBram Moolenaar 26051966c248SBram Moolenaar CheckScriptSuccess([ 26061966c248SBram Moolenaar 'vim9script', 26071966c248SBram Moolenaar 'hi Group term=bold', 26081966c248SBram Moolenaar 'match Group /todo/ # comment', 26091966c248SBram Moolenaar ]) 26101966c248SBram Moolenaar CheckScriptFailure([ 26111966c248SBram Moolenaar 'vim9script', 26121966c248SBram Moolenaar 'hi Group term=bold', 26131966c248SBram Moolenaar 'match Group /todo/# comment', 26141966c248SBram Moolenaar ], 'E488:') 26151966c248SBram Moolenaar CheckScriptSuccess([ 26161966c248SBram Moolenaar 'vim9script', 26171966c248SBram Moolenaar 'match # comment', 26181966c248SBram Moolenaar ]) 26191966c248SBram Moolenaar CheckScriptFailure([ 26201966c248SBram Moolenaar 'vim9script', 26211966c248SBram Moolenaar 'match# comment', 26221966c248SBram Moolenaar ], 'E475:') 26231966c248SBram Moolenaar CheckScriptSuccess([ 26241966c248SBram Moolenaar 'vim9script', 26251966c248SBram Moolenaar 'match none # comment', 26261966c248SBram Moolenaar ]) 26271966c248SBram Moolenaar CheckScriptFailure([ 26281966c248SBram Moolenaar 'vim9script', 26291966c248SBram Moolenaar 'match none# comment', 26301966c248SBram Moolenaar ], 'E475:') 26311966c248SBram Moolenaar 26321966c248SBram Moolenaar CheckScriptSuccess([ 26331966c248SBram Moolenaar 'vim9script', 26341966c248SBram Moolenaar 'menutrans clear # comment', 26351966c248SBram Moolenaar ]) 26361966c248SBram Moolenaar CheckScriptFailure([ 26371966c248SBram Moolenaar 'vim9script', 26381966c248SBram Moolenaar 'menutrans clear# comment text', 26391966c248SBram Moolenaar ], 'E474:') 26401966c248SBram Moolenaar 26411966c248SBram Moolenaar CheckScriptSuccess([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax clear # comment', 26441966c248SBram Moolenaar ]) 26451966c248SBram Moolenaar CheckScriptFailure([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'syntax clear# comment text', 26481966c248SBram Moolenaar ], 'E28:') 26491966c248SBram Moolenaar CheckScriptSuccess([ 26501966c248SBram Moolenaar 'vim9script', 26511966c248SBram Moolenaar 'syntax keyword Word some', 26521966c248SBram Moolenaar 'syntax clear Word # comment', 26531966c248SBram Moolenaar ]) 26541966c248SBram Moolenaar CheckScriptFailure([ 26551966c248SBram Moolenaar 'vim9script', 26561966c248SBram Moolenaar 'syntax keyword Word some', 26571966c248SBram Moolenaar 'syntax clear Word# comment text', 26581966c248SBram Moolenaar ], 'E28:') 26591966c248SBram Moolenaar 26601966c248SBram Moolenaar CheckScriptSuccess([ 26611966c248SBram Moolenaar 'vim9script', 26621966c248SBram Moolenaar 'syntax list # comment', 26631966c248SBram Moolenaar ]) 26641966c248SBram Moolenaar CheckScriptFailure([ 26651966c248SBram Moolenaar 'vim9script', 26661966c248SBram Moolenaar 'syntax list# comment text', 26671966c248SBram Moolenaar ], 'E28:') 26681966c248SBram Moolenaar 26691966c248SBram Moolenaar CheckScriptSuccess([ 26701966c248SBram Moolenaar 'vim9script', 26711966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26721966c248SBram Moolenaar ]) 26731966c248SBram Moolenaar CheckScriptFailure([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26761966c248SBram Moolenaar ], 'E475:') 26771966c248SBram Moolenaar 26781966c248SBram Moolenaar CheckScriptSuccess([ 26791966c248SBram Moolenaar 'vim9script', 26801966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26811966c248SBram Moolenaar ]) 26821966c248SBram Moolenaar CheckScriptFailure([ 26831966c248SBram Moolenaar 'vim9script', 26841966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26851966c248SBram Moolenaar ], 'E789:') 26861966c248SBram Moolenaar 26871966c248SBram Moolenaar CheckScriptSuccess([ 26881966c248SBram Moolenaar 'vim9script', 26891966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26901966c248SBram Moolenaar ]) 26911966c248SBram Moolenaar CheckScriptFailure([ 26921966c248SBram Moolenaar 'vim9script', 26931966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26941966c248SBram Moolenaar ], 'E402:') 26951966c248SBram Moolenaar 26961966c248SBram Moolenaar CheckScriptSuccess([ 26971966c248SBram Moolenaar 'vim9script', 26981966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26991966c248SBram Moolenaar ]) 27001966c248SBram Moolenaar CheckScriptFailure([ 27011966c248SBram Moolenaar 'vim9script', 27021966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27031966c248SBram Moolenaar ], 'E475:') 27041966c248SBram Moolenaar CheckScriptFailure([ 27051966c248SBram Moolenaar 'vim9script', 27061966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27071966c248SBram Moolenaar ], 'E406:') 27081966c248SBram Moolenaar CheckScriptFailure([ 27091966c248SBram Moolenaar 'vim9script', 27101966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27111966c248SBram Moolenaar ], 'E475:') 27121966c248SBram Moolenaar 27131966c248SBram Moolenaar CheckScriptSuccess([ 27141966c248SBram Moolenaar 'vim9script', 27151966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27161966c248SBram Moolenaar ]) 27171966c248SBram Moolenaar CheckScriptFailure([ 27181966c248SBram Moolenaar 'vim9script', 27191966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2720d032f34aSBram Moolenaar ], 'E402:') 27211966c248SBram Moolenaar 27221966c248SBram Moolenaar CheckScriptSuccess([ 27231966c248SBram Moolenaar 'vim9script', 27241966c248SBram Moolenaar 'syntax sync # comment', 27251966c248SBram Moolenaar ]) 27261966c248SBram Moolenaar CheckScriptFailure([ 27271966c248SBram Moolenaar 'vim9script', 27281966c248SBram Moolenaar 'syntax sync# comment', 27291966c248SBram Moolenaar ], 'E404:') 27301966c248SBram Moolenaar CheckScriptSuccess([ 27311966c248SBram Moolenaar 'vim9script', 27321966c248SBram Moolenaar 'syntax sync ccomment # comment', 27331966c248SBram Moolenaar ]) 27341966c248SBram Moolenaar CheckScriptFailure([ 27351966c248SBram Moolenaar 'vim9script', 27361966c248SBram Moolenaar 'syntax sync ccomment# comment', 27371966c248SBram Moolenaar ], 'E404:') 27381966c248SBram Moolenaar 27391966c248SBram Moolenaar CheckScriptSuccess([ 27401966c248SBram Moolenaar 'vim9script', 27411966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27421966c248SBram Moolenaar ]) 27431966c248SBram Moolenaar CheckScriptFailure([ 27441966c248SBram Moolenaar 'vim9script', 27451966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27461966c248SBram Moolenaar ], 'E475:') 2747a72cfb80SBram Moolenaar 2748a72cfb80SBram Moolenaar CheckScriptSuccess([ 2749a72cfb80SBram Moolenaar 'vim9script', 2750a72cfb80SBram Moolenaar 'command Echo echo # comment', 2751a72cfb80SBram Moolenaar 'command Echo # comment', 2752a72cfb80SBram Moolenaar ]) 2753a72cfb80SBram Moolenaar CheckScriptFailure([ 2754a72cfb80SBram Moolenaar 'vim9script', 2755a72cfb80SBram Moolenaar 'command Echo echo# comment', 2756a72cfb80SBram Moolenaar 'Echo', 2757a72cfb80SBram Moolenaar ], 'E121:') 2758a72cfb80SBram Moolenaar CheckScriptFailure([ 2759a72cfb80SBram Moolenaar 'vim9script', 2760a72cfb80SBram Moolenaar 'command Echo# comment', 2761a72cfb80SBram Moolenaar ], 'E182:') 2762a72cfb80SBram Moolenaar CheckScriptFailure([ 2763a72cfb80SBram Moolenaar 'vim9script', 2764a72cfb80SBram Moolenaar 'command Echo echo', 2765a72cfb80SBram Moolenaar 'command Echo# comment', 2766a72cfb80SBram Moolenaar ], 'E182:') 2767a72cfb80SBram Moolenaar 2768a72cfb80SBram Moolenaar CheckScriptSuccess([ 2769a72cfb80SBram Moolenaar 'vim9script', 2770a72cfb80SBram Moolenaar 'function # comment', 2771a72cfb80SBram Moolenaar ]) 2772a72cfb80SBram Moolenaar CheckScriptFailure([ 2773a72cfb80SBram Moolenaar 'vim9script', 27749898107fSBram Moolenaar 'function " comment', 27759898107fSBram Moolenaar ], 'E129:') 27769898107fSBram Moolenaar CheckScriptFailure([ 27779898107fSBram Moolenaar 'vim9script', 2778a72cfb80SBram Moolenaar 'function# comment', 2779a72cfb80SBram Moolenaar ], 'E129:') 2780a72cfb80SBram Moolenaar CheckScriptSuccess([ 2781a72cfb80SBram Moolenaar 'vim9script', 2782a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2783a72cfb80SBram Moolenaar ]) 2784a72cfb80SBram Moolenaar CheckScriptFailure([ 2785a72cfb80SBram Moolenaar 'vim9script', 2786a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2787a72cfb80SBram Moolenaar ], 'E488:') 2788a72cfb80SBram Moolenaar 2789a72cfb80SBram Moolenaar CheckScriptSuccess([ 2790a72cfb80SBram Moolenaar 'vim9script', 27914c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2792a72cfb80SBram Moolenaar 'endfunc', 27934c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2794a72cfb80SBram Moolenaar ]) 2795a72cfb80SBram Moolenaar CheckScriptFailure([ 2796a72cfb80SBram Moolenaar 'vim9script', 27974c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2798a72cfb80SBram Moolenaar 'endfunc', 27994c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2800a72cfb80SBram Moolenaar ], 'E488:') 2801a72cfb80SBram Moolenaar 2802a72cfb80SBram Moolenaar CheckScriptSuccess([ 2803a72cfb80SBram Moolenaar 'vim9script', 2804a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2805a72cfb80SBram Moolenaar ]) 2806a72cfb80SBram Moolenaar CheckScriptFailure([ 2807a72cfb80SBram Moolenaar 'vim9script', 2808a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2809a72cfb80SBram Moolenaar ], 'E488:') 2810e7e4838fSBram Moolenaar 2811e7e4838fSBram Moolenaar CheckScriptFailure([ 2812e7e4838fSBram Moolenaar 'def Test() " comment', 2813e7e4838fSBram Moolenaar 'enddef', 2814e7e4838fSBram Moolenaar ], 'E488:') 2815e7e4838fSBram Moolenaar CheckScriptFailure([ 2816e7e4838fSBram Moolenaar 'vim9script', 2817e7e4838fSBram Moolenaar 'def Test() " comment', 2818e7e4838fSBram Moolenaar 'enddef', 2819e7e4838fSBram Moolenaar ], 'E488:') 2820e7e4838fSBram Moolenaar 2821e7e4838fSBram Moolenaar CheckScriptSuccess([ 2822e7e4838fSBram Moolenaar 'func Test() " comment', 2823e7e4838fSBram Moolenaar 'endfunc', 2824e7e4838fSBram Moolenaar ]) 28259898107fSBram Moolenaar CheckScriptSuccess([ 2826e7e4838fSBram Moolenaar 'vim9script', 2827e7e4838fSBram Moolenaar 'func Test() " comment', 2828e7e4838fSBram Moolenaar 'endfunc', 28299898107fSBram Moolenaar ]) 2830e7e4838fSBram Moolenaar 2831e7e4838fSBram Moolenaar CheckScriptSuccess([ 2832e7e4838fSBram Moolenaar 'def Test() # comment', 2833e7e4838fSBram Moolenaar 'enddef', 2834e7e4838fSBram Moolenaar ]) 2835e7e4838fSBram Moolenaar CheckScriptFailure([ 2836e7e4838fSBram Moolenaar 'func Test() # comment', 2837e7e4838fSBram Moolenaar 'endfunc', 2838e7e4838fSBram Moolenaar ], 'E488:') 28392c5ed4e3SBram Moolenaarenddef 28402c5ed4e3SBram Moolenaar 28412c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28422c5ed4e3SBram Moolenaar CheckCanRunGui 28432c5ed4e3SBram Moolenaar 28442c5ed4e3SBram Moolenaar CheckScriptFailure([ 28452c5ed4e3SBram Moolenaar 'vim9script', 28462c5ed4e3SBram Moolenaar 'gui#comment' 28472c5ed4e3SBram Moolenaar ], 'E499:') 28482c5ed4e3SBram Moolenaar CheckScriptFailure([ 28492c5ed4e3SBram Moolenaar 'vim9script', 28502c5ed4e3SBram Moolenaar 'gui -f#comment' 28512c5ed4e3SBram Moolenaar ], 'E499:') 28527a092245SBram Moolenaarenddef 28537a092245SBram Moolenaar 2854a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28556797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28566797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2857a26b9700SBram Moolenaar 2858a26b9700SBram Moolenaar edit test.vim 2859a26b9700SBram Moolenaar doautocmd TabEnter #comment 2860a26b9700SBram Moolenaar assert_equal(1, g:entered) 2861a26b9700SBram Moolenaar 2862a26b9700SBram Moolenaar doautocmd TabEnter f.x 2863a26b9700SBram Moolenaar assert_equal(2, g:entered) 2864a26b9700SBram Moolenaar 2865a26b9700SBram Moolenaar g:entered = 0 2866a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2867a26b9700SBram Moolenaar assert_equal(2, g:entered) 2868a26b9700SBram Moolenaar 2869a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2870a26b9700SBram Moolenaar 2871a26b9700SBram Moolenaar au! TabEnter 2872a26b9700SBram Moolenaar unlet g:entered 2873d72c1bf0SBram Moolenaar 2874d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2875d72c1bf0SBram Moolenaar 'vim9script', 28766797966dSBram Moolenaar 'g:var = 123', 2877e55b1c09SBram Moolenaar 'b:var = 456', 2878e55b1c09SBram Moolenaar 'w:var = 777', 2879e55b1c09SBram Moolenaar 't:var = 888', 2880d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2881d72c1bf0SBram Moolenaar ]) 2882d72c1bf0SBram Moolenaar 2883d72c1bf0SBram Moolenaar CheckScriptFailure([ 2884d72c1bf0SBram Moolenaar 'vim9script', 2885d72c1bf0SBram Moolenaar 'let g:var = 123', 2886e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2887e55b1c09SBram Moolenaar 2888e55b1c09SBram Moolenaar CheckScriptFailure([ 2889e55b1c09SBram Moolenaar 'vim9script', 2890e55b1c09SBram Moolenaar 'let b:var = 123', 2891e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2892e55b1c09SBram Moolenaar 2893e55b1c09SBram Moolenaar CheckScriptFailure([ 2894e55b1c09SBram Moolenaar 'vim9script', 2895e55b1c09SBram Moolenaar 'let w:var = 123', 2896e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2897e55b1c09SBram Moolenaar 2898e55b1c09SBram Moolenaar CheckScriptFailure([ 2899e55b1c09SBram Moolenaar 'vim9script', 2900e55b1c09SBram Moolenaar 'let t:var = 123', 2901e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2902e55b1c09SBram Moolenaar 2903e55b1c09SBram Moolenaar CheckScriptFailure([ 2904e55b1c09SBram Moolenaar 'vim9script', 2905e55b1c09SBram Moolenaar 'let v:version = 123', 2906e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2907e55b1c09SBram Moolenaar 2908e55b1c09SBram Moolenaar CheckScriptFailure([ 2909e55b1c09SBram Moolenaar 'vim9script', 2910e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2911e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29126797966dSBram Moolenaar 29136797966dSBram Moolenaar CheckScriptFailure([ 29146797966dSBram Moolenaar 'vim9script', 29156797966dSBram Moolenaar 'g:var = 123', 291632e35117SBram Moolenaar 'unlet g:var# comment1', 2917d72c1bf0SBram Moolenaar ], 'E108:') 2918d72c1bf0SBram Moolenaar 2919d72c1bf0SBram Moolenaar CheckScriptFailure([ 2920d72c1bf0SBram Moolenaar 'let g:var = 123', 2921d72c1bf0SBram Moolenaar 'unlet g:var # something', 2922d72c1bf0SBram Moolenaar ], 'E488:') 2923faac4104SBram Moolenaar 2924faac4104SBram Moolenaar CheckScriptSuccess([ 2925faac4104SBram Moolenaar 'vim9script', 292632e35117SBram Moolenaar 'if 1 # comment2', 2927faac4104SBram Moolenaar ' echo "yes"', 2928faac4104SBram Moolenaar 'elseif 2 #comment', 2929faac4104SBram Moolenaar ' echo "no"', 2930faac4104SBram Moolenaar 'endif', 2931faac4104SBram Moolenaar ]) 2932faac4104SBram Moolenaar 2933faac4104SBram Moolenaar CheckScriptFailure([ 2934faac4104SBram Moolenaar 'vim9script', 293532e35117SBram Moolenaar 'if 1# comment3', 2936faac4104SBram Moolenaar ' echo "yes"', 2937faac4104SBram Moolenaar 'endif', 2938faac4104SBram Moolenaar ], 'E15:') 2939faac4104SBram Moolenaar 2940faac4104SBram Moolenaar CheckScriptFailure([ 2941faac4104SBram Moolenaar 'vim9script', 294232e35117SBram Moolenaar 'if 0 # comment4', 2943faac4104SBram Moolenaar ' echo "yes"', 2944faac4104SBram Moolenaar 'elseif 2#comment', 2945faac4104SBram Moolenaar ' echo "no"', 2946faac4104SBram Moolenaar 'endif', 2947faac4104SBram Moolenaar ], 'E15:') 2948faac4104SBram Moolenaar 2949faac4104SBram Moolenaar CheckScriptSuccess([ 2950faac4104SBram Moolenaar 'vim9script', 295132e35117SBram Moolenaar 'let v = 1 # comment5', 2952faac4104SBram Moolenaar ]) 2953faac4104SBram Moolenaar 2954faac4104SBram Moolenaar CheckScriptFailure([ 2955faac4104SBram Moolenaar 'vim9script', 295632e35117SBram Moolenaar 'let v = 1# comment6', 295732e35117SBram Moolenaar ], 'E15:') 2958faac4104SBram Moolenaar 2959faac4104SBram Moolenaar CheckScriptSuccess([ 2960faac4104SBram Moolenaar 'vim9script', 2961faac4104SBram Moolenaar 'new' 2962d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2963df069eecSBram Moolenaar ':$', 2964faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2965faac4104SBram Moolenaar 'bwipe!', 2966faac4104SBram Moolenaar ]) 2967faac4104SBram Moolenaar 2968f5be8cdbSBram Moolenaar CheckScriptFailure([ 2969f5be8cdbSBram Moolenaar 'vim9script', 2970f5be8cdbSBram Moolenaar 'new' 2971d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2972f5be8cdbSBram Moolenaar ':$', 2973f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2974f5be8cdbSBram Moolenaar 'bwipe!', 2975f5be8cdbSBram Moolenaar ], 'E488:') 2976f5be8cdbSBram Moolenaar 2977f5be8cdbSBram Moolenaar CheckScriptFailure([ 2978f5be8cdbSBram Moolenaar 'vim9script', 2979f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2980f5be8cdbSBram Moolenaar ], 'E477:') 2981a26b9700SBram Moolenaarenddef 2982a26b9700SBram Moolenaar 29837e5bd91dSBram Moolenaardef Test_finish() 29847e5bd91dSBram Moolenaar let lines =<< trim END 29857e5bd91dSBram Moolenaar vim9script 29866797966dSBram Moolenaar g:res = 'one' 29877e5bd91dSBram Moolenaar if v:false | finish | endif 29886797966dSBram Moolenaar g:res = 'two' 29897e5bd91dSBram Moolenaar finish 29906797966dSBram Moolenaar g:res = 'three' 29917e5bd91dSBram Moolenaar END 29927e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29937e5bd91dSBram Moolenaar source Xfinished 29947e5bd91dSBram Moolenaar assert_equal('two', g:res) 29957e5bd91dSBram Moolenaar 29967e5bd91dSBram Moolenaar unlet g:res 29977e5bd91dSBram Moolenaar delete('Xfinished') 29987e5bd91dSBram Moolenaarenddef 29997e5bd91dSBram Moolenaar 300032e35117SBram Moolenaardef Test_let_func_call() 300132e35117SBram Moolenaar let lines =<< trim END 300232e35117SBram Moolenaar vim9script 300332e35117SBram Moolenaar func GetValue() 300432e35117SBram Moolenaar if exists('g:count') 300532e35117SBram Moolenaar let g:count += 1 300632e35117SBram Moolenaar else 300732e35117SBram Moolenaar let g:count = 1 300832e35117SBram Moolenaar endif 300932e35117SBram Moolenaar return 'this' 301032e35117SBram Moolenaar endfunc 301132e35117SBram Moolenaar let val: string = GetValue() 3012f5be8cdbSBram Moolenaar # env var is always a string 3013df671b46SBram Moolenaar let env = $TERM 301432e35117SBram Moolenaar END 301532e35117SBram Moolenaar writefile(lines, 'Xfinished') 301632e35117SBram Moolenaar source Xfinished 3017f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 301832e35117SBram Moolenaar assert_equal(1, g:count) 301932e35117SBram Moolenaar 302032e35117SBram Moolenaar unlet g:count 302132e35117SBram Moolenaar delete('Xfinished') 302232e35117SBram Moolenaarenddef 302332e35117SBram Moolenaar 302432e35117SBram Moolenaardef Test_let_missing_type() 302532e35117SBram Moolenaar let lines =<< trim END 302632e35117SBram Moolenaar vim9script 3027df671b46SBram Moolenaar let var = g:unknown 3028227a69deSBram Moolenaar END 3029822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 3030227a69deSBram Moolenaar 3031227a69deSBram Moolenaar lines =<< trim END 3032227a69deSBram Moolenaar vim9script 3033227a69deSBram Moolenaar let nr: number = 123 3034227a69deSBram Moolenaar let var = nr 3035227a69deSBram Moolenaar END 3036822ba247SBram Moolenaar CheckScriptSuccess(lines) 303732e35117SBram Moolenaarenddef 303832e35117SBram Moolenaar 3039c82a5b5dSBram Moolenaardef Test_let_declaration() 3040c82a5b5dSBram Moolenaar let lines =<< trim END 3041c82a5b5dSBram Moolenaar vim9script 3042c82a5b5dSBram Moolenaar let var: string 3043c82a5b5dSBram Moolenaar g:var_uninit = var 3044c82a5b5dSBram Moolenaar var = 'text' 3045c82a5b5dSBram Moolenaar g:var_test = var 3046f5be8cdbSBram Moolenaar # prefixing s: is optional 3047984dddbeSBram Moolenaar s:var = 'prefixed' 3048984dddbeSBram Moolenaar g:var_prefixed = s:var 3049984dddbeSBram Moolenaar 3050984dddbeSBram Moolenaar let s:other: number 3051984dddbeSBram Moolenaar other = 1234 3052984dddbeSBram Moolenaar g:other_var = other 305353b29e48SBram Moolenaar 305453b29e48SBram Moolenaar # type is inferred 305553b29e48SBram Moolenaar s:dict = {'a': 222} 305653b29e48SBram Moolenaar def GetDictVal(key: any) 305753b29e48SBram Moolenaar g:dict_val = s:dict[key] 305853b29e48SBram Moolenaar enddef 305953b29e48SBram Moolenaar GetDictVal('a') 3060c82a5b5dSBram Moolenaar END 3061c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3062c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3063c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3064984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3065984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 306653b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3067c82a5b5dSBram Moolenaar 3068c82a5b5dSBram Moolenaar unlet g:var_uninit 3069c82a5b5dSBram Moolenaar unlet g:var_test 3070984dddbeSBram Moolenaar unlet g:var_prefixed 3071984dddbeSBram Moolenaar unlet g:other_var 3072c82a5b5dSBram Moolenaarenddef 3073c82a5b5dSBram Moolenaar 3074c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3075c5b1c20bSBram Moolenaar let lines =<< trim END 3076c5b1c20bSBram Moolenaar vim9script 3077c5b1c20bSBram Moolenaar const var: string 3078c5b1c20bSBram Moolenaar END 3079c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3080c5b1c20bSBram Moolenaar 3081c5b1c20bSBram Moolenaar lines =<< trim END 3082c5b1c20bSBram Moolenaar vim9script 3083c5b1c20bSBram Moolenaar let 9var: string 3084c5b1c20bSBram Moolenaar END 3085c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3086c5b1c20bSBram Moolenaarenddef 3087c5b1c20bSBram Moolenaar 308834db91f7SBram Moolenaardef Test_let_type_check() 308934db91f7SBram Moolenaar let lines =<< trim END 309034db91f7SBram Moolenaar vim9script 309134db91f7SBram Moolenaar let var: string 309234db91f7SBram Moolenaar var = 1234 309334db91f7SBram Moolenaar END 3094451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3095984dddbeSBram Moolenaar 3096984dddbeSBram Moolenaar lines =<< trim END 3097984dddbeSBram Moolenaar vim9script 3098984dddbeSBram Moolenaar let var:string 3099984dddbeSBram Moolenaar END 3100984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3101c5b1c20bSBram Moolenaar 3102c5b1c20bSBram Moolenaar lines =<< trim END 3103c5b1c20bSBram Moolenaar vim9script 3104c5b1c20bSBram Moolenaar let var: asdf 3105c5b1c20bSBram Moolenaar END 3106c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3107a71e2633SBram Moolenaar 3108a71e2633SBram Moolenaar lines =<< trim END 3109a71e2633SBram Moolenaar vim9script 3110a71e2633SBram Moolenaar let s:l: list<number> 3111a71e2633SBram Moolenaar s:l = [] 3112a71e2633SBram Moolenaar END 3113a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3114a71e2633SBram Moolenaar 3115a71e2633SBram Moolenaar lines =<< trim END 3116a71e2633SBram Moolenaar vim9script 3117a71e2633SBram Moolenaar let s:d: dict<number> 3118a71e2633SBram Moolenaar s:d = {} 3119a71e2633SBram Moolenaar END 3120a71e2633SBram Moolenaar CheckScriptSuccess(lines) 312134db91f7SBram Moolenaarenddef 312234db91f7SBram Moolenaar 3123a5d0077eSBram Moolenaardef Test_forward_declaration() 3124a5d0077eSBram Moolenaar let lines =<< trim END 3125a5d0077eSBram Moolenaar vim9script 3126a5d0077eSBram Moolenaar def GetValue(): string 3127a5d0077eSBram Moolenaar return theVal 3128a5d0077eSBram Moolenaar enddef 3129a5d0077eSBram Moolenaar let theVal = 'something' 3130822ba247SBram Moolenaar g:initVal = GetValue() 3131a5d0077eSBram Moolenaar theVal = 'else' 3132a5d0077eSBram Moolenaar g:laterVal = GetValue() 3133a5d0077eSBram Moolenaar END 3134a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3135a5d0077eSBram Moolenaar source Xforward 3136a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3137a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3138a5d0077eSBram Moolenaar 3139a5d0077eSBram Moolenaar unlet g:initVal 3140a5d0077eSBram Moolenaar unlet g:laterVal 3141a5d0077eSBram Moolenaar delete('Xforward') 3142a5d0077eSBram Moolenaarenddef 3143a5d0077eSBram Moolenaar 31449721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 31459721fb4eSBram Moolenaar let legacy_lines =<< trim END 31469721fb4eSBram Moolenaar source Xvim9_script.vim 31479721fb4eSBram Moolenaar 31489721fb4eSBram Moolenaar call assert_false(exists('local')) 31499721fb4eSBram Moolenaar call assert_false(exists('exported')) 31509721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31519721fb4eSBram Moolenaar call assert_equal('global', global) 31529721fb4eSBram Moolenaar call assert_equal('global', g:global) 31539721fb4eSBram Moolenaar 31549721fb4eSBram Moolenaar " imported variable becomes script-local 31559721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31569721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31579721fb4eSBram Moolenaar call assert_false(exists('exported')) 31589721fb4eSBram Moolenaar 31599721fb4eSBram Moolenaar " imported function becomes script-local 31609721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31619721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31629721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31639721fb4eSBram Moolenaar END 31649721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31659721fb4eSBram Moolenaar 31669721fb4eSBram Moolenaar let vim9_lines =<< trim END 31679721fb4eSBram Moolenaar vim9script 31689721fb4eSBram Moolenaar let local = 'local' 31699721fb4eSBram Moolenaar g:global = 'global' 31709721fb4eSBram Moolenaar export let exported = 'exported' 31719721fb4eSBram Moolenaar export def GetText(): string 31729721fb4eSBram Moolenaar return 'text' 31739721fb4eSBram Moolenaar enddef 31749721fb4eSBram Moolenaar END 31759721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31769721fb4eSBram Moolenaar 31779721fb4eSBram Moolenaar source Xlegacy_script.vim 31789721fb4eSBram Moolenaar 31799721fb4eSBram Moolenaar assert_equal('global', g:global) 3180f5be8cdbSBram Moolenaar unlet g:global 31819721fb4eSBram Moolenaar 31829721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31839721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31849721fb4eSBram Moolenaarenddef 3185a5d0077eSBram Moolenaar 31867d699701SBram Moolenaarfunc Test_vim9script_not_global() 31877d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31887d699701SBram Moolenaar let vim9lines =<< trim END 31897d699701SBram Moolenaar vim9script 31907d699701SBram Moolenaar let var = 'local' 31917d699701SBram Moolenaar func TheFunc() 31927d699701SBram Moolenaar echo 'local' 31937d699701SBram Moolenaar endfunc 31947d699701SBram Moolenaar def DefFunc() 31957d699701SBram Moolenaar echo 'local' 31967d699701SBram Moolenaar enddef 31977d699701SBram Moolenaar END 31987d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31997d699701SBram Moolenaar source Xvim9script.vim 32007d699701SBram Moolenaar try 32017d699701SBram Moolenaar echo g:var 32027d699701SBram Moolenaar assert_report('did not fail') 32037d699701SBram Moolenaar catch /E121:/ 32047d699701SBram Moolenaar " caught 32057d699701SBram Moolenaar endtry 32067d699701SBram Moolenaar try 32077d699701SBram Moolenaar call TheFunc() 32087d699701SBram Moolenaar assert_report('did not fail') 32097d699701SBram Moolenaar catch /E117:/ 32107d699701SBram Moolenaar " caught 32117d699701SBram Moolenaar endtry 32127d699701SBram Moolenaar try 32137d699701SBram Moolenaar call DefFunc() 32147d699701SBram Moolenaar assert_report('did not fail') 32157d699701SBram Moolenaar catch /E117:/ 32167d699701SBram Moolenaar " caught 32177d699701SBram Moolenaar endtry 32187d699701SBram Moolenaar 321925859dd7SBram Moolenaar call delete('Xvim9script.vim') 32207d699701SBram Moolenaarendfunc 32217d699701SBram Moolenaar 3222eeb27bfeSBram Moolenaardef Test_vim9_copen() 3223eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3224eeb27bfeSBram Moolenaar copen 3225eeb27bfeSBram Moolenaar quit 3226eeb27bfeSBram Moolenaarenddef 3227eeb27bfeSBram Moolenaar 32282d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 32292d6b20d6SBram Moolenaardef Test_vim9_autoload() 32302d6b20d6SBram Moolenaar let lines =<< trim END 32312d6b20d6SBram Moolenaar vim9script 32322d6b20d6SBram Moolenaar def foo#test() 32332d6b20d6SBram Moolenaar echomsg getreg('"') 32342d6b20d6SBram Moolenaar enddef 32352d6b20d6SBram Moolenaar END 32362d6b20d6SBram Moolenaar 32372d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32382d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 32392d6b20d6SBram Moolenaar let save_rtp = &rtp 32402d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32412d6b20d6SBram Moolenaar augroup test 32422d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32432d6b20d6SBram Moolenaar augroup END 32442d6b20d6SBram Moolenaar 32452d6b20d6SBram Moolenaar normal Y 32462d6b20d6SBram Moolenaar 32472d6b20d6SBram Moolenaar augroup test 32482d6b20d6SBram Moolenaar autocmd! 32492d6b20d6SBram Moolenaar augroup END 32502d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32512d6b20d6SBram Moolenaar &rtp = save_rtp 32522d6b20d6SBram Moolenaarenddef 32532d6b20d6SBram Moolenaar 325481e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 325581e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 325681e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 325781e17fbeSBram Moolenaar let lines =<< trim END 325881e17fbeSBram Moolenaar let s:counter = 1 325981e17fbeSBram Moolenaar def s:Func() 326081e17fbeSBram Moolenaar au! CursorHold 326181e17fbeSBram Moolenaar au CursorHold * s:counter += 1 326281e17fbeSBram Moolenaar enddef 326381e17fbeSBram Moolenaar call s:Func() 326481e17fbeSBram Moolenaar doau CursorHold 326581e17fbeSBram Moolenaar call assert_equal(2, s:counter) 326681e17fbeSBram Moolenaar au! CursorHold 326781e17fbeSBram Moolenaar END 326881e17fbeSBram Moolenaar CheckScriptSuccess(lines) 326981e17fbeSBram Moolenaarenddef 327081e17fbeSBram Moolenaar 32713896a105SBram Moolenaardef Test_cmdline_win() 32723896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32733896a105SBram Moolenaar # the command line window. 32743896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32753896a105SBram Moolenaar let export_lines =<< trim END 32763896a105SBram Moolenaar vim9script 32773896a105SBram Moolenaar export let That = 'yes' 32783896a105SBram Moolenaar END 32793896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32803896a105SBram Moolenaar let import_lines =<< trim END 32813896a105SBram Moolenaar vim9script 32823896a105SBram Moolenaar import That from './Xexport.vim' 32833896a105SBram Moolenaar END 32843896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32853896a105SBram Moolenaar let save_rtp = &rtp 32863896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32873896a105SBram Moolenaar syntax on 32883896a105SBram Moolenaar augroup CmdWin 32893896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32903896a105SBram Moolenaar augroup END 32913896a105SBram Moolenaar # this will open and also close the cmdline window 32923896a105SBram Moolenaar feedkeys('q:', 'xt') 32933896a105SBram Moolenaar assert_equal('yes', g:got_there) 32943896a105SBram Moolenaar 32953896a105SBram Moolenaar augroup CmdWin 32963896a105SBram Moolenaar au! 32973896a105SBram Moolenaar augroup END 32983896a105SBram Moolenaar &rtp = save_rtp 32993896a105SBram Moolenaar delete('rtp', 'rf') 33003896a105SBram Moolenaarenddef 33013896a105SBram Moolenaar 3302e3d4685fSBram Moolenaardef Test_invalid_sid() 3303e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 330425859dd7SBram Moolenaar 3305e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3306d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3307e3d4685fSBram Moolenaar endif 3308e3d4685fSBram Moolenaar delete('Xdidit') 3309e3d4685fSBram Moolenaarenddef 3310e3d4685fSBram Moolenaar 3311585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3312585fea7bSBram Moolenaardef Test_substitute_cmd() 3313585fea7bSBram Moolenaar new 3314585fea7bSBram Moolenaar setline(1, 'something') 3315585fea7bSBram Moolenaar :substitute(some(other( 3316585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3317585fea7bSBram Moolenaar bwipe! 3318585fea7bSBram Moolenaar 3319f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3320585fea7bSBram Moolenaar let lines =<< trim END 3321585fea7bSBram Moolenaar vim9script 3322585fea7bSBram Moolenaar new 3323585fea7bSBram Moolenaar setline(1, 'something') 3324585fea7bSBram Moolenaar :substitute(some(other( 3325585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3326585fea7bSBram Moolenaar bwipe! 3327585fea7bSBram Moolenaar END 3328585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3329585fea7bSBram Moolenaar source Xvim9lines 3330585fea7bSBram Moolenaar 3331585fea7bSBram Moolenaar delete('Xvim9lines') 3332585fea7bSBram Moolenaarenddef 3333585fea7bSBram Moolenaar 33348a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3335