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 7e3d4685fSBram Moolenaarsource shared.vim 837294bd6SBram Moolenaarsource screendump.vim 98a7d6542SBram Moolenaar 105d72ce69SBram Moolenaardef Test_range_only() 115d72ce69SBram Moolenaar new 125d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 135d72ce69SBram Moolenaar :/Blah/ 145d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 15c2af0affSBram Moolenaar bwipe! 16c2af0affSBram Moolenaar 17c2af0affSBram Moolenaar # without range commands use current line 18c2af0affSBram Moolenaar new 19c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 20c2af0affSBram Moolenaar :2 21c2af0affSBram Moolenaar print 22c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 23c2af0affSBram Moolenaar :3 24c2af0affSBram Moolenaar list 25c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 26b8554304SBram Moolenaar 27b8554304SBram Moolenaar # missing command does not print the line 28b8554304SBram Moolenaar var lines =<< trim END 29b8554304SBram Moolenaar vim9script 30b8554304SBram Moolenaar :1| 31b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 32b8554304SBram Moolenaar :| 33b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 34b8554304SBram Moolenaar END 35b8554304SBram Moolenaar CheckScriptSuccess(lines) 36b8554304SBram Moolenaar 37c2af0affSBram Moolenaar bwipe! 38025cb1caSBram Moolenaar 39025cb1caSBram Moolenaar # won't generate anything 40025cb1caSBram Moolenaar if false 41025cb1caSBram Moolenaar :123 42025cb1caSBram Moolenaar endif 435d72ce69SBram Moolenaarenddef 445d72ce69SBram Moolenaar 45a6e67e4fSBram Moolenaarlet g:alist = [7] 46a6e67e4fSBram Moolenaarlet g:astring = 'text' 47f0b9f43cSBram Moolenaarlet g:anumber = 123 486e587dcbSBram Moolenaar 494c17ad94SBram Moolenaardef Test_delfunction() 50f5be8cdbSBram Moolenaar # Check function is defined in script namespace 514c17ad94SBram Moolenaar CheckScriptSuccess([ 524c17ad94SBram Moolenaar 'vim9script', 534c17ad94SBram Moolenaar 'func CheckMe()', 544c17ad94SBram Moolenaar ' return 123', 554c17ad94SBram Moolenaar 'endfunc', 564c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 574c17ad94SBram Moolenaar ]) 584c17ad94SBram Moolenaar 59f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 604c17ad94SBram Moolenaar CheckScriptFailure([ 614c17ad94SBram Moolenaar 'vim9script', 624c17ad94SBram Moolenaar 'func DeleteMe1()', 634c17ad94SBram Moolenaar 'endfunc', 644c17ad94SBram Moolenaar 'delfunction DeleteMe1', 654c17ad94SBram Moolenaar ], 'E1084:') 664c17ad94SBram Moolenaar CheckScriptFailure([ 674c17ad94SBram Moolenaar 'vim9script', 684c17ad94SBram Moolenaar 'func DeleteMe2()', 694c17ad94SBram Moolenaar 'endfunc', 704c17ad94SBram Moolenaar 'def DoThat()', 714c17ad94SBram Moolenaar ' delfunction DeleteMe2', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'DoThat()', 744c17ad94SBram Moolenaar ], 'E1084:') 754c17ad94SBram Moolenaar CheckScriptFailure([ 764c17ad94SBram Moolenaar 'vim9script', 774c17ad94SBram Moolenaar 'def DeleteMe3()', 784c17ad94SBram Moolenaar 'enddef', 794c17ad94SBram Moolenaar 'delfunction DeleteMe3', 804c17ad94SBram Moolenaar ], 'E1084:') 814c17ad94SBram Moolenaar CheckScriptFailure([ 824c17ad94SBram Moolenaar 'vim9script', 834c17ad94SBram Moolenaar 'def DeleteMe4()', 844c17ad94SBram Moolenaar 'enddef', 854c17ad94SBram Moolenaar 'def DoThat()', 864c17ad94SBram Moolenaar ' delfunction DeleteMe4', 874c17ad94SBram Moolenaar 'enddef', 884c17ad94SBram Moolenaar 'DoThat()', 894c17ad94SBram Moolenaar ], 'E1084:') 90925e9fd6SBram Moolenaar 91925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 92cfcd011fSBram Moolenaar var lines =<< trim END 93925e9fd6SBram Moolenaar vim9script 94925e9fd6SBram Moolenaar def g:Global(): string 95925e9fd6SBram Moolenaar return "yes" 96925e9fd6SBram Moolenaar enddef 97925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 98925e9fd6SBram Moolenaar def! g:Global(): string 99925e9fd6SBram Moolenaar return "no" 100925e9fd6SBram Moolenaar enddef 101925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 102925e9fd6SBram Moolenaar delfunc g:Global 103925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 104925e9fd6SBram Moolenaar END 105925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 106925e9fd6SBram Moolenaar 107925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 108925e9fd6SBram Moolenaar lines =<< trim END 109925e9fd6SBram Moolenaar vim9script 110925e9fd6SBram Moolenaar func g:Global() 111925e9fd6SBram Moolenaar return "yes" 112925e9fd6SBram Moolenaar endfunc 113925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 114925e9fd6SBram Moolenaar def! g:Global(): string 115925e9fd6SBram Moolenaar return "no" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 118925e9fd6SBram Moolenaar delfunc g:Global 119925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 120925e9fd6SBram Moolenaar END 121925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 122925e9fd6SBram Moolenaar 123925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 124925e9fd6SBram Moolenaar lines =<< trim END 125925e9fd6SBram Moolenaar vim9script 126925e9fd6SBram Moolenaar def g:Global(): string 127925e9fd6SBram Moolenaar return "yes" 128925e9fd6SBram Moolenaar enddef 129925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 130925e9fd6SBram Moolenaar func! g:Global() 131925e9fd6SBram Moolenaar return "no" 132925e9fd6SBram Moolenaar endfunc 133925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 134925e9fd6SBram Moolenaar delfunc g:Global 135925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 136925e9fd6SBram Moolenaar END 137925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1384c17ad94SBram Moolenaarenddef 1394c17ad94SBram Moolenaar 14008052228SBram Moolenaardef Test_wrong_type() 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 145599c89c8SBram Moolenaar 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14842a480bfSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 159cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 160a0a9f43aSBram Moolenaar 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 162cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16308052228SBram Moolenaarenddef 1648a7d6542SBram Moolenaar 16510c65860SBram Moolenaardef Test_script_wrong_type() 16610c65860SBram Moolenaar var lines =<< trim END 16710c65860SBram Moolenaar vim9script 16810c65860SBram Moolenaar var s:dict: dict<string> 16910c65860SBram Moolenaar s:dict['a'] = ['x'] 17010c65860SBram Moolenaar END 17110c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17210c65860SBram Moolenaarenddef 17310c65860SBram Moolenaar 17408052228SBram Moolenaardef Test_const() 175cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 177cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17830fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17930fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 180dbeecb2bSBram Moolenaar 181cfcd011fSBram Moolenaar var lines =<< trim END 18230fd8204SBram Moolenaar final list = [1, 2, 3] 183dbeecb2bSBram Moolenaar list[0] = 4 1840b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18530fd8204SBram Moolenaar const other = [5, 6, 7] 1860b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18771abe482SBram Moolenaar 188cfcd011fSBram Moolenaar var varlist = [7, 8] 18930fd8204SBram Moolenaar const constlist = [1, varlist, 3] 19071abe482SBram Moolenaar varlist[0] = 77 19171abe482SBram Moolenaar # TODO: does not work yet 19271abe482SBram Moolenaar # constlist[1][1] = 88 193cfcd011fSBram Moolenaar var cl = constlist[1] 19471abe482SBram Moolenaar cl[1] = 88 19571abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 19671abe482SBram Moolenaar 197e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 198e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 19971abe482SBram Moolenaar vardict['five'] = 55 20071abe482SBram Moolenaar # TODO: does not work yet 20171abe482SBram Moolenaar # constdict['two']['six'] = 66 202cfcd011fSBram Moolenaar var cd = constdict['two'] 20371abe482SBram Moolenaar cd['six'] = 66 204e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 205dbeecb2bSBram Moolenaar END 206dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20708052228SBram Moolenaarenddef 2088a7d6542SBram Moolenaar 2090b4c66c6SBram Moolenaardef Test_const_bang() 210cfcd011fSBram Moolenaar var lines =<< trim END 21130fd8204SBram Moolenaar const var = 234 2120b4c66c6SBram Moolenaar var = 99 2130b4c66c6SBram Moolenaar END 2140b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2150b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2160b4c66c6SBram Moolenaar 2170b4c66c6SBram Moolenaar lines =<< trim END 21830fd8204SBram Moolenaar const ll = [2, 3, 4] 2190b4c66c6SBram Moolenaar ll[0] = 99 2200b4c66c6SBram Moolenaar END 2210b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2220b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2230b4c66c6SBram Moolenaar 2240b4c66c6SBram Moolenaar lines =<< trim END 22530fd8204SBram Moolenaar const ll = [2, 3, 4] 2260b4c66c6SBram Moolenaar ll[3] = 99 2270b4c66c6SBram Moolenaar END 2280b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2290b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2300b4c66c6SBram Moolenaar 2310b4c66c6SBram Moolenaar lines =<< trim END 232e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2330b4c66c6SBram Moolenaar dd["one"] = 99 2340b4c66c6SBram Moolenaar END 2350b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2360b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2370b4c66c6SBram Moolenaar 2380b4c66c6SBram Moolenaar lines =<< trim END 239e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2400b4c66c6SBram Moolenaar dd["three"] = 99 2410b4c66c6SBram Moolenaar END 2420b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2430b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2440b4c66c6SBram Moolenaarenddef 2450b4c66c6SBram Moolenaar 246df069eecSBram Moolenaardef Test_range_no_colon() 247d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 249d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 250d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 251df069eecSBram Moolenaarenddef 252df069eecSBram Moolenaar 253df069eecSBram Moolenaar 2548a7d6542SBram Moolenaardef Test_block() 255cfcd011fSBram Moolenaar var outer = 1 2568a7d6542SBram Moolenaar { 257cfcd011fSBram Moolenaar var inner = 2 2588a7d6542SBram Moolenaar assert_equal(1, outer) 2598a7d6542SBram Moolenaar assert_equal(2, inner) 2608a7d6542SBram Moolenaar } 2618a7d6542SBram Moolenaar assert_equal(1, outer) 2623f1e9f00SBram Moolenaar 2633f1e9f00SBram Moolenaar {|echo 'yes'|} 2648a7d6542SBram Moolenaarenddef 2658a7d6542SBram Moolenaar 26608052228SBram Moolenaardef Test_block_failure() 267cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26808052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26908052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 27008052228SBram Moolenaarenddef 2718a7d6542SBram Moolenaar 272fbbcd003SBram Moolenaardef Test_block_local_vars() 273fbbcd003SBram Moolenaar var lines =<< trim END 274fbbcd003SBram Moolenaar vim9script 275ed234f24SBram Moolenaar v:testing = 1 276fbbcd003SBram Moolenaar if true 277ed234f24SBram Moolenaar var text = ['hello'] 278ed234f24SBram Moolenaar def SayHello(): list<string> 279fbbcd003SBram Moolenaar return text 280fbbcd003SBram Moolenaar enddef 281fbbcd003SBram Moolenaar def SetText(v: string) 282ed234f24SBram Moolenaar text = [v] 283fbbcd003SBram Moolenaar enddef 284fbbcd003SBram Moolenaar endif 285fbbcd003SBram Moolenaar 286fbbcd003SBram Moolenaar if true 287ed234f24SBram Moolenaar var text = ['again'] 288ed234f24SBram Moolenaar def SayAgain(): list<string> 289fbbcd003SBram Moolenaar return text 290fbbcd003SBram Moolenaar enddef 291fbbcd003SBram Moolenaar endif 292ed234f24SBram Moolenaar 293ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 294ed234f24SBram Moolenaar test_garbagecollect_now() 295ed234f24SBram Moolenaar 296fbbcd003SBram Moolenaar defcompile 297fbbcd003SBram Moolenaar 298ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 299ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 300fbbcd003SBram Moolenaar 301fbbcd003SBram Moolenaar SetText('foobar') 302ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 303ed234f24SBram Moolenaar 304ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 305ed234f24SBram Moolenaar qall! 306fbbcd003SBram Moolenaar END 307ed234f24SBram Moolenaar 308ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 309ed234f24SBram Moolenaar # context gets garbage collected. 310ed234f24SBram Moolenaar writefile(lines, 'Xscript') 311ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 312ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 313ed234f24SBram Moolenaar 314ed234f24SBram Moolenaar delete('Xscript') 315ed234f24SBram Moolenaar delete('Xdidit') 316fbbcd003SBram Moolenaarenddef 317fbbcd003SBram Moolenaar 31839ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31939ca4127SBram Moolenaar var lines =<< trim END 32039ca4127SBram Moolenaar vim9script 32139ca4127SBram Moolenaar if true 32239ca4127SBram Moolenaar var foo = 'foo' 32339ca4127SBram Moolenaar if true 32439ca4127SBram Moolenaar var bar = 'bar' 32539ca4127SBram Moolenaar def Func(): list<string> 32639ca4127SBram Moolenaar return [foo, bar] 32739ca4127SBram Moolenaar enddef 32839ca4127SBram Moolenaar endif 32939ca4127SBram Moolenaar endif 33039ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 33139ca4127SBram Moolenaar # "foo" and "bar" 33239ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33339ca4127SBram Moolenaar END 33439ca4127SBram Moolenaar CheckScriptSuccess(lines) 33539ca4127SBram Moolenaarenddef 33639ca4127SBram Moolenaar 337d032f34aSBram Moolenaarfunc g:NoSuchFunc() 338d032f34aSBram Moolenaar echo 'none' 339d032f34aSBram Moolenaarendfunc 340d032f34aSBram Moolenaar 3419e1d9e34SBram Moolenaardef Test_try_catch_throw() 342cfcd011fSBram Moolenaar var l = [] 3437a092245SBram Moolenaar try # comment 3448a7d6542SBram Moolenaar add(l, '1') 3458a7d6542SBram Moolenaar throw 'wrong' 3468a7d6542SBram Moolenaar add(l, '2') 3477a092245SBram Moolenaar catch # comment 3488a7d6542SBram Moolenaar add(l, v:exception) 3497a092245SBram Moolenaar finally # comment 3508a7d6542SBram Moolenaar add(l, '3') 3517a092245SBram Moolenaar endtry # comment 3528a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35368d130c6SBram Moolenaar 354e859312eSBram Moolenaar l = [] 355e859312eSBram Moolenaar try 356e859312eSBram Moolenaar try 357e859312eSBram Moolenaar add(l, '1') 358e859312eSBram Moolenaar throw 'wrong' 359e859312eSBram Moolenaar add(l, '2') 360e859312eSBram Moolenaar catch /right/ 361e859312eSBram Moolenaar add(l, v:exception) 362e859312eSBram Moolenaar endtry 363e859312eSBram Moolenaar catch /wrong/ 364e859312eSBram Moolenaar add(l, 'caught') 365373863edSBram Moolenaar fina 366e859312eSBram Moolenaar add(l, 'finally') 367e859312eSBram Moolenaar endtry 368e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 369e859312eSBram Moolenaar 370cfcd011fSBram Moolenaar var n: number 37168d130c6SBram Moolenaar try 37268d130c6SBram Moolenaar n = l[3] 37368d130c6SBram Moolenaar catch /E684:/ 37468d130c6SBram Moolenaar n = 99 37568d130c6SBram Moolenaar endtry 37668d130c6SBram Moolenaar assert_equal(99, n) 37768d130c6SBram Moolenaar 37869f7050cSBram Moolenaar var done = 'no' 37969f7050cSBram Moolenaar if 0 38069f7050cSBram Moolenaar try | catch | endtry 38169f7050cSBram Moolenaar else 38269f7050cSBram Moolenaar done = 'yes' 38369f7050cSBram Moolenaar endif 38469f7050cSBram Moolenaar assert_equal('yes', done) 38569f7050cSBram Moolenaar 38669f7050cSBram Moolenaar done = 'no' 38769f7050cSBram Moolenaar if 1 38869f7050cSBram Moolenaar done = 'yes' 38969f7050cSBram Moolenaar else 39069f7050cSBram Moolenaar try | catch | endtry 39169f7050cSBram Moolenaar done = 'never' 39269f7050cSBram Moolenaar endif 39369f7050cSBram Moolenaar assert_equal('yes', done) 39469f7050cSBram Moolenaar 39569f7050cSBram Moolenaar if 1 39669f7050cSBram Moolenaar else 39769f7050cSBram Moolenaar try | catch /pat/ | endtry 39869f7050cSBram Moolenaar try | catch /pat/ 39969f7050cSBram Moolenaar endtry 40069f7050cSBram Moolenaar try 40169f7050cSBram Moolenaar catch /pat/ | endtry 40269f7050cSBram Moolenaar try 40369f7050cSBram Moolenaar catch /pat/ 40469f7050cSBram Moolenaar endtry 40569f7050cSBram Moolenaar endif 40669f7050cSBram Moolenaar 40768d130c6SBram Moolenaar try 408cc673e74SBram Moolenaar # string slice returns a string, not a number 40968d130c6SBram Moolenaar n = g:astring[3] 4105e654230SBram Moolenaar catch /E1012:/ 41168d130c6SBram Moolenaar n = 77 41268d130c6SBram Moolenaar endtry 41368d130c6SBram Moolenaar assert_equal(77, n) 41468d130c6SBram Moolenaar 41568d130c6SBram Moolenaar try 41668d130c6SBram Moolenaar n = l[g:astring] 4175e654230SBram Moolenaar catch /E1012:/ 41856acb094SBram Moolenaar n = 88 41968d130c6SBram Moolenaar endtry 42056acb094SBram Moolenaar assert_equal(88, n) 42168d130c6SBram Moolenaar 42268d130c6SBram Moolenaar try 42368d130c6SBram Moolenaar n = s:does_not_exist 42468d130c6SBram Moolenaar catch /E121:/ 425f0b9f43cSBram Moolenaar n = 111 426f0b9f43cSBram Moolenaar endtry 427f0b9f43cSBram Moolenaar assert_equal(111, n) 428f0b9f43cSBram Moolenaar 429f0b9f43cSBram Moolenaar try 430f0b9f43cSBram Moolenaar n = g:does_not_exist 431f0b9f43cSBram Moolenaar catch /E121:/ 43268d130c6SBram Moolenaar n = 121 43368d130c6SBram Moolenaar endtry 43468d130c6SBram Moolenaar assert_equal(121, n) 43568d130c6SBram Moolenaar 436e0de171eSBram Moolenaar var d = {one: 1} 43768d130c6SBram Moolenaar try 43868d130c6SBram Moolenaar n = d[g:astring] 43968d130c6SBram Moolenaar catch /E716:/ 44068d130c6SBram Moolenaar n = 222 44168d130c6SBram Moolenaar endtry 44268d130c6SBram Moolenaar assert_equal(222, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = -g:astring 446f0b9f43cSBram Moolenaar catch /E39:/ 447f0b9f43cSBram Moolenaar n = 233 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(233, n) 450f0b9f43cSBram Moolenaar 451f0b9f43cSBram Moolenaar try 452f0b9f43cSBram Moolenaar n = +g:astring 453f0b9f43cSBram Moolenaar catch /E1030:/ 454f0b9f43cSBram Moolenaar n = 244 455f0b9f43cSBram Moolenaar endtry 456f0b9f43cSBram Moolenaar assert_equal(244, n) 457f0b9f43cSBram Moolenaar 458f0b9f43cSBram Moolenaar try 459f0b9f43cSBram Moolenaar n = +g:alist 460f0b9f43cSBram Moolenaar catch /E745:/ 461f0b9f43cSBram Moolenaar n = 255 462f0b9f43cSBram Moolenaar endtry 463f0b9f43cSBram Moolenaar assert_equal(255, n) 464f0b9f43cSBram Moolenaar 465cfcd011fSBram Moolenaar var nd: dict<any> 466f0b9f43cSBram Moolenaar try 4672e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4682e5910bfSBram Moolenaar catch /E1105:/ 469f0b9f43cSBram Moolenaar n = 266 470f0b9f43cSBram Moolenaar endtry 471f0b9f43cSBram Moolenaar assert_equal(266, n) 472f0b9f43cSBram Moolenaar 473f0b9f43cSBram Moolenaar try 474f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 475f0b9f43cSBram Moolenaar catch /E1093:/ 476f0b9f43cSBram Moolenaar n = 277 477f0b9f43cSBram Moolenaar endtry 478f0b9f43cSBram Moolenaar assert_equal(277, n) 479f0b9f43cSBram Moolenaar 480e859312eSBram Moolenaar try 481e859312eSBram Moolenaar &ts = g:astring 4825e654230SBram Moolenaar catch /E1012:/ 483e859312eSBram Moolenaar n = 288 484e859312eSBram Moolenaar endtry 485e859312eSBram Moolenaar assert_equal(288, n) 486e859312eSBram Moolenaar 487e859312eSBram Moolenaar try 488e859312eSBram Moolenaar &backspace = 'asdf' 489e859312eSBram Moolenaar catch /E474:/ 490e859312eSBram Moolenaar n = 299 491e859312eSBram Moolenaar endtry 492e859312eSBram Moolenaar assert_equal(299, n) 493e859312eSBram Moolenaar 494e859312eSBram Moolenaar l = [1] 495e859312eSBram Moolenaar try 496e859312eSBram Moolenaar l[3] = 3 497e859312eSBram Moolenaar catch /E684:/ 498e859312eSBram Moolenaar n = 300 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(300, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar unlet g:does_not_exist 504e859312eSBram Moolenaar catch /E108:/ 505e859312eSBram Moolenaar n = 322 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(322, n) 508e859312eSBram Moolenaar 509e859312eSBram Moolenaar try 5102bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 511e859312eSBram Moolenaar catch /E721:/ 512e859312eSBram Moolenaar n = 333 513e859312eSBram Moolenaar endtry 514e859312eSBram Moolenaar assert_equal(333, n) 515e859312eSBram Moolenaar 516e859312eSBram Moolenaar try 517e859312eSBram Moolenaar l = DeletedFunc() 518e859312eSBram Moolenaar catch /E933:/ 519e859312eSBram Moolenaar n = 344 520e859312eSBram Moolenaar endtry 521e859312eSBram Moolenaar assert_equal(344, n) 522d032f34aSBram Moolenaar 523d032f34aSBram Moolenaar try 524d032f34aSBram Moolenaar echo len(v:true) 525d032f34aSBram Moolenaar catch /E701:/ 526d032f34aSBram Moolenaar n = 355 527d032f34aSBram Moolenaar endtry 528d032f34aSBram Moolenaar assert_equal(355, n) 529d032f34aSBram Moolenaar 530cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 531d032f34aSBram Moolenaar delfunc g:NoSuchFunc 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo P() 534d032f34aSBram Moolenaar catch /E117:/ 535d032f34aSBram Moolenaar n = 366 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(366, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo g:NoSuchFunc() 541d032f34aSBram Moolenaar catch /E117:/ 542d032f34aSBram Moolenaar n = 377 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(377, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist + 4 548d032f34aSBram Moolenaar catch /E745:/ 549d032f34aSBram Moolenaar n = 388 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(388, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo 4 + g:alist 555d032f34aSBram Moolenaar catch /E745:/ 556d032f34aSBram Moolenaar n = 399 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(399, n) 559d032f34aSBram Moolenaar 560d032f34aSBram Moolenaar try 561d032f34aSBram Moolenaar echo g:alist.member 562d032f34aSBram Moolenaar catch /E715:/ 563d032f34aSBram Moolenaar n = 400 564d032f34aSBram Moolenaar endtry 565d032f34aSBram Moolenaar assert_equal(400, n) 566d032f34aSBram Moolenaar 567d032f34aSBram Moolenaar try 568d032f34aSBram Moolenaar echo d.member 569d032f34aSBram Moolenaar catch /E716:/ 570d032f34aSBram Moolenaar n = 411 571d032f34aSBram Moolenaar endtry 572d032f34aSBram Moolenaar assert_equal(411, n) 573d9d7789bSBram Moolenaar 574d9d7789bSBram Moolenaar var counter = 0 575d9d7789bSBram Moolenaar for i in range(4) 576d9d7789bSBram Moolenaar try 577d9d7789bSBram Moolenaar eval [][0] 578d9d7789bSBram Moolenaar catch 579d9d7789bSBram Moolenaar endtry 580d9d7789bSBram Moolenaar counter += 1 581d9d7789bSBram Moolenaar endfor 582d9d7789bSBram Moolenaar assert_equal(4, counter) 5837e82c5f3SBram Moolenaar 5847e82c5f3SBram Moolenaar # return in finally after empty catch 5857e82c5f3SBram Moolenaar def ReturnInFinally(): number 5867e82c5f3SBram Moolenaar try 5877e82c5f3SBram Moolenaar finally 5887e82c5f3SBram Moolenaar return 4 5897e82c5f3SBram Moolenaar endtry 5907e82c5f3SBram Moolenaar return 2 5917e82c5f3SBram Moolenaar enddef 5927e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5938ac681a2SBram Moolenaar 5948ac681a2SBram Moolenaar var lines =<< trim END 5958ac681a2SBram Moolenaar vim9script 5968ac681a2SBram Moolenaar try 5978ac681a2SBram Moolenaar acos('0.5') 5988ac681a2SBram Moolenaar ->setline(1) 5998ac681a2SBram Moolenaar catch 6008ac681a2SBram Moolenaar g:caught = v:exception 6018ac681a2SBram Moolenaar endtry 6028ac681a2SBram Moolenaar END 6038ac681a2SBram Moolenaar CheckScriptSuccess(lines) 6048ac681a2SBram Moolenaar assert_match('E808: Number or Float required', g:caught) 6058ac681a2SBram Moolenaar unlet g:caught 6068a7d6542SBram Moolenaarenddef 6078a7d6542SBram Moolenaar 608*3f987b59SBram Moolenaardef Test_try_in_catch() 609*3f987b59SBram Moolenaar var lines =<< trim END 610*3f987b59SBram Moolenaar vim9script 611*3f987b59SBram Moolenaar var seq = [] 612*3f987b59SBram Moolenaar def DoIt() 613*3f987b59SBram Moolenaar try 614*3f987b59SBram Moolenaar seq->add('throw 1') 615*3f987b59SBram Moolenaar eval [][0] 616*3f987b59SBram Moolenaar seq->add('notreached') 617*3f987b59SBram Moolenaar catch 618*3f987b59SBram Moolenaar seq->add('catch') 619*3f987b59SBram Moolenaar try 620*3f987b59SBram Moolenaar seq->add('throw 2') 621*3f987b59SBram Moolenaar eval [][0] 622*3f987b59SBram Moolenaar seq->add('notreached') 623*3f987b59SBram Moolenaar catch /nothing/ 624*3f987b59SBram Moolenaar seq->add('notreached') 625*3f987b59SBram Moolenaar endtry 626*3f987b59SBram Moolenaar seq->add('done') 627*3f987b59SBram Moolenaar endtry 628*3f987b59SBram Moolenaar enddef 629*3f987b59SBram Moolenaar DoIt() 630*3f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 631*3f987b59SBram Moolenaar END 632*3f987b59SBram Moolenaarenddef 633*3f987b59SBram Moolenaar 6342e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6352e34c34bSBram Moolenaardef TryContinueFunc() 6362e34c34bSBram Moolenaar while g:Count < 2 6372e34c34bSBram Moolenaar g:sequence ..= 't' 6382e34c34bSBram Moolenaar try 6392e34c34bSBram Moolenaar echoerr 'Test' 6402e34c34bSBram Moolenaar catch 6412e34c34bSBram Moolenaar g:Count += 1 6422e34c34bSBram Moolenaar g:sequence ..= 'c' 6432e34c34bSBram Moolenaar continue 6442e34c34bSBram Moolenaar endtry 6452e34c34bSBram Moolenaar g:sequence ..= 'e' 6462e34c34bSBram Moolenaar g:Count += 1 6472e34c34bSBram Moolenaar endwhile 6482e34c34bSBram Moolenaarenddef 6492e34c34bSBram Moolenaar 6502e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6512e34c34bSBram Moolenaar g:Count = 0 6522e34c34bSBram Moolenaar g:sequence = '' 6532e34c34bSBram Moolenaar TryContinueFunc() 6542e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6552e34c34bSBram Moolenaar unlet g:Count 6562e34c34bSBram Moolenaar unlet g:sequence 6572e34c34bSBram Moolenaarenddef 6582e34c34bSBram Moolenaar 6599cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6609cb577a6SBram Moolenaar # return in try block returns normally 6619cb577a6SBram Moolenaar def ReturnInTry(): string 6629cb577a6SBram Moolenaar try 6639cb577a6SBram Moolenaar return '"some message"' 6649cb577a6SBram Moolenaar catch 6659cb577a6SBram Moolenaar endtry 6669cb577a6SBram Moolenaar return 'not reached' 6679cb577a6SBram Moolenaar enddef 6689cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6699cb577a6SBram Moolenaarenddef 6709cb577a6SBram Moolenaar 6711430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6721430ceebSBram Moolenaar var lines =<< trim END 6731430ceebSBram Moolenaar vim9script 6741430ceebSBram Moolenaar au BufEnter * eval 0 6751430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6761430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6771430ceebSBram Moolenaar var items = [ 6781430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6791430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6801430ceebSBram Moolenaar ] 6811430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6821430ceebSBram Moolenaar cwindow 6831430ceebSBram Moolenaar 6841430ceebSBram Moolenaar def CnextOrCfirst() 6851430ceebSBram Moolenaar # if cnext fails, cfirst is used 6861430ceebSBram Moolenaar try 6871430ceebSBram Moolenaar cnext 6881430ceebSBram Moolenaar catch 6891430ceebSBram Moolenaar cfirst 6901430ceebSBram Moolenaar endtry 6911430ceebSBram Moolenaar enddef 6921430ceebSBram Moolenaar 6931430ceebSBram Moolenaar CnextOrCfirst() 6941430ceebSBram Moolenaar CnextOrCfirst() 6951430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6961430ceebSBram Moolenaar qall 6971430ceebSBram Moolenaar END 6981430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6991430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7001430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7011430ceebSBram Moolenaar 7021430ceebSBram Moolenaar delete('Xfile1') 7031430ceebSBram Moolenaar delete('Xfile2') 7041430ceebSBram Moolenaar delete('XCatchCnext') 7051430ceebSBram Moolenaar delete('Xresult') 7061430ceebSBram Moolenaarenddef 7071430ceebSBram Moolenaar 7089e1d9e34SBram Moolenaardef Test_throw_skipped() 7099e1d9e34SBram Moolenaar if 0 7109e1d9e34SBram Moolenaar throw dontgethere 7119e1d9e34SBram Moolenaar endif 7129e1d9e34SBram Moolenaarenddef 7139e1d9e34SBram Moolenaar 7148f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7158f81b22eSBram Moolenaar var lines =<< trim END 7168f81b22eSBram Moolenaar vim9script 7178f81b22eSBram Moolenaar def Func() 7188f81b22eSBram Moolenaar throw 'error' 7198f81b22eSBram Moolenaar enddef 7208f81b22eSBram Moolenaar silent! Func() 7218f81b22eSBram Moolenaar END 7228f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7238f81b22eSBram Moolenaar source XthrowSilenced 7248f81b22eSBram Moolenaar delete('XthrowSilenced') 7258f81b22eSBram Moolenaarenddef 7268f81b22eSBram Moolenaar 727e859312eSBram Moolenaardef DeletedFunc(): list<any> 728e859312eSBram Moolenaar return ['delete me'] 729e859312eSBram Moolenaarenddef 730e859312eSBram Moolenaardefcompile 731e859312eSBram Moolenaardelfunc DeletedFunc 732e859312eSBram Moolenaar 733257cc5eeSBram Moolenaardef ThrowFromDef() 734a72cfb80SBram Moolenaar throw "getout" # comment 735257cc5eeSBram Moolenaarenddef 736257cc5eeSBram Moolenaar 737257cc5eeSBram Moolenaarfunc CatchInFunc() 738257cc5eeSBram Moolenaar try 739257cc5eeSBram Moolenaar call ThrowFromDef() 740257cc5eeSBram Moolenaar catch 741257cc5eeSBram Moolenaar let g:thrown_func = v:exception 742257cc5eeSBram Moolenaar endtry 743257cc5eeSBram Moolenaarendfunc 744257cc5eeSBram Moolenaar 745257cc5eeSBram Moolenaardef CatchInDef() 746257cc5eeSBram Moolenaar try 747257cc5eeSBram Moolenaar ThrowFromDef() 748257cc5eeSBram Moolenaar catch 749257cc5eeSBram Moolenaar g:thrown_def = v:exception 750257cc5eeSBram Moolenaar endtry 751257cc5eeSBram Moolenaarenddef 752257cc5eeSBram Moolenaar 753f575adffSBram Moolenaardef ReturnFinally(): string 754f575adffSBram Moolenaar try 755f575adffSBram Moolenaar return 'intry' 756373863edSBram Moolenaar finall 757f575adffSBram Moolenaar g:in_finally = 'finally' 758f575adffSBram Moolenaar endtry 759f575adffSBram Moolenaar return 'end' 760f575adffSBram Moolenaarenddef 761f575adffSBram Moolenaar 762257cc5eeSBram Moolenaardef Test_try_catch_nested() 763257cc5eeSBram Moolenaar CatchInFunc() 764257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 765257cc5eeSBram Moolenaar 766257cc5eeSBram Moolenaar CatchInDef() 767257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 768f575adffSBram Moolenaar 769f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 770f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 771f575adffSBram Moolenaarenddef 772f575adffSBram Moolenaar 7739939f57bSBram Moolenaardef TryOne(): number 7749939f57bSBram Moolenaar try 7759939f57bSBram Moolenaar return 0 7769939f57bSBram Moolenaar catch 7779939f57bSBram Moolenaar endtry 7789939f57bSBram Moolenaar return 0 7799939f57bSBram Moolenaarenddef 7809939f57bSBram Moolenaar 7819939f57bSBram Moolenaardef TryTwo(n: number): string 7829939f57bSBram Moolenaar try 783cfcd011fSBram Moolenaar var x = {} 7849939f57bSBram Moolenaar catch 7859939f57bSBram Moolenaar endtry 7869939f57bSBram Moolenaar return 'text' 7879939f57bSBram Moolenaarenddef 7889939f57bSBram Moolenaar 7899939f57bSBram Moolenaardef Test_try_catch_twice() 7909939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7919939f57bSBram Moolenaarenddef 7929939f57bSBram Moolenaar 793f575adffSBram Moolenaardef Test_try_catch_match() 794cfcd011fSBram Moolenaar var seq = 'a' 795f575adffSBram Moolenaar try 796f575adffSBram Moolenaar throw 'something' 797f575adffSBram Moolenaar catch /nothing/ 798f575adffSBram Moolenaar seq ..= 'x' 799f575adffSBram Moolenaar catch /some/ 800f575adffSBram Moolenaar seq ..= 'b' 801f575adffSBram Moolenaar catch /asdf/ 802f575adffSBram Moolenaar seq ..= 'x' 803e8c4abbbSBram Moolenaar catch ?a\?sdf? 804e8c4abbbSBram Moolenaar seq ..= 'y' 805f575adffSBram Moolenaar finally 806f575adffSBram Moolenaar seq ..= 'c' 807f575adffSBram Moolenaar endtry 808f575adffSBram Moolenaar assert_equal('abc', seq) 809257cc5eeSBram Moolenaarenddef 810257cc5eeSBram Moolenaar 811e8c4abbbSBram Moolenaardef Test_try_catch_fails() 812d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 813d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 814d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 815d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 816d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 817d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 818d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 819d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 82013106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 821d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 822585fea7bSBram Moolenaar 823e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 824d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 825e8c4abbbSBram Moolenaarenddef 826e8c4abbbSBram Moolenaar 8277c5b3c03SBram Moolenaardef Try_catch_skipped() 8287c5b3c03SBram Moolenaar var l = [] 8297c5b3c03SBram Moolenaar try 8307c5b3c03SBram Moolenaar finally 8317c5b3c03SBram Moolenaar endtry 8327c5b3c03SBram Moolenaar 8337c5b3c03SBram Moolenaar if 1 8347c5b3c03SBram Moolenaar else 8357c5b3c03SBram Moolenaar try 8367c5b3c03SBram Moolenaar endtry 8377c5b3c03SBram Moolenaar endif 8387c5b3c03SBram Moolenaarenddef 8397c5b3c03SBram Moolenaar 8407c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 8417c5b3c03SBram Moolenaardef Test_try_catch_skipped() 8427c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 8437c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 8447c5b3c03SBram Moolenaarenddef 8457c5b3c03SBram Moolenaar 8467c5b3c03SBram Moolenaar 8477c5b3c03SBram Moolenaar 848006ad48bSBram Moolenaardef Test_throw_vimscript() 849f5be8cdbSBram Moolenaar # only checks line continuation 850cfcd011fSBram Moolenaar var lines =<< trim END 851006ad48bSBram Moolenaar vim9script 852006ad48bSBram Moolenaar try 853006ad48bSBram Moolenaar throw 'one' 854006ad48bSBram Moolenaar .. 'two' 855006ad48bSBram Moolenaar catch 856006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 857006ad48bSBram Moolenaar endtry 858006ad48bSBram Moolenaar END 859006ad48bSBram Moolenaar CheckScriptSuccess(lines) 8601e021e63SBram Moolenaar 8611e021e63SBram Moolenaar lines =<< trim END 8621e021e63SBram Moolenaar vim9script 863352134bbSBram Moolenaar @r = '' 8641e021e63SBram Moolenaar def Func() 8651e021e63SBram Moolenaar throw @r 8661e021e63SBram Moolenaar enddef 8671e021e63SBram Moolenaar var result = '' 8681e021e63SBram Moolenaar try 8691e021e63SBram Moolenaar Func() 8701e021e63SBram Moolenaar catch /E1129:/ 8711e021e63SBram Moolenaar result = 'caught' 8721e021e63SBram Moolenaar endtry 8731e021e63SBram Moolenaar assert_equal('caught', result) 8741e021e63SBram Moolenaar END 8751e021e63SBram Moolenaar CheckScriptSuccess(lines) 876006ad48bSBram Moolenaarenddef 877006ad48bSBram Moolenaar 878ed677f55SBram Moolenaardef Test_error_in_nested_function() 87903dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 880cfcd011fSBram Moolenaar var lines =<< trim END 881ed677f55SBram Moolenaar vim9script 882ed677f55SBram Moolenaar def Func() 883ed677f55SBram Moolenaar Error() 884ed677f55SBram Moolenaar g:test_var = 1 885ed677f55SBram Moolenaar enddef 886ed677f55SBram Moolenaar func Error() abort 887ed677f55SBram Moolenaar eval [][0] 888ed677f55SBram Moolenaar endfunc 889ed677f55SBram Moolenaar Func() 890ed677f55SBram Moolenaar END 891ed677f55SBram Moolenaar g:test_var = 0 892ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 893ed677f55SBram Moolenaar assert_equal(0, g:test_var) 894ed677f55SBram Moolenaarenddef 895ed677f55SBram Moolenaar 896227c58a4SBram Moolenaardef Test_abort_after_error() 897227c58a4SBram Moolenaar var lines =<< trim END 898227c58a4SBram Moolenaar vim9script 899227c58a4SBram Moolenaar while true 900227c58a4SBram Moolenaar echo notfound 901227c58a4SBram Moolenaar endwhile 902227c58a4SBram Moolenaar g:gotthere = true 903227c58a4SBram Moolenaar END 904227c58a4SBram Moolenaar g:gotthere = false 905227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 906227c58a4SBram Moolenaar assert_false(g:gotthere) 907227c58a4SBram Moolenaar unlet g:gotthere 908227c58a4SBram Moolenaarenddef 909227c58a4SBram Moolenaar 91037c83711SBram Moolenaardef Test_cexpr_vimscript() 911f5be8cdbSBram Moolenaar # only checks line continuation 91237c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 913cfcd011fSBram Moolenaar var lines =<< trim END 91437c83711SBram Moolenaar vim9script 91537c83711SBram Moolenaar cexpr 'File' 91637c83711SBram Moolenaar .. ' someFile' .. 91737c83711SBram Moolenaar ' line 19' 91837c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 91937c83711SBram Moolenaar END 92037c83711SBram Moolenaar CheckScriptSuccess(lines) 92137c83711SBram Moolenaar set errorformat& 92237c83711SBram Moolenaarenddef 92337c83711SBram Moolenaar 924c9edd6b5SBram Moolenaardef Test_statusline_syntax() 925c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 926cfcd011fSBram Moolenaar var lines =<< trim END 927c9edd6b5SBram Moolenaar vim9script 928c9edd6b5SBram Moolenaar func g:Status() 929c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 930c9edd6b5SBram Moolenaar endfunc 931c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 932c9edd6b5SBram Moolenaar redrawstatus 933c9edd6b5SBram Moolenaar set laststatus statusline= 934c9edd6b5SBram Moolenaar END 935c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 936c9edd6b5SBram Moolenaarenddef 937c9edd6b5SBram Moolenaar 938b209750bSBram Moolenaardef Test_list_vimscript() 939b209750bSBram Moolenaar # checks line continuation and comments 940cfcd011fSBram Moolenaar var lines =<< trim END 941b209750bSBram Moolenaar vim9script 942cfcd011fSBram Moolenaar var mylist = [ 943b209750bSBram Moolenaar 'one', 944b209750bSBram Moolenaar # comment 945b209750bSBram Moolenaar 'two', # empty line follows 946b209750bSBram Moolenaar 947b209750bSBram Moolenaar 'three', 948b209750bSBram Moolenaar ] 949b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 950b209750bSBram Moolenaar END 951b209750bSBram Moolenaar CheckScriptSuccess(lines) 95266250c93SBram Moolenaar 95366250c93SBram Moolenaar # check all lines from heredoc are kept 95466250c93SBram Moolenaar lines =<< trim END 95566250c93SBram Moolenaar # comment 1 95666250c93SBram Moolenaar two 95766250c93SBram Moolenaar # comment 3 95866250c93SBram Moolenaar 95966250c93SBram Moolenaar five 96066250c93SBram Moolenaar # comment 6 96166250c93SBram Moolenaar END 96266250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 9634bce26bbSBram Moolenaar 9644bce26bbSBram Moolenaar lines =<< trim END 9654bce26bbSBram Moolenaar [{ 9664bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 9674bce26bbSBram Moolenaar END 9684bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 969b209750bSBram Moolenaarenddef 970b209750bSBram Moolenaar 9712a1381c3SBram Moolenaarif has('channel') 97240ee466cSBram Moolenaar let someJob = test_null_job() 97340ee466cSBram Moolenaar 97440ee466cSBram Moolenaar def FuncWithError() 97540ee466cSBram Moolenaar echomsg g:someJob 97640ee466cSBram Moolenaar enddef 97740ee466cSBram Moolenaar 97840ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 97940ee466cSBram Moolenaar try 98040ee466cSBram Moolenaar call FuncWithError() 98140ee466cSBram Moolenaar catch 98240ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 98340ee466cSBram Moolenaar endtry 98440ee466cSBram Moolenaar endfunc 9852a1381c3SBram Moolenaarendif 98640ee466cSBram Moolenaar 9878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9888a7d6542SBram Moolenaar vim9script 989cfcd011fSBram Moolenaar var name: string = 'bob' 9908a7d6542SBram Moolenaar def Concat(arg: string): string 9918a7d6542SBram Moolenaar return name .. arg 9928a7d6542SBram Moolenaar enddef 993227a69deSBram Moolenaar g:result = Concat('bie') 994227a69deSBram Moolenaar g:localname = name 9958a7d6542SBram Moolenaar 9968a7d6542SBram Moolenaar export const CONST = 1234 997cfcd011fSBram Moolenaar export var exported = 9876 998cfcd011fSBram Moolenaar export var exp_name = 'John' 9998a7d6542SBram Moolenaar export def Exported(): string 10008a7d6542SBram Moolenaar return 'Exported' 10018a7d6542SBram Moolenaar enddef 10020f2a5cc6SBram Moolenaar export final theList = [1] 10038a7d6542SBram MoolenaarEND 10048a7d6542SBram Moolenaar 1005b3ca9824SBram Moolenaardef Undo_export_script_lines() 1006b3ca9824SBram Moolenaar unlet g:result 1007b3ca9824SBram Moolenaar unlet g:localname 1008b3ca9824SBram Moolenaarenddef 1009b3ca9824SBram Moolenaar 10105269bd2aSBram Moolenaardef Test_vim9_import_export() 1011cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10128a7d6542SBram Moolenaar vim9script 10138a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10148a7d6542SBram Moolenaar g:imported = exported 10156e587dcbSBram Moolenaar exported += 3 10166e587dcbSBram Moolenaar g:imported_added = exported 10178a7d6542SBram Moolenaar g:imported_func = Exported() 10186e587dcbSBram Moolenaar 101940f4f7a4SBram Moolenaar def GetExported(): string 1020e0de171eSBram Moolenaar var local_dict = {ref: Exported} 102140f4f7a4SBram Moolenaar return local_dict.ref() 102240f4f7a4SBram Moolenaar enddef 102340f4f7a4SBram Moolenaar g:funcref_result = GetExported() 102440f4f7a4SBram Moolenaar 10256e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10266e587dcbSBram Moolenaar g:imported_name = exp_name 10276e587dcbSBram Moolenaar exp_name ..= ' Doe' 10286e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10295381c7a1SBram Moolenaar g:imported_later = exported 10300f2a5cc6SBram Moolenaar 10310f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 10320f2a5cc6SBram Moolenaar theList->add(2) 10330f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 10348a7d6542SBram Moolenaar END 10358a7d6542SBram Moolenaar 10368a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 10378a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 10388a7d6542SBram Moolenaar 10398a7d6542SBram Moolenaar source Ximport.vim 10408a7d6542SBram Moolenaar 10418a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 10428a7d6542SBram Moolenaar assert_equal('bob', g:localname) 10438a7d6542SBram Moolenaar assert_equal(9876, g:imported) 10446e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 10455381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 10468a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 104740f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 10486e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 10496e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 10508a7d6542SBram Moolenaar assert_false(exists('g:name')) 10518a7d6542SBram Moolenaar 1052b3ca9824SBram Moolenaar Undo_export_script_lines() 10538a7d6542SBram Moolenaar unlet g:imported 10546e587dcbSBram Moolenaar unlet g:imported_added 10555381c7a1SBram Moolenaar unlet g:imported_later 10568a7d6542SBram Moolenaar unlet g:imported_func 10576e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 10588a7d6542SBram Moolenaar delete('Ximport.vim') 1059f2d5c240SBram Moolenaar 10601c991144SBram Moolenaar # similar, with line breaks 1061cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 10621c991144SBram Moolenaar vim9script 10631c991144SBram Moolenaar import { 10641c991144SBram Moolenaar exported, 10651c991144SBram Moolenaar Exported, 10661c991144SBram Moolenaar } 10671c991144SBram Moolenaar from 10681c991144SBram Moolenaar './Xexport.vim' 10691c991144SBram Moolenaar g:imported = exported 10701c991144SBram Moolenaar exported += 5 10711c991144SBram Moolenaar g:imported_added = exported 10721c991144SBram Moolenaar g:imported_func = Exported() 10731c991144SBram Moolenaar END 10741c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 10751c991144SBram Moolenaar source Ximport_lbr.vim 10761c991144SBram Moolenaar 10771c991144SBram Moolenaar assert_equal(9876, g:imported) 10781c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10791c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10801c991144SBram Moolenaar 10811c991144SBram Moolenaar # exported script not sourced again 10821c991144SBram Moolenaar assert_false(exists('g:result')) 10831c991144SBram Moolenaar unlet g:imported 10841c991144SBram Moolenaar unlet g:imported_added 10851c991144SBram Moolenaar unlet g:imported_func 10861c991144SBram Moolenaar delete('Ximport_lbr.vim') 10871c991144SBram Moolenaar 10881c991144SBram Moolenaar # import inside :def function 1089cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10905381c7a1SBram Moolenaar vim9script 10915381c7a1SBram Moolenaar def ImportInDef() 10925381c7a1SBram Moolenaar import exported from './Xexport.vim' 10935381c7a1SBram Moolenaar g:imported = exported 10945381c7a1SBram Moolenaar exported += 7 10955381c7a1SBram Moolenaar g:imported_added = exported 10965381c7a1SBram Moolenaar enddef 10975381c7a1SBram Moolenaar ImportInDef() 10985381c7a1SBram Moolenaar END 10995381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11005381c7a1SBram Moolenaar source Ximport2.vim 1101f5be8cdbSBram Moolenaar # TODO: this should be 9879 11025381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11035381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11045381c7a1SBram Moolenaar unlet g:imported 11055381c7a1SBram Moolenaar unlet g:imported_added 11065381c7a1SBram Moolenaar delete('Ximport2.vim') 11075381c7a1SBram Moolenaar 1108cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1109f2d5c240SBram Moolenaar vim9script 1110f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1111f2d5c240SBram Moolenaar def UseExport() 1112cb4e80faSBram Moolenaar g:imported_def = Export.exported 1113f2d5c240SBram Moolenaar enddef 1114cb4e80faSBram Moolenaar g:imported_script = Export.exported 1115cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1116cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1117f2d5c240SBram Moolenaar UseExport() 1118f2d5c240SBram Moolenaar END 1119f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1120f2d5c240SBram Moolenaar source Ximport.vim 1121cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1122cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1123f2d5c240SBram Moolenaar 1124cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1125599c89c8SBram Moolenaar vim9script 1126599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1127599c89c8SBram Moolenaar def Func() 1128cfcd011fSBram Moolenaar var dummy = 1 1129cfcd011fSBram Moolenaar var imported = Export + dummy 1130599c89c8SBram Moolenaar enddef 1131822ba247SBram Moolenaar defcompile 1132599c89c8SBram Moolenaar END 1133599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 113444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1135599c89c8SBram Moolenaar 1136cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1137599c89c8SBram Moolenaar vim9script 1138599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1139599c89c8SBram Moolenaar def Func() 1140cfcd011fSBram Moolenaar var imported = Export . exported 1141599c89c8SBram Moolenaar enddef 1142822ba247SBram Moolenaar defcompile 1143599c89c8SBram Moolenaar END 1144599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 114544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1146599c89c8SBram Moolenaar 1147a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1148a6294955SBram Moolenaar vim9script 1149a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1150a6294955SBram Moolenaar var some = 'other' 1151a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1152a6294955SBram Moolenaar defcompile 1153a6294955SBram Moolenaar END 1154a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1155a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1156a6294955SBram Moolenaar 1157cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1158cb4e80faSBram Moolenaar vim9script 1159cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1160cb4e80faSBram Moolenaar g:imported_script = Export exported 1161cb4e80faSBram Moolenaar END 1162cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1163cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1164cb4e80faSBram Moolenaar 1165cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1166cb4e80faSBram Moolenaar vim9script 1167cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1168cb4e80faSBram Moolenaar g:imported_script = Export. exported 1169cb4e80faSBram Moolenaar END 1170cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1171cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1172cb4e80faSBram Moolenaar 1173cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1174599c89c8SBram Moolenaar vim9script 1175599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1176599c89c8SBram Moolenaar def Func() 1177cfcd011fSBram Moolenaar var imported = Export. 1178599c89c8SBram Moolenaar enddef 1179822ba247SBram Moolenaar defcompile 1180599c89c8SBram Moolenaar END 1181599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 118244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1183599c89c8SBram Moolenaar 1184cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 11851c991144SBram Moolenaar vim9script 11861c991144SBram Moolenaar import * 11871c991144SBram Moolenaar as Export 11881c991144SBram Moolenaar from 11891c991144SBram Moolenaar './Xexport.vim' 11901c991144SBram Moolenaar def UseExport() 11911c991144SBram Moolenaar g:imported = Export.exported 11921c991144SBram Moolenaar enddef 11931c991144SBram Moolenaar UseExport() 11941c991144SBram Moolenaar END 11951c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 11961c991144SBram Moolenaar source Ximport.vim 11971c991144SBram Moolenaar assert_equal(9883, g:imported) 11981c991144SBram Moolenaar 1199cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1200f2d5c240SBram Moolenaar vim9script 1201f2d5c240SBram Moolenaar import * from './Xexport.vim' 1202f2d5c240SBram Moolenaar END 1203f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 120444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1205f2d5c240SBram Moolenaar 1206f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1207cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1208fa29c8abSBram Moolenaar vim9script 1209fa29c8abSBram Moolenaar import name from './Xexport.vim' 1210fa29c8abSBram Moolenaar END 1211fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 121244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1213fa29c8abSBram Moolenaar 1214f5be8cdbSBram Moolenaar # try to import something that is already defined 1215cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12165269bd2aSBram Moolenaar vim9script 1217cfcd011fSBram Moolenaar var exported = 'something' 12185269bd2aSBram Moolenaar import exported from './Xexport.vim' 12195269bd2aSBram Moolenaar END 12205269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1221057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12225269bd2aSBram Moolenaar 1223f5be8cdbSBram Moolenaar # try to import something that is already defined 12245269bd2aSBram Moolenaar import_already_defined =<< trim END 12255269bd2aSBram Moolenaar vim9script 1226cfcd011fSBram Moolenaar var exported = 'something' 12275269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12285269bd2aSBram Moolenaar END 12295269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1230057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12315269bd2aSBram Moolenaar 1232f5be8cdbSBram Moolenaar # try to import something that is already defined 12335269bd2aSBram Moolenaar import_already_defined =<< trim END 12345269bd2aSBram Moolenaar vim9script 1235cfcd011fSBram Moolenaar var exported = 'something' 12365269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12375269bd2aSBram Moolenaar END 12385269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1239057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12405269bd2aSBram Moolenaar 1241918a4249SBram Moolenaar # try changing an imported const 1242918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1243918a4249SBram Moolenaar vim9script 1244918a4249SBram Moolenaar import CONST from './Xexport.vim' 1245918a4249SBram Moolenaar def Assign() 1246918a4249SBram Moolenaar CONST = 987 1247918a4249SBram Moolenaar enddef 1248918a4249SBram Moolenaar defcompile 1249918a4249SBram Moolenaar END 1250918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1251918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1252918a4249SBram Moolenaar 12530f2a5cc6SBram Moolenaar # try changing an imported final 12540f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 12550f2a5cc6SBram Moolenaar vim9script 12560f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 12570f2a5cc6SBram Moolenaar def Assign() 12580f2a5cc6SBram Moolenaar theList = [2] 12590f2a5cc6SBram Moolenaar enddef 12600f2a5cc6SBram Moolenaar defcompile 12610f2a5cc6SBram Moolenaar END 12620f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 12630f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 12640f2a5cc6SBram Moolenaar 1265f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1266cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1267fa29c8abSBram Moolenaar vim9script 1268fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1269fa29c8abSBram Moolenaar END 1270fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 127144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1272fa29c8abSBram Moolenaar 1273cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1274fa29c8abSBram Moolenaar vim9script 1275fa29c8abSBram Moolenaar import name './Xexport.vim' 1276fa29c8abSBram Moolenaar END 1277fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 127844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1279fa29c8abSBram Moolenaar 1280cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1281fa29c8abSBram Moolenaar vim9script 1282fa29c8abSBram Moolenaar import name from Xexport.vim 1283fa29c8abSBram Moolenaar END 1284fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 128544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1286fa29c8abSBram Moolenaar 1287cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1288fa29c8abSBram Moolenaar vim9script 1289fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1290fa29c8abSBram Moolenaar END 1291fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 129244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1293fa29c8abSBram Moolenaar 1294cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1295fa29c8abSBram Moolenaar vim9script 1296fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1297fa29c8abSBram Moolenaar END 12985269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 129944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1300fa29c8abSBram Moolenaar 1301f2d5c240SBram Moolenaar delete('Ximport.vim') 13025269bd2aSBram Moolenaar delete('Ximport3.vim') 13038a7d6542SBram Moolenaar delete('Xexport.vim') 13048a7d6542SBram Moolenaar 1305f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 13063e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 13073e191694SBram Moolenaar set cpo=abcd 1308cfcd011fSBram Moolenaar var lines =<< trim END 1309750802b5SBram Moolenaar vim9script 1310750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 13113e191694SBram Moolenaar set cpo+=f 13123e191694SBram Moolenaar set cpo-=c 13133e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1314750802b5SBram Moolenaar END 1315750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1316750802b5SBram Moolenaar source Xvim9_script 13173e191694SBram Moolenaar assert_equal('fabd', &cpo) 1318750802b5SBram Moolenaar set cpo&vim 1319750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 13203e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 13213e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 13223e191694SBram Moolenaar 1323750802b5SBram Moolenaar delete('Xvim9_script') 1324750802b5SBram Moolenaarenddef 1325750802b5SBram Moolenaar 13260a84284eSBram Moolenaardef Test_import_as() 13270a84284eSBram Moolenaar var export_lines =<< trim END 13280a84284eSBram Moolenaar vim9script 13290a84284eSBram Moolenaar export var one = 1 13300a84284eSBram Moolenaar export var yes = 'yes' 13310a84284eSBram Moolenaar END 13320a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 13330a84284eSBram Moolenaar 13340a84284eSBram Moolenaar var import_lines =<< trim END 13350a84284eSBram Moolenaar vim9script 13366c7cc347SBram Moolenaar var one = 'notused' 13376c7cc347SBram Moolenaar var yes = 777 13380a84284eSBram Moolenaar import one as thatOne from './XexportAs' 13390a84284eSBram Moolenaar assert_equal(1, thatOne) 13400a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 13410a84284eSBram Moolenaar assert_equal('yes', yesYes) 13420a84284eSBram Moolenaar END 13430a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13440a84284eSBram Moolenaar 13450a84284eSBram Moolenaar import_lines =<< trim END 13460a84284eSBram Moolenaar vim9script 13470a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 13480a84284eSBram Moolenaar assert_equal(1, thatOne) 13490a84284eSBram Moolenaar assert_equal('yes', yesYes) 13500a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 13510a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 13520a84284eSBram Moolenaar END 13530a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13540a84284eSBram Moolenaar 13550a84284eSBram Moolenaar delete('XexportAs') 13560a84284eSBram Moolenaarenddef 13570a84284eSBram Moolenaar 1358803af686SBram Moolenaarfunc g:Trigger() 1359803af686SBram Moolenaar source Ximport.vim 1360803af686SBram Moolenaar return "echo 'yes'\<CR>" 1361803af686SBram Moolenaarendfunc 1362803af686SBram Moolenaar 1363803af686SBram Moolenaardef Test_import_export_expr_map() 1364803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1365cfcd011fSBram Moolenaar var export_lines =<< trim END 1366803af686SBram Moolenaar vim9script 1367803af686SBram Moolenaar export def That(): string 1368803af686SBram Moolenaar return 'yes' 1369803af686SBram Moolenaar enddef 1370803af686SBram Moolenaar END 1371803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1372803af686SBram Moolenaar 1373cfcd011fSBram Moolenaar var import_lines =<< trim END 1374803af686SBram Moolenaar vim9script 1375803af686SBram Moolenaar import That from './Xexport_that.vim' 1376803af686SBram Moolenaar assert_equal('yes', That()) 1377803af686SBram Moolenaar END 1378803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1379803af686SBram Moolenaar 1380803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1381803af686SBram Moolenaar feedkeys('trigger', "xt") 1382803af686SBram Moolenaar 1383730b2483SBram Moolenaar delete('Xexport_that.vim') 1384803af686SBram Moolenaar delete('Ximport.vim') 1385803af686SBram Moolenaar nunmap trigger 1386803af686SBram Moolenaarenddef 1387803af686SBram Moolenaar 13888e1986e3SBram Moolenaardef Test_import_in_filetype() 13898e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13908e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1391cfcd011fSBram Moolenaar var export_lines =<< trim END 13928e1986e3SBram Moolenaar vim9script 1393cfcd011fSBram Moolenaar export var That = 'yes' 13948e1986e3SBram Moolenaar END 1395730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 13968e1986e3SBram Moolenaar 1397cfcd011fSBram Moolenaar var import_lines =<< trim END 13988e1986e3SBram Moolenaar vim9script 1399730b2483SBram Moolenaar import That from './Xexport_ft.vim' 14008e1986e3SBram Moolenaar assert_equal('yes', That) 14018e1986e3SBram Moolenaar g:did_load_mytpe = 1 14028e1986e3SBram Moolenaar END 14038e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14048e1986e3SBram Moolenaar 1405cfcd011fSBram Moolenaar var save_rtp = &rtp 14068e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14078e1986e3SBram Moolenaar 14088e1986e3SBram Moolenaar filetype plugin on 14098e1986e3SBram Moolenaar copen 14108e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14118e1986e3SBram Moolenaar 14128e1986e3SBram Moolenaar quit! 1413730b2483SBram Moolenaar delete('Xexport_ft.vim') 14148e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14158e1986e3SBram Moolenaar &rtp = save_rtp 14168e1986e3SBram Moolenaarenddef 14178e1986e3SBram Moolenaar 1418efa94447SBram Moolenaardef Test_use_import_in_mapping() 1419cfcd011fSBram Moolenaar var lines =<< trim END 1420efa94447SBram Moolenaar vim9script 1421efa94447SBram Moolenaar export def Funcx() 1422efa94447SBram Moolenaar g:result = 42 1423efa94447SBram Moolenaar enddef 1424efa94447SBram Moolenaar END 1425efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1426efa94447SBram Moolenaar lines =<< trim END 1427efa94447SBram Moolenaar vim9script 1428efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1429b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1430efa94447SBram Moolenaar END 1431efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1432efa94447SBram Moolenaar 1433efa94447SBram Moolenaar source Xmapscript.vim 1434b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1435efa94447SBram Moolenaar assert_equal(42, g:result) 1436efa94447SBram Moolenaar 1437efa94447SBram Moolenaar unlet g:result 1438efa94447SBram Moolenaar delete('XsomeExport.vim') 1439efa94447SBram Moolenaar delete('Xmapscript.vim') 1440b3ca9824SBram Moolenaar nunmap <F3> 1441efa94447SBram Moolenaarenddef 1442efa94447SBram Moolenaar 1443d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1444d3f8a9eeSBram Moolenaar var lines =<< trim END 1445d3f8a9eeSBram Moolenaar if has(g:feature) 1446d3f8a9eeSBram Moolenaar " legacy script 1447d3f8a9eeSBram Moolenaar let g:legacy = 1 1448d3f8a9eeSBram Moolenaar finish 1449d3f8a9eeSBram Moolenaar endif 1450d3f8a9eeSBram Moolenaar vim9script 1451d3f8a9eeSBram Moolenaar g:legacy = 0 1452d3f8a9eeSBram Moolenaar END 1453d3f8a9eeSBram Moolenaar g:feature = 'eval' 1454d3f8a9eeSBram Moolenaar g:legacy = -1 1455d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1456d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1457d3f8a9eeSBram Moolenaar 1458d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1459d3f8a9eeSBram Moolenaar g:legacy = -1 1460d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1461d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1462d3f8a9eeSBram Moolenaarenddef 1463d3f8a9eeSBram Moolenaar 1464750802b5SBram Moolenaardef Test_vim9script_fails() 14658a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14668a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1467cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 14689721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1469cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1470750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1471750802b5SBram Moolenaar 1472cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1473c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1474c785b9a7SBram Moolenaar 1475e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1476e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 14778a7d6542SBram Moolenaarenddef 14788a7d6542SBram Moolenaar 1479f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1480101f4810SBram Moolenaar CheckRunVimInTerminal 1481101f4810SBram Moolenaar 14829bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1483c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14849bb3eb3eSBram Moolenaarendfunc 14859bb3eb3eSBram Moolenaar 1486c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1487cfcd011fSBram Moolenaar var export =<< trim END 1488101f4810SBram Moolenaar vim9script 1489101f4810SBram Moolenaar export def Foo(): number 1490101f4810SBram Moolenaar return 0 1491101f4810SBram Moolenaar enddef 1492101f4810SBram Moolenaar END 1493730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1494101f4810SBram Moolenaar 1495e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 14969bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14972949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1498101f4810SBram Moolenaar 1499730b2483SBram Moolenaar delete('XexportCmd.vim') 15009bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 15019bb3eb3eSBram Moolenaarenddef 1502101f4810SBram Moolenaar 15032b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 15042b32700dSBram Moolenaar var lines =<< trim END 1505a6294955SBram Moolenaar vim9script 1506a6294955SBram Moolenaar export var exported = 'thexport' 1507a6294955SBram Moolenaar END 1508a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1509a6294955SBram Moolenaar lines =<< trim END 15102b32700dSBram Moolenaar vim9script noclear 15112b32700dSBram Moolenaar g:loadCount += 1 15122b32700dSBram Moolenaar var s:reloaded = 'init' 1513a6294955SBram Moolenaar import exported from './XExportReload' 15142b32700dSBram Moolenaar 15152b32700dSBram Moolenaar def Again(): string 15162b32700dSBram Moolenaar return 'again' 15172b32700dSBram Moolenaar enddef 15182b32700dSBram Moolenaar 15192b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 15202b32700dSBram Moolenaar var s:loaded = true 15212b32700dSBram Moolenaar 15222b32700dSBram Moolenaar var s:notReloaded = 'yes' 15232b32700dSBram Moolenaar s:reloaded = 'first' 15242b32700dSBram Moolenaar def g:Values(): list<string> 1525a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 15262b32700dSBram Moolenaar enddef 15272b32700dSBram Moolenaar 15282b32700dSBram Moolenaar def Once(): string 15292b32700dSBram Moolenaar return 'once' 15302b32700dSBram Moolenaar enddef 15312b32700dSBram Moolenaar END 15322b32700dSBram Moolenaar writefile(lines, 'XReloaded') 15332b32700dSBram Moolenaar g:loadCount = 0 15342b32700dSBram Moolenaar source XReloaded 15352b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1536a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 15372b32700dSBram Moolenaar source XReloaded 15382b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1539a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15402b32700dSBram Moolenaar source XReloaded 15412b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1542a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15432b32700dSBram Moolenaar 154448e11c10SBram Moolenaar delete('XReloaded') 1545a6294955SBram Moolenaar delete('XExportReload') 15462b32700dSBram Moolenaar delfunc g:Values 15472b32700dSBram Moolenaar unlet g:loadCount 1548577dc93dSBram Moolenaar 1549577dc93dSBram Moolenaar lines =<< trim END 1550577dc93dSBram Moolenaar vim9script 1551577dc93dSBram Moolenaar def Inner() 1552577dc93dSBram Moolenaar enddef 1553577dc93dSBram Moolenaar END 1554577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1555577dc93dSBram Moolenaar source XreloadScript.vim 1556577dc93dSBram Moolenaar 1557577dc93dSBram Moolenaar lines =<< trim END 1558577dc93dSBram Moolenaar vim9script 1559577dc93dSBram Moolenaar def Outer() 1560577dc93dSBram Moolenaar def Inner() 1561577dc93dSBram Moolenaar enddef 1562577dc93dSBram Moolenaar enddef 1563577dc93dSBram Moolenaar defcompile 1564577dc93dSBram Moolenaar END 1565577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1566577dc93dSBram Moolenaar source XreloadScript.vim 1567577dc93dSBram Moolenaar 1568577dc93dSBram Moolenaar delete('XreloadScript.vim') 15692b32700dSBram Moolenaarenddef 15702b32700dSBram Moolenaar 15714c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1572cfcd011fSBram Moolenaar var lines =<< trim END 15738a7d6542SBram Moolenaar vim9script 15748a7d6542SBram Moolenaar const var = '' 1575cfcd011fSBram Moolenaar var valone = 1234 15768a7d6542SBram Moolenaar def MyFunc(arg: string) 15778a7d6542SBram Moolenaar valone = 5678 15788a7d6542SBram Moolenaar enddef 15798a7d6542SBram Moolenaar END 1580cfcd011fSBram Moolenaar var morelines =<< trim END 1581cfcd011fSBram Moolenaar var valtwo = 222 15828a7d6542SBram Moolenaar export def GetValtwo(): number 15838a7d6542SBram Moolenaar return valtwo 15848a7d6542SBram Moolenaar enddef 15858a7d6542SBram Moolenaar END 158603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15878a7d6542SBram Moolenaar source Xreload.vim 15888a7d6542SBram Moolenaar source Xreload.vim 15898a7d6542SBram Moolenaar source Xreload.vim 15908a7d6542SBram Moolenaar 1591cfcd011fSBram Moolenaar var testlines =<< trim END 15928a7d6542SBram Moolenaar vim9script 15938a7d6542SBram Moolenaar def TheFunc() 15948a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15958a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15968a7d6542SBram Moolenaar enddef 15978a7d6542SBram Moolenaar TheFunc() 15988a7d6542SBram Moolenaar END 15998a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16008a7d6542SBram Moolenaar source Ximport.vim 16018a7d6542SBram Moolenaar 1602f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1603f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16048a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16058a7d6542SBram Moolenaar source Ximport.vim 16068a7d6542SBram Moolenaar 1607f5be8cdbSBram Moolenaar # cannot declare a var twice 16088a7d6542SBram Moolenaar lines =<< trim END 16098a7d6542SBram Moolenaar vim9script 1610cfcd011fSBram Moolenaar var valone = 1234 1611cfcd011fSBram Moolenaar var valone = 5678 16128a7d6542SBram Moolenaar END 16138a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 161444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16158a7d6542SBram Moolenaar 16168a7d6542SBram Moolenaar delete('Xreload.vim') 16178a7d6542SBram Moolenaar delete('Ximport.vim') 16188a7d6542SBram Moolenaarenddef 16198a7d6542SBram Moolenaar 162007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 162107a65d26SBram Moolenaar" compiled function using that variable must fail. 162207a65d26SBram Moolenaardef Test_script_reload_change_type() 162307a65d26SBram Moolenaar var lines =<< trim END 162407a65d26SBram Moolenaar vim9script noclear 162507a65d26SBram Moolenaar var str = 'string' 162607a65d26SBram Moolenaar def g:GetStr(): string 162707a65d26SBram Moolenaar return str .. 'xxx' 162807a65d26SBram Moolenaar enddef 162907a65d26SBram Moolenaar END 163007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 163107a65d26SBram Moolenaar source Xreload.vim 163207a65d26SBram Moolenaar echo g:GetStr() 163307a65d26SBram Moolenaar 163407a65d26SBram Moolenaar lines =<< trim END 163507a65d26SBram Moolenaar vim9script noclear 163607a65d26SBram Moolenaar var str = 1234 163707a65d26SBram Moolenaar END 163807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 163907a65d26SBram Moolenaar source Xreload.vim 164007a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 164107a65d26SBram Moolenaar 164207a65d26SBram Moolenaar delfunc g:GetStr 164307a65d26SBram Moolenaar delete('Xreload.vim') 164407a65d26SBram Moolenaarenddef 164507a65d26SBram Moolenaar 1646c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1647c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1648c970e422SBram Moolenaar 1649c970e422SBram Moolenaardef Test_script_reload_from_function() 1650c970e422SBram Moolenaar var lines =<< trim END 1651c970e422SBram Moolenaar vim9script 1652c970e422SBram Moolenaar 1653c970e422SBram Moolenaar if exists('g:loaded') 1654c970e422SBram Moolenaar finish 1655c970e422SBram Moolenaar endif 1656c970e422SBram Moolenaar g:loaded = 1 1657c970e422SBram Moolenaar delcommand CallFunc 1658c970e422SBram Moolenaar command CallFunc Func() 1659c970e422SBram Moolenaar def Func() 1660a4c81beaSBram Moolenaar so XreloadFunc.vim 1661c970e422SBram Moolenaar g:didTheFunc = 1 1662c970e422SBram Moolenaar enddef 1663c970e422SBram Moolenaar END 1664c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1665c970e422SBram Moolenaar source XreloadFunc.vim 1666c970e422SBram Moolenaar CallFunc 1667c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1668c970e422SBram Moolenaar 1669c970e422SBram Moolenaar delete('XreloadFunc.vim') 1670c970e422SBram Moolenaar delcommand CallFunc 1671c970e422SBram Moolenaar unlet g:loaded 1672c970e422SBram Moolenaar unlet g:didTheFunc 1673c970e422SBram Moolenaarenddef 1674c970e422SBram Moolenaar 16756c3843caSBram Moolenaardef Test_script_var_shadows_function() 16766c3843caSBram Moolenaar var lines =<< trim END 16776c3843caSBram Moolenaar vim9script 16786c3843caSBram Moolenaar def Func(): number 16796c3843caSBram Moolenaar return 123 16806c3843caSBram Moolenaar enddef 16816c3843caSBram Moolenaar var Func = 1 16826c3843caSBram Moolenaar END 16836c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 16846c3843caSBram Moolenaarenddef 16856c3843caSBram Moolenaar 168695006e3dSBram Moolenaardef s:RetSome(): string 168795006e3dSBram Moolenaar return 'some' 168895006e3dSBram Moolenaarenddef 168995006e3dSBram Moolenaar 1690fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1691fe465a01SBram Moolenaar" script-local name. 1692fe465a01SBram Moolenaardef Test_vim9script_funcref() 1693cfcd011fSBram Moolenaar var sortlines =<< trim END 1694fe465a01SBram Moolenaar vim9script 1695fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1696bed36b93SBram Moolenaar return i2 - i1 1697fe465a01SBram Moolenaar enddef 1698fe465a01SBram Moolenaar 1699fe465a01SBram Moolenaar export def FastSort(): list<number> 1700fe465a01SBram Moolenaar return range(5)->sort(Compare) 1701fe465a01SBram Moolenaar enddef 1702529fb5a5SBram Moolenaar 1703529fb5a5SBram Moolenaar export def GetString(arg: string): string 1704529fb5a5SBram Moolenaar return arg 1705529fb5a5SBram Moolenaar enddef 1706fe465a01SBram Moolenaar END 1707fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1708fe465a01SBram Moolenaar 1709cfcd011fSBram Moolenaar var lines =<< trim END 1710fe465a01SBram Moolenaar vim9script 1711fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1712fe465a01SBram Moolenaar def Test() 1713fe465a01SBram Moolenaar g:result = FastSort() 1714fe465a01SBram Moolenaar enddef 1715fe465a01SBram Moolenaar Test() 1716529fb5a5SBram Moolenaar 1717529fb5a5SBram Moolenaar # using a function imported with "as" 1718529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1719529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1720529fb5a5SBram Moolenaar 1721529fb5a5SBram Moolenaar # using the function from a compiled function 1722529fb5a5SBram Moolenaar def TestMore(): string 1723ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1724ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1725529fb5a5SBram Moolenaar enddef 1726ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1727529fb5a5SBram Moolenaar 1728529fb5a5SBram Moolenaar # error when using a function that isn't exported 1729529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1730fe465a01SBram Moolenaar END 1731fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1732fe465a01SBram Moolenaar 1733fe465a01SBram Moolenaar source Xscript.vim 1734fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1735fe465a01SBram Moolenaar 1736fe465a01SBram Moolenaar unlet g:result 1737fe465a01SBram Moolenaar delete('Xsort.vim') 1738fe465a01SBram Moolenaar delete('Xscript.vim') 173995006e3dSBram Moolenaar 1740cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 174195006e3dSBram Moolenaar assert_equal('some', Funcref()) 1742fe465a01SBram Moolenaarenddef 1743fe465a01SBram Moolenaar 1744601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1745601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1746601e76acSBram Moolenaar" function reference. 1747c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1748cfcd011fSBram Moolenaar var filterLines =<< trim END 1749c620c055SBram Moolenaar vim9script 1750c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1751c620c055SBram Moolenaar return idx % 2 == 1 1752c620c055SBram Moolenaar enddef 1753c620c055SBram Moolenaar export def FastFilter(): list<number> 1754c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1755c620c055SBram Moolenaar enddef 1756601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1757601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1758601e76acSBram Moolenaar enddef 1759c620c055SBram Moolenaar END 1760c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1761c620c055SBram Moolenaar 1762cfcd011fSBram Moolenaar var lines =<< trim END 1763c620c055SBram Moolenaar vim9script 1764601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1765c620c055SBram Moolenaar def Test() 1766cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1767c620c055SBram Moolenaar enddef 1768c620c055SBram Moolenaar Test() 1769601e76acSBram Moolenaar def TestDirect() 1770cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1771601e76acSBram Moolenaar enddef 1772601e76acSBram Moolenaar TestDirect() 1773c620c055SBram Moolenaar END 1774601e76acSBram Moolenaar CheckScriptSuccess(lines) 1775c620c055SBram Moolenaar delete('Xfilter.vim') 1776c620c055SBram Moolenaarenddef 1777c620c055SBram Moolenaar 17784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1779cfcd011fSBram Moolenaar var first_lines =<< trim END 17804c17ad94SBram Moolenaar vim9script 17814c17ad94SBram Moolenaar def FuncYes(): string 17824c17ad94SBram Moolenaar return 'yes' 17834c17ad94SBram Moolenaar enddef 17844c17ad94SBram Moolenaar END 1785cfcd011fSBram Moolenaar var withno_lines =<< trim END 17864c17ad94SBram Moolenaar def FuncNo(): string 17874c17ad94SBram Moolenaar return 'no' 17884c17ad94SBram Moolenaar enddef 17894c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17904c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17914c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 179203afdcf1SBram Moolenaar enddef 179303afdcf1SBram Moolenaar END 1794cfcd011fSBram Moolenaar var nono_lines =<< trim END 179503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 179603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 179744d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17984c17ad94SBram Moolenaar enddef 17994c17ad94SBram Moolenaar END 18004c17ad94SBram Moolenaar 18014c17ad94SBram Moolenaar # FuncNo() is defined 180203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18034c17ad94SBram Moolenaar source Xreloaded.vim 18044c17ad94SBram Moolenaar g:DoCheck(true) 18054c17ad94SBram Moolenaar 18064c17ad94SBram Moolenaar # FuncNo() is not redefined 180703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18084c17ad94SBram Moolenaar source Xreloaded.vim 18095082471fSBram Moolenaar g:DoCheck(false) 18104c17ad94SBram Moolenaar 18114c17ad94SBram Moolenaar # FuncNo() is back 181203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18134c17ad94SBram Moolenaar source Xreloaded.vim 18145082471fSBram Moolenaar g:DoCheck(false) 18154c17ad94SBram Moolenaar 18164c17ad94SBram Moolenaar delete('Xreloaded.vim') 18174c17ad94SBram Moolenaarenddef 18184c17ad94SBram Moolenaar 181989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 182089483d40SBram Moolenaar # write the script with a script-local variable 1821cfcd011fSBram Moolenaar var lines =<< trim END 182289483d40SBram Moolenaar vim9script 1823cfcd011fSBram Moolenaar var name = 'string' 182489483d40SBram Moolenaar END 182589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 182689483d40SBram Moolenaar source XreloadVar.vim 182789483d40SBram Moolenaar 182889483d40SBram Moolenaar # now write the script using the same variable locally - works 182989483d40SBram Moolenaar lines =<< trim END 183089483d40SBram Moolenaar vim9script 183189483d40SBram Moolenaar def Func() 1832cfcd011fSBram Moolenaar var name = 'string' 183389483d40SBram Moolenaar enddef 183489483d40SBram Moolenaar END 183589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 183689483d40SBram Moolenaar source XreloadVar.vim 183789483d40SBram Moolenaar 183889483d40SBram Moolenaar delete('XreloadVar.vim') 183989483d40SBram Moolenaarenddef 184089483d40SBram Moolenaar 18418a7d6542SBram Moolenaardef Test_import_absolute() 1842cfcd011fSBram Moolenaar var import_lines = [ 1843e6085c53SBram Moolenaar 'vim9script', 1844e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1845e6085c53SBram Moolenaar 'def UseExported()', 1846e6085c53SBram Moolenaar ' g:imported_abs = exported', 1847e6085c53SBram Moolenaar ' exported = 8888', 1848e6085c53SBram Moolenaar ' g:imported_after = exported', 1849e6085c53SBram Moolenaar 'enddef', 1850e6085c53SBram Moolenaar 'UseExported()', 1851e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1852e6085c53SBram Moolenaar ] 18538a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18548a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18558a7d6542SBram Moolenaar 18568a7d6542SBram Moolenaar source Ximport_abs.vim 18578a7d6542SBram Moolenaar 18588a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18594e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1860fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1861fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1862fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1863fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1864fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1865fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1866fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1867fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1868fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1869fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1870e6085c53SBram Moolenaar g:import_disassembled) 1871b3ca9824SBram Moolenaar 1872b3ca9824SBram Moolenaar Undo_export_script_lines() 18738a7d6542SBram Moolenaar unlet g:imported_abs 18744e12a5dfSBram Moolenaar unlet g:import_disassembled 18758a7d6542SBram Moolenaar 18768a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18778a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18788a7d6542SBram Moolenaarenddef 18798a7d6542SBram Moolenaar 18808a7d6542SBram Moolenaardef Test_import_rtp() 1881cfcd011fSBram Moolenaar var import_lines = [ 1882e6085c53SBram Moolenaar 'vim9script', 1883e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1884e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1885e6085c53SBram Moolenaar ] 18868a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18878a7d6542SBram Moolenaar mkdir('import') 18888a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18898a7d6542SBram Moolenaar 1890cfcd011fSBram Moolenaar var save_rtp = &rtp 18918a7d6542SBram Moolenaar &rtp = getcwd() 18928a7d6542SBram Moolenaar source Ximport_rtp.vim 18938a7d6542SBram Moolenaar &rtp = save_rtp 18948a7d6542SBram Moolenaar 18958a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18968a7d6542SBram Moolenaar 1897b3ca9824SBram Moolenaar Undo_export_script_lines() 1898b3ca9824SBram Moolenaar unlet g:imported_rtp 18998a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 190089483d40SBram Moolenaar delete('import', 'rf') 19018a7d6542SBram Moolenaarenddef 19028a7d6542SBram Moolenaar 190325e0f586SBram Moolenaardef Test_import_compile_error() 1904cfcd011fSBram Moolenaar var export_lines = [ 190525e0f586SBram Moolenaar 'vim9script', 190625e0f586SBram Moolenaar 'export def ExpFunc(): string', 190725e0f586SBram Moolenaar ' return notDefined', 190825e0f586SBram Moolenaar 'enddef', 190925e0f586SBram Moolenaar ] 191025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 191125e0f586SBram Moolenaar 1912cfcd011fSBram Moolenaar var import_lines = [ 191325e0f586SBram Moolenaar 'vim9script', 191425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 191525e0f586SBram Moolenaar 'def ImpFunc()', 191625e0f586SBram Moolenaar ' echo ExpFunc()', 191725e0f586SBram Moolenaar 'enddef', 191825e0f586SBram Moolenaar 'defcompile', 191925e0f586SBram Moolenaar ] 192025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 192125e0f586SBram Moolenaar 192225e0f586SBram Moolenaar try 192325e0f586SBram Moolenaar source Ximport.vim 192425e0f586SBram Moolenaar catch /E1001/ 1925f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 19267707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 192725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 192825e0f586SBram Moolenaar endtry 192925e0f586SBram Moolenaar 193025e0f586SBram Moolenaar delete('Xexported.vim') 193125e0f586SBram Moolenaar delete('Ximport.vim') 193225e0f586SBram Moolenaarenddef 193325e0f586SBram Moolenaar 1934c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1935cfcd011fSBram Moolenaar var lines = [ 1936c4ce36d4SBram Moolenaar 'vim9script', 1937c4ce36d4SBram Moolenaar 'def Func()', 1938c4ce36d4SBram Moolenaar ' eval [][0]', 1939c4ce36d4SBram Moolenaar 'enddef', 1940c4ce36d4SBram Moolenaar 'Func()', 1941c4ce36d4SBram Moolenaar ] 1942c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1943c4ce36d4SBram Moolenaar 1944c4ce36d4SBram Moolenaar for count in range(3) 1945c4ce36d4SBram Moolenaar try 1946c4ce36d4SBram Moolenaar source Xtestscript.vim 1947c4ce36d4SBram Moolenaar catch /E684/ 1948c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1949c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1950c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1951c4ce36d4SBram Moolenaar endtry 1952c4ce36d4SBram Moolenaar endfor 1953c4ce36d4SBram Moolenaar 1954c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1955c4ce36d4SBram Moolenaarenddef 1956c4ce36d4SBram Moolenaar 1957eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1958cfcd011fSBram Moolenaar var export_lines =<< trim END 1959eef2102eSBram Moolenaar vim9script 1960eef2102eSBram Moolenaar export def Func() 1961eef2102eSBram Moolenaar echo 'imported' 1962eef2102eSBram Moolenaar enddef 1963eef2102eSBram Moolenaar END 1964eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1965eef2102eSBram Moolenaar 1966cfcd011fSBram Moolenaar var lines =<< trim END 1967eef2102eSBram Moolenaar vim9script 1968eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1969eef2102eSBram Moolenaar def Func() 1970eef2102eSBram Moolenaar echo 'local to function' 1971eef2102eSBram Moolenaar enddef 1972eef2102eSBram Moolenaar END 1973eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1974eef2102eSBram Moolenaar 1975eef2102eSBram Moolenaar lines =<< trim END 1976eef2102eSBram Moolenaar vim9script 1977eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1978eef2102eSBram Moolenaar def Outer() 1979eef2102eSBram Moolenaar def Func() 1980eef2102eSBram Moolenaar echo 'local to function' 1981eef2102eSBram Moolenaar enddef 1982eef2102eSBram Moolenaar enddef 1983eef2102eSBram Moolenaar defcompile 1984eef2102eSBram Moolenaar END 1985eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1986eef2102eSBram Moolenaar 1987eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1988eef2102eSBram Moolenaarenddef 1989eef2102eSBram Moolenaar 1990b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1991cfcd011fSBram Moolenaar var lines =<< trim END 1992b9a2cac3SBram Moolenaar vim9script 1993b9a2cac3SBram Moolenaar def Func() 1994b9a2cac3SBram Moolenaar echo 'one' 1995b9a2cac3SBram Moolenaar enddef 1996b9a2cac3SBram Moolenaar def Func() 1997b9a2cac3SBram Moolenaar echo 'two' 1998b9a2cac3SBram Moolenaar enddef 1999b9a2cac3SBram Moolenaar END 2000b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2001fa211f3cSBram Moolenaar 2002fa211f3cSBram Moolenaar lines =<< trim END 2003fa211f3cSBram Moolenaar vim9script 2004fa211f3cSBram Moolenaar def Foo(): string 2005fa211f3cSBram Moolenaar return 'foo' 2006fa211f3cSBram Moolenaar enddef 2007fa211f3cSBram Moolenaar def Func() 2008cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2009fa211f3cSBram Moolenaar enddef 2010fa211f3cSBram Moolenaar defcompile 2011fa211f3cSBram Moolenaar END 2012fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2013b9a2cac3SBram Moolenaarenddef 2014b9a2cac3SBram Moolenaar 20158a7d6542SBram Moolenaardef Test_fixed_size_list() 2016f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2017cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 20188a7d6542SBram Moolenaar l->remove(0) 20198a7d6542SBram Moolenaar l->add(5) 20208a7d6542SBram Moolenaar l->insert(99, 1) 20210f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20228a7d6542SBram Moolenaarenddef 20238a7d6542SBram Moolenaar 2024ae616494SBram Moolenaardef Test_no_insert_xit() 2025d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2026d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2027d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2028d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2029d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2030ae616494SBram Moolenaar 2031ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2032ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2033ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2034ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2035f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2036f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 20376508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 20386508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2039f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2040f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2041f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2042ae616494SBram Moolenaarenddef 2043ae616494SBram Moolenaar 2044158906cfSBram Moolenaardef IfElse(what: number): string 2045cfcd011fSBram Moolenaar var res = '' 2046158906cfSBram Moolenaar if what == 1 2047158906cfSBram Moolenaar res = "one" 2048158906cfSBram Moolenaar elseif what == 2 2049158906cfSBram Moolenaar res = "two" 2050a259d8d3SBram Moolenaar else 2051158906cfSBram Moolenaar res = "three" 2052a259d8d3SBram Moolenaar endif 2053158906cfSBram Moolenaar return res 2054a259d8d3SBram Moolenaarenddef 2055a259d8d3SBram Moolenaar 2056158906cfSBram Moolenaardef Test_if_elseif_else() 2057158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2058158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2059158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20600f18b6d1SBram Moolenaarenddef 20610f18b6d1SBram Moolenaar 2062e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2063d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2064d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2065d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2066ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2067d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 20686628b7ebSBram Moolenaar 20696628b7ebSBram Moolenaar var lines =<< trim END 20706628b7ebSBram Moolenaar var s = '' 20716628b7ebSBram Moolenaar if s = '' 20726628b7ebSBram Moolenaar endif 20736628b7ebSBram Moolenaar END 20746628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 20756628b7ebSBram Moolenaar 20766628b7ebSBram Moolenaar lines =<< trim END 20776628b7ebSBram Moolenaar var s = '' 20786628b7ebSBram Moolenaar if s == '' 20796628b7ebSBram Moolenaar elseif s = '' 20806628b7ebSBram Moolenaar endif 20816628b7ebSBram Moolenaar END 20826628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2083e8c4abbbSBram Moolenaarenddef 2084e8c4abbbSBram Moolenaar 20856d69bf60SBram Moolenaarlet g:bool_true = v:true 20866d69bf60SBram Moolenaarlet g:bool_false = v:false 20876d69bf60SBram Moolenaar 20886d69bf60SBram Moolenaardef Test_if_const_expr() 2089cfcd011fSBram Moolenaar var res = false 20906d69bf60SBram Moolenaar if true ? true : false 20916d69bf60SBram Moolenaar res = true 20926d69bf60SBram Moolenaar endif 20936d69bf60SBram Moolenaar assert_equal(true, res) 20946d69bf60SBram Moolenaar 2095585fea7bSBram Moolenaar g:glob = 2 2096585fea7bSBram Moolenaar if false 20976797966dSBram Moolenaar execute('g:glob = 3') 2098585fea7bSBram Moolenaar endif 2099585fea7bSBram Moolenaar assert_equal(2, g:glob) 2100585fea7bSBram Moolenaar if true 21016797966dSBram Moolenaar execute('g:glob = 3') 2102585fea7bSBram Moolenaar endif 2103585fea7bSBram Moolenaar assert_equal(3, g:glob) 2104585fea7bSBram Moolenaar 21056d69bf60SBram Moolenaar res = false 21066d69bf60SBram Moolenaar if g:bool_true ? true : false 21076d69bf60SBram Moolenaar res = true 21086d69bf60SBram Moolenaar endif 21096d69bf60SBram Moolenaar assert_equal(true, res) 21106d69bf60SBram Moolenaar 21116d69bf60SBram Moolenaar res = false 21126d69bf60SBram Moolenaar if true ? g:bool_true : false 21136d69bf60SBram Moolenaar res = true 21146d69bf60SBram Moolenaar endif 21156d69bf60SBram Moolenaar assert_equal(true, res) 21166d69bf60SBram Moolenaar 21176d69bf60SBram Moolenaar res = false 21186d69bf60SBram Moolenaar if true ? true : g:bool_false 21196d69bf60SBram Moolenaar res = true 21206d69bf60SBram Moolenaar endif 21216d69bf60SBram Moolenaar assert_equal(true, res) 21226d69bf60SBram Moolenaar 21236d69bf60SBram Moolenaar res = false 21246d69bf60SBram Moolenaar if true ? false : true 21256d69bf60SBram Moolenaar res = true 21266d69bf60SBram Moolenaar endif 21276d69bf60SBram Moolenaar assert_equal(false, res) 21286d69bf60SBram Moolenaar 21296d69bf60SBram Moolenaar res = false 21306d69bf60SBram Moolenaar if false ? false : true 21316d69bf60SBram Moolenaar res = true 21326d69bf60SBram Moolenaar endif 21336d69bf60SBram Moolenaar assert_equal(true, res) 21346d69bf60SBram Moolenaar 21356d69bf60SBram Moolenaar res = false 21366d69bf60SBram Moolenaar if false ? true : false 21376d69bf60SBram Moolenaar res = true 21386d69bf60SBram Moolenaar endif 21396d69bf60SBram Moolenaar assert_equal(false, res) 21406d69bf60SBram Moolenaar 21416d69bf60SBram Moolenaar res = false 2142e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2143e8c4abbbSBram Moolenaar res = true 2144e8c4abbbSBram Moolenaar endif 2145e8c4abbbSBram Moolenaar assert_equal(false, res) 2146e8c4abbbSBram Moolenaar 2147e8c4abbbSBram Moolenaar res = false 21486d69bf60SBram Moolenaar if true && true 21496d69bf60SBram Moolenaar res = true 21506d69bf60SBram Moolenaar endif 21516d69bf60SBram Moolenaar assert_equal(true, res) 21526d69bf60SBram Moolenaar 21536d69bf60SBram Moolenaar res = false 21546d69bf60SBram Moolenaar if true && false 21556d69bf60SBram Moolenaar res = true 21566d69bf60SBram Moolenaar endif 21576d69bf60SBram Moolenaar assert_equal(false, res) 21586d69bf60SBram Moolenaar 21596d69bf60SBram Moolenaar res = false 21606d69bf60SBram Moolenaar if g:bool_true && false 21616d69bf60SBram Moolenaar res = true 21626d69bf60SBram Moolenaar endif 21636d69bf60SBram Moolenaar assert_equal(false, res) 21646d69bf60SBram Moolenaar 21656d69bf60SBram Moolenaar res = false 21666d69bf60SBram Moolenaar if true && g:bool_false 21676d69bf60SBram Moolenaar res = true 21686d69bf60SBram Moolenaar endif 21696d69bf60SBram Moolenaar assert_equal(false, res) 21706d69bf60SBram Moolenaar 21716d69bf60SBram Moolenaar res = false 21726d69bf60SBram Moolenaar if false && false 21736d69bf60SBram Moolenaar res = true 21746d69bf60SBram Moolenaar endif 21756d69bf60SBram Moolenaar assert_equal(false, res) 21766d69bf60SBram Moolenaar 21776d69bf60SBram Moolenaar res = false 21786d69bf60SBram Moolenaar if true || false 21796d69bf60SBram Moolenaar res = true 21806d69bf60SBram Moolenaar endif 21816d69bf60SBram Moolenaar assert_equal(true, res) 21826d69bf60SBram Moolenaar 21836d69bf60SBram Moolenaar res = false 21846d69bf60SBram Moolenaar if g:bool_true || false 21856d69bf60SBram Moolenaar res = true 21866d69bf60SBram Moolenaar endif 21876d69bf60SBram Moolenaar assert_equal(true, res) 21886d69bf60SBram Moolenaar 21896d69bf60SBram Moolenaar res = false 21906d69bf60SBram Moolenaar if true || g:bool_false 21916d69bf60SBram Moolenaar res = true 21926d69bf60SBram Moolenaar endif 21936d69bf60SBram Moolenaar assert_equal(true, res) 21946d69bf60SBram Moolenaar 21956d69bf60SBram Moolenaar res = false 21966d69bf60SBram Moolenaar if false || false 21976d69bf60SBram Moolenaar res = true 21986d69bf60SBram Moolenaar endif 21996d69bf60SBram Moolenaar assert_equal(false, res) 22003988f64fSBram Moolenaar 22013988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 22023988f64fSBram Moolenaar if false | eval 0 | endif 22033988f64fSBram Moolenaar if false | eval burp + 234 | endif 22043988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22053988f64fSBram Moolenaar if false 22063988f64fSBram Moolenaar burp 22073988f64fSBram Moolenaar endif 220880c34ca3SBram Moolenaarenddef 22096d69bf60SBram Moolenaar 221080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2211d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2212d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2213d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2214d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 22156d69bf60SBram Moolenaarenddef 22166d69bf60SBram Moolenaar 221772abcf42SBram Moolenaardef RunNested(i: number): number 2218cfcd011fSBram Moolenaar var x: number = 0 221972abcf42SBram Moolenaar if i % 2 222072abcf42SBram Moolenaar if 1 2221f5be8cdbSBram Moolenaar # comment 222272abcf42SBram Moolenaar else 2223f5be8cdbSBram Moolenaar # comment 222472abcf42SBram Moolenaar endif 222572abcf42SBram Moolenaar x += 1 222672abcf42SBram Moolenaar else 222772abcf42SBram Moolenaar x += 1000 222872abcf42SBram Moolenaar endif 222972abcf42SBram Moolenaar return x 223072abcf42SBram Moolenaarenddef 223172abcf42SBram Moolenaar 223272abcf42SBram Moolenaardef Test_nested_if() 223372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 223472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 223572abcf42SBram Moolenaarenddef 223672abcf42SBram Moolenaar 2237ad39c094SBram Moolenaardef Test_execute_cmd() 2238e4984290SBram Moolenaar # missing argument is ignored 2239e4984290SBram Moolenaar execute 2240e4984290SBram Moolenaar execute # comment 2241e4984290SBram Moolenaar 2242ad39c094SBram Moolenaar new 2243ad39c094SBram Moolenaar setline(1, 'default') 2244d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2245ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2246a72cfb80SBram Moolenaar 2247d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2248a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2249a72cfb80SBram Moolenaar 2250cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2251cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2252a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2253ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2254a72cfb80SBram Moolenaar 2255d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2256ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2257a72cfb80SBram Moolenaar 2258cfcd011fSBram Moolenaar var cmd_first = 'call ' 2259cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2260ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2261ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2262ad39c094SBram Moolenaar bwipe! 2263585fea7bSBram Moolenaar 2264cfcd011fSBram Moolenaar var n = true 22652d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22662d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22672d6b20d6SBram Moolenaar 2268e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2269e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2270e5abf7afSBram Moolenaar 2271d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2272d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2273d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2274ad39c094SBram Moolenaarenddef 2275ad39c094SBram Moolenaar 227647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2277f5be8cdbSBram Moolenaar # only checks line continuation 2278cfcd011fSBram Moolenaar var lines =<< trim END 227947e880d6SBram Moolenaar vim9script 228047e880d6SBram Moolenaar execute 'g:someVar' 228147e880d6SBram Moolenaar .. ' = ' .. 228247e880d6SBram Moolenaar '28' 228347e880d6SBram Moolenaar assert_equal(28, g:someVar) 228447e880d6SBram Moolenaar unlet g:someVar 228547e880d6SBram Moolenaar END 228647e880d6SBram Moolenaar CheckScriptSuccess(lines) 228747e880d6SBram Moolenaarenddef 228847e880d6SBram Moolenaar 2289ad39c094SBram Moolenaardef Test_echo_cmd() 2290a72cfb80SBram Moolenaar echo 'some' # comment 2291585fea7bSBram Moolenaar echon 'thing' 2292ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2293ad39c094SBram Moolenaar 2294a72cfb80SBram Moolenaar echo "some" # comment 2295a72cfb80SBram Moolenaar echon "thing" 2296a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2297a72cfb80SBram Moolenaar 2298cfcd011fSBram Moolenaar var str1 = 'some' 2299cfcd011fSBram Moolenaar var str2 = 'more' 2300ad39c094SBram Moolenaar echo str1 str2 2301ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2302a72cfb80SBram Moolenaar 2303d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2304ad39c094SBram Moolenaarenddef 2305ad39c094SBram Moolenaar 2306f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2307f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2308f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2309f93c7feaSBram Moolenaar echo 'clear' 2310df069eecSBram Moolenaar :1messages 2311f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2312f93c7feaSBram Moolenaar 2313d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2314f93c7feaSBram Moolenaarenddef 2315f93c7feaSBram Moolenaar 231647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2317f5be8cdbSBram Moolenaar # only checks line continuation 2318cfcd011fSBram Moolenaar var lines =<< trim END 231947e880d6SBram Moolenaar vim9script 232047e880d6SBram Moolenaar echomsg 'here' 232147e880d6SBram Moolenaar .. ' is ' .. 232247e880d6SBram Moolenaar 'a message' 232347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 232447e880d6SBram Moolenaar END 232547e880d6SBram Moolenaar CheckScriptSuccess(lines) 232647e880d6SBram Moolenaarenddef 232747e880d6SBram Moolenaar 2328f93c7feaSBram Moolenaardef Test_echoerr_cmd() 232940ee466cSBram Moolenaar try 233040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 233140ee466cSBram Moolenaar catch 233240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 233340ee466cSBram Moolenaar endtry 2334f93c7feaSBram Moolenaarenddef 2335f93c7feaSBram Moolenaar 233647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2337f5be8cdbSBram Moolenaar # only checks line continuation 2338cfcd011fSBram Moolenaar var lines =<< trim END 233947e880d6SBram Moolenaar vim9script 234047e880d6SBram Moolenaar try 234147e880d6SBram Moolenaar echoerr 'this' 234247e880d6SBram Moolenaar .. ' is ' .. 234347e880d6SBram Moolenaar 'wrong' 234447e880d6SBram Moolenaar catch 234547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 234647e880d6SBram Moolenaar endtry 234747e880d6SBram Moolenaar END 234847e880d6SBram Moolenaar CheckScriptSuccess(lines) 234947e880d6SBram Moolenaarenddef 235047e880d6SBram Moolenaar 235141fe0617SBram Moolenaardef Test_for_outside_of_function() 2352cfcd011fSBram Moolenaar var lines =<< trim END 235341fe0617SBram Moolenaar vim9script 235441fe0617SBram Moolenaar new 235541fe0617SBram Moolenaar for var in range(0, 3) 235641fe0617SBram Moolenaar append(line('$'), var) 235741fe0617SBram Moolenaar endfor 235841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 235941fe0617SBram Moolenaar bwipe! 2360522eefd9SBram Moolenaar 2361522eefd9SBram Moolenaar var result = '' 2362522eefd9SBram Moolenaar for i in [1, 2, 3] 2363522eefd9SBram Moolenaar var loop = ' loop ' .. i 2364522eefd9SBram Moolenaar result ..= loop 2365522eefd9SBram Moolenaar endfor 2366522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 236741fe0617SBram Moolenaar END 236841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 236941fe0617SBram Moolenaar source Xvim9for.vim 237041fe0617SBram Moolenaar delete('Xvim9for.vim') 237141fe0617SBram Moolenaarenddef 23728a7d6542SBram Moolenaar 2373e8c4abbbSBram Moolenaardef Test_for_loop() 2374f2253963SBram Moolenaar var lines =<< trim END 2375cfcd011fSBram Moolenaar var result = '' 2376e8c4abbbSBram Moolenaar for cnt in range(7) 2377e8c4abbbSBram Moolenaar if cnt == 4 2378e8c4abbbSBram Moolenaar break 2379e8c4abbbSBram Moolenaar endif 2380e8c4abbbSBram Moolenaar if cnt == 2 2381e8c4abbbSBram Moolenaar continue 2382e8c4abbbSBram Moolenaar endif 2383e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2384e8c4abbbSBram Moolenaar endfor 2385e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23860ad3e894SBram Moolenaar 2387cfcd011fSBram Moolenaar var concat = '' 23880ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23890ad3e894SBram Moolenaar concat ..= str 23900ad3e894SBram Moolenaar endfor 23910ad3e894SBram Moolenaar assert_equal('onetwo', concat) 239238bd8de5SBram Moolenaar 239338bd8de5SBram Moolenaar var total = 0 239438bd8de5SBram Moolenaar for nr in 239538bd8de5SBram Moolenaar [1, 2, 3] 239638bd8de5SBram Moolenaar total += nr 239738bd8de5SBram Moolenaar endfor 239838bd8de5SBram Moolenaar assert_equal(6, total) 239938bd8de5SBram Moolenaar 240038bd8de5SBram Moolenaar total = 0 240138bd8de5SBram Moolenaar for nr 240238bd8de5SBram Moolenaar in [1, 2, 3] 240338bd8de5SBram Moolenaar total += nr 240438bd8de5SBram Moolenaar endfor 240538bd8de5SBram Moolenaar assert_equal(6, total) 240638bd8de5SBram Moolenaar 240738bd8de5SBram Moolenaar total = 0 240838bd8de5SBram Moolenaar for nr 240938bd8de5SBram Moolenaar in 241038bd8de5SBram Moolenaar [1, 2, 3] 241138bd8de5SBram Moolenaar total += nr 241238bd8de5SBram Moolenaar endfor 241338bd8de5SBram Moolenaar assert_equal(6, total) 2414036d0714SBram Moolenaar 2415a3589a0dSBram Moolenaar # with type 2416a3589a0dSBram Moolenaar total = 0 2417a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2418a3589a0dSBram Moolenaar total += n 2419a3589a0dSBram Moolenaar endfor 2420a3589a0dSBram Moolenaar assert_equal(6, total) 2421a3589a0dSBram Moolenaar 2422fe090eb5SBram Moolenaar var chars = '' 2423fe090eb5SBram Moolenaar for s: string in 'foobar' 2424fe090eb5SBram Moolenaar chars ..= s 2425fe090eb5SBram Moolenaar endfor 2426fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2427fe090eb5SBram Moolenaar 2428a3589a0dSBram Moolenaar # unpack with type 2429f2253963SBram Moolenaar var res = '' 2430a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2431a3589a0dSBram Moolenaar res ..= n .. s 2432a3589a0dSBram Moolenaar endfor 2433a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2434a3589a0dSBram Moolenaar 2435444d8783SBram Moolenaar # unpack with one var 2436444d8783SBram Moolenaar var reslist = [] 2437444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2438444d8783SBram Moolenaar reslist->add(x) 2439444d8783SBram Moolenaar endfor 2440444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2441444d8783SBram Moolenaar 2442a3589a0dSBram Moolenaar # loop over string 2443a3589a0dSBram Moolenaar res = '' 244474e54fcbSBram Moolenaar for c in 'aéc̀d' 244574e54fcbSBram Moolenaar res ..= c .. '-' 244674e54fcbSBram Moolenaar endfor 244774e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 244874e54fcbSBram Moolenaar 244974e54fcbSBram Moolenaar res = '' 245074e54fcbSBram Moolenaar for c in '' 245174e54fcbSBram Moolenaar res ..= c .. '-' 245274e54fcbSBram Moolenaar endfor 245374e54fcbSBram Moolenaar assert_equal('', res) 245474e54fcbSBram Moolenaar 245574e54fcbSBram Moolenaar res = '' 245674e54fcbSBram Moolenaar for c in test_null_string() 245774e54fcbSBram Moolenaar res ..= c .. '-' 245874e54fcbSBram Moolenaar endfor 245974e54fcbSBram Moolenaar assert_equal('', res) 2460f2253963SBram Moolenaar 2461f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2462f2253963SBram Moolenaar {a: 'Cat'} 2463f2253963SBram Moolenaar ] 2464f2253963SBram Moolenaar for dd in foo 2465f2253963SBram Moolenaar dd.counter = 12 2466f2253963SBram Moolenaar endfor 2467f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2468f2253963SBram Moolenaar END 2469f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2470e8c4abbbSBram Moolenaarenddef 2471e8c4abbbSBram Moolenaar 2472e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2473025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2474025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2475025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2476675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2477675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2478cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2479822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 24802d870f8dSBram Moolenaar delfunc! g:Func 2481675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2482675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2483675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 248474e54fcbSBram Moolenaar 248574e54fcbSBram Moolenaar # wrong type detected at compile time 248674e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 248774e54fcbSBram Moolenaar 248874e54fcbSBram Moolenaar # wrong type detected at runtime 248974e54fcbSBram Moolenaar g:adict = {a: 1} 249074e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 249174e54fcbSBram Moolenaar unlet g:adict 2492f6a8d420SBram Moolenaar 2493f6a8d420SBram Moolenaar var lines =<< trim END 2494f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2495f6a8d420SBram Moolenaar for e in d 2496f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2497f6a8d420SBram Moolenaar endfor 2498f6a8d420SBram Moolenaar END 2499f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2500fe090eb5SBram Moolenaar 2501fe090eb5SBram Moolenaar lines =<< trim END 2502fe090eb5SBram Moolenaar for nr: number in ['foo'] 2503fe090eb5SBram Moolenaar endfor 2504fe090eb5SBram Moolenaar END 2505fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2506e8c4abbbSBram Moolenaarenddef 2507e8c4abbbSBram Moolenaar 2508ea87069dSBram Moolenaardef Test_for_loop_script_var() 2509ea87069dSBram Moolenaar # cannot use s:var in a :def function 2510ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2511ea87069dSBram Moolenaar 2512ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2513ea87069dSBram Moolenaar var lines =<< trim END 2514ea87069dSBram Moolenaar vim9script 2515ea87069dSBram Moolenaar var total = 0 2516ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2517ea87069dSBram Moolenaar total += s:var 2518ea87069dSBram Moolenaar endfor 2519ea87069dSBram Moolenaar assert_equal(6, total) 2520ea87069dSBram Moolenaar 2521ea87069dSBram Moolenaar total = 0 2522ea87069dSBram Moolenaar for var in [1, 2, 3] 2523ea87069dSBram Moolenaar total += var 2524ea87069dSBram Moolenaar endfor 2525ea87069dSBram Moolenaar assert_equal(6, total) 2526ea87069dSBram Moolenaar END 2527ea87069dSBram Moolenaarenddef 2528ea87069dSBram Moolenaar 2529792f786aSBram Moolenaardef Test_for_loop_unpack() 25304b8a0651SBram Moolenaar var lines =<< trim END 2531792f786aSBram Moolenaar var result = [] 2532792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2533792f786aSBram Moolenaar result->add(v1) 2534792f786aSBram Moolenaar result->add(v2) 2535792f786aSBram Moolenaar endfor 2536792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2537792f786aSBram Moolenaar 2538792f786aSBram Moolenaar result = [] 2539792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2540792f786aSBram Moolenaar result->add(v1) 2541792f786aSBram Moolenaar result->add(v2) 2542792f786aSBram Moolenaar result->add(v3) 2543792f786aSBram Moolenaar endfor 2544792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2545792f786aSBram Moolenaar 25464b8a0651SBram Moolenaar result = [] 25474b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 25484b8a0651SBram Moolenaar result->add(&ts) 25494b8a0651SBram Moolenaar result->add(&sw) 25504b8a0651SBram Moolenaar endfor 25514b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 25524b8a0651SBram Moolenaar 25534b8a0651SBram Moolenaar var slist: list<string> 25544b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 25554b8a0651SBram Moolenaar slist->add($LOOPVAR) 25564b8a0651SBram Moolenaar slist->add(@r) 25574b8a0651SBram Moolenaar slist->add(v:errmsg) 25584b8a0651SBram Moolenaar endfor 25594b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 25604b8a0651SBram Moolenaar 25614b8a0651SBram Moolenaar slist = [] 25624b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 25634b8a0651SBram Moolenaar slist->add(g:globalvar) 25644b8a0651SBram Moolenaar slist->add(b:bufvar) 25654b8a0651SBram Moolenaar slist->add(w:winvar) 25664b8a0651SBram Moolenaar slist->add(t:tabvar) 25674b8a0651SBram Moolenaar endfor 25684b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2569f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2570b777da9bSBram Moolenaar 2571b777da9bSBram Moolenaar var res = [] 2572b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2573b777da9bSBram Moolenaar res->add(n) 2574b777da9bSBram Moolenaar endfor 2575b777da9bSBram Moolenaar assert_equal([2, 5], res) 25764b8a0651SBram Moolenaar END 25774b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 25784b8a0651SBram Moolenaar 25794b8a0651SBram Moolenaar lines =<< trim END 2580792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2581792f786aSBram Moolenaar echo v1 v2 2582792f786aSBram Moolenaar endfor 2583792f786aSBram Moolenaar END 2584792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2585792f786aSBram Moolenaar 2586792f786aSBram Moolenaar lines =<< trim END 2587792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2588792f786aSBram Moolenaar echo v1 v2 2589792f786aSBram Moolenaar endfor 2590792f786aSBram Moolenaar END 2591792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2592792f786aSBram Moolenaar 2593792f786aSBram Moolenaar lines =<< trim END 2594792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2595792f786aSBram Moolenaar echo v1 2596792f786aSBram Moolenaar endfor 2597792f786aSBram Moolenaar END 2598792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2599792f786aSBram Moolenaarenddef 2600792f786aSBram Moolenaar 2601c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2602f2253963SBram Moolenaar var lines =<< trim END 2603c150c09eSBram Moolenaar var looped = 0 2604c150c09eSBram Moolenaar var cleanup = 0 2605c150c09eSBram Moolenaar for i in range(3) 2606c150c09eSBram Moolenaar looped += 1 2607c150c09eSBram Moolenaar try 2608c150c09eSBram Moolenaar eval [][0] 2609c150c09eSBram Moolenaar catch 2610c150c09eSBram Moolenaar continue 2611c150c09eSBram Moolenaar finally 2612c150c09eSBram Moolenaar cleanup += 1 2613c150c09eSBram Moolenaar endtry 2614c150c09eSBram Moolenaar endfor 2615c150c09eSBram Moolenaar assert_equal(3, looped) 2616c150c09eSBram Moolenaar assert_equal(3, cleanup) 2617f2253963SBram Moolenaar END 2618f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2619c150c09eSBram Moolenaarenddef 2620c150c09eSBram Moolenaar 2621d0df1aacSBram Moolenaardef Test_while_loop() 2622cfcd011fSBram Moolenaar var result = '' 2623cfcd011fSBram Moolenaar var cnt = 0 2624d0df1aacSBram Moolenaar while cnt < 555 2625d0df1aacSBram Moolenaar if cnt == 3 2626d0df1aacSBram Moolenaar break 2627d0df1aacSBram Moolenaar endif 2628d0df1aacSBram Moolenaar cnt += 1 2629d0df1aacSBram Moolenaar if cnt == 2 2630d0df1aacSBram Moolenaar continue 2631d0df1aacSBram Moolenaar endif 2632d0df1aacSBram Moolenaar result ..= cnt .. '_' 2633d0df1aacSBram Moolenaar endwhile 2634d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2635dee37dc7SBram Moolenaar 2636dee37dc7SBram Moolenaar var s = '' 26370123cc1eSBram Moolenaar while s == 'x' # {comment} 2638dee37dc7SBram Moolenaar endwhile 2639d0df1aacSBram Moolenaarenddef 2640d0df1aacSBram Moolenaar 2641e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2642675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2643675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2644675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2645675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2646675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2647675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2648675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 26496628b7ebSBram Moolenaar 26506628b7ebSBram Moolenaar var lines =<< trim END 26516628b7ebSBram Moolenaar var s = '' 26526628b7ebSBram Moolenaar while s = '' 26536628b7ebSBram Moolenaar endwhile 26546628b7ebSBram Moolenaar END 26556628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2656bd5da371SBram Moolenaarenddef 2657bd5da371SBram Moolenaar 26589645e2d9SBram Moolenaardef Test_interrupt_loop() 2659cfcd011fSBram Moolenaar var caught = false 2660cfcd011fSBram Moolenaar var x = 0 266197acfc78SBram Moolenaar try 26629645e2d9SBram Moolenaar while 1 26639645e2d9SBram Moolenaar x += 1 26649645e2d9SBram Moolenaar if x == 100 26659645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 26669645e2d9SBram Moolenaar endif 26679645e2d9SBram Moolenaar endwhile 266897acfc78SBram Moolenaar catch 266997acfc78SBram Moolenaar caught = true 267097acfc78SBram Moolenaar assert_equal(100, x) 267197acfc78SBram Moolenaar endtry 267297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 267325859dd7SBram Moolenaar # consume the CTRL-C 267425859dd7SBram Moolenaar getchar(0) 26759645e2d9SBram Moolenaarenddef 267620431c9dSBram Moolenaar 26774fdae999SBram Moolenaardef Test_automatic_line_continuation() 2678cfcd011fSBram Moolenaar var mylist = [ 26794fdae999SBram Moolenaar 'one', 26804fdae999SBram Moolenaar 'two', 26814fdae999SBram Moolenaar 'three', 2682f5be8cdbSBram Moolenaar ] # comment 26834fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 26844fdae999SBram Moolenaar 2685cfcd011fSBram Moolenaar var mydict = { 2686e0de171eSBram Moolenaar ['one']: 1, 2687e0de171eSBram Moolenaar ['two']: 2, 2688e0de171eSBram Moolenaar ['three']: 26894fdae999SBram Moolenaar 3, 2690f5be8cdbSBram Moolenaar } # comment 2691e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2692e0de171eSBram Moolenaar mydict = { 26932c330432SBram Moolenaar one: 1, # comment 26942c330432SBram Moolenaar two: # comment 26952c330432SBram Moolenaar 2, # comment 26962c330432SBram Moolenaar three: 3 # comment 26972c330432SBram Moolenaar } 2698e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2699e0de171eSBram Moolenaar mydict = { 27002c330432SBram Moolenaar one: 1, 27014fdae999SBram Moolenaar two: 27024fdae999SBram Moolenaar 2, 27032c330432SBram Moolenaar three: 3 27044fdae999SBram Moolenaar } 2705e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2706e6085c53SBram Moolenaar 2707e6085c53SBram Moolenaar assert_equal( 2708e6085c53SBram Moolenaar ['one', 'two', 'three'], 2709e6085c53SBram Moolenaar split('one two three') 2710e6085c53SBram Moolenaar ) 27114fdae999SBram Moolenaarenddef 27124fdae999SBram Moolenaar 27137a092245SBram Moolenaardef Test_vim9_comment() 27147a092245SBram Moolenaar CheckScriptSuccess([ 27157a092245SBram Moolenaar 'vim9script', 27167a092245SBram Moolenaar '# something', 271793f82cbeSBram Moolenaar '#something', 271893f82cbeSBram Moolenaar '#{something', 27197a092245SBram Moolenaar ]) 272093f82cbeSBram Moolenaar 272193f82cbeSBram Moolenaar split Xfile 272293f82cbeSBram Moolenaar CheckScriptSuccess([ 272393f82cbeSBram Moolenaar 'vim9script', 272493f82cbeSBram Moolenaar 'edit #something', 272593f82cbeSBram Moolenaar ]) 272693f82cbeSBram Moolenaar CheckScriptSuccess([ 272793f82cbeSBram Moolenaar 'vim9script', 272893f82cbeSBram Moolenaar 'edit #{something', 272993f82cbeSBram Moolenaar ]) 273093f82cbeSBram Moolenaar close 273193f82cbeSBram Moolenaar 27327a092245SBram Moolenaar CheckScriptFailure([ 27337a092245SBram Moolenaar 'vim9script', 27347a092245SBram Moolenaar ':# something', 27357a092245SBram Moolenaar ], 'E488:') 27367a092245SBram Moolenaar CheckScriptFailure([ 27377a092245SBram Moolenaar '# something', 27387a092245SBram Moolenaar ], 'E488:') 27397a092245SBram Moolenaar CheckScriptFailure([ 27407a092245SBram Moolenaar ':# something', 27417a092245SBram Moolenaar ], 'E488:') 27427a092245SBram Moolenaar 27434a8d9f2eSBram Moolenaar { # block start 27444a8d9f2eSBram Moolenaar } # block end 27454a8d9f2eSBram Moolenaar CheckDefFailure([ 27464a8d9f2eSBram Moolenaar '{# comment', 27474a8d9f2eSBram Moolenaar ], 'E488:') 27484a8d9f2eSBram Moolenaar CheckDefFailure([ 27494a8d9f2eSBram Moolenaar '{', 27504a8d9f2eSBram Moolenaar '}# comment', 27514a8d9f2eSBram Moolenaar ], 'E488:') 27524a8d9f2eSBram Moolenaar 27534a8d9f2eSBram Moolenaar echo "yes" # comment 27544a8d9f2eSBram Moolenaar CheckDefFailure([ 27554a8d9f2eSBram Moolenaar 'echo "yes"# comment', 27564a8d9f2eSBram Moolenaar ], 'E488:') 27577a092245SBram Moolenaar CheckScriptSuccess([ 27587a092245SBram Moolenaar 'vim9script', 27597a092245SBram Moolenaar 'echo "yes" # something', 27607a092245SBram Moolenaar ]) 27617a092245SBram Moolenaar CheckScriptFailure([ 27627a092245SBram Moolenaar 'vim9script', 27637a092245SBram Moolenaar 'echo "yes"# something', 27647a092245SBram Moolenaar ], 'E121:') 27657a092245SBram Moolenaar CheckScriptFailure([ 27667a092245SBram Moolenaar 'vim9script', 27677a092245SBram Moolenaar 'echo# something', 2768f8103f27SBram Moolenaar ], 'E1144:') 27697a092245SBram Moolenaar CheckScriptFailure([ 27707a092245SBram Moolenaar 'echo "yes" # something', 27717a092245SBram Moolenaar ], 'E121:') 27727a092245SBram Moolenaar 27734a8d9f2eSBram Moolenaar exe "echo" # comment 27744a8d9f2eSBram Moolenaar CheckDefFailure([ 27754a8d9f2eSBram Moolenaar 'exe "echo"# comment', 27764a8d9f2eSBram Moolenaar ], 'E488:') 27774a8d9f2eSBram Moolenaar CheckScriptSuccess([ 27784a8d9f2eSBram Moolenaar 'vim9script', 27794a8d9f2eSBram Moolenaar 'exe "echo" # something', 27804a8d9f2eSBram Moolenaar ]) 27814a8d9f2eSBram Moolenaar CheckScriptFailure([ 27824a8d9f2eSBram Moolenaar 'vim9script', 27834a8d9f2eSBram Moolenaar 'exe "echo"# something', 27844a8d9f2eSBram Moolenaar ], 'E121:') 27854a8d9f2eSBram Moolenaar CheckScriptFailure([ 27864a8d9f2eSBram Moolenaar 'vim9script', 27874a8d9f2eSBram Moolenaar 'exe# something', 2788f8103f27SBram Moolenaar ], 'E1144:') 27894a8d9f2eSBram Moolenaar CheckScriptFailure([ 27904a8d9f2eSBram Moolenaar 'exe "echo" # something', 27914a8d9f2eSBram Moolenaar ], 'E121:') 27924a8d9f2eSBram Moolenaar 27937a092245SBram Moolenaar CheckDefFailure([ 27947a092245SBram Moolenaar 'try# comment', 27957a092245SBram Moolenaar ' echo "yes"', 27967a092245SBram Moolenaar 'catch', 27977a092245SBram Moolenaar 'endtry', 2798f8103f27SBram Moolenaar ], 'E1144:') 27992c5ed4e3SBram Moolenaar CheckScriptFailure([ 28002c5ed4e3SBram Moolenaar 'vim9script', 28012c5ed4e3SBram Moolenaar 'try# comment', 28022c5ed4e3SBram Moolenaar 'echo "yes"', 2803f8103f27SBram Moolenaar ], 'E1144:') 28047a092245SBram Moolenaar CheckDefFailure([ 28057a092245SBram Moolenaar 'try', 2806a72cfb80SBram Moolenaar ' throw#comment', 2807a72cfb80SBram Moolenaar 'catch', 2808a72cfb80SBram Moolenaar 'endtry', 2809f8103f27SBram Moolenaar ], 'E1144:') 2810a72cfb80SBram Moolenaar CheckDefFailure([ 2811a72cfb80SBram Moolenaar 'try', 2812a72cfb80SBram Moolenaar ' throw "yes"#comment', 2813a72cfb80SBram Moolenaar 'catch', 2814a72cfb80SBram Moolenaar 'endtry', 2815a72cfb80SBram Moolenaar ], 'E488:') 2816a72cfb80SBram Moolenaar CheckDefFailure([ 2817a72cfb80SBram Moolenaar 'try', 28187a092245SBram Moolenaar ' echo "yes"', 28197a092245SBram Moolenaar 'catch# comment', 28207a092245SBram Moolenaar 'endtry', 2821f8103f27SBram Moolenaar ], 'E1144:') 28222c5ed4e3SBram Moolenaar CheckScriptFailure([ 28232c5ed4e3SBram Moolenaar 'vim9script', 28242c5ed4e3SBram Moolenaar 'try', 28252c5ed4e3SBram Moolenaar ' echo "yes"', 28262c5ed4e3SBram Moolenaar 'catch# comment', 28272c5ed4e3SBram Moolenaar 'endtry', 2828f8103f27SBram Moolenaar ], 'E1144:') 28292c5ed4e3SBram Moolenaar CheckDefFailure([ 28302c5ed4e3SBram Moolenaar 'try', 28312c5ed4e3SBram Moolenaar ' echo "yes"', 28322c5ed4e3SBram Moolenaar 'catch /pat/# comment', 28332c5ed4e3SBram Moolenaar 'endtry', 28342c5ed4e3SBram Moolenaar ], 'E488:') 28357a092245SBram Moolenaar CheckDefFailure([ 28367a092245SBram Moolenaar 'try', 28377a092245SBram Moolenaar 'echo "yes"', 28387a092245SBram Moolenaar 'catch', 28397a092245SBram Moolenaar 'endtry# comment', 2840f8103f27SBram Moolenaar ], 'E1144:') 28412c5ed4e3SBram Moolenaar CheckScriptFailure([ 28422c5ed4e3SBram Moolenaar 'vim9script', 28432c5ed4e3SBram Moolenaar 'try', 28442c5ed4e3SBram Moolenaar ' echo "yes"', 28452c5ed4e3SBram Moolenaar 'catch', 28462c5ed4e3SBram Moolenaar 'endtry# comment', 2847f8103f27SBram Moolenaar ], 'E1144:') 28482c5ed4e3SBram Moolenaar 28492c5ed4e3SBram Moolenaar CheckScriptSuccess([ 28502c5ed4e3SBram Moolenaar 'vim9script', 28512c5ed4e3SBram Moolenaar 'hi # comment', 28522c5ed4e3SBram Moolenaar ]) 28532c5ed4e3SBram Moolenaar CheckScriptFailure([ 28542c5ed4e3SBram Moolenaar 'vim9script', 28552c5ed4e3SBram Moolenaar 'hi# comment', 2856f8103f27SBram Moolenaar ], 'E1144:') 28571966c248SBram Moolenaar CheckScriptSuccess([ 28581966c248SBram Moolenaar 'vim9script', 28591966c248SBram Moolenaar 'hi Search # comment', 28601966c248SBram Moolenaar ]) 28611966c248SBram Moolenaar CheckScriptFailure([ 28621966c248SBram Moolenaar 'vim9script', 28631966c248SBram Moolenaar 'hi Search# comment', 28641966c248SBram Moolenaar ], 'E416:') 28651966c248SBram Moolenaar CheckScriptSuccess([ 28661966c248SBram Moolenaar 'vim9script', 28671966c248SBram Moolenaar 'hi link This Search # comment', 28681966c248SBram Moolenaar ]) 28691966c248SBram Moolenaar CheckScriptFailure([ 28701966c248SBram Moolenaar 'vim9script', 28711966c248SBram Moolenaar 'hi link This That# comment', 28721966c248SBram Moolenaar ], 'E413:') 28731966c248SBram Moolenaar CheckScriptSuccess([ 28741966c248SBram Moolenaar 'vim9script', 28751966c248SBram Moolenaar 'hi clear This # comment', 28761966c248SBram Moolenaar 'hi clear # comment', 28771966c248SBram Moolenaar ]) 2878f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2879f5be8cdbSBram Moolenaar # hi clear This# comment', 28801966c248SBram Moolenaar CheckScriptFailure([ 28811966c248SBram Moolenaar 'vim9script', 28821966c248SBram Moolenaar 'hi clear# comment', 28831966c248SBram Moolenaar ], 'E416:') 28841966c248SBram Moolenaar 28851966c248SBram Moolenaar CheckScriptSuccess([ 28861966c248SBram Moolenaar 'vim9script', 28871966c248SBram Moolenaar 'hi Group term=bold', 28881966c248SBram Moolenaar 'match Group /todo/ # comment', 28891966c248SBram Moolenaar ]) 28901966c248SBram Moolenaar CheckScriptFailure([ 28911966c248SBram Moolenaar 'vim9script', 28921966c248SBram Moolenaar 'hi Group term=bold', 28931966c248SBram Moolenaar 'match Group /todo/# comment', 28941966c248SBram Moolenaar ], 'E488:') 28951966c248SBram Moolenaar CheckScriptSuccess([ 28961966c248SBram Moolenaar 'vim9script', 28971966c248SBram Moolenaar 'match # comment', 28981966c248SBram Moolenaar ]) 28991966c248SBram Moolenaar CheckScriptFailure([ 29001966c248SBram Moolenaar 'vim9script', 29011966c248SBram Moolenaar 'match# comment', 2902f8103f27SBram Moolenaar ], 'E1144:') 29031966c248SBram Moolenaar CheckScriptSuccess([ 29041966c248SBram Moolenaar 'vim9script', 29051966c248SBram Moolenaar 'match none # comment', 29061966c248SBram Moolenaar ]) 29071966c248SBram Moolenaar CheckScriptFailure([ 29081966c248SBram Moolenaar 'vim9script', 29091966c248SBram Moolenaar 'match none# comment', 29101966c248SBram Moolenaar ], 'E475:') 29111966c248SBram Moolenaar 29121966c248SBram Moolenaar CheckScriptSuccess([ 29131966c248SBram Moolenaar 'vim9script', 29141966c248SBram Moolenaar 'menutrans clear # comment', 29151966c248SBram Moolenaar ]) 29161966c248SBram Moolenaar CheckScriptFailure([ 29171966c248SBram Moolenaar 'vim9script', 29181966c248SBram Moolenaar 'menutrans clear# comment text', 29191966c248SBram Moolenaar ], 'E474:') 29201966c248SBram Moolenaar 29211966c248SBram Moolenaar CheckScriptSuccess([ 29221966c248SBram Moolenaar 'vim9script', 29231966c248SBram Moolenaar 'syntax clear # comment', 29241966c248SBram Moolenaar ]) 29251966c248SBram Moolenaar CheckScriptFailure([ 29261966c248SBram Moolenaar 'vim9script', 29271966c248SBram Moolenaar 'syntax clear# comment text', 29281966c248SBram Moolenaar ], 'E28:') 29291966c248SBram Moolenaar CheckScriptSuccess([ 29301966c248SBram Moolenaar 'vim9script', 29311966c248SBram Moolenaar 'syntax keyword Word some', 29321966c248SBram Moolenaar 'syntax clear Word # comment', 29331966c248SBram Moolenaar ]) 29341966c248SBram Moolenaar CheckScriptFailure([ 29351966c248SBram Moolenaar 'vim9script', 29361966c248SBram Moolenaar 'syntax keyword Word some', 29371966c248SBram Moolenaar 'syntax clear Word# comment text', 29381966c248SBram Moolenaar ], 'E28:') 29391966c248SBram Moolenaar 29401966c248SBram Moolenaar CheckScriptSuccess([ 29411966c248SBram Moolenaar 'vim9script', 29421966c248SBram Moolenaar 'syntax list # comment', 29431966c248SBram Moolenaar ]) 29441966c248SBram Moolenaar CheckScriptFailure([ 29451966c248SBram Moolenaar 'vim9script', 29461966c248SBram Moolenaar 'syntax list# comment text', 29471966c248SBram Moolenaar ], 'E28:') 29481966c248SBram Moolenaar 29491966c248SBram Moolenaar CheckScriptSuccess([ 29501966c248SBram Moolenaar 'vim9script', 29511966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 29521966c248SBram Moolenaar ]) 29531966c248SBram Moolenaar CheckScriptFailure([ 29541966c248SBram Moolenaar 'vim9script', 29551966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 29561966c248SBram Moolenaar ], 'E475:') 29571966c248SBram Moolenaar 29581966c248SBram Moolenaar CheckScriptSuccess([ 29591966c248SBram Moolenaar 'vim9script', 29601966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 29611966c248SBram Moolenaar ]) 29621966c248SBram Moolenaar CheckScriptFailure([ 29631966c248SBram Moolenaar 'vim9script', 29641966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 29651966c248SBram Moolenaar ], 'E789:') 29661966c248SBram Moolenaar 29671966c248SBram Moolenaar CheckScriptSuccess([ 29681966c248SBram Moolenaar 'vim9script', 29691966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 29701966c248SBram Moolenaar ]) 29711966c248SBram Moolenaar CheckScriptFailure([ 29721966c248SBram Moolenaar 'vim9script', 29731966c248SBram Moolenaar 'syntax match Word /pat/# comment', 29741966c248SBram Moolenaar ], 'E402:') 29751966c248SBram Moolenaar 29761966c248SBram Moolenaar CheckScriptSuccess([ 29771966c248SBram Moolenaar 'vim9script', 29781966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 29791966c248SBram Moolenaar ]) 29801966c248SBram Moolenaar CheckScriptFailure([ 29811966c248SBram Moolenaar 'vim9script', 29821966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 29831966c248SBram Moolenaar ], 'E475:') 29841966c248SBram Moolenaar CheckScriptFailure([ 29851966c248SBram Moolenaar 'vim9script', 29861966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 29871966c248SBram Moolenaar ], 'E406:') 29881966c248SBram Moolenaar CheckScriptFailure([ 29891966c248SBram Moolenaar 'vim9script', 29901966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 29911966c248SBram Moolenaar ], 'E475:') 29921966c248SBram Moolenaar 29931966c248SBram Moolenaar CheckScriptSuccess([ 29941966c248SBram Moolenaar 'vim9script', 29951966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 29961966c248SBram Moolenaar ]) 29971966c248SBram Moolenaar CheckScriptFailure([ 29981966c248SBram Moolenaar 'vim9script', 29991966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3000d032f34aSBram Moolenaar ], 'E402:') 30011966c248SBram Moolenaar 30021966c248SBram Moolenaar CheckScriptSuccess([ 30031966c248SBram Moolenaar 'vim9script', 30041966c248SBram Moolenaar 'syntax sync # comment', 30051966c248SBram Moolenaar ]) 30061966c248SBram Moolenaar CheckScriptFailure([ 30071966c248SBram Moolenaar 'vim9script', 30081966c248SBram Moolenaar 'syntax sync# comment', 30091966c248SBram Moolenaar ], 'E404:') 30101966c248SBram Moolenaar CheckScriptSuccess([ 30111966c248SBram Moolenaar 'vim9script', 30121966c248SBram Moolenaar 'syntax sync ccomment # comment', 30131966c248SBram Moolenaar ]) 30141966c248SBram Moolenaar CheckScriptFailure([ 30151966c248SBram Moolenaar 'vim9script', 30161966c248SBram Moolenaar 'syntax sync ccomment# comment', 30171966c248SBram Moolenaar ], 'E404:') 30181966c248SBram Moolenaar 30191966c248SBram Moolenaar CheckScriptSuccess([ 30201966c248SBram Moolenaar 'vim9script', 30211966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 30221966c248SBram Moolenaar ]) 30231966c248SBram Moolenaar CheckScriptFailure([ 30241966c248SBram Moolenaar 'vim9script', 30251966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 30261966c248SBram Moolenaar ], 'E475:') 3027a72cfb80SBram Moolenaar 3028a72cfb80SBram Moolenaar CheckScriptSuccess([ 3029a72cfb80SBram Moolenaar 'vim9script', 3030a72cfb80SBram Moolenaar 'command Echo echo # comment', 3031a72cfb80SBram Moolenaar 'command Echo # comment', 30322d870f8dSBram Moolenaar 'delcommand Echo', 3033a72cfb80SBram Moolenaar ]) 3034a72cfb80SBram Moolenaar CheckScriptFailure([ 3035a72cfb80SBram Moolenaar 'vim9script', 3036a72cfb80SBram Moolenaar 'command Echo echo# comment', 3037a72cfb80SBram Moolenaar 'Echo', 3038f8103f27SBram Moolenaar ], 'E1144:') 30392d870f8dSBram Moolenaar delcommand Echo 304070249ee8SBram Moolenaar 304170249ee8SBram Moolenaar var curdir = getcwd() 304270249ee8SBram Moolenaar CheckScriptSuccess([ 304370249ee8SBram Moolenaar 'command Echo cd " comment', 304470249ee8SBram Moolenaar 'Echo', 304570249ee8SBram Moolenaar 'delcommand Echo', 304670249ee8SBram Moolenaar ]) 304770249ee8SBram Moolenaar CheckScriptSuccess([ 3048090728adSBram Moolenaar 'vim9script', 304970249ee8SBram Moolenaar 'command Echo cd # comment', 305070249ee8SBram Moolenaar 'Echo', 305170249ee8SBram Moolenaar 'delcommand Echo', 305270249ee8SBram Moolenaar ]) 305370249ee8SBram Moolenaar CheckScriptFailure([ 305470249ee8SBram Moolenaar 'vim9script', 305570249ee8SBram Moolenaar 'command Echo cd " comment', 305670249ee8SBram Moolenaar 'Echo', 305770249ee8SBram Moolenaar ], 'E344:') 305870249ee8SBram Moolenaar delcommand Echo 305970249ee8SBram Moolenaar chdir(curdir) 306070249ee8SBram Moolenaar 3061a72cfb80SBram Moolenaar CheckScriptFailure([ 3062a72cfb80SBram Moolenaar 'vim9script', 3063a72cfb80SBram Moolenaar 'command Echo# comment', 3064a72cfb80SBram Moolenaar ], 'E182:') 3065a72cfb80SBram Moolenaar CheckScriptFailure([ 3066a72cfb80SBram Moolenaar 'vim9script', 3067a72cfb80SBram Moolenaar 'command Echo echo', 3068a72cfb80SBram Moolenaar 'command Echo# comment', 3069a72cfb80SBram Moolenaar ], 'E182:') 30702d870f8dSBram Moolenaar delcommand Echo 3071a72cfb80SBram Moolenaar 3072a72cfb80SBram Moolenaar CheckScriptSuccess([ 3073a72cfb80SBram Moolenaar 'vim9script', 3074a72cfb80SBram Moolenaar 'function # comment', 3075a72cfb80SBram Moolenaar ]) 3076a72cfb80SBram Moolenaar CheckScriptFailure([ 3077a72cfb80SBram Moolenaar 'vim9script', 30789898107fSBram Moolenaar 'function " comment', 30799898107fSBram Moolenaar ], 'E129:') 30809898107fSBram Moolenaar CheckScriptFailure([ 30819898107fSBram Moolenaar 'vim9script', 3082a72cfb80SBram Moolenaar 'function# comment', 3083f8103f27SBram Moolenaar ], 'E1144:') 3084a72cfb80SBram Moolenaar CheckScriptSuccess([ 3085a72cfb80SBram Moolenaar 'vim9script', 3086a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3087a72cfb80SBram Moolenaar ]) 3088a72cfb80SBram Moolenaar CheckScriptFailure([ 3089a72cfb80SBram Moolenaar 'vim9script', 3090a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3091a72cfb80SBram Moolenaar ], 'E488:') 3092a72cfb80SBram Moolenaar 3093a72cfb80SBram Moolenaar CheckScriptSuccess([ 3094a72cfb80SBram Moolenaar 'vim9script', 30954c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3096a72cfb80SBram Moolenaar 'endfunc', 30974c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3098a72cfb80SBram Moolenaar ]) 3099a72cfb80SBram Moolenaar CheckScriptFailure([ 3100a72cfb80SBram Moolenaar 'vim9script', 31014c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3102a72cfb80SBram Moolenaar 'endfunc', 31034c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3104a72cfb80SBram Moolenaar ], 'E488:') 3105a72cfb80SBram Moolenaar 3106a72cfb80SBram Moolenaar CheckScriptSuccess([ 3107a72cfb80SBram Moolenaar 'vim9script', 3108a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3109a72cfb80SBram Moolenaar ]) 3110a72cfb80SBram Moolenaar CheckScriptFailure([ 3111a72cfb80SBram Moolenaar 'vim9script', 3112a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3113a72cfb80SBram Moolenaar ], 'E488:') 3114e7e4838fSBram Moolenaar 3115e7e4838fSBram Moolenaar CheckScriptFailure([ 3116e7e4838fSBram Moolenaar 'def Test() " comment', 3117e7e4838fSBram Moolenaar 'enddef', 3118e7e4838fSBram Moolenaar ], 'E488:') 3119e7e4838fSBram Moolenaar CheckScriptFailure([ 3120e7e4838fSBram Moolenaar 'vim9script', 3121e7e4838fSBram Moolenaar 'def Test() " comment', 3122e7e4838fSBram Moolenaar 'enddef', 3123e7e4838fSBram Moolenaar ], 'E488:') 3124e7e4838fSBram Moolenaar 3125e7e4838fSBram Moolenaar CheckScriptSuccess([ 3126e7e4838fSBram Moolenaar 'func Test() " comment', 3127e7e4838fSBram Moolenaar 'endfunc', 31282d870f8dSBram Moolenaar 'delfunc Test', 3129e7e4838fSBram Moolenaar ]) 31309898107fSBram Moolenaar CheckScriptSuccess([ 3131e7e4838fSBram Moolenaar 'vim9script', 3132e7e4838fSBram Moolenaar 'func Test() " comment', 3133e7e4838fSBram Moolenaar 'endfunc', 31349898107fSBram Moolenaar ]) 3135e7e4838fSBram Moolenaar 3136e7e4838fSBram Moolenaar CheckScriptSuccess([ 3137e7e4838fSBram Moolenaar 'def Test() # comment', 3138e7e4838fSBram Moolenaar 'enddef', 3139e7e4838fSBram Moolenaar ]) 3140e7e4838fSBram Moolenaar CheckScriptFailure([ 3141e7e4838fSBram Moolenaar 'func Test() # comment', 3142e7e4838fSBram Moolenaar 'endfunc', 3143e7e4838fSBram Moolenaar ], 'E488:') 31440f37e356SBram Moolenaar 31450f37e356SBram Moolenaar var lines =<< trim END 31460f37e356SBram Moolenaar vim9script 31470f37e356SBram Moolenaar syn region Text 31480f37e356SBram Moolenaar \ start='foo' 31490f37e356SBram Moolenaar #\ comment 31500f37e356SBram Moolenaar \ end='bar' 31515072b47aSBram Moolenaar syn region Text start='foo' 31525072b47aSBram Moolenaar #\ comment 31535072b47aSBram Moolenaar \ end='bar' 31540f37e356SBram Moolenaar END 31550f37e356SBram Moolenaar CheckScriptSuccess(lines) 31560f37e356SBram Moolenaar 31570f37e356SBram Moolenaar lines =<< trim END 31580f37e356SBram Moolenaar vim9script 31590f37e356SBram Moolenaar syn region Text 31600f37e356SBram Moolenaar \ start='foo' 31610f37e356SBram Moolenaar "\ comment 31620f37e356SBram Moolenaar \ end='bar' 31630f37e356SBram Moolenaar END 31640f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 31652c5ed4e3SBram Moolenaarenddef 31662c5ed4e3SBram Moolenaar 31672c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 31682c5ed4e3SBram Moolenaar CheckCanRunGui 31692c5ed4e3SBram Moolenaar 31702c5ed4e3SBram Moolenaar CheckScriptFailure([ 31712c5ed4e3SBram Moolenaar 'vim9script', 31722c5ed4e3SBram Moolenaar 'gui#comment' 3173f8103f27SBram Moolenaar ], 'E1144:') 31742c5ed4e3SBram Moolenaar CheckScriptFailure([ 31752c5ed4e3SBram Moolenaar 'vim9script', 31762c5ed4e3SBram Moolenaar 'gui -f#comment' 31772c5ed4e3SBram Moolenaar ], 'E499:') 31787a092245SBram Moolenaarenddef 31797a092245SBram Moolenaar 3180a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 31816797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 31826797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3183a26b9700SBram Moolenaar 3184a26b9700SBram Moolenaar edit test.vim 3185a26b9700SBram Moolenaar doautocmd TabEnter #comment 3186a26b9700SBram Moolenaar assert_equal(1, g:entered) 3187a26b9700SBram Moolenaar 3188a26b9700SBram Moolenaar doautocmd TabEnter f.x 3189a26b9700SBram Moolenaar assert_equal(2, g:entered) 3190a26b9700SBram Moolenaar 3191a26b9700SBram Moolenaar g:entered = 0 3192a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3193a26b9700SBram Moolenaar assert_equal(2, g:entered) 3194a26b9700SBram Moolenaar 3195a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3196a26b9700SBram Moolenaar 3197a26b9700SBram Moolenaar au! TabEnter 3198a26b9700SBram Moolenaar unlet g:entered 3199d72c1bf0SBram Moolenaar 3200d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3201d72c1bf0SBram Moolenaar 'vim9script', 32026797966dSBram Moolenaar 'g:var = 123', 3203e55b1c09SBram Moolenaar 'b:var = 456', 3204e55b1c09SBram Moolenaar 'w:var = 777', 3205e55b1c09SBram Moolenaar 't:var = 888', 3206d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3207d72c1bf0SBram Moolenaar ]) 3208d72c1bf0SBram Moolenaar 3209d72c1bf0SBram Moolenaar CheckScriptFailure([ 3210d72c1bf0SBram Moolenaar 'vim9script', 3211cfcd011fSBram Moolenaar 'let var = 123', 3212cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3213cfcd011fSBram Moolenaar 3214cfcd011fSBram Moolenaar CheckScriptFailure([ 3215cfcd011fSBram Moolenaar 'vim9script', 3216cfcd011fSBram Moolenaar 'var g:var = 123', 3217e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3218e55b1c09SBram Moolenaar 3219e55b1c09SBram Moolenaar CheckScriptFailure([ 3220e55b1c09SBram Moolenaar 'vim9script', 3221cfcd011fSBram Moolenaar 'var b:var = 123', 3222e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3223e55b1c09SBram Moolenaar 3224e55b1c09SBram Moolenaar CheckScriptFailure([ 3225e55b1c09SBram Moolenaar 'vim9script', 3226cfcd011fSBram Moolenaar 'var w:var = 123', 3227e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3228e55b1c09SBram Moolenaar 3229e55b1c09SBram Moolenaar CheckScriptFailure([ 3230e55b1c09SBram Moolenaar 'vim9script', 3231cfcd011fSBram Moolenaar 'var t:var = 123', 3232e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3233e55b1c09SBram Moolenaar 3234e55b1c09SBram Moolenaar CheckScriptFailure([ 3235e55b1c09SBram Moolenaar 'vim9script', 3236cfcd011fSBram Moolenaar 'var v:version = 123', 3237e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3238e55b1c09SBram Moolenaar 3239e55b1c09SBram Moolenaar CheckScriptFailure([ 3240e55b1c09SBram Moolenaar 'vim9script', 3241cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3242e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 32436797966dSBram Moolenaar 32446797966dSBram Moolenaar CheckScriptFailure([ 32456797966dSBram Moolenaar 'vim9script', 32466797966dSBram Moolenaar 'g:var = 123', 324732e35117SBram Moolenaar 'unlet g:var# comment1', 3248d72c1bf0SBram Moolenaar ], 'E108:') 3249d72c1bf0SBram Moolenaar 3250d72c1bf0SBram Moolenaar CheckScriptFailure([ 3251d72c1bf0SBram Moolenaar 'let g:var = 123', 3252d72c1bf0SBram Moolenaar 'unlet g:var # something', 3253d72c1bf0SBram Moolenaar ], 'E488:') 3254faac4104SBram Moolenaar 3255faac4104SBram Moolenaar CheckScriptSuccess([ 3256faac4104SBram Moolenaar 'vim9script', 325732e35117SBram Moolenaar 'if 1 # comment2', 3258faac4104SBram Moolenaar ' echo "yes"', 3259faac4104SBram Moolenaar 'elseif 2 #comment', 3260faac4104SBram Moolenaar ' echo "no"', 3261faac4104SBram Moolenaar 'endif', 3262faac4104SBram Moolenaar ]) 3263faac4104SBram Moolenaar 3264faac4104SBram Moolenaar CheckScriptFailure([ 3265faac4104SBram Moolenaar 'vim9script', 326632e35117SBram Moolenaar 'if 1# comment3', 3267faac4104SBram Moolenaar ' echo "yes"', 3268faac4104SBram Moolenaar 'endif', 3269fae55a9cSBram Moolenaar ], 'E488:') 3270faac4104SBram Moolenaar 3271faac4104SBram Moolenaar CheckScriptFailure([ 3272faac4104SBram Moolenaar 'vim9script', 327332e35117SBram Moolenaar 'if 0 # comment4', 3274faac4104SBram Moolenaar ' echo "yes"', 3275faac4104SBram Moolenaar 'elseif 2#comment', 3276faac4104SBram Moolenaar ' echo "no"', 3277faac4104SBram Moolenaar 'endif', 3278fae55a9cSBram Moolenaar ], 'E488:') 3279faac4104SBram Moolenaar 3280faac4104SBram Moolenaar CheckScriptSuccess([ 3281faac4104SBram Moolenaar 'vim9script', 3282cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3283faac4104SBram Moolenaar ]) 3284faac4104SBram Moolenaar 3285faac4104SBram Moolenaar CheckScriptFailure([ 3286faac4104SBram Moolenaar 'vim9script', 3287cfcd011fSBram Moolenaar 'var v = 1# comment6', 3288fae55a9cSBram Moolenaar ], 'E488:') 3289faac4104SBram Moolenaar 3290faac4104SBram Moolenaar CheckScriptSuccess([ 3291faac4104SBram Moolenaar 'vim9script', 3292faac4104SBram Moolenaar 'new' 3293d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3294df069eecSBram Moolenaar ':$', 3295faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3296faac4104SBram Moolenaar 'bwipe!', 3297faac4104SBram Moolenaar ]) 3298faac4104SBram Moolenaar 3299f5be8cdbSBram Moolenaar CheckScriptFailure([ 3300f5be8cdbSBram Moolenaar 'vim9script', 3301f5be8cdbSBram Moolenaar 'new' 3302d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3303f5be8cdbSBram Moolenaar ':$', 3304f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3305f5be8cdbSBram Moolenaar 'bwipe!', 3306f5be8cdbSBram Moolenaar ], 'E488:') 3307f5be8cdbSBram Moolenaar 3308f5be8cdbSBram Moolenaar CheckScriptFailure([ 3309f5be8cdbSBram Moolenaar 'vim9script', 3310f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3311f5be8cdbSBram Moolenaar ], 'E477:') 3312a26b9700SBram Moolenaarenddef 3313a26b9700SBram Moolenaar 33147e5bd91dSBram Moolenaardef Test_finish() 3315cfcd011fSBram Moolenaar var lines =<< trim END 33167e5bd91dSBram Moolenaar vim9script 33176797966dSBram Moolenaar g:res = 'one' 33187e5bd91dSBram Moolenaar if v:false | finish | endif 33196797966dSBram Moolenaar g:res = 'two' 33207e5bd91dSBram Moolenaar finish 33216797966dSBram Moolenaar g:res = 'three' 33227e5bd91dSBram Moolenaar END 33237e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 33247e5bd91dSBram Moolenaar source Xfinished 33257e5bd91dSBram Moolenaar assert_equal('two', g:res) 33267e5bd91dSBram Moolenaar 33277e5bd91dSBram Moolenaar unlet g:res 33287e5bd91dSBram Moolenaar delete('Xfinished') 33297e5bd91dSBram Moolenaarenddef 33307e5bd91dSBram Moolenaar 3331a5d0077eSBram Moolenaardef Test_forward_declaration() 3332cfcd011fSBram Moolenaar var lines =<< trim END 3333a5d0077eSBram Moolenaar vim9script 3334a5d0077eSBram Moolenaar def GetValue(): string 3335a5d0077eSBram Moolenaar return theVal 3336a5d0077eSBram Moolenaar enddef 3337cfcd011fSBram Moolenaar var theVal = 'something' 3338822ba247SBram Moolenaar g:initVal = GetValue() 3339a5d0077eSBram Moolenaar theVal = 'else' 3340a5d0077eSBram Moolenaar g:laterVal = GetValue() 3341a5d0077eSBram Moolenaar END 3342a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3343a5d0077eSBram Moolenaar source Xforward 3344a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3345a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3346a5d0077eSBram Moolenaar 3347a5d0077eSBram Moolenaar unlet g:initVal 3348a5d0077eSBram Moolenaar unlet g:laterVal 3349a5d0077eSBram Moolenaar delete('Xforward') 3350a5d0077eSBram Moolenaarenddef 3351a5d0077eSBram Moolenaar 33529721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3353a6294955SBram Moolenaar var vim9_lines =<< trim END 3354a6294955SBram Moolenaar vim9script 3355a6294955SBram Moolenaar var local = 'local' 3356a6294955SBram Moolenaar g:global = 'global' 3357a6294955SBram Moolenaar export var exported = 'exported' 3358a6294955SBram Moolenaar export def GetText(): string 3359a6294955SBram Moolenaar return 'text' 3360a6294955SBram Moolenaar enddef 3361a6294955SBram Moolenaar END 3362a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3363a6294955SBram Moolenaar 3364cfcd011fSBram Moolenaar var legacy_lines =<< trim END 33659721fb4eSBram Moolenaar source Xvim9_script.vim 33669721fb4eSBram Moolenaar 33679721fb4eSBram Moolenaar call assert_false(exists('local')) 33689721fb4eSBram Moolenaar call assert_false(exists('exported')) 33699721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 33709721fb4eSBram Moolenaar call assert_equal('global', global) 33719721fb4eSBram Moolenaar call assert_equal('global', g:global) 33729721fb4eSBram Moolenaar 33739721fb4eSBram Moolenaar " imported variable becomes script-local 33749721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 33759721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 33769721fb4eSBram Moolenaar call assert_false(exists('exported')) 33779721fb4eSBram Moolenaar 33789721fb4eSBram Moolenaar " imported function becomes script-local 33799721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 33809721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 33819721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 33829721fb4eSBram Moolenaar END 33839721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 33849721fb4eSBram Moolenaar 33859721fb4eSBram Moolenaar source Xlegacy_script.vim 33869721fb4eSBram Moolenaar assert_equal('global', g:global) 3387f5be8cdbSBram Moolenaar unlet g:global 33889721fb4eSBram Moolenaar 33899721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 33909721fb4eSBram Moolenaar delete('Xvim9_script.vim') 33919721fb4eSBram Moolenaarenddef 3392a5d0077eSBram Moolenaar 3393e535db86SBram Moolenaardef Test_declare_script_in_func() 3394e535db86SBram Moolenaar var lines =<< trim END 3395e535db86SBram Moolenaar vim9script 3396e535db86SBram Moolenaar func Declare() 3397e535db86SBram Moolenaar let s:local = 123 3398e535db86SBram Moolenaar endfunc 3399e535db86SBram Moolenaar Declare() 3400e535db86SBram Moolenaar assert_equal(123, local) 3401e535db86SBram Moolenaar 3402e535db86SBram Moolenaar var error: string 3403e535db86SBram Moolenaar try 3404e535db86SBram Moolenaar local = 'asdf' 3405e535db86SBram Moolenaar catch 3406e535db86SBram Moolenaar error = v:exception 3407e535db86SBram Moolenaar endtry 3408e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3409e535db86SBram Moolenaar 3410e535db86SBram Moolenaar lockvar local 3411e535db86SBram Moolenaar try 3412e535db86SBram Moolenaar local = 999 3413e535db86SBram Moolenaar catch 3414e535db86SBram Moolenaar error = v:exception 3415e535db86SBram Moolenaar endtry 3416e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3417e535db86SBram Moolenaar END 3418e535db86SBram Moolenaar CheckScriptSuccess(lines) 3419e535db86SBram Moolenaarenddef 3420e535db86SBram Moolenaar 3421e535db86SBram Moolenaar 34227d699701SBram Moolenaarfunc Test_vim9script_not_global() 34237d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 34247d699701SBram Moolenaar let vim9lines =<< trim END 34257d699701SBram Moolenaar vim9script 3426cfcd011fSBram Moolenaar var name = 'local' 34277d699701SBram Moolenaar func TheFunc() 34287d699701SBram Moolenaar echo 'local' 34297d699701SBram Moolenaar endfunc 34307d699701SBram Moolenaar def DefFunc() 34317d699701SBram Moolenaar echo 'local' 34327d699701SBram Moolenaar enddef 34337d699701SBram Moolenaar END 34347d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 34357d699701SBram Moolenaar source Xvim9script.vim 34367d699701SBram Moolenaar try 34377d699701SBram Moolenaar echo g:var 34387d699701SBram Moolenaar assert_report('did not fail') 34397d699701SBram Moolenaar catch /E121:/ 34407d699701SBram Moolenaar " caught 34417d699701SBram Moolenaar endtry 34427d699701SBram Moolenaar try 34437d699701SBram Moolenaar call TheFunc() 34447d699701SBram Moolenaar assert_report('did not fail') 34457d699701SBram Moolenaar catch /E117:/ 34467d699701SBram Moolenaar " caught 34477d699701SBram Moolenaar endtry 34487d699701SBram Moolenaar try 34497d699701SBram Moolenaar call DefFunc() 34507d699701SBram Moolenaar assert_report('did not fail') 34517d699701SBram Moolenaar catch /E117:/ 34527d699701SBram Moolenaar " caught 34537d699701SBram Moolenaar endtry 34547d699701SBram Moolenaar 345525859dd7SBram Moolenaar call delete('Xvim9script.vim') 34567d699701SBram Moolenaarendfunc 34577d699701SBram Moolenaar 3458eeb27bfeSBram Moolenaardef Test_vim9_copen() 3459eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3460eeb27bfeSBram Moolenaar copen 3461eeb27bfeSBram Moolenaar quit 3462eeb27bfeSBram Moolenaarenddef 3463eeb27bfeSBram Moolenaar 346403290b84SBram Moolenaar" test using an auto-loaded function and variable 34652d6b20d6SBram Moolenaardef Test_vim9_autoload() 3466cfcd011fSBram Moolenaar var lines =<< trim END 34672d6b20d6SBram Moolenaar vim9script 346803290b84SBram Moolenaar def some#gettest(): string 346903290b84SBram Moolenaar return 'test' 347003290b84SBram Moolenaar enddef 347103290b84SBram Moolenaar g:some#name = 'name' 3472227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3473e3ffcd99SBram Moolenaar 3474e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3475e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3476e3ffcd99SBram Moolenaar enddef 347703290b84SBram Moolenaar END 347803290b84SBram Moolenaar 347903290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 348003290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 348103290b84SBram Moolenaar var save_rtp = &rtp 348203290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 348303290b84SBram Moolenaar 348403290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 348503290b84SBram Moolenaar assert_equal('name', g:some#name) 3486227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 348703290b84SBram Moolenaar g:some#other = 'other' 348803290b84SBram Moolenaar assert_equal('other', g:some#other) 348903290b84SBram Moolenaar 3490e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3491e3ffcd99SBram Moolenaar 349217f700acSBram Moolenaar # upper case script name works 349317f700acSBram Moolenaar lines =<< trim END 349417f700acSBram Moolenaar vim9script 349517f700acSBram Moolenaar def Other#getOther(): string 349617f700acSBram Moolenaar return 'other' 349717f700acSBram Moolenaar enddef 349817f700acSBram Moolenaar END 349917f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 350017f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 350117f700acSBram Moolenaar 350203290b84SBram Moolenaar delete('Xdir', 'rf') 350303290b84SBram Moolenaar &rtp = save_rtp 350403290b84SBram Moolenaarenddef 350503290b84SBram Moolenaar 350603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 350703290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 350803290b84SBram Moolenaar var lines =<< trim END 350903290b84SBram Moolenaar vim9script 35102d6b20d6SBram Moolenaar def foo#test() 35112d6b20d6SBram Moolenaar echomsg getreg('"') 35122d6b20d6SBram Moolenaar enddef 35132d6b20d6SBram Moolenaar END 35142d6b20d6SBram Moolenaar 35152d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 35162d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3517cfcd011fSBram Moolenaar var save_rtp = &rtp 35182d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 35192d6b20d6SBram Moolenaar augroup test 35202d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 35212d6b20d6SBram Moolenaar augroup END 35222d6b20d6SBram Moolenaar 35232d6b20d6SBram Moolenaar normal Y 35242d6b20d6SBram Moolenaar 35252d6b20d6SBram Moolenaar augroup test 35262d6b20d6SBram Moolenaar autocmd! 35272d6b20d6SBram Moolenaar augroup END 35282d6b20d6SBram Moolenaar delete('Xdir', 'rf') 35292d6b20d6SBram Moolenaar &rtp = save_rtp 35302d6b20d6SBram Moolenaarenddef 35312d6b20d6SBram Moolenaar 353277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 353377e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3534cfcd011fSBram Moolenaar var lines =<< trim END 353577e5dcc3SBram Moolenaar vim9script 353677e5dcc3SBram Moolenaar def crash#func() 353777e5dcc3SBram Moolenaar try 353877e5dcc3SBram Moolenaar for x in List() 353977e5dcc3SBram Moolenaar endfor 354077e5dcc3SBram Moolenaar catch 354177e5dcc3SBram Moolenaar endtry 354277e5dcc3SBram Moolenaar g:ok = true 354377e5dcc3SBram Moolenaar enddef 354477e5dcc3SBram Moolenaar fu List() 354577e5dcc3SBram Moolenaar invalid 354677e5dcc3SBram Moolenaar endfu 354777e5dcc3SBram Moolenaar try 354848e11c10SBram Moolenaar alsoinvalid 354977e5dcc3SBram Moolenaar catch /wontmatch/ 355077e5dcc3SBram Moolenaar endtry 355177e5dcc3SBram Moolenaar END 355277e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 355377e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 355477e5dcc3SBram Moolenaar 355577e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 355677e5dcc3SBram Moolenaar lines =<< trim END 355777e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 355877e5dcc3SBram Moolenaar call crash#func() 355977e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 35609c4f5520SBram Moolenaar qall! 356177e5dcc3SBram Moolenaar END 356277e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 356377e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 356477e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 356577e5dcc3SBram Moolenaar 356677e5dcc3SBram Moolenaar delete('Xdidit') 356777e5dcc3SBram Moolenaar delete('Xscript') 356877e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 356903290b84SBram Moolenaar 357003290b84SBram Moolenaar lines =<< trim END 357103290b84SBram Moolenaar vim9script 357203290b84SBram Moolenaar var foo#bar = 'asdf' 357303290b84SBram Moolenaar END 357403290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 357577e5dcc3SBram Moolenaarenddef 357677e5dcc3SBram Moolenaar 357781e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 357881e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 357981e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3580cfcd011fSBram Moolenaar var lines =<< trim END 358181e17fbeSBram Moolenaar let s:counter = 1 358281e17fbeSBram Moolenaar def s:Func() 358381e17fbeSBram Moolenaar au! CursorHold 358481e17fbeSBram Moolenaar au CursorHold * s:counter += 1 358581e17fbeSBram Moolenaar enddef 358681e17fbeSBram Moolenaar call s:Func() 358781e17fbeSBram Moolenaar doau CursorHold 358881e17fbeSBram Moolenaar call assert_equal(2, s:counter) 358981e17fbeSBram Moolenaar au! CursorHold 359081e17fbeSBram Moolenaar END 359181e17fbeSBram Moolenaar CheckScriptSuccess(lines) 359281e17fbeSBram Moolenaarenddef 359381e17fbeSBram Moolenaar 35943896a105SBram Moolenaardef Test_cmdline_win() 35953896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 35963896a105SBram Moolenaar # the command line window. 35973896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3598cfcd011fSBram Moolenaar var export_lines =<< trim END 35993896a105SBram Moolenaar vim9script 3600cfcd011fSBram Moolenaar export var That = 'yes' 36013896a105SBram Moolenaar END 36023896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3603cfcd011fSBram Moolenaar var import_lines =<< trim END 36043896a105SBram Moolenaar vim9script 36053896a105SBram Moolenaar import That from './Xexport.vim' 36063896a105SBram Moolenaar END 36073896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3608cfcd011fSBram Moolenaar var save_rtp = &rtp 36093896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 36103896a105SBram Moolenaar syntax on 36113896a105SBram Moolenaar augroup CmdWin 36123896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 36133896a105SBram Moolenaar augroup END 36143896a105SBram Moolenaar # this will open and also close the cmdline window 36153896a105SBram Moolenaar feedkeys('q:', 'xt') 36163896a105SBram Moolenaar assert_equal('yes', g:got_there) 36173896a105SBram Moolenaar 36183896a105SBram Moolenaar augroup CmdWin 36193896a105SBram Moolenaar au! 36203896a105SBram Moolenaar augroup END 36213896a105SBram Moolenaar &rtp = save_rtp 36223896a105SBram Moolenaar delete('rtp', 'rf') 36233896a105SBram Moolenaarenddef 36243896a105SBram Moolenaar 3625e3d4685fSBram Moolenaardef Test_invalid_sid() 3626e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 362725859dd7SBram Moolenaar 36289c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3629d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3630e3d4685fSBram Moolenaar endif 3631e3d4685fSBram Moolenaar delete('Xdidit') 3632e3d4685fSBram Moolenaarenddef 3633e3d4685fSBram Moolenaar 36349ec7026fSBram Moolenaardef Test_restoring_cpo() 36359ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 36369ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 36379ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 36389ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 36399ec7026fSBram Moolenaar endif 36409ec7026fSBram Moolenaar delete('Xsourced') 36419ec7026fSBram Moolenaar delete('Xclose') 3642090728adSBram Moolenaar delete('Xdone') 36430123cc1eSBram Moolenaar 36440123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 36450123cc1eSBram Moolenaar set cpo=aABceFsMny> 36460123cc1eSBram Moolenaar edit XanotherScript 36470123cc1eSBram Moolenaar so % 36480123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36490123cc1eSBram Moolenaar :1del 36500123cc1eSBram Moolenaar w 36510123cc1eSBram Moolenaar so % 36520123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36530123cc1eSBram Moolenaar 36540123cc1eSBram Moolenaar delete('XanotherScript') 36550123cc1eSBram Moolenaar set cpo&vim 36569ec7026fSBram Moolenaarenddef 36579ec7026fSBram Moolenaar 3658ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3659ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 366037294bd6SBram Moolenaar CheckScreendump 3661ffb7dcdbSBram Moolenaar CheckFeature timers 366237294bd6SBram Moolenaar 3663ffb7dcdbSBram Moolenaar let lines =<< trim END 366437294bd6SBram Moolenaar vim9script 366537294bd6SBram Moolenaar def script#func() 366637294bd6SBram Moolenaar enddef 366737294bd6SBram Moolenaar END 3668ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3669ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 367037294bd6SBram Moolenaar 3671ffb7dcdbSBram Moolenaar let lines =<< trim END 367237294bd6SBram Moolenaar vim9script 367337294bd6SBram Moolenaar set cpo+=M 367437294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3675767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 367637294bd6SBram Moolenaar setline(1, 'some text') 367737294bd6SBram Moolenaar END 3678ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3679ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3680ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3681ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 368237294bd6SBram Moolenaar 3683ffb7dcdbSBram Moolenaar " clean up 3684ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3685ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3686ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3687ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3688ffb7dcdbSBram Moolenaarendfunc 368937294bd6SBram Moolenaar 36909ec7026fSBram Moolenaar 3691f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3692cfcd011fSBram Moolenaar var lines =<< trim END 3693cfcd011fSBram Moolenaar var name: any 3694cfcd011fSBram Moolenaar assert_equal(0, name) 3695f0afd9e1SBram Moolenaar END 3696f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3697f0afd9e1SBram Moolenaarenddef 3698f0afd9e1SBram Moolenaar 36997e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 370058dbef33SBram Moolenaar CheckRunVimInTerminal 370158dbef33SBram Moolenaar 37027e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 37037e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 37047e9210eaSBram Moolenaarendfunc 37057e9210eaSBram Moolenaar 37067e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 37079c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3708cfcd011fSBram Moolenaar var lines =<< trim END 37099c4f5520SBram Moolenaar func CheckAndQuit() 37109c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 37119c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 37129c4f5520SBram Moolenaar endfunc 37139c4f5520SBram Moolenaar END 37149c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 37159c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3716e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 37179c4f5520SBram Moolenaar # define Afunc() on the command line 37189c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 37199c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 37202949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 37219c4f5520SBram Moolenaar 37229c4f5520SBram Moolenaar call StopVimInTerminal(buf) 37239c4f5520SBram Moolenaar delete('XcallFunc') 37249c4f5520SBram Moolenaar delete('Xdidcmd') 37259c4f5520SBram Moolenaarenddef 37269c4f5520SBram Moolenaar 3727fcdc5d83SBram Moolenaardef Test_script_var_scope() 3728fcdc5d83SBram Moolenaar var lines =<< trim END 3729fcdc5d83SBram Moolenaar vim9script 3730fcdc5d83SBram Moolenaar if true 3731fcdc5d83SBram Moolenaar if true 3732fcdc5d83SBram Moolenaar var one = 'one' 3733fcdc5d83SBram Moolenaar echo one 3734fcdc5d83SBram Moolenaar endif 3735fcdc5d83SBram Moolenaar echo one 3736fcdc5d83SBram Moolenaar endif 3737fcdc5d83SBram Moolenaar END 3738fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3739fcdc5d83SBram Moolenaar 3740fcdc5d83SBram Moolenaar lines =<< trim END 3741fcdc5d83SBram Moolenaar vim9script 3742fcdc5d83SBram Moolenaar if true 3743fcdc5d83SBram Moolenaar if false 3744fcdc5d83SBram Moolenaar var one = 'one' 3745fcdc5d83SBram Moolenaar echo one 3746fcdc5d83SBram Moolenaar else 3747fcdc5d83SBram Moolenaar var one = 'one' 3748fcdc5d83SBram Moolenaar echo one 3749fcdc5d83SBram Moolenaar endif 3750fcdc5d83SBram Moolenaar echo one 3751fcdc5d83SBram Moolenaar endif 3752fcdc5d83SBram Moolenaar END 3753fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3754fcdc5d83SBram Moolenaar 3755fcdc5d83SBram Moolenaar lines =<< trim END 3756fcdc5d83SBram Moolenaar vim9script 3757fcdc5d83SBram Moolenaar while true 3758fcdc5d83SBram Moolenaar var one = 'one' 3759fcdc5d83SBram Moolenaar echo one 3760fcdc5d83SBram Moolenaar break 3761fcdc5d83SBram Moolenaar endwhile 3762fcdc5d83SBram Moolenaar echo one 3763fcdc5d83SBram Moolenaar END 3764fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3765fcdc5d83SBram Moolenaar 3766fcdc5d83SBram Moolenaar lines =<< trim END 3767fcdc5d83SBram Moolenaar vim9script 3768fcdc5d83SBram Moolenaar for i in range(1) 3769fcdc5d83SBram Moolenaar var one = 'one' 3770fcdc5d83SBram Moolenaar echo one 3771fcdc5d83SBram Moolenaar endfor 3772fcdc5d83SBram Moolenaar echo one 3773fcdc5d83SBram Moolenaar END 3774fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 37759becdf2bSBram Moolenaar 37769becdf2bSBram Moolenaar lines =<< trim END 37779becdf2bSBram Moolenaar vim9script 37789becdf2bSBram Moolenaar { 37799becdf2bSBram Moolenaar var one = 'one' 37809becdf2bSBram Moolenaar assert_equal('one', one) 37819becdf2bSBram Moolenaar } 37829becdf2bSBram Moolenaar assert_false(exists('one')) 37839becdf2bSBram Moolenaar assert_false(exists('s:one')) 37849becdf2bSBram Moolenaar END 37859becdf2bSBram Moolenaar CheckScriptSuccess(lines) 37869becdf2bSBram Moolenaar 37879becdf2bSBram Moolenaar lines =<< trim END 37889becdf2bSBram Moolenaar vim9script 37899becdf2bSBram Moolenaar { 37909becdf2bSBram Moolenaar var one = 'one' 37919becdf2bSBram Moolenaar echo one 37929becdf2bSBram Moolenaar } 37939becdf2bSBram Moolenaar echo one 37949becdf2bSBram Moolenaar END 37959becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3796fcdc5d83SBram Moolenaarenddef 3797fcdc5d83SBram Moolenaar 3798352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3799352134bbSBram Moolenaar var lines =<< trim END 3800352134bbSBram Moolenaar vim9script 38012a38908bSBram Moolenaar def Callback(...l: list<any>) 3802352134bbSBram Moolenaar try 3803352134bbSBram Moolenaar var x: string 3804352134bbSBram Moolenaar var y: string 3805352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3806352134bbSBram Moolenaar [x, y] = [''] 3807352134bbSBram Moolenaar catch 3808352134bbSBram Moolenaar g:caught = 'yes' 3809352134bbSBram Moolenaar endtry 3810352134bbSBram Moolenaar enddef 3811e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3812352134bbSBram Moolenaar feedkeys("\r", 'xt') 3813352134bbSBram Moolenaar END 3814352134bbSBram Moolenaar CheckScriptSuccess(lines) 3815352134bbSBram Moolenaar 3816352134bbSBram Moolenaar unlet g:caught 3817352134bbSBram Moolenaarenddef 3818352134bbSBram Moolenaar 3819631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3820631e8f93SBram Moolenaar if !has('unix') || !has('job') 3821631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3822631e8f93SBram Moolenaar endif 3823631e8f93SBram Moolenaar var lines =<< trim END 3824631e8f93SBram Moolenaar vim9script 3825631e8f93SBram Moolenaar var source: list<number> 38262a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3827631e8f93SBram Moolenaar eval [][0] 3828631e8f93SBram Moolenaar enddef 38292a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3830631e8f93SBram Moolenaar sleep 1m 3831631e8f93SBram Moolenaar source += l 3832631e8f93SBram Moolenaar enddef 3833e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 38346f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 38356f17a3f0SBram Moolenaar sleep 10m 38366f17a3f0SBram Moolenaar endwhile 3837206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3838fe95b94fSBram Moolenaar sleep 200m 3839631e8f93SBram Moolenaar END 3840631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3841631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3842631e8f93SBram Moolenaar delete('Xdef') 3843631e8f93SBram Moolenaarenddef 3844631e8f93SBram Moolenaar 38454324d87aSBram Moolenaardef InvokeNormal() 38464324d87aSBram Moolenaar exe "norm! :m+1\r" 38474324d87aSBram Moolenaarenddef 38484324d87aSBram Moolenaar 38494324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 38504324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 38514324d87aSBram Moolenaar new 38524324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 38534324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 38544324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 38554324d87aSBram Moolenaar xunmap <F3> 3856b5b9480eSBram Moolenaarenddef 3857b5b9480eSBram Moolenaar 3858b5b9480eSBram Moolenaardef Test_white_space_after_command() 3859b5b9480eSBram Moolenaar var lines =<< trim END 3860b5b9480eSBram Moolenaar exit_cb: Func}) 3861b5b9480eSBram Moolenaar END 3862b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3863f8103f27SBram Moolenaar 3864f8103f27SBram Moolenaar lines =<< trim END 3865f8103f27SBram Moolenaar e# 3866f8103f27SBram Moolenaar END 3867f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 38684324d87aSBram Moolenaarenddef 38694324d87aSBram Moolenaar 38704aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 38714aab88d9SBram Moolenaar var lines =<< trim END 38724aab88d9SBram Moolenaar vim9script 38734aab88d9SBram Moolenaar if exists('g:guard') 38744aab88d9SBram Moolenaar finish 38754aab88d9SBram Moolenaar endif 38764aab88d9SBram Moolenaar g:guard = 1 38774aab88d9SBram Moolenaar var name = 'thename' 38784aab88d9SBram Moolenaar def g:GetName(): string 38794aab88d9SBram Moolenaar return name 38804aab88d9SBram Moolenaar enddef 38814aab88d9SBram Moolenaar def g:SetName(arg: string) 38824aab88d9SBram Moolenaar name = arg 38834aab88d9SBram Moolenaar enddef 38844aab88d9SBram Moolenaar END 38854aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 38864aab88d9SBram Moolenaar so XscriptTwice.vim 38874aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 38884aab88d9SBram Moolenaar g:SetName('newname') 38894aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 38904aab88d9SBram Moolenaar so XscriptTwice.vim 38914aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38924aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 38934aab88d9SBram Moolenaar 38944aab88d9SBram Moolenaar delfunc g:GetName 38954aab88d9SBram Moolenaar delfunc g:SetName 38964aab88d9SBram Moolenaar delete('XscriptTwice.vim') 38974aab88d9SBram Moolenaar unlet g:guard 38984aab88d9SBram Moolenaarenddef 38994aab88d9SBram Moolenaar 39004aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 39014aab88d9SBram Moolenaar var exportlines =<< trim END 39024aab88d9SBram Moolenaar vim9script 39034aab88d9SBram Moolenaar if exists('g:guard') 39044aab88d9SBram Moolenaar finish 39054aab88d9SBram Moolenaar endif 39064aab88d9SBram Moolenaar g:guard = 1 39074aab88d9SBram Moolenaar export var name = 'someName' 39084aab88d9SBram Moolenaar END 39094aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 39104aab88d9SBram Moolenaar 39114aab88d9SBram Moolenaar var lines =<< trim END 39124aab88d9SBram Moolenaar vim9script 39134aab88d9SBram Moolenaar import name from './XexportScript.vim' 39144aab88d9SBram Moolenaar def g:GetName(): string 39154aab88d9SBram Moolenaar return name 39164aab88d9SBram Moolenaar enddef 39174aab88d9SBram Moolenaar END 39184aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 39194aab88d9SBram Moolenaar so XscriptImport.vim 39204aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 39214aab88d9SBram Moolenaar 39224aab88d9SBram Moolenaar so XexportScript.vim 39234aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 39244aab88d9SBram Moolenaar 39254aab88d9SBram Moolenaar delfunc g:GetName 39264aab88d9SBram Moolenaar delete('XexportScript.vim') 39274aab88d9SBram Moolenaar delete('XscriptImport.vim') 39284aab88d9SBram Moolenaar unlet g:guard 39294aab88d9SBram Moolenaarenddef 39304aab88d9SBram Moolenaar 393110b9421fSBram Moolenaardef Test_unsupported_commands() 393210b9421fSBram Moolenaar var lines =<< trim END 393310b9421fSBram Moolenaar ka 393410b9421fSBram Moolenaar END 39357d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39367d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 393710b9421fSBram Moolenaar 393810b9421fSBram Moolenaar lines =<< trim END 3939ada1d870SBram Moolenaar :1ka 3940ada1d870SBram Moolenaar END 39417d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39427d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 3943ada1d870SBram Moolenaar 3944ada1d870SBram Moolenaar lines =<< trim END 394510b9421fSBram Moolenaar t 394610b9421fSBram Moolenaar END 394710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 394810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 394910b9421fSBram Moolenaar 395010b9421fSBram Moolenaar lines =<< trim END 395110b9421fSBram Moolenaar x 395210b9421fSBram Moolenaar END 395310b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 395410b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 395510b9421fSBram Moolenaar 395610b9421fSBram Moolenaar lines =<< trim END 395710b9421fSBram Moolenaar xit 395810b9421fSBram Moolenaar END 395910b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 396010b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 396110b9421fSBram Moolenaarenddef 396210b9421fSBram Moolenaar 3963c70fe460SBram Moolenaardef Test_mapping_line_number() 3964c70fe460SBram Moolenaar var lines =<< trim END 3965c70fe460SBram Moolenaar vim9script 3966c70fe460SBram Moolenaar def g:FuncA() 3967c70fe460SBram Moolenaar # Some comment 3968c70fe460SBram Moolenaar FuncB(0) 3969c70fe460SBram Moolenaar enddef 3970c70fe460SBram Moolenaar # Some comment 3971c70fe460SBram Moolenaar def FuncB( 3972c70fe460SBram Moolenaar # Some comment 3973c70fe460SBram Moolenaar n: number 3974c70fe460SBram Moolenaar ) 3975c70fe460SBram Moolenaar exe 'nno ' 3976c70fe460SBram Moolenaar # Some comment 3977c70fe460SBram Moolenaar .. '<F3> a' 3978c70fe460SBram Moolenaar .. 'b' 3979c70fe460SBram Moolenaar .. 'c' 3980c70fe460SBram Moolenaar enddef 3981c70fe460SBram Moolenaar END 3982c70fe460SBram Moolenaar CheckScriptSuccess(lines) 3983c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 3984c70fe460SBram Moolenaar assert_match('No mapping found', res) 3985c70fe460SBram Moolenaar 3986c70fe460SBram Moolenaar g:FuncA() 3987c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 3988c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 3989c70fe460SBram Moolenaar 3990c70fe460SBram Moolenaar nunmap <F3> 3991c70fe460SBram Moolenaar delfunc g:FuncA 3992c70fe460SBram Moolenaarenddef 3993c70fe460SBram Moolenaar 3994208f0b48SBram Moolenaardef Test_option_modifier() 3995208f0b48SBram Moolenaar var lines =<< trim END 3996208f0b48SBram Moolenaar set hlsearch & hlsearch ! 3997208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 3998208f0b48SBram Moolenaar END 3999208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4000208f0b48SBram Moolenaar 4001208f0b48SBram Moolenaar lines =<< trim END 4002208f0b48SBram Moolenaar vim9script 4003208f0b48SBram Moolenaar set hlsearch & 4004208f0b48SBram Moolenaar END 4005208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 4006208f0b48SBram Moolenaar 4007208f0b48SBram Moolenaar lines =<< trim END 4008208f0b48SBram Moolenaar vim9script 4009208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4010208f0b48SBram Moolenaar END 4011208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 4012208f0b48SBram Moolenaarenddef 4013208f0b48SBram Moolenaar 4014585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4015585fea7bSBram Moolenaardef Test_substitute_cmd() 4016585fea7bSBram Moolenaar new 4017585fea7bSBram Moolenaar setline(1, 'something') 4018585fea7bSBram Moolenaar :substitute(some(other( 4019585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4020585fea7bSBram Moolenaar bwipe! 4021585fea7bSBram Moolenaar 4022f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4023cfcd011fSBram Moolenaar var lines =<< trim END 4024585fea7bSBram Moolenaar vim9script 4025585fea7bSBram Moolenaar new 4026585fea7bSBram Moolenaar setline(1, 'something') 4027585fea7bSBram Moolenaar :substitute(some(other( 4028585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4029585fea7bSBram Moolenaar bwipe! 4030585fea7bSBram Moolenaar END 4031585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4032585fea7bSBram Moolenaar source Xvim9lines 4033585fea7bSBram Moolenaar 4034585fea7bSBram Moolenaar delete('Xvim9lines') 4035585fea7bSBram Moolenaarenddef 4036585fea7bSBram Moolenaar 40378a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4038