18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 78a7d6542SBram Moolenaar 88a7d6542SBram Moolenaardef Test_syntax() 98a7d6542SBram Moolenaar let var = 234 108a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 118a7d6542SBram Moolenaarenddef 128a7d6542SBram Moolenaar 136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 146e587dcbSBram Moolenaarlet s:addToMe = 111 15401d9ffbSBram Moolenaarlet g:existing = 'yes' 16a8c17704SBram Moolenaarlet g:inc_counter = 1 17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 18a6e67e4fSBram Moolenaarlet g:alist = [7] 19a6e67e4fSBram Moolenaarlet g:astring = 'text' 20f0b9f43cSBram Moolenaarlet g:anumber = 123 216e587dcbSBram Moolenaar 228a7d6542SBram Moolenaardef Test_assignment() 238a7d6542SBram Moolenaar let bool1: bool = true 248a7d6542SBram Moolenaar assert_equal(v:true, bool1) 258a7d6542SBram Moolenaar let bool2: bool = false 268a7d6542SBram Moolenaar assert_equal(v:false, bool2) 278a7d6542SBram Moolenaar 28f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 29f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 301cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 3198b4f145SBram Moolenaar call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:') 32f93c7feaSBram Moolenaar 334cdb13ceSBram Moolenaar let nr: number = 1234 344cdb13ceSBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:') 354cdb13ceSBram Moolenaar 36b209750bSBram Moolenaar let a: number = 6 #comment 379be61bbbSBram Moolenaar assert_equal(6, a) 389be61bbbSBram Moolenaar 3942a480bfSBram Moolenaar if has('channel') 4042a480bfSBram Moolenaar let chan1: channel 41fbdd08edSBram Moolenaar let job1: job 42f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 4342a480bfSBram Moolenaar endif 44fbdd08edSBram Moolenaar if has('float') 45fbdd08edSBram Moolenaar let float1: float = 3.4 46fbdd08edSBram Moolenaar endif 475deeb3f1SBram Moolenaar let Funky1: func 485deeb3f1SBram Moolenaar let Funky2: func = function('len') 494c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 5042a480bfSBram Moolenaar 51b209750bSBram Moolenaar g:newvar = 'new' #comment 52401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 53401d9ffbSBram Moolenaar 54401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 55401d9ffbSBram Moolenaar g:existing = 'no' 56401d9ffbSBram Moolenaar assert_equal('no', g:existing) 57401d9ffbSBram Moolenaar 58b283a8a6SBram Moolenaar v:char = 'abc' 596e587dcbSBram Moolenaar assert_equal('abc', v:char) 60b283a8a6SBram Moolenaar 61b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 626e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 63b283a8a6SBram Moolenaar $ENVVAR = '' 646e587dcbSBram Moolenaar 65b5ed2660SBram Moolenaar let lines =<< trim END 66b5ed2660SBram Moolenaar vim9script 67b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 68b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 69b5ed2660SBram Moolenaar $ENVVAR = '' 70b5ed2660SBram Moolenaar END 71b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 72b5ed2660SBram Moolenaar 73fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 74fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 75fd1823e0SBram Moolenaar s:addToMe += 222 76fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 770bbf722aSBram Moolenaar s:newVar = 'new' 780bbf722aSBram Moolenaar assert_equal('new', s:newVar) 79a8c17704SBram Moolenaar 80a8c17704SBram Moolenaar set ts=7 81a8c17704SBram Moolenaar &ts += 1 82a8c17704SBram Moolenaar assert_equal(8, &ts) 8380c34ca3SBram Moolenaar &ts -= 3 8480c34ca3SBram Moolenaar assert_equal(5, &ts) 8580c34ca3SBram Moolenaar &ts *= 2 8680c34ca3SBram Moolenaar assert_equal(10, &ts) 8780c34ca3SBram Moolenaar &ts /= 3 8880c34ca3SBram Moolenaar assert_equal(3, &ts) 8980c34ca3SBram Moolenaar set ts=10 9080c34ca3SBram Moolenaar &ts %= 4 9180c34ca3SBram Moolenaar assert_equal(2, &ts) 92b5ed2660SBram Moolenaar 93b5ed2660SBram Moolenaar lines =<< trim END 94b5ed2660SBram Moolenaar vim9script 95b5ed2660SBram Moolenaar &ts = 6 96b5ed2660SBram Moolenaar &ts += 3 97b5ed2660SBram Moolenaar assert_equal(9, &ts) 98b5ed2660SBram Moolenaar END 99b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 100b5ed2660SBram Moolenaar 101a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 102a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 103a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 104a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 105a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 106a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 107a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 108a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 109cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 110585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11180c34ca3SBram Moolenaar &ts = 8 112a8c17704SBram Moolenaar 11333afa244SBram Moolenaar call CheckDefFailure(['let s:var = 123'], 'E1101:') 11433afa244SBram Moolenaar call CheckDefFailure(['let s:var: number'], 'E1101:') 11533afa244SBram Moolenaar 116f9b2b496SBram Moolenaar lines =<< trim END 117f9b2b496SBram Moolenaar vim9script 118f9b2b496SBram Moolenaar def SomeFunc() 119f9b2b496SBram Moolenaar s:var = 123 120f9b2b496SBram Moolenaar enddef 121f9b2b496SBram Moolenaar defcompile 122f9b2b496SBram Moolenaar END 123f9b2b496SBram Moolenaar call CheckScriptFailure(lines, 'E1089:') 124f9b2b496SBram Moolenaar 125a8c17704SBram Moolenaar g:inc_counter += 1 126a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 127a8c17704SBram Moolenaar 128a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 129a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 130dd29f1b0SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 131a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 132a8c17704SBram Moolenaar 133a8c17704SBram Moolenaar @a = 'areg' 134a8c17704SBram Moolenaar @a ..= 'add' 135a8c17704SBram Moolenaar assert_equal('aregadd', @a) 136dd29f1b0SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1051:') 137a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 138e69f6d04SBram Moolenaar 139b5ed2660SBram Moolenaar lines =<< trim END 140b5ed2660SBram Moolenaar vim9script 141b5ed2660SBram Moolenaar @c = 'areg' 142b5ed2660SBram Moolenaar @c ..= 'add' 143b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 144b5ed2660SBram Moolenaar END 145b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 146b5ed2660SBram Moolenaar 147e69f6d04SBram Moolenaar v:errmsg = 'none' 148e69f6d04SBram Moolenaar v:errmsg ..= 'again' 149e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 150dd29f1b0SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 151e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 15233afa244SBram Moolenaar 15333afa244SBram Moolenaar # single letter variables 15433afa244SBram Moolenaar a = 123 15533afa244SBram Moolenaar assert_equal(123, a) 15633afa244SBram Moolenaar let b: number 15733afa244SBram Moolenaar b = 123 15833afa244SBram Moolenaar assert_equal(123, b) 15933afa244SBram Moolenaar let g: number 16033afa244SBram Moolenaar g = 123 16133afa244SBram Moolenaar assert_equal(123, g) 16233afa244SBram Moolenaar let s: number 16333afa244SBram Moolenaar s = 123 16433afa244SBram Moolenaar assert_equal(123, s) 16533afa244SBram Moolenaar let t: number 16633afa244SBram Moolenaar t = 123 16733afa244SBram Moolenaar assert_equal(123, t) 16833afa244SBram Moolenaar let v: number 16933afa244SBram Moolenaar v = 123 17033afa244SBram Moolenaar assert_equal(123, v) 17133afa244SBram Moolenaar let w: number 17233afa244SBram Moolenaar w = 123 17333afa244SBram Moolenaar assert_equal(123, w) 1745deeb3f1SBram Moolenaarenddef 1755deeb3f1SBram Moolenaar 1763b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1773b74b6b4SBram Moolenaar let lines =<< trim END 1783b74b6b4SBram Moolenaar vim9script 1793b74b6b4SBram Moolenaar 180f5be8cdbSBram Moolenaar # single character variable declarations work 1813b74b6b4SBram Moolenaar let a: string 1823b74b6b4SBram Moolenaar let b: number 1833b74b6b4SBram Moolenaar let l: list<any> 1843b74b6b4SBram Moolenaar let s: string 1853b74b6b4SBram Moolenaar let t: number 1863b74b6b4SBram Moolenaar let v: number 1873b74b6b4SBram Moolenaar let w: number 1883b74b6b4SBram Moolenaar 189f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1903b74b6b4SBram Moolenaar a = 'script-a' 1913b74b6b4SBram Moolenaar b = 111 1923b74b6b4SBram Moolenaar l = [1, 2, 3] 1933b74b6b4SBram Moolenaar s = 'script-s' 1943b74b6b4SBram Moolenaar t = 222 1953b74b6b4SBram Moolenaar v = 333 1963b74b6b4SBram Moolenaar w = 444 1973b74b6b4SBram Moolenaar 1983b74b6b4SBram Moolenaar assert_equal('script-a', a) 1993b74b6b4SBram Moolenaar assert_equal(111, b) 2003b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 2013b74b6b4SBram Moolenaar assert_equal('script-s', s) 2023b74b6b4SBram Moolenaar assert_equal(222, t) 2033b74b6b4SBram Moolenaar assert_equal(333, v) 2043b74b6b4SBram Moolenaar assert_equal(444, w) 2053b74b6b4SBram Moolenaar END 2063b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 2073b74b6b4SBram Moolenaar source Xsinglechar 2083b74b6b4SBram Moolenaar delete('Xsinglechar') 2093b74b6b4SBram Moolenaarenddef 2103b74b6b4SBram Moolenaar 21184370087SBram Moolenaardef Test_assignment_list() 21284370087SBram Moolenaar let list1: list<bool> = [false, true, false] 21384370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 21484370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 21584370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 21684370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 21784370087SBram Moolenaar 21884370087SBram Moolenaar let listS: list<string> = [] 21984370087SBram Moolenaar let listN: list<number> = [] 22084370087SBram Moolenaar 22184370087SBram Moolenaar assert_equal([1, 2, 3], list2) 22284370087SBram Moolenaar list2[-1] = 99 22384370087SBram Moolenaar assert_equal([1, 2, 99], list2) 22484370087SBram Moolenaar list2[-2] = 88 22584370087SBram Moolenaar assert_equal([1, 88, 99], list2) 22684370087SBram Moolenaar list2[-3] = 77 22784370087SBram Moolenaar assert_equal([77, 88, 99], list2) 228dd29f1b0SBram Moolenaar list2 += [100] 229dd29f1b0SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 230dd29f1b0SBram Moolenaar 231dd29f1b0SBram Moolenaar list3 += ['end'] 232dd29f1b0SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 233dd29f1b0SBram Moolenaar 234dd29f1b0SBram Moolenaar 23584370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 236c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 23784370087SBram Moolenaar 23884370087SBram Moolenaar # type becomes list<any> 23984370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 24084370087SBram Moolenaarenddef 24184370087SBram Moolenaar 242b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 243b31be3f9SBram Moolenaar let lines =<< trim END 244b31be3f9SBram Moolenaar vim9script 245b31be3f9SBram Moolenaar let v1: number 246b31be3f9SBram Moolenaar let v2: number 247b31be3f9SBram Moolenaar let v3: number 248b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 249b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 250b31be3f9SBram Moolenaar END 251b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 252b31be3f9SBram Moolenaarenddef 253b31be3f9SBram Moolenaar 25484370087SBram Moolenaardef Test_assignment_dict() 25584370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 25684370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 25784370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 25884370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 25974fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 26084370087SBram Moolenaar 261f5be8cdbSBram Moolenaar # overwrite 262c785b9a7SBram Moolenaar dict3['key'] = 'another' 263c785b9a7SBram Moolenaar 26458626872SBram Moolenaar # empty key can be used 26558626872SBram Moolenaar let dd = {} 26658626872SBram Moolenaar dd[""] = 6 26758626872SBram Moolenaar assert_equal({'': 6}, dd) 26884370087SBram Moolenaar 26984370087SBram Moolenaar # type becomes dict<any> 27084370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 2718e4c8c85SBram Moolenaar 2728e4c8c85SBram Moolenaar # assignment to script-local dict 2738e4c8c85SBram Moolenaar let lines =<< trim END 2748e4c8c85SBram Moolenaar vim9script 2758e4c8c85SBram Moolenaar let test: dict<any> = {} 2768e4c8c85SBram Moolenaar def FillDict(): dict<any> 2778e4c8c85SBram Moolenaar test['a'] = 43 2788e4c8c85SBram Moolenaar return test 2798e4c8c85SBram Moolenaar enddef 2808e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2818e4c8c85SBram Moolenaar END 2828e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 2838e4c8c85SBram Moolenaar 2848e4c8c85SBram Moolenaar lines =<< trim END 2858e4c8c85SBram Moolenaar vim9script 2868e4c8c85SBram Moolenaar let test: dict<any> 2878e4c8c85SBram Moolenaar def FillDict(): dict<any> 2888e4c8c85SBram Moolenaar test['a'] = 43 2898e4c8c85SBram Moolenaar return test 2908e4c8c85SBram Moolenaar enddef 2918e4c8c85SBram Moolenaar FillDict() 2928e4c8c85SBram Moolenaar END 2938e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 2942caa1594SBram Moolenaar 2952caa1594SBram Moolenaar # assignment to global dict 2962caa1594SBram Moolenaar lines =<< trim END 2972caa1594SBram Moolenaar vim9script 2982caa1594SBram Moolenaar g:test = {} 2992caa1594SBram Moolenaar def FillDict(): dict<any> 3002caa1594SBram Moolenaar g:test['a'] = 43 3012caa1594SBram Moolenaar return g:test 3022caa1594SBram Moolenaar enddef 3032caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3042caa1594SBram Moolenaar END 3052caa1594SBram Moolenaar call CheckScriptSuccess(lines) 3062caa1594SBram Moolenaar 3072caa1594SBram Moolenaar # assignment to buffer dict 3082caa1594SBram Moolenaar lines =<< trim END 3092caa1594SBram Moolenaar vim9script 3102caa1594SBram Moolenaar b:test = {} 3112caa1594SBram Moolenaar def FillDict(): dict<any> 3122caa1594SBram Moolenaar b:test['a'] = 43 3132caa1594SBram Moolenaar return b:test 3142caa1594SBram Moolenaar enddef 3152caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 3162caa1594SBram Moolenaar END 3172caa1594SBram Moolenaar call CheckScriptSuccess(lines) 31884370087SBram Moolenaarenddef 31984370087SBram Moolenaar 320d3aac291SBram Moolenaardef Test_assignment_local() 321f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 322f5be8cdbSBram Moolenaar # changed. 323d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 324d3aac291SBram Moolenaar let b:existing = 'yes' 325d3aac291SBram Moolenaar let w:existing = 'yes' 326d3aac291SBram Moolenaar let t:existing = 'yes' 327d3aac291SBram Moolenaar 328d3aac291SBram Moolenaar def Test_assignment_local_internal() 329d3aac291SBram Moolenaar b:newvar = 'new' 330d3aac291SBram Moolenaar assert_equal('new', b:newvar) 331d3aac291SBram Moolenaar assert_equal('yes', b:existing) 332d3aac291SBram Moolenaar b:existing = 'no' 333d3aac291SBram Moolenaar assert_equal('no', b:existing) 334396f3138SBram Moolenaar b:existing ..= 'NO' 335396f3138SBram Moolenaar assert_equal('noNO', b:existing) 336d3aac291SBram Moolenaar 337d3aac291SBram Moolenaar w:newvar = 'new' 338d3aac291SBram Moolenaar assert_equal('new', w:newvar) 339d3aac291SBram Moolenaar assert_equal('yes', w:existing) 340d3aac291SBram Moolenaar w:existing = 'no' 341d3aac291SBram Moolenaar assert_equal('no', w:existing) 342396f3138SBram Moolenaar w:existing ..= 'NO' 343396f3138SBram Moolenaar assert_equal('noNO', w:existing) 344d3aac291SBram Moolenaar 345d3aac291SBram Moolenaar t:newvar = 'new' 346d3aac291SBram Moolenaar assert_equal('new', t:newvar) 347d3aac291SBram Moolenaar assert_equal('yes', t:existing) 348d3aac291SBram Moolenaar t:existing = 'no' 349d3aac291SBram Moolenaar assert_equal('no', t:existing) 350396f3138SBram Moolenaar t:existing ..= 'NO' 351396f3138SBram Moolenaar assert_equal('noNO', t:existing) 352d3aac291SBram Moolenaar enddef 353d3aac291SBram Moolenaar call Test_assignment_local_internal() 354d3aac291SBram Moolenaar END 355d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 356d3aac291SBram Moolenaarenddef 357d3aac291SBram Moolenaar 3585deeb3f1SBram Moolenaardef Test_assignment_default() 359e69f6d04SBram Moolenaar 360cb711abfSBram Moolenaar # Test default values. 361e69f6d04SBram Moolenaar let thebool: bool 362e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 363e69f6d04SBram Moolenaar 364e69f6d04SBram Moolenaar let thenumber: number 365e69f6d04SBram Moolenaar assert_equal(0, thenumber) 366e69f6d04SBram Moolenaar 367e69f6d04SBram Moolenaar if has('float') 368e69f6d04SBram Moolenaar let thefloat: float 369e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 370e69f6d04SBram Moolenaar endif 371e69f6d04SBram Moolenaar 372e69f6d04SBram Moolenaar let thestring: string 373e69f6d04SBram Moolenaar assert_equal('', thestring) 374e69f6d04SBram Moolenaar 375e69f6d04SBram Moolenaar let theblob: blob 376e69f6d04SBram Moolenaar assert_equal(0z, theblob) 377e69f6d04SBram Moolenaar 3785deeb3f1SBram Moolenaar let Thefunc: func 3795deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 380e69f6d04SBram Moolenaar 381e69f6d04SBram Moolenaar let thelist: list<any> 382e69f6d04SBram Moolenaar assert_equal([], thelist) 383e69f6d04SBram Moolenaar 384e69f6d04SBram Moolenaar let thedict: dict<any> 385e69f6d04SBram Moolenaar assert_equal({}, thedict) 386e69f6d04SBram Moolenaar 3872c869deeSBram Moolenaar if has('channel') 388e69f6d04SBram Moolenaar let thejob: job 389e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 390e69f6d04SBram Moolenaar 391e69f6d04SBram Moolenaar let thechannel: channel 392e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 393c785b9a7SBram Moolenaar 394c785b9a7SBram Moolenaar if has('unix') && executable('cat') 395f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 396c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 397c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 398c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 399c785b9a7SBram Moolenaar endif 4002c869deeSBram Moolenaar endif 401585fea7bSBram Moolenaar 402585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 403585fea7bSBram Moolenaar assert_equal(5678, nr) 4048a7d6542SBram Moolenaarenddef 4058a7d6542SBram Moolenaar 40647a519a9SBram Moolenaardef Test_assignment_var_list() 40747a519a9SBram Moolenaar let v1: string 40847a519a9SBram Moolenaar let v2: string 4099af78769SBram Moolenaar let vrem: list<string> 4109af78769SBram Moolenaar [v1] = ['aaa'] 4119af78769SBram Moolenaar assert_equal('aaa', v1) 4129af78769SBram Moolenaar 41347a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 41447a519a9SBram Moolenaar assert_equal('one', v1) 41547a519a9SBram Moolenaar assert_equal('two', v2) 4169af78769SBram Moolenaar 4179af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4189af78769SBram Moolenaar assert_equal('one', v1) 4199af78769SBram Moolenaar assert_equal('two', v2) 4209af78769SBram Moolenaar assert_equal([], vrem) 4219af78769SBram Moolenaar 4229af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4239af78769SBram Moolenaar assert_equal('one', v1) 4249af78769SBram Moolenaar assert_equal('two', v2) 4259af78769SBram Moolenaar assert_equal(['three'], vrem) 4261c199f9cSBram Moolenaar 4271c199f9cSBram Moolenaar [&ts, &sw] = [3, 4] 4281c199f9cSBram Moolenaar assert_equal(3, &ts) 4291c199f9cSBram Moolenaar assert_equal(4, &sw) 4301c199f9cSBram Moolenaar set ts=8 sw=4 43147a519a9SBram Moolenaarenddef 43247a519a9SBram Moolenaar 433c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 434c7e44a7eSBram Moolenaar let lines =<< trim END 435c7e44a7eSBram Moolenaar vim9script 436c7e44a7eSBram Moolenaar def Func(): list<number> 437c7e44a7eSBram Moolenaar return [1, 2] 438c7e44a7eSBram Moolenaar enddef 439c7e44a7eSBram Moolenaar let var1: number 440c7e44a7eSBram Moolenaar let var2: number 441c7e44a7eSBram Moolenaar [var1, var2] = 442c7e44a7eSBram Moolenaar Func() 443c7e44a7eSBram Moolenaar assert_equal(1, var1) 444c7e44a7eSBram Moolenaar assert_equal(2, var2) 445c7e44a7eSBram Moolenaar let ll = 446c7e44a7eSBram Moolenaar Func() 447c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 44883144546SBram Moolenaar 44983144546SBram Moolenaar @/ = 'text' 45083144546SBram Moolenaar assert_equal('text', @/) 45183144546SBram Moolenaar @0 = 'zero' 45283144546SBram Moolenaar assert_equal('zero', @0) 45383144546SBram Moolenaar @1 = 'one' 45483144546SBram Moolenaar assert_equal('one', @1) 45583144546SBram Moolenaar @9 = 'nine' 45683144546SBram Moolenaar assert_equal('nine', @9) 45783144546SBram Moolenaar @- = 'minus' 45883144546SBram Moolenaar assert_equal('minus', @-) 45983144546SBram Moolenaar if has('clipboard_working') 46083144546SBram Moolenaar @* = 'star' 46183144546SBram Moolenaar assert_equal('star', @*) 46283144546SBram Moolenaar @+ = 'plus' 46383144546SBram Moolenaar assert_equal('plus', @+) 46483144546SBram Moolenaar endif 46595dd9f25SBram Moolenaar 46695dd9f25SBram Moolenaar let a: number = 123 46795dd9f25SBram Moolenaar assert_equal(123, a) 46895dd9f25SBram Moolenaar let s: string = 'yes' 46995dd9f25SBram Moolenaar assert_equal('yes', s) 47095dd9f25SBram Moolenaar let b: number = 42 47195dd9f25SBram Moolenaar assert_equal(42, b) 47295dd9f25SBram Moolenaar let w: number = 43 47395dd9f25SBram Moolenaar assert_equal(43, w) 47495dd9f25SBram Moolenaar let t: number = 44 47595dd9f25SBram Moolenaar assert_equal(44, t) 476c7e44a7eSBram Moolenaar END 477c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 478c7e44a7eSBram Moolenaarenddef 479c7e44a7eSBram Moolenaar 480cab27678SBram Moolenaardef Mess(): string 481cab27678SBram Moolenaar v:foldstart = 123 482cab27678SBram Moolenaar return 'xxx' 483cab27678SBram Moolenaarenddef 484cab27678SBram Moolenaar 485d72c1bf0SBram Moolenaardef Test_assignment_failure() 4868a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4878a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4888a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4898a7d6542SBram Moolenaar 49063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 49163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 49263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 49363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 49463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 49563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 49663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 49763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 49863be3d4bSBram Moolenaar 4998a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 5008a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 5018a7d6542SBram Moolenaar 5029b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 5039af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5049af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 5059af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 5069af78769SBram Moolenaar '[a] = []'], 'E1093:') 5079af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5089af78769SBram Moolenaar 'let y: number', 5099af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 5109af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 5119af78769SBram Moolenaar 'let y: number', 5129af78769SBram Moolenaar 'let z: list<number>', 5139af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 5149be61bbbSBram Moolenaar 515e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 516c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 5179be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 518c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 5199be61bbbSBram Moolenaar 520e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 521c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 5229be61bbbSBram Moolenaar 523434d72cbSBram Moolenaar if has('dnd') 52465821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 525434d72cbSBram Moolenaar else 526434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 527434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 528434d72cbSBram Moolenaar endif 5299be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 53065821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 531c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 5329be61bbbSBram Moolenaar 533e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 534e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 535e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 536e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 5379be61bbbSBram Moolenaar 5389be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 5399be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 5409be61bbbSBram Moolenaar 541822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 54233fa29cfSBram Moolenaar 5438a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 5448a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 5458a7d6542SBram Moolenaar 5468a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 5478a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 5488a7d6542SBram Moolenaar 5498a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5508a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 55142a480bfSBram Moolenaar 552d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 55342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 554cab27678SBram Moolenaar 555cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 556cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 55743e969d3SBram Moolenaar 55843e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 55943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 56043e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 56143e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 56243e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 56343e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 56443e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 56543e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 566d72c1bf0SBram Moolenaarenddef 567d72c1bf0SBram Moolenaar 568d72c1bf0SBram Moolenaardef Test_unlet() 569d72c1bf0SBram Moolenaar g:somevar = 'yes' 570d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 571d72c1bf0SBram Moolenaar unlet g:somevar 572d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 573d72c1bf0SBram Moolenaar unlet! g:somevar 574d72c1bf0SBram Moolenaar 575d72c1bf0SBram Moolenaar call CheckScriptFailure([ 576d72c1bf0SBram Moolenaar 'vim9script', 577d72c1bf0SBram Moolenaar 'let svar = 123', 578d72c1bf0SBram Moolenaar 'unlet svar', 579d72c1bf0SBram Moolenaar ], 'E1081:') 580d72c1bf0SBram Moolenaar call CheckScriptFailure([ 581d72c1bf0SBram Moolenaar 'vim9script', 582d72c1bf0SBram Moolenaar 'let svar = 123', 583d72c1bf0SBram Moolenaar 'unlet s:svar', 584d72c1bf0SBram Moolenaar ], 'E1081:') 585d72c1bf0SBram Moolenaar call CheckScriptFailure([ 586d72c1bf0SBram Moolenaar 'vim9script', 587d72c1bf0SBram Moolenaar 'let svar = 123', 588d72c1bf0SBram Moolenaar 'def Func()', 589d72c1bf0SBram Moolenaar ' unlet svar', 590d72c1bf0SBram Moolenaar 'enddef', 591822ba247SBram Moolenaar 'defcompile', 592d72c1bf0SBram Moolenaar ], 'E1081:') 593d72c1bf0SBram Moolenaar call CheckScriptFailure([ 594d72c1bf0SBram Moolenaar 'vim9script', 595d72c1bf0SBram Moolenaar 'let svar = 123', 596d72c1bf0SBram Moolenaar 'def Func()', 597d72c1bf0SBram Moolenaar ' unlet s:svar', 598d72c1bf0SBram Moolenaar 'enddef', 599822ba247SBram Moolenaar 'defcompile', 600d72c1bf0SBram Moolenaar ], 'E1081:') 6017bdaea6eSBram Moolenaar 6027bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 6037bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 6047bdaea6eSBram Moolenaar unlet $ENVVAR 6057bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 606d72c1bf0SBram Moolenaarenddef 607599c89c8SBram Moolenaar 6084c17ad94SBram Moolenaardef Test_delfunction() 609f5be8cdbSBram Moolenaar # Check function is defined in script namespace 6104c17ad94SBram Moolenaar CheckScriptSuccess([ 6114c17ad94SBram Moolenaar 'vim9script', 6124c17ad94SBram Moolenaar 'func CheckMe()', 6134c17ad94SBram Moolenaar ' return 123', 6144c17ad94SBram Moolenaar 'endfunc', 6154c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 6164c17ad94SBram Moolenaar ]) 6174c17ad94SBram Moolenaar 618f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 6194c17ad94SBram Moolenaar CheckScriptFailure([ 6204c17ad94SBram Moolenaar 'vim9script', 6214c17ad94SBram Moolenaar 'func DeleteMe1()', 6224c17ad94SBram Moolenaar 'endfunc', 6234c17ad94SBram Moolenaar 'delfunction DeleteMe1', 6244c17ad94SBram Moolenaar ], 'E1084:') 6254c17ad94SBram Moolenaar CheckScriptFailure([ 6264c17ad94SBram Moolenaar 'vim9script', 6274c17ad94SBram Moolenaar 'func DeleteMe2()', 6284c17ad94SBram Moolenaar 'endfunc', 6294c17ad94SBram Moolenaar 'def DoThat()', 6304c17ad94SBram Moolenaar ' delfunction DeleteMe2', 6314c17ad94SBram Moolenaar 'enddef', 6324c17ad94SBram Moolenaar 'DoThat()', 6334c17ad94SBram Moolenaar ], 'E1084:') 6344c17ad94SBram Moolenaar CheckScriptFailure([ 6354c17ad94SBram Moolenaar 'vim9script', 6364c17ad94SBram Moolenaar 'def DeleteMe3()', 6374c17ad94SBram Moolenaar 'enddef', 6384c17ad94SBram Moolenaar 'delfunction DeleteMe3', 6394c17ad94SBram Moolenaar ], 'E1084:') 6404c17ad94SBram Moolenaar CheckScriptFailure([ 6414c17ad94SBram Moolenaar 'vim9script', 6424c17ad94SBram Moolenaar 'def DeleteMe4()', 6434c17ad94SBram Moolenaar 'enddef', 6444c17ad94SBram Moolenaar 'def DoThat()', 6454c17ad94SBram Moolenaar ' delfunction DeleteMe4', 6464c17ad94SBram Moolenaar 'enddef', 6474c17ad94SBram Moolenaar 'DoThat()', 6484c17ad94SBram Moolenaar ], 'E1084:') 649925e9fd6SBram Moolenaar 650925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 651925e9fd6SBram Moolenaar let lines =<< trim END 652925e9fd6SBram Moolenaar vim9script 653925e9fd6SBram Moolenaar def g:Global(): string 654925e9fd6SBram Moolenaar return "yes" 655925e9fd6SBram Moolenaar enddef 656925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 657925e9fd6SBram Moolenaar def! g:Global(): string 658925e9fd6SBram Moolenaar return "no" 659925e9fd6SBram Moolenaar enddef 660925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 661925e9fd6SBram Moolenaar delfunc g:Global 662925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 663925e9fd6SBram Moolenaar END 664925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 665925e9fd6SBram Moolenaar 666925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 667925e9fd6SBram Moolenaar lines =<< trim END 668925e9fd6SBram Moolenaar vim9script 669925e9fd6SBram Moolenaar func g:Global() 670925e9fd6SBram Moolenaar return "yes" 671925e9fd6SBram Moolenaar endfunc 672925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 673925e9fd6SBram Moolenaar def! g:Global(): string 674925e9fd6SBram Moolenaar return "no" 675925e9fd6SBram Moolenaar enddef 676925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 677925e9fd6SBram Moolenaar delfunc g:Global 678925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 679925e9fd6SBram Moolenaar END 680925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 681925e9fd6SBram Moolenaar 682925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 683925e9fd6SBram Moolenaar lines =<< trim END 684925e9fd6SBram Moolenaar vim9script 685925e9fd6SBram Moolenaar def g:Global(): string 686925e9fd6SBram Moolenaar return "yes" 687925e9fd6SBram Moolenaar enddef 688925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 689925e9fd6SBram Moolenaar func! g:Global() 690925e9fd6SBram Moolenaar return "no" 691925e9fd6SBram Moolenaar endfunc 692925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 693925e9fd6SBram Moolenaar delfunc g:Global 694925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 695925e9fd6SBram Moolenaar END 696925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6974c17ad94SBram Moolenaarenddef 6984c17ad94SBram Moolenaar 699599c89c8SBram Moolenaarfunc Test_wrong_type() 700599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 701599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 702599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 703599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 704599c89c8SBram Moolenaar 705599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 706599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 70742a480bfSBram Moolenaar 70842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 70942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 71042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 71142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 71242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 71342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 71442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 71542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 71642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 71742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 71842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 719a0a9f43aSBram Moolenaar 720a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 721a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 7228a7d6542SBram Moolenaarendfunc 7238a7d6542SBram Moolenaar 7248a7d6542SBram Moolenaarfunc Test_const() 7258a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 7268a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 7278a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 7289be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 7298a7d6542SBram Moolenaarendfunc 7308a7d6542SBram Moolenaar 731df069eecSBram Moolenaardef Test_range_no_colon() 732df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 733df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 734df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 735df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 736df069eecSBram Moolenaarenddef 737df069eecSBram Moolenaar 738df069eecSBram Moolenaar 7398a7d6542SBram Moolenaardef Test_block() 7408a7d6542SBram Moolenaar let outer = 1 7418a7d6542SBram Moolenaar { 7428a7d6542SBram Moolenaar let inner = 2 7438a7d6542SBram Moolenaar assert_equal(1, outer) 7448a7d6542SBram Moolenaar assert_equal(2, inner) 7458a7d6542SBram Moolenaar } 7468a7d6542SBram Moolenaar assert_equal(1, outer) 7478a7d6542SBram Moolenaarenddef 7488a7d6542SBram Moolenaar 7498a7d6542SBram Moolenaarfunc Test_block_failure() 7508a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 751585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 752585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7538a7d6542SBram Moolenaarendfunc 7548a7d6542SBram Moolenaar 755d032f34aSBram Moolenaarfunc g:NoSuchFunc() 756d032f34aSBram Moolenaar echo 'none' 757d032f34aSBram Moolenaarendfunc 758d032f34aSBram Moolenaar 7598a7d6542SBram Moolenaardef Test_try_catch() 7608a7d6542SBram Moolenaar let l = [] 7617a092245SBram Moolenaar try # comment 7628a7d6542SBram Moolenaar add(l, '1') 7638a7d6542SBram Moolenaar throw 'wrong' 7648a7d6542SBram Moolenaar add(l, '2') 7657a092245SBram Moolenaar catch # comment 7668a7d6542SBram Moolenaar add(l, v:exception) 7677a092245SBram Moolenaar finally # comment 7688a7d6542SBram Moolenaar add(l, '3') 7697a092245SBram Moolenaar endtry # comment 7708a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 77168d130c6SBram Moolenaar 772e859312eSBram Moolenaar l = [] 773e859312eSBram Moolenaar try 774e859312eSBram Moolenaar try 775e859312eSBram Moolenaar add(l, '1') 776e859312eSBram Moolenaar throw 'wrong' 777e859312eSBram Moolenaar add(l, '2') 778e859312eSBram Moolenaar catch /right/ 779e859312eSBram Moolenaar add(l, v:exception) 780e859312eSBram Moolenaar endtry 781e859312eSBram Moolenaar catch /wrong/ 782e859312eSBram Moolenaar add(l, 'caught') 783e859312eSBram Moolenaar finally 784e859312eSBram Moolenaar add(l, 'finally') 785e859312eSBram Moolenaar endtry 786e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 787e859312eSBram Moolenaar 78868d130c6SBram Moolenaar let n: number 78968d130c6SBram Moolenaar try 79068d130c6SBram Moolenaar n = l[3] 79168d130c6SBram Moolenaar catch /E684:/ 79268d130c6SBram Moolenaar n = 99 79368d130c6SBram Moolenaar endtry 79468d130c6SBram Moolenaar assert_equal(99, n) 79568d130c6SBram Moolenaar 79668d130c6SBram Moolenaar try 79768d130c6SBram Moolenaar n = g:astring[3] 79868d130c6SBram Moolenaar catch /E714:/ 79968d130c6SBram Moolenaar n = 77 80068d130c6SBram Moolenaar endtry 80168d130c6SBram Moolenaar assert_equal(77, n) 80268d130c6SBram Moolenaar 80368d130c6SBram Moolenaar try 80468d130c6SBram Moolenaar n = l[g:astring] 80568d130c6SBram Moolenaar catch /E39:/ 80668d130c6SBram Moolenaar n = 77 80768d130c6SBram Moolenaar endtry 80868d130c6SBram Moolenaar assert_equal(77, n) 80968d130c6SBram Moolenaar 81068d130c6SBram Moolenaar try 81168d130c6SBram Moolenaar n = s:does_not_exist 81268d130c6SBram Moolenaar catch /E121:/ 813f0b9f43cSBram Moolenaar n = 111 814f0b9f43cSBram Moolenaar endtry 815f0b9f43cSBram Moolenaar assert_equal(111, n) 816f0b9f43cSBram Moolenaar 817f0b9f43cSBram Moolenaar try 818f0b9f43cSBram Moolenaar n = g:does_not_exist 819f0b9f43cSBram Moolenaar catch /E121:/ 82068d130c6SBram Moolenaar n = 121 82168d130c6SBram Moolenaar endtry 82268d130c6SBram Moolenaar assert_equal(121, n) 82368d130c6SBram Moolenaar 82468d130c6SBram Moolenaar let d = #{one: 1} 82568d130c6SBram Moolenaar try 82668d130c6SBram Moolenaar n = d[g:astring] 82768d130c6SBram Moolenaar catch /E716:/ 82868d130c6SBram Moolenaar n = 222 82968d130c6SBram Moolenaar endtry 83068d130c6SBram Moolenaar assert_equal(222, n) 831f0b9f43cSBram Moolenaar 832f0b9f43cSBram Moolenaar try 833f0b9f43cSBram Moolenaar n = -g:astring 834f0b9f43cSBram Moolenaar catch /E39:/ 835f0b9f43cSBram Moolenaar n = 233 836f0b9f43cSBram Moolenaar endtry 837f0b9f43cSBram Moolenaar assert_equal(233, n) 838f0b9f43cSBram Moolenaar 839f0b9f43cSBram Moolenaar try 840f0b9f43cSBram Moolenaar n = +g:astring 841f0b9f43cSBram Moolenaar catch /E1030:/ 842f0b9f43cSBram Moolenaar n = 244 843f0b9f43cSBram Moolenaar endtry 844f0b9f43cSBram Moolenaar assert_equal(244, n) 845f0b9f43cSBram Moolenaar 846f0b9f43cSBram Moolenaar try 847f0b9f43cSBram Moolenaar n = +g:alist 848f0b9f43cSBram Moolenaar catch /E745:/ 849f0b9f43cSBram Moolenaar n = 255 850f0b9f43cSBram Moolenaar endtry 851f0b9f43cSBram Moolenaar assert_equal(255, n) 852f0b9f43cSBram Moolenaar 853f0b9f43cSBram Moolenaar let nd: dict<any> 854f0b9f43cSBram Moolenaar try 855f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 856f0b9f43cSBram Moolenaar catch /E1029:/ 857f0b9f43cSBram Moolenaar n = 266 858f0b9f43cSBram Moolenaar endtry 859f0b9f43cSBram Moolenaar assert_equal(266, n) 860f0b9f43cSBram Moolenaar 861f0b9f43cSBram Moolenaar try 862f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 863f0b9f43cSBram Moolenaar catch /E1093:/ 864f0b9f43cSBram Moolenaar n = 277 865f0b9f43cSBram Moolenaar endtry 866f0b9f43cSBram Moolenaar assert_equal(277, n) 867f0b9f43cSBram Moolenaar 868e859312eSBram Moolenaar try 869e859312eSBram Moolenaar &ts = g:astring 870e859312eSBram Moolenaar catch /E1029:/ 871e859312eSBram Moolenaar n = 288 872e859312eSBram Moolenaar endtry 873e859312eSBram Moolenaar assert_equal(288, n) 874e859312eSBram Moolenaar 875e859312eSBram Moolenaar try 876e859312eSBram Moolenaar &backspace = 'asdf' 877e859312eSBram Moolenaar catch /E474:/ 878e859312eSBram Moolenaar n = 299 879e859312eSBram Moolenaar endtry 880e859312eSBram Moolenaar assert_equal(299, n) 881e859312eSBram Moolenaar 882e859312eSBram Moolenaar l = [1] 883e859312eSBram Moolenaar try 884e859312eSBram Moolenaar l[3] = 3 885e859312eSBram Moolenaar catch /E684:/ 886e859312eSBram Moolenaar n = 300 887e859312eSBram Moolenaar endtry 888e859312eSBram Moolenaar assert_equal(300, n) 889e859312eSBram Moolenaar 890e859312eSBram Moolenaar try 891e859312eSBram Moolenaar unlet g:does_not_exist 892e859312eSBram Moolenaar catch /E108:/ 893e859312eSBram Moolenaar n = 322 894e859312eSBram Moolenaar endtry 895e859312eSBram Moolenaar assert_equal(322, n) 896e859312eSBram Moolenaar 897e859312eSBram Moolenaar try 898e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 899e859312eSBram Moolenaar catch /E721:/ 900e859312eSBram Moolenaar n = 333 901e859312eSBram Moolenaar endtry 902e859312eSBram Moolenaar assert_equal(333, n) 903e859312eSBram Moolenaar 904e859312eSBram Moolenaar try 905e859312eSBram Moolenaar l = DeletedFunc() 906e859312eSBram Moolenaar catch /E933:/ 907e859312eSBram Moolenaar n = 344 908e859312eSBram Moolenaar endtry 909e859312eSBram Moolenaar assert_equal(344, n) 910d032f34aSBram Moolenaar 911d032f34aSBram Moolenaar try 912d032f34aSBram Moolenaar echo len(v:true) 913d032f34aSBram Moolenaar catch /E701:/ 914d032f34aSBram Moolenaar n = 355 915d032f34aSBram Moolenaar endtry 916d032f34aSBram Moolenaar assert_equal(355, n) 917d032f34aSBram Moolenaar 918d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 919d032f34aSBram Moolenaar delfunc g:NoSuchFunc 920d032f34aSBram Moolenaar try 921d032f34aSBram Moolenaar echo P() 922d032f34aSBram Moolenaar catch /E117:/ 923d032f34aSBram Moolenaar n = 366 924d032f34aSBram Moolenaar endtry 925d032f34aSBram Moolenaar assert_equal(366, n) 926d032f34aSBram Moolenaar 927d032f34aSBram Moolenaar try 928d032f34aSBram Moolenaar echo g:NoSuchFunc() 929d032f34aSBram Moolenaar catch /E117:/ 930d032f34aSBram Moolenaar n = 377 931d032f34aSBram Moolenaar endtry 932d032f34aSBram Moolenaar assert_equal(377, n) 933d032f34aSBram Moolenaar 934d032f34aSBram Moolenaar try 935d032f34aSBram Moolenaar echo g:alist + 4 936d032f34aSBram Moolenaar catch /E745:/ 937d032f34aSBram Moolenaar n = 388 938d032f34aSBram Moolenaar endtry 939d032f34aSBram Moolenaar assert_equal(388, n) 940d032f34aSBram Moolenaar 941d032f34aSBram Moolenaar try 942d032f34aSBram Moolenaar echo 4 + g:alist 943d032f34aSBram Moolenaar catch /E745:/ 944d032f34aSBram Moolenaar n = 399 945d032f34aSBram Moolenaar endtry 946d032f34aSBram Moolenaar assert_equal(399, n) 947d032f34aSBram Moolenaar 948d032f34aSBram Moolenaar try 949d032f34aSBram Moolenaar echo g:alist.member 950d032f34aSBram Moolenaar catch /E715:/ 951d032f34aSBram Moolenaar n = 400 952d032f34aSBram Moolenaar endtry 953d032f34aSBram Moolenaar assert_equal(400, n) 954d032f34aSBram Moolenaar 955d032f34aSBram Moolenaar try 956d032f34aSBram Moolenaar echo d.member 957d032f34aSBram Moolenaar catch /E716:/ 958d032f34aSBram Moolenaar n = 411 959d032f34aSBram Moolenaar endtry 960d032f34aSBram Moolenaar assert_equal(411, n) 9618a7d6542SBram Moolenaarenddef 9628a7d6542SBram Moolenaar 963e859312eSBram Moolenaardef DeletedFunc(): list<any> 964e859312eSBram Moolenaar return ['delete me'] 965e859312eSBram Moolenaarenddef 966e859312eSBram Moolenaardefcompile 967e859312eSBram Moolenaardelfunc DeletedFunc 968e859312eSBram Moolenaar 969257cc5eeSBram Moolenaardef ThrowFromDef() 970a72cfb80SBram Moolenaar throw "getout" # comment 971257cc5eeSBram Moolenaarenddef 972257cc5eeSBram Moolenaar 973257cc5eeSBram Moolenaarfunc CatchInFunc() 974257cc5eeSBram Moolenaar try 975257cc5eeSBram Moolenaar call ThrowFromDef() 976257cc5eeSBram Moolenaar catch 977257cc5eeSBram Moolenaar let g:thrown_func = v:exception 978257cc5eeSBram Moolenaar endtry 979257cc5eeSBram Moolenaarendfunc 980257cc5eeSBram Moolenaar 981257cc5eeSBram Moolenaardef CatchInDef() 982257cc5eeSBram Moolenaar try 983257cc5eeSBram Moolenaar ThrowFromDef() 984257cc5eeSBram Moolenaar catch 985257cc5eeSBram Moolenaar g:thrown_def = v:exception 986257cc5eeSBram Moolenaar endtry 987257cc5eeSBram Moolenaarenddef 988257cc5eeSBram Moolenaar 989f575adffSBram Moolenaardef ReturnFinally(): string 990f575adffSBram Moolenaar try 991f575adffSBram Moolenaar return 'intry' 992f575adffSBram Moolenaar finally 993f575adffSBram Moolenaar g:in_finally = 'finally' 994f575adffSBram Moolenaar endtry 995f575adffSBram Moolenaar return 'end' 996f575adffSBram Moolenaarenddef 997f575adffSBram Moolenaar 998257cc5eeSBram Moolenaardef Test_try_catch_nested() 999257cc5eeSBram Moolenaar CatchInFunc() 1000257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 1001257cc5eeSBram Moolenaar 1002257cc5eeSBram Moolenaar CatchInDef() 1003257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 1004f575adffSBram Moolenaar 1005f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 1006f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 1007f575adffSBram Moolenaarenddef 1008f575adffSBram Moolenaar 1009f575adffSBram Moolenaardef Test_try_catch_match() 1010f575adffSBram Moolenaar let seq = 'a' 1011f575adffSBram Moolenaar try 1012f575adffSBram Moolenaar throw 'something' 1013f575adffSBram Moolenaar catch /nothing/ 1014f575adffSBram Moolenaar seq ..= 'x' 1015f575adffSBram Moolenaar catch /some/ 1016f575adffSBram Moolenaar seq ..= 'b' 1017f575adffSBram Moolenaar catch /asdf/ 1018f575adffSBram Moolenaar seq ..= 'x' 1019e8c4abbbSBram Moolenaar catch ?a\?sdf? 1020e8c4abbbSBram Moolenaar seq ..= 'y' 1021f575adffSBram Moolenaar finally 1022f575adffSBram Moolenaar seq ..= 'c' 1023f575adffSBram Moolenaar endtry 1024f575adffSBram Moolenaar assert_equal('abc', seq) 1025257cc5eeSBram Moolenaarenddef 1026257cc5eeSBram Moolenaar 1027e8c4abbbSBram Moolenaardef Test_try_catch_fails() 1028e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 1029e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 1030e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 1031585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 1032585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 1033585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 1034585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 1035585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 1036585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 1037585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 1038585fea7bSBram Moolenaar 1039a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 1040585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 1041e8c4abbbSBram Moolenaarenddef 1042e8c4abbbSBram Moolenaar 1043006ad48bSBram Moolenaardef Test_throw_vimscript() 1044f5be8cdbSBram Moolenaar # only checks line continuation 1045006ad48bSBram Moolenaar let lines =<< trim END 1046006ad48bSBram Moolenaar vim9script 1047006ad48bSBram Moolenaar try 1048006ad48bSBram Moolenaar throw 'one' 1049006ad48bSBram Moolenaar .. 'two' 1050006ad48bSBram Moolenaar catch 1051006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1052006ad48bSBram Moolenaar endtry 1053006ad48bSBram Moolenaar END 1054006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1055006ad48bSBram Moolenaarenddef 1056006ad48bSBram Moolenaar 105737c83711SBram Moolenaardef Test_cexpr_vimscript() 1058f5be8cdbSBram Moolenaar # only checks line continuation 105937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 106037c83711SBram Moolenaar let lines =<< trim END 106137c83711SBram Moolenaar vim9script 106237c83711SBram Moolenaar cexpr 'File' 106337c83711SBram Moolenaar .. ' someFile' .. 106437c83711SBram Moolenaar ' line 19' 106537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 106637c83711SBram Moolenaar END 106737c83711SBram Moolenaar CheckScriptSuccess(lines) 106837c83711SBram Moolenaar set errorformat& 106937c83711SBram Moolenaarenddef 107037c83711SBram Moolenaar 1071b209750bSBram Moolenaardef Test_list_vimscript() 1072b209750bSBram Moolenaar # checks line continuation and comments 1073b209750bSBram Moolenaar let lines =<< trim END 1074b209750bSBram Moolenaar vim9script 1075b209750bSBram Moolenaar let mylist = [ 1076b209750bSBram Moolenaar 'one', 1077b209750bSBram Moolenaar # comment 1078b209750bSBram Moolenaar 'two', # empty line follows 1079b209750bSBram Moolenaar 1080b209750bSBram Moolenaar 'three', 1081b209750bSBram Moolenaar ] 1082b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1083b209750bSBram Moolenaar END 1084b209750bSBram Moolenaar CheckScriptSuccess(lines) 1085b209750bSBram Moolenaarenddef 1086b209750bSBram Moolenaar 10872a1381c3SBram Moolenaarif has('channel') 108840ee466cSBram Moolenaar let someJob = test_null_job() 108940ee466cSBram Moolenaar 109040ee466cSBram Moolenaar def FuncWithError() 109140ee466cSBram Moolenaar echomsg g:someJob 109240ee466cSBram Moolenaar enddef 109340ee466cSBram Moolenaar 109440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 109540ee466cSBram Moolenaar try 109640ee466cSBram Moolenaar call FuncWithError() 109740ee466cSBram Moolenaar catch 109840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 109940ee466cSBram Moolenaar endtry 110040ee466cSBram Moolenaar endfunc 11012a1381c3SBram Moolenaarendif 110240ee466cSBram Moolenaar 11038a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 11048a7d6542SBram Moolenaar vim9script 11058a7d6542SBram Moolenaar let name: string = 'bob' 11068a7d6542SBram Moolenaar def Concat(arg: string): string 11078a7d6542SBram Moolenaar return name .. arg 11088a7d6542SBram Moolenaar enddef 1109227a69deSBram Moolenaar g:result = Concat('bie') 1110227a69deSBram Moolenaar g:localname = name 11118a7d6542SBram Moolenaar 11128a7d6542SBram Moolenaar export const CONST = 1234 11138a7d6542SBram Moolenaar export let exported = 9876 11146e587dcbSBram Moolenaar export let exp_name = 'John' 11158a7d6542SBram Moolenaar export def Exported(): string 11168a7d6542SBram Moolenaar return 'Exported' 11178a7d6542SBram Moolenaar enddef 11188a7d6542SBram MoolenaarEND 11198a7d6542SBram Moolenaar 11205269bd2aSBram Moolenaardef Test_vim9_import_export() 11218a7d6542SBram Moolenaar let import_script_lines =<< trim END 11228a7d6542SBram Moolenaar vim9script 11238a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 11248a7d6542SBram Moolenaar g:imported = exported 11256e587dcbSBram Moolenaar exported += 3 11266e587dcbSBram Moolenaar g:imported_added = exported 11278a7d6542SBram Moolenaar g:imported_func = Exported() 11286e587dcbSBram Moolenaar 112940f4f7a4SBram Moolenaar def GetExported(): string 113040f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 113140f4f7a4SBram Moolenaar return local_dict.ref() 113240f4f7a4SBram Moolenaar enddef 113340f4f7a4SBram Moolenaar g:funcref_result = GetExported() 113440f4f7a4SBram Moolenaar 11356e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 11366e587dcbSBram Moolenaar g:imported_name = exp_name 11376e587dcbSBram Moolenaar exp_name ..= ' Doe' 11386e587dcbSBram Moolenaar g:imported_name_appended = exp_name 11395381c7a1SBram Moolenaar g:imported_later = exported 11408a7d6542SBram Moolenaar END 11418a7d6542SBram Moolenaar 11428a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11438a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11448a7d6542SBram Moolenaar 11458a7d6542SBram Moolenaar source Ximport.vim 11468a7d6542SBram Moolenaar 11478a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11488a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11498a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11506e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11515381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11528a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 115340f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11546e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11556e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11568a7d6542SBram Moolenaar assert_false(exists('g:name')) 11578a7d6542SBram Moolenaar 11588a7d6542SBram Moolenaar unlet g:result 11598a7d6542SBram Moolenaar unlet g:localname 11608a7d6542SBram Moolenaar unlet g:imported 11616e587dcbSBram Moolenaar unlet g:imported_added 11625381c7a1SBram Moolenaar unlet g:imported_later 11638a7d6542SBram Moolenaar unlet g:imported_func 11646e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11658a7d6542SBram Moolenaar delete('Ximport.vim') 1166f2d5c240SBram Moolenaar 11671c991144SBram Moolenaar # similar, with line breaks 11681c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11691c991144SBram Moolenaar vim9script 11701c991144SBram Moolenaar import { 11711c991144SBram Moolenaar exported, 11721c991144SBram Moolenaar Exported, 11731c991144SBram Moolenaar } 11741c991144SBram Moolenaar from 11751c991144SBram Moolenaar './Xexport.vim' 11761c991144SBram Moolenaar g:imported = exported 11771c991144SBram Moolenaar exported += 5 11781c991144SBram Moolenaar g:imported_added = exported 11791c991144SBram Moolenaar g:imported_func = Exported() 11801c991144SBram Moolenaar END 11811c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11821c991144SBram Moolenaar source Ximport_lbr.vim 11831c991144SBram Moolenaar 11841c991144SBram Moolenaar assert_equal(9876, g:imported) 11851c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11861c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11871c991144SBram Moolenaar 11881c991144SBram Moolenaar # exported script not sourced again 11891c991144SBram Moolenaar assert_false(exists('g:result')) 11901c991144SBram Moolenaar unlet g:imported 11911c991144SBram Moolenaar unlet g:imported_added 11921c991144SBram Moolenaar unlet g:imported_func 11931c991144SBram Moolenaar delete('Ximport_lbr.vim') 11941c991144SBram Moolenaar 11951c991144SBram Moolenaar # import inside :def function 11965381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11975381c7a1SBram Moolenaar vim9script 11985381c7a1SBram Moolenaar def ImportInDef() 11995381c7a1SBram Moolenaar import exported from './Xexport.vim' 12005381c7a1SBram Moolenaar g:imported = exported 12015381c7a1SBram Moolenaar exported += 7 12025381c7a1SBram Moolenaar g:imported_added = exported 12035381c7a1SBram Moolenaar enddef 12045381c7a1SBram Moolenaar ImportInDef() 12055381c7a1SBram Moolenaar END 12065381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 12075381c7a1SBram Moolenaar source Ximport2.vim 1208f5be8cdbSBram Moolenaar # TODO: this should be 9879 12095381c7a1SBram Moolenaar assert_equal(9876, g:imported) 12105381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 12115381c7a1SBram Moolenaar unlet g:imported 12125381c7a1SBram Moolenaar unlet g:imported_added 12135381c7a1SBram Moolenaar delete('Ximport2.vim') 12145381c7a1SBram Moolenaar 1215f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1216f2d5c240SBram Moolenaar vim9script 1217f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1218f2d5c240SBram Moolenaar def UseExport() 1219f2d5c240SBram Moolenaar g:imported = Export.exported 1220f2d5c240SBram Moolenaar enddef 1221f2d5c240SBram Moolenaar UseExport() 1222f2d5c240SBram Moolenaar END 1223f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1224f2d5c240SBram Moolenaar source Ximport.vim 12255381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1226f2d5c240SBram Moolenaar 1227599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1228599c89c8SBram Moolenaar vim9script 1229599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1230599c89c8SBram Moolenaar def Func() 1231599c89c8SBram Moolenaar let dummy = 1 1232599c89c8SBram Moolenaar let imported = Export + dummy 1233599c89c8SBram Moolenaar enddef 1234822ba247SBram Moolenaar defcompile 1235599c89c8SBram Moolenaar END 1236599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1237599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1238599c89c8SBram Moolenaar 1239599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1240599c89c8SBram Moolenaar vim9script 1241599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1242599c89c8SBram Moolenaar def Func() 1243599c89c8SBram Moolenaar let imported = Export . exported 1244599c89c8SBram Moolenaar enddef 1245822ba247SBram Moolenaar defcompile 1246599c89c8SBram Moolenaar END 1247599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1248599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1249599c89c8SBram Moolenaar 1250599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1251599c89c8SBram Moolenaar vim9script 1252599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1253599c89c8SBram Moolenaar def Func() 1254599c89c8SBram Moolenaar let imported = Export. 1255599c89c8SBram Moolenaar enddef 1256822ba247SBram Moolenaar defcompile 1257599c89c8SBram Moolenaar END 1258599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1259599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1260599c89c8SBram Moolenaar 12611c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12621c991144SBram Moolenaar vim9script 12631c991144SBram Moolenaar import * 12641c991144SBram Moolenaar as Export 12651c991144SBram Moolenaar from 12661c991144SBram Moolenaar './Xexport.vim' 12671c991144SBram Moolenaar def UseExport() 12681c991144SBram Moolenaar g:imported = Export.exported 12691c991144SBram Moolenaar enddef 12701c991144SBram Moolenaar UseExport() 12711c991144SBram Moolenaar END 12721c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12731c991144SBram Moolenaar source Ximport.vim 12741c991144SBram Moolenaar assert_equal(9883, g:imported) 12751c991144SBram Moolenaar 1276f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1277f2d5c240SBram Moolenaar vim9script 1278f2d5c240SBram Moolenaar import * from './Xexport.vim' 1279f2d5c240SBram Moolenaar END 1280f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1281f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1282f2d5c240SBram Moolenaar 1283f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1284fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1285fa29c8abSBram Moolenaar vim9script 1286fa29c8abSBram Moolenaar import name from './Xexport.vim' 1287fa29c8abSBram Moolenaar END 1288fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1289fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1290fa29c8abSBram Moolenaar 1291f5be8cdbSBram Moolenaar # try to import something that is already defined 12925269bd2aSBram Moolenaar let import_already_defined =<< trim END 12935269bd2aSBram Moolenaar vim9script 12945269bd2aSBram Moolenaar let exported = 'something' 12955269bd2aSBram Moolenaar import exported from './Xexport.vim' 12965269bd2aSBram Moolenaar END 12975269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12985269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12995269bd2aSBram Moolenaar 1300f5be8cdbSBram Moolenaar # try to import something that is already defined 13015269bd2aSBram Moolenaar import_already_defined =<< trim END 13025269bd2aSBram Moolenaar vim9script 13035269bd2aSBram Moolenaar let exported = 'something' 13045269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13055269bd2aSBram Moolenaar END 13065269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13075269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13085269bd2aSBram Moolenaar 1309f5be8cdbSBram Moolenaar # try to import something that is already defined 13105269bd2aSBram Moolenaar import_already_defined =<< trim END 13115269bd2aSBram Moolenaar vim9script 13125269bd2aSBram Moolenaar let exported = 'something' 13135269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13145269bd2aSBram Moolenaar END 13155269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 13165269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 13175269bd2aSBram Moolenaar 1318f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1319fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1320fa29c8abSBram Moolenaar vim9script 1321fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1322fa29c8abSBram Moolenaar END 1323fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1324fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1325fa29c8abSBram Moolenaar 1326fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1327fa29c8abSBram Moolenaar vim9script 1328fa29c8abSBram Moolenaar import name './Xexport.vim' 1329fa29c8abSBram Moolenaar END 1330fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1331fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1332fa29c8abSBram Moolenaar 1333fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1334fa29c8abSBram Moolenaar vim9script 1335fa29c8abSBram Moolenaar import name from Xexport.vim 1336fa29c8abSBram Moolenaar END 1337fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1338fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1339fa29c8abSBram Moolenaar 1340fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1341fa29c8abSBram Moolenaar vim9script 1342fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1343fa29c8abSBram Moolenaar END 1344fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1345fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1346fa29c8abSBram Moolenaar 1347fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1348fa29c8abSBram Moolenaar vim9script 1349fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1350fa29c8abSBram Moolenaar END 13515269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13525269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1353fa29c8abSBram Moolenaar 1354f2d5c240SBram Moolenaar delete('Ximport.vim') 13555269bd2aSBram Moolenaar delete('Ximport3.vim') 13568a7d6542SBram Moolenaar delete('Xexport.vim') 13578a7d6542SBram Moolenaar 1358f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1359750802b5SBram Moolenaar set cpo&vi 1360750802b5SBram Moolenaar let cpo_before = &cpo 1361750802b5SBram Moolenaar let lines =<< trim END 1362750802b5SBram Moolenaar vim9script 1363750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1364750802b5SBram Moolenaar END 1365750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1366750802b5SBram Moolenaar source Xvim9_script 1367750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1368750802b5SBram Moolenaar set cpo&vim 1369750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1370750802b5SBram Moolenaar delete('Xvim9_script') 1371750802b5SBram Moolenaarenddef 1372750802b5SBram Moolenaar 1373803af686SBram Moolenaarfunc g:Trigger() 1374803af686SBram Moolenaar source Ximport.vim 1375803af686SBram Moolenaar return "echo 'yes'\<CR>" 1376803af686SBram Moolenaarendfunc 1377803af686SBram Moolenaar 1378803af686SBram Moolenaardef Test_import_export_expr_map() 1379803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1380803af686SBram Moolenaar let export_lines =<< trim END 1381803af686SBram Moolenaar vim9script 1382803af686SBram Moolenaar export def That(): string 1383803af686SBram Moolenaar return 'yes' 1384803af686SBram Moolenaar enddef 1385803af686SBram Moolenaar END 1386803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1387803af686SBram Moolenaar 1388803af686SBram Moolenaar let import_lines =<< trim END 1389803af686SBram Moolenaar vim9script 1390803af686SBram Moolenaar import That from './Xexport_that.vim' 1391803af686SBram Moolenaar assert_equal('yes', That()) 1392803af686SBram Moolenaar END 1393803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1394803af686SBram Moolenaar 1395803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1396803af686SBram Moolenaar feedkeys('trigger', "xt") 1397803af686SBram Moolenaar 1398803af686SBram Moolenaar delete('Xexport.vim') 1399803af686SBram Moolenaar delete('Ximport.vim') 1400803af686SBram Moolenaar nunmap trigger 1401803af686SBram Moolenaarenddef 1402803af686SBram Moolenaar 14038e1986e3SBram Moolenaardef Test_import_in_filetype() 14048e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14058e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 14068e1986e3SBram Moolenaar let export_lines =<< trim END 14078e1986e3SBram Moolenaar vim9script 14088e1986e3SBram Moolenaar export let That = 'yes' 14098e1986e3SBram Moolenaar END 14108e1986e3SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_that.vim') 14118e1986e3SBram Moolenaar 14128e1986e3SBram Moolenaar let import_lines =<< trim END 14138e1986e3SBram Moolenaar vim9script 14148e1986e3SBram Moolenaar import That from './Xexport_that.vim' 14158e1986e3SBram Moolenaar assert_equal('yes', That) 14168e1986e3SBram Moolenaar g:did_load_mytpe = 1 14178e1986e3SBram Moolenaar END 14188e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14198e1986e3SBram Moolenaar 14208e1986e3SBram Moolenaar let save_rtp = &rtp 14218e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14228e1986e3SBram Moolenaar 14238e1986e3SBram Moolenaar filetype plugin on 14248e1986e3SBram Moolenaar copen 14258e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14268e1986e3SBram Moolenaar 14278e1986e3SBram Moolenaar quit! 14288e1986e3SBram Moolenaar delete('Xexport.vim') 14298e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14308e1986e3SBram Moolenaar &rtp = save_rtp 14318e1986e3SBram Moolenaarenddef 14328e1986e3SBram Moolenaar 1433*efa94447SBram Moolenaardef Test_use_import_in_mapping() 1434*efa94447SBram Moolenaar let lines =<< trim END 1435*efa94447SBram Moolenaar vim9script 1436*efa94447SBram Moolenaar export def Funcx() 1437*efa94447SBram Moolenaar g:result = 42 1438*efa94447SBram Moolenaar enddef 1439*efa94447SBram Moolenaar END 1440*efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1441*efa94447SBram Moolenaar lines =<< trim END 1442*efa94447SBram Moolenaar vim9script 1443*efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1444*efa94447SBram Moolenaar nnoremap <C-B> :call <sid>Funcx()<cr> 1445*efa94447SBram Moolenaar END 1446*efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1447*efa94447SBram Moolenaar 1448*efa94447SBram Moolenaar source Xmapscript.vim 1449*efa94447SBram Moolenaar feedkeys("\<c-b>", "xt") 1450*efa94447SBram Moolenaar assert_equal(42, g:result) 1451*efa94447SBram Moolenaar 1452*efa94447SBram Moolenaar unlet g:result 1453*efa94447SBram Moolenaar delete('XsomeExport.vim') 1454*efa94447SBram Moolenaar delete('Xmapscript.vim') 1455*efa94447SBram Moolenaar nunmap <C-B> 1456*efa94447SBram Moolenaarenddef 1457*efa94447SBram Moolenaar 1458750802b5SBram Moolenaardef Test_vim9script_fails() 14598a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14608a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1461750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 14629721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 14639b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1464750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1465750802b5SBram Moolenaar 1466c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1467c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1468c785b9a7SBram Moolenaar 1469750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1470a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 14718a7d6542SBram Moolenaarenddef 14728a7d6542SBram Moolenaar 1473f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1474101f4810SBram Moolenaar CheckRunVimInTerminal 1475101f4810SBram Moolenaar 14769bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1477c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14789bb3eb3eSBram Moolenaarendfunc 14799bb3eb3eSBram Moolenaar 1480c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1481101f4810SBram Moolenaar let export =<< trim END 1482101f4810SBram Moolenaar vim9script 1483101f4810SBram Moolenaar export def Foo(): number 1484101f4810SBram Moolenaar return 0 1485101f4810SBram Moolenaar enddef 1486101f4810SBram Moolenaar END 14879bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1488101f4810SBram Moolenaar 14899bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 14909bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14919bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1492101f4810SBram Moolenaar 14939bb3eb3eSBram Moolenaar delete('Xexport.vim') 14949bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14959bb3eb3eSBram Moolenaarenddef 1496101f4810SBram Moolenaar 14974c17ad94SBram Moolenaardef Test_vim9script_reload_import() 14988a7d6542SBram Moolenaar let lines =<< trim END 14998a7d6542SBram Moolenaar vim9script 15008a7d6542SBram Moolenaar const var = '' 15018a7d6542SBram Moolenaar let valone = 1234 15028a7d6542SBram Moolenaar def MyFunc(arg: string) 15038a7d6542SBram Moolenaar valone = 5678 15048a7d6542SBram Moolenaar enddef 15058a7d6542SBram Moolenaar END 15068a7d6542SBram Moolenaar let morelines =<< trim END 15078a7d6542SBram Moolenaar let valtwo = 222 15088a7d6542SBram Moolenaar export def GetValtwo(): number 15098a7d6542SBram Moolenaar return valtwo 15108a7d6542SBram Moolenaar enddef 15118a7d6542SBram Moolenaar END 151203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15138a7d6542SBram Moolenaar source Xreload.vim 15148a7d6542SBram Moolenaar source Xreload.vim 15158a7d6542SBram Moolenaar source Xreload.vim 15168a7d6542SBram Moolenaar 15178a7d6542SBram Moolenaar let testlines =<< trim END 15188a7d6542SBram Moolenaar vim9script 15198a7d6542SBram Moolenaar def TheFunc() 15208a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15218a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15228a7d6542SBram Moolenaar enddef 15238a7d6542SBram Moolenaar TheFunc() 15248a7d6542SBram Moolenaar END 15258a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15268a7d6542SBram Moolenaar source Ximport.vim 15278a7d6542SBram Moolenaar 1528f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1529f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15308a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15318a7d6542SBram Moolenaar source Ximport.vim 15328a7d6542SBram Moolenaar 1533f5be8cdbSBram Moolenaar # cannot declare a var twice 15348a7d6542SBram Moolenaar lines =<< trim END 15358a7d6542SBram Moolenaar vim9script 15368a7d6542SBram Moolenaar let valone = 1234 15378a7d6542SBram Moolenaar let valone = 5678 15388a7d6542SBram Moolenaar END 15398a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15408a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 15418a7d6542SBram Moolenaar 15428a7d6542SBram Moolenaar delete('Xreload.vim') 15438a7d6542SBram Moolenaar delete('Ximport.vim') 15448a7d6542SBram Moolenaarenddef 15458a7d6542SBram Moolenaar 1546fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1547fe465a01SBram Moolenaar" script-local name. 1548fe465a01SBram Moolenaardef Test_vim9script_funcref() 1549fe465a01SBram Moolenaar let sortlines =<< trim END 1550fe465a01SBram Moolenaar vim9script 1551fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1552bed36b93SBram Moolenaar return i2 - i1 1553fe465a01SBram Moolenaar enddef 1554fe465a01SBram Moolenaar 1555fe465a01SBram Moolenaar export def FastSort(): list<number> 1556fe465a01SBram Moolenaar return range(5)->sort(Compare) 1557fe465a01SBram Moolenaar enddef 1558fe465a01SBram Moolenaar END 1559fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1560fe465a01SBram Moolenaar 1561fe465a01SBram Moolenaar let lines =<< trim END 1562fe465a01SBram Moolenaar vim9script 1563fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1564fe465a01SBram Moolenaar def Test() 1565fe465a01SBram Moolenaar g:result = FastSort() 1566fe465a01SBram Moolenaar enddef 1567fe465a01SBram Moolenaar Test() 1568fe465a01SBram Moolenaar END 1569fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1570fe465a01SBram Moolenaar 1571fe465a01SBram Moolenaar source Xscript.vim 1572fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1573fe465a01SBram Moolenaar 1574fe465a01SBram Moolenaar unlet g:result 1575fe465a01SBram Moolenaar delete('Xsort.vim') 1576fe465a01SBram Moolenaar delete('Xscript.vim') 1577fe465a01SBram Moolenaarenddef 1578fe465a01SBram Moolenaar 1579c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1580c620c055SBram Moolenaar" script where FastFilter() is called from. 1581c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1582c620c055SBram Moolenaar let filterLines =<< trim END 1583c620c055SBram Moolenaar vim9script 1584c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1585c620c055SBram Moolenaar return idx % 2 == 1 1586c620c055SBram Moolenaar enddef 1587c620c055SBram Moolenaar export def FastFilter(): list<number> 1588c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1589c620c055SBram Moolenaar enddef 1590c620c055SBram Moolenaar END 1591c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1592c620c055SBram Moolenaar 1593c620c055SBram Moolenaar let lines =<< trim END 1594c620c055SBram Moolenaar vim9script 1595c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1596c620c055SBram Moolenaar def Test() 1597c620c055SBram Moolenaar let x: list<number> = FastFilter() 1598c620c055SBram Moolenaar enddef 1599c620c055SBram Moolenaar Test() 1600c620c055SBram Moolenaar END 1601c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1602c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1603c620c055SBram Moolenaar 1604c620c055SBram Moolenaar delete('Xfilter.vim') 1605c620c055SBram Moolenaar delete('Ximport.vim') 1606c620c055SBram Moolenaarenddef 1607c620c055SBram Moolenaar 16084c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 16094c17ad94SBram Moolenaar let first_lines =<< trim END 16104c17ad94SBram Moolenaar vim9script 16114c17ad94SBram Moolenaar def FuncYes(): string 16124c17ad94SBram Moolenaar return 'yes' 16134c17ad94SBram Moolenaar enddef 16144c17ad94SBram Moolenaar END 161503afdcf1SBram Moolenaar let withno_lines =<< trim END 16164c17ad94SBram Moolenaar def FuncNo(): string 16174c17ad94SBram Moolenaar return 'no' 16184c17ad94SBram Moolenaar enddef 16194c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 16204c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 16214c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 162203afdcf1SBram Moolenaar enddef 162303afdcf1SBram Moolenaar END 162403afdcf1SBram Moolenaar let nono_lines =<< trim END 162503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 162603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 16274c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 16284c17ad94SBram Moolenaar enddef 16294c17ad94SBram Moolenaar END 16304c17ad94SBram Moolenaar 16314c17ad94SBram Moolenaar # FuncNo() is defined 163203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16334c17ad94SBram Moolenaar source Xreloaded.vim 16344c17ad94SBram Moolenaar g:DoCheck(true) 16354c17ad94SBram Moolenaar 16364c17ad94SBram Moolenaar # FuncNo() is not redefined 163703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16384c17ad94SBram Moolenaar source Xreloaded.vim 163903afdcf1SBram Moolenaar g:DoCheck() 16404c17ad94SBram Moolenaar 16414c17ad94SBram Moolenaar # FuncNo() is back 164203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16434c17ad94SBram Moolenaar source Xreloaded.vim 164403afdcf1SBram Moolenaar g:DoCheck() 16454c17ad94SBram Moolenaar 16464c17ad94SBram Moolenaar delete('Xreloaded.vim') 16474c17ad94SBram Moolenaarenddef 16484c17ad94SBram Moolenaar 164989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 165089483d40SBram Moolenaar # write the script with a script-local variable 165189483d40SBram Moolenaar let lines =<< trim END 165289483d40SBram Moolenaar vim9script 165389483d40SBram Moolenaar let var = 'string' 165489483d40SBram Moolenaar END 165589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 165689483d40SBram Moolenaar source XreloadVar.vim 165789483d40SBram Moolenaar 165889483d40SBram Moolenaar # now write the script using the same variable locally - works 165989483d40SBram Moolenaar lines =<< trim END 166089483d40SBram Moolenaar vim9script 166189483d40SBram Moolenaar def Func() 166289483d40SBram Moolenaar let var = 'string' 166389483d40SBram Moolenaar enddef 166489483d40SBram Moolenaar END 166589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 166689483d40SBram Moolenaar source XreloadVar.vim 166789483d40SBram Moolenaar 166889483d40SBram Moolenaar delete('XreloadVar.vim') 166989483d40SBram Moolenaarenddef 167089483d40SBram Moolenaar 16718a7d6542SBram Moolenaardef Test_import_absolute() 16728a7d6542SBram Moolenaar let import_lines = [ 1673e6085c53SBram Moolenaar 'vim9script', 1674e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1675e6085c53SBram Moolenaar 'def UseExported()', 1676e6085c53SBram Moolenaar ' g:imported_abs = exported', 1677e6085c53SBram Moolenaar ' exported = 8888', 1678e6085c53SBram Moolenaar ' g:imported_after = exported', 1679e6085c53SBram Moolenaar 'enddef', 1680e6085c53SBram Moolenaar 'UseExported()', 1681e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1682e6085c53SBram Moolenaar ] 16838a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16848a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16858a7d6542SBram Moolenaar 16868a7d6542SBram Moolenaar source Ximport_abs.vim 16878a7d6542SBram Moolenaar 16888a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16894e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1690675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1691675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1692675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1693675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1694675f716eSBram Moolenaar 'exported = 8888.*' .. 1695675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1696675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1697675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1698675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1699e6085c53SBram Moolenaar g:import_disassembled) 17008a7d6542SBram Moolenaar unlet g:imported_abs 17014e12a5dfSBram Moolenaar unlet g:import_disassembled 17028a7d6542SBram Moolenaar 17038a7d6542SBram Moolenaar delete('Ximport_abs.vim') 17048a7d6542SBram Moolenaar delete('Xexport_abs.vim') 17058a7d6542SBram Moolenaarenddef 17068a7d6542SBram Moolenaar 17078a7d6542SBram Moolenaardef Test_import_rtp() 17088a7d6542SBram Moolenaar let import_lines = [ 1709e6085c53SBram Moolenaar 'vim9script', 1710e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1711e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1712e6085c53SBram Moolenaar ] 17138a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 17148a7d6542SBram Moolenaar mkdir('import') 17158a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 17168a7d6542SBram Moolenaar 17178a7d6542SBram Moolenaar let save_rtp = &rtp 17188a7d6542SBram Moolenaar &rtp = getcwd() 17198a7d6542SBram Moolenaar source Ximport_rtp.vim 17208a7d6542SBram Moolenaar &rtp = save_rtp 17218a7d6542SBram Moolenaar 17228a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 17238a7d6542SBram Moolenaar unlet g:imported_rtp 17248a7d6542SBram Moolenaar 17258a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 172689483d40SBram Moolenaar delete('import', 'rf') 17278a7d6542SBram Moolenaarenddef 17288a7d6542SBram Moolenaar 172925e0f586SBram Moolenaardef Test_import_compile_error() 173025e0f586SBram Moolenaar let export_lines = [ 173125e0f586SBram Moolenaar 'vim9script', 173225e0f586SBram Moolenaar 'export def ExpFunc(): string', 173325e0f586SBram Moolenaar ' return notDefined', 173425e0f586SBram Moolenaar 'enddef', 173525e0f586SBram Moolenaar ] 173625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 173725e0f586SBram Moolenaar 173825e0f586SBram Moolenaar let import_lines = [ 173925e0f586SBram Moolenaar 'vim9script', 174025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 174125e0f586SBram Moolenaar 'def ImpFunc()', 174225e0f586SBram Moolenaar ' echo ExpFunc()', 174325e0f586SBram Moolenaar 'enddef', 174425e0f586SBram Moolenaar 'defcompile', 174525e0f586SBram Moolenaar ] 174625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 174725e0f586SBram Moolenaar 174825e0f586SBram Moolenaar try 174925e0f586SBram Moolenaar source Ximport.vim 175025e0f586SBram Moolenaar catch /E1001/ 1751f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 175225e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 175325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 175425e0f586SBram Moolenaar endtry 175525e0f586SBram Moolenaar 175625e0f586SBram Moolenaar delete('Xexported.vim') 175725e0f586SBram Moolenaar delete('Ximport.vim') 175825e0f586SBram Moolenaarenddef 175925e0f586SBram Moolenaar 1760eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1761eef2102eSBram Moolenaar let export_lines =<< trim END 1762eef2102eSBram Moolenaar vim9script 1763eef2102eSBram Moolenaar export def Func() 1764eef2102eSBram Moolenaar echo 'imported' 1765eef2102eSBram Moolenaar enddef 1766eef2102eSBram Moolenaar END 1767eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1768eef2102eSBram Moolenaar 1769eef2102eSBram Moolenaar let lines =<< trim END 1770eef2102eSBram Moolenaar vim9script 1771eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1772eef2102eSBram Moolenaar def Func() 1773eef2102eSBram Moolenaar echo 'local to function' 1774eef2102eSBram Moolenaar enddef 1775eef2102eSBram Moolenaar END 1776eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1777eef2102eSBram Moolenaar 1778eef2102eSBram Moolenaar lines =<< trim END 1779eef2102eSBram Moolenaar vim9script 1780eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1781eef2102eSBram Moolenaar def Outer() 1782eef2102eSBram Moolenaar def Func() 1783eef2102eSBram Moolenaar echo 'local to function' 1784eef2102eSBram Moolenaar enddef 1785eef2102eSBram Moolenaar enddef 1786eef2102eSBram Moolenaar defcompile 1787eef2102eSBram Moolenaar END 1788eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1789eef2102eSBram Moolenaar 1790eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1791eef2102eSBram Moolenaarenddef 1792eef2102eSBram Moolenaar 1793b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1794b9a2cac3SBram Moolenaar let lines =<< trim END 1795b9a2cac3SBram Moolenaar vim9script 1796b9a2cac3SBram Moolenaar def Func() 1797b9a2cac3SBram Moolenaar echo 'one' 1798b9a2cac3SBram Moolenaar enddef 1799b9a2cac3SBram Moolenaar def Func() 1800b9a2cac3SBram Moolenaar echo 'two' 1801b9a2cac3SBram Moolenaar enddef 1802b9a2cac3SBram Moolenaar END 1803b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1804fa211f3cSBram Moolenaar 1805fa211f3cSBram Moolenaar lines =<< trim END 1806fa211f3cSBram Moolenaar vim9script 1807fa211f3cSBram Moolenaar def Foo(): string 1808fa211f3cSBram Moolenaar return 'foo' 1809fa211f3cSBram Moolenaar enddef 1810fa211f3cSBram Moolenaar def Func() 1811fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1812fa211f3cSBram Moolenaar enddef 1813fa211f3cSBram Moolenaar defcompile 1814fa211f3cSBram Moolenaar END 1815fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1816b9a2cac3SBram Moolenaarenddef 1817b9a2cac3SBram Moolenaar 18188a7d6542SBram Moolenaardef Test_fixed_size_list() 1819f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 18208a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 18218a7d6542SBram Moolenaar l->remove(0) 18228a7d6542SBram Moolenaar l->add(5) 18238a7d6542SBram Moolenaar l->insert(99, 1) 18240f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18258a7d6542SBram Moolenaarenddef 18268a7d6542SBram Moolenaar 1827ae616494SBram Moolenaardef Test_no_insert_xit() 1828ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1829ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1830f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1831f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1832f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1833ae616494SBram Moolenaar 1834ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1835ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1836ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1837ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1838f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1839f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1840f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1841f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1842f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1843ae616494SBram Moolenaarenddef 1844ae616494SBram Moolenaar 1845158906cfSBram Moolenaardef IfElse(what: number): string 1846158906cfSBram Moolenaar let res = '' 1847158906cfSBram Moolenaar if what == 1 1848158906cfSBram Moolenaar res = "one" 1849158906cfSBram Moolenaar elseif what == 2 1850158906cfSBram Moolenaar res = "two" 1851a259d8d3SBram Moolenaar else 1852158906cfSBram Moolenaar res = "three" 1853a259d8d3SBram Moolenaar endif 1854158906cfSBram Moolenaar return res 1855a259d8d3SBram Moolenaarenddef 1856a259d8d3SBram Moolenaar 1857158906cfSBram Moolenaardef Test_if_elseif_else() 1858158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1859158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1860158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18610f18b6d1SBram Moolenaarenddef 18620f18b6d1SBram Moolenaar 1863e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1864e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1865e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1866e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1867e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1868585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1869e8c4abbbSBram Moolenaarenddef 1870e8c4abbbSBram Moolenaar 18716d69bf60SBram Moolenaarlet g:bool_true = v:true 18726d69bf60SBram Moolenaarlet g:bool_false = v:false 18736d69bf60SBram Moolenaar 18746d69bf60SBram Moolenaardef Test_if_const_expr() 18756d69bf60SBram Moolenaar let res = false 18766d69bf60SBram Moolenaar if true ? true : false 18776d69bf60SBram Moolenaar res = true 18786d69bf60SBram Moolenaar endif 18796d69bf60SBram Moolenaar assert_equal(true, res) 18806d69bf60SBram Moolenaar 1881585fea7bSBram Moolenaar g:glob = 2 1882585fea7bSBram Moolenaar if false 18836797966dSBram Moolenaar execute('g:glob = 3') 1884585fea7bSBram Moolenaar endif 1885585fea7bSBram Moolenaar assert_equal(2, g:glob) 1886585fea7bSBram Moolenaar if true 18876797966dSBram Moolenaar execute('g:glob = 3') 1888585fea7bSBram Moolenaar endif 1889585fea7bSBram Moolenaar assert_equal(3, g:glob) 1890585fea7bSBram Moolenaar 18916d69bf60SBram Moolenaar res = false 18926d69bf60SBram Moolenaar if g:bool_true ? true : false 18936d69bf60SBram Moolenaar res = true 18946d69bf60SBram Moolenaar endif 18956d69bf60SBram Moolenaar assert_equal(true, res) 18966d69bf60SBram Moolenaar 18976d69bf60SBram Moolenaar res = false 18986d69bf60SBram Moolenaar if true ? g:bool_true : false 18996d69bf60SBram Moolenaar res = true 19006d69bf60SBram Moolenaar endif 19016d69bf60SBram Moolenaar assert_equal(true, res) 19026d69bf60SBram Moolenaar 19036d69bf60SBram Moolenaar res = false 19046d69bf60SBram Moolenaar if true ? true : g:bool_false 19056d69bf60SBram Moolenaar res = true 19066d69bf60SBram Moolenaar endif 19076d69bf60SBram Moolenaar assert_equal(true, res) 19086d69bf60SBram Moolenaar 19096d69bf60SBram Moolenaar res = false 19106d69bf60SBram Moolenaar if true ? false : true 19116d69bf60SBram Moolenaar res = true 19126d69bf60SBram Moolenaar endif 19136d69bf60SBram Moolenaar assert_equal(false, res) 19146d69bf60SBram Moolenaar 19156d69bf60SBram Moolenaar res = false 19166d69bf60SBram Moolenaar if false ? false : true 19176d69bf60SBram Moolenaar res = true 19186d69bf60SBram Moolenaar endif 19196d69bf60SBram Moolenaar assert_equal(true, res) 19206d69bf60SBram Moolenaar 19216d69bf60SBram Moolenaar res = false 19226d69bf60SBram Moolenaar if false ? true : false 19236d69bf60SBram Moolenaar res = true 19246d69bf60SBram Moolenaar endif 19256d69bf60SBram Moolenaar assert_equal(false, res) 19266d69bf60SBram Moolenaar 19276d69bf60SBram Moolenaar res = false 1928e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1929e8c4abbbSBram Moolenaar res = true 1930e8c4abbbSBram Moolenaar endif 1931e8c4abbbSBram Moolenaar assert_equal(false, res) 1932e8c4abbbSBram Moolenaar 1933e8c4abbbSBram Moolenaar res = false 19346d69bf60SBram Moolenaar if true && true 19356d69bf60SBram Moolenaar res = true 19366d69bf60SBram Moolenaar endif 19376d69bf60SBram Moolenaar assert_equal(true, res) 19386d69bf60SBram Moolenaar 19396d69bf60SBram Moolenaar res = false 19406d69bf60SBram Moolenaar if true && false 19416d69bf60SBram Moolenaar res = true 19426d69bf60SBram Moolenaar endif 19436d69bf60SBram Moolenaar assert_equal(false, res) 19446d69bf60SBram Moolenaar 19456d69bf60SBram Moolenaar res = false 19466d69bf60SBram Moolenaar if g:bool_true && false 19476d69bf60SBram Moolenaar res = true 19486d69bf60SBram Moolenaar endif 19496d69bf60SBram Moolenaar assert_equal(false, res) 19506d69bf60SBram Moolenaar 19516d69bf60SBram Moolenaar res = false 19526d69bf60SBram Moolenaar if true && g:bool_false 19536d69bf60SBram Moolenaar res = true 19546d69bf60SBram Moolenaar endif 19556d69bf60SBram Moolenaar assert_equal(false, res) 19566d69bf60SBram Moolenaar 19576d69bf60SBram Moolenaar res = false 19586d69bf60SBram Moolenaar if false && false 19596d69bf60SBram Moolenaar res = true 19606d69bf60SBram Moolenaar endif 19616d69bf60SBram Moolenaar assert_equal(false, res) 19626d69bf60SBram Moolenaar 19636d69bf60SBram Moolenaar res = false 19646d69bf60SBram Moolenaar if true || false 19656d69bf60SBram Moolenaar res = true 19666d69bf60SBram Moolenaar endif 19676d69bf60SBram Moolenaar assert_equal(true, res) 19686d69bf60SBram Moolenaar 19696d69bf60SBram Moolenaar res = false 19706d69bf60SBram Moolenaar if g:bool_true || false 19716d69bf60SBram Moolenaar res = true 19726d69bf60SBram Moolenaar endif 19736d69bf60SBram Moolenaar assert_equal(true, res) 19746d69bf60SBram Moolenaar 19756d69bf60SBram Moolenaar res = false 19766d69bf60SBram Moolenaar if true || g:bool_false 19776d69bf60SBram Moolenaar res = true 19786d69bf60SBram Moolenaar endif 19796d69bf60SBram Moolenaar assert_equal(true, res) 19806d69bf60SBram Moolenaar 19816d69bf60SBram Moolenaar res = false 19826d69bf60SBram Moolenaar if false || false 19836d69bf60SBram Moolenaar res = true 19846d69bf60SBram Moolenaar endif 19856d69bf60SBram Moolenaar assert_equal(false, res) 198680c34ca3SBram Moolenaarenddef 19876d69bf60SBram Moolenaar 198880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 198980c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 199080c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1991e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1992e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19936d69bf60SBram Moolenaarenddef 19946d69bf60SBram Moolenaar 199572abcf42SBram Moolenaardef RunNested(i: number): number 199672abcf42SBram Moolenaar let x: number = 0 199772abcf42SBram Moolenaar if i % 2 199872abcf42SBram Moolenaar if 1 1999f5be8cdbSBram Moolenaar # comment 200072abcf42SBram Moolenaar else 2001f5be8cdbSBram Moolenaar # comment 200272abcf42SBram Moolenaar endif 200372abcf42SBram Moolenaar x += 1 200472abcf42SBram Moolenaar else 200572abcf42SBram Moolenaar x += 1000 200672abcf42SBram Moolenaar endif 200772abcf42SBram Moolenaar return x 200872abcf42SBram Moolenaarenddef 200972abcf42SBram Moolenaar 201072abcf42SBram Moolenaardef Test_nested_if() 201172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 201272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 201372abcf42SBram Moolenaarenddef 201472abcf42SBram Moolenaar 2015ad39c094SBram Moolenaardef Test_execute_cmd() 2016ad39c094SBram Moolenaar new 2017ad39c094SBram Moolenaar setline(1, 'default') 2018ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 2019ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2020a72cfb80SBram Moolenaar 2021a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 2022a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2023a72cfb80SBram Moolenaar 2024ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 2025ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 2026a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2027ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2028a72cfb80SBram Moolenaar 2029ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 2030ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2031a72cfb80SBram Moolenaar 2032ad39c094SBram Moolenaar let cmd_first = 'call ' 2033ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 2034ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2035ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2036ad39c094SBram Moolenaar bwipe! 2037585fea7bSBram Moolenaar 20382d6b20d6SBram Moolenaar let n = true 20392d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20402d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20412d6b20d6SBram Moolenaar 2042585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 2043a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 2044ad39c094SBram Moolenaarenddef 2045ad39c094SBram Moolenaar 204647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2047f5be8cdbSBram Moolenaar # only checks line continuation 204847e880d6SBram Moolenaar let lines =<< trim END 204947e880d6SBram Moolenaar vim9script 205047e880d6SBram Moolenaar execute 'g:someVar' 205147e880d6SBram Moolenaar .. ' = ' .. 205247e880d6SBram Moolenaar '28' 205347e880d6SBram Moolenaar assert_equal(28, g:someVar) 205447e880d6SBram Moolenaar unlet g:someVar 205547e880d6SBram Moolenaar END 205647e880d6SBram Moolenaar CheckScriptSuccess(lines) 205747e880d6SBram Moolenaarenddef 205847e880d6SBram Moolenaar 2059ad39c094SBram Moolenaardef Test_echo_cmd() 2060a72cfb80SBram Moolenaar echo 'some' # comment 2061585fea7bSBram Moolenaar echon 'thing' 2062ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2063ad39c094SBram Moolenaar 2064a72cfb80SBram Moolenaar echo "some" # comment 2065a72cfb80SBram Moolenaar echon "thing" 2066a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2067a72cfb80SBram Moolenaar 2068ad39c094SBram Moolenaar let str1 = 'some' 2069ad39c094SBram Moolenaar let str2 = 'more' 2070ad39c094SBram Moolenaar echo str1 str2 2071ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2072a72cfb80SBram Moolenaar 2073a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2074ad39c094SBram Moolenaarenddef 2075ad39c094SBram Moolenaar 2076f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2077f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2078f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2079f93c7feaSBram Moolenaar echo 'clear' 2080df069eecSBram Moolenaar :1messages 2081f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2082f93c7feaSBram Moolenaar 2083f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2084f93c7feaSBram Moolenaarenddef 2085f93c7feaSBram Moolenaar 208647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2087f5be8cdbSBram Moolenaar # only checks line continuation 208847e880d6SBram Moolenaar let lines =<< trim END 208947e880d6SBram Moolenaar vim9script 209047e880d6SBram Moolenaar echomsg 'here' 209147e880d6SBram Moolenaar .. ' is ' .. 209247e880d6SBram Moolenaar 'a message' 209347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 209447e880d6SBram Moolenaar END 209547e880d6SBram Moolenaar CheckScriptSuccess(lines) 209647e880d6SBram Moolenaarenddef 209747e880d6SBram Moolenaar 2098f93c7feaSBram Moolenaardef Test_echoerr_cmd() 209940ee466cSBram Moolenaar try 210040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 210140ee466cSBram Moolenaar catch 210240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 210340ee466cSBram Moolenaar endtry 2104f93c7feaSBram Moolenaarenddef 2105f93c7feaSBram Moolenaar 210647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2107f5be8cdbSBram Moolenaar # only checks line continuation 210847e880d6SBram Moolenaar let lines =<< trim END 210947e880d6SBram Moolenaar vim9script 211047e880d6SBram Moolenaar try 211147e880d6SBram Moolenaar echoerr 'this' 211247e880d6SBram Moolenaar .. ' is ' .. 211347e880d6SBram Moolenaar 'wrong' 211447e880d6SBram Moolenaar catch 211547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 211647e880d6SBram Moolenaar endtry 211747e880d6SBram Moolenaar END 211847e880d6SBram Moolenaar CheckScriptSuccess(lines) 211947e880d6SBram Moolenaarenddef 212047e880d6SBram Moolenaar 212141fe0617SBram Moolenaardef Test_for_outside_of_function() 212241fe0617SBram Moolenaar let lines =<< trim END 212341fe0617SBram Moolenaar vim9script 212441fe0617SBram Moolenaar new 212541fe0617SBram Moolenaar for var in range(0, 3) 212641fe0617SBram Moolenaar append(line('$'), var) 212741fe0617SBram Moolenaar endfor 212841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 212941fe0617SBram Moolenaar bwipe! 213041fe0617SBram Moolenaar END 213141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 213241fe0617SBram Moolenaar source Xvim9for.vim 213341fe0617SBram Moolenaar delete('Xvim9for.vim') 213441fe0617SBram Moolenaarenddef 21358a7d6542SBram Moolenaar 2136e8c4abbbSBram Moolenaardef Test_for_loop() 2137e8c4abbbSBram Moolenaar let result = '' 2138e8c4abbbSBram Moolenaar for cnt in range(7) 2139e8c4abbbSBram Moolenaar if cnt == 4 2140e8c4abbbSBram Moolenaar break 2141e8c4abbbSBram Moolenaar endif 2142e8c4abbbSBram Moolenaar if cnt == 2 2143e8c4abbbSBram Moolenaar continue 2144e8c4abbbSBram Moolenaar endif 2145e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2146e8c4abbbSBram Moolenaar endfor 2147e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21480ad3e894SBram Moolenaar 21490ad3e894SBram Moolenaar let concat = '' 21500ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21510ad3e894SBram Moolenaar concat ..= str 21520ad3e894SBram Moolenaar endfor 21530ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2154e8c4abbbSBram Moolenaarenddef 2155e8c4abbbSBram Moolenaar 2156e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2157675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2158675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2159675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2160822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21610ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2162675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2163675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2164675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2165e8c4abbbSBram Moolenaarenddef 2166e8c4abbbSBram Moolenaar 2167d0df1aacSBram Moolenaardef Test_while_loop() 2168d0df1aacSBram Moolenaar let result = '' 2169d0df1aacSBram Moolenaar let cnt = 0 2170d0df1aacSBram Moolenaar while cnt < 555 2171d0df1aacSBram Moolenaar if cnt == 3 2172d0df1aacSBram Moolenaar break 2173d0df1aacSBram Moolenaar endif 2174d0df1aacSBram Moolenaar cnt += 1 2175d0df1aacSBram Moolenaar if cnt == 2 2176d0df1aacSBram Moolenaar continue 2177d0df1aacSBram Moolenaar endif 2178d0df1aacSBram Moolenaar result ..= cnt .. '_' 2179d0df1aacSBram Moolenaar endwhile 2180d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2181d0df1aacSBram Moolenaarenddef 2182d0df1aacSBram Moolenaar 2183e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2184675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2185675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2186675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2187675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2188675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2189675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2190675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2191bd5da371SBram Moolenaarenddef 2192bd5da371SBram Moolenaar 21939645e2d9SBram Moolenaardef Test_interrupt_loop() 219497acfc78SBram Moolenaar let caught = false 21959645e2d9SBram Moolenaar let x = 0 219697acfc78SBram Moolenaar try 21979645e2d9SBram Moolenaar while 1 21989645e2d9SBram Moolenaar x += 1 21999645e2d9SBram Moolenaar if x == 100 22009645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22019645e2d9SBram Moolenaar endif 22029645e2d9SBram Moolenaar endwhile 220397acfc78SBram Moolenaar catch 220497acfc78SBram Moolenaar caught = true 220597acfc78SBram Moolenaar assert_equal(100, x) 220697acfc78SBram Moolenaar endtry 220797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 22089645e2d9SBram Moolenaarenddef 220920431c9dSBram Moolenaar 22104fdae999SBram Moolenaardef Test_automatic_line_continuation() 22114fdae999SBram Moolenaar let mylist = [ 22124fdae999SBram Moolenaar 'one', 22134fdae999SBram Moolenaar 'two', 22144fdae999SBram Moolenaar 'three', 2215f5be8cdbSBram Moolenaar ] # comment 22164fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22174fdae999SBram Moolenaar 22184fdae999SBram Moolenaar let mydict = { 22194fdae999SBram Moolenaar 'one': 1, 22204fdae999SBram Moolenaar 'two': 2, 22214fdae999SBram Moolenaar 'three': 22224fdae999SBram Moolenaar 3, 2223f5be8cdbSBram Moolenaar } # comment 22244fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 22254fdae999SBram Moolenaar mydict = #{ 22262c330432SBram Moolenaar one: 1, # comment 22272c330432SBram Moolenaar two: # comment 22282c330432SBram Moolenaar 2, # comment 22292c330432SBram Moolenaar three: 3 # comment 22302c330432SBram Moolenaar } 22312c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 22322c330432SBram Moolenaar mydict = #{ 22332c330432SBram Moolenaar one: 1, 22344fdae999SBram Moolenaar two: 22354fdae999SBram Moolenaar 2, 22362c330432SBram Moolenaar three: 3 22374fdae999SBram Moolenaar } 22384fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2239e6085c53SBram Moolenaar 2240e6085c53SBram Moolenaar assert_equal( 2241e6085c53SBram Moolenaar ['one', 'two', 'three'], 2242e6085c53SBram Moolenaar split('one two three') 2243e6085c53SBram Moolenaar ) 22444fdae999SBram Moolenaarenddef 22454fdae999SBram Moolenaar 22467a092245SBram Moolenaardef Test_vim9_comment() 22477a092245SBram Moolenaar CheckScriptSuccess([ 22487a092245SBram Moolenaar 'vim9script', 22497a092245SBram Moolenaar '# something', 22507a092245SBram Moolenaar ]) 22517a092245SBram Moolenaar CheckScriptFailure([ 22527a092245SBram Moolenaar 'vim9script', 22537a092245SBram Moolenaar ':# something', 22547a092245SBram Moolenaar ], 'E488:') 22557a092245SBram Moolenaar CheckScriptFailure([ 22567a092245SBram Moolenaar '# something', 22577a092245SBram Moolenaar ], 'E488:') 22587a092245SBram Moolenaar CheckScriptFailure([ 22597a092245SBram Moolenaar ':# something', 22607a092245SBram Moolenaar ], 'E488:') 22617a092245SBram Moolenaar 22624a8d9f2eSBram Moolenaar { # block start 22634a8d9f2eSBram Moolenaar } # block end 22644a8d9f2eSBram Moolenaar CheckDefFailure([ 22654a8d9f2eSBram Moolenaar '{# comment', 22664a8d9f2eSBram Moolenaar ], 'E488:') 22674a8d9f2eSBram Moolenaar CheckDefFailure([ 22684a8d9f2eSBram Moolenaar '{', 22694a8d9f2eSBram Moolenaar '}# comment', 22704a8d9f2eSBram Moolenaar ], 'E488:') 22714a8d9f2eSBram Moolenaar 22724a8d9f2eSBram Moolenaar echo "yes" # comment 22734a8d9f2eSBram Moolenaar CheckDefFailure([ 22744a8d9f2eSBram Moolenaar 'echo "yes"# comment', 22754a8d9f2eSBram Moolenaar ], 'E488:') 22767a092245SBram Moolenaar CheckScriptSuccess([ 22777a092245SBram Moolenaar 'vim9script', 22787a092245SBram Moolenaar 'echo "yes" # something', 22797a092245SBram Moolenaar ]) 22807a092245SBram Moolenaar CheckScriptFailure([ 22817a092245SBram Moolenaar 'vim9script', 22827a092245SBram Moolenaar 'echo "yes"# something', 22837a092245SBram Moolenaar ], 'E121:') 22847a092245SBram Moolenaar CheckScriptFailure([ 22857a092245SBram Moolenaar 'vim9script', 22867a092245SBram Moolenaar 'echo# something', 22877a092245SBram Moolenaar ], 'E121:') 22887a092245SBram Moolenaar CheckScriptFailure([ 22897a092245SBram Moolenaar 'echo "yes" # something', 22907a092245SBram Moolenaar ], 'E121:') 22917a092245SBram Moolenaar 22924a8d9f2eSBram Moolenaar exe "echo" # comment 22934a8d9f2eSBram Moolenaar CheckDefFailure([ 22944a8d9f2eSBram Moolenaar 'exe "echo"# comment', 22954a8d9f2eSBram Moolenaar ], 'E488:') 22964a8d9f2eSBram Moolenaar CheckScriptSuccess([ 22974a8d9f2eSBram Moolenaar 'vim9script', 22984a8d9f2eSBram Moolenaar 'exe "echo" # something', 22994a8d9f2eSBram Moolenaar ]) 23004a8d9f2eSBram Moolenaar CheckScriptFailure([ 23014a8d9f2eSBram Moolenaar 'vim9script', 23024a8d9f2eSBram Moolenaar 'exe "echo"# something', 23034a8d9f2eSBram Moolenaar ], 'E121:') 23044a8d9f2eSBram Moolenaar CheckDefFailure([ 23054a8d9f2eSBram Moolenaar 'exe # comment', 23064a8d9f2eSBram Moolenaar ], 'E1015:') 23074a8d9f2eSBram Moolenaar CheckScriptFailure([ 23084a8d9f2eSBram Moolenaar 'vim9script', 23094a8d9f2eSBram Moolenaar 'exe# something', 23104a8d9f2eSBram Moolenaar ], 'E121:') 23114a8d9f2eSBram Moolenaar CheckScriptFailure([ 23124a8d9f2eSBram Moolenaar 'exe "echo" # something', 23134a8d9f2eSBram Moolenaar ], 'E121:') 23144a8d9f2eSBram Moolenaar 23157a092245SBram Moolenaar CheckDefFailure([ 23167a092245SBram Moolenaar 'try# comment', 23177a092245SBram Moolenaar ' echo "yes"', 23187a092245SBram Moolenaar 'catch', 23197a092245SBram Moolenaar 'endtry', 23207a092245SBram Moolenaar ], 'E488:') 23212c5ed4e3SBram Moolenaar CheckScriptFailure([ 23222c5ed4e3SBram Moolenaar 'vim9script', 23232c5ed4e3SBram Moolenaar 'try# comment', 23242c5ed4e3SBram Moolenaar 'echo "yes"', 23252c5ed4e3SBram Moolenaar ], 'E488:') 23267a092245SBram Moolenaar CheckDefFailure([ 23277a092245SBram Moolenaar 'try', 2328a72cfb80SBram Moolenaar ' throw#comment', 2329a72cfb80SBram Moolenaar 'catch', 2330a72cfb80SBram Moolenaar 'endtry', 2331a72cfb80SBram Moolenaar ], 'E1015:') 2332a72cfb80SBram Moolenaar CheckDefFailure([ 2333a72cfb80SBram Moolenaar 'try', 2334a72cfb80SBram Moolenaar ' throw "yes"#comment', 2335a72cfb80SBram Moolenaar 'catch', 2336a72cfb80SBram Moolenaar 'endtry', 2337a72cfb80SBram Moolenaar ], 'E488:') 2338a72cfb80SBram Moolenaar CheckDefFailure([ 2339a72cfb80SBram Moolenaar 'try', 23407a092245SBram Moolenaar ' echo "yes"', 23417a092245SBram Moolenaar 'catch# comment', 23427a092245SBram Moolenaar 'endtry', 23437a092245SBram Moolenaar ], 'E488:') 23442c5ed4e3SBram Moolenaar CheckScriptFailure([ 23452c5ed4e3SBram Moolenaar 'vim9script', 23462c5ed4e3SBram Moolenaar 'try', 23472c5ed4e3SBram Moolenaar ' echo "yes"', 23482c5ed4e3SBram Moolenaar 'catch# comment', 23492c5ed4e3SBram Moolenaar 'endtry', 23502c5ed4e3SBram Moolenaar ], 'E654:') 23512c5ed4e3SBram Moolenaar CheckDefFailure([ 23522c5ed4e3SBram Moolenaar 'try', 23532c5ed4e3SBram Moolenaar ' echo "yes"', 23542c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23552c5ed4e3SBram Moolenaar 'endtry', 23562c5ed4e3SBram Moolenaar ], 'E488:') 23577a092245SBram Moolenaar CheckDefFailure([ 23587a092245SBram Moolenaar 'try', 23597a092245SBram Moolenaar 'echo "yes"', 23607a092245SBram Moolenaar 'catch', 23617a092245SBram Moolenaar 'endtry# comment', 23627a092245SBram Moolenaar ], 'E488:') 23632c5ed4e3SBram Moolenaar CheckScriptFailure([ 23642c5ed4e3SBram Moolenaar 'vim9script', 23652c5ed4e3SBram Moolenaar 'try', 23662c5ed4e3SBram Moolenaar ' echo "yes"', 23672c5ed4e3SBram Moolenaar 'catch', 23682c5ed4e3SBram Moolenaar 'endtry# comment', 23699b7bf9e9SBram Moolenaar ], 'E488:') 23702c5ed4e3SBram Moolenaar 23712c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23722c5ed4e3SBram Moolenaar 'vim9script', 23732c5ed4e3SBram Moolenaar 'hi # comment', 23742c5ed4e3SBram Moolenaar ]) 23752c5ed4e3SBram Moolenaar CheckScriptFailure([ 23762c5ed4e3SBram Moolenaar 'vim9script', 23772c5ed4e3SBram Moolenaar 'hi# comment', 23782c5ed4e3SBram Moolenaar ], 'E416:') 23791966c248SBram Moolenaar CheckScriptSuccess([ 23801966c248SBram Moolenaar 'vim9script', 23811966c248SBram Moolenaar 'hi Search # comment', 23821966c248SBram Moolenaar ]) 23831966c248SBram Moolenaar CheckScriptFailure([ 23841966c248SBram Moolenaar 'vim9script', 23851966c248SBram Moolenaar 'hi Search# comment', 23861966c248SBram Moolenaar ], 'E416:') 23871966c248SBram Moolenaar CheckScriptSuccess([ 23881966c248SBram Moolenaar 'vim9script', 23891966c248SBram Moolenaar 'hi link This Search # comment', 23901966c248SBram Moolenaar ]) 23911966c248SBram Moolenaar CheckScriptFailure([ 23921966c248SBram Moolenaar 'vim9script', 23931966c248SBram Moolenaar 'hi link This That# comment', 23941966c248SBram Moolenaar ], 'E413:') 23951966c248SBram Moolenaar CheckScriptSuccess([ 23961966c248SBram Moolenaar 'vim9script', 23971966c248SBram Moolenaar 'hi clear This # comment', 23981966c248SBram Moolenaar 'hi clear # comment', 23991966c248SBram Moolenaar ]) 2400f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2401f5be8cdbSBram Moolenaar # hi clear This# comment', 24021966c248SBram Moolenaar CheckScriptFailure([ 24031966c248SBram Moolenaar 'vim9script', 24041966c248SBram Moolenaar 'hi clear# comment', 24051966c248SBram Moolenaar ], 'E416:') 24061966c248SBram Moolenaar 24071966c248SBram Moolenaar CheckScriptSuccess([ 24081966c248SBram Moolenaar 'vim9script', 24091966c248SBram Moolenaar 'hi Group term=bold', 24101966c248SBram Moolenaar 'match Group /todo/ # comment', 24111966c248SBram Moolenaar ]) 24121966c248SBram Moolenaar CheckScriptFailure([ 24131966c248SBram Moolenaar 'vim9script', 24141966c248SBram Moolenaar 'hi Group term=bold', 24151966c248SBram Moolenaar 'match Group /todo/# comment', 24161966c248SBram Moolenaar ], 'E488:') 24171966c248SBram Moolenaar CheckScriptSuccess([ 24181966c248SBram Moolenaar 'vim9script', 24191966c248SBram Moolenaar 'match # comment', 24201966c248SBram Moolenaar ]) 24211966c248SBram Moolenaar CheckScriptFailure([ 24221966c248SBram Moolenaar 'vim9script', 24231966c248SBram Moolenaar 'match# comment', 24241966c248SBram Moolenaar ], 'E475:') 24251966c248SBram Moolenaar CheckScriptSuccess([ 24261966c248SBram Moolenaar 'vim9script', 24271966c248SBram Moolenaar 'match none # comment', 24281966c248SBram Moolenaar ]) 24291966c248SBram Moolenaar CheckScriptFailure([ 24301966c248SBram Moolenaar 'vim9script', 24311966c248SBram Moolenaar 'match none# comment', 24321966c248SBram Moolenaar ], 'E475:') 24331966c248SBram Moolenaar 24341966c248SBram Moolenaar CheckScriptSuccess([ 24351966c248SBram Moolenaar 'vim9script', 24361966c248SBram Moolenaar 'menutrans clear # comment', 24371966c248SBram Moolenaar ]) 24381966c248SBram Moolenaar CheckScriptFailure([ 24391966c248SBram Moolenaar 'vim9script', 24401966c248SBram Moolenaar 'menutrans clear# comment text', 24411966c248SBram Moolenaar ], 'E474:') 24421966c248SBram Moolenaar 24431966c248SBram Moolenaar CheckScriptSuccess([ 24441966c248SBram Moolenaar 'vim9script', 24451966c248SBram Moolenaar 'syntax clear # comment', 24461966c248SBram Moolenaar ]) 24471966c248SBram Moolenaar CheckScriptFailure([ 24481966c248SBram Moolenaar 'vim9script', 24491966c248SBram Moolenaar 'syntax clear# comment text', 24501966c248SBram Moolenaar ], 'E28:') 24511966c248SBram Moolenaar CheckScriptSuccess([ 24521966c248SBram Moolenaar 'vim9script', 24531966c248SBram Moolenaar 'syntax keyword Word some', 24541966c248SBram Moolenaar 'syntax clear Word # comment', 24551966c248SBram Moolenaar ]) 24561966c248SBram Moolenaar CheckScriptFailure([ 24571966c248SBram Moolenaar 'vim9script', 24581966c248SBram Moolenaar 'syntax keyword Word some', 24591966c248SBram Moolenaar 'syntax clear Word# comment text', 24601966c248SBram Moolenaar ], 'E28:') 24611966c248SBram Moolenaar 24621966c248SBram Moolenaar CheckScriptSuccess([ 24631966c248SBram Moolenaar 'vim9script', 24641966c248SBram Moolenaar 'syntax list # comment', 24651966c248SBram Moolenaar ]) 24661966c248SBram Moolenaar CheckScriptFailure([ 24671966c248SBram Moolenaar 'vim9script', 24681966c248SBram Moolenaar 'syntax list# comment text', 24691966c248SBram Moolenaar ], 'E28:') 24701966c248SBram Moolenaar 24711966c248SBram Moolenaar CheckScriptSuccess([ 24721966c248SBram Moolenaar 'vim9script', 24731966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24741966c248SBram Moolenaar ]) 24751966c248SBram Moolenaar CheckScriptFailure([ 24761966c248SBram Moolenaar 'vim9script', 24771966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 24781966c248SBram Moolenaar ], 'E475:') 24791966c248SBram Moolenaar 24801966c248SBram Moolenaar CheckScriptSuccess([ 24811966c248SBram Moolenaar 'vim9script', 24821966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 24831966c248SBram Moolenaar ]) 24841966c248SBram Moolenaar CheckScriptFailure([ 24851966c248SBram Moolenaar 'vim9script', 24861966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 24871966c248SBram Moolenaar ], 'E789:') 24881966c248SBram Moolenaar 24891966c248SBram Moolenaar CheckScriptSuccess([ 24901966c248SBram Moolenaar 'vim9script', 24911966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 24921966c248SBram Moolenaar ]) 24931966c248SBram Moolenaar CheckScriptFailure([ 24941966c248SBram Moolenaar 'vim9script', 24951966c248SBram Moolenaar 'syntax match Word /pat/# comment', 24961966c248SBram Moolenaar ], 'E402:') 24971966c248SBram Moolenaar 24981966c248SBram Moolenaar CheckScriptSuccess([ 24991966c248SBram Moolenaar 'vim9script', 25001966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25011966c248SBram Moolenaar ]) 25021966c248SBram Moolenaar CheckScriptFailure([ 25031966c248SBram Moolenaar 'vim9script', 25041966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25051966c248SBram Moolenaar ], 'E475:') 25061966c248SBram Moolenaar CheckScriptFailure([ 25071966c248SBram Moolenaar 'vim9script', 25081966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25091966c248SBram Moolenaar ], 'E406:') 25101966c248SBram Moolenaar CheckScriptFailure([ 25111966c248SBram Moolenaar 'vim9script', 25121966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25131966c248SBram Moolenaar ], 'E475:') 25141966c248SBram Moolenaar 25151966c248SBram Moolenaar CheckScriptSuccess([ 25161966c248SBram Moolenaar 'vim9script', 25171966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25181966c248SBram Moolenaar ]) 25191966c248SBram Moolenaar CheckScriptFailure([ 25201966c248SBram Moolenaar 'vim9script', 25211966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2522d032f34aSBram Moolenaar ], 'E402:') 25231966c248SBram Moolenaar 25241966c248SBram Moolenaar CheckScriptSuccess([ 25251966c248SBram Moolenaar 'vim9script', 25261966c248SBram Moolenaar 'syntax sync # comment', 25271966c248SBram Moolenaar ]) 25281966c248SBram Moolenaar CheckScriptFailure([ 25291966c248SBram Moolenaar 'vim9script', 25301966c248SBram Moolenaar 'syntax sync# comment', 25311966c248SBram Moolenaar ], 'E404:') 25321966c248SBram Moolenaar CheckScriptSuccess([ 25331966c248SBram Moolenaar 'vim9script', 25341966c248SBram Moolenaar 'syntax sync ccomment # comment', 25351966c248SBram Moolenaar ]) 25361966c248SBram Moolenaar CheckScriptFailure([ 25371966c248SBram Moolenaar 'vim9script', 25381966c248SBram Moolenaar 'syntax sync ccomment# comment', 25391966c248SBram Moolenaar ], 'E404:') 25401966c248SBram Moolenaar 25411966c248SBram Moolenaar CheckScriptSuccess([ 25421966c248SBram Moolenaar 'vim9script', 25431966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25441966c248SBram Moolenaar ]) 25451966c248SBram Moolenaar CheckScriptFailure([ 25461966c248SBram Moolenaar 'vim9script', 25471966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25481966c248SBram Moolenaar ], 'E475:') 2549a72cfb80SBram Moolenaar 2550a72cfb80SBram Moolenaar CheckScriptSuccess([ 2551a72cfb80SBram Moolenaar 'vim9script', 2552a72cfb80SBram Moolenaar 'command Echo echo # comment', 2553a72cfb80SBram Moolenaar 'command Echo # comment', 2554a72cfb80SBram Moolenaar ]) 2555a72cfb80SBram Moolenaar CheckScriptFailure([ 2556a72cfb80SBram Moolenaar 'vim9script', 2557a72cfb80SBram Moolenaar 'command Echo echo# comment', 2558a72cfb80SBram Moolenaar 'Echo', 2559a72cfb80SBram Moolenaar ], 'E121:') 2560a72cfb80SBram Moolenaar CheckScriptFailure([ 2561a72cfb80SBram Moolenaar 'vim9script', 2562a72cfb80SBram Moolenaar 'command Echo# comment', 2563a72cfb80SBram Moolenaar ], 'E182:') 2564a72cfb80SBram Moolenaar CheckScriptFailure([ 2565a72cfb80SBram Moolenaar 'vim9script', 2566a72cfb80SBram Moolenaar 'command Echo echo', 2567a72cfb80SBram Moolenaar 'command Echo# comment', 2568a72cfb80SBram Moolenaar ], 'E182:') 2569a72cfb80SBram Moolenaar 2570a72cfb80SBram Moolenaar CheckScriptSuccess([ 2571a72cfb80SBram Moolenaar 'vim9script', 2572a72cfb80SBram Moolenaar 'function # comment', 2573a72cfb80SBram Moolenaar ]) 2574a72cfb80SBram Moolenaar CheckScriptFailure([ 2575a72cfb80SBram Moolenaar 'vim9script', 25769898107fSBram Moolenaar 'function " comment', 25779898107fSBram Moolenaar ], 'E129:') 25789898107fSBram Moolenaar CheckScriptFailure([ 25799898107fSBram Moolenaar 'vim9script', 2580a72cfb80SBram Moolenaar 'function# comment', 2581a72cfb80SBram Moolenaar ], 'E129:') 2582a72cfb80SBram Moolenaar CheckScriptSuccess([ 2583a72cfb80SBram Moolenaar 'vim9script', 2584a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2585a72cfb80SBram Moolenaar ]) 2586a72cfb80SBram Moolenaar CheckScriptFailure([ 2587a72cfb80SBram Moolenaar 'vim9script', 2588a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2589a72cfb80SBram Moolenaar ], 'E488:') 2590a72cfb80SBram Moolenaar 2591a72cfb80SBram Moolenaar CheckScriptSuccess([ 2592a72cfb80SBram Moolenaar 'vim9script', 25934c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2594a72cfb80SBram Moolenaar 'endfunc', 25954c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2596a72cfb80SBram Moolenaar ]) 2597a72cfb80SBram Moolenaar CheckScriptFailure([ 2598a72cfb80SBram Moolenaar 'vim9script', 25994c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2600a72cfb80SBram Moolenaar 'endfunc', 26014c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2602a72cfb80SBram Moolenaar ], 'E488:') 2603a72cfb80SBram Moolenaar 2604a72cfb80SBram Moolenaar CheckScriptSuccess([ 2605a72cfb80SBram Moolenaar 'vim9script', 2606a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2607a72cfb80SBram Moolenaar ]) 2608a72cfb80SBram Moolenaar CheckScriptFailure([ 2609a72cfb80SBram Moolenaar 'vim9script', 2610a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2611a72cfb80SBram Moolenaar ], 'E488:') 2612e7e4838fSBram Moolenaar 2613e7e4838fSBram Moolenaar CheckScriptFailure([ 2614e7e4838fSBram Moolenaar 'def Test() " comment', 2615e7e4838fSBram Moolenaar 'enddef', 2616e7e4838fSBram Moolenaar ], 'E488:') 2617e7e4838fSBram Moolenaar CheckScriptFailure([ 2618e7e4838fSBram Moolenaar 'vim9script', 2619e7e4838fSBram Moolenaar 'def Test() " comment', 2620e7e4838fSBram Moolenaar 'enddef', 2621e7e4838fSBram Moolenaar ], 'E488:') 2622e7e4838fSBram Moolenaar 2623e7e4838fSBram Moolenaar CheckScriptSuccess([ 2624e7e4838fSBram Moolenaar 'func Test() " comment', 2625e7e4838fSBram Moolenaar 'endfunc', 2626e7e4838fSBram Moolenaar ]) 26279898107fSBram Moolenaar CheckScriptSuccess([ 2628e7e4838fSBram Moolenaar 'vim9script', 2629e7e4838fSBram Moolenaar 'func Test() " comment', 2630e7e4838fSBram Moolenaar 'endfunc', 26319898107fSBram Moolenaar ]) 2632e7e4838fSBram Moolenaar 2633e7e4838fSBram Moolenaar CheckScriptSuccess([ 2634e7e4838fSBram Moolenaar 'def Test() # comment', 2635e7e4838fSBram Moolenaar 'enddef', 2636e7e4838fSBram Moolenaar ]) 2637e7e4838fSBram Moolenaar CheckScriptFailure([ 2638e7e4838fSBram Moolenaar 'func Test() # comment', 2639e7e4838fSBram Moolenaar 'endfunc', 2640e7e4838fSBram Moolenaar ], 'E488:') 26412c5ed4e3SBram Moolenaarenddef 26422c5ed4e3SBram Moolenaar 26432c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 26442c5ed4e3SBram Moolenaar CheckCanRunGui 26452c5ed4e3SBram Moolenaar 26462c5ed4e3SBram Moolenaar CheckScriptFailure([ 26472c5ed4e3SBram Moolenaar 'vim9script', 26482c5ed4e3SBram Moolenaar 'gui#comment' 26492c5ed4e3SBram Moolenaar ], 'E499:') 26502c5ed4e3SBram Moolenaar CheckScriptFailure([ 26512c5ed4e3SBram Moolenaar 'vim9script', 26522c5ed4e3SBram Moolenaar 'gui -f#comment' 26532c5ed4e3SBram Moolenaar ], 'E499:') 26547a092245SBram Moolenaarenddef 26557a092245SBram Moolenaar 2656a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 26576797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 26586797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2659a26b9700SBram Moolenaar 2660a26b9700SBram Moolenaar edit test.vim 2661a26b9700SBram Moolenaar doautocmd TabEnter #comment 2662a26b9700SBram Moolenaar assert_equal(1, g:entered) 2663a26b9700SBram Moolenaar 2664a26b9700SBram Moolenaar doautocmd TabEnter f.x 2665a26b9700SBram Moolenaar assert_equal(2, g:entered) 2666a26b9700SBram Moolenaar 2667a26b9700SBram Moolenaar g:entered = 0 2668a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2669a26b9700SBram Moolenaar assert_equal(2, g:entered) 2670a26b9700SBram Moolenaar 2671a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2672a26b9700SBram Moolenaar 2673a26b9700SBram Moolenaar au! TabEnter 2674a26b9700SBram Moolenaar unlet g:entered 2675d72c1bf0SBram Moolenaar 2676d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2677d72c1bf0SBram Moolenaar 'vim9script', 26786797966dSBram Moolenaar 'g:var = 123', 2679e55b1c09SBram Moolenaar 'b:var = 456', 2680e55b1c09SBram Moolenaar 'w:var = 777', 2681e55b1c09SBram Moolenaar 't:var = 888', 2682d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2683d72c1bf0SBram Moolenaar ]) 2684d72c1bf0SBram Moolenaar 2685d72c1bf0SBram Moolenaar CheckScriptFailure([ 2686d72c1bf0SBram Moolenaar 'vim9script', 2687d72c1bf0SBram Moolenaar 'let g:var = 123', 2688e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2689e55b1c09SBram Moolenaar 2690e55b1c09SBram Moolenaar CheckScriptFailure([ 2691e55b1c09SBram Moolenaar 'vim9script', 2692e55b1c09SBram Moolenaar 'let b:var = 123', 2693e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2694e55b1c09SBram Moolenaar 2695e55b1c09SBram Moolenaar CheckScriptFailure([ 2696e55b1c09SBram Moolenaar 'vim9script', 2697e55b1c09SBram Moolenaar 'let w:var = 123', 2698e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2699e55b1c09SBram Moolenaar 2700e55b1c09SBram Moolenaar CheckScriptFailure([ 2701e55b1c09SBram Moolenaar 'vim9script', 2702e55b1c09SBram Moolenaar 'let t:var = 123', 2703e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2704e55b1c09SBram Moolenaar 2705e55b1c09SBram Moolenaar CheckScriptFailure([ 2706e55b1c09SBram Moolenaar 'vim9script', 2707e55b1c09SBram Moolenaar 'let v:version = 123', 2708e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2709e55b1c09SBram Moolenaar 2710e55b1c09SBram Moolenaar CheckScriptFailure([ 2711e55b1c09SBram Moolenaar 'vim9script', 2712e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2713e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 27146797966dSBram Moolenaar 27156797966dSBram Moolenaar CheckScriptFailure([ 27166797966dSBram Moolenaar 'vim9script', 27176797966dSBram Moolenaar 'g:var = 123', 271832e35117SBram Moolenaar 'unlet g:var# comment1', 2719d72c1bf0SBram Moolenaar ], 'E108:') 2720d72c1bf0SBram Moolenaar 2721d72c1bf0SBram Moolenaar CheckScriptFailure([ 2722d72c1bf0SBram Moolenaar 'let g:var = 123', 2723d72c1bf0SBram Moolenaar 'unlet g:var # something', 2724d72c1bf0SBram Moolenaar ], 'E488:') 2725faac4104SBram Moolenaar 2726faac4104SBram Moolenaar CheckScriptSuccess([ 2727faac4104SBram Moolenaar 'vim9script', 272832e35117SBram Moolenaar 'if 1 # comment2', 2729faac4104SBram Moolenaar ' echo "yes"', 2730faac4104SBram Moolenaar 'elseif 2 #comment', 2731faac4104SBram Moolenaar ' echo "no"', 2732faac4104SBram Moolenaar 'endif', 2733faac4104SBram Moolenaar ]) 2734faac4104SBram Moolenaar 2735faac4104SBram Moolenaar CheckScriptFailure([ 2736faac4104SBram Moolenaar 'vim9script', 273732e35117SBram Moolenaar 'if 1# comment3', 2738faac4104SBram Moolenaar ' echo "yes"', 2739faac4104SBram Moolenaar 'endif', 2740faac4104SBram Moolenaar ], 'E15:') 2741faac4104SBram Moolenaar 2742faac4104SBram Moolenaar CheckScriptFailure([ 2743faac4104SBram Moolenaar 'vim9script', 274432e35117SBram Moolenaar 'if 0 # comment4', 2745faac4104SBram Moolenaar ' echo "yes"', 2746faac4104SBram Moolenaar 'elseif 2#comment', 2747faac4104SBram Moolenaar ' echo "no"', 2748faac4104SBram Moolenaar 'endif', 2749faac4104SBram Moolenaar ], 'E15:') 2750faac4104SBram Moolenaar 2751faac4104SBram Moolenaar CheckScriptSuccess([ 2752faac4104SBram Moolenaar 'vim9script', 275332e35117SBram Moolenaar 'let v = 1 # comment5', 2754faac4104SBram Moolenaar ]) 2755faac4104SBram Moolenaar 2756faac4104SBram Moolenaar CheckScriptFailure([ 2757faac4104SBram Moolenaar 'vim9script', 275832e35117SBram Moolenaar 'let v = 1# comment6', 275932e35117SBram Moolenaar ], 'E15:') 2760faac4104SBram Moolenaar 2761faac4104SBram Moolenaar CheckScriptSuccess([ 2762faac4104SBram Moolenaar 'vim9script', 2763faac4104SBram Moolenaar 'new' 2764faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2765df069eecSBram Moolenaar ':$', 2766faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2767faac4104SBram Moolenaar 'bwipe!', 2768faac4104SBram Moolenaar ]) 2769faac4104SBram Moolenaar 2770f5be8cdbSBram Moolenaar CheckScriptFailure([ 2771f5be8cdbSBram Moolenaar 'vim9script', 2772f5be8cdbSBram Moolenaar 'new' 2773f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2774f5be8cdbSBram Moolenaar ':$', 2775f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2776f5be8cdbSBram Moolenaar 'bwipe!', 2777f5be8cdbSBram Moolenaar ], 'E488:') 2778f5be8cdbSBram Moolenaar 2779f5be8cdbSBram Moolenaar CheckScriptFailure([ 2780f5be8cdbSBram Moolenaar 'vim9script', 2781f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2782f5be8cdbSBram Moolenaar ], 'E477:') 2783a26b9700SBram Moolenaarenddef 2784a26b9700SBram Moolenaar 27857e5bd91dSBram Moolenaardef Test_finish() 27867e5bd91dSBram Moolenaar let lines =<< trim END 27877e5bd91dSBram Moolenaar vim9script 27886797966dSBram Moolenaar g:res = 'one' 27897e5bd91dSBram Moolenaar if v:false | finish | endif 27906797966dSBram Moolenaar g:res = 'two' 27917e5bd91dSBram Moolenaar finish 27926797966dSBram Moolenaar g:res = 'three' 27937e5bd91dSBram Moolenaar END 27947e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27957e5bd91dSBram Moolenaar source Xfinished 27967e5bd91dSBram Moolenaar assert_equal('two', g:res) 27977e5bd91dSBram Moolenaar 27987e5bd91dSBram Moolenaar unlet g:res 27997e5bd91dSBram Moolenaar delete('Xfinished') 28007e5bd91dSBram Moolenaarenddef 28017e5bd91dSBram Moolenaar 280232e35117SBram Moolenaardef Test_let_func_call() 280332e35117SBram Moolenaar let lines =<< trim END 280432e35117SBram Moolenaar vim9script 280532e35117SBram Moolenaar func GetValue() 280632e35117SBram Moolenaar if exists('g:count') 280732e35117SBram Moolenaar let g:count += 1 280832e35117SBram Moolenaar else 280932e35117SBram Moolenaar let g:count = 1 281032e35117SBram Moolenaar endif 281132e35117SBram Moolenaar return 'this' 281232e35117SBram Moolenaar endfunc 281332e35117SBram Moolenaar let val: string = GetValue() 2814f5be8cdbSBram Moolenaar # env var is always a string 2815df671b46SBram Moolenaar let env = $TERM 281632e35117SBram Moolenaar END 281732e35117SBram Moolenaar writefile(lines, 'Xfinished') 281832e35117SBram Moolenaar source Xfinished 2819f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 282032e35117SBram Moolenaar assert_equal(1, g:count) 282132e35117SBram Moolenaar 282232e35117SBram Moolenaar unlet g:count 282332e35117SBram Moolenaar delete('Xfinished') 282432e35117SBram Moolenaarenddef 282532e35117SBram Moolenaar 282632e35117SBram Moolenaardef Test_let_missing_type() 282732e35117SBram Moolenaar let lines =<< trim END 282832e35117SBram Moolenaar vim9script 2829df671b46SBram Moolenaar let var = g:unknown 2830227a69deSBram Moolenaar END 2831822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2832227a69deSBram Moolenaar 2833227a69deSBram Moolenaar lines =<< trim END 2834227a69deSBram Moolenaar vim9script 2835227a69deSBram Moolenaar let nr: number = 123 2836227a69deSBram Moolenaar let var = nr 2837227a69deSBram Moolenaar END 2838822ba247SBram Moolenaar CheckScriptSuccess(lines) 283932e35117SBram Moolenaarenddef 284032e35117SBram Moolenaar 2841c82a5b5dSBram Moolenaardef Test_let_declaration() 2842c82a5b5dSBram Moolenaar let lines =<< trim END 2843c82a5b5dSBram Moolenaar vim9script 2844c82a5b5dSBram Moolenaar let var: string 2845c82a5b5dSBram Moolenaar g:var_uninit = var 2846c82a5b5dSBram Moolenaar var = 'text' 2847c82a5b5dSBram Moolenaar g:var_test = var 2848f5be8cdbSBram Moolenaar # prefixing s: is optional 2849984dddbeSBram Moolenaar s:var = 'prefixed' 2850984dddbeSBram Moolenaar g:var_prefixed = s:var 2851984dddbeSBram Moolenaar 2852984dddbeSBram Moolenaar let s:other: number 2853984dddbeSBram Moolenaar other = 1234 2854984dddbeSBram Moolenaar g:other_var = other 2855c82a5b5dSBram Moolenaar END 2856c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2857c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2858c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2859984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2860984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2861c82a5b5dSBram Moolenaar 2862c82a5b5dSBram Moolenaar unlet g:var_uninit 2863c82a5b5dSBram Moolenaar unlet g:var_test 2864984dddbeSBram Moolenaar unlet g:var_prefixed 2865984dddbeSBram Moolenaar unlet g:other_var 2866c82a5b5dSBram Moolenaarenddef 2867c82a5b5dSBram Moolenaar 2868c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2869c5b1c20bSBram Moolenaar let lines =<< trim END 2870c5b1c20bSBram Moolenaar vim9script 2871c5b1c20bSBram Moolenaar const var: string 2872c5b1c20bSBram Moolenaar END 2873c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2874c5b1c20bSBram Moolenaar 2875c5b1c20bSBram Moolenaar lines =<< trim END 2876c5b1c20bSBram Moolenaar vim9script 2877c5b1c20bSBram Moolenaar let 9var: string 2878c5b1c20bSBram Moolenaar END 2879c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2880c5b1c20bSBram Moolenaarenddef 2881c5b1c20bSBram Moolenaar 288234db91f7SBram Moolenaardef Test_let_type_check() 288334db91f7SBram Moolenaar let lines =<< trim END 288434db91f7SBram Moolenaar vim9script 288534db91f7SBram Moolenaar let var: string 288634db91f7SBram Moolenaar var = 1234 288734db91f7SBram Moolenaar END 288834db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2889984dddbeSBram Moolenaar 2890984dddbeSBram Moolenaar lines =<< trim END 2891984dddbeSBram Moolenaar vim9script 2892984dddbeSBram Moolenaar let var:string 2893984dddbeSBram Moolenaar END 2894984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2895c5b1c20bSBram Moolenaar 2896c5b1c20bSBram Moolenaar lines =<< trim END 2897c5b1c20bSBram Moolenaar vim9script 2898c5b1c20bSBram Moolenaar let var: asdf 2899c5b1c20bSBram Moolenaar END 2900c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2901a71e2633SBram Moolenaar 2902a71e2633SBram Moolenaar lines =<< trim END 2903a71e2633SBram Moolenaar vim9script 2904a71e2633SBram Moolenaar let s:l: list<number> 2905a71e2633SBram Moolenaar s:l = [] 2906a71e2633SBram Moolenaar END 2907a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2908a71e2633SBram Moolenaar 2909a71e2633SBram Moolenaar lines =<< trim END 2910a71e2633SBram Moolenaar vim9script 2911a71e2633SBram Moolenaar let s:d: dict<number> 2912a71e2633SBram Moolenaar s:d = {} 2913a71e2633SBram Moolenaar END 2914a71e2633SBram Moolenaar CheckScriptSuccess(lines) 291534db91f7SBram Moolenaarenddef 291634db91f7SBram Moolenaar 2917a5d0077eSBram Moolenaardef Test_forward_declaration() 2918a5d0077eSBram Moolenaar let lines =<< trim END 2919a5d0077eSBram Moolenaar vim9script 2920a5d0077eSBram Moolenaar def GetValue(): string 2921a5d0077eSBram Moolenaar return theVal 2922a5d0077eSBram Moolenaar enddef 2923a5d0077eSBram Moolenaar let theVal = 'something' 2924822ba247SBram Moolenaar g:initVal = GetValue() 2925a5d0077eSBram Moolenaar theVal = 'else' 2926a5d0077eSBram Moolenaar g:laterVal = GetValue() 2927a5d0077eSBram Moolenaar END 2928a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2929a5d0077eSBram Moolenaar source Xforward 2930a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2931a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2932a5d0077eSBram Moolenaar 2933a5d0077eSBram Moolenaar unlet g:initVal 2934a5d0077eSBram Moolenaar unlet g:laterVal 2935a5d0077eSBram Moolenaar delete('Xforward') 2936a5d0077eSBram Moolenaarenddef 2937a5d0077eSBram Moolenaar 29389721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 29399721fb4eSBram Moolenaar let legacy_lines =<< trim END 29409721fb4eSBram Moolenaar source Xvim9_script.vim 29419721fb4eSBram Moolenaar 29429721fb4eSBram Moolenaar call assert_false(exists('local')) 29439721fb4eSBram Moolenaar call assert_false(exists('exported')) 29449721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29459721fb4eSBram Moolenaar call assert_equal('global', global) 29469721fb4eSBram Moolenaar call assert_equal('global', g:global) 29479721fb4eSBram Moolenaar 29489721fb4eSBram Moolenaar " imported variable becomes script-local 29499721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29509721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29519721fb4eSBram Moolenaar call assert_false(exists('exported')) 29529721fb4eSBram Moolenaar 29539721fb4eSBram Moolenaar " imported function becomes script-local 29549721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29559721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29569721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29579721fb4eSBram Moolenaar END 29589721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29599721fb4eSBram Moolenaar 29609721fb4eSBram Moolenaar let vim9_lines =<< trim END 29619721fb4eSBram Moolenaar vim9script 29629721fb4eSBram Moolenaar let local = 'local' 29639721fb4eSBram Moolenaar g:global = 'global' 29649721fb4eSBram Moolenaar export let exported = 'exported' 29659721fb4eSBram Moolenaar export def GetText(): string 29669721fb4eSBram Moolenaar return 'text' 29679721fb4eSBram Moolenaar enddef 29689721fb4eSBram Moolenaar END 29699721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 29709721fb4eSBram Moolenaar 29719721fb4eSBram Moolenaar source Xlegacy_script.vim 29729721fb4eSBram Moolenaar 29739721fb4eSBram Moolenaar assert_equal('global', g:global) 2974f5be8cdbSBram Moolenaar unlet g:global 29759721fb4eSBram Moolenaar 29769721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29779721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29789721fb4eSBram Moolenaarenddef 2979a5d0077eSBram Moolenaar 2980eeb27bfeSBram Moolenaardef Test_vim9_copen() 2981eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2982eeb27bfeSBram Moolenaar copen 2983eeb27bfeSBram Moolenaar quit 2984eeb27bfeSBram Moolenaarenddef 2985eeb27bfeSBram Moolenaar 29862d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 29872d6b20d6SBram Moolenaardef Test_vim9_autoload() 29882d6b20d6SBram Moolenaar let lines =<< trim END 29892d6b20d6SBram Moolenaar vim9script 29902d6b20d6SBram Moolenaar def foo#test() 29912d6b20d6SBram Moolenaar echomsg getreg('"') 29922d6b20d6SBram Moolenaar enddef 29932d6b20d6SBram Moolenaar END 29942d6b20d6SBram Moolenaar 29952d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29962d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 29972d6b20d6SBram Moolenaar let save_rtp = &rtp 29982d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29992d6b20d6SBram Moolenaar augroup test 30002d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 30012d6b20d6SBram Moolenaar augroup END 30022d6b20d6SBram Moolenaar 30032d6b20d6SBram Moolenaar normal Y 30042d6b20d6SBram Moolenaar 30052d6b20d6SBram Moolenaar augroup test 30062d6b20d6SBram Moolenaar autocmd! 30072d6b20d6SBram Moolenaar augroup END 30082d6b20d6SBram Moolenaar delete('Xdir', 'rf') 30092d6b20d6SBram Moolenaar &rtp = save_rtp 30102d6b20d6SBram Moolenaarenddef 30112d6b20d6SBram Moolenaar 3012585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3013585fea7bSBram Moolenaardef Test_substitute_cmd() 3014585fea7bSBram Moolenaar new 3015585fea7bSBram Moolenaar setline(1, 'something') 3016585fea7bSBram Moolenaar :substitute(some(other( 3017585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3018585fea7bSBram Moolenaar bwipe! 3019585fea7bSBram Moolenaar 3020f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3021585fea7bSBram Moolenaar let lines =<< trim END 3022585fea7bSBram Moolenaar vim9script 3023585fea7bSBram Moolenaar new 3024585fea7bSBram Moolenaar setline(1, 'something') 3025585fea7bSBram Moolenaar :substitute(some(other( 3026585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3027585fea7bSBram Moolenaar bwipe! 3028585fea7bSBram Moolenaar END 3029585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3030585fea7bSBram Moolenaar source Xvim9lines 3031585fea7bSBram Moolenaar 3032585fea7bSBram Moolenaar delete('Xvim9lines') 3033585fea7bSBram Moolenaarenddef 3034585fea7bSBram Moolenaar 30358a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3036