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) 129a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 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) 135a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 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) 149e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 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) 22784370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 228c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 22984370087SBram Moolenaar 23084370087SBram Moolenaar # type becomes list<any> 23184370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 23284370087SBram Moolenaarenddef 23384370087SBram Moolenaar 234b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 235b31be3f9SBram Moolenaar let lines =<< trim END 236b31be3f9SBram Moolenaar vim9script 237b31be3f9SBram Moolenaar let v1: number 238b31be3f9SBram Moolenaar let v2: number 239b31be3f9SBram Moolenaar let v3: number 240b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 241b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 242b31be3f9SBram Moolenaar END 243b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 244b31be3f9SBram Moolenaarenddef 245b31be3f9SBram Moolenaar 24684370087SBram Moolenaardef Test_assignment_dict() 24784370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 24884370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 24984370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 25084370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 25174fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 25284370087SBram Moolenaar 253f5be8cdbSBram Moolenaar # overwrite 254c785b9a7SBram Moolenaar dict3['key'] = 'another' 255c785b9a7SBram Moolenaar 25658626872SBram Moolenaar # empty key can be used 25758626872SBram Moolenaar let dd = {} 25858626872SBram Moolenaar dd[""] = 6 25958626872SBram Moolenaar assert_equal({'': 6}, dd) 26084370087SBram Moolenaar 26184370087SBram Moolenaar # type becomes dict<any> 26284370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 2638e4c8c85SBram Moolenaar 2648e4c8c85SBram Moolenaar # assignment to script-local dict 2658e4c8c85SBram Moolenaar let lines =<< trim END 2668e4c8c85SBram Moolenaar vim9script 2678e4c8c85SBram Moolenaar let test: dict<any> = {} 2688e4c8c85SBram Moolenaar def FillDict(): dict<any> 2698e4c8c85SBram Moolenaar test['a'] = 43 2708e4c8c85SBram Moolenaar return test 2718e4c8c85SBram Moolenaar enddef 2728e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2738e4c8c85SBram Moolenaar END 2748e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 2758e4c8c85SBram Moolenaar 2768e4c8c85SBram Moolenaar lines =<< trim END 2778e4c8c85SBram Moolenaar vim9script 2788e4c8c85SBram Moolenaar let test: dict<any> 2798e4c8c85SBram Moolenaar def FillDict(): dict<any> 2808e4c8c85SBram Moolenaar test['a'] = 43 2818e4c8c85SBram Moolenaar return test 2828e4c8c85SBram Moolenaar enddef 2838e4c8c85SBram Moolenaar FillDict() 2848e4c8c85SBram Moolenaar END 2858e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 2862caa1594SBram Moolenaar 2872caa1594SBram Moolenaar # assignment to global dict 2882caa1594SBram Moolenaar lines =<< trim END 2892caa1594SBram Moolenaar vim9script 2902caa1594SBram Moolenaar g:test = {} 2912caa1594SBram Moolenaar def FillDict(): dict<any> 2922caa1594SBram Moolenaar g:test['a'] = 43 2932caa1594SBram Moolenaar return g:test 2942caa1594SBram Moolenaar enddef 2952caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2962caa1594SBram Moolenaar END 2972caa1594SBram Moolenaar call CheckScriptSuccess(lines) 2982caa1594SBram Moolenaar 2992caa1594SBram Moolenaar # assignment to buffer dict 3002caa1594SBram Moolenaar lines =<< trim END 3012caa1594SBram Moolenaar vim9script 3022caa1594SBram Moolenaar b:test = {} 3032caa1594SBram Moolenaar def FillDict(): dict<any> 3042caa1594SBram Moolenaar b:test['a'] = 43 3052caa1594SBram Moolenaar return b:test 3062caa1594SBram Moolenaar enddef 3072caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3082caa1594SBram Moolenaar END 3092caa1594SBram Moolenaar call CheckScriptSuccess(lines) 31084370087SBram Moolenaarenddef 31184370087SBram Moolenaar 312d3aac291SBram Moolenaardef Test_assignment_local() 313f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 314f5be8cdbSBram Moolenaar # changed. 315d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 316d3aac291SBram Moolenaar let b:existing = 'yes' 317d3aac291SBram Moolenaar let w:existing = 'yes' 318d3aac291SBram Moolenaar let t:existing = 'yes' 319d3aac291SBram Moolenaar 320d3aac291SBram Moolenaar def Test_assignment_local_internal() 321d3aac291SBram Moolenaar b:newvar = 'new' 322d3aac291SBram Moolenaar assert_equal('new', b:newvar) 323d3aac291SBram Moolenaar assert_equal('yes', b:existing) 324d3aac291SBram Moolenaar b:existing = 'no' 325d3aac291SBram Moolenaar assert_equal('no', b:existing) 326396f3138SBram Moolenaar b:existing ..= 'NO' 327396f3138SBram Moolenaar assert_equal('noNO', b:existing) 328d3aac291SBram Moolenaar 329d3aac291SBram Moolenaar w:newvar = 'new' 330d3aac291SBram Moolenaar assert_equal('new', w:newvar) 331d3aac291SBram Moolenaar assert_equal('yes', w:existing) 332d3aac291SBram Moolenaar w:existing = 'no' 333d3aac291SBram Moolenaar assert_equal('no', w:existing) 334396f3138SBram Moolenaar w:existing ..= 'NO' 335396f3138SBram Moolenaar assert_equal('noNO', w:existing) 336d3aac291SBram Moolenaar 337d3aac291SBram Moolenaar t:newvar = 'new' 338d3aac291SBram Moolenaar assert_equal('new', t:newvar) 339d3aac291SBram Moolenaar assert_equal('yes', t:existing) 340d3aac291SBram Moolenaar t:existing = 'no' 341d3aac291SBram Moolenaar assert_equal('no', t:existing) 342396f3138SBram Moolenaar t:existing ..= 'NO' 343396f3138SBram Moolenaar assert_equal('noNO', t:existing) 344d3aac291SBram Moolenaar enddef 345d3aac291SBram Moolenaar call Test_assignment_local_internal() 346d3aac291SBram Moolenaar END 347d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 348d3aac291SBram Moolenaarenddef 349d3aac291SBram Moolenaar 3505deeb3f1SBram Moolenaardef Test_assignment_default() 351e69f6d04SBram Moolenaar 352cb711abfSBram Moolenaar # Test default values. 353e69f6d04SBram Moolenaar let thebool: bool 354e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 355e69f6d04SBram Moolenaar 356e69f6d04SBram Moolenaar let thenumber: number 357e69f6d04SBram Moolenaar assert_equal(0, thenumber) 358e69f6d04SBram Moolenaar 359e69f6d04SBram Moolenaar if has('float') 360e69f6d04SBram Moolenaar let thefloat: float 361e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 362e69f6d04SBram Moolenaar endif 363e69f6d04SBram Moolenaar 364e69f6d04SBram Moolenaar let thestring: string 365e69f6d04SBram Moolenaar assert_equal('', thestring) 366e69f6d04SBram Moolenaar 367e69f6d04SBram Moolenaar let theblob: blob 368e69f6d04SBram Moolenaar assert_equal(0z, theblob) 369e69f6d04SBram Moolenaar 3705deeb3f1SBram Moolenaar let Thefunc: func 3715deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 372e69f6d04SBram Moolenaar 373e69f6d04SBram Moolenaar let thelist: list<any> 374e69f6d04SBram Moolenaar assert_equal([], thelist) 375e69f6d04SBram Moolenaar 376e69f6d04SBram Moolenaar let thedict: dict<any> 377e69f6d04SBram Moolenaar assert_equal({}, thedict) 378e69f6d04SBram Moolenaar 3792c869deeSBram Moolenaar if has('channel') 380e69f6d04SBram Moolenaar let thejob: job 381e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 382e69f6d04SBram Moolenaar 383e69f6d04SBram Moolenaar let thechannel: channel 384e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 385c785b9a7SBram Moolenaar 386c785b9a7SBram Moolenaar if has('unix') && executable('cat') 387f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 388c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 389c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 390c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 391c785b9a7SBram Moolenaar endif 3922c869deeSBram Moolenaar endif 393585fea7bSBram Moolenaar 394585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 395585fea7bSBram Moolenaar assert_equal(5678, nr) 3968a7d6542SBram Moolenaarenddef 3978a7d6542SBram Moolenaar 39847a519a9SBram Moolenaardef Test_assignment_var_list() 39947a519a9SBram Moolenaar let v1: string 40047a519a9SBram Moolenaar let v2: string 4019af78769SBram Moolenaar let vrem: list<string> 4029af78769SBram Moolenaar [v1] = ['aaa'] 4039af78769SBram Moolenaar assert_equal('aaa', v1) 4049af78769SBram Moolenaar 40547a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 40647a519a9SBram Moolenaar assert_equal('one', v1) 40747a519a9SBram Moolenaar assert_equal('two', v2) 4089af78769SBram Moolenaar 4099af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4109af78769SBram Moolenaar assert_equal('one', v1) 4119af78769SBram Moolenaar assert_equal('two', v2) 4129af78769SBram Moolenaar assert_equal([], vrem) 4139af78769SBram Moolenaar 4149af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4159af78769SBram Moolenaar assert_equal('one', v1) 4169af78769SBram Moolenaar assert_equal('two', v2) 4179af78769SBram Moolenaar assert_equal(['three'], vrem) 41847a519a9SBram Moolenaarenddef 41947a519a9SBram Moolenaar 420c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 421c7e44a7eSBram Moolenaar let lines =<< trim END 422c7e44a7eSBram Moolenaar vim9script 423c7e44a7eSBram Moolenaar def Func(): list<number> 424c7e44a7eSBram Moolenaar return [1, 2] 425c7e44a7eSBram Moolenaar enddef 426c7e44a7eSBram Moolenaar let var1: number 427c7e44a7eSBram Moolenaar let var2: number 428c7e44a7eSBram Moolenaar [var1, var2] = 429c7e44a7eSBram Moolenaar Func() 430c7e44a7eSBram Moolenaar assert_equal(1, var1) 431c7e44a7eSBram Moolenaar assert_equal(2, var2) 432c7e44a7eSBram Moolenaar let ll = 433c7e44a7eSBram Moolenaar Func() 434c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 43583144546SBram Moolenaar 43683144546SBram Moolenaar @/ = 'text' 43783144546SBram Moolenaar assert_equal('text', @/) 43883144546SBram Moolenaar @0 = 'zero' 43983144546SBram Moolenaar assert_equal('zero', @0) 44083144546SBram Moolenaar @1 = 'one' 44183144546SBram Moolenaar assert_equal('one', @1) 44283144546SBram Moolenaar @9 = 'nine' 44383144546SBram Moolenaar assert_equal('nine', @9) 44483144546SBram Moolenaar @- = 'minus' 44583144546SBram Moolenaar assert_equal('minus', @-) 44683144546SBram Moolenaar if has('clipboard_working') 44783144546SBram Moolenaar @* = 'star' 44883144546SBram Moolenaar assert_equal('star', @*) 44983144546SBram Moolenaar @+ = 'plus' 45083144546SBram Moolenaar assert_equal('plus', @+) 45183144546SBram Moolenaar endif 452*95dd9f25SBram Moolenaar 453*95dd9f25SBram Moolenaar let a: number = 123 454*95dd9f25SBram Moolenaar assert_equal(123, a) 455*95dd9f25SBram Moolenaar let s: string = 'yes' 456*95dd9f25SBram Moolenaar assert_equal('yes', s) 457*95dd9f25SBram Moolenaar let b: number = 42 458*95dd9f25SBram Moolenaar assert_equal(42, b) 459*95dd9f25SBram Moolenaar let w: number = 43 460*95dd9f25SBram Moolenaar assert_equal(43, w) 461*95dd9f25SBram Moolenaar let t: number = 44 462*95dd9f25SBram Moolenaar assert_equal(44, t) 463c7e44a7eSBram Moolenaar END 464c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 465c7e44a7eSBram Moolenaarenddef 466c7e44a7eSBram Moolenaar 467cab27678SBram Moolenaardef Mess(): string 468cab27678SBram Moolenaar v:foldstart = 123 469cab27678SBram Moolenaar return 'xxx' 470cab27678SBram Moolenaarenddef 471cab27678SBram Moolenaar 472d72c1bf0SBram Moolenaardef Test_assignment_failure() 4738a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4748a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4758a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4768a7d6542SBram Moolenaar 47763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 47863be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 47963be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 48063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 48163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 48263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 48363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 48463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 48563be3d4bSBram Moolenaar 4868a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 4878a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 4888a7d6542SBram Moolenaar 4899b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 4909af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4919af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 4929af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4939af78769SBram Moolenaar '[a] = []'], 'E1093:') 4949af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4959af78769SBram Moolenaar 'let y: number', 4969af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 4979af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4989af78769SBram Moolenaar 'let y: number', 4999af78769SBram Moolenaar 'let z: list<number>', 5009af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5019be61bbbSBram Moolenaar 502e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 503c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5049be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 505c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5069be61bbbSBram Moolenaar 507e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 508c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5099be61bbbSBram Moolenaar 510434d72cbSBram Moolenaar if has('dnd') 51165821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 512434d72cbSBram Moolenaar else 513434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 514434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 515434d72cbSBram Moolenaar endif 5169be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 51765821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 518c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5199be61bbbSBram Moolenaar 520e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 521e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 522e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 523e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5249be61bbbSBram Moolenaar 5259be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5269be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5279be61bbbSBram Moolenaar 528822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 52933fa29cfSBram Moolenaar 5308a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5318a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5328a7d6542SBram Moolenaar 5338a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5348a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5358a7d6542SBram Moolenaar 5368a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5378a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 53842a480bfSBram Moolenaar 539d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 54042a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 541cab27678SBram Moolenaar 542cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 543cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 54443e969d3SBram Moolenaar 54543e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 54643e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 54743e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 54843e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 54943e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 55043e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 55143e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 55243e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 553d72c1bf0SBram Moolenaarenddef 554d72c1bf0SBram Moolenaar 555d72c1bf0SBram Moolenaardef Test_unlet() 556d72c1bf0SBram Moolenaar g:somevar = 'yes' 557d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 558d72c1bf0SBram Moolenaar unlet g:somevar 559d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 560d72c1bf0SBram Moolenaar unlet! g:somevar 561d72c1bf0SBram Moolenaar 562d72c1bf0SBram Moolenaar call CheckScriptFailure([ 563d72c1bf0SBram Moolenaar 'vim9script', 564d72c1bf0SBram Moolenaar 'let svar = 123', 565d72c1bf0SBram Moolenaar 'unlet svar', 566d72c1bf0SBram Moolenaar ], 'E1081:') 567d72c1bf0SBram Moolenaar call CheckScriptFailure([ 568d72c1bf0SBram Moolenaar 'vim9script', 569d72c1bf0SBram Moolenaar 'let svar = 123', 570d72c1bf0SBram Moolenaar 'unlet s:svar', 571d72c1bf0SBram Moolenaar ], 'E1081:') 572d72c1bf0SBram Moolenaar call CheckScriptFailure([ 573d72c1bf0SBram Moolenaar 'vim9script', 574d72c1bf0SBram Moolenaar 'let svar = 123', 575d72c1bf0SBram Moolenaar 'def Func()', 576d72c1bf0SBram Moolenaar ' unlet svar', 577d72c1bf0SBram Moolenaar 'enddef', 578822ba247SBram Moolenaar 'defcompile', 579d72c1bf0SBram Moolenaar ], 'E1081:') 580d72c1bf0SBram Moolenaar call CheckScriptFailure([ 581d72c1bf0SBram Moolenaar 'vim9script', 582d72c1bf0SBram Moolenaar 'let svar = 123', 583d72c1bf0SBram Moolenaar 'def Func()', 584d72c1bf0SBram Moolenaar ' unlet s:svar', 585d72c1bf0SBram Moolenaar 'enddef', 586822ba247SBram Moolenaar 'defcompile', 587d72c1bf0SBram Moolenaar ], 'E1081:') 5887bdaea6eSBram Moolenaar 5897bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 5907bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 5917bdaea6eSBram Moolenaar unlet $ENVVAR 5927bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 593d72c1bf0SBram Moolenaarenddef 594599c89c8SBram Moolenaar 5954c17ad94SBram Moolenaardef Test_delfunction() 596f5be8cdbSBram Moolenaar # Check function is defined in script namespace 5974c17ad94SBram Moolenaar CheckScriptSuccess([ 5984c17ad94SBram Moolenaar 'vim9script', 5994c17ad94SBram Moolenaar 'func CheckMe()', 6004c17ad94SBram Moolenaar ' return 123', 6014c17ad94SBram Moolenaar 'endfunc', 6024c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6034c17ad94SBram Moolenaar ]) 6044c17ad94SBram Moolenaar 605f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6064c17ad94SBram Moolenaar CheckScriptFailure([ 6074c17ad94SBram Moolenaar 'vim9script', 6084c17ad94SBram Moolenaar 'func DeleteMe1()', 6094c17ad94SBram Moolenaar 'endfunc', 6104c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6114c17ad94SBram Moolenaar ], 'E1084:') 6124c17ad94SBram Moolenaar CheckScriptFailure([ 6134c17ad94SBram Moolenaar 'vim9script', 6144c17ad94SBram Moolenaar 'func DeleteMe2()', 6154c17ad94SBram Moolenaar 'endfunc', 6164c17ad94SBram Moolenaar 'def DoThat()', 6174c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6184c17ad94SBram Moolenaar 'enddef', 6194c17ad94SBram Moolenaar 'DoThat()', 6204c17ad94SBram Moolenaar ], 'E1084:') 6214c17ad94SBram Moolenaar CheckScriptFailure([ 6224c17ad94SBram Moolenaar 'vim9script', 6234c17ad94SBram Moolenaar 'def DeleteMe3()', 6244c17ad94SBram Moolenaar 'enddef', 6254c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6264c17ad94SBram Moolenaar ], 'E1084:') 6274c17ad94SBram Moolenaar CheckScriptFailure([ 6284c17ad94SBram Moolenaar 'vim9script', 6294c17ad94SBram Moolenaar 'def DeleteMe4()', 6304c17ad94SBram Moolenaar 'enddef', 6314c17ad94SBram Moolenaar 'def DoThat()', 6324c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6334c17ad94SBram Moolenaar 'enddef', 6344c17ad94SBram Moolenaar 'DoThat()', 6354c17ad94SBram Moolenaar ], 'E1084:') 636925e9fd6SBram Moolenaar 637925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 638925e9fd6SBram Moolenaar let lines =<< trim END 639925e9fd6SBram Moolenaar vim9script 640925e9fd6SBram Moolenaar def g:Global(): string 641925e9fd6SBram Moolenaar return "yes" 642925e9fd6SBram Moolenaar enddef 643925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 644925e9fd6SBram Moolenaar def! g:Global(): string 645925e9fd6SBram Moolenaar return "no" 646925e9fd6SBram Moolenaar enddef 647925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 648925e9fd6SBram Moolenaar delfunc g:Global 649925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 650925e9fd6SBram Moolenaar END 651925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 652925e9fd6SBram Moolenaar 653925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 654925e9fd6SBram Moolenaar lines =<< trim END 655925e9fd6SBram Moolenaar vim9script 656925e9fd6SBram Moolenaar func g:Global() 657925e9fd6SBram Moolenaar return "yes" 658925e9fd6SBram Moolenaar endfunc 659925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 660925e9fd6SBram Moolenaar def! g:Global(): string 661925e9fd6SBram Moolenaar return "no" 662925e9fd6SBram Moolenaar enddef 663925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 664925e9fd6SBram Moolenaar delfunc g:Global 665925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 666925e9fd6SBram Moolenaar END 667925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 668925e9fd6SBram Moolenaar 669925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 670925e9fd6SBram Moolenaar lines =<< trim END 671925e9fd6SBram Moolenaar vim9script 672925e9fd6SBram Moolenaar def g:Global(): string 673925e9fd6SBram Moolenaar return "yes" 674925e9fd6SBram Moolenaar enddef 675925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 676925e9fd6SBram Moolenaar func! g:Global() 677925e9fd6SBram Moolenaar return "no" 678925e9fd6SBram Moolenaar endfunc 679925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 680925e9fd6SBram Moolenaar delfunc g:Global 681925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 682925e9fd6SBram Moolenaar END 683925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6844c17ad94SBram Moolenaarenddef 6854c17ad94SBram Moolenaar 686599c89c8SBram Moolenaarfunc Test_wrong_type() 687599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 688599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 689599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 690599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 691599c89c8SBram Moolenaar 692599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 693599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 69442a480bfSBram Moolenaar 69542a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 69642a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 69742a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 69842a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 69942a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 70042a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 70142a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 70242a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 70342a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 70442a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 70542a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 706a0a9f43aSBram Moolenaar 707a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 708a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7098a7d6542SBram Moolenaarendfunc 7108a7d6542SBram Moolenaar 7118a7d6542SBram Moolenaarfunc Test_const() 7128a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7138a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7148a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7159be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7168a7d6542SBram Moolenaarendfunc 7178a7d6542SBram Moolenaar 718df069eecSBram Moolenaardef Test_range_no_colon() 719df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 720df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 721df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 722df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 723df069eecSBram Moolenaarenddef 724df069eecSBram Moolenaar 725df069eecSBram Moolenaar 7268a7d6542SBram Moolenaardef Test_block() 7278a7d6542SBram Moolenaar let outer = 1 7288a7d6542SBram Moolenaar { 7298a7d6542SBram Moolenaar let inner = 2 7308a7d6542SBram Moolenaar assert_equal(1, outer) 7318a7d6542SBram Moolenaar assert_equal(2, inner) 7328a7d6542SBram Moolenaar } 7338a7d6542SBram Moolenaar assert_equal(1, outer) 7348a7d6542SBram Moolenaarenddef 7358a7d6542SBram Moolenaar 7368a7d6542SBram Moolenaarfunc Test_block_failure() 7378a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 738585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 739585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7408a7d6542SBram Moolenaarendfunc 7418a7d6542SBram Moolenaar 742585fea7bSBram Moolenaardef Test_cmd_modifier() 743585fea7bSBram Moolenaar tab echo '0' 744585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 745585fea7bSBram Moolenaarenddef 746585fea7bSBram Moolenaar 747d032f34aSBram Moolenaarfunc g:NoSuchFunc() 748d032f34aSBram Moolenaar echo 'none' 749d032f34aSBram Moolenaarendfunc 750d032f34aSBram Moolenaar 7518a7d6542SBram Moolenaardef Test_try_catch() 7528a7d6542SBram Moolenaar let l = [] 7537a092245SBram Moolenaar try # comment 7548a7d6542SBram Moolenaar add(l, '1') 7558a7d6542SBram Moolenaar throw 'wrong' 7568a7d6542SBram Moolenaar add(l, '2') 7577a092245SBram Moolenaar catch # comment 7588a7d6542SBram Moolenaar add(l, v:exception) 7597a092245SBram Moolenaar finally # comment 7608a7d6542SBram Moolenaar add(l, '3') 7617a092245SBram Moolenaar endtry # comment 7628a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 76368d130c6SBram Moolenaar 764e859312eSBram Moolenaar l = [] 765e859312eSBram Moolenaar try 766e859312eSBram Moolenaar try 767e859312eSBram Moolenaar add(l, '1') 768e859312eSBram Moolenaar throw 'wrong' 769e859312eSBram Moolenaar add(l, '2') 770e859312eSBram Moolenaar catch /right/ 771e859312eSBram Moolenaar add(l, v:exception) 772e859312eSBram Moolenaar endtry 773e859312eSBram Moolenaar catch /wrong/ 774e859312eSBram Moolenaar add(l, 'caught') 775e859312eSBram Moolenaar finally 776e859312eSBram Moolenaar add(l, 'finally') 777e859312eSBram Moolenaar endtry 778e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 779e859312eSBram Moolenaar 78068d130c6SBram Moolenaar let n: number 78168d130c6SBram Moolenaar try 78268d130c6SBram Moolenaar n = l[3] 78368d130c6SBram Moolenaar catch /E684:/ 78468d130c6SBram Moolenaar n = 99 78568d130c6SBram Moolenaar endtry 78668d130c6SBram Moolenaar assert_equal(99, n) 78768d130c6SBram Moolenaar 78868d130c6SBram Moolenaar try 78968d130c6SBram Moolenaar n = g:astring[3] 79068d130c6SBram Moolenaar catch /E714:/ 79168d130c6SBram Moolenaar n = 77 79268d130c6SBram Moolenaar endtry 79368d130c6SBram Moolenaar assert_equal(77, n) 79468d130c6SBram Moolenaar 79568d130c6SBram Moolenaar try 79668d130c6SBram Moolenaar n = l[g:astring] 79768d130c6SBram Moolenaar catch /E39:/ 79868d130c6SBram Moolenaar n = 77 79968d130c6SBram Moolenaar endtry 80068d130c6SBram Moolenaar assert_equal(77, n) 80168d130c6SBram Moolenaar 80268d130c6SBram Moolenaar try 80368d130c6SBram Moolenaar n = s:does_not_exist 80468d130c6SBram Moolenaar catch /E121:/ 805f0b9f43cSBram Moolenaar n = 111 806f0b9f43cSBram Moolenaar endtry 807f0b9f43cSBram Moolenaar assert_equal(111, n) 808f0b9f43cSBram Moolenaar 809f0b9f43cSBram Moolenaar try 810f0b9f43cSBram Moolenaar n = g:does_not_exist 811f0b9f43cSBram Moolenaar catch /E121:/ 81268d130c6SBram Moolenaar n = 121 81368d130c6SBram Moolenaar endtry 81468d130c6SBram Moolenaar assert_equal(121, n) 81568d130c6SBram Moolenaar 81668d130c6SBram Moolenaar let d = #{one: 1} 81768d130c6SBram Moolenaar try 81868d130c6SBram Moolenaar n = d[g:astring] 81968d130c6SBram Moolenaar catch /E716:/ 82068d130c6SBram Moolenaar n = 222 82168d130c6SBram Moolenaar endtry 82268d130c6SBram Moolenaar assert_equal(222, n) 823f0b9f43cSBram Moolenaar 824f0b9f43cSBram Moolenaar try 825f0b9f43cSBram Moolenaar n = -g:astring 826f0b9f43cSBram Moolenaar catch /E39:/ 827f0b9f43cSBram Moolenaar n = 233 828f0b9f43cSBram Moolenaar endtry 829f0b9f43cSBram Moolenaar assert_equal(233, n) 830f0b9f43cSBram Moolenaar 831f0b9f43cSBram Moolenaar try 832f0b9f43cSBram Moolenaar n = +g:astring 833f0b9f43cSBram Moolenaar catch /E1030:/ 834f0b9f43cSBram Moolenaar n = 244 835f0b9f43cSBram Moolenaar endtry 836f0b9f43cSBram Moolenaar assert_equal(244, n) 837f0b9f43cSBram Moolenaar 838f0b9f43cSBram Moolenaar try 839f0b9f43cSBram Moolenaar n = +g:alist 840f0b9f43cSBram Moolenaar catch /E745:/ 841f0b9f43cSBram Moolenaar n = 255 842f0b9f43cSBram Moolenaar endtry 843f0b9f43cSBram Moolenaar assert_equal(255, n) 844f0b9f43cSBram Moolenaar 845f0b9f43cSBram Moolenaar let nd: dict<any> 846f0b9f43cSBram Moolenaar try 847f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 848f0b9f43cSBram Moolenaar catch /E1029:/ 849f0b9f43cSBram Moolenaar n = 266 850f0b9f43cSBram Moolenaar endtry 851f0b9f43cSBram Moolenaar assert_equal(266, n) 852f0b9f43cSBram Moolenaar 853f0b9f43cSBram Moolenaar try 854f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 855f0b9f43cSBram Moolenaar catch /E1093:/ 856f0b9f43cSBram Moolenaar n = 277 857f0b9f43cSBram Moolenaar endtry 858f0b9f43cSBram Moolenaar assert_equal(277, n) 859f0b9f43cSBram Moolenaar 860e859312eSBram Moolenaar try 861e859312eSBram Moolenaar &ts = g:astring 862e859312eSBram Moolenaar catch /E1029:/ 863e859312eSBram Moolenaar n = 288 864e859312eSBram Moolenaar endtry 865e859312eSBram Moolenaar assert_equal(288, n) 866e859312eSBram Moolenaar 867e859312eSBram Moolenaar try 868e859312eSBram Moolenaar &backspace = 'asdf' 869e859312eSBram Moolenaar catch /E474:/ 870e859312eSBram Moolenaar n = 299 871e859312eSBram Moolenaar endtry 872e859312eSBram Moolenaar assert_equal(299, n) 873e859312eSBram Moolenaar 874e859312eSBram Moolenaar l = [1] 875e859312eSBram Moolenaar try 876e859312eSBram Moolenaar l[3] = 3 877e859312eSBram Moolenaar catch /E684:/ 878e859312eSBram Moolenaar n = 300 879e859312eSBram Moolenaar endtry 880e859312eSBram Moolenaar assert_equal(300, n) 881e859312eSBram Moolenaar 882e859312eSBram Moolenaar try 883e859312eSBram Moolenaar unlet g:does_not_exist 884e859312eSBram Moolenaar catch /E108:/ 885e859312eSBram Moolenaar n = 322 886e859312eSBram Moolenaar endtry 887e859312eSBram Moolenaar assert_equal(322, n) 888e859312eSBram Moolenaar 889e859312eSBram Moolenaar try 890e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 891e859312eSBram Moolenaar catch /E721:/ 892e859312eSBram Moolenaar n = 333 893e859312eSBram Moolenaar endtry 894e859312eSBram Moolenaar assert_equal(333, n) 895e859312eSBram Moolenaar 896e859312eSBram Moolenaar try 897e859312eSBram Moolenaar l = DeletedFunc() 898e859312eSBram Moolenaar catch /E933:/ 899e859312eSBram Moolenaar n = 344 900e859312eSBram Moolenaar endtry 901e859312eSBram Moolenaar assert_equal(344, n) 902d032f34aSBram Moolenaar 903d032f34aSBram Moolenaar try 904d032f34aSBram Moolenaar echo len(v:true) 905d032f34aSBram Moolenaar catch /E701:/ 906d032f34aSBram Moolenaar n = 355 907d032f34aSBram Moolenaar endtry 908d032f34aSBram Moolenaar assert_equal(355, n) 909d032f34aSBram Moolenaar 910d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 911d032f34aSBram Moolenaar delfunc g:NoSuchFunc 912d032f34aSBram Moolenaar try 913d032f34aSBram Moolenaar echo P() 914d032f34aSBram Moolenaar catch /E117:/ 915d032f34aSBram Moolenaar n = 366 916d032f34aSBram Moolenaar endtry 917d032f34aSBram Moolenaar assert_equal(366, n) 918d032f34aSBram Moolenaar 919d032f34aSBram Moolenaar try 920d032f34aSBram Moolenaar echo g:NoSuchFunc() 921d032f34aSBram Moolenaar catch /E117:/ 922d032f34aSBram Moolenaar n = 377 923d032f34aSBram Moolenaar endtry 924d032f34aSBram Moolenaar assert_equal(377, n) 925d032f34aSBram Moolenaar 926d032f34aSBram Moolenaar try 927d032f34aSBram Moolenaar echo g:alist + 4 928d032f34aSBram Moolenaar catch /E745:/ 929d032f34aSBram Moolenaar n = 388 930d032f34aSBram Moolenaar endtry 931d032f34aSBram Moolenaar assert_equal(388, n) 932d032f34aSBram Moolenaar 933d032f34aSBram Moolenaar try 934d032f34aSBram Moolenaar echo 4 + g:alist 935d032f34aSBram Moolenaar catch /E745:/ 936d032f34aSBram Moolenaar n = 399 937d032f34aSBram Moolenaar endtry 938d032f34aSBram Moolenaar assert_equal(399, n) 939d032f34aSBram Moolenaar 940d032f34aSBram Moolenaar try 941d032f34aSBram Moolenaar echo g:alist.member 942d032f34aSBram Moolenaar catch /E715:/ 943d032f34aSBram Moolenaar n = 400 944d032f34aSBram Moolenaar endtry 945d032f34aSBram Moolenaar assert_equal(400, n) 946d032f34aSBram Moolenaar 947d032f34aSBram Moolenaar try 948d032f34aSBram Moolenaar echo d.member 949d032f34aSBram Moolenaar catch /E716:/ 950d032f34aSBram Moolenaar n = 411 951d032f34aSBram Moolenaar endtry 952d032f34aSBram Moolenaar assert_equal(411, n) 9538a7d6542SBram Moolenaarenddef 9548a7d6542SBram Moolenaar 955e859312eSBram Moolenaardef DeletedFunc(): list<any> 956e859312eSBram Moolenaar return ['delete me'] 957e859312eSBram Moolenaarenddef 958e859312eSBram Moolenaardefcompile 959e859312eSBram Moolenaardelfunc DeletedFunc 960e859312eSBram Moolenaar 961257cc5eeSBram Moolenaardef ThrowFromDef() 962a72cfb80SBram Moolenaar throw "getout" # comment 963257cc5eeSBram Moolenaarenddef 964257cc5eeSBram Moolenaar 965257cc5eeSBram Moolenaarfunc CatchInFunc() 966257cc5eeSBram Moolenaar try 967257cc5eeSBram Moolenaar call ThrowFromDef() 968257cc5eeSBram Moolenaar catch 969257cc5eeSBram Moolenaar let g:thrown_func = v:exception 970257cc5eeSBram Moolenaar endtry 971257cc5eeSBram Moolenaarendfunc 972257cc5eeSBram Moolenaar 973257cc5eeSBram Moolenaardef CatchInDef() 974257cc5eeSBram Moolenaar try 975257cc5eeSBram Moolenaar ThrowFromDef() 976257cc5eeSBram Moolenaar catch 977257cc5eeSBram Moolenaar g:thrown_def = v:exception 978257cc5eeSBram Moolenaar endtry 979257cc5eeSBram Moolenaarenddef 980257cc5eeSBram Moolenaar 981f575adffSBram Moolenaardef ReturnFinally(): string 982f575adffSBram Moolenaar try 983f575adffSBram Moolenaar return 'intry' 984f575adffSBram Moolenaar finally 985f575adffSBram Moolenaar g:in_finally = 'finally' 986f575adffSBram Moolenaar endtry 987f575adffSBram Moolenaar return 'end' 988f575adffSBram Moolenaarenddef 989f575adffSBram Moolenaar 990257cc5eeSBram Moolenaardef Test_try_catch_nested() 991257cc5eeSBram Moolenaar CatchInFunc() 992257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 993257cc5eeSBram Moolenaar 994257cc5eeSBram Moolenaar CatchInDef() 995257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 996f575adffSBram Moolenaar 997f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 998f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 999f575adffSBram Moolenaarenddef 1000f575adffSBram Moolenaar 1001f575adffSBram Moolenaardef Test_try_catch_match() 1002f575adffSBram Moolenaar let seq = 'a' 1003f575adffSBram Moolenaar try 1004f575adffSBram Moolenaar throw 'something' 1005f575adffSBram Moolenaar catch /nothing/ 1006f575adffSBram Moolenaar seq ..= 'x' 1007f575adffSBram Moolenaar catch /some/ 1008f575adffSBram Moolenaar seq ..= 'b' 1009f575adffSBram Moolenaar catch /asdf/ 1010f575adffSBram Moolenaar seq ..= 'x' 1011e8c4abbbSBram Moolenaar catch ?a\?sdf? 1012e8c4abbbSBram Moolenaar seq ..= 'y' 1013f575adffSBram Moolenaar finally 1014f575adffSBram Moolenaar seq ..= 'c' 1015f575adffSBram Moolenaar endtry 1016f575adffSBram Moolenaar assert_equal('abc', seq) 1017257cc5eeSBram Moolenaarenddef 1018257cc5eeSBram Moolenaar 1019e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1020e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1021e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1022e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1023585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1024585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1025585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1026585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1027585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1028585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1029585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1030585fea7bSBram Moolenaar 1031a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1032585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1033e8c4abbbSBram Moolenaarenddef 1034e8c4abbbSBram Moolenaar 1035006ad48bSBram Moolenaardef Test_throw_vimscript() 1036f5be8cdbSBram Moolenaar # only checks line continuation 1037006ad48bSBram Moolenaar let lines =<< trim END 1038006ad48bSBram Moolenaar vim9script 1039006ad48bSBram Moolenaar try 1040006ad48bSBram Moolenaar throw 'one' 1041006ad48bSBram Moolenaar .. 'two' 1042006ad48bSBram Moolenaar catch 1043006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1044006ad48bSBram Moolenaar endtry 1045006ad48bSBram Moolenaar END 1046006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1047006ad48bSBram Moolenaarenddef 1048006ad48bSBram Moolenaar 104937c83711SBram Moolenaardef Test_cexpr_vimscript() 1050f5be8cdbSBram Moolenaar # only checks line continuation 105137c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 105237c83711SBram Moolenaar let lines =<< trim END 105337c83711SBram Moolenaar vim9script 105437c83711SBram Moolenaar cexpr 'File' 105537c83711SBram Moolenaar .. ' someFile' .. 105637c83711SBram Moolenaar ' line 19' 105737c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 105837c83711SBram Moolenaar END 105937c83711SBram Moolenaar CheckScriptSuccess(lines) 106037c83711SBram Moolenaar set errorformat& 106137c83711SBram Moolenaarenddef 106237c83711SBram Moolenaar 1063b209750bSBram Moolenaardef Test_list_vimscript() 1064b209750bSBram Moolenaar # checks line continuation and comments 1065b209750bSBram Moolenaar let lines =<< trim END 1066b209750bSBram Moolenaar vim9script 1067b209750bSBram Moolenaar let mylist = [ 1068b209750bSBram Moolenaar 'one', 1069b209750bSBram Moolenaar # comment 1070b209750bSBram Moolenaar 'two', # empty line follows 1071b209750bSBram Moolenaar 1072b209750bSBram Moolenaar 'three', 1073b209750bSBram Moolenaar ] 1074b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1075b209750bSBram Moolenaar END 1076b209750bSBram Moolenaar CheckScriptSuccess(lines) 1077b209750bSBram Moolenaarenddef 1078b209750bSBram Moolenaar 10792a1381c3SBram Moolenaarif has('channel') 108040ee466cSBram Moolenaar let someJob = test_null_job() 108140ee466cSBram Moolenaar 108240ee466cSBram Moolenaar def FuncWithError() 108340ee466cSBram Moolenaar echomsg g:someJob 108440ee466cSBram Moolenaar enddef 108540ee466cSBram Moolenaar 108640ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 108740ee466cSBram Moolenaar try 108840ee466cSBram Moolenaar call FuncWithError() 108940ee466cSBram Moolenaar catch 109040ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 109140ee466cSBram Moolenaar endtry 109240ee466cSBram Moolenaar endfunc 10932a1381c3SBram Moolenaarendif 109440ee466cSBram Moolenaar 10958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10968a7d6542SBram Moolenaar vim9script 10978a7d6542SBram Moolenaar let name: string = 'bob' 10988a7d6542SBram Moolenaar def Concat(arg: string): string 10998a7d6542SBram Moolenaar return name .. arg 11008a7d6542SBram Moolenaar enddef 1101227a69deSBram Moolenaar g:result = Concat('bie') 1102227a69deSBram Moolenaar g:localname = name 11038a7d6542SBram Moolenaar 11048a7d6542SBram Moolenaar export const CONST = 1234 11058a7d6542SBram Moolenaar export let exported = 9876 11066e587dcbSBram Moolenaar export let exp_name = 'John' 11078a7d6542SBram Moolenaar export def Exported(): string 11088a7d6542SBram Moolenaar return 'Exported' 11098a7d6542SBram Moolenaar enddef 11108a7d6542SBram MoolenaarEND 11118a7d6542SBram Moolenaar 11125269bd2aSBram Moolenaardef Test_vim9_import_export() 11138a7d6542SBram Moolenaar let import_script_lines =<< trim END 11148a7d6542SBram Moolenaar vim9script 11158a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11168a7d6542SBram Moolenaar g:imported = exported 11176e587dcbSBram Moolenaar exported += 3 11186e587dcbSBram Moolenaar g:imported_added = exported 11198a7d6542SBram Moolenaar g:imported_func = Exported() 11206e587dcbSBram Moolenaar 112140f4f7a4SBram Moolenaar def GetExported(): string 112240f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 112340f4f7a4SBram Moolenaar return local_dict.ref() 112440f4f7a4SBram Moolenaar enddef 112540f4f7a4SBram Moolenaar g:funcref_result = GetExported() 112640f4f7a4SBram Moolenaar 11276e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11286e587dcbSBram Moolenaar g:imported_name = exp_name 11296e587dcbSBram Moolenaar exp_name ..= ' Doe' 11306e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11315381c7a1SBram Moolenaar g:imported_later = exported 11328a7d6542SBram Moolenaar END 11338a7d6542SBram Moolenaar 11348a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11358a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11368a7d6542SBram Moolenaar 11378a7d6542SBram Moolenaar source Ximport.vim 11388a7d6542SBram Moolenaar 11398a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11408a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11418a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11426e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11435381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11448a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 114540f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11466e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11476e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11488a7d6542SBram Moolenaar assert_false(exists('g:name')) 11498a7d6542SBram Moolenaar 11508a7d6542SBram Moolenaar unlet g:result 11518a7d6542SBram Moolenaar unlet g:localname 11528a7d6542SBram Moolenaar unlet g:imported 11536e587dcbSBram Moolenaar unlet g:imported_added 11545381c7a1SBram Moolenaar unlet g:imported_later 11558a7d6542SBram Moolenaar unlet g:imported_func 11566e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11578a7d6542SBram Moolenaar delete('Ximport.vim') 1158f2d5c240SBram Moolenaar 11591c991144SBram Moolenaar # similar, with line breaks 11601c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11611c991144SBram Moolenaar vim9script 11621c991144SBram Moolenaar import { 11631c991144SBram Moolenaar exported, 11641c991144SBram Moolenaar Exported, 11651c991144SBram Moolenaar } 11661c991144SBram Moolenaar from 11671c991144SBram Moolenaar './Xexport.vim' 11681c991144SBram Moolenaar g:imported = exported 11691c991144SBram Moolenaar exported += 5 11701c991144SBram Moolenaar g:imported_added = exported 11711c991144SBram Moolenaar g:imported_func = Exported() 11721c991144SBram Moolenaar END 11731c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11741c991144SBram Moolenaar source Ximport_lbr.vim 11751c991144SBram Moolenaar 11761c991144SBram Moolenaar assert_equal(9876, g:imported) 11771c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11781c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11791c991144SBram Moolenaar 11801c991144SBram Moolenaar # exported script not sourced again 11811c991144SBram Moolenaar assert_false(exists('g:result')) 11821c991144SBram Moolenaar unlet g:imported 11831c991144SBram Moolenaar unlet g:imported_added 11841c991144SBram Moolenaar unlet g:imported_func 11851c991144SBram Moolenaar delete('Ximport_lbr.vim') 11861c991144SBram Moolenaar 11871c991144SBram Moolenaar # import inside :def function 11885381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11895381c7a1SBram Moolenaar vim9script 11905381c7a1SBram Moolenaar def ImportInDef() 11915381c7a1SBram Moolenaar import exported from './Xexport.vim' 11925381c7a1SBram Moolenaar g:imported = exported 11935381c7a1SBram Moolenaar exported += 7 11945381c7a1SBram Moolenaar g:imported_added = exported 11955381c7a1SBram Moolenaar enddef 11965381c7a1SBram Moolenaar ImportInDef() 11975381c7a1SBram Moolenaar END 11985381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11995381c7a1SBram Moolenaar source Ximport2.vim 1200f5be8cdbSBram Moolenaar # TODO: this should be 9879 12015381c7a1SBram Moolenaar assert_equal(9876, g:imported) 12025381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 12035381c7a1SBram Moolenaar unlet g:imported 12045381c7a1SBram Moolenaar unlet g:imported_added 12055381c7a1SBram Moolenaar delete('Ximport2.vim') 12065381c7a1SBram Moolenaar 1207f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1208f2d5c240SBram Moolenaar vim9script 1209f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1210f2d5c240SBram Moolenaar def UseExport() 1211f2d5c240SBram Moolenaar g:imported = Export.exported 1212f2d5c240SBram Moolenaar enddef 1213f2d5c240SBram Moolenaar UseExport() 1214f2d5c240SBram Moolenaar END 1215f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1216f2d5c240SBram Moolenaar source Ximport.vim 12175381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1218f2d5c240SBram Moolenaar 1219599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1220599c89c8SBram Moolenaar vim9script 1221599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1222599c89c8SBram Moolenaar def Func() 1223599c89c8SBram Moolenaar let dummy = 1 1224599c89c8SBram Moolenaar let imported = Export + dummy 1225599c89c8SBram Moolenaar enddef 1226822ba247SBram Moolenaar defcompile 1227599c89c8SBram Moolenaar END 1228599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1229599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1230599c89c8SBram Moolenaar 1231599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1232599c89c8SBram Moolenaar vim9script 1233599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1234599c89c8SBram Moolenaar def Func() 1235599c89c8SBram Moolenaar let imported = Export . exported 1236599c89c8SBram Moolenaar enddef 1237822ba247SBram Moolenaar defcompile 1238599c89c8SBram Moolenaar END 1239599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1240599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1241599c89c8SBram Moolenaar 1242599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1243599c89c8SBram Moolenaar vim9script 1244599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1245599c89c8SBram Moolenaar def Func() 1246599c89c8SBram Moolenaar let imported = Export. 1247599c89c8SBram Moolenaar enddef 1248822ba247SBram Moolenaar defcompile 1249599c89c8SBram Moolenaar END 1250599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1251599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1252599c89c8SBram Moolenaar 12531c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12541c991144SBram Moolenaar vim9script 12551c991144SBram Moolenaar import * 12561c991144SBram Moolenaar as Export 12571c991144SBram Moolenaar from 12581c991144SBram Moolenaar './Xexport.vim' 12591c991144SBram Moolenaar def UseExport() 12601c991144SBram Moolenaar g:imported = Export.exported 12611c991144SBram Moolenaar enddef 12621c991144SBram Moolenaar UseExport() 12631c991144SBram Moolenaar END 12641c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12651c991144SBram Moolenaar source Ximport.vim 12661c991144SBram Moolenaar assert_equal(9883, g:imported) 12671c991144SBram Moolenaar 1268f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1269f2d5c240SBram Moolenaar vim9script 1270f2d5c240SBram Moolenaar import * from './Xexport.vim' 1271f2d5c240SBram Moolenaar END 1272f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1273f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1274f2d5c240SBram Moolenaar 1275f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1276fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1277fa29c8abSBram Moolenaar vim9script 1278fa29c8abSBram Moolenaar import name from './Xexport.vim' 1279fa29c8abSBram Moolenaar END 1280fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1281fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1282fa29c8abSBram Moolenaar 1283f5be8cdbSBram Moolenaar # try to import something that is already defined 12845269bd2aSBram Moolenaar let import_already_defined =<< trim END 12855269bd2aSBram Moolenaar vim9script 12865269bd2aSBram Moolenaar let exported = 'something' 12875269bd2aSBram Moolenaar import exported from './Xexport.vim' 12885269bd2aSBram Moolenaar END 12895269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12905269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12915269bd2aSBram Moolenaar 1292f5be8cdbSBram Moolenaar # try to import something that is already defined 12935269bd2aSBram Moolenaar import_already_defined =<< trim END 12945269bd2aSBram Moolenaar vim9script 12955269bd2aSBram Moolenaar let exported = 'something' 12965269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12975269bd2aSBram Moolenaar END 12985269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12995269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13005269bd2aSBram Moolenaar 1301f5be8cdbSBram Moolenaar # try to import something that is already defined 13025269bd2aSBram Moolenaar import_already_defined =<< trim END 13035269bd2aSBram Moolenaar vim9script 13045269bd2aSBram Moolenaar let exported = 'something' 13055269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13065269bd2aSBram Moolenaar END 13075269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13085269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13095269bd2aSBram Moolenaar 1310f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1311fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1312fa29c8abSBram Moolenaar vim9script 1313fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1314fa29c8abSBram Moolenaar END 1315fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1316fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1317fa29c8abSBram Moolenaar 1318fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1319fa29c8abSBram Moolenaar vim9script 1320fa29c8abSBram Moolenaar import name './Xexport.vim' 1321fa29c8abSBram Moolenaar END 1322fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1323fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1324fa29c8abSBram Moolenaar 1325fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1326fa29c8abSBram Moolenaar vim9script 1327fa29c8abSBram Moolenaar import name from Xexport.vim 1328fa29c8abSBram Moolenaar END 1329fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1330fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1331fa29c8abSBram Moolenaar 1332fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1333fa29c8abSBram Moolenaar vim9script 1334fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1335fa29c8abSBram Moolenaar END 1336fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1337fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1338fa29c8abSBram Moolenaar 1339fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1340fa29c8abSBram Moolenaar vim9script 1341fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1342fa29c8abSBram Moolenaar END 13435269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13445269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1345fa29c8abSBram Moolenaar 1346f2d5c240SBram Moolenaar delete('Ximport.vim') 13475269bd2aSBram Moolenaar delete('Ximport3.vim') 13488a7d6542SBram Moolenaar delete('Xexport.vim') 13498a7d6542SBram Moolenaar 1350f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1351750802b5SBram Moolenaar set cpo&vi 1352750802b5SBram Moolenaar let cpo_before = &cpo 1353750802b5SBram Moolenaar let lines =<< trim END 1354750802b5SBram Moolenaar vim9script 1355750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1356750802b5SBram Moolenaar END 1357750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1358750802b5SBram Moolenaar source Xvim9_script 1359750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1360750802b5SBram Moolenaar set cpo&vim 1361750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1362750802b5SBram Moolenaar delete('Xvim9_script') 1363750802b5SBram Moolenaarenddef 1364750802b5SBram Moolenaar 1365803af686SBram Moolenaarfunc g:Trigger() 1366803af686SBram Moolenaar source Ximport.vim 1367803af686SBram Moolenaar return "echo 'yes'\<CR>" 1368803af686SBram Moolenaarendfunc 1369803af686SBram Moolenaar 1370803af686SBram Moolenaardef Test_import_export_expr_map() 1371803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1372803af686SBram Moolenaar let export_lines =<< trim END 1373803af686SBram Moolenaar vim9script 1374803af686SBram Moolenaar export def That(): string 1375803af686SBram Moolenaar return 'yes' 1376803af686SBram Moolenaar enddef 1377803af686SBram Moolenaar END 1378803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1379803af686SBram Moolenaar 1380803af686SBram Moolenaar let import_lines =<< trim END 1381803af686SBram Moolenaar vim9script 1382803af686SBram Moolenaar import That from './Xexport_that.vim' 1383803af686SBram Moolenaar assert_equal('yes', That()) 1384803af686SBram Moolenaar END 1385803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1386803af686SBram Moolenaar 1387803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1388803af686SBram Moolenaar feedkeys('trigger', "xt") 1389803af686SBram Moolenaar 1390803af686SBram Moolenaar delete('Xexport.vim') 1391803af686SBram Moolenaar delete('Ximport.vim') 1392803af686SBram Moolenaar nunmap trigger 1393803af686SBram Moolenaarenddef 1394803af686SBram Moolenaar 13958e1986e3SBram Moolenaardef Test_import_in_filetype() 13968e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13978e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 13988e1986e3SBram Moolenaar let export_lines =<< trim END 13998e1986e3SBram Moolenaar vim9script 14008e1986e3SBram Moolenaar export let That = 'yes' 14018e1986e3SBram Moolenaar END 14028e1986e3SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_that.vim') 14038e1986e3SBram Moolenaar 14048e1986e3SBram Moolenaar let import_lines =<< trim END 14058e1986e3SBram Moolenaar vim9script 14068e1986e3SBram Moolenaar import That from './Xexport_that.vim' 14078e1986e3SBram Moolenaar assert_equal('yes', That) 14088e1986e3SBram Moolenaar g:did_load_mytpe = 1 14098e1986e3SBram Moolenaar END 14108e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14118e1986e3SBram Moolenaar 14128e1986e3SBram Moolenaar let save_rtp = &rtp 14138e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14148e1986e3SBram Moolenaar 14158e1986e3SBram Moolenaar filetype plugin on 14168e1986e3SBram Moolenaar copen 14178e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14188e1986e3SBram Moolenaar 14198e1986e3SBram Moolenaar quit! 14208e1986e3SBram Moolenaar delete('Xexport.vim') 14218e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14228e1986e3SBram Moolenaar &rtp = save_rtp 14238e1986e3SBram Moolenaarenddef 14248e1986e3SBram Moolenaar 1425750802b5SBram Moolenaardef Test_vim9script_fails() 14268a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14278a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1428750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 14299721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 14309b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1431750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1432750802b5SBram Moolenaar 1433c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1434c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1435c785b9a7SBram Moolenaar 1436750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1437a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 14388a7d6542SBram Moolenaarenddef 14398a7d6542SBram Moolenaar 1440f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1441101f4810SBram Moolenaar CheckRunVimInTerminal 1442101f4810SBram Moolenaar 14439bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1444c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14459bb3eb3eSBram Moolenaarendfunc 14469bb3eb3eSBram Moolenaar 1447c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1448101f4810SBram Moolenaar let export =<< trim END 1449101f4810SBram Moolenaar vim9script 1450101f4810SBram Moolenaar export def Foo(): number 1451101f4810SBram Moolenaar return 0 1452101f4810SBram Moolenaar enddef 1453101f4810SBram Moolenaar END 14549bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1455101f4810SBram Moolenaar 14569bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 14579bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14589bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1459101f4810SBram Moolenaar 14609bb3eb3eSBram Moolenaar delete('Xexport.vim') 14619bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14629bb3eb3eSBram Moolenaarenddef 1463101f4810SBram Moolenaar 14644c17ad94SBram Moolenaardef Test_vim9script_reload_import() 14658a7d6542SBram Moolenaar let lines =<< trim END 14668a7d6542SBram Moolenaar vim9script 14678a7d6542SBram Moolenaar const var = '' 14688a7d6542SBram Moolenaar let valone = 1234 14698a7d6542SBram Moolenaar def MyFunc(arg: string) 14708a7d6542SBram Moolenaar valone = 5678 14718a7d6542SBram Moolenaar enddef 14728a7d6542SBram Moolenaar END 14738a7d6542SBram Moolenaar let morelines =<< trim END 14748a7d6542SBram Moolenaar let valtwo = 222 14758a7d6542SBram Moolenaar export def GetValtwo(): number 14768a7d6542SBram Moolenaar return valtwo 14778a7d6542SBram Moolenaar enddef 14788a7d6542SBram Moolenaar END 147903afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14808a7d6542SBram Moolenaar source Xreload.vim 14818a7d6542SBram Moolenaar source Xreload.vim 14828a7d6542SBram Moolenaar source Xreload.vim 14838a7d6542SBram Moolenaar 14848a7d6542SBram Moolenaar let testlines =<< trim END 14858a7d6542SBram Moolenaar vim9script 14868a7d6542SBram Moolenaar def TheFunc() 14878a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14888a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14898a7d6542SBram Moolenaar enddef 14908a7d6542SBram Moolenaar TheFunc() 14918a7d6542SBram Moolenaar END 14928a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14938a7d6542SBram Moolenaar source Ximport.vim 14948a7d6542SBram Moolenaar 1495f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1496f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14978a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14988a7d6542SBram Moolenaar source Ximport.vim 14998a7d6542SBram Moolenaar 1500f5be8cdbSBram Moolenaar # cannot declare a var twice 15018a7d6542SBram Moolenaar lines =<< trim END 15028a7d6542SBram Moolenaar vim9script 15038a7d6542SBram Moolenaar let valone = 1234 15048a7d6542SBram Moolenaar let valone = 5678 15058a7d6542SBram Moolenaar END 15068a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15078a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 15088a7d6542SBram Moolenaar 15098a7d6542SBram Moolenaar delete('Xreload.vim') 15108a7d6542SBram Moolenaar delete('Ximport.vim') 15118a7d6542SBram Moolenaarenddef 15128a7d6542SBram Moolenaar 1513fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1514fe465a01SBram Moolenaar" script-local name. 1515fe465a01SBram Moolenaardef Test_vim9script_funcref() 1516fe465a01SBram Moolenaar let sortlines =<< trim END 1517fe465a01SBram Moolenaar vim9script 1518fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1519bed36b93SBram Moolenaar return i2 - i1 1520fe465a01SBram Moolenaar enddef 1521fe465a01SBram Moolenaar 1522fe465a01SBram Moolenaar export def FastSort(): list<number> 1523fe465a01SBram Moolenaar return range(5)->sort(Compare) 1524fe465a01SBram Moolenaar enddef 1525fe465a01SBram Moolenaar END 1526fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1527fe465a01SBram Moolenaar 1528fe465a01SBram Moolenaar let lines =<< trim END 1529fe465a01SBram Moolenaar vim9script 1530fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1531fe465a01SBram Moolenaar def Test() 1532fe465a01SBram Moolenaar g:result = FastSort() 1533fe465a01SBram Moolenaar enddef 1534fe465a01SBram Moolenaar Test() 1535fe465a01SBram Moolenaar END 1536fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1537fe465a01SBram Moolenaar 1538fe465a01SBram Moolenaar source Xscript.vim 1539fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1540fe465a01SBram Moolenaar 1541fe465a01SBram Moolenaar unlet g:result 1542fe465a01SBram Moolenaar delete('Xsort.vim') 1543fe465a01SBram Moolenaar delete('Xscript.vim') 1544fe465a01SBram Moolenaarenddef 1545fe465a01SBram Moolenaar 1546c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1547c620c055SBram Moolenaar" script where FastFilter() is called from. 1548c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1549c620c055SBram Moolenaar let filterLines =<< trim END 1550c620c055SBram Moolenaar vim9script 1551c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1552c620c055SBram Moolenaar return idx % 2 == 1 1553c620c055SBram Moolenaar enddef 1554c620c055SBram Moolenaar export def FastFilter(): list<number> 1555c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1556c620c055SBram Moolenaar enddef 1557c620c055SBram Moolenaar END 1558c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1559c620c055SBram Moolenaar 1560c620c055SBram Moolenaar let lines =<< trim END 1561c620c055SBram Moolenaar vim9script 1562c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1563c620c055SBram Moolenaar def Test() 1564c620c055SBram Moolenaar let x: list<number> = FastFilter() 1565c620c055SBram Moolenaar enddef 1566c620c055SBram Moolenaar Test() 1567c620c055SBram Moolenaar END 1568c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1569c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1570c620c055SBram Moolenaar 1571c620c055SBram Moolenaar delete('Xfilter.vim') 1572c620c055SBram Moolenaar delete('Ximport.vim') 1573c620c055SBram Moolenaarenddef 1574c620c055SBram Moolenaar 15754c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 15764c17ad94SBram Moolenaar let first_lines =<< trim END 15774c17ad94SBram Moolenaar vim9script 15784c17ad94SBram Moolenaar def FuncYes(): string 15794c17ad94SBram Moolenaar return 'yes' 15804c17ad94SBram Moolenaar enddef 15814c17ad94SBram Moolenaar END 158203afdcf1SBram Moolenaar let withno_lines =<< trim END 15834c17ad94SBram Moolenaar def FuncNo(): string 15844c17ad94SBram Moolenaar return 'no' 15854c17ad94SBram Moolenaar enddef 15864c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15874c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15884c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 158903afdcf1SBram Moolenaar enddef 159003afdcf1SBram Moolenaar END 159103afdcf1SBram Moolenaar let nono_lines =<< trim END 159203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 159303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 15944c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 15954c17ad94SBram Moolenaar enddef 15964c17ad94SBram Moolenaar END 15974c17ad94SBram Moolenaar 15984c17ad94SBram Moolenaar # FuncNo() is defined 159903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16004c17ad94SBram Moolenaar source Xreloaded.vim 16014c17ad94SBram Moolenaar g:DoCheck(true) 16024c17ad94SBram Moolenaar 16034c17ad94SBram Moolenaar # FuncNo() is not redefined 160403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16054c17ad94SBram Moolenaar source Xreloaded.vim 160603afdcf1SBram Moolenaar g:DoCheck() 16074c17ad94SBram Moolenaar 16084c17ad94SBram Moolenaar # FuncNo() is back 160903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16104c17ad94SBram Moolenaar source Xreloaded.vim 161103afdcf1SBram Moolenaar g:DoCheck() 16124c17ad94SBram Moolenaar 16134c17ad94SBram Moolenaar delete('Xreloaded.vim') 16144c17ad94SBram Moolenaarenddef 16154c17ad94SBram Moolenaar 161689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 161789483d40SBram Moolenaar # write the script with a script-local variable 161889483d40SBram Moolenaar let lines =<< trim END 161989483d40SBram Moolenaar vim9script 162089483d40SBram Moolenaar let var = 'string' 162189483d40SBram Moolenaar END 162289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 162389483d40SBram Moolenaar source XreloadVar.vim 162489483d40SBram Moolenaar 162589483d40SBram Moolenaar # now write the script using the same variable locally - works 162689483d40SBram Moolenaar lines =<< trim END 162789483d40SBram Moolenaar vim9script 162889483d40SBram Moolenaar def Func() 162989483d40SBram Moolenaar let var = 'string' 163089483d40SBram Moolenaar enddef 163189483d40SBram Moolenaar END 163289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 163389483d40SBram Moolenaar source XreloadVar.vim 163489483d40SBram Moolenaar 163589483d40SBram Moolenaar delete('XreloadVar.vim') 163689483d40SBram Moolenaarenddef 163789483d40SBram Moolenaar 16388a7d6542SBram Moolenaardef Test_import_absolute() 16398a7d6542SBram Moolenaar let import_lines = [ 1640e6085c53SBram Moolenaar 'vim9script', 1641e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1642e6085c53SBram Moolenaar 'def UseExported()', 1643e6085c53SBram Moolenaar ' g:imported_abs = exported', 1644e6085c53SBram Moolenaar ' exported = 8888', 1645e6085c53SBram Moolenaar ' g:imported_after = exported', 1646e6085c53SBram Moolenaar 'enddef', 1647e6085c53SBram Moolenaar 'UseExported()', 1648e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1649e6085c53SBram Moolenaar ] 16508a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16518a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16528a7d6542SBram Moolenaar 16538a7d6542SBram Moolenaar source Ximport_abs.vim 16548a7d6542SBram Moolenaar 16558a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16564e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1657675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1658675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1659675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1660675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1661675f716eSBram Moolenaar 'exported = 8888.*' .. 1662675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1663675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1664675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1665675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1666e6085c53SBram Moolenaar g:import_disassembled) 16678a7d6542SBram Moolenaar unlet g:imported_abs 16684e12a5dfSBram Moolenaar unlet g:import_disassembled 16698a7d6542SBram Moolenaar 16708a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16718a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16728a7d6542SBram Moolenaarenddef 16738a7d6542SBram Moolenaar 16748a7d6542SBram Moolenaardef Test_import_rtp() 16758a7d6542SBram Moolenaar let import_lines = [ 1676e6085c53SBram Moolenaar 'vim9script', 1677e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1678e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1679e6085c53SBram Moolenaar ] 16808a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16818a7d6542SBram Moolenaar mkdir('import') 16828a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16838a7d6542SBram Moolenaar 16848a7d6542SBram Moolenaar let save_rtp = &rtp 16858a7d6542SBram Moolenaar &rtp = getcwd() 16868a7d6542SBram Moolenaar source Ximport_rtp.vim 16878a7d6542SBram Moolenaar &rtp = save_rtp 16888a7d6542SBram Moolenaar 16898a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16908a7d6542SBram Moolenaar unlet g:imported_rtp 16918a7d6542SBram Moolenaar 16928a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 169389483d40SBram Moolenaar delete('import', 'rf') 16948a7d6542SBram Moolenaarenddef 16958a7d6542SBram Moolenaar 169625e0f586SBram Moolenaardef Test_import_compile_error() 169725e0f586SBram Moolenaar let export_lines = [ 169825e0f586SBram Moolenaar 'vim9script', 169925e0f586SBram Moolenaar 'export def ExpFunc(): string', 170025e0f586SBram Moolenaar ' return notDefined', 170125e0f586SBram Moolenaar 'enddef', 170225e0f586SBram Moolenaar ] 170325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 170425e0f586SBram Moolenaar 170525e0f586SBram Moolenaar let import_lines = [ 170625e0f586SBram Moolenaar 'vim9script', 170725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 170825e0f586SBram Moolenaar 'def ImpFunc()', 170925e0f586SBram Moolenaar ' echo ExpFunc()', 171025e0f586SBram Moolenaar 'enddef', 171125e0f586SBram Moolenaar 'defcompile', 171225e0f586SBram Moolenaar ] 171325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 171425e0f586SBram Moolenaar 171525e0f586SBram Moolenaar try 171625e0f586SBram Moolenaar source Ximport.vim 171725e0f586SBram Moolenaar catch /E1001/ 1718f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 171925e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 172025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 172125e0f586SBram Moolenaar endtry 172225e0f586SBram Moolenaar 172325e0f586SBram Moolenaar delete('Xexported.vim') 172425e0f586SBram Moolenaar delete('Ximport.vim') 172525e0f586SBram Moolenaarenddef 172625e0f586SBram Moolenaar 1727eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1728eef2102eSBram Moolenaar let export_lines =<< trim END 1729eef2102eSBram Moolenaar vim9script 1730eef2102eSBram Moolenaar export def Func() 1731eef2102eSBram Moolenaar echo 'imported' 1732eef2102eSBram Moolenaar enddef 1733eef2102eSBram Moolenaar END 1734eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1735eef2102eSBram Moolenaar 1736eef2102eSBram Moolenaar let lines =<< trim END 1737eef2102eSBram Moolenaar vim9script 1738eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1739eef2102eSBram Moolenaar def Func() 1740eef2102eSBram Moolenaar echo 'local to function' 1741eef2102eSBram Moolenaar enddef 1742eef2102eSBram Moolenaar END 1743eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1744eef2102eSBram Moolenaar 1745eef2102eSBram Moolenaar lines =<< trim END 1746eef2102eSBram Moolenaar vim9script 1747eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1748eef2102eSBram Moolenaar def Outer() 1749eef2102eSBram Moolenaar def Func() 1750eef2102eSBram Moolenaar echo 'local to function' 1751eef2102eSBram Moolenaar enddef 1752eef2102eSBram Moolenaar enddef 1753eef2102eSBram Moolenaar defcompile 1754eef2102eSBram Moolenaar END 1755eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1756eef2102eSBram Moolenaar 1757eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1758eef2102eSBram Moolenaarenddef 1759eef2102eSBram Moolenaar 1760b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1761b9a2cac3SBram Moolenaar let lines =<< trim END 1762b9a2cac3SBram Moolenaar vim9script 1763b9a2cac3SBram Moolenaar def Func() 1764b9a2cac3SBram Moolenaar echo 'one' 1765b9a2cac3SBram Moolenaar enddef 1766b9a2cac3SBram Moolenaar def Func() 1767b9a2cac3SBram Moolenaar echo 'two' 1768b9a2cac3SBram Moolenaar enddef 1769b9a2cac3SBram Moolenaar END 1770b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1771b9a2cac3SBram Moolenaarenddef 1772b9a2cac3SBram Moolenaar 17738a7d6542SBram Moolenaardef Test_fixed_size_list() 1774f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 17758a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 17768a7d6542SBram Moolenaar l->remove(0) 17778a7d6542SBram Moolenaar l->add(5) 17788a7d6542SBram Moolenaar l->insert(99, 1) 17790f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17808a7d6542SBram Moolenaarenddef 17818a7d6542SBram Moolenaar 1782ae616494SBram Moolenaardef Test_no_insert_xit() 1783ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1784ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1785f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1786f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1787f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1788ae616494SBram Moolenaar 1789ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1790ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1791ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1792ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1793f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1794f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1795f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1796f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1797f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1798ae616494SBram Moolenaarenddef 1799ae616494SBram Moolenaar 1800158906cfSBram Moolenaardef IfElse(what: number): string 1801158906cfSBram Moolenaar let res = '' 1802158906cfSBram Moolenaar if what == 1 1803158906cfSBram Moolenaar res = "one" 1804158906cfSBram Moolenaar elseif what == 2 1805158906cfSBram Moolenaar res = "two" 1806a259d8d3SBram Moolenaar else 1807158906cfSBram Moolenaar res = "three" 1808a259d8d3SBram Moolenaar endif 1809158906cfSBram Moolenaar return res 1810a259d8d3SBram Moolenaarenddef 1811a259d8d3SBram Moolenaar 1812158906cfSBram Moolenaardef Test_if_elseif_else() 1813158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1814158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1815158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18160f18b6d1SBram Moolenaarenddef 18170f18b6d1SBram Moolenaar 1818e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1819e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1820e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1821e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1822e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1823585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1824e8c4abbbSBram Moolenaarenddef 1825e8c4abbbSBram Moolenaar 18266d69bf60SBram Moolenaarlet g:bool_true = v:true 18276d69bf60SBram Moolenaarlet g:bool_false = v:false 18286d69bf60SBram Moolenaar 18296d69bf60SBram Moolenaardef Test_if_const_expr() 18306d69bf60SBram Moolenaar let res = false 18316d69bf60SBram Moolenaar if true ? true : false 18326d69bf60SBram Moolenaar res = true 18336d69bf60SBram Moolenaar endif 18346d69bf60SBram Moolenaar assert_equal(true, res) 18356d69bf60SBram Moolenaar 1836585fea7bSBram Moolenaar g:glob = 2 1837585fea7bSBram Moolenaar if false 18386797966dSBram Moolenaar execute('g:glob = 3') 1839585fea7bSBram Moolenaar endif 1840585fea7bSBram Moolenaar assert_equal(2, g:glob) 1841585fea7bSBram Moolenaar if true 18426797966dSBram Moolenaar execute('g:glob = 3') 1843585fea7bSBram Moolenaar endif 1844585fea7bSBram Moolenaar assert_equal(3, g:glob) 1845585fea7bSBram Moolenaar 18466d69bf60SBram Moolenaar res = false 18476d69bf60SBram Moolenaar if g:bool_true ? true : false 18486d69bf60SBram Moolenaar res = true 18496d69bf60SBram Moolenaar endif 18506d69bf60SBram Moolenaar assert_equal(true, res) 18516d69bf60SBram Moolenaar 18526d69bf60SBram Moolenaar res = false 18536d69bf60SBram Moolenaar if true ? g:bool_true : false 18546d69bf60SBram Moolenaar res = true 18556d69bf60SBram Moolenaar endif 18566d69bf60SBram Moolenaar assert_equal(true, res) 18576d69bf60SBram Moolenaar 18586d69bf60SBram Moolenaar res = false 18596d69bf60SBram Moolenaar if true ? true : g:bool_false 18606d69bf60SBram Moolenaar res = true 18616d69bf60SBram Moolenaar endif 18626d69bf60SBram Moolenaar assert_equal(true, res) 18636d69bf60SBram Moolenaar 18646d69bf60SBram Moolenaar res = false 18656d69bf60SBram Moolenaar if true ? false : true 18666d69bf60SBram Moolenaar res = true 18676d69bf60SBram Moolenaar endif 18686d69bf60SBram Moolenaar assert_equal(false, res) 18696d69bf60SBram Moolenaar 18706d69bf60SBram Moolenaar res = false 18716d69bf60SBram Moolenaar if false ? false : true 18726d69bf60SBram Moolenaar res = true 18736d69bf60SBram Moolenaar endif 18746d69bf60SBram Moolenaar assert_equal(true, res) 18756d69bf60SBram Moolenaar 18766d69bf60SBram Moolenaar res = false 18776d69bf60SBram Moolenaar if false ? true : false 18786d69bf60SBram Moolenaar res = true 18796d69bf60SBram Moolenaar endif 18806d69bf60SBram Moolenaar assert_equal(false, res) 18816d69bf60SBram Moolenaar 18826d69bf60SBram Moolenaar res = false 1883e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1884e8c4abbbSBram Moolenaar res = true 1885e8c4abbbSBram Moolenaar endif 1886e8c4abbbSBram Moolenaar assert_equal(false, res) 1887e8c4abbbSBram Moolenaar 1888e8c4abbbSBram Moolenaar res = false 18896d69bf60SBram Moolenaar if true && true 18906d69bf60SBram Moolenaar res = true 18916d69bf60SBram Moolenaar endif 18926d69bf60SBram Moolenaar assert_equal(true, res) 18936d69bf60SBram Moolenaar 18946d69bf60SBram Moolenaar res = false 18956d69bf60SBram Moolenaar if true && false 18966d69bf60SBram Moolenaar res = true 18976d69bf60SBram Moolenaar endif 18986d69bf60SBram Moolenaar assert_equal(false, res) 18996d69bf60SBram Moolenaar 19006d69bf60SBram Moolenaar res = false 19016d69bf60SBram Moolenaar if g:bool_true && false 19026d69bf60SBram Moolenaar res = true 19036d69bf60SBram Moolenaar endif 19046d69bf60SBram Moolenaar assert_equal(false, res) 19056d69bf60SBram Moolenaar 19066d69bf60SBram Moolenaar res = false 19076d69bf60SBram Moolenaar if true && g:bool_false 19086d69bf60SBram Moolenaar res = true 19096d69bf60SBram Moolenaar endif 19106d69bf60SBram Moolenaar assert_equal(false, res) 19116d69bf60SBram Moolenaar 19126d69bf60SBram Moolenaar res = false 19136d69bf60SBram Moolenaar if false && false 19146d69bf60SBram Moolenaar res = true 19156d69bf60SBram Moolenaar endif 19166d69bf60SBram Moolenaar assert_equal(false, res) 19176d69bf60SBram Moolenaar 19186d69bf60SBram Moolenaar res = false 19196d69bf60SBram Moolenaar if true || false 19206d69bf60SBram Moolenaar res = true 19216d69bf60SBram Moolenaar endif 19226d69bf60SBram Moolenaar assert_equal(true, 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(true, 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(true, 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) 194180c34ca3SBram Moolenaarenddef 19426d69bf60SBram Moolenaar 194380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 194480c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 194580c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1946e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1947e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19486d69bf60SBram Moolenaarenddef 19496d69bf60SBram Moolenaar 195072abcf42SBram Moolenaardef RunNested(i: number): number 195172abcf42SBram Moolenaar let x: number = 0 195272abcf42SBram Moolenaar if i % 2 195372abcf42SBram Moolenaar if 1 1954f5be8cdbSBram Moolenaar # comment 195572abcf42SBram Moolenaar else 1956f5be8cdbSBram Moolenaar # comment 195772abcf42SBram Moolenaar endif 195872abcf42SBram Moolenaar x += 1 195972abcf42SBram Moolenaar else 196072abcf42SBram Moolenaar x += 1000 196172abcf42SBram Moolenaar endif 196272abcf42SBram Moolenaar return x 196372abcf42SBram Moolenaarenddef 196472abcf42SBram Moolenaar 196572abcf42SBram Moolenaardef Test_nested_if() 196672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 196772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 196872abcf42SBram Moolenaarenddef 196972abcf42SBram Moolenaar 1970ad39c094SBram Moolenaardef Test_execute_cmd() 1971ad39c094SBram Moolenaar new 1972ad39c094SBram Moolenaar setline(1, 'default') 1973ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1974ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1975a72cfb80SBram Moolenaar 1976a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1977a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1978a72cfb80SBram Moolenaar 1979ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1980ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1981a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1982ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1983a72cfb80SBram Moolenaar 1984ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1985ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1986a72cfb80SBram Moolenaar 1987ad39c094SBram Moolenaar let cmd_first = 'call ' 1988ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1989ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1990ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1991ad39c094SBram Moolenaar bwipe! 1992585fea7bSBram Moolenaar 19932d6b20d6SBram Moolenaar let n = true 19942d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19952d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19962d6b20d6SBram Moolenaar 1997585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1998a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1999ad39c094SBram Moolenaarenddef 2000ad39c094SBram Moolenaar 200147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2002f5be8cdbSBram Moolenaar # only checks line continuation 200347e880d6SBram Moolenaar let lines =<< trim END 200447e880d6SBram Moolenaar vim9script 200547e880d6SBram Moolenaar execute 'g:someVar' 200647e880d6SBram Moolenaar .. ' = ' .. 200747e880d6SBram Moolenaar '28' 200847e880d6SBram Moolenaar assert_equal(28, g:someVar) 200947e880d6SBram Moolenaar unlet g:someVar 201047e880d6SBram Moolenaar END 201147e880d6SBram Moolenaar CheckScriptSuccess(lines) 201247e880d6SBram Moolenaarenddef 201347e880d6SBram Moolenaar 2014ad39c094SBram Moolenaardef Test_echo_cmd() 2015a72cfb80SBram Moolenaar echo 'some' # comment 2016585fea7bSBram Moolenaar echon 'thing' 2017ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2018ad39c094SBram Moolenaar 2019a72cfb80SBram Moolenaar echo "some" # comment 2020a72cfb80SBram Moolenaar echon "thing" 2021a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2022a72cfb80SBram Moolenaar 2023ad39c094SBram Moolenaar let str1 = 'some' 2024ad39c094SBram Moolenaar let str2 = 'more' 2025ad39c094SBram Moolenaar echo str1 str2 2026ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2027a72cfb80SBram Moolenaar 2028a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2029ad39c094SBram Moolenaarenddef 2030ad39c094SBram Moolenaar 2031f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2032f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2033f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2034f93c7feaSBram Moolenaar echo 'clear' 2035df069eecSBram Moolenaar :1messages 2036f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2037f93c7feaSBram Moolenaar 2038f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2039f93c7feaSBram Moolenaarenddef 2040f93c7feaSBram Moolenaar 204147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2042f5be8cdbSBram Moolenaar # only checks line continuation 204347e880d6SBram Moolenaar let lines =<< trim END 204447e880d6SBram Moolenaar vim9script 204547e880d6SBram Moolenaar echomsg 'here' 204647e880d6SBram Moolenaar .. ' is ' .. 204747e880d6SBram Moolenaar 'a message' 204847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 204947e880d6SBram Moolenaar END 205047e880d6SBram Moolenaar CheckScriptSuccess(lines) 205147e880d6SBram Moolenaarenddef 205247e880d6SBram Moolenaar 2053f93c7feaSBram Moolenaardef Test_echoerr_cmd() 205440ee466cSBram Moolenaar try 205540ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 205640ee466cSBram Moolenaar catch 205740ee466cSBram Moolenaar assert_match('something wrong', v:exception) 205840ee466cSBram Moolenaar endtry 2059f93c7feaSBram Moolenaarenddef 2060f93c7feaSBram Moolenaar 206147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2062f5be8cdbSBram Moolenaar # only checks line continuation 206347e880d6SBram Moolenaar let lines =<< trim END 206447e880d6SBram Moolenaar vim9script 206547e880d6SBram Moolenaar try 206647e880d6SBram Moolenaar echoerr 'this' 206747e880d6SBram Moolenaar .. ' is ' .. 206847e880d6SBram Moolenaar 'wrong' 206947e880d6SBram Moolenaar catch 207047e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 207147e880d6SBram Moolenaar endtry 207247e880d6SBram Moolenaar END 207347e880d6SBram Moolenaar CheckScriptSuccess(lines) 207447e880d6SBram Moolenaarenddef 207547e880d6SBram Moolenaar 207641fe0617SBram Moolenaardef Test_for_outside_of_function() 207741fe0617SBram Moolenaar let lines =<< trim END 207841fe0617SBram Moolenaar vim9script 207941fe0617SBram Moolenaar new 208041fe0617SBram Moolenaar for var in range(0, 3) 208141fe0617SBram Moolenaar append(line('$'), var) 208241fe0617SBram Moolenaar endfor 208341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 208441fe0617SBram Moolenaar bwipe! 208541fe0617SBram Moolenaar END 208641fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 208741fe0617SBram Moolenaar source Xvim9for.vim 208841fe0617SBram Moolenaar delete('Xvim9for.vim') 208941fe0617SBram Moolenaarenddef 20908a7d6542SBram Moolenaar 2091e8c4abbbSBram Moolenaardef Test_for_loop() 2092e8c4abbbSBram Moolenaar let result = '' 2093e8c4abbbSBram Moolenaar for cnt in range(7) 2094e8c4abbbSBram Moolenaar if cnt == 4 2095e8c4abbbSBram Moolenaar break 2096e8c4abbbSBram Moolenaar endif 2097e8c4abbbSBram Moolenaar if cnt == 2 2098e8c4abbbSBram Moolenaar continue 2099e8c4abbbSBram Moolenaar endif 2100e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2101e8c4abbbSBram Moolenaar endfor 2102e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21030ad3e894SBram Moolenaar 21040ad3e894SBram Moolenaar let concat = '' 21050ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21060ad3e894SBram Moolenaar concat ..= str 21070ad3e894SBram Moolenaar endfor 21080ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2109e8c4abbbSBram Moolenaarenddef 2110e8c4abbbSBram Moolenaar 2111e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2112675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2113675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2114675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2115822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21160ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2117675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2118675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2119675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2120e8c4abbbSBram Moolenaarenddef 2121e8c4abbbSBram Moolenaar 2122d0df1aacSBram Moolenaardef Test_while_loop() 2123d0df1aacSBram Moolenaar let result = '' 2124d0df1aacSBram Moolenaar let cnt = 0 2125d0df1aacSBram Moolenaar while cnt < 555 2126d0df1aacSBram Moolenaar if cnt == 3 2127d0df1aacSBram Moolenaar break 2128d0df1aacSBram Moolenaar endif 2129d0df1aacSBram Moolenaar cnt += 1 2130d0df1aacSBram Moolenaar if cnt == 2 2131d0df1aacSBram Moolenaar continue 2132d0df1aacSBram Moolenaar endif 2133d0df1aacSBram Moolenaar result ..= cnt .. '_' 2134d0df1aacSBram Moolenaar endwhile 2135d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2136d0df1aacSBram Moolenaarenddef 2137d0df1aacSBram Moolenaar 2138e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2139675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2140675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2141675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2142675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2143675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2144675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2145675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2146bd5da371SBram Moolenaarenddef 2147bd5da371SBram Moolenaar 21489645e2d9SBram Moolenaardef Test_interrupt_loop() 214997acfc78SBram Moolenaar let caught = false 21509645e2d9SBram Moolenaar let x = 0 215197acfc78SBram Moolenaar try 21529645e2d9SBram Moolenaar while 1 21539645e2d9SBram Moolenaar x += 1 21549645e2d9SBram Moolenaar if x == 100 21559645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 21569645e2d9SBram Moolenaar endif 21579645e2d9SBram Moolenaar endwhile 215897acfc78SBram Moolenaar catch 215997acfc78SBram Moolenaar caught = true 216097acfc78SBram Moolenaar assert_equal(100, x) 216197acfc78SBram Moolenaar endtry 216297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 21639645e2d9SBram Moolenaarenddef 216420431c9dSBram Moolenaar 21654fdae999SBram Moolenaardef Test_automatic_line_continuation() 21664fdae999SBram Moolenaar let mylist = [ 21674fdae999SBram Moolenaar 'one', 21684fdae999SBram Moolenaar 'two', 21694fdae999SBram Moolenaar 'three', 2170f5be8cdbSBram Moolenaar ] # comment 21714fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 21724fdae999SBram Moolenaar 21734fdae999SBram Moolenaar let mydict = { 21744fdae999SBram Moolenaar 'one': 1, 21754fdae999SBram Moolenaar 'two': 2, 21764fdae999SBram Moolenaar 'three': 21774fdae999SBram Moolenaar 3, 2178f5be8cdbSBram Moolenaar } # comment 21794fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 21804fdae999SBram Moolenaar mydict = #{ 21812c330432SBram Moolenaar one: 1, # comment 21822c330432SBram Moolenaar two: # comment 21832c330432SBram Moolenaar 2, # comment 21842c330432SBram Moolenaar three: 3 # comment 21852c330432SBram Moolenaar } 21862c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 21872c330432SBram Moolenaar mydict = #{ 21882c330432SBram Moolenaar one: 1, 21894fdae999SBram Moolenaar two: 21904fdae999SBram Moolenaar 2, 21912c330432SBram Moolenaar three: 3 21924fdae999SBram Moolenaar } 21934fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2194e6085c53SBram Moolenaar 2195e6085c53SBram Moolenaar assert_equal( 2196e6085c53SBram Moolenaar ['one', 'two', 'three'], 2197e6085c53SBram Moolenaar split('one two three') 2198e6085c53SBram Moolenaar ) 21994fdae999SBram Moolenaarenddef 22004fdae999SBram Moolenaar 22017a092245SBram Moolenaardef Test_vim9_comment() 22027a092245SBram Moolenaar CheckScriptSuccess([ 22037a092245SBram Moolenaar 'vim9script', 22047a092245SBram Moolenaar '# something', 22057a092245SBram Moolenaar ]) 22067a092245SBram Moolenaar CheckScriptFailure([ 22077a092245SBram Moolenaar 'vim9script', 22087a092245SBram Moolenaar ':# something', 22097a092245SBram Moolenaar ], 'E488:') 22107a092245SBram Moolenaar CheckScriptFailure([ 22117a092245SBram Moolenaar '# something', 22127a092245SBram Moolenaar ], 'E488:') 22137a092245SBram Moolenaar CheckScriptFailure([ 22147a092245SBram Moolenaar ':# something', 22157a092245SBram Moolenaar ], 'E488:') 22167a092245SBram Moolenaar 22174a8d9f2eSBram Moolenaar { # block start 22184a8d9f2eSBram Moolenaar } # block end 22194a8d9f2eSBram Moolenaar CheckDefFailure([ 22204a8d9f2eSBram Moolenaar '{# comment', 22214a8d9f2eSBram Moolenaar ], 'E488:') 22224a8d9f2eSBram Moolenaar CheckDefFailure([ 22234a8d9f2eSBram Moolenaar '{', 22244a8d9f2eSBram Moolenaar '}# comment', 22254a8d9f2eSBram Moolenaar ], 'E488:') 22264a8d9f2eSBram Moolenaar 22274a8d9f2eSBram Moolenaar echo "yes" # comment 22284a8d9f2eSBram Moolenaar CheckDefFailure([ 22294a8d9f2eSBram Moolenaar 'echo "yes"# comment', 22304a8d9f2eSBram Moolenaar ], 'E488:') 22317a092245SBram Moolenaar CheckScriptSuccess([ 22327a092245SBram Moolenaar 'vim9script', 22337a092245SBram Moolenaar 'echo "yes" # something', 22347a092245SBram Moolenaar ]) 22357a092245SBram Moolenaar CheckScriptFailure([ 22367a092245SBram Moolenaar 'vim9script', 22377a092245SBram Moolenaar 'echo "yes"# something', 22387a092245SBram Moolenaar ], 'E121:') 22397a092245SBram Moolenaar CheckScriptFailure([ 22407a092245SBram Moolenaar 'vim9script', 22417a092245SBram Moolenaar 'echo# something', 22427a092245SBram Moolenaar ], 'E121:') 22437a092245SBram Moolenaar CheckScriptFailure([ 22447a092245SBram Moolenaar 'echo "yes" # something', 22457a092245SBram Moolenaar ], 'E121:') 22467a092245SBram Moolenaar 22474a8d9f2eSBram Moolenaar exe "echo" # comment 22484a8d9f2eSBram Moolenaar CheckDefFailure([ 22494a8d9f2eSBram Moolenaar 'exe "echo"# comment', 22504a8d9f2eSBram Moolenaar ], 'E488:') 22514a8d9f2eSBram Moolenaar CheckScriptSuccess([ 22524a8d9f2eSBram Moolenaar 'vim9script', 22534a8d9f2eSBram Moolenaar 'exe "echo" # something', 22544a8d9f2eSBram Moolenaar ]) 22554a8d9f2eSBram Moolenaar CheckScriptFailure([ 22564a8d9f2eSBram Moolenaar 'vim9script', 22574a8d9f2eSBram Moolenaar 'exe "echo"# something', 22584a8d9f2eSBram Moolenaar ], 'E121:') 22594a8d9f2eSBram Moolenaar CheckDefFailure([ 22604a8d9f2eSBram Moolenaar 'exe # comment', 22614a8d9f2eSBram Moolenaar ], 'E1015:') 22624a8d9f2eSBram Moolenaar CheckScriptFailure([ 22634a8d9f2eSBram Moolenaar 'vim9script', 22644a8d9f2eSBram Moolenaar 'exe# something', 22654a8d9f2eSBram Moolenaar ], 'E121:') 22664a8d9f2eSBram Moolenaar CheckScriptFailure([ 22674a8d9f2eSBram Moolenaar 'exe "echo" # something', 22684a8d9f2eSBram Moolenaar ], 'E121:') 22694a8d9f2eSBram Moolenaar 22707a092245SBram Moolenaar CheckDefFailure([ 22717a092245SBram Moolenaar 'try# comment', 22727a092245SBram Moolenaar ' echo "yes"', 22737a092245SBram Moolenaar 'catch', 22747a092245SBram Moolenaar 'endtry', 22757a092245SBram Moolenaar ], 'E488:') 22762c5ed4e3SBram Moolenaar CheckScriptFailure([ 22772c5ed4e3SBram Moolenaar 'vim9script', 22782c5ed4e3SBram Moolenaar 'try# comment', 22792c5ed4e3SBram Moolenaar 'echo "yes"', 22802c5ed4e3SBram Moolenaar ], 'E488:') 22817a092245SBram Moolenaar CheckDefFailure([ 22827a092245SBram Moolenaar 'try', 2283a72cfb80SBram Moolenaar ' throw#comment', 2284a72cfb80SBram Moolenaar 'catch', 2285a72cfb80SBram Moolenaar 'endtry', 2286a72cfb80SBram Moolenaar ], 'E1015:') 2287a72cfb80SBram Moolenaar CheckDefFailure([ 2288a72cfb80SBram Moolenaar 'try', 2289a72cfb80SBram Moolenaar ' throw "yes"#comment', 2290a72cfb80SBram Moolenaar 'catch', 2291a72cfb80SBram Moolenaar 'endtry', 2292a72cfb80SBram Moolenaar ], 'E488:') 2293a72cfb80SBram Moolenaar CheckDefFailure([ 2294a72cfb80SBram Moolenaar 'try', 22957a092245SBram Moolenaar ' echo "yes"', 22967a092245SBram Moolenaar 'catch# comment', 22977a092245SBram Moolenaar 'endtry', 22987a092245SBram Moolenaar ], 'E488:') 22992c5ed4e3SBram Moolenaar CheckScriptFailure([ 23002c5ed4e3SBram Moolenaar 'vim9script', 23012c5ed4e3SBram Moolenaar 'try', 23022c5ed4e3SBram Moolenaar ' echo "yes"', 23032c5ed4e3SBram Moolenaar 'catch# comment', 23042c5ed4e3SBram Moolenaar 'endtry', 23052c5ed4e3SBram Moolenaar ], 'E654:') 23062c5ed4e3SBram Moolenaar CheckDefFailure([ 23072c5ed4e3SBram Moolenaar 'try', 23082c5ed4e3SBram Moolenaar ' echo "yes"', 23092c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23102c5ed4e3SBram Moolenaar 'endtry', 23112c5ed4e3SBram Moolenaar ], 'E488:') 23127a092245SBram Moolenaar CheckDefFailure([ 23137a092245SBram Moolenaar 'try', 23147a092245SBram Moolenaar 'echo "yes"', 23157a092245SBram Moolenaar 'catch', 23167a092245SBram Moolenaar 'endtry# comment', 23177a092245SBram Moolenaar ], 'E488:') 23182c5ed4e3SBram Moolenaar CheckScriptFailure([ 23192c5ed4e3SBram Moolenaar 'vim9script', 23202c5ed4e3SBram Moolenaar 'try', 23212c5ed4e3SBram Moolenaar ' echo "yes"', 23222c5ed4e3SBram Moolenaar 'catch', 23232c5ed4e3SBram Moolenaar 'endtry# comment', 23249b7bf9e9SBram Moolenaar ], 'E488:') 23252c5ed4e3SBram Moolenaar 23262c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23272c5ed4e3SBram Moolenaar 'vim9script', 23282c5ed4e3SBram Moolenaar 'hi # comment', 23292c5ed4e3SBram Moolenaar ]) 23302c5ed4e3SBram Moolenaar CheckScriptFailure([ 23312c5ed4e3SBram Moolenaar 'vim9script', 23322c5ed4e3SBram Moolenaar 'hi# comment', 23332c5ed4e3SBram Moolenaar ], 'E416:') 23341966c248SBram Moolenaar CheckScriptSuccess([ 23351966c248SBram Moolenaar 'vim9script', 23361966c248SBram Moolenaar 'hi Search # comment', 23371966c248SBram Moolenaar ]) 23381966c248SBram Moolenaar CheckScriptFailure([ 23391966c248SBram Moolenaar 'vim9script', 23401966c248SBram Moolenaar 'hi Search# comment', 23411966c248SBram Moolenaar ], 'E416:') 23421966c248SBram Moolenaar CheckScriptSuccess([ 23431966c248SBram Moolenaar 'vim9script', 23441966c248SBram Moolenaar 'hi link This Search # comment', 23451966c248SBram Moolenaar ]) 23461966c248SBram Moolenaar CheckScriptFailure([ 23471966c248SBram Moolenaar 'vim9script', 23481966c248SBram Moolenaar 'hi link This That# comment', 23491966c248SBram Moolenaar ], 'E413:') 23501966c248SBram Moolenaar CheckScriptSuccess([ 23511966c248SBram Moolenaar 'vim9script', 23521966c248SBram Moolenaar 'hi clear This # comment', 23531966c248SBram Moolenaar 'hi clear # comment', 23541966c248SBram Moolenaar ]) 2355f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2356f5be8cdbSBram Moolenaar # hi clear This# comment', 23571966c248SBram Moolenaar CheckScriptFailure([ 23581966c248SBram Moolenaar 'vim9script', 23591966c248SBram Moolenaar 'hi clear# comment', 23601966c248SBram Moolenaar ], 'E416:') 23611966c248SBram Moolenaar 23621966c248SBram Moolenaar CheckScriptSuccess([ 23631966c248SBram Moolenaar 'vim9script', 23641966c248SBram Moolenaar 'hi Group term=bold', 23651966c248SBram Moolenaar 'match Group /todo/ # comment', 23661966c248SBram Moolenaar ]) 23671966c248SBram Moolenaar CheckScriptFailure([ 23681966c248SBram Moolenaar 'vim9script', 23691966c248SBram Moolenaar 'hi Group term=bold', 23701966c248SBram Moolenaar 'match Group /todo/# comment', 23711966c248SBram Moolenaar ], 'E488:') 23721966c248SBram Moolenaar CheckScriptSuccess([ 23731966c248SBram Moolenaar 'vim9script', 23741966c248SBram Moolenaar 'match # comment', 23751966c248SBram Moolenaar ]) 23761966c248SBram Moolenaar CheckScriptFailure([ 23771966c248SBram Moolenaar 'vim9script', 23781966c248SBram Moolenaar 'match# comment', 23791966c248SBram Moolenaar ], 'E475:') 23801966c248SBram Moolenaar CheckScriptSuccess([ 23811966c248SBram Moolenaar 'vim9script', 23821966c248SBram Moolenaar 'match none # comment', 23831966c248SBram Moolenaar ]) 23841966c248SBram Moolenaar CheckScriptFailure([ 23851966c248SBram Moolenaar 'vim9script', 23861966c248SBram Moolenaar 'match none# comment', 23871966c248SBram Moolenaar ], 'E475:') 23881966c248SBram Moolenaar 23891966c248SBram Moolenaar CheckScriptSuccess([ 23901966c248SBram Moolenaar 'vim9script', 23911966c248SBram Moolenaar 'menutrans clear # comment', 23921966c248SBram Moolenaar ]) 23931966c248SBram Moolenaar CheckScriptFailure([ 23941966c248SBram Moolenaar 'vim9script', 23951966c248SBram Moolenaar 'menutrans clear# comment text', 23961966c248SBram Moolenaar ], 'E474:') 23971966c248SBram Moolenaar 23981966c248SBram Moolenaar CheckScriptSuccess([ 23991966c248SBram Moolenaar 'vim9script', 24001966c248SBram Moolenaar 'syntax clear # comment', 24011966c248SBram Moolenaar ]) 24021966c248SBram Moolenaar CheckScriptFailure([ 24031966c248SBram Moolenaar 'vim9script', 24041966c248SBram Moolenaar 'syntax clear# comment text', 24051966c248SBram Moolenaar ], 'E28:') 24061966c248SBram Moolenaar CheckScriptSuccess([ 24071966c248SBram Moolenaar 'vim9script', 24081966c248SBram Moolenaar 'syntax keyword Word some', 24091966c248SBram Moolenaar 'syntax clear Word # comment', 24101966c248SBram Moolenaar ]) 24111966c248SBram Moolenaar CheckScriptFailure([ 24121966c248SBram Moolenaar 'vim9script', 24131966c248SBram Moolenaar 'syntax keyword Word some', 24141966c248SBram Moolenaar 'syntax clear Word# comment text', 24151966c248SBram Moolenaar ], 'E28:') 24161966c248SBram Moolenaar 24171966c248SBram Moolenaar CheckScriptSuccess([ 24181966c248SBram Moolenaar 'vim9script', 24191966c248SBram Moolenaar 'syntax list # comment', 24201966c248SBram Moolenaar ]) 24211966c248SBram Moolenaar CheckScriptFailure([ 24221966c248SBram Moolenaar 'vim9script', 24231966c248SBram Moolenaar 'syntax list# comment text', 24241966c248SBram Moolenaar ], 'E28:') 24251966c248SBram Moolenaar 24261966c248SBram Moolenaar CheckScriptSuccess([ 24271966c248SBram Moolenaar 'vim9script', 24281966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24291966c248SBram Moolenaar ]) 24301966c248SBram Moolenaar CheckScriptFailure([ 24311966c248SBram Moolenaar 'vim9script', 24321966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 24331966c248SBram Moolenaar ], 'E475:') 24341966c248SBram Moolenaar 24351966c248SBram Moolenaar CheckScriptSuccess([ 24361966c248SBram Moolenaar 'vim9script', 24371966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 24381966c248SBram Moolenaar ]) 24391966c248SBram Moolenaar CheckScriptFailure([ 24401966c248SBram Moolenaar 'vim9script', 24411966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 24421966c248SBram Moolenaar ], 'E789:') 24431966c248SBram Moolenaar 24441966c248SBram Moolenaar CheckScriptSuccess([ 24451966c248SBram Moolenaar 'vim9script', 24461966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 24471966c248SBram Moolenaar ]) 24481966c248SBram Moolenaar CheckScriptFailure([ 24491966c248SBram Moolenaar 'vim9script', 24501966c248SBram Moolenaar 'syntax match Word /pat/# comment', 24511966c248SBram Moolenaar ], 'E402:') 24521966c248SBram Moolenaar 24531966c248SBram Moolenaar CheckScriptSuccess([ 24541966c248SBram Moolenaar 'vim9script', 24551966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 24561966c248SBram Moolenaar ]) 24571966c248SBram Moolenaar CheckScriptFailure([ 24581966c248SBram Moolenaar 'vim9script', 24591966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 24601966c248SBram Moolenaar ], 'E475:') 24611966c248SBram Moolenaar CheckScriptFailure([ 24621966c248SBram Moolenaar 'vim9script', 24631966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 24641966c248SBram Moolenaar ], 'E406:') 24651966c248SBram Moolenaar CheckScriptFailure([ 24661966c248SBram Moolenaar 'vim9script', 24671966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 24681966c248SBram Moolenaar ], 'E475:') 24691966c248SBram Moolenaar 24701966c248SBram Moolenaar CheckScriptSuccess([ 24711966c248SBram Moolenaar 'vim9script', 24721966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 24731966c248SBram Moolenaar ]) 24741966c248SBram Moolenaar CheckScriptFailure([ 24751966c248SBram Moolenaar 'vim9script', 24761966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2477d032f34aSBram Moolenaar ], 'E402:') 24781966c248SBram Moolenaar 24791966c248SBram Moolenaar CheckScriptSuccess([ 24801966c248SBram Moolenaar 'vim9script', 24811966c248SBram Moolenaar 'syntax sync # comment', 24821966c248SBram Moolenaar ]) 24831966c248SBram Moolenaar CheckScriptFailure([ 24841966c248SBram Moolenaar 'vim9script', 24851966c248SBram Moolenaar 'syntax sync# comment', 24861966c248SBram Moolenaar ], 'E404:') 24871966c248SBram Moolenaar CheckScriptSuccess([ 24881966c248SBram Moolenaar 'vim9script', 24891966c248SBram Moolenaar 'syntax sync ccomment # comment', 24901966c248SBram Moolenaar ]) 24911966c248SBram Moolenaar CheckScriptFailure([ 24921966c248SBram Moolenaar 'vim9script', 24931966c248SBram Moolenaar 'syntax sync ccomment# comment', 24941966c248SBram Moolenaar ], 'E404:') 24951966c248SBram Moolenaar 24961966c248SBram Moolenaar CheckScriptSuccess([ 24971966c248SBram Moolenaar 'vim9script', 24981966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 24991966c248SBram Moolenaar ]) 25001966c248SBram Moolenaar CheckScriptFailure([ 25011966c248SBram Moolenaar 'vim9script', 25021966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25031966c248SBram Moolenaar ], 'E475:') 2504a72cfb80SBram Moolenaar 2505a72cfb80SBram Moolenaar CheckScriptSuccess([ 2506a72cfb80SBram Moolenaar 'vim9script', 2507a72cfb80SBram Moolenaar 'command Echo echo # comment', 2508a72cfb80SBram Moolenaar 'command Echo # comment', 2509a72cfb80SBram Moolenaar ]) 2510a72cfb80SBram Moolenaar CheckScriptFailure([ 2511a72cfb80SBram Moolenaar 'vim9script', 2512a72cfb80SBram Moolenaar 'command Echo echo# comment', 2513a72cfb80SBram Moolenaar 'Echo', 2514a72cfb80SBram Moolenaar ], 'E121:') 2515a72cfb80SBram Moolenaar CheckScriptFailure([ 2516a72cfb80SBram Moolenaar 'vim9script', 2517a72cfb80SBram Moolenaar 'command Echo# comment', 2518a72cfb80SBram Moolenaar ], 'E182:') 2519a72cfb80SBram Moolenaar CheckScriptFailure([ 2520a72cfb80SBram Moolenaar 'vim9script', 2521a72cfb80SBram Moolenaar 'command Echo echo', 2522a72cfb80SBram Moolenaar 'command Echo# comment', 2523a72cfb80SBram Moolenaar ], 'E182:') 2524a72cfb80SBram Moolenaar 2525a72cfb80SBram Moolenaar CheckScriptSuccess([ 2526a72cfb80SBram Moolenaar 'vim9script', 2527a72cfb80SBram Moolenaar 'function # comment', 2528a72cfb80SBram Moolenaar ]) 2529a72cfb80SBram Moolenaar CheckScriptFailure([ 2530a72cfb80SBram Moolenaar 'vim9script', 25319898107fSBram Moolenaar 'function " comment', 25329898107fSBram Moolenaar ], 'E129:') 25339898107fSBram Moolenaar CheckScriptFailure([ 25349898107fSBram Moolenaar 'vim9script', 2535a72cfb80SBram Moolenaar 'function# comment', 2536a72cfb80SBram Moolenaar ], 'E129:') 2537a72cfb80SBram Moolenaar CheckScriptSuccess([ 2538a72cfb80SBram Moolenaar 'vim9script', 2539a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2540a72cfb80SBram Moolenaar ]) 2541a72cfb80SBram Moolenaar CheckScriptFailure([ 2542a72cfb80SBram Moolenaar 'vim9script', 2543a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2544a72cfb80SBram Moolenaar ], 'E488:') 2545a72cfb80SBram Moolenaar 2546a72cfb80SBram Moolenaar CheckScriptSuccess([ 2547a72cfb80SBram Moolenaar 'vim9script', 25484c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2549a72cfb80SBram Moolenaar 'endfunc', 25504c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2551a72cfb80SBram Moolenaar ]) 2552a72cfb80SBram Moolenaar CheckScriptFailure([ 2553a72cfb80SBram Moolenaar 'vim9script', 25544c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2555a72cfb80SBram Moolenaar 'endfunc', 25564c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2557a72cfb80SBram Moolenaar ], 'E488:') 2558a72cfb80SBram Moolenaar 2559a72cfb80SBram Moolenaar CheckScriptSuccess([ 2560a72cfb80SBram Moolenaar 'vim9script', 2561a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2562a72cfb80SBram Moolenaar ]) 2563a72cfb80SBram Moolenaar CheckScriptFailure([ 2564a72cfb80SBram Moolenaar 'vim9script', 2565a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2566a72cfb80SBram Moolenaar ], 'E488:') 2567e7e4838fSBram Moolenaar 2568e7e4838fSBram Moolenaar CheckScriptFailure([ 2569e7e4838fSBram Moolenaar 'def Test() " comment', 2570e7e4838fSBram Moolenaar 'enddef', 2571e7e4838fSBram Moolenaar ], 'E488:') 2572e7e4838fSBram Moolenaar CheckScriptFailure([ 2573e7e4838fSBram Moolenaar 'vim9script', 2574e7e4838fSBram Moolenaar 'def Test() " comment', 2575e7e4838fSBram Moolenaar 'enddef', 2576e7e4838fSBram Moolenaar ], 'E488:') 2577e7e4838fSBram Moolenaar 2578e7e4838fSBram Moolenaar CheckScriptSuccess([ 2579e7e4838fSBram Moolenaar 'func Test() " comment', 2580e7e4838fSBram Moolenaar 'endfunc', 2581e7e4838fSBram Moolenaar ]) 25829898107fSBram Moolenaar CheckScriptSuccess([ 2583e7e4838fSBram Moolenaar 'vim9script', 2584e7e4838fSBram Moolenaar 'func Test() " comment', 2585e7e4838fSBram Moolenaar 'endfunc', 25869898107fSBram Moolenaar ]) 2587e7e4838fSBram Moolenaar 2588e7e4838fSBram Moolenaar CheckScriptSuccess([ 2589e7e4838fSBram Moolenaar 'def Test() # comment', 2590e7e4838fSBram Moolenaar 'enddef', 2591e7e4838fSBram Moolenaar ]) 2592e7e4838fSBram Moolenaar CheckScriptFailure([ 2593e7e4838fSBram Moolenaar 'func Test() # comment', 2594e7e4838fSBram Moolenaar 'endfunc', 2595e7e4838fSBram Moolenaar ], 'E488:') 25962c5ed4e3SBram Moolenaarenddef 25972c5ed4e3SBram Moolenaar 25982c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25992c5ed4e3SBram Moolenaar CheckCanRunGui 26002c5ed4e3SBram Moolenaar 26012c5ed4e3SBram Moolenaar CheckScriptFailure([ 26022c5ed4e3SBram Moolenaar 'vim9script', 26032c5ed4e3SBram Moolenaar 'gui#comment' 26042c5ed4e3SBram Moolenaar ], 'E499:') 26052c5ed4e3SBram Moolenaar CheckScriptFailure([ 26062c5ed4e3SBram Moolenaar 'vim9script', 26072c5ed4e3SBram Moolenaar 'gui -f#comment' 26082c5ed4e3SBram Moolenaar ], 'E499:') 26097a092245SBram Moolenaarenddef 26107a092245SBram Moolenaar 2611a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 26126797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 26136797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2614a26b9700SBram Moolenaar 2615a26b9700SBram Moolenaar edit test.vim 2616a26b9700SBram Moolenaar doautocmd TabEnter #comment 2617a26b9700SBram Moolenaar assert_equal(1, g:entered) 2618a26b9700SBram Moolenaar 2619a26b9700SBram Moolenaar doautocmd TabEnter f.x 2620a26b9700SBram Moolenaar assert_equal(2, g:entered) 2621a26b9700SBram Moolenaar 2622a26b9700SBram Moolenaar g:entered = 0 2623a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2624a26b9700SBram Moolenaar assert_equal(2, g:entered) 2625a26b9700SBram Moolenaar 2626a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2627a26b9700SBram Moolenaar 2628a26b9700SBram Moolenaar au! TabEnter 2629a26b9700SBram Moolenaar unlet g:entered 2630d72c1bf0SBram Moolenaar 2631d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2632d72c1bf0SBram Moolenaar 'vim9script', 26336797966dSBram Moolenaar 'g:var = 123', 2634e55b1c09SBram Moolenaar 'b:var = 456', 2635e55b1c09SBram Moolenaar 'w:var = 777', 2636e55b1c09SBram Moolenaar 't:var = 888', 2637d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2638d72c1bf0SBram Moolenaar ]) 2639d72c1bf0SBram Moolenaar 2640d72c1bf0SBram Moolenaar CheckScriptFailure([ 2641d72c1bf0SBram Moolenaar 'vim9script', 2642d72c1bf0SBram Moolenaar 'let g:var = 123', 2643e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2644e55b1c09SBram Moolenaar 2645e55b1c09SBram Moolenaar CheckScriptFailure([ 2646e55b1c09SBram Moolenaar 'vim9script', 2647e55b1c09SBram Moolenaar 'let b:var = 123', 2648e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2649e55b1c09SBram Moolenaar 2650e55b1c09SBram Moolenaar CheckScriptFailure([ 2651e55b1c09SBram Moolenaar 'vim9script', 2652e55b1c09SBram Moolenaar 'let w:var = 123', 2653e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2654e55b1c09SBram Moolenaar 2655e55b1c09SBram Moolenaar CheckScriptFailure([ 2656e55b1c09SBram Moolenaar 'vim9script', 2657e55b1c09SBram Moolenaar 'let t:var = 123', 2658e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2659e55b1c09SBram Moolenaar 2660e55b1c09SBram Moolenaar CheckScriptFailure([ 2661e55b1c09SBram Moolenaar 'vim9script', 2662e55b1c09SBram Moolenaar 'let v:version = 123', 2663e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2664e55b1c09SBram Moolenaar 2665e55b1c09SBram Moolenaar CheckScriptFailure([ 2666e55b1c09SBram Moolenaar 'vim9script', 2667e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2668e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 26696797966dSBram Moolenaar 26706797966dSBram Moolenaar CheckScriptFailure([ 26716797966dSBram Moolenaar 'vim9script', 26726797966dSBram Moolenaar 'g:var = 123', 267332e35117SBram Moolenaar 'unlet g:var# comment1', 2674d72c1bf0SBram Moolenaar ], 'E108:') 2675d72c1bf0SBram Moolenaar 2676d72c1bf0SBram Moolenaar CheckScriptFailure([ 2677d72c1bf0SBram Moolenaar 'let g:var = 123', 2678d72c1bf0SBram Moolenaar 'unlet g:var # something', 2679d72c1bf0SBram Moolenaar ], 'E488:') 2680faac4104SBram Moolenaar 2681faac4104SBram Moolenaar CheckScriptSuccess([ 2682faac4104SBram Moolenaar 'vim9script', 268332e35117SBram Moolenaar 'if 1 # comment2', 2684faac4104SBram Moolenaar ' echo "yes"', 2685faac4104SBram Moolenaar 'elseif 2 #comment', 2686faac4104SBram Moolenaar ' echo "no"', 2687faac4104SBram Moolenaar 'endif', 2688faac4104SBram Moolenaar ]) 2689faac4104SBram Moolenaar 2690faac4104SBram Moolenaar CheckScriptFailure([ 2691faac4104SBram Moolenaar 'vim9script', 269232e35117SBram Moolenaar 'if 1# comment3', 2693faac4104SBram Moolenaar ' echo "yes"', 2694faac4104SBram Moolenaar 'endif', 2695faac4104SBram Moolenaar ], 'E15:') 2696faac4104SBram Moolenaar 2697faac4104SBram Moolenaar CheckScriptFailure([ 2698faac4104SBram Moolenaar 'vim9script', 269932e35117SBram Moolenaar 'if 0 # comment4', 2700faac4104SBram Moolenaar ' echo "yes"', 2701faac4104SBram Moolenaar 'elseif 2#comment', 2702faac4104SBram Moolenaar ' echo "no"', 2703faac4104SBram Moolenaar 'endif', 2704faac4104SBram Moolenaar ], 'E15:') 2705faac4104SBram Moolenaar 2706faac4104SBram Moolenaar CheckScriptSuccess([ 2707faac4104SBram Moolenaar 'vim9script', 270832e35117SBram Moolenaar 'let v = 1 # comment5', 2709faac4104SBram Moolenaar ]) 2710faac4104SBram Moolenaar 2711faac4104SBram Moolenaar CheckScriptFailure([ 2712faac4104SBram Moolenaar 'vim9script', 271332e35117SBram Moolenaar 'let v = 1# comment6', 271432e35117SBram Moolenaar ], 'E15:') 2715faac4104SBram Moolenaar 2716faac4104SBram Moolenaar CheckScriptSuccess([ 2717faac4104SBram Moolenaar 'vim9script', 2718faac4104SBram Moolenaar 'new' 2719faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2720df069eecSBram Moolenaar ':$', 2721faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2722faac4104SBram Moolenaar 'bwipe!', 2723faac4104SBram Moolenaar ]) 2724faac4104SBram Moolenaar 2725f5be8cdbSBram Moolenaar CheckScriptFailure([ 2726f5be8cdbSBram Moolenaar 'vim9script', 2727f5be8cdbSBram Moolenaar 'new' 2728f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2729f5be8cdbSBram Moolenaar ':$', 2730f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2731f5be8cdbSBram Moolenaar 'bwipe!', 2732f5be8cdbSBram Moolenaar ], 'E488:') 2733f5be8cdbSBram Moolenaar 2734f5be8cdbSBram Moolenaar CheckScriptFailure([ 2735f5be8cdbSBram Moolenaar 'vim9script', 2736f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2737f5be8cdbSBram Moolenaar ], 'E477:') 2738a26b9700SBram Moolenaarenddef 2739a26b9700SBram Moolenaar 27407e5bd91dSBram Moolenaardef Test_finish() 27417e5bd91dSBram Moolenaar let lines =<< trim END 27427e5bd91dSBram Moolenaar vim9script 27436797966dSBram Moolenaar g:res = 'one' 27447e5bd91dSBram Moolenaar if v:false | finish | endif 27456797966dSBram Moolenaar g:res = 'two' 27467e5bd91dSBram Moolenaar finish 27476797966dSBram Moolenaar g:res = 'three' 27487e5bd91dSBram Moolenaar END 27497e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27507e5bd91dSBram Moolenaar source Xfinished 27517e5bd91dSBram Moolenaar assert_equal('two', g:res) 27527e5bd91dSBram Moolenaar 27537e5bd91dSBram Moolenaar unlet g:res 27547e5bd91dSBram Moolenaar delete('Xfinished') 27557e5bd91dSBram Moolenaarenddef 27567e5bd91dSBram Moolenaar 275732e35117SBram Moolenaardef Test_let_func_call() 275832e35117SBram Moolenaar let lines =<< trim END 275932e35117SBram Moolenaar vim9script 276032e35117SBram Moolenaar func GetValue() 276132e35117SBram Moolenaar if exists('g:count') 276232e35117SBram Moolenaar let g:count += 1 276332e35117SBram Moolenaar else 276432e35117SBram Moolenaar let g:count = 1 276532e35117SBram Moolenaar endif 276632e35117SBram Moolenaar return 'this' 276732e35117SBram Moolenaar endfunc 276832e35117SBram Moolenaar let val: string = GetValue() 2769f5be8cdbSBram Moolenaar # env var is always a string 2770df671b46SBram Moolenaar let env = $TERM 277132e35117SBram Moolenaar END 277232e35117SBram Moolenaar writefile(lines, 'Xfinished') 277332e35117SBram Moolenaar source Xfinished 2774f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 277532e35117SBram Moolenaar assert_equal(1, g:count) 277632e35117SBram Moolenaar 277732e35117SBram Moolenaar unlet g:count 277832e35117SBram Moolenaar delete('Xfinished') 277932e35117SBram Moolenaarenddef 278032e35117SBram Moolenaar 278132e35117SBram Moolenaardef Test_let_missing_type() 278232e35117SBram Moolenaar let lines =<< trim END 278332e35117SBram Moolenaar vim9script 2784df671b46SBram Moolenaar let var = g:unknown 2785227a69deSBram Moolenaar END 2786822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2787227a69deSBram Moolenaar 2788227a69deSBram Moolenaar lines =<< trim END 2789227a69deSBram Moolenaar vim9script 2790227a69deSBram Moolenaar let nr: number = 123 2791227a69deSBram Moolenaar let var = nr 2792227a69deSBram Moolenaar END 2793822ba247SBram Moolenaar CheckScriptSuccess(lines) 279432e35117SBram Moolenaarenddef 279532e35117SBram Moolenaar 2796c82a5b5dSBram Moolenaardef Test_let_declaration() 2797c82a5b5dSBram Moolenaar let lines =<< trim END 2798c82a5b5dSBram Moolenaar vim9script 2799c82a5b5dSBram Moolenaar let var: string 2800c82a5b5dSBram Moolenaar g:var_uninit = var 2801c82a5b5dSBram Moolenaar var = 'text' 2802c82a5b5dSBram Moolenaar g:var_test = var 2803f5be8cdbSBram Moolenaar # prefixing s: is optional 2804984dddbeSBram Moolenaar s:var = 'prefixed' 2805984dddbeSBram Moolenaar g:var_prefixed = s:var 2806984dddbeSBram Moolenaar 2807984dddbeSBram Moolenaar let s:other: number 2808984dddbeSBram Moolenaar other = 1234 2809984dddbeSBram Moolenaar g:other_var = other 2810c82a5b5dSBram Moolenaar END 2811c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2812c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2813c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2814984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2815984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2816c82a5b5dSBram Moolenaar 2817c82a5b5dSBram Moolenaar unlet g:var_uninit 2818c82a5b5dSBram Moolenaar unlet g:var_test 2819984dddbeSBram Moolenaar unlet g:var_prefixed 2820984dddbeSBram Moolenaar unlet g:other_var 2821c82a5b5dSBram Moolenaarenddef 2822c82a5b5dSBram Moolenaar 2823c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2824c5b1c20bSBram Moolenaar let lines =<< trim END 2825c5b1c20bSBram Moolenaar vim9script 2826c5b1c20bSBram Moolenaar const var: string 2827c5b1c20bSBram Moolenaar END 2828c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2829c5b1c20bSBram Moolenaar 2830c5b1c20bSBram Moolenaar lines =<< trim END 2831c5b1c20bSBram Moolenaar vim9script 2832c5b1c20bSBram Moolenaar let 9var: string 2833c5b1c20bSBram Moolenaar END 2834c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2835c5b1c20bSBram Moolenaarenddef 2836c5b1c20bSBram Moolenaar 283734db91f7SBram Moolenaardef Test_let_type_check() 283834db91f7SBram Moolenaar let lines =<< trim END 283934db91f7SBram Moolenaar vim9script 284034db91f7SBram Moolenaar let var: string 284134db91f7SBram Moolenaar var = 1234 284234db91f7SBram Moolenaar END 284334db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2844984dddbeSBram Moolenaar 2845984dddbeSBram Moolenaar lines =<< trim END 2846984dddbeSBram Moolenaar vim9script 2847984dddbeSBram Moolenaar let var:string 2848984dddbeSBram Moolenaar END 2849984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2850c5b1c20bSBram Moolenaar 2851c5b1c20bSBram Moolenaar lines =<< trim END 2852c5b1c20bSBram Moolenaar vim9script 2853c5b1c20bSBram Moolenaar let var: asdf 2854c5b1c20bSBram Moolenaar END 2855c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2856a71e2633SBram Moolenaar 2857a71e2633SBram Moolenaar lines =<< trim END 2858a71e2633SBram Moolenaar vim9script 2859a71e2633SBram Moolenaar let s:l: list<number> 2860a71e2633SBram Moolenaar s:l = [] 2861a71e2633SBram Moolenaar END 2862a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2863a71e2633SBram Moolenaar 2864a71e2633SBram Moolenaar lines =<< trim END 2865a71e2633SBram Moolenaar vim9script 2866a71e2633SBram Moolenaar let s:d: dict<number> 2867a71e2633SBram Moolenaar s:d = {} 2868a71e2633SBram Moolenaar END 2869a71e2633SBram Moolenaar CheckScriptSuccess(lines) 287034db91f7SBram Moolenaarenddef 287134db91f7SBram Moolenaar 2872a5d0077eSBram Moolenaardef Test_forward_declaration() 2873a5d0077eSBram Moolenaar let lines =<< trim END 2874a5d0077eSBram Moolenaar vim9script 2875a5d0077eSBram Moolenaar def GetValue(): string 2876a5d0077eSBram Moolenaar return theVal 2877a5d0077eSBram Moolenaar enddef 2878a5d0077eSBram Moolenaar let theVal = 'something' 2879822ba247SBram Moolenaar g:initVal = GetValue() 2880a5d0077eSBram Moolenaar theVal = 'else' 2881a5d0077eSBram Moolenaar g:laterVal = GetValue() 2882a5d0077eSBram Moolenaar END 2883a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2884a5d0077eSBram Moolenaar source Xforward 2885a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2886a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2887a5d0077eSBram Moolenaar 2888a5d0077eSBram Moolenaar unlet g:initVal 2889a5d0077eSBram Moolenaar unlet g:laterVal 2890a5d0077eSBram Moolenaar delete('Xforward') 2891a5d0077eSBram Moolenaarenddef 2892a5d0077eSBram Moolenaar 28939721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 28949721fb4eSBram Moolenaar let legacy_lines =<< trim END 28959721fb4eSBram Moolenaar source Xvim9_script.vim 28969721fb4eSBram Moolenaar 28979721fb4eSBram Moolenaar call assert_false(exists('local')) 28989721fb4eSBram Moolenaar call assert_false(exists('exported')) 28999721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29009721fb4eSBram Moolenaar call assert_equal('global', global) 29019721fb4eSBram Moolenaar call assert_equal('global', g:global) 29029721fb4eSBram Moolenaar 29039721fb4eSBram Moolenaar " imported variable becomes script-local 29049721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29059721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29069721fb4eSBram Moolenaar call assert_false(exists('exported')) 29079721fb4eSBram Moolenaar 29089721fb4eSBram Moolenaar " imported function becomes script-local 29099721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29109721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29119721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29129721fb4eSBram Moolenaar END 29139721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29149721fb4eSBram Moolenaar 29159721fb4eSBram Moolenaar let vim9_lines =<< trim END 29169721fb4eSBram Moolenaar vim9script 29179721fb4eSBram Moolenaar let local = 'local' 29189721fb4eSBram Moolenaar g:global = 'global' 29199721fb4eSBram Moolenaar export let exported = 'exported' 29209721fb4eSBram Moolenaar export def GetText(): string 29219721fb4eSBram Moolenaar return 'text' 29229721fb4eSBram Moolenaar enddef 29239721fb4eSBram Moolenaar END 29249721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 29259721fb4eSBram Moolenaar 29269721fb4eSBram Moolenaar source Xlegacy_script.vim 29279721fb4eSBram Moolenaar 29289721fb4eSBram Moolenaar assert_equal('global', g:global) 2929f5be8cdbSBram Moolenaar unlet g:global 29309721fb4eSBram Moolenaar 29319721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29329721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29339721fb4eSBram Moolenaarenddef 2934a5d0077eSBram Moolenaar 2935eeb27bfeSBram Moolenaardef Test_vim9_copen() 2936eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2937eeb27bfeSBram Moolenaar copen 2938eeb27bfeSBram Moolenaar quit 2939eeb27bfeSBram Moolenaarenddef 2940eeb27bfeSBram Moolenaar 29412d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 29422d6b20d6SBram Moolenaardef Test_vim9_autoload() 29432d6b20d6SBram Moolenaar let lines =<< trim END 29442d6b20d6SBram Moolenaar vim9script 29452d6b20d6SBram Moolenaar def foo#test() 29462d6b20d6SBram Moolenaar echomsg getreg('"') 29472d6b20d6SBram Moolenaar enddef 29482d6b20d6SBram Moolenaar END 29492d6b20d6SBram Moolenaar 29502d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29512d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 29522d6b20d6SBram Moolenaar let save_rtp = &rtp 29532d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29542d6b20d6SBram Moolenaar augroup test 29552d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 29562d6b20d6SBram Moolenaar augroup END 29572d6b20d6SBram Moolenaar 29582d6b20d6SBram Moolenaar normal Y 29592d6b20d6SBram Moolenaar 29602d6b20d6SBram Moolenaar augroup test 29612d6b20d6SBram Moolenaar autocmd! 29622d6b20d6SBram Moolenaar augroup END 29632d6b20d6SBram Moolenaar delete('Xdir', 'rf') 29642d6b20d6SBram Moolenaar &rtp = save_rtp 29652d6b20d6SBram Moolenaarenddef 29662d6b20d6SBram Moolenaar 2967585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2968585fea7bSBram Moolenaardef Test_substitute_cmd() 2969585fea7bSBram Moolenaar new 2970585fea7bSBram Moolenaar setline(1, 'something') 2971585fea7bSBram Moolenaar :substitute(some(other( 2972585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2973585fea7bSBram Moolenaar bwipe! 2974585fea7bSBram Moolenaar 2975f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2976585fea7bSBram Moolenaar let lines =<< trim END 2977585fea7bSBram Moolenaar vim9script 2978585fea7bSBram Moolenaar new 2979585fea7bSBram Moolenaar setline(1, 'something') 2980585fea7bSBram Moolenaar :substitute(some(other( 2981585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2982585fea7bSBram Moolenaar bwipe! 2983585fea7bSBram Moolenaar END 2984585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2985585fea7bSBram Moolenaar source Xvim9lines 2986585fea7bSBram Moolenaar 2987585fea7bSBram Moolenaar delete('Xvim9lines') 2988585fea7bSBram Moolenaarenddef 2989585fea7bSBram Moolenaar 29908a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2991