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:') 31f93c7feaSBram Moolenaar 324cdb13ceSBram Moolenaar let nr: number = 1234 334cdb13ceSBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:') 344cdb13ceSBram Moolenaar 35b209750bSBram Moolenaar let a: number = 6 #comment 369be61bbbSBram Moolenaar assert_equal(6, a) 379be61bbbSBram Moolenaar 3842a480bfSBram Moolenaar if has('channel') 3942a480bfSBram Moolenaar let chan1: channel 40fbdd08edSBram Moolenaar let job1: job 41f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 4242a480bfSBram Moolenaar endif 43fbdd08edSBram Moolenaar if has('float') 44fbdd08edSBram Moolenaar let float1: float = 3.4 45fbdd08edSBram Moolenaar endif 465deeb3f1SBram Moolenaar let Funky1: func 475deeb3f1SBram Moolenaar let Funky2: func = function('len') 484c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4942a480bfSBram Moolenaar 50b209750bSBram Moolenaar g:newvar = 'new' #comment 51401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 52401d9ffbSBram Moolenaar 53401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 54401d9ffbSBram Moolenaar g:existing = 'no' 55401d9ffbSBram Moolenaar assert_equal('no', g:existing) 56401d9ffbSBram Moolenaar 57b283a8a6SBram Moolenaar v:char = 'abc' 586e587dcbSBram Moolenaar assert_equal('abc', v:char) 59b283a8a6SBram Moolenaar 60b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 616e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 62b283a8a6SBram Moolenaar $ENVVAR = '' 636e587dcbSBram Moolenaar 64b5ed2660SBram Moolenaar let lines =<< trim END 65b5ed2660SBram Moolenaar vim9script 66b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 67b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 68b5ed2660SBram Moolenaar $ENVVAR = '' 69b5ed2660SBram Moolenaar END 70b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 71b5ed2660SBram Moolenaar 72fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 73fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 74fd1823e0SBram Moolenaar s:addToMe += 222 75fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 760bbf722aSBram Moolenaar s:newVar = 'new' 770bbf722aSBram Moolenaar assert_equal('new', s:newVar) 78a8c17704SBram Moolenaar 79a8c17704SBram Moolenaar set ts=7 80a8c17704SBram Moolenaar &ts += 1 81a8c17704SBram Moolenaar assert_equal(8, &ts) 8280c34ca3SBram Moolenaar &ts -= 3 8380c34ca3SBram Moolenaar assert_equal(5, &ts) 8480c34ca3SBram Moolenaar &ts *= 2 8580c34ca3SBram Moolenaar assert_equal(10, &ts) 8680c34ca3SBram Moolenaar &ts /= 3 8780c34ca3SBram Moolenaar assert_equal(3, &ts) 8880c34ca3SBram Moolenaar set ts=10 8980c34ca3SBram Moolenaar &ts %= 4 9080c34ca3SBram Moolenaar assert_equal(2, &ts) 91b5ed2660SBram Moolenaar 92b5ed2660SBram Moolenaar lines =<< trim END 93b5ed2660SBram Moolenaar vim9script 94b5ed2660SBram Moolenaar &ts = 6 95b5ed2660SBram Moolenaar &ts += 3 96b5ed2660SBram Moolenaar assert_equal(9, &ts) 97b5ed2660SBram Moolenaar END 98b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 99b5ed2660SBram Moolenaar 100a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 101a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 102a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 103a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 104a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 105a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 106a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 107a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 108cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 109585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11080c34ca3SBram Moolenaar &ts = 8 111a8c17704SBram Moolenaar 11233afa244SBram Moolenaar call CheckDefFailure(['let s:var = 123'], 'E1101:') 11333afa244SBram Moolenaar call CheckDefFailure(['let s:var: number'], 'E1101:') 11433afa244SBram Moolenaar 115f9b2b496SBram Moolenaar lines =<< trim END 116f9b2b496SBram Moolenaar vim9script 117f9b2b496SBram Moolenaar def SomeFunc() 118f9b2b496SBram Moolenaar s:var = 123 119f9b2b496SBram Moolenaar enddef 120f9b2b496SBram Moolenaar defcompile 121f9b2b496SBram Moolenaar END 122f9b2b496SBram Moolenaar call CheckScriptFailure(lines, 'E1089:') 123f9b2b496SBram Moolenaar 124a8c17704SBram Moolenaar g:inc_counter += 1 125a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 126a8c17704SBram Moolenaar 127a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 128a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 129*dd29f1b0SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 130a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 131a8c17704SBram Moolenaar 132a8c17704SBram Moolenaar @a = 'areg' 133a8c17704SBram Moolenaar @a ..= 'add' 134a8c17704SBram Moolenaar assert_equal('aregadd', @a) 135*dd29f1b0SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1051:') 136a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 137e69f6d04SBram Moolenaar 138b5ed2660SBram Moolenaar lines =<< trim END 139b5ed2660SBram Moolenaar vim9script 140b5ed2660SBram Moolenaar @c = 'areg' 141b5ed2660SBram Moolenaar @c ..= 'add' 142b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 143b5ed2660SBram Moolenaar END 144b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 145b5ed2660SBram Moolenaar 146e69f6d04SBram Moolenaar v:errmsg = 'none' 147e69f6d04SBram Moolenaar v:errmsg ..= 'again' 148e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 149*dd29f1b0SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 150e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 15133afa244SBram Moolenaar 15233afa244SBram Moolenaar # single letter variables 15333afa244SBram Moolenaar a = 123 15433afa244SBram Moolenaar assert_equal(123, a) 15533afa244SBram Moolenaar let b: number 15633afa244SBram Moolenaar b = 123 15733afa244SBram Moolenaar assert_equal(123, b) 15833afa244SBram Moolenaar let g: number 15933afa244SBram Moolenaar g = 123 16033afa244SBram Moolenaar assert_equal(123, g) 16133afa244SBram Moolenaar let s: number 16233afa244SBram Moolenaar s = 123 16333afa244SBram Moolenaar assert_equal(123, s) 16433afa244SBram Moolenaar let t: number 16533afa244SBram Moolenaar t = 123 16633afa244SBram Moolenaar assert_equal(123, t) 16733afa244SBram Moolenaar let v: number 16833afa244SBram Moolenaar v = 123 16933afa244SBram Moolenaar assert_equal(123, v) 17033afa244SBram Moolenaar let w: number 17133afa244SBram Moolenaar w = 123 17233afa244SBram Moolenaar assert_equal(123, w) 1735deeb3f1SBram Moolenaarenddef 1745deeb3f1SBram Moolenaar 1753b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1763b74b6b4SBram Moolenaar let lines =<< trim END 1773b74b6b4SBram Moolenaar vim9script 1783b74b6b4SBram Moolenaar 179f5be8cdbSBram Moolenaar # single character variable declarations work 1803b74b6b4SBram Moolenaar let a: string 1813b74b6b4SBram Moolenaar let b: number 1823b74b6b4SBram Moolenaar let l: list<any> 1833b74b6b4SBram Moolenaar let s: string 1843b74b6b4SBram Moolenaar let t: number 1853b74b6b4SBram Moolenaar let v: number 1863b74b6b4SBram Moolenaar let w: number 1873b74b6b4SBram Moolenaar 188f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1893b74b6b4SBram Moolenaar a = 'script-a' 1903b74b6b4SBram Moolenaar b = 111 1913b74b6b4SBram Moolenaar l = [1, 2, 3] 1923b74b6b4SBram Moolenaar s = 'script-s' 1933b74b6b4SBram Moolenaar t = 222 1943b74b6b4SBram Moolenaar v = 333 1953b74b6b4SBram Moolenaar w = 444 1963b74b6b4SBram Moolenaar 1973b74b6b4SBram Moolenaar assert_equal('script-a', a) 1983b74b6b4SBram Moolenaar assert_equal(111, b) 1993b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2003b74b6b4SBram Moolenaar assert_equal('script-s', s) 2013b74b6b4SBram Moolenaar assert_equal(222, t) 2023b74b6b4SBram Moolenaar assert_equal(333, v) 2033b74b6b4SBram Moolenaar assert_equal(444, w) 2043b74b6b4SBram Moolenaar END 2053b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2063b74b6b4SBram Moolenaar source Xsinglechar 2073b74b6b4SBram Moolenaar delete('Xsinglechar') 2083b74b6b4SBram Moolenaarenddef 2093b74b6b4SBram Moolenaar 21084370087SBram Moolenaardef Test_assignment_list() 21184370087SBram Moolenaar let list1: list<bool> = [false, true, false] 21284370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 21384370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 21484370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 21584370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 21684370087SBram Moolenaar 21784370087SBram Moolenaar let listS: list<string> = [] 21884370087SBram Moolenaar let listN: list<number> = [] 21984370087SBram Moolenaar 22084370087SBram Moolenaar assert_equal([1, 2, 3], list2) 22184370087SBram Moolenaar list2[-1] = 99 22284370087SBram Moolenaar assert_equal([1, 2, 99], list2) 22384370087SBram Moolenaar list2[-2] = 88 22484370087SBram Moolenaar assert_equal([1, 88, 99], list2) 22584370087SBram Moolenaar list2[-3] = 77 22684370087SBram Moolenaar assert_equal([77, 88, 99], list2) 227*dd29f1b0SBram Moolenaar list2 += [100] 228*dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 229*dd29f1b0SBram Moolenaar 230*dd29f1b0SBram Moolenaar list3 += ['end'] 231*dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 232*dd29f1b0SBram Moolenaar 233*dd29f1b0SBram Moolenaar 23484370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 235c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 23684370087SBram Moolenaar 23784370087SBram Moolenaar # type becomes list<any> 23884370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 23984370087SBram Moolenaarenddef 24084370087SBram Moolenaar 241b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 242b31be3f9SBram Moolenaar let lines =<< trim END 243b31be3f9SBram Moolenaar vim9script 244b31be3f9SBram Moolenaar let v1: number 245b31be3f9SBram Moolenaar let v2: number 246b31be3f9SBram Moolenaar let v3: number 247b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 248b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 249b31be3f9SBram Moolenaar END 250b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 251b31be3f9SBram Moolenaarenddef 252b31be3f9SBram Moolenaar 25384370087SBram Moolenaardef Test_assignment_dict() 25484370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 25584370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 25684370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 25784370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 25874fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 25984370087SBram Moolenaar 260f5be8cdbSBram Moolenaar # overwrite 261c785b9a7SBram Moolenaar dict3['key'] = 'another' 262c785b9a7SBram Moolenaar 26358626872SBram Moolenaar # empty key can be used 26458626872SBram Moolenaar let dd = {} 26558626872SBram Moolenaar dd[""] = 6 26658626872SBram Moolenaar assert_equal({'': 6}, dd) 26784370087SBram Moolenaar 26884370087SBram Moolenaar # type becomes dict<any> 26984370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 2708e4c8c85SBram Moolenaar 2718e4c8c85SBram Moolenaar # assignment to script-local dict 2728e4c8c85SBram Moolenaar let lines =<< trim END 2738e4c8c85SBram Moolenaar vim9script 2748e4c8c85SBram Moolenaar let test: dict<any> = {} 2758e4c8c85SBram Moolenaar def FillDict(): dict<any> 2768e4c8c85SBram Moolenaar test['a'] = 43 2778e4c8c85SBram Moolenaar return test 2788e4c8c85SBram Moolenaar enddef 2798e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2808e4c8c85SBram Moolenaar END 2818e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 2828e4c8c85SBram Moolenaar 2838e4c8c85SBram Moolenaar lines =<< trim END 2848e4c8c85SBram Moolenaar vim9script 2858e4c8c85SBram Moolenaar let test: dict<any> 2868e4c8c85SBram Moolenaar def FillDict(): dict<any> 2878e4c8c85SBram Moolenaar test['a'] = 43 2888e4c8c85SBram Moolenaar return test 2898e4c8c85SBram Moolenaar enddef 2908e4c8c85SBram Moolenaar FillDict() 2918e4c8c85SBram Moolenaar END 2928e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 2932caa1594SBram Moolenaar 2942caa1594SBram Moolenaar # assignment to global dict 2952caa1594SBram Moolenaar lines =<< trim END 2962caa1594SBram Moolenaar vim9script 2972caa1594SBram Moolenaar g:test = {} 2982caa1594SBram Moolenaar def FillDict(): dict<any> 2992caa1594SBram Moolenaar g:test['a'] = 43 3002caa1594SBram Moolenaar return g:test 3012caa1594SBram Moolenaar enddef 3022caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3032caa1594SBram Moolenaar END 3042caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3052caa1594SBram Moolenaar 3062caa1594SBram Moolenaar # assignment to buffer dict 3072caa1594SBram Moolenaar lines =<< trim END 3082caa1594SBram Moolenaar vim9script 3092caa1594SBram Moolenaar b:test = {} 3102caa1594SBram Moolenaar def FillDict(): dict<any> 3112caa1594SBram Moolenaar b:test['a'] = 43 3122caa1594SBram Moolenaar return b:test 3132caa1594SBram Moolenaar enddef 3142caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3152caa1594SBram Moolenaar END 3162caa1594SBram Moolenaar call CheckScriptSuccess(lines) 31784370087SBram Moolenaarenddef 31884370087SBram Moolenaar 319d3aac291SBram Moolenaardef Test_assignment_local() 320f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 321f5be8cdbSBram Moolenaar # changed. 322d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 323d3aac291SBram Moolenaar let b:existing = 'yes' 324d3aac291SBram Moolenaar let w:existing = 'yes' 325d3aac291SBram Moolenaar let t:existing = 'yes' 326d3aac291SBram Moolenaar 327d3aac291SBram Moolenaar def Test_assignment_local_internal() 328d3aac291SBram Moolenaar b:newvar = 'new' 329d3aac291SBram Moolenaar assert_equal('new', b:newvar) 330d3aac291SBram Moolenaar assert_equal('yes', b:existing) 331d3aac291SBram Moolenaar b:existing = 'no' 332d3aac291SBram Moolenaar assert_equal('no', b:existing) 333396f3138SBram Moolenaar b:existing ..= 'NO' 334396f3138SBram Moolenaar assert_equal('noNO', b:existing) 335d3aac291SBram Moolenaar 336d3aac291SBram Moolenaar w:newvar = 'new' 337d3aac291SBram Moolenaar assert_equal('new', w:newvar) 338d3aac291SBram Moolenaar assert_equal('yes', w:existing) 339d3aac291SBram Moolenaar w:existing = 'no' 340d3aac291SBram Moolenaar assert_equal('no', w:existing) 341396f3138SBram Moolenaar w:existing ..= 'NO' 342396f3138SBram Moolenaar assert_equal('noNO', w:existing) 343d3aac291SBram Moolenaar 344d3aac291SBram Moolenaar t:newvar = 'new' 345d3aac291SBram Moolenaar assert_equal('new', t:newvar) 346d3aac291SBram Moolenaar assert_equal('yes', t:existing) 347d3aac291SBram Moolenaar t:existing = 'no' 348d3aac291SBram Moolenaar assert_equal('no', t:existing) 349396f3138SBram Moolenaar t:existing ..= 'NO' 350396f3138SBram Moolenaar assert_equal('noNO', t:existing) 351d3aac291SBram Moolenaar enddef 352d3aac291SBram Moolenaar call Test_assignment_local_internal() 353d3aac291SBram Moolenaar END 354d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 355d3aac291SBram Moolenaarenddef 356d3aac291SBram Moolenaar 3575deeb3f1SBram Moolenaardef Test_assignment_default() 358e69f6d04SBram Moolenaar 359cb711abfSBram Moolenaar # Test default values. 360e69f6d04SBram Moolenaar let thebool: bool 361e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 362e69f6d04SBram Moolenaar 363e69f6d04SBram Moolenaar let thenumber: number 364e69f6d04SBram Moolenaar assert_equal(0, thenumber) 365e69f6d04SBram Moolenaar 366e69f6d04SBram Moolenaar if has('float') 367e69f6d04SBram Moolenaar let thefloat: float 368e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 369e69f6d04SBram Moolenaar endif 370e69f6d04SBram Moolenaar 371e69f6d04SBram Moolenaar let thestring: string 372e69f6d04SBram Moolenaar assert_equal('', thestring) 373e69f6d04SBram Moolenaar 374e69f6d04SBram Moolenaar let theblob: blob 375e69f6d04SBram Moolenaar assert_equal(0z, theblob) 376e69f6d04SBram Moolenaar 3775deeb3f1SBram Moolenaar let Thefunc: func 3785deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 379e69f6d04SBram Moolenaar 380e69f6d04SBram Moolenaar let thelist: list<any> 381e69f6d04SBram Moolenaar assert_equal([], thelist) 382e69f6d04SBram Moolenaar 383e69f6d04SBram Moolenaar let thedict: dict<any> 384e69f6d04SBram Moolenaar assert_equal({}, thedict) 385e69f6d04SBram Moolenaar 3862c869deeSBram Moolenaar if has('channel') 387e69f6d04SBram Moolenaar let thejob: job 388e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 389e69f6d04SBram Moolenaar 390e69f6d04SBram Moolenaar let thechannel: channel 391e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 392c785b9a7SBram Moolenaar 393c785b9a7SBram Moolenaar if has('unix') && executable('cat') 394f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 395c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 396c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 397c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 398c785b9a7SBram Moolenaar endif 3992c869deeSBram Moolenaar endif 400585fea7bSBram Moolenaar 401585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 402585fea7bSBram Moolenaar assert_equal(5678, nr) 4038a7d6542SBram Moolenaarenddef 4048a7d6542SBram Moolenaar 40547a519a9SBram Moolenaardef Test_assignment_var_list() 40647a519a9SBram Moolenaar let v1: string 40747a519a9SBram Moolenaar let v2: string 4089af78769SBram Moolenaar let vrem: list<string> 4099af78769SBram Moolenaar [v1] = ['aaa'] 4109af78769SBram Moolenaar assert_equal('aaa', v1) 4119af78769SBram Moolenaar 41247a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 41347a519a9SBram Moolenaar assert_equal('one', v1) 41447a519a9SBram Moolenaar assert_equal('two', v2) 4159af78769SBram Moolenaar 4169af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4179af78769SBram Moolenaar assert_equal('one', v1) 4189af78769SBram Moolenaar assert_equal('two', v2) 4199af78769SBram Moolenaar assert_equal([], vrem) 4209af78769SBram Moolenaar 4219af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4229af78769SBram Moolenaar assert_equal('one', v1) 4239af78769SBram Moolenaar assert_equal('two', v2) 4249af78769SBram Moolenaar assert_equal(['three'], vrem) 42547a519a9SBram Moolenaarenddef 42647a519a9SBram Moolenaar 427c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 428c7e44a7eSBram Moolenaar let lines =<< trim END 429c7e44a7eSBram Moolenaar vim9script 430c7e44a7eSBram Moolenaar def Func(): list<number> 431c7e44a7eSBram Moolenaar return [1, 2] 432c7e44a7eSBram Moolenaar enddef 433c7e44a7eSBram Moolenaar let var1: number 434c7e44a7eSBram Moolenaar let var2: number 435c7e44a7eSBram Moolenaar [var1, var2] = 436c7e44a7eSBram Moolenaar Func() 437c7e44a7eSBram Moolenaar assert_equal(1, var1) 438c7e44a7eSBram Moolenaar assert_equal(2, var2) 439c7e44a7eSBram Moolenaar let ll = 440c7e44a7eSBram Moolenaar Func() 441c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 44283144546SBram Moolenaar 44383144546SBram Moolenaar @/ = 'text' 44483144546SBram Moolenaar assert_equal('text', @/) 44583144546SBram Moolenaar @0 = 'zero' 44683144546SBram Moolenaar assert_equal('zero', @0) 44783144546SBram Moolenaar @1 = 'one' 44883144546SBram Moolenaar assert_equal('one', @1) 44983144546SBram Moolenaar @9 = 'nine' 45083144546SBram Moolenaar assert_equal('nine', @9) 45183144546SBram Moolenaar @- = 'minus' 45283144546SBram Moolenaar assert_equal('minus', @-) 45383144546SBram Moolenaar if has('clipboard_working') 45483144546SBram Moolenaar @* = 'star' 45583144546SBram Moolenaar assert_equal('star', @*) 45683144546SBram Moolenaar @+ = 'plus' 45783144546SBram Moolenaar assert_equal('plus', @+) 45883144546SBram Moolenaar endif 45995dd9f25SBram Moolenaar 46095dd9f25SBram Moolenaar let a: number = 123 46195dd9f25SBram Moolenaar assert_equal(123, a) 46295dd9f25SBram Moolenaar let s: string = 'yes' 46395dd9f25SBram Moolenaar assert_equal('yes', s) 46495dd9f25SBram Moolenaar let b: number = 42 46595dd9f25SBram Moolenaar assert_equal(42, b) 46695dd9f25SBram Moolenaar let w: number = 43 46795dd9f25SBram Moolenaar assert_equal(43, w) 46895dd9f25SBram Moolenaar let t: number = 44 46995dd9f25SBram Moolenaar assert_equal(44, t) 470c7e44a7eSBram Moolenaar END 471c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 472c7e44a7eSBram Moolenaarenddef 473c7e44a7eSBram Moolenaar 474cab27678SBram Moolenaardef Mess(): string 475cab27678SBram Moolenaar v:foldstart = 123 476cab27678SBram Moolenaar return 'xxx' 477cab27678SBram Moolenaarenddef 478cab27678SBram Moolenaar 479d72c1bf0SBram Moolenaardef Test_assignment_failure() 4808a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4818a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4828a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4838a7d6542SBram Moolenaar 48463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 48563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 48663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 48763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 48863be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 48963be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 49063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 49163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 49263be3d4bSBram Moolenaar 4938a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 4948a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 4958a7d6542SBram Moolenaar 4969b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 4979af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4989af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 4999af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5009af78769SBram Moolenaar '[a] = []'], 'E1093:') 5019af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5029af78769SBram Moolenaar 'let y: number', 5039af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 5049af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5059af78769SBram Moolenaar 'let y: number', 5069af78769SBram Moolenaar 'let z: list<number>', 5079af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5089be61bbbSBram Moolenaar 509e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 510c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5119be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 512c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5139be61bbbSBram Moolenaar 514e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 515c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5169be61bbbSBram Moolenaar 517434d72cbSBram Moolenaar if has('dnd') 51865821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 519434d72cbSBram Moolenaar else 520434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 521434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 522434d72cbSBram Moolenaar endif 5239be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 52465821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 525c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5269be61bbbSBram Moolenaar 527e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 528e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 529e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 530e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5319be61bbbSBram Moolenaar 5329be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5339be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5349be61bbbSBram Moolenaar 535822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 53633fa29cfSBram Moolenaar 5378a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5388a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5398a7d6542SBram Moolenaar 5408a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5418a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5428a7d6542SBram Moolenaar 5438a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5448a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 54542a480bfSBram Moolenaar 546d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 54742a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 548cab27678SBram Moolenaar 549cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 550cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 55143e969d3SBram Moolenaar 55243e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 55343e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 55443e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 55543e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 55643e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 55743e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 55843e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 55943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 560d72c1bf0SBram Moolenaarenddef 561d72c1bf0SBram Moolenaar 562d72c1bf0SBram Moolenaardef Test_unlet() 563d72c1bf0SBram Moolenaar g:somevar = 'yes' 564d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 565d72c1bf0SBram Moolenaar unlet g:somevar 566d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 567d72c1bf0SBram Moolenaar unlet! g:somevar 568d72c1bf0SBram Moolenaar 569d72c1bf0SBram Moolenaar call CheckScriptFailure([ 570d72c1bf0SBram Moolenaar 'vim9script', 571d72c1bf0SBram Moolenaar 'let svar = 123', 572d72c1bf0SBram Moolenaar 'unlet svar', 573d72c1bf0SBram Moolenaar ], 'E1081:') 574d72c1bf0SBram Moolenaar call CheckScriptFailure([ 575d72c1bf0SBram Moolenaar 'vim9script', 576d72c1bf0SBram Moolenaar 'let svar = 123', 577d72c1bf0SBram Moolenaar 'unlet s:svar', 578d72c1bf0SBram Moolenaar ], 'E1081:') 579d72c1bf0SBram Moolenaar call CheckScriptFailure([ 580d72c1bf0SBram Moolenaar 'vim9script', 581d72c1bf0SBram Moolenaar 'let svar = 123', 582d72c1bf0SBram Moolenaar 'def Func()', 583d72c1bf0SBram Moolenaar ' unlet svar', 584d72c1bf0SBram Moolenaar 'enddef', 585822ba247SBram Moolenaar 'defcompile', 586d72c1bf0SBram Moolenaar ], 'E1081:') 587d72c1bf0SBram Moolenaar call CheckScriptFailure([ 588d72c1bf0SBram Moolenaar 'vim9script', 589d72c1bf0SBram Moolenaar 'let svar = 123', 590d72c1bf0SBram Moolenaar 'def Func()', 591d72c1bf0SBram Moolenaar ' unlet s:svar', 592d72c1bf0SBram Moolenaar 'enddef', 593822ba247SBram Moolenaar 'defcompile', 594d72c1bf0SBram Moolenaar ], 'E1081:') 5957bdaea6eSBram Moolenaar 5967bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 5977bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 5987bdaea6eSBram Moolenaar unlet $ENVVAR 5997bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 600d72c1bf0SBram Moolenaarenddef 601599c89c8SBram Moolenaar 6024c17ad94SBram Moolenaardef Test_delfunction() 603f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6044c17ad94SBram Moolenaar CheckScriptSuccess([ 6054c17ad94SBram Moolenaar 'vim9script', 6064c17ad94SBram Moolenaar 'func CheckMe()', 6074c17ad94SBram Moolenaar ' return 123', 6084c17ad94SBram Moolenaar 'endfunc', 6094c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6104c17ad94SBram Moolenaar ]) 6114c17ad94SBram Moolenaar 612f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6134c17ad94SBram Moolenaar CheckScriptFailure([ 6144c17ad94SBram Moolenaar 'vim9script', 6154c17ad94SBram Moolenaar 'func DeleteMe1()', 6164c17ad94SBram Moolenaar 'endfunc', 6174c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6184c17ad94SBram Moolenaar ], 'E1084:') 6194c17ad94SBram Moolenaar CheckScriptFailure([ 6204c17ad94SBram Moolenaar 'vim9script', 6214c17ad94SBram Moolenaar 'func DeleteMe2()', 6224c17ad94SBram Moolenaar 'endfunc', 6234c17ad94SBram Moolenaar 'def DoThat()', 6244c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6254c17ad94SBram Moolenaar 'enddef', 6264c17ad94SBram Moolenaar 'DoThat()', 6274c17ad94SBram Moolenaar ], 'E1084:') 6284c17ad94SBram Moolenaar CheckScriptFailure([ 6294c17ad94SBram Moolenaar 'vim9script', 6304c17ad94SBram Moolenaar 'def DeleteMe3()', 6314c17ad94SBram Moolenaar 'enddef', 6324c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6334c17ad94SBram Moolenaar ], 'E1084:') 6344c17ad94SBram Moolenaar CheckScriptFailure([ 6354c17ad94SBram Moolenaar 'vim9script', 6364c17ad94SBram Moolenaar 'def DeleteMe4()', 6374c17ad94SBram Moolenaar 'enddef', 6384c17ad94SBram Moolenaar 'def DoThat()', 6394c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6404c17ad94SBram Moolenaar 'enddef', 6414c17ad94SBram Moolenaar 'DoThat()', 6424c17ad94SBram Moolenaar ], 'E1084:') 643925e9fd6SBram Moolenaar 644925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 645925e9fd6SBram Moolenaar let lines =<< trim END 646925e9fd6SBram Moolenaar vim9script 647925e9fd6SBram Moolenaar def g:Global(): string 648925e9fd6SBram Moolenaar return "yes" 649925e9fd6SBram Moolenaar enddef 650925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 651925e9fd6SBram Moolenaar def! g:Global(): string 652925e9fd6SBram Moolenaar return "no" 653925e9fd6SBram Moolenaar enddef 654925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 655925e9fd6SBram Moolenaar delfunc g:Global 656925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 657925e9fd6SBram Moolenaar END 658925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 659925e9fd6SBram Moolenaar 660925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 661925e9fd6SBram Moolenaar lines =<< trim END 662925e9fd6SBram Moolenaar vim9script 663925e9fd6SBram Moolenaar func g:Global() 664925e9fd6SBram Moolenaar return "yes" 665925e9fd6SBram Moolenaar endfunc 666925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 667925e9fd6SBram Moolenaar def! g:Global(): string 668925e9fd6SBram Moolenaar return "no" 669925e9fd6SBram Moolenaar enddef 670925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 671925e9fd6SBram Moolenaar delfunc g:Global 672925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 673925e9fd6SBram Moolenaar END 674925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 675925e9fd6SBram Moolenaar 676925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 677925e9fd6SBram Moolenaar lines =<< trim END 678925e9fd6SBram Moolenaar vim9script 679925e9fd6SBram Moolenaar def g:Global(): string 680925e9fd6SBram Moolenaar return "yes" 681925e9fd6SBram Moolenaar enddef 682925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 683925e9fd6SBram Moolenaar func! g:Global() 684925e9fd6SBram Moolenaar return "no" 685925e9fd6SBram Moolenaar endfunc 686925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 687925e9fd6SBram Moolenaar delfunc g:Global 688925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 689925e9fd6SBram Moolenaar END 690925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6914c17ad94SBram Moolenaarenddef 6924c17ad94SBram Moolenaar 693599c89c8SBram Moolenaarfunc Test_wrong_type() 694599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 695599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 696599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 697599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 698599c89c8SBram Moolenaar 699599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 700599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 70142a480bfSBram Moolenaar 70242a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 70342a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 70442a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 70542a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 70642a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 70742a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 70842a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 70942a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 71042a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 71142a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 71242a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 713a0a9f43aSBram Moolenaar 714a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 715a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7168a7d6542SBram Moolenaarendfunc 7178a7d6542SBram Moolenaar 7188a7d6542SBram Moolenaarfunc Test_const() 7198a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7208a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7218a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7229be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7238a7d6542SBram Moolenaarendfunc 7248a7d6542SBram Moolenaar 725df069eecSBram Moolenaardef Test_range_no_colon() 726df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 727df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 728df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 729df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 730df069eecSBram Moolenaarenddef 731df069eecSBram Moolenaar 732df069eecSBram Moolenaar 7338a7d6542SBram Moolenaardef Test_block() 7348a7d6542SBram Moolenaar let outer = 1 7358a7d6542SBram Moolenaar { 7368a7d6542SBram Moolenaar let inner = 2 7378a7d6542SBram Moolenaar assert_equal(1, outer) 7388a7d6542SBram Moolenaar assert_equal(2, inner) 7398a7d6542SBram Moolenaar } 7408a7d6542SBram Moolenaar assert_equal(1, outer) 7418a7d6542SBram Moolenaarenddef 7428a7d6542SBram Moolenaar 7438a7d6542SBram Moolenaarfunc Test_block_failure() 7448a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 745585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 746585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7478a7d6542SBram Moolenaarendfunc 7488a7d6542SBram Moolenaar 749585fea7bSBram Moolenaardef Test_cmd_modifier() 750585fea7bSBram Moolenaar tab echo '0' 751585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 752585fea7bSBram Moolenaarenddef 753585fea7bSBram Moolenaar 754d032f34aSBram Moolenaarfunc g:NoSuchFunc() 755d032f34aSBram Moolenaar echo 'none' 756d032f34aSBram Moolenaarendfunc 757d032f34aSBram Moolenaar 7588a7d6542SBram Moolenaardef Test_try_catch() 7598a7d6542SBram Moolenaar let l = [] 7607a092245SBram Moolenaar try # comment 7618a7d6542SBram Moolenaar add(l, '1') 7628a7d6542SBram Moolenaar throw 'wrong' 7638a7d6542SBram Moolenaar add(l, '2') 7647a092245SBram Moolenaar catch # comment 7658a7d6542SBram Moolenaar add(l, v:exception) 7667a092245SBram Moolenaar finally # comment 7678a7d6542SBram Moolenaar add(l, '3') 7687a092245SBram Moolenaar endtry # comment 7698a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 77068d130c6SBram Moolenaar 771e859312eSBram Moolenaar l = [] 772e859312eSBram Moolenaar try 773e859312eSBram Moolenaar try 774e859312eSBram Moolenaar add(l, '1') 775e859312eSBram Moolenaar throw 'wrong' 776e859312eSBram Moolenaar add(l, '2') 777e859312eSBram Moolenaar catch /right/ 778e859312eSBram Moolenaar add(l, v:exception) 779e859312eSBram Moolenaar endtry 780e859312eSBram Moolenaar catch /wrong/ 781e859312eSBram Moolenaar add(l, 'caught') 782e859312eSBram Moolenaar finally 783e859312eSBram Moolenaar add(l, 'finally') 784e859312eSBram Moolenaar endtry 785e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 786e859312eSBram Moolenaar 78768d130c6SBram Moolenaar let n: number 78868d130c6SBram Moolenaar try 78968d130c6SBram Moolenaar n = l[3] 79068d130c6SBram Moolenaar catch /E684:/ 79168d130c6SBram Moolenaar n = 99 79268d130c6SBram Moolenaar endtry 79368d130c6SBram Moolenaar assert_equal(99, n) 79468d130c6SBram Moolenaar 79568d130c6SBram Moolenaar try 79668d130c6SBram Moolenaar n = g:astring[3] 79768d130c6SBram Moolenaar catch /E714:/ 79868d130c6SBram Moolenaar n = 77 79968d130c6SBram Moolenaar endtry 80068d130c6SBram Moolenaar assert_equal(77, n) 80168d130c6SBram Moolenaar 80268d130c6SBram Moolenaar try 80368d130c6SBram Moolenaar n = l[g:astring] 80468d130c6SBram Moolenaar catch /E39:/ 80568d130c6SBram Moolenaar n = 77 80668d130c6SBram Moolenaar endtry 80768d130c6SBram Moolenaar assert_equal(77, n) 80868d130c6SBram Moolenaar 80968d130c6SBram Moolenaar try 81068d130c6SBram Moolenaar n = s:does_not_exist 81168d130c6SBram Moolenaar catch /E121:/ 812f0b9f43cSBram Moolenaar n = 111 813f0b9f43cSBram Moolenaar endtry 814f0b9f43cSBram Moolenaar assert_equal(111, n) 815f0b9f43cSBram Moolenaar 816f0b9f43cSBram Moolenaar try 817f0b9f43cSBram Moolenaar n = g:does_not_exist 818f0b9f43cSBram Moolenaar catch /E121:/ 81968d130c6SBram Moolenaar n = 121 82068d130c6SBram Moolenaar endtry 82168d130c6SBram Moolenaar assert_equal(121, n) 82268d130c6SBram Moolenaar 82368d130c6SBram Moolenaar let d = #{one: 1} 82468d130c6SBram Moolenaar try 82568d130c6SBram Moolenaar n = d[g:astring] 82668d130c6SBram Moolenaar catch /E716:/ 82768d130c6SBram Moolenaar n = 222 82868d130c6SBram Moolenaar endtry 82968d130c6SBram Moolenaar assert_equal(222, n) 830f0b9f43cSBram Moolenaar 831f0b9f43cSBram Moolenaar try 832f0b9f43cSBram Moolenaar n = -g:astring 833f0b9f43cSBram Moolenaar catch /E39:/ 834f0b9f43cSBram Moolenaar n = 233 835f0b9f43cSBram Moolenaar endtry 836f0b9f43cSBram Moolenaar assert_equal(233, n) 837f0b9f43cSBram Moolenaar 838f0b9f43cSBram Moolenaar try 839f0b9f43cSBram Moolenaar n = +g:astring 840f0b9f43cSBram Moolenaar catch /E1030:/ 841f0b9f43cSBram Moolenaar n = 244 842f0b9f43cSBram Moolenaar endtry 843f0b9f43cSBram Moolenaar assert_equal(244, n) 844f0b9f43cSBram Moolenaar 845f0b9f43cSBram Moolenaar try 846f0b9f43cSBram Moolenaar n = +g:alist 847f0b9f43cSBram Moolenaar catch /E745:/ 848f0b9f43cSBram Moolenaar n = 255 849f0b9f43cSBram Moolenaar endtry 850f0b9f43cSBram Moolenaar assert_equal(255, n) 851f0b9f43cSBram Moolenaar 852f0b9f43cSBram Moolenaar let nd: dict<any> 853f0b9f43cSBram Moolenaar try 854f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 855f0b9f43cSBram Moolenaar catch /E1029:/ 856f0b9f43cSBram Moolenaar n = 266 857f0b9f43cSBram Moolenaar endtry 858f0b9f43cSBram Moolenaar assert_equal(266, n) 859f0b9f43cSBram Moolenaar 860f0b9f43cSBram Moolenaar try 861f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 862f0b9f43cSBram Moolenaar catch /E1093:/ 863f0b9f43cSBram Moolenaar n = 277 864f0b9f43cSBram Moolenaar endtry 865f0b9f43cSBram Moolenaar assert_equal(277, n) 866f0b9f43cSBram Moolenaar 867e859312eSBram Moolenaar try 868e859312eSBram Moolenaar &ts = g:astring 869e859312eSBram Moolenaar catch /E1029:/ 870e859312eSBram Moolenaar n = 288 871e859312eSBram Moolenaar endtry 872e859312eSBram Moolenaar assert_equal(288, n) 873e859312eSBram Moolenaar 874e859312eSBram Moolenaar try 875e859312eSBram Moolenaar &backspace = 'asdf' 876e859312eSBram Moolenaar catch /E474:/ 877e859312eSBram Moolenaar n = 299 878e859312eSBram Moolenaar endtry 879e859312eSBram Moolenaar assert_equal(299, n) 880e859312eSBram Moolenaar 881e859312eSBram Moolenaar l = [1] 882e859312eSBram Moolenaar try 883e859312eSBram Moolenaar l[3] = 3 884e859312eSBram Moolenaar catch /E684:/ 885e859312eSBram Moolenaar n = 300 886e859312eSBram Moolenaar endtry 887e859312eSBram Moolenaar assert_equal(300, n) 888e859312eSBram Moolenaar 889e859312eSBram Moolenaar try 890e859312eSBram Moolenaar unlet g:does_not_exist 891e859312eSBram Moolenaar catch /E108:/ 892e859312eSBram Moolenaar n = 322 893e859312eSBram Moolenaar endtry 894e859312eSBram Moolenaar assert_equal(322, n) 895e859312eSBram Moolenaar 896e859312eSBram Moolenaar try 897e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 898e859312eSBram Moolenaar catch /E721:/ 899e859312eSBram Moolenaar n = 333 900e859312eSBram Moolenaar endtry 901e859312eSBram Moolenaar assert_equal(333, n) 902e859312eSBram Moolenaar 903e859312eSBram Moolenaar try 904e859312eSBram Moolenaar l = DeletedFunc() 905e859312eSBram Moolenaar catch /E933:/ 906e859312eSBram Moolenaar n = 344 907e859312eSBram Moolenaar endtry 908e859312eSBram Moolenaar assert_equal(344, n) 909d032f34aSBram Moolenaar 910d032f34aSBram Moolenaar try 911d032f34aSBram Moolenaar echo len(v:true) 912d032f34aSBram Moolenaar catch /E701:/ 913d032f34aSBram Moolenaar n = 355 914d032f34aSBram Moolenaar endtry 915d032f34aSBram Moolenaar assert_equal(355, n) 916d032f34aSBram Moolenaar 917d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 918d032f34aSBram Moolenaar delfunc g:NoSuchFunc 919d032f34aSBram Moolenaar try 920d032f34aSBram Moolenaar echo P() 921d032f34aSBram Moolenaar catch /E117:/ 922d032f34aSBram Moolenaar n = 366 923d032f34aSBram Moolenaar endtry 924d032f34aSBram Moolenaar assert_equal(366, n) 925d032f34aSBram Moolenaar 926d032f34aSBram Moolenaar try 927d032f34aSBram Moolenaar echo g:NoSuchFunc() 928d032f34aSBram Moolenaar catch /E117:/ 929d032f34aSBram Moolenaar n = 377 930d032f34aSBram Moolenaar endtry 931d032f34aSBram Moolenaar assert_equal(377, n) 932d032f34aSBram Moolenaar 933d032f34aSBram Moolenaar try 934d032f34aSBram Moolenaar echo g:alist + 4 935d032f34aSBram Moolenaar catch /E745:/ 936d032f34aSBram Moolenaar n = 388 937d032f34aSBram Moolenaar endtry 938d032f34aSBram Moolenaar assert_equal(388, n) 939d032f34aSBram Moolenaar 940d032f34aSBram Moolenaar try 941d032f34aSBram Moolenaar echo 4 + g:alist 942d032f34aSBram Moolenaar catch /E745:/ 943d032f34aSBram Moolenaar n = 399 944d032f34aSBram Moolenaar endtry 945d032f34aSBram Moolenaar assert_equal(399, n) 946d032f34aSBram Moolenaar 947d032f34aSBram Moolenaar try 948d032f34aSBram Moolenaar echo g:alist.member 949d032f34aSBram Moolenaar catch /E715:/ 950d032f34aSBram Moolenaar n = 400 951d032f34aSBram Moolenaar endtry 952d032f34aSBram Moolenaar assert_equal(400, n) 953d032f34aSBram Moolenaar 954d032f34aSBram Moolenaar try 955d032f34aSBram Moolenaar echo d.member 956d032f34aSBram Moolenaar catch /E716:/ 957d032f34aSBram Moolenaar n = 411 958d032f34aSBram Moolenaar endtry 959d032f34aSBram Moolenaar assert_equal(411, n) 9608a7d6542SBram Moolenaarenddef 9618a7d6542SBram Moolenaar 962e859312eSBram Moolenaardef DeletedFunc(): list<any> 963e859312eSBram Moolenaar return ['delete me'] 964e859312eSBram Moolenaarenddef 965e859312eSBram Moolenaardefcompile 966e859312eSBram Moolenaardelfunc DeletedFunc 967e859312eSBram Moolenaar 968257cc5eeSBram Moolenaardef ThrowFromDef() 969a72cfb80SBram Moolenaar throw "getout" # comment 970257cc5eeSBram Moolenaarenddef 971257cc5eeSBram Moolenaar 972257cc5eeSBram Moolenaarfunc CatchInFunc() 973257cc5eeSBram Moolenaar try 974257cc5eeSBram Moolenaar call ThrowFromDef() 975257cc5eeSBram Moolenaar catch 976257cc5eeSBram Moolenaar let g:thrown_func = v:exception 977257cc5eeSBram Moolenaar endtry 978257cc5eeSBram Moolenaarendfunc 979257cc5eeSBram Moolenaar 980257cc5eeSBram Moolenaardef CatchInDef() 981257cc5eeSBram Moolenaar try 982257cc5eeSBram Moolenaar ThrowFromDef() 983257cc5eeSBram Moolenaar catch 984257cc5eeSBram Moolenaar g:thrown_def = v:exception 985257cc5eeSBram Moolenaar endtry 986257cc5eeSBram Moolenaarenddef 987257cc5eeSBram Moolenaar 988f575adffSBram Moolenaardef ReturnFinally(): string 989f575adffSBram Moolenaar try 990f575adffSBram Moolenaar return 'intry' 991f575adffSBram Moolenaar finally 992f575adffSBram Moolenaar g:in_finally = 'finally' 993f575adffSBram Moolenaar endtry 994f575adffSBram Moolenaar return 'end' 995f575adffSBram Moolenaarenddef 996f575adffSBram Moolenaar 997257cc5eeSBram Moolenaardef Test_try_catch_nested() 998257cc5eeSBram Moolenaar CatchInFunc() 999257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1000257cc5eeSBram Moolenaar 1001257cc5eeSBram Moolenaar CatchInDef() 1002257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1003f575adffSBram Moolenaar 1004f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1005f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1006f575adffSBram Moolenaarenddef 1007f575adffSBram Moolenaar 1008f575adffSBram Moolenaardef Test_try_catch_match() 1009f575adffSBram Moolenaar let seq = 'a' 1010f575adffSBram Moolenaar try 1011f575adffSBram Moolenaar throw 'something' 1012f575adffSBram Moolenaar catch /nothing/ 1013f575adffSBram Moolenaar seq ..= 'x' 1014f575adffSBram Moolenaar catch /some/ 1015f575adffSBram Moolenaar seq ..= 'b' 1016f575adffSBram Moolenaar catch /asdf/ 1017f575adffSBram Moolenaar seq ..= 'x' 1018e8c4abbbSBram Moolenaar catch ?a\?sdf? 1019e8c4abbbSBram Moolenaar seq ..= 'y' 1020f575adffSBram Moolenaar finally 1021f575adffSBram Moolenaar seq ..= 'c' 1022f575adffSBram Moolenaar endtry 1023f575adffSBram Moolenaar assert_equal('abc', seq) 1024257cc5eeSBram Moolenaarenddef 1025257cc5eeSBram Moolenaar 1026e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1027e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1028e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1029e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1030585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1031585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1032585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1033585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1034585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1035585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1036585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1037585fea7bSBram Moolenaar 1038a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1039585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1040e8c4abbbSBram Moolenaarenddef 1041e8c4abbbSBram Moolenaar 1042006ad48bSBram Moolenaardef Test_throw_vimscript() 1043f5be8cdbSBram Moolenaar # only checks line continuation 1044006ad48bSBram Moolenaar let lines =<< trim END 1045006ad48bSBram Moolenaar vim9script 1046006ad48bSBram Moolenaar try 1047006ad48bSBram Moolenaar throw 'one' 1048006ad48bSBram Moolenaar .. 'two' 1049006ad48bSBram Moolenaar catch 1050006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1051006ad48bSBram Moolenaar endtry 1052006ad48bSBram Moolenaar END 1053006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1054006ad48bSBram Moolenaarenddef 1055006ad48bSBram Moolenaar 105637c83711SBram Moolenaardef Test_cexpr_vimscript() 1057f5be8cdbSBram Moolenaar # only checks line continuation 105837c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 105937c83711SBram Moolenaar let lines =<< trim END 106037c83711SBram Moolenaar vim9script 106137c83711SBram Moolenaar cexpr 'File' 106237c83711SBram Moolenaar .. ' someFile' .. 106337c83711SBram Moolenaar ' line 19' 106437c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 106537c83711SBram Moolenaar END 106637c83711SBram Moolenaar CheckScriptSuccess(lines) 106737c83711SBram Moolenaar set errorformat& 106837c83711SBram Moolenaarenddef 106937c83711SBram Moolenaar 1070b209750bSBram Moolenaardef Test_list_vimscript() 1071b209750bSBram Moolenaar # checks line continuation and comments 1072b209750bSBram Moolenaar let lines =<< trim END 1073b209750bSBram Moolenaar vim9script 1074b209750bSBram Moolenaar let mylist = [ 1075b209750bSBram Moolenaar 'one', 1076b209750bSBram Moolenaar # comment 1077b209750bSBram Moolenaar 'two', # empty line follows 1078b209750bSBram Moolenaar 1079b209750bSBram Moolenaar 'three', 1080b209750bSBram Moolenaar ] 1081b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1082b209750bSBram Moolenaar END 1083b209750bSBram Moolenaar CheckScriptSuccess(lines) 1084b209750bSBram Moolenaarenddef 1085b209750bSBram Moolenaar 10862a1381c3SBram Moolenaarif has('channel') 108740ee466cSBram Moolenaar let someJob = test_null_job() 108840ee466cSBram Moolenaar 108940ee466cSBram Moolenaar def FuncWithError() 109040ee466cSBram Moolenaar echomsg g:someJob 109140ee466cSBram Moolenaar enddef 109240ee466cSBram Moolenaar 109340ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 109440ee466cSBram Moolenaar try 109540ee466cSBram Moolenaar call FuncWithError() 109640ee466cSBram Moolenaar catch 109740ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 109840ee466cSBram Moolenaar endtry 109940ee466cSBram Moolenaar endfunc 11002a1381c3SBram Moolenaarendif 110140ee466cSBram Moolenaar 11028a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 11038a7d6542SBram Moolenaar vim9script 11048a7d6542SBram Moolenaar let name: string = 'bob' 11058a7d6542SBram Moolenaar def Concat(arg: string): string 11068a7d6542SBram Moolenaar return name .. arg 11078a7d6542SBram Moolenaar enddef 1108227a69deSBram Moolenaar g:result = Concat('bie') 1109227a69deSBram Moolenaar g:localname = name 11108a7d6542SBram Moolenaar 11118a7d6542SBram Moolenaar export const CONST = 1234 11128a7d6542SBram Moolenaar export let exported = 9876 11136e587dcbSBram Moolenaar export let exp_name = 'John' 11148a7d6542SBram Moolenaar export def Exported(): string 11158a7d6542SBram Moolenaar return 'Exported' 11168a7d6542SBram Moolenaar enddef 11178a7d6542SBram MoolenaarEND 11188a7d6542SBram Moolenaar 11195269bd2aSBram Moolenaardef Test_vim9_import_export() 11208a7d6542SBram Moolenaar let import_script_lines =<< trim END 11218a7d6542SBram Moolenaar vim9script 11228a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11238a7d6542SBram Moolenaar g:imported = exported 11246e587dcbSBram Moolenaar exported += 3 11256e587dcbSBram Moolenaar g:imported_added = exported 11268a7d6542SBram Moolenaar g:imported_func = Exported() 11276e587dcbSBram Moolenaar 112840f4f7a4SBram Moolenaar def GetExported(): string 112940f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 113040f4f7a4SBram Moolenaar return local_dict.ref() 113140f4f7a4SBram Moolenaar enddef 113240f4f7a4SBram Moolenaar g:funcref_result = GetExported() 113340f4f7a4SBram Moolenaar 11346e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11356e587dcbSBram Moolenaar g:imported_name = exp_name 11366e587dcbSBram Moolenaar exp_name ..= ' Doe' 11376e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11385381c7a1SBram Moolenaar g:imported_later = exported 11398a7d6542SBram Moolenaar END 11408a7d6542SBram Moolenaar 11418a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11428a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11438a7d6542SBram Moolenaar 11448a7d6542SBram Moolenaar source Ximport.vim 11458a7d6542SBram Moolenaar 11468a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11478a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11488a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11496e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11505381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11518a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 115240f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11536e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11546e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11558a7d6542SBram Moolenaar assert_false(exists('g:name')) 11568a7d6542SBram Moolenaar 11578a7d6542SBram Moolenaar unlet g:result 11588a7d6542SBram Moolenaar unlet g:localname 11598a7d6542SBram Moolenaar unlet g:imported 11606e587dcbSBram Moolenaar unlet g:imported_added 11615381c7a1SBram Moolenaar unlet g:imported_later 11628a7d6542SBram Moolenaar unlet g:imported_func 11636e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11648a7d6542SBram Moolenaar delete('Ximport.vim') 1165f2d5c240SBram Moolenaar 11661c991144SBram Moolenaar # similar, with line breaks 11671c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11681c991144SBram Moolenaar vim9script 11691c991144SBram Moolenaar import { 11701c991144SBram Moolenaar exported, 11711c991144SBram Moolenaar Exported, 11721c991144SBram Moolenaar } 11731c991144SBram Moolenaar from 11741c991144SBram Moolenaar './Xexport.vim' 11751c991144SBram Moolenaar g:imported = exported 11761c991144SBram Moolenaar exported += 5 11771c991144SBram Moolenaar g:imported_added = exported 11781c991144SBram Moolenaar g:imported_func = Exported() 11791c991144SBram Moolenaar END 11801c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11811c991144SBram Moolenaar source Ximport_lbr.vim 11821c991144SBram Moolenaar 11831c991144SBram Moolenaar assert_equal(9876, g:imported) 11841c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11851c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11861c991144SBram Moolenaar 11871c991144SBram Moolenaar # exported script not sourced again 11881c991144SBram Moolenaar assert_false(exists('g:result')) 11891c991144SBram Moolenaar unlet g:imported 11901c991144SBram Moolenaar unlet g:imported_added 11911c991144SBram Moolenaar unlet g:imported_func 11921c991144SBram Moolenaar delete('Ximport_lbr.vim') 11931c991144SBram Moolenaar 11941c991144SBram Moolenaar # import inside :def function 11955381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11965381c7a1SBram Moolenaar vim9script 11975381c7a1SBram Moolenaar def ImportInDef() 11985381c7a1SBram Moolenaar import exported from './Xexport.vim' 11995381c7a1SBram Moolenaar g:imported = exported 12005381c7a1SBram Moolenaar exported += 7 12015381c7a1SBram Moolenaar g:imported_added = exported 12025381c7a1SBram Moolenaar enddef 12035381c7a1SBram Moolenaar ImportInDef() 12045381c7a1SBram Moolenaar END 12055381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 12065381c7a1SBram Moolenaar source Ximport2.vim 1207f5be8cdbSBram Moolenaar # TODO: this should be 9879 12085381c7a1SBram Moolenaar assert_equal(9876, g:imported) 12095381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 12105381c7a1SBram Moolenaar unlet g:imported 12115381c7a1SBram Moolenaar unlet g:imported_added 12125381c7a1SBram Moolenaar delete('Ximport2.vim') 12135381c7a1SBram Moolenaar 1214f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1215f2d5c240SBram Moolenaar vim9script 1216f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1217f2d5c240SBram Moolenaar def UseExport() 1218f2d5c240SBram Moolenaar g:imported = Export.exported 1219f2d5c240SBram Moolenaar enddef 1220f2d5c240SBram Moolenaar UseExport() 1221f2d5c240SBram Moolenaar END 1222f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1223f2d5c240SBram Moolenaar source Ximport.vim 12245381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1225f2d5c240SBram Moolenaar 1226599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1227599c89c8SBram Moolenaar vim9script 1228599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1229599c89c8SBram Moolenaar def Func() 1230599c89c8SBram Moolenaar let dummy = 1 1231599c89c8SBram Moolenaar let imported = Export + dummy 1232599c89c8SBram Moolenaar enddef 1233822ba247SBram Moolenaar defcompile 1234599c89c8SBram Moolenaar END 1235599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1236599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1237599c89c8SBram Moolenaar 1238599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1239599c89c8SBram Moolenaar vim9script 1240599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1241599c89c8SBram Moolenaar def Func() 1242599c89c8SBram Moolenaar let imported = Export . exported 1243599c89c8SBram Moolenaar enddef 1244822ba247SBram Moolenaar defcompile 1245599c89c8SBram Moolenaar END 1246599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1247599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1248599c89c8SBram Moolenaar 1249599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1250599c89c8SBram Moolenaar vim9script 1251599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1252599c89c8SBram Moolenaar def Func() 1253599c89c8SBram Moolenaar let imported = Export. 1254599c89c8SBram Moolenaar enddef 1255822ba247SBram Moolenaar defcompile 1256599c89c8SBram Moolenaar END 1257599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1258599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1259599c89c8SBram Moolenaar 12601c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12611c991144SBram Moolenaar vim9script 12621c991144SBram Moolenaar import * 12631c991144SBram Moolenaar as Export 12641c991144SBram Moolenaar from 12651c991144SBram Moolenaar './Xexport.vim' 12661c991144SBram Moolenaar def UseExport() 12671c991144SBram Moolenaar g:imported = Export.exported 12681c991144SBram Moolenaar enddef 12691c991144SBram Moolenaar UseExport() 12701c991144SBram Moolenaar END 12711c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12721c991144SBram Moolenaar source Ximport.vim 12731c991144SBram Moolenaar assert_equal(9883, g:imported) 12741c991144SBram Moolenaar 1275f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1276f2d5c240SBram Moolenaar vim9script 1277f2d5c240SBram Moolenaar import * from './Xexport.vim' 1278f2d5c240SBram Moolenaar END 1279f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1280f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1281f2d5c240SBram Moolenaar 1282f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1283fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1284fa29c8abSBram Moolenaar vim9script 1285fa29c8abSBram Moolenaar import name from './Xexport.vim' 1286fa29c8abSBram Moolenaar END 1287fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1288fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1289fa29c8abSBram Moolenaar 1290f5be8cdbSBram Moolenaar # try to import something that is already defined 12915269bd2aSBram Moolenaar let import_already_defined =<< trim END 12925269bd2aSBram Moolenaar vim9script 12935269bd2aSBram Moolenaar let exported = 'something' 12945269bd2aSBram Moolenaar import exported from './Xexport.vim' 12955269bd2aSBram Moolenaar END 12965269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12975269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12985269bd2aSBram Moolenaar 1299f5be8cdbSBram Moolenaar # try to import something that is already defined 13005269bd2aSBram Moolenaar import_already_defined =<< trim END 13015269bd2aSBram Moolenaar vim9script 13025269bd2aSBram Moolenaar let exported = 'something' 13035269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13045269bd2aSBram Moolenaar END 13055269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13065269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13075269bd2aSBram Moolenaar 1308f5be8cdbSBram Moolenaar # try to import something that is already defined 13095269bd2aSBram Moolenaar import_already_defined =<< trim END 13105269bd2aSBram Moolenaar vim9script 13115269bd2aSBram Moolenaar let exported = 'something' 13125269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13135269bd2aSBram Moolenaar END 13145269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13155269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13165269bd2aSBram Moolenaar 1317f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1318fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1319fa29c8abSBram Moolenaar vim9script 1320fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1321fa29c8abSBram Moolenaar END 1322fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1323fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1324fa29c8abSBram Moolenaar 1325fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1326fa29c8abSBram Moolenaar vim9script 1327fa29c8abSBram Moolenaar import name './Xexport.vim' 1328fa29c8abSBram Moolenaar END 1329fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1330fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1331fa29c8abSBram Moolenaar 1332fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1333fa29c8abSBram Moolenaar vim9script 1334fa29c8abSBram Moolenaar import name from Xexport.vim 1335fa29c8abSBram Moolenaar END 1336fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1337fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1338fa29c8abSBram Moolenaar 1339fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1340fa29c8abSBram Moolenaar vim9script 1341fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1342fa29c8abSBram Moolenaar END 1343fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1344fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1345fa29c8abSBram Moolenaar 1346fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1347fa29c8abSBram Moolenaar vim9script 1348fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1349fa29c8abSBram Moolenaar END 13505269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13515269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1352fa29c8abSBram Moolenaar 1353f2d5c240SBram Moolenaar delete('Ximport.vim') 13545269bd2aSBram Moolenaar delete('Ximport3.vim') 13558a7d6542SBram Moolenaar delete('Xexport.vim') 13568a7d6542SBram Moolenaar 1357f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1358750802b5SBram Moolenaar set cpo&vi 1359750802b5SBram Moolenaar let cpo_before = &cpo 1360750802b5SBram Moolenaar let lines =<< trim END 1361750802b5SBram Moolenaar vim9script 1362750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1363750802b5SBram Moolenaar END 1364750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1365750802b5SBram Moolenaar source Xvim9_script 1366750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1367750802b5SBram Moolenaar set cpo&vim 1368750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1369750802b5SBram Moolenaar delete('Xvim9_script') 1370750802b5SBram Moolenaarenddef 1371750802b5SBram Moolenaar 1372803af686SBram Moolenaarfunc g:Trigger() 1373803af686SBram Moolenaar source Ximport.vim 1374803af686SBram Moolenaar return "echo 'yes'\<CR>" 1375803af686SBram Moolenaarendfunc 1376803af686SBram Moolenaar 1377803af686SBram Moolenaardef Test_import_export_expr_map() 1378803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1379803af686SBram Moolenaar let export_lines =<< trim END 1380803af686SBram Moolenaar vim9script 1381803af686SBram Moolenaar export def That(): string 1382803af686SBram Moolenaar return 'yes' 1383803af686SBram Moolenaar enddef 1384803af686SBram Moolenaar END 1385803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1386803af686SBram Moolenaar 1387803af686SBram Moolenaar let import_lines =<< trim END 1388803af686SBram Moolenaar vim9script 1389803af686SBram Moolenaar import That from './Xexport_that.vim' 1390803af686SBram Moolenaar assert_equal('yes', That()) 1391803af686SBram Moolenaar END 1392803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1393803af686SBram Moolenaar 1394803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1395803af686SBram Moolenaar feedkeys('trigger', "xt") 1396803af686SBram Moolenaar 1397803af686SBram Moolenaar delete('Xexport.vim') 1398803af686SBram Moolenaar delete('Ximport.vim') 1399803af686SBram Moolenaar nunmap trigger 1400803af686SBram Moolenaarenddef 1401803af686SBram Moolenaar 14028e1986e3SBram Moolenaardef Test_import_in_filetype() 14038e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14048e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 14058e1986e3SBram Moolenaar let export_lines =<< trim END 14068e1986e3SBram Moolenaar vim9script 14078e1986e3SBram Moolenaar export let That = 'yes' 14088e1986e3SBram Moolenaar END 14098e1986e3SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_that.vim') 14108e1986e3SBram Moolenaar 14118e1986e3SBram Moolenaar let import_lines =<< trim END 14128e1986e3SBram Moolenaar vim9script 14138e1986e3SBram Moolenaar import That from './Xexport_that.vim' 14148e1986e3SBram Moolenaar assert_equal('yes', That) 14158e1986e3SBram Moolenaar g:did_load_mytpe = 1 14168e1986e3SBram Moolenaar END 14178e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14188e1986e3SBram Moolenaar 14198e1986e3SBram Moolenaar let save_rtp = &rtp 14208e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14218e1986e3SBram Moolenaar 14228e1986e3SBram Moolenaar filetype plugin on 14238e1986e3SBram Moolenaar copen 14248e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14258e1986e3SBram Moolenaar 14268e1986e3SBram Moolenaar quit! 14278e1986e3SBram Moolenaar delete('Xexport.vim') 14288e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14298e1986e3SBram Moolenaar &rtp = save_rtp 14308e1986e3SBram Moolenaarenddef 14318e1986e3SBram Moolenaar 1432750802b5SBram Moolenaardef Test_vim9script_fails() 14338a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14348a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1435750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 14369721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 14379b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1438750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1439750802b5SBram Moolenaar 1440c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1441c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1442c785b9a7SBram Moolenaar 1443750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1444a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 14458a7d6542SBram Moolenaarenddef 14468a7d6542SBram Moolenaar 1447f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1448101f4810SBram Moolenaar CheckRunVimInTerminal 1449101f4810SBram Moolenaar 14509bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1451c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14529bb3eb3eSBram Moolenaarendfunc 14539bb3eb3eSBram Moolenaar 1454c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1455101f4810SBram Moolenaar let export =<< trim END 1456101f4810SBram Moolenaar vim9script 1457101f4810SBram Moolenaar export def Foo(): number 1458101f4810SBram Moolenaar return 0 1459101f4810SBram Moolenaar enddef 1460101f4810SBram Moolenaar END 14619bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1462101f4810SBram Moolenaar 14639bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 14649bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14659bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1466101f4810SBram Moolenaar 14679bb3eb3eSBram Moolenaar delete('Xexport.vim') 14689bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14699bb3eb3eSBram Moolenaarenddef 1470101f4810SBram Moolenaar 14714c17ad94SBram Moolenaardef Test_vim9script_reload_import() 14728a7d6542SBram Moolenaar let lines =<< trim END 14738a7d6542SBram Moolenaar vim9script 14748a7d6542SBram Moolenaar const var = '' 14758a7d6542SBram Moolenaar let valone = 1234 14768a7d6542SBram Moolenaar def MyFunc(arg: string) 14778a7d6542SBram Moolenaar valone = 5678 14788a7d6542SBram Moolenaar enddef 14798a7d6542SBram Moolenaar END 14808a7d6542SBram Moolenaar let morelines =<< trim END 14818a7d6542SBram Moolenaar let valtwo = 222 14828a7d6542SBram Moolenaar export def GetValtwo(): number 14838a7d6542SBram Moolenaar return valtwo 14848a7d6542SBram Moolenaar enddef 14858a7d6542SBram Moolenaar END 148603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14878a7d6542SBram Moolenaar source Xreload.vim 14888a7d6542SBram Moolenaar source Xreload.vim 14898a7d6542SBram Moolenaar source Xreload.vim 14908a7d6542SBram Moolenaar 14918a7d6542SBram Moolenaar let testlines =<< trim END 14928a7d6542SBram Moolenaar vim9script 14938a7d6542SBram Moolenaar def TheFunc() 14948a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14958a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14968a7d6542SBram Moolenaar enddef 14978a7d6542SBram Moolenaar TheFunc() 14988a7d6542SBram Moolenaar END 14998a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15008a7d6542SBram Moolenaar source Ximport.vim 15018a7d6542SBram Moolenaar 1502f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1503f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15048a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15058a7d6542SBram Moolenaar source Ximport.vim 15068a7d6542SBram Moolenaar 1507f5be8cdbSBram Moolenaar # cannot declare a var twice 15088a7d6542SBram Moolenaar lines =<< trim END 15098a7d6542SBram Moolenaar vim9script 15108a7d6542SBram Moolenaar let valone = 1234 15118a7d6542SBram Moolenaar let valone = 5678 15128a7d6542SBram Moolenaar END 15138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15148a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 15158a7d6542SBram Moolenaar 15168a7d6542SBram Moolenaar delete('Xreload.vim') 15178a7d6542SBram Moolenaar delete('Ximport.vim') 15188a7d6542SBram Moolenaarenddef 15198a7d6542SBram Moolenaar 1520fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1521fe465a01SBram Moolenaar" script-local name. 1522fe465a01SBram Moolenaardef Test_vim9script_funcref() 1523fe465a01SBram Moolenaar let sortlines =<< trim END 1524fe465a01SBram Moolenaar vim9script 1525fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1526bed36b93SBram Moolenaar return i2 - i1 1527fe465a01SBram Moolenaar enddef 1528fe465a01SBram Moolenaar 1529fe465a01SBram Moolenaar export def FastSort(): list<number> 1530fe465a01SBram Moolenaar return range(5)->sort(Compare) 1531fe465a01SBram Moolenaar enddef 1532fe465a01SBram Moolenaar END 1533fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1534fe465a01SBram Moolenaar 1535fe465a01SBram Moolenaar let lines =<< trim END 1536fe465a01SBram Moolenaar vim9script 1537fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1538fe465a01SBram Moolenaar def Test() 1539fe465a01SBram Moolenaar g:result = FastSort() 1540fe465a01SBram Moolenaar enddef 1541fe465a01SBram Moolenaar Test() 1542fe465a01SBram Moolenaar END 1543fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1544fe465a01SBram Moolenaar 1545fe465a01SBram Moolenaar source Xscript.vim 1546fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1547fe465a01SBram Moolenaar 1548fe465a01SBram Moolenaar unlet g:result 1549fe465a01SBram Moolenaar delete('Xsort.vim') 1550fe465a01SBram Moolenaar delete('Xscript.vim') 1551fe465a01SBram Moolenaarenddef 1552fe465a01SBram Moolenaar 1553c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1554c620c055SBram Moolenaar" script where FastFilter() is called from. 1555c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1556c620c055SBram Moolenaar let filterLines =<< trim END 1557c620c055SBram Moolenaar vim9script 1558c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1559c620c055SBram Moolenaar return idx % 2 == 1 1560c620c055SBram Moolenaar enddef 1561c620c055SBram Moolenaar export def FastFilter(): list<number> 1562c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1563c620c055SBram Moolenaar enddef 1564c620c055SBram Moolenaar END 1565c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1566c620c055SBram Moolenaar 1567c620c055SBram Moolenaar let lines =<< trim END 1568c620c055SBram Moolenaar vim9script 1569c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1570c620c055SBram Moolenaar def Test() 1571c620c055SBram Moolenaar let x: list<number> = FastFilter() 1572c620c055SBram Moolenaar enddef 1573c620c055SBram Moolenaar Test() 1574c620c055SBram Moolenaar END 1575c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1576c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1577c620c055SBram Moolenaar 1578c620c055SBram Moolenaar delete('Xfilter.vim') 1579c620c055SBram Moolenaar delete('Ximport.vim') 1580c620c055SBram Moolenaarenddef 1581c620c055SBram Moolenaar 15824c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 15834c17ad94SBram Moolenaar let first_lines =<< trim END 15844c17ad94SBram Moolenaar vim9script 15854c17ad94SBram Moolenaar def FuncYes(): string 15864c17ad94SBram Moolenaar return 'yes' 15874c17ad94SBram Moolenaar enddef 15884c17ad94SBram Moolenaar END 158903afdcf1SBram Moolenaar let withno_lines =<< trim END 15904c17ad94SBram Moolenaar def FuncNo(): string 15914c17ad94SBram Moolenaar return 'no' 15924c17ad94SBram Moolenaar enddef 15934c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15944c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15954c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 159603afdcf1SBram Moolenaar enddef 159703afdcf1SBram Moolenaar END 159803afdcf1SBram Moolenaar let nono_lines =<< trim END 159903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 160003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 16014c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 16024c17ad94SBram Moolenaar enddef 16034c17ad94SBram Moolenaar END 16044c17ad94SBram Moolenaar 16054c17ad94SBram Moolenaar # FuncNo() is defined 160603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16074c17ad94SBram Moolenaar source Xreloaded.vim 16084c17ad94SBram Moolenaar g:DoCheck(true) 16094c17ad94SBram Moolenaar 16104c17ad94SBram Moolenaar # FuncNo() is not redefined 161103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16124c17ad94SBram Moolenaar source Xreloaded.vim 161303afdcf1SBram Moolenaar g:DoCheck() 16144c17ad94SBram Moolenaar 16154c17ad94SBram Moolenaar # FuncNo() is back 161603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16174c17ad94SBram Moolenaar source Xreloaded.vim 161803afdcf1SBram Moolenaar g:DoCheck() 16194c17ad94SBram Moolenaar 16204c17ad94SBram Moolenaar delete('Xreloaded.vim') 16214c17ad94SBram Moolenaarenddef 16224c17ad94SBram Moolenaar 162389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 162489483d40SBram Moolenaar # write the script with a script-local variable 162589483d40SBram Moolenaar let lines =<< trim END 162689483d40SBram Moolenaar vim9script 162789483d40SBram Moolenaar let var = 'string' 162889483d40SBram Moolenaar END 162989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 163089483d40SBram Moolenaar source XreloadVar.vim 163189483d40SBram Moolenaar 163289483d40SBram Moolenaar # now write the script using the same variable locally - works 163389483d40SBram Moolenaar lines =<< trim END 163489483d40SBram Moolenaar vim9script 163589483d40SBram Moolenaar def Func() 163689483d40SBram Moolenaar let var = 'string' 163789483d40SBram Moolenaar enddef 163889483d40SBram Moolenaar END 163989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 164089483d40SBram Moolenaar source XreloadVar.vim 164189483d40SBram Moolenaar 164289483d40SBram Moolenaar delete('XreloadVar.vim') 164389483d40SBram Moolenaarenddef 164489483d40SBram Moolenaar 16458a7d6542SBram Moolenaardef Test_import_absolute() 16468a7d6542SBram Moolenaar let import_lines = [ 1647e6085c53SBram Moolenaar 'vim9script', 1648e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1649e6085c53SBram Moolenaar 'def UseExported()', 1650e6085c53SBram Moolenaar ' g:imported_abs = exported', 1651e6085c53SBram Moolenaar ' exported = 8888', 1652e6085c53SBram Moolenaar ' g:imported_after = exported', 1653e6085c53SBram Moolenaar 'enddef', 1654e6085c53SBram Moolenaar 'UseExported()', 1655e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1656e6085c53SBram Moolenaar ] 16578a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16588a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16598a7d6542SBram Moolenaar 16608a7d6542SBram Moolenaar source Ximport_abs.vim 16618a7d6542SBram Moolenaar 16628a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16634e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1664675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1665675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1666675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1667675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1668675f716eSBram Moolenaar 'exported = 8888.*' .. 1669675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1670675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1671675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1672675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1673e6085c53SBram Moolenaar g:import_disassembled) 16748a7d6542SBram Moolenaar unlet g:imported_abs 16754e12a5dfSBram Moolenaar unlet g:import_disassembled 16768a7d6542SBram Moolenaar 16778a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16788a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16798a7d6542SBram Moolenaarenddef 16808a7d6542SBram Moolenaar 16818a7d6542SBram Moolenaardef Test_import_rtp() 16828a7d6542SBram Moolenaar let import_lines = [ 1683e6085c53SBram Moolenaar 'vim9script', 1684e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1685e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1686e6085c53SBram Moolenaar ] 16878a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16888a7d6542SBram Moolenaar mkdir('import') 16898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16908a7d6542SBram Moolenaar 16918a7d6542SBram Moolenaar let save_rtp = &rtp 16928a7d6542SBram Moolenaar &rtp = getcwd() 16938a7d6542SBram Moolenaar source Ximport_rtp.vim 16948a7d6542SBram Moolenaar &rtp = save_rtp 16958a7d6542SBram Moolenaar 16968a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16978a7d6542SBram Moolenaar unlet g:imported_rtp 16988a7d6542SBram Moolenaar 16998a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 170089483d40SBram Moolenaar delete('import', 'rf') 17018a7d6542SBram Moolenaarenddef 17028a7d6542SBram Moolenaar 170325e0f586SBram Moolenaardef Test_import_compile_error() 170425e0f586SBram Moolenaar let export_lines = [ 170525e0f586SBram Moolenaar 'vim9script', 170625e0f586SBram Moolenaar 'export def ExpFunc(): string', 170725e0f586SBram Moolenaar ' return notDefined', 170825e0f586SBram Moolenaar 'enddef', 170925e0f586SBram Moolenaar ] 171025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 171125e0f586SBram Moolenaar 171225e0f586SBram Moolenaar let import_lines = [ 171325e0f586SBram Moolenaar 'vim9script', 171425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 171525e0f586SBram Moolenaar 'def ImpFunc()', 171625e0f586SBram Moolenaar ' echo ExpFunc()', 171725e0f586SBram Moolenaar 'enddef', 171825e0f586SBram Moolenaar 'defcompile', 171925e0f586SBram Moolenaar ] 172025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 172125e0f586SBram Moolenaar 172225e0f586SBram Moolenaar try 172325e0f586SBram Moolenaar source Ximport.vim 172425e0f586SBram Moolenaar catch /E1001/ 1725f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 172625e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 172725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 172825e0f586SBram Moolenaar endtry 172925e0f586SBram Moolenaar 173025e0f586SBram Moolenaar delete('Xexported.vim') 173125e0f586SBram Moolenaar delete('Ximport.vim') 173225e0f586SBram Moolenaarenddef 173325e0f586SBram Moolenaar 1734eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1735eef2102eSBram Moolenaar let export_lines =<< trim END 1736eef2102eSBram Moolenaar vim9script 1737eef2102eSBram Moolenaar export def Func() 1738eef2102eSBram Moolenaar echo 'imported' 1739eef2102eSBram Moolenaar enddef 1740eef2102eSBram Moolenaar END 1741eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1742eef2102eSBram Moolenaar 1743eef2102eSBram Moolenaar let lines =<< trim END 1744eef2102eSBram Moolenaar vim9script 1745eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1746eef2102eSBram Moolenaar def Func() 1747eef2102eSBram Moolenaar echo 'local to function' 1748eef2102eSBram Moolenaar enddef 1749eef2102eSBram Moolenaar END 1750eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1751eef2102eSBram Moolenaar 1752eef2102eSBram Moolenaar lines =<< trim END 1753eef2102eSBram Moolenaar vim9script 1754eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1755eef2102eSBram Moolenaar def Outer() 1756eef2102eSBram Moolenaar def Func() 1757eef2102eSBram Moolenaar echo 'local to function' 1758eef2102eSBram Moolenaar enddef 1759eef2102eSBram Moolenaar enddef 1760eef2102eSBram Moolenaar defcompile 1761eef2102eSBram Moolenaar END 1762eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1763eef2102eSBram Moolenaar 1764eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1765eef2102eSBram Moolenaarenddef 1766eef2102eSBram Moolenaar 1767b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1768b9a2cac3SBram Moolenaar let lines =<< trim END 1769b9a2cac3SBram Moolenaar vim9script 1770b9a2cac3SBram Moolenaar def Func() 1771b9a2cac3SBram Moolenaar echo 'one' 1772b9a2cac3SBram Moolenaar enddef 1773b9a2cac3SBram Moolenaar def Func() 1774b9a2cac3SBram Moolenaar echo 'two' 1775b9a2cac3SBram Moolenaar enddef 1776b9a2cac3SBram Moolenaar END 1777b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1778b9a2cac3SBram Moolenaarenddef 1779b9a2cac3SBram Moolenaar 17808a7d6542SBram Moolenaardef Test_fixed_size_list() 1781f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 17828a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 17838a7d6542SBram Moolenaar l->remove(0) 17848a7d6542SBram Moolenaar l->add(5) 17858a7d6542SBram Moolenaar l->insert(99, 1) 17860f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17878a7d6542SBram Moolenaarenddef 17888a7d6542SBram Moolenaar 1789ae616494SBram Moolenaardef Test_no_insert_xit() 1790ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1791ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1792f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1793f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1794f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1795ae616494SBram Moolenaar 1796ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1797ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1798ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1799ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1800f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1801f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1802f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1803f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1804f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1805ae616494SBram Moolenaarenddef 1806ae616494SBram Moolenaar 1807158906cfSBram Moolenaardef IfElse(what: number): string 1808158906cfSBram Moolenaar let res = '' 1809158906cfSBram Moolenaar if what == 1 1810158906cfSBram Moolenaar res = "one" 1811158906cfSBram Moolenaar elseif what == 2 1812158906cfSBram Moolenaar res = "two" 1813a259d8d3SBram Moolenaar else 1814158906cfSBram Moolenaar res = "three" 1815a259d8d3SBram Moolenaar endif 1816158906cfSBram Moolenaar return res 1817a259d8d3SBram Moolenaarenddef 1818a259d8d3SBram Moolenaar 1819158906cfSBram Moolenaardef Test_if_elseif_else() 1820158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1821158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1822158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18230f18b6d1SBram Moolenaarenddef 18240f18b6d1SBram Moolenaar 1825e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1826e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1827e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1828e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1829e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1830585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1831e8c4abbbSBram Moolenaarenddef 1832e8c4abbbSBram Moolenaar 18336d69bf60SBram Moolenaarlet g:bool_true = v:true 18346d69bf60SBram Moolenaarlet g:bool_false = v:false 18356d69bf60SBram Moolenaar 18366d69bf60SBram Moolenaardef Test_if_const_expr() 18376d69bf60SBram Moolenaar let res = false 18386d69bf60SBram Moolenaar if true ? true : false 18396d69bf60SBram Moolenaar res = true 18406d69bf60SBram Moolenaar endif 18416d69bf60SBram Moolenaar assert_equal(true, res) 18426d69bf60SBram Moolenaar 1843585fea7bSBram Moolenaar g:glob = 2 1844585fea7bSBram Moolenaar if false 18456797966dSBram Moolenaar execute('g:glob = 3') 1846585fea7bSBram Moolenaar endif 1847585fea7bSBram Moolenaar assert_equal(2, g:glob) 1848585fea7bSBram Moolenaar if true 18496797966dSBram Moolenaar execute('g:glob = 3') 1850585fea7bSBram Moolenaar endif 1851585fea7bSBram Moolenaar assert_equal(3, g:glob) 1852585fea7bSBram Moolenaar 18536d69bf60SBram Moolenaar res = false 18546d69bf60SBram Moolenaar if g:bool_true ? true : false 18556d69bf60SBram Moolenaar res = true 18566d69bf60SBram Moolenaar endif 18576d69bf60SBram Moolenaar assert_equal(true, res) 18586d69bf60SBram Moolenaar 18596d69bf60SBram Moolenaar res = false 18606d69bf60SBram Moolenaar if true ? g:bool_true : false 18616d69bf60SBram Moolenaar res = true 18626d69bf60SBram Moolenaar endif 18636d69bf60SBram Moolenaar assert_equal(true, res) 18646d69bf60SBram Moolenaar 18656d69bf60SBram Moolenaar res = false 18666d69bf60SBram Moolenaar if true ? true : g:bool_false 18676d69bf60SBram Moolenaar res = true 18686d69bf60SBram Moolenaar endif 18696d69bf60SBram Moolenaar assert_equal(true, res) 18706d69bf60SBram Moolenaar 18716d69bf60SBram Moolenaar res = false 18726d69bf60SBram Moolenaar if true ? false : true 18736d69bf60SBram Moolenaar res = true 18746d69bf60SBram Moolenaar endif 18756d69bf60SBram Moolenaar assert_equal(false, res) 18766d69bf60SBram Moolenaar 18776d69bf60SBram Moolenaar res = false 18786d69bf60SBram Moolenaar if false ? false : true 18796d69bf60SBram Moolenaar res = true 18806d69bf60SBram Moolenaar endif 18816d69bf60SBram Moolenaar assert_equal(true, res) 18826d69bf60SBram Moolenaar 18836d69bf60SBram Moolenaar res = false 18846d69bf60SBram Moolenaar if false ? true : false 18856d69bf60SBram Moolenaar res = true 18866d69bf60SBram Moolenaar endif 18876d69bf60SBram Moolenaar assert_equal(false, res) 18886d69bf60SBram Moolenaar 18896d69bf60SBram Moolenaar res = false 1890e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1891e8c4abbbSBram Moolenaar res = true 1892e8c4abbbSBram Moolenaar endif 1893e8c4abbbSBram Moolenaar assert_equal(false, res) 1894e8c4abbbSBram Moolenaar 1895e8c4abbbSBram Moolenaar res = false 18966d69bf60SBram Moolenaar if true && true 18976d69bf60SBram Moolenaar res = true 18986d69bf60SBram Moolenaar endif 18996d69bf60SBram Moolenaar assert_equal(true, res) 19006d69bf60SBram Moolenaar 19016d69bf60SBram Moolenaar res = false 19026d69bf60SBram Moolenaar if true && false 19036d69bf60SBram Moolenaar res = true 19046d69bf60SBram Moolenaar endif 19056d69bf60SBram Moolenaar assert_equal(false, res) 19066d69bf60SBram Moolenaar 19076d69bf60SBram Moolenaar res = false 19086d69bf60SBram Moolenaar if g:bool_true && false 19096d69bf60SBram Moolenaar res = true 19106d69bf60SBram Moolenaar endif 19116d69bf60SBram Moolenaar assert_equal(false, res) 19126d69bf60SBram Moolenaar 19136d69bf60SBram Moolenaar res = false 19146d69bf60SBram Moolenaar if true && g:bool_false 19156d69bf60SBram Moolenaar res = true 19166d69bf60SBram Moolenaar endif 19176d69bf60SBram Moolenaar assert_equal(false, res) 19186d69bf60SBram Moolenaar 19196d69bf60SBram Moolenaar res = false 19206d69bf60SBram Moolenaar if false && false 19216d69bf60SBram Moolenaar res = true 19226d69bf60SBram Moolenaar endif 19236d69bf60SBram Moolenaar assert_equal(false, res) 19246d69bf60SBram Moolenaar 19256d69bf60SBram Moolenaar res = false 19266d69bf60SBram Moolenaar if true || false 19276d69bf60SBram Moolenaar res = true 19286d69bf60SBram Moolenaar endif 19296d69bf60SBram Moolenaar assert_equal(true, res) 19306d69bf60SBram Moolenaar 19316d69bf60SBram Moolenaar res = false 19326d69bf60SBram Moolenaar if g:bool_true || false 19336d69bf60SBram Moolenaar res = true 19346d69bf60SBram Moolenaar endif 19356d69bf60SBram Moolenaar assert_equal(true, res) 19366d69bf60SBram Moolenaar 19376d69bf60SBram Moolenaar res = false 19386d69bf60SBram Moolenaar if true || g:bool_false 19396d69bf60SBram Moolenaar res = true 19406d69bf60SBram Moolenaar endif 19416d69bf60SBram Moolenaar assert_equal(true, res) 19426d69bf60SBram Moolenaar 19436d69bf60SBram Moolenaar res = false 19446d69bf60SBram Moolenaar if false || false 19456d69bf60SBram Moolenaar res = true 19466d69bf60SBram Moolenaar endif 19476d69bf60SBram Moolenaar assert_equal(false, res) 194880c34ca3SBram Moolenaarenddef 19496d69bf60SBram Moolenaar 195080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 195180c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 195280c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1953e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1954e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19556d69bf60SBram Moolenaarenddef 19566d69bf60SBram Moolenaar 195772abcf42SBram Moolenaardef RunNested(i: number): number 195872abcf42SBram Moolenaar let x: number = 0 195972abcf42SBram Moolenaar if i % 2 196072abcf42SBram Moolenaar if 1 1961f5be8cdbSBram Moolenaar # comment 196272abcf42SBram Moolenaar else 1963f5be8cdbSBram Moolenaar # comment 196472abcf42SBram Moolenaar endif 196572abcf42SBram Moolenaar x += 1 196672abcf42SBram Moolenaar else 196772abcf42SBram Moolenaar x += 1000 196872abcf42SBram Moolenaar endif 196972abcf42SBram Moolenaar return x 197072abcf42SBram Moolenaarenddef 197172abcf42SBram Moolenaar 197272abcf42SBram Moolenaardef Test_nested_if() 197372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 197472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 197572abcf42SBram Moolenaarenddef 197672abcf42SBram Moolenaar 1977ad39c094SBram Moolenaardef Test_execute_cmd() 1978ad39c094SBram Moolenaar new 1979ad39c094SBram Moolenaar setline(1, 'default') 1980ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1981ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1982a72cfb80SBram Moolenaar 1983a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1984a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1985a72cfb80SBram Moolenaar 1986ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1987ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1988a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1989ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1990a72cfb80SBram Moolenaar 1991ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1992ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1993a72cfb80SBram Moolenaar 1994ad39c094SBram Moolenaar let cmd_first = 'call ' 1995ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1996ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1997ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1998ad39c094SBram Moolenaar bwipe! 1999585fea7bSBram Moolenaar 20002d6b20d6SBram Moolenaar let n = true 20012d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20022d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20032d6b20d6SBram Moolenaar 2004585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 2005a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 2006ad39c094SBram Moolenaarenddef 2007ad39c094SBram Moolenaar 200847e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2009f5be8cdbSBram Moolenaar # only checks line continuation 201047e880d6SBram Moolenaar let lines =<< trim END 201147e880d6SBram Moolenaar vim9script 201247e880d6SBram Moolenaar execute 'g:someVar' 201347e880d6SBram Moolenaar .. ' = ' .. 201447e880d6SBram Moolenaar '28' 201547e880d6SBram Moolenaar assert_equal(28, g:someVar) 201647e880d6SBram Moolenaar unlet g:someVar 201747e880d6SBram Moolenaar END 201847e880d6SBram Moolenaar CheckScriptSuccess(lines) 201947e880d6SBram Moolenaarenddef 202047e880d6SBram Moolenaar 2021ad39c094SBram Moolenaardef Test_echo_cmd() 2022a72cfb80SBram Moolenaar echo 'some' # comment 2023585fea7bSBram Moolenaar echon 'thing' 2024ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2025ad39c094SBram Moolenaar 2026a72cfb80SBram Moolenaar echo "some" # comment 2027a72cfb80SBram Moolenaar echon "thing" 2028a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2029a72cfb80SBram Moolenaar 2030ad39c094SBram Moolenaar let str1 = 'some' 2031ad39c094SBram Moolenaar let str2 = 'more' 2032ad39c094SBram Moolenaar echo str1 str2 2033ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2034a72cfb80SBram Moolenaar 2035a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2036ad39c094SBram Moolenaarenddef 2037ad39c094SBram Moolenaar 2038f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2039f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2040f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2041f93c7feaSBram Moolenaar echo 'clear' 2042df069eecSBram Moolenaar :1messages 2043f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2044f93c7feaSBram Moolenaar 2045f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2046f93c7feaSBram Moolenaarenddef 2047f93c7feaSBram Moolenaar 204847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2049f5be8cdbSBram Moolenaar # only checks line continuation 205047e880d6SBram Moolenaar let lines =<< trim END 205147e880d6SBram Moolenaar vim9script 205247e880d6SBram Moolenaar echomsg 'here' 205347e880d6SBram Moolenaar .. ' is ' .. 205447e880d6SBram Moolenaar 'a message' 205547e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 205647e880d6SBram Moolenaar END 205747e880d6SBram Moolenaar CheckScriptSuccess(lines) 205847e880d6SBram Moolenaarenddef 205947e880d6SBram Moolenaar 2060f93c7feaSBram Moolenaardef Test_echoerr_cmd() 206140ee466cSBram Moolenaar try 206240ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 206340ee466cSBram Moolenaar catch 206440ee466cSBram Moolenaar assert_match('something wrong', v:exception) 206540ee466cSBram Moolenaar endtry 2066f93c7feaSBram Moolenaarenddef 2067f93c7feaSBram Moolenaar 206847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2069f5be8cdbSBram Moolenaar # only checks line continuation 207047e880d6SBram Moolenaar let lines =<< trim END 207147e880d6SBram Moolenaar vim9script 207247e880d6SBram Moolenaar try 207347e880d6SBram Moolenaar echoerr 'this' 207447e880d6SBram Moolenaar .. ' is ' .. 207547e880d6SBram Moolenaar 'wrong' 207647e880d6SBram Moolenaar catch 207747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 207847e880d6SBram Moolenaar endtry 207947e880d6SBram Moolenaar END 208047e880d6SBram Moolenaar CheckScriptSuccess(lines) 208147e880d6SBram Moolenaarenddef 208247e880d6SBram Moolenaar 208341fe0617SBram Moolenaardef Test_for_outside_of_function() 208441fe0617SBram Moolenaar let lines =<< trim END 208541fe0617SBram Moolenaar vim9script 208641fe0617SBram Moolenaar new 208741fe0617SBram Moolenaar for var in range(0, 3) 208841fe0617SBram Moolenaar append(line('$'), var) 208941fe0617SBram Moolenaar endfor 209041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 209141fe0617SBram Moolenaar bwipe! 209241fe0617SBram Moolenaar END 209341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 209441fe0617SBram Moolenaar source Xvim9for.vim 209541fe0617SBram Moolenaar delete('Xvim9for.vim') 209641fe0617SBram Moolenaarenddef 20978a7d6542SBram Moolenaar 2098e8c4abbbSBram Moolenaardef Test_for_loop() 2099e8c4abbbSBram Moolenaar let result = '' 2100e8c4abbbSBram Moolenaar for cnt in range(7) 2101e8c4abbbSBram Moolenaar if cnt == 4 2102e8c4abbbSBram Moolenaar break 2103e8c4abbbSBram Moolenaar endif 2104e8c4abbbSBram Moolenaar if cnt == 2 2105e8c4abbbSBram Moolenaar continue 2106e8c4abbbSBram Moolenaar endif 2107e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2108e8c4abbbSBram Moolenaar endfor 2109e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21100ad3e894SBram Moolenaar 21110ad3e894SBram Moolenaar let concat = '' 21120ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21130ad3e894SBram Moolenaar concat ..= str 21140ad3e894SBram Moolenaar endfor 21150ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2116e8c4abbbSBram Moolenaarenddef 2117e8c4abbbSBram Moolenaar 2118e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2119675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2120675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2121675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2122822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21230ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2124675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2125675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2126675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2127e8c4abbbSBram Moolenaarenddef 2128e8c4abbbSBram Moolenaar 2129d0df1aacSBram Moolenaardef Test_while_loop() 2130d0df1aacSBram Moolenaar let result = '' 2131d0df1aacSBram Moolenaar let cnt = 0 2132d0df1aacSBram Moolenaar while cnt < 555 2133d0df1aacSBram Moolenaar if cnt == 3 2134d0df1aacSBram Moolenaar break 2135d0df1aacSBram Moolenaar endif 2136d0df1aacSBram Moolenaar cnt += 1 2137d0df1aacSBram Moolenaar if cnt == 2 2138d0df1aacSBram Moolenaar continue 2139d0df1aacSBram Moolenaar endif 2140d0df1aacSBram Moolenaar result ..= cnt .. '_' 2141d0df1aacSBram Moolenaar endwhile 2142d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2143d0df1aacSBram Moolenaarenddef 2144d0df1aacSBram Moolenaar 2145e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2146675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2147675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2148675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2149675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2150675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2151675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2152675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2153bd5da371SBram Moolenaarenddef 2154bd5da371SBram Moolenaar 21559645e2d9SBram Moolenaardef Test_interrupt_loop() 215697acfc78SBram Moolenaar let caught = false 21579645e2d9SBram Moolenaar let x = 0 215897acfc78SBram Moolenaar try 21599645e2d9SBram Moolenaar while 1 21609645e2d9SBram Moolenaar x += 1 21619645e2d9SBram Moolenaar if x == 100 21629645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 21639645e2d9SBram Moolenaar endif 21649645e2d9SBram Moolenaar endwhile 216597acfc78SBram Moolenaar catch 216697acfc78SBram Moolenaar caught = true 216797acfc78SBram Moolenaar assert_equal(100, x) 216897acfc78SBram Moolenaar endtry 216997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 21709645e2d9SBram Moolenaarenddef 217120431c9dSBram Moolenaar 21724fdae999SBram Moolenaardef Test_automatic_line_continuation() 21734fdae999SBram Moolenaar let mylist = [ 21744fdae999SBram Moolenaar 'one', 21754fdae999SBram Moolenaar 'two', 21764fdae999SBram Moolenaar 'three', 2177f5be8cdbSBram Moolenaar ] # comment 21784fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 21794fdae999SBram Moolenaar 21804fdae999SBram Moolenaar let mydict = { 21814fdae999SBram Moolenaar 'one': 1, 21824fdae999SBram Moolenaar 'two': 2, 21834fdae999SBram Moolenaar 'three': 21844fdae999SBram Moolenaar 3, 2185f5be8cdbSBram Moolenaar } # comment 21864fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 21874fdae999SBram Moolenaar mydict = #{ 21882c330432SBram Moolenaar one: 1, # comment 21892c330432SBram Moolenaar two: # comment 21902c330432SBram Moolenaar 2, # comment 21912c330432SBram Moolenaar three: 3 # comment 21922c330432SBram Moolenaar } 21932c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 21942c330432SBram Moolenaar mydict = #{ 21952c330432SBram Moolenaar one: 1, 21964fdae999SBram Moolenaar two: 21974fdae999SBram Moolenaar 2, 21982c330432SBram Moolenaar three: 3 21994fdae999SBram Moolenaar } 22004fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2201e6085c53SBram Moolenaar 2202e6085c53SBram Moolenaar assert_equal( 2203e6085c53SBram Moolenaar ['one', 'two', 'three'], 2204e6085c53SBram Moolenaar split('one two three') 2205e6085c53SBram Moolenaar ) 22064fdae999SBram Moolenaarenddef 22074fdae999SBram Moolenaar 22087a092245SBram Moolenaardef Test_vim9_comment() 22097a092245SBram Moolenaar CheckScriptSuccess([ 22107a092245SBram Moolenaar 'vim9script', 22117a092245SBram Moolenaar '# something', 22127a092245SBram Moolenaar ]) 22137a092245SBram Moolenaar CheckScriptFailure([ 22147a092245SBram Moolenaar 'vim9script', 22157a092245SBram Moolenaar ':# something', 22167a092245SBram Moolenaar ], 'E488:') 22177a092245SBram Moolenaar CheckScriptFailure([ 22187a092245SBram Moolenaar '# something', 22197a092245SBram Moolenaar ], 'E488:') 22207a092245SBram Moolenaar CheckScriptFailure([ 22217a092245SBram Moolenaar ':# something', 22227a092245SBram Moolenaar ], 'E488:') 22237a092245SBram Moolenaar 22244a8d9f2eSBram Moolenaar { # block start 22254a8d9f2eSBram Moolenaar } # block end 22264a8d9f2eSBram Moolenaar CheckDefFailure([ 22274a8d9f2eSBram Moolenaar '{# comment', 22284a8d9f2eSBram Moolenaar ], 'E488:') 22294a8d9f2eSBram Moolenaar CheckDefFailure([ 22304a8d9f2eSBram Moolenaar '{', 22314a8d9f2eSBram Moolenaar '}# comment', 22324a8d9f2eSBram Moolenaar ], 'E488:') 22334a8d9f2eSBram Moolenaar 22344a8d9f2eSBram Moolenaar echo "yes" # comment 22354a8d9f2eSBram Moolenaar CheckDefFailure([ 22364a8d9f2eSBram Moolenaar 'echo "yes"# comment', 22374a8d9f2eSBram Moolenaar ], 'E488:') 22387a092245SBram Moolenaar CheckScriptSuccess([ 22397a092245SBram Moolenaar 'vim9script', 22407a092245SBram Moolenaar 'echo "yes" # something', 22417a092245SBram Moolenaar ]) 22427a092245SBram Moolenaar CheckScriptFailure([ 22437a092245SBram Moolenaar 'vim9script', 22447a092245SBram Moolenaar 'echo "yes"# something', 22457a092245SBram Moolenaar ], 'E121:') 22467a092245SBram Moolenaar CheckScriptFailure([ 22477a092245SBram Moolenaar 'vim9script', 22487a092245SBram Moolenaar 'echo# something', 22497a092245SBram Moolenaar ], 'E121:') 22507a092245SBram Moolenaar CheckScriptFailure([ 22517a092245SBram Moolenaar 'echo "yes" # something', 22527a092245SBram Moolenaar ], 'E121:') 22537a092245SBram Moolenaar 22544a8d9f2eSBram Moolenaar exe "echo" # comment 22554a8d9f2eSBram Moolenaar CheckDefFailure([ 22564a8d9f2eSBram Moolenaar 'exe "echo"# comment', 22574a8d9f2eSBram Moolenaar ], 'E488:') 22584a8d9f2eSBram Moolenaar CheckScriptSuccess([ 22594a8d9f2eSBram Moolenaar 'vim9script', 22604a8d9f2eSBram Moolenaar 'exe "echo" # something', 22614a8d9f2eSBram Moolenaar ]) 22624a8d9f2eSBram Moolenaar CheckScriptFailure([ 22634a8d9f2eSBram Moolenaar 'vim9script', 22644a8d9f2eSBram Moolenaar 'exe "echo"# something', 22654a8d9f2eSBram Moolenaar ], 'E121:') 22664a8d9f2eSBram Moolenaar CheckDefFailure([ 22674a8d9f2eSBram Moolenaar 'exe # comment', 22684a8d9f2eSBram Moolenaar ], 'E1015:') 22694a8d9f2eSBram Moolenaar CheckScriptFailure([ 22704a8d9f2eSBram Moolenaar 'vim9script', 22714a8d9f2eSBram Moolenaar 'exe# something', 22724a8d9f2eSBram Moolenaar ], 'E121:') 22734a8d9f2eSBram Moolenaar CheckScriptFailure([ 22744a8d9f2eSBram Moolenaar 'exe "echo" # something', 22754a8d9f2eSBram Moolenaar ], 'E121:') 22764a8d9f2eSBram Moolenaar 22777a092245SBram Moolenaar CheckDefFailure([ 22787a092245SBram Moolenaar 'try# comment', 22797a092245SBram Moolenaar ' echo "yes"', 22807a092245SBram Moolenaar 'catch', 22817a092245SBram Moolenaar 'endtry', 22827a092245SBram Moolenaar ], 'E488:') 22832c5ed4e3SBram Moolenaar CheckScriptFailure([ 22842c5ed4e3SBram Moolenaar 'vim9script', 22852c5ed4e3SBram Moolenaar 'try# comment', 22862c5ed4e3SBram Moolenaar 'echo "yes"', 22872c5ed4e3SBram Moolenaar ], 'E488:') 22887a092245SBram Moolenaar CheckDefFailure([ 22897a092245SBram Moolenaar 'try', 2290a72cfb80SBram Moolenaar ' throw#comment', 2291a72cfb80SBram Moolenaar 'catch', 2292a72cfb80SBram Moolenaar 'endtry', 2293a72cfb80SBram Moolenaar ], 'E1015:') 2294a72cfb80SBram Moolenaar CheckDefFailure([ 2295a72cfb80SBram Moolenaar 'try', 2296a72cfb80SBram Moolenaar ' throw "yes"#comment', 2297a72cfb80SBram Moolenaar 'catch', 2298a72cfb80SBram Moolenaar 'endtry', 2299a72cfb80SBram Moolenaar ], 'E488:') 2300a72cfb80SBram Moolenaar CheckDefFailure([ 2301a72cfb80SBram Moolenaar 'try', 23027a092245SBram Moolenaar ' echo "yes"', 23037a092245SBram Moolenaar 'catch# comment', 23047a092245SBram Moolenaar 'endtry', 23057a092245SBram Moolenaar ], 'E488:') 23062c5ed4e3SBram Moolenaar CheckScriptFailure([ 23072c5ed4e3SBram Moolenaar 'vim9script', 23082c5ed4e3SBram Moolenaar 'try', 23092c5ed4e3SBram Moolenaar ' echo "yes"', 23102c5ed4e3SBram Moolenaar 'catch# comment', 23112c5ed4e3SBram Moolenaar 'endtry', 23122c5ed4e3SBram Moolenaar ], 'E654:') 23132c5ed4e3SBram Moolenaar CheckDefFailure([ 23142c5ed4e3SBram Moolenaar 'try', 23152c5ed4e3SBram Moolenaar ' echo "yes"', 23162c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23172c5ed4e3SBram Moolenaar 'endtry', 23182c5ed4e3SBram Moolenaar ], 'E488:') 23197a092245SBram Moolenaar CheckDefFailure([ 23207a092245SBram Moolenaar 'try', 23217a092245SBram Moolenaar 'echo "yes"', 23227a092245SBram Moolenaar 'catch', 23237a092245SBram Moolenaar 'endtry# comment', 23247a092245SBram Moolenaar ], 'E488:') 23252c5ed4e3SBram Moolenaar CheckScriptFailure([ 23262c5ed4e3SBram Moolenaar 'vim9script', 23272c5ed4e3SBram Moolenaar 'try', 23282c5ed4e3SBram Moolenaar ' echo "yes"', 23292c5ed4e3SBram Moolenaar 'catch', 23302c5ed4e3SBram Moolenaar 'endtry# comment', 23319b7bf9e9SBram Moolenaar ], 'E488:') 23322c5ed4e3SBram Moolenaar 23332c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23342c5ed4e3SBram Moolenaar 'vim9script', 23352c5ed4e3SBram Moolenaar 'hi # comment', 23362c5ed4e3SBram Moolenaar ]) 23372c5ed4e3SBram Moolenaar CheckScriptFailure([ 23382c5ed4e3SBram Moolenaar 'vim9script', 23392c5ed4e3SBram Moolenaar 'hi# comment', 23402c5ed4e3SBram Moolenaar ], 'E416:') 23411966c248SBram Moolenaar CheckScriptSuccess([ 23421966c248SBram Moolenaar 'vim9script', 23431966c248SBram Moolenaar 'hi Search # comment', 23441966c248SBram Moolenaar ]) 23451966c248SBram Moolenaar CheckScriptFailure([ 23461966c248SBram Moolenaar 'vim9script', 23471966c248SBram Moolenaar 'hi Search# comment', 23481966c248SBram Moolenaar ], 'E416:') 23491966c248SBram Moolenaar CheckScriptSuccess([ 23501966c248SBram Moolenaar 'vim9script', 23511966c248SBram Moolenaar 'hi link This Search # comment', 23521966c248SBram Moolenaar ]) 23531966c248SBram Moolenaar CheckScriptFailure([ 23541966c248SBram Moolenaar 'vim9script', 23551966c248SBram Moolenaar 'hi link This That# comment', 23561966c248SBram Moolenaar ], 'E413:') 23571966c248SBram Moolenaar CheckScriptSuccess([ 23581966c248SBram Moolenaar 'vim9script', 23591966c248SBram Moolenaar 'hi clear This # comment', 23601966c248SBram Moolenaar 'hi clear # comment', 23611966c248SBram Moolenaar ]) 2362f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2363f5be8cdbSBram Moolenaar # hi clear This# comment', 23641966c248SBram Moolenaar CheckScriptFailure([ 23651966c248SBram Moolenaar 'vim9script', 23661966c248SBram Moolenaar 'hi clear# comment', 23671966c248SBram Moolenaar ], 'E416:') 23681966c248SBram Moolenaar 23691966c248SBram Moolenaar CheckScriptSuccess([ 23701966c248SBram Moolenaar 'vim9script', 23711966c248SBram Moolenaar 'hi Group term=bold', 23721966c248SBram Moolenaar 'match Group /todo/ # comment', 23731966c248SBram Moolenaar ]) 23741966c248SBram Moolenaar CheckScriptFailure([ 23751966c248SBram Moolenaar 'vim9script', 23761966c248SBram Moolenaar 'hi Group term=bold', 23771966c248SBram Moolenaar 'match Group /todo/# comment', 23781966c248SBram Moolenaar ], 'E488:') 23791966c248SBram Moolenaar CheckScriptSuccess([ 23801966c248SBram Moolenaar 'vim9script', 23811966c248SBram Moolenaar 'match # comment', 23821966c248SBram Moolenaar ]) 23831966c248SBram Moolenaar CheckScriptFailure([ 23841966c248SBram Moolenaar 'vim9script', 23851966c248SBram Moolenaar 'match# comment', 23861966c248SBram Moolenaar ], 'E475:') 23871966c248SBram Moolenaar CheckScriptSuccess([ 23881966c248SBram Moolenaar 'vim9script', 23891966c248SBram Moolenaar 'match none # comment', 23901966c248SBram Moolenaar ]) 23911966c248SBram Moolenaar CheckScriptFailure([ 23921966c248SBram Moolenaar 'vim9script', 23931966c248SBram Moolenaar 'match none# comment', 23941966c248SBram Moolenaar ], 'E475:') 23951966c248SBram Moolenaar 23961966c248SBram Moolenaar CheckScriptSuccess([ 23971966c248SBram Moolenaar 'vim9script', 23981966c248SBram Moolenaar 'menutrans clear # comment', 23991966c248SBram Moolenaar ]) 24001966c248SBram Moolenaar CheckScriptFailure([ 24011966c248SBram Moolenaar 'vim9script', 24021966c248SBram Moolenaar 'menutrans clear# comment text', 24031966c248SBram Moolenaar ], 'E474:') 24041966c248SBram Moolenaar 24051966c248SBram Moolenaar CheckScriptSuccess([ 24061966c248SBram Moolenaar 'vim9script', 24071966c248SBram Moolenaar 'syntax clear # comment', 24081966c248SBram Moolenaar ]) 24091966c248SBram Moolenaar CheckScriptFailure([ 24101966c248SBram Moolenaar 'vim9script', 24111966c248SBram Moolenaar 'syntax clear# comment text', 24121966c248SBram Moolenaar ], 'E28:') 24131966c248SBram Moolenaar CheckScriptSuccess([ 24141966c248SBram Moolenaar 'vim9script', 24151966c248SBram Moolenaar 'syntax keyword Word some', 24161966c248SBram Moolenaar 'syntax clear Word # comment', 24171966c248SBram Moolenaar ]) 24181966c248SBram Moolenaar CheckScriptFailure([ 24191966c248SBram Moolenaar 'vim9script', 24201966c248SBram Moolenaar 'syntax keyword Word some', 24211966c248SBram Moolenaar 'syntax clear Word# comment text', 24221966c248SBram Moolenaar ], 'E28:') 24231966c248SBram Moolenaar 24241966c248SBram Moolenaar CheckScriptSuccess([ 24251966c248SBram Moolenaar 'vim9script', 24261966c248SBram Moolenaar 'syntax list # comment', 24271966c248SBram Moolenaar ]) 24281966c248SBram Moolenaar CheckScriptFailure([ 24291966c248SBram Moolenaar 'vim9script', 24301966c248SBram Moolenaar 'syntax list# comment text', 24311966c248SBram Moolenaar ], 'E28:') 24321966c248SBram Moolenaar 24331966c248SBram Moolenaar CheckScriptSuccess([ 24341966c248SBram Moolenaar 'vim9script', 24351966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24361966c248SBram Moolenaar ]) 24371966c248SBram Moolenaar CheckScriptFailure([ 24381966c248SBram Moolenaar 'vim9script', 24391966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 24401966c248SBram Moolenaar ], 'E475:') 24411966c248SBram Moolenaar 24421966c248SBram Moolenaar CheckScriptSuccess([ 24431966c248SBram Moolenaar 'vim9script', 24441966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 24451966c248SBram Moolenaar ]) 24461966c248SBram Moolenaar CheckScriptFailure([ 24471966c248SBram Moolenaar 'vim9script', 24481966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 24491966c248SBram Moolenaar ], 'E789:') 24501966c248SBram Moolenaar 24511966c248SBram Moolenaar CheckScriptSuccess([ 24521966c248SBram Moolenaar 'vim9script', 24531966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 24541966c248SBram Moolenaar ]) 24551966c248SBram Moolenaar CheckScriptFailure([ 24561966c248SBram Moolenaar 'vim9script', 24571966c248SBram Moolenaar 'syntax match Word /pat/# comment', 24581966c248SBram Moolenaar ], 'E402:') 24591966c248SBram Moolenaar 24601966c248SBram Moolenaar CheckScriptSuccess([ 24611966c248SBram Moolenaar 'vim9script', 24621966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 24631966c248SBram Moolenaar ]) 24641966c248SBram Moolenaar CheckScriptFailure([ 24651966c248SBram Moolenaar 'vim9script', 24661966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 24671966c248SBram Moolenaar ], 'E475:') 24681966c248SBram Moolenaar CheckScriptFailure([ 24691966c248SBram Moolenaar 'vim9script', 24701966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 24711966c248SBram Moolenaar ], 'E406:') 24721966c248SBram Moolenaar CheckScriptFailure([ 24731966c248SBram Moolenaar 'vim9script', 24741966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 24751966c248SBram Moolenaar ], 'E475:') 24761966c248SBram Moolenaar 24771966c248SBram Moolenaar CheckScriptSuccess([ 24781966c248SBram Moolenaar 'vim9script', 24791966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 24801966c248SBram Moolenaar ]) 24811966c248SBram Moolenaar CheckScriptFailure([ 24821966c248SBram Moolenaar 'vim9script', 24831966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2484d032f34aSBram Moolenaar ], 'E402:') 24851966c248SBram Moolenaar 24861966c248SBram Moolenaar CheckScriptSuccess([ 24871966c248SBram Moolenaar 'vim9script', 24881966c248SBram Moolenaar 'syntax sync # comment', 24891966c248SBram Moolenaar ]) 24901966c248SBram Moolenaar CheckScriptFailure([ 24911966c248SBram Moolenaar 'vim9script', 24921966c248SBram Moolenaar 'syntax sync# comment', 24931966c248SBram Moolenaar ], 'E404:') 24941966c248SBram Moolenaar CheckScriptSuccess([ 24951966c248SBram Moolenaar 'vim9script', 24961966c248SBram Moolenaar 'syntax sync ccomment # comment', 24971966c248SBram Moolenaar ]) 24981966c248SBram Moolenaar CheckScriptFailure([ 24991966c248SBram Moolenaar 'vim9script', 25001966c248SBram Moolenaar 'syntax sync ccomment# comment', 25011966c248SBram Moolenaar ], 'E404:') 25021966c248SBram Moolenaar 25031966c248SBram Moolenaar CheckScriptSuccess([ 25041966c248SBram Moolenaar 'vim9script', 25051966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25061966c248SBram Moolenaar ]) 25071966c248SBram Moolenaar CheckScriptFailure([ 25081966c248SBram Moolenaar 'vim9script', 25091966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25101966c248SBram Moolenaar ], 'E475:') 2511a72cfb80SBram Moolenaar 2512a72cfb80SBram Moolenaar CheckScriptSuccess([ 2513a72cfb80SBram Moolenaar 'vim9script', 2514a72cfb80SBram Moolenaar 'command Echo echo # comment', 2515a72cfb80SBram Moolenaar 'command Echo # comment', 2516a72cfb80SBram Moolenaar ]) 2517a72cfb80SBram Moolenaar CheckScriptFailure([ 2518a72cfb80SBram Moolenaar 'vim9script', 2519a72cfb80SBram Moolenaar 'command Echo echo# comment', 2520a72cfb80SBram Moolenaar 'Echo', 2521a72cfb80SBram Moolenaar ], 'E121:') 2522a72cfb80SBram Moolenaar CheckScriptFailure([ 2523a72cfb80SBram Moolenaar 'vim9script', 2524a72cfb80SBram Moolenaar 'command Echo# comment', 2525a72cfb80SBram Moolenaar ], 'E182:') 2526a72cfb80SBram Moolenaar CheckScriptFailure([ 2527a72cfb80SBram Moolenaar 'vim9script', 2528a72cfb80SBram Moolenaar 'command Echo echo', 2529a72cfb80SBram Moolenaar 'command Echo# comment', 2530a72cfb80SBram Moolenaar ], 'E182:') 2531a72cfb80SBram Moolenaar 2532a72cfb80SBram Moolenaar CheckScriptSuccess([ 2533a72cfb80SBram Moolenaar 'vim9script', 2534a72cfb80SBram Moolenaar 'function # comment', 2535a72cfb80SBram Moolenaar ]) 2536a72cfb80SBram Moolenaar CheckScriptFailure([ 2537a72cfb80SBram Moolenaar 'vim9script', 25389898107fSBram Moolenaar 'function " comment', 25399898107fSBram Moolenaar ], 'E129:') 25409898107fSBram Moolenaar CheckScriptFailure([ 25419898107fSBram Moolenaar 'vim9script', 2542a72cfb80SBram Moolenaar 'function# comment', 2543a72cfb80SBram Moolenaar ], 'E129:') 2544a72cfb80SBram Moolenaar CheckScriptSuccess([ 2545a72cfb80SBram Moolenaar 'vim9script', 2546a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2547a72cfb80SBram Moolenaar ]) 2548a72cfb80SBram Moolenaar CheckScriptFailure([ 2549a72cfb80SBram Moolenaar 'vim9script', 2550a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2551a72cfb80SBram Moolenaar ], 'E488:') 2552a72cfb80SBram Moolenaar 2553a72cfb80SBram Moolenaar CheckScriptSuccess([ 2554a72cfb80SBram Moolenaar 'vim9script', 25554c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2556a72cfb80SBram Moolenaar 'endfunc', 25574c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2558a72cfb80SBram Moolenaar ]) 2559a72cfb80SBram Moolenaar CheckScriptFailure([ 2560a72cfb80SBram Moolenaar 'vim9script', 25614c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2562a72cfb80SBram Moolenaar 'endfunc', 25634c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2564a72cfb80SBram Moolenaar ], 'E488:') 2565a72cfb80SBram Moolenaar 2566a72cfb80SBram Moolenaar CheckScriptSuccess([ 2567a72cfb80SBram Moolenaar 'vim9script', 2568a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2569a72cfb80SBram Moolenaar ]) 2570a72cfb80SBram Moolenaar CheckScriptFailure([ 2571a72cfb80SBram Moolenaar 'vim9script', 2572a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2573a72cfb80SBram Moolenaar ], 'E488:') 2574e7e4838fSBram Moolenaar 2575e7e4838fSBram Moolenaar CheckScriptFailure([ 2576e7e4838fSBram Moolenaar 'def Test() " comment', 2577e7e4838fSBram Moolenaar 'enddef', 2578e7e4838fSBram Moolenaar ], 'E488:') 2579e7e4838fSBram Moolenaar CheckScriptFailure([ 2580e7e4838fSBram Moolenaar 'vim9script', 2581e7e4838fSBram Moolenaar 'def Test() " comment', 2582e7e4838fSBram Moolenaar 'enddef', 2583e7e4838fSBram Moolenaar ], 'E488:') 2584e7e4838fSBram Moolenaar 2585e7e4838fSBram Moolenaar CheckScriptSuccess([ 2586e7e4838fSBram Moolenaar 'func Test() " comment', 2587e7e4838fSBram Moolenaar 'endfunc', 2588e7e4838fSBram Moolenaar ]) 25899898107fSBram Moolenaar CheckScriptSuccess([ 2590e7e4838fSBram Moolenaar 'vim9script', 2591e7e4838fSBram Moolenaar 'func Test() " comment', 2592e7e4838fSBram Moolenaar 'endfunc', 25939898107fSBram Moolenaar ]) 2594e7e4838fSBram Moolenaar 2595e7e4838fSBram Moolenaar CheckScriptSuccess([ 2596e7e4838fSBram Moolenaar 'def Test() # comment', 2597e7e4838fSBram Moolenaar 'enddef', 2598e7e4838fSBram Moolenaar ]) 2599e7e4838fSBram Moolenaar CheckScriptFailure([ 2600e7e4838fSBram Moolenaar 'func Test() # comment', 2601e7e4838fSBram Moolenaar 'endfunc', 2602e7e4838fSBram Moolenaar ], 'E488:') 26032c5ed4e3SBram Moolenaarenddef 26042c5ed4e3SBram Moolenaar 26052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 26062c5ed4e3SBram Moolenaar CheckCanRunGui 26072c5ed4e3SBram Moolenaar 26082c5ed4e3SBram Moolenaar CheckScriptFailure([ 26092c5ed4e3SBram Moolenaar 'vim9script', 26102c5ed4e3SBram Moolenaar 'gui#comment' 26112c5ed4e3SBram Moolenaar ], 'E499:') 26122c5ed4e3SBram Moolenaar CheckScriptFailure([ 26132c5ed4e3SBram Moolenaar 'vim9script', 26142c5ed4e3SBram Moolenaar 'gui -f#comment' 26152c5ed4e3SBram Moolenaar ], 'E499:') 26167a092245SBram Moolenaarenddef 26177a092245SBram Moolenaar 2618a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 26196797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 26206797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2621a26b9700SBram Moolenaar 2622a26b9700SBram Moolenaar edit test.vim 2623a26b9700SBram Moolenaar doautocmd TabEnter #comment 2624a26b9700SBram Moolenaar assert_equal(1, g:entered) 2625a26b9700SBram Moolenaar 2626a26b9700SBram Moolenaar doautocmd TabEnter f.x 2627a26b9700SBram Moolenaar assert_equal(2, g:entered) 2628a26b9700SBram Moolenaar 2629a26b9700SBram Moolenaar g:entered = 0 2630a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2631a26b9700SBram Moolenaar assert_equal(2, g:entered) 2632a26b9700SBram Moolenaar 2633a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2634a26b9700SBram Moolenaar 2635a26b9700SBram Moolenaar au! TabEnter 2636a26b9700SBram Moolenaar unlet g:entered 2637d72c1bf0SBram Moolenaar 2638d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2639d72c1bf0SBram Moolenaar 'vim9script', 26406797966dSBram Moolenaar 'g:var = 123', 2641e55b1c09SBram Moolenaar 'b:var = 456', 2642e55b1c09SBram Moolenaar 'w:var = 777', 2643e55b1c09SBram Moolenaar 't:var = 888', 2644d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2645d72c1bf0SBram Moolenaar ]) 2646d72c1bf0SBram Moolenaar 2647d72c1bf0SBram Moolenaar CheckScriptFailure([ 2648d72c1bf0SBram Moolenaar 'vim9script', 2649d72c1bf0SBram Moolenaar 'let g:var = 123', 2650e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2651e55b1c09SBram Moolenaar 2652e55b1c09SBram Moolenaar CheckScriptFailure([ 2653e55b1c09SBram Moolenaar 'vim9script', 2654e55b1c09SBram Moolenaar 'let b:var = 123', 2655e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2656e55b1c09SBram Moolenaar 2657e55b1c09SBram Moolenaar CheckScriptFailure([ 2658e55b1c09SBram Moolenaar 'vim9script', 2659e55b1c09SBram Moolenaar 'let w:var = 123', 2660e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2661e55b1c09SBram Moolenaar 2662e55b1c09SBram Moolenaar CheckScriptFailure([ 2663e55b1c09SBram Moolenaar 'vim9script', 2664e55b1c09SBram Moolenaar 'let t:var = 123', 2665e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2666e55b1c09SBram Moolenaar 2667e55b1c09SBram Moolenaar CheckScriptFailure([ 2668e55b1c09SBram Moolenaar 'vim9script', 2669e55b1c09SBram Moolenaar 'let v:version = 123', 2670e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2671e55b1c09SBram Moolenaar 2672e55b1c09SBram Moolenaar CheckScriptFailure([ 2673e55b1c09SBram Moolenaar 'vim9script', 2674e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2675e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 26766797966dSBram Moolenaar 26776797966dSBram Moolenaar CheckScriptFailure([ 26786797966dSBram Moolenaar 'vim9script', 26796797966dSBram Moolenaar 'g:var = 123', 268032e35117SBram Moolenaar 'unlet g:var# comment1', 2681d72c1bf0SBram Moolenaar ], 'E108:') 2682d72c1bf0SBram Moolenaar 2683d72c1bf0SBram Moolenaar CheckScriptFailure([ 2684d72c1bf0SBram Moolenaar 'let g:var = 123', 2685d72c1bf0SBram Moolenaar 'unlet g:var # something', 2686d72c1bf0SBram Moolenaar ], 'E488:') 2687faac4104SBram Moolenaar 2688faac4104SBram Moolenaar CheckScriptSuccess([ 2689faac4104SBram Moolenaar 'vim9script', 269032e35117SBram Moolenaar 'if 1 # comment2', 2691faac4104SBram Moolenaar ' echo "yes"', 2692faac4104SBram Moolenaar 'elseif 2 #comment', 2693faac4104SBram Moolenaar ' echo "no"', 2694faac4104SBram Moolenaar 'endif', 2695faac4104SBram Moolenaar ]) 2696faac4104SBram Moolenaar 2697faac4104SBram Moolenaar CheckScriptFailure([ 2698faac4104SBram Moolenaar 'vim9script', 269932e35117SBram Moolenaar 'if 1# comment3', 2700faac4104SBram Moolenaar ' echo "yes"', 2701faac4104SBram Moolenaar 'endif', 2702faac4104SBram Moolenaar ], 'E15:') 2703faac4104SBram Moolenaar 2704faac4104SBram Moolenaar CheckScriptFailure([ 2705faac4104SBram Moolenaar 'vim9script', 270632e35117SBram Moolenaar 'if 0 # comment4', 2707faac4104SBram Moolenaar ' echo "yes"', 2708faac4104SBram Moolenaar 'elseif 2#comment', 2709faac4104SBram Moolenaar ' echo "no"', 2710faac4104SBram Moolenaar 'endif', 2711faac4104SBram Moolenaar ], 'E15:') 2712faac4104SBram Moolenaar 2713faac4104SBram Moolenaar CheckScriptSuccess([ 2714faac4104SBram Moolenaar 'vim9script', 271532e35117SBram Moolenaar 'let v = 1 # comment5', 2716faac4104SBram Moolenaar ]) 2717faac4104SBram Moolenaar 2718faac4104SBram Moolenaar CheckScriptFailure([ 2719faac4104SBram Moolenaar 'vim9script', 272032e35117SBram Moolenaar 'let v = 1# comment6', 272132e35117SBram Moolenaar ], 'E15:') 2722faac4104SBram Moolenaar 2723faac4104SBram Moolenaar CheckScriptSuccess([ 2724faac4104SBram Moolenaar 'vim9script', 2725faac4104SBram Moolenaar 'new' 2726faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2727df069eecSBram Moolenaar ':$', 2728faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2729faac4104SBram Moolenaar 'bwipe!', 2730faac4104SBram Moolenaar ]) 2731faac4104SBram Moolenaar 2732f5be8cdbSBram Moolenaar CheckScriptFailure([ 2733f5be8cdbSBram Moolenaar 'vim9script', 2734f5be8cdbSBram Moolenaar 'new' 2735f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2736f5be8cdbSBram Moolenaar ':$', 2737f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2738f5be8cdbSBram Moolenaar 'bwipe!', 2739f5be8cdbSBram Moolenaar ], 'E488:') 2740f5be8cdbSBram Moolenaar 2741f5be8cdbSBram Moolenaar CheckScriptFailure([ 2742f5be8cdbSBram Moolenaar 'vim9script', 2743f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2744f5be8cdbSBram Moolenaar ], 'E477:') 2745a26b9700SBram Moolenaarenddef 2746a26b9700SBram Moolenaar 27477e5bd91dSBram Moolenaardef Test_finish() 27487e5bd91dSBram Moolenaar let lines =<< trim END 27497e5bd91dSBram Moolenaar vim9script 27506797966dSBram Moolenaar g:res = 'one' 27517e5bd91dSBram Moolenaar if v:false | finish | endif 27526797966dSBram Moolenaar g:res = 'two' 27537e5bd91dSBram Moolenaar finish 27546797966dSBram Moolenaar g:res = 'three' 27557e5bd91dSBram Moolenaar END 27567e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27577e5bd91dSBram Moolenaar source Xfinished 27587e5bd91dSBram Moolenaar assert_equal('two', g:res) 27597e5bd91dSBram Moolenaar 27607e5bd91dSBram Moolenaar unlet g:res 27617e5bd91dSBram Moolenaar delete('Xfinished') 27627e5bd91dSBram Moolenaarenddef 27637e5bd91dSBram Moolenaar 276432e35117SBram Moolenaardef Test_let_func_call() 276532e35117SBram Moolenaar let lines =<< trim END 276632e35117SBram Moolenaar vim9script 276732e35117SBram Moolenaar func GetValue() 276832e35117SBram Moolenaar if exists('g:count') 276932e35117SBram Moolenaar let g:count += 1 277032e35117SBram Moolenaar else 277132e35117SBram Moolenaar let g:count = 1 277232e35117SBram Moolenaar endif 277332e35117SBram Moolenaar return 'this' 277432e35117SBram Moolenaar endfunc 277532e35117SBram Moolenaar let val: string = GetValue() 2776f5be8cdbSBram Moolenaar # env var is always a string 2777df671b46SBram Moolenaar let env = $TERM 277832e35117SBram Moolenaar END 277932e35117SBram Moolenaar writefile(lines, 'Xfinished') 278032e35117SBram Moolenaar source Xfinished 2781f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 278232e35117SBram Moolenaar assert_equal(1, g:count) 278332e35117SBram Moolenaar 278432e35117SBram Moolenaar unlet g:count 278532e35117SBram Moolenaar delete('Xfinished') 278632e35117SBram Moolenaarenddef 278732e35117SBram Moolenaar 278832e35117SBram Moolenaardef Test_let_missing_type() 278932e35117SBram Moolenaar let lines =<< trim END 279032e35117SBram Moolenaar vim9script 2791df671b46SBram Moolenaar let var = g:unknown 2792227a69deSBram Moolenaar END 2793822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2794227a69deSBram Moolenaar 2795227a69deSBram Moolenaar lines =<< trim END 2796227a69deSBram Moolenaar vim9script 2797227a69deSBram Moolenaar let nr: number = 123 2798227a69deSBram Moolenaar let var = nr 2799227a69deSBram Moolenaar END 2800822ba247SBram Moolenaar CheckScriptSuccess(lines) 280132e35117SBram Moolenaarenddef 280232e35117SBram Moolenaar 2803c82a5b5dSBram Moolenaardef Test_let_declaration() 2804c82a5b5dSBram Moolenaar let lines =<< trim END 2805c82a5b5dSBram Moolenaar vim9script 2806c82a5b5dSBram Moolenaar let var: string 2807c82a5b5dSBram Moolenaar g:var_uninit = var 2808c82a5b5dSBram Moolenaar var = 'text' 2809c82a5b5dSBram Moolenaar g:var_test = var 2810f5be8cdbSBram Moolenaar # prefixing s: is optional 2811984dddbeSBram Moolenaar s:var = 'prefixed' 2812984dddbeSBram Moolenaar g:var_prefixed = s:var 2813984dddbeSBram Moolenaar 2814984dddbeSBram Moolenaar let s:other: number 2815984dddbeSBram Moolenaar other = 1234 2816984dddbeSBram Moolenaar g:other_var = other 2817c82a5b5dSBram Moolenaar END 2818c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2819c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2820c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2821984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2822984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2823c82a5b5dSBram Moolenaar 2824c82a5b5dSBram Moolenaar unlet g:var_uninit 2825c82a5b5dSBram Moolenaar unlet g:var_test 2826984dddbeSBram Moolenaar unlet g:var_prefixed 2827984dddbeSBram Moolenaar unlet g:other_var 2828c82a5b5dSBram Moolenaarenddef 2829c82a5b5dSBram Moolenaar 2830c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2831c5b1c20bSBram Moolenaar let lines =<< trim END 2832c5b1c20bSBram Moolenaar vim9script 2833c5b1c20bSBram Moolenaar const var: string 2834c5b1c20bSBram Moolenaar END 2835c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2836c5b1c20bSBram Moolenaar 2837c5b1c20bSBram Moolenaar lines =<< trim END 2838c5b1c20bSBram Moolenaar vim9script 2839c5b1c20bSBram Moolenaar let 9var: string 2840c5b1c20bSBram Moolenaar END 2841c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2842c5b1c20bSBram Moolenaarenddef 2843c5b1c20bSBram Moolenaar 284434db91f7SBram Moolenaardef Test_let_type_check() 284534db91f7SBram Moolenaar let lines =<< trim END 284634db91f7SBram Moolenaar vim9script 284734db91f7SBram Moolenaar let var: string 284834db91f7SBram Moolenaar var = 1234 284934db91f7SBram Moolenaar END 285034db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2851984dddbeSBram Moolenaar 2852984dddbeSBram Moolenaar lines =<< trim END 2853984dddbeSBram Moolenaar vim9script 2854984dddbeSBram Moolenaar let var:string 2855984dddbeSBram Moolenaar END 2856984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2857c5b1c20bSBram Moolenaar 2858c5b1c20bSBram Moolenaar lines =<< trim END 2859c5b1c20bSBram Moolenaar vim9script 2860c5b1c20bSBram Moolenaar let var: asdf 2861c5b1c20bSBram Moolenaar END 2862c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2863a71e2633SBram Moolenaar 2864a71e2633SBram Moolenaar lines =<< trim END 2865a71e2633SBram Moolenaar vim9script 2866a71e2633SBram Moolenaar let s:l: list<number> 2867a71e2633SBram Moolenaar s:l = [] 2868a71e2633SBram Moolenaar END 2869a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2870a71e2633SBram Moolenaar 2871a71e2633SBram Moolenaar lines =<< trim END 2872a71e2633SBram Moolenaar vim9script 2873a71e2633SBram Moolenaar let s:d: dict<number> 2874a71e2633SBram Moolenaar s:d = {} 2875a71e2633SBram Moolenaar END 2876a71e2633SBram Moolenaar CheckScriptSuccess(lines) 287734db91f7SBram Moolenaarenddef 287834db91f7SBram Moolenaar 2879a5d0077eSBram Moolenaardef Test_forward_declaration() 2880a5d0077eSBram Moolenaar let lines =<< trim END 2881a5d0077eSBram Moolenaar vim9script 2882a5d0077eSBram Moolenaar def GetValue(): string 2883a5d0077eSBram Moolenaar return theVal 2884a5d0077eSBram Moolenaar enddef 2885a5d0077eSBram Moolenaar let theVal = 'something' 2886822ba247SBram Moolenaar g:initVal = GetValue() 2887a5d0077eSBram Moolenaar theVal = 'else' 2888a5d0077eSBram Moolenaar g:laterVal = GetValue() 2889a5d0077eSBram Moolenaar END 2890a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2891a5d0077eSBram Moolenaar source Xforward 2892a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2893a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2894a5d0077eSBram Moolenaar 2895a5d0077eSBram Moolenaar unlet g:initVal 2896a5d0077eSBram Moolenaar unlet g:laterVal 2897a5d0077eSBram Moolenaar delete('Xforward') 2898a5d0077eSBram Moolenaarenddef 2899a5d0077eSBram Moolenaar 29009721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 29019721fb4eSBram Moolenaar let legacy_lines =<< trim END 29029721fb4eSBram Moolenaar source Xvim9_script.vim 29039721fb4eSBram Moolenaar 29049721fb4eSBram Moolenaar call assert_false(exists('local')) 29059721fb4eSBram Moolenaar call assert_false(exists('exported')) 29069721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29079721fb4eSBram Moolenaar call assert_equal('global', global) 29089721fb4eSBram Moolenaar call assert_equal('global', g:global) 29099721fb4eSBram Moolenaar 29109721fb4eSBram Moolenaar " imported variable becomes script-local 29119721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29129721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29139721fb4eSBram Moolenaar call assert_false(exists('exported')) 29149721fb4eSBram Moolenaar 29159721fb4eSBram Moolenaar " imported function becomes script-local 29169721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29179721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29189721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29199721fb4eSBram Moolenaar END 29209721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29219721fb4eSBram Moolenaar 29229721fb4eSBram Moolenaar let vim9_lines =<< trim END 29239721fb4eSBram Moolenaar vim9script 29249721fb4eSBram Moolenaar let local = 'local' 29259721fb4eSBram Moolenaar g:global = 'global' 29269721fb4eSBram Moolenaar export let exported = 'exported' 29279721fb4eSBram Moolenaar export def GetText(): string 29289721fb4eSBram Moolenaar return 'text' 29299721fb4eSBram Moolenaar enddef 29309721fb4eSBram Moolenaar END 29319721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 29329721fb4eSBram Moolenaar 29339721fb4eSBram Moolenaar source Xlegacy_script.vim 29349721fb4eSBram Moolenaar 29359721fb4eSBram Moolenaar assert_equal('global', g:global) 2936f5be8cdbSBram Moolenaar unlet g:global 29379721fb4eSBram Moolenaar 29389721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29399721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29409721fb4eSBram Moolenaarenddef 2941a5d0077eSBram Moolenaar 2942eeb27bfeSBram Moolenaardef Test_vim9_copen() 2943eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2944eeb27bfeSBram Moolenaar copen 2945eeb27bfeSBram Moolenaar quit 2946eeb27bfeSBram Moolenaarenddef 2947eeb27bfeSBram Moolenaar 29482d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 29492d6b20d6SBram Moolenaardef Test_vim9_autoload() 29502d6b20d6SBram Moolenaar let lines =<< trim END 29512d6b20d6SBram Moolenaar vim9script 29522d6b20d6SBram Moolenaar def foo#test() 29532d6b20d6SBram Moolenaar echomsg getreg('"') 29542d6b20d6SBram Moolenaar enddef 29552d6b20d6SBram Moolenaar END 29562d6b20d6SBram Moolenaar 29572d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29582d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 29592d6b20d6SBram Moolenaar let save_rtp = &rtp 29602d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29612d6b20d6SBram Moolenaar augroup test 29622d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 29632d6b20d6SBram Moolenaar augroup END 29642d6b20d6SBram Moolenaar 29652d6b20d6SBram Moolenaar normal Y 29662d6b20d6SBram Moolenaar 29672d6b20d6SBram Moolenaar augroup test 29682d6b20d6SBram Moolenaar autocmd! 29692d6b20d6SBram Moolenaar augroup END 29702d6b20d6SBram Moolenaar delete('Xdir', 'rf') 29712d6b20d6SBram Moolenaar &rtp = save_rtp 29722d6b20d6SBram Moolenaarenddef 29732d6b20d6SBram Moolenaar 2974585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2975585fea7bSBram Moolenaardef Test_substitute_cmd() 2976585fea7bSBram Moolenaar new 2977585fea7bSBram Moolenaar setline(1, 'something') 2978585fea7bSBram Moolenaar :substitute(some(other( 2979585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2980585fea7bSBram Moolenaar bwipe! 2981585fea7bSBram Moolenaar 2982f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2983585fea7bSBram Moolenaar let lines =<< trim END 2984585fea7bSBram Moolenaar vim9script 2985585fea7bSBram Moolenaar new 2986585fea7bSBram Moolenaar setline(1, 'something') 2987585fea7bSBram Moolenaar :substitute(some(other( 2988585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2989585fea7bSBram Moolenaar bwipe! 2990585fea7bSBram Moolenaar END 2991585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2992585fea7bSBram Moolenaar source Xvim9lines 2993585fea7bSBram Moolenaar 2994585fea7bSBram Moolenaar delete('Xvim9lines') 2995585fea7bSBram Moolenaarenddef 2996585fea7bSBram Moolenaar 29978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2998