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 42*ba7c0d7bSBram 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 4929a86ffeSBram Moolenaar assert_equal(0, bool3) 5029a86ffeSBram Moolenaar let bool4: bool = 1 5129a86ffeSBram Moolenaar assert_equal(1, bool4) 5229a86ffeSBram Moolenaar 53*ba7c0d7bSBram Moolenaar let lines =<< trim END 54*ba7c0d7bSBram Moolenaar vim9script 55*ba7c0d7bSBram Moolenaar def GetFlag(): bool 56*ba7c0d7bSBram Moolenaar let flag: bool = 1 57*ba7c0d7bSBram Moolenaar return flag 58*ba7c0d7bSBram Moolenaar enddef 59*ba7c0d7bSBram Moolenaar let flag: bool = GetFlag() 60*ba7c0d7bSBram Moolenaar flag = 0 61*ba7c0d7bSBram Moolenaar flag = 1 62*ba7c0d7bSBram Moolenaar END 63*ba7c0d7bSBram Moolenaar CheckScriptSuccess(lines) 64*ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:') 65*ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:') 66*ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:') 67*ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:') 68*ba7c0d7bSBram Moolenaar CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:') 69*ba7c0d7bSBram Moolenaarenddef 70*ba7c0d7bSBram Moolenaar 71*ba7c0d7bSBram Moolenaardef Test_assignment() 72d2c61705SBram Moolenaar CheckDefFailure(['let x:string'], 'E1069:') 73d2c61705SBram Moolenaar CheckDefFailure(['let x:string = "x"'], 'E1069:') 74d2c61705SBram Moolenaar CheckDefFailure(['let a:string = "x"'], 'E1069:') 75d2c61705SBram Moolenaar CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 76f93c7feaSBram Moolenaar 774cdb13ceSBram Moolenaar let nr: number = 1234 78d2c61705SBram Moolenaar CheckDefFailure(['let nr: number = "asdf"'], 'E1012:') 794cdb13ceSBram Moolenaar 80b209750bSBram Moolenaar let a: number = 6 #comment 819be61bbbSBram Moolenaar assert_equal(6, a) 829be61bbbSBram Moolenaar 8342a480bfSBram Moolenaar if has('channel') 8442a480bfSBram Moolenaar let chan1: channel 85fbdd08edSBram Moolenaar let job1: job 86f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 8742a480bfSBram Moolenaar endif 88fbdd08edSBram Moolenaar if has('float') 89fbdd08edSBram Moolenaar let float1: float = 3.4 90fbdd08edSBram Moolenaar endif 915deeb3f1SBram Moolenaar let Funky1: func 925deeb3f1SBram Moolenaar let Funky2: func = function('len') 934c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 9442a480bfSBram Moolenaar 95b209750bSBram Moolenaar g:newvar = 'new' #comment 96401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 97401d9ffbSBram Moolenaar 98401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 99401d9ffbSBram Moolenaar g:existing = 'no' 100401d9ffbSBram Moolenaar assert_equal('no', g:existing) 101401d9ffbSBram Moolenaar 102b283a8a6SBram Moolenaar v:char = 'abc' 1036e587dcbSBram Moolenaar assert_equal('abc', v:char) 104b283a8a6SBram Moolenaar 105b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 1066e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 107b283a8a6SBram Moolenaar $ENVVAR = '' 1086e587dcbSBram Moolenaar 109b5ed2660SBram Moolenaar let lines =<< trim END 110b5ed2660SBram Moolenaar vim9script 111b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 112b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 113b5ed2660SBram Moolenaar $ENVVAR = '' 114b5ed2660SBram Moolenaar END 115d2c61705SBram Moolenaar CheckScriptSuccess(lines) 116b5ed2660SBram Moolenaar 117fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 118fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 119fd1823e0SBram Moolenaar s:addToMe += 222 120fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 1210bbf722aSBram Moolenaar s:newVar = 'new' 1220bbf722aSBram Moolenaar assert_equal('new', s:newVar) 123a8c17704SBram Moolenaar 124a8c17704SBram Moolenaar set ts=7 125a8c17704SBram Moolenaar &ts += 1 126a8c17704SBram Moolenaar assert_equal(8, &ts) 12780c34ca3SBram Moolenaar &ts -= 3 12880c34ca3SBram Moolenaar assert_equal(5, &ts) 12980c34ca3SBram Moolenaar &ts *= 2 13080c34ca3SBram Moolenaar assert_equal(10, &ts) 13180c34ca3SBram Moolenaar &ts /= 3 13280c34ca3SBram Moolenaar assert_equal(3, &ts) 13380c34ca3SBram Moolenaar set ts=10 13480c34ca3SBram Moolenaar &ts %= 4 13580c34ca3SBram Moolenaar assert_equal(2, &ts) 136b5ed2660SBram Moolenaar 13793ad1471SBram Moolenaar if has('float') 13893ad1471SBram Moolenaar let f100: float = 100.0 13993ad1471SBram Moolenaar f100 /= 5 14093ad1471SBram Moolenaar assert_equal(20.0, f100) 14193ad1471SBram Moolenaar 14293ad1471SBram Moolenaar let f200: float = 200.0 14393ad1471SBram Moolenaar f200 /= 5.0 14493ad1471SBram Moolenaar assert_equal(40.0, f200) 14593ad1471SBram Moolenaar 14693ad1471SBram Moolenaar CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:') 14793ad1471SBram Moolenaar endif 14893ad1471SBram Moolenaar 149b5ed2660SBram Moolenaar lines =<< trim END 150b5ed2660SBram Moolenaar &ts = 6 151b5ed2660SBram Moolenaar &ts += 3 152b5ed2660SBram Moolenaar assert_equal(9, &ts) 1532e800955SBram Moolenaar 1542e800955SBram Moolenaar &l:ts = 6 1552e800955SBram Moolenaar assert_equal(6, &ts) 1562e800955SBram Moolenaar &l:ts += 2 1572e800955SBram Moolenaar assert_equal(8, &ts) 1582e800955SBram Moolenaar 1592e800955SBram Moolenaar &g:ts = 6 1602e800955SBram Moolenaar assert_equal(6, &g:ts) 1612e800955SBram Moolenaar &g:ts += 2 1622e800955SBram Moolenaar assert_equal(8, &g:ts) 163b5ed2660SBram Moolenaar END 1642e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 165b5ed2660SBram Moolenaar 1660aae4809SBram Moolenaar CheckDefFailure(['¬ex += 3'], 'E113:') 1670aae4809SBram Moolenaar CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 1680aae4809SBram Moolenaar CheckDefFailure(['&ts = [7]'], 'E1012:') 1690aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 1700aae4809SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 1710aae4809SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 1720aae4809SBram Moolenaar CheckDefFailure(['&path += 3'], 'E1012:') 1730aae4809SBram Moolenaar CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 174cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 1750aae4809SBram Moolenaar CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 17680c34ca3SBram Moolenaar &ts = 8 177a8c17704SBram Moolenaar 1780aae4809SBram Moolenaar lines =<< trim END 1790aae4809SBram Moolenaar let save_TI = &t_TI 1800aae4809SBram Moolenaar &t_TI = '' 1810aae4809SBram Moolenaar assert_equal('', &t_TI) 1820aae4809SBram Moolenaar &t_TI = 'xxx' 1830aae4809SBram Moolenaar assert_equal('xxx', &t_TI) 1840aae4809SBram Moolenaar &t_TI = save_TI 1850aae4809SBram Moolenaar END 186*ba7c0d7bSBram Moolenaar CheckDefAndScriptSuccess(lines) 1870aae4809SBram Moolenaar 1880aae4809SBram Moolenaar CheckDefFailure(['&t_TI = 123'], 'E1012:') 1890aae4809SBram Moolenaar CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') 1900aae4809SBram Moolenaar 1910aae4809SBram Moolenaar CheckDefFailure(['let s:var = 123'], 'E1101:') 1920aae4809SBram Moolenaar CheckDefFailure(['let s:var: number'], 'E1101:') 19333afa244SBram Moolenaar 194f9b2b496SBram Moolenaar lines =<< trim END 195f9b2b496SBram Moolenaar vim9script 196f9b2b496SBram Moolenaar def SomeFunc() 197f9b2b496SBram Moolenaar s:var = 123 198f9b2b496SBram Moolenaar enddef 199f9b2b496SBram Moolenaar defcompile 200f9b2b496SBram Moolenaar END 201d2c61705SBram Moolenaar CheckScriptFailure(lines, 'E1089:') 202f9b2b496SBram Moolenaar 203a8c17704SBram Moolenaar g:inc_counter += 1 204a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 205a8c17704SBram Moolenaar 206a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 207a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 208d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 209d2c61705SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 210a8c17704SBram Moolenaar 211b5ed2660SBram Moolenaar lines =<< trim END 212b5ed2660SBram Moolenaar @c = 'areg' 213b5ed2660SBram Moolenaar @c ..= 'add' 214b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 215b5ed2660SBram Moolenaar END 2162e800955SBram Moolenaar CheckDefAndScriptSuccess(lines) 2172e800955SBram Moolenaar 218d2c61705SBram Moolenaar CheckDefFailure(['@a += "more"'], 'E1051:') 219d2c61705SBram Moolenaar CheckDefFailure(['@a += 123'], 'E1012:') 220b5ed2660SBram Moolenaar 221e69f6d04SBram Moolenaar v:errmsg = 'none' 222e69f6d04SBram Moolenaar v:errmsg ..= 'again' 223e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 224d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 225d2c61705SBram Moolenaar CheckDefFailure(['v:errmsg += 123'], 'E1012:') 22633afa244SBram Moolenaar 22733afa244SBram Moolenaar # single letter variables 22833afa244SBram Moolenaar a = 123 22933afa244SBram Moolenaar assert_equal(123, a) 23033afa244SBram Moolenaar let b: number 23133afa244SBram Moolenaar b = 123 23233afa244SBram Moolenaar assert_equal(123, b) 23333afa244SBram Moolenaar let g: number 23433afa244SBram Moolenaar g = 123 23533afa244SBram Moolenaar assert_equal(123, g) 23633afa244SBram Moolenaar let s: number 23733afa244SBram Moolenaar s = 123 23833afa244SBram Moolenaar assert_equal(123, s) 23933afa244SBram Moolenaar let t: number 24033afa244SBram Moolenaar t = 123 24133afa244SBram Moolenaar assert_equal(123, t) 24233afa244SBram Moolenaar let v: number 24333afa244SBram Moolenaar v = 123 24433afa244SBram Moolenaar assert_equal(123, v) 24533afa244SBram Moolenaar let w: number 24633afa244SBram Moolenaar w = 123 24733afa244SBram Moolenaar assert_equal(123, w) 2485deeb3f1SBram Moolenaarenddef 2495deeb3f1SBram Moolenaar 2503b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 2513b74b6b4SBram Moolenaar let lines =<< trim END 2523b74b6b4SBram Moolenaar vim9script 2533b74b6b4SBram Moolenaar 254f5be8cdbSBram Moolenaar # single character variable declarations work 2553b74b6b4SBram Moolenaar let a: string 2563b74b6b4SBram Moolenaar let b: number 2573b74b6b4SBram Moolenaar let l: list<any> 2583b74b6b4SBram Moolenaar let s: string 2593b74b6b4SBram Moolenaar let t: number 2603b74b6b4SBram Moolenaar let v: number 2613b74b6b4SBram Moolenaar let w: number 2623b74b6b4SBram Moolenaar 263f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 2643b74b6b4SBram Moolenaar a = 'script-a' 2653b74b6b4SBram Moolenaar b = 111 2663b74b6b4SBram Moolenaar l = [1, 2, 3] 2673b74b6b4SBram Moolenaar s = 'script-s' 2683b74b6b4SBram Moolenaar t = 222 2693b74b6b4SBram Moolenaar v = 333 2703b74b6b4SBram Moolenaar w = 444 2713b74b6b4SBram Moolenaar 2723b74b6b4SBram Moolenaar assert_equal('script-a', a) 2733b74b6b4SBram Moolenaar assert_equal(111, b) 2743b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2753b74b6b4SBram Moolenaar assert_equal('script-s', s) 2763b74b6b4SBram Moolenaar assert_equal(222, t) 2773b74b6b4SBram Moolenaar assert_equal(333, v) 2783b74b6b4SBram Moolenaar assert_equal(444, w) 2793b74b6b4SBram Moolenaar END 2803b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2813b74b6b4SBram Moolenaar source Xsinglechar 2823b74b6b4SBram Moolenaar delete('Xsinglechar') 2833b74b6b4SBram Moolenaarenddef 2843b74b6b4SBram Moolenaar 28584370087SBram Moolenaardef Test_assignment_list() 28684370087SBram Moolenaar let list1: list<bool> = [false, true, false] 28784370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 28884370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 28984370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 29084370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 29184370087SBram Moolenaar 29284370087SBram Moolenaar let listS: list<string> = [] 29384370087SBram Moolenaar let listN: list<number> = [] 29484370087SBram Moolenaar 29584370087SBram Moolenaar assert_equal([1, 2, 3], list2) 29684370087SBram Moolenaar list2[-1] = 99 29784370087SBram Moolenaar assert_equal([1, 2, 99], list2) 29884370087SBram Moolenaar list2[-2] = 88 29984370087SBram Moolenaar assert_equal([1, 88, 99], list2) 30084370087SBram Moolenaar list2[-3] = 77 30184370087SBram Moolenaar assert_equal([77, 88, 99], list2) 302dd29f1b0SBram Moolenaar list2 += [100] 303dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 304dd29f1b0SBram Moolenaar 305dd29f1b0SBram Moolenaar list3 += ['end'] 306dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 307dd29f1b0SBram Moolenaar 308dd29f1b0SBram Moolenaar 309d2c61705SBram Moolenaar CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 310d2c61705SBram Moolenaar CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 31184370087SBram Moolenaar 31284370087SBram Moolenaar # type becomes list<any> 31384370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 31484370087SBram Moolenaarenddef 31584370087SBram Moolenaar 316b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 317b31be3f9SBram Moolenaar let lines =<< trim END 318b31be3f9SBram Moolenaar vim9script 319b31be3f9SBram Moolenaar let v1: number 320b31be3f9SBram Moolenaar let v2: number 321b31be3f9SBram Moolenaar let v3: number 322b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 323b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 324b31be3f9SBram Moolenaar END 325d2c61705SBram Moolenaar CheckScriptSuccess(lines) 326b31be3f9SBram Moolenaarenddef 327b31be3f9SBram Moolenaar 32884370087SBram Moolenaardef Test_assignment_dict() 32984370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 33084370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 33184370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 33284370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 33374fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 33484370087SBram Moolenaar 335f5be8cdbSBram Moolenaar # overwrite 336c785b9a7SBram Moolenaar dict3['key'] = 'another' 337c785b9a7SBram Moolenaar 33858626872SBram Moolenaar # empty key can be used 33958626872SBram Moolenaar let dd = {} 34058626872SBram Moolenaar dd[""] = 6 34158626872SBram Moolenaar assert_equal({'': 6}, dd) 34284370087SBram Moolenaar 34384370087SBram Moolenaar # type becomes dict<any> 34484370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 3458e4c8c85SBram Moolenaar 3468e4c8c85SBram Moolenaar # assignment to script-local dict 3478e4c8c85SBram Moolenaar let lines =<< trim END 3488e4c8c85SBram Moolenaar vim9script 3498e4c8c85SBram Moolenaar let test: dict<any> = {} 3508e4c8c85SBram Moolenaar def FillDict(): dict<any> 3518e4c8c85SBram Moolenaar test['a'] = 43 3528e4c8c85SBram Moolenaar return test 3538e4c8c85SBram Moolenaar enddef 3548e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3558e4c8c85SBram Moolenaar END 3568e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 3578e4c8c85SBram Moolenaar 3588e4c8c85SBram Moolenaar lines =<< trim END 3598e4c8c85SBram Moolenaar vim9script 3608e4c8c85SBram Moolenaar let test: dict<any> 3618e4c8c85SBram Moolenaar def FillDict(): dict<any> 3628e4c8c85SBram Moolenaar test['a'] = 43 3638e4c8c85SBram Moolenaar return test 3648e4c8c85SBram Moolenaar enddef 3658e4c8c85SBram Moolenaar FillDict() 3668e4c8c85SBram Moolenaar END 3678e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 3682caa1594SBram Moolenaar 3692caa1594SBram Moolenaar # assignment to global dict 3702caa1594SBram Moolenaar lines =<< trim END 3712caa1594SBram Moolenaar vim9script 3722caa1594SBram Moolenaar g:test = {} 3732caa1594SBram Moolenaar def FillDict(): dict<any> 3742caa1594SBram Moolenaar g:test['a'] = 43 3752caa1594SBram Moolenaar return g:test 3762caa1594SBram Moolenaar enddef 3772caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3782caa1594SBram Moolenaar END 3792caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3802caa1594SBram Moolenaar 3812caa1594SBram Moolenaar # assignment to buffer dict 3822caa1594SBram Moolenaar lines =<< trim END 3832caa1594SBram Moolenaar vim9script 3842caa1594SBram Moolenaar b:test = {} 3852caa1594SBram Moolenaar def FillDict(): dict<any> 3862caa1594SBram Moolenaar b:test['a'] = 43 3872caa1594SBram Moolenaar return b:test 3882caa1594SBram Moolenaar enddef 3892caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3902caa1594SBram Moolenaar END 3912caa1594SBram Moolenaar call CheckScriptSuccess(lines) 39284370087SBram Moolenaarenddef 39384370087SBram Moolenaar 394d3aac291SBram Moolenaardef Test_assignment_local() 395f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 396f5be8cdbSBram Moolenaar # changed. 397d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 398d3aac291SBram Moolenaar let b:existing = 'yes' 399d3aac291SBram Moolenaar let w:existing = 'yes' 400d3aac291SBram Moolenaar let t:existing = 'yes' 401d3aac291SBram Moolenaar 402d3aac291SBram Moolenaar def Test_assignment_local_internal() 403d3aac291SBram Moolenaar b:newvar = 'new' 404d3aac291SBram Moolenaar assert_equal('new', b:newvar) 405d3aac291SBram Moolenaar assert_equal('yes', b:existing) 406d3aac291SBram Moolenaar b:existing = 'no' 407d3aac291SBram Moolenaar assert_equal('no', b:existing) 408396f3138SBram Moolenaar b:existing ..= 'NO' 409396f3138SBram Moolenaar assert_equal('noNO', b:existing) 410d3aac291SBram Moolenaar 411d3aac291SBram Moolenaar w:newvar = 'new' 412d3aac291SBram Moolenaar assert_equal('new', w:newvar) 413d3aac291SBram Moolenaar assert_equal('yes', w:existing) 414d3aac291SBram Moolenaar w:existing = 'no' 415d3aac291SBram Moolenaar assert_equal('no', w:existing) 416396f3138SBram Moolenaar w:existing ..= 'NO' 417396f3138SBram Moolenaar assert_equal('noNO', w:existing) 418d3aac291SBram Moolenaar 419d3aac291SBram Moolenaar t:newvar = 'new' 420d3aac291SBram Moolenaar assert_equal('new', t:newvar) 421d3aac291SBram Moolenaar assert_equal('yes', t:existing) 422d3aac291SBram Moolenaar t:existing = 'no' 423d3aac291SBram Moolenaar assert_equal('no', t:existing) 424396f3138SBram Moolenaar t:existing ..= 'NO' 425396f3138SBram Moolenaar assert_equal('noNO', t:existing) 426d3aac291SBram Moolenaar enddef 427d3aac291SBram Moolenaar call Test_assignment_local_internal() 428d3aac291SBram Moolenaar END 429d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 430d3aac291SBram Moolenaarenddef 431d3aac291SBram Moolenaar 4325deeb3f1SBram Moolenaardef Test_assignment_default() 433e69f6d04SBram Moolenaar 434cb711abfSBram Moolenaar # Test default values. 435e69f6d04SBram Moolenaar let thebool: bool 436e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 437e69f6d04SBram Moolenaar 438e69f6d04SBram Moolenaar let thenumber: number 439e69f6d04SBram Moolenaar assert_equal(0, thenumber) 440e69f6d04SBram Moolenaar 441e69f6d04SBram Moolenaar if has('float') 442e69f6d04SBram Moolenaar let thefloat: float 443e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 444e69f6d04SBram Moolenaar endif 445e69f6d04SBram Moolenaar 446e69f6d04SBram Moolenaar let thestring: string 447e69f6d04SBram Moolenaar assert_equal('', thestring) 448e69f6d04SBram Moolenaar 449e69f6d04SBram Moolenaar let theblob: blob 450e69f6d04SBram Moolenaar assert_equal(0z, theblob) 451e69f6d04SBram Moolenaar 4525deeb3f1SBram Moolenaar let Thefunc: func 4535deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 454e69f6d04SBram Moolenaar 455e69f6d04SBram Moolenaar let thelist: list<any> 456e69f6d04SBram Moolenaar assert_equal([], thelist) 457e69f6d04SBram Moolenaar 458e69f6d04SBram Moolenaar let thedict: dict<any> 459e69f6d04SBram Moolenaar assert_equal({}, thedict) 460e69f6d04SBram Moolenaar 4612c869deeSBram Moolenaar if has('channel') 462e69f6d04SBram Moolenaar let thejob: job 463e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 464e69f6d04SBram Moolenaar 465e69f6d04SBram Moolenaar let thechannel: channel 466e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 467c785b9a7SBram Moolenaar 468c785b9a7SBram Moolenaar if has('unix') && executable('cat') 469f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 470c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 471c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 472c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 473c785b9a7SBram Moolenaar endif 4742c869deeSBram Moolenaar endif 475585fea7bSBram Moolenaar 476585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 477585fea7bSBram Moolenaar assert_equal(5678, nr) 4788a7d6542SBram Moolenaarenddef 4798a7d6542SBram Moolenaar 48047a519a9SBram Moolenaardef Test_assignment_var_list() 48147a519a9SBram Moolenaar let v1: string 48247a519a9SBram Moolenaar let v2: string 4839af78769SBram Moolenaar let vrem: list<string> 4849af78769SBram Moolenaar [v1] = ['aaa'] 4859af78769SBram Moolenaar assert_equal('aaa', v1) 4869af78769SBram Moolenaar 48747a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 48847a519a9SBram Moolenaar assert_equal('one', v1) 48947a519a9SBram Moolenaar assert_equal('two', v2) 4909af78769SBram Moolenaar 4919af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4929af78769SBram Moolenaar assert_equal('one', v1) 4939af78769SBram Moolenaar assert_equal('two', v2) 4949af78769SBram Moolenaar assert_equal([], vrem) 4959af78769SBram Moolenaar 4969af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4979af78769SBram Moolenaar assert_equal('one', v1) 4989af78769SBram Moolenaar assert_equal('two', v2) 4999af78769SBram Moolenaar assert_equal(['three'], vrem) 5001c199f9cSBram Moolenaar 5011c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 5021c199f9cSBram Moolenaar assert_equal(3, &ts) 5031c199f9cSBram Moolenaar assert_equal(4, &sw) 5041c199f9cSBram Moolenaar set ts=8 sw=4 50547a519a9SBram Moolenaarenddef 50647a519a9SBram Moolenaar 507c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 508c7e44a7eSBram Moolenaar let lines =<< trim END 509c7e44a7eSBram Moolenaar vim9script 510c7e44a7eSBram Moolenaar def Func(): list<number> 511c7e44a7eSBram Moolenaar return [1, 2] 512c7e44a7eSBram Moolenaar enddef 513c7e44a7eSBram Moolenaar let var1: number 514c7e44a7eSBram Moolenaar let var2: number 515c7e44a7eSBram Moolenaar [var1, var2] = 516c7e44a7eSBram Moolenaar Func() 517c7e44a7eSBram Moolenaar assert_equal(1, var1) 518c7e44a7eSBram Moolenaar assert_equal(2, var2) 519c7e44a7eSBram Moolenaar let ll = 520c7e44a7eSBram Moolenaar Func() 521c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 52283144546SBram Moolenaar 52383144546SBram Moolenaar @/ = 'text' 52483144546SBram Moolenaar assert_equal('text', @/) 52583144546SBram Moolenaar @0 = 'zero' 52683144546SBram Moolenaar assert_equal('zero', @0) 52783144546SBram Moolenaar @1 = 'one' 52883144546SBram Moolenaar assert_equal('one', @1) 52983144546SBram Moolenaar @9 = 'nine' 53083144546SBram Moolenaar assert_equal('nine', @9) 53183144546SBram Moolenaar @- = 'minus' 53283144546SBram Moolenaar assert_equal('minus', @-) 53383144546SBram Moolenaar if has('clipboard_working') 53483144546SBram Moolenaar @* = 'star' 53583144546SBram Moolenaar assert_equal('star', @*) 53683144546SBram Moolenaar @+ = 'plus' 53783144546SBram Moolenaar assert_equal('plus', @+) 53883144546SBram Moolenaar endif 53995dd9f25SBram Moolenaar 54095dd9f25SBram Moolenaar let a: number = 123 54195dd9f25SBram Moolenaar assert_equal(123, a) 54295dd9f25SBram Moolenaar let s: string = 'yes' 54395dd9f25SBram Moolenaar assert_equal('yes', s) 54495dd9f25SBram Moolenaar let b: number = 42 54595dd9f25SBram Moolenaar assert_equal(42, b) 54695dd9f25SBram Moolenaar let w: number = 43 54795dd9f25SBram Moolenaar assert_equal(43, w) 54895dd9f25SBram Moolenaar let t: number = 44 54995dd9f25SBram Moolenaar assert_equal(44, t) 550c7e44a7eSBram Moolenaar END 551c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 552c7e44a7eSBram Moolenaarenddef 553c7e44a7eSBram Moolenaar 554cab27678SBram Moolenaardef Mess(): string 555cab27678SBram Moolenaar v:foldstart = 123 556cab27678SBram Moolenaar return 'xxx' 557cab27678SBram Moolenaarenddef 558cab27678SBram Moolenaar 559d72c1bf0SBram Moolenaardef Test_assignment_failure() 560d2c61705SBram Moolenaar CheckDefFailure(['let var=234'], 'E1004:') 561d2c61705SBram Moolenaar CheckDefFailure(['let var =234'], 'E1004:') 562d2c61705SBram Moolenaar CheckDefFailure(['let var= 234'], 'E1004:') 5638a7d6542SBram Moolenaar 564d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 565d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 566d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 567d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 568d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 569d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 570d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 571d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 57263be3d4bSBram Moolenaar 573d2c61705SBram Moolenaar CheckDefFailure(['let true = 1'], 'E1034:') 574d2c61705SBram Moolenaar CheckDefFailure(['let false = 1'], 'E1034:') 5758a7d6542SBram Moolenaar 576d2c61705SBram Moolenaar CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 577d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5789af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 579d2c61705SBram Moolenaar CheckDefExecFailure(['let a: number', 5809af78769SBram Moolenaar '[a] = []'], 'E1093:') 581d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5829af78769SBram Moolenaar 'let y: number', 5839af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 584d2c61705SBram Moolenaar CheckDefExecFailure(['let x: number', 5859af78769SBram Moolenaar 'let y: number', 5869af78769SBram Moolenaar 'let z: list<number>', 5879af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5889be61bbbSBram Moolenaar 589d2c61705SBram Moolenaar CheckDefFailure(['let somevar'], "E1022:") 590d2c61705SBram Moolenaar CheckDefFailure(['let &tabstop = 4'], 'E1052:') 591d2c61705SBram Moolenaar CheckDefFailure(['&g:option = 5'], 'E113:') 592d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5939be61bbbSBram Moolenaar 594d2c61705SBram Moolenaar CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 595d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5969be61bbbSBram Moolenaar 597434d72cbSBram Moolenaar if has('dnd') 598d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E1066:') 599434d72cbSBram Moolenaar else 600d2c61705SBram Moolenaar CheckDefFailure(['let @~ = 5'], 'E354:') 601d2c61705SBram Moolenaar CheckDefFailure(['@~ = 5'], 'E354:') 602434d72cbSBram Moolenaar endif 603d2c61705SBram Moolenaar CheckDefFailure(['let @a = 5'], 'E1066:') 604d2c61705SBram Moolenaar CheckDefFailure(['let @/ = "x"'], 'E1066:') 605d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 6069be61bbbSBram Moolenaar 607d2c61705SBram Moolenaar CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 608d2c61705SBram Moolenaar CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 609d2c61705SBram Moolenaar CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 610d2c61705SBram Moolenaar CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 6119be61bbbSBram Moolenaar 612d2c61705SBram Moolenaar CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 613d2c61705SBram Moolenaar CheckDefFailure(['let xnr += 4'], 'E1020:', 1) 614d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:') 615d2c61705SBram Moolenaar CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1) 616d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:') 6179be61bbbSBram Moolenaar 618d2c61705SBram Moolenaar CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 61933fa29cfSBram Moolenaar 620d2c61705SBram Moolenaar CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 621d2c61705SBram Moolenaar CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 6228a7d6542SBram Moolenaar 623d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 624d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 6258a7d6542SBram Moolenaar 626d2c61705SBram Moolenaar CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 627d2c61705SBram Moolenaar CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 62842a480bfSBram Moolenaar 629d2c61705SBram Moolenaar CheckDefFailure(['let var: dict <number>'], 'E1068:') 630d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 631cab27678SBram Moolenaar 632d2c61705SBram Moolenaar assert_fails('s/^/\=Mess()/n', 'E794:') 633d2c61705SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 63443e969d3SBram Moolenaar 635d2c61705SBram Moolenaar CheckDefFailure(['w:foo: number = 10'], 63643e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 637d2c61705SBram Moolenaar CheckDefFailure(['t:foo: bool = true'], 63843e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 639d2c61705SBram Moolenaar CheckDefFailure(['b:foo: string = "x"'], 64043e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 641d2c61705SBram Moolenaar CheckDefFailure(['g:foo: number = 123'], 64243e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 643d72c1bf0SBram Moolenaarenddef 644d72c1bf0SBram Moolenaar 645d72c1bf0SBram Moolenaardef Test_unlet() 646d72c1bf0SBram Moolenaar g:somevar = 'yes' 647d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 648d72c1bf0SBram Moolenaar unlet g:somevar 649d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 650d72c1bf0SBram Moolenaar unlet! g:somevar 651d72c1bf0SBram Moolenaar 6528436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 6538436773fSBram Moolenaar s:somevar = 'legacy' 6548436773fSBram Moolenaar assert_true(exists('s:somevar')) 6558436773fSBram Moolenaar unlet s:somevar 6568436773fSBram Moolenaar assert_false(exists('s:somevar')) 6578436773fSBram Moolenaar unlet! s:somevar 6588436773fSBram Moolenaar 659d2c61705SBram Moolenaar CheckScriptFailure([ 660d72c1bf0SBram Moolenaar 'vim9script', 661d72c1bf0SBram Moolenaar 'let svar = 123', 662d72c1bf0SBram Moolenaar 'unlet svar', 663d72c1bf0SBram Moolenaar ], 'E1081:') 664d2c61705SBram Moolenaar CheckScriptFailure([ 665d72c1bf0SBram Moolenaar 'vim9script', 666d72c1bf0SBram Moolenaar 'let svar = 123', 667d72c1bf0SBram Moolenaar 'unlet s:svar', 668d72c1bf0SBram Moolenaar ], 'E1081:') 669d2c61705SBram Moolenaar CheckScriptFailure([ 670d72c1bf0SBram Moolenaar 'vim9script', 671d72c1bf0SBram Moolenaar 'let svar = 123', 672d72c1bf0SBram Moolenaar 'def Func()', 673d72c1bf0SBram Moolenaar ' unlet svar', 674d72c1bf0SBram Moolenaar 'enddef', 675822ba247SBram Moolenaar 'defcompile', 676d72c1bf0SBram Moolenaar ], 'E1081:') 677d2c61705SBram Moolenaar CheckScriptFailure([ 678d72c1bf0SBram Moolenaar 'vim9script', 679d72c1bf0SBram Moolenaar 'let svar = 123', 680d72c1bf0SBram Moolenaar 'def Func()', 681d72c1bf0SBram Moolenaar ' unlet s:svar', 682d72c1bf0SBram Moolenaar 'enddef', 683822ba247SBram Moolenaar 'defcompile', 684d72c1bf0SBram Moolenaar ], 'E1081:') 6857bdaea6eSBram Moolenaar 6867bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6877bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6887bdaea6eSBram Moolenaar unlet $ENVVAR 6897bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 690d72c1bf0SBram Moolenaarenddef 691599c89c8SBram Moolenaar 6924c17ad94SBram Moolenaardef Test_delfunction() 693f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6944c17ad94SBram Moolenaar CheckScriptSuccess([ 6954c17ad94SBram Moolenaar 'vim9script', 6964c17ad94SBram Moolenaar 'func CheckMe()', 6974c17ad94SBram Moolenaar ' return 123', 6984c17ad94SBram Moolenaar 'endfunc', 6994c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 7004c17ad94SBram Moolenaar ]) 7014c17ad94SBram Moolenaar 702f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 7034c17ad94SBram Moolenaar CheckScriptFailure([ 7044c17ad94SBram Moolenaar 'vim9script', 7054c17ad94SBram Moolenaar 'func DeleteMe1()', 7064c17ad94SBram Moolenaar 'endfunc', 7074c17ad94SBram Moolenaar 'delfunction DeleteMe1', 7084c17ad94SBram Moolenaar ], 'E1084:') 7094c17ad94SBram Moolenaar CheckScriptFailure([ 7104c17ad94SBram Moolenaar 'vim9script', 7114c17ad94SBram Moolenaar 'func DeleteMe2()', 7124c17ad94SBram Moolenaar 'endfunc', 7134c17ad94SBram Moolenaar 'def DoThat()', 7144c17ad94SBram Moolenaar ' delfunction DeleteMe2', 7154c17ad94SBram Moolenaar 'enddef', 7164c17ad94SBram Moolenaar 'DoThat()', 7174c17ad94SBram Moolenaar ], 'E1084:') 7184c17ad94SBram Moolenaar CheckScriptFailure([ 7194c17ad94SBram Moolenaar 'vim9script', 7204c17ad94SBram Moolenaar 'def DeleteMe3()', 7214c17ad94SBram Moolenaar 'enddef', 7224c17ad94SBram Moolenaar 'delfunction DeleteMe3', 7234c17ad94SBram Moolenaar ], 'E1084:') 7244c17ad94SBram Moolenaar CheckScriptFailure([ 7254c17ad94SBram Moolenaar 'vim9script', 7264c17ad94SBram Moolenaar 'def DeleteMe4()', 7274c17ad94SBram Moolenaar 'enddef', 7284c17ad94SBram Moolenaar 'def DoThat()', 7294c17ad94SBram Moolenaar ' delfunction DeleteMe4', 7304c17ad94SBram Moolenaar 'enddef', 7314c17ad94SBram Moolenaar 'DoThat()', 7324c17ad94SBram Moolenaar ], 'E1084:') 733925e9fd6SBram Moolenaar 734925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 735925e9fd6SBram Moolenaar let lines =<< trim END 736925e9fd6SBram Moolenaar vim9script 737925e9fd6SBram Moolenaar def g:Global(): string 738925e9fd6SBram Moolenaar return "yes" 739925e9fd6SBram Moolenaar enddef 740925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 741925e9fd6SBram Moolenaar def! g:Global(): string 742925e9fd6SBram Moolenaar return "no" 743925e9fd6SBram Moolenaar enddef 744925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 745925e9fd6SBram Moolenaar delfunc g:Global 746925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 747925e9fd6SBram Moolenaar END 748925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 749925e9fd6SBram Moolenaar 750925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 751925e9fd6SBram Moolenaar lines =<< trim END 752925e9fd6SBram Moolenaar vim9script 753925e9fd6SBram Moolenaar func g:Global() 754925e9fd6SBram Moolenaar return "yes" 755925e9fd6SBram Moolenaar endfunc 756925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 757925e9fd6SBram Moolenaar def! g:Global(): string 758925e9fd6SBram Moolenaar return "no" 759925e9fd6SBram Moolenaar enddef 760925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 761925e9fd6SBram Moolenaar delfunc g:Global 762925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 763925e9fd6SBram Moolenaar END 764925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 765925e9fd6SBram Moolenaar 766925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 767925e9fd6SBram Moolenaar lines =<< trim END 768925e9fd6SBram Moolenaar vim9script 769925e9fd6SBram Moolenaar def g:Global(): string 770925e9fd6SBram Moolenaar return "yes" 771925e9fd6SBram Moolenaar enddef 772925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 773925e9fd6SBram Moolenaar func! g:Global() 774925e9fd6SBram Moolenaar return "no" 775925e9fd6SBram Moolenaar endfunc 776925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 777925e9fd6SBram Moolenaar delfunc g:Global 778925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 779925e9fd6SBram Moolenaar END 780925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 7814c17ad94SBram Moolenaarenddef 7824c17ad94SBram Moolenaar 783599c89c8SBram Moolenaarfunc Test_wrong_type() 784599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 785599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 786599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 787599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 788599c89c8SBram Moolenaar 789599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 790599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 79142a480bfSBram Moolenaar 79242a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 79342a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 79442a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 79542a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 79642a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 79742a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 79842a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 79942a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 80042a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 80142a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 80242a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 803a0a9f43aSBram Moolenaar 804a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 805a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 8068a7d6542SBram Moolenaarendfunc 8078a7d6542SBram Moolenaar 8088a7d6542SBram Moolenaarfunc Test_const() 8098a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 8108a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 8118a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 8129be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 8138a7d6542SBram Moolenaarendfunc 8148a7d6542SBram Moolenaar 815df069eecSBram Moolenaardef Test_range_no_colon() 816d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 817d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 818d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 819d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 820df069eecSBram Moolenaarenddef 821df069eecSBram Moolenaar 822df069eecSBram Moolenaar 8238a7d6542SBram Moolenaardef Test_block() 8248a7d6542SBram Moolenaar let outer = 1 8258a7d6542SBram Moolenaar { 8268a7d6542SBram Moolenaar let inner = 2 8278a7d6542SBram Moolenaar assert_equal(1, outer) 8288a7d6542SBram Moolenaar assert_equal(2, inner) 8298a7d6542SBram Moolenaar } 8308a7d6542SBram Moolenaar assert_equal(1, outer) 8318a7d6542SBram Moolenaarenddef 8328a7d6542SBram Moolenaar 8338a7d6542SBram Moolenaarfunc Test_block_failure() 8348a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 835585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 836585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 8378a7d6542SBram Moolenaarendfunc 8388a7d6542SBram Moolenaar 839d032f34aSBram Moolenaarfunc g:NoSuchFunc() 840d032f34aSBram Moolenaar echo 'none' 841d032f34aSBram Moolenaarendfunc 842d032f34aSBram Moolenaar 8438a7d6542SBram Moolenaardef Test_try_catch() 8448a7d6542SBram Moolenaar let l = [] 8457a092245SBram Moolenaar try # comment 8468a7d6542SBram Moolenaar add(l, '1') 8478a7d6542SBram Moolenaar throw 'wrong' 8488a7d6542SBram Moolenaar add(l, '2') 8497a092245SBram Moolenaar catch # comment 8508a7d6542SBram Moolenaar add(l, v:exception) 8517a092245SBram Moolenaar finally # comment 8528a7d6542SBram Moolenaar add(l, '3') 8537a092245SBram Moolenaar endtry # comment 8548a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 85568d130c6SBram Moolenaar 856e859312eSBram Moolenaar l = [] 857e859312eSBram Moolenaar try 858e859312eSBram Moolenaar try 859e859312eSBram Moolenaar add(l, '1') 860e859312eSBram Moolenaar throw 'wrong' 861e859312eSBram Moolenaar add(l, '2') 862e859312eSBram Moolenaar catch /right/ 863e859312eSBram Moolenaar add(l, v:exception) 864e859312eSBram Moolenaar endtry 865e859312eSBram Moolenaar catch /wrong/ 866e859312eSBram Moolenaar add(l, 'caught') 867e859312eSBram Moolenaar finally 868e859312eSBram Moolenaar add(l, 'finally') 869e859312eSBram Moolenaar endtry 870e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 871e859312eSBram Moolenaar 87268d130c6SBram Moolenaar let n: number 87368d130c6SBram Moolenaar try 87468d130c6SBram Moolenaar n = l[3] 87568d130c6SBram Moolenaar catch /E684:/ 87668d130c6SBram Moolenaar n = 99 87768d130c6SBram Moolenaar endtry 87868d130c6SBram Moolenaar assert_equal(99, n) 87968d130c6SBram Moolenaar 88068d130c6SBram Moolenaar try 881cc673e74SBram Moolenaar # string slice returns a string, not a number 88268d130c6SBram Moolenaar n = g:astring[3] 88356acb094SBram Moolenaar catch /E1029:/ 88468d130c6SBram Moolenaar n = 77 88568d130c6SBram Moolenaar endtry 88668d130c6SBram Moolenaar assert_equal(77, n) 88768d130c6SBram Moolenaar 88868d130c6SBram Moolenaar try 88968d130c6SBram Moolenaar n = l[g:astring] 89056acb094SBram Moolenaar catch /E1029:/ 89156acb094SBram Moolenaar n = 88 89268d130c6SBram Moolenaar endtry 89356acb094SBram Moolenaar assert_equal(88, n) 89468d130c6SBram Moolenaar 89568d130c6SBram Moolenaar try 89668d130c6SBram Moolenaar n = s:does_not_exist 89768d130c6SBram Moolenaar catch /E121:/ 898f0b9f43cSBram Moolenaar n = 111 899f0b9f43cSBram Moolenaar endtry 900f0b9f43cSBram Moolenaar assert_equal(111, n) 901f0b9f43cSBram Moolenaar 902f0b9f43cSBram Moolenaar try 903f0b9f43cSBram Moolenaar n = g:does_not_exist 904f0b9f43cSBram Moolenaar catch /E121:/ 90568d130c6SBram Moolenaar n = 121 90668d130c6SBram Moolenaar endtry 90768d130c6SBram Moolenaar assert_equal(121, n) 90868d130c6SBram Moolenaar 90968d130c6SBram Moolenaar let d = #{one: 1} 91068d130c6SBram Moolenaar try 91168d130c6SBram Moolenaar n = d[g:astring] 91268d130c6SBram Moolenaar catch /E716:/ 91368d130c6SBram Moolenaar n = 222 91468d130c6SBram Moolenaar endtry 91568d130c6SBram Moolenaar assert_equal(222, n) 916f0b9f43cSBram Moolenaar 917f0b9f43cSBram Moolenaar try 918f0b9f43cSBram Moolenaar n = -g:astring 919f0b9f43cSBram Moolenaar catch /E39:/ 920f0b9f43cSBram Moolenaar n = 233 921f0b9f43cSBram Moolenaar endtry 922f0b9f43cSBram Moolenaar assert_equal(233, n) 923f0b9f43cSBram Moolenaar 924f0b9f43cSBram Moolenaar try 925f0b9f43cSBram Moolenaar n = +g:astring 926f0b9f43cSBram Moolenaar catch /E1030:/ 927f0b9f43cSBram Moolenaar n = 244 928f0b9f43cSBram Moolenaar endtry 929f0b9f43cSBram Moolenaar assert_equal(244, n) 930f0b9f43cSBram Moolenaar 931f0b9f43cSBram Moolenaar try 932f0b9f43cSBram Moolenaar n = +g:alist 933f0b9f43cSBram Moolenaar catch /E745:/ 934f0b9f43cSBram Moolenaar n = 255 935f0b9f43cSBram Moolenaar endtry 936f0b9f43cSBram Moolenaar assert_equal(255, n) 937f0b9f43cSBram Moolenaar 938f0b9f43cSBram Moolenaar let nd: dict<any> 939f0b9f43cSBram Moolenaar try 940f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 941f0b9f43cSBram Moolenaar catch /E1029:/ 942f0b9f43cSBram Moolenaar n = 266 943f0b9f43cSBram Moolenaar endtry 944f0b9f43cSBram Moolenaar assert_equal(266, n) 945f0b9f43cSBram Moolenaar 946f0b9f43cSBram Moolenaar try 947f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 948f0b9f43cSBram Moolenaar catch /E1093:/ 949f0b9f43cSBram Moolenaar n = 277 950f0b9f43cSBram Moolenaar endtry 951f0b9f43cSBram Moolenaar assert_equal(277, n) 952f0b9f43cSBram Moolenaar 953e859312eSBram Moolenaar try 954e859312eSBram Moolenaar &ts = g:astring 955e859312eSBram Moolenaar catch /E1029:/ 956e859312eSBram Moolenaar n = 288 957e859312eSBram Moolenaar endtry 958e859312eSBram Moolenaar assert_equal(288, n) 959e859312eSBram Moolenaar 960e859312eSBram Moolenaar try 961e859312eSBram Moolenaar &backspace = 'asdf' 962e859312eSBram Moolenaar catch /E474:/ 963e859312eSBram Moolenaar n = 299 964e859312eSBram Moolenaar endtry 965e859312eSBram Moolenaar assert_equal(299, n) 966e859312eSBram Moolenaar 967e859312eSBram Moolenaar l = [1] 968e859312eSBram Moolenaar try 969e859312eSBram Moolenaar l[3] = 3 970e859312eSBram Moolenaar catch /E684:/ 971e859312eSBram Moolenaar n = 300 972e859312eSBram Moolenaar endtry 973e859312eSBram Moolenaar assert_equal(300, n) 974e859312eSBram Moolenaar 975e859312eSBram Moolenaar try 976e859312eSBram Moolenaar unlet g:does_not_exist 977e859312eSBram Moolenaar catch /E108:/ 978e859312eSBram Moolenaar n = 322 979e859312eSBram Moolenaar endtry 980e859312eSBram Moolenaar assert_equal(322, n) 981e859312eSBram Moolenaar 982e859312eSBram Moolenaar try 983e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 984e859312eSBram Moolenaar catch /E721:/ 985e859312eSBram Moolenaar n = 333 986e859312eSBram Moolenaar endtry 987e859312eSBram Moolenaar assert_equal(333, n) 988e859312eSBram Moolenaar 989e859312eSBram Moolenaar try 990e859312eSBram Moolenaar l = DeletedFunc() 991e859312eSBram Moolenaar catch /E933:/ 992e859312eSBram Moolenaar n = 344 993e859312eSBram Moolenaar endtry 994e859312eSBram Moolenaar assert_equal(344, n) 995d032f34aSBram Moolenaar 996d032f34aSBram Moolenaar try 997d032f34aSBram Moolenaar echo len(v:true) 998d032f34aSBram Moolenaar catch /E701:/ 999d032f34aSBram Moolenaar n = 355 1000d032f34aSBram Moolenaar endtry 1001d032f34aSBram Moolenaar assert_equal(355, n) 1002d032f34aSBram Moolenaar 1003d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 1004d032f34aSBram Moolenaar delfunc g:NoSuchFunc 1005d032f34aSBram Moolenaar try 1006d032f34aSBram Moolenaar echo P() 1007d032f34aSBram Moolenaar catch /E117:/ 1008d032f34aSBram Moolenaar n = 366 1009d032f34aSBram Moolenaar endtry 1010d032f34aSBram Moolenaar assert_equal(366, n) 1011d032f34aSBram Moolenaar 1012d032f34aSBram Moolenaar try 1013d032f34aSBram Moolenaar echo g:NoSuchFunc() 1014d032f34aSBram Moolenaar catch /E117:/ 1015d032f34aSBram Moolenaar n = 377 1016d032f34aSBram Moolenaar endtry 1017d032f34aSBram Moolenaar assert_equal(377, n) 1018d032f34aSBram Moolenaar 1019d032f34aSBram Moolenaar try 1020d032f34aSBram Moolenaar echo g:alist + 4 1021d032f34aSBram Moolenaar catch /E745:/ 1022d032f34aSBram Moolenaar n = 388 1023d032f34aSBram Moolenaar endtry 1024d032f34aSBram Moolenaar assert_equal(388, n) 1025d032f34aSBram Moolenaar 1026d032f34aSBram Moolenaar try 1027d032f34aSBram Moolenaar echo 4 + g:alist 1028d032f34aSBram Moolenaar catch /E745:/ 1029d032f34aSBram Moolenaar n = 399 1030d032f34aSBram Moolenaar endtry 1031d032f34aSBram Moolenaar assert_equal(399, n) 1032d032f34aSBram Moolenaar 1033d032f34aSBram Moolenaar try 1034d032f34aSBram Moolenaar echo g:alist.member 1035d032f34aSBram Moolenaar catch /E715:/ 1036d032f34aSBram Moolenaar n = 400 1037d032f34aSBram Moolenaar endtry 1038d032f34aSBram Moolenaar assert_equal(400, n) 1039d032f34aSBram Moolenaar 1040d032f34aSBram Moolenaar try 1041d032f34aSBram Moolenaar echo d.member 1042d032f34aSBram Moolenaar catch /E716:/ 1043d032f34aSBram Moolenaar n = 411 1044d032f34aSBram Moolenaar endtry 1045d032f34aSBram Moolenaar assert_equal(411, n) 10468a7d6542SBram Moolenaarenddef 10478a7d6542SBram Moolenaar 1048e859312eSBram Moolenaardef DeletedFunc(): list<any> 1049e859312eSBram Moolenaar return ['delete me'] 1050e859312eSBram Moolenaarenddef 1051e859312eSBram Moolenaardefcompile 1052e859312eSBram Moolenaardelfunc DeletedFunc 1053e859312eSBram Moolenaar 1054257cc5eeSBram Moolenaardef ThrowFromDef() 1055a72cfb80SBram Moolenaar throw "getout" # comment 1056257cc5eeSBram Moolenaarenddef 1057257cc5eeSBram Moolenaar 1058257cc5eeSBram Moolenaarfunc CatchInFunc() 1059257cc5eeSBram Moolenaar try 1060257cc5eeSBram Moolenaar call ThrowFromDef() 1061257cc5eeSBram Moolenaar catch 1062257cc5eeSBram Moolenaar let g:thrown_func = v:exception 1063257cc5eeSBram Moolenaar endtry 1064257cc5eeSBram Moolenaarendfunc 1065257cc5eeSBram Moolenaar 1066257cc5eeSBram Moolenaardef CatchInDef() 1067257cc5eeSBram Moolenaar try 1068257cc5eeSBram Moolenaar ThrowFromDef() 1069257cc5eeSBram Moolenaar catch 1070257cc5eeSBram Moolenaar g:thrown_def = v:exception 1071257cc5eeSBram Moolenaar endtry 1072257cc5eeSBram Moolenaarenddef 1073257cc5eeSBram Moolenaar 1074f575adffSBram Moolenaardef ReturnFinally(): string 1075f575adffSBram Moolenaar try 1076f575adffSBram Moolenaar return 'intry' 1077f575adffSBram Moolenaar finally 1078f575adffSBram Moolenaar g:in_finally = 'finally' 1079f575adffSBram Moolenaar endtry 1080f575adffSBram Moolenaar return 'end' 1081f575adffSBram Moolenaarenddef 1082f575adffSBram Moolenaar 1083257cc5eeSBram Moolenaardef Test_try_catch_nested() 1084257cc5eeSBram Moolenaar CatchInFunc() 1085257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1086257cc5eeSBram Moolenaar 1087257cc5eeSBram Moolenaar CatchInDef() 1088257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1089f575adffSBram Moolenaar 1090f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1091f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1092f575adffSBram Moolenaarenddef 1093f575adffSBram Moolenaar 1094f575adffSBram Moolenaardef Test_try_catch_match() 1095f575adffSBram Moolenaar let seq = 'a' 1096f575adffSBram Moolenaar try 1097f575adffSBram Moolenaar throw 'something' 1098f575adffSBram Moolenaar catch /nothing/ 1099f575adffSBram Moolenaar seq ..= 'x' 1100f575adffSBram Moolenaar catch /some/ 1101f575adffSBram Moolenaar seq ..= 'b' 1102f575adffSBram Moolenaar catch /asdf/ 1103f575adffSBram Moolenaar seq ..= 'x' 1104e8c4abbbSBram Moolenaar catch ?a\?sdf? 1105e8c4abbbSBram Moolenaar seq ..= 'y' 1106f575adffSBram Moolenaar finally 1107f575adffSBram Moolenaar seq ..= 'c' 1108f575adffSBram Moolenaar endtry 1109f575adffSBram Moolenaar assert_equal('abc', seq) 1110257cc5eeSBram Moolenaarenddef 1111257cc5eeSBram Moolenaar 1112e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1113d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 1114d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1115d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1116d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 1117d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1118d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 1119d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 1120d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1121d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 1122d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1123585fea7bSBram Moolenaar 1124d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 1125d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 1126e8c4abbbSBram Moolenaarenddef 1127e8c4abbbSBram Moolenaar 1128006ad48bSBram Moolenaardef Test_throw_vimscript() 1129f5be8cdbSBram Moolenaar # only checks line continuation 1130006ad48bSBram Moolenaar let lines =<< trim END 1131006ad48bSBram Moolenaar vim9script 1132006ad48bSBram Moolenaar try 1133006ad48bSBram Moolenaar throw 'one' 1134006ad48bSBram Moolenaar .. 'two' 1135006ad48bSBram Moolenaar catch 1136006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1137006ad48bSBram Moolenaar endtry 1138006ad48bSBram Moolenaar END 1139006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1140006ad48bSBram Moolenaarenddef 1141006ad48bSBram Moolenaar 1142ed677f55SBram Moolenaardef Test_error_in_nested_function() 1143ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1144ed677f55SBram Moolenaar let lines =<< trim END 1145ed677f55SBram Moolenaar vim9script 1146ed677f55SBram Moolenaar def Func() 1147ed677f55SBram Moolenaar Error() 1148ed677f55SBram Moolenaar g:test_var = 1 1149ed677f55SBram Moolenaar enddef 1150ed677f55SBram Moolenaar func Error() abort 1151ed677f55SBram Moolenaar eval [][0] 1152ed677f55SBram Moolenaar endfunc 1153ed677f55SBram Moolenaar Func() 1154ed677f55SBram Moolenaar END 1155ed677f55SBram Moolenaar g:test_var = 0 1156ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1157ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1158ed677f55SBram Moolenaarenddef 1159ed677f55SBram Moolenaar 116037c83711SBram Moolenaardef Test_cexpr_vimscript() 1161f5be8cdbSBram Moolenaar # only checks line continuation 116237c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 116337c83711SBram Moolenaar let lines =<< trim END 116437c83711SBram Moolenaar vim9script 116537c83711SBram Moolenaar cexpr 'File' 116637c83711SBram Moolenaar .. ' someFile' .. 116737c83711SBram Moolenaar ' line 19' 116837c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 116937c83711SBram Moolenaar END 117037c83711SBram Moolenaar CheckScriptSuccess(lines) 117137c83711SBram Moolenaar set errorformat& 117237c83711SBram Moolenaarenddef 117337c83711SBram Moolenaar 1174c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1175c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1176c9edd6b5SBram Moolenaar let lines =<< trim END 1177c9edd6b5SBram Moolenaar vim9script 1178c9edd6b5SBram Moolenaar func g:Status() 1179c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1180c9edd6b5SBram Moolenaar endfunc 1181c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1182c9edd6b5SBram Moolenaar redrawstatus 1183c9edd6b5SBram Moolenaar set laststatus statusline= 1184c9edd6b5SBram Moolenaar END 1185c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1186c9edd6b5SBram Moolenaarenddef 1187c9edd6b5SBram Moolenaar 1188b209750bSBram Moolenaardef Test_list_vimscript() 1189b209750bSBram Moolenaar # checks line continuation and comments 1190b209750bSBram Moolenaar let lines =<< trim END 1191b209750bSBram Moolenaar vim9script 1192b209750bSBram Moolenaar let mylist = [ 1193b209750bSBram Moolenaar 'one', 1194b209750bSBram Moolenaar # comment 1195b209750bSBram Moolenaar 'two', # empty line follows 1196b209750bSBram Moolenaar 1197b209750bSBram Moolenaar 'three', 1198b209750bSBram Moolenaar ] 1199b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1200b209750bSBram Moolenaar END 1201b209750bSBram Moolenaar CheckScriptSuccess(lines) 120266250c93SBram Moolenaar 120366250c93SBram Moolenaar # check all lines from heredoc are kept 120466250c93SBram Moolenaar lines =<< trim END 120566250c93SBram Moolenaar # comment 1 120666250c93SBram Moolenaar two 120766250c93SBram Moolenaar # comment 3 120866250c93SBram Moolenaar 120966250c93SBram Moolenaar five 121066250c93SBram Moolenaar # comment 6 121166250c93SBram Moolenaar END 121266250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 1213b209750bSBram Moolenaarenddef 1214b209750bSBram Moolenaar 12152a1381c3SBram Moolenaarif has('channel') 121640ee466cSBram Moolenaar let someJob = test_null_job() 121740ee466cSBram Moolenaar 121840ee466cSBram Moolenaar def FuncWithError() 121940ee466cSBram Moolenaar echomsg g:someJob 122040ee466cSBram Moolenaar enddef 122140ee466cSBram Moolenaar 122240ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 122340ee466cSBram Moolenaar try 122440ee466cSBram Moolenaar call FuncWithError() 122540ee466cSBram Moolenaar catch 122640ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 122740ee466cSBram Moolenaar endtry 122840ee466cSBram Moolenaar endfunc 12292a1381c3SBram Moolenaarendif 123040ee466cSBram Moolenaar 12318a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 12328a7d6542SBram Moolenaar vim9script 12338a7d6542SBram Moolenaar let name: string = 'bob' 12348a7d6542SBram Moolenaar def Concat(arg: string): string 12358a7d6542SBram Moolenaar return name .. arg 12368a7d6542SBram Moolenaar enddef 1237227a69deSBram Moolenaar g:result = Concat('bie') 1238227a69deSBram Moolenaar g:localname = name 12398a7d6542SBram Moolenaar 12408a7d6542SBram Moolenaar export const CONST = 1234 12418a7d6542SBram Moolenaar export let exported = 9876 12426e587dcbSBram Moolenaar export let exp_name = 'John' 12438a7d6542SBram Moolenaar export def Exported(): string 12448a7d6542SBram Moolenaar return 'Exported' 12458a7d6542SBram Moolenaar enddef 12468a7d6542SBram MoolenaarEND 12478a7d6542SBram Moolenaar 1248b3ca9824SBram Moolenaardef Undo_export_script_lines() 1249b3ca9824SBram Moolenaar unlet g:result 1250b3ca9824SBram Moolenaar unlet g:localname 1251b3ca9824SBram Moolenaarenddef 1252b3ca9824SBram Moolenaar 12535269bd2aSBram Moolenaardef Test_vim9_import_export() 12548a7d6542SBram Moolenaar let import_script_lines =<< trim END 12558a7d6542SBram Moolenaar vim9script 12568a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 12578a7d6542SBram Moolenaar g:imported = exported 12586e587dcbSBram Moolenaar exported += 3 12596e587dcbSBram Moolenaar g:imported_added = exported 12608a7d6542SBram Moolenaar g:imported_func = Exported() 12616e587dcbSBram Moolenaar 126240f4f7a4SBram Moolenaar def GetExported(): string 126340f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 126440f4f7a4SBram Moolenaar return local_dict.ref() 126540f4f7a4SBram Moolenaar enddef 126640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 126740f4f7a4SBram Moolenaar 12686e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 12696e587dcbSBram Moolenaar g:imported_name = exp_name 12706e587dcbSBram Moolenaar exp_name ..= ' Doe' 12716e587dcbSBram Moolenaar g:imported_name_appended = exp_name 12725381c7a1SBram Moolenaar g:imported_later = exported 12738a7d6542SBram Moolenaar END 12748a7d6542SBram Moolenaar 12758a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 12768a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 12778a7d6542SBram Moolenaar 12788a7d6542SBram Moolenaar source Ximport.vim 12798a7d6542SBram Moolenaar 12808a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 12818a7d6542SBram Moolenaar assert_equal('bob', g:localname) 12828a7d6542SBram Moolenaar assert_equal(9876, g:imported) 12836e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 12845381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 12858a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 128640f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 12876e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 12886e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 12898a7d6542SBram Moolenaar assert_false(exists('g:name')) 12908a7d6542SBram Moolenaar 1291b3ca9824SBram Moolenaar Undo_export_script_lines() 12928a7d6542SBram Moolenaar unlet g:imported 12936e587dcbSBram Moolenaar unlet g:imported_added 12945381c7a1SBram Moolenaar unlet g:imported_later 12958a7d6542SBram Moolenaar unlet g:imported_func 12966e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 12978a7d6542SBram Moolenaar delete('Ximport.vim') 1298f2d5c240SBram Moolenaar 12991c991144SBram Moolenaar # similar, with line breaks 13001c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 13011c991144SBram Moolenaar vim9script 13021c991144SBram Moolenaar import { 13031c991144SBram Moolenaar exported, 13041c991144SBram Moolenaar Exported, 13051c991144SBram Moolenaar } 13061c991144SBram Moolenaar from 13071c991144SBram Moolenaar './Xexport.vim' 13081c991144SBram Moolenaar g:imported = exported 13091c991144SBram Moolenaar exported += 5 13101c991144SBram Moolenaar g:imported_added = exported 13111c991144SBram Moolenaar g:imported_func = Exported() 13121c991144SBram Moolenaar END 13131c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 13141c991144SBram Moolenaar source Ximport_lbr.vim 13151c991144SBram Moolenaar 13161c991144SBram Moolenaar assert_equal(9876, g:imported) 13171c991144SBram Moolenaar assert_equal(9881, g:imported_added) 13181c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 13191c991144SBram Moolenaar 13201c991144SBram Moolenaar # exported script not sourced again 13211c991144SBram Moolenaar assert_false(exists('g:result')) 13221c991144SBram Moolenaar unlet g:imported 13231c991144SBram Moolenaar unlet g:imported_added 13241c991144SBram Moolenaar unlet g:imported_func 13251c991144SBram Moolenaar delete('Ximport_lbr.vim') 13261c991144SBram Moolenaar 13271c991144SBram Moolenaar # import inside :def function 13285381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 13295381c7a1SBram Moolenaar vim9script 13305381c7a1SBram Moolenaar def ImportInDef() 13315381c7a1SBram Moolenaar import exported from './Xexport.vim' 13325381c7a1SBram Moolenaar g:imported = exported 13335381c7a1SBram Moolenaar exported += 7 13345381c7a1SBram Moolenaar g:imported_added = exported 13355381c7a1SBram Moolenaar enddef 13365381c7a1SBram Moolenaar ImportInDef() 13375381c7a1SBram Moolenaar END 13385381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 13395381c7a1SBram Moolenaar source Ximport2.vim 1340f5be8cdbSBram Moolenaar # TODO: this should be 9879 13415381c7a1SBram Moolenaar assert_equal(9876, g:imported) 13425381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 13435381c7a1SBram Moolenaar unlet g:imported 13445381c7a1SBram Moolenaar unlet g:imported_added 13455381c7a1SBram Moolenaar delete('Ximport2.vim') 13465381c7a1SBram Moolenaar 1347f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1348f2d5c240SBram Moolenaar vim9script 1349f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1350f2d5c240SBram Moolenaar def UseExport() 1351f2d5c240SBram Moolenaar g:imported = Export.exported 1352f2d5c240SBram Moolenaar enddef 1353f2d5c240SBram Moolenaar UseExport() 1354f2d5c240SBram Moolenaar END 1355f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1356f2d5c240SBram Moolenaar source Ximport.vim 13575381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1358f2d5c240SBram Moolenaar 1359599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1360599c89c8SBram Moolenaar vim9script 1361599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1362599c89c8SBram Moolenaar def Func() 1363599c89c8SBram Moolenaar let dummy = 1 1364599c89c8SBram Moolenaar let imported = Export + dummy 1365599c89c8SBram Moolenaar enddef 1366822ba247SBram Moolenaar defcompile 1367599c89c8SBram Moolenaar END 1368599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 136944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1370599c89c8SBram Moolenaar 1371599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1372599c89c8SBram Moolenaar vim9script 1373599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1374599c89c8SBram Moolenaar def Func() 1375599c89c8SBram Moolenaar let imported = Export . exported 1376599c89c8SBram Moolenaar enddef 1377822ba247SBram Moolenaar defcompile 1378599c89c8SBram Moolenaar END 1379599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 138044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1381599c89c8SBram Moolenaar 1382599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1383599c89c8SBram Moolenaar vim9script 1384599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1385599c89c8SBram Moolenaar def Func() 1386599c89c8SBram Moolenaar let imported = Export. 1387599c89c8SBram Moolenaar enddef 1388822ba247SBram Moolenaar defcompile 1389599c89c8SBram Moolenaar END 1390599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 139144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1392599c89c8SBram Moolenaar 13931c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 13941c991144SBram Moolenaar vim9script 13951c991144SBram Moolenaar import * 13961c991144SBram Moolenaar as Export 13971c991144SBram Moolenaar from 13981c991144SBram Moolenaar './Xexport.vim' 13991c991144SBram Moolenaar def UseExport() 14001c991144SBram Moolenaar g:imported = Export.exported 14011c991144SBram Moolenaar enddef 14021c991144SBram Moolenaar UseExport() 14031c991144SBram Moolenaar END 14041c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 14051c991144SBram Moolenaar source Ximport.vim 14061c991144SBram Moolenaar assert_equal(9883, g:imported) 14071c991144SBram Moolenaar 1408f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1409f2d5c240SBram Moolenaar vim9script 1410f2d5c240SBram Moolenaar import * from './Xexport.vim' 1411f2d5c240SBram Moolenaar END 1412f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 141344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1414f2d5c240SBram Moolenaar 1415f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1416fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1417fa29c8abSBram Moolenaar vim9script 1418fa29c8abSBram Moolenaar import name from './Xexport.vim' 1419fa29c8abSBram Moolenaar END 1420fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 142144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1422fa29c8abSBram Moolenaar 1423f5be8cdbSBram Moolenaar # try to import something that is already defined 14245269bd2aSBram Moolenaar let import_already_defined =<< trim END 14255269bd2aSBram Moolenaar vim9script 14265269bd2aSBram Moolenaar let exported = 'something' 14275269bd2aSBram Moolenaar import exported from './Xexport.vim' 14285269bd2aSBram Moolenaar END 14295269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 143044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14315269bd2aSBram Moolenaar 1432f5be8cdbSBram Moolenaar # try to import something that is already defined 14335269bd2aSBram Moolenaar import_already_defined =<< trim END 14345269bd2aSBram Moolenaar vim9script 14355269bd2aSBram Moolenaar let exported = 'something' 14365269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 14375269bd2aSBram Moolenaar END 14385269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 143944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14405269bd2aSBram Moolenaar 1441f5be8cdbSBram Moolenaar # try to import something that is already defined 14425269bd2aSBram Moolenaar import_already_defined =<< trim END 14435269bd2aSBram Moolenaar vim9script 14445269bd2aSBram Moolenaar let exported = 'something' 14455269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 14465269bd2aSBram Moolenaar END 14475269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 144844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 14495269bd2aSBram Moolenaar 1450f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1451fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1452fa29c8abSBram Moolenaar vim9script 1453fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1454fa29c8abSBram Moolenaar END 1455fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 145644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1457fa29c8abSBram Moolenaar 1458fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1459fa29c8abSBram Moolenaar vim9script 1460fa29c8abSBram Moolenaar import name './Xexport.vim' 1461fa29c8abSBram Moolenaar END 1462fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 146344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1464fa29c8abSBram Moolenaar 1465fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1466fa29c8abSBram Moolenaar vim9script 1467fa29c8abSBram Moolenaar import name from Xexport.vim 1468fa29c8abSBram Moolenaar END 1469fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 147044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1471fa29c8abSBram Moolenaar 1472fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1473fa29c8abSBram Moolenaar vim9script 1474fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1475fa29c8abSBram Moolenaar END 1476fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 147744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1478fa29c8abSBram Moolenaar 1479fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1480fa29c8abSBram Moolenaar vim9script 1481fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1482fa29c8abSBram Moolenaar END 14835269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 148444d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1485fa29c8abSBram Moolenaar 1486f2d5c240SBram Moolenaar delete('Ximport.vim') 14875269bd2aSBram Moolenaar delete('Ximport3.vim') 14888a7d6542SBram Moolenaar delete('Xexport.vim') 14898a7d6542SBram Moolenaar 1490f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1491750802b5SBram Moolenaar set cpo&vi 1492750802b5SBram Moolenaar let cpo_before = &cpo 1493750802b5SBram Moolenaar let lines =<< trim END 1494750802b5SBram Moolenaar vim9script 1495750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1496750802b5SBram Moolenaar END 1497750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1498750802b5SBram Moolenaar source Xvim9_script 1499750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1500750802b5SBram Moolenaar set cpo&vim 1501750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1502750802b5SBram Moolenaar delete('Xvim9_script') 1503750802b5SBram Moolenaarenddef 1504750802b5SBram Moolenaar 1505803af686SBram Moolenaarfunc g:Trigger() 1506803af686SBram Moolenaar source Ximport.vim 1507803af686SBram Moolenaar return "echo 'yes'\<CR>" 1508803af686SBram Moolenaarendfunc 1509803af686SBram Moolenaar 1510803af686SBram Moolenaardef Test_import_export_expr_map() 1511803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1512803af686SBram Moolenaar let export_lines =<< trim END 1513803af686SBram Moolenaar vim9script 1514803af686SBram Moolenaar export def That(): string 1515803af686SBram Moolenaar return 'yes' 1516803af686SBram Moolenaar enddef 1517803af686SBram Moolenaar END 1518803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1519803af686SBram Moolenaar 1520803af686SBram Moolenaar let import_lines =<< trim END 1521803af686SBram Moolenaar vim9script 1522803af686SBram Moolenaar import That from './Xexport_that.vim' 1523803af686SBram Moolenaar assert_equal('yes', That()) 1524803af686SBram Moolenaar END 1525803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1526803af686SBram Moolenaar 1527803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1528803af686SBram Moolenaar feedkeys('trigger', "xt") 1529803af686SBram Moolenaar 1530730b2483SBram Moolenaar delete('Xexport_that.vim') 1531803af686SBram Moolenaar delete('Ximport.vim') 1532803af686SBram Moolenaar nunmap trigger 1533803af686SBram Moolenaarenddef 1534803af686SBram Moolenaar 15358e1986e3SBram Moolenaardef Test_import_in_filetype() 15368e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15378e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 15388e1986e3SBram Moolenaar let export_lines =<< trim END 15398e1986e3SBram Moolenaar vim9script 15408e1986e3SBram Moolenaar export let That = 'yes' 15418e1986e3SBram Moolenaar END 1542730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15438e1986e3SBram Moolenaar 15448e1986e3SBram Moolenaar let import_lines =<< trim END 15458e1986e3SBram Moolenaar vim9script 1546730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15478e1986e3SBram Moolenaar assert_equal('yes', That) 15488e1986e3SBram Moolenaar g:did_load_mytpe = 1 15498e1986e3SBram Moolenaar END 15508e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15518e1986e3SBram Moolenaar 15528e1986e3SBram Moolenaar let save_rtp = &rtp 15538e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15548e1986e3SBram Moolenaar 15558e1986e3SBram Moolenaar filetype plugin on 15568e1986e3SBram Moolenaar copen 15578e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15588e1986e3SBram Moolenaar 15598e1986e3SBram Moolenaar quit! 1560730b2483SBram Moolenaar delete('Xexport_ft.vim') 15618e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15628e1986e3SBram Moolenaar &rtp = save_rtp 15638e1986e3SBram Moolenaarenddef 15648e1986e3SBram Moolenaar 1565efa94447SBram Moolenaardef Test_use_import_in_mapping() 1566efa94447SBram Moolenaar let lines =<< trim END 1567efa94447SBram Moolenaar vim9script 1568efa94447SBram Moolenaar export def Funcx() 1569efa94447SBram Moolenaar g:result = 42 1570efa94447SBram Moolenaar enddef 1571efa94447SBram Moolenaar END 1572efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1573efa94447SBram Moolenaar lines =<< trim END 1574efa94447SBram Moolenaar vim9script 1575efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1576b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1577efa94447SBram Moolenaar END 1578efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1579efa94447SBram Moolenaar 1580efa94447SBram Moolenaar source Xmapscript.vim 1581b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1582efa94447SBram Moolenaar assert_equal(42, g:result) 1583efa94447SBram Moolenaar 1584efa94447SBram Moolenaar unlet g:result 1585efa94447SBram Moolenaar delete('XsomeExport.vim') 1586efa94447SBram Moolenaar delete('Xmapscript.vim') 1587b3ca9824SBram Moolenaar nunmap <F3> 1588efa94447SBram Moolenaarenddef 1589efa94447SBram Moolenaar 1590750802b5SBram Moolenaardef Test_vim9script_fails() 15918a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15928a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1593750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 15949721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 15959b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1596750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1597750802b5SBram Moolenaar 1598451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1599c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1600c785b9a7SBram Moolenaar 1601e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1602e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16038a7d6542SBram Moolenaarenddef 16048a7d6542SBram Moolenaar 1605f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1606101f4810SBram Moolenaar CheckRunVimInTerminal 1607101f4810SBram Moolenaar 16089bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1609c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16109bb3eb3eSBram Moolenaarendfunc 16119bb3eb3eSBram Moolenaar 1612c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1613101f4810SBram Moolenaar let export =<< trim END 1614101f4810SBram Moolenaar vim9script 1615101f4810SBram Moolenaar export def Foo(): number 1616101f4810SBram Moolenaar return 0 1617101f4810SBram Moolenaar enddef 1618101f4810SBram Moolenaar END 1619730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1620101f4810SBram Moolenaar 1621730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 16229bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16239bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1624101f4810SBram Moolenaar 1625730b2483SBram Moolenaar delete('XexportCmd.vim') 16269bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16279bb3eb3eSBram Moolenaarenddef 1628101f4810SBram Moolenaar 16294c17ad94SBram Moolenaardef Test_vim9script_reload_import() 16308a7d6542SBram Moolenaar let lines =<< trim END 16318a7d6542SBram Moolenaar vim9script 16328a7d6542SBram Moolenaar const var = '' 16338a7d6542SBram Moolenaar let valone = 1234 16348a7d6542SBram Moolenaar def MyFunc(arg: string) 16358a7d6542SBram Moolenaar valone = 5678 16368a7d6542SBram Moolenaar enddef 16378a7d6542SBram Moolenaar END 16388a7d6542SBram Moolenaar let morelines =<< trim END 16398a7d6542SBram Moolenaar let valtwo = 222 16408a7d6542SBram Moolenaar export def GetValtwo(): number 16418a7d6542SBram Moolenaar return valtwo 16428a7d6542SBram Moolenaar enddef 16438a7d6542SBram Moolenaar END 164403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16458a7d6542SBram Moolenaar source Xreload.vim 16468a7d6542SBram Moolenaar source Xreload.vim 16478a7d6542SBram Moolenaar source Xreload.vim 16488a7d6542SBram Moolenaar 16498a7d6542SBram Moolenaar let testlines =<< trim END 16508a7d6542SBram Moolenaar vim9script 16518a7d6542SBram Moolenaar def TheFunc() 16528a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16538a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16548a7d6542SBram Moolenaar enddef 16558a7d6542SBram Moolenaar TheFunc() 16568a7d6542SBram Moolenaar END 16578a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16588a7d6542SBram Moolenaar source Ximport.vim 16598a7d6542SBram Moolenaar 1660f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1661f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16628a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16638a7d6542SBram Moolenaar source Ximport.vim 16648a7d6542SBram Moolenaar 1665f5be8cdbSBram Moolenaar # cannot declare a var twice 16668a7d6542SBram Moolenaar lines =<< trim END 16678a7d6542SBram Moolenaar vim9script 16688a7d6542SBram Moolenaar let valone = 1234 16698a7d6542SBram Moolenaar let valone = 5678 16708a7d6542SBram Moolenaar END 16718a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 167244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16738a7d6542SBram Moolenaar 16748a7d6542SBram Moolenaar delete('Xreload.vim') 16758a7d6542SBram Moolenaar delete('Ximport.vim') 16768a7d6542SBram Moolenaarenddef 16778a7d6542SBram Moolenaar 167895006e3dSBram Moolenaardef s:RetSome(): string 167995006e3dSBram Moolenaar return 'some' 168095006e3dSBram Moolenaarenddef 168195006e3dSBram Moolenaar 1682fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1683fe465a01SBram Moolenaar" script-local name. 1684fe465a01SBram Moolenaardef Test_vim9script_funcref() 1685fe465a01SBram Moolenaar let sortlines =<< trim END 1686fe465a01SBram Moolenaar vim9script 1687fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1688bed36b93SBram Moolenaar return i2 - i1 1689fe465a01SBram Moolenaar enddef 1690fe465a01SBram Moolenaar 1691fe465a01SBram Moolenaar export def FastSort(): list<number> 1692fe465a01SBram Moolenaar return range(5)->sort(Compare) 1693fe465a01SBram Moolenaar enddef 1694fe465a01SBram Moolenaar END 1695fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1696fe465a01SBram Moolenaar 1697fe465a01SBram Moolenaar let lines =<< trim END 1698fe465a01SBram Moolenaar vim9script 1699fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1700fe465a01SBram Moolenaar def Test() 1701fe465a01SBram Moolenaar g:result = FastSort() 1702fe465a01SBram Moolenaar enddef 1703fe465a01SBram Moolenaar Test() 1704fe465a01SBram Moolenaar END 1705fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1706fe465a01SBram Moolenaar 1707fe465a01SBram Moolenaar source Xscript.vim 1708fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1709fe465a01SBram Moolenaar 1710fe465a01SBram Moolenaar unlet g:result 1711fe465a01SBram Moolenaar delete('Xsort.vim') 1712fe465a01SBram Moolenaar delete('Xscript.vim') 171395006e3dSBram Moolenaar 171495006e3dSBram Moolenaar let Funcref = function('s:RetSome') 171595006e3dSBram Moolenaar assert_equal('some', Funcref()) 1716fe465a01SBram Moolenaarenddef 1717fe465a01SBram Moolenaar 1718601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1719601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1720601e76acSBram Moolenaar" function reference. 1721c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1722c620c055SBram Moolenaar let filterLines =<< trim END 1723c620c055SBram Moolenaar vim9script 1724c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1725c620c055SBram Moolenaar return idx % 2 == 1 1726c620c055SBram Moolenaar enddef 1727c620c055SBram Moolenaar export def FastFilter(): list<number> 1728c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1729c620c055SBram Moolenaar enddef 1730601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1731601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1732601e76acSBram Moolenaar enddef 1733c620c055SBram Moolenaar END 1734c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1735c620c055SBram Moolenaar 1736c620c055SBram Moolenaar let lines =<< trim END 1737c620c055SBram Moolenaar vim9script 1738601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1739c620c055SBram Moolenaar def Test() 1740c620c055SBram Moolenaar let x: list<number> = FastFilter() 1741c620c055SBram Moolenaar enddef 1742c620c055SBram Moolenaar Test() 1743601e76acSBram Moolenaar def TestDirect() 1744601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1745601e76acSBram Moolenaar enddef 1746601e76acSBram Moolenaar TestDirect() 1747c620c055SBram Moolenaar END 1748601e76acSBram Moolenaar CheckScriptSuccess(lines) 1749c620c055SBram Moolenaar delete('Xfilter.vim') 1750c620c055SBram Moolenaarenddef 1751c620c055SBram Moolenaar 17524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 17534c17ad94SBram Moolenaar let first_lines =<< trim END 17544c17ad94SBram Moolenaar vim9script 17554c17ad94SBram Moolenaar def FuncYes(): string 17564c17ad94SBram Moolenaar return 'yes' 17574c17ad94SBram Moolenaar enddef 17584c17ad94SBram Moolenaar END 175903afdcf1SBram Moolenaar let withno_lines =<< trim END 17604c17ad94SBram Moolenaar def FuncNo(): string 17614c17ad94SBram Moolenaar return 'no' 17624c17ad94SBram Moolenaar enddef 17634c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17644c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17654c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 176603afdcf1SBram Moolenaar enddef 176703afdcf1SBram Moolenaar END 176803afdcf1SBram Moolenaar let nono_lines =<< trim END 176903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 177003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 177144d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17724c17ad94SBram Moolenaar enddef 17734c17ad94SBram Moolenaar END 17744c17ad94SBram Moolenaar 17754c17ad94SBram Moolenaar # FuncNo() is defined 177603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17774c17ad94SBram Moolenaar source Xreloaded.vim 17784c17ad94SBram Moolenaar g:DoCheck(true) 17794c17ad94SBram Moolenaar 17804c17ad94SBram Moolenaar # FuncNo() is not redefined 178103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17824c17ad94SBram Moolenaar source Xreloaded.vim 178303afdcf1SBram Moolenaar g:DoCheck() 17844c17ad94SBram Moolenaar 17854c17ad94SBram Moolenaar # FuncNo() is back 178603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17874c17ad94SBram Moolenaar source Xreloaded.vim 178803afdcf1SBram Moolenaar g:DoCheck() 17894c17ad94SBram Moolenaar 17904c17ad94SBram Moolenaar delete('Xreloaded.vim') 17914c17ad94SBram Moolenaarenddef 17924c17ad94SBram Moolenaar 179389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 179489483d40SBram Moolenaar # write the script with a script-local variable 179589483d40SBram Moolenaar let lines =<< trim END 179689483d40SBram Moolenaar vim9script 179789483d40SBram Moolenaar let var = 'string' 179889483d40SBram Moolenaar END 179989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 180089483d40SBram Moolenaar source XreloadVar.vim 180189483d40SBram Moolenaar 180289483d40SBram Moolenaar # now write the script using the same variable locally - works 180389483d40SBram Moolenaar lines =<< trim END 180489483d40SBram Moolenaar vim9script 180589483d40SBram Moolenaar def Func() 180689483d40SBram Moolenaar let var = 'string' 180789483d40SBram Moolenaar enddef 180889483d40SBram Moolenaar END 180989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 181089483d40SBram Moolenaar source XreloadVar.vim 181189483d40SBram Moolenaar 181289483d40SBram Moolenaar delete('XreloadVar.vim') 181389483d40SBram Moolenaarenddef 181489483d40SBram Moolenaar 18158a7d6542SBram Moolenaardef Test_import_absolute() 18168a7d6542SBram Moolenaar let import_lines = [ 1817e6085c53SBram Moolenaar 'vim9script', 1818e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1819e6085c53SBram Moolenaar 'def UseExported()', 1820e6085c53SBram Moolenaar ' g:imported_abs = exported', 1821e6085c53SBram Moolenaar ' exported = 8888', 1822e6085c53SBram Moolenaar ' g:imported_after = exported', 1823e6085c53SBram Moolenaar 'enddef', 1824e6085c53SBram Moolenaar 'UseExported()', 1825e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1826e6085c53SBram Moolenaar ] 18278a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18288a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18298a7d6542SBram Moolenaar 18308a7d6542SBram Moolenaar source Ximport_abs.vim 18318a7d6542SBram Moolenaar 18328a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18334e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1834675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1835675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1836675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1837675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1838675f716eSBram Moolenaar 'exported = 8888.*' .. 1839675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1840675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1841675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1842675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1843e6085c53SBram Moolenaar g:import_disassembled) 1844b3ca9824SBram Moolenaar 1845b3ca9824SBram Moolenaar Undo_export_script_lines() 18468a7d6542SBram Moolenaar unlet g:imported_abs 18474e12a5dfSBram Moolenaar unlet g:import_disassembled 18488a7d6542SBram Moolenaar 18498a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18508a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18518a7d6542SBram Moolenaarenddef 18528a7d6542SBram Moolenaar 18538a7d6542SBram Moolenaardef Test_import_rtp() 18548a7d6542SBram Moolenaar let import_lines = [ 1855e6085c53SBram Moolenaar 'vim9script', 1856e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1857e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1858e6085c53SBram Moolenaar ] 18598a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18608a7d6542SBram Moolenaar mkdir('import') 18618a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18628a7d6542SBram Moolenaar 18638a7d6542SBram Moolenaar let save_rtp = &rtp 18648a7d6542SBram Moolenaar &rtp = getcwd() 18658a7d6542SBram Moolenaar source Ximport_rtp.vim 18668a7d6542SBram Moolenaar &rtp = save_rtp 18678a7d6542SBram Moolenaar 18688a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18698a7d6542SBram Moolenaar 1870b3ca9824SBram Moolenaar Undo_export_script_lines() 1871b3ca9824SBram Moolenaar unlet g:imported_rtp 18728a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 187389483d40SBram Moolenaar delete('import', 'rf') 18748a7d6542SBram Moolenaarenddef 18758a7d6542SBram Moolenaar 187625e0f586SBram Moolenaardef Test_import_compile_error() 187725e0f586SBram Moolenaar let export_lines = [ 187825e0f586SBram Moolenaar 'vim9script', 187925e0f586SBram Moolenaar 'export def ExpFunc(): string', 188025e0f586SBram Moolenaar ' return notDefined', 188125e0f586SBram Moolenaar 'enddef', 188225e0f586SBram Moolenaar ] 188325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 188425e0f586SBram Moolenaar 188525e0f586SBram Moolenaar let import_lines = [ 188625e0f586SBram Moolenaar 'vim9script', 188725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 188825e0f586SBram Moolenaar 'def ImpFunc()', 188925e0f586SBram Moolenaar ' echo ExpFunc()', 189025e0f586SBram Moolenaar 'enddef', 189125e0f586SBram Moolenaar 'defcompile', 189225e0f586SBram Moolenaar ] 189325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 189425e0f586SBram Moolenaar 189525e0f586SBram Moolenaar try 189625e0f586SBram Moolenaar source Ximport.vim 189725e0f586SBram Moolenaar catch /E1001/ 1898f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 189925e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 190025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 190125e0f586SBram Moolenaar endtry 190225e0f586SBram Moolenaar 190325e0f586SBram Moolenaar delete('Xexported.vim') 190425e0f586SBram Moolenaar delete('Ximport.vim') 190525e0f586SBram Moolenaarenddef 190625e0f586SBram Moolenaar 1907c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1908c4ce36d4SBram Moolenaar let lines = [ 1909c4ce36d4SBram Moolenaar 'vim9script', 1910c4ce36d4SBram Moolenaar 'def Func()', 1911c4ce36d4SBram Moolenaar ' eval [][0]', 1912c4ce36d4SBram Moolenaar 'enddef', 1913c4ce36d4SBram Moolenaar 'Func()', 1914c4ce36d4SBram Moolenaar ] 1915c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1916c4ce36d4SBram Moolenaar 1917c4ce36d4SBram Moolenaar for count in range(3) 1918c4ce36d4SBram Moolenaar try 1919c4ce36d4SBram Moolenaar source Xtestscript.vim 1920c4ce36d4SBram Moolenaar catch /E684/ 1921c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1922c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1923c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1924c4ce36d4SBram Moolenaar endtry 1925c4ce36d4SBram Moolenaar endfor 1926c4ce36d4SBram Moolenaar 1927c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1928c4ce36d4SBram Moolenaarenddef 1929c4ce36d4SBram Moolenaar 1930eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1931eef2102eSBram Moolenaar let export_lines =<< trim END 1932eef2102eSBram Moolenaar vim9script 1933eef2102eSBram Moolenaar export def Func() 1934eef2102eSBram Moolenaar echo 'imported' 1935eef2102eSBram Moolenaar enddef 1936eef2102eSBram Moolenaar END 1937eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1938eef2102eSBram Moolenaar 1939eef2102eSBram Moolenaar let lines =<< trim END 1940eef2102eSBram Moolenaar vim9script 1941eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1942eef2102eSBram Moolenaar def Func() 1943eef2102eSBram Moolenaar echo 'local to function' 1944eef2102eSBram Moolenaar enddef 1945eef2102eSBram Moolenaar END 1946eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1947eef2102eSBram Moolenaar 1948eef2102eSBram Moolenaar lines =<< trim END 1949eef2102eSBram Moolenaar vim9script 1950eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1951eef2102eSBram Moolenaar def Outer() 1952eef2102eSBram Moolenaar def Func() 1953eef2102eSBram Moolenaar echo 'local to function' 1954eef2102eSBram Moolenaar enddef 1955eef2102eSBram Moolenaar enddef 1956eef2102eSBram Moolenaar defcompile 1957eef2102eSBram Moolenaar END 1958eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1959eef2102eSBram Moolenaar 1960eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1961eef2102eSBram Moolenaarenddef 1962eef2102eSBram Moolenaar 1963b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1964b9a2cac3SBram Moolenaar let lines =<< trim END 1965b9a2cac3SBram Moolenaar vim9script 1966b9a2cac3SBram Moolenaar def Func() 1967b9a2cac3SBram Moolenaar echo 'one' 1968b9a2cac3SBram Moolenaar enddef 1969b9a2cac3SBram Moolenaar def Func() 1970b9a2cac3SBram Moolenaar echo 'two' 1971b9a2cac3SBram Moolenaar enddef 1972b9a2cac3SBram Moolenaar END 1973b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1974fa211f3cSBram Moolenaar 1975fa211f3cSBram Moolenaar lines =<< trim END 1976fa211f3cSBram Moolenaar vim9script 1977fa211f3cSBram Moolenaar def Foo(): string 1978fa211f3cSBram Moolenaar return 'foo' 1979fa211f3cSBram Moolenaar enddef 1980fa211f3cSBram Moolenaar def Func() 1981fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1982fa211f3cSBram Moolenaar enddef 1983fa211f3cSBram Moolenaar defcompile 1984fa211f3cSBram Moolenaar END 1985fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1986b9a2cac3SBram Moolenaarenddef 1987b9a2cac3SBram Moolenaar 19888a7d6542SBram Moolenaardef Test_fixed_size_list() 1989f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 19908a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 19918a7d6542SBram Moolenaar l->remove(0) 19928a7d6542SBram Moolenaar l->add(5) 19938a7d6542SBram Moolenaar l->insert(99, 1) 19940f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19958a7d6542SBram Moolenaarenddef 19968a7d6542SBram Moolenaar 1997ae616494SBram Moolenaardef Test_no_insert_xit() 1998d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1999d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2000d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2001d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2002d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2003ae616494SBram Moolenaar 2004ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2005ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2006ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2007ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2008f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2009f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 2010f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2011f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2012f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2013ae616494SBram Moolenaarenddef 2014ae616494SBram Moolenaar 2015158906cfSBram Moolenaardef IfElse(what: number): string 2016158906cfSBram Moolenaar let res = '' 2017158906cfSBram Moolenaar if what == 1 2018158906cfSBram Moolenaar res = "one" 2019158906cfSBram Moolenaar elseif what == 2 2020158906cfSBram Moolenaar res = "two" 2021a259d8d3SBram Moolenaar else 2022158906cfSBram Moolenaar res = "three" 2023a259d8d3SBram Moolenaar endif 2024158906cfSBram Moolenaar return res 2025a259d8d3SBram Moolenaarenddef 2026a259d8d3SBram Moolenaar 2027158906cfSBram Moolenaardef Test_if_elseif_else() 2028158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2029158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2030158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20310f18b6d1SBram Moolenaarenddef 20320f18b6d1SBram Moolenaar 2033e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2034d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2035d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2036d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2037d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 2038d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 2039e8c4abbbSBram Moolenaarenddef 2040e8c4abbbSBram Moolenaar 20416d69bf60SBram Moolenaarlet g:bool_true = v:true 20426d69bf60SBram Moolenaarlet g:bool_false = v:false 20436d69bf60SBram Moolenaar 20446d69bf60SBram Moolenaardef Test_if_const_expr() 20456d69bf60SBram Moolenaar let res = false 20466d69bf60SBram Moolenaar if true ? true : false 20476d69bf60SBram Moolenaar res = true 20486d69bf60SBram Moolenaar endif 20496d69bf60SBram Moolenaar assert_equal(true, res) 20506d69bf60SBram Moolenaar 2051585fea7bSBram Moolenaar g:glob = 2 2052585fea7bSBram Moolenaar if false 20536797966dSBram Moolenaar execute('g:glob = 3') 2054585fea7bSBram Moolenaar endif 2055585fea7bSBram Moolenaar assert_equal(2, g:glob) 2056585fea7bSBram Moolenaar if true 20576797966dSBram Moolenaar execute('g:glob = 3') 2058585fea7bSBram Moolenaar endif 2059585fea7bSBram Moolenaar assert_equal(3, g:glob) 2060585fea7bSBram Moolenaar 20616d69bf60SBram Moolenaar res = false 20626d69bf60SBram Moolenaar if g:bool_true ? true : false 20636d69bf60SBram Moolenaar res = true 20646d69bf60SBram Moolenaar endif 20656d69bf60SBram Moolenaar assert_equal(true, res) 20666d69bf60SBram Moolenaar 20676d69bf60SBram Moolenaar res = false 20686d69bf60SBram Moolenaar if true ? g:bool_true : false 20696d69bf60SBram Moolenaar res = true 20706d69bf60SBram Moolenaar endif 20716d69bf60SBram Moolenaar assert_equal(true, res) 20726d69bf60SBram Moolenaar 20736d69bf60SBram Moolenaar res = false 20746d69bf60SBram Moolenaar if true ? true : g:bool_false 20756d69bf60SBram Moolenaar res = true 20766d69bf60SBram Moolenaar endif 20776d69bf60SBram Moolenaar assert_equal(true, res) 20786d69bf60SBram Moolenaar 20796d69bf60SBram Moolenaar res = false 20806d69bf60SBram Moolenaar if true ? false : true 20816d69bf60SBram Moolenaar res = true 20826d69bf60SBram Moolenaar endif 20836d69bf60SBram Moolenaar assert_equal(false, res) 20846d69bf60SBram Moolenaar 20856d69bf60SBram Moolenaar res = false 20866d69bf60SBram Moolenaar if false ? false : true 20876d69bf60SBram Moolenaar res = true 20886d69bf60SBram Moolenaar endif 20896d69bf60SBram Moolenaar assert_equal(true, res) 20906d69bf60SBram Moolenaar 20916d69bf60SBram Moolenaar res = false 20926d69bf60SBram Moolenaar if false ? true : false 20936d69bf60SBram Moolenaar res = true 20946d69bf60SBram Moolenaar endif 20956d69bf60SBram Moolenaar assert_equal(false, res) 20966d69bf60SBram Moolenaar 20976d69bf60SBram Moolenaar res = false 2098e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2099e8c4abbbSBram Moolenaar res = true 2100e8c4abbbSBram Moolenaar endif 2101e8c4abbbSBram Moolenaar assert_equal(false, res) 2102e8c4abbbSBram Moolenaar 2103e8c4abbbSBram Moolenaar res = false 21046d69bf60SBram Moolenaar if true && true 21056d69bf60SBram Moolenaar res = true 21066d69bf60SBram Moolenaar endif 21076d69bf60SBram Moolenaar assert_equal(true, res) 21086d69bf60SBram Moolenaar 21096d69bf60SBram Moolenaar res = false 21106d69bf60SBram Moolenaar if true && false 21116d69bf60SBram Moolenaar res = true 21126d69bf60SBram Moolenaar endif 21136d69bf60SBram Moolenaar assert_equal(false, res) 21146d69bf60SBram Moolenaar 21156d69bf60SBram Moolenaar res = false 21166d69bf60SBram Moolenaar if g:bool_true && false 21176d69bf60SBram Moolenaar res = true 21186d69bf60SBram Moolenaar endif 21196d69bf60SBram Moolenaar assert_equal(false, res) 21206d69bf60SBram Moolenaar 21216d69bf60SBram Moolenaar res = false 21226d69bf60SBram Moolenaar if true && g:bool_false 21236d69bf60SBram Moolenaar res = true 21246d69bf60SBram Moolenaar endif 21256d69bf60SBram Moolenaar assert_equal(false, res) 21266d69bf60SBram Moolenaar 21276d69bf60SBram Moolenaar res = false 21286d69bf60SBram Moolenaar if false && false 21296d69bf60SBram Moolenaar res = true 21306d69bf60SBram Moolenaar endif 21316d69bf60SBram Moolenaar assert_equal(false, res) 21326d69bf60SBram Moolenaar 21336d69bf60SBram Moolenaar res = false 21346d69bf60SBram Moolenaar if true || false 21356d69bf60SBram Moolenaar res = true 21366d69bf60SBram Moolenaar endif 21376d69bf60SBram Moolenaar assert_equal(true, res) 21386d69bf60SBram Moolenaar 21396d69bf60SBram Moolenaar res = false 21406d69bf60SBram Moolenaar if g:bool_true || false 21416d69bf60SBram Moolenaar res = true 21426d69bf60SBram Moolenaar endif 21436d69bf60SBram Moolenaar assert_equal(true, res) 21446d69bf60SBram Moolenaar 21456d69bf60SBram Moolenaar res = false 21466d69bf60SBram Moolenaar if true || g:bool_false 21476d69bf60SBram Moolenaar res = true 21486d69bf60SBram Moolenaar endif 21496d69bf60SBram Moolenaar assert_equal(true, res) 21506d69bf60SBram Moolenaar 21516d69bf60SBram Moolenaar res = false 21526d69bf60SBram Moolenaar if false || false 21536d69bf60SBram Moolenaar res = true 21546d69bf60SBram Moolenaar endif 21556d69bf60SBram Moolenaar assert_equal(false, res) 21563988f64fSBram Moolenaar 21573988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21583988f64fSBram Moolenaar if false | eval 0 | endif 21593988f64fSBram Moolenaar if false | eval burp + 234 | endif 21603988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21613988f64fSBram Moolenaar if false 21623988f64fSBram Moolenaar burp 21633988f64fSBram Moolenaar endif 216480c34ca3SBram Moolenaarenddef 21656d69bf60SBram Moolenaar 216680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2167d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2168d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2169d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2170d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21716d69bf60SBram Moolenaarenddef 21726d69bf60SBram Moolenaar 217372abcf42SBram Moolenaardef RunNested(i: number): number 217472abcf42SBram Moolenaar let x: number = 0 217572abcf42SBram Moolenaar if i % 2 217672abcf42SBram Moolenaar if 1 2177f5be8cdbSBram Moolenaar # comment 217872abcf42SBram Moolenaar else 2179f5be8cdbSBram Moolenaar # comment 218072abcf42SBram Moolenaar endif 218172abcf42SBram Moolenaar x += 1 218272abcf42SBram Moolenaar else 218372abcf42SBram Moolenaar x += 1000 218472abcf42SBram Moolenaar endif 218572abcf42SBram Moolenaar return x 218672abcf42SBram Moolenaarenddef 218772abcf42SBram Moolenaar 218872abcf42SBram Moolenaardef Test_nested_if() 218972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 219072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 219172abcf42SBram Moolenaarenddef 219272abcf42SBram Moolenaar 2193ad39c094SBram Moolenaardef Test_execute_cmd() 2194ad39c094SBram Moolenaar new 2195ad39c094SBram Moolenaar setline(1, 'default') 2196d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2197ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2198a72cfb80SBram Moolenaar 2199d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2200a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2201a72cfb80SBram Moolenaar 2202d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 2203ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2204a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2205ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2206a72cfb80SBram Moolenaar 2207d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2208ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2209a72cfb80SBram Moolenaar 2210ad39c094SBram Moolenaar let cmd_first = 'call ' 2211ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2212ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2213ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2214ad39c094SBram Moolenaar bwipe! 2215585fea7bSBram Moolenaar 22162d6b20d6SBram Moolenaar let n = true 22172d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22182d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22192d6b20d6SBram Moolenaar 2220e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2221e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2222e5abf7afSBram Moolenaar 2223d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2224d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2225d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2226ad39c094SBram Moolenaarenddef 2227ad39c094SBram Moolenaar 222847e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2229f5be8cdbSBram Moolenaar # only checks line continuation 223047e880d6SBram Moolenaar let lines =<< trim END 223147e880d6SBram Moolenaar vim9script 223247e880d6SBram Moolenaar execute 'g:someVar' 223347e880d6SBram Moolenaar .. ' = ' .. 223447e880d6SBram Moolenaar '28' 223547e880d6SBram Moolenaar assert_equal(28, g:someVar) 223647e880d6SBram Moolenaar unlet g:someVar 223747e880d6SBram Moolenaar END 223847e880d6SBram Moolenaar CheckScriptSuccess(lines) 223947e880d6SBram Moolenaarenddef 224047e880d6SBram Moolenaar 2241ad39c094SBram Moolenaardef Test_echo_cmd() 2242a72cfb80SBram Moolenaar echo 'some' # comment 2243585fea7bSBram Moolenaar echon 'thing' 2244ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2245ad39c094SBram Moolenaar 2246a72cfb80SBram Moolenaar echo "some" # comment 2247a72cfb80SBram Moolenaar echon "thing" 2248a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2249a72cfb80SBram Moolenaar 2250ad39c094SBram Moolenaar let str1 = 'some' 2251ad39c094SBram Moolenaar let str2 = 'more' 2252ad39c094SBram Moolenaar echo str1 str2 2253ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2254a72cfb80SBram Moolenaar 2255d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2256ad39c094SBram Moolenaarenddef 2257ad39c094SBram Moolenaar 2258f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2259f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2260f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2261f93c7feaSBram Moolenaar echo 'clear' 2262df069eecSBram Moolenaar :1messages 2263f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2264f93c7feaSBram Moolenaar 2265d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2266f93c7feaSBram Moolenaarenddef 2267f93c7feaSBram Moolenaar 226847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2269f5be8cdbSBram Moolenaar # only checks line continuation 227047e880d6SBram Moolenaar let lines =<< trim END 227147e880d6SBram Moolenaar vim9script 227247e880d6SBram Moolenaar echomsg 'here' 227347e880d6SBram Moolenaar .. ' is ' .. 227447e880d6SBram Moolenaar 'a message' 227547e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 227647e880d6SBram Moolenaar END 227747e880d6SBram Moolenaar CheckScriptSuccess(lines) 227847e880d6SBram Moolenaarenddef 227947e880d6SBram Moolenaar 2280f93c7feaSBram Moolenaardef Test_echoerr_cmd() 228140ee466cSBram Moolenaar try 228240ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 228340ee466cSBram Moolenaar catch 228440ee466cSBram Moolenaar assert_match('something wrong', v:exception) 228540ee466cSBram Moolenaar endtry 2286f93c7feaSBram Moolenaarenddef 2287f93c7feaSBram Moolenaar 228847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2289f5be8cdbSBram Moolenaar # only checks line continuation 229047e880d6SBram Moolenaar let lines =<< trim END 229147e880d6SBram Moolenaar vim9script 229247e880d6SBram Moolenaar try 229347e880d6SBram Moolenaar echoerr 'this' 229447e880d6SBram Moolenaar .. ' is ' .. 229547e880d6SBram Moolenaar 'wrong' 229647e880d6SBram Moolenaar catch 229747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 229847e880d6SBram Moolenaar endtry 229947e880d6SBram Moolenaar END 230047e880d6SBram Moolenaar CheckScriptSuccess(lines) 230147e880d6SBram Moolenaarenddef 230247e880d6SBram Moolenaar 230341fe0617SBram Moolenaardef Test_for_outside_of_function() 230441fe0617SBram Moolenaar let lines =<< trim END 230541fe0617SBram Moolenaar vim9script 230641fe0617SBram Moolenaar new 230741fe0617SBram Moolenaar for var in range(0, 3) 230841fe0617SBram Moolenaar append(line('$'), var) 230941fe0617SBram Moolenaar endfor 231041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 231141fe0617SBram Moolenaar bwipe! 231241fe0617SBram Moolenaar END 231341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 231441fe0617SBram Moolenaar source Xvim9for.vim 231541fe0617SBram Moolenaar delete('Xvim9for.vim') 231641fe0617SBram Moolenaarenddef 23178a7d6542SBram Moolenaar 2318e8c4abbbSBram Moolenaardef Test_for_loop() 2319e8c4abbbSBram Moolenaar let result = '' 2320e8c4abbbSBram Moolenaar for cnt in range(7) 2321e8c4abbbSBram Moolenaar if cnt == 4 2322e8c4abbbSBram Moolenaar break 2323e8c4abbbSBram Moolenaar endif 2324e8c4abbbSBram Moolenaar if cnt == 2 2325e8c4abbbSBram Moolenaar continue 2326e8c4abbbSBram Moolenaar endif 2327e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2328e8c4abbbSBram Moolenaar endfor 2329e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23300ad3e894SBram Moolenaar 23310ad3e894SBram Moolenaar let concat = '' 23320ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23330ad3e894SBram Moolenaar concat ..= str 23340ad3e894SBram Moolenaar endfor 23350ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2336e8c4abbbSBram Moolenaarenddef 2337e8c4abbbSBram Moolenaar 2338e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2339675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2340675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2341451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2342822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2343451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2344675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2345675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2346675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2347e8c4abbbSBram Moolenaarenddef 2348e8c4abbbSBram Moolenaar 2349d0df1aacSBram Moolenaardef Test_while_loop() 2350d0df1aacSBram Moolenaar let result = '' 2351d0df1aacSBram Moolenaar let cnt = 0 2352d0df1aacSBram Moolenaar while cnt < 555 2353d0df1aacSBram Moolenaar if cnt == 3 2354d0df1aacSBram Moolenaar break 2355d0df1aacSBram Moolenaar endif 2356d0df1aacSBram Moolenaar cnt += 1 2357d0df1aacSBram Moolenaar if cnt == 2 2358d0df1aacSBram Moolenaar continue 2359d0df1aacSBram Moolenaar endif 2360d0df1aacSBram Moolenaar result ..= cnt .. '_' 2361d0df1aacSBram Moolenaar endwhile 2362d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2363d0df1aacSBram Moolenaarenddef 2364d0df1aacSBram Moolenaar 2365e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2366675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2367675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2368675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2369675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2370675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2371675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2372675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2373bd5da371SBram Moolenaarenddef 2374bd5da371SBram Moolenaar 23759645e2d9SBram Moolenaardef Test_interrupt_loop() 237697acfc78SBram Moolenaar let caught = false 23779645e2d9SBram Moolenaar let x = 0 237897acfc78SBram Moolenaar try 23799645e2d9SBram Moolenaar while 1 23809645e2d9SBram Moolenaar x += 1 23819645e2d9SBram Moolenaar if x == 100 23829645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23839645e2d9SBram Moolenaar endif 23849645e2d9SBram Moolenaar endwhile 238597acfc78SBram Moolenaar catch 238697acfc78SBram Moolenaar caught = true 238797acfc78SBram Moolenaar assert_equal(100, x) 238897acfc78SBram Moolenaar endtry 238997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 239025859dd7SBram Moolenaar # consume the CTRL-C 239125859dd7SBram Moolenaar getchar(0) 23929645e2d9SBram Moolenaarenddef 239320431c9dSBram Moolenaar 23944fdae999SBram Moolenaardef Test_automatic_line_continuation() 23954fdae999SBram Moolenaar let mylist = [ 23964fdae999SBram Moolenaar 'one', 23974fdae999SBram Moolenaar 'two', 23984fdae999SBram Moolenaar 'three', 2399f5be8cdbSBram Moolenaar ] # comment 24004fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24014fdae999SBram Moolenaar 24024fdae999SBram Moolenaar let mydict = { 24034fdae999SBram Moolenaar 'one': 1, 24044fdae999SBram Moolenaar 'two': 2, 24054fdae999SBram Moolenaar 'three': 24064fdae999SBram Moolenaar 3, 2407f5be8cdbSBram Moolenaar } # comment 24084fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 24094fdae999SBram Moolenaar mydict = #{ 24102c330432SBram Moolenaar one: 1, # comment 24112c330432SBram Moolenaar two: # comment 24122c330432SBram Moolenaar 2, # comment 24132c330432SBram Moolenaar three: 3 # comment 24142c330432SBram Moolenaar } 24152c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 24162c330432SBram Moolenaar mydict = #{ 24172c330432SBram Moolenaar one: 1, 24184fdae999SBram Moolenaar two: 24194fdae999SBram Moolenaar 2, 24202c330432SBram Moolenaar three: 3 24214fdae999SBram Moolenaar } 24224fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2423e6085c53SBram Moolenaar 2424e6085c53SBram Moolenaar assert_equal( 2425e6085c53SBram Moolenaar ['one', 'two', 'three'], 2426e6085c53SBram Moolenaar split('one two three') 2427e6085c53SBram Moolenaar ) 24284fdae999SBram Moolenaarenddef 24294fdae999SBram Moolenaar 24307a092245SBram Moolenaardef Test_vim9_comment() 24317a092245SBram Moolenaar CheckScriptSuccess([ 24327a092245SBram Moolenaar 'vim9script', 24337a092245SBram Moolenaar '# something', 24347a092245SBram Moolenaar ]) 24357a092245SBram Moolenaar CheckScriptFailure([ 24367a092245SBram Moolenaar 'vim9script', 24377a092245SBram Moolenaar ':# something', 24387a092245SBram Moolenaar ], 'E488:') 24397a092245SBram Moolenaar CheckScriptFailure([ 24407a092245SBram Moolenaar '# something', 24417a092245SBram Moolenaar ], 'E488:') 24427a092245SBram Moolenaar CheckScriptFailure([ 24437a092245SBram Moolenaar ':# something', 24447a092245SBram Moolenaar ], 'E488:') 24457a092245SBram Moolenaar 24464a8d9f2eSBram Moolenaar { # block start 24474a8d9f2eSBram Moolenaar } # block end 24484a8d9f2eSBram Moolenaar CheckDefFailure([ 24494a8d9f2eSBram Moolenaar '{# comment', 24504a8d9f2eSBram Moolenaar ], 'E488:') 24514a8d9f2eSBram Moolenaar CheckDefFailure([ 24524a8d9f2eSBram Moolenaar '{', 24534a8d9f2eSBram Moolenaar '}# comment', 24544a8d9f2eSBram Moolenaar ], 'E488:') 24554a8d9f2eSBram Moolenaar 24564a8d9f2eSBram Moolenaar echo "yes" # comment 24574a8d9f2eSBram Moolenaar CheckDefFailure([ 24584a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24594a8d9f2eSBram Moolenaar ], 'E488:') 24607a092245SBram Moolenaar CheckScriptSuccess([ 24617a092245SBram Moolenaar 'vim9script', 24627a092245SBram Moolenaar 'echo "yes" # something', 24637a092245SBram Moolenaar ]) 24647a092245SBram Moolenaar CheckScriptFailure([ 24657a092245SBram Moolenaar 'vim9script', 24667a092245SBram Moolenaar 'echo "yes"# something', 24677a092245SBram Moolenaar ], 'E121:') 24687a092245SBram Moolenaar CheckScriptFailure([ 24697a092245SBram Moolenaar 'vim9script', 24707a092245SBram Moolenaar 'echo# something', 24717a092245SBram Moolenaar ], 'E121:') 24727a092245SBram Moolenaar CheckScriptFailure([ 24737a092245SBram Moolenaar 'echo "yes" # something', 24747a092245SBram Moolenaar ], 'E121:') 24757a092245SBram Moolenaar 24764a8d9f2eSBram Moolenaar exe "echo" # comment 24774a8d9f2eSBram Moolenaar CheckDefFailure([ 24784a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24794a8d9f2eSBram Moolenaar ], 'E488:') 24804a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24814a8d9f2eSBram Moolenaar 'vim9script', 24824a8d9f2eSBram Moolenaar 'exe "echo" # something', 24834a8d9f2eSBram Moolenaar ]) 24844a8d9f2eSBram Moolenaar CheckScriptFailure([ 24854a8d9f2eSBram Moolenaar 'vim9script', 24864a8d9f2eSBram Moolenaar 'exe "echo"# something', 24874a8d9f2eSBram Moolenaar ], 'E121:') 24884a8d9f2eSBram Moolenaar CheckDefFailure([ 24894a8d9f2eSBram Moolenaar 'exe # comment', 24904a8d9f2eSBram Moolenaar ], 'E1015:') 24914a8d9f2eSBram Moolenaar CheckScriptFailure([ 24924a8d9f2eSBram Moolenaar 'vim9script', 24934a8d9f2eSBram Moolenaar 'exe# something', 24944a8d9f2eSBram Moolenaar ], 'E121:') 24954a8d9f2eSBram Moolenaar CheckScriptFailure([ 24964a8d9f2eSBram Moolenaar 'exe "echo" # something', 24974a8d9f2eSBram Moolenaar ], 'E121:') 24984a8d9f2eSBram Moolenaar 24997a092245SBram Moolenaar CheckDefFailure([ 25007a092245SBram Moolenaar 'try# comment', 25017a092245SBram Moolenaar ' echo "yes"', 25027a092245SBram Moolenaar 'catch', 25037a092245SBram Moolenaar 'endtry', 25047a092245SBram Moolenaar ], 'E488:') 25052c5ed4e3SBram Moolenaar CheckScriptFailure([ 25062c5ed4e3SBram Moolenaar 'vim9script', 25072c5ed4e3SBram Moolenaar 'try# comment', 25082c5ed4e3SBram Moolenaar 'echo "yes"', 25092c5ed4e3SBram Moolenaar ], 'E488:') 25107a092245SBram Moolenaar CheckDefFailure([ 25117a092245SBram Moolenaar 'try', 2512a72cfb80SBram Moolenaar ' throw#comment', 2513a72cfb80SBram Moolenaar 'catch', 2514a72cfb80SBram Moolenaar 'endtry', 2515a72cfb80SBram Moolenaar ], 'E1015:') 2516a72cfb80SBram Moolenaar CheckDefFailure([ 2517a72cfb80SBram Moolenaar 'try', 2518a72cfb80SBram Moolenaar ' throw "yes"#comment', 2519a72cfb80SBram Moolenaar 'catch', 2520a72cfb80SBram Moolenaar 'endtry', 2521a72cfb80SBram Moolenaar ], 'E488:') 2522a72cfb80SBram Moolenaar CheckDefFailure([ 2523a72cfb80SBram Moolenaar 'try', 25247a092245SBram Moolenaar ' echo "yes"', 25257a092245SBram Moolenaar 'catch# comment', 25267a092245SBram Moolenaar 'endtry', 25277a092245SBram Moolenaar ], 'E488:') 25282c5ed4e3SBram Moolenaar CheckScriptFailure([ 25292c5ed4e3SBram Moolenaar 'vim9script', 25302c5ed4e3SBram Moolenaar 'try', 25312c5ed4e3SBram Moolenaar ' echo "yes"', 25322c5ed4e3SBram Moolenaar 'catch# comment', 25332c5ed4e3SBram Moolenaar 'endtry', 25342c5ed4e3SBram Moolenaar ], 'E654:') 25352c5ed4e3SBram Moolenaar CheckDefFailure([ 25362c5ed4e3SBram Moolenaar 'try', 25372c5ed4e3SBram Moolenaar ' echo "yes"', 25382c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25392c5ed4e3SBram Moolenaar 'endtry', 25402c5ed4e3SBram Moolenaar ], 'E488:') 25417a092245SBram Moolenaar CheckDefFailure([ 25427a092245SBram Moolenaar 'try', 25437a092245SBram Moolenaar 'echo "yes"', 25447a092245SBram Moolenaar 'catch', 25457a092245SBram Moolenaar 'endtry# comment', 25467a092245SBram Moolenaar ], 'E488:') 25472c5ed4e3SBram Moolenaar CheckScriptFailure([ 25482c5ed4e3SBram Moolenaar 'vim9script', 25492c5ed4e3SBram Moolenaar 'try', 25502c5ed4e3SBram Moolenaar ' echo "yes"', 25512c5ed4e3SBram Moolenaar 'catch', 25522c5ed4e3SBram Moolenaar 'endtry# comment', 25539b7bf9e9SBram Moolenaar ], 'E488:') 25542c5ed4e3SBram Moolenaar 25552c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25562c5ed4e3SBram Moolenaar 'vim9script', 25572c5ed4e3SBram Moolenaar 'hi # comment', 25582c5ed4e3SBram Moolenaar ]) 25592c5ed4e3SBram Moolenaar CheckScriptFailure([ 25602c5ed4e3SBram Moolenaar 'vim9script', 25612c5ed4e3SBram Moolenaar 'hi# comment', 25622c5ed4e3SBram Moolenaar ], 'E416:') 25631966c248SBram Moolenaar CheckScriptSuccess([ 25641966c248SBram Moolenaar 'vim9script', 25651966c248SBram Moolenaar 'hi Search # comment', 25661966c248SBram Moolenaar ]) 25671966c248SBram Moolenaar CheckScriptFailure([ 25681966c248SBram Moolenaar 'vim9script', 25691966c248SBram Moolenaar 'hi Search# comment', 25701966c248SBram Moolenaar ], 'E416:') 25711966c248SBram Moolenaar CheckScriptSuccess([ 25721966c248SBram Moolenaar 'vim9script', 25731966c248SBram Moolenaar 'hi link This Search # comment', 25741966c248SBram Moolenaar ]) 25751966c248SBram Moolenaar CheckScriptFailure([ 25761966c248SBram Moolenaar 'vim9script', 25771966c248SBram Moolenaar 'hi link This That# comment', 25781966c248SBram Moolenaar ], 'E413:') 25791966c248SBram Moolenaar CheckScriptSuccess([ 25801966c248SBram Moolenaar 'vim9script', 25811966c248SBram Moolenaar 'hi clear This # comment', 25821966c248SBram Moolenaar 'hi clear # comment', 25831966c248SBram Moolenaar ]) 2584f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2585f5be8cdbSBram Moolenaar # hi clear This# comment', 25861966c248SBram Moolenaar CheckScriptFailure([ 25871966c248SBram Moolenaar 'vim9script', 25881966c248SBram Moolenaar 'hi clear# comment', 25891966c248SBram Moolenaar ], 'E416:') 25901966c248SBram Moolenaar 25911966c248SBram Moolenaar CheckScriptSuccess([ 25921966c248SBram Moolenaar 'vim9script', 25931966c248SBram Moolenaar 'hi Group term=bold', 25941966c248SBram Moolenaar 'match Group /todo/ # comment', 25951966c248SBram Moolenaar ]) 25961966c248SBram Moolenaar CheckScriptFailure([ 25971966c248SBram Moolenaar 'vim9script', 25981966c248SBram Moolenaar 'hi Group term=bold', 25991966c248SBram Moolenaar 'match Group /todo/# comment', 26001966c248SBram Moolenaar ], 'E488:') 26011966c248SBram Moolenaar CheckScriptSuccess([ 26021966c248SBram Moolenaar 'vim9script', 26031966c248SBram Moolenaar 'match # comment', 26041966c248SBram Moolenaar ]) 26051966c248SBram Moolenaar CheckScriptFailure([ 26061966c248SBram Moolenaar 'vim9script', 26071966c248SBram Moolenaar 'match# comment', 26081966c248SBram Moolenaar ], 'E475:') 26091966c248SBram Moolenaar CheckScriptSuccess([ 26101966c248SBram Moolenaar 'vim9script', 26111966c248SBram Moolenaar 'match none # comment', 26121966c248SBram Moolenaar ]) 26131966c248SBram Moolenaar CheckScriptFailure([ 26141966c248SBram Moolenaar 'vim9script', 26151966c248SBram Moolenaar 'match none# comment', 26161966c248SBram Moolenaar ], 'E475:') 26171966c248SBram Moolenaar 26181966c248SBram Moolenaar CheckScriptSuccess([ 26191966c248SBram Moolenaar 'vim9script', 26201966c248SBram Moolenaar 'menutrans clear # comment', 26211966c248SBram Moolenaar ]) 26221966c248SBram Moolenaar CheckScriptFailure([ 26231966c248SBram Moolenaar 'vim9script', 26241966c248SBram Moolenaar 'menutrans clear# comment text', 26251966c248SBram Moolenaar ], 'E474:') 26261966c248SBram Moolenaar 26271966c248SBram Moolenaar CheckScriptSuccess([ 26281966c248SBram Moolenaar 'vim9script', 26291966c248SBram Moolenaar 'syntax clear # comment', 26301966c248SBram Moolenaar ]) 26311966c248SBram Moolenaar CheckScriptFailure([ 26321966c248SBram Moolenaar 'vim9script', 26331966c248SBram Moolenaar 'syntax clear# comment text', 26341966c248SBram Moolenaar ], 'E28:') 26351966c248SBram Moolenaar CheckScriptSuccess([ 26361966c248SBram Moolenaar 'vim9script', 26371966c248SBram Moolenaar 'syntax keyword Word some', 26381966c248SBram Moolenaar 'syntax clear Word # comment', 26391966c248SBram Moolenaar ]) 26401966c248SBram Moolenaar CheckScriptFailure([ 26411966c248SBram Moolenaar 'vim9script', 26421966c248SBram Moolenaar 'syntax keyword Word some', 26431966c248SBram Moolenaar 'syntax clear Word# comment text', 26441966c248SBram Moolenaar ], 'E28:') 26451966c248SBram Moolenaar 26461966c248SBram Moolenaar CheckScriptSuccess([ 26471966c248SBram Moolenaar 'vim9script', 26481966c248SBram Moolenaar 'syntax list # comment', 26491966c248SBram Moolenaar ]) 26501966c248SBram Moolenaar CheckScriptFailure([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax list# comment text', 26531966c248SBram Moolenaar ], 'E28:') 26541966c248SBram Moolenaar 26551966c248SBram Moolenaar CheckScriptSuccess([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26581966c248SBram Moolenaar ]) 26591966c248SBram Moolenaar CheckScriptFailure([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26621966c248SBram Moolenaar ], 'E475:') 26631966c248SBram Moolenaar 26641966c248SBram Moolenaar CheckScriptSuccess([ 26651966c248SBram Moolenaar 'vim9script', 26661966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26671966c248SBram Moolenaar ]) 26681966c248SBram Moolenaar CheckScriptFailure([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26711966c248SBram Moolenaar ], 'E789:') 26721966c248SBram Moolenaar 26731966c248SBram Moolenaar CheckScriptSuccess([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26761966c248SBram Moolenaar ]) 26771966c248SBram Moolenaar CheckScriptFailure([ 26781966c248SBram Moolenaar 'vim9script', 26791966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26801966c248SBram Moolenaar ], 'E402:') 26811966c248SBram Moolenaar 26821966c248SBram Moolenaar CheckScriptSuccess([ 26831966c248SBram Moolenaar 'vim9script', 26841966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26851966c248SBram Moolenaar ]) 26861966c248SBram Moolenaar CheckScriptFailure([ 26871966c248SBram Moolenaar 'vim9script', 26881966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26891966c248SBram Moolenaar ], 'E475:') 26901966c248SBram Moolenaar CheckScriptFailure([ 26911966c248SBram Moolenaar 'vim9script', 26921966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26931966c248SBram Moolenaar ], 'E406:') 26941966c248SBram Moolenaar CheckScriptFailure([ 26951966c248SBram Moolenaar 'vim9script', 26961966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26971966c248SBram Moolenaar ], 'E475:') 26981966c248SBram Moolenaar 26991966c248SBram Moolenaar CheckScriptSuccess([ 27001966c248SBram Moolenaar 'vim9script', 27011966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27021966c248SBram Moolenaar ]) 27031966c248SBram Moolenaar CheckScriptFailure([ 27041966c248SBram Moolenaar 'vim9script', 27051966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2706d032f34aSBram Moolenaar ], 'E402:') 27071966c248SBram Moolenaar 27081966c248SBram Moolenaar CheckScriptSuccess([ 27091966c248SBram Moolenaar 'vim9script', 27101966c248SBram Moolenaar 'syntax sync # comment', 27111966c248SBram Moolenaar ]) 27121966c248SBram Moolenaar CheckScriptFailure([ 27131966c248SBram Moolenaar 'vim9script', 27141966c248SBram Moolenaar 'syntax sync# comment', 27151966c248SBram Moolenaar ], 'E404:') 27161966c248SBram Moolenaar CheckScriptSuccess([ 27171966c248SBram Moolenaar 'vim9script', 27181966c248SBram Moolenaar 'syntax sync ccomment # comment', 27191966c248SBram Moolenaar ]) 27201966c248SBram Moolenaar CheckScriptFailure([ 27211966c248SBram Moolenaar 'vim9script', 27221966c248SBram Moolenaar 'syntax sync ccomment# comment', 27231966c248SBram Moolenaar ], 'E404:') 27241966c248SBram Moolenaar 27251966c248SBram Moolenaar CheckScriptSuccess([ 27261966c248SBram Moolenaar 'vim9script', 27271966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27281966c248SBram Moolenaar ]) 27291966c248SBram Moolenaar CheckScriptFailure([ 27301966c248SBram Moolenaar 'vim9script', 27311966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27321966c248SBram Moolenaar ], 'E475:') 2733a72cfb80SBram Moolenaar 2734a72cfb80SBram Moolenaar CheckScriptSuccess([ 2735a72cfb80SBram Moolenaar 'vim9script', 2736a72cfb80SBram Moolenaar 'command Echo echo # comment', 2737a72cfb80SBram Moolenaar 'command Echo # comment', 2738a72cfb80SBram Moolenaar ]) 2739a72cfb80SBram Moolenaar CheckScriptFailure([ 2740a72cfb80SBram Moolenaar 'vim9script', 2741a72cfb80SBram Moolenaar 'command Echo echo# comment', 2742a72cfb80SBram Moolenaar 'Echo', 2743a72cfb80SBram Moolenaar ], 'E121:') 2744a72cfb80SBram Moolenaar CheckScriptFailure([ 2745a72cfb80SBram Moolenaar 'vim9script', 2746a72cfb80SBram Moolenaar 'command Echo# comment', 2747a72cfb80SBram Moolenaar ], 'E182:') 2748a72cfb80SBram Moolenaar CheckScriptFailure([ 2749a72cfb80SBram Moolenaar 'vim9script', 2750a72cfb80SBram Moolenaar 'command Echo echo', 2751a72cfb80SBram Moolenaar 'command Echo# comment', 2752a72cfb80SBram Moolenaar ], 'E182:') 2753a72cfb80SBram Moolenaar 2754a72cfb80SBram Moolenaar CheckScriptSuccess([ 2755a72cfb80SBram Moolenaar 'vim9script', 2756a72cfb80SBram Moolenaar 'function # comment', 2757a72cfb80SBram Moolenaar ]) 2758a72cfb80SBram Moolenaar CheckScriptFailure([ 2759a72cfb80SBram Moolenaar 'vim9script', 27609898107fSBram Moolenaar 'function " comment', 27619898107fSBram Moolenaar ], 'E129:') 27629898107fSBram Moolenaar CheckScriptFailure([ 27639898107fSBram Moolenaar 'vim9script', 2764a72cfb80SBram Moolenaar 'function# comment', 2765a72cfb80SBram Moolenaar ], 'E129:') 2766a72cfb80SBram Moolenaar CheckScriptSuccess([ 2767a72cfb80SBram Moolenaar 'vim9script', 2768a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2769a72cfb80SBram Moolenaar ]) 2770a72cfb80SBram Moolenaar CheckScriptFailure([ 2771a72cfb80SBram Moolenaar 'vim9script', 2772a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2773a72cfb80SBram Moolenaar ], 'E488:') 2774a72cfb80SBram Moolenaar 2775a72cfb80SBram Moolenaar CheckScriptSuccess([ 2776a72cfb80SBram Moolenaar 'vim9script', 27774c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2778a72cfb80SBram Moolenaar 'endfunc', 27794c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2780a72cfb80SBram Moolenaar ]) 2781a72cfb80SBram Moolenaar CheckScriptFailure([ 2782a72cfb80SBram Moolenaar 'vim9script', 27834c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2784a72cfb80SBram Moolenaar 'endfunc', 27854c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2786a72cfb80SBram Moolenaar ], 'E488:') 2787a72cfb80SBram Moolenaar 2788a72cfb80SBram Moolenaar CheckScriptSuccess([ 2789a72cfb80SBram Moolenaar 'vim9script', 2790a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2791a72cfb80SBram Moolenaar ]) 2792a72cfb80SBram Moolenaar CheckScriptFailure([ 2793a72cfb80SBram Moolenaar 'vim9script', 2794a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2795a72cfb80SBram Moolenaar ], 'E488:') 2796e7e4838fSBram Moolenaar 2797e7e4838fSBram Moolenaar CheckScriptFailure([ 2798e7e4838fSBram Moolenaar 'def Test() " comment', 2799e7e4838fSBram Moolenaar 'enddef', 2800e7e4838fSBram Moolenaar ], 'E488:') 2801e7e4838fSBram Moolenaar CheckScriptFailure([ 2802e7e4838fSBram Moolenaar 'vim9script', 2803e7e4838fSBram Moolenaar 'def Test() " comment', 2804e7e4838fSBram Moolenaar 'enddef', 2805e7e4838fSBram Moolenaar ], 'E488:') 2806e7e4838fSBram Moolenaar 2807e7e4838fSBram Moolenaar CheckScriptSuccess([ 2808e7e4838fSBram Moolenaar 'func Test() " comment', 2809e7e4838fSBram Moolenaar 'endfunc', 2810e7e4838fSBram Moolenaar ]) 28119898107fSBram Moolenaar CheckScriptSuccess([ 2812e7e4838fSBram Moolenaar 'vim9script', 2813e7e4838fSBram Moolenaar 'func Test() " comment', 2814e7e4838fSBram Moolenaar 'endfunc', 28159898107fSBram Moolenaar ]) 2816e7e4838fSBram Moolenaar 2817e7e4838fSBram Moolenaar CheckScriptSuccess([ 2818e7e4838fSBram Moolenaar 'def Test() # comment', 2819e7e4838fSBram Moolenaar 'enddef', 2820e7e4838fSBram Moolenaar ]) 2821e7e4838fSBram Moolenaar CheckScriptFailure([ 2822e7e4838fSBram Moolenaar 'func Test() # comment', 2823e7e4838fSBram Moolenaar 'endfunc', 2824e7e4838fSBram Moolenaar ], 'E488:') 28252c5ed4e3SBram Moolenaarenddef 28262c5ed4e3SBram Moolenaar 28272c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28282c5ed4e3SBram Moolenaar CheckCanRunGui 28292c5ed4e3SBram Moolenaar 28302c5ed4e3SBram Moolenaar CheckScriptFailure([ 28312c5ed4e3SBram Moolenaar 'vim9script', 28322c5ed4e3SBram Moolenaar 'gui#comment' 28332c5ed4e3SBram Moolenaar ], 'E499:') 28342c5ed4e3SBram Moolenaar CheckScriptFailure([ 28352c5ed4e3SBram Moolenaar 'vim9script', 28362c5ed4e3SBram Moolenaar 'gui -f#comment' 28372c5ed4e3SBram Moolenaar ], 'E499:') 28387a092245SBram Moolenaarenddef 28397a092245SBram Moolenaar 2840a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28416797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28426797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2843a26b9700SBram Moolenaar 2844a26b9700SBram Moolenaar edit test.vim 2845a26b9700SBram Moolenaar doautocmd TabEnter #comment 2846a26b9700SBram Moolenaar assert_equal(1, g:entered) 2847a26b9700SBram Moolenaar 2848a26b9700SBram Moolenaar doautocmd TabEnter f.x 2849a26b9700SBram Moolenaar assert_equal(2, g:entered) 2850a26b9700SBram Moolenaar 2851a26b9700SBram Moolenaar g:entered = 0 2852a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2853a26b9700SBram Moolenaar assert_equal(2, g:entered) 2854a26b9700SBram Moolenaar 2855a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2856a26b9700SBram Moolenaar 2857a26b9700SBram Moolenaar au! TabEnter 2858a26b9700SBram Moolenaar unlet g:entered 2859d72c1bf0SBram Moolenaar 2860d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2861d72c1bf0SBram Moolenaar 'vim9script', 28626797966dSBram Moolenaar 'g:var = 123', 2863e55b1c09SBram Moolenaar 'b:var = 456', 2864e55b1c09SBram Moolenaar 'w:var = 777', 2865e55b1c09SBram Moolenaar 't:var = 888', 2866d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2867d72c1bf0SBram Moolenaar ]) 2868d72c1bf0SBram Moolenaar 2869d72c1bf0SBram Moolenaar CheckScriptFailure([ 2870d72c1bf0SBram Moolenaar 'vim9script', 2871d72c1bf0SBram Moolenaar 'let g:var = 123', 2872e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2873e55b1c09SBram Moolenaar 2874e55b1c09SBram Moolenaar CheckScriptFailure([ 2875e55b1c09SBram Moolenaar 'vim9script', 2876e55b1c09SBram Moolenaar 'let b:var = 123', 2877e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2878e55b1c09SBram Moolenaar 2879e55b1c09SBram Moolenaar CheckScriptFailure([ 2880e55b1c09SBram Moolenaar 'vim9script', 2881e55b1c09SBram Moolenaar 'let w:var = 123', 2882e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2883e55b1c09SBram Moolenaar 2884e55b1c09SBram Moolenaar CheckScriptFailure([ 2885e55b1c09SBram Moolenaar 'vim9script', 2886e55b1c09SBram Moolenaar 'let t:var = 123', 2887e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2888e55b1c09SBram Moolenaar 2889e55b1c09SBram Moolenaar CheckScriptFailure([ 2890e55b1c09SBram Moolenaar 'vim9script', 2891e55b1c09SBram Moolenaar 'let v:version = 123', 2892e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2893e55b1c09SBram Moolenaar 2894e55b1c09SBram Moolenaar CheckScriptFailure([ 2895e55b1c09SBram Moolenaar 'vim9script', 2896e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2897e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28986797966dSBram Moolenaar 28996797966dSBram Moolenaar CheckScriptFailure([ 29006797966dSBram Moolenaar 'vim9script', 29016797966dSBram Moolenaar 'g:var = 123', 290232e35117SBram Moolenaar 'unlet g:var# comment1', 2903d72c1bf0SBram Moolenaar ], 'E108:') 2904d72c1bf0SBram Moolenaar 2905d72c1bf0SBram Moolenaar CheckScriptFailure([ 2906d72c1bf0SBram Moolenaar 'let g:var = 123', 2907d72c1bf0SBram Moolenaar 'unlet g:var # something', 2908d72c1bf0SBram Moolenaar ], 'E488:') 2909faac4104SBram Moolenaar 2910faac4104SBram Moolenaar CheckScriptSuccess([ 2911faac4104SBram Moolenaar 'vim9script', 291232e35117SBram Moolenaar 'if 1 # comment2', 2913faac4104SBram Moolenaar ' echo "yes"', 2914faac4104SBram Moolenaar 'elseif 2 #comment', 2915faac4104SBram Moolenaar ' echo "no"', 2916faac4104SBram Moolenaar 'endif', 2917faac4104SBram Moolenaar ]) 2918faac4104SBram Moolenaar 2919faac4104SBram Moolenaar CheckScriptFailure([ 2920faac4104SBram Moolenaar 'vim9script', 292132e35117SBram Moolenaar 'if 1# comment3', 2922faac4104SBram Moolenaar ' echo "yes"', 2923faac4104SBram Moolenaar 'endif', 2924faac4104SBram Moolenaar ], 'E15:') 2925faac4104SBram Moolenaar 2926faac4104SBram Moolenaar CheckScriptFailure([ 2927faac4104SBram Moolenaar 'vim9script', 292832e35117SBram Moolenaar 'if 0 # comment4', 2929faac4104SBram Moolenaar ' echo "yes"', 2930faac4104SBram Moolenaar 'elseif 2#comment', 2931faac4104SBram Moolenaar ' echo "no"', 2932faac4104SBram Moolenaar 'endif', 2933faac4104SBram Moolenaar ], 'E15:') 2934faac4104SBram Moolenaar 2935faac4104SBram Moolenaar CheckScriptSuccess([ 2936faac4104SBram Moolenaar 'vim9script', 293732e35117SBram Moolenaar 'let v = 1 # comment5', 2938faac4104SBram Moolenaar ]) 2939faac4104SBram Moolenaar 2940faac4104SBram Moolenaar CheckScriptFailure([ 2941faac4104SBram Moolenaar 'vim9script', 294232e35117SBram Moolenaar 'let v = 1# comment6', 294332e35117SBram Moolenaar ], 'E15:') 2944faac4104SBram Moolenaar 2945faac4104SBram Moolenaar CheckScriptSuccess([ 2946faac4104SBram Moolenaar 'vim9script', 2947faac4104SBram Moolenaar 'new' 2948d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2949df069eecSBram Moolenaar ':$', 2950faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2951faac4104SBram Moolenaar 'bwipe!', 2952faac4104SBram Moolenaar ]) 2953faac4104SBram Moolenaar 2954f5be8cdbSBram Moolenaar CheckScriptFailure([ 2955f5be8cdbSBram Moolenaar 'vim9script', 2956f5be8cdbSBram Moolenaar 'new' 2957d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2958f5be8cdbSBram Moolenaar ':$', 2959f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2960f5be8cdbSBram Moolenaar 'bwipe!', 2961f5be8cdbSBram Moolenaar ], 'E488:') 2962f5be8cdbSBram Moolenaar 2963f5be8cdbSBram Moolenaar CheckScriptFailure([ 2964f5be8cdbSBram Moolenaar 'vim9script', 2965f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2966f5be8cdbSBram Moolenaar ], 'E477:') 2967a26b9700SBram Moolenaarenddef 2968a26b9700SBram Moolenaar 29697e5bd91dSBram Moolenaardef Test_finish() 29707e5bd91dSBram Moolenaar let lines =<< trim END 29717e5bd91dSBram Moolenaar vim9script 29726797966dSBram Moolenaar g:res = 'one' 29737e5bd91dSBram Moolenaar if v:false | finish | endif 29746797966dSBram Moolenaar g:res = 'two' 29757e5bd91dSBram Moolenaar finish 29766797966dSBram Moolenaar g:res = 'three' 29777e5bd91dSBram Moolenaar END 29787e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29797e5bd91dSBram Moolenaar source Xfinished 29807e5bd91dSBram Moolenaar assert_equal('two', g:res) 29817e5bd91dSBram Moolenaar 29827e5bd91dSBram Moolenaar unlet g:res 29837e5bd91dSBram Moolenaar delete('Xfinished') 29847e5bd91dSBram Moolenaarenddef 29857e5bd91dSBram Moolenaar 298632e35117SBram Moolenaardef Test_let_func_call() 298732e35117SBram Moolenaar let lines =<< trim END 298832e35117SBram Moolenaar vim9script 298932e35117SBram Moolenaar func GetValue() 299032e35117SBram Moolenaar if exists('g:count') 299132e35117SBram Moolenaar let g:count += 1 299232e35117SBram Moolenaar else 299332e35117SBram Moolenaar let g:count = 1 299432e35117SBram Moolenaar endif 299532e35117SBram Moolenaar return 'this' 299632e35117SBram Moolenaar endfunc 299732e35117SBram Moolenaar let val: string = GetValue() 2998f5be8cdbSBram Moolenaar # env var is always a string 2999df671b46SBram Moolenaar let env = $TERM 300032e35117SBram Moolenaar END 300132e35117SBram Moolenaar writefile(lines, 'Xfinished') 300232e35117SBram Moolenaar source Xfinished 3003f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 300432e35117SBram Moolenaar assert_equal(1, g:count) 300532e35117SBram Moolenaar 300632e35117SBram Moolenaar unlet g:count 300732e35117SBram Moolenaar delete('Xfinished') 300832e35117SBram Moolenaarenddef 300932e35117SBram Moolenaar 301032e35117SBram Moolenaardef Test_let_missing_type() 301132e35117SBram Moolenaar let lines =<< trim END 301232e35117SBram Moolenaar vim9script 3013df671b46SBram Moolenaar let var = g:unknown 3014227a69deSBram Moolenaar END 3015822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 3016227a69deSBram Moolenaar 3017227a69deSBram Moolenaar lines =<< trim END 3018227a69deSBram Moolenaar vim9script 3019227a69deSBram Moolenaar let nr: number = 123 3020227a69deSBram Moolenaar let var = nr 3021227a69deSBram Moolenaar END 3022822ba247SBram Moolenaar CheckScriptSuccess(lines) 302332e35117SBram Moolenaarenddef 302432e35117SBram Moolenaar 3025c82a5b5dSBram Moolenaardef Test_let_declaration() 3026c82a5b5dSBram Moolenaar let lines =<< trim END 3027c82a5b5dSBram Moolenaar vim9script 3028c82a5b5dSBram Moolenaar let var: string 3029c82a5b5dSBram Moolenaar g:var_uninit = var 3030c82a5b5dSBram Moolenaar var = 'text' 3031c82a5b5dSBram Moolenaar g:var_test = var 3032f5be8cdbSBram Moolenaar # prefixing s: is optional 3033984dddbeSBram Moolenaar s:var = 'prefixed' 3034984dddbeSBram Moolenaar g:var_prefixed = s:var 3035984dddbeSBram Moolenaar 3036984dddbeSBram Moolenaar let s:other: number 3037984dddbeSBram Moolenaar other = 1234 3038984dddbeSBram Moolenaar g:other_var = other 303953b29e48SBram Moolenaar 304053b29e48SBram Moolenaar # type is inferred 304153b29e48SBram Moolenaar s:dict = {'a': 222} 304253b29e48SBram Moolenaar def GetDictVal(key: any) 304353b29e48SBram Moolenaar g:dict_val = s:dict[key] 304453b29e48SBram Moolenaar enddef 304553b29e48SBram Moolenaar GetDictVal('a') 3046c82a5b5dSBram Moolenaar END 3047c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 3048c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 3049c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 3050984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 3051984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 305253b29e48SBram Moolenaar assert_equal(222, g:dict_val) 3053c82a5b5dSBram Moolenaar 3054c82a5b5dSBram Moolenaar unlet g:var_uninit 3055c82a5b5dSBram Moolenaar unlet g:var_test 3056984dddbeSBram Moolenaar unlet g:var_prefixed 3057984dddbeSBram Moolenaar unlet g:other_var 3058c82a5b5dSBram Moolenaarenddef 3059c82a5b5dSBram Moolenaar 3060c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 3061c5b1c20bSBram Moolenaar let lines =<< trim END 3062c5b1c20bSBram Moolenaar vim9script 3063c5b1c20bSBram Moolenaar const var: string 3064c5b1c20bSBram Moolenaar END 3065c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 3066c5b1c20bSBram Moolenaar 3067c5b1c20bSBram Moolenaar lines =<< trim END 3068c5b1c20bSBram Moolenaar vim9script 3069c5b1c20bSBram Moolenaar let 9var: string 3070c5b1c20bSBram Moolenaar END 3071c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 3072c5b1c20bSBram Moolenaarenddef 3073c5b1c20bSBram Moolenaar 307434db91f7SBram Moolenaardef Test_let_type_check() 307534db91f7SBram Moolenaar let lines =<< trim END 307634db91f7SBram Moolenaar vim9script 307734db91f7SBram Moolenaar let var: string 307834db91f7SBram Moolenaar var = 1234 307934db91f7SBram Moolenaar END 3080451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 3081984dddbeSBram Moolenaar 3082984dddbeSBram Moolenaar lines =<< trim END 3083984dddbeSBram Moolenaar vim9script 3084984dddbeSBram Moolenaar let var:string 3085984dddbeSBram Moolenaar END 3086984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 3087c5b1c20bSBram Moolenaar 3088c5b1c20bSBram Moolenaar lines =<< trim END 3089c5b1c20bSBram Moolenaar vim9script 3090c5b1c20bSBram Moolenaar let var: asdf 3091c5b1c20bSBram Moolenaar END 3092c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 3093a71e2633SBram Moolenaar 3094a71e2633SBram Moolenaar lines =<< trim END 3095a71e2633SBram Moolenaar vim9script 3096a71e2633SBram Moolenaar let s:l: list<number> 3097a71e2633SBram Moolenaar s:l = [] 3098a71e2633SBram Moolenaar END 3099a71e2633SBram Moolenaar CheckScriptSuccess(lines) 3100a71e2633SBram Moolenaar 3101a71e2633SBram Moolenaar lines =<< trim END 3102a71e2633SBram Moolenaar vim9script 3103a71e2633SBram Moolenaar let s:d: dict<number> 3104a71e2633SBram Moolenaar s:d = {} 3105a71e2633SBram Moolenaar END 3106a71e2633SBram Moolenaar CheckScriptSuccess(lines) 310734db91f7SBram Moolenaarenddef 310834db91f7SBram Moolenaar 3109a5d0077eSBram Moolenaardef Test_forward_declaration() 3110a5d0077eSBram Moolenaar let lines =<< trim END 3111a5d0077eSBram Moolenaar vim9script 3112a5d0077eSBram Moolenaar def GetValue(): string 3113a5d0077eSBram Moolenaar return theVal 3114a5d0077eSBram Moolenaar enddef 3115a5d0077eSBram Moolenaar let theVal = 'something' 3116822ba247SBram Moolenaar g:initVal = GetValue() 3117a5d0077eSBram Moolenaar theVal = 'else' 3118a5d0077eSBram Moolenaar g:laterVal = GetValue() 3119a5d0077eSBram Moolenaar END 3120a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3121a5d0077eSBram Moolenaar source Xforward 3122a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3123a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3124a5d0077eSBram Moolenaar 3125a5d0077eSBram Moolenaar unlet g:initVal 3126a5d0077eSBram Moolenaar unlet g:laterVal 3127a5d0077eSBram Moolenaar delete('Xforward') 3128a5d0077eSBram Moolenaarenddef 3129a5d0077eSBram Moolenaar 31309721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 31319721fb4eSBram Moolenaar let legacy_lines =<< trim END 31329721fb4eSBram Moolenaar source Xvim9_script.vim 31339721fb4eSBram Moolenaar 31349721fb4eSBram Moolenaar call assert_false(exists('local')) 31359721fb4eSBram Moolenaar call assert_false(exists('exported')) 31369721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31379721fb4eSBram Moolenaar call assert_equal('global', global) 31389721fb4eSBram Moolenaar call assert_equal('global', g:global) 31399721fb4eSBram Moolenaar 31409721fb4eSBram Moolenaar " imported variable becomes script-local 31419721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31429721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31439721fb4eSBram Moolenaar call assert_false(exists('exported')) 31449721fb4eSBram Moolenaar 31459721fb4eSBram Moolenaar " imported function becomes script-local 31469721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31479721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31489721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31499721fb4eSBram Moolenaar END 31509721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31519721fb4eSBram Moolenaar 31529721fb4eSBram Moolenaar let vim9_lines =<< trim END 31539721fb4eSBram Moolenaar vim9script 31549721fb4eSBram Moolenaar let local = 'local' 31559721fb4eSBram Moolenaar g:global = 'global' 31569721fb4eSBram Moolenaar export let exported = 'exported' 31579721fb4eSBram Moolenaar export def GetText(): string 31589721fb4eSBram Moolenaar return 'text' 31599721fb4eSBram Moolenaar enddef 31609721fb4eSBram Moolenaar END 31619721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 31629721fb4eSBram Moolenaar 31639721fb4eSBram Moolenaar source Xlegacy_script.vim 31649721fb4eSBram Moolenaar 31659721fb4eSBram Moolenaar assert_equal('global', g:global) 3166f5be8cdbSBram Moolenaar unlet g:global 31679721fb4eSBram Moolenaar 31689721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31699721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31709721fb4eSBram Moolenaarenddef 3171a5d0077eSBram Moolenaar 31727d699701SBram Moolenaarfunc Test_vim9script_not_global() 31737d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31747d699701SBram Moolenaar let vim9lines =<< trim END 31757d699701SBram Moolenaar vim9script 31767d699701SBram Moolenaar let var = 'local' 31777d699701SBram Moolenaar func TheFunc() 31787d699701SBram Moolenaar echo 'local' 31797d699701SBram Moolenaar endfunc 31807d699701SBram Moolenaar def DefFunc() 31817d699701SBram Moolenaar echo 'local' 31827d699701SBram Moolenaar enddef 31837d699701SBram Moolenaar END 31847d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31857d699701SBram Moolenaar source Xvim9script.vim 31867d699701SBram Moolenaar try 31877d699701SBram Moolenaar echo g:var 31887d699701SBram Moolenaar assert_report('did not fail') 31897d699701SBram Moolenaar catch /E121:/ 31907d699701SBram Moolenaar " caught 31917d699701SBram Moolenaar endtry 31927d699701SBram Moolenaar try 31937d699701SBram Moolenaar call TheFunc() 31947d699701SBram Moolenaar assert_report('did not fail') 31957d699701SBram Moolenaar catch /E117:/ 31967d699701SBram Moolenaar " caught 31977d699701SBram Moolenaar endtry 31987d699701SBram Moolenaar try 31997d699701SBram Moolenaar call DefFunc() 32007d699701SBram Moolenaar assert_report('did not fail') 32017d699701SBram Moolenaar catch /E117:/ 32027d699701SBram Moolenaar " caught 32037d699701SBram Moolenaar endtry 32047d699701SBram Moolenaar 320525859dd7SBram Moolenaar call delete('Xvim9script.vim') 32067d699701SBram Moolenaarendfunc 32077d699701SBram Moolenaar 3208eeb27bfeSBram Moolenaardef Test_vim9_copen() 3209eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3210eeb27bfeSBram Moolenaar copen 3211eeb27bfeSBram Moolenaar quit 3212eeb27bfeSBram Moolenaarenddef 3213eeb27bfeSBram Moolenaar 32142d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 32152d6b20d6SBram Moolenaardef Test_vim9_autoload() 32162d6b20d6SBram Moolenaar let lines =<< trim END 32172d6b20d6SBram Moolenaar vim9script 32182d6b20d6SBram Moolenaar def foo#test() 32192d6b20d6SBram Moolenaar echomsg getreg('"') 32202d6b20d6SBram Moolenaar enddef 32212d6b20d6SBram Moolenaar END 32222d6b20d6SBram Moolenaar 32232d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32242d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 32252d6b20d6SBram Moolenaar let save_rtp = &rtp 32262d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32272d6b20d6SBram Moolenaar augroup test 32282d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32292d6b20d6SBram Moolenaar augroup END 32302d6b20d6SBram Moolenaar 32312d6b20d6SBram Moolenaar normal Y 32322d6b20d6SBram Moolenaar 32332d6b20d6SBram Moolenaar augroup test 32342d6b20d6SBram Moolenaar autocmd! 32352d6b20d6SBram Moolenaar augroup END 32362d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32372d6b20d6SBram Moolenaar &rtp = save_rtp 32382d6b20d6SBram Moolenaarenddef 32392d6b20d6SBram Moolenaar 324081e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 324181e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 324281e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 324381e17fbeSBram Moolenaar let lines =<< trim END 324481e17fbeSBram Moolenaar let s:counter = 1 324581e17fbeSBram Moolenaar def s:Func() 324681e17fbeSBram Moolenaar au! CursorHold 324781e17fbeSBram Moolenaar au CursorHold * s:counter += 1 324881e17fbeSBram Moolenaar enddef 324981e17fbeSBram Moolenaar call s:Func() 325081e17fbeSBram Moolenaar doau CursorHold 325181e17fbeSBram Moolenaar call assert_equal(2, s:counter) 325281e17fbeSBram Moolenaar au! CursorHold 325381e17fbeSBram Moolenaar END 325481e17fbeSBram Moolenaar CheckScriptSuccess(lines) 325581e17fbeSBram Moolenaarenddef 325681e17fbeSBram Moolenaar 32573896a105SBram Moolenaardef Test_cmdline_win() 32583896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32593896a105SBram Moolenaar # the command line window. 32603896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 32613896a105SBram Moolenaar let export_lines =<< trim END 32623896a105SBram Moolenaar vim9script 32633896a105SBram Moolenaar export let That = 'yes' 32643896a105SBram Moolenaar END 32653896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 32663896a105SBram Moolenaar let import_lines =<< trim END 32673896a105SBram Moolenaar vim9script 32683896a105SBram Moolenaar import That from './Xexport.vim' 32693896a105SBram Moolenaar END 32703896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 32713896a105SBram Moolenaar let save_rtp = &rtp 32723896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32733896a105SBram Moolenaar syntax on 32743896a105SBram Moolenaar augroup CmdWin 32753896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32763896a105SBram Moolenaar augroup END 32773896a105SBram Moolenaar # this will open and also close the cmdline window 32783896a105SBram Moolenaar feedkeys('q:', 'xt') 32793896a105SBram Moolenaar assert_equal('yes', g:got_there) 32803896a105SBram Moolenaar 32813896a105SBram Moolenaar augroup CmdWin 32823896a105SBram Moolenaar au! 32833896a105SBram Moolenaar augroup END 32843896a105SBram Moolenaar &rtp = save_rtp 32853896a105SBram Moolenaar delete('rtp', 'rf') 32863896a105SBram Moolenaarenddef 32873896a105SBram Moolenaar 3288e3d4685fSBram Moolenaardef Test_invalid_sid() 3289e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 329025859dd7SBram Moolenaar 3291e3d4685fSBram Moolenaar if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"') 3292d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3293e3d4685fSBram Moolenaar endif 3294e3d4685fSBram Moolenaar delete('Xdidit') 3295e3d4685fSBram Moolenaarenddef 3296e3d4685fSBram Moolenaar 3297585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3298585fea7bSBram Moolenaardef Test_substitute_cmd() 3299585fea7bSBram Moolenaar new 3300585fea7bSBram Moolenaar setline(1, 'something') 3301585fea7bSBram Moolenaar :substitute(some(other( 3302585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3303585fea7bSBram Moolenaar bwipe! 3304585fea7bSBram Moolenaar 3305f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3306585fea7bSBram Moolenaar let lines =<< trim END 3307585fea7bSBram Moolenaar vim9script 3308585fea7bSBram Moolenaar new 3309585fea7bSBram Moolenaar setline(1, 'something') 3310585fea7bSBram Moolenaar :substitute(some(other( 3311585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3312585fea7bSBram Moolenaar bwipe! 3313585fea7bSBram Moolenaar END 3314585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3315585fea7bSBram Moolenaar source Xvim9lines 3316585fea7bSBram Moolenaar 3317585fea7bSBram Moolenaar delete('Xvim9lines') 3318585fea7bSBram Moolenaarenddef 3319585fea7bSBram Moolenaar 33208a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3321