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) 129dd29f1b0SBram 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) 135dd29f1b0SBram 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) 149dd29f1b0SBram 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) 227dd29f1b0SBram Moolenaar list2 += [100] 228dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 229dd29f1b0SBram Moolenaar 230dd29f1b0SBram Moolenaar list3 += ['end'] 231dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 232dd29f1b0SBram Moolenaar 233dd29f1b0SBram 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) 4251c199f9cSBram Moolenaar 4261c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 4271c199f9cSBram Moolenaar assert_equal(3, &ts) 4281c199f9cSBram Moolenaar assert_equal(4, &sw) 4291c199f9cSBram Moolenaar set ts=8 sw=4 43047a519a9SBram Moolenaarenddef 43147a519a9SBram Moolenaar 432c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 433c7e44a7eSBram Moolenaar let lines =<< trim END 434c7e44a7eSBram Moolenaar vim9script 435c7e44a7eSBram Moolenaar def Func(): list<number> 436c7e44a7eSBram Moolenaar return [1, 2] 437c7e44a7eSBram Moolenaar enddef 438c7e44a7eSBram Moolenaar let var1: number 439c7e44a7eSBram Moolenaar let var2: number 440c7e44a7eSBram Moolenaar [var1, var2] = 441c7e44a7eSBram Moolenaar Func() 442c7e44a7eSBram Moolenaar assert_equal(1, var1) 443c7e44a7eSBram Moolenaar assert_equal(2, var2) 444c7e44a7eSBram Moolenaar let ll = 445c7e44a7eSBram Moolenaar Func() 446c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 44783144546SBram Moolenaar 44883144546SBram Moolenaar @/ = 'text' 44983144546SBram Moolenaar assert_equal('text', @/) 45083144546SBram Moolenaar @0 = 'zero' 45183144546SBram Moolenaar assert_equal('zero', @0) 45283144546SBram Moolenaar @1 = 'one' 45383144546SBram Moolenaar assert_equal('one', @1) 45483144546SBram Moolenaar @9 = 'nine' 45583144546SBram Moolenaar assert_equal('nine', @9) 45683144546SBram Moolenaar @- = 'minus' 45783144546SBram Moolenaar assert_equal('minus', @-) 45883144546SBram Moolenaar if has('clipboard_working') 45983144546SBram Moolenaar @* = 'star' 46083144546SBram Moolenaar assert_equal('star', @*) 46183144546SBram Moolenaar @+ = 'plus' 46283144546SBram Moolenaar assert_equal('plus', @+) 46383144546SBram Moolenaar endif 46495dd9f25SBram Moolenaar 46595dd9f25SBram Moolenaar let a: number = 123 46695dd9f25SBram Moolenaar assert_equal(123, a) 46795dd9f25SBram Moolenaar let s: string = 'yes' 46895dd9f25SBram Moolenaar assert_equal('yes', s) 46995dd9f25SBram Moolenaar let b: number = 42 47095dd9f25SBram Moolenaar assert_equal(42, b) 47195dd9f25SBram Moolenaar let w: number = 43 47295dd9f25SBram Moolenaar assert_equal(43, w) 47395dd9f25SBram Moolenaar let t: number = 44 47495dd9f25SBram Moolenaar assert_equal(44, t) 475c7e44a7eSBram Moolenaar END 476c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 477c7e44a7eSBram Moolenaarenddef 478c7e44a7eSBram Moolenaar 479cab27678SBram Moolenaardef Mess(): string 480cab27678SBram Moolenaar v:foldstart = 123 481cab27678SBram Moolenaar return 'xxx' 482cab27678SBram Moolenaarenddef 483cab27678SBram Moolenaar 484d72c1bf0SBram Moolenaardef Test_assignment_failure() 4858a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4868a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4878a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4888a7d6542SBram Moolenaar 48963be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 49063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 49163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 49263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 49363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 49463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 49563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 49663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 49763be3d4bSBram Moolenaar 4988a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 4998a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 5008a7d6542SBram Moolenaar 5019b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 5029af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5039af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 5049af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5059af78769SBram Moolenaar '[a] = []'], 'E1093:') 5069af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5079af78769SBram Moolenaar 'let y: number', 5089af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 5099af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5109af78769SBram Moolenaar 'let y: number', 5119af78769SBram Moolenaar 'let z: list<number>', 5129af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5139be61bbbSBram Moolenaar 514e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 515c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5169be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 517c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5189be61bbbSBram Moolenaar 519e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 520c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5219be61bbbSBram Moolenaar 522434d72cbSBram Moolenaar if has('dnd') 52365821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 524434d72cbSBram Moolenaar else 525434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 526434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 527434d72cbSBram Moolenaar endif 5289be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 52965821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 530c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5319be61bbbSBram Moolenaar 532e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 533e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 534e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 535e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5369be61bbbSBram Moolenaar 5379be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5389be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5399be61bbbSBram Moolenaar 540822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 54133fa29cfSBram Moolenaar 5428a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5438a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5448a7d6542SBram Moolenaar 5458a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5468a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5478a7d6542SBram Moolenaar 5488a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5498a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 55042a480bfSBram Moolenaar 551d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 55242a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 553cab27678SBram Moolenaar 554cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 555cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 55643e969d3SBram Moolenaar 55743e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 55843e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 55943e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 56043e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 56143e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 56243e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 56343e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 56443e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 565d72c1bf0SBram Moolenaarenddef 566d72c1bf0SBram Moolenaar 567d72c1bf0SBram Moolenaardef Test_unlet() 568d72c1bf0SBram Moolenaar g:somevar = 'yes' 569d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 570d72c1bf0SBram Moolenaar unlet g:somevar 571d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 572d72c1bf0SBram Moolenaar unlet! g:somevar 573d72c1bf0SBram Moolenaar 574d72c1bf0SBram Moolenaar call CheckScriptFailure([ 575d72c1bf0SBram Moolenaar 'vim9script', 576d72c1bf0SBram Moolenaar 'let svar = 123', 577d72c1bf0SBram Moolenaar 'unlet svar', 578d72c1bf0SBram Moolenaar ], 'E1081:') 579d72c1bf0SBram Moolenaar call CheckScriptFailure([ 580d72c1bf0SBram Moolenaar 'vim9script', 581d72c1bf0SBram Moolenaar 'let svar = 123', 582d72c1bf0SBram Moolenaar 'unlet s:svar', 583d72c1bf0SBram Moolenaar ], 'E1081:') 584d72c1bf0SBram Moolenaar call CheckScriptFailure([ 585d72c1bf0SBram Moolenaar 'vim9script', 586d72c1bf0SBram Moolenaar 'let svar = 123', 587d72c1bf0SBram Moolenaar 'def Func()', 588d72c1bf0SBram Moolenaar ' unlet svar', 589d72c1bf0SBram Moolenaar 'enddef', 590822ba247SBram Moolenaar 'defcompile', 591d72c1bf0SBram Moolenaar ], 'E1081:') 592d72c1bf0SBram Moolenaar call CheckScriptFailure([ 593d72c1bf0SBram Moolenaar 'vim9script', 594d72c1bf0SBram Moolenaar 'let svar = 123', 595d72c1bf0SBram Moolenaar 'def Func()', 596d72c1bf0SBram Moolenaar ' unlet s:svar', 597d72c1bf0SBram Moolenaar 'enddef', 598822ba247SBram Moolenaar 'defcompile', 599d72c1bf0SBram Moolenaar ], 'E1081:') 6007bdaea6eSBram Moolenaar 6017bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6027bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6037bdaea6eSBram Moolenaar unlet $ENVVAR 6047bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 605d72c1bf0SBram Moolenaarenddef 606599c89c8SBram Moolenaar 6074c17ad94SBram Moolenaardef Test_delfunction() 608f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6094c17ad94SBram Moolenaar CheckScriptSuccess([ 6104c17ad94SBram Moolenaar 'vim9script', 6114c17ad94SBram Moolenaar 'func CheckMe()', 6124c17ad94SBram Moolenaar ' return 123', 6134c17ad94SBram Moolenaar 'endfunc', 6144c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6154c17ad94SBram Moolenaar ]) 6164c17ad94SBram Moolenaar 617f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6184c17ad94SBram Moolenaar CheckScriptFailure([ 6194c17ad94SBram Moolenaar 'vim9script', 6204c17ad94SBram Moolenaar 'func DeleteMe1()', 6214c17ad94SBram Moolenaar 'endfunc', 6224c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6234c17ad94SBram Moolenaar ], 'E1084:') 6244c17ad94SBram Moolenaar CheckScriptFailure([ 6254c17ad94SBram Moolenaar 'vim9script', 6264c17ad94SBram Moolenaar 'func DeleteMe2()', 6274c17ad94SBram Moolenaar 'endfunc', 6284c17ad94SBram Moolenaar 'def DoThat()', 6294c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6304c17ad94SBram Moolenaar 'enddef', 6314c17ad94SBram Moolenaar 'DoThat()', 6324c17ad94SBram Moolenaar ], 'E1084:') 6334c17ad94SBram Moolenaar CheckScriptFailure([ 6344c17ad94SBram Moolenaar 'vim9script', 6354c17ad94SBram Moolenaar 'def DeleteMe3()', 6364c17ad94SBram Moolenaar 'enddef', 6374c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6384c17ad94SBram Moolenaar ], 'E1084:') 6394c17ad94SBram Moolenaar CheckScriptFailure([ 6404c17ad94SBram Moolenaar 'vim9script', 6414c17ad94SBram Moolenaar 'def DeleteMe4()', 6424c17ad94SBram Moolenaar 'enddef', 6434c17ad94SBram Moolenaar 'def DoThat()', 6444c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6454c17ad94SBram Moolenaar 'enddef', 6464c17ad94SBram Moolenaar 'DoThat()', 6474c17ad94SBram Moolenaar ], 'E1084:') 648925e9fd6SBram Moolenaar 649925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 650925e9fd6SBram Moolenaar let lines =<< trim END 651925e9fd6SBram Moolenaar vim9script 652925e9fd6SBram Moolenaar def g:Global(): string 653925e9fd6SBram Moolenaar return "yes" 654925e9fd6SBram Moolenaar enddef 655925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 656925e9fd6SBram Moolenaar def! g:Global(): string 657925e9fd6SBram Moolenaar return "no" 658925e9fd6SBram Moolenaar enddef 659925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 660925e9fd6SBram Moolenaar delfunc g:Global 661925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 662925e9fd6SBram Moolenaar END 663925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 664925e9fd6SBram Moolenaar 665925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 666925e9fd6SBram Moolenaar lines =<< trim END 667925e9fd6SBram Moolenaar vim9script 668925e9fd6SBram Moolenaar func g:Global() 669925e9fd6SBram Moolenaar return "yes" 670925e9fd6SBram Moolenaar endfunc 671925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 672925e9fd6SBram Moolenaar def! g:Global(): string 673925e9fd6SBram Moolenaar return "no" 674925e9fd6SBram Moolenaar enddef 675925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 676925e9fd6SBram Moolenaar delfunc g:Global 677925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 678925e9fd6SBram Moolenaar END 679925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 680925e9fd6SBram Moolenaar 681925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 682925e9fd6SBram Moolenaar lines =<< trim END 683925e9fd6SBram Moolenaar vim9script 684925e9fd6SBram Moolenaar def g:Global(): string 685925e9fd6SBram Moolenaar return "yes" 686925e9fd6SBram Moolenaar enddef 687925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 688925e9fd6SBram Moolenaar func! g:Global() 689925e9fd6SBram Moolenaar return "no" 690925e9fd6SBram Moolenaar endfunc 691925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 692925e9fd6SBram Moolenaar delfunc g:Global 693925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 694925e9fd6SBram Moolenaar END 695925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6964c17ad94SBram Moolenaarenddef 6974c17ad94SBram Moolenaar 698599c89c8SBram Moolenaarfunc Test_wrong_type() 699599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 700599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 701599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 702599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 703599c89c8SBram Moolenaar 704599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 705599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 70642a480bfSBram Moolenaar 70742a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 70842a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 70942a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 71042a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 71142a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 71242a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 71342a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 71442a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 71542a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 71642a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 71742a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 718a0a9f43aSBram Moolenaar 719a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 720a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7218a7d6542SBram Moolenaarendfunc 7228a7d6542SBram Moolenaar 7238a7d6542SBram Moolenaarfunc Test_const() 7248a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7258a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7268a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7279be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7288a7d6542SBram Moolenaarendfunc 7298a7d6542SBram Moolenaar 730df069eecSBram Moolenaardef Test_range_no_colon() 731df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 732df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 733df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 734df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 735df069eecSBram Moolenaarenddef 736df069eecSBram Moolenaar 737df069eecSBram Moolenaar 7388a7d6542SBram Moolenaardef Test_block() 7398a7d6542SBram Moolenaar let outer = 1 7408a7d6542SBram Moolenaar { 7418a7d6542SBram Moolenaar let inner = 2 7428a7d6542SBram Moolenaar assert_equal(1, outer) 7438a7d6542SBram Moolenaar assert_equal(2, inner) 7448a7d6542SBram Moolenaar } 7458a7d6542SBram Moolenaar assert_equal(1, outer) 7468a7d6542SBram Moolenaarenddef 7478a7d6542SBram Moolenaar 7488a7d6542SBram Moolenaarfunc Test_block_failure() 7498a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 750585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 751585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7528a7d6542SBram Moolenaarendfunc 7538a7d6542SBram Moolenaar 754585fea7bSBram Moolenaardef Test_cmd_modifier() 755585fea7bSBram Moolenaar tab echo '0' 756585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 757585fea7bSBram Moolenaarenddef 758585fea7bSBram Moolenaar 759d032f34aSBram Moolenaarfunc g:NoSuchFunc() 760d032f34aSBram Moolenaar echo 'none' 761d032f34aSBram Moolenaarendfunc 762d032f34aSBram Moolenaar 7638a7d6542SBram Moolenaardef Test_try_catch() 7648a7d6542SBram Moolenaar let l = [] 7657a092245SBram Moolenaar try # comment 7668a7d6542SBram Moolenaar add(l, '1') 7678a7d6542SBram Moolenaar throw 'wrong' 7688a7d6542SBram Moolenaar add(l, '2') 7697a092245SBram Moolenaar catch # comment 7708a7d6542SBram Moolenaar add(l, v:exception) 7717a092245SBram Moolenaar finally # comment 7728a7d6542SBram Moolenaar add(l, '3') 7737a092245SBram Moolenaar endtry # comment 7748a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 77568d130c6SBram Moolenaar 776e859312eSBram Moolenaar l = [] 777e859312eSBram Moolenaar try 778e859312eSBram Moolenaar try 779e859312eSBram Moolenaar add(l, '1') 780e859312eSBram Moolenaar throw 'wrong' 781e859312eSBram Moolenaar add(l, '2') 782e859312eSBram Moolenaar catch /right/ 783e859312eSBram Moolenaar add(l, v:exception) 784e859312eSBram Moolenaar endtry 785e859312eSBram Moolenaar catch /wrong/ 786e859312eSBram Moolenaar add(l, 'caught') 787e859312eSBram Moolenaar finally 788e859312eSBram Moolenaar add(l, 'finally') 789e859312eSBram Moolenaar endtry 790e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 791e859312eSBram Moolenaar 79268d130c6SBram Moolenaar let n: number 79368d130c6SBram Moolenaar try 79468d130c6SBram Moolenaar n = l[3] 79568d130c6SBram Moolenaar catch /E684:/ 79668d130c6SBram Moolenaar n = 99 79768d130c6SBram Moolenaar endtry 79868d130c6SBram Moolenaar assert_equal(99, n) 79968d130c6SBram Moolenaar 80068d130c6SBram Moolenaar try 80168d130c6SBram Moolenaar n = g:astring[3] 80268d130c6SBram Moolenaar catch /E714:/ 80368d130c6SBram Moolenaar n = 77 80468d130c6SBram Moolenaar endtry 80568d130c6SBram Moolenaar assert_equal(77, n) 80668d130c6SBram Moolenaar 80768d130c6SBram Moolenaar try 80868d130c6SBram Moolenaar n = l[g:astring] 80968d130c6SBram Moolenaar catch /E39:/ 81068d130c6SBram Moolenaar n = 77 81168d130c6SBram Moolenaar endtry 81268d130c6SBram Moolenaar assert_equal(77, n) 81368d130c6SBram Moolenaar 81468d130c6SBram Moolenaar try 81568d130c6SBram Moolenaar n = s:does_not_exist 81668d130c6SBram Moolenaar catch /E121:/ 817f0b9f43cSBram Moolenaar n = 111 818f0b9f43cSBram Moolenaar endtry 819f0b9f43cSBram Moolenaar assert_equal(111, n) 820f0b9f43cSBram Moolenaar 821f0b9f43cSBram Moolenaar try 822f0b9f43cSBram Moolenaar n = g:does_not_exist 823f0b9f43cSBram Moolenaar catch /E121:/ 82468d130c6SBram Moolenaar n = 121 82568d130c6SBram Moolenaar endtry 82668d130c6SBram Moolenaar assert_equal(121, n) 82768d130c6SBram Moolenaar 82868d130c6SBram Moolenaar let d = #{one: 1} 82968d130c6SBram Moolenaar try 83068d130c6SBram Moolenaar n = d[g:astring] 83168d130c6SBram Moolenaar catch /E716:/ 83268d130c6SBram Moolenaar n = 222 83368d130c6SBram Moolenaar endtry 83468d130c6SBram Moolenaar assert_equal(222, n) 835f0b9f43cSBram Moolenaar 836f0b9f43cSBram Moolenaar try 837f0b9f43cSBram Moolenaar n = -g:astring 838f0b9f43cSBram Moolenaar catch /E39:/ 839f0b9f43cSBram Moolenaar n = 233 840f0b9f43cSBram Moolenaar endtry 841f0b9f43cSBram Moolenaar assert_equal(233, n) 842f0b9f43cSBram Moolenaar 843f0b9f43cSBram Moolenaar try 844f0b9f43cSBram Moolenaar n = +g:astring 845f0b9f43cSBram Moolenaar catch /E1030:/ 846f0b9f43cSBram Moolenaar n = 244 847f0b9f43cSBram Moolenaar endtry 848f0b9f43cSBram Moolenaar assert_equal(244, n) 849f0b9f43cSBram Moolenaar 850f0b9f43cSBram Moolenaar try 851f0b9f43cSBram Moolenaar n = +g:alist 852f0b9f43cSBram Moolenaar catch /E745:/ 853f0b9f43cSBram Moolenaar n = 255 854f0b9f43cSBram Moolenaar endtry 855f0b9f43cSBram Moolenaar assert_equal(255, n) 856f0b9f43cSBram Moolenaar 857f0b9f43cSBram Moolenaar let nd: dict<any> 858f0b9f43cSBram Moolenaar try 859f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 860f0b9f43cSBram Moolenaar catch /E1029:/ 861f0b9f43cSBram Moolenaar n = 266 862f0b9f43cSBram Moolenaar endtry 863f0b9f43cSBram Moolenaar assert_equal(266, n) 864f0b9f43cSBram Moolenaar 865f0b9f43cSBram Moolenaar try 866f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 867f0b9f43cSBram Moolenaar catch /E1093:/ 868f0b9f43cSBram Moolenaar n = 277 869f0b9f43cSBram Moolenaar endtry 870f0b9f43cSBram Moolenaar assert_equal(277, n) 871f0b9f43cSBram Moolenaar 872e859312eSBram Moolenaar try 873e859312eSBram Moolenaar &ts = g:astring 874e859312eSBram Moolenaar catch /E1029:/ 875e859312eSBram Moolenaar n = 288 876e859312eSBram Moolenaar endtry 877e859312eSBram Moolenaar assert_equal(288, n) 878e859312eSBram Moolenaar 879e859312eSBram Moolenaar try 880e859312eSBram Moolenaar &backspace = 'asdf' 881e859312eSBram Moolenaar catch /E474:/ 882e859312eSBram Moolenaar n = 299 883e859312eSBram Moolenaar endtry 884e859312eSBram Moolenaar assert_equal(299, n) 885e859312eSBram Moolenaar 886e859312eSBram Moolenaar l = [1] 887e859312eSBram Moolenaar try 888e859312eSBram Moolenaar l[3] = 3 889e859312eSBram Moolenaar catch /E684:/ 890e859312eSBram Moolenaar n = 300 891e859312eSBram Moolenaar endtry 892e859312eSBram Moolenaar assert_equal(300, n) 893e859312eSBram Moolenaar 894e859312eSBram Moolenaar try 895e859312eSBram Moolenaar unlet g:does_not_exist 896e859312eSBram Moolenaar catch /E108:/ 897e859312eSBram Moolenaar n = 322 898e859312eSBram Moolenaar endtry 899e859312eSBram Moolenaar assert_equal(322, n) 900e859312eSBram Moolenaar 901e859312eSBram Moolenaar try 902e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 903e859312eSBram Moolenaar catch /E721:/ 904e859312eSBram Moolenaar n = 333 905e859312eSBram Moolenaar endtry 906e859312eSBram Moolenaar assert_equal(333, n) 907e859312eSBram Moolenaar 908e859312eSBram Moolenaar try 909e859312eSBram Moolenaar l = DeletedFunc() 910e859312eSBram Moolenaar catch /E933:/ 911e859312eSBram Moolenaar n = 344 912e859312eSBram Moolenaar endtry 913e859312eSBram Moolenaar assert_equal(344, n) 914d032f34aSBram Moolenaar 915d032f34aSBram Moolenaar try 916d032f34aSBram Moolenaar echo len(v:true) 917d032f34aSBram Moolenaar catch /E701:/ 918d032f34aSBram Moolenaar n = 355 919d032f34aSBram Moolenaar endtry 920d032f34aSBram Moolenaar assert_equal(355, n) 921d032f34aSBram Moolenaar 922d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 923d032f34aSBram Moolenaar delfunc g:NoSuchFunc 924d032f34aSBram Moolenaar try 925d032f34aSBram Moolenaar echo P() 926d032f34aSBram Moolenaar catch /E117:/ 927d032f34aSBram Moolenaar n = 366 928d032f34aSBram Moolenaar endtry 929d032f34aSBram Moolenaar assert_equal(366, n) 930d032f34aSBram Moolenaar 931d032f34aSBram Moolenaar try 932d032f34aSBram Moolenaar echo g:NoSuchFunc() 933d032f34aSBram Moolenaar catch /E117:/ 934d032f34aSBram Moolenaar n = 377 935d032f34aSBram Moolenaar endtry 936d032f34aSBram Moolenaar assert_equal(377, n) 937d032f34aSBram Moolenaar 938d032f34aSBram Moolenaar try 939d032f34aSBram Moolenaar echo g:alist + 4 940d032f34aSBram Moolenaar catch /E745:/ 941d032f34aSBram Moolenaar n = 388 942d032f34aSBram Moolenaar endtry 943d032f34aSBram Moolenaar assert_equal(388, n) 944d032f34aSBram Moolenaar 945d032f34aSBram Moolenaar try 946d032f34aSBram Moolenaar echo 4 + g:alist 947d032f34aSBram Moolenaar catch /E745:/ 948d032f34aSBram Moolenaar n = 399 949d032f34aSBram Moolenaar endtry 950d032f34aSBram Moolenaar assert_equal(399, n) 951d032f34aSBram Moolenaar 952d032f34aSBram Moolenaar try 953d032f34aSBram Moolenaar echo g:alist.member 954d032f34aSBram Moolenaar catch /E715:/ 955d032f34aSBram Moolenaar n = 400 956d032f34aSBram Moolenaar endtry 957d032f34aSBram Moolenaar assert_equal(400, n) 958d032f34aSBram Moolenaar 959d032f34aSBram Moolenaar try 960d032f34aSBram Moolenaar echo d.member 961d032f34aSBram Moolenaar catch /E716:/ 962d032f34aSBram Moolenaar n = 411 963d032f34aSBram Moolenaar endtry 964d032f34aSBram Moolenaar assert_equal(411, n) 9658a7d6542SBram Moolenaarenddef 9668a7d6542SBram Moolenaar 967e859312eSBram Moolenaardef DeletedFunc(): list<any> 968e859312eSBram Moolenaar return ['delete me'] 969e859312eSBram Moolenaarenddef 970e859312eSBram Moolenaardefcompile 971e859312eSBram Moolenaardelfunc DeletedFunc 972e859312eSBram Moolenaar 973257cc5eeSBram Moolenaardef ThrowFromDef() 974a72cfb80SBram Moolenaar throw "getout" # comment 975257cc5eeSBram Moolenaarenddef 976257cc5eeSBram Moolenaar 977257cc5eeSBram Moolenaarfunc CatchInFunc() 978257cc5eeSBram Moolenaar try 979257cc5eeSBram Moolenaar call ThrowFromDef() 980257cc5eeSBram Moolenaar catch 981257cc5eeSBram Moolenaar let g:thrown_func = v:exception 982257cc5eeSBram Moolenaar endtry 983257cc5eeSBram Moolenaarendfunc 984257cc5eeSBram Moolenaar 985257cc5eeSBram Moolenaardef CatchInDef() 986257cc5eeSBram Moolenaar try 987257cc5eeSBram Moolenaar ThrowFromDef() 988257cc5eeSBram Moolenaar catch 989257cc5eeSBram Moolenaar g:thrown_def = v:exception 990257cc5eeSBram Moolenaar endtry 991257cc5eeSBram Moolenaarenddef 992257cc5eeSBram Moolenaar 993f575adffSBram Moolenaardef ReturnFinally(): string 994f575adffSBram Moolenaar try 995f575adffSBram Moolenaar return 'intry' 996f575adffSBram Moolenaar finally 997f575adffSBram Moolenaar g:in_finally = 'finally' 998f575adffSBram Moolenaar endtry 999f575adffSBram Moolenaar return 'end' 1000f575adffSBram Moolenaarenddef 1001f575adffSBram Moolenaar 1002257cc5eeSBram Moolenaardef Test_try_catch_nested() 1003257cc5eeSBram Moolenaar CatchInFunc() 1004257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1005257cc5eeSBram Moolenaar 1006257cc5eeSBram Moolenaar CatchInDef() 1007257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1008f575adffSBram Moolenaar 1009f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1010f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1011f575adffSBram Moolenaarenddef 1012f575adffSBram Moolenaar 1013f575adffSBram Moolenaardef Test_try_catch_match() 1014f575adffSBram Moolenaar let seq = 'a' 1015f575adffSBram Moolenaar try 1016f575adffSBram Moolenaar throw 'something' 1017f575adffSBram Moolenaar catch /nothing/ 1018f575adffSBram Moolenaar seq ..= 'x' 1019f575adffSBram Moolenaar catch /some/ 1020f575adffSBram Moolenaar seq ..= 'b' 1021f575adffSBram Moolenaar catch /asdf/ 1022f575adffSBram Moolenaar seq ..= 'x' 1023e8c4abbbSBram Moolenaar catch ?a\?sdf? 1024e8c4abbbSBram Moolenaar seq ..= 'y' 1025f575adffSBram Moolenaar finally 1026f575adffSBram Moolenaar seq ..= 'c' 1027f575adffSBram Moolenaar endtry 1028f575adffSBram Moolenaar assert_equal('abc', seq) 1029257cc5eeSBram Moolenaarenddef 1030257cc5eeSBram Moolenaar 1031e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1032e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1033e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1034e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1035585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1036585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1037585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1038585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1039585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1040585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1041585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1042585fea7bSBram Moolenaar 1043a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1044585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1045e8c4abbbSBram Moolenaarenddef 1046e8c4abbbSBram Moolenaar 1047006ad48bSBram Moolenaardef Test_throw_vimscript() 1048f5be8cdbSBram Moolenaar # only checks line continuation 1049006ad48bSBram Moolenaar let lines =<< trim END 1050006ad48bSBram Moolenaar vim9script 1051006ad48bSBram Moolenaar try 1052006ad48bSBram Moolenaar throw 'one' 1053006ad48bSBram Moolenaar .. 'two' 1054006ad48bSBram Moolenaar catch 1055006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1056006ad48bSBram Moolenaar endtry 1057006ad48bSBram Moolenaar END 1058006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1059006ad48bSBram Moolenaarenddef 1060006ad48bSBram Moolenaar 106137c83711SBram Moolenaardef Test_cexpr_vimscript() 1062f5be8cdbSBram Moolenaar # only checks line continuation 106337c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 106437c83711SBram Moolenaar let lines =<< trim END 106537c83711SBram Moolenaar vim9script 106637c83711SBram Moolenaar cexpr 'File' 106737c83711SBram Moolenaar .. ' someFile' .. 106837c83711SBram Moolenaar ' line 19' 106937c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 107037c83711SBram Moolenaar END 107137c83711SBram Moolenaar CheckScriptSuccess(lines) 107237c83711SBram Moolenaar set errorformat& 107337c83711SBram Moolenaarenddef 107437c83711SBram Moolenaar 1075b209750bSBram Moolenaardef Test_list_vimscript() 1076b209750bSBram Moolenaar # checks line continuation and comments 1077b209750bSBram Moolenaar let lines =<< trim END 1078b209750bSBram Moolenaar vim9script 1079b209750bSBram Moolenaar let mylist = [ 1080b209750bSBram Moolenaar 'one', 1081b209750bSBram Moolenaar # comment 1082b209750bSBram Moolenaar 'two', # empty line follows 1083b209750bSBram Moolenaar 1084b209750bSBram Moolenaar 'three', 1085b209750bSBram Moolenaar ] 1086b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1087b209750bSBram Moolenaar END 1088b209750bSBram Moolenaar CheckScriptSuccess(lines) 1089b209750bSBram Moolenaarenddef 1090b209750bSBram Moolenaar 10912a1381c3SBram Moolenaarif has('channel') 109240ee466cSBram Moolenaar let someJob = test_null_job() 109340ee466cSBram Moolenaar 109440ee466cSBram Moolenaar def FuncWithError() 109540ee466cSBram Moolenaar echomsg g:someJob 109640ee466cSBram Moolenaar enddef 109740ee466cSBram Moolenaar 109840ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 109940ee466cSBram Moolenaar try 110040ee466cSBram Moolenaar call FuncWithError() 110140ee466cSBram Moolenaar catch 110240ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 110340ee466cSBram Moolenaar endtry 110440ee466cSBram Moolenaar endfunc 11052a1381c3SBram Moolenaarendif 110640ee466cSBram Moolenaar 11078a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 11088a7d6542SBram Moolenaar vim9script 11098a7d6542SBram Moolenaar let name: string = 'bob' 11108a7d6542SBram Moolenaar def Concat(arg: string): string 11118a7d6542SBram Moolenaar return name .. arg 11128a7d6542SBram Moolenaar enddef 1113227a69deSBram Moolenaar g:result = Concat('bie') 1114227a69deSBram Moolenaar g:localname = name 11158a7d6542SBram Moolenaar 11168a7d6542SBram Moolenaar export const CONST = 1234 11178a7d6542SBram Moolenaar export let exported = 9876 11186e587dcbSBram Moolenaar export let exp_name = 'John' 11198a7d6542SBram Moolenaar export def Exported(): string 11208a7d6542SBram Moolenaar return 'Exported' 11218a7d6542SBram Moolenaar enddef 11228a7d6542SBram MoolenaarEND 11238a7d6542SBram Moolenaar 11245269bd2aSBram Moolenaardef Test_vim9_import_export() 11258a7d6542SBram Moolenaar let import_script_lines =<< trim END 11268a7d6542SBram Moolenaar vim9script 11278a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11288a7d6542SBram Moolenaar g:imported = exported 11296e587dcbSBram Moolenaar exported += 3 11306e587dcbSBram Moolenaar g:imported_added = exported 11318a7d6542SBram Moolenaar g:imported_func = Exported() 11326e587dcbSBram Moolenaar 113340f4f7a4SBram Moolenaar def GetExported(): string 113440f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 113540f4f7a4SBram Moolenaar return local_dict.ref() 113640f4f7a4SBram Moolenaar enddef 113740f4f7a4SBram Moolenaar g:funcref_result = GetExported() 113840f4f7a4SBram Moolenaar 11396e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11406e587dcbSBram Moolenaar g:imported_name = exp_name 11416e587dcbSBram Moolenaar exp_name ..= ' Doe' 11426e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11435381c7a1SBram Moolenaar g:imported_later = exported 11448a7d6542SBram Moolenaar END 11458a7d6542SBram Moolenaar 11468a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11478a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11488a7d6542SBram Moolenaar 11498a7d6542SBram Moolenaar source Ximport.vim 11508a7d6542SBram Moolenaar 11518a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11528a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11538a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11546e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11555381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11568a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 115740f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11586e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11596e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11608a7d6542SBram Moolenaar assert_false(exists('g:name')) 11618a7d6542SBram Moolenaar 11628a7d6542SBram Moolenaar unlet g:result 11638a7d6542SBram Moolenaar unlet g:localname 11648a7d6542SBram Moolenaar unlet g:imported 11656e587dcbSBram Moolenaar unlet g:imported_added 11665381c7a1SBram Moolenaar unlet g:imported_later 11678a7d6542SBram Moolenaar unlet g:imported_func 11686e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11698a7d6542SBram Moolenaar delete('Ximport.vim') 1170f2d5c240SBram Moolenaar 11711c991144SBram Moolenaar # similar, with line breaks 11721c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11731c991144SBram Moolenaar vim9script 11741c991144SBram Moolenaar import { 11751c991144SBram Moolenaar exported, 11761c991144SBram Moolenaar Exported, 11771c991144SBram Moolenaar } 11781c991144SBram Moolenaar from 11791c991144SBram Moolenaar './Xexport.vim' 11801c991144SBram Moolenaar g:imported = exported 11811c991144SBram Moolenaar exported += 5 11821c991144SBram Moolenaar g:imported_added = exported 11831c991144SBram Moolenaar g:imported_func = Exported() 11841c991144SBram Moolenaar END 11851c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11861c991144SBram Moolenaar source Ximport_lbr.vim 11871c991144SBram Moolenaar 11881c991144SBram Moolenaar assert_equal(9876, g:imported) 11891c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11901c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11911c991144SBram Moolenaar 11921c991144SBram Moolenaar # exported script not sourced again 11931c991144SBram Moolenaar assert_false(exists('g:result')) 11941c991144SBram Moolenaar unlet g:imported 11951c991144SBram Moolenaar unlet g:imported_added 11961c991144SBram Moolenaar unlet g:imported_func 11971c991144SBram Moolenaar delete('Ximport_lbr.vim') 11981c991144SBram Moolenaar 11991c991144SBram Moolenaar # import inside :def function 12005381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 12015381c7a1SBram Moolenaar vim9script 12025381c7a1SBram Moolenaar def ImportInDef() 12035381c7a1SBram Moolenaar import exported from './Xexport.vim' 12045381c7a1SBram Moolenaar g:imported = exported 12055381c7a1SBram Moolenaar exported += 7 12065381c7a1SBram Moolenaar g:imported_added = exported 12075381c7a1SBram Moolenaar enddef 12085381c7a1SBram Moolenaar ImportInDef() 12095381c7a1SBram Moolenaar END 12105381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 12115381c7a1SBram Moolenaar source Ximport2.vim 1212f5be8cdbSBram Moolenaar # TODO: this should be 9879 12135381c7a1SBram Moolenaar assert_equal(9876, g:imported) 12145381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 12155381c7a1SBram Moolenaar unlet g:imported 12165381c7a1SBram Moolenaar unlet g:imported_added 12175381c7a1SBram Moolenaar delete('Ximport2.vim') 12185381c7a1SBram Moolenaar 1219f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1220f2d5c240SBram Moolenaar vim9script 1221f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1222f2d5c240SBram Moolenaar def UseExport() 1223f2d5c240SBram Moolenaar g:imported = Export.exported 1224f2d5c240SBram Moolenaar enddef 1225f2d5c240SBram Moolenaar UseExport() 1226f2d5c240SBram Moolenaar END 1227f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1228f2d5c240SBram Moolenaar source Ximport.vim 12295381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1230f2d5c240SBram Moolenaar 1231599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1232599c89c8SBram Moolenaar vim9script 1233599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1234599c89c8SBram Moolenaar def Func() 1235599c89c8SBram Moolenaar let dummy = 1 1236599c89c8SBram Moolenaar let imported = Export + dummy 1237599c89c8SBram Moolenaar enddef 1238822ba247SBram Moolenaar defcompile 1239599c89c8SBram Moolenaar END 1240599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1241599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1242599c89c8SBram Moolenaar 1243599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1244599c89c8SBram Moolenaar vim9script 1245599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1246599c89c8SBram Moolenaar def Func() 1247599c89c8SBram Moolenaar let imported = Export . exported 1248599c89c8SBram Moolenaar enddef 1249822ba247SBram Moolenaar defcompile 1250599c89c8SBram Moolenaar END 1251599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1252599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1253599c89c8SBram Moolenaar 1254599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1255599c89c8SBram Moolenaar vim9script 1256599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1257599c89c8SBram Moolenaar def Func() 1258599c89c8SBram Moolenaar let imported = Export. 1259599c89c8SBram Moolenaar enddef 1260822ba247SBram Moolenaar defcompile 1261599c89c8SBram Moolenaar END 1262599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1263599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1264599c89c8SBram Moolenaar 12651c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12661c991144SBram Moolenaar vim9script 12671c991144SBram Moolenaar import * 12681c991144SBram Moolenaar as Export 12691c991144SBram Moolenaar from 12701c991144SBram Moolenaar './Xexport.vim' 12711c991144SBram Moolenaar def UseExport() 12721c991144SBram Moolenaar g:imported = Export.exported 12731c991144SBram Moolenaar enddef 12741c991144SBram Moolenaar UseExport() 12751c991144SBram Moolenaar END 12761c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12771c991144SBram Moolenaar source Ximport.vim 12781c991144SBram Moolenaar assert_equal(9883, g:imported) 12791c991144SBram Moolenaar 1280f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1281f2d5c240SBram Moolenaar vim9script 1282f2d5c240SBram Moolenaar import * from './Xexport.vim' 1283f2d5c240SBram Moolenaar END 1284f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1285f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1286f2d5c240SBram Moolenaar 1287f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1288fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1289fa29c8abSBram Moolenaar vim9script 1290fa29c8abSBram Moolenaar import name from './Xexport.vim' 1291fa29c8abSBram Moolenaar END 1292fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1293fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1294fa29c8abSBram Moolenaar 1295f5be8cdbSBram Moolenaar # try to import something that is already defined 12965269bd2aSBram Moolenaar let import_already_defined =<< trim END 12975269bd2aSBram Moolenaar vim9script 12985269bd2aSBram Moolenaar let exported = 'something' 12995269bd2aSBram Moolenaar import exported from './Xexport.vim' 13005269bd2aSBram Moolenaar END 13015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13025269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13035269bd2aSBram Moolenaar 1304f5be8cdbSBram Moolenaar # try to import something that is already defined 13055269bd2aSBram Moolenaar import_already_defined =<< trim END 13065269bd2aSBram Moolenaar vim9script 13075269bd2aSBram Moolenaar let exported = 'something' 13085269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13095269bd2aSBram Moolenaar END 13105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13115269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13125269bd2aSBram Moolenaar 1313f5be8cdbSBram Moolenaar # try to import something that is already defined 13145269bd2aSBram Moolenaar import_already_defined =<< trim END 13155269bd2aSBram Moolenaar vim9script 13165269bd2aSBram Moolenaar let exported = 'something' 13175269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13185269bd2aSBram Moolenaar END 13195269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13205269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13215269bd2aSBram Moolenaar 1322f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1323fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1324fa29c8abSBram Moolenaar vim9script 1325fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1326fa29c8abSBram Moolenaar END 1327fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1328fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1329fa29c8abSBram Moolenaar 1330fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1331fa29c8abSBram Moolenaar vim9script 1332fa29c8abSBram Moolenaar import name './Xexport.vim' 1333fa29c8abSBram Moolenaar END 1334fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1335fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1336fa29c8abSBram Moolenaar 1337fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1338fa29c8abSBram Moolenaar vim9script 1339fa29c8abSBram Moolenaar import name from Xexport.vim 1340fa29c8abSBram Moolenaar END 1341fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1342fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1343fa29c8abSBram Moolenaar 1344fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1345fa29c8abSBram Moolenaar vim9script 1346fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1347fa29c8abSBram Moolenaar END 1348fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1349fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1350fa29c8abSBram Moolenaar 1351fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1352fa29c8abSBram Moolenaar vim9script 1353fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1354fa29c8abSBram Moolenaar END 13555269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13565269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1357fa29c8abSBram Moolenaar 1358f2d5c240SBram Moolenaar delete('Ximport.vim') 13595269bd2aSBram Moolenaar delete('Ximport3.vim') 13608a7d6542SBram Moolenaar delete('Xexport.vim') 13618a7d6542SBram Moolenaar 1362f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1363750802b5SBram Moolenaar set cpo&vi 1364750802b5SBram Moolenaar let cpo_before = &cpo 1365750802b5SBram Moolenaar let lines =<< trim END 1366750802b5SBram Moolenaar vim9script 1367750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1368750802b5SBram Moolenaar END 1369750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1370750802b5SBram Moolenaar source Xvim9_script 1371750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1372750802b5SBram Moolenaar set cpo&vim 1373750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1374750802b5SBram Moolenaar delete('Xvim9_script') 1375750802b5SBram Moolenaarenddef 1376750802b5SBram Moolenaar 1377803af686SBram Moolenaarfunc g:Trigger() 1378803af686SBram Moolenaar source Ximport.vim 1379803af686SBram Moolenaar return "echo 'yes'\<CR>" 1380803af686SBram Moolenaarendfunc 1381803af686SBram Moolenaar 1382803af686SBram Moolenaardef Test_import_export_expr_map() 1383803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1384803af686SBram Moolenaar let export_lines =<< trim END 1385803af686SBram Moolenaar vim9script 1386803af686SBram Moolenaar export def That(): string 1387803af686SBram Moolenaar return 'yes' 1388803af686SBram Moolenaar enddef 1389803af686SBram Moolenaar END 1390803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1391803af686SBram Moolenaar 1392803af686SBram Moolenaar let import_lines =<< trim END 1393803af686SBram Moolenaar vim9script 1394803af686SBram Moolenaar import That from './Xexport_that.vim' 1395803af686SBram Moolenaar assert_equal('yes', That()) 1396803af686SBram Moolenaar END 1397803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1398803af686SBram Moolenaar 1399803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1400803af686SBram Moolenaar feedkeys('trigger', "xt") 1401803af686SBram Moolenaar 1402803af686SBram Moolenaar delete('Xexport.vim') 1403803af686SBram Moolenaar delete('Ximport.vim') 1404803af686SBram Moolenaar nunmap trigger 1405803af686SBram Moolenaarenddef 1406803af686SBram Moolenaar 14078e1986e3SBram Moolenaardef Test_import_in_filetype() 14088e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14098e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 14108e1986e3SBram Moolenaar let export_lines =<< trim END 14118e1986e3SBram Moolenaar vim9script 14128e1986e3SBram Moolenaar export let That = 'yes' 14138e1986e3SBram Moolenaar END 14148e1986e3SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_that.vim') 14158e1986e3SBram Moolenaar 14168e1986e3SBram Moolenaar let import_lines =<< trim END 14178e1986e3SBram Moolenaar vim9script 14188e1986e3SBram Moolenaar import That from './Xexport_that.vim' 14198e1986e3SBram Moolenaar assert_equal('yes', That) 14208e1986e3SBram Moolenaar g:did_load_mytpe = 1 14218e1986e3SBram Moolenaar END 14228e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14238e1986e3SBram Moolenaar 14248e1986e3SBram Moolenaar let save_rtp = &rtp 14258e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14268e1986e3SBram Moolenaar 14278e1986e3SBram Moolenaar filetype plugin on 14288e1986e3SBram Moolenaar copen 14298e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14308e1986e3SBram Moolenaar 14318e1986e3SBram Moolenaar quit! 14328e1986e3SBram Moolenaar delete('Xexport.vim') 14338e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14348e1986e3SBram Moolenaar &rtp = save_rtp 14358e1986e3SBram Moolenaarenddef 14368e1986e3SBram Moolenaar 1437750802b5SBram Moolenaardef Test_vim9script_fails() 14388a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14398a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1440750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 14419721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 14429b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1443750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1444750802b5SBram Moolenaar 1445c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1446c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1447c785b9a7SBram Moolenaar 1448750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1449a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 14508a7d6542SBram Moolenaarenddef 14518a7d6542SBram Moolenaar 1452f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1453101f4810SBram Moolenaar CheckRunVimInTerminal 1454101f4810SBram Moolenaar 14559bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1456c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14579bb3eb3eSBram Moolenaarendfunc 14589bb3eb3eSBram Moolenaar 1459c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1460101f4810SBram Moolenaar let export =<< trim END 1461101f4810SBram Moolenaar vim9script 1462101f4810SBram Moolenaar export def Foo(): number 1463101f4810SBram Moolenaar return 0 1464101f4810SBram Moolenaar enddef 1465101f4810SBram Moolenaar END 14669bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1467101f4810SBram Moolenaar 14689bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 14699bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14709bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1471101f4810SBram Moolenaar 14729bb3eb3eSBram Moolenaar delete('Xexport.vim') 14739bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14749bb3eb3eSBram Moolenaarenddef 1475101f4810SBram Moolenaar 14764c17ad94SBram Moolenaardef Test_vim9script_reload_import() 14778a7d6542SBram Moolenaar let lines =<< trim END 14788a7d6542SBram Moolenaar vim9script 14798a7d6542SBram Moolenaar const var = '' 14808a7d6542SBram Moolenaar let valone = 1234 14818a7d6542SBram Moolenaar def MyFunc(arg: string) 14828a7d6542SBram Moolenaar valone = 5678 14838a7d6542SBram Moolenaar enddef 14848a7d6542SBram Moolenaar END 14858a7d6542SBram Moolenaar let morelines =<< trim END 14868a7d6542SBram Moolenaar let valtwo = 222 14878a7d6542SBram Moolenaar export def GetValtwo(): number 14888a7d6542SBram Moolenaar return valtwo 14898a7d6542SBram Moolenaar enddef 14908a7d6542SBram Moolenaar END 149103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14928a7d6542SBram Moolenaar source Xreload.vim 14938a7d6542SBram Moolenaar source Xreload.vim 14948a7d6542SBram Moolenaar source Xreload.vim 14958a7d6542SBram Moolenaar 14968a7d6542SBram Moolenaar let testlines =<< trim END 14978a7d6542SBram Moolenaar vim9script 14988a7d6542SBram Moolenaar def TheFunc() 14998a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15008a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15018a7d6542SBram Moolenaar enddef 15028a7d6542SBram Moolenaar TheFunc() 15038a7d6542SBram Moolenaar END 15048a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15058a7d6542SBram Moolenaar source Ximport.vim 15068a7d6542SBram Moolenaar 1507f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1508f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15098a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15108a7d6542SBram Moolenaar source Ximport.vim 15118a7d6542SBram Moolenaar 1512f5be8cdbSBram Moolenaar # cannot declare a var twice 15138a7d6542SBram Moolenaar lines =<< trim END 15148a7d6542SBram Moolenaar vim9script 15158a7d6542SBram Moolenaar let valone = 1234 15168a7d6542SBram Moolenaar let valone = 5678 15178a7d6542SBram Moolenaar END 15188a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15198a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 15208a7d6542SBram Moolenaar 15218a7d6542SBram Moolenaar delete('Xreload.vim') 15228a7d6542SBram Moolenaar delete('Ximport.vim') 15238a7d6542SBram Moolenaarenddef 15248a7d6542SBram Moolenaar 1525fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1526fe465a01SBram Moolenaar" script-local name. 1527fe465a01SBram Moolenaardef Test_vim9script_funcref() 1528fe465a01SBram Moolenaar let sortlines =<< trim END 1529fe465a01SBram Moolenaar vim9script 1530fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1531bed36b93SBram Moolenaar return i2 - i1 1532fe465a01SBram Moolenaar enddef 1533fe465a01SBram Moolenaar 1534fe465a01SBram Moolenaar export def FastSort(): list<number> 1535fe465a01SBram Moolenaar return range(5)->sort(Compare) 1536fe465a01SBram Moolenaar enddef 1537fe465a01SBram Moolenaar END 1538fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1539fe465a01SBram Moolenaar 1540fe465a01SBram Moolenaar let lines =<< trim END 1541fe465a01SBram Moolenaar vim9script 1542fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1543fe465a01SBram Moolenaar def Test() 1544fe465a01SBram Moolenaar g:result = FastSort() 1545fe465a01SBram Moolenaar enddef 1546fe465a01SBram Moolenaar Test() 1547fe465a01SBram Moolenaar END 1548fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1549fe465a01SBram Moolenaar 1550fe465a01SBram Moolenaar source Xscript.vim 1551fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1552fe465a01SBram Moolenaar 1553fe465a01SBram Moolenaar unlet g:result 1554fe465a01SBram Moolenaar delete('Xsort.vim') 1555fe465a01SBram Moolenaar delete('Xscript.vim') 1556fe465a01SBram Moolenaarenddef 1557fe465a01SBram Moolenaar 1558c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1559c620c055SBram Moolenaar" script where FastFilter() is called from. 1560c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1561c620c055SBram Moolenaar let filterLines =<< trim END 1562c620c055SBram Moolenaar vim9script 1563c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1564c620c055SBram Moolenaar return idx % 2 == 1 1565c620c055SBram Moolenaar enddef 1566c620c055SBram Moolenaar export def FastFilter(): list<number> 1567c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1568c620c055SBram Moolenaar enddef 1569c620c055SBram Moolenaar END 1570c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1571c620c055SBram Moolenaar 1572c620c055SBram Moolenaar let lines =<< trim END 1573c620c055SBram Moolenaar vim9script 1574c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1575c620c055SBram Moolenaar def Test() 1576c620c055SBram Moolenaar let x: list<number> = FastFilter() 1577c620c055SBram Moolenaar enddef 1578c620c055SBram Moolenaar Test() 1579c620c055SBram Moolenaar END 1580c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1581c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1582c620c055SBram Moolenaar 1583c620c055SBram Moolenaar delete('Xfilter.vim') 1584c620c055SBram Moolenaar delete('Ximport.vim') 1585c620c055SBram Moolenaarenddef 1586c620c055SBram Moolenaar 15874c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 15884c17ad94SBram Moolenaar let first_lines =<< trim END 15894c17ad94SBram Moolenaar vim9script 15904c17ad94SBram Moolenaar def FuncYes(): string 15914c17ad94SBram Moolenaar return 'yes' 15924c17ad94SBram Moolenaar enddef 15934c17ad94SBram Moolenaar END 159403afdcf1SBram Moolenaar let withno_lines =<< trim END 15954c17ad94SBram Moolenaar def FuncNo(): string 15964c17ad94SBram Moolenaar return 'no' 15974c17ad94SBram Moolenaar enddef 15984c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15994c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 16004c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 160103afdcf1SBram Moolenaar enddef 160203afdcf1SBram Moolenaar END 160303afdcf1SBram Moolenaar let nono_lines =<< trim END 160403afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 160503afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 16064c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 16074c17ad94SBram Moolenaar enddef 16084c17ad94SBram Moolenaar END 16094c17ad94SBram Moolenaar 16104c17ad94SBram Moolenaar # FuncNo() is defined 161103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16124c17ad94SBram Moolenaar source Xreloaded.vim 16134c17ad94SBram Moolenaar g:DoCheck(true) 16144c17ad94SBram Moolenaar 16154c17ad94SBram Moolenaar # FuncNo() is not redefined 161603afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16174c17ad94SBram Moolenaar source Xreloaded.vim 161803afdcf1SBram Moolenaar g:DoCheck() 16194c17ad94SBram Moolenaar 16204c17ad94SBram Moolenaar # FuncNo() is back 162103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16224c17ad94SBram Moolenaar source Xreloaded.vim 162303afdcf1SBram Moolenaar g:DoCheck() 16244c17ad94SBram Moolenaar 16254c17ad94SBram Moolenaar delete('Xreloaded.vim') 16264c17ad94SBram Moolenaarenddef 16274c17ad94SBram Moolenaar 162889483d40SBram Moolenaardef Test_vim9script_reload_delvar() 162989483d40SBram Moolenaar # write the script with a script-local variable 163089483d40SBram Moolenaar let lines =<< trim END 163189483d40SBram Moolenaar vim9script 163289483d40SBram Moolenaar let var = 'string' 163389483d40SBram Moolenaar END 163489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 163589483d40SBram Moolenaar source XreloadVar.vim 163689483d40SBram Moolenaar 163789483d40SBram Moolenaar # now write the script using the same variable locally - works 163889483d40SBram Moolenaar lines =<< trim END 163989483d40SBram Moolenaar vim9script 164089483d40SBram Moolenaar def Func() 164189483d40SBram Moolenaar let var = 'string' 164289483d40SBram Moolenaar enddef 164389483d40SBram Moolenaar END 164489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 164589483d40SBram Moolenaar source XreloadVar.vim 164689483d40SBram Moolenaar 164789483d40SBram Moolenaar delete('XreloadVar.vim') 164889483d40SBram Moolenaarenddef 164989483d40SBram Moolenaar 16508a7d6542SBram Moolenaardef Test_import_absolute() 16518a7d6542SBram Moolenaar let import_lines = [ 1652e6085c53SBram Moolenaar 'vim9script', 1653e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1654e6085c53SBram Moolenaar 'def UseExported()', 1655e6085c53SBram Moolenaar ' g:imported_abs = exported', 1656e6085c53SBram Moolenaar ' exported = 8888', 1657e6085c53SBram Moolenaar ' g:imported_after = exported', 1658e6085c53SBram Moolenaar 'enddef', 1659e6085c53SBram Moolenaar 'UseExported()', 1660e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1661e6085c53SBram Moolenaar ] 16628a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16638a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16648a7d6542SBram Moolenaar 16658a7d6542SBram Moolenaar source Ximport_abs.vim 16668a7d6542SBram Moolenaar 16678a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16684e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1669675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1670675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1671675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1672675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1673675f716eSBram Moolenaar 'exported = 8888.*' .. 1674675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1675675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1676675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1677675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1678e6085c53SBram Moolenaar g:import_disassembled) 16798a7d6542SBram Moolenaar unlet g:imported_abs 16804e12a5dfSBram Moolenaar unlet g:import_disassembled 16818a7d6542SBram Moolenaar 16828a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16838a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16848a7d6542SBram Moolenaarenddef 16858a7d6542SBram Moolenaar 16868a7d6542SBram Moolenaardef Test_import_rtp() 16878a7d6542SBram Moolenaar let import_lines = [ 1688e6085c53SBram Moolenaar 'vim9script', 1689e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1690e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1691e6085c53SBram Moolenaar ] 16928a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16938a7d6542SBram Moolenaar mkdir('import') 16948a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16958a7d6542SBram Moolenaar 16968a7d6542SBram Moolenaar let save_rtp = &rtp 16978a7d6542SBram Moolenaar &rtp = getcwd() 16988a7d6542SBram Moolenaar source Ximport_rtp.vim 16998a7d6542SBram Moolenaar &rtp = save_rtp 17008a7d6542SBram Moolenaar 17018a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 17028a7d6542SBram Moolenaar unlet g:imported_rtp 17038a7d6542SBram Moolenaar 17048a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 170589483d40SBram Moolenaar delete('import', 'rf') 17068a7d6542SBram Moolenaarenddef 17078a7d6542SBram Moolenaar 170825e0f586SBram Moolenaardef Test_import_compile_error() 170925e0f586SBram Moolenaar let export_lines = [ 171025e0f586SBram Moolenaar 'vim9script', 171125e0f586SBram Moolenaar 'export def ExpFunc(): string', 171225e0f586SBram Moolenaar ' return notDefined', 171325e0f586SBram Moolenaar 'enddef', 171425e0f586SBram Moolenaar ] 171525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 171625e0f586SBram Moolenaar 171725e0f586SBram Moolenaar let import_lines = [ 171825e0f586SBram Moolenaar 'vim9script', 171925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 172025e0f586SBram Moolenaar 'def ImpFunc()', 172125e0f586SBram Moolenaar ' echo ExpFunc()', 172225e0f586SBram Moolenaar 'enddef', 172325e0f586SBram Moolenaar 'defcompile', 172425e0f586SBram Moolenaar ] 172525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 172625e0f586SBram Moolenaar 172725e0f586SBram Moolenaar try 172825e0f586SBram Moolenaar source Ximport.vim 172925e0f586SBram Moolenaar catch /E1001/ 1730f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 173125e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 173225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 173325e0f586SBram Moolenaar endtry 173425e0f586SBram Moolenaar 173525e0f586SBram Moolenaar delete('Xexported.vim') 173625e0f586SBram Moolenaar delete('Ximport.vim') 173725e0f586SBram Moolenaarenddef 173825e0f586SBram Moolenaar 1739eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1740eef2102eSBram Moolenaar let export_lines =<< trim END 1741eef2102eSBram Moolenaar vim9script 1742eef2102eSBram Moolenaar export def Func() 1743eef2102eSBram Moolenaar echo 'imported' 1744eef2102eSBram Moolenaar enddef 1745eef2102eSBram Moolenaar END 1746eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1747eef2102eSBram Moolenaar 1748eef2102eSBram Moolenaar let lines =<< trim END 1749eef2102eSBram Moolenaar vim9script 1750eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1751eef2102eSBram Moolenaar def Func() 1752eef2102eSBram Moolenaar echo 'local to function' 1753eef2102eSBram Moolenaar enddef 1754eef2102eSBram Moolenaar END 1755eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1756eef2102eSBram Moolenaar 1757eef2102eSBram Moolenaar lines =<< trim END 1758eef2102eSBram Moolenaar vim9script 1759eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1760eef2102eSBram Moolenaar def Outer() 1761eef2102eSBram Moolenaar def Func() 1762eef2102eSBram Moolenaar echo 'local to function' 1763eef2102eSBram Moolenaar enddef 1764eef2102eSBram Moolenaar enddef 1765eef2102eSBram Moolenaar defcompile 1766eef2102eSBram Moolenaar END 1767eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1768eef2102eSBram Moolenaar 1769eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1770eef2102eSBram Moolenaarenddef 1771eef2102eSBram Moolenaar 1772b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1773b9a2cac3SBram Moolenaar let lines =<< trim END 1774b9a2cac3SBram Moolenaar vim9script 1775b9a2cac3SBram Moolenaar def Func() 1776b9a2cac3SBram Moolenaar echo 'one' 1777b9a2cac3SBram Moolenaar enddef 1778b9a2cac3SBram Moolenaar def Func() 1779b9a2cac3SBram Moolenaar echo 'two' 1780b9a2cac3SBram Moolenaar enddef 1781b9a2cac3SBram Moolenaar END 1782b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1783*fa211f3cSBram Moolenaar 1784*fa211f3cSBram Moolenaar lines =<< trim END 1785*fa211f3cSBram Moolenaar vim9script 1786*fa211f3cSBram Moolenaar def Foo(): string 1787*fa211f3cSBram Moolenaar return 'foo' 1788*fa211f3cSBram Moolenaar enddef 1789*fa211f3cSBram Moolenaar def Func() 1790*fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1791*fa211f3cSBram Moolenaar enddef 1792*fa211f3cSBram Moolenaar defcompile 1793*fa211f3cSBram Moolenaar END 1794*fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1795b9a2cac3SBram Moolenaarenddef 1796b9a2cac3SBram Moolenaar 17978a7d6542SBram Moolenaardef Test_fixed_size_list() 1798f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 17998a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 18008a7d6542SBram Moolenaar l->remove(0) 18018a7d6542SBram Moolenaar l->add(5) 18028a7d6542SBram Moolenaar l->insert(99, 1) 18030f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18048a7d6542SBram Moolenaarenddef 18058a7d6542SBram Moolenaar 1806ae616494SBram Moolenaardef Test_no_insert_xit() 1807ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1808ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1809f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1810f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1811f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1812ae616494SBram Moolenaar 1813ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1814ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1815ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1816ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1817f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1818f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1819f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1820f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1821f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1822ae616494SBram Moolenaarenddef 1823ae616494SBram Moolenaar 1824158906cfSBram Moolenaardef IfElse(what: number): string 1825158906cfSBram Moolenaar let res = '' 1826158906cfSBram Moolenaar if what == 1 1827158906cfSBram Moolenaar res = "one" 1828158906cfSBram Moolenaar elseif what == 2 1829158906cfSBram Moolenaar res = "two" 1830a259d8d3SBram Moolenaar else 1831158906cfSBram Moolenaar res = "three" 1832a259d8d3SBram Moolenaar endif 1833158906cfSBram Moolenaar return res 1834a259d8d3SBram Moolenaarenddef 1835a259d8d3SBram Moolenaar 1836158906cfSBram Moolenaardef Test_if_elseif_else() 1837158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1838158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1839158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18400f18b6d1SBram Moolenaarenddef 18410f18b6d1SBram Moolenaar 1842e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1843e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1844e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1845e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1846e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1847585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1848e8c4abbbSBram Moolenaarenddef 1849e8c4abbbSBram Moolenaar 18506d69bf60SBram Moolenaarlet g:bool_true = v:true 18516d69bf60SBram Moolenaarlet g:bool_false = v:false 18526d69bf60SBram Moolenaar 18536d69bf60SBram Moolenaardef Test_if_const_expr() 18546d69bf60SBram Moolenaar let res = false 18556d69bf60SBram Moolenaar if true ? true : false 18566d69bf60SBram Moolenaar res = true 18576d69bf60SBram Moolenaar endif 18586d69bf60SBram Moolenaar assert_equal(true, res) 18596d69bf60SBram Moolenaar 1860585fea7bSBram Moolenaar g:glob = 2 1861585fea7bSBram Moolenaar if false 18626797966dSBram Moolenaar execute('g:glob = 3') 1863585fea7bSBram Moolenaar endif 1864585fea7bSBram Moolenaar assert_equal(2, g:glob) 1865585fea7bSBram Moolenaar if true 18666797966dSBram Moolenaar execute('g:glob = 3') 1867585fea7bSBram Moolenaar endif 1868585fea7bSBram Moolenaar assert_equal(3, g:glob) 1869585fea7bSBram Moolenaar 18706d69bf60SBram Moolenaar res = false 18716d69bf60SBram Moolenaar if g:bool_true ? true : false 18726d69bf60SBram Moolenaar res = true 18736d69bf60SBram Moolenaar endif 18746d69bf60SBram Moolenaar assert_equal(true, res) 18756d69bf60SBram Moolenaar 18766d69bf60SBram Moolenaar res = false 18776d69bf60SBram Moolenaar if true ? g:bool_true : false 18786d69bf60SBram Moolenaar res = true 18796d69bf60SBram Moolenaar endif 18806d69bf60SBram Moolenaar assert_equal(true, res) 18816d69bf60SBram Moolenaar 18826d69bf60SBram Moolenaar res = false 18836d69bf60SBram Moolenaar if true ? true : g:bool_false 18846d69bf60SBram Moolenaar res = true 18856d69bf60SBram Moolenaar endif 18866d69bf60SBram Moolenaar assert_equal(true, res) 18876d69bf60SBram Moolenaar 18886d69bf60SBram Moolenaar res = false 18896d69bf60SBram Moolenaar if true ? false : true 18906d69bf60SBram Moolenaar res = true 18916d69bf60SBram Moolenaar endif 18926d69bf60SBram Moolenaar assert_equal(false, res) 18936d69bf60SBram Moolenaar 18946d69bf60SBram Moolenaar res = false 18956d69bf60SBram Moolenaar if false ? false : true 18966d69bf60SBram Moolenaar res = true 18976d69bf60SBram Moolenaar endif 18986d69bf60SBram Moolenaar assert_equal(true, res) 18996d69bf60SBram Moolenaar 19006d69bf60SBram Moolenaar res = false 19016d69bf60SBram Moolenaar if false ? true : false 19026d69bf60SBram Moolenaar res = true 19036d69bf60SBram Moolenaar endif 19046d69bf60SBram Moolenaar assert_equal(false, res) 19056d69bf60SBram Moolenaar 19066d69bf60SBram Moolenaar res = false 1907e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1908e8c4abbbSBram Moolenaar res = true 1909e8c4abbbSBram Moolenaar endif 1910e8c4abbbSBram Moolenaar assert_equal(false, res) 1911e8c4abbbSBram Moolenaar 1912e8c4abbbSBram Moolenaar res = false 19136d69bf60SBram Moolenaar if true && true 19146d69bf60SBram Moolenaar res = true 19156d69bf60SBram Moolenaar endif 19166d69bf60SBram Moolenaar assert_equal(true, res) 19176d69bf60SBram Moolenaar 19186d69bf60SBram Moolenaar res = false 19196d69bf60SBram Moolenaar if true && false 19206d69bf60SBram Moolenaar res = true 19216d69bf60SBram Moolenaar endif 19226d69bf60SBram Moolenaar assert_equal(false, res) 19236d69bf60SBram Moolenaar 19246d69bf60SBram Moolenaar res = false 19256d69bf60SBram Moolenaar if g:bool_true && false 19266d69bf60SBram Moolenaar res = true 19276d69bf60SBram Moolenaar endif 19286d69bf60SBram Moolenaar assert_equal(false, res) 19296d69bf60SBram Moolenaar 19306d69bf60SBram Moolenaar res = false 19316d69bf60SBram Moolenaar if true && g:bool_false 19326d69bf60SBram Moolenaar res = true 19336d69bf60SBram Moolenaar endif 19346d69bf60SBram Moolenaar assert_equal(false, res) 19356d69bf60SBram Moolenaar 19366d69bf60SBram Moolenaar res = false 19376d69bf60SBram Moolenaar if false && false 19386d69bf60SBram Moolenaar res = true 19396d69bf60SBram Moolenaar endif 19406d69bf60SBram Moolenaar assert_equal(false, res) 19416d69bf60SBram Moolenaar 19426d69bf60SBram Moolenaar res = false 19436d69bf60SBram Moolenaar if true || false 19446d69bf60SBram Moolenaar res = true 19456d69bf60SBram Moolenaar endif 19466d69bf60SBram Moolenaar assert_equal(true, res) 19476d69bf60SBram Moolenaar 19486d69bf60SBram Moolenaar res = false 19496d69bf60SBram Moolenaar if g:bool_true || false 19506d69bf60SBram Moolenaar res = true 19516d69bf60SBram Moolenaar endif 19526d69bf60SBram Moolenaar assert_equal(true, res) 19536d69bf60SBram Moolenaar 19546d69bf60SBram Moolenaar res = false 19556d69bf60SBram Moolenaar if true || g:bool_false 19566d69bf60SBram Moolenaar res = true 19576d69bf60SBram Moolenaar endif 19586d69bf60SBram Moolenaar assert_equal(true, res) 19596d69bf60SBram Moolenaar 19606d69bf60SBram Moolenaar res = false 19616d69bf60SBram Moolenaar if false || false 19626d69bf60SBram Moolenaar res = true 19636d69bf60SBram Moolenaar endif 19646d69bf60SBram Moolenaar assert_equal(false, res) 196580c34ca3SBram Moolenaarenddef 19666d69bf60SBram Moolenaar 196780c34ca3SBram Moolenaardef Test_if_const_expr_fails() 196880c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 196980c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1970e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1971e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19726d69bf60SBram Moolenaarenddef 19736d69bf60SBram Moolenaar 197472abcf42SBram Moolenaardef RunNested(i: number): number 197572abcf42SBram Moolenaar let x: number = 0 197672abcf42SBram Moolenaar if i % 2 197772abcf42SBram Moolenaar if 1 1978f5be8cdbSBram Moolenaar # comment 197972abcf42SBram Moolenaar else 1980f5be8cdbSBram Moolenaar # comment 198172abcf42SBram Moolenaar endif 198272abcf42SBram Moolenaar x += 1 198372abcf42SBram Moolenaar else 198472abcf42SBram Moolenaar x += 1000 198572abcf42SBram Moolenaar endif 198672abcf42SBram Moolenaar return x 198772abcf42SBram Moolenaarenddef 198872abcf42SBram Moolenaar 198972abcf42SBram Moolenaardef Test_nested_if() 199072abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 199172abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 199272abcf42SBram Moolenaarenddef 199372abcf42SBram Moolenaar 1994ad39c094SBram Moolenaardef Test_execute_cmd() 1995ad39c094SBram Moolenaar new 1996ad39c094SBram Moolenaar setline(1, 'default') 1997ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1998ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1999a72cfb80SBram Moolenaar 2000a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 2001a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2002a72cfb80SBram Moolenaar 2003ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 2004ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2005a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2006ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2007a72cfb80SBram Moolenaar 2008ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 2009ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2010a72cfb80SBram Moolenaar 2011ad39c094SBram Moolenaar let cmd_first = 'call ' 2012ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2013ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2014ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2015ad39c094SBram Moolenaar bwipe! 2016585fea7bSBram Moolenaar 20172d6b20d6SBram Moolenaar let n = true 20182d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20192d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20202d6b20d6SBram Moolenaar 2021585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 2022a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 2023ad39c094SBram Moolenaarenddef 2024ad39c094SBram Moolenaar 202547e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2026f5be8cdbSBram Moolenaar # only checks line continuation 202747e880d6SBram Moolenaar let lines =<< trim END 202847e880d6SBram Moolenaar vim9script 202947e880d6SBram Moolenaar execute 'g:someVar' 203047e880d6SBram Moolenaar .. ' = ' .. 203147e880d6SBram Moolenaar '28' 203247e880d6SBram Moolenaar assert_equal(28, g:someVar) 203347e880d6SBram Moolenaar unlet g:someVar 203447e880d6SBram Moolenaar END 203547e880d6SBram Moolenaar CheckScriptSuccess(lines) 203647e880d6SBram Moolenaarenddef 203747e880d6SBram Moolenaar 2038ad39c094SBram Moolenaardef Test_echo_cmd() 2039a72cfb80SBram Moolenaar echo 'some' # comment 2040585fea7bSBram Moolenaar echon 'thing' 2041ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2042ad39c094SBram Moolenaar 2043a72cfb80SBram Moolenaar echo "some" # comment 2044a72cfb80SBram Moolenaar echon "thing" 2045a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2046a72cfb80SBram Moolenaar 2047ad39c094SBram Moolenaar let str1 = 'some' 2048ad39c094SBram Moolenaar let str2 = 'more' 2049ad39c094SBram Moolenaar echo str1 str2 2050ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2051a72cfb80SBram Moolenaar 2052a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2053ad39c094SBram Moolenaarenddef 2054ad39c094SBram Moolenaar 2055f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2056f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2057f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2058f93c7feaSBram Moolenaar echo 'clear' 2059df069eecSBram Moolenaar :1messages 2060f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2061f93c7feaSBram Moolenaar 2062f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2063f93c7feaSBram Moolenaarenddef 2064f93c7feaSBram Moolenaar 206547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2066f5be8cdbSBram Moolenaar # only checks line continuation 206747e880d6SBram Moolenaar let lines =<< trim END 206847e880d6SBram Moolenaar vim9script 206947e880d6SBram Moolenaar echomsg 'here' 207047e880d6SBram Moolenaar .. ' is ' .. 207147e880d6SBram Moolenaar 'a message' 207247e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 207347e880d6SBram Moolenaar END 207447e880d6SBram Moolenaar CheckScriptSuccess(lines) 207547e880d6SBram Moolenaarenddef 207647e880d6SBram Moolenaar 2077f93c7feaSBram Moolenaardef Test_echoerr_cmd() 207840ee466cSBram Moolenaar try 207940ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 208040ee466cSBram Moolenaar catch 208140ee466cSBram Moolenaar assert_match('something wrong', v:exception) 208240ee466cSBram Moolenaar endtry 2083f93c7feaSBram Moolenaarenddef 2084f93c7feaSBram Moolenaar 208547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2086f5be8cdbSBram Moolenaar # only checks line continuation 208747e880d6SBram Moolenaar let lines =<< trim END 208847e880d6SBram Moolenaar vim9script 208947e880d6SBram Moolenaar try 209047e880d6SBram Moolenaar echoerr 'this' 209147e880d6SBram Moolenaar .. ' is ' .. 209247e880d6SBram Moolenaar 'wrong' 209347e880d6SBram Moolenaar catch 209447e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 209547e880d6SBram Moolenaar endtry 209647e880d6SBram Moolenaar END 209747e880d6SBram Moolenaar CheckScriptSuccess(lines) 209847e880d6SBram Moolenaarenddef 209947e880d6SBram Moolenaar 210041fe0617SBram Moolenaardef Test_for_outside_of_function() 210141fe0617SBram Moolenaar let lines =<< trim END 210241fe0617SBram Moolenaar vim9script 210341fe0617SBram Moolenaar new 210441fe0617SBram Moolenaar for var in range(0, 3) 210541fe0617SBram Moolenaar append(line('$'), var) 210641fe0617SBram Moolenaar endfor 210741fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 210841fe0617SBram Moolenaar bwipe! 210941fe0617SBram Moolenaar END 211041fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 211141fe0617SBram Moolenaar source Xvim9for.vim 211241fe0617SBram Moolenaar delete('Xvim9for.vim') 211341fe0617SBram Moolenaarenddef 21148a7d6542SBram Moolenaar 2115e8c4abbbSBram Moolenaardef Test_for_loop() 2116e8c4abbbSBram Moolenaar let result = '' 2117e8c4abbbSBram Moolenaar for cnt in range(7) 2118e8c4abbbSBram Moolenaar if cnt == 4 2119e8c4abbbSBram Moolenaar break 2120e8c4abbbSBram Moolenaar endif 2121e8c4abbbSBram Moolenaar if cnt == 2 2122e8c4abbbSBram Moolenaar continue 2123e8c4abbbSBram Moolenaar endif 2124e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2125e8c4abbbSBram Moolenaar endfor 2126e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21270ad3e894SBram Moolenaar 21280ad3e894SBram Moolenaar let concat = '' 21290ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21300ad3e894SBram Moolenaar concat ..= str 21310ad3e894SBram Moolenaar endfor 21320ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2133e8c4abbbSBram Moolenaarenddef 2134e8c4abbbSBram Moolenaar 2135e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2136675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2137675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2138675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2139822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21400ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2141675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2142675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2143675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2144e8c4abbbSBram Moolenaarenddef 2145e8c4abbbSBram Moolenaar 2146d0df1aacSBram Moolenaardef Test_while_loop() 2147d0df1aacSBram Moolenaar let result = '' 2148d0df1aacSBram Moolenaar let cnt = 0 2149d0df1aacSBram Moolenaar while cnt < 555 2150d0df1aacSBram Moolenaar if cnt == 3 2151d0df1aacSBram Moolenaar break 2152d0df1aacSBram Moolenaar endif 2153d0df1aacSBram Moolenaar cnt += 1 2154d0df1aacSBram Moolenaar if cnt == 2 2155d0df1aacSBram Moolenaar continue 2156d0df1aacSBram Moolenaar endif 2157d0df1aacSBram Moolenaar result ..= cnt .. '_' 2158d0df1aacSBram Moolenaar endwhile 2159d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2160d0df1aacSBram Moolenaarenddef 2161d0df1aacSBram Moolenaar 2162e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2163675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2164675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2165675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2166675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2167675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2168675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2169675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2170bd5da371SBram Moolenaarenddef 2171bd5da371SBram Moolenaar 21729645e2d9SBram Moolenaardef Test_interrupt_loop() 217397acfc78SBram Moolenaar let caught = false 21749645e2d9SBram Moolenaar let x = 0 217597acfc78SBram Moolenaar try 21769645e2d9SBram Moolenaar while 1 21779645e2d9SBram Moolenaar x += 1 21789645e2d9SBram Moolenaar if x == 100 21799645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 21809645e2d9SBram Moolenaar endif 21819645e2d9SBram Moolenaar endwhile 218297acfc78SBram Moolenaar catch 218397acfc78SBram Moolenaar caught = true 218497acfc78SBram Moolenaar assert_equal(100, x) 218597acfc78SBram Moolenaar endtry 218697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 21879645e2d9SBram Moolenaarenddef 218820431c9dSBram Moolenaar 21894fdae999SBram Moolenaardef Test_automatic_line_continuation() 21904fdae999SBram Moolenaar let mylist = [ 21914fdae999SBram Moolenaar 'one', 21924fdae999SBram Moolenaar 'two', 21934fdae999SBram Moolenaar 'three', 2194f5be8cdbSBram Moolenaar ] # comment 21954fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 21964fdae999SBram Moolenaar 21974fdae999SBram Moolenaar let mydict = { 21984fdae999SBram Moolenaar 'one': 1, 21994fdae999SBram Moolenaar 'two': 2, 22004fdae999SBram Moolenaar 'three': 22014fdae999SBram Moolenaar 3, 2202f5be8cdbSBram Moolenaar } # comment 22034fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 22044fdae999SBram Moolenaar mydict = #{ 22052c330432SBram Moolenaar one: 1, # comment 22062c330432SBram Moolenaar two: # comment 22072c330432SBram Moolenaar 2, # comment 22082c330432SBram Moolenaar three: 3 # comment 22092c330432SBram Moolenaar } 22102c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 22112c330432SBram Moolenaar mydict = #{ 22122c330432SBram Moolenaar one: 1, 22134fdae999SBram Moolenaar two: 22144fdae999SBram Moolenaar 2, 22152c330432SBram Moolenaar three: 3 22164fdae999SBram Moolenaar } 22174fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2218e6085c53SBram Moolenaar 2219e6085c53SBram Moolenaar assert_equal( 2220e6085c53SBram Moolenaar ['one', 'two', 'three'], 2221e6085c53SBram Moolenaar split('one two three') 2222e6085c53SBram Moolenaar ) 22234fdae999SBram Moolenaarenddef 22244fdae999SBram Moolenaar 22257a092245SBram Moolenaardef Test_vim9_comment() 22267a092245SBram Moolenaar CheckScriptSuccess([ 22277a092245SBram Moolenaar 'vim9script', 22287a092245SBram Moolenaar '# something', 22297a092245SBram Moolenaar ]) 22307a092245SBram Moolenaar CheckScriptFailure([ 22317a092245SBram Moolenaar 'vim9script', 22327a092245SBram Moolenaar ':# something', 22337a092245SBram Moolenaar ], 'E488:') 22347a092245SBram Moolenaar CheckScriptFailure([ 22357a092245SBram Moolenaar '# something', 22367a092245SBram Moolenaar ], 'E488:') 22377a092245SBram Moolenaar CheckScriptFailure([ 22387a092245SBram Moolenaar ':# something', 22397a092245SBram Moolenaar ], 'E488:') 22407a092245SBram Moolenaar 22414a8d9f2eSBram Moolenaar { # block start 22424a8d9f2eSBram Moolenaar } # block end 22434a8d9f2eSBram Moolenaar CheckDefFailure([ 22444a8d9f2eSBram Moolenaar '{# comment', 22454a8d9f2eSBram Moolenaar ], 'E488:') 22464a8d9f2eSBram Moolenaar CheckDefFailure([ 22474a8d9f2eSBram Moolenaar '{', 22484a8d9f2eSBram Moolenaar '}# comment', 22494a8d9f2eSBram Moolenaar ], 'E488:') 22504a8d9f2eSBram Moolenaar 22514a8d9f2eSBram Moolenaar echo "yes" # comment 22524a8d9f2eSBram Moolenaar CheckDefFailure([ 22534a8d9f2eSBram Moolenaar 'echo "yes"# comment', 22544a8d9f2eSBram Moolenaar ], 'E488:') 22557a092245SBram Moolenaar CheckScriptSuccess([ 22567a092245SBram Moolenaar 'vim9script', 22577a092245SBram Moolenaar 'echo "yes" # something', 22587a092245SBram Moolenaar ]) 22597a092245SBram Moolenaar CheckScriptFailure([ 22607a092245SBram Moolenaar 'vim9script', 22617a092245SBram Moolenaar 'echo "yes"# something', 22627a092245SBram Moolenaar ], 'E121:') 22637a092245SBram Moolenaar CheckScriptFailure([ 22647a092245SBram Moolenaar 'vim9script', 22657a092245SBram Moolenaar 'echo# something', 22667a092245SBram Moolenaar ], 'E121:') 22677a092245SBram Moolenaar CheckScriptFailure([ 22687a092245SBram Moolenaar 'echo "yes" # something', 22697a092245SBram Moolenaar ], 'E121:') 22707a092245SBram Moolenaar 22714a8d9f2eSBram Moolenaar exe "echo" # comment 22724a8d9f2eSBram Moolenaar CheckDefFailure([ 22734a8d9f2eSBram Moolenaar 'exe "echo"# comment', 22744a8d9f2eSBram Moolenaar ], 'E488:') 22754a8d9f2eSBram Moolenaar CheckScriptSuccess([ 22764a8d9f2eSBram Moolenaar 'vim9script', 22774a8d9f2eSBram Moolenaar 'exe "echo" # something', 22784a8d9f2eSBram Moolenaar ]) 22794a8d9f2eSBram Moolenaar CheckScriptFailure([ 22804a8d9f2eSBram Moolenaar 'vim9script', 22814a8d9f2eSBram Moolenaar 'exe "echo"# something', 22824a8d9f2eSBram Moolenaar ], 'E121:') 22834a8d9f2eSBram Moolenaar CheckDefFailure([ 22844a8d9f2eSBram Moolenaar 'exe # comment', 22854a8d9f2eSBram Moolenaar ], 'E1015:') 22864a8d9f2eSBram Moolenaar CheckScriptFailure([ 22874a8d9f2eSBram Moolenaar 'vim9script', 22884a8d9f2eSBram Moolenaar 'exe# something', 22894a8d9f2eSBram Moolenaar ], 'E121:') 22904a8d9f2eSBram Moolenaar CheckScriptFailure([ 22914a8d9f2eSBram Moolenaar 'exe "echo" # something', 22924a8d9f2eSBram Moolenaar ], 'E121:') 22934a8d9f2eSBram Moolenaar 22947a092245SBram Moolenaar CheckDefFailure([ 22957a092245SBram Moolenaar 'try# comment', 22967a092245SBram Moolenaar ' echo "yes"', 22977a092245SBram Moolenaar 'catch', 22987a092245SBram Moolenaar 'endtry', 22997a092245SBram Moolenaar ], 'E488:') 23002c5ed4e3SBram Moolenaar CheckScriptFailure([ 23012c5ed4e3SBram Moolenaar 'vim9script', 23022c5ed4e3SBram Moolenaar 'try# comment', 23032c5ed4e3SBram Moolenaar 'echo "yes"', 23042c5ed4e3SBram Moolenaar ], 'E488:') 23057a092245SBram Moolenaar CheckDefFailure([ 23067a092245SBram Moolenaar 'try', 2307a72cfb80SBram Moolenaar ' throw#comment', 2308a72cfb80SBram Moolenaar 'catch', 2309a72cfb80SBram Moolenaar 'endtry', 2310a72cfb80SBram Moolenaar ], 'E1015:') 2311a72cfb80SBram Moolenaar CheckDefFailure([ 2312a72cfb80SBram Moolenaar 'try', 2313a72cfb80SBram Moolenaar ' throw "yes"#comment', 2314a72cfb80SBram Moolenaar 'catch', 2315a72cfb80SBram Moolenaar 'endtry', 2316a72cfb80SBram Moolenaar ], 'E488:') 2317a72cfb80SBram Moolenaar CheckDefFailure([ 2318a72cfb80SBram Moolenaar 'try', 23197a092245SBram Moolenaar ' echo "yes"', 23207a092245SBram Moolenaar 'catch# comment', 23217a092245SBram Moolenaar 'endtry', 23227a092245SBram Moolenaar ], 'E488:') 23232c5ed4e3SBram Moolenaar CheckScriptFailure([ 23242c5ed4e3SBram Moolenaar 'vim9script', 23252c5ed4e3SBram Moolenaar 'try', 23262c5ed4e3SBram Moolenaar ' echo "yes"', 23272c5ed4e3SBram Moolenaar 'catch# comment', 23282c5ed4e3SBram Moolenaar 'endtry', 23292c5ed4e3SBram Moolenaar ], 'E654:') 23302c5ed4e3SBram Moolenaar CheckDefFailure([ 23312c5ed4e3SBram Moolenaar 'try', 23322c5ed4e3SBram Moolenaar ' echo "yes"', 23332c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23342c5ed4e3SBram Moolenaar 'endtry', 23352c5ed4e3SBram Moolenaar ], 'E488:') 23367a092245SBram Moolenaar CheckDefFailure([ 23377a092245SBram Moolenaar 'try', 23387a092245SBram Moolenaar 'echo "yes"', 23397a092245SBram Moolenaar 'catch', 23407a092245SBram Moolenaar 'endtry# comment', 23417a092245SBram Moolenaar ], 'E488:') 23422c5ed4e3SBram Moolenaar CheckScriptFailure([ 23432c5ed4e3SBram Moolenaar 'vim9script', 23442c5ed4e3SBram Moolenaar 'try', 23452c5ed4e3SBram Moolenaar ' echo "yes"', 23462c5ed4e3SBram Moolenaar 'catch', 23472c5ed4e3SBram Moolenaar 'endtry# comment', 23489b7bf9e9SBram Moolenaar ], 'E488:') 23492c5ed4e3SBram Moolenaar 23502c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23512c5ed4e3SBram Moolenaar 'vim9script', 23522c5ed4e3SBram Moolenaar 'hi # comment', 23532c5ed4e3SBram Moolenaar ]) 23542c5ed4e3SBram Moolenaar CheckScriptFailure([ 23552c5ed4e3SBram Moolenaar 'vim9script', 23562c5ed4e3SBram Moolenaar 'hi# comment', 23572c5ed4e3SBram Moolenaar ], 'E416:') 23581966c248SBram Moolenaar CheckScriptSuccess([ 23591966c248SBram Moolenaar 'vim9script', 23601966c248SBram Moolenaar 'hi Search # comment', 23611966c248SBram Moolenaar ]) 23621966c248SBram Moolenaar CheckScriptFailure([ 23631966c248SBram Moolenaar 'vim9script', 23641966c248SBram Moolenaar 'hi Search# comment', 23651966c248SBram Moolenaar ], 'E416:') 23661966c248SBram Moolenaar CheckScriptSuccess([ 23671966c248SBram Moolenaar 'vim9script', 23681966c248SBram Moolenaar 'hi link This Search # comment', 23691966c248SBram Moolenaar ]) 23701966c248SBram Moolenaar CheckScriptFailure([ 23711966c248SBram Moolenaar 'vim9script', 23721966c248SBram Moolenaar 'hi link This That# comment', 23731966c248SBram Moolenaar ], 'E413:') 23741966c248SBram Moolenaar CheckScriptSuccess([ 23751966c248SBram Moolenaar 'vim9script', 23761966c248SBram Moolenaar 'hi clear This # comment', 23771966c248SBram Moolenaar 'hi clear # comment', 23781966c248SBram Moolenaar ]) 2379f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2380f5be8cdbSBram Moolenaar # hi clear This# comment', 23811966c248SBram Moolenaar CheckScriptFailure([ 23821966c248SBram Moolenaar 'vim9script', 23831966c248SBram Moolenaar 'hi clear# comment', 23841966c248SBram Moolenaar ], 'E416:') 23851966c248SBram Moolenaar 23861966c248SBram Moolenaar CheckScriptSuccess([ 23871966c248SBram Moolenaar 'vim9script', 23881966c248SBram Moolenaar 'hi Group term=bold', 23891966c248SBram Moolenaar 'match Group /todo/ # comment', 23901966c248SBram Moolenaar ]) 23911966c248SBram Moolenaar CheckScriptFailure([ 23921966c248SBram Moolenaar 'vim9script', 23931966c248SBram Moolenaar 'hi Group term=bold', 23941966c248SBram Moolenaar 'match Group /todo/# comment', 23951966c248SBram Moolenaar ], 'E488:') 23961966c248SBram Moolenaar CheckScriptSuccess([ 23971966c248SBram Moolenaar 'vim9script', 23981966c248SBram Moolenaar 'match # comment', 23991966c248SBram Moolenaar ]) 24001966c248SBram Moolenaar CheckScriptFailure([ 24011966c248SBram Moolenaar 'vim9script', 24021966c248SBram Moolenaar 'match# comment', 24031966c248SBram Moolenaar ], 'E475:') 24041966c248SBram Moolenaar CheckScriptSuccess([ 24051966c248SBram Moolenaar 'vim9script', 24061966c248SBram Moolenaar 'match none # comment', 24071966c248SBram Moolenaar ]) 24081966c248SBram Moolenaar CheckScriptFailure([ 24091966c248SBram Moolenaar 'vim9script', 24101966c248SBram Moolenaar 'match none# comment', 24111966c248SBram Moolenaar ], 'E475:') 24121966c248SBram Moolenaar 24131966c248SBram Moolenaar CheckScriptSuccess([ 24141966c248SBram Moolenaar 'vim9script', 24151966c248SBram Moolenaar 'menutrans clear # comment', 24161966c248SBram Moolenaar ]) 24171966c248SBram Moolenaar CheckScriptFailure([ 24181966c248SBram Moolenaar 'vim9script', 24191966c248SBram Moolenaar 'menutrans clear# comment text', 24201966c248SBram Moolenaar ], 'E474:') 24211966c248SBram Moolenaar 24221966c248SBram Moolenaar CheckScriptSuccess([ 24231966c248SBram Moolenaar 'vim9script', 24241966c248SBram Moolenaar 'syntax clear # comment', 24251966c248SBram Moolenaar ]) 24261966c248SBram Moolenaar CheckScriptFailure([ 24271966c248SBram Moolenaar 'vim9script', 24281966c248SBram Moolenaar 'syntax clear# comment text', 24291966c248SBram Moolenaar ], 'E28:') 24301966c248SBram Moolenaar CheckScriptSuccess([ 24311966c248SBram Moolenaar 'vim9script', 24321966c248SBram Moolenaar 'syntax keyword Word some', 24331966c248SBram Moolenaar 'syntax clear Word # comment', 24341966c248SBram Moolenaar ]) 24351966c248SBram Moolenaar CheckScriptFailure([ 24361966c248SBram Moolenaar 'vim9script', 24371966c248SBram Moolenaar 'syntax keyword Word some', 24381966c248SBram Moolenaar 'syntax clear Word# comment text', 24391966c248SBram Moolenaar ], 'E28:') 24401966c248SBram Moolenaar 24411966c248SBram Moolenaar CheckScriptSuccess([ 24421966c248SBram Moolenaar 'vim9script', 24431966c248SBram Moolenaar 'syntax list # comment', 24441966c248SBram Moolenaar ]) 24451966c248SBram Moolenaar CheckScriptFailure([ 24461966c248SBram Moolenaar 'vim9script', 24471966c248SBram Moolenaar 'syntax list# comment text', 24481966c248SBram Moolenaar ], 'E28:') 24491966c248SBram Moolenaar 24501966c248SBram Moolenaar CheckScriptSuccess([ 24511966c248SBram Moolenaar 'vim9script', 24521966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24531966c248SBram Moolenaar ]) 24541966c248SBram Moolenaar CheckScriptFailure([ 24551966c248SBram Moolenaar 'vim9script', 24561966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 24571966c248SBram Moolenaar ], 'E475:') 24581966c248SBram Moolenaar 24591966c248SBram Moolenaar CheckScriptSuccess([ 24601966c248SBram Moolenaar 'vim9script', 24611966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 24621966c248SBram Moolenaar ]) 24631966c248SBram Moolenaar CheckScriptFailure([ 24641966c248SBram Moolenaar 'vim9script', 24651966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 24661966c248SBram Moolenaar ], 'E789:') 24671966c248SBram Moolenaar 24681966c248SBram Moolenaar CheckScriptSuccess([ 24691966c248SBram Moolenaar 'vim9script', 24701966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 24711966c248SBram Moolenaar ]) 24721966c248SBram Moolenaar CheckScriptFailure([ 24731966c248SBram Moolenaar 'vim9script', 24741966c248SBram Moolenaar 'syntax match Word /pat/# comment', 24751966c248SBram Moolenaar ], 'E402:') 24761966c248SBram Moolenaar 24771966c248SBram Moolenaar CheckScriptSuccess([ 24781966c248SBram Moolenaar 'vim9script', 24791966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 24801966c248SBram Moolenaar ]) 24811966c248SBram Moolenaar CheckScriptFailure([ 24821966c248SBram Moolenaar 'vim9script', 24831966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 24841966c248SBram Moolenaar ], 'E475:') 24851966c248SBram Moolenaar CheckScriptFailure([ 24861966c248SBram Moolenaar 'vim9script', 24871966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 24881966c248SBram Moolenaar ], 'E406:') 24891966c248SBram Moolenaar CheckScriptFailure([ 24901966c248SBram Moolenaar 'vim9script', 24911966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 24921966c248SBram Moolenaar ], 'E475:') 24931966c248SBram Moolenaar 24941966c248SBram Moolenaar CheckScriptSuccess([ 24951966c248SBram Moolenaar 'vim9script', 24961966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 24971966c248SBram Moolenaar ]) 24981966c248SBram Moolenaar CheckScriptFailure([ 24991966c248SBram Moolenaar 'vim9script', 25001966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2501d032f34aSBram Moolenaar ], 'E402:') 25021966c248SBram Moolenaar 25031966c248SBram Moolenaar CheckScriptSuccess([ 25041966c248SBram Moolenaar 'vim9script', 25051966c248SBram Moolenaar 'syntax sync # comment', 25061966c248SBram Moolenaar ]) 25071966c248SBram Moolenaar CheckScriptFailure([ 25081966c248SBram Moolenaar 'vim9script', 25091966c248SBram Moolenaar 'syntax sync# comment', 25101966c248SBram Moolenaar ], 'E404:') 25111966c248SBram Moolenaar CheckScriptSuccess([ 25121966c248SBram Moolenaar 'vim9script', 25131966c248SBram Moolenaar 'syntax sync ccomment # comment', 25141966c248SBram Moolenaar ]) 25151966c248SBram Moolenaar CheckScriptFailure([ 25161966c248SBram Moolenaar 'vim9script', 25171966c248SBram Moolenaar 'syntax sync ccomment# comment', 25181966c248SBram Moolenaar ], 'E404:') 25191966c248SBram Moolenaar 25201966c248SBram Moolenaar CheckScriptSuccess([ 25211966c248SBram Moolenaar 'vim9script', 25221966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25231966c248SBram Moolenaar ]) 25241966c248SBram Moolenaar CheckScriptFailure([ 25251966c248SBram Moolenaar 'vim9script', 25261966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25271966c248SBram Moolenaar ], 'E475:') 2528a72cfb80SBram Moolenaar 2529a72cfb80SBram Moolenaar CheckScriptSuccess([ 2530a72cfb80SBram Moolenaar 'vim9script', 2531a72cfb80SBram Moolenaar 'command Echo echo # comment', 2532a72cfb80SBram Moolenaar 'command Echo # comment', 2533a72cfb80SBram Moolenaar ]) 2534a72cfb80SBram Moolenaar CheckScriptFailure([ 2535a72cfb80SBram Moolenaar 'vim9script', 2536a72cfb80SBram Moolenaar 'command Echo echo# comment', 2537a72cfb80SBram Moolenaar 'Echo', 2538a72cfb80SBram Moolenaar ], 'E121:') 2539a72cfb80SBram Moolenaar CheckScriptFailure([ 2540a72cfb80SBram Moolenaar 'vim9script', 2541a72cfb80SBram Moolenaar 'command Echo# comment', 2542a72cfb80SBram Moolenaar ], 'E182:') 2543a72cfb80SBram Moolenaar CheckScriptFailure([ 2544a72cfb80SBram Moolenaar 'vim9script', 2545a72cfb80SBram Moolenaar 'command Echo echo', 2546a72cfb80SBram Moolenaar 'command Echo# comment', 2547a72cfb80SBram Moolenaar ], 'E182:') 2548a72cfb80SBram Moolenaar 2549a72cfb80SBram Moolenaar CheckScriptSuccess([ 2550a72cfb80SBram Moolenaar 'vim9script', 2551a72cfb80SBram Moolenaar 'function # comment', 2552a72cfb80SBram Moolenaar ]) 2553a72cfb80SBram Moolenaar CheckScriptFailure([ 2554a72cfb80SBram Moolenaar 'vim9script', 25559898107fSBram Moolenaar 'function " comment', 25569898107fSBram Moolenaar ], 'E129:') 25579898107fSBram Moolenaar CheckScriptFailure([ 25589898107fSBram Moolenaar 'vim9script', 2559a72cfb80SBram Moolenaar 'function# comment', 2560a72cfb80SBram Moolenaar ], 'E129:') 2561a72cfb80SBram Moolenaar CheckScriptSuccess([ 2562a72cfb80SBram Moolenaar 'vim9script', 2563a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2564a72cfb80SBram Moolenaar ]) 2565a72cfb80SBram Moolenaar CheckScriptFailure([ 2566a72cfb80SBram Moolenaar 'vim9script', 2567a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2568a72cfb80SBram Moolenaar ], 'E488:') 2569a72cfb80SBram Moolenaar 2570a72cfb80SBram Moolenaar CheckScriptSuccess([ 2571a72cfb80SBram Moolenaar 'vim9script', 25724c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2573a72cfb80SBram Moolenaar 'endfunc', 25744c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2575a72cfb80SBram Moolenaar ]) 2576a72cfb80SBram Moolenaar CheckScriptFailure([ 2577a72cfb80SBram Moolenaar 'vim9script', 25784c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2579a72cfb80SBram Moolenaar 'endfunc', 25804c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2581a72cfb80SBram Moolenaar ], 'E488:') 2582a72cfb80SBram Moolenaar 2583a72cfb80SBram Moolenaar CheckScriptSuccess([ 2584a72cfb80SBram Moolenaar 'vim9script', 2585a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2586a72cfb80SBram Moolenaar ]) 2587a72cfb80SBram Moolenaar CheckScriptFailure([ 2588a72cfb80SBram Moolenaar 'vim9script', 2589a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2590a72cfb80SBram Moolenaar ], 'E488:') 2591e7e4838fSBram Moolenaar 2592e7e4838fSBram Moolenaar CheckScriptFailure([ 2593e7e4838fSBram Moolenaar 'def Test() " comment', 2594e7e4838fSBram Moolenaar 'enddef', 2595e7e4838fSBram Moolenaar ], 'E488:') 2596e7e4838fSBram Moolenaar CheckScriptFailure([ 2597e7e4838fSBram Moolenaar 'vim9script', 2598e7e4838fSBram Moolenaar 'def Test() " comment', 2599e7e4838fSBram Moolenaar 'enddef', 2600e7e4838fSBram Moolenaar ], 'E488:') 2601e7e4838fSBram Moolenaar 2602e7e4838fSBram Moolenaar CheckScriptSuccess([ 2603e7e4838fSBram Moolenaar 'func Test() " comment', 2604e7e4838fSBram Moolenaar 'endfunc', 2605e7e4838fSBram Moolenaar ]) 26069898107fSBram Moolenaar CheckScriptSuccess([ 2607e7e4838fSBram Moolenaar 'vim9script', 2608e7e4838fSBram Moolenaar 'func Test() " comment', 2609e7e4838fSBram Moolenaar 'endfunc', 26109898107fSBram Moolenaar ]) 2611e7e4838fSBram Moolenaar 2612e7e4838fSBram Moolenaar CheckScriptSuccess([ 2613e7e4838fSBram Moolenaar 'def Test() # comment', 2614e7e4838fSBram Moolenaar 'enddef', 2615e7e4838fSBram Moolenaar ]) 2616e7e4838fSBram Moolenaar CheckScriptFailure([ 2617e7e4838fSBram Moolenaar 'func Test() # comment', 2618e7e4838fSBram Moolenaar 'endfunc', 2619e7e4838fSBram Moolenaar ], 'E488:') 26202c5ed4e3SBram Moolenaarenddef 26212c5ed4e3SBram Moolenaar 26222c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 26232c5ed4e3SBram Moolenaar CheckCanRunGui 26242c5ed4e3SBram Moolenaar 26252c5ed4e3SBram Moolenaar CheckScriptFailure([ 26262c5ed4e3SBram Moolenaar 'vim9script', 26272c5ed4e3SBram Moolenaar 'gui#comment' 26282c5ed4e3SBram Moolenaar ], 'E499:') 26292c5ed4e3SBram Moolenaar CheckScriptFailure([ 26302c5ed4e3SBram Moolenaar 'vim9script', 26312c5ed4e3SBram Moolenaar 'gui -f#comment' 26322c5ed4e3SBram Moolenaar ], 'E499:') 26337a092245SBram Moolenaarenddef 26347a092245SBram Moolenaar 2635a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 26366797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 26376797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2638a26b9700SBram Moolenaar 2639a26b9700SBram Moolenaar edit test.vim 2640a26b9700SBram Moolenaar doautocmd TabEnter #comment 2641a26b9700SBram Moolenaar assert_equal(1, g:entered) 2642a26b9700SBram Moolenaar 2643a26b9700SBram Moolenaar doautocmd TabEnter f.x 2644a26b9700SBram Moolenaar assert_equal(2, g:entered) 2645a26b9700SBram Moolenaar 2646a26b9700SBram Moolenaar g:entered = 0 2647a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2648a26b9700SBram Moolenaar assert_equal(2, g:entered) 2649a26b9700SBram Moolenaar 2650a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2651a26b9700SBram Moolenaar 2652a26b9700SBram Moolenaar au! TabEnter 2653a26b9700SBram Moolenaar unlet g:entered 2654d72c1bf0SBram Moolenaar 2655d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2656d72c1bf0SBram Moolenaar 'vim9script', 26576797966dSBram Moolenaar 'g:var = 123', 2658e55b1c09SBram Moolenaar 'b:var = 456', 2659e55b1c09SBram Moolenaar 'w:var = 777', 2660e55b1c09SBram Moolenaar 't:var = 888', 2661d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2662d72c1bf0SBram Moolenaar ]) 2663d72c1bf0SBram Moolenaar 2664d72c1bf0SBram Moolenaar CheckScriptFailure([ 2665d72c1bf0SBram Moolenaar 'vim9script', 2666d72c1bf0SBram Moolenaar 'let g:var = 123', 2667e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2668e55b1c09SBram Moolenaar 2669e55b1c09SBram Moolenaar CheckScriptFailure([ 2670e55b1c09SBram Moolenaar 'vim9script', 2671e55b1c09SBram Moolenaar 'let b:var = 123', 2672e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2673e55b1c09SBram Moolenaar 2674e55b1c09SBram Moolenaar CheckScriptFailure([ 2675e55b1c09SBram Moolenaar 'vim9script', 2676e55b1c09SBram Moolenaar 'let w:var = 123', 2677e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2678e55b1c09SBram Moolenaar 2679e55b1c09SBram Moolenaar CheckScriptFailure([ 2680e55b1c09SBram Moolenaar 'vim9script', 2681e55b1c09SBram Moolenaar 'let t:var = 123', 2682e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2683e55b1c09SBram Moolenaar 2684e55b1c09SBram Moolenaar CheckScriptFailure([ 2685e55b1c09SBram Moolenaar 'vim9script', 2686e55b1c09SBram Moolenaar 'let v:version = 123', 2687e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2688e55b1c09SBram Moolenaar 2689e55b1c09SBram Moolenaar CheckScriptFailure([ 2690e55b1c09SBram Moolenaar 'vim9script', 2691e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2692e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 26936797966dSBram Moolenaar 26946797966dSBram Moolenaar CheckScriptFailure([ 26956797966dSBram Moolenaar 'vim9script', 26966797966dSBram Moolenaar 'g:var = 123', 269732e35117SBram Moolenaar 'unlet g:var# comment1', 2698d72c1bf0SBram Moolenaar ], 'E108:') 2699d72c1bf0SBram Moolenaar 2700d72c1bf0SBram Moolenaar CheckScriptFailure([ 2701d72c1bf0SBram Moolenaar 'let g:var = 123', 2702d72c1bf0SBram Moolenaar 'unlet g:var # something', 2703d72c1bf0SBram Moolenaar ], 'E488:') 2704faac4104SBram Moolenaar 2705faac4104SBram Moolenaar CheckScriptSuccess([ 2706faac4104SBram Moolenaar 'vim9script', 270732e35117SBram Moolenaar 'if 1 # comment2', 2708faac4104SBram Moolenaar ' echo "yes"', 2709faac4104SBram Moolenaar 'elseif 2 #comment', 2710faac4104SBram Moolenaar ' echo "no"', 2711faac4104SBram Moolenaar 'endif', 2712faac4104SBram Moolenaar ]) 2713faac4104SBram Moolenaar 2714faac4104SBram Moolenaar CheckScriptFailure([ 2715faac4104SBram Moolenaar 'vim9script', 271632e35117SBram Moolenaar 'if 1# comment3', 2717faac4104SBram Moolenaar ' echo "yes"', 2718faac4104SBram Moolenaar 'endif', 2719faac4104SBram Moolenaar ], 'E15:') 2720faac4104SBram Moolenaar 2721faac4104SBram Moolenaar CheckScriptFailure([ 2722faac4104SBram Moolenaar 'vim9script', 272332e35117SBram Moolenaar 'if 0 # comment4', 2724faac4104SBram Moolenaar ' echo "yes"', 2725faac4104SBram Moolenaar 'elseif 2#comment', 2726faac4104SBram Moolenaar ' echo "no"', 2727faac4104SBram Moolenaar 'endif', 2728faac4104SBram Moolenaar ], 'E15:') 2729faac4104SBram Moolenaar 2730faac4104SBram Moolenaar CheckScriptSuccess([ 2731faac4104SBram Moolenaar 'vim9script', 273232e35117SBram Moolenaar 'let v = 1 # comment5', 2733faac4104SBram Moolenaar ]) 2734faac4104SBram Moolenaar 2735faac4104SBram Moolenaar CheckScriptFailure([ 2736faac4104SBram Moolenaar 'vim9script', 273732e35117SBram Moolenaar 'let v = 1# comment6', 273832e35117SBram Moolenaar ], 'E15:') 2739faac4104SBram Moolenaar 2740faac4104SBram Moolenaar CheckScriptSuccess([ 2741faac4104SBram Moolenaar 'vim9script', 2742faac4104SBram Moolenaar 'new' 2743faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2744df069eecSBram Moolenaar ':$', 2745faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2746faac4104SBram Moolenaar 'bwipe!', 2747faac4104SBram Moolenaar ]) 2748faac4104SBram Moolenaar 2749f5be8cdbSBram Moolenaar CheckScriptFailure([ 2750f5be8cdbSBram Moolenaar 'vim9script', 2751f5be8cdbSBram Moolenaar 'new' 2752f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2753f5be8cdbSBram Moolenaar ':$', 2754f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2755f5be8cdbSBram Moolenaar 'bwipe!', 2756f5be8cdbSBram Moolenaar ], 'E488:') 2757f5be8cdbSBram Moolenaar 2758f5be8cdbSBram Moolenaar CheckScriptFailure([ 2759f5be8cdbSBram Moolenaar 'vim9script', 2760f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2761f5be8cdbSBram Moolenaar ], 'E477:') 2762a26b9700SBram Moolenaarenddef 2763a26b9700SBram Moolenaar 27647e5bd91dSBram Moolenaardef Test_finish() 27657e5bd91dSBram Moolenaar let lines =<< trim END 27667e5bd91dSBram Moolenaar vim9script 27676797966dSBram Moolenaar g:res = 'one' 27687e5bd91dSBram Moolenaar if v:false | finish | endif 27696797966dSBram Moolenaar g:res = 'two' 27707e5bd91dSBram Moolenaar finish 27716797966dSBram Moolenaar g:res = 'three' 27727e5bd91dSBram Moolenaar END 27737e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27747e5bd91dSBram Moolenaar source Xfinished 27757e5bd91dSBram Moolenaar assert_equal('two', g:res) 27767e5bd91dSBram Moolenaar 27777e5bd91dSBram Moolenaar unlet g:res 27787e5bd91dSBram Moolenaar delete('Xfinished') 27797e5bd91dSBram Moolenaarenddef 27807e5bd91dSBram Moolenaar 278132e35117SBram Moolenaardef Test_let_func_call() 278232e35117SBram Moolenaar let lines =<< trim END 278332e35117SBram Moolenaar vim9script 278432e35117SBram Moolenaar func GetValue() 278532e35117SBram Moolenaar if exists('g:count') 278632e35117SBram Moolenaar let g:count += 1 278732e35117SBram Moolenaar else 278832e35117SBram Moolenaar let g:count = 1 278932e35117SBram Moolenaar endif 279032e35117SBram Moolenaar return 'this' 279132e35117SBram Moolenaar endfunc 279232e35117SBram Moolenaar let val: string = GetValue() 2793f5be8cdbSBram Moolenaar # env var is always a string 2794df671b46SBram Moolenaar let env = $TERM 279532e35117SBram Moolenaar END 279632e35117SBram Moolenaar writefile(lines, 'Xfinished') 279732e35117SBram Moolenaar source Xfinished 2798f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 279932e35117SBram Moolenaar assert_equal(1, g:count) 280032e35117SBram Moolenaar 280132e35117SBram Moolenaar unlet g:count 280232e35117SBram Moolenaar delete('Xfinished') 280332e35117SBram Moolenaarenddef 280432e35117SBram Moolenaar 280532e35117SBram Moolenaardef Test_let_missing_type() 280632e35117SBram Moolenaar let lines =<< trim END 280732e35117SBram Moolenaar vim9script 2808df671b46SBram Moolenaar let var = g:unknown 2809227a69deSBram Moolenaar END 2810822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2811227a69deSBram Moolenaar 2812227a69deSBram Moolenaar lines =<< trim END 2813227a69deSBram Moolenaar vim9script 2814227a69deSBram Moolenaar let nr: number = 123 2815227a69deSBram Moolenaar let var = nr 2816227a69deSBram Moolenaar END 2817822ba247SBram Moolenaar CheckScriptSuccess(lines) 281832e35117SBram Moolenaarenddef 281932e35117SBram Moolenaar 2820c82a5b5dSBram Moolenaardef Test_let_declaration() 2821c82a5b5dSBram Moolenaar let lines =<< trim END 2822c82a5b5dSBram Moolenaar vim9script 2823c82a5b5dSBram Moolenaar let var: string 2824c82a5b5dSBram Moolenaar g:var_uninit = var 2825c82a5b5dSBram Moolenaar var = 'text' 2826c82a5b5dSBram Moolenaar g:var_test = var 2827f5be8cdbSBram Moolenaar # prefixing s: is optional 2828984dddbeSBram Moolenaar s:var = 'prefixed' 2829984dddbeSBram Moolenaar g:var_prefixed = s:var 2830984dddbeSBram Moolenaar 2831984dddbeSBram Moolenaar let s:other: number 2832984dddbeSBram Moolenaar other = 1234 2833984dddbeSBram Moolenaar g:other_var = other 2834c82a5b5dSBram Moolenaar END 2835c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2836c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2837c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2838984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2839984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2840c82a5b5dSBram Moolenaar 2841c82a5b5dSBram Moolenaar unlet g:var_uninit 2842c82a5b5dSBram Moolenaar unlet g:var_test 2843984dddbeSBram Moolenaar unlet g:var_prefixed 2844984dddbeSBram Moolenaar unlet g:other_var 2845c82a5b5dSBram Moolenaarenddef 2846c82a5b5dSBram Moolenaar 2847c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2848c5b1c20bSBram Moolenaar let lines =<< trim END 2849c5b1c20bSBram Moolenaar vim9script 2850c5b1c20bSBram Moolenaar const var: string 2851c5b1c20bSBram Moolenaar END 2852c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2853c5b1c20bSBram Moolenaar 2854c5b1c20bSBram Moolenaar lines =<< trim END 2855c5b1c20bSBram Moolenaar vim9script 2856c5b1c20bSBram Moolenaar let 9var: string 2857c5b1c20bSBram Moolenaar END 2858c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2859c5b1c20bSBram Moolenaarenddef 2860c5b1c20bSBram Moolenaar 286134db91f7SBram Moolenaardef Test_let_type_check() 286234db91f7SBram Moolenaar let lines =<< trim END 286334db91f7SBram Moolenaar vim9script 286434db91f7SBram Moolenaar let var: string 286534db91f7SBram Moolenaar var = 1234 286634db91f7SBram Moolenaar END 286734db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2868984dddbeSBram Moolenaar 2869984dddbeSBram Moolenaar lines =<< trim END 2870984dddbeSBram Moolenaar vim9script 2871984dddbeSBram Moolenaar let var:string 2872984dddbeSBram Moolenaar END 2873984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2874c5b1c20bSBram Moolenaar 2875c5b1c20bSBram Moolenaar lines =<< trim END 2876c5b1c20bSBram Moolenaar vim9script 2877c5b1c20bSBram Moolenaar let var: asdf 2878c5b1c20bSBram Moolenaar END 2879c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2880a71e2633SBram Moolenaar 2881a71e2633SBram Moolenaar lines =<< trim END 2882a71e2633SBram Moolenaar vim9script 2883a71e2633SBram Moolenaar let s:l: list<number> 2884a71e2633SBram Moolenaar s:l = [] 2885a71e2633SBram Moolenaar END 2886a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2887a71e2633SBram Moolenaar 2888a71e2633SBram Moolenaar lines =<< trim END 2889a71e2633SBram Moolenaar vim9script 2890a71e2633SBram Moolenaar let s:d: dict<number> 2891a71e2633SBram Moolenaar s:d = {} 2892a71e2633SBram Moolenaar END 2893a71e2633SBram Moolenaar CheckScriptSuccess(lines) 289434db91f7SBram Moolenaarenddef 289534db91f7SBram Moolenaar 2896a5d0077eSBram Moolenaardef Test_forward_declaration() 2897a5d0077eSBram Moolenaar let lines =<< trim END 2898a5d0077eSBram Moolenaar vim9script 2899a5d0077eSBram Moolenaar def GetValue(): string 2900a5d0077eSBram Moolenaar return theVal 2901a5d0077eSBram Moolenaar enddef 2902a5d0077eSBram Moolenaar let theVal = 'something' 2903822ba247SBram Moolenaar g:initVal = GetValue() 2904a5d0077eSBram Moolenaar theVal = 'else' 2905a5d0077eSBram Moolenaar g:laterVal = GetValue() 2906a5d0077eSBram Moolenaar END 2907a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2908a5d0077eSBram Moolenaar source Xforward 2909a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2910a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2911a5d0077eSBram Moolenaar 2912a5d0077eSBram Moolenaar unlet g:initVal 2913a5d0077eSBram Moolenaar unlet g:laterVal 2914a5d0077eSBram Moolenaar delete('Xforward') 2915a5d0077eSBram Moolenaarenddef 2916a5d0077eSBram Moolenaar 29179721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 29189721fb4eSBram Moolenaar let legacy_lines =<< trim END 29199721fb4eSBram Moolenaar source Xvim9_script.vim 29209721fb4eSBram Moolenaar 29219721fb4eSBram Moolenaar call assert_false(exists('local')) 29229721fb4eSBram Moolenaar call assert_false(exists('exported')) 29239721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29249721fb4eSBram Moolenaar call assert_equal('global', global) 29259721fb4eSBram Moolenaar call assert_equal('global', g:global) 29269721fb4eSBram Moolenaar 29279721fb4eSBram Moolenaar " imported variable becomes script-local 29289721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29299721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29309721fb4eSBram Moolenaar call assert_false(exists('exported')) 29319721fb4eSBram Moolenaar 29329721fb4eSBram Moolenaar " imported function becomes script-local 29339721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29349721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29359721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29369721fb4eSBram Moolenaar END 29379721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29389721fb4eSBram Moolenaar 29399721fb4eSBram Moolenaar let vim9_lines =<< trim END 29409721fb4eSBram Moolenaar vim9script 29419721fb4eSBram Moolenaar let local = 'local' 29429721fb4eSBram Moolenaar g:global = 'global' 29439721fb4eSBram Moolenaar export let exported = 'exported' 29449721fb4eSBram Moolenaar export def GetText(): string 29459721fb4eSBram Moolenaar return 'text' 29469721fb4eSBram Moolenaar enddef 29479721fb4eSBram Moolenaar END 29489721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 29499721fb4eSBram Moolenaar 29509721fb4eSBram Moolenaar source Xlegacy_script.vim 29519721fb4eSBram Moolenaar 29529721fb4eSBram Moolenaar assert_equal('global', g:global) 2953f5be8cdbSBram Moolenaar unlet g:global 29549721fb4eSBram Moolenaar 29559721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29569721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29579721fb4eSBram Moolenaarenddef 2958a5d0077eSBram Moolenaar 2959eeb27bfeSBram Moolenaardef Test_vim9_copen() 2960eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2961eeb27bfeSBram Moolenaar copen 2962eeb27bfeSBram Moolenaar quit 2963eeb27bfeSBram Moolenaarenddef 2964eeb27bfeSBram Moolenaar 29652d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 29662d6b20d6SBram Moolenaardef Test_vim9_autoload() 29672d6b20d6SBram Moolenaar let lines =<< trim END 29682d6b20d6SBram Moolenaar vim9script 29692d6b20d6SBram Moolenaar def foo#test() 29702d6b20d6SBram Moolenaar echomsg getreg('"') 29712d6b20d6SBram Moolenaar enddef 29722d6b20d6SBram Moolenaar END 29732d6b20d6SBram Moolenaar 29742d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29752d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 29762d6b20d6SBram Moolenaar let save_rtp = &rtp 29772d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29782d6b20d6SBram Moolenaar augroup test 29792d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 29802d6b20d6SBram Moolenaar augroup END 29812d6b20d6SBram Moolenaar 29822d6b20d6SBram Moolenaar normal Y 29832d6b20d6SBram Moolenaar 29842d6b20d6SBram Moolenaar augroup test 29852d6b20d6SBram Moolenaar autocmd! 29862d6b20d6SBram Moolenaar augroup END 29872d6b20d6SBram Moolenaar delete('Xdir', 'rf') 29882d6b20d6SBram Moolenaar &rtp = save_rtp 29892d6b20d6SBram Moolenaarenddef 29902d6b20d6SBram Moolenaar 2991585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2992585fea7bSBram Moolenaardef Test_substitute_cmd() 2993585fea7bSBram Moolenaar new 2994585fea7bSBram Moolenaar setline(1, 'something') 2995585fea7bSBram Moolenaar :substitute(some(other( 2996585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2997585fea7bSBram Moolenaar bwipe! 2998585fea7bSBram Moolenaar 2999f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3000585fea7bSBram Moolenaar let lines =<< trim END 3001585fea7bSBram Moolenaar vim9script 3002585fea7bSBram Moolenaar new 3003585fea7bSBram Moolenaar setline(1, 'something') 3004585fea7bSBram Moolenaar :substitute(some(other( 3005585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3006585fea7bSBram Moolenaar bwipe! 3007585fea7bSBram Moolenaar END 3008585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3009585fea7bSBram Moolenaar source Xvim9lines 3010585fea7bSBram Moolenaar 3011585fea7bSBram Moolenaar delete('Xvim9lines') 3012585fea7bSBram Moolenaarenddef 3013585fea7bSBram Moolenaar 30148a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3015