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 78a7d6542SBram Moolenaar 88a7d6542SBram Moolenaardef Test_syntax() 98a7d6542SBram Moolenaar let var = 234 108a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 118a7d6542SBram Moolenaarenddef 128a7d6542SBram Moolenaar 136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 146e587dcbSBram Moolenaarlet s:addToMe = 111 15401d9ffbSBram Moolenaarlet g:existing = 'yes' 16a8c17704SBram Moolenaarlet g:inc_counter = 1 17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 18a6e67e4fSBram Moolenaarlet g:alist = [7] 19a6e67e4fSBram Moolenaarlet g:astring = 'text' 20f0b9f43cSBram Moolenaarlet g:anumber = 123 216e587dcbSBram Moolenaar 228a7d6542SBram Moolenaardef Test_assignment() 238a7d6542SBram Moolenaar let bool1: bool = true 248a7d6542SBram Moolenaar assert_equal(v:true, bool1) 258a7d6542SBram Moolenaar let bool2: bool = false 268a7d6542SBram Moolenaar assert_equal(v:false, bool2) 278a7d6542SBram Moolenaar 28f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 29f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 301cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 3198b4f145SBram Moolenaar call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 32f93c7feaSBram Moolenaar 334cdb13ceSBram Moolenaar let nr: number = 1234 34451c2e35SBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:') 354cdb13ceSBram Moolenaar 36b209750bSBram Moolenaar let a: number = 6 #comment 379be61bbbSBram Moolenaar assert_equal(6, a) 389be61bbbSBram Moolenaar 3942a480bfSBram Moolenaar if has('channel') 4042a480bfSBram Moolenaar let chan1: channel 41fbdd08edSBram Moolenaar let job1: job 42f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 4342a480bfSBram Moolenaar endif 44fbdd08edSBram Moolenaar if has('float') 45fbdd08edSBram Moolenaar let float1: float = 3.4 46fbdd08edSBram Moolenaar endif 475deeb3f1SBram Moolenaar let Funky1: func 485deeb3f1SBram Moolenaar let Funky2: func = function('len') 494c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 5042a480bfSBram Moolenaar 51b209750bSBram Moolenaar g:newvar = 'new' #comment 52401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 53401d9ffbSBram Moolenaar 54401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 55401d9ffbSBram Moolenaar g:existing = 'no' 56401d9ffbSBram Moolenaar assert_equal('no', g:existing) 57401d9ffbSBram Moolenaar 58b283a8a6SBram Moolenaar v:char = 'abc' 596e587dcbSBram Moolenaar assert_equal('abc', v:char) 60b283a8a6SBram Moolenaar 61b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 626e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 63b283a8a6SBram Moolenaar $ENVVAR = '' 646e587dcbSBram Moolenaar 65b5ed2660SBram Moolenaar let lines =<< trim END 66b5ed2660SBram Moolenaar vim9script 67b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 68b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 69b5ed2660SBram Moolenaar $ENVVAR = '' 70b5ed2660SBram Moolenaar END 71b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 72b5ed2660SBram Moolenaar 73fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 74fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 75fd1823e0SBram Moolenaar s:addToMe += 222 76fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 770bbf722aSBram Moolenaar s:newVar = 'new' 780bbf722aSBram Moolenaar assert_equal('new', s:newVar) 79a8c17704SBram Moolenaar 80a8c17704SBram Moolenaar set ts=7 81a8c17704SBram Moolenaar &ts += 1 82a8c17704SBram Moolenaar assert_equal(8, &ts) 8380c34ca3SBram Moolenaar &ts -= 3 8480c34ca3SBram Moolenaar assert_equal(5, &ts) 8580c34ca3SBram Moolenaar &ts *= 2 8680c34ca3SBram Moolenaar assert_equal(10, &ts) 8780c34ca3SBram Moolenaar &ts /= 3 8880c34ca3SBram Moolenaar assert_equal(3, &ts) 8980c34ca3SBram Moolenaar set ts=10 9080c34ca3SBram Moolenaar &ts %= 4 9180c34ca3SBram Moolenaar assert_equal(2, &ts) 92b5ed2660SBram Moolenaar 93b5ed2660SBram Moolenaar lines =<< trim END 94b5ed2660SBram Moolenaar vim9script 95b5ed2660SBram Moolenaar &ts = 6 96b5ed2660SBram Moolenaar &ts += 3 97b5ed2660SBram Moolenaar assert_equal(9, &ts) 98b5ed2660SBram Moolenaar END 99b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 100b5ed2660SBram Moolenaar 101a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 102a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 103451c2e35SBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1012:') 104a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 105451c2e35SBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1012:') 106a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 107451c2e35SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1012:') 108a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 109cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 110585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11180c34ca3SBram Moolenaar &ts = 8 112a8c17704SBram Moolenaar 11333afa244SBram Moolenaar call CheckDefFailure(['let s:var = 123'], 'E1101:') 11433afa244SBram Moolenaar call CheckDefFailure(['let s:var: number'], 'E1101:') 11533afa244SBram Moolenaar 116f9b2b496SBram Moolenaar lines =<< trim END 117f9b2b496SBram Moolenaar vim9script 118f9b2b496SBram Moolenaar def SomeFunc() 119f9b2b496SBram Moolenaar s:var = 123 120f9b2b496SBram Moolenaar enddef 121f9b2b496SBram Moolenaar defcompile 122f9b2b496SBram Moolenaar END 123f9b2b496SBram Moolenaar call CheckScriptFailure(lines, 'E1089:') 124f9b2b496SBram Moolenaar 125a8c17704SBram Moolenaar g:inc_counter += 1 126a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 127a8c17704SBram Moolenaar 128a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 129a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 130dd29f1b0SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 131451c2e35SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 132a8c17704SBram Moolenaar 133a8c17704SBram Moolenaar @a = 'areg' 134a8c17704SBram Moolenaar @a ..= 'add' 135a8c17704SBram Moolenaar assert_equal('aregadd', @a) 136dd29f1b0SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1051:') 137451c2e35SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1012:') 138e69f6d04SBram Moolenaar 139b5ed2660SBram Moolenaar lines =<< trim END 140b5ed2660SBram Moolenaar vim9script 141b5ed2660SBram Moolenaar @c = 'areg' 142b5ed2660SBram Moolenaar @c ..= 'add' 143b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 144b5ed2660SBram Moolenaar END 145b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 146b5ed2660SBram Moolenaar 147e69f6d04SBram Moolenaar v:errmsg = 'none' 148e69f6d04SBram Moolenaar v:errmsg ..= 'again' 149e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 150dd29f1b0SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 151451c2e35SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1012:') 15233afa244SBram Moolenaar 15333afa244SBram Moolenaar # single letter variables 15433afa244SBram Moolenaar a = 123 15533afa244SBram Moolenaar assert_equal(123, a) 15633afa244SBram Moolenaar let b: number 15733afa244SBram Moolenaar b = 123 15833afa244SBram Moolenaar assert_equal(123, b) 15933afa244SBram Moolenaar let g: number 16033afa244SBram Moolenaar g = 123 16133afa244SBram Moolenaar assert_equal(123, g) 16233afa244SBram Moolenaar let s: number 16333afa244SBram Moolenaar s = 123 16433afa244SBram Moolenaar assert_equal(123, s) 16533afa244SBram Moolenaar let t: number 16633afa244SBram Moolenaar t = 123 16733afa244SBram Moolenaar assert_equal(123, t) 16833afa244SBram Moolenaar let v: number 16933afa244SBram Moolenaar v = 123 17033afa244SBram Moolenaar assert_equal(123, v) 17133afa244SBram Moolenaar let w: number 17233afa244SBram Moolenaar w = 123 17333afa244SBram Moolenaar assert_equal(123, w) 1745deeb3f1SBram Moolenaarenddef 1755deeb3f1SBram Moolenaar 1763b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1773b74b6b4SBram Moolenaar let lines =<< trim END 1783b74b6b4SBram Moolenaar vim9script 1793b74b6b4SBram Moolenaar 180f5be8cdbSBram Moolenaar # single character variable declarations work 1813b74b6b4SBram Moolenaar let a: string 1823b74b6b4SBram Moolenaar let b: number 1833b74b6b4SBram Moolenaar let l: list<any> 1843b74b6b4SBram Moolenaar let s: string 1853b74b6b4SBram Moolenaar let t: number 1863b74b6b4SBram Moolenaar let v: number 1873b74b6b4SBram Moolenaar let w: number 1883b74b6b4SBram Moolenaar 189f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1903b74b6b4SBram Moolenaar a = 'script-a' 1913b74b6b4SBram Moolenaar b = 111 1923b74b6b4SBram Moolenaar l = [1, 2, 3] 1933b74b6b4SBram Moolenaar s = 'script-s' 1943b74b6b4SBram Moolenaar t = 222 1953b74b6b4SBram Moolenaar v = 333 1963b74b6b4SBram Moolenaar w = 444 1973b74b6b4SBram Moolenaar 1983b74b6b4SBram Moolenaar assert_equal('script-a', a) 1993b74b6b4SBram Moolenaar assert_equal(111, b) 2003b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2013b74b6b4SBram Moolenaar assert_equal('script-s', s) 2023b74b6b4SBram Moolenaar assert_equal(222, t) 2033b74b6b4SBram Moolenaar assert_equal(333, v) 2043b74b6b4SBram Moolenaar assert_equal(444, w) 2053b74b6b4SBram Moolenaar END 2063b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2073b74b6b4SBram Moolenaar source Xsinglechar 2083b74b6b4SBram Moolenaar delete('Xsinglechar') 2093b74b6b4SBram Moolenaarenddef 2103b74b6b4SBram Moolenaar 21184370087SBram Moolenaardef Test_assignment_list() 21284370087SBram Moolenaar let list1: list<bool> = [false, true, false] 21384370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 21484370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 21584370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 21684370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 21784370087SBram Moolenaar 21884370087SBram Moolenaar let listS: list<string> = [] 21984370087SBram Moolenaar let listN: list<number> = [] 22084370087SBram Moolenaar 22184370087SBram Moolenaar assert_equal([1, 2, 3], list2) 22284370087SBram Moolenaar list2[-1] = 99 22384370087SBram Moolenaar assert_equal([1, 2, 99], list2) 22484370087SBram Moolenaar list2[-2] = 88 22584370087SBram Moolenaar assert_equal([1, 88, 99], list2) 22684370087SBram Moolenaar list2[-3] = 77 22784370087SBram Moolenaar assert_equal([77, 88, 99], list2) 228dd29f1b0SBram Moolenaar list2 += [100] 229dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 230dd29f1b0SBram Moolenaar 231dd29f1b0SBram Moolenaar list3 += ['end'] 232dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 233dd29f1b0SBram Moolenaar 234dd29f1b0SBram Moolenaar 23584370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 236c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 23784370087SBram Moolenaar 23884370087SBram Moolenaar # type becomes list<any> 23984370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 24084370087SBram Moolenaarenddef 24184370087SBram Moolenaar 242b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 243b31be3f9SBram Moolenaar let lines =<< trim END 244b31be3f9SBram Moolenaar vim9script 245b31be3f9SBram Moolenaar let v1: number 246b31be3f9SBram Moolenaar let v2: number 247b31be3f9SBram Moolenaar let v3: number 248b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 249b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 250b31be3f9SBram Moolenaar END 251b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 252b31be3f9SBram Moolenaarenddef 253b31be3f9SBram Moolenaar 25484370087SBram Moolenaardef Test_assignment_dict() 25584370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 25684370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 25784370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 25884370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 25974fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 26084370087SBram Moolenaar 261f5be8cdbSBram Moolenaar # overwrite 262c785b9a7SBram Moolenaar dict3['key'] = 'another' 263c785b9a7SBram Moolenaar 26458626872SBram Moolenaar # empty key can be used 26558626872SBram Moolenaar let dd = {} 26658626872SBram Moolenaar dd[""] = 6 26758626872SBram Moolenaar assert_equal({'': 6}, dd) 26884370087SBram Moolenaar 26984370087SBram Moolenaar # type becomes dict<any> 27084370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 2718e4c8c85SBram Moolenaar 2728e4c8c85SBram Moolenaar # assignment to script-local dict 2738e4c8c85SBram Moolenaar let lines =<< trim END 2748e4c8c85SBram Moolenaar vim9script 2758e4c8c85SBram Moolenaar let test: dict<any> = {} 2768e4c8c85SBram Moolenaar def FillDict(): dict<any> 2778e4c8c85SBram Moolenaar test['a'] = 43 2788e4c8c85SBram Moolenaar return test 2798e4c8c85SBram Moolenaar enddef 2808e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2818e4c8c85SBram Moolenaar END 2828e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 2838e4c8c85SBram Moolenaar 2848e4c8c85SBram Moolenaar lines =<< trim END 2858e4c8c85SBram Moolenaar vim9script 2868e4c8c85SBram Moolenaar let test: dict<any> 2878e4c8c85SBram Moolenaar def FillDict(): dict<any> 2888e4c8c85SBram Moolenaar test['a'] = 43 2898e4c8c85SBram Moolenaar return test 2908e4c8c85SBram Moolenaar enddef 2918e4c8c85SBram Moolenaar FillDict() 2928e4c8c85SBram Moolenaar END 2938e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 2942caa1594SBram Moolenaar 2952caa1594SBram Moolenaar # assignment to global dict 2962caa1594SBram Moolenaar lines =<< trim END 2972caa1594SBram Moolenaar vim9script 2982caa1594SBram Moolenaar g:test = {} 2992caa1594SBram Moolenaar def FillDict(): dict<any> 3002caa1594SBram Moolenaar g:test['a'] = 43 3012caa1594SBram Moolenaar return g:test 3022caa1594SBram Moolenaar enddef 3032caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3042caa1594SBram Moolenaar END 3052caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3062caa1594SBram Moolenaar 3072caa1594SBram Moolenaar # assignment to buffer dict 3082caa1594SBram Moolenaar lines =<< trim END 3092caa1594SBram Moolenaar vim9script 3102caa1594SBram Moolenaar b:test = {} 3112caa1594SBram Moolenaar def FillDict(): dict<any> 3122caa1594SBram Moolenaar b:test['a'] = 43 3132caa1594SBram Moolenaar return b:test 3142caa1594SBram Moolenaar enddef 3152caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3162caa1594SBram Moolenaar END 3172caa1594SBram Moolenaar call CheckScriptSuccess(lines) 31884370087SBram Moolenaarenddef 31984370087SBram Moolenaar 320d3aac291SBram Moolenaardef Test_assignment_local() 321f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 322f5be8cdbSBram Moolenaar # changed. 323d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 324d3aac291SBram Moolenaar let b:existing = 'yes' 325d3aac291SBram Moolenaar let w:existing = 'yes' 326d3aac291SBram Moolenaar let t:existing = 'yes' 327d3aac291SBram Moolenaar 328d3aac291SBram Moolenaar def Test_assignment_local_internal() 329d3aac291SBram Moolenaar b:newvar = 'new' 330d3aac291SBram Moolenaar assert_equal('new', b:newvar) 331d3aac291SBram Moolenaar assert_equal('yes', b:existing) 332d3aac291SBram Moolenaar b:existing = 'no' 333d3aac291SBram Moolenaar assert_equal('no', b:existing) 334396f3138SBram Moolenaar b:existing ..= 'NO' 335396f3138SBram Moolenaar assert_equal('noNO', b:existing) 336d3aac291SBram Moolenaar 337d3aac291SBram Moolenaar w:newvar = 'new' 338d3aac291SBram Moolenaar assert_equal('new', w:newvar) 339d3aac291SBram Moolenaar assert_equal('yes', w:existing) 340d3aac291SBram Moolenaar w:existing = 'no' 341d3aac291SBram Moolenaar assert_equal('no', w:existing) 342396f3138SBram Moolenaar w:existing ..= 'NO' 343396f3138SBram Moolenaar assert_equal('noNO', w:existing) 344d3aac291SBram Moolenaar 345d3aac291SBram Moolenaar t:newvar = 'new' 346d3aac291SBram Moolenaar assert_equal('new', t:newvar) 347d3aac291SBram Moolenaar assert_equal('yes', t:existing) 348d3aac291SBram Moolenaar t:existing = 'no' 349d3aac291SBram Moolenaar assert_equal('no', t:existing) 350396f3138SBram Moolenaar t:existing ..= 'NO' 351396f3138SBram Moolenaar assert_equal('noNO', t:existing) 352d3aac291SBram Moolenaar enddef 353d3aac291SBram Moolenaar call Test_assignment_local_internal() 354d3aac291SBram Moolenaar END 355d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 356d3aac291SBram Moolenaarenddef 357d3aac291SBram Moolenaar 3585deeb3f1SBram Moolenaardef Test_assignment_default() 359e69f6d04SBram Moolenaar 360cb711abfSBram Moolenaar # Test default values. 361e69f6d04SBram Moolenaar let thebool: bool 362e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 363e69f6d04SBram Moolenaar 364e69f6d04SBram Moolenaar let thenumber: number 365e69f6d04SBram Moolenaar assert_equal(0, thenumber) 366e69f6d04SBram Moolenaar 367e69f6d04SBram Moolenaar if has('float') 368e69f6d04SBram Moolenaar let thefloat: float 369e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 370e69f6d04SBram Moolenaar endif 371e69f6d04SBram Moolenaar 372e69f6d04SBram Moolenaar let thestring: string 373e69f6d04SBram Moolenaar assert_equal('', thestring) 374e69f6d04SBram Moolenaar 375e69f6d04SBram Moolenaar let theblob: blob 376e69f6d04SBram Moolenaar assert_equal(0z, theblob) 377e69f6d04SBram Moolenaar 3785deeb3f1SBram Moolenaar let Thefunc: func 3795deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 380e69f6d04SBram Moolenaar 381e69f6d04SBram Moolenaar let thelist: list<any> 382e69f6d04SBram Moolenaar assert_equal([], thelist) 383e69f6d04SBram Moolenaar 384e69f6d04SBram Moolenaar let thedict: dict<any> 385e69f6d04SBram Moolenaar assert_equal({}, thedict) 386e69f6d04SBram Moolenaar 3872c869deeSBram Moolenaar if has('channel') 388e69f6d04SBram Moolenaar let thejob: job 389e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 390e69f6d04SBram Moolenaar 391e69f6d04SBram Moolenaar let thechannel: channel 392e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 393c785b9a7SBram Moolenaar 394c785b9a7SBram Moolenaar if has('unix') && executable('cat') 395f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 396c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 397c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 398c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 399c785b9a7SBram Moolenaar endif 4002c869deeSBram Moolenaar endif 401585fea7bSBram Moolenaar 402585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 403585fea7bSBram Moolenaar assert_equal(5678, nr) 4048a7d6542SBram Moolenaarenddef 4058a7d6542SBram Moolenaar 40647a519a9SBram Moolenaardef Test_assignment_var_list() 40747a519a9SBram Moolenaar let v1: string 40847a519a9SBram Moolenaar let v2: string 4099af78769SBram Moolenaar let vrem: list<string> 4109af78769SBram Moolenaar [v1] = ['aaa'] 4119af78769SBram Moolenaar assert_equal('aaa', v1) 4129af78769SBram Moolenaar 41347a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 41447a519a9SBram Moolenaar assert_equal('one', v1) 41547a519a9SBram Moolenaar assert_equal('two', v2) 4169af78769SBram Moolenaar 4179af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4189af78769SBram Moolenaar assert_equal('one', v1) 4199af78769SBram Moolenaar assert_equal('two', v2) 4209af78769SBram Moolenaar assert_equal([], vrem) 4219af78769SBram Moolenaar 4229af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4239af78769SBram Moolenaar assert_equal('one', v1) 4249af78769SBram Moolenaar assert_equal('two', v2) 4259af78769SBram Moolenaar assert_equal(['three'], vrem) 4261c199f9cSBram Moolenaar 4271c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 4281c199f9cSBram Moolenaar assert_equal(3, &ts) 4291c199f9cSBram Moolenaar assert_equal(4, &sw) 4301c199f9cSBram Moolenaar set ts=8 sw=4 43147a519a9SBram Moolenaarenddef 43247a519a9SBram Moolenaar 433c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 434c7e44a7eSBram Moolenaar let lines =<< trim END 435c7e44a7eSBram Moolenaar vim9script 436c7e44a7eSBram Moolenaar def Func(): list<number> 437c7e44a7eSBram Moolenaar return [1, 2] 438c7e44a7eSBram Moolenaar enddef 439c7e44a7eSBram Moolenaar let var1: number 440c7e44a7eSBram Moolenaar let var2: number 441c7e44a7eSBram Moolenaar [var1, var2] = 442c7e44a7eSBram Moolenaar Func() 443c7e44a7eSBram Moolenaar assert_equal(1, var1) 444c7e44a7eSBram Moolenaar assert_equal(2, var2) 445c7e44a7eSBram Moolenaar let ll = 446c7e44a7eSBram Moolenaar Func() 447c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 44883144546SBram Moolenaar 44983144546SBram Moolenaar @/ = 'text' 45083144546SBram Moolenaar assert_equal('text', @/) 45183144546SBram Moolenaar @0 = 'zero' 45283144546SBram Moolenaar assert_equal('zero', @0) 45383144546SBram Moolenaar @1 = 'one' 45483144546SBram Moolenaar assert_equal('one', @1) 45583144546SBram Moolenaar @9 = 'nine' 45683144546SBram Moolenaar assert_equal('nine', @9) 45783144546SBram Moolenaar @- = 'minus' 45883144546SBram Moolenaar assert_equal('minus', @-) 45983144546SBram Moolenaar if has('clipboard_working') 46083144546SBram Moolenaar @* = 'star' 46183144546SBram Moolenaar assert_equal('star', @*) 46283144546SBram Moolenaar @+ = 'plus' 46383144546SBram Moolenaar assert_equal('plus', @+) 46483144546SBram Moolenaar endif 46595dd9f25SBram Moolenaar 46695dd9f25SBram Moolenaar let a: number = 123 46795dd9f25SBram Moolenaar assert_equal(123, a) 46895dd9f25SBram Moolenaar let s: string = 'yes' 46995dd9f25SBram Moolenaar assert_equal('yes', s) 47095dd9f25SBram Moolenaar let b: number = 42 47195dd9f25SBram Moolenaar assert_equal(42, b) 47295dd9f25SBram Moolenaar let w: number = 43 47395dd9f25SBram Moolenaar assert_equal(43, w) 47495dd9f25SBram Moolenaar let t: number = 44 47595dd9f25SBram Moolenaar assert_equal(44, t) 476c7e44a7eSBram Moolenaar END 477c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 478c7e44a7eSBram Moolenaarenddef 479c7e44a7eSBram Moolenaar 480cab27678SBram Moolenaardef Mess(): string 481cab27678SBram Moolenaar v:foldstart = 123 482cab27678SBram Moolenaar return 'xxx' 483cab27678SBram Moolenaarenddef 484cab27678SBram Moolenaar 485d72c1bf0SBram Moolenaardef Test_assignment_failure() 4868a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4878a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4888a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4898a7d6542SBram Moolenaar 49063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 49163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 49263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 49363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 49463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 49563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 49663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 49763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 49863be3d4bSBram Moolenaar 4998a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 5008a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 5018a7d6542SBram Moolenaar 5029b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 5039af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5049af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 5059af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5069af78769SBram Moolenaar '[a] = []'], 'E1093:') 5079af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5089af78769SBram Moolenaar 'let y: number', 5099af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 5109af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5119af78769SBram Moolenaar 'let y: number', 5129af78769SBram Moolenaar 'let z: list<number>', 5139af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5149be61bbbSBram Moolenaar 515e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 516c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5179be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 518c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5199be61bbbSBram Moolenaar 520e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 521c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5229be61bbbSBram Moolenaar 523434d72cbSBram Moolenaar if has('dnd') 52465821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 525434d72cbSBram Moolenaar else 526434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 527434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 528434d72cbSBram Moolenaar endif 5299be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 53065821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 531c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5329be61bbbSBram Moolenaar 533e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 534e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 535e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 536e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5379be61bbbSBram Moolenaar 5389be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5399be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5409be61bbbSBram Moolenaar 541451c2e35SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 54233fa29cfSBram Moolenaar 5438a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5448a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5458a7d6542SBram Moolenaar 5468a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5478a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5488a7d6542SBram Moolenaar 5498a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5508a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 55142a480bfSBram Moolenaar 552d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 55342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 554cab27678SBram Moolenaar 555cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 556cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 55743e969d3SBram Moolenaar 55843e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 55943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 56043e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 56143e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 56243e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 56343e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 56443e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 56543e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 566d72c1bf0SBram Moolenaarenddef 567d72c1bf0SBram Moolenaar 568d72c1bf0SBram Moolenaardef Test_unlet() 569d72c1bf0SBram Moolenaar g:somevar = 'yes' 570d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 571d72c1bf0SBram Moolenaar unlet g:somevar 572d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 573d72c1bf0SBram Moolenaar unlet! g:somevar 574d72c1bf0SBram Moolenaar 575d72c1bf0SBram Moolenaar call CheckScriptFailure([ 576d72c1bf0SBram Moolenaar 'vim9script', 577d72c1bf0SBram Moolenaar 'let svar = 123', 578d72c1bf0SBram Moolenaar 'unlet svar', 579d72c1bf0SBram Moolenaar ], 'E1081:') 580d72c1bf0SBram Moolenaar call CheckScriptFailure([ 581d72c1bf0SBram Moolenaar 'vim9script', 582d72c1bf0SBram Moolenaar 'let svar = 123', 583d72c1bf0SBram Moolenaar 'unlet s:svar', 584d72c1bf0SBram Moolenaar ], 'E1081:') 585d72c1bf0SBram Moolenaar call CheckScriptFailure([ 586d72c1bf0SBram Moolenaar 'vim9script', 587d72c1bf0SBram Moolenaar 'let svar = 123', 588d72c1bf0SBram Moolenaar 'def Func()', 589d72c1bf0SBram Moolenaar ' unlet svar', 590d72c1bf0SBram Moolenaar 'enddef', 591822ba247SBram Moolenaar 'defcompile', 592d72c1bf0SBram Moolenaar ], 'E1081:') 593d72c1bf0SBram Moolenaar call CheckScriptFailure([ 594d72c1bf0SBram Moolenaar 'vim9script', 595d72c1bf0SBram Moolenaar 'let svar = 123', 596d72c1bf0SBram Moolenaar 'def Func()', 597d72c1bf0SBram Moolenaar ' unlet s:svar', 598d72c1bf0SBram Moolenaar 'enddef', 599822ba247SBram Moolenaar 'defcompile', 600d72c1bf0SBram Moolenaar ], 'E1081:') 6017bdaea6eSBram Moolenaar 6027bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6037bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6047bdaea6eSBram Moolenaar unlet $ENVVAR 6057bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 606d72c1bf0SBram Moolenaarenddef 607599c89c8SBram Moolenaar 6084c17ad94SBram Moolenaardef Test_delfunction() 609f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6104c17ad94SBram Moolenaar CheckScriptSuccess([ 6114c17ad94SBram Moolenaar 'vim9script', 6124c17ad94SBram Moolenaar 'func CheckMe()', 6134c17ad94SBram Moolenaar ' return 123', 6144c17ad94SBram Moolenaar 'endfunc', 6154c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6164c17ad94SBram Moolenaar ]) 6174c17ad94SBram Moolenaar 618f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6194c17ad94SBram Moolenaar CheckScriptFailure([ 6204c17ad94SBram Moolenaar 'vim9script', 6214c17ad94SBram Moolenaar 'func DeleteMe1()', 6224c17ad94SBram Moolenaar 'endfunc', 6234c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6244c17ad94SBram Moolenaar ], 'E1084:') 6254c17ad94SBram Moolenaar CheckScriptFailure([ 6264c17ad94SBram Moolenaar 'vim9script', 6274c17ad94SBram Moolenaar 'func DeleteMe2()', 6284c17ad94SBram Moolenaar 'endfunc', 6294c17ad94SBram Moolenaar 'def DoThat()', 6304c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6314c17ad94SBram Moolenaar 'enddef', 6324c17ad94SBram Moolenaar 'DoThat()', 6334c17ad94SBram Moolenaar ], 'E1084:') 6344c17ad94SBram Moolenaar CheckScriptFailure([ 6354c17ad94SBram Moolenaar 'vim9script', 6364c17ad94SBram Moolenaar 'def DeleteMe3()', 6374c17ad94SBram Moolenaar 'enddef', 6384c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6394c17ad94SBram Moolenaar ], 'E1084:') 6404c17ad94SBram Moolenaar CheckScriptFailure([ 6414c17ad94SBram Moolenaar 'vim9script', 6424c17ad94SBram Moolenaar 'def DeleteMe4()', 6434c17ad94SBram Moolenaar 'enddef', 6444c17ad94SBram Moolenaar 'def DoThat()', 6454c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6464c17ad94SBram Moolenaar 'enddef', 6474c17ad94SBram Moolenaar 'DoThat()', 6484c17ad94SBram Moolenaar ], 'E1084:') 649925e9fd6SBram Moolenaar 650925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 651925e9fd6SBram Moolenaar let lines =<< trim END 652925e9fd6SBram Moolenaar vim9script 653925e9fd6SBram Moolenaar def g:Global(): string 654925e9fd6SBram Moolenaar return "yes" 655925e9fd6SBram Moolenaar enddef 656925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 657925e9fd6SBram Moolenaar def! g:Global(): string 658925e9fd6SBram Moolenaar return "no" 659925e9fd6SBram Moolenaar enddef 660925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 661925e9fd6SBram Moolenaar delfunc g:Global 662925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 663925e9fd6SBram Moolenaar END 664925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 665925e9fd6SBram Moolenaar 666925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 667925e9fd6SBram Moolenaar lines =<< trim END 668925e9fd6SBram Moolenaar vim9script 669925e9fd6SBram Moolenaar func g:Global() 670925e9fd6SBram Moolenaar return "yes" 671925e9fd6SBram Moolenaar endfunc 672925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 673925e9fd6SBram Moolenaar def! g:Global(): string 674925e9fd6SBram Moolenaar return "no" 675925e9fd6SBram Moolenaar enddef 676925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 677925e9fd6SBram Moolenaar delfunc g:Global 678925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 679925e9fd6SBram Moolenaar END 680925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 681925e9fd6SBram Moolenaar 682925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 683925e9fd6SBram Moolenaar lines =<< trim END 684925e9fd6SBram Moolenaar vim9script 685925e9fd6SBram Moolenaar def g:Global(): string 686925e9fd6SBram Moolenaar return "yes" 687925e9fd6SBram Moolenaar enddef 688925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 689925e9fd6SBram Moolenaar func! g:Global() 690925e9fd6SBram Moolenaar return "no" 691925e9fd6SBram Moolenaar endfunc 692925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 693925e9fd6SBram Moolenaar delfunc g:Global 694925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 695925e9fd6SBram Moolenaar END 696925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6974c17ad94SBram Moolenaarenddef 6984c17ad94SBram Moolenaar 699599c89c8SBram Moolenaarfunc Test_wrong_type() 700599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 701599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 702599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 703599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 704599c89c8SBram Moolenaar 705599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 706599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 70742a480bfSBram Moolenaar 70842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 70942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 71042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 71142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 71242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 71342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 71442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 71542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 71642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 71742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 71842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 719a0a9f43aSBram Moolenaar 720a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 721a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7228a7d6542SBram Moolenaarendfunc 7238a7d6542SBram Moolenaar 7248a7d6542SBram Moolenaarfunc Test_const() 7258a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7268a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7278a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7289be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7298a7d6542SBram Moolenaarendfunc 7308a7d6542SBram Moolenaar 731df069eecSBram Moolenaardef Test_range_no_colon() 732df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 733df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 734df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 735df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 736df069eecSBram Moolenaarenddef 737df069eecSBram Moolenaar 738df069eecSBram Moolenaar 7398a7d6542SBram Moolenaardef Test_block() 7408a7d6542SBram Moolenaar let outer = 1 7418a7d6542SBram Moolenaar { 7428a7d6542SBram Moolenaar let inner = 2 7438a7d6542SBram Moolenaar assert_equal(1, outer) 7448a7d6542SBram Moolenaar assert_equal(2, inner) 7458a7d6542SBram Moolenaar } 7468a7d6542SBram Moolenaar assert_equal(1, outer) 7478a7d6542SBram Moolenaarenddef 7488a7d6542SBram Moolenaar 7498a7d6542SBram Moolenaarfunc Test_block_failure() 7508a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 751585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 752585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7538a7d6542SBram Moolenaarendfunc 7548a7d6542SBram Moolenaar 755d032f34aSBram Moolenaarfunc g:NoSuchFunc() 756d032f34aSBram Moolenaar echo 'none' 757d032f34aSBram Moolenaarendfunc 758d032f34aSBram Moolenaar 7598a7d6542SBram Moolenaardef Test_try_catch() 7608a7d6542SBram Moolenaar let l = [] 7617a092245SBram Moolenaar try # comment 7628a7d6542SBram Moolenaar add(l, '1') 7638a7d6542SBram Moolenaar throw 'wrong' 7648a7d6542SBram Moolenaar add(l, '2') 7657a092245SBram Moolenaar catch # comment 7668a7d6542SBram Moolenaar add(l, v:exception) 7677a092245SBram Moolenaar finally # comment 7688a7d6542SBram Moolenaar add(l, '3') 7697a092245SBram Moolenaar endtry # comment 7708a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 77168d130c6SBram Moolenaar 772e859312eSBram Moolenaar l = [] 773e859312eSBram Moolenaar try 774e859312eSBram Moolenaar try 775e859312eSBram Moolenaar add(l, '1') 776e859312eSBram Moolenaar throw 'wrong' 777e859312eSBram Moolenaar add(l, '2') 778e859312eSBram Moolenaar catch /right/ 779e859312eSBram Moolenaar add(l, v:exception) 780e859312eSBram Moolenaar endtry 781e859312eSBram Moolenaar catch /wrong/ 782e859312eSBram Moolenaar add(l, 'caught') 783e859312eSBram Moolenaar finally 784e859312eSBram Moolenaar add(l, 'finally') 785e859312eSBram Moolenaar endtry 786e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 787e859312eSBram Moolenaar 78868d130c6SBram Moolenaar let n: number 78968d130c6SBram Moolenaar try 79068d130c6SBram Moolenaar n = l[3] 79168d130c6SBram Moolenaar catch /E684:/ 79268d130c6SBram Moolenaar n = 99 79368d130c6SBram Moolenaar endtry 79468d130c6SBram Moolenaar assert_equal(99, n) 79568d130c6SBram Moolenaar 79668d130c6SBram Moolenaar try 797cc673e74SBram Moolenaar # string slice returns a string, not a number 79868d130c6SBram Moolenaar n = g:astring[3] 79956acb094SBram Moolenaar catch /E1029:/ 80068d130c6SBram Moolenaar n = 77 80168d130c6SBram Moolenaar endtry 80268d130c6SBram Moolenaar assert_equal(77, n) 80368d130c6SBram Moolenaar 80468d130c6SBram Moolenaar try 80568d130c6SBram Moolenaar n = l[g:astring] 80656acb094SBram Moolenaar catch /E1029:/ 80756acb094SBram Moolenaar n = 88 80868d130c6SBram Moolenaar endtry 80956acb094SBram Moolenaar assert_equal(88, n) 81068d130c6SBram Moolenaar 81168d130c6SBram Moolenaar try 81268d130c6SBram Moolenaar n = s:does_not_exist 81368d130c6SBram Moolenaar catch /E121:/ 814f0b9f43cSBram Moolenaar n = 111 815f0b9f43cSBram Moolenaar endtry 816f0b9f43cSBram Moolenaar assert_equal(111, n) 817f0b9f43cSBram Moolenaar 818f0b9f43cSBram Moolenaar try 819f0b9f43cSBram Moolenaar n = g:does_not_exist 820f0b9f43cSBram Moolenaar catch /E121:/ 82168d130c6SBram Moolenaar n = 121 82268d130c6SBram Moolenaar endtry 82368d130c6SBram Moolenaar assert_equal(121, n) 82468d130c6SBram Moolenaar 82568d130c6SBram Moolenaar let d = #{one: 1} 82668d130c6SBram Moolenaar try 82768d130c6SBram Moolenaar n = d[g:astring] 82868d130c6SBram Moolenaar catch /E716:/ 82968d130c6SBram Moolenaar n = 222 83068d130c6SBram Moolenaar endtry 83168d130c6SBram Moolenaar assert_equal(222, n) 832f0b9f43cSBram Moolenaar 833f0b9f43cSBram Moolenaar try 834f0b9f43cSBram Moolenaar n = -g:astring 835f0b9f43cSBram Moolenaar catch /E39:/ 836f0b9f43cSBram Moolenaar n = 233 837f0b9f43cSBram Moolenaar endtry 838f0b9f43cSBram Moolenaar assert_equal(233, n) 839f0b9f43cSBram Moolenaar 840f0b9f43cSBram Moolenaar try 841f0b9f43cSBram Moolenaar n = +g:astring 842f0b9f43cSBram Moolenaar catch /E1030:/ 843f0b9f43cSBram Moolenaar n = 244 844f0b9f43cSBram Moolenaar endtry 845f0b9f43cSBram Moolenaar assert_equal(244, n) 846f0b9f43cSBram Moolenaar 847f0b9f43cSBram Moolenaar try 848f0b9f43cSBram Moolenaar n = +g:alist 849f0b9f43cSBram Moolenaar catch /E745:/ 850f0b9f43cSBram Moolenaar n = 255 851f0b9f43cSBram Moolenaar endtry 852f0b9f43cSBram Moolenaar assert_equal(255, n) 853f0b9f43cSBram Moolenaar 854f0b9f43cSBram Moolenaar let nd: dict<any> 855f0b9f43cSBram Moolenaar try 856f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 857f0b9f43cSBram Moolenaar catch /E1029:/ 858f0b9f43cSBram Moolenaar n = 266 859f0b9f43cSBram Moolenaar endtry 860f0b9f43cSBram Moolenaar assert_equal(266, n) 861f0b9f43cSBram Moolenaar 862f0b9f43cSBram Moolenaar try 863f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 864f0b9f43cSBram Moolenaar catch /E1093:/ 865f0b9f43cSBram Moolenaar n = 277 866f0b9f43cSBram Moolenaar endtry 867f0b9f43cSBram Moolenaar assert_equal(277, n) 868f0b9f43cSBram Moolenaar 869e859312eSBram Moolenaar try 870e859312eSBram Moolenaar &ts = g:astring 871e859312eSBram Moolenaar catch /E1029:/ 872e859312eSBram Moolenaar n = 288 873e859312eSBram Moolenaar endtry 874e859312eSBram Moolenaar assert_equal(288, n) 875e859312eSBram Moolenaar 876e859312eSBram Moolenaar try 877e859312eSBram Moolenaar &backspace = 'asdf' 878e859312eSBram Moolenaar catch /E474:/ 879e859312eSBram Moolenaar n = 299 880e859312eSBram Moolenaar endtry 881e859312eSBram Moolenaar assert_equal(299, n) 882e859312eSBram Moolenaar 883e859312eSBram Moolenaar l = [1] 884e859312eSBram Moolenaar try 885e859312eSBram Moolenaar l[3] = 3 886e859312eSBram Moolenaar catch /E684:/ 887e859312eSBram Moolenaar n = 300 888e859312eSBram Moolenaar endtry 889e859312eSBram Moolenaar assert_equal(300, n) 890e859312eSBram Moolenaar 891e859312eSBram Moolenaar try 892e859312eSBram Moolenaar unlet g:does_not_exist 893e859312eSBram Moolenaar catch /E108:/ 894e859312eSBram Moolenaar n = 322 895e859312eSBram Moolenaar endtry 896e859312eSBram Moolenaar assert_equal(322, n) 897e859312eSBram Moolenaar 898e859312eSBram Moolenaar try 899e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 900e859312eSBram Moolenaar catch /E721:/ 901e859312eSBram Moolenaar n = 333 902e859312eSBram Moolenaar endtry 903e859312eSBram Moolenaar assert_equal(333, n) 904e859312eSBram Moolenaar 905e859312eSBram Moolenaar try 906e859312eSBram Moolenaar l = DeletedFunc() 907e859312eSBram Moolenaar catch /E933:/ 908e859312eSBram Moolenaar n = 344 909e859312eSBram Moolenaar endtry 910e859312eSBram Moolenaar assert_equal(344, n) 911d032f34aSBram Moolenaar 912d032f34aSBram Moolenaar try 913d032f34aSBram Moolenaar echo len(v:true) 914d032f34aSBram Moolenaar catch /E701:/ 915d032f34aSBram Moolenaar n = 355 916d032f34aSBram Moolenaar endtry 917d032f34aSBram Moolenaar assert_equal(355, n) 918d032f34aSBram Moolenaar 919d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 920d032f34aSBram Moolenaar delfunc g:NoSuchFunc 921d032f34aSBram Moolenaar try 922d032f34aSBram Moolenaar echo P() 923d032f34aSBram Moolenaar catch /E117:/ 924d032f34aSBram Moolenaar n = 366 925d032f34aSBram Moolenaar endtry 926d032f34aSBram Moolenaar assert_equal(366, n) 927d032f34aSBram Moolenaar 928d032f34aSBram Moolenaar try 929d032f34aSBram Moolenaar echo g:NoSuchFunc() 930d032f34aSBram Moolenaar catch /E117:/ 931d032f34aSBram Moolenaar n = 377 932d032f34aSBram Moolenaar endtry 933d032f34aSBram Moolenaar assert_equal(377, n) 934d032f34aSBram Moolenaar 935d032f34aSBram Moolenaar try 936d032f34aSBram Moolenaar echo g:alist + 4 937d032f34aSBram Moolenaar catch /E745:/ 938d032f34aSBram Moolenaar n = 388 939d032f34aSBram Moolenaar endtry 940d032f34aSBram Moolenaar assert_equal(388, n) 941d032f34aSBram Moolenaar 942d032f34aSBram Moolenaar try 943d032f34aSBram Moolenaar echo 4 + g:alist 944d032f34aSBram Moolenaar catch /E745:/ 945d032f34aSBram Moolenaar n = 399 946d032f34aSBram Moolenaar endtry 947d032f34aSBram Moolenaar assert_equal(399, n) 948d032f34aSBram Moolenaar 949d032f34aSBram Moolenaar try 950d032f34aSBram Moolenaar echo g:alist.member 951d032f34aSBram Moolenaar catch /E715:/ 952d032f34aSBram Moolenaar n = 400 953d032f34aSBram Moolenaar endtry 954d032f34aSBram Moolenaar assert_equal(400, n) 955d032f34aSBram Moolenaar 956d032f34aSBram Moolenaar try 957d032f34aSBram Moolenaar echo d.member 958d032f34aSBram Moolenaar catch /E716:/ 959d032f34aSBram Moolenaar n = 411 960d032f34aSBram Moolenaar endtry 961d032f34aSBram Moolenaar assert_equal(411, n) 9628a7d6542SBram Moolenaarenddef 9638a7d6542SBram Moolenaar 964e859312eSBram Moolenaardef DeletedFunc(): list<any> 965e859312eSBram Moolenaar return ['delete me'] 966e859312eSBram Moolenaarenddef 967e859312eSBram Moolenaardefcompile 968e859312eSBram Moolenaardelfunc DeletedFunc 969e859312eSBram Moolenaar 970257cc5eeSBram Moolenaardef ThrowFromDef() 971a72cfb80SBram Moolenaar throw "getout" # comment 972257cc5eeSBram Moolenaarenddef 973257cc5eeSBram Moolenaar 974257cc5eeSBram Moolenaarfunc CatchInFunc() 975257cc5eeSBram Moolenaar try 976257cc5eeSBram Moolenaar call ThrowFromDef() 977257cc5eeSBram Moolenaar catch 978257cc5eeSBram Moolenaar let g:thrown_func = v:exception 979257cc5eeSBram Moolenaar endtry 980257cc5eeSBram Moolenaarendfunc 981257cc5eeSBram Moolenaar 982257cc5eeSBram Moolenaardef CatchInDef() 983257cc5eeSBram Moolenaar try 984257cc5eeSBram Moolenaar ThrowFromDef() 985257cc5eeSBram Moolenaar catch 986257cc5eeSBram Moolenaar g:thrown_def = v:exception 987257cc5eeSBram Moolenaar endtry 988257cc5eeSBram Moolenaarenddef 989257cc5eeSBram Moolenaar 990f575adffSBram Moolenaardef ReturnFinally(): string 991f575adffSBram Moolenaar try 992f575adffSBram Moolenaar return 'intry' 993f575adffSBram Moolenaar finally 994f575adffSBram Moolenaar g:in_finally = 'finally' 995f575adffSBram Moolenaar endtry 996f575adffSBram Moolenaar return 'end' 997f575adffSBram Moolenaarenddef 998f575adffSBram Moolenaar 999257cc5eeSBram Moolenaardef Test_try_catch_nested() 1000257cc5eeSBram Moolenaar CatchInFunc() 1001257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1002257cc5eeSBram Moolenaar 1003257cc5eeSBram Moolenaar CatchInDef() 1004257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1005f575adffSBram Moolenaar 1006f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1007f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1008f575adffSBram Moolenaarenddef 1009f575adffSBram Moolenaar 1010f575adffSBram Moolenaardef Test_try_catch_match() 1011f575adffSBram Moolenaar let seq = 'a' 1012f575adffSBram Moolenaar try 1013f575adffSBram Moolenaar throw 'something' 1014f575adffSBram Moolenaar catch /nothing/ 1015f575adffSBram Moolenaar seq ..= 'x' 1016f575adffSBram Moolenaar catch /some/ 1017f575adffSBram Moolenaar seq ..= 'b' 1018f575adffSBram Moolenaar catch /asdf/ 1019f575adffSBram Moolenaar seq ..= 'x' 1020e8c4abbbSBram Moolenaar catch ?a\?sdf? 1021e8c4abbbSBram Moolenaar seq ..= 'y' 1022f575adffSBram Moolenaar finally 1023f575adffSBram Moolenaar seq ..= 'c' 1024f575adffSBram Moolenaar endtry 1025f575adffSBram Moolenaar assert_equal('abc', seq) 1026257cc5eeSBram Moolenaarenddef 1027257cc5eeSBram Moolenaar 1028e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1029e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1030e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1031e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1032585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1033585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1034585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1035585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1036585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1037585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1038585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1039585fea7bSBram Moolenaar 1040a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1041585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1042e8c4abbbSBram Moolenaarenddef 1043e8c4abbbSBram Moolenaar 1044006ad48bSBram Moolenaardef Test_throw_vimscript() 1045f5be8cdbSBram Moolenaar # only checks line continuation 1046006ad48bSBram Moolenaar let lines =<< trim END 1047006ad48bSBram Moolenaar vim9script 1048006ad48bSBram Moolenaar try 1049006ad48bSBram Moolenaar throw 'one' 1050006ad48bSBram Moolenaar .. 'two' 1051006ad48bSBram Moolenaar catch 1052006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1053006ad48bSBram Moolenaar endtry 1054006ad48bSBram Moolenaar END 1055006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1056006ad48bSBram Moolenaarenddef 1057006ad48bSBram Moolenaar 1058ed677f55SBram Moolenaardef Test_error_in_nested_function() 1059ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 1060ed677f55SBram Moolenaar let lines =<< trim END 1061ed677f55SBram Moolenaar vim9script 1062ed677f55SBram Moolenaar def Func() 1063ed677f55SBram Moolenaar Error() 1064ed677f55SBram Moolenaar g:test_var = 1 1065ed677f55SBram Moolenaar enddef 1066ed677f55SBram Moolenaar func Error() abort 1067ed677f55SBram Moolenaar eval [][0] 1068ed677f55SBram Moolenaar endfunc 1069ed677f55SBram Moolenaar Func() 1070ed677f55SBram Moolenaar END 1071ed677f55SBram Moolenaar g:test_var = 0 1072ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 1073ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1074ed677f55SBram Moolenaarenddef 1075ed677f55SBram Moolenaar 107637c83711SBram Moolenaardef Test_cexpr_vimscript() 1077f5be8cdbSBram Moolenaar # only checks line continuation 107837c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 107937c83711SBram Moolenaar let lines =<< trim END 108037c83711SBram Moolenaar vim9script 108137c83711SBram Moolenaar cexpr 'File' 108237c83711SBram Moolenaar .. ' someFile' .. 108337c83711SBram Moolenaar ' line 19' 108437c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 108537c83711SBram Moolenaar END 108637c83711SBram Moolenaar CheckScriptSuccess(lines) 108737c83711SBram Moolenaar set errorformat& 108837c83711SBram Moolenaarenddef 108937c83711SBram Moolenaar 1090c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1091c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1092c9edd6b5SBram Moolenaar let lines =<< trim END 1093c9edd6b5SBram Moolenaar vim9script 1094c9edd6b5SBram Moolenaar func g:Status() 1095c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1096c9edd6b5SBram Moolenaar endfunc 1097c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1098c9edd6b5SBram Moolenaar redrawstatus 1099c9edd6b5SBram Moolenaar set laststatus statusline= 1100c9edd6b5SBram Moolenaar END 1101c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1102c9edd6b5SBram Moolenaarenddef 1103c9edd6b5SBram Moolenaar 1104b209750bSBram Moolenaardef Test_list_vimscript() 1105b209750bSBram Moolenaar # checks line continuation and comments 1106b209750bSBram Moolenaar let lines =<< trim END 1107b209750bSBram Moolenaar vim9script 1108b209750bSBram Moolenaar let mylist = [ 1109b209750bSBram Moolenaar 'one', 1110b209750bSBram Moolenaar # comment 1111b209750bSBram Moolenaar 'two', # empty line follows 1112b209750bSBram Moolenaar 1113b209750bSBram Moolenaar 'three', 1114b209750bSBram Moolenaar ] 1115b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1116b209750bSBram Moolenaar END 1117b209750bSBram Moolenaar CheckScriptSuccess(lines) 1118b209750bSBram Moolenaarenddef 1119b209750bSBram Moolenaar 11202a1381c3SBram Moolenaarif has('channel') 112140ee466cSBram Moolenaar let someJob = test_null_job() 112240ee466cSBram Moolenaar 112340ee466cSBram Moolenaar def FuncWithError() 112440ee466cSBram Moolenaar echomsg g:someJob 112540ee466cSBram Moolenaar enddef 112640ee466cSBram Moolenaar 112740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 112840ee466cSBram Moolenaar try 112940ee466cSBram Moolenaar call FuncWithError() 113040ee466cSBram Moolenaar catch 113140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 113240ee466cSBram Moolenaar endtry 113340ee466cSBram Moolenaar endfunc 11342a1381c3SBram Moolenaarendif 113540ee466cSBram Moolenaar 11368a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 11378a7d6542SBram Moolenaar vim9script 11388a7d6542SBram Moolenaar let name: string = 'bob' 11398a7d6542SBram Moolenaar def Concat(arg: string): string 11408a7d6542SBram Moolenaar return name .. arg 11418a7d6542SBram Moolenaar enddef 1142227a69deSBram Moolenaar g:result = Concat('bie') 1143227a69deSBram Moolenaar g:localname = name 11448a7d6542SBram Moolenaar 11458a7d6542SBram Moolenaar export const CONST = 1234 11468a7d6542SBram Moolenaar export let exported = 9876 11476e587dcbSBram Moolenaar export let exp_name = 'John' 11488a7d6542SBram Moolenaar export def Exported(): string 11498a7d6542SBram Moolenaar return 'Exported' 11508a7d6542SBram Moolenaar enddef 11518a7d6542SBram MoolenaarEND 11528a7d6542SBram Moolenaar 1153b3ca9824SBram Moolenaardef Undo_export_script_lines() 1154b3ca9824SBram Moolenaar unlet g:result 1155b3ca9824SBram Moolenaar unlet g:localname 1156b3ca9824SBram Moolenaarenddef 1157b3ca9824SBram Moolenaar 11585269bd2aSBram Moolenaardef Test_vim9_import_export() 11598a7d6542SBram Moolenaar let import_script_lines =<< trim END 11608a7d6542SBram Moolenaar vim9script 11618a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11628a7d6542SBram Moolenaar g:imported = exported 11636e587dcbSBram Moolenaar exported += 3 11646e587dcbSBram Moolenaar g:imported_added = exported 11658a7d6542SBram Moolenaar g:imported_func = Exported() 11666e587dcbSBram Moolenaar 116740f4f7a4SBram Moolenaar def GetExported(): string 116840f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 116940f4f7a4SBram Moolenaar return local_dict.ref() 117040f4f7a4SBram Moolenaar enddef 117140f4f7a4SBram Moolenaar g:funcref_result = GetExported() 117240f4f7a4SBram Moolenaar 11736e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11746e587dcbSBram Moolenaar g:imported_name = exp_name 11756e587dcbSBram Moolenaar exp_name ..= ' Doe' 11766e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11775381c7a1SBram Moolenaar g:imported_later = exported 11788a7d6542SBram Moolenaar END 11798a7d6542SBram Moolenaar 11808a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11828a7d6542SBram Moolenaar 11838a7d6542SBram Moolenaar source Ximport.vim 11848a7d6542SBram Moolenaar 11858a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11868a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11878a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11886e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11895381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11908a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 119140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11926e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11936e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11948a7d6542SBram Moolenaar assert_false(exists('g:name')) 11958a7d6542SBram Moolenaar 1196b3ca9824SBram Moolenaar Undo_export_script_lines() 11978a7d6542SBram Moolenaar unlet g:imported 11986e587dcbSBram Moolenaar unlet g:imported_added 11995381c7a1SBram Moolenaar unlet g:imported_later 12008a7d6542SBram Moolenaar unlet g:imported_func 12016e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 12028a7d6542SBram Moolenaar delete('Ximport.vim') 1203f2d5c240SBram Moolenaar 12041c991144SBram Moolenaar # similar, with line breaks 12051c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 12061c991144SBram Moolenaar vim9script 12071c991144SBram Moolenaar import { 12081c991144SBram Moolenaar exported, 12091c991144SBram Moolenaar Exported, 12101c991144SBram Moolenaar } 12111c991144SBram Moolenaar from 12121c991144SBram Moolenaar './Xexport.vim' 12131c991144SBram Moolenaar g:imported = exported 12141c991144SBram Moolenaar exported += 5 12151c991144SBram Moolenaar g:imported_added = exported 12161c991144SBram Moolenaar g:imported_func = Exported() 12171c991144SBram Moolenaar END 12181c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 12191c991144SBram Moolenaar source Ximport_lbr.vim 12201c991144SBram Moolenaar 12211c991144SBram Moolenaar assert_equal(9876, g:imported) 12221c991144SBram Moolenaar assert_equal(9881, g:imported_added) 12231c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 12241c991144SBram Moolenaar 12251c991144SBram Moolenaar # exported script not sourced again 12261c991144SBram Moolenaar assert_false(exists('g:result')) 12271c991144SBram Moolenaar unlet g:imported 12281c991144SBram Moolenaar unlet g:imported_added 12291c991144SBram Moolenaar unlet g:imported_func 12301c991144SBram Moolenaar delete('Ximport_lbr.vim') 12311c991144SBram Moolenaar 12321c991144SBram Moolenaar # import inside :def function 12335381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 12345381c7a1SBram Moolenaar vim9script 12355381c7a1SBram Moolenaar def ImportInDef() 12365381c7a1SBram Moolenaar import exported from './Xexport.vim' 12375381c7a1SBram Moolenaar g:imported = exported 12385381c7a1SBram Moolenaar exported += 7 12395381c7a1SBram Moolenaar g:imported_added = exported 12405381c7a1SBram Moolenaar enddef 12415381c7a1SBram Moolenaar ImportInDef() 12425381c7a1SBram Moolenaar END 12435381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 12445381c7a1SBram Moolenaar source Ximport2.vim 1245f5be8cdbSBram Moolenaar # TODO: this should be 9879 12465381c7a1SBram Moolenaar assert_equal(9876, g:imported) 12475381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 12485381c7a1SBram Moolenaar unlet g:imported 12495381c7a1SBram Moolenaar unlet g:imported_added 12505381c7a1SBram Moolenaar delete('Ximport2.vim') 12515381c7a1SBram Moolenaar 1252f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1253f2d5c240SBram Moolenaar vim9script 1254f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1255f2d5c240SBram Moolenaar def UseExport() 1256f2d5c240SBram Moolenaar g:imported = Export.exported 1257f2d5c240SBram Moolenaar enddef 1258f2d5c240SBram Moolenaar UseExport() 1259f2d5c240SBram Moolenaar END 1260f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1261f2d5c240SBram Moolenaar source Ximport.vim 12625381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1263f2d5c240SBram Moolenaar 1264599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1265599c89c8SBram Moolenaar vim9script 1266599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1267599c89c8SBram Moolenaar def Func() 1268599c89c8SBram Moolenaar let dummy = 1 1269599c89c8SBram Moolenaar let imported = Export + dummy 1270599c89c8SBram Moolenaar enddef 1271822ba247SBram Moolenaar defcompile 1272599c89c8SBram Moolenaar END 1273599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1274599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1275599c89c8SBram Moolenaar 1276599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1277599c89c8SBram Moolenaar vim9script 1278599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1279599c89c8SBram Moolenaar def Func() 1280599c89c8SBram Moolenaar let imported = Export . exported 1281599c89c8SBram Moolenaar enddef 1282822ba247SBram Moolenaar defcompile 1283599c89c8SBram Moolenaar END 1284599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1285599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1286599c89c8SBram Moolenaar 1287599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1288599c89c8SBram Moolenaar vim9script 1289599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1290599c89c8SBram Moolenaar def Func() 1291599c89c8SBram Moolenaar let imported = Export. 1292599c89c8SBram Moolenaar enddef 1293822ba247SBram Moolenaar defcompile 1294599c89c8SBram Moolenaar END 1295599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1296599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1297599c89c8SBram Moolenaar 12981c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12991c991144SBram Moolenaar vim9script 13001c991144SBram Moolenaar import * 13011c991144SBram Moolenaar as Export 13021c991144SBram Moolenaar from 13031c991144SBram Moolenaar './Xexport.vim' 13041c991144SBram Moolenaar def UseExport() 13051c991144SBram Moolenaar g:imported = Export.exported 13061c991144SBram Moolenaar enddef 13071c991144SBram Moolenaar UseExport() 13081c991144SBram Moolenaar END 13091c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13101c991144SBram Moolenaar source Ximport.vim 13111c991144SBram Moolenaar assert_equal(9883, g:imported) 13121c991144SBram Moolenaar 1313f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1314f2d5c240SBram Moolenaar vim9script 1315f2d5c240SBram Moolenaar import * from './Xexport.vim' 1316f2d5c240SBram Moolenaar END 1317f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1318f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1319f2d5c240SBram Moolenaar 1320f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1321fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1322fa29c8abSBram Moolenaar vim9script 1323fa29c8abSBram Moolenaar import name from './Xexport.vim' 1324fa29c8abSBram Moolenaar END 1325fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1326fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1327fa29c8abSBram Moolenaar 1328f5be8cdbSBram Moolenaar # try to import something that is already defined 13295269bd2aSBram Moolenaar let import_already_defined =<< trim END 13305269bd2aSBram Moolenaar vim9script 13315269bd2aSBram Moolenaar let exported = 'something' 13325269bd2aSBram Moolenaar import exported from './Xexport.vim' 13335269bd2aSBram Moolenaar END 13345269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13355269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13365269bd2aSBram Moolenaar 1337f5be8cdbSBram Moolenaar # try to import something that is already defined 13385269bd2aSBram Moolenaar import_already_defined =<< trim END 13395269bd2aSBram Moolenaar vim9script 13405269bd2aSBram Moolenaar let exported = 'something' 13415269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13425269bd2aSBram Moolenaar END 13435269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13445269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13455269bd2aSBram Moolenaar 1346f5be8cdbSBram Moolenaar # try to import something that is already defined 13475269bd2aSBram Moolenaar import_already_defined =<< trim END 13485269bd2aSBram Moolenaar vim9script 13495269bd2aSBram Moolenaar let exported = 'something' 13505269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13515269bd2aSBram Moolenaar END 13525269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13535269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13545269bd2aSBram Moolenaar 1355f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1356fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1357fa29c8abSBram Moolenaar vim9script 1358fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1359fa29c8abSBram Moolenaar END 1360fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1361fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1362fa29c8abSBram Moolenaar 1363fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1364fa29c8abSBram Moolenaar vim9script 1365fa29c8abSBram Moolenaar import name './Xexport.vim' 1366fa29c8abSBram Moolenaar END 1367fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1368fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1369fa29c8abSBram Moolenaar 1370fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1371fa29c8abSBram Moolenaar vim9script 1372fa29c8abSBram Moolenaar import name from Xexport.vim 1373fa29c8abSBram Moolenaar END 1374fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1375fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1376fa29c8abSBram Moolenaar 1377fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1378fa29c8abSBram Moolenaar vim9script 1379fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1380fa29c8abSBram Moolenaar END 1381fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1382fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1383fa29c8abSBram Moolenaar 1384fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1385fa29c8abSBram Moolenaar vim9script 1386fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1387fa29c8abSBram Moolenaar END 13885269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13895269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1390fa29c8abSBram Moolenaar 1391f2d5c240SBram Moolenaar delete('Ximport.vim') 13925269bd2aSBram Moolenaar delete('Ximport3.vim') 13938a7d6542SBram Moolenaar delete('Xexport.vim') 13948a7d6542SBram Moolenaar 1395f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1396750802b5SBram Moolenaar set cpo&vi 1397750802b5SBram Moolenaar let cpo_before = &cpo 1398750802b5SBram Moolenaar let lines =<< trim END 1399750802b5SBram Moolenaar vim9script 1400750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1401750802b5SBram Moolenaar END 1402750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1403750802b5SBram Moolenaar source Xvim9_script 1404750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1405750802b5SBram Moolenaar set cpo&vim 1406750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1407750802b5SBram Moolenaar delete('Xvim9_script') 1408750802b5SBram Moolenaarenddef 1409750802b5SBram Moolenaar 1410803af686SBram Moolenaarfunc g:Trigger() 1411803af686SBram Moolenaar source Ximport.vim 1412803af686SBram Moolenaar return "echo 'yes'\<CR>" 1413803af686SBram Moolenaarendfunc 1414803af686SBram Moolenaar 1415803af686SBram Moolenaardef Test_import_export_expr_map() 1416803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1417803af686SBram Moolenaar let export_lines =<< trim END 1418803af686SBram Moolenaar vim9script 1419803af686SBram Moolenaar export def That(): string 1420803af686SBram Moolenaar return 'yes' 1421803af686SBram Moolenaar enddef 1422803af686SBram Moolenaar END 1423803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1424803af686SBram Moolenaar 1425803af686SBram Moolenaar let import_lines =<< trim END 1426803af686SBram Moolenaar vim9script 1427803af686SBram Moolenaar import That from './Xexport_that.vim' 1428803af686SBram Moolenaar assert_equal('yes', That()) 1429803af686SBram Moolenaar END 1430803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1431803af686SBram Moolenaar 1432803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1433803af686SBram Moolenaar feedkeys('trigger', "xt") 1434803af686SBram Moolenaar 1435730b2483SBram Moolenaar delete('Xexport_that.vim') 1436803af686SBram Moolenaar delete('Ximport.vim') 1437803af686SBram Moolenaar nunmap trigger 1438803af686SBram Moolenaarenddef 1439803af686SBram Moolenaar 14408e1986e3SBram Moolenaardef Test_import_in_filetype() 14418e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14428e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 14438e1986e3SBram Moolenaar let export_lines =<< trim END 14448e1986e3SBram Moolenaar vim9script 14458e1986e3SBram Moolenaar export let That = 'yes' 14468e1986e3SBram Moolenaar END 1447730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 14488e1986e3SBram Moolenaar 14498e1986e3SBram Moolenaar let import_lines =<< trim END 14508e1986e3SBram Moolenaar vim9script 1451730b2483SBram Moolenaar import That from './Xexport_ft.vim' 14528e1986e3SBram Moolenaar assert_equal('yes', That) 14538e1986e3SBram Moolenaar g:did_load_mytpe = 1 14548e1986e3SBram Moolenaar END 14558e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14568e1986e3SBram Moolenaar 14578e1986e3SBram Moolenaar let save_rtp = &rtp 14588e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14598e1986e3SBram Moolenaar 14608e1986e3SBram Moolenaar filetype plugin on 14618e1986e3SBram Moolenaar copen 14628e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14638e1986e3SBram Moolenaar 14648e1986e3SBram Moolenaar quit! 1465730b2483SBram Moolenaar delete('Xexport_ft.vim') 14668e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14678e1986e3SBram Moolenaar &rtp = save_rtp 14688e1986e3SBram Moolenaarenddef 14698e1986e3SBram Moolenaar 1470efa94447SBram Moolenaardef Test_use_import_in_mapping() 1471efa94447SBram Moolenaar let lines =<< trim END 1472efa94447SBram Moolenaar vim9script 1473efa94447SBram Moolenaar export def Funcx() 1474efa94447SBram Moolenaar g:result = 42 1475efa94447SBram Moolenaar enddef 1476efa94447SBram Moolenaar END 1477efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1478efa94447SBram Moolenaar lines =<< trim END 1479efa94447SBram Moolenaar vim9script 1480efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1481b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1482efa94447SBram Moolenaar END 1483efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1484efa94447SBram Moolenaar 1485efa94447SBram Moolenaar source Xmapscript.vim 1486b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1487efa94447SBram Moolenaar assert_equal(42, g:result) 1488efa94447SBram Moolenaar 1489efa94447SBram Moolenaar unlet g:result 1490efa94447SBram Moolenaar delete('XsomeExport.vim') 1491efa94447SBram Moolenaar delete('Xmapscript.vim') 1492b3ca9824SBram Moolenaar nunmap <F3> 1493efa94447SBram Moolenaarenddef 1494efa94447SBram Moolenaar 1495750802b5SBram Moolenaardef Test_vim9script_fails() 14968a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14978a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1498750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 14999721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 15009b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1501750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1502750802b5SBram Moolenaar 1503451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1504c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1505c785b9a7SBram Moolenaar 1506750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1507a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 15088a7d6542SBram Moolenaarenddef 15098a7d6542SBram Moolenaar 1510f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1511101f4810SBram Moolenaar CheckRunVimInTerminal 1512101f4810SBram Moolenaar 15139bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1514c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15159bb3eb3eSBram Moolenaarendfunc 15169bb3eb3eSBram Moolenaar 1517c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1518101f4810SBram Moolenaar let export =<< trim END 1519101f4810SBram Moolenaar vim9script 1520101f4810SBram Moolenaar export def Foo(): number 1521101f4810SBram Moolenaar return 0 1522101f4810SBram Moolenaar enddef 1523101f4810SBram Moolenaar END 1524730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1525101f4810SBram Moolenaar 1526730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 15279bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 15289bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1529101f4810SBram Moolenaar 1530730b2483SBram Moolenaar delete('XexportCmd.vim') 15319bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 15329bb3eb3eSBram Moolenaarenddef 1533101f4810SBram Moolenaar 15344c17ad94SBram Moolenaardef Test_vim9script_reload_import() 15358a7d6542SBram Moolenaar let lines =<< trim END 15368a7d6542SBram Moolenaar vim9script 15378a7d6542SBram Moolenaar const var = '' 15388a7d6542SBram Moolenaar let valone = 1234 15398a7d6542SBram Moolenaar def MyFunc(arg: string) 15408a7d6542SBram Moolenaar valone = 5678 15418a7d6542SBram Moolenaar enddef 15428a7d6542SBram Moolenaar END 15438a7d6542SBram Moolenaar let morelines =<< trim END 15448a7d6542SBram Moolenaar let valtwo = 222 15458a7d6542SBram Moolenaar export def GetValtwo(): number 15468a7d6542SBram Moolenaar return valtwo 15478a7d6542SBram Moolenaar enddef 15488a7d6542SBram Moolenaar END 154903afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15508a7d6542SBram Moolenaar source Xreload.vim 15518a7d6542SBram Moolenaar source Xreload.vim 15528a7d6542SBram Moolenaar source Xreload.vim 15538a7d6542SBram Moolenaar 15548a7d6542SBram Moolenaar let testlines =<< trim END 15558a7d6542SBram Moolenaar vim9script 15568a7d6542SBram Moolenaar def TheFunc() 15578a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15588a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15598a7d6542SBram Moolenaar enddef 15608a7d6542SBram Moolenaar TheFunc() 15618a7d6542SBram Moolenaar END 15628a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15638a7d6542SBram Moolenaar source Ximport.vim 15648a7d6542SBram Moolenaar 1565f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1566f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15678a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15688a7d6542SBram Moolenaar source Ximport.vim 15698a7d6542SBram Moolenaar 1570f5be8cdbSBram Moolenaar # cannot declare a var twice 15718a7d6542SBram Moolenaar lines =<< trim END 15728a7d6542SBram Moolenaar vim9script 15738a7d6542SBram Moolenaar let valone = 1234 15748a7d6542SBram Moolenaar let valone = 5678 15758a7d6542SBram Moolenaar END 15768a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15778a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 15788a7d6542SBram Moolenaar 15798a7d6542SBram Moolenaar delete('Xreload.vim') 15808a7d6542SBram Moolenaar delete('Ximport.vim') 15818a7d6542SBram Moolenaarenddef 15828a7d6542SBram Moolenaar 1583fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1584fe465a01SBram Moolenaar" script-local name. 1585fe465a01SBram Moolenaardef Test_vim9script_funcref() 1586fe465a01SBram Moolenaar let sortlines =<< trim END 1587fe465a01SBram Moolenaar vim9script 1588fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1589bed36b93SBram Moolenaar return i2 - i1 1590fe465a01SBram Moolenaar enddef 1591fe465a01SBram Moolenaar 1592fe465a01SBram Moolenaar export def FastSort(): list<number> 1593fe465a01SBram Moolenaar return range(5)->sort(Compare) 1594fe465a01SBram Moolenaar enddef 1595fe465a01SBram Moolenaar END 1596fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1597fe465a01SBram Moolenaar 1598fe465a01SBram Moolenaar let lines =<< trim END 1599fe465a01SBram Moolenaar vim9script 1600fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1601fe465a01SBram Moolenaar def Test() 1602fe465a01SBram Moolenaar g:result = FastSort() 1603fe465a01SBram Moolenaar enddef 1604fe465a01SBram Moolenaar Test() 1605fe465a01SBram Moolenaar END 1606fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1607fe465a01SBram Moolenaar 1608fe465a01SBram Moolenaar source Xscript.vim 1609fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1610fe465a01SBram Moolenaar 1611fe465a01SBram Moolenaar unlet g:result 1612fe465a01SBram Moolenaar delete('Xsort.vim') 1613fe465a01SBram Moolenaar delete('Xscript.vim') 1614fe465a01SBram Moolenaarenddef 1615fe465a01SBram Moolenaar 1616c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1617c620c055SBram Moolenaar" script where FastFilter() is called from. 1618c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1619c620c055SBram Moolenaar let filterLines =<< trim END 1620c620c055SBram Moolenaar vim9script 1621c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1622c620c055SBram Moolenaar return idx % 2 == 1 1623c620c055SBram Moolenaar enddef 1624c620c055SBram Moolenaar export def FastFilter(): list<number> 1625c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1626c620c055SBram Moolenaar enddef 1627c620c055SBram Moolenaar END 1628c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1629c620c055SBram Moolenaar 1630c620c055SBram Moolenaar let lines =<< trim END 1631c620c055SBram Moolenaar vim9script 1632c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1633c620c055SBram Moolenaar def Test() 1634c620c055SBram Moolenaar let x: list<number> = FastFilter() 1635c620c055SBram Moolenaar enddef 1636c620c055SBram Moolenaar Test() 1637c620c055SBram Moolenaar END 1638c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1639c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1640c620c055SBram Moolenaar 1641c620c055SBram Moolenaar delete('Xfilter.vim') 1642c620c055SBram Moolenaar delete('Ximport.vim') 1643c620c055SBram Moolenaarenddef 1644c620c055SBram Moolenaar 16454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 16464c17ad94SBram Moolenaar let first_lines =<< trim END 16474c17ad94SBram Moolenaar vim9script 16484c17ad94SBram Moolenaar def FuncYes(): string 16494c17ad94SBram Moolenaar return 'yes' 16504c17ad94SBram Moolenaar enddef 16514c17ad94SBram Moolenaar END 165203afdcf1SBram Moolenaar let withno_lines =<< trim END 16534c17ad94SBram Moolenaar def FuncNo(): string 16544c17ad94SBram Moolenaar return 'no' 16554c17ad94SBram Moolenaar enddef 16564c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 16574c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 16584c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 165903afdcf1SBram Moolenaar enddef 166003afdcf1SBram Moolenaar END 166103afdcf1SBram Moolenaar let nono_lines =<< trim END 166203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 166303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 16644c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 16654c17ad94SBram Moolenaar enddef 16664c17ad94SBram Moolenaar END 16674c17ad94SBram Moolenaar 16684c17ad94SBram Moolenaar # FuncNo() is defined 166903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16704c17ad94SBram Moolenaar source Xreloaded.vim 16714c17ad94SBram Moolenaar g:DoCheck(true) 16724c17ad94SBram Moolenaar 16734c17ad94SBram Moolenaar # FuncNo() is not redefined 167403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16754c17ad94SBram Moolenaar source Xreloaded.vim 167603afdcf1SBram Moolenaar g:DoCheck() 16774c17ad94SBram Moolenaar 16784c17ad94SBram Moolenaar # FuncNo() is back 167903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16804c17ad94SBram Moolenaar source Xreloaded.vim 168103afdcf1SBram Moolenaar g:DoCheck() 16824c17ad94SBram Moolenaar 16834c17ad94SBram Moolenaar delete('Xreloaded.vim') 16844c17ad94SBram Moolenaarenddef 16854c17ad94SBram Moolenaar 168689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 168789483d40SBram Moolenaar # write the script with a script-local variable 168889483d40SBram Moolenaar let lines =<< trim END 168989483d40SBram Moolenaar vim9script 169089483d40SBram Moolenaar let var = 'string' 169189483d40SBram Moolenaar END 169289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 169389483d40SBram Moolenaar source XreloadVar.vim 169489483d40SBram Moolenaar 169589483d40SBram Moolenaar # now write the script using the same variable locally - works 169689483d40SBram Moolenaar lines =<< trim END 169789483d40SBram Moolenaar vim9script 169889483d40SBram Moolenaar def Func() 169989483d40SBram Moolenaar let var = 'string' 170089483d40SBram Moolenaar enddef 170189483d40SBram Moolenaar END 170289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 170389483d40SBram Moolenaar source XreloadVar.vim 170489483d40SBram Moolenaar 170589483d40SBram Moolenaar delete('XreloadVar.vim') 170689483d40SBram Moolenaarenddef 170789483d40SBram Moolenaar 17088a7d6542SBram Moolenaardef Test_import_absolute() 17098a7d6542SBram Moolenaar let import_lines = [ 1710e6085c53SBram Moolenaar 'vim9script', 1711e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1712e6085c53SBram Moolenaar 'def UseExported()', 1713e6085c53SBram Moolenaar ' g:imported_abs = exported', 1714e6085c53SBram Moolenaar ' exported = 8888', 1715e6085c53SBram Moolenaar ' g:imported_after = exported', 1716e6085c53SBram Moolenaar 'enddef', 1717e6085c53SBram Moolenaar 'UseExported()', 1718e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1719e6085c53SBram Moolenaar ] 17208a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 17218a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 17228a7d6542SBram Moolenaar 17238a7d6542SBram Moolenaar source Ximport_abs.vim 17248a7d6542SBram Moolenaar 17258a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 17264e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1727675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1728675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1729675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1730675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1731675f716eSBram Moolenaar 'exported = 8888.*' .. 1732675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1733675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1734675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1735675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1736e6085c53SBram Moolenaar g:import_disassembled) 1737b3ca9824SBram Moolenaar 1738b3ca9824SBram Moolenaar Undo_export_script_lines() 17398a7d6542SBram Moolenaar unlet g:imported_abs 17404e12a5dfSBram Moolenaar unlet g:import_disassembled 17418a7d6542SBram Moolenaar 17428a7d6542SBram Moolenaar delete('Ximport_abs.vim') 17438a7d6542SBram Moolenaar delete('Xexport_abs.vim') 17448a7d6542SBram Moolenaarenddef 17458a7d6542SBram Moolenaar 17468a7d6542SBram Moolenaardef Test_import_rtp() 17478a7d6542SBram Moolenaar let import_lines = [ 1748e6085c53SBram Moolenaar 'vim9script', 1749e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1750e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1751e6085c53SBram Moolenaar ] 17528a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 17538a7d6542SBram Moolenaar mkdir('import') 17548a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 17558a7d6542SBram Moolenaar 17568a7d6542SBram Moolenaar let save_rtp = &rtp 17578a7d6542SBram Moolenaar &rtp = getcwd() 17588a7d6542SBram Moolenaar source Ximport_rtp.vim 17598a7d6542SBram Moolenaar &rtp = save_rtp 17608a7d6542SBram Moolenaar 17618a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 17628a7d6542SBram Moolenaar 1763b3ca9824SBram Moolenaar Undo_export_script_lines() 1764b3ca9824SBram Moolenaar unlet g:imported_rtp 17658a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 176689483d40SBram Moolenaar delete('import', 'rf') 17678a7d6542SBram Moolenaarenddef 17688a7d6542SBram Moolenaar 176925e0f586SBram Moolenaardef Test_import_compile_error() 177025e0f586SBram Moolenaar let export_lines = [ 177125e0f586SBram Moolenaar 'vim9script', 177225e0f586SBram Moolenaar 'export def ExpFunc(): string', 177325e0f586SBram Moolenaar ' return notDefined', 177425e0f586SBram Moolenaar 'enddef', 177525e0f586SBram Moolenaar ] 177625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 177725e0f586SBram Moolenaar 177825e0f586SBram Moolenaar let import_lines = [ 177925e0f586SBram Moolenaar 'vim9script', 178025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 178125e0f586SBram Moolenaar 'def ImpFunc()', 178225e0f586SBram Moolenaar ' echo ExpFunc()', 178325e0f586SBram Moolenaar 'enddef', 178425e0f586SBram Moolenaar 'defcompile', 178525e0f586SBram Moolenaar ] 178625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 178725e0f586SBram Moolenaar 178825e0f586SBram Moolenaar try 178925e0f586SBram Moolenaar source Ximport.vim 179025e0f586SBram Moolenaar catch /E1001/ 1791f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 179225e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 179325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 179425e0f586SBram Moolenaar endtry 179525e0f586SBram Moolenaar 179625e0f586SBram Moolenaar delete('Xexported.vim') 179725e0f586SBram Moolenaar delete('Ximport.vim') 179825e0f586SBram Moolenaarenddef 179925e0f586SBram Moolenaar 1800c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1801c4ce36d4SBram Moolenaar let lines = [ 1802c4ce36d4SBram Moolenaar 'vim9script', 1803c4ce36d4SBram Moolenaar 'def Func()', 1804c4ce36d4SBram Moolenaar ' eval [][0]', 1805c4ce36d4SBram Moolenaar 'enddef', 1806c4ce36d4SBram Moolenaar 'Func()', 1807c4ce36d4SBram Moolenaar ] 1808c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1809c4ce36d4SBram Moolenaar 1810c4ce36d4SBram Moolenaar for count in range(3) 1811c4ce36d4SBram Moolenaar try 1812c4ce36d4SBram Moolenaar source Xtestscript.vim 1813c4ce36d4SBram Moolenaar catch /E684/ 1814c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1815c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1816c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1817c4ce36d4SBram Moolenaar endtry 1818c4ce36d4SBram Moolenaar endfor 1819c4ce36d4SBram Moolenaar 1820c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1821c4ce36d4SBram Moolenaarenddef 1822c4ce36d4SBram Moolenaar 1823eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1824eef2102eSBram Moolenaar let export_lines =<< trim END 1825eef2102eSBram Moolenaar vim9script 1826eef2102eSBram Moolenaar export def Func() 1827eef2102eSBram Moolenaar echo 'imported' 1828eef2102eSBram Moolenaar enddef 1829eef2102eSBram Moolenaar END 1830eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1831eef2102eSBram Moolenaar 1832eef2102eSBram Moolenaar let lines =<< trim END 1833eef2102eSBram Moolenaar vim9script 1834eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1835eef2102eSBram Moolenaar def Func() 1836eef2102eSBram Moolenaar echo 'local to function' 1837eef2102eSBram Moolenaar enddef 1838eef2102eSBram Moolenaar END 1839eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1840eef2102eSBram Moolenaar 1841eef2102eSBram Moolenaar lines =<< trim END 1842eef2102eSBram Moolenaar vim9script 1843eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1844eef2102eSBram Moolenaar def Outer() 1845eef2102eSBram Moolenaar def Func() 1846eef2102eSBram Moolenaar echo 'local to function' 1847eef2102eSBram Moolenaar enddef 1848eef2102eSBram Moolenaar enddef 1849eef2102eSBram Moolenaar defcompile 1850eef2102eSBram Moolenaar END 1851eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1852eef2102eSBram Moolenaar 1853eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1854eef2102eSBram Moolenaarenddef 1855eef2102eSBram Moolenaar 1856b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1857b9a2cac3SBram Moolenaar let lines =<< trim END 1858b9a2cac3SBram Moolenaar vim9script 1859b9a2cac3SBram Moolenaar def Func() 1860b9a2cac3SBram Moolenaar echo 'one' 1861b9a2cac3SBram Moolenaar enddef 1862b9a2cac3SBram Moolenaar def Func() 1863b9a2cac3SBram Moolenaar echo 'two' 1864b9a2cac3SBram Moolenaar enddef 1865b9a2cac3SBram Moolenaar END 1866b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1867fa211f3cSBram Moolenaar 1868fa211f3cSBram Moolenaar lines =<< trim END 1869fa211f3cSBram Moolenaar vim9script 1870fa211f3cSBram Moolenaar def Foo(): string 1871fa211f3cSBram Moolenaar return 'foo' 1872fa211f3cSBram Moolenaar enddef 1873fa211f3cSBram Moolenaar def Func() 1874fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1875fa211f3cSBram Moolenaar enddef 1876fa211f3cSBram Moolenaar defcompile 1877fa211f3cSBram Moolenaar END 1878fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1879b9a2cac3SBram Moolenaarenddef 1880b9a2cac3SBram Moolenaar 18818a7d6542SBram Moolenaardef Test_fixed_size_list() 1882f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 18838a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 18848a7d6542SBram Moolenaar l->remove(0) 18858a7d6542SBram Moolenaar l->add(5) 18868a7d6542SBram Moolenaar l->insert(99, 1) 18870f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18888a7d6542SBram Moolenaarenddef 18898a7d6542SBram Moolenaar 1890ae616494SBram Moolenaardef Test_no_insert_xit() 1891ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1892ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1893f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1894f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1895f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1896ae616494SBram Moolenaar 1897ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1898ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1899ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1900ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1901f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1902f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1903f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1904f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1905f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1906ae616494SBram Moolenaarenddef 1907ae616494SBram Moolenaar 1908158906cfSBram Moolenaardef IfElse(what: number): string 1909158906cfSBram Moolenaar let res = '' 1910158906cfSBram Moolenaar if what == 1 1911158906cfSBram Moolenaar res = "one" 1912158906cfSBram Moolenaar elseif what == 2 1913158906cfSBram Moolenaar res = "two" 1914a259d8d3SBram Moolenaar else 1915158906cfSBram Moolenaar res = "three" 1916a259d8d3SBram Moolenaar endif 1917158906cfSBram Moolenaar return res 1918a259d8d3SBram Moolenaarenddef 1919a259d8d3SBram Moolenaar 1920158906cfSBram Moolenaardef Test_if_elseif_else() 1921158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1922158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1923158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 19240f18b6d1SBram Moolenaarenddef 19250f18b6d1SBram Moolenaar 1926e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1927e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1928e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1929e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1930e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1931585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1932e8c4abbbSBram Moolenaarenddef 1933e8c4abbbSBram Moolenaar 19346d69bf60SBram Moolenaarlet g:bool_true = v:true 19356d69bf60SBram Moolenaarlet g:bool_false = v:false 19366d69bf60SBram Moolenaar 19376d69bf60SBram Moolenaardef Test_if_const_expr() 19386d69bf60SBram Moolenaar let res = false 19396d69bf60SBram Moolenaar if true ? true : false 19406d69bf60SBram Moolenaar res = true 19416d69bf60SBram Moolenaar endif 19426d69bf60SBram Moolenaar assert_equal(true, res) 19436d69bf60SBram Moolenaar 1944585fea7bSBram Moolenaar g:glob = 2 1945585fea7bSBram Moolenaar if false 19466797966dSBram Moolenaar execute('g:glob = 3') 1947585fea7bSBram Moolenaar endif 1948585fea7bSBram Moolenaar assert_equal(2, g:glob) 1949585fea7bSBram Moolenaar if true 19506797966dSBram Moolenaar execute('g:glob = 3') 1951585fea7bSBram Moolenaar endif 1952585fea7bSBram Moolenaar assert_equal(3, g:glob) 1953585fea7bSBram Moolenaar 19546d69bf60SBram Moolenaar res = false 19556d69bf60SBram Moolenaar if g:bool_true ? true : false 19566d69bf60SBram Moolenaar res = true 19576d69bf60SBram Moolenaar endif 19586d69bf60SBram Moolenaar assert_equal(true, res) 19596d69bf60SBram Moolenaar 19606d69bf60SBram Moolenaar res = false 19616d69bf60SBram Moolenaar if true ? g:bool_true : false 19626d69bf60SBram Moolenaar res = true 19636d69bf60SBram Moolenaar endif 19646d69bf60SBram Moolenaar assert_equal(true, res) 19656d69bf60SBram Moolenaar 19666d69bf60SBram Moolenaar res = false 19676d69bf60SBram Moolenaar if true ? true : g:bool_false 19686d69bf60SBram Moolenaar res = true 19696d69bf60SBram Moolenaar endif 19706d69bf60SBram Moolenaar assert_equal(true, res) 19716d69bf60SBram Moolenaar 19726d69bf60SBram Moolenaar res = false 19736d69bf60SBram Moolenaar if true ? false : true 19746d69bf60SBram Moolenaar res = true 19756d69bf60SBram Moolenaar endif 19766d69bf60SBram Moolenaar assert_equal(false, res) 19776d69bf60SBram Moolenaar 19786d69bf60SBram Moolenaar res = false 19796d69bf60SBram Moolenaar if false ? false : true 19806d69bf60SBram Moolenaar res = true 19816d69bf60SBram Moolenaar endif 19826d69bf60SBram Moolenaar assert_equal(true, res) 19836d69bf60SBram Moolenaar 19846d69bf60SBram Moolenaar res = false 19856d69bf60SBram Moolenaar if false ? true : false 19866d69bf60SBram Moolenaar res = true 19876d69bf60SBram Moolenaar endif 19886d69bf60SBram Moolenaar assert_equal(false, res) 19896d69bf60SBram Moolenaar 19906d69bf60SBram Moolenaar res = false 1991e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1992e8c4abbbSBram Moolenaar res = true 1993e8c4abbbSBram Moolenaar endif 1994e8c4abbbSBram Moolenaar assert_equal(false, res) 1995e8c4abbbSBram Moolenaar 1996e8c4abbbSBram Moolenaar res = false 19976d69bf60SBram Moolenaar if true && true 19986d69bf60SBram Moolenaar res = true 19996d69bf60SBram Moolenaar endif 20006d69bf60SBram Moolenaar assert_equal(true, res) 20016d69bf60SBram Moolenaar 20026d69bf60SBram Moolenaar res = false 20036d69bf60SBram Moolenaar if true && false 20046d69bf60SBram Moolenaar res = true 20056d69bf60SBram Moolenaar endif 20066d69bf60SBram Moolenaar assert_equal(false, res) 20076d69bf60SBram Moolenaar 20086d69bf60SBram Moolenaar res = false 20096d69bf60SBram Moolenaar if g:bool_true && false 20106d69bf60SBram Moolenaar res = true 20116d69bf60SBram Moolenaar endif 20126d69bf60SBram Moolenaar assert_equal(false, res) 20136d69bf60SBram Moolenaar 20146d69bf60SBram Moolenaar res = false 20156d69bf60SBram Moolenaar if true && g:bool_false 20166d69bf60SBram Moolenaar res = true 20176d69bf60SBram Moolenaar endif 20186d69bf60SBram Moolenaar assert_equal(false, res) 20196d69bf60SBram Moolenaar 20206d69bf60SBram Moolenaar res = false 20216d69bf60SBram Moolenaar if false && false 20226d69bf60SBram Moolenaar res = true 20236d69bf60SBram Moolenaar endif 20246d69bf60SBram Moolenaar assert_equal(false, res) 20256d69bf60SBram Moolenaar 20266d69bf60SBram Moolenaar res = false 20276d69bf60SBram Moolenaar if true || false 20286d69bf60SBram Moolenaar res = true 20296d69bf60SBram Moolenaar endif 20306d69bf60SBram Moolenaar assert_equal(true, res) 20316d69bf60SBram Moolenaar 20326d69bf60SBram Moolenaar res = false 20336d69bf60SBram Moolenaar if g:bool_true || false 20346d69bf60SBram Moolenaar res = true 20356d69bf60SBram Moolenaar endif 20366d69bf60SBram Moolenaar assert_equal(true, res) 20376d69bf60SBram Moolenaar 20386d69bf60SBram Moolenaar res = false 20396d69bf60SBram Moolenaar if true || g:bool_false 20406d69bf60SBram Moolenaar res = true 20416d69bf60SBram Moolenaar endif 20426d69bf60SBram Moolenaar assert_equal(true, res) 20436d69bf60SBram Moolenaar 20446d69bf60SBram Moolenaar res = false 20456d69bf60SBram Moolenaar if false || false 20466d69bf60SBram Moolenaar res = true 20476d69bf60SBram Moolenaar endif 20486d69bf60SBram Moolenaar assert_equal(false, res) 204980c34ca3SBram Moolenaarenddef 20506d69bf60SBram Moolenaar 205180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 205280c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 205380c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2054e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 2055e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 20566d69bf60SBram Moolenaarenddef 20576d69bf60SBram Moolenaar 205872abcf42SBram Moolenaardef RunNested(i: number): number 205972abcf42SBram Moolenaar let x: number = 0 206072abcf42SBram Moolenaar if i % 2 206172abcf42SBram Moolenaar if 1 2062f5be8cdbSBram Moolenaar # comment 206372abcf42SBram Moolenaar else 2064f5be8cdbSBram Moolenaar # comment 206572abcf42SBram Moolenaar endif 206672abcf42SBram Moolenaar x += 1 206772abcf42SBram Moolenaar else 206872abcf42SBram Moolenaar x += 1000 206972abcf42SBram Moolenaar endif 207072abcf42SBram Moolenaar return x 207172abcf42SBram Moolenaarenddef 207272abcf42SBram Moolenaar 207372abcf42SBram Moolenaardef Test_nested_if() 207472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 207572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 207672abcf42SBram Moolenaarenddef 207772abcf42SBram Moolenaar 2078ad39c094SBram Moolenaardef Test_execute_cmd() 2079ad39c094SBram Moolenaar new 2080ad39c094SBram Moolenaar setline(1, 'default') 2081ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 2082ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2083a72cfb80SBram Moolenaar 2084a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 2085a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2086a72cfb80SBram Moolenaar 2087ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 2088ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2089a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2090ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2091a72cfb80SBram Moolenaar 2092ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 2093ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2094a72cfb80SBram Moolenaar 2095ad39c094SBram Moolenaar let cmd_first = 'call ' 2096ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2097ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2098ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2099ad39c094SBram Moolenaar bwipe! 2100585fea7bSBram Moolenaar 21012d6b20d6SBram Moolenaar let n = true 21022d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 21032d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 21042d6b20d6SBram Moolenaar 2105*e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 2106*e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2107*e5abf7afSBram Moolenaar 2108585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 2109a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 2110ad39c094SBram Moolenaarenddef 2111ad39c094SBram Moolenaar 211247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2113f5be8cdbSBram Moolenaar # only checks line continuation 211447e880d6SBram Moolenaar let lines =<< trim END 211547e880d6SBram Moolenaar vim9script 211647e880d6SBram Moolenaar execute 'g:someVar' 211747e880d6SBram Moolenaar .. ' = ' .. 211847e880d6SBram Moolenaar '28' 211947e880d6SBram Moolenaar assert_equal(28, g:someVar) 212047e880d6SBram Moolenaar unlet g:someVar 212147e880d6SBram Moolenaar END 212247e880d6SBram Moolenaar CheckScriptSuccess(lines) 212347e880d6SBram Moolenaarenddef 212447e880d6SBram Moolenaar 2125ad39c094SBram Moolenaardef Test_echo_cmd() 2126a72cfb80SBram Moolenaar echo 'some' # comment 2127585fea7bSBram Moolenaar echon 'thing' 2128ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2129ad39c094SBram Moolenaar 2130a72cfb80SBram Moolenaar echo "some" # comment 2131a72cfb80SBram Moolenaar echon "thing" 2132a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2133a72cfb80SBram Moolenaar 2134ad39c094SBram Moolenaar let str1 = 'some' 2135ad39c094SBram Moolenaar let str2 = 'more' 2136ad39c094SBram Moolenaar echo str1 str2 2137ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2138a72cfb80SBram Moolenaar 2139a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2140ad39c094SBram Moolenaarenddef 2141ad39c094SBram Moolenaar 2142f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2143f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2144f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2145f93c7feaSBram Moolenaar echo 'clear' 2146df069eecSBram Moolenaar :1messages 2147f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2148f93c7feaSBram Moolenaar 2149f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2150f93c7feaSBram Moolenaarenddef 2151f93c7feaSBram Moolenaar 215247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2153f5be8cdbSBram Moolenaar # only checks line continuation 215447e880d6SBram Moolenaar let lines =<< trim END 215547e880d6SBram Moolenaar vim9script 215647e880d6SBram Moolenaar echomsg 'here' 215747e880d6SBram Moolenaar .. ' is ' .. 215847e880d6SBram Moolenaar 'a message' 215947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 216047e880d6SBram Moolenaar END 216147e880d6SBram Moolenaar CheckScriptSuccess(lines) 216247e880d6SBram Moolenaarenddef 216347e880d6SBram Moolenaar 2164f93c7feaSBram Moolenaardef Test_echoerr_cmd() 216540ee466cSBram Moolenaar try 216640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 216740ee466cSBram Moolenaar catch 216840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 216940ee466cSBram Moolenaar endtry 2170f93c7feaSBram Moolenaarenddef 2171f93c7feaSBram Moolenaar 217247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2173f5be8cdbSBram Moolenaar # only checks line continuation 217447e880d6SBram Moolenaar let lines =<< trim END 217547e880d6SBram Moolenaar vim9script 217647e880d6SBram Moolenaar try 217747e880d6SBram Moolenaar echoerr 'this' 217847e880d6SBram Moolenaar .. ' is ' .. 217947e880d6SBram Moolenaar 'wrong' 218047e880d6SBram Moolenaar catch 218147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 218247e880d6SBram Moolenaar endtry 218347e880d6SBram Moolenaar END 218447e880d6SBram Moolenaar CheckScriptSuccess(lines) 218547e880d6SBram Moolenaarenddef 218647e880d6SBram Moolenaar 218741fe0617SBram Moolenaardef Test_for_outside_of_function() 218841fe0617SBram Moolenaar let lines =<< trim END 218941fe0617SBram Moolenaar vim9script 219041fe0617SBram Moolenaar new 219141fe0617SBram Moolenaar for var in range(0, 3) 219241fe0617SBram Moolenaar append(line('$'), var) 219341fe0617SBram Moolenaar endfor 219441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 219541fe0617SBram Moolenaar bwipe! 219641fe0617SBram Moolenaar END 219741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 219841fe0617SBram Moolenaar source Xvim9for.vim 219941fe0617SBram Moolenaar delete('Xvim9for.vim') 220041fe0617SBram Moolenaarenddef 22018a7d6542SBram Moolenaar 2202e8c4abbbSBram Moolenaardef Test_for_loop() 2203e8c4abbbSBram Moolenaar let result = '' 2204e8c4abbbSBram Moolenaar for cnt in range(7) 2205e8c4abbbSBram Moolenaar if cnt == 4 2206e8c4abbbSBram Moolenaar break 2207e8c4abbbSBram Moolenaar endif 2208e8c4abbbSBram Moolenaar if cnt == 2 2209e8c4abbbSBram Moolenaar continue 2210e8c4abbbSBram Moolenaar endif 2211e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2212e8c4abbbSBram Moolenaar endfor 2213e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 22140ad3e894SBram Moolenaar 22150ad3e894SBram Moolenaar let concat = '' 22160ad3e894SBram Moolenaar for str in eval('["one", "two"]') 22170ad3e894SBram Moolenaar concat ..= str 22180ad3e894SBram Moolenaar endfor 22190ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2220e8c4abbbSBram Moolenaarenddef 2221e8c4abbbSBram Moolenaar 2222e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2223675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2224675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2225451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 2226822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 2227451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2228675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2229675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2230675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2231e8c4abbbSBram Moolenaarenddef 2232e8c4abbbSBram Moolenaar 2233d0df1aacSBram Moolenaardef Test_while_loop() 2234d0df1aacSBram Moolenaar let result = '' 2235d0df1aacSBram Moolenaar let cnt = 0 2236d0df1aacSBram Moolenaar while cnt < 555 2237d0df1aacSBram Moolenaar if cnt == 3 2238d0df1aacSBram Moolenaar break 2239d0df1aacSBram Moolenaar endif 2240d0df1aacSBram Moolenaar cnt += 1 2241d0df1aacSBram Moolenaar if cnt == 2 2242d0df1aacSBram Moolenaar continue 2243d0df1aacSBram Moolenaar endif 2244d0df1aacSBram Moolenaar result ..= cnt .. '_' 2245d0df1aacSBram Moolenaar endwhile 2246d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2247d0df1aacSBram Moolenaarenddef 2248d0df1aacSBram Moolenaar 2249e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2250675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2251675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2252675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2253675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2254675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2255675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2256675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2257bd5da371SBram Moolenaarenddef 2258bd5da371SBram Moolenaar 22599645e2d9SBram Moolenaardef Test_interrupt_loop() 226097acfc78SBram Moolenaar let caught = false 22619645e2d9SBram Moolenaar let x = 0 226297acfc78SBram Moolenaar try 22639645e2d9SBram Moolenaar while 1 22649645e2d9SBram Moolenaar x += 1 22659645e2d9SBram Moolenaar if x == 100 22669645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22679645e2d9SBram Moolenaar endif 22689645e2d9SBram Moolenaar endwhile 226997acfc78SBram Moolenaar catch 227097acfc78SBram Moolenaar caught = true 227197acfc78SBram Moolenaar assert_equal(100, x) 227297acfc78SBram Moolenaar endtry 227397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 22749645e2d9SBram Moolenaarenddef 227520431c9dSBram Moolenaar 22764fdae999SBram Moolenaardef Test_automatic_line_continuation() 22774fdae999SBram Moolenaar let mylist = [ 22784fdae999SBram Moolenaar 'one', 22794fdae999SBram Moolenaar 'two', 22804fdae999SBram Moolenaar 'three', 2281f5be8cdbSBram Moolenaar ] # comment 22824fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22834fdae999SBram Moolenaar 22844fdae999SBram Moolenaar let mydict = { 22854fdae999SBram Moolenaar 'one': 1, 22864fdae999SBram Moolenaar 'two': 2, 22874fdae999SBram Moolenaar 'three': 22884fdae999SBram Moolenaar 3, 2289f5be8cdbSBram Moolenaar } # comment 22904fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 22914fdae999SBram Moolenaar mydict = #{ 22922c330432SBram Moolenaar one: 1, # comment 22932c330432SBram Moolenaar two: # comment 22942c330432SBram Moolenaar 2, # comment 22952c330432SBram Moolenaar three: 3 # comment 22962c330432SBram Moolenaar } 22972c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 22982c330432SBram Moolenaar mydict = #{ 22992c330432SBram Moolenaar one: 1, 23004fdae999SBram Moolenaar two: 23014fdae999SBram Moolenaar 2, 23022c330432SBram Moolenaar three: 3 23034fdae999SBram Moolenaar } 23044fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2305e6085c53SBram Moolenaar 2306e6085c53SBram Moolenaar assert_equal( 2307e6085c53SBram Moolenaar ['one', 'two', 'three'], 2308e6085c53SBram Moolenaar split('one two three') 2309e6085c53SBram Moolenaar ) 23104fdae999SBram Moolenaarenddef 23114fdae999SBram Moolenaar 23127a092245SBram Moolenaardef Test_vim9_comment() 23137a092245SBram Moolenaar CheckScriptSuccess([ 23147a092245SBram Moolenaar 'vim9script', 23157a092245SBram Moolenaar '# something', 23167a092245SBram Moolenaar ]) 23177a092245SBram Moolenaar CheckScriptFailure([ 23187a092245SBram Moolenaar 'vim9script', 23197a092245SBram Moolenaar ':# something', 23207a092245SBram Moolenaar ], 'E488:') 23217a092245SBram Moolenaar CheckScriptFailure([ 23227a092245SBram Moolenaar '# something', 23237a092245SBram Moolenaar ], 'E488:') 23247a092245SBram Moolenaar CheckScriptFailure([ 23257a092245SBram Moolenaar ':# something', 23267a092245SBram Moolenaar ], 'E488:') 23277a092245SBram Moolenaar 23284a8d9f2eSBram Moolenaar { # block start 23294a8d9f2eSBram Moolenaar } # block end 23304a8d9f2eSBram Moolenaar CheckDefFailure([ 23314a8d9f2eSBram Moolenaar '{# comment', 23324a8d9f2eSBram Moolenaar ], 'E488:') 23334a8d9f2eSBram Moolenaar CheckDefFailure([ 23344a8d9f2eSBram Moolenaar '{', 23354a8d9f2eSBram Moolenaar '}# comment', 23364a8d9f2eSBram Moolenaar ], 'E488:') 23374a8d9f2eSBram Moolenaar 23384a8d9f2eSBram Moolenaar echo "yes" # comment 23394a8d9f2eSBram Moolenaar CheckDefFailure([ 23404a8d9f2eSBram Moolenaar 'echo "yes"# comment', 23414a8d9f2eSBram Moolenaar ], 'E488:') 23427a092245SBram Moolenaar CheckScriptSuccess([ 23437a092245SBram Moolenaar 'vim9script', 23447a092245SBram Moolenaar 'echo "yes" # something', 23457a092245SBram Moolenaar ]) 23467a092245SBram Moolenaar CheckScriptFailure([ 23477a092245SBram Moolenaar 'vim9script', 23487a092245SBram Moolenaar 'echo "yes"# something', 23497a092245SBram Moolenaar ], 'E121:') 23507a092245SBram Moolenaar CheckScriptFailure([ 23517a092245SBram Moolenaar 'vim9script', 23527a092245SBram Moolenaar 'echo# something', 23537a092245SBram Moolenaar ], 'E121:') 23547a092245SBram Moolenaar CheckScriptFailure([ 23557a092245SBram Moolenaar 'echo "yes" # something', 23567a092245SBram Moolenaar ], 'E121:') 23577a092245SBram Moolenaar 23584a8d9f2eSBram Moolenaar exe "echo" # comment 23594a8d9f2eSBram Moolenaar CheckDefFailure([ 23604a8d9f2eSBram Moolenaar 'exe "echo"# comment', 23614a8d9f2eSBram Moolenaar ], 'E488:') 23624a8d9f2eSBram Moolenaar CheckScriptSuccess([ 23634a8d9f2eSBram Moolenaar 'vim9script', 23644a8d9f2eSBram Moolenaar 'exe "echo" # something', 23654a8d9f2eSBram Moolenaar ]) 23664a8d9f2eSBram Moolenaar CheckScriptFailure([ 23674a8d9f2eSBram Moolenaar 'vim9script', 23684a8d9f2eSBram Moolenaar 'exe "echo"# something', 23694a8d9f2eSBram Moolenaar ], 'E121:') 23704a8d9f2eSBram Moolenaar CheckDefFailure([ 23714a8d9f2eSBram Moolenaar 'exe # comment', 23724a8d9f2eSBram Moolenaar ], 'E1015:') 23734a8d9f2eSBram Moolenaar CheckScriptFailure([ 23744a8d9f2eSBram Moolenaar 'vim9script', 23754a8d9f2eSBram Moolenaar 'exe# something', 23764a8d9f2eSBram Moolenaar ], 'E121:') 23774a8d9f2eSBram Moolenaar CheckScriptFailure([ 23784a8d9f2eSBram Moolenaar 'exe "echo" # something', 23794a8d9f2eSBram Moolenaar ], 'E121:') 23804a8d9f2eSBram Moolenaar 23817a092245SBram Moolenaar CheckDefFailure([ 23827a092245SBram Moolenaar 'try# comment', 23837a092245SBram Moolenaar ' echo "yes"', 23847a092245SBram Moolenaar 'catch', 23857a092245SBram Moolenaar 'endtry', 23867a092245SBram Moolenaar ], 'E488:') 23872c5ed4e3SBram Moolenaar CheckScriptFailure([ 23882c5ed4e3SBram Moolenaar 'vim9script', 23892c5ed4e3SBram Moolenaar 'try# comment', 23902c5ed4e3SBram Moolenaar 'echo "yes"', 23912c5ed4e3SBram Moolenaar ], 'E488:') 23927a092245SBram Moolenaar CheckDefFailure([ 23937a092245SBram Moolenaar 'try', 2394a72cfb80SBram Moolenaar ' throw#comment', 2395a72cfb80SBram Moolenaar 'catch', 2396a72cfb80SBram Moolenaar 'endtry', 2397a72cfb80SBram Moolenaar ], 'E1015:') 2398a72cfb80SBram Moolenaar CheckDefFailure([ 2399a72cfb80SBram Moolenaar 'try', 2400a72cfb80SBram Moolenaar ' throw "yes"#comment', 2401a72cfb80SBram Moolenaar 'catch', 2402a72cfb80SBram Moolenaar 'endtry', 2403a72cfb80SBram Moolenaar ], 'E488:') 2404a72cfb80SBram Moolenaar CheckDefFailure([ 2405a72cfb80SBram Moolenaar 'try', 24067a092245SBram Moolenaar ' echo "yes"', 24077a092245SBram Moolenaar 'catch# comment', 24087a092245SBram Moolenaar 'endtry', 24097a092245SBram Moolenaar ], 'E488:') 24102c5ed4e3SBram Moolenaar CheckScriptFailure([ 24112c5ed4e3SBram Moolenaar 'vim9script', 24122c5ed4e3SBram Moolenaar 'try', 24132c5ed4e3SBram Moolenaar ' echo "yes"', 24142c5ed4e3SBram Moolenaar 'catch# comment', 24152c5ed4e3SBram Moolenaar 'endtry', 24162c5ed4e3SBram Moolenaar ], 'E654:') 24172c5ed4e3SBram Moolenaar CheckDefFailure([ 24182c5ed4e3SBram Moolenaar 'try', 24192c5ed4e3SBram Moolenaar ' echo "yes"', 24202c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24212c5ed4e3SBram Moolenaar 'endtry', 24222c5ed4e3SBram Moolenaar ], 'E488:') 24237a092245SBram Moolenaar CheckDefFailure([ 24247a092245SBram Moolenaar 'try', 24257a092245SBram Moolenaar 'echo "yes"', 24267a092245SBram Moolenaar 'catch', 24277a092245SBram Moolenaar 'endtry# comment', 24287a092245SBram Moolenaar ], 'E488:') 24292c5ed4e3SBram Moolenaar CheckScriptFailure([ 24302c5ed4e3SBram Moolenaar 'vim9script', 24312c5ed4e3SBram Moolenaar 'try', 24322c5ed4e3SBram Moolenaar ' echo "yes"', 24332c5ed4e3SBram Moolenaar 'catch', 24342c5ed4e3SBram Moolenaar 'endtry# comment', 24359b7bf9e9SBram Moolenaar ], 'E488:') 24362c5ed4e3SBram Moolenaar 24372c5ed4e3SBram Moolenaar CheckScriptSuccess([ 24382c5ed4e3SBram Moolenaar 'vim9script', 24392c5ed4e3SBram Moolenaar 'hi # comment', 24402c5ed4e3SBram Moolenaar ]) 24412c5ed4e3SBram Moolenaar CheckScriptFailure([ 24422c5ed4e3SBram Moolenaar 'vim9script', 24432c5ed4e3SBram Moolenaar 'hi# comment', 24442c5ed4e3SBram Moolenaar ], 'E416:') 24451966c248SBram Moolenaar CheckScriptSuccess([ 24461966c248SBram Moolenaar 'vim9script', 24471966c248SBram Moolenaar 'hi Search # comment', 24481966c248SBram Moolenaar ]) 24491966c248SBram Moolenaar CheckScriptFailure([ 24501966c248SBram Moolenaar 'vim9script', 24511966c248SBram Moolenaar 'hi Search# comment', 24521966c248SBram Moolenaar ], 'E416:') 24531966c248SBram Moolenaar CheckScriptSuccess([ 24541966c248SBram Moolenaar 'vim9script', 24551966c248SBram Moolenaar 'hi link This Search # comment', 24561966c248SBram Moolenaar ]) 24571966c248SBram Moolenaar CheckScriptFailure([ 24581966c248SBram Moolenaar 'vim9script', 24591966c248SBram Moolenaar 'hi link This That# comment', 24601966c248SBram Moolenaar ], 'E413:') 24611966c248SBram Moolenaar CheckScriptSuccess([ 24621966c248SBram Moolenaar 'vim9script', 24631966c248SBram Moolenaar 'hi clear This # comment', 24641966c248SBram Moolenaar 'hi clear # comment', 24651966c248SBram Moolenaar ]) 2466f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2467f5be8cdbSBram Moolenaar # hi clear This# comment', 24681966c248SBram Moolenaar CheckScriptFailure([ 24691966c248SBram Moolenaar 'vim9script', 24701966c248SBram Moolenaar 'hi clear# comment', 24711966c248SBram Moolenaar ], 'E416:') 24721966c248SBram Moolenaar 24731966c248SBram Moolenaar CheckScriptSuccess([ 24741966c248SBram Moolenaar 'vim9script', 24751966c248SBram Moolenaar 'hi Group term=bold', 24761966c248SBram Moolenaar 'match Group /todo/ # comment', 24771966c248SBram Moolenaar ]) 24781966c248SBram Moolenaar CheckScriptFailure([ 24791966c248SBram Moolenaar 'vim9script', 24801966c248SBram Moolenaar 'hi Group term=bold', 24811966c248SBram Moolenaar 'match Group /todo/# comment', 24821966c248SBram Moolenaar ], 'E488:') 24831966c248SBram Moolenaar CheckScriptSuccess([ 24841966c248SBram Moolenaar 'vim9script', 24851966c248SBram Moolenaar 'match # comment', 24861966c248SBram Moolenaar ]) 24871966c248SBram Moolenaar CheckScriptFailure([ 24881966c248SBram Moolenaar 'vim9script', 24891966c248SBram Moolenaar 'match# comment', 24901966c248SBram Moolenaar ], 'E475:') 24911966c248SBram Moolenaar CheckScriptSuccess([ 24921966c248SBram Moolenaar 'vim9script', 24931966c248SBram Moolenaar 'match none # comment', 24941966c248SBram Moolenaar ]) 24951966c248SBram Moolenaar CheckScriptFailure([ 24961966c248SBram Moolenaar 'vim9script', 24971966c248SBram Moolenaar 'match none# comment', 24981966c248SBram Moolenaar ], 'E475:') 24991966c248SBram Moolenaar 25001966c248SBram Moolenaar CheckScriptSuccess([ 25011966c248SBram Moolenaar 'vim9script', 25021966c248SBram Moolenaar 'menutrans clear # comment', 25031966c248SBram Moolenaar ]) 25041966c248SBram Moolenaar CheckScriptFailure([ 25051966c248SBram Moolenaar 'vim9script', 25061966c248SBram Moolenaar 'menutrans clear# comment text', 25071966c248SBram Moolenaar ], 'E474:') 25081966c248SBram Moolenaar 25091966c248SBram Moolenaar CheckScriptSuccess([ 25101966c248SBram Moolenaar 'vim9script', 25111966c248SBram Moolenaar 'syntax clear # comment', 25121966c248SBram Moolenaar ]) 25131966c248SBram Moolenaar CheckScriptFailure([ 25141966c248SBram Moolenaar 'vim9script', 25151966c248SBram Moolenaar 'syntax clear# comment text', 25161966c248SBram Moolenaar ], 'E28:') 25171966c248SBram Moolenaar CheckScriptSuccess([ 25181966c248SBram Moolenaar 'vim9script', 25191966c248SBram Moolenaar 'syntax keyword Word some', 25201966c248SBram Moolenaar 'syntax clear Word # comment', 25211966c248SBram Moolenaar ]) 25221966c248SBram Moolenaar CheckScriptFailure([ 25231966c248SBram Moolenaar 'vim9script', 25241966c248SBram Moolenaar 'syntax keyword Word some', 25251966c248SBram Moolenaar 'syntax clear Word# comment text', 25261966c248SBram Moolenaar ], 'E28:') 25271966c248SBram Moolenaar 25281966c248SBram Moolenaar CheckScriptSuccess([ 25291966c248SBram Moolenaar 'vim9script', 25301966c248SBram Moolenaar 'syntax list # comment', 25311966c248SBram Moolenaar ]) 25321966c248SBram Moolenaar CheckScriptFailure([ 25331966c248SBram Moolenaar 'vim9script', 25341966c248SBram Moolenaar 'syntax list# comment text', 25351966c248SBram Moolenaar ], 'E28:') 25361966c248SBram Moolenaar 25371966c248SBram Moolenaar CheckScriptSuccess([ 25381966c248SBram Moolenaar 'vim9script', 25391966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 25401966c248SBram Moolenaar ]) 25411966c248SBram Moolenaar CheckScriptFailure([ 25421966c248SBram Moolenaar 'vim9script', 25431966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 25441966c248SBram Moolenaar ], 'E475:') 25451966c248SBram Moolenaar 25461966c248SBram Moolenaar CheckScriptSuccess([ 25471966c248SBram Moolenaar 'vim9script', 25481966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 25491966c248SBram Moolenaar ]) 25501966c248SBram Moolenaar CheckScriptFailure([ 25511966c248SBram Moolenaar 'vim9script', 25521966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25531966c248SBram Moolenaar ], 'E789:') 25541966c248SBram Moolenaar 25551966c248SBram Moolenaar CheckScriptSuccess([ 25561966c248SBram Moolenaar 'vim9script', 25571966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 25581966c248SBram Moolenaar ]) 25591966c248SBram Moolenaar CheckScriptFailure([ 25601966c248SBram Moolenaar 'vim9script', 25611966c248SBram Moolenaar 'syntax match Word /pat/# comment', 25621966c248SBram Moolenaar ], 'E402:') 25631966c248SBram Moolenaar 25641966c248SBram Moolenaar CheckScriptSuccess([ 25651966c248SBram Moolenaar 'vim9script', 25661966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25671966c248SBram Moolenaar ]) 25681966c248SBram Moolenaar CheckScriptFailure([ 25691966c248SBram Moolenaar 'vim9script', 25701966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25711966c248SBram Moolenaar ], 'E475:') 25721966c248SBram Moolenaar CheckScriptFailure([ 25731966c248SBram Moolenaar 'vim9script', 25741966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25751966c248SBram Moolenaar ], 'E406:') 25761966c248SBram Moolenaar CheckScriptFailure([ 25771966c248SBram Moolenaar 'vim9script', 25781966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25791966c248SBram Moolenaar ], 'E475:') 25801966c248SBram Moolenaar 25811966c248SBram Moolenaar CheckScriptSuccess([ 25821966c248SBram Moolenaar 'vim9script', 25831966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25841966c248SBram Moolenaar ]) 25851966c248SBram Moolenaar CheckScriptFailure([ 25861966c248SBram Moolenaar 'vim9script', 25871966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2588d032f34aSBram Moolenaar ], 'E402:') 25891966c248SBram Moolenaar 25901966c248SBram Moolenaar CheckScriptSuccess([ 25911966c248SBram Moolenaar 'vim9script', 25921966c248SBram Moolenaar 'syntax sync # comment', 25931966c248SBram Moolenaar ]) 25941966c248SBram Moolenaar CheckScriptFailure([ 25951966c248SBram Moolenaar 'vim9script', 25961966c248SBram Moolenaar 'syntax sync# comment', 25971966c248SBram Moolenaar ], 'E404:') 25981966c248SBram Moolenaar CheckScriptSuccess([ 25991966c248SBram Moolenaar 'vim9script', 26001966c248SBram Moolenaar 'syntax sync ccomment # comment', 26011966c248SBram Moolenaar ]) 26021966c248SBram Moolenaar CheckScriptFailure([ 26031966c248SBram Moolenaar 'vim9script', 26041966c248SBram Moolenaar 'syntax sync ccomment# comment', 26051966c248SBram Moolenaar ], 'E404:') 26061966c248SBram Moolenaar 26071966c248SBram Moolenaar CheckScriptSuccess([ 26081966c248SBram Moolenaar 'vim9script', 26091966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26101966c248SBram Moolenaar ]) 26111966c248SBram Moolenaar CheckScriptFailure([ 26121966c248SBram Moolenaar 'vim9script', 26131966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 26141966c248SBram Moolenaar ], 'E475:') 2615a72cfb80SBram Moolenaar 2616a72cfb80SBram Moolenaar CheckScriptSuccess([ 2617a72cfb80SBram Moolenaar 'vim9script', 2618a72cfb80SBram Moolenaar 'command Echo echo # comment', 2619a72cfb80SBram Moolenaar 'command Echo # comment', 2620a72cfb80SBram Moolenaar ]) 2621a72cfb80SBram Moolenaar CheckScriptFailure([ 2622a72cfb80SBram Moolenaar 'vim9script', 2623a72cfb80SBram Moolenaar 'command Echo echo# comment', 2624a72cfb80SBram Moolenaar 'Echo', 2625a72cfb80SBram Moolenaar ], 'E121:') 2626a72cfb80SBram Moolenaar CheckScriptFailure([ 2627a72cfb80SBram Moolenaar 'vim9script', 2628a72cfb80SBram Moolenaar 'command Echo# comment', 2629a72cfb80SBram Moolenaar ], 'E182:') 2630a72cfb80SBram Moolenaar CheckScriptFailure([ 2631a72cfb80SBram Moolenaar 'vim9script', 2632a72cfb80SBram Moolenaar 'command Echo echo', 2633a72cfb80SBram Moolenaar 'command Echo# comment', 2634a72cfb80SBram Moolenaar ], 'E182:') 2635a72cfb80SBram Moolenaar 2636a72cfb80SBram Moolenaar CheckScriptSuccess([ 2637a72cfb80SBram Moolenaar 'vim9script', 2638a72cfb80SBram Moolenaar 'function # comment', 2639a72cfb80SBram Moolenaar ]) 2640a72cfb80SBram Moolenaar CheckScriptFailure([ 2641a72cfb80SBram Moolenaar 'vim9script', 26429898107fSBram Moolenaar 'function " comment', 26439898107fSBram Moolenaar ], 'E129:') 26449898107fSBram Moolenaar CheckScriptFailure([ 26459898107fSBram Moolenaar 'vim9script', 2646a72cfb80SBram Moolenaar 'function# comment', 2647a72cfb80SBram Moolenaar ], 'E129:') 2648a72cfb80SBram Moolenaar CheckScriptSuccess([ 2649a72cfb80SBram Moolenaar 'vim9script', 2650a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2651a72cfb80SBram Moolenaar ]) 2652a72cfb80SBram Moolenaar CheckScriptFailure([ 2653a72cfb80SBram Moolenaar 'vim9script', 2654a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2655a72cfb80SBram Moolenaar ], 'E488:') 2656a72cfb80SBram Moolenaar 2657a72cfb80SBram Moolenaar CheckScriptSuccess([ 2658a72cfb80SBram Moolenaar 'vim9script', 26594c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2660a72cfb80SBram Moolenaar 'endfunc', 26614c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2662a72cfb80SBram Moolenaar ]) 2663a72cfb80SBram Moolenaar CheckScriptFailure([ 2664a72cfb80SBram Moolenaar 'vim9script', 26654c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2666a72cfb80SBram Moolenaar 'endfunc', 26674c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2668a72cfb80SBram Moolenaar ], 'E488:') 2669a72cfb80SBram Moolenaar 2670a72cfb80SBram Moolenaar CheckScriptSuccess([ 2671a72cfb80SBram Moolenaar 'vim9script', 2672a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2673a72cfb80SBram Moolenaar ]) 2674a72cfb80SBram Moolenaar CheckScriptFailure([ 2675a72cfb80SBram Moolenaar 'vim9script', 2676a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2677a72cfb80SBram Moolenaar ], 'E488:') 2678e7e4838fSBram Moolenaar 2679e7e4838fSBram Moolenaar CheckScriptFailure([ 2680e7e4838fSBram Moolenaar 'def Test() " comment', 2681e7e4838fSBram Moolenaar 'enddef', 2682e7e4838fSBram Moolenaar ], 'E488:') 2683e7e4838fSBram Moolenaar CheckScriptFailure([ 2684e7e4838fSBram Moolenaar 'vim9script', 2685e7e4838fSBram Moolenaar 'def Test() " comment', 2686e7e4838fSBram Moolenaar 'enddef', 2687e7e4838fSBram Moolenaar ], 'E488:') 2688e7e4838fSBram Moolenaar 2689e7e4838fSBram Moolenaar CheckScriptSuccess([ 2690e7e4838fSBram Moolenaar 'func Test() " comment', 2691e7e4838fSBram Moolenaar 'endfunc', 2692e7e4838fSBram Moolenaar ]) 26939898107fSBram Moolenaar CheckScriptSuccess([ 2694e7e4838fSBram Moolenaar 'vim9script', 2695e7e4838fSBram Moolenaar 'func Test() " comment', 2696e7e4838fSBram Moolenaar 'endfunc', 26979898107fSBram Moolenaar ]) 2698e7e4838fSBram Moolenaar 2699e7e4838fSBram Moolenaar CheckScriptSuccess([ 2700e7e4838fSBram Moolenaar 'def Test() # comment', 2701e7e4838fSBram Moolenaar 'enddef', 2702e7e4838fSBram Moolenaar ]) 2703e7e4838fSBram Moolenaar CheckScriptFailure([ 2704e7e4838fSBram Moolenaar 'func Test() # comment', 2705e7e4838fSBram Moolenaar 'endfunc', 2706e7e4838fSBram Moolenaar ], 'E488:') 27072c5ed4e3SBram Moolenaarenddef 27082c5ed4e3SBram Moolenaar 27092c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 27102c5ed4e3SBram Moolenaar CheckCanRunGui 27112c5ed4e3SBram Moolenaar 27122c5ed4e3SBram Moolenaar CheckScriptFailure([ 27132c5ed4e3SBram Moolenaar 'vim9script', 27142c5ed4e3SBram Moolenaar 'gui#comment' 27152c5ed4e3SBram Moolenaar ], 'E499:') 27162c5ed4e3SBram Moolenaar CheckScriptFailure([ 27172c5ed4e3SBram Moolenaar 'vim9script', 27182c5ed4e3SBram Moolenaar 'gui -f#comment' 27192c5ed4e3SBram Moolenaar ], 'E499:') 27207a092245SBram Moolenaarenddef 27217a092245SBram Moolenaar 2722a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 27236797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 27246797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2725a26b9700SBram Moolenaar 2726a26b9700SBram Moolenaar edit test.vim 2727a26b9700SBram Moolenaar doautocmd TabEnter #comment 2728a26b9700SBram Moolenaar assert_equal(1, g:entered) 2729a26b9700SBram Moolenaar 2730a26b9700SBram Moolenaar doautocmd TabEnter f.x 2731a26b9700SBram Moolenaar assert_equal(2, g:entered) 2732a26b9700SBram Moolenaar 2733a26b9700SBram Moolenaar g:entered = 0 2734a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2735a26b9700SBram Moolenaar assert_equal(2, g:entered) 2736a26b9700SBram Moolenaar 2737a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2738a26b9700SBram Moolenaar 2739a26b9700SBram Moolenaar au! TabEnter 2740a26b9700SBram Moolenaar unlet g:entered 2741d72c1bf0SBram Moolenaar 2742d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2743d72c1bf0SBram Moolenaar 'vim9script', 27446797966dSBram Moolenaar 'g:var = 123', 2745e55b1c09SBram Moolenaar 'b:var = 456', 2746e55b1c09SBram Moolenaar 'w:var = 777', 2747e55b1c09SBram Moolenaar 't:var = 888', 2748d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2749d72c1bf0SBram Moolenaar ]) 2750d72c1bf0SBram Moolenaar 2751d72c1bf0SBram Moolenaar CheckScriptFailure([ 2752d72c1bf0SBram Moolenaar 'vim9script', 2753d72c1bf0SBram Moolenaar 'let g:var = 123', 2754e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2755e55b1c09SBram Moolenaar 2756e55b1c09SBram Moolenaar CheckScriptFailure([ 2757e55b1c09SBram Moolenaar 'vim9script', 2758e55b1c09SBram Moolenaar 'let b:var = 123', 2759e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2760e55b1c09SBram Moolenaar 2761e55b1c09SBram Moolenaar CheckScriptFailure([ 2762e55b1c09SBram Moolenaar 'vim9script', 2763e55b1c09SBram Moolenaar 'let w:var = 123', 2764e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2765e55b1c09SBram Moolenaar 2766e55b1c09SBram Moolenaar CheckScriptFailure([ 2767e55b1c09SBram Moolenaar 'vim9script', 2768e55b1c09SBram Moolenaar 'let t:var = 123', 2769e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2770e55b1c09SBram Moolenaar 2771e55b1c09SBram Moolenaar CheckScriptFailure([ 2772e55b1c09SBram Moolenaar 'vim9script', 2773e55b1c09SBram Moolenaar 'let v:version = 123', 2774e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2775e55b1c09SBram Moolenaar 2776e55b1c09SBram Moolenaar CheckScriptFailure([ 2777e55b1c09SBram Moolenaar 'vim9script', 2778e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2779e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 27806797966dSBram Moolenaar 27816797966dSBram Moolenaar CheckScriptFailure([ 27826797966dSBram Moolenaar 'vim9script', 27836797966dSBram Moolenaar 'g:var = 123', 278432e35117SBram Moolenaar 'unlet g:var# comment1', 2785d72c1bf0SBram Moolenaar ], 'E108:') 2786d72c1bf0SBram Moolenaar 2787d72c1bf0SBram Moolenaar CheckScriptFailure([ 2788d72c1bf0SBram Moolenaar 'let g:var = 123', 2789d72c1bf0SBram Moolenaar 'unlet g:var # something', 2790d72c1bf0SBram Moolenaar ], 'E488:') 2791faac4104SBram Moolenaar 2792faac4104SBram Moolenaar CheckScriptSuccess([ 2793faac4104SBram Moolenaar 'vim9script', 279432e35117SBram Moolenaar 'if 1 # comment2', 2795faac4104SBram Moolenaar ' echo "yes"', 2796faac4104SBram Moolenaar 'elseif 2 #comment', 2797faac4104SBram Moolenaar ' echo "no"', 2798faac4104SBram Moolenaar 'endif', 2799faac4104SBram Moolenaar ]) 2800faac4104SBram Moolenaar 2801faac4104SBram Moolenaar CheckScriptFailure([ 2802faac4104SBram Moolenaar 'vim9script', 280332e35117SBram Moolenaar 'if 1# comment3', 2804faac4104SBram Moolenaar ' echo "yes"', 2805faac4104SBram Moolenaar 'endif', 2806faac4104SBram Moolenaar ], 'E15:') 2807faac4104SBram Moolenaar 2808faac4104SBram Moolenaar CheckScriptFailure([ 2809faac4104SBram Moolenaar 'vim9script', 281032e35117SBram Moolenaar 'if 0 # comment4', 2811faac4104SBram Moolenaar ' echo "yes"', 2812faac4104SBram Moolenaar 'elseif 2#comment', 2813faac4104SBram Moolenaar ' echo "no"', 2814faac4104SBram Moolenaar 'endif', 2815faac4104SBram Moolenaar ], 'E15:') 2816faac4104SBram Moolenaar 2817faac4104SBram Moolenaar CheckScriptSuccess([ 2818faac4104SBram Moolenaar 'vim9script', 281932e35117SBram Moolenaar 'let v = 1 # comment5', 2820faac4104SBram Moolenaar ]) 2821faac4104SBram Moolenaar 2822faac4104SBram Moolenaar CheckScriptFailure([ 2823faac4104SBram Moolenaar 'vim9script', 282432e35117SBram Moolenaar 'let v = 1# comment6', 282532e35117SBram Moolenaar ], 'E15:') 2826faac4104SBram Moolenaar 2827faac4104SBram Moolenaar CheckScriptSuccess([ 2828faac4104SBram Moolenaar 'vim9script', 2829faac4104SBram Moolenaar 'new' 2830faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2831df069eecSBram Moolenaar ':$', 2832faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2833faac4104SBram Moolenaar 'bwipe!', 2834faac4104SBram Moolenaar ]) 2835faac4104SBram Moolenaar 2836f5be8cdbSBram Moolenaar CheckScriptFailure([ 2837f5be8cdbSBram Moolenaar 'vim9script', 2838f5be8cdbSBram Moolenaar 'new' 2839f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2840f5be8cdbSBram Moolenaar ':$', 2841f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2842f5be8cdbSBram Moolenaar 'bwipe!', 2843f5be8cdbSBram Moolenaar ], 'E488:') 2844f5be8cdbSBram Moolenaar 2845f5be8cdbSBram Moolenaar CheckScriptFailure([ 2846f5be8cdbSBram Moolenaar 'vim9script', 2847f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2848f5be8cdbSBram Moolenaar ], 'E477:') 2849a26b9700SBram Moolenaarenddef 2850a26b9700SBram Moolenaar 28517e5bd91dSBram Moolenaardef Test_finish() 28527e5bd91dSBram Moolenaar let lines =<< trim END 28537e5bd91dSBram Moolenaar vim9script 28546797966dSBram Moolenaar g:res = 'one' 28557e5bd91dSBram Moolenaar if v:false | finish | endif 28566797966dSBram Moolenaar g:res = 'two' 28577e5bd91dSBram Moolenaar finish 28586797966dSBram Moolenaar g:res = 'three' 28597e5bd91dSBram Moolenaar END 28607e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 28617e5bd91dSBram Moolenaar source Xfinished 28627e5bd91dSBram Moolenaar assert_equal('two', g:res) 28637e5bd91dSBram Moolenaar 28647e5bd91dSBram Moolenaar unlet g:res 28657e5bd91dSBram Moolenaar delete('Xfinished') 28667e5bd91dSBram Moolenaarenddef 28677e5bd91dSBram Moolenaar 286832e35117SBram Moolenaardef Test_let_func_call() 286932e35117SBram Moolenaar let lines =<< trim END 287032e35117SBram Moolenaar vim9script 287132e35117SBram Moolenaar func GetValue() 287232e35117SBram Moolenaar if exists('g:count') 287332e35117SBram Moolenaar let g:count += 1 287432e35117SBram Moolenaar else 287532e35117SBram Moolenaar let g:count = 1 287632e35117SBram Moolenaar endif 287732e35117SBram Moolenaar return 'this' 287832e35117SBram Moolenaar endfunc 287932e35117SBram Moolenaar let val: string = GetValue() 2880f5be8cdbSBram Moolenaar # env var is always a string 2881df671b46SBram Moolenaar let env = $TERM 288232e35117SBram Moolenaar END 288332e35117SBram Moolenaar writefile(lines, 'Xfinished') 288432e35117SBram Moolenaar source Xfinished 2885f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 288632e35117SBram Moolenaar assert_equal(1, g:count) 288732e35117SBram Moolenaar 288832e35117SBram Moolenaar unlet g:count 288932e35117SBram Moolenaar delete('Xfinished') 289032e35117SBram Moolenaarenddef 289132e35117SBram Moolenaar 289232e35117SBram Moolenaardef Test_let_missing_type() 289332e35117SBram Moolenaar let lines =<< trim END 289432e35117SBram Moolenaar vim9script 2895df671b46SBram Moolenaar let var = g:unknown 2896227a69deSBram Moolenaar END 2897822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2898227a69deSBram Moolenaar 2899227a69deSBram Moolenaar lines =<< trim END 2900227a69deSBram Moolenaar vim9script 2901227a69deSBram Moolenaar let nr: number = 123 2902227a69deSBram Moolenaar let var = nr 2903227a69deSBram Moolenaar END 2904822ba247SBram Moolenaar CheckScriptSuccess(lines) 290532e35117SBram Moolenaarenddef 290632e35117SBram Moolenaar 2907c82a5b5dSBram Moolenaardef Test_let_declaration() 2908c82a5b5dSBram Moolenaar let lines =<< trim END 2909c82a5b5dSBram Moolenaar vim9script 2910c82a5b5dSBram Moolenaar let var: string 2911c82a5b5dSBram Moolenaar g:var_uninit = var 2912c82a5b5dSBram Moolenaar var = 'text' 2913c82a5b5dSBram Moolenaar g:var_test = var 2914f5be8cdbSBram Moolenaar # prefixing s: is optional 2915984dddbeSBram Moolenaar s:var = 'prefixed' 2916984dddbeSBram Moolenaar g:var_prefixed = s:var 2917984dddbeSBram Moolenaar 2918984dddbeSBram Moolenaar let s:other: number 2919984dddbeSBram Moolenaar other = 1234 2920984dddbeSBram Moolenaar g:other_var = other 292153b29e48SBram Moolenaar 292253b29e48SBram Moolenaar # type is inferred 292353b29e48SBram Moolenaar s:dict = {'a': 222} 292453b29e48SBram Moolenaar def GetDictVal(key: any) 292553b29e48SBram Moolenaar g:dict_val = s:dict[key] 292653b29e48SBram Moolenaar enddef 292753b29e48SBram Moolenaar GetDictVal('a') 2928c82a5b5dSBram Moolenaar END 2929c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2930c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2931c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2932984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2933984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 293453b29e48SBram Moolenaar assert_equal(222, g:dict_val) 2935c82a5b5dSBram Moolenaar 2936c82a5b5dSBram Moolenaar unlet g:var_uninit 2937c82a5b5dSBram Moolenaar unlet g:var_test 2938984dddbeSBram Moolenaar unlet g:var_prefixed 2939984dddbeSBram Moolenaar unlet g:other_var 2940c82a5b5dSBram Moolenaarenddef 2941c82a5b5dSBram Moolenaar 2942c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2943c5b1c20bSBram Moolenaar let lines =<< trim END 2944c5b1c20bSBram Moolenaar vim9script 2945c5b1c20bSBram Moolenaar const var: string 2946c5b1c20bSBram Moolenaar END 2947c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2948c5b1c20bSBram Moolenaar 2949c5b1c20bSBram Moolenaar lines =<< trim END 2950c5b1c20bSBram Moolenaar vim9script 2951c5b1c20bSBram Moolenaar let 9var: string 2952c5b1c20bSBram Moolenaar END 2953c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2954c5b1c20bSBram Moolenaarenddef 2955c5b1c20bSBram Moolenaar 295634db91f7SBram Moolenaardef Test_let_type_check() 295734db91f7SBram Moolenaar let lines =<< trim END 295834db91f7SBram Moolenaar vim9script 295934db91f7SBram Moolenaar let var: string 296034db91f7SBram Moolenaar var = 1234 296134db91f7SBram Moolenaar END 2962451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 2963984dddbeSBram Moolenaar 2964984dddbeSBram Moolenaar lines =<< trim END 2965984dddbeSBram Moolenaar vim9script 2966984dddbeSBram Moolenaar let var:string 2967984dddbeSBram Moolenaar END 2968984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2969c5b1c20bSBram Moolenaar 2970c5b1c20bSBram Moolenaar lines =<< trim END 2971c5b1c20bSBram Moolenaar vim9script 2972c5b1c20bSBram Moolenaar let var: asdf 2973c5b1c20bSBram Moolenaar END 2974c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2975a71e2633SBram Moolenaar 2976a71e2633SBram Moolenaar lines =<< trim END 2977a71e2633SBram Moolenaar vim9script 2978a71e2633SBram Moolenaar let s:l: list<number> 2979a71e2633SBram Moolenaar s:l = [] 2980a71e2633SBram Moolenaar END 2981a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2982a71e2633SBram Moolenaar 2983a71e2633SBram Moolenaar lines =<< trim END 2984a71e2633SBram Moolenaar vim9script 2985a71e2633SBram Moolenaar let s:d: dict<number> 2986a71e2633SBram Moolenaar s:d = {} 2987a71e2633SBram Moolenaar END 2988a71e2633SBram Moolenaar CheckScriptSuccess(lines) 298934db91f7SBram Moolenaarenddef 299034db91f7SBram Moolenaar 2991a5d0077eSBram Moolenaardef Test_forward_declaration() 2992a5d0077eSBram Moolenaar let lines =<< trim END 2993a5d0077eSBram Moolenaar vim9script 2994a5d0077eSBram Moolenaar def GetValue(): string 2995a5d0077eSBram Moolenaar return theVal 2996a5d0077eSBram Moolenaar enddef 2997a5d0077eSBram Moolenaar let theVal = 'something' 2998822ba247SBram Moolenaar g:initVal = GetValue() 2999a5d0077eSBram Moolenaar theVal = 'else' 3000a5d0077eSBram Moolenaar g:laterVal = GetValue() 3001a5d0077eSBram Moolenaar END 3002a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3003a5d0077eSBram Moolenaar source Xforward 3004a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3005a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3006a5d0077eSBram Moolenaar 3007a5d0077eSBram Moolenaar unlet g:initVal 3008a5d0077eSBram Moolenaar unlet g:laterVal 3009a5d0077eSBram Moolenaar delete('Xforward') 3010a5d0077eSBram Moolenaarenddef 3011a5d0077eSBram Moolenaar 30129721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 30139721fb4eSBram Moolenaar let legacy_lines =<< trim END 30149721fb4eSBram Moolenaar source Xvim9_script.vim 30159721fb4eSBram Moolenaar 30169721fb4eSBram Moolenaar call assert_false(exists('local')) 30179721fb4eSBram Moolenaar call assert_false(exists('exported')) 30189721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30199721fb4eSBram Moolenaar call assert_equal('global', global) 30209721fb4eSBram Moolenaar call assert_equal('global', g:global) 30219721fb4eSBram Moolenaar 30229721fb4eSBram Moolenaar " imported variable becomes script-local 30239721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30249721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30259721fb4eSBram Moolenaar call assert_false(exists('exported')) 30269721fb4eSBram Moolenaar 30279721fb4eSBram Moolenaar " imported function becomes script-local 30289721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30299721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30309721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30319721fb4eSBram Moolenaar END 30329721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30339721fb4eSBram Moolenaar 30349721fb4eSBram Moolenaar let vim9_lines =<< trim END 30359721fb4eSBram Moolenaar vim9script 30369721fb4eSBram Moolenaar let local = 'local' 30379721fb4eSBram Moolenaar g:global = 'global' 30389721fb4eSBram Moolenaar export let exported = 'exported' 30399721fb4eSBram Moolenaar export def GetText(): string 30409721fb4eSBram Moolenaar return 'text' 30419721fb4eSBram Moolenaar enddef 30429721fb4eSBram Moolenaar END 30439721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 30449721fb4eSBram Moolenaar 30459721fb4eSBram Moolenaar source Xlegacy_script.vim 30469721fb4eSBram Moolenaar 30479721fb4eSBram Moolenaar assert_equal('global', g:global) 3048f5be8cdbSBram Moolenaar unlet g:global 30499721fb4eSBram Moolenaar 30509721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30519721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30529721fb4eSBram Moolenaarenddef 3053a5d0077eSBram Moolenaar 30547d699701SBram Moolenaarfunc Test_vim9script_not_global() 30557d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30567d699701SBram Moolenaar let vim9lines =<< trim END 30577d699701SBram Moolenaar vim9script 30587d699701SBram Moolenaar let var = 'local' 30597d699701SBram Moolenaar func TheFunc() 30607d699701SBram Moolenaar echo 'local' 30617d699701SBram Moolenaar endfunc 30627d699701SBram Moolenaar def DefFunc() 30637d699701SBram Moolenaar echo 'local' 30647d699701SBram Moolenaar enddef 30657d699701SBram Moolenaar END 30667d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30677d699701SBram Moolenaar source Xvim9script.vim 30687d699701SBram Moolenaar try 30697d699701SBram Moolenaar echo g:var 30707d699701SBram Moolenaar assert_report('did not fail') 30717d699701SBram Moolenaar catch /E121:/ 30727d699701SBram Moolenaar " caught 30737d699701SBram Moolenaar endtry 30747d699701SBram Moolenaar try 30757d699701SBram Moolenaar call TheFunc() 30767d699701SBram Moolenaar assert_report('did not fail') 30777d699701SBram Moolenaar catch /E117:/ 30787d699701SBram Moolenaar " caught 30797d699701SBram Moolenaar endtry 30807d699701SBram Moolenaar try 30817d699701SBram Moolenaar call DefFunc() 30827d699701SBram Moolenaar assert_report('did not fail') 30837d699701SBram Moolenaar catch /E117:/ 30847d699701SBram Moolenaar " caught 30857d699701SBram Moolenaar endtry 30867d699701SBram Moolenaar 30877d699701SBram Moolenaar call delete('Xvim9script.vium') 30887d699701SBram Moolenaarendfunc 30897d699701SBram Moolenaar 3090eeb27bfeSBram Moolenaardef Test_vim9_copen() 3091eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3092eeb27bfeSBram Moolenaar copen 3093eeb27bfeSBram Moolenaar quit 3094eeb27bfeSBram Moolenaarenddef 3095eeb27bfeSBram Moolenaar 30962d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 30972d6b20d6SBram Moolenaardef Test_vim9_autoload() 30982d6b20d6SBram Moolenaar let lines =<< trim END 30992d6b20d6SBram Moolenaar vim9script 31002d6b20d6SBram Moolenaar def foo#test() 31012d6b20d6SBram Moolenaar echomsg getreg('"') 31022d6b20d6SBram Moolenaar enddef 31032d6b20d6SBram Moolenaar END 31042d6b20d6SBram Moolenaar 31052d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31062d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 31072d6b20d6SBram Moolenaar let save_rtp = &rtp 31082d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31092d6b20d6SBram Moolenaar augroup test 31102d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31112d6b20d6SBram Moolenaar augroup END 31122d6b20d6SBram Moolenaar 31132d6b20d6SBram Moolenaar normal Y 31142d6b20d6SBram Moolenaar 31152d6b20d6SBram Moolenaar augroup test 31162d6b20d6SBram Moolenaar autocmd! 31172d6b20d6SBram Moolenaar augroup END 31182d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31192d6b20d6SBram Moolenaar &rtp = save_rtp 31202d6b20d6SBram Moolenaarenddef 31212d6b20d6SBram Moolenaar 31223896a105SBram Moolenaardef Test_cmdline_win() 31233896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 31243896a105SBram Moolenaar # the command line window. 31253896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 31263896a105SBram Moolenaar let export_lines =<< trim END 31273896a105SBram Moolenaar vim9script 31283896a105SBram Moolenaar export let That = 'yes' 31293896a105SBram Moolenaar END 31303896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 31313896a105SBram Moolenaar let import_lines =<< trim END 31323896a105SBram Moolenaar vim9script 31333896a105SBram Moolenaar import That from './Xexport.vim' 31343896a105SBram Moolenaar END 31353896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 31363896a105SBram Moolenaar let save_rtp = &rtp 31373896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 31383896a105SBram Moolenaar syntax on 31393896a105SBram Moolenaar augroup CmdWin 31403896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 31413896a105SBram Moolenaar augroup END 31423896a105SBram Moolenaar # this will open and also close the cmdline window 31433896a105SBram Moolenaar feedkeys('q:', 'xt') 31443896a105SBram Moolenaar assert_equal('yes', g:got_there) 31453896a105SBram Moolenaar 31463896a105SBram Moolenaar augroup CmdWin 31473896a105SBram Moolenaar au! 31483896a105SBram Moolenaar augroup END 31493896a105SBram Moolenaar &rtp = save_rtp 31503896a105SBram Moolenaar delete('rtp', 'rf') 31513896a105SBram Moolenaarenddef 31523896a105SBram Moolenaar 3153585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3154585fea7bSBram Moolenaardef Test_substitute_cmd() 3155585fea7bSBram Moolenaar new 3156585fea7bSBram Moolenaar setline(1, 'something') 3157585fea7bSBram Moolenaar :substitute(some(other( 3158585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3159585fea7bSBram Moolenaar bwipe! 3160585fea7bSBram Moolenaar 3161f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3162585fea7bSBram Moolenaar let lines =<< trim END 3163585fea7bSBram Moolenaar vim9script 3164585fea7bSBram Moolenaar new 3165585fea7bSBram Moolenaar setline(1, 'something') 3166585fea7bSBram Moolenaar :substitute(some(other( 3167585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3168585fea7bSBram Moolenaar bwipe! 3169585fea7bSBram Moolenaar END 3170585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3171585fea7bSBram Moolenaar source Xvim9lines 3172585fea7bSBram Moolenaar 3173585fea7bSBram Moolenaar delete('Xvim9lines') 3174585fea7bSBram Moolenaarenddef 3175585fea7bSBram Moolenaar 31768a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3177