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 452c7e44a7eSBram Moolenaar END 453c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 454c7e44a7eSBram Moolenaarenddef 455c7e44a7eSBram Moolenaar 456cab27678SBram Moolenaardef Mess(): string 457cab27678SBram Moolenaar v:foldstart = 123 458cab27678SBram Moolenaar return 'xxx' 459cab27678SBram Moolenaarenddef 460cab27678SBram Moolenaar 461d72c1bf0SBram Moolenaardef Test_assignment_failure() 4628a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4638a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4648a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4658a7d6542SBram Moolenaar 46663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 46763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 46863be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 46963be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 47063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 47163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 47263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 47363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 47463be3d4bSBram Moolenaar 4758a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 4768a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 4778a7d6542SBram Moolenaar 4789b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 4799af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4809af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 4819af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4829af78769SBram Moolenaar '[a] = []'], 'E1093:') 4839af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4849af78769SBram Moolenaar 'let y: number', 4859af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 4869af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4879af78769SBram Moolenaar 'let y: number', 4889af78769SBram Moolenaar 'let z: list<number>', 4899af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 4909be61bbbSBram Moolenaar 491e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 492c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 4939be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 494c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 4959be61bbbSBram Moolenaar 496e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 497c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 4989be61bbbSBram Moolenaar 499434d72cbSBram Moolenaar if has('dnd') 50065821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 501434d72cbSBram Moolenaar else 502434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 503434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 504434d72cbSBram Moolenaar endif 5059be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 50665821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 507c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5089be61bbbSBram Moolenaar 509e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 510e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 511e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 512e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5139be61bbbSBram Moolenaar 5149be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5159be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5169be61bbbSBram Moolenaar 517822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 51833fa29cfSBram Moolenaar 5198a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5208a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5218a7d6542SBram Moolenaar 5228a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5238a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5248a7d6542SBram Moolenaar 5258a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5268a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 52742a480bfSBram Moolenaar 528d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 52942a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 530cab27678SBram Moolenaar 531cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 532cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 53343e969d3SBram Moolenaar 53443e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 53543e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 53643e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 53743e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 53843e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 53943e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 54043e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 54143e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 542d72c1bf0SBram Moolenaarenddef 543d72c1bf0SBram Moolenaar 544d72c1bf0SBram Moolenaardef Test_unlet() 545d72c1bf0SBram Moolenaar g:somevar = 'yes' 546d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 547d72c1bf0SBram Moolenaar unlet g:somevar 548d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 549d72c1bf0SBram Moolenaar unlet! g:somevar 550d72c1bf0SBram Moolenaar 551d72c1bf0SBram Moolenaar call CheckScriptFailure([ 552d72c1bf0SBram Moolenaar 'vim9script', 553d72c1bf0SBram Moolenaar 'let svar = 123', 554d72c1bf0SBram Moolenaar 'unlet svar', 555d72c1bf0SBram Moolenaar ], 'E1081:') 556d72c1bf0SBram Moolenaar call CheckScriptFailure([ 557d72c1bf0SBram Moolenaar 'vim9script', 558d72c1bf0SBram Moolenaar 'let svar = 123', 559d72c1bf0SBram Moolenaar 'unlet s:svar', 560d72c1bf0SBram Moolenaar ], 'E1081:') 561d72c1bf0SBram Moolenaar call CheckScriptFailure([ 562d72c1bf0SBram Moolenaar 'vim9script', 563d72c1bf0SBram Moolenaar 'let svar = 123', 564d72c1bf0SBram Moolenaar 'def Func()', 565d72c1bf0SBram Moolenaar ' unlet svar', 566d72c1bf0SBram Moolenaar 'enddef', 567822ba247SBram Moolenaar 'defcompile', 568d72c1bf0SBram Moolenaar ], 'E1081:') 569d72c1bf0SBram Moolenaar call CheckScriptFailure([ 570d72c1bf0SBram Moolenaar 'vim9script', 571d72c1bf0SBram Moolenaar 'let svar = 123', 572d72c1bf0SBram Moolenaar 'def Func()', 573d72c1bf0SBram Moolenaar ' unlet s:svar', 574d72c1bf0SBram Moolenaar 'enddef', 575822ba247SBram Moolenaar 'defcompile', 576d72c1bf0SBram Moolenaar ], 'E1081:') 5777bdaea6eSBram Moolenaar 5787bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 5797bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 5807bdaea6eSBram Moolenaar unlet $ENVVAR 5817bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 582d72c1bf0SBram Moolenaarenddef 583599c89c8SBram Moolenaar 5844c17ad94SBram Moolenaardef Test_delfunction() 585f5be8cdbSBram Moolenaar # Check function is defined in script namespace 5864c17ad94SBram Moolenaar CheckScriptSuccess([ 5874c17ad94SBram Moolenaar 'vim9script', 5884c17ad94SBram Moolenaar 'func CheckMe()', 5894c17ad94SBram Moolenaar ' return 123', 5904c17ad94SBram Moolenaar 'endfunc', 5914c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 5924c17ad94SBram Moolenaar ]) 5934c17ad94SBram Moolenaar 594f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 5954c17ad94SBram Moolenaar CheckScriptFailure([ 5964c17ad94SBram Moolenaar 'vim9script', 5974c17ad94SBram Moolenaar 'func DeleteMe1()', 5984c17ad94SBram Moolenaar 'endfunc', 5994c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6004c17ad94SBram Moolenaar ], 'E1084:') 6014c17ad94SBram Moolenaar CheckScriptFailure([ 6024c17ad94SBram Moolenaar 'vim9script', 6034c17ad94SBram Moolenaar 'func DeleteMe2()', 6044c17ad94SBram Moolenaar 'endfunc', 6054c17ad94SBram Moolenaar 'def DoThat()', 6064c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6074c17ad94SBram Moolenaar 'enddef', 6084c17ad94SBram Moolenaar 'DoThat()', 6094c17ad94SBram Moolenaar ], 'E1084:') 6104c17ad94SBram Moolenaar CheckScriptFailure([ 6114c17ad94SBram Moolenaar 'vim9script', 6124c17ad94SBram Moolenaar 'def DeleteMe3()', 6134c17ad94SBram Moolenaar 'enddef', 6144c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6154c17ad94SBram Moolenaar ], 'E1084:') 6164c17ad94SBram Moolenaar CheckScriptFailure([ 6174c17ad94SBram Moolenaar 'vim9script', 6184c17ad94SBram Moolenaar 'def DeleteMe4()', 6194c17ad94SBram Moolenaar 'enddef', 6204c17ad94SBram Moolenaar 'def DoThat()', 6214c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6224c17ad94SBram Moolenaar 'enddef', 6234c17ad94SBram Moolenaar 'DoThat()', 6244c17ad94SBram Moolenaar ], 'E1084:') 625925e9fd6SBram Moolenaar 626925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 627925e9fd6SBram Moolenaar let lines =<< trim END 628925e9fd6SBram Moolenaar vim9script 629925e9fd6SBram Moolenaar def g:Global(): string 630925e9fd6SBram Moolenaar return "yes" 631925e9fd6SBram Moolenaar enddef 632925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 633925e9fd6SBram Moolenaar def! g:Global(): string 634925e9fd6SBram Moolenaar return "no" 635925e9fd6SBram Moolenaar enddef 636925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 637925e9fd6SBram Moolenaar delfunc g:Global 638925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 639925e9fd6SBram Moolenaar END 640925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 641925e9fd6SBram Moolenaar 642925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 643925e9fd6SBram Moolenaar lines =<< trim END 644925e9fd6SBram Moolenaar vim9script 645925e9fd6SBram Moolenaar func g:Global() 646925e9fd6SBram Moolenaar return "yes" 647925e9fd6SBram Moolenaar endfunc 648925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 649925e9fd6SBram Moolenaar def! g:Global(): string 650925e9fd6SBram Moolenaar return "no" 651925e9fd6SBram Moolenaar enddef 652925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 653925e9fd6SBram Moolenaar delfunc g:Global 654925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 655925e9fd6SBram Moolenaar END 656925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 657925e9fd6SBram Moolenaar 658925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 659925e9fd6SBram Moolenaar lines =<< trim END 660925e9fd6SBram Moolenaar vim9script 661925e9fd6SBram Moolenaar def g:Global(): string 662925e9fd6SBram Moolenaar return "yes" 663925e9fd6SBram Moolenaar enddef 664925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 665925e9fd6SBram Moolenaar func! g:Global() 666925e9fd6SBram Moolenaar return "no" 667925e9fd6SBram Moolenaar endfunc 668925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 669925e9fd6SBram Moolenaar delfunc g:Global 670925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 671925e9fd6SBram Moolenaar END 672925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6734c17ad94SBram Moolenaarenddef 6744c17ad94SBram Moolenaar 675599c89c8SBram Moolenaarfunc Test_wrong_type() 676599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 677599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 678599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 679599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 680599c89c8SBram Moolenaar 681599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 682599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 68342a480bfSBram Moolenaar 68442a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 68542a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 68642a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 68742a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 68842a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 68942a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 69042a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 69142a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 69242a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 69342a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 69442a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 695a0a9f43aSBram Moolenaar 696a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 697a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 6988a7d6542SBram Moolenaarendfunc 6998a7d6542SBram Moolenaar 7008a7d6542SBram Moolenaarfunc Test_const() 7018a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7028a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7038a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7049be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7058a7d6542SBram Moolenaarendfunc 7068a7d6542SBram Moolenaar 707df069eecSBram Moolenaardef Test_range_no_colon() 708df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 709df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 710df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 711df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 712df069eecSBram Moolenaarenddef 713df069eecSBram Moolenaar 714df069eecSBram Moolenaar 7158a7d6542SBram Moolenaardef Test_block() 7168a7d6542SBram Moolenaar let outer = 1 7178a7d6542SBram Moolenaar { 7188a7d6542SBram Moolenaar let inner = 2 7198a7d6542SBram Moolenaar assert_equal(1, outer) 7208a7d6542SBram Moolenaar assert_equal(2, inner) 7218a7d6542SBram Moolenaar } 7228a7d6542SBram Moolenaar assert_equal(1, outer) 7238a7d6542SBram Moolenaarenddef 7248a7d6542SBram Moolenaar 7258a7d6542SBram Moolenaarfunc Test_block_failure() 7268a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 727585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 728585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7298a7d6542SBram Moolenaarendfunc 7308a7d6542SBram Moolenaar 731585fea7bSBram Moolenaardef Test_cmd_modifier() 732585fea7bSBram Moolenaar tab echo '0' 733585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 734585fea7bSBram Moolenaarenddef 735585fea7bSBram Moolenaar 736d032f34aSBram Moolenaarfunc g:NoSuchFunc() 737d032f34aSBram Moolenaar echo 'none' 738d032f34aSBram Moolenaarendfunc 739d032f34aSBram Moolenaar 7408a7d6542SBram Moolenaardef Test_try_catch() 7418a7d6542SBram Moolenaar let l = [] 7427a092245SBram Moolenaar try # comment 7438a7d6542SBram Moolenaar add(l, '1') 7448a7d6542SBram Moolenaar throw 'wrong' 7458a7d6542SBram Moolenaar add(l, '2') 7467a092245SBram Moolenaar catch # comment 7478a7d6542SBram Moolenaar add(l, v:exception) 7487a092245SBram Moolenaar finally # comment 7498a7d6542SBram Moolenaar add(l, '3') 7507a092245SBram Moolenaar endtry # comment 7518a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 75268d130c6SBram Moolenaar 753e859312eSBram Moolenaar l = [] 754e859312eSBram Moolenaar try 755e859312eSBram Moolenaar try 756e859312eSBram Moolenaar add(l, '1') 757e859312eSBram Moolenaar throw 'wrong' 758e859312eSBram Moolenaar add(l, '2') 759e859312eSBram Moolenaar catch /right/ 760e859312eSBram Moolenaar add(l, v:exception) 761e859312eSBram Moolenaar endtry 762e859312eSBram Moolenaar catch /wrong/ 763e859312eSBram Moolenaar add(l, 'caught') 764e859312eSBram Moolenaar finally 765e859312eSBram Moolenaar add(l, 'finally') 766e859312eSBram Moolenaar endtry 767e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 768e859312eSBram Moolenaar 76968d130c6SBram Moolenaar let n: number 77068d130c6SBram Moolenaar try 77168d130c6SBram Moolenaar n = l[3] 77268d130c6SBram Moolenaar catch /E684:/ 77368d130c6SBram Moolenaar n = 99 77468d130c6SBram Moolenaar endtry 77568d130c6SBram Moolenaar assert_equal(99, n) 77668d130c6SBram Moolenaar 77768d130c6SBram Moolenaar try 77868d130c6SBram Moolenaar n = g:astring[3] 77968d130c6SBram Moolenaar catch /E714:/ 78068d130c6SBram Moolenaar n = 77 78168d130c6SBram Moolenaar endtry 78268d130c6SBram Moolenaar assert_equal(77, n) 78368d130c6SBram Moolenaar 78468d130c6SBram Moolenaar try 78568d130c6SBram Moolenaar n = l[g:astring] 78668d130c6SBram Moolenaar catch /E39:/ 78768d130c6SBram Moolenaar n = 77 78868d130c6SBram Moolenaar endtry 78968d130c6SBram Moolenaar assert_equal(77, n) 79068d130c6SBram Moolenaar 79168d130c6SBram Moolenaar try 79268d130c6SBram Moolenaar n = s:does_not_exist 79368d130c6SBram Moolenaar catch /E121:/ 794f0b9f43cSBram Moolenaar n = 111 795f0b9f43cSBram Moolenaar endtry 796f0b9f43cSBram Moolenaar assert_equal(111, n) 797f0b9f43cSBram Moolenaar 798f0b9f43cSBram Moolenaar try 799f0b9f43cSBram Moolenaar n = g:does_not_exist 800f0b9f43cSBram Moolenaar catch /E121:/ 80168d130c6SBram Moolenaar n = 121 80268d130c6SBram Moolenaar endtry 80368d130c6SBram Moolenaar assert_equal(121, n) 80468d130c6SBram Moolenaar 80568d130c6SBram Moolenaar let d = #{one: 1} 80668d130c6SBram Moolenaar try 80768d130c6SBram Moolenaar n = d[g:astring] 80868d130c6SBram Moolenaar catch /E716:/ 80968d130c6SBram Moolenaar n = 222 81068d130c6SBram Moolenaar endtry 81168d130c6SBram Moolenaar assert_equal(222, n) 812f0b9f43cSBram Moolenaar 813f0b9f43cSBram Moolenaar try 814f0b9f43cSBram Moolenaar n = -g:astring 815f0b9f43cSBram Moolenaar catch /E39:/ 816f0b9f43cSBram Moolenaar n = 233 817f0b9f43cSBram Moolenaar endtry 818f0b9f43cSBram Moolenaar assert_equal(233, n) 819f0b9f43cSBram Moolenaar 820f0b9f43cSBram Moolenaar try 821f0b9f43cSBram Moolenaar n = +g:astring 822f0b9f43cSBram Moolenaar catch /E1030:/ 823f0b9f43cSBram Moolenaar n = 244 824f0b9f43cSBram Moolenaar endtry 825f0b9f43cSBram Moolenaar assert_equal(244, n) 826f0b9f43cSBram Moolenaar 827f0b9f43cSBram Moolenaar try 828f0b9f43cSBram Moolenaar n = +g:alist 829f0b9f43cSBram Moolenaar catch /E745:/ 830f0b9f43cSBram Moolenaar n = 255 831f0b9f43cSBram Moolenaar endtry 832f0b9f43cSBram Moolenaar assert_equal(255, n) 833f0b9f43cSBram Moolenaar 834f0b9f43cSBram Moolenaar let nd: dict<any> 835f0b9f43cSBram Moolenaar try 836f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 837f0b9f43cSBram Moolenaar catch /E1029:/ 838f0b9f43cSBram Moolenaar n = 266 839f0b9f43cSBram Moolenaar endtry 840f0b9f43cSBram Moolenaar assert_equal(266, n) 841f0b9f43cSBram Moolenaar 842f0b9f43cSBram Moolenaar try 843f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 844f0b9f43cSBram Moolenaar catch /E1093:/ 845f0b9f43cSBram Moolenaar n = 277 846f0b9f43cSBram Moolenaar endtry 847f0b9f43cSBram Moolenaar assert_equal(277, n) 848f0b9f43cSBram Moolenaar 849e859312eSBram Moolenaar try 850e859312eSBram Moolenaar &ts = g:astring 851e859312eSBram Moolenaar catch /E1029:/ 852e859312eSBram Moolenaar n = 288 853e859312eSBram Moolenaar endtry 854e859312eSBram Moolenaar assert_equal(288, n) 855e859312eSBram Moolenaar 856e859312eSBram Moolenaar try 857e859312eSBram Moolenaar &backspace = 'asdf' 858e859312eSBram Moolenaar catch /E474:/ 859e859312eSBram Moolenaar n = 299 860e859312eSBram Moolenaar endtry 861e859312eSBram Moolenaar assert_equal(299, n) 862e859312eSBram Moolenaar 863e859312eSBram Moolenaar l = [1] 864e859312eSBram Moolenaar try 865e859312eSBram Moolenaar l[3] = 3 866e859312eSBram Moolenaar catch /E684:/ 867e859312eSBram Moolenaar n = 300 868e859312eSBram Moolenaar endtry 869e859312eSBram Moolenaar assert_equal(300, n) 870e859312eSBram Moolenaar 871e859312eSBram Moolenaar try 872e859312eSBram Moolenaar unlet g:does_not_exist 873e859312eSBram Moolenaar catch /E108:/ 874e859312eSBram Moolenaar n = 322 875e859312eSBram Moolenaar endtry 876e859312eSBram Moolenaar assert_equal(322, n) 877e859312eSBram Moolenaar 878e859312eSBram Moolenaar try 879e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 880e859312eSBram Moolenaar catch /E721:/ 881e859312eSBram Moolenaar n = 333 882e859312eSBram Moolenaar endtry 883e859312eSBram Moolenaar assert_equal(333, n) 884e859312eSBram Moolenaar 885e859312eSBram Moolenaar try 886e859312eSBram Moolenaar l = DeletedFunc() 887e859312eSBram Moolenaar catch /E933:/ 888e859312eSBram Moolenaar n = 344 889e859312eSBram Moolenaar endtry 890e859312eSBram Moolenaar assert_equal(344, n) 891d032f34aSBram Moolenaar 892d032f34aSBram Moolenaar try 893d032f34aSBram Moolenaar echo len(v:true) 894d032f34aSBram Moolenaar catch /E701:/ 895d032f34aSBram Moolenaar n = 355 896d032f34aSBram Moolenaar endtry 897d032f34aSBram Moolenaar assert_equal(355, n) 898d032f34aSBram Moolenaar 899d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 900d032f34aSBram Moolenaar delfunc g:NoSuchFunc 901d032f34aSBram Moolenaar try 902d032f34aSBram Moolenaar echo P() 903d032f34aSBram Moolenaar catch /E117:/ 904d032f34aSBram Moolenaar n = 366 905d032f34aSBram Moolenaar endtry 906d032f34aSBram Moolenaar assert_equal(366, n) 907d032f34aSBram Moolenaar 908d032f34aSBram Moolenaar try 909d032f34aSBram Moolenaar echo g:NoSuchFunc() 910d032f34aSBram Moolenaar catch /E117:/ 911d032f34aSBram Moolenaar n = 377 912d032f34aSBram Moolenaar endtry 913d032f34aSBram Moolenaar assert_equal(377, n) 914d032f34aSBram Moolenaar 915d032f34aSBram Moolenaar try 916d032f34aSBram Moolenaar echo g:alist + 4 917d032f34aSBram Moolenaar catch /E745:/ 918d032f34aSBram Moolenaar n = 388 919d032f34aSBram Moolenaar endtry 920d032f34aSBram Moolenaar assert_equal(388, n) 921d032f34aSBram Moolenaar 922d032f34aSBram Moolenaar try 923d032f34aSBram Moolenaar echo 4 + g:alist 924d032f34aSBram Moolenaar catch /E745:/ 925d032f34aSBram Moolenaar n = 399 926d032f34aSBram Moolenaar endtry 927d032f34aSBram Moolenaar assert_equal(399, n) 928d032f34aSBram Moolenaar 929d032f34aSBram Moolenaar try 930d032f34aSBram Moolenaar echo g:alist.member 931d032f34aSBram Moolenaar catch /E715:/ 932d032f34aSBram Moolenaar n = 400 933d032f34aSBram Moolenaar endtry 934d032f34aSBram Moolenaar assert_equal(400, n) 935d032f34aSBram Moolenaar 936d032f34aSBram Moolenaar try 937d032f34aSBram Moolenaar echo d.member 938d032f34aSBram Moolenaar catch /E716:/ 939d032f34aSBram Moolenaar n = 411 940d032f34aSBram Moolenaar endtry 941d032f34aSBram Moolenaar assert_equal(411, n) 9428a7d6542SBram Moolenaarenddef 9438a7d6542SBram Moolenaar 944e859312eSBram Moolenaardef DeletedFunc(): list<any> 945e859312eSBram Moolenaar return ['delete me'] 946e859312eSBram Moolenaarenddef 947e859312eSBram Moolenaardefcompile 948e859312eSBram Moolenaardelfunc DeletedFunc 949e859312eSBram Moolenaar 950257cc5eeSBram Moolenaardef ThrowFromDef() 951a72cfb80SBram Moolenaar throw "getout" # comment 952257cc5eeSBram Moolenaarenddef 953257cc5eeSBram Moolenaar 954257cc5eeSBram Moolenaarfunc CatchInFunc() 955257cc5eeSBram Moolenaar try 956257cc5eeSBram Moolenaar call ThrowFromDef() 957257cc5eeSBram Moolenaar catch 958257cc5eeSBram Moolenaar let g:thrown_func = v:exception 959257cc5eeSBram Moolenaar endtry 960257cc5eeSBram Moolenaarendfunc 961257cc5eeSBram Moolenaar 962257cc5eeSBram Moolenaardef CatchInDef() 963257cc5eeSBram Moolenaar try 964257cc5eeSBram Moolenaar ThrowFromDef() 965257cc5eeSBram Moolenaar catch 966257cc5eeSBram Moolenaar g:thrown_def = v:exception 967257cc5eeSBram Moolenaar endtry 968257cc5eeSBram Moolenaarenddef 969257cc5eeSBram Moolenaar 970f575adffSBram Moolenaardef ReturnFinally(): string 971f575adffSBram Moolenaar try 972f575adffSBram Moolenaar return 'intry' 973f575adffSBram Moolenaar finally 974f575adffSBram Moolenaar g:in_finally = 'finally' 975f575adffSBram Moolenaar endtry 976f575adffSBram Moolenaar return 'end' 977f575adffSBram Moolenaarenddef 978f575adffSBram Moolenaar 979257cc5eeSBram Moolenaardef Test_try_catch_nested() 980257cc5eeSBram Moolenaar CatchInFunc() 981257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 982257cc5eeSBram Moolenaar 983257cc5eeSBram Moolenaar CatchInDef() 984257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 985f575adffSBram Moolenaar 986f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 987f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 988f575adffSBram Moolenaarenddef 989f575adffSBram Moolenaar 990f575adffSBram Moolenaardef Test_try_catch_match() 991f575adffSBram Moolenaar let seq = 'a' 992f575adffSBram Moolenaar try 993f575adffSBram Moolenaar throw 'something' 994f575adffSBram Moolenaar catch /nothing/ 995f575adffSBram Moolenaar seq ..= 'x' 996f575adffSBram Moolenaar catch /some/ 997f575adffSBram Moolenaar seq ..= 'b' 998f575adffSBram Moolenaar catch /asdf/ 999f575adffSBram Moolenaar seq ..= 'x' 1000e8c4abbbSBram Moolenaar catch ?a\?sdf? 1001e8c4abbbSBram Moolenaar seq ..= 'y' 1002f575adffSBram Moolenaar finally 1003f575adffSBram Moolenaar seq ..= 'c' 1004f575adffSBram Moolenaar endtry 1005f575adffSBram Moolenaar assert_equal('abc', seq) 1006257cc5eeSBram Moolenaarenddef 1007257cc5eeSBram Moolenaar 1008e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1009e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1010e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1011e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1012585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1013585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1014585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1015585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1016585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1017585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1018585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1019585fea7bSBram Moolenaar 1020a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1021585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1022e8c4abbbSBram Moolenaarenddef 1023e8c4abbbSBram Moolenaar 1024006ad48bSBram Moolenaardef Test_throw_vimscript() 1025f5be8cdbSBram Moolenaar # only checks line continuation 1026006ad48bSBram Moolenaar let lines =<< trim END 1027006ad48bSBram Moolenaar vim9script 1028006ad48bSBram Moolenaar try 1029006ad48bSBram Moolenaar throw 'one' 1030006ad48bSBram Moolenaar .. 'two' 1031006ad48bSBram Moolenaar catch 1032006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1033006ad48bSBram Moolenaar endtry 1034006ad48bSBram Moolenaar END 1035006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1036006ad48bSBram Moolenaarenddef 1037006ad48bSBram Moolenaar 103837c83711SBram Moolenaardef Test_cexpr_vimscript() 1039f5be8cdbSBram Moolenaar # only checks line continuation 104037c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 104137c83711SBram Moolenaar let lines =<< trim END 104237c83711SBram Moolenaar vim9script 104337c83711SBram Moolenaar cexpr 'File' 104437c83711SBram Moolenaar .. ' someFile' .. 104537c83711SBram Moolenaar ' line 19' 104637c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 104737c83711SBram Moolenaar END 104837c83711SBram Moolenaar CheckScriptSuccess(lines) 104937c83711SBram Moolenaar set errorformat& 105037c83711SBram Moolenaarenddef 105137c83711SBram Moolenaar 1052b209750bSBram Moolenaardef Test_list_vimscript() 1053b209750bSBram Moolenaar # checks line continuation and comments 1054b209750bSBram Moolenaar let lines =<< trim END 1055b209750bSBram Moolenaar vim9script 1056b209750bSBram Moolenaar let mylist = [ 1057b209750bSBram Moolenaar 'one', 1058b209750bSBram Moolenaar # comment 1059b209750bSBram Moolenaar 'two', # empty line follows 1060b209750bSBram Moolenaar 1061b209750bSBram Moolenaar 'three', 1062b209750bSBram Moolenaar ] 1063b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1064b209750bSBram Moolenaar END 1065b209750bSBram Moolenaar CheckScriptSuccess(lines) 1066b209750bSBram Moolenaarenddef 1067b209750bSBram Moolenaar 10682a1381c3SBram Moolenaarif has('channel') 106940ee466cSBram Moolenaar let someJob = test_null_job() 107040ee466cSBram Moolenaar 107140ee466cSBram Moolenaar def FuncWithError() 107240ee466cSBram Moolenaar echomsg g:someJob 107340ee466cSBram Moolenaar enddef 107440ee466cSBram Moolenaar 107540ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 107640ee466cSBram Moolenaar try 107740ee466cSBram Moolenaar call FuncWithError() 107840ee466cSBram Moolenaar catch 107940ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 108040ee466cSBram Moolenaar endtry 108140ee466cSBram Moolenaar endfunc 10822a1381c3SBram Moolenaarendif 108340ee466cSBram Moolenaar 10848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10858a7d6542SBram Moolenaar vim9script 10868a7d6542SBram Moolenaar let name: string = 'bob' 10878a7d6542SBram Moolenaar def Concat(arg: string): string 10888a7d6542SBram Moolenaar return name .. arg 10898a7d6542SBram Moolenaar enddef 1090227a69deSBram Moolenaar g:result = Concat('bie') 1091227a69deSBram Moolenaar g:localname = name 10928a7d6542SBram Moolenaar 10938a7d6542SBram Moolenaar export const CONST = 1234 10948a7d6542SBram Moolenaar export let exported = 9876 10956e587dcbSBram Moolenaar export let exp_name = 'John' 10968a7d6542SBram Moolenaar export def Exported(): string 10978a7d6542SBram Moolenaar return 'Exported' 10988a7d6542SBram Moolenaar enddef 10998a7d6542SBram MoolenaarEND 11008a7d6542SBram Moolenaar 11015269bd2aSBram Moolenaardef Test_vim9_import_export() 11028a7d6542SBram Moolenaar let import_script_lines =<< trim END 11038a7d6542SBram Moolenaar vim9script 11048a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11058a7d6542SBram Moolenaar g:imported = exported 11066e587dcbSBram Moolenaar exported += 3 11076e587dcbSBram Moolenaar g:imported_added = exported 11088a7d6542SBram Moolenaar g:imported_func = Exported() 11096e587dcbSBram Moolenaar 111040f4f7a4SBram Moolenaar def GetExported(): string 111140f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 111240f4f7a4SBram Moolenaar return local_dict.ref() 111340f4f7a4SBram Moolenaar enddef 111440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 111540f4f7a4SBram Moolenaar 11166e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11176e587dcbSBram Moolenaar g:imported_name = exp_name 11186e587dcbSBram Moolenaar exp_name ..= ' Doe' 11196e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11205381c7a1SBram Moolenaar g:imported_later = exported 11218a7d6542SBram Moolenaar END 11228a7d6542SBram Moolenaar 11238a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11248a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11258a7d6542SBram Moolenaar 11268a7d6542SBram Moolenaar source Ximport.vim 11278a7d6542SBram Moolenaar 11288a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11298a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11308a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11316e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11325381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11338a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 113440f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11356e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11366e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11378a7d6542SBram Moolenaar assert_false(exists('g:name')) 11388a7d6542SBram Moolenaar 11398a7d6542SBram Moolenaar unlet g:result 11408a7d6542SBram Moolenaar unlet g:localname 11418a7d6542SBram Moolenaar unlet g:imported 11426e587dcbSBram Moolenaar unlet g:imported_added 11435381c7a1SBram Moolenaar unlet g:imported_later 11448a7d6542SBram Moolenaar unlet g:imported_func 11456e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11468a7d6542SBram Moolenaar delete('Ximport.vim') 1147f2d5c240SBram Moolenaar 11481c991144SBram Moolenaar # similar, with line breaks 11491c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11501c991144SBram Moolenaar vim9script 11511c991144SBram Moolenaar import { 11521c991144SBram Moolenaar exported, 11531c991144SBram Moolenaar Exported, 11541c991144SBram Moolenaar } 11551c991144SBram Moolenaar from 11561c991144SBram Moolenaar './Xexport.vim' 11571c991144SBram Moolenaar g:imported = exported 11581c991144SBram Moolenaar exported += 5 11591c991144SBram Moolenaar g:imported_added = exported 11601c991144SBram Moolenaar g:imported_func = Exported() 11611c991144SBram Moolenaar END 11621c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11631c991144SBram Moolenaar source Ximport_lbr.vim 11641c991144SBram Moolenaar 11651c991144SBram Moolenaar assert_equal(9876, g:imported) 11661c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11671c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11681c991144SBram Moolenaar 11691c991144SBram Moolenaar # exported script not sourced again 11701c991144SBram Moolenaar assert_false(exists('g:result')) 11711c991144SBram Moolenaar unlet g:imported 11721c991144SBram Moolenaar unlet g:imported_added 11731c991144SBram Moolenaar unlet g:imported_func 11741c991144SBram Moolenaar delete('Ximport_lbr.vim') 11751c991144SBram Moolenaar 11761c991144SBram Moolenaar # import inside :def function 11775381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11785381c7a1SBram Moolenaar vim9script 11795381c7a1SBram Moolenaar def ImportInDef() 11805381c7a1SBram Moolenaar import exported from './Xexport.vim' 11815381c7a1SBram Moolenaar g:imported = exported 11825381c7a1SBram Moolenaar exported += 7 11835381c7a1SBram Moolenaar g:imported_added = exported 11845381c7a1SBram Moolenaar enddef 11855381c7a1SBram Moolenaar ImportInDef() 11865381c7a1SBram Moolenaar END 11875381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11885381c7a1SBram Moolenaar source Ximport2.vim 1189f5be8cdbSBram Moolenaar # TODO: this should be 9879 11905381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11915381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11925381c7a1SBram Moolenaar unlet g:imported 11935381c7a1SBram Moolenaar unlet g:imported_added 11945381c7a1SBram Moolenaar delete('Ximport2.vim') 11955381c7a1SBram Moolenaar 1196f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1197f2d5c240SBram Moolenaar vim9script 1198f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1199f2d5c240SBram Moolenaar def UseExport() 1200f2d5c240SBram Moolenaar g:imported = Export.exported 1201f2d5c240SBram Moolenaar enddef 1202f2d5c240SBram Moolenaar UseExport() 1203f2d5c240SBram Moolenaar END 1204f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1205f2d5c240SBram Moolenaar source Ximport.vim 12065381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1207f2d5c240SBram Moolenaar 1208599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1209599c89c8SBram Moolenaar vim9script 1210599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1211599c89c8SBram Moolenaar def Func() 1212599c89c8SBram Moolenaar let dummy = 1 1213599c89c8SBram Moolenaar let imported = Export + dummy 1214599c89c8SBram Moolenaar enddef 1215822ba247SBram Moolenaar defcompile 1216599c89c8SBram Moolenaar END 1217599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1218599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1219599c89c8SBram Moolenaar 1220599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1221599c89c8SBram Moolenaar vim9script 1222599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1223599c89c8SBram Moolenaar def Func() 1224599c89c8SBram Moolenaar let imported = Export . exported 1225599c89c8SBram Moolenaar enddef 1226822ba247SBram Moolenaar defcompile 1227599c89c8SBram Moolenaar END 1228599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1229599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1230599c89c8SBram Moolenaar 1231599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1232599c89c8SBram Moolenaar vim9script 1233599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1234599c89c8SBram Moolenaar def Func() 1235599c89c8SBram Moolenaar let imported = Export. 1236599c89c8SBram Moolenaar enddef 1237822ba247SBram Moolenaar defcompile 1238599c89c8SBram Moolenaar END 1239599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1240599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1241599c89c8SBram Moolenaar 12421c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12431c991144SBram Moolenaar vim9script 12441c991144SBram Moolenaar import * 12451c991144SBram Moolenaar as Export 12461c991144SBram Moolenaar from 12471c991144SBram Moolenaar './Xexport.vim' 12481c991144SBram Moolenaar def UseExport() 12491c991144SBram Moolenaar g:imported = Export.exported 12501c991144SBram Moolenaar enddef 12511c991144SBram Moolenaar UseExport() 12521c991144SBram Moolenaar END 12531c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12541c991144SBram Moolenaar source Ximport.vim 12551c991144SBram Moolenaar assert_equal(9883, g:imported) 12561c991144SBram Moolenaar 1257f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1258f2d5c240SBram Moolenaar vim9script 1259f2d5c240SBram Moolenaar import * from './Xexport.vim' 1260f2d5c240SBram Moolenaar END 1261f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1262f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1263f2d5c240SBram Moolenaar 1264f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1265fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1266fa29c8abSBram Moolenaar vim9script 1267fa29c8abSBram Moolenaar import name from './Xexport.vim' 1268fa29c8abSBram Moolenaar END 1269fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1270fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1271fa29c8abSBram Moolenaar 1272f5be8cdbSBram Moolenaar # try to import something that is already defined 12735269bd2aSBram Moolenaar let import_already_defined =<< trim END 12745269bd2aSBram Moolenaar vim9script 12755269bd2aSBram Moolenaar let exported = 'something' 12765269bd2aSBram Moolenaar import exported from './Xexport.vim' 12775269bd2aSBram Moolenaar END 12785269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12795269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12805269bd2aSBram Moolenaar 1281f5be8cdbSBram Moolenaar # try to import something that is already defined 12825269bd2aSBram Moolenaar import_already_defined =<< trim END 12835269bd2aSBram Moolenaar vim9script 12845269bd2aSBram Moolenaar let exported = 'something' 12855269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12865269bd2aSBram Moolenaar END 12875269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12885269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12895269bd2aSBram Moolenaar 1290f5be8cdbSBram Moolenaar # try to import something that is already defined 12915269bd2aSBram Moolenaar import_already_defined =<< trim END 12925269bd2aSBram Moolenaar vim9script 12935269bd2aSBram Moolenaar let exported = 'something' 12945269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12955269bd2aSBram Moolenaar END 12965269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12975269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12985269bd2aSBram Moolenaar 1299f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1300fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1301fa29c8abSBram Moolenaar vim9script 1302fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1303fa29c8abSBram Moolenaar END 1304fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1305fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1306fa29c8abSBram Moolenaar 1307fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1308fa29c8abSBram Moolenaar vim9script 1309fa29c8abSBram Moolenaar import name './Xexport.vim' 1310fa29c8abSBram Moolenaar END 1311fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1312fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1313fa29c8abSBram Moolenaar 1314fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1315fa29c8abSBram Moolenaar vim9script 1316fa29c8abSBram Moolenaar import name from Xexport.vim 1317fa29c8abSBram Moolenaar END 1318fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1319fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1320fa29c8abSBram Moolenaar 1321fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1322fa29c8abSBram Moolenaar vim9script 1323fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1324fa29c8abSBram Moolenaar END 1325fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1326fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1327fa29c8abSBram Moolenaar 1328fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1329fa29c8abSBram Moolenaar vim9script 1330fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1331fa29c8abSBram Moolenaar END 13325269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13335269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1334fa29c8abSBram Moolenaar 1335f2d5c240SBram Moolenaar delete('Ximport.vim') 13365269bd2aSBram Moolenaar delete('Ximport3.vim') 13378a7d6542SBram Moolenaar delete('Xexport.vim') 13388a7d6542SBram Moolenaar 1339f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1340750802b5SBram Moolenaar set cpo&vi 1341750802b5SBram Moolenaar let cpo_before = &cpo 1342750802b5SBram Moolenaar let lines =<< trim END 1343750802b5SBram Moolenaar vim9script 1344750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1345750802b5SBram Moolenaar END 1346750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1347750802b5SBram Moolenaar source Xvim9_script 1348750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1349750802b5SBram Moolenaar set cpo&vim 1350750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1351750802b5SBram Moolenaar delete('Xvim9_script') 1352750802b5SBram Moolenaarenddef 1353750802b5SBram Moolenaar 1354*803af686SBram Moolenaarfunc g:Trigger() 1355*803af686SBram Moolenaar source Ximport.vim 1356*803af686SBram Moolenaar return "echo 'yes'\<CR>" 1357*803af686SBram Moolenaarendfunc 1358*803af686SBram Moolenaar 1359*803af686SBram Moolenaardef Test_import_export_expr_map() 1360*803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1361*803af686SBram Moolenaar let export_lines =<< trim END 1362*803af686SBram Moolenaar vim9script 1363*803af686SBram Moolenaar export def That(): string 1364*803af686SBram Moolenaar return 'yes' 1365*803af686SBram Moolenaar enddef 1366*803af686SBram Moolenaar END 1367*803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1368*803af686SBram Moolenaar 1369*803af686SBram Moolenaar let import_lines =<< trim END 1370*803af686SBram Moolenaar vim9script 1371*803af686SBram Moolenaar import That from './Xexport_that.vim' 1372*803af686SBram Moolenaar assert_equal('yes', That()) 1373*803af686SBram Moolenaar END 1374*803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1375*803af686SBram Moolenaar 1376*803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1377*803af686SBram Moolenaar feedkeys('trigger', "xt") 1378*803af686SBram Moolenaar 1379*803af686SBram Moolenaar delete('Xexport.vim') 1380*803af686SBram Moolenaar delete('Ximport.vim') 1381*803af686SBram Moolenaar nunmap trigger 1382*803af686SBram Moolenaarenddef 1383*803af686SBram Moolenaar 1384750802b5SBram Moolenaardef Test_vim9script_fails() 13858a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13868a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1387750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 13889721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 13899b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1390750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1391750802b5SBram Moolenaar 1392c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1393c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1394c785b9a7SBram Moolenaar 1395750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1396a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 13978a7d6542SBram Moolenaarenddef 13988a7d6542SBram Moolenaar 1399f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1400101f4810SBram Moolenaar CheckRunVimInTerminal 1401101f4810SBram Moolenaar 14029bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1403c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14049bb3eb3eSBram Moolenaarendfunc 14059bb3eb3eSBram Moolenaar 1406c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1407101f4810SBram Moolenaar let export =<< trim END 1408101f4810SBram Moolenaar vim9script 1409101f4810SBram Moolenaar export def Foo(): number 1410101f4810SBram Moolenaar return 0 1411101f4810SBram Moolenaar enddef 1412101f4810SBram Moolenaar END 14139bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1414101f4810SBram Moolenaar 14159bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 14169bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14179bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1418101f4810SBram Moolenaar 14199bb3eb3eSBram Moolenaar delete('Xexport.vim') 14209bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14219bb3eb3eSBram Moolenaarenddef 1422101f4810SBram Moolenaar 14234c17ad94SBram Moolenaardef Test_vim9script_reload_import() 14248a7d6542SBram Moolenaar let lines =<< trim END 14258a7d6542SBram Moolenaar vim9script 14268a7d6542SBram Moolenaar const var = '' 14278a7d6542SBram Moolenaar let valone = 1234 14288a7d6542SBram Moolenaar def MyFunc(arg: string) 14298a7d6542SBram Moolenaar valone = 5678 14308a7d6542SBram Moolenaar enddef 14318a7d6542SBram Moolenaar END 14328a7d6542SBram Moolenaar let morelines =<< trim END 14338a7d6542SBram Moolenaar let valtwo = 222 14348a7d6542SBram Moolenaar export def GetValtwo(): number 14358a7d6542SBram Moolenaar return valtwo 14368a7d6542SBram Moolenaar enddef 14378a7d6542SBram Moolenaar END 143803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14398a7d6542SBram Moolenaar source Xreload.vim 14408a7d6542SBram Moolenaar source Xreload.vim 14418a7d6542SBram Moolenaar source Xreload.vim 14428a7d6542SBram Moolenaar 14438a7d6542SBram Moolenaar let testlines =<< trim END 14448a7d6542SBram Moolenaar vim9script 14458a7d6542SBram Moolenaar def TheFunc() 14468a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14478a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14488a7d6542SBram Moolenaar enddef 14498a7d6542SBram Moolenaar TheFunc() 14508a7d6542SBram Moolenaar END 14518a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14528a7d6542SBram Moolenaar source Ximport.vim 14538a7d6542SBram Moolenaar 1454f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1455f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14568a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14578a7d6542SBram Moolenaar source Ximport.vim 14588a7d6542SBram Moolenaar 1459f5be8cdbSBram Moolenaar # cannot declare a var twice 14608a7d6542SBram Moolenaar lines =<< trim END 14618a7d6542SBram Moolenaar vim9script 14628a7d6542SBram Moolenaar let valone = 1234 14638a7d6542SBram Moolenaar let valone = 5678 14648a7d6542SBram Moolenaar END 14658a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14668a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 14678a7d6542SBram Moolenaar 14688a7d6542SBram Moolenaar delete('Xreload.vim') 14698a7d6542SBram Moolenaar delete('Ximport.vim') 14708a7d6542SBram Moolenaarenddef 14718a7d6542SBram Moolenaar 1472fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1473fe465a01SBram Moolenaar" script-local name. 1474fe465a01SBram Moolenaardef Test_vim9script_funcref() 1475fe465a01SBram Moolenaar let sortlines =<< trim END 1476fe465a01SBram Moolenaar vim9script 1477fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1478bed36b93SBram Moolenaar return i2 - i1 1479fe465a01SBram Moolenaar enddef 1480fe465a01SBram Moolenaar 1481fe465a01SBram Moolenaar export def FastSort(): list<number> 1482fe465a01SBram Moolenaar return range(5)->sort(Compare) 1483fe465a01SBram Moolenaar enddef 1484fe465a01SBram Moolenaar END 1485fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1486fe465a01SBram Moolenaar 1487fe465a01SBram Moolenaar let lines =<< trim END 1488fe465a01SBram Moolenaar vim9script 1489fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1490fe465a01SBram Moolenaar def Test() 1491fe465a01SBram Moolenaar g:result = FastSort() 1492fe465a01SBram Moolenaar enddef 1493fe465a01SBram Moolenaar Test() 1494fe465a01SBram Moolenaar END 1495fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1496fe465a01SBram Moolenaar 1497fe465a01SBram Moolenaar source Xscript.vim 1498fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1499fe465a01SBram Moolenaar 1500fe465a01SBram Moolenaar unlet g:result 1501fe465a01SBram Moolenaar delete('Xsort.vim') 1502fe465a01SBram Moolenaar delete('Xscript.vim') 1503fe465a01SBram Moolenaarenddef 1504fe465a01SBram Moolenaar 1505c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1506c620c055SBram Moolenaar" script where FastFilter() is called from. 1507c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1508c620c055SBram Moolenaar let filterLines =<< trim END 1509c620c055SBram Moolenaar vim9script 1510c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1511c620c055SBram Moolenaar return idx % 2 == 1 1512c620c055SBram Moolenaar enddef 1513c620c055SBram Moolenaar export def FastFilter(): list<number> 1514c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1515c620c055SBram Moolenaar enddef 1516c620c055SBram Moolenaar END 1517c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1518c620c055SBram Moolenaar 1519c620c055SBram Moolenaar let lines =<< trim END 1520c620c055SBram Moolenaar vim9script 1521c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1522c620c055SBram Moolenaar def Test() 1523c620c055SBram Moolenaar let x: list<number> = FastFilter() 1524c620c055SBram Moolenaar enddef 1525c620c055SBram Moolenaar Test() 1526c620c055SBram Moolenaar END 1527c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1528c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1529c620c055SBram Moolenaar 1530c620c055SBram Moolenaar delete('Xfilter.vim') 1531c620c055SBram Moolenaar delete('Ximport.vim') 1532c620c055SBram Moolenaarenddef 1533c620c055SBram Moolenaar 15344c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 15354c17ad94SBram Moolenaar let first_lines =<< trim END 15364c17ad94SBram Moolenaar vim9script 15374c17ad94SBram Moolenaar def FuncYes(): string 15384c17ad94SBram Moolenaar return 'yes' 15394c17ad94SBram Moolenaar enddef 15404c17ad94SBram Moolenaar END 154103afdcf1SBram Moolenaar let withno_lines =<< trim END 15424c17ad94SBram Moolenaar def FuncNo(): string 15434c17ad94SBram Moolenaar return 'no' 15444c17ad94SBram Moolenaar enddef 15454c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15464c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15474c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 154803afdcf1SBram Moolenaar enddef 154903afdcf1SBram Moolenaar END 155003afdcf1SBram Moolenaar let nono_lines =<< trim END 155103afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 155203afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 15534c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 15544c17ad94SBram Moolenaar enddef 15554c17ad94SBram Moolenaar END 15564c17ad94SBram Moolenaar 15574c17ad94SBram Moolenaar # FuncNo() is defined 155803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15594c17ad94SBram Moolenaar source Xreloaded.vim 15604c17ad94SBram Moolenaar g:DoCheck(true) 15614c17ad94SBram Moolenaar 15624c17ad94SBram Moolenaar # FuncNo() is not redefined 156303afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15644c17ad94SBram Moolenaar source Xreloaded.vim 156503afdcf1SBram Moolenaar g:DoCheck() 15664c17ad94SBram Moolenaar 15674c17ad94SBram Moolenaar # FuncNo() is back 156803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15694c17ad94SBram Moolenaar source Xreloaded.vim 157003afdcf1SBram Moolenaar g:DoCheck() 15714c17ad94SBram Moolenaar 15724c17ad94SBram Moolenaar delete('Xreloaded.vim') 15734c17ad94SBram Moolenaarenddef 15744c17ad94SBram Moolenaar 157589483d40SBram Moolenaardef Test_vim9script_reload_delvar() 157689483d40SBram Moolenaar # write the script with a script-local variable 157789483d40SBram Moolenaar let lines =<< trim END 157889483d40SBram Moolenaar vim9script 157989483d40SBram Moolenaar let var = 'string' 158089483d40SBram Moolenaar END 158189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 158289483d40SBram Moolenaar source XreloadVar.vim 158389483d40SBram Moolenaar 158489483d40SBram Moolenaar # now write the script using the same variable locally - works 158589483d40SBram Moolenaar lines =<< trim END 158689483d40SBram Moolenaar vim9script 158789483d40SBram Moolenaar def Func() 158889483d40SBram Moolenaar let var = 'string' 158989483d40SBram Moolenaar enddef 159089483d40SBram Moolenaar END 159189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 159289483d40SBram Moolenaar source XreloadVar.vim 159389483d40SBram Moolenaar 159489483d40SBram Moolenaar delete('XreloadVar.vim') 159589483d40SBram Moolenaarenddef 159689483d40SBram Moolenaar 15978a7d6542SBram Moolenaardef Test_import_absolute() 15988a7d6542SBram Moolenaar let import_lines = [ 1599e6085c53SBram Moolenaar 'vim9script', 1600e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1601e6085c53SBram Moolenaar 'def UseExported()', 1602e6085c53SBram Moolenaar ' g:imported_abs = exported', 1603e6085c53SBram Moolenaar ' exported = 8888', 1604e6085c53SBram Moolenaar ' g:imported_after = exported', 1605e6085c53SBram Moolenaar 'enddef', 1606e6085c53SBram Moolenaar 'UseExported()', 1607e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1608e6085c53SBram Moolenaar ] 16098a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16108a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16118a7d6542SBram Moolenaar 16128a7d6542SBram Moolenaar source Ximport_abs.vim 16138a7d6542SBram Moolenaar 16148a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16154e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1616675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1617675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1618675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1619675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1620675f716eSBram Moolenaar 'exported = 8888.*' .. 1621675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1622675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1623675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1624675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1625e6085c53SBram Moolenaar g:import_disassembled) 16268a7d6542SBram Moolenaar unlet g:imported_abs 16274e12a5dfSBram Moolenaar unlet g:import_disassembled 16288a7d6542SBram Moolenaar 16298a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16308a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16318a7d6542SBram Moolenaarenddef 16328a7d6542SBram Moolenaar 16338a7d6542SBram Moolenaardef Test_import_rtp() 16348a7d6542SBram Moolenaar let import_lines = [ 1635e6085c53SBram Moolenaar 'vim9script', 1636e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1637e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1638e6085c53SBram Moolenaar ] 16398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16408a7d6542SBram Moolenaar mkdir('import') 16418a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16428a7d6542SBram Moolenaar 16438a7d6542SBram Moolenaar let save_rtp = &rtp 16448a7d6542SBram Moolenaar &rtp = getcwd() 16458a7d6542SBram Moolenaar source Ximport_rtp.vim 16468a7d6542SBram Moolenaar &rtp = save_rtp 16478a7d6542SBram Moolenaar 16488a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16498a7d6542SBram Moolenaar unlet g:imported_rtp 16508a7d6542SBram Moolenaar 16518a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 165289483d40SBram Moolenaar delete('import', 'rf') 16538a7d6542SBram Moolenaarenddef 16548a7d6542SBram Moolenaar 165525e0f586SBram Moolenaardef Test_import_compile_error() 165625e0f586SBram Moolenaar let export_lines = [ 165725e0f586SBram Moolenaar 'vim9script', 165825e0f586SBram Moolenaar 'export def ExpFunc(): string', 165925e0f586SBram Moolenaar ' return notDefined', 166025e0f586SBram Moolenaar 'enddef', 166125e0f586SBram Moolenaar ] 166225e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 166325e0f586SBram Moolenaar 166425e0f586SBram Moolenaar let import_lines = [ 166525e0f586SBram Moolenaar 'vim9script', 166625e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 166725e0f586SBram Moolenaar 'def ImpFunc()', 166825e0f586SBram Moolenaar ' echo ExpFunc()', 166925e0f586SBram Moolenaar 'enddef', 167025e0f586SBram Moolenaar 'defcompile', 167125e0f586SBram Moolenaar ] 167225e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 167325e0f586SBram Moolenaar 167425e0f586SBram Moolenaar try 167525e0f586SBram Moolenaar source Ximport.vim 167625e0f586SBram Moolenaar catch /E1001/ 1677f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 167825e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 167925e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 168025e0f586SBram Moolenaar endtry 168125e0f586SBram Moolenaar 168225e0f586SBram Moolenaar delete('Xexported.vim') 168325e0f586SBram Moolenaar delete('Ximport.vim') 168425e0f586SBram Moolenaarenddef 168525e0f586SBram Moolenaar 1686eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1687eef2102eSBram Moolenaar let export_lines =<< trim END 1688eef2102eSBram Moolenaar vim9script 1689eef2102eSBram Moolenaar export def Func() 1690eef2102eSBram Moolenaar echo 'imported' 1691eef2102eSBram Moolenaar enddef 1692eef2102eSBram Moolenaar END 1693eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1694eef2102eSBram Moolenaar 1695eef2102eSBram Moolenaar let lines =<< trim END 1696eef2102eSBram Moolenaar vim9script 1697eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1698eef2102eSBram Moolenaar def Func() 1699eef2102eSBram Moolenaar echo 'local to function' 1700eef2102eSBram Moolenaar enddef 1701eef2102eSBram Moolenaar END 1702eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1703eef2102eSBram Moolenaar 1704eef2102eSBram Moolenaar lines =<< trim END 1705eef2102eSBram Moolenaar vim9script 1706eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1707eef2102eSBram Moolenaar def Outer() 1708eef2102eSBram Moolenaar def Func() 1709eef2102eSBram Moolenaar echo 'local to function' 1710eef2102eSBram Moolenaar enddef 1711eef2102eSBram Moolenaar enddef 1712eef2102eSBram Moolenaar defcompile 1713eef2102eSBram Moolenaar END 1714eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1715eef2102eSBram Moolenaar 1716eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1717eef2102eSBram Moolenaarenddef 1718eef2102eSBram Moolenaar 1719b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1720b9a2cac3SBram Moolenaar let lines =<< trim END 1721b9a2cac3SBram Moolenaar vim9script 1722b9a2cac3SBram Moolenaar def Func() 1723b9a2cac3SBram Moolenaar echo 'one' 1724b9a2cac3SBram Moolenaar enddef 1725b9a2cac3SBram Moolenaar def Func() 1726b9a2cac3SBram Moolenaar echo 'two' 1727b9a2cac3SBram Moolenaar enddef 1728b9a2cac3SBram Moolenaar END 1729b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1730b9a2cac3SBram Moolenaarenddef 1731b9a2cac3SBram Moolenaar 17328a7d6542SBram Moolenaardef Test_fixed_size_list() 1733f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 17348a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 17358a7d6542SBram Moolenaar l->remove(0) 17368a7d6542SBram Moolenaar l->add(5) 17378a7d6542SBram Moolenaar l->insert(99, 1) 17380f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17398a7d6542SBram Moolenaarenddef 17408a7d6542SBram Moolenaar 1741ae616494SBram Moolenaardef Test_no_insert_xit() 1742ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1743ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1744f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1745f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1746f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1747ae616494SBram Moolenaar 1748ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1749ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1750ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1751ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1752f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1753f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1754f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1755f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1756f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1757ae616494SBram Moolenaarenddef 1758ae616494SBram Moolenaar 1759158906cfSBram Moolenaardef IfElse(what: number): string 1760158906cfSBram Moolenaar let res = '' 1761158906cfSBram Moolenaar if what == 1 1762158906cfSBram Moolenaar res = "one" 1763158906cfSBram Moolenaar elseif what == 2 1764158906cfSBram Moolenaar res = "two" 1765a259d8d3SBram Moolenaar else 1766158906cfSBram Moolenaar res = "three" 1767a259d8d3SBram Moolenaar endif 1768158906cfSBram Moolenaar return res 1769a259d8d3SBram Moolenaarenddef 1770a259d8d3SBram Moolenaar 1771158906cfSBram Moolenaardef Test_if_elseif_else() 1772158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1773158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1774158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17750f18b6d1SBram Moolenaarenddef 17760f18b6d1SBram Moolenaar 1777e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1778e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1779e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1780e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1781e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1782585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1783e8c4abbbSBram Moolenaarenddef 1784e8c4abbbSBram Moolenaar 17856d69bf60SBram Moolenaarlet g:bool_true = v:true 17866d69bf60SBram Moolenaarlet g:bool_false = v:false 17876d69bf60SBram Moolenaar 17886d69bf60SBram Moolenaardef Test_if_const_expr() 17896d69bf60SBram Moolenaar let res = false 17906d69bf60SBram Moolenaar if true ? true : false 17916d69bf60SBram Moolenaar res = true 17926d69bf60SBram Moolenaar endif 17936d69bf60SBram Moolenaar assert_equal(true, res) 17946d69bf60SBram Moolenaar 1795585fea7bSBram Moolenaar g:glob = 2 1796585fea7bSBram Moolenaar if false 17976797966dSBram Moolenaar execute('g:glob = 3') 1798585fea7bSBram Moolenaar endif 1799585fea7bSBram Moolenaar assert_equal(2, g:glob) 1800585fea7bSBram Moolenaar if true 18016797966dSBram Moolenaar execute('g:glob = 3') 1802585fea7bSBram Moolenaar endif 1803585fea7bSBram Moolenaar assert_equal(3, g:glob) 1804585fea7bSBram Moolenaar 18056d69bf60SBram Moolenaar res = false 18066d69bf60SBram Moolenaar if g:bool_true ? true : false 18076d69bf60SBram Moolenaar res = true 18086d69bf60SBram Moolenaar endif 18096d69bf60SBram Moolenaar assert_equal(true, res) 18106d69bf60SBram Moolenaar 18116d69bf60SBram Moolenaar res = false 18126d69bf60SBram Moolenaar if true ? g:bool_true : false 18136d69bf60SBram Moolenaar res = true 18146d69bf60SBram Moolenaar endif 18156d69bf60SBram Moolenaar assert_equal(true, res) 18166d69bf60SBram Moolenaar 18176d69bf60SBram Moolenaar res = false 18186d69bf60SBram Moolenaar if true ? true : g:bool_false 18196d69bf60SBram Moolenaar res = true 18206d69bf60SBram Moolenaar endif 18216d69bf60SBram Moolenaar assert_equal(true, res) 18226d69bf60SBram Moolenaar 18236d69bf60SBram Moolenaar res = false 18246d69bf60SBram Moolenaar if true ? false : true 18256d69bf60SBram Moolenaar res = true 18266d69bf60SBram Moolenaar endif 18276d69bf60SBram Moolenaar assert_equal(false, res) 18286d69bf60SBram Moolenaar 18296d69bf60SBram Moolenaar res = false 18306d69bf60SBram Moolenaar if false ? false : true 18316d69bf60SBram Moolenaar res = true 18326d69bf60SBram Moolenaar endif 18336d69bf60SBram Moolenaar assert_equal(true, res) 18346d69bf60SBram Moolenaar 18356d69bf60SBram Moolenaar res = false 18366d69bf60SBram Moolenaar if false ? true : false 18376d69bf60SBram Moolenaar res = true 18386d69bf60SBram Moolenaar endif 18396d69bf60SBram Moolenaar assert_equal(false, res) 18406d69bf60SBram Moolenaar 18416d69bf60SBram Moolenaar res = false 1842e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1843e8c4abbbSBram Moolenaar res = true 1844e8c4abbbSBram Moolenaar endif 1845e8c4abbbSBram Moolenaar assert_equal(false, res) 1846e8c4abbbSBram Moolenaar 1847e8c4abbbSBram Moolenaar res = false 18486d69bf60SBram Moolenaar if true && true 18496d69bf60SBram Moolenaar res = true 18506d69bf60SBram Moolenaar endif 18516d69bf60SBram Moolenaar assert_equal(true, res) 18526d69bf60SBram Moolenaar 18536d69bf60SBram Moolenaar res = false 18546d69bf60SBram Moolenaar if true && false 18556d69bf60SBram Moolenaar res = true 18566d69bf60SBram Moolenaar endif 18576d69bf60SBram Moolenaar assert_equal(false, res) 18586d69bf60SBram Moolenaar 18596d69bf60SBram Moolenaar res = false 18606d69bf60SBram Moolenaar if g:bool_true && false 18616d69bf60SBram Moolenaar res = true 18626d69bf60SBram Moolenaar endif 18636d69bf60SBram Moolenaar assert_equal(false, res) 18646d69bf60SBram Moolenaar 18656d69bf60SBram Moolenaar res = false 18666d69bf60SBram Moolenaar if true && g:bool_false 18676d69bf60SBram Moolenaar res = true 18686d69bf60SBram Moolenaar endif 18696d69bf60SBram Moolenaar assert_equal(false, res) 18706d69bf60SBram Moolenaar 18716d69bf60SBram Moolenaar res = false 18726d69bf60SBram Moolenaar if false && false 18736d69bf60SBram Moolenaar res = true 18746d69bf60SBram Moolenaar endif 18756d69bf60SBram Moolenaar assert_equal(false, res) 18766d69bf60SBram Moolenaar 18776d69bf60SBram Moolenaar res = false 18786d69bf60SBram Moolenaar if true || false 18796d69bf60SBram Moolenaar res = true 18806d69bf60SBram Moolenaar endif 18816d69bf60SBram Moolenaar assert_equal(true, res) 18826d69bf60SBram Moolenaar 18836d69bf60SBram Moolenaar res = false 18846d69bf60SBram Moolenaar if g:bool_true || false 18856d69bf60SBram Moolenaar res = true 18866d69bf60SBram Moolenaar endif 18876d69bf60SBram Moolenaar assert_equal(true, res) 18886d69bf60SBram Moolenaar 18896d69bf60SBram Moolenaar res = false 18906d69bf60SBram Moolenaar if true || g:bool_false 18916d69bf60SBram Moolenaar res = true 18926d69bf60SBram Moolenaar endif 18936d69bf60SBram Moolenaar assert_equal(true, res) 18946d69bf60SBram Moolenaar 18956d69bf60SBram Moolenaar res = false 18966d69bf60SBram Moolenaar if false || false 18976d69bf60SBram Moolenaar res = true 18986d69bf60SBram Moolenaar endif 18996d69bf60SBram Moolenaar assert_equal(false, res) 190080c34ca3SBram Moolenaarenddef 19016d69bf60SBram Moolenaar 190280c34ca3SBram Moolenaardef Test_if_const_expr_fails() 190380c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 190480c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1905e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1906e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19076d69bf60SBram Moolenaarenddef 19086d69bf60SBram Moolenaar 190972abcf42SBram Moolenaardef RunNested(i: number): number 191072abcf42SBram Moolenaar let x: number = 0 191172abcf42SBram Moolenaar if i % 2 191272abcf42SBram Moolenaar if 1 1913f5be8cdbSBram Moolenaar # comment 191472abcf42SBram Moolenaar else 1915f5be8cdbSBram Moolenaar # comment 191672abcf42SBram Moolenaar endif 191772abcf42SBram Moolenaar x += 1 191872abcf42SBram Moolenaar else 191972abcf42SBram Moolenaar x += 1000 192072abcf42SBram Moolenaar endif 192172abcf42SBram Moolenaar return x 192272abcf42SBram Moolenaarenddef 192372abcf42SBram Moolenaar 192472abcf42SBram Moolenaardef Test_nested_if() 192572abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 192672abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 192772abcf42SBram Moolenaarenddef 192872abcf42SBram Moolenaar 1929ad39c094SBram Moolenaardef Test_execute_cmd() 1930ad39c094SBram Moolenaar new 1931ad39c094SBram Moolenaar setline(1, 'default') 1932ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1933ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1934a72cfb80SBram Moolenaar 1935a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1936a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1937a72cfb80SBram Moolenaar 1938ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1939ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1940a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1941ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1942a72cfb80SBram Moolenaar 1943ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1944ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1945a72cfb80SBram Moolenaar 1946ad39c094SBram Moolenaar let cmd_first = 'call ' 1947ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1948ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1949ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1950ad39c094SBram Moolenaar bwipe! 1951585fea7bSBram Moolenaar 19522d6b20d6SBram Moolenaar let n = true 19532d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19542d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19552d6b20d6SBram Moolenaar 1956585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1957a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1958ad39c094SBram Moolenaarenddef 1959ad39c094SBram Moolenaar 196047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1961f5be8cdbSBram Moolenaar # only checks line continuation 196247e880d6SBram Moolenaar let lines =<< trim END 196347e880d6SBram Moolenaar vim9script 196447e880d6SBram Moolenaar execute 'g:someVar' 196547e880d6SBram Moolenaar .. ' = ' .. 196647e880d6SBram Moolenaar '28' 196747e880d6SBram Moolenaar assert_equal(28, g:someVar) 196847e880d6SBram Moolenaar unlet g:someVar 196947e880d6SBram Moolenaar END 197047e880d6SBram Moolenaar CheckScriptSuccess(lines) 197147e880d6SBram Moolenaarenddef 197247e880d6SBram Moolenaar 1973ad39c094SBram Moolenaardef Test_echo_cmd() 1974a72cfb80SBram Moolenaar echo 'some' # comment 1975585fea7bSBram Moolenaar echon 'thing' 1976ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1977ad39c094SBram Moolenaar 1978a72cfb80SBram Moolenaar echo "some" # comment 1979a72cfb80SBram Moolenaar echon "thing" 1980a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1981a72cfb80SBram Moolenaar 1982ad39c094SBram Moolenaar let str1 = 'some' 1983ad39c094SBram Moolenaar let str2 = 'more' 1984ad39c094SBram Moolenaar echo str1 str2 1985ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1986a72cfb80SBram Moolenaar 1987a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1988ad39c094SBram Moolenaarenddef 1989ad39c094SBram Moolenaar 1990f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1991f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1992f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1993f93c7feaSBram Moolenaar echo 'clear' 1994df069eecSBram Moolenaar :1messages 1995f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1996f93c7feaSBram Moolenaar 1997f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1998f93c7feaSBram Moolenaarenddef 1999f93c7feaSBram Moolenaar 200047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2001f5be8cdbSBram Moolenaar # only checks line continuation 200247e880d6SBram Moolenaar let lines =<< trim END 200347e880d6SBram Moolenaar vim9script 200447e880d6SBram Moolenaar echomsg 'here' 200547e880d6SBram Moolenaar .. ' is ' .. 200647e880d6SBram Moolenaar 'a message' 200747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 200847e880d6SBram Moolenaar END 200947e880d6SBram Moolenaar CheckScriptSuccess(lines) 201047e880d6SBram Moolenaarenddef 201147e880d6SBram Moolenaar 2012f93c7feaSBram Moolenaardef Test_echoerr_cmd() 201340ee466cSBram Moolenaar try 201440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 201540ee466cSBram Moolenaar catch 201640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 201740ee466cSBram Moolenaar endtry 2018f93c7feaSBram Moolenaarenddef 2019f93c7feaSBram Moolenaar 202047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2021f5be8cdbSBram Moolenaar # only checks line continuation 202247e880d6SBram Moolenaar let lines =<< trim END 202347e880d6SBram Moolenaar vim9script 202447e880d6SBram Moolenaar try 202547e880d6SBram Moolenaar echoerr 'this' 202647e880d6SBram Moolenaar .. ' is ' .. 202747e880d6SBram Moolenaar 'wrong' 202847e880d6SBram Moolenaar catch 202947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 203047e880d6SBram Moolenaar endtry 203147e880d6SBram Moolenaar END 203247e880d6SBram Moolenaar CheckScriptSuccess(lines) 203347e880d6SBram Moolenaarenddef 203447e880d6SBram Moolenaar 203541fe0617SBram Moolenaardef Test_for_outside_of_function() 203641fe0617SBram Moolenaar let lines =<< trim END 203741fe0617SBram Moolenaar vim9script 203841fe0617SBram Moolenaar new 203941fe0617SBram Moolenaar for var in range(0, 3) 204041fe0617SBram Moolenaar append(line('$'), var) 204141fe0617SBram Moolenaar endfor 204241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 204341fe0617SBram Moolenaar bwipe! 204441fe0617SBram Moolenaar END 204541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 204641fe0617SBram Moolenaar source Xvim9for.vim 204741fe0617SBram Moolenaar delete('Xvim9for.vim') 204841fe0617SBram Moolenaarenddef 20498a7d6542SBram Moolenaar 2050e8c4abbbSBram Moolenaardef Test_for_loop() 2051e8c4abbbSBram Moolenaar let result = '' 2052e8c4abbbSBram Moolenaar for cnt in range(7) 2053e8c4abbbSBram Moolenaar if cnt == 4 2054e8c4abbbSBram Moolenaar break 2055e8c4abbbSBram Moolenaar endif 2056e8c4abbbSBram Moolenaar if cnt == 2 2057e8c4abbbSBram Moolenaar continue 2058e8c4abbbSBram Moolenaar endif 2059e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2060e8c4abbbSBram Moolenaar endfor 2061e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20620ad3e894SBram Moolenaar 20630ad3e894SBram Moolenaar let concat = '' 20640ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20650ad3e894SBram Moolenaar concat ..= str 20660ad3e894SBram Moolenaar endfor 20670ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2068e8c4abbbSBram Moolenaarenddef 2069e8c4abbbSBram Moolenaar 2070e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2071675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2072675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2073675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2074822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 20750ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2076675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2077675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2078675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2079e8c4abbbSBram Moolenaarenddef 2080e8c4abbbSBram Moolenaar 2081d0df1aacSBram Moolenaardef Test_while_loop() 2082d0df1aacSBram Moolenaar let result = '' 2083d0df1aacSBram Moolenaar let cnt = 0 2084d0df1aacSBram Moolenaar while cnt < 555 2085d0df1aacSBram Moolenaar if cnt == 3 2086d0df1aacSBram Moolenaar break 2087d0df1aacSBram Moolenaar endif 2088d0df1aacSBram Moolenaar cnt += 1 2089d0df1aacSBram Moolenaar if cnt == 2 2090d0df1aacSBram Moolenaar continue 2091d0df1aacSBram Moolenaar endif 2092d0df1aacSBram Moolenaar result ..= cnt .. '_' 2093d0df1aacSBram Moolenaar endwhile 2094d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2095d0df1aacSBram Moolenaarenddef 2096d0df1aacSBram Moolenaar 2097e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2098675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2099675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2100675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2101675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2102675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2103675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2104675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2105bd5da371SBram Moolenaarenddef 2106bd5da371SBram Moolenaar 21079645e2d9SBram Moolenaardef Test_interrupt_loop() 210897acfc78SBram Moolenaar let caught = false 21099645e2d9SBram Moolenaar let x = 0 211097acfc78SBram Moolenaar try 21119645e2d9SBram Moolenaar while 1 21129645e2d9SBram Moolenaar x += 1 21139645e2d9SBram Moolenaar if x == 100 21149645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 21159645e2d9SBram Moolenaar endif 21169645e2d9SBram Moolenaar endwhile 211797acfc78SBram Moolenaar catch 211897acfc78SBram Moolenaar caught = true 211997acfc78SBram Moolenaar assert_equal(100, x) 212097acfc78SBram Moolenaar endtry 212197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 21229645e2d9SBram Moolenaarenddef 212320431c9dSBram Moolenaar 21244fdae999SBram Moolenaardef Test_automatic_line_continuation() 21254fdae999SBram Moolenaar let mylist = [ 21264fdae999SBram Moolenaar 'one', 21274fdae999SBram Moolenaar 'two', 21284fdae999SBram Moolenaar 'three', 2129f5be8cdbSBram Moolenaar ] # comment 21304fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 21314fdae999SBram Moolenaar 21324fdae999SBram Moolenaar let mydict = { 21334fdae999SBram Moolenaar 'one': 1, 21344fdae999SBram Moolenaar 'two': 2, 21354fdae999SBram Moolenaar 'three': 21364fdae999SBram Moolenaar 3, 2137f5be8cdbSBram Moolenaar } # comment 21384fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 21394fdae999SBram Moolenaar mydict = #{ 21402c330432SBram Moolenaar one: 1, # comment 21412c330432SBram Moolenaar two: # comment 21422c330432SBram Moolenaar 2, # comment 21432c330432SBram Moolenaar three: 3 # comment 21442c330432SBram Moolenaar } 21452c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 21462c330432SBram Moolenaar mydict = #{ 21472c330432SBram Moolenaar one: 1, 21484fdae999SBram Moolenaar two: 21494fdae999SBram Moolenaar 2, 21502c330432SBram Moolenaar three: 3 21514fdae999SBram Moolenaar } 21524fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2153e6085c53SBram Moolenaar 2154e6085c53SBram Moolenaar assert_equal( 2155e6085c53SBram Moolenaar ['one', 'two', 'three'], 2156e6085c53SBram Moolenaar split('one two three') 2157e6085c53SBram Moolenaar ) 21584fdae999SBram Moolenaarenddef 21594fdae999SBram Moolenaar 21607a092245SBram Moolenaardef Test_vim9_comment() 21617a092245SBram Moolenaar CheckScriptSuccess([ 21627a092245SBram Moolenaar 'vim9script', 21637a092245SBram Moolenaar '# something', 21647a092245SBram Moolenaar ]) 21657a092245SBram Moolenaar CheckScriptFailure([ 21667a092245SBram Moolenaar 'vim9script', 21677a092245SBram Moolenaar ':# something', 21687a092245SBram Moolenaar ], 'E488:') 21697a092245SBram Moolenaar CheckScriptFailure([ 21707a092245SBram Moolenaar '# something', 21717a092245SBram Moolenaar ], 'E488:') 21727a092245SBram Moolenaar CheckScriptFailure([ 21737a092245SBram Moolenaar ':# something', 21747a092245SBram Moolenaar ], 'E488:') 21757a092245SBram Moolenaar 21764a8d9f2eSBram Moolenaar { # block start 21774a8d9f2eSBram Moolenaar } # block end 21784a8d9f2eSBram Moolenaar CheckDefFailure([ 21794a8d9f2eSBram Moolenaar '{# comment', 21804a8d9f2eSBram Moolenaar ], 'E488:') 21814a8d9f2eSBram Moolenaar CheckDefFailure([ 21824a8d9f2eSBram Moolenaar '{', 21834a8d9f2eSBram Moolenaar '}# comment', 21844a8d9f2eSBram Moolenaar ], 'E488:') 21854a8d9f2eSBram Moolenaar 21864a8d9f2eSBram Moolenaar echo "yes" # comment 21874a8d9f2eSBram Moolenaar CheckDefFailure([ 21884a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21894a8d9f2eSBram Moolenaar ], 'E488:') 21907a092245SBram Moolenaar CheckScriptSuccess([ 21917a092245SBram Moolenaar 'vim9script', 21927a092245SBram Moolenaar 'echo "yes" # something', 21937a092245SBram Moolenaar ]) 21947a092245SBram Moolenaar CheckScriptFailure([ 21957a092245SBram Moolenaar 'vim9script', 21967a092245SBram Moolenaar 'echo "yes"# something', 21977a092245SBram Moolenaar ], 'E121:') 21987a092245SBram Moolenaar CheckScriptFailure([ 21997a092245SBram Moolenaar 'vim9script', 22007a092245SBram Moolenaar 'echo# something', 22017a092245SBram Moolenaar ], 'E121:') 22027a092245SBram Moolenaar CheckScriptFailure([ 22037a092245SBram Moolenaar 'echo "yes" # something', 22047a092245SBram Moolenaar ], 'E121:') 22057a092245SBram Moolenaar 22064a8d9f2eSBram Moolenaar exe "echo" # comment 22074a8d9f2eSBram Moolenaar CheckDefFailure([ 22084a8d9f2eSBram Moolenaar 'exe "echo"# comment', 22094a8d9f2eSBram Moolenaar ], 'E488:') 22104a8d9f2eSBram Moolenaar CheckScriptSuccess([ 22114a8d9f2eSBram Moolenaar 'vim9script', 22124a8d9f2eSBram Moolenaar 'exe "echo" # something', 22134a8d9f2eSBram Moolenaar ]) 22144a8d9f2eSBram Moolenaar CheckScriptFailure([ 22154a8d9f2eSBram Moolenaar 'vim9script', 22164a8d9f2eSBram Moolenaar 'exe "echo"# something', 22174a8d9f2eSBram Moolenaar ], 'E121:') 22184a8d9f2eSBram Moolenaar CheckDefFailure([ 22194a8d9f2eSBram Moolenaar 'exe # comment', 22204a8d9f2eSBram Moolenaar ], 'E1015:') 22214a8d9f2eSBram Moolenaar CheckScriptFailure([ 22224a8d9f2eSBram Moolenaar 'vim9script', 22234a8d9f2eSBram Moolenaar 'exe# something', 22244a8d9f2eSBram Moolenaar ], 'E121:') 22254a8d9f2eSBram Moolenaar CheckScriptFailure([ 22264a8d9f2eSBram Moolenaar 'exe "echo" # something', 22274a8d9f2eSBram Moolenaar ], 'E121:') 22284a8d9f2eSBram Moolenaar 22297a092245SBram Moolenaar CheckDefFailure([ 22307a092245SBram Moolenaar 'try# comment', 22317a092245SBram Moolenaar ' echo "yes"', 22327a092245SBram Moolenaar 'catch', 22337a092245SBram Moolenaar 'endtry', 22347a092245SBram Moolenaar ], 'E488:') 22352c5ed4e3SBram Moolenaar CheckScriptFailure([ 22362c5ed4e3SBram Moolenaar 'vim9script', 22372c5ed4e3SBram Moolenaar 'try# comment', 22382c5ed4e3SBram Moolenaar 'echo "yes"', 22392c5ed4e3SBram Moolenaar ], 'E488:') 22407a092245SBram Moolenaar CheckDefFailure([ 22417a092245SBram Moolenaar 'try', 2242a72cfb80SBram Moolenaar ' throw#comment', 2243a72cfb80SBram Moolenaar 'catch', 2244a72cfb80SBram Moolenaar 'endtry', 2245a72cfb80SBram Moolenaar ], 'E1015:') 2246a72cfb80SBram Moolenaar CheckDefFailure([ 2247a72cfb80SBram Moolenaar 'try', 2248a72cfb80SBram Moolenaar ' throw "yes"#comment', 2249a72cfb80SBram Moolenaar 'catch', 2250a72cfb80SBram Moolenaar 'endtry', 2251a72cfb80SBram Moolenaar ], 'E488:') 2252a72cfb80SBram Moolenaar CheckDefFailure([ 2253a72cfb80SBram Moolenaar 'try', 22547a092245SBram Moolenaar ' echo "yes"', 22557a092245SBram Moolenaar 'catch# comment', 22567a092245SBram Moolenaar 'endtry', 22577a092245SBram Moolenaar ], 'E488:') 22582c5ed4e3SBram Moolenaar CheckScriptFailure([ 22592c5ed4e3SBram Moolenaar 'vim9script', 22602c5ed4e3SBram Moolenaar 'try', 22612c5ed4e3SBram Moolenaar ' echo "yes"', 22622c5ed4e3SBram Moolenaar 'catch# comment', 22632c5ed4e3SBram Moolenaar 'endtry', 22642c5ed4e3SBram Moolenaar ], 'E654:') 22652c5ed4e3SBram Moolenaar CheckDefFailure([ 22662c5ed4e3SBram Moolenaar 'try', 22672c5ed4e3SBram Moolenaar ' echo "yes"', 22682c5ed4e3SBram Moolenaar 'catch /pat/# comment', 22692c5ed4e3SBram Moolenaar 'endtry', 22702c5ed4e3SBram Moolenaar ], 'E488:') 22717a092245SBram Moolenaar CheckDefFailure([ 22727a092245SBram Moolenaar 'try', 22737a092245SBram Moolenaar 'echo "yes"', 22747a092245SBram Moolenaar 'catch', 22757a092245SBram Moolenaar 'endtry# comment', 22767a092245SBram Moolenaar ], 'E488:') 22772c5ed4e3SBram Moolenaar CheckScriptFailure([ 22782c5ed4e3SBram Moolenaar 'vim9script', 22792c5ed4e3SBram Moolenaar 'try', 22802c5ed4e3SBram Moolenaar ' echo "yes"', 22812c5ed4e3SBram Moolenaar 'catch', 22822c5ed4e3SBram Moolenaar 'endtry# comment', 22839b7bf9e9SBram Moolenaar ], 'E488:') 22842c5ed4e3SBram Moolenaar 22852c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22862c5ed4e3SBram Moolenaar 'vim9script', 22872c5ed4e3SBram Moolenaar 'hi # comment', 22882c5ed4e3SBram Moolenaar ]) 22892c5ed4e3SBram Moolenaar CheckScriptFailure([ 22902c5ed4e3SBram Moolenaar 'vim9script', 22912c5ed4e3SBram Moolenaar 'hi# comment', 22922c5ed4e3SBram Moolenaar ], 'E416:') 22931966c248SBram Moolenaar CheckScriptSuccess([ 22941966c248SBram Moolenaar 'vim9script', 22951966c248SBram Moolenaar 'hi Search # comment', 22961966c248SBram Moolenaar ]) 22971966c248SBram Moolenaar CheckScriptFailure([ 22981966c248SBram Moolenaar 'vim9script', 22991966c248SBram Moolenaar 'hi Search# comment', 23001966c248SBram Moolenaar ], 'E416:') 23011966c248SBram Moolenaar CheckScriptSuccess([ 23021966c248SBram Moolenaar 'vim9script', 23031966c248SBram Moolenaar 'hi link This Search # comment', 23041966c248SBram Moolenaar ]) 23051966c248SBram Moolenaar CheckScriptFailure([ 23061966c248SBram Moolenaar 'vim9script', 23071966c248SBram Moolenaar 'hi link This That# comment', 23081966c248SBram Moolenaar ], 'E413:') 23091966c248SBram Moolenaar CheckScriptSuccess([ 23101966c248SBram Moolenaar 'vim9script', 23111966c248SBram Moolenaar 'hi clear This # comment', 23121966c248SBram Moolenaar 'hi clear # comment', 23131966c248SBram Moolenaar ]) 2314f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2315f5be8cdbSBram Moolenaar # hi clear This# comment', 23161966c248SBram Moolenaar CheckScriptFailure([ 23171966c248SBram Moolenaar 'vim9script', 23181966c248SBram Moolenaar 'hi clear# comment', 23191966c248SBram Moolenaar ], 'E416:') 23201966c248SBram Moolenaar 23211966c248SBram Moolenaar CheckScriptSuccess([ 23221966c248SBram Moolenaar 'vim9script', 23231966c248SBram Moolenaar 'hi Group term=bold', 23241966c248SBram Moolenaar 'match Group /todo/ # comment', 23251966c248SBram Moolenaar ]) 23261966c248SBram Moolenaar CheckScriptFailure([ 23271966c248SBram Moolenaar 'vim9script', 23281966c248SBram Moolenaar 'hi Group term=bold', 23291966c248SBram Moolenaar 'match Group /todo/# comment', 23301966c248SBram Moolenaar ], 'E488:') 23311966c248SBram Moolenaar CheckScriptSuccess([ 23321966c248SBram Moolenaar 'vim9script', 23331966c248SBram Moolenaar 'match # comment', 23341966c248SBram Moolenaar ]) 23351966c248SBram Moolenaar CheckScriptFailure([ 23361966c248SBram Moolenaar 'vim9script', 23371966c248SBram Moolenaar 'match# comment', 23381966c248SBram Moolenaar ], 'E475:') 23391966c248SBram Moolenaar CheckScriptSuccess([ 23401966c248SBram Moolenaar 'vim9script', 23411966c248SBram Moolenaar 'match none # comment', 23421966c248SBram Moolenaar ]) 23431966c248SBram Moolenaar CheckScriptFailure([ 23441966c248SBram Moolenaar 'vim9script', 23451966c248SBram Moolenaar 'match none# comment', 23461966c248SBram Moolenaar ], 'E475:') 23471966c248SBram Moolenaar 23481966c248SBram Moolenaar CheckScriptSuccess([ 23491966c248SBram Moolenaar 'vim9script', 23501966c248SBram Moolenaar 'menutrans clear # comment', 23511966c248SBram Moolenaar ]) 23521966c248SBram Moolenaar CheckScriptFailure([ 23531966c248SBram Moolenaar 'vim9script', 23541966c248SBram Moolenaar 'menutrans clear# comment text', 23551966c248SBram Moolenaar ], 'E474:') 23561966c248SBram Moolenaar 23571966c248SBram Moolenaar CheckScriptSuccess([ 23581966c248SBram Moolenaar 'vim9script', 23591966c248SBram Moolenaar 'syntax clear # comment', 23601966c248SBram Moolenaar ]) 23611966c248SBram Moolenaar CheckScriptFailure([ 23621966c248SBram Moolenaar 'vim9script', 23631966c248SBram Moolenaar 'syntax clear# comment text', 23641966c248SBram Moolenaar ], 'E28:') 23651966c248SBram Moolenaar CheckScriptSuccess([ 23661966c248SBram Moolenaar 'vim9script', 23671966c248SBram Moolenaar 'syntax keyword Word some', 23681966c248SBram Moolenaar 'syntax clear Word # comment', 23691966c248SBram Moolenaar ]) 23701966c248SBram Moolenaar CheckScriptFailure([ 23711966c248SBram Moolenaar 'vim9script', 23721966c248SBram Moolenaar 'syntax keyword Word some', 23731966c248SBram Moolenaar 'syntax clear Word# comment text', 23741966c248SBram Moolenaar ], 'E28:') 23751966c248SBram Moolenaar 23761966c248SBram Moolenaar CheckScriptSuccess([ 23771966c248SBram Moolenaar 'vim9script', 23781966c248SBram Moolenaar 'syntax list # comment', 23791966c248SBram Moolenaar ]) 23801966c248SBram Moolenaar CheckScriptFailure([ 23811966c248SBram Moolenaar 'vim9script', 23821966c248SBram Moolenaar 'syntax list# comment text', 23831966c248SBram Moolenaar ], 'E28:') 23841966c248SBram Moolenaar 23851966c248SBram Moolenaar CheckScriptSuccess([ 23861966c248SBram Moolenaar 'vim9script', 23871966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23881966c248SBram Moolenaar ]) 23891966c248SBram Moolenaar CheckScriptFailure([ 23901966c248SBram Moolenaar 'vim9script', 23911966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23921966c248SBram Moolenaar ], 'E475:') 23931966c248SBram Moolenaar 23941966c248SBram Moolenaar CheckScriptSuccess([ 23951966c248SBram Moolenaar 'vim9script', 23961966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23971966c248SBram Moolenaar ]) 23981966c248SBram Moolenaar CheckScriptFailure([ 23991966c248SBram Moolenaar 'vim9script', 24001966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 24011966c248SBram Moolenaar ], 'E789:') 24021966c248SBram Moolenaar 24031966c248SBram Moolenaar CheckScriptSuccess([ 24041966c248SBram Moolenaar 'vim9script', 24051966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 24061966c248SBram Moolenaar ]) 24071966c248SBram Moolenaar CheckScriptFailure([ 24081966c248SBram Moolenaar 'vim9script', 24091966c248SBram Moolenaar 'syntax match Word /pat/# comment', 24101966c248SBram Moolenaar ], 'E402:') 24111966c248SBram Moolenaar 24121966c248SBram Moolenaar CheckScriptSuccess([ 24131966c248SBram Moolenaar 'vim9script', 24141966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 24151966c248SBram Moolenaar ]) 24161966c248SBram Moolenaar CheckScriptFailure([ 24171966c248SBram Moolenaar 'vim9script', 24181966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 24191966c248SBram Moolenaar ], 'E475:') 24201966c248SBram Moolenaar CheckScriptFailure([ 24211966c248SBram Moolenaar 'vim9script', 24221966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 24231966c248SBram Moolenaar ], 'E406:') 24241966c248SBram Moolenaar CheckScriptFailure([ 24251966c248SBram Moolenaar 'vim9script', 24261966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 24271966c248SBram Moolenaar ], 'E475:') 24281966c248SBram Moolenaar 24291966c248SBram Moolenaar CheckScriptSuccess([ 24301966c248SBram Moolenaar 'vim9script', 24311966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 24321966c248SBram Moolenaar ]) 24331966c248SBram Moolenaar CheckScriptFailure([ 24341966c248SBram Moolenaar 'vim9script', 24351966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2436d032f34aSBram Moolenaar ], 'E402:') 24371966c248SBram Moolenaar 24381966c248SBram Moolenaar CheckScriptSuccess([ 24391966c248SBram Moolenaar 'vim9script', 24401966c248SBram Moolenaar 'syntax sync # comment', 24411966c248SBram Moolenaar ]) 24421966c248SBram Moolenaar CheckScriptFailure([ 24431966c248SBram Moolenaar 'vim9script', 24441966c248SBram Moolenaar 'syntax sync# comment', 24451966c248SBram Moolenaar ], 'E404:') 24461966c248SBram Moolenaar CheckScriptSuccess([ 24471966c248SBram Moolenaar 'vim9script', 24481966c248SBram Moolenaar 'syntax sync ccomment # comment', 24491966c248SBram Moolenaar ]) 24501966c248SBram Moolenaar CheckScriptFailure([ 24511966c248SBram Moolenaar 'vim9script', 24521966c248SBram Moolenaar 'syntax sync ccomment# comment', 24531966c248SBram Moolenaar ], 'E404:') 24541966c248SBram Moolenaar 24551966c248SBram Moolenaar CheckScriptSuccess([ 24561966c248SBram Moolenaar 'vim9script', 24571966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 24581966c248SBram Moolenaar ]) 24591966c248SBram Moolenaar CheckScriptFailure([ 24601966c248SBram Moolenaar 'vim9script', 24611966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 24621966c248SBram Moolenaar ], 'E475:') 2463a72cfb80SBram Moolenaar 2464a72cfb80SBram Moolenaar CheckScriptSuccess([ 2465a72cfb80SBram Moolenaar 'vim9script', 2466a72cfb80SBram Moolenaar 'command Echo echo # comment', 2467a72cfb80SBram Moolenaar 'command Echo # comment', 2468a72cfb80SBram Moolenaar ]) 2469a72cfb80SBram Moolenaar CheckScriptFailure([ 2470a72cfb80SBram Moolenaar 'vim9script', 2471a72cfb80SBram Moolenaar 'command Echo echo# comment', 2472a72cfb80SBram Moolenaar 'Echo', 2473a72cfb80SBram Moolenaar ], 'E121:') 2474a72cfb80SBram Moolenaar CheckScriptFailure([ 2475a72cfb80SBram Moolenaar 'vim9script', 2476a72cfb80SBram Moolenaar 'command Echo# comment', 2477a72cfb80SBram Moolenaar ], 'E182:') 2478a72cfb80SBram Moolenaar CheckScriptFailure([ 2479a72cfb80SBram Moolenaar 'vim9script', 2480a72cfb80SBram Moolenaar 'command Echo echo', 2481a72cfb80SBram Moolenaar 'command Echo# comment', 2482a72cfb80SBram Moolenaar ], 'E182:') 2483a72cfb80SBram Moolenaar 2484a72cfb80SBram Moolenaar CheckScriptSuccess([ 2485a72cfb80SBram Moolenaar 'vim9script', 2486a72cfb80SBram Moolenaar 'function # comment', 2487a72cfb80SBram Moolenaar ]) 2488a72cfb80SBram Moolenaar CheckScriptFailure([ 2489a72cfb80SBram Moolenaar 'vim9script', 24909898107fSBram Moolenaar 'function " comment', 24919898107fSBram Moolenaar ], 'E129:') 24929898107fSBram Moolenaar CheckScriptFailure([ 24939898107fSBram Moolenaar 'vim9script', 2494a72cfb80SBram Moolenaar 'function# comment', 2495a72cfb80SBram Moolenaar ], 'E129:') 2496a72cfb80SBram Moolenaar CheckScriptSuccess([ 2497a72cfb80SBram Moolenaar 'vim9script', 2498a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2499a72cfb80SBram Moolenaar ]) 2500a72cfb80SBram Moolenaar CheckScriptFailure([ 2501a72cfb80SBram Moolenaar 'vim9script', 2502a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2503a72cfb80SBram Moolenaar ], 'E488:') 2504a72cfb80SBram Moolenaar 2505a72cfb80SBram Moolenaar CheckScriptSuccess([ 2506a72cfb80SBram Moolenaar 'vim9script', 25074c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2508a72cfb80SBram Moolenaar 'endfunc', 25094c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2510a72cfb80SBram Moolenaar ]) 2511a72cfb80SBram Moolenaar CheckScriptFailure([ 2512a72cfb80SBram Moolenaar 'vim9script', 25134c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2514a72cfb80SBram Moolenaar 'endfunc', 25154c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2516a72cfb80SBram Moolenaar ], 'E488:') 2517a72cfb80SBram Moolenaar 2518a72cfb80SBram Moolenaar CheckScriptSuccess([ 2519a72cfb80SBram Moolenaar 'vim9script', 2520a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2521a72cfb80SBram Moolenaar ]) 2522a72cfb80SBram Moolenaar CheckScriptFailure([ 2523a72cfb80SBram Moolenaar 'vim9script', 2524a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2525a72cfb80SBram Moolenaar ], 'E488:') 2526e7e4838fSBram Moolenaar 2527e7e4838fSBram Moolenaar CheckScriptFailure([ 2528e7e4838fSBram Moolenaar 'def Test() " comment', 2529e7e4838fSBram Moolenaar 'enddef', 2530e7e4838fSBram Moolenaar ], 'E488:') 2531e7e4838fSBram Moolenaar CheckScriptFailure([ 2532e7e4838fSBram Moolenaar 'vim9script', 2533e7e4838fSBram Moolenaar 'def Test() " comment', 2534e7e4838fSBram Moolenaar 'enddef', 2535e7e4838fSBram Moolenaar ], 'E488:') 2536e7e4838fSBram Moolenaar 2537e7e4838fSBram Moolenaar CheckScriptSuccess([ 2538e7e4838fSBram Moolenaar 'func Test() " comment', 2539e7e4838fSBram Moolenaar 'endfunc', 2540e7e4838fSBram Moolenaar ]) 25419898107fSBram Moolenaar CheckScriptSuccess([ 2542e7e4838fSBram Moolenaar 'vim9script', 2543e7e4838fSBram Moolenaar 'func Test() " comment', 2544e7e4838fSBram Moolenaar 'endfunc', 25459898107fSBram Moolenaar ]) 2546e7e4838fSBram Moolenaar 2547e7e4838fSBram Moolenaar CheckScriptSuccess([ 2548e7e4838fSBram Moolenaar 'def Test() # comment', 2549e7e4838fSBram Moolenaar 'enddef', 2550e7e4838fSBram Moolenaar ]) 2551e7e4838fSBram Moolenaar CheckScriptFailure([ 2552e7e4838fSBram Moolenaar 'func Test() # comment', 2553e7e4838fSBram Moolenaar 'endfunc', 2554e7e4838fSBram Moolenaar ], 'E488:') 25552c5ed4e3SBram Moolenaarenddef 25562c5ed4e3SBram Moolenaar 25572c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25582c5ed4e3SBram Moolenaar CheckCanRunGui 25592c5ed4e3SBram Moolenaar 25602c5ed4e3SBram Moolenaar CheckScriptFailure([ 25612c5ed4e3SBram Moolenaar 'vim9script', 25622c5ed4e3SBram Moolenaar 'gui#comment' 25632c5ed4e3SBram Moolenaar ], 'E499:') 25642c5ed4e3SBram Moolenaar CheckScriptFailure([ 25652c5ed4e3SBram Moolenaar 'vim9script', 25662c5ed4e3SBram Moolenaar 'gui -f#comment' 25672c5ed4e3SBram Moolenaar ], 'E499:') 25687a092245SBram Moolenaarenddef 25697a092245SBram Moolenaar 2570a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 25716797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 25726797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2573a26b9700SBram Moolenaar 2574a26b9700SBram Moolenaar edit test.vim 2575a26b9700SBram Moolenaar doautocmd TabEnter #comment 2576a26b9700SBram Moolenaar assert_equal(1, g:entered) 2577a26b9700SBram Moolenaar 2578a26b9700SBram Moolenaar doautocmd TabEnter f.x 2579a26b9700SBram Moolenaar assert_equal(2, g:entered) 2580a26b9700SBram Moolenaar 2581a26b9700SBram Moolenaar g:entered = 0 2582a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2583a26b9700SBram Moolenaar assert_equal(2, g:entered) 2584a26b9700SBram Moolenaar 2585a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2586a26b9700SBram Moolenaar 2587a26b9700SBram Moolenaar au! TabEnter 2588a26b9700SBram Moolenaar unlet g:entered 2589d72c1bf0SBram Moolenaar 2590d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2591d72c1bf0SBram Moolenaar 'vim9script', 25926797966dSBram Moolenaar 'g:var = 123', 2593e55b1c09SBram Moolenaar 'b:var = 456', 2594e55b1c09SBram Moolenaar 'w:var = 777', 2595e55b1c09SBram Moolenaar 't:var = 888', 2596d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2597d72c1bf0SBram Moolenaar ]) 2598d72c1bf0SBram Moolenaar 2599d72c1bf0SBram Moolenaar CheckScriptFailure([ 2600d72c1bf0SBram Moolenaar 'vim9script', 2601d72c1bf0SBram Moolenaar 'let g:var = 123', 2602e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2603e55b1c09SBram Moolenaar 2604e55b1c09SBram Moolenaar CheckScriptFailure([ 2605e55b1c09SBram Moolenaar 'vim9script', 2606e55b1c09SBram Moolenaar 'let b:var = 123', 2607e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2608e55b1c09SBram Moolenaar 2609e55b1c09SBram Moolenaar CheckScriptFailure([ 2610e55b1c09SBram Moolenaar 'vim9script', 2611e55b1c09SBram Moolenaar 'let w:var = 123', 2612e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2613e55b1c09SBram Moolenaar 2614e55b1c09SBram Moolenaar CheckScriptFailure([ 2615e55b1c09SBram Moolenaar 'vim9script', 2616e55b1c09SBram Moolenaar 'let t:var = 123', 2617e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2618e55b1c09SBram Moolenaar 2619e55b1c09SBram Moolenaar CheckScriptFailure([ 2620e55b1c09SBram Moolenaar 'vim9script', 2621e55b1c09SBram Moolenaar 'let v:version = 123', 2622e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2623e55b1c09SBram Moolenaar 2624e55b1c09SBram Moolenaar CheckScriptFailure([ 2625e55b1c09SBram Moolenaar 'vim9script', 2626e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2627e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 26286797966dSBram Moolenaar 26296797966dSBram Moolenaar CheckScriptFailure([ 26306797966dSBram Moolenaar 'vim9script', 26316797966dSBram Moolenaar 'g:var = 123', 263232e35117SBram Moolenaar 'unlet g:var# comment1', 2633d72c1bf0SBram Moolenaar ], 'E108:') 2634d72c1bf0SBram Moolenaar 2635d72c1bf0SBram Moolenaar CheckScriptFailure([ 2636d72c1bf0SBram Moolenaar 'let g:var = 123', 2637d72c1bf0SBram Moolenaar 'unlet g:var # something', 2638d72c1bf0SBram Moolenaar ], 'E488:') 2639faac4104SBram Moolenaar 2640faac4104SBram Moolenaar CheckScriptSuccess([ 2641faac4104SBram Moolenaar 'vim9script', 264232e35117SBram Moolenaar 'if 1 # comment2', 2643faac4104SBram Moolenaar ' echo "yes"', 2644faac4104SBram Moolenaar 'elseif 2 #comment', 2645faac4104SBram Moolenaar ' echo "no"', 2646faac4104SBram Moolenaar 'endif', 2647faac4104SBram Moolenaar ]) 2648faac4104SBram Moolenaar 2649faac4104SBram Moolenaar CheckScriptFailure([ 2650faac4104SBram Moolenaar 'vim9script', 265132e35117SBram Moolenaar 'if 1# comment3', 2652faac4104SBram Moolenaar ' echo "yes"', 2653faac4104SBram Moolenaar 'endif', 2654faac4104SBram Moolenaar ], 'E15:') 2655faac4104SBram Moolenaar 2656faac4104SBram Moolenaar CheckScriptFailure([ 2657faac4104SBram Moolenaar 'vim9script', 265832e35117SBram Moolenaar 'if 0 # comment4', 2659faac4104SBram Moolenaar ' echo "yes"', 2660faac4104SBram Moolenaar 'elseif 2#comment', 2661faac4104SBram Moolenaar ' echo "no"', 2662faac4104SBram Moolenaar 'endif', 2663faac4104SBram Moolenaar ], 'E15:') 2664faac4104SBram Moolenaar 2665faac4104SBram Moolenaar CheckScriptSuccess([ 2666faac4104SBram Moolenaar 'vim9script', 266732e35117SBram Moolenaar 'let v = 1 # comment5', 2668faac4104SBram Moolenaar ]) 2669faac4104SBram Moolenaar 2670faac4104SBram Moolenaar CheckScriptFailure([ 2671faac4104SBram Moolenaar 'vim9script', 267232e35117SBram Moolenaar 'let v = 1# comment6', 267332e35117SBram Moolenaar ], 'E15:') 2674faac4104SBram Moolenaar 2675faac4104SBram Moolenaar CheckScriptSuccess([ 2676faac4104SBram Moolenaar 'vim9script', 2677faac4104SBram Moolenaar 'new' 2678faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2679df069eecSBram Moolenaar ':$', 2680faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2681faac4104SBram Moolenaar 'bwipe!', 2682faac4104SBram Moolenaar ]) 2683faac4104SBram Moolenaar 2684f5be8cdbSBram Moolenaar CheckScriptFailure([ 2685f5be8cdbSBram Moolenaar 'vim9script', 2686f5be8cdbSBram Moolenaar 'new' 2687f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2688f5be8cdbSBram Moolenaar ':$', 2689f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2690f5be8cdbSBram Moolenaar 'bwipe!', 2691f5be8cdbSBram Moolenaar ], 'E488:') 2692f5be8cdbSBram Moolenaar 2693f5be8cdbSBram Moolenaar CheckScriptFailure([ 2694f5be8cdbSBram Moolenaar 'vim9script', 2695f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2696f5be8cdbSBram Moolenaar ], 'E477:') 2697a26b9700SBram Moolenaarenddef 2698a26b9700SBram Moolenaar 26997e5bd91dSBram Moolenaardef Test_finish() 27007e5bd91dSBram Moolenaar let lines =<< trim END 27017e5bd91dSBram Moolenaar vim9script 27026797966dSBram Moolenaar g:res = 'one' 27037e5bd91dSBram Moolenaar if v:false | finish | endif 27046797966dSBram Moolenaar g:res = 'two' 27057e5bd91dSBram Moolenaar finish 27066797966dSBram Moolenaar g:res = 'three' 27077e5bd91dSBram Moolenaar END 27087e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27097e5bd91dSBram Moolenaar source Xfinished 27107e5bd91dSBram Moolenaar assert_equal('two', g:res) 27117e5bd91dSBram Moolenaar 27127e5bd91dSBram Moolenaar unlet g:res 27137e5bd91dSBram Moolenaar delete('Xfinished') 27147e5bd91dSBram Moolenaarenddef 27157e5bd91dSBram Moolenaar 271632e35117SBram Moolenaardef Test_let_func_call() 271732e35117SBram Moolenaar let lines =<< trim END 271832e35117SBram Moolenaar vim9script 271932e35117SBram Moolenaar func GetValue() 272032e35117SBram Moolenaar if exists('g:count') 272132e35117SBram Moolenaar let g:count += 1 272232e35117SBram Moolenaar else 272332e35117SBram Moolenaar let g:count = 1 272432e35117SBram Moolenaar endif 272532e35117SBram Moolenaar return 'this' 272632e35117SBram Moolenaar endfunc 272732e35117SBram Moolenaar let val: string = GetValue() 2728f5be8cdbSBram Moolenaar # env var is always a string 2729df671b46SBram Moolenaar let env = $TERM 273032e35117SBram Moolenaar END 273132e35117SBram Moolenaar writefile(lines, 'Xfinished') 273232e35117SBram Moolenaar source Xfinished 2733f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 273432e35117SBram Moolenaar assert_equal(1, g:count) 273532e35117SBram Moolenaar 273632e35117SBram Moolenaar unlet g:count 273732e35117SBram Moolenaar delete('Xfinished') 273832e35117SBram Moolenaarenddef 273932e35117SBram Moolenaar 274032e35117SBram Moolenaardef Test_let_missing_type() 274132e35117SBram Moolenaar let lines =<< trim END 274232e35117SBram Moolenaar vim9script 2743df671b46SBram Moolenaar let var = g:unknown 2744227a69deSBram Moolenaar END 2745822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2746227a69deSBram Moolenaar 2747227a69deSBram Moolenaar lines =<< trim END 2748227a69deSBram Moolenaar vim9script 2749227a69deSBram Moolenaar let nr: number = 123 2750227a69deSBram Moolenaar let var = nr 2751227a69deSBram Moolenaar END 2752822ba247SBram Moolenaar CheckScriptSuccess(lines) 275332e35117SBram Moolenaarenddef 275432e35117SBram Moolenaar 2755c82a5b5dSBram Moolenaardef Test_let_declaration() 2756c82a5b5dSBram Moolenaar let lines =<< trim END 2757c82a5b5dSBram Moolenaar vim9script 2758c82a5b5dSBram Moolenaar let var: string 2759c82a5b5dSBram Moolenaar g:var_uninit = var 2760c82a5b5dSBram Moolenaar var = 'text' 2761c82a5b5dSBram Moolenaar g:var_test = var 2762f5be8cdbSBram Moolenaar # prefixing s: is optional 2763984dddbeSBram Moolenaar s:var = 'prefixed' 2764984dddbeSBram Moolenaar g:var_prefixed = s:var 2765984dddbeSBram Moolenaar 2766984dddbeSBram Moolenaar let s:other: number 2767984dddbeSBram Moolenaar other = 1234 2768984dddbeSBram Moolenaar g:other_var = other 2769c82a5b5dSBram Moolenaar END 2770c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2771c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2772c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2773984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2774984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2775c82a5b5dSBram Moolenaar 2776c82a5b5dSBram Moolenaar unlet g:var_uninit 2777c82a5b5dSBram Moolenaar unlet g:var_test 2778984dddbeSBram Moolenaar unlet g:var_prefixed 2779984dddbeSBram Moolenaar unlet g:other_var 2780c82a5b5dSBram Moolenaarenddef 2781c82a5b5dSBram Moolenaar 2782c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2783c5b1c20bSBram Moolenaar let lines =<< trim END 2784c5b1c20bSBram Moolenaar vim9script 2785c5b1c20bSBram Moolenaar const var: string 2786c5b1c20bSBram Moolenaar END 2787c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2788c5b1c20bSBram Moolenaar 2789c5b1c20bSBram Moolenaar lines =<< trim END 2790c5b1c20bSBram Moolenaar vim9script 2791c5b1c20bSBram Moolenaar let 9var: string 2792c5b1c20bSBram Moolenaar END 2793c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2794c5b1c20bSBram Moolenaarenddef 2795c5b1c20bSBram Moolenaar 279634db91f7SBram Moolenaardef Test_let_type_check() 279734db91f7SBram Moolenaar let lines =<< trim END 279834db91f7SBram Moolenaar vim9script 279934db91f7SBram Moolenaar let var: string 280034db91f7SBram Moolenaar var = 1234 280134db91f7SBram Moolenaar END 280234db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2803984dddbeSBram Moolenaar 2804984dddbeSBram Moolenaar lines =<< trim END 2805984dddbeSBram Moolenaar vim9script 2806984dddbeSBram Moolenaar let var:string 2807984dddbeSBram Moolenaar END 2808984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2809c5b1c20bSBram Moolenaar 2810c5b1c20bSBram Moolenaar lines =<< trim END 2811c5b1c20bSBram Moolenaar vim9script 2812c5b1c20bSBram Moolenaar let var: asdf 2813c5b1c20bSBram Moolenaar END 2814c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2815a71e2633SBram Moolenaar 2816a71e2633SBram Moolenaar lines =<< trim END 2817a71e2633SBram Moolenaar vim9script 2818a71e2633SBram Moolenaar let s:l: list<number> 2819a71e2633SBram Moolenaar s:l = [] 2820a71e2633SBram Moolenaar END 2821a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2822a71e2633SBram Moolenaar 2823a71e2633SBram Moolenaar lines =<< trim END 2824a71e2633SBram Moolenaar vim9script 2825a71e2633SBram Moolenaar let s:d: dict<number> 2826a71e2633SBram Moolenaar s:d = {} 2827a71e2633SBram Moolenaar END 2828a71e2633SBram Moolenaar CheckScriptSuccess(lines) 282934db91f7SBram Moolenaarenddef 283034db91f7SBram Moolenaar 2831a5d0077eSBram Moolenaardef Test_forward_declaration() 2832a5d0077eSBram Moolenaar let lines =<< trim END 2833a5d0077eSBram Moolenaar vim9script 2834a5d0077eSBram Moolenaar def GetValue(): string 2835a5d0077eSBram Moolenaar return theVal 2836a5d0077eSBram Moolenaar enddef 2837a5d0077eSBram Moolenaar let theVal = 'something' 2838822ba247SBram Moolenaar g:initVal = GetValue() 2839a5d0077eSBram Moolenaar theVal = 'else' 2840a5d0077eSBram Moolenaar g:laterVal = GetValue() 2841a5d0077eSBram Moolenaar END 2842a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2843a5d0077eSBram Moolenaar source Xforward 2844a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2845a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2846a5d0077eSBram Moolenaar 2847a5d0077eSBram Moolenaar unlet g:initVal 2848a5d0077eSBram Moolenaar unlet g:laterVal 2849a5d0077eSBram Moolenaar delete('Xforward') 2850a5d0077eSBram Moolenaarenddef 2851a5d0077eSBram Moolenaar 28529721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 28539721fb4eSBram Moolenaar let legacy_lines =<< trim END 28549721fb4eSBram Moolenaar source Xvim9_script.vim 28559721fb4eSBram Moolenaar 28569721fb4eSBram Moolenaar call assert_false(exists('local')) 28579721fb4eSBram Moolenaar call assert_false(exists('exported')) 28589721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 28599721fb4eSBram Moolenaar call assert_equal('global', global) 28609721fb4eSBram Moolenaar call assert_equal('global', g:global) 28619721fb4eSBram Moolenaar 28629721fb4eSBram Moolenaar " imported variable becomes script-local 28639721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 28649721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 28659721fb4eSBram Moolenaar call assert_false(exists('exported')) 28669721fb4eSBram Moolenaar 28679721fb4eSBram Moolenaar " imported function becomes script-local 28689721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 28699721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 28709721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 28719721fb4eSBram Moolenaar END 28729721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 28739721fb4eSBram Moolenaar 28749721fb4eSBram Moolenaar let vim9_lines =<< trim END 28759721fb4eSBram Moolenaar vim9script 28769721fb4eSBram Moolenaar let local = 'local' 28779721fb4eSBram Moolenaar g:global = 'global' 28789721fb4eSBram Moolenaar export let exported = 'exported' 28799721fb4eSBram Moolenaar export def GetText(): string 28809721fb4eSBram Moolenaar return 'text' 28819721fb4eSBram Moolenaar enddef 28829721fb4eSBram Moolenaar END 28839721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 28849721fb4eSBram Moolenaar 28859721fb4eSBram Moolenaar source Xlegacy_script.vim 28869721fb4eSBram Moolenaar 28879721fb4eSBram Moolenaar assert_equal('global', g:global) 2888f5be8cdbSBram Moolenaar unlet g:global 28899721fb4eSBram Moolenaar 28909721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 28919721fb4eSBram Moolenaar delete('Xvim9_script.vim') 28929721fb4eSBram Moolenaarenddef 2893a5d0077eSBram Moolenaar 2894eeb27bfeSBram Moolenaardef Test_vim9_copen() 2895eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2896eeb27bfeSBram Moolenaar copen 2897eeb27bfeSBram Moolenaar quit 2898eeb27bfeSBram Moolenaarenddef 2899eeb27bfeSBram Moolenaar 29002d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 29012d6b20d6SBram Moolenaardef Test_vim9_autoload() 29022d6b20d6SBram Moolenaar let lines =<< trim END 29032d6b20d6SBram Moolenaar vim9script 29042d6b20d6SBram Moolenaar def foo#test() 29052d6b20d6SBram Moolenaar echomsg getreg('"') 29062d6b20d6SBram Moolenaar enddef 29072d6b20d6SBram Moolenaar END 29082d6b20d6SBram Moolenaar 29092d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29102d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 29112d6b20d6SBram Moolenaar let save_rtp = &rtp 29122d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29132d6b20d6SBram Moolenaar augroup test 29142d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 29152d6b20d6SBram Moolenaar augroup END 29162d6b20d6SBram Moolenaar 29172d6b20d6SBram Moolenaar normal Y 29182d6b20d6SBram Moolenaar 29192d6b20d6SBram Moolenaar augroup test 29202d6b20d6SBram Moolenaar autocmd! 29212d6b20d6SBram Moolenaar augroup END 29222d6b20d6SBram Moolenaar delete('Xdir', 'rf') 29232d6b20d6SBram Moolenaar &rtp = save_rtp 29242d6b20d6SBram Moolenaarenddef 29252d6b20d6SBram Moolenaar 2926585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2927585fea7bSBram Moolenaardef Test_substitute_cmd() 2928585fea7bSBram Moolenaar new 2929585fea7bSBram Moolenaar setline(1, 'something') 2930585fea7bSBram Moolenaar :substitute(some(other( 2931585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2932585fea7bSBram Moolenaar bwipe! 2933585fea7bSBram Moolenaar 2934f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2935585fea7bSBram Moolenaar let lines =<< trim END 2936585fea7bSBram Moolenaar vim9script 2937585fea7bSBram Moolenaar new 2938585fea7bSBram Moolenaar setline(1, 'something') 2939585fea7bSBram Moolenaar :substitute(some(other( 2940585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2941585fea7bSBram Moolenaar bwipe! 2942585fea7bSBram Moolenaar END 2943585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2944585fea7bSBram Moolenaar source Xvim9lines 2945585fea7bSBram Moolenaar 2946585fea7bSBram Moolenaar delete('Xvim9lines') 2947585fea7bSBram Moolenaarenddef 2948585fea7bSBram Moolenaar 29498a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2950