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 6083f987b59SBram Moolenaardef Test_try_in_catch() 6093f987b59SBram Moolenaar var lines =<< trim END 6103f987b59SBram Moolenaar vim9script 6113f987b59SBram Moolenaar var seq = [] 6123f987b59SBram Moolenaar def DoIt() 6133f987b59SBram Moolenaar try 6143f987b59SBram Moolenaar seq->add('throw 1') 6153f987b59SBram Moolenaar eval [][0] 6163f987b59SBram Moolenaar seq->add('notreached') 6173f987b59SBram Moolenaar catch 6183f987b59SBram Moolenaar seq->add('catch') 6193f987b59SBram Moolenaar try 6203f987b59SBram Moolenaar seq->add('throw 2') 6213f987b59SBram Moolenaar eval [][0] 6223f987b59SBram Moolenaar seq->add('notreached') 6233f987b59SBram Moolenaar catch /nothing/ 6243f987b59SBram Moolenaar seq->add('notreached') 6253f987b59SBram Moolenaar endtry 6263f987b59SBram Moolenaar seq->add('done') 6273f987b59SBram Moolenaar endtry 6283f987b59SBram Moolenaar enddef 6293f987b59SBram Moolenaar DoIt() 6303f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6313f987b59SBram Moolenaar END 6323f987b59SBram Moolenaarenddef 6333f987b59SBram Moolenaar 634*d3d8feebSBram Moolenaardef Test_error_in_catch() 635*d3d8feebSBram Moolenaar var lines =<< trim END 636*d3d8feebSBram Moolenaar try 637*d3d8feebSBram Moolenaar eval [][0] 638*d3d8feebSBram Moolenaar catch /E684:/ 639*d3d8feebSBram Moolenaar eval [][0] 640*d3d8feebSBram Moolenaar endtry 641*d3d8feebSBram Moolenaar END 642*d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 643*d3d8feebSBram Moolenaarenddef 644*d3d8feebSBram Moolenaar 6452e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6462e34c34bSBram Moolenaardef TryContinueFunc() 6472e34c34bSBram Moolenaar while g:Count < 2 6482e34c34bSBram Moolenaar g:sequence ..= 't' 6492e34c34bSBram Moolenaar try 6502e34c34bSBram Moolenaar echoerr 'Test' 6512e34c34bSBram Moolenaar catch 6522e34c34bSBram Moolenaar g:Count += 1 6532e34c34bSBram Moolenaar g:sequence ..= 'c' 6542e34c34bSBram Moolenaar continue 6552e34c34bSBram Moolenaar endtry 6562e34c34bSBram Moolenaar g:sequence ..= 'e' 6572e34c34bSBram Moolenaar g:Count += 1 6582e34c34bSBram Moolenaar endwhile 6592e34c34bSBram Moolenaarenddef 6602e34c34bSBram Moolenaar 6612e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6622e34c34bSBram Moolenaar g:Count = 0 6632e34c34bSBram Moolenaar g:sequence = '' 6642e34c34bSBram Moolenaar TryContinueFunc() 6652e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6662e34c34bSBram Moolenaar unlet g:Count 6672e34c34bSBram Moolenaar unlet g:sequence 6682e34c34bSBram Moolenaarenddef 6692e34c34bSBram Moolenaar 6709cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6719cb577a6SBram Moolenaar # return in try block returns normally 6729cb577a6SBram Moolenaar def ReturnInTry(): string 6739cb577a6SBram Moolenaar try 6749cb577a6SBram Moolenaar return '"some message"' 6759cb577a6SBram Moolenaar catch 6769cb577a6SBram Moolenaar endtry 6779cb577a6SBram Moolenaar return 'not reached' 6789cb577a6SBram Moolenaar enddef 6799cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6809cb577a6SBram Moolenaarenddef 6819cb577a6SBram Moolenaar 6821430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6831430ceebSBram Moolenaar var lines =<< trim END 6841430ceebSBram Moolenaar vim9script 6851430ceebSBram Moolenaar au BufEnter * eval 0 6861430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6871430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6881430ceebSBram Moolenaar var items = [ 6891430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6901430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6911430ceebSBram Moolenaar ] 6921430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6931430ceebSBram Moolenaar cwindow 6941430ceebSBram Moolenaar 6951430ceebSBram Moolenaar def CnextOrCfirst() 6961430ceebSBram Moolenaar # if cnext fails, cfirst is used 6971430ceebSBram Moolenaar try 6981430ceebSBram Moolenaar cnext 6991430ceebSBram Moolenaar catch 7001430ceebSBram Moolenaar cfirst 7011430ceebSBram Moolenaar endtry 7021430ceebSBram Moolenaar enddef 7031430ceebSBram Moolenaar 7041430ceebSBram Moolenaar CnextOrCfirst() 7051430ceebSBram Moolenaar CnextOrCfirst() 7061430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7071430ceebSBram Moolenaar qall 7081430ceebSBram Moolenaar END 7091430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7101430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7111430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7121430ceebSBram Moolenaar 7131430ceebSBram Moolenaar delete('Xfile1') 7141430ceebSBram Moolenaar delete('Xfile2') 7151430ceebSBram Moolenaar delete('XCatchCnext') 7161430ceebSBram Moolenaar delete('Xresult') 7171430ceebSBram Moolenaarenddef 7181430ceebSBram Moolenaar 7199e1d9e34SBram Moolenaardef Test_throw_skipped() 7209e1d9e34SBram Moolenaar if 0 7219e1d9e34SBram Moolenaar throw dontgethere 7229e1d9e34SBram Moolenaar endif 7239e1d9e34SBram Moolenaarenddef 7249e1d9e34SBram Moolenaar 7258f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7268f81b22eSBram Moolenaar var lines =<< trim END 7278f81b22eSBram Moolenaar vim9script 7288f81b22eSBram Moolenaar def Func() 7298f81b22eSBram Moolenaar throw 'error' 7308f81b22eSBram Moolenaar enddef 7318f81b22eSBram Moolenaar silent! Func() 7328f81b22eSBram Moolenaar END 7338f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7348f81b22eSBram Moolenaar source XthrowSilenced 7358f81b22eSBram Moolenaar delete('XthrowSilenced') 7368f81b22eSBram Moolenaarenddef 7378f81b22eSBram Moolenaar 738e859312eSBram Moolenaardef DeletedFunc(): list<any> 739e859312eSBram Moolenaar return ['delete me'] 740e859312eSBram Moolenaarenddef 741e859312eSBram Moolenaardefcompile 742e859312eSBram Moolenaardelfunc DeletedFunc 743e859312eSBram Moolenaar 744257cc5eeSBram Moolenaardef ThrowFromDef() 745a72cfb80SBram Moolenaar throw "getout" # comment 746257cc5eeSBram Moolenaarenddef 747257cc5eeSBram Moolenaar 748257cc5eeSBram Moolenaarfunc CatchInFunc() 749257cc5eeSBram Moolenaar try 750257cc5eeSBram Moolenaar call ThrowFromDef() 751257cc5eeSBram Moolenaar catch 752257cc5eeSBram Moolenaar let g:thrown_func = v:exception 753257cc5eeSBram Moolenaar endtry 754257cc5eeSBram Moolenaarendfunc 755257cc5eeSBram Moolenaar 756257cc5eeSBram Moolenaardef CatchInDef() 757257cc5eeSBram Moolenaar try 758257cc5eeSBram Moolenaar ThrowFromDef() 759257cc5eeSBram Moolenaar catch 760257cc5eeSBram Moolenaar g:thrown_def = v:exception 761257cc5eeSBram Moolenaar endtry 762257cc5eeSBram Moolenaarenddef 763257cc5eeSBram Moolenaar 764f575adffSBram Moolenaardef ReturnFinally(): string 765f575adffSBram Moolenaar try 766f575adffSBram Moolenaar return 'intry' 767373863edSBram Moolenaar finall 768f575adffSBram Moolenaar g:in_finally = 'finally' 769f575adffSBram Moolenaar endtry 770f575adffSBram Moolenaar return 'end' 771f575adffSBram Moolenaarenddef 772f575adffSBram Moolenaar 773257cc5eeSBram Moolenaardef Test_try_catch_nested() 774257cc5eeSBram Moolenaar CatchInFunc() 775257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 776257cc5eeSBram Moolenaar 777257cc5eeSBram Moolenaar CatchInDef() 778257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 779f575adffSBram Moolenaar 780f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 781f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 782*d3d8feebSBram Moolenaar 783*d3d8feebSBram Moolenaar var l = [] 784*d3d8feebSBram Moolenaar try 785*d3d8feebSBram Moolenaar l->add('1') 786*d3d8feebSBram Moolenaar throw 'bad' 787*d3d8feebSBram Moolenaar l->add('x') 788*d3d8feebSBram Moolenaar catch /bad/ 789*d3d8feebSBram Moolenaar l->add('2') 790*d3d8feebSBram Moolenaar try 791*d3d8feebSBram Moolenaar l->add('3') 792*d3d8feebSBram Moolenaar throw 'one' 793*d3d8feebSBram Moolenaar l->add('x') 794*d3d8feebSBram Moolenaar catch /one/ 795*d3d8feebSBram Moolenaar l->add('4') 796*d3d8feebSBram Moolenaar try 797*d3d8feebSBram Moolenaar l->add('5') 798*d3d8feebSBram Moolenaar throw 'more' 799*d3d8feebSBram Moolenaar l->add('x') 800*d3d8feebSBram Moolenaar catch /more/ 801*d3d8feebSBram Moolenaar l->add('6') 802*d3d8feebSBram Moolenaar endtry 803*d3d8feebSBram Moolenaar endtry 804*d3d8feebSBram Moolenaar endtry 805*d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 806f575adffSBram Moolenaarenddef 807f575adffSBram Moolenaar 8089939f57bSBram Moolenaardef TryOne(): number 8099939f57bSBram Moolenaar try 8109939f57bSBram Moolenaar return 0 8119939f57bSBram Moolenaar catch 8129939f57bSBram Moolenaar endtry 8139939f57bSBram Moolenaar return 0 8149939f57bSBram Moolenaarenddef 8159939f57bSBram Moolenaar 8169939f57bSBram Moolenaardef TryTwo(n: number): string 8179939f57bSBram Moolenaar try 818cfcd011fSBram Moolenaar var x = {} 8199939f57bSBram Moolenaar catch 8209939f57bSBram Moolenaar endtry 8219939f57bSBram Moolenaar return 'text' 8229939f57bSBram Moolenaarenddef 8239939f57bSBram Moolenaar 8249939f57bSBram Moolenaardef Test_try_catch_twice() 8259939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8269939f57bSBram Moolenaarenddef 8279939f57bSBram Moolenaar 828f575adffSBram Moolenaardef Test_try_catch_match() 829cfcd011fSBram Moolenaar var seq = 'a' 830f575adffSBram Moolenaar try 831f575adffSBram Moolenaar throw 'something' 832f575adffSBram Moolenaar catch /nothing/ 833f575adffSBram Moolenaar seq ..= 'x' 834f575adffSBram Moolenaar catch /some/ 835f575adffSBram Moolenaar seq ..= 'b' 836f575adffSBram Moolenaar catch /asdf/ 837f575adffSBram Moolenaar seq ..= 'x' 838e8c4abbbSBram Moolenaar catch ?a\?sdf? 839e8c4abbbSBram Moolenaar seq ..= 'y' 840f575adffSBram Moolenaar finally 841f575adffSBram Moolenaar seq ..= 'c' 842f575adffSBram Moolenaar endtry 843f575adffSBram Moolenaar assert_equal('abc', seq) 844257cc5eeSBram Moolenaarenddef 845257cc5eeSBram Moolenaar 846e8c4abbbSBram Moolenaardef Test_try_catch_fails() 847d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 848d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 849d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 850d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 851d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 852d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 853d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 854d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 85513106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 856d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 857585fea7bSBram Moolenaar 858e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 859d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 860e8c4abbbSBram Moolenaarenddef 861e8c4abbbSBram Moolenaar 8627c5b3c03SBram Moolenaardef Try_catch_skipped() 8637c5b3c03SBram Moolenaar var l = [] 8647c5b3c03SBram Moolenaar try 8657c5b3c03SBram Moolenaar finally 8667c5b3c03SBram Moolenaar endtry 8677c5b3c03SBram Moolenaar 8687c5b3c03SBram Moolenaar if 1 8697c5b3c03SBram Moolenaar else 8707c5b3c03SBram Moolenaar try 8717c5b3c03SBram Moolenaar endtry 8727c5b3c03SBram Moolenaar endif 8737c5b3c03SBram Moolenaarenddef 8747c5b3c03SBram Moolenaar 8757c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 8767c5b3c03SBram Moolenaardef Test_try_catch_skipped() 8777c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 8787c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 8797c5b3c03SBram Moolenaarenddef 8807c5b3c03SBram Moolenaar 8817c5b3c03SBram Moolenaar 8827c5b3c03SBram Moolenaar 883006ad48bSBram Moolenaardef Test_throw_vimscript() 884f5be8cdbSBram Moolenaar # only checks line continuation 885cfcd011fSBram Moolenaar var lines =<< trim END 886006ad48bSBram Moolenaar vim9script 887006ad48bSBram Moolenaar try 888006ad48bSBram Moolenaar throw 'one' 889006ad48bSBram Moolenaar .. 'two' 890006ad48bSBram Moolenaar catch 891006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 892006ad48bSBram Moolenaar endtry 893006ad48bSBram Moolenaar END 894006ad48bSBram Moolenaar CheckScriptSuccess(lines) 8951e021e63SBram Moolenaar 8961e021e63SBram Moolenaar lines =<< trim END 8971e021e63SBram Moolenaar vim9script 898352134bbSBram Moolenaar @r = '' 8991e021e63SBram Moolenaar def Func() 9001e021e63SBram Moolenaar throw @r 9011e021e63SBram Moolenaar enddef 9021e021e63SBram Moolenaar var result = '' 9031e021e63SBram Moolenaar try 9041e021e63SBram Moolenaar Func() 9051e021e63SBram Moolenaar catch /E1129:/ 9061e021e63SBram Moolenaar result = 'caught' 9071e021e63SBram Moolenaar endtry 9081e021e63SBram Moolenaar assert_equal('caught', result) 9091e021e63SBram Moolenaar END 9101e021e63SBram Moolenaar CheckScriptSuccess(lines) 911006ad48bSBram Moolenaarenddef 912006ad48bSBram Moolenaar 913ed677f55SBram Moolenaardef Test_error_in_nested_function() 91403dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 915cfcd011fSBram Moolenaar var lines =<< trim END 916ed677f55SBram Moolenaar vim9script 917ed677f55SBram Moolenaar def Func() 918ed677f55SBram Moolenaar Error() 919ed677f55SBram Moolenaar g:test_var = 1 920ed677f55SBram Moolenaar enddef 921ed677f55SBram Moolenaar func Error() abort 922ed677f55SBram Moolenaar eval [][0] 923ed677f55SBram Moolenaar endfunc 924ed677f55SBram Moolenaar Func() 925ed677f55SBram Moolenaar END 926ed677f55SBram Moolenaar g:test_var = 0 927ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 928ed677f55SBram Moolenaar assert_equal(0, g:test_var) 929ed677f55SBram Moolenaarenddef 930ed677f55SBram Moolenaar 931227c58a4SBram Moolenaardef Test_abort_after_error() 932227c58a4SBram Moolenaar var lines =<< trim END 933227c58a4SBram Moolenaar vim9script 934227c58a4SBram Moolenaar while true 935227c58a4SBram Moolenaar echo notfound 936227c58a4SBram Moolenaar endwhile 937227c58a4SBram Moolenaar g:gotthere = true 938227c58a4SBram Moolenaar END 939227c58a4SBram Moolenaar g:gotthere = false 940227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 941227c58a4SBram Moolenaar assert_false(g:gotthere) 942227c58a4SBram Moolenaar unlet g:gotthere 943227c58a4SBram Moolenaarenddef 944227c58a4SBram Moolenaar 94537c83711SBram Moolenaardef Test_cexpr_vimscript() 946f5be8cdbSBram Moolenaar # only checks line continuation 94737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 948cfcd011fSBram Moolenaar var lines =<< trim END 94937c83711SBram Moolenaar vim9script 95037c83711SBram Moolenaar cexpr 'File' 95137c83711SBram Moolenaar .. ' someFile' .. 95237c83711SBram Moolenaar ' line 19' 95337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 95437c83711SBram Moolenaar END 95537c83711SBram Moolenaar CheckScriptSuccess(lines) 95637c83711SBram Moolenaar set errorformat& 95737c83711SBram Moolenaarenddef 95837c83711SBram Moolenaar 959c9edd6b5SBram Moolenaardef Test_statusline_syntax() 960c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 961cfcd011fSBram Moolenaar var lines =<< trim END 962c9edd6b5SBram Moolenaar vim9script 963c9edd6b5SBram Moolenaar func g:Status() 964c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 965c9edd6b5SBram Moolenaar endfunc 966c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 967c9edd6b5SBram Moolenaar redrawstatus 968c9edd6b5SBram Moolenaar set laststatus statusline= 969c9edd6b5SBram Moolenaar END 970c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 971c9edd6b5SBram Moolenaarenddef 972c9edd6b5SBram Moolenaar 973b209750bSBram Moolenaardef Test_list_vimscript() 974b209750bSBram Moolenaar # checks line continuation and comments 975cfcd011fSBram Moolenaar var lines =<< trim END 976b209750bSBram Moolenaar vim9script 977cfcd011fSBram Moolenaar var mylist = [ 978b209750bSBram Moolenaar 'one', 979b209750bSBram Moolenaar # comment 980b209750bSBram Moolenaar 'two', # empty line follows 981b209750bSBram Moolenaar 982b209750bSBram Moolenaar 'three', 983b209750bSBram Moolenaar ] 984b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 985b209750bSBram Moolenaar END 986b209750bSBram Moolenaar CheckScriptSuccess(lines) 98766250c93SBram Moolenaar 98866250c93SBram Moolenaar # check all lines from heredoc are kept 98966250c93SBram Moolenaar lines =<< trim END 99066250c93SBram Moolenaar # comment 1 99166250c93SBram Moolenaar two 99266250c93SBram Moolenaar # comment 3 99366250c93SBram Moolenaar 99466250c93SBram Moolenaar five 99566250c93SBram Moolenaar # comment 6 99666250c93SBram Moolenaar END 99766250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 9984bce26bbSBram Moolenaar 9994bce26bbSBram Moolenaar lines =<< trim END 10004bce26bbSBram Moolenaar [{ 10014bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10024bce26bbSBram Moolenaar END 10034bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1004b209750bSBram Moolenaarenddef 1005b209750bSBram Moolenaar 10062a1381c3SBram Moolenaarif has('channel') 100740ee466cSBram Moolenaar let someJob = test_null_job() 100840ee466cSBram Moolenaar 100940ee466cSBram Moolenaar def FuncWithError() 101040ee466cSBram Moolenaar echomsg g:someJob 101140ee466cSBram Moolenaar enddef 101240ee466cSBram Moolenaar 101340ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 101440ee466cSBram Moolenaar try 101540ee466cSBram Moolenaar call FuncWithError() 101640ee466cSBram Moolenaar catch 101740ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 101840ee466cSBram Moolenaar endtry 101940ee466cSBram Moolenaar endfunc 10202a1381c3SBram Moolenaarendif 102140ee466cSBram Moolenaar 10228a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10238a7d6542SBram Moolenaar vim9script 1024cfcd011fSBram Moolenaar var name: string = 'bob' 10258a7d6542SBram Moolenaar def Concat(arg: string): string 10268a7d6542SBram Moolenaar return name .. arg 10278a7d6542SBram Moolenaar enddef 1028227a69deSBram Moolenaar g:result = Concat('bie') 1029227a69deSBram Moolenaar g:localname = name 10308a7d6542SBram Moolenaar 10318a7d6542SBram Moolenaar export const CONST = 1234 1032cfcd011fSBram Moolenaar export var exported = 9876 1033cfcd011fSBram Moolenaar export var exp_name = 'John' 10348a7d6542SBram Moolenaar export def Exported(): string 10358a7d6542SBram Moolenaar return 'Exported' 10368a7d6542SBram Moolenaar enddef 10370f2a5cc6SBram Moolenaar export final theList = [1] 10388a7d6542SBram MoolenaarEND 10398a7d6542SBram Moolenaar 1040b3ca9824SBram Moolenaardef Undo_export_script_lines() 1041b3ca9824SBram Moolenaar unlet g:result 1042b3ca9824SBram Moolenaar unlet g:localname 1043b3ca9824SBram Moolenaarenddef 1044b3ca9824SBram Moolenaar 10455269bd2aSBram Moolenaardef Test_vim9_import_export() 1046cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10478a7d6542SBram Moolenaar vim9script 10488a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10498a7d6542SBram Moolenaar g:imported = exported 10506e587dcbSBram Moolenaar exported += 3 10516e587dcbSBram Moolenaar g:imported_added = exported 10528a7d6542SBram Moolenaar g:imported_func = Exported() 10536e587dcbSBram Moolenaar 105440f4f7a4SBram Moolenaar def GetExported(): string 1055e0de171eSBram Moolenaar var local_dict = {ref: Exported} 105640f4f7a4SBram Moolenaar return local_dict.ref() 105740f4f7a4SBram Moolenaar enddef 105840f4f7a4SBram Moolenaar g:funcref_result = GetExported() 105940f4f7a4SBram Moolenaar 10606e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10616e587dcbSBram Moolenaar g:imported_name = exp_name 10626e587dcbSBram Moolenaar exp_name ..= ' Doe' 10636e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10645381c7a1SBram Moolenaar g:imported_later = exported 10650f2a5cc6SBram Moolenaar 10660f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 10670f2a5cc6SBram Moolenaar theList->add(2) 10680f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 10698a7d6542SBram Moolenaar END 10708a7d6542SBram Moolenaar 10718a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 10728a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 10738a7d6542SBram Moolenaar 10748a7d6542SBram Moolenaar source Ximport.vim 10758a7d6542SBram Moolenaar 10768a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 10778a7d6542SBram Moolenaar assert_equal('bob', g:localname) 10788a7d6542SBram Moolenaar assert_equal(9876, g:imported) 10796e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 10805381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 10818a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 108240f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 10836e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 10846e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 10858a7d6542SBram Moolenaar assert_false(exists('g:name')) 10868a7d6542SBram Moolenaar 1087b3ca9824SBram Moolenaar Undo_export_script_lines() 10888a7d6542SBram Moolenaar unlet g:imported 10896e587dcbSBram Moolenaar unlet g:imported_added 10905381c7a1SBram Moolenaar unlet g:imported_later 10918a7d6542SBram Moolenaar unlet g:imported_func 10926e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 10938a7d6542SBram Moolenaar delete('Ximport.vim') 1094f2d5c240SBram Moolenaar 10951c991144SBram Moolenaar # similar, with line breaks 1096cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 10971c991144SBram Moolenaar vim9script 10981c991144SBram Moolenaar import { 10991c991144SBram Moolenaar exported, 11001c991144SBram Moolenaar Exported, 11011c991144SBram Moolenaar } 11021c991144SBram Moolenaar from 11031c991144SBram Moolenaar './Xexport.vim' 11041c991144SBram Moolenaar g:imported = exported 11051c991144SBram Moolenaar exported += 5 11061c991144SBram Moolenaar g:imported_added = exported 11071c991144SBram Moolenaar g:imported_func = Exported() 11081c991144SBram Moolenaar END 11091c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11101c991144SBram Moolenaar source Ximport_lbr.vim 11111c991144SBram Moolenaar 11121c991144SBram Moolenaar assert_equal(9876, g:imported) 11131c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11141c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11151c991144SBram Moolenaar 11161c991144SBram Moolenaar # exported script not sourced again 11171c991144SBram Moolenaar assert_false(exists('g:result')) 11181c991144SBram Moolenaar unlet g:imported 11191c991144SBram Moolenaar unlet g:imported_added 11201c991144SBram Moolenaar unlet g:imported_func 11211c991144SBram Moolenaar delete('Ximport_lbr.vim') 11221c991144SBram Moolenaar 11231c991144SBram Moolenaar # import inside :def function 1124cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 11255381c7a1SBram Moolenaar vim9script 11265381c7a1SBram Moolenaar def ImportInDef() 11275381c7a1SBram Moolenaar import exported from './Xexport.vim' 11285381c7a1SBram Moolenaar g:imported = exported 11295381c7a1SBram Moolenaar exported += 7 11305381c7a1SBram Moolenaar g:imported_added = exported 11315381c7a1SBram Moolenaar enddef 11325381c7a1SBram Moolenaar ImportInDef() 11335381c7a1SBram Moolenaar END 11345381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11355381c7a1SBram Moolenaar source Ximport2.vim 1136f5be8cdbSBram Moolenaar # TODO: this should be 9879 11375381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11385381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11395381c7a1SBram Moolenaar unlet g:imported 11405381c7a1SBram Moolenaar unlet g:imported_added 11415381c7a1SBram Moolenaar delete('Ximport2.vim') 11425381c7a1SBram Moolenaar 1143cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1144f2d5c240SBram Moolenaar vim9script 1145f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1146f2d5c240SBram Moolenaar def UseExport() 1147cb4e80faSBram Moolenaar g:imported_def = Export.exported 1148f2d5c240SBram Moolenaar enddef 1149cb4e80faSBram Moolenaar g:imported_script = Export.exported 1150cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1151cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1152f2d5c240SBram Moolenaar UseExport() 1153f2d5c240SBram Moolenaar END 1154f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1155f2d5c240SBram Moolenaar source Ximport.vim 1156cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1157cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1158f2d5c240SBram Moolenaar 1159cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1160599c89c8SBram Moolenaar vim9script 1161599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1162599c89c8SBram Moolenaar def Func() 1163cfcd011fSBram Moolenaar var dummy = 1 1164cfcd011fSBram Moolenaar var imported = Export + dummy 1165599c89c8SBram Moolenaar enddef 1166822ba247SBram Moolenaar defcompile 1167599c89c8SBram Moolenaar END 1168599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 116944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1170599c89c8SBram Moolenaar 1171cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1172599c89c8SBram Moolenaar vim9script 1173599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1174599c89c8SBram Moolenaar def Func() 1175cfcd011fSBram Moolenaar var imported = Export . exported 1176599c89c8SBram Moolenaar enddef 1177822ba247SBram Moolenaar defcompile 1178599c89c8SBram Moolenaar END 1179599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 118044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1181599c89c8SBram Moolenaar 1182a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1183a6294955SBram Moolenaar vim9script 1184a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1185a6294955SBram Moolenaar var some = 'other' 1186a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1187a6294955SBram Moolenaar defcompile 1188a6294955SBram Moolenaar END 1189a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1190a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1191a6294955SBram Moolenaar 1192cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1193cb4e80faSBram Moolenaar vim9script 1194cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1195cb4e80faSBram Moolenaar g:imported_script = Export exported 1196cb4e80faSBram Moolenaar END 1197cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1198cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1199cb4e80faSBram Moolenaar 1200cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1201cb4e80faSBram Moolenaar vim9script 1202cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1203cb4e80faSBram Moolenaar g:imported_script = Export. exported 1204cb4e80faSBram Moolenaar END 1205cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1206cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1207cb4e80faSBram Moolenaar 1208cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1209599c89c8SBram Moolenaar vim9script 1210599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1211599c89c8SBram Moolenaar def Func() 1212cfcd011fSBram Moolenaar var imported = Export. 1213599c89c8SBram Moolenaar enddef 1214822ba247SBram Moolenaar defcompile 1215599c89c8SBram Moolenaar END 1216599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 121744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1218599c89c8SBram Moolenaar 1219cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12201c991144SBram Moolenaar vim9script 12211c991144SBram Moolenaar import * 12221c991144SBram Moolenaar as Export 12231c991144SBram Moolenaar from 12241c991144SBram Moolenaar './Xexport.vim' 12251c991144SBram Moolenaar def UseExport() 12261c991144SBram Moolenaar g:imported = Export.exported 12271c991144SBram Moolenaar enddef 12281c991144SBram Moolenaar UseExport() 12291c991144SBram Moolenaar END 12301c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12311c991144SBram Moolenaar source Ximport.vim 12321c991144SBram Moolenaar assert_equal(9883, g:imported) 12331c991144SBram Moolenaar 1234cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1235f2d5c240SBram Moolenaar vim9script 1236f2d5c240SBram Moolenaar import * from './Xexport.vim' 1237f2d5c240SBram Moolenaar END 1238f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 123944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1240f2d5c240SBram Moolenaar 1241f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1242cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1243fa29c8abSBram Moolenaar vim9script 1244fa29c8abSBram Moolenaar import name from './Xexport.vim' 1245fa29c8abSBram Moolenaar END 1246fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 124744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1248fa29c8abSBram Moolenaar 1249f5be8cdbSBram Moolenaar # try to import something that is already defined 1250cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12515269bd2aSBram Moolenaar vim9script 1252cfcd011fSBram Moolenaar var exported = 'something' 12535269bd2aSBram Moolenaar import exported from './Xexport.vim' 12545269bd2aSBram Moolenaar END 12555269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1256057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12575269bd2aSBram Moolenaar 1258f5be8cdbSBram Moolenaar # try to import something that is already defined 12595269bd2aSBram Moolenaar import_already_defined =<< trim END 12605269bd2aSBram Moolenaar vim9script 1261cfcd011fSBram Moolenaar var exported = 'something' 12625269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12635269bd2aSBram Moolenaar END 12645269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1265057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12665269bd2aSBram Moolenaar 1267f5be8cdbSBram Moolenaar # try to import something that is already defined 12685269bd2aSBram Moolenaar import_already_defined =<< trim END 12695269bd2aSBram Moolenaar vim9script 1270cfcd011fSBram Moolenaar var exported = 'something' 12715269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12725269bd2aSBram Moolenaar END 12735269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1274057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12755269bd2aSBram Moolenaar 1276918a4249SBram Moolenaar # try changing an imported const 1277918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1278918a4249SBram Moolenaar vim9script 1279918a4249SBram Moolenaar import CONST from './Xexport.vim' 1280918a4249SBram Moolenaar def Assign() 1281918a4249SBram Moolenaar CONST = 987 1282918a4249SBram Moolenaar enddef 1283918a4249SBram Moolenaar defcompile 1284918a4249SBram Moolenaar END 1285918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1286918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1287918a4249SBram Moolenaar 12880f2a5cc6SBram Moolenaar # try changing an imported final 12890f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 12900f2a5cc6SBram Moolenaar vim9script 12910f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 12920f2a5cc6SBram Moolenaar def Assign() 12930f2a5cc6SBram Moolenaar theList = [2] 12940f2a5cc6SBram Moolenaar enddef 12950f2a5cc6SBram Moolenaar defcompile 12960f2a5cc6SBram Moolenaar END 12970f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 12980f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 12990f2a5cc6SBram Moolenaar 1300f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1301cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1302fa29c8abSBram Moolenaar vim9script 1303fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1304fa29c8abSBram Moolenaar END 1305fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 130644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1307fa29c8abSBram Moolenaar 1308cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1309fa29c8abSBram Moolenaar vim9script 1310fa29c8abSBram Moolenaar import name './Xexport.vim' 1311fa29c8abSBram Moolenaar END 1312fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 131344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1314fa29c8abSBram Moolenaar 1315cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1316fa29c8abSBram Moolenaar vim9script 1317fa29c8abSBram Moolenaar import name from Xexport.vim 1318fa29c8abSBram Moolenaar END 1319fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 132044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1321fa29c8abSBram Moolenaar 1322cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1323fa29c8abSBram Moolenaar vim9script 1324fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1325fa29c8abSBram Moolenaar END 1326fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 132744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1328fa29c8abSBram Moolenaar 1329cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1330fa29c8abSBram Moolenaar vim9script 1331fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1332fa29c8abSBram Moolenaar END 13335269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 133444d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1335fa29c8abSBram Moolenaar 1336f2d5c240SBram Moolenaar delete('Ximport.vim') 13375269bd2aSBram Moolenaar delete('Ximport3.vim') 13388a7d6542SBram Moolenaar delete('Xexport.vim') 13398a7d6542SBram Moolenaar 1340f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 13413e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 13423e191694SBram Moolenaar set cpo=abcd 1343cfcd011fSBram Moolenaar var lines =<< trim END 1344750802b5SBram Moolenaar vim9script 1345750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 13463e191694SBram Moolenaar set cpo+=f 13473e191694SBram Moolenaar set cpo-=c 13483e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1349750802b5SBram Moolenaar END 1350750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1351750802b5SBram Moolenaar source Xvim9_script 13523e191694SBram Moolenaar assert_equal('fabd', &cpo) 1353750802b5SBram Moolenaar set cpo&vim 1354750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 13553e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 13563e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 13573e191694SBram Moolenaar 1358750802b5SBram Moolenaar delete('Xvim9_script') 1359750802b5SBram Moolenaarenddef 1360750802b5SBram Moolenaar 13610a84284eSBram Moolenaardef Test_import_as() 13620a84284eSBram Moolenaar var export_lines =<< trim END 13630a84284eSBram Moolenaar vim9script 13640a84284eSBram Moolenaar export var one = 1 13650a84284eSBram Moolenaar export var yes = 'yes' 13660a84284eSBram Moolenaar END 13670a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 13680a84284eSBram Moolenaar 13690a84284eSBram Moolenaar var import_lines =<< trim END 13700a84284eSBram Moolenaar vim9script 13716c7cc347SBram Moolenaar var one = 'notused' 13726c7cc347SBram Moolenaar var yes = 777 13730a84284eSBram Moolenaar import one as thatOne from './XexportAs' 13740a84284eSBram Moolenaar assert_equal(1, thatOne) 13750a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 13760a84284eSBram Moolenaar assert_equal('yes', yesYes) 13770a84284eSBram Moolenaar END 13780a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13790a84284eSBram Moolenaar 13800a84284eSBram Moolenaar import_lines =<< trim END 13810a84284eSBram Moolenaar vim9script 13820a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 13830a84284eSBram Moolenaar assert_equal(1, thatOne) 13840a84284eSBram Moolenaar assert_equal('yes', yesYes) 13850a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 13860a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 13870a84284eSBram Moolenaar END 13880a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13890a84284eSBram Moolenaar 13900a84284eSBram Moolenaar delete('XexportAs') 13910a84284eSBram Moolenaarenddef 13920a84284eSBram Moolenaar 1393803af686SBram Moolenaarfunc g:Trigger() 1394803af686SBram Moolenaar source Ximport.vim 1395803af686SBram Moolenaar return "echo 'yes'\<CR>" 1396803af686SBram Moolenaarendfunc 1397803af686SBram Moolenaar 1398803af686SBram Moolenaardef Test_import_export_expr_map() 1399803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1400cfcd011fSBram Moolenaar var export_lines =<< trim END 1401803af686SBram Moolenaar vim9script 1402803af686SBram Moolenaar export def That(): string 1403803af686SBram Moolenaar return 'yes' 1404803af686SBram Moolenaar enddef 1405803af686SBram Moolenaar END 1406803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1407803af686SBram Moolenaar 1408cfcd011fSBram Moolenaar var import_lines =<< trim END 1409803af686SBram Moolenaar vim9script 1410803af686SBram Moolenaar import That from './Xexport_that.vim' 1411803af686SBram Moolenaar assert_equal('yes', That()) 1412803af686SBram Moolenaar END 1413803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1414803af686SBram Moolenaar 1415803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1416803af686SBram Moolenaar feedkeys('trigger', "xt") 1417803af686SBram Moolenaar 1418730b2483SBram Moolenaar delete('Xexport_that.vim') 1419803af686SBram Moolenaar delete('Ximport.vim') 1420803af686SBram Moolenaar nunmap trigger 1421803af686SBram Moolenaarenddef 1422803af686SBram Moolenaar 14238e1986e3SBram Moolenaardef Test_import_in_filetype() 14248e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14258e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1426cfcd011fSBram Moolenaar var export_lines =<< trim END 14278e1986e3SBram Moolenaar vim9script 1428cfcd011fSBram Moolenaar export var That = 'yes' 14298e1986e3SBram Moolenaar END 1430730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 14318e1986e3SBram Moolenaar 1432cfcd011fSBram Moolenaar var import_lines =<< trim END 14338e1986e3SBram Moolenaar vim9script 1434730b2483SBram Moolenaar import That from './Xexport_ft.vim' 14358e1986e3SBram Moolenaar assert_equal('yes', That) 14368e1986e3SBram Moolenaar g:did_load_mytpe = 1 14378e1986e3SBram Moolenaar END 14388e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14398e1986e3SBram Moolenaar 1440cfcd011fSBram Moolenaar var save_rtp = &rtp 14418e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14428e1986e3SBram Moolenaar 14438e1986e3SBram Moolenaar filetype plugin on 14448e1986e3SBram Moolenaar copen 14458e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14468e1986e3SBram Moolenaar 14478e1986e3SBram Moolenaar quit! 1448730b2483SBram Moolenaar delete('Xexport_ft.vim') 14498e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14508e1986e3SBram Moolenaar &rtp = save_rtp 14518e1986e3SBram Moolenaarenddef 14528e1986e3SBram Moolenaar 1453efa94447SBram Moolenaardef Test_use_import_in_mapping() 1454cfcd011fSBram Moolenaar var lines =<< trim END 1455efa94447SBram Moolenaar vim9script 1456efa94447SBram Moolenaar export def Funcx() 1457efa94447SBram Moolenaar g:result = 42 1458efa94447SBram Moolenaar enddef 1459efa94447SBram Moolenaar END 1460efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1461efa94447SBram Moolenaar lines =<< trim END 1462efa94447SBram Moolenaar vim9script 1463efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1464b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1465efa94447SBram Moolenaar END 1466efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1467efa94447SBram Moolenaar 1468efa94447SBram Moolenaar source Xmapscript.vim 1469b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1470efa94447SBram Moolenaar assert_equal(42, g:result) 1471efa94447SBram Moolenaar 1472efa94447SBram Moolenaar unlet g:result 1473efa94447SBram Moolenaar delete('XsomeExport.vim') 1474efa94447SBram Moolenaar delete('Xmapscript.vim') 1475b3ca9824SBram Moolenaar nunmap <F3> 1476efa94447SBram Moolenaarenddef 1477efa94447SBram Moolenaar 1478d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1479d3f8a9eeSBram Moolenaar var lines =<< trim END 1480d3f8a9eeSBram Moolenaar if has(g:feature) 1481d3f8a9eeSBram Moolenaar " legacy script 1482d3f8a9eeSBram Moolenaar let g:legacy = 1 1483d3f8a9eeSBram Moolenaar finish 1484d3f8a9eeSBram Moolenaar endif 1485d3f8a9eeSBram Moolenaar vim9script 1486d3f8a9eeSBram Moolenaar g:legacy = 0 1487d3f8a9eeSBram Moolenaar END 1488d3f8a9eeSBram Moolenaar g:feature = 'eval' 1489d3f8a9eeSBram Moolenaar g:legacy = -1 1490d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1491d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1492d3f8a9eeSBram Moolenaar 1493d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1494d3f8a9eeSBram Moolenaar g:legacy = -1 1495d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1496d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1497d3f8a9eeSBram Moolenaarenddef 1498d3f8a9eeSBram Moolenaar 1499750802b5SBram Moolenaardef Test_vim9script_fails() 15008a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15018a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1502cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15039721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1504cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1505750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1506750802b5SBram Moolenaar 1507cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1508c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1509c785b9a7SBram Moolenaar 1510e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1511e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15128a7d6542SBram Moolenaarenddef 15138a7d6542SBram Moolenaar 1514f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1515101f4810SBram Moolenaar CheckRunVimInTerminal 1516101f4810SBram Moolenaar 15179bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1518c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15199bb3eb3eSBram Moolenaarendfunc 15209bb3eb3eSBram Moolenaar 1521c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1522cfcd011fSBram Moolenaar var export =<< trim END 1523101f4810SBram Moolenaar vim9script 1524101f4810SBram Moolenaar export def Foo(): number 1525101f4810SBram Moolenaar return 0 1526101f4810SBram Moolenaar enddef 1527101f4810SBram Moolenaar END 1528730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1529101f4810SBram Moolenaar 1530e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 15319bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 15322949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1533101f4810SBram Moolenaar 1534730b2483SBram Moolenaar delete('XexportCmd.vim') 15359bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 15369bb3eb3eSBram Moolenaarenddef 1537101f4810SBram Moolenaar 15382b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 15392b32700dSBram Moolenaar var lines =<< trim END 1540a6294955SBram Moolenaar vim9script 1541a6294955SBram Moolenaar export var exported = 'thexport' 1542a6294955SBram Moolenaar END 1543a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1544a6294955SBram Moolenaar lines =<< trim END 15452b32700dSBram Moolenaar vim9script noclear 15462b32700dSBram Moolenaar g:loadCount += 1 15472b32700dSBram Moolenaar var s:reloaded = 'init' 1548a6294955SBram Moolenaar import exported from './XExportReload' 15492b32700dSBram Moolenaar 15502b32700dSBram Moolenaar def Again(): string 15512b32700dSBram Moolenaar return 'again' 15522b32700dSBram Moolenaar enddef 15532b32700dSBram Moolenaar 15542b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 15552b32700dSBram Moolenaar var s:loaded = true 15562b32700dSBram Moolenaar 15572b32700dSBram Moolenaar var s:notReloaded = 'yes' 15582b32700dSBram Moolenaar s:reloaded = 'first' 15592b32700dSBram Moolenaar def g:Values(): list<string> 1560a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 15612b32700dSBram Moolenaar enddef 15622b32700dSBram Moolenaar 15632b32700dSBram Moolenaar def Once(): string 15642b32700dSBram Moolenaar return 'once' 15652b32700dSBram Moolenaar enddef 15662b32700dSBram Moolenaar END 15672b32700dSBram Moolenaar writefile(lines, 'XReloaded') 15682b32700dSBram Moolenaar g:loadCount = 0 15692b32700dSBram Moolenaar source XReloaded 15702b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1571a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 15722b32700dSBram Moolenaar source XReloaded 15732b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1574a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15752b32700dSBram Moolenaar source XReloaded 15762b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1577a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15782b32700dSBram Moolenaar 157948e11c10SBram Moolenaar delete('XReloaded') 1580a6294955SBram Moolenaar delete('XExportReload') 15812b32700dSBram Moolenaar delfunc g:Values 15822b32700dSBram Moolenaar unlet g:loadCount 1583577dc93dSBram Moolenaar 1584577dc93dSBram Moolenaar lines =<< trim END 1585577dc93dSBram Moolenaar vim9script 1586577dc93dSBram Moolenaar def Inner() 1587577dc93dSBram Moolenaar enddef 1588577dc93dSBram Moolenaar END 1589577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1590577dc93dSBram Moolenaar source XreloadScript.vim 1591577dc93dSBram Moolenaar 1592577dc93dSBram Moolenaar lines =<< trim END 1593577dc93dSBram Moolenaar vim9script 1594577dc93dSBram Moolenaar def Outer() 1595577dc93dSBram Moolenaar def Inner() 1596577dc93dSBram Moolenaar enddef 1597577dc93dSBram Moolenaar enddef 1598577dc93dSBram Moolenaar defcompile 1599577dc93dSBram Moolenaar END 1600577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1601577dc93dSBram Moolenaar source XreloadScript.vim 1602577dc93dSBram Moolenaar 1603577dc93dSBram Moolenaar delete('XreloadScript.vim') 16042b32700dSBram Moolenaarenddef 16052b32700dSBram Moolenaar 16064c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1607cfcd011fSBram Moolenaar var lines =<< trim END 16088a7d6542SBram Moolenaar vim9script 16098a7d6542SBram Moolenaar const var = '' 1610cfcd011fSBram Moolenaar var valone = 1234 16118a7d6542SBram Moolenaar def MyFunc(arg: string) 16128a7d6542SBram Moolenaar valone = 5678 16138a7d6542SBram Moolenaar enddef 16148a7d6542SBram Moolenaar END 1615cfcd011fSBram Moolenaar var morelines =<< trim END 1616cfcd011fSBram Moolenaar var valtwo = 222 16178a7d6542SBram Moolenaar export def GetValtwo(): number 16188a7d6542SBram Moolenaar return valtwo 16198a7d6542SBram Moolenaar enddef 16208a7d6542SBram Moolenaar END 162103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16228a7d6542SBram Moolenaar source Xreload.vim 16238a7d6542SBram Moolenaar source Xreload.vim 16248a7d6542SBram Moolenaar source Xreload.vim 16258a7d6542SBram Moolenaar 1626cfcd011fSBram Moolenaar var testlines =<< trim END 16278a7d6542SBram Moolenaar vim9script 16288a7d6542SBram Moolenaar def TheFunc() 16298a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16308a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16318a7d6542SBram Moolenaar enddef 16328a7d6542SBram Moolenaar TheFunc() 16338a7d6542SBram Moolenaar END 16348a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16358a7d6542SBram Moolenaar source Ximport.vim 16368a7d6542SBram Moolenaar 1637f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1638f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16398a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16408a7d6542SBram Moolenaar source Ximport.vim 16418a7d6542SBram Moolenaar 1642f5be8cdbSBram Moolenaar # cannot declare a var twice 16438a7d6542SBram Moolenaar lines =<< trim END 16448a7d6542SBram Moolenaar vim9script 1645cfcd011fSBram Moolenaar var valone = 1234 1646cfcd011fSBram Moolenaar var valone = 5678 16478a7d6542SBram Moolenaar END 16488a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 164944d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16508a7d6542SBram Moolenaar 16518a7d6542SBram Moolenaar delete('Xreload.vim') 16528a7d6542SBram Moolenaar delete('Ximport.vim') 16538a7d6542SBram Moolenaarenddef 16548a7d6542SBram Moolenaar 165507a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 165607a65d26SBram Moolenaar" compiled function using that variable must fail. 165707a65d26SBram Moolenaardef Test_script_reload_change_type() 165807a65d26SBram Moolenaar var lines =<< trim END 165907a65d26SBram Moolenaar vim9script noclear 166007a65d26SBram Moolenaar var str = 'string' 166107a65d26SBram Moolenaar def g:GetStr(): string 166207a65d26SBram Moolenaar return str .. 'xxx' 166307a65d26SBram Moolenaar enddef 166407a65d26SBram Moolenaar END 166507a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 166607a65d26SBram Moolenaar source Xreload.vim 166707a65d26SBram Moolenaar echo g:GetStr() 166807a65d26SBram Moolenaar 166907a65d26SBram Moolenaar lines =<< trim END 167007a65d26SBram Moolenaar vim9script noclear 167107a65d26SBram Moolenaar var str = 1234 167207a65d26SBram Moolenaar END 167307a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 167407a65d26SBram Moolenaar source Xreload.vim 167507a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 167607a65d26SBram Moolenaar 167707a65d26SBram Moolenaar delfunc g:GetStr 167807a65d26SBram Moolenaar delete('Xreload.vim') 167907a65d26SBram Moolenaarenddef 168007a65d26SBram Moolenaar 1681c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1682c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1683c970e422SBram Moolenaar 1684c970e422SBram Moolenaardef Test_script_reload_from_function() 1685c970e422SBram Moolenaar var lines =<< trim END 1686c970e422SBram Moolenaar vim9script 1687c970e422SBram Moolenaar 1688c970e422SBram Moolenaar if exists('g:loaded') 1689c970e422SBram Moolenaar finish 1690c970e422SBram Moolenaar endif 1691c970e422SBram Moolenaar g:loaded = 1 1692c970e422SBram Moolenaar delcommand CallFunc 1693c970e422SBram Moolenaar command CallFunc Func() 1694c970e422SBram Moolenaar def Func() 1695a4c81beaSBram Moolenaar so XreloadFunc.vim 1696c970e422SBram Moolenaar g:didTheFunc = 1 1697c970e422SBram Moolenaar enddef 1698c970e422SBram Moolenaar END 1699c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1700c970e422SBram Moolenaar source XreloadFunc.vim 1701c970e422SBram Moolenaar CallFunc 1702c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1703c970e422SBram Moolenaar 1704c970e422SBram Moolenaar delete('XreloadFunc.vim') 1705c970e422SBram Moolenaar delcommand CallFunc 1706c970e422SBram Moolenaar unlet g:loaded 1707c970e422SBram Moolenaar unlet g:didTheFunc 1708c970e422SBram Moolenaarenddef 1709c970e422SBram Moolenaar 17106c3843caSBram Moolenaardef Test_script_var_shadows_function() 17116c3843caSBram Moolenaar var lines =<< trim END 17126c3843caSBram Moolenaar vim9script 17136c3843caSBram Moolenaar def Func(): number 17146c3843caSBram Moolenaar return 123 17156c3843caSBram Moolenaar enddef 17166c3843caSBram Moolenaar var Func = 1 17176c3843caSBram Moolenaar END 17186c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17196c3843caSBram Moolenaarenddef 17206c3843caSBram Moolenaar 172195006e3dSBram Moolenaardef s:RetSome(): string 172295006e3dSBram Moolenaar return 'some' 172395006e3dSBram Moolenaarenddef 172495006e3dSBram Moolenaar 1725fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1726fe465a01SBram Moolenaar" script-local name. 1727fe465a01SBram Moolenaardef Test_vim9script_funcref() 1728cfcd011fSBram Moolenaar var sortlines =<< trim END 1729fe465a01SBram Moolenaar vim9script 1730fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1731bed36b93SBram Moolenaar return i2 - i1 1732fe465a01SBram Moolenaar enddef 1733fe465a01SBram Moolenaar 1734fe465a01SBram Moolenaar export def FastSort(): list<number> 1735fe465a01SBram Moolenaar return range(5)->sort(Compare) 1736fe465a01SBram Moolenaar enddef 1737529fb5a5SBram Moolenaar 1738529fb5a5SBram Moolenaar export def GetString(arg: string): string 1739529fb5a5SBram Moolenaar return arg 1740529fb5a5SBram Moolenaar enddef 1741fe465a01SBram Moolenaar END 1742fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1743fe465a01SBram Moolenaar 1744cfcd011fSBram Moolenaar var lines =<< trim END 1745fe465a01SBram Moolenaar vim9script 1746fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1747fe465a01SBram Moolenaar def Test() 1748fe465a01SBram Moolenaar g:result = FastSort() 1749fe465a01SBram Moolenaar enddef 1750fe465a01SBram Moolenaar Test() 1751529fb5a5SBram Moolenaar 1752529fb5a5SBram Moolenaar # using a function imported with "as" 1753529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1754529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1755529fb5a5SBram Moolenaar 1756529fb5a5SBram Moolenaar # using the function from a compiled function 1757529fb5a5SBram Moolenaar def TestMore(): string 1758ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1759ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1760529fb5a5SBram Moolenaar enddef 1761ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1762529fb5a5SBram Moolenaar 1763529fb5a5SBram Moolenaar # error when using a function that isn't exported 1764529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1765fe465a01SBram Moolenaar END 1766fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1767fe465a01SBram Moolenaar 1768fe465a01SBram Moolenaar source Xscript.vim 1769fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1770fe465a01SBram Moolenaar 1771fe465a01SBram Moolenaar unlet g:result 1772fe465a01SBram Moolenaar delete('Xsort.vim') 1773fe465a01SBram Moolenaar delete('Xscript.vim') 177495006e3dSBram Moolenaar 1775cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 177695006e3dSBram Moolenaar assert_equal('some', Funcref()) 1777fe465a01SBram Moolenaarenddef 1778fe465a01SBram Moolenaar 1779601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1780601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1781601e76acSBram Moolenaar" function reference. 1782c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1783cfcd011fSBram Moolenaar var filterLines =<< trim END 1784c620c055SBram Moolenaar vim9script 1785c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1786c620c055SBram Moolenaar return idx % 2 == 1 1787c620c055SBram Moolenaar enddef 1788c620c055SBram Moolenaar export def FastFilter(): list<number> 1789c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1790c620c055SBram Moolenaar enddef 1791601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1792601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1793601e76acSBram Moolenaar enddef 1794c620c055SBram Moolenaar END 1795c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1796c620c055SBram Moolenaar 1797cfcd011fSBram Moolenaar var lines =<< trim END 1798c620c055SBram Moolenaar vim9script 1799601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1800c620c055SBram Moolenaar def Test() 1801cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1802c620c055SBram Moolenaar enddef 1803c620c055SBram Moolenaar Test() 1804601e76acSBram Moolenaar def TestDirect() 1805cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1806601e76acSBram Moolenaar enddef 1807601e76acSBram Moolenaar TestDirect() 1808c620c055SBram Moolenaar END 1809601e76acSBram Moolenaar CheckScriptSuccess(lines) 1810c620c055SBram Moolenaar delete('Xfilter.vim') 1811c620c055SBram Moolenaarenddef 1812c620c055SBram Moolenaar 18134c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1814cfcd011fSBram Moolenaar var first_lines =<< trim END 18154c17ad94SBram Moolenaar vim9script 18164c17ad94SBram Moolenaar def FuncYes(): string 18174c17ad94SBram Moolenaar return 'yes' 18184c17ad94SBram Moolenaar enddef 18194c17ad94SBram Moolenaar END 1820cfcd011fSBram Moolenaar var withno_lines =<< trim END 18214c17ad94SBram Moolenaar def FuncNo(): string 18224c17ad94SBram Moolenaar return 'no' 18234c17ad94SBram Moolenaar enddef 18244c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 18254c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 18264c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 182703afdcf1SBram Moolenaar enddef 182803afdcf1SBram Moolenaar END 1829cfcd011fSBram Moolenaar var nono_lines =<< trim END 183003afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 183103afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 183244d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 18334c17ad94SBram Moolenaar enddef 18344c17ad94SBram Moolenaar END 18354c17ad94SBram Moolenaar 18364c17ad94SBram Moolenaar # FuncNo() is defined 183703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18384c17ad94SBram Moolenaar source Xreloaded.vim 18394c17ad94SBram Moolenaar g:DoCheck(true) 18404c17ad94SBram Moolenaar 18414c17ad94SBram Moolenaar # FuncNo() is not redefined 184203afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18434c17ad94SBram Moolenaar source Xreloaded.vim 18445082471fSBram Moolenaar g:DoCheck(false) 18454c17ad94SBram Moolenaar 18464c17ad94SBram Moolenaar # FuncNo() is back 184703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18484c17ad94SBram Moolenaar source Xreloaded.vim 18495082471fSBram Moolenaar g:DoCheck(false) 18504c17ad94SBram Moolenaar 18514c17ad94SBram Moolenaar delete('Xreloaded.vim') 18524c17ad94SBram Moolenaarenddef 18534c17ad94SBram Moolenaar 185489483d40SBram Moolenaardef Test_vim9script_reload_delvar() 185589483d40SBram Moolenaar # write the script with a script-local variable 1856cfcd011fSBram Moolenaar var lines =<< trim END 185789483d40SBram Moolenaar vim9script 1858cfcd011fSBram Moolenaar var name = 'string' 185989483d40SBram Moolenaar END 186089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 186189483d40SBram Moolenaar source XreloadVar.vim 186289483d40SBram Moolenaar 186389483d40SBram Moolenaar # now write the script using the same variable locally - works 186489483d40SBram Moolenaar lines =<< trim END 186589483d40SBram Moolenaar vim9script 186689483d40SBram Moolenaar def Func() 1867cfcd011fSBram Moolenaar var name = 'string' 186889483d40SBram Moolenaar enddef 186989483d40SBram Moolenaar END 187089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 187189483d40SBram Moolenaar source XreloadVar.vim 187289483d40SBram Moolenaar 187389483d40SBram Moolenaar delete('XreloadVar.vim') 187489483d40SBram Moolenaarenddef 187589483d40SBram Moolenaar 18768a7d6542SBram Moolenaardef Test_import_absolute() 1877cfcd011fSBram Moolenaar var import_lines = [ 1878e6085c53SBram Moolenaar 'vim9script', 1879e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1880e6085c53SBram Moolenaar 'def UseExported()', 1881e6085c53SBram Moolenaar ' g:imported_abs = exported', 1882e6085c53SBram Moolenaar ' exported = 8888', 1883e6085c53SBram Moolenaar ' g:imported_after = exported', 1884e6085c53SBram Moolenaar 'enddef', 1885e6085c53SBram Moolenaar 'UseExported()', 1886e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1887e6085c53SBram Moolenaar ] 18888a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18908a7d6542SBram Moolenaar 18918a7d6542SBram Moolenaar source Ximport_abs.vim 18928a7d6542SBram Moolenaar 18938a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18944e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1895fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1896fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1897fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1898fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1899fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1900fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1901fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1902fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1903fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1904fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1905e6085c53SBram Moolenaar g:import_disassembled) 1906b3ca9824SBram Moolenaar 1907b3ca9824SBram Moolenaar Undo_export_script_lines() 19088a7d6542SBram Moolenaar unlet g:imported_abs 19094e12a5dfSBram Moolenaar unlet g:import_disassembled 19108a7d6542SBram Moolenaar 19118a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19128a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19138a7d6542SBram Moolenaarenddef 19148a7d6542SBram Moolenaar 19158a7d6542SBram Moolenaardef Test_import_rtp() 1916cfcd011fSBram Moolenaar var import_lines = [ 1917e6085c53SBram Moolenaar 'vim9script', 1918e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1919e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1920e6085c53SBram Moolenaar ] 19218a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 19228a7d6542SBram Moolenaar mkdir('import') 19238a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 19248a7d6542SBram Moolenaar 1925cfcd011fSBram Moolenaar var save_rtp = &rtp 19268a7d6542SBram Moolenaar &rtp = getcwd() 19278a7d6542SBram Moolenaar source Ximport_rtp.vim 19288a7d6542SBram Moolenaar &rtp = save_rtp 19298a7d6542SBram Moolenaar 19308a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 19318a7d6542SBram Moolenaar 1932b3ca9824SBram Moolenaar Undo_export_script_lines() 1933b3ca9824SBram Moolenaar unlet g:imported_rtp 19348a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 193589483d40SBram Moolenaar delete('import', 'rf') 19368a7d6542SBram Moolenaarenddef 19378a7d6542SBram Moolenaar 193825e0f586SBram Moolenaardef Test_import_compile_error() 1939cfcd011fSBram Moolenaar var export_lines = [ 194025e0f586SBram Moolenaar 'vim9script', 194125e0f586SBram Moolenaar 'export def ExpFunc(): string', 194225e0f586SBram Moolenaar ' return notDefined', 194325e0f586SBram Moolenaar 'enddef', 194425e0f586SBram Moolenaar ] 194525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 194625e0f586SBram Moolenaar 1947cfcd011fSBram Moolenaar var import_lines = [ 194825e0f586SBram Moolenaar 'vim9script', 194925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 195025e0f586SBram Moolenaar 'def ImpFunc()', 195125e0f586SBram Moolenaar ' echo ExpFunc()', 195225e0f586SBram Moolenaar 'enddef', 195325e0f586SBram Moolenaar 'defcompile', 195425e0f586SBram Moolenaar ] 195525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 195625e0f586SBram Moolenaar 195725e0f586SBram Moolenaar try 195825e0f586SBram Moolenaar source Ximport.vim 195925e0f586SBram Moolenaar catch /E1001/ 1960f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 19617707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 196225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 196325e0f586SBram Moolenaar endtry 196425e0f586SBram Moolenaar 196525e0f586SBram Moolenaar delete('Xexported.vim') 196625e0f586SBram Moolenaar delete('Ximport.vim') 196725e0f586SBram Moolenaarenddef 196825e0f586SBram Moolenaar 1969c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1970cfcd011fSBram Moolenaar var lines = [ 1971c4ce36d4SBram Moolenaar 'vim9script', 1972c4ce36d4SBram Moolenaar 'def Func()', 1973c4ce36d4SBram Moolenaar ' eval [][0]', 1974c4ce36d4SBram Moolenaar 'enddef', 1975c4ce36d4SBram Moolenaar 'Func()', 1976c4ce36d4SBram Moolenaar ] 1977c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1978c4ce36d4SBram Moolenaar 1979c4ce36d4SBram Moolenaar for count in range(3) 1980c4ce36d4SBram Moolenaar try 1981c4ce36d4SBram Moolenaar source Xtestscript.vim 1982c4ce36d4SBram Moolenaar catch /E684/ 1983c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1984c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1985c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1986c4ce36d4SBram Moolenaar endtry 1987c4ce36d4SBram Moolenaar endfor 1988c4ce36d4SBram Moolenaar 1989c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1990c4ce36d4SBram Moolenaarenddef 1991c4ce36d4SBram Moolenaar 1992eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1993cfcd011fSBram Moolenaar var export_lines =<< trim END 1994eef2102eSBram Moolenaar vim9script 1995eef2102eSBram Moolenaar export def Func() 1996eef2102eSBram Moolenaar echo 'imported' 1997eef2102eSBram Moolenaar enddef 1998eef2102eSBram Moolenaar END 1999eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2000eef2102eSBram Moolenaar 2001cfcd011fSBram Moolenaar var lines =<< trim END 2002eef2102eSBram Moolenaar vim9script 2003eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2004eef2102eSBram Moolenaar def Func() 2005eef2102eSBram Moolenaar echo 'local to function' 2006eef2102eSBram Moolenaar enddef 2007eef2102eSBram Moolenaar END 2008eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2009eef2102eSBram Moolenaar 2010eef2102eSBram Moolenaar lines =<< trim END 2011eef2102eSBram Moolenaar vim9script 2012eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2013eef2102eSBram Moolenaar def Outer() 2014eef2102eSBram Moolenaar def Func() 2015eef2102eSBram Moolenaar echo 'local to function' 2016eef2102eSBram Moolenaar enddef 2017eef2102eSBram Moolenaar enddef 2018eef2102eSBram Moolenaar defcompile 2019eef2102eSBram Moolenaar END 2020eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2021eef2102eSBram Moolenaar 2022eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2023eef2102eSBram Moolenaarenddef 2024eef2102eSBram Moolenaar 2025b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2026cfcd011fSBram Moolenaar var lines =<< trim END 2027b9a2cac3SBram Moolenaar vim9script 2028b9a2cac3SBram Moolenaar def Func() 2029b9a2cac3SBram Moolenaar echo 'one' 2030b9a2cac3SBram Moolenaar enddef 2031b9a2cac3SBram Moolenaar def Func() 2032b9a2cac3SBram Moolenaar echo 'two' 2033b9a2cac3SBram Moolenaar enddef 2034b9a2cac3SBram Moolenaar END 2035b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2036fa211f3cSBram Moolenaar 2037fa211f3cSBram Moolenaar lines =<< trim END 2038fa211f3cSBram Moolenaar vim9script 2039fa211f3cSBram Moolenaar def Foo(): string 2040fa211f3cSBram Moolenaar return 'foo' 2041fa211f3cSBram Moolenaar enddef 2042fa211f3cSBram Moolenaar def Func() 2043cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2044fa211f3cSBram Moolenaar enddef 2045fa211f3cSBram Moolenaar defcompile 2046fa211f3cSBram Moolenaar END 2047fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2048b9a2cac3SBram Moolenaarenddef 2049b9a2cac3SBram Moolenaar 20508a7d6542SBram Moolenaardef Test_fixed_size_list() 2051f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2052cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 20538a7d6542SBram Moolenaar l->remove(0) 20548a7d6542SBram Moolenaar l->add(5) 20558a7d6542SBram Moolenaar l->insert(99, 1) 20560f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20578a7d6542SBram Moolenaarenddef 20588a7d6542SBram Moolenaar 2059ae616494SBram Moolenaardef Test_no_insert_xit() 2060d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2061d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2062d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2063d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2064d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2065ae616494SBram Moolenaar 2066ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2067ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2068ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2069ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2070f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2071f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 20726508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 20736508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2074f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2075f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2076f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2077ae616494SBram Moolenaarenddef 2078ae616494SBram Moolenaar 2079158906cfSBram Moolenaardef IfElse(what: number): string 2080cfcd011fSBram Moolenaar var res = '' 2081158906cfSBram Moolenaar if what == 1 2082158906cfSBram Moolenaar res = "one" 2083158906cfSBram Moolenaar elseif what == 2 2084158906cfSBram Moolenaar res = "two" 2085a259d8d3SBram Moolenaar else 2086158906cfSBram Moolenaar res = "three" 2087a259d8d3SBram Moolenaar endif 2088158906cfSBram Moolenaar return res 2089a259d8d3SBram Moolenaarenddef 2090a259d8d3SBram Moolenaar 2091158906cfSBram Moolenaardef Test_if_elseif_else() 2092158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2093158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2094158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20950f18b6d1SBram Moolenaarenddef 20960f18b6d1SBram Moolenaar 2097e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2098d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2099d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2100d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2101ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2102d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21036628b7ebSBram Moolenaar 21046628b7ebSBram Moolenaar var lines =<< trim END 21056628b7ebSBram Moolenaar var s = '' 21066628b7ebSBram Moolenaar if s = '' 21076628b7ebSBram Moolenaar endif 21086628b7ebSBram Moolenaar END 21096628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 21106628b7ebSBram Moolenaar 21116628b7ebSBram Moolenaar lines =<< trim END 21126628b7ebSBram Moolenaar var s = '' 21136628b7ebSBram Moolenaar if s == '' 21146628b7ebSBram Moolenaar elseif s = '' 21156628b7ebSBram Moolenaar endif 21166628b7ebSBram Moolenaar END 21176628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2118e8c4abbbSBram Moolenaarenddef 2119e8c4abbbSBram Moolenaar 21206d69bf60SBram Moolenaarlet g:bool_true = v:true 21216d69bf60SBram Moolenaarlet g:bool_false = v:false 21226d69bf60SBram Moolenaar 21236d69bf60SBram Moolenaardef Test_if_const_expr() 2124cfcd011fSBram Moolenaar var res = false 21256d69bf60SBram Moolenaar if true ? true : false 21266d69bf60SBram Moolenaar res = true 21276d69bf60SBram Moolenaar endif 21286d69bf60SBram Moolenaar assert_equal(true, res) 21296d69bf60SBram Moolenaar 2130585fea7bSBram Moolenaar g:glob = 2 2131585fea7bSBram Moolenaar if false 21326797966dSBram Moolenaar execute('g:glob = 3') 2133585fea7bSBram Moolenaar endif 2134585fea7bSBram Moolenaar assert_equal(2, g:glob) 2135585fea7bSBram Moolenaar if true 21366797966dSBram Moolenaar execute('g:glob = 3') 2137585fea7bSBram Moolenaar endif 2138585fea7bSBram Moolenaar assert_equal(3, g:glob) 2139585fea7bSBram Moolenaar 21406d69bf60SBram Moolenaar res = false 21416d69bf60SBram Moolenaar if g:bool_true ? true : false 21426d69bf60SBram Moolenaar res = true 21436d69bf60SBram Moolenaar endif 21446d69bf60SBram Moolenaar assert_equal(true, res) 21456d69bf60SBram Moolenaar 21466d69bf60SBram Moolenaar res = false 21476d69bf60SBram Moolenaar if true ? g:bool_true : false 21486d69bf60SBram Moolenaar res = true 21496d69bf60SBram Moolenaar endif 21506d69bf60SBram Moolenaar assert_equal(true, res) 21516d69bf60SBram Moolenaar 21526d69bf60SBram Moolenaar res = false 21536d69bf60SBram Moolenaar if true ? true : g:bool_false 21546d69bf60SBram Moolenaar res = true 21556d69bf60SBram Moolenaar endif 21566d69bf60SBram Moolenaar assert_equal(true, res) 21576d69bf60SBram Moolenaar 21586d69bf60SBram Moolenaar res = false 21596d69bf60SBram Moolenaar if true ? false : true 21606d69bf60SBram Moolenaar res = true 21616d69bf60SBram Moolenaar endif 21626d69bf60SBram Moolenaar assert_equal(false, res) 21636d69bf60SBram Moolenaar 21646d69bf60SBram Moolenaar res = false 21656d69bf60SBram Moolenaar if false ? false : true 21666d69bf60SBram Moolenaar res = true 21676d69bf60SBram Moolenaar endif 21686d69bf60SBram Moolenaar assert_equal(true, res) 21696d69bf60SBram Moolenaar 21706d69bf60SBram Moolenaar res = false 21716d69bf60SBram Moolenaar if false ? true : false 21726d69bf60SBram Moolenaar res = true 21736d69bf60SBram Moolenaar endif 21746d69bf60SBram Moolenaar assert_equal(false, res) 21756d69bf60SBram Moolenaar 21766d69bf60SBram Moolenaar res = false 2177e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2178e8c4abbbSBram Moolenaar res = true 2179e8c4abbbSBram Moolenaar endif 2180e8c4abbbSBram Moolenaar assert_equal(false, res) 2181e8c4abbbSBram Moolenaar 2182e8c4abbbSBram Moolenaar res = false 21836d69bf60SBram Moolenaar if true && true 21846d69bf60SBram Moolenaar res = true 21856d69bf60SBram Moolenaar endif 21866d69bf60SBram Moolenaar assert_equal(true, res) 21876d69bf60SBram Moolenaar 21886d69bf60SBram Moolenaar res = false 21896d69bf60SBram Moolenaar if true && false 21906d69bf60SBram Moolenaar res = true 21916d69bf60SBram Moolenaar endif 21926d69bf60SBram Moolenaar assert_equal(false, res) 21936d69bf60SBram Moolenaar 21946d69bf60SBram Moolenaar res = false 21956d69bf60SBram Moolenaar if g:bool_true && false 21966d69bf60SBram Moolenaar res = true 21976d69bf60SBram Moolenaar endif 21986d69bf60SBram Moolenaar assert_equal(false, res) 21996d69bf60SBram Moolenaar 22006d69bf60SBram Moolenaar res = false 22016d69bf60SBram Moolenaar if true && g:bool_false 22026d69bf60SBram Moolenaar res = true 22036d69bf60SBram Moolenaar endif 22046d69bf60SBram Moolenaar assert_equal(false, res) 22056d69bf60SBram Moolenaar 22066d69bf60SBram Moolenaar res = false 22076d69bf60SBram Moolenaar if false && false 22086d69bf60SBram Moolenaar res = true 22096d69bf60SBram Moolenaar endif 22106d69bf60SBram Moolenaar assert_equal(false, res) 22116d69bf60SBram Moolenaar 22126d69bf60SBram Moolenaar res = false 22136d69bf60SBram Moolenaar if true || false 22146d69bf60SBram Moolenaar res = true 22156d69bf60SBram Moolenaar endif 22166d69bf60SBram Moolenaar assert_equal(true, res) 22176d69bf60SBram Moolenaar 22186d69bf60SBram Moolenaar res = false 22196d69bf60SBram Moolenaar if g:bool_true || false 22206d69bf60SBram Moolenaar res = true 22216d69bf60SBram Moolenaar endif 22226d69bf60SBram Moolenaar assert_equal(true, res) 22236d69bf60SBram Moolenaar 22246d69bf60SBram Moolenaar res = false 22256d69bf60SBram Moolenaar if true || g:bool_false 22266d69bf60SBram Moolenaar res = true 22276d69bf60SBram Moolenaar endif 22286d69bf60SBram Moolenaar assert_equal(true, res) 22296d69bf60SBram Moolenaar 22306d69bf60SBram Moolenaar res = false 22316d69bf60SBram Moolenaar if false || false 22326d69bf60SBram Moolenaar res = true 22336d69bf60SBram Moolenaar endif 22346d69bf60SBram Moolenaar assert_equal(false, res) 22353988f64fSBram Moolenaar 22363988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 22373988f64fSBram Moolenaar if false | eval 0 | endif 22383988f64fSBram Moolenaar if false | eval burp + 234 | endif 22393988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22403988f64fSBram Moolenaar if false 22413988f64fSBram Moolenaar burp 22423988f64fSBram Moolenaar endif 224380c34ca3SBram Moolenaarenddef 22446d69bf60SBram Moolenaar 224580c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2246d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2247d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2248d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2249d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 22506d69bf60SBram Moolenaarenddef 22516d69bf60SBram Moolenaar 225272abcf42SBram Moolenaardef RunNested(i: number): number 2253cfcd011fSBram Moolenaar var x: number = 0 225472abcf42SBram Moolenaar if i % 2 225572abcf42SBram Moolenaar if 1 2256f5be8cdbSBram Moolenaar # comment 225772abcf42SBram Moolenaar else 2258f5be8cdbSBram Moolenaar # comment 225972abcf42SBram Moolenaar endif 226072abcf42SBram Moolenaar x += 1 226172abcf42SBram Moolenaar else 226272abcf42SBram Moolenaar x += 1000 226372abcf42SBram Moolenaar endif 226472abcf42SBram Moolenaar return x 226572abcf42SBram Moolenaarenddef 226672abcf42SBram Moolenaar 226772abcf42SBram Moolenaardef Test_nested_if() 226872abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 226972abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 227072abcf42SBram Moolenaarenddef 227172abcf42SBram Moolenaar 2272ad39c094SBram Moolenaardef Test_execute_cmd() 2273e4984290SBram Moolenaar # missing argument is ignored 2274e4984290SBram Moolenaar execute 2275e4984290SBram Moolenaar execute # comment 2276e4984290SBram Moolenaar 2277ad39c094SBram Moolenaar new 2278ad39c094SBram Moolenaar setline(1, 'default') 2279d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2280ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2281a72cfb80SBram Moolenaar 2282d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2283a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2284a72cfb80SBram Moolenaar 2285cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2286cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2287a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2288ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2289a72cfb80SBram Moolenaar 2290d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2291ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2292a72cfb80SBram Moolenaar 2293cfcd011fSBram Moolenaar var cmd_first = 'call ' 2294cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2295ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2296ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2297ad39c094SBram Moolenaar bwipe! 2298585fea7bSBram Moolenaar 2299cfcd011fSBram Moolenaar var n = true 23002d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23012d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23022d6b20d6SBram Moolenaar 2303e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2304e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2305e5abf7afSBram Moolenaar 2306d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2307d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2308d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2309ad39c094SBram Moolenaarenddef 2310ad39c094SBram Moolenaar 231147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2312f5be8cdbSBram Moolenaar # only checks line continuation 2313cfcd011fSBram Moolenaar var lines =<< trim END 231447e880d6SBram Moolenaar vim9script 231547e880d6SBram Moolenaar execute 'g:someVar' 231647e880d6SBram Moolenaar .. ' = ' .. 231747e880d6SBram Moolenaar '28' 231847e880d6SBram Moolenaar assert_equal(28, g:someVar) 231947e880d6SBram Moolenaar unlet g:someVar 232047e880d6SBram Moolenaar END 232147e880d6SBram Moolenaar CheckScriptSuccess(lines) 232247e880d6SBram Moolenaarenddef 232347e880d6SBram Moolenaar 2324ad39c094SBram Moolenaardef Test_echo_cmd() 2325a72cfb80SBram Moolenaar echo 'some' # comment 2326585fea7bSBram Moolenaar echon 'thing' 2327ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2328ad39c094SBram Moolenaar 2329a72cfb80SBram Moolenaar echo "some" # comment 2330a72cfb80SBram Moolenaar echon "thing" 2331a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2332a72cfb80SBram Moolenaar 2333cfcd011fSBram Moolenaar var str1 = 'some' 2334cfcd011fSBram Moolenaar var str2 = 'more' 2335ad39c094SBram Moolenaar echo str1 str2 2336ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2337a72cfb80SBram Moolenaar 2338d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2339ad39c094SBram Moolenaarenddef 2340ad39c094SBram Moolenaar 2341f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2342f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2343f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2344f93c7feaSBram Moolenaar echo 'clear' 2345df069eecSBram Moolenaar :1messages 2346f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2347f93c7feaSBram Moolenaar 2348d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2349f93c7feaSBram Moolenaarenddef 2350f93c7feaSBram Moolenaar 235147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2352f5be8cdbSBram Moolenaar # only checks line continuation 2353cfcd011fSBram Moolenaar var lines =<< trim END 235447e880d6SBram Moolenaar vim9script 235547e880d6SBram Moolenaar echomsg 'here' 235647e880d6SBram Moolenaar .. ' is ' .. 235747e880d6SBram Moolenaar 'a message' 235847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 235947e880d6SBram Moolenaar END 236047e880d6SBram Moolenaar CheckScriptSuccess(lines) 236147e880d6SBram Moolenaarenddef 236247e880d6SBram Moolenaar 2363f93c7feaSBram Moolenaardef Test_echoerr_cmd() 236440ee466cSBram Moolenaar try 236540ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 236640ee466cSBram Moolenaar catch 236740ee466cSBram Moolenaar assert_match('something wrong', v:exception) 236840ee466cSBram Moolenaar endtry 2369f93c7feaSBram Moolenaarenddef 2370f93c7feaSBram Moolenaar 237147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2372f5be8cdbSBram Moolenaar # only checks line continuation 2373cfcd011fSBram Moolenaar var lines =<< trim END 237447e880d6SBram Moolenaar vim9script 237547e880d6SBram Moolenaar try 237647e880d6SBram Moolenaar echoerr 'this' 237747e880d6SBram Moolenaar .. ' is ' .. 237847e880d6SBram Moolenaar 'wrong' 237947e880d6SBram Moolenaar catch 238047e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 238147e880d6SBram Moolenaar endtry 238247e880d6SBram Moolenaar END 238347e880d6SBram Moolenaar CheckScriptSuccess(lines) 238447e880d6SBram Moolenaarenddef 238547e880d6SBram Moolenaar 238641fe0617SBram Moolenaardef Test_for_outside_of_function() 2387cfcd011fSBram Moolenaar var lines =<< trim END 238841fe0617SBram Moolenaar vim9script 238941fe0617SBram Moolenaar new 239041fe0617SBram Moolenaar for var in range(0, 3) 239141fe0617SBram Moolenaar append(line('$'), var) 239241fe0617SBram Moolenaar endfor 239341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 239441fe0617SBram Moolenaar bwipe! 2395522eefd9SBram Moolenaar 2396522eefd9SBram Moolenaar var result = '' 2397522eefd9SBram Moolenaar for i in [1, 2, 3] 2398522eefd9SBram Moolenaar var loop = ' loop ' .. i 2399522eefd9SBram Moolenaar result ..= loop 2400522eefd9SBram Moolenaar endfor 2401522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 240241fe0617SBram Moolenaar END 240341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 240441fe0617SBram Moolenaar source Xvim9for.vim 240541fe0617SBram Moolenaar delete('Xvim9for.vim') 240641fe0617SBram Moolenaarenddef 24078a7d6542SBram Moolenaar 2408e8c4abbbSBram Moolenaardef Test_for_loop() 2409f2253963SBram Moolenaar var lines =<< trim END 2410cfcd011fSBram Moolenaar var result = '' 2411e8c4abbbSBram Moolenaar for cnt in range(7) 2412e8c4abbbSBram Moolenaar if cnt == 4 2413e8c4abbbSBram Moolenaar break 2414e8c4abbbSBram Moolenaar endif 2415e8c4abbbSBram Moolenaar if cnt == 2 2416e8c4abbbSBram Moolenaar continue 2417e8c4abbbSBram Moolenaar endif 2418e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2419e8c4abbbSBram Moolenaar endfor 2420e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24210ad3e894SBram Moolenaar 2422cfcd011fSBram Moolenaar var concat = '' 24230ad3e894SBram Moolenaar for str in eval('["one", "two"]') 24240ad3e894SBram Moolenaar concat ..= str 24250ad3e894SBram Moolenaar endfor 24260ad3e894SBram Moolenaar assert_equal('onetwo', concat) 242738bd8de5SBram Moolenaar 242838bd8de5SBram Moolenaar var total = 0 242938bd8de5SBram Moolenaar for nr in 243038bd8de5SBram Moolenaar [1, 2, 3] 243138bd8de5SBram Moolenaar total += nr 243238bd8de5SBram Moolenaar endfor 243338bd8de5SBram Moolenaar assert_equal(6, total) 243438bd8de5SBram Moolenaar 243538bd8de5SBram Moolenaar total = 0 243638bd8de5SBram Moolenaar for nr 243738bd8de5SBram Moolenaar in [1, 2, 3] 243838bd8de5SBram Moolenaar total += nr 243938bd8de5SBram Moolenaar endfor 244038bd8de5SBram Moolenaar assert_equal(6, total) 244138bd8de5SBram Moolenaar 244238bd8de5SBram Moolenaar total = 0 244338bd8de5SBram Moolenaar for nr 244438bd8de5SBram Moolenaar in 244538bd8de5SBram Moolenaar [1, 2, 3] 244638bd8de5SBram Moolenaar total += nr 244738bd8de5SBram Moolenaar endfor 244838bd8de5SBram Moolenaar assert_equal(6, total) 2449036d0714SBram Moolenaar 2450a3589a0dSBram Moolenaar # with type 2451a3589a0dSBram Moolenaar total = 0 2452a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2453a3589a0dSBram Moolenaar total += n 2454a3589a0dSBram Moolenaar endfor 2455a3589a0dSBram Moolenaar assert_equal(6, total) 2456a3589a0dSBram Moolenaar 2457fe090eb5SBram Moolenaar var chars = '' 2458fe090eb5SBram Moolenaar for s: string in 'foobar' 2459fe090eb5SBram Moolenaar chars ..= s 2460fe090eb5SBram Moolenaar endfor 2461fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2462fe090eb5SBram Moolenaar 2463a3589a0dSBram Moolenaar # unpack with type 2464f2253963SBram Moolenaar var res = '' 2465a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2466a3589a0dSBram Moolenaar res ..= n .. s 2467a3589a0dSBram Moolenaar endfor 2468a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2469a3589a0dSBram Moolenaar 2470444d8783SBram Moolenaar # unpack with one var 2471444d8783SBram Moolenaar var reslist = [] 2472444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2473444d8783SBram Moolenaar reslist->add(x) 2474444d8783SBram Moolenaar endfor 2475444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2476444d8783SBram Moolenaar 2477a3589a0dSBram Moolenaar # loop over string 2478a3589a0dSBram Moolenaar res = '' 247974e54fcbSBram Moolenaar for c in 'aéc̀d' 248074e54fcbSBram Moolenaar res ..= c .. '-' 248174e54fcbSBram Moolenaar endfor 248274e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 248374e54fcbSBram Moolenaar 248474e54fcbSBram Moolenaar res = '' 248574e54fcbSBram Moolenaar for c in '' 248674e54fcbSBram Moolenaar res ..= c .. '-' 248774e54fcbSBram Moolenaar endfor 248874e54fcbSBram Moolenaar assert_equal('', res) 248974e54fcbSBram Moolenaar 249074e54fcbSBram Moolenaar res = '' 249174e54fcbSBram Moolenaar for c in test_null_string() 249274e54fcbSBram Moolenaar res ..= c .. '-' 249374e54fcbSBram Moolenaar endfor 249474e54fcbSBram Moolenaar assert_equal('', res) 2495f2253963SBram Moolenaar 2496f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2497f2253963SBram Moolenaar {a: 'Cat'} 2498f2253963SBram Moolenaar ] 2499f2253963SBram Moolenaar for dd in foo 2500f2253963SBram Moolenaar dd.counter = 12 2501f2253963SBram Moolenaar endfor 2502f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2503f2253963SBram Moolenaar END 2504f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2505e8c4abbbSBram Moolenaarenddef 2506e8c4abbbSBram Moolenaar 2507e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2508025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2509025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2510025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2511675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2512675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2513cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2514822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 25152d870f8dSBram Moolenaar delfunc! g:Func 2516675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2517675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2518675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 251974e54fcbSBram Moolenaar 252074e54fcbSBram Moolenaar # wrong type detected at compile time 252174e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 252274e54fcbSBram Moolenaar 252374e54fcbSBram Moolenaar # wrong type detected at runtime 252474e54fcbSBram Moolenaar g:adict = {a: 1} 252574e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 252674e54fcbSBram Moolenaar unlet g:adict 2527f6a8d420SBram Moolenaar 2528f6a8d420SBram Moolenaar var lines =<< trim END 2529f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2530f6a8d420SBram Moolenaar for e in d 2531f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2532f6a8d420SBram Moolenaar endfor 2533f6a8d420SBram Moolenaar END 2534f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2535fe090eb5SBram Moolenaar 2536fe090eb5SBram Moolenaar lines =<< trim END 2537fe090eb5SBram Moolenaar for nr: number in ['foo'] 2538fe090eb5SBram Moolenaar endfor 2539fe090eb5SBram Moolenaar END 2540fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2541e8c4abbbSBram Moolenaarenddef 2542e8c4abbbSBram Moolenaar 2543ea87069dSBram Moolenaardef Test_for_loop_script_var() 2544ea87069dSBram Moolenaar # cannot use s:var in a :def function 2545ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2546ea87069dSBram Moolenaar 2547ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2548ea87069dSBram Moolenaar var lines =<< trim END 2549ea87069dSBram Moolenaar vim9script 2550ea87069dSBram Moolenaar var total = 0 2551ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2552ea87069dSBram Moolenaar total += s:var 2553ea87069dSBram Moolenaar endfor 2554ea87069dSBram Moolenaar assert_equal(6, total) 2555ea87069dSBram Moolenaar 2556ea87069dSBram Moolenaar total = 0 2557ea87069dSBram Moolenaar for var in [1, 2, 3] 2558ea87069dSBram Moolenaar total += var 2559ea87069dSBram Moolenaar endfor 2560ea87069dSBram Moolenaar assert_equal(6, total) 2561ea87069dSBram Moolenaar END 2562ea87069dSBram Moolenaarenddef 2563ea87069dSBram Moolenaar 2564792f786aSBram Moolenaardef Test_for_loop_unpack() 25654b8a0651SBram Moolenaar var lines =<< trim END 2566792f786aSBram Moolenaar var result = [] 2567792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2568792f786aSBram Moolenaar result->add(v1) 2569792f786aSBram Moolenaar result->add(v2) 2570792f786aSBram Moolenaar endfor 2571792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2572792f786aSBram Moolenaar 2573792f786aSBram Moolenaar result = [] 2574792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2575792f786aSBram Moolenaar result->add(v1) 2576792f786aSBram Moolenaar result->add(v2) 2577792f786aSBram Moolenaar result->add(v3) 2578792f786aSBram Moolenaar endfor 2579792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2580792f786aSBram Moolenaar 25814b8a0651SBram Moolenaar result = [] 25824b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 25834b8a0651SBram Moolenaar result->add(&ts) 25844b8a0651SBram Moolenaar result->add(&sw) 25854b8a0651SBram Moolenaar endfor 25864b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 25874b8a0651SBram Moolenaar 25884b8a0651SBram Moolenaar var slist: list<string> 25894b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 25904b8a0651SBram Moolenaar slist->add($LOOPVAR) 25914b8a0651SBram Moolenaar slist->add(@r) 25924b8a0651SBram Moolenaar slist->add(v:errmsg) 25934b8a0651SBram Moolenaar endfor 25944b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 25954b8a0651SBram Moolenaar 25964b8a0651SBram Moolenaar slist = [] 25974b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 25984b8a0651SBram Moolenaar slist->add(g:globalvar) 25994b8a0651SBram Moolenaar slist->add(b:bufvar) 26004b8a0651SBram Moolenaar slist->add(w:winvar) 26014b8a0651SBram Moolenaar slist->add(t:tabvar) 26024b8a0651SBram Moolenaar endfor 26034b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2604f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2605b777da9bSBram Moolenaar 2606b777da9bSBram Moolenaar var res = [] 2607b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2608b777da9bSBram Moolenaar res->add(n) 2609b777da9bSBram Moolenaar endfor 2610b777da9bSBram Moolenaar assert_equal([2, 5], res) 26114b8a0651SBram Moolenaar END 26124b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 26134b8a0651SBram Moolenaar 26144b8a0651SBram Moolenaar lines =<< trim END 2615792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2616792f786aSBram Moolenaar echo v1 v2 2617792f786aSBram Moolenaar endfor 2618792f786aSBram Moolenaar END 2619792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2620792f786aSBram Moolenaar 2621792f786aSBram Moolenaar lines =<< trim END 2622792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2623792f786aSBram Moolenaar echo v1 v2 2624792f786aSBram Moolenaar endfor 2625792f786aSBram Moolenaar END 2626792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2627792f786aSBram Moolenaar 2628792f786aSBram Moolenaar lines =<< trim END 2629792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2630792f786aSBram Moolenaar echo v1 2631792f786aSBram Moolenaar endfor 2632792f786aSBram Moolenaar END 2633792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2634792f786aSBram Moolenaarenddef 2635792f786aSBram Moolenaar 2636c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2637f2253963SBram Moolenaar var lines =<< trim END 2638c150c09eSBram Moolenaar var looped = 0 2639c150c09eSBram Moolenaar var cleanup = 0 2640c150c09eSBram Moolenaar for i in range(3) 2641c150c09eSBram Moolenaar looped += 1 2642c150c09eSBram Moolenaar try 2643c150c09eSBram Moolenaar eval [][0] 2644c150c09eSBram Moolenaar catch 2645c150c09eSBram Moolenaar continue 2646c150c09eSBram Moolenaar finally 2647c150c09eSBram Moolenaar cleanup += 1 2648c150c09eSBram Moolenaar endtry 2649c150c09eSBram Moolenaar endfor 2650c150c09eSBram Moolenaar assert_equal(3, looped) 2651c150c09eSBram Moolenaar assert_equal(3, cleanup) 2652f2253963SBram Moolenaar END 2653f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2654c150c09eSBram Moolenaarenddef 2655c150c09eSBram Moolenaar 2656d0df1aacSBram Moolenaardef Test_while_loop() 2657cfcd011fSBram Moolenaar var result = '' 2658cfcd011fSBram Moolenaar var cnt = 0 2659d0df1aacSBram Moolenaar while cnt < 555 2660d0df1aacSBram Moolenaar if cnt == 3 2661d0df1aacSBram Moolenaar break 2662d0df1aacSBram Moolenaar endif 2663d0df1aacSBram Moolenaar cnt += 1 2664d0df1aacSBram Moolenaar if cnt == 2 2665d0df1aacSBram Moolenaar continue 2666d0df1aacSBram Moolenaar endif 2667d0df1aacSBram Moolenaar result ..= cnt .. '_' 2668d0df1aacSBram Moolenaar endwhile 2669d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2670dee37dc7SBram Moolenaar 2671dee37dc7SBram Moolenaar var s = '' 26720123cc1eSBram Moolenaar while s == 'x' # {comment} 2673dee37dc7SBram Moolenaar endwhile 2674d0df1aacSBram Moolenaarenddef 2675d0df1aacSBram Moolenaar 2676e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2677675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2678675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2679675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2680675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2681675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2682675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2683675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 26846628b7ebSBram Moolenaar 26856628b7ebSBram Moolenaar var lines =<< trim END 26866628b7ebSBram Moolenaar var s = '' 26876628b7ebSBram Moolenaar while s = '' 26886628b7ebSBram Moolenaar endwhile 26896628b7ebSBram Moolenaar END 26906628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2691bd5da371SBram Moolenaarenddef 2692bd5da371SBram Moolenaar 26939645e2d9SBram Moolenaardef Test_interrupt_loop() 2694cfcd011fSBram Moolenaar var caught = false 2695cfcd011fSBram Moolenaar var x = 0 269697acfc78SBram Moolenaar try 26979645e2d9SBram Moolenaar while 1 26989645e2d9SBram Moolenaar x += 1 26999645e2d9SBram Moolenaar if x == 100 27009645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 27019645e2d9SBram Moolenaar endif 27029645e2d9SBram Moolenaar endwhile 270397acfc78SBram Moolenaar catch 270497acfc78SBram Moolenaar caught = true 270597acfc78SBram Moolenaar assert_equal(100, x) 270697acfc78SBram Moolenaar endtry 270797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 270825859dd7SBram Moolenaar # consume the CTRL-C 270925859dd7SBram Moolenaar getchar(0) 27109645e2d9SBram Moolenaarenddef 271120431c9dSBram Moolenaar 27124fdae999SBram Moolenaardef Test_automatic_line_continuation() 2713cfcd011fSBram Moolenaar var mylist = [ 27144fdae999SBram Moolenaar 'one', 27154fdae999SBram Moolenaar 'two', 27164fdae999SBram Moolenaar 'three', 2717f5be8cdbSBram Moolenaar ] # comment 27184fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 27194fdae999SBram Moolenaar 2720cfcd011fSBram Moolenaar var mydict = { 2721e0de171eSBram Moolenaar ['one']: 1, 2722e0de171eSBram Moolenaar ['two']: 2, 2723e0de171eSBram Moolenaar ['three']: 27244fdae999SBram Moolenaar 3, 2725f5be8cdbSBram Moolenaar } # comment 2726e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2727e0de171eSBram Moolenaar mydict = { 27282c330432SBram Moolenaar one: 1, # comment 27292c330432SBram Moolenaar two: # comment 27302c330432SBram Moolenaar 2, # comment 27312c330432SBram Moolenaar three: 3 # comment 27322c330432SBram Moolenaar } 2733e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2734e0de171eSBram Moolenaar mydict = { 27352c330432SBram Moolenaar one: 1, 27364fdae999SBram Moolenaar two: 27374fdae999SBram Moolenaar 2, 27382c330432SBram Moolenaar three: 3 27394fdae999SBram Moolenaar } 2740e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2741e6085c53SBram Moolenaar 2742e6085c53SBram Moolenaar assert_equal( 2743e6085c53SBram Moolenaar ['one', 'two', 'three'], 2744e6085c53SBram Moolenaar split('one two three') 2745e6085c53SBram Moolenaar ) 27464fdae999SBram Moolenaarenddef 27474fdae999SBram Moolenaar 27487a092245SBram Moolenaardef Test_vim9_comment() 27497a092245SBram Moolenaar CheckScriptSuccess([ 27507a092245SBram Moolenaar 'vim9script', 27517a092245SBram Moolenaar '# something', 275293f82cbeSBram Moolenaar '#something', 275393f82cbeSBram Moolenaar '#{something', 27547a092245SBram Moolenaar ]) 275593f82cbeSBram Moolenaar 275693f82cbeSBram Moolenaar split Xfile 275793f82cbeSBram Moolenaar CheckScriptSuccess([ 275893f82cbeSBram Moolenaar 'vim9script', 275993f82cbeSBram Moolenaar 'edit #something', 276093f82cbeSBram Moolenaar ]) 276193f82cbeSBram Moolenaar CheckScriptSuccess([ 276293f82cbeSBram Moolenaar 'vim9script', 276393f82cbeSBram Moolenaar 'edit #{something', 276493f82cbeSBram Moolenaar ]) 276593f82cbeSBram Moolenaar close 276693f82cbeSBram Moolenaar 27677a092245SBram Moolenaar CheckScriptFailure([ 27687a092245SBram Moolenaar 'vim9script', 27697a092245SBram Moolenaar ':# something', 27707a092245SBram Moolenaar ], 'E488:') 27717a092245SBram Moolenaar CheckScriptFailure([ 27727a092245SBram Moolenaar '# something', 27737a092245SBram Moolenaar ], 'E488:') 27747a092245SBram Moolenaar CheckScriptFailure([ 27757a092245SBram Moolenaar ':# something', 27767a092245SBram Moolenaar ], 'E488:') 27777a092245SBram Moolenaar 27784a8d9f2eSBram Moolenaar { # block start 27794a8d9f2eSBram Moolenaar } # block end 27804a8d9f2eSBram Moolenaar CheckDefFailure([ 27814a8d9f2eSBram Moolenaar '{# comment', 27824a8d9f2eSBram Moolenaar ], 'E488:') 27834a8d9f2eSBram Moolenaar CheckDefFailure([ 27844a8d9f2eSBram Moolenaar '{', 27854a8d9f2eSBram Moolenaar '}# comment', 27864a8d9f2eSBram Moolenaar ], 'E488:') 27874a8d9f2eSBram Moolenaar 27884a8d9f2eSBram Moolenaar echo "yes" # comment 27894a8d9f2eSBram Moolenaar CheckDefFailure([ 27904a8d9f2eSBram Moolenaar 'echo "yes"# comment', 27914a8d9f2eSBram Moolenaar ], 'E488:') 27927a092245SBram Moolenaar CheckScriptSuccess([ 27937a092245SBram Moolenaar 'vim9script', 27947a092245SBram Moolenaar 'echo "yes" # something', 27957a092245SBram Moolenaar ]) 27967a092245SBram Moolenaar CheckScriptFailure([ 27977a092245SBram Moolenaar 'vim9script', 27987a092245SBram Moolenaar 'echo "yes"# something', 27997a092245SBram Moolenaar ], 'E121:') 28007a092245SBram Moolenaar CheckScriptFailure([ 28017a092245SBram Moolenaar 'vim9script', 28027a092245SBram Moolenaar 'echo# something', 2803f8103f27SBram Moolenaar ], 'E1144:') 28047a092245SBram Moolenaar CheckScriptFailure([ 28057a092245SBram Moolenaar 'echo "yes" # something', 28067a092245SBram Moolenaar ], 'E121:') 28077a092245SBram Moolenaar 28084a8d9f2eSBram Moolenaar exe "echo" # comment 28094a8d9f2eSBram Moolenaar CheckDefFailure([ 28104a8d9f2eSBram Moolenaar 'exe "echo"# comment', 28114a8d9f2eSBram Moolenaar ], 'E488:') 28124a8d9f2eSBram Moolenaar CheckScriptSuccess([ 28134a8d9f2eSBram Moolenaar 'vim9script', 28144a8d9f2eSBram Moolenaar 'exe "echo" # something', 28154a8d9f2eSBram Moolenaar ]) 28164a8d9f2eSBram Moolenaar CheckScriptFailure([ 28174a8d9f2eSBram Moolenaar 'vim9script', 28184a8d9f2eSBram Moolenaar 'exe "echo"# something', 28194a8d9f2eSBram Moolenaar ], 'E121:') 28204a8d9f2eSBram Moolenaar CheckScriptFailure([ 28214a8d9f2eSBram Moolenaar 'vim9script', 28224a8d9f2eSBram Moolenaar 'exe# something', 2823f8103f27SBram Moolenaar ], 'E1144:') 28244a8d9f2eSBram Moolenaar CheckScriptFailure([ 28254a8d9f2eSBram Moolenaar 'exe "echo" # something', 28264a8d9f2eSBram Moolenaar ], 'E121:') 28274a8d9f2eSBram Moolenaar 28287a092245SBram Moolenaar CheckDefFailure([ 28297a092245SBram Moolenaar 'try# comment', 28307a092245SBram Moolenaar ' echo "yes"', 28317a092245SBram Moolenaar 'catch', 28327a092245SBram Moolenaar 'endtry', 2833f8103f27SBram Moolenaar ], 'E1144:') 28342c5ed4e3SBram Moolenaar CheckScriptFailure([ 28352c5ed4e3SBram Moolenaar 'vim9script', 28362c5ed4e3SBram Moolenaar 'try# comment', 28372c5ed4e3SBram Moolenaar 'echo "yes"', 2838f8103f27SBram Moolenaar ], 'E1144:') 28397a092245SBram Moolenaar CheckDefFailure([ 28407a092245SBram Moolenaar 'try', 2841a72cfb80SBram Moolenaar ' throw#comment', 2842a72cfb80SBram Moolenaar 'catch', 2843a72cfb80SBram Moolenaar 'endtry', 2844f8103f27SBram Moolenaar ], 'E1144:') 2845a72cfb80SBram Moolenaar CheckDefFailure([ 2846a72cfb80SBram Moolenaar 'try', 2847a72cfb80SBram Moolenaar ' throw "yes"#comment', 2848a72cfb80SBram Moolenaar 'catch', 2849a72cfb80SBram Moolenaar 'endtry', 2850a72cfb80SBram Moolenaar ], 'E488:') 2851a72cfb80SBram Moolenaar CheckDefFailure([ 2852a72cfb80SBram Moolenaar 'try', 28537a092245SBram Moolenaar ' echo "yes"', 28547a092245SBram Moolenaar 'catch# comment', 28557a092245SBram Moolenaar 'endtry', 2856f8103f27SBram Moolenaar ], 'E1144:') 28572c5ed4e3SBram Moolenaar CheckScriptFailure([ 28582c5ed4e3SBram Moolenaar 'vim9script', 28592c5ed4e3SBram Moolenaar 'try', 28602c5ed4e3SBram Moolenaar ' echo "yes"', 28612c5ed4e3SBram Moolenaar 'catch# comment', 28622c5ed4e3SBram Moolenaar 'endtry', 2863f8103f27SBram Moolenaar ], 'E1144:') 28642c5ed4e3SBram Moolenaar CheckDefFailure([ 28652c5ed4e3SBram Moolenaar 'try', 28662c5ed4e3SBram Moolenaar ' echo "yes"', 28672c5ed4e3SBram Moolenaar 'catch /pat/# comment', 28682c5ed4e3SBram Moolenaar 'endtry', 28692c5ed4e3SBram Moolenaar ], 'E488:') 28707a092245SBram Moolenaar CheckDefFailure([ 28717a092245SBram Moolenaar 'try', 28727a092245SBram Moolenaar 'echo "yes"', 28737a092245SBram Moolenaar 'catch', 28747a092245SBram Moolenaar 'endtry# comment', 2875f8103f27SBram Moolenaar ], 'E1144:') 28762c5ed4e3SBram Moolenaar CheckScriptFailure([ 28772c5ed4e3SBram Moolenaar 'vim9script', 28782c5ed4e3SBram Moolenaar 'try', 28792c5ed4e3SBram Moolenaar ' echo "yes"', 28802c5ed4e3SBram Moolenaar 'catch', 28812c5ed4e3SBram Moolenaar 'endtry# comment', 2882f8103f27SBram Moolenaar ], 'E1144:') 28832c5ed4e3SBram Moolenaar 28842c5ed4e3SBram Moolenaar CheckScriptSuccess([ 28852c5ed4e3SBram Moolenaar 'vim9script', 28862c5ed4e3SBram Moolenaar 'hi # comment', 28872c5ed4e3SBram Moolenaar ]) 28882c5ed4e3SBram Moolenaar CheckScriptFailure([ 28892c5ed4e3SBram Moolenaar 'vim9script', 28902c5ed4e3SBram Moolenaar 'hi# comment', 2891f8103f27SBram Moolenaar ], 'E1144:') 28921966c248SBram Moolenaar CheckScriptSuccess([ 28931966c248SBram Moolenaar 'vim9script', 28941966c248SBram Moolenaar 'hi Search # comment', 28951966c248SBram Moolenaar ]) 28961966c248SBram Moolenaar CheckScriptFailure([ 28971966c248SBram Moolenaar 'vim9script', 28981966c248SBram Moolenaar 'hi Search# comment', 28991966c248SBram Moolenaar ], 'E416:') 29001966c248SBram Moolenaar CheckScriptSuccess([ 29011966c248SBram Moolenaar 'vim9script', 29021966c248SBram Moolenaar 'hi link This Search # comment', 29031966c248SBram Moolenaar ]) 29041966c248SBram Moolenaar CheckScriptFailure([ 29051966c248SBram Moolenaar 'vim9script', 29061966c248SBram Moolenaar 'hi link This That# comment', 29071966c248SBram Moolenaar ], 'E413:') 29081966c248SBram Moolenaar CheckScriptSuccess([ 29091966c248SBram Moolenaar 'vim9script', 29101966c248SBram Moolenaar 'hi clear This # comment', 29111966c248SBram Moolenaar 'hi clear # comment', 29121966c248SBram Moolenaar ]) 2913f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2914f5be8cdbSBram Moolenaar # hi clear This# comment', 29151966c248SBram Moolenaar CheckScriptFailure([ 29161966c248SBram Moolenaar 'vim9script', 29171966c248SBram Moolenaar 'hi clear# comment', 29181966c248SBram Moolenaar ], 'E416:') 29191966c248SBram Moolenaar 29201966c248SBram Moolenaar CheckScriptSuccess([ 29211966c248SBram Moolenaar 'vim9script', 29221966c248SBram Moolenaar 'hi Group term=bold', 29231966c248SBram Moolenaar 'match Group /todo/ # comment', 29241966c248SBram Moolenaar ]) 29251966c248SBram Moolenaar CheckScriptFailure([ 29261966c248SBram Moolenaar 'vim9script', 29271966c248SBram Moolenaar 'hi Group term=bold', 29281966c248SBram Moolenaar 'match Group /todo/# comment', 29291966c248SBram Moolenaar ], 'E488:') 29301966c248SBram Moolenaar CheckScriptSuccess([ 29311966c248SBram Moolenaar 'vim9script', 29321966c248SBram Moolenaar 'match # comment', 29331966c248SBram Moolenaar ]) 29341966c248SBram Moolenaar CheckScriptFailure([ 29351966c248SBram Moolenaar 'vim9script', 29361966c248SBram Moolenaar 'match# comment', 2937f8103f27SBram Moolenaar ], 'E1144:') 29381966c248SBram Moolenaar CheckScriptSuccess([ 29391966c248SBram Moolenaar 'vim9script', 29401966c248SBram Moolenaar 'match none # comment', 29411966c248SBram Moolenaar ]) 29421966c248SBram Moolenaar CheckScriptFailure([ 29431966c248SBram Moolenaar 'vim9script', 29441966c248SBram Moolenaar 'match none# comment', 29451966c248SBram Moolenaar ], 'E475:') 29461966c248SBram Moolenaar 29471966c248SBram Moolenaar CheckScriptSuccess([ 29481966c248SBram Moolenaar 'vim9script', 29491966c248SBram Moolenaar 'menutrans clear # comment', 29501966c248SBram Moolenaar ]) 29511966c248SBram Moolenaar CheckScriptFailure([ 29521966c248SBram Moolenaar 'vim9script', 29531966c248SBram Moolenaar 'menutrans clear# comment text', 29541966c248SBram Moolenaar ], 'E474:') 29551966c248SBram Moolenaar 29561966c248SBram Moolenaar CheckScriptSuccess([ 29571966c248SBram Moolenaar 'vim9script', 29581966c248SBram Moolenaar 'syntax clear # comment', 29591966c248SBram Moolenaar ]) 29601966c248SBram Moolenaar CheckScriptFailure([ 29611966c248SBram Moolenaar 'vim9script', 29621966c248SBram Moolenaar 'syntax clear# comment text', 29631966c248SBram Moolenaar ], 'E28:') 29641966c248SBram Moolenaar CheckScriptSuccess([ 29651966c248SBram Moolenaar 'vim9script', 29661966c248SBram Moolenaar 'syntax keyword Word some', 29671966c248SBram Moolenaar 'syntax clear Word # comment', 29681966c248SBram Moolenaar ]) 29691966c248SBram Moolenaar CheckScriptFailure([ 29701966c248SBram Moolenaar 'vim9script', 29711966c248SBram Moolenaar 'syntax keyword Word some', 29721966c248SBram Moolenaar 'syntax clear Word# comment text', 29731966c248SBram Moolenaar ], 'E28:') 29741966c248SBram Moolenaar 29751966c248SBram Moolenaar CheckScriptSuccess([ 29761966c248SBram Moolenaar 'vim9script', 29771966c248SBram Moolenaar 'syntax list # comment', 29781966c248SBram Moolenaar ]) 29791966c248SBram Moolenaar CheckScriptFailure([ 29801966c248SBram Moolenaar 'vim9script', 29811966c248SBram Moolenaar 'syntax list# comment text', 29821966c248SBram Moolenaar ], 'E28:') 29831966c248SBram Moolenaar 29841966c248SBram Moolenaar CheckScriptSuccess([ 29851966c248SBram Moolenaar 'vim9script', 29861966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 29871966c248SBram Moolenaar ]) 29881966c248SBram Moolenaar CheckScriptFailure([ 29891966c248SBram Moolenaar 'vim9script', 29901966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 29911966c248SBram Moolenaar ], 'E475:') 29921966c248SBram Moolenaar 29931966c248SBram Moolenaar CheckScriptSuccess([ 29941966c248SBram Moolenaar 'vim9script', 29951966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 29961966c248SBram Moolenaar ]) 29971966c248SBram Moolenaar CheckScriptFailure([ 29981966c248SBram Moolenaar 'vim9script', 29991966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 30001966c248SBram Moolenaar ], 'E789:') 30011966c248SBram Moolenaar 30021966c248SBram Moolenaar CheckScriptSuccess([ 30031966c248SBram Moolenaar 'vim9script', 30041966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 30051966c248SBram Moolenaar ]) 30061966c248SBram Moolenaar CheckScriptFailure([ 30071966c248SBram Moolenaar 'vim9script', 30081966c248SBram Moolenaar 'syntax match Word /pat/# comment', 30091966c248SBram Moolenaar ], 'E402:') 30101966c248SBram Moolenaar 30111966c248SBram Moolenaar CheckScriptSuccess([ 30121966c248SBram Moolenaar 'vim9script', 30131966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 30141966c248SBram Moolenaar ]) 30151966c248SBram Moolenaar CheckScriptFailure([ 30161966c248SBram Moolenaar 'vim9script', 30171966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 30181966c248SBram Moolenaar ], 'E475:') 30191966c248SBram Moolenaar CheckScriptFailure([ 30201966c248SBram Moolenaar 'vim9script', 30211966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 30221966c248SBram Moolenaar ], 'E406:') 30231966c248SBram Moolenaar CheckScriptFailure([ 30241966c248SBram Moolenaar 'vim9script', 30251966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 30261966c248SBram Moolenaar ], 'E475:') 30271966c248SBram Moolenaar 30281966c248SBram Moolenaar CheckScriptSuccess([ 30291966c248SBram Moolenaar 'vim9script', 30301966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 30311966c248SBram Moolenaar ]) 30321966c248SBram Moolenaar CheckScriptFailure([ 30331966c248SBram Moolenaar 'vim9script', 30341966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3035d032f34aSBram Moolenaar ], 'E402:') 30361966c248SBram Moolenaar 30371966c248SBram Moolenaar CheckScriptSuccess([ 30381966c248SBram Moolenaar 'vim9script', 30391966c248SBram Moolenaar 'syntax sync # comment', 30401966c248SBram Moolenaar ]) 30411966c248SBram Moolenaar CheckScriptFailure([ 30421966c248SBram Moolenaar 'vim9script', 30431966c248SBram Moolenaar 'syntax sync# comment', 30441966c248SBram Moolenaar ], 'E404:') 30451966c248SBram Moolenaar CheckScriptSuccess([ 30461966c248SBram Moolenaar 'vim9script', 30471966c248SBram Moolenaar 'syntax sync ccomment # comment', 30481966c248SBram Moolenaar ]) 30491966c248SBram Moolenaar CheckScriptFailure([ 30501966c248SBram Moolenaar 'vim9script', 30511966c248SBram Moolenaar 'syntax sync ccomment# comment', 30521966c248SBram Moolenaar ], 'E404:') 30531966c248SBram Moolenaar 30541966c248SBram Moolenaar CheckScriptSuccess([ 30551966c248SBram Moolenaar 'vim9script', 30561966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 30571966c248SBram Moolenaar ]) 30581966c248SBram Moolenaar CheckScriptFailure([ 30591966c248SBram Moolenaar 'vim9script', 30601966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 30611966c248SBram Moolenaar ], 'E475:') 3062a72cfb80SBram Moolenaar 3063a72cfb80SBram Moolenaar CheckScriptSuccess([ 3064a72cfb80SBram Moolenaar 'vim9script', 3065a72cfb80SBram Moolenaar 'command Echo echo # comment', 3066a72cfb80SBram Moolenaar 'command Echo # comment', 30672d870f8dSBram Moolenaar 'delcommand Echo', 3068a72cfb80SBram Moolenaar ]) 3069a72cfb80SBram Moolenaar CheckScriptFailure([ 3070a72cfb80SBram Moolenaar 'vim9script', 3071a72cfb80SBram Moolenaar 'command Echo echo# comment', 3072a72cfb80SBram Moolenaar 'Echo', 3073f8103f27SBram Moolenaar ], 'E1144:') 30742d870f8dSBram Moolenaar delcommand Echo 307570249ee8SBram Moolenaar 307670249ee8SBram Moolenaar var curdir = getcwd() 307770249ee8SBram Moolenaar CheckScriptSuccess([ 307870249ee8SBram Moolenaar 'command Echo cd " comment', 307970249ee8SBram Moolenaar 'Echo', 308070249ee8SBram Moolenaar 'delcommand Echo', 308170249ee8SBram Moolenaar ]) 308270249ee8SBram Moolenaar CheckScriptSuccess([ 3083090728adSBram Moolenaar 'vim9script', 308470249ee8SBram Moolenaar 'command Echo cd # comment', 308570249ee8SBram Moolenaar 'Echo', 308670249ee8SBram Moolenaar 'delcommand Echo', 308770249ee8SBram Moolenaar ]) 308870249ee8SBram Moolenaar CheckScriptFailure([ 308970249ee8SBram Moolenaar 'vim9script', 309070249ee8SBram Moolenaar 'command Echo cd " comment', 309170249ee8SBram Moolenaar 'Echo', 309270249ee8SBram Moolenaar ], 'E344:') 309370249ee8SBram Moolenaar delcommand Echo 309470249ee8SBram Moolenaar chdir(curdir) 309570249ee8SBram Moolenaar 3096a72cfb80SBram Moolenaar CheckScriptFailure([ 3097a72cfb80SBram Moolenaar 'vim9script', 3098a72cfb80SBram Moolenaar 'command Echo# comment', 3099a72cfb80SBram Moolenaar ], 'E182:') 3100a72cfb80SBram Moolenaar CheckScriptFailure([ 3101a72cfb80SBram Moolenaar 'vim9script', 3102a72cfb80SBram Moolenaar 'command Echo echo', 3103a72cfb80SBram Moolenaar 'command Echo# comment', 3104a72cfb80SBram Moolenaar ], 'E182:') 31052d870f8dSBram Moolenaar delcommand Echo 3106a72cfb80SBram Moolenaar 3107a72cfb80SBram Moolenaar CheckScriptSuccess([ 3108a72cfb80SBram Moolenaar 'vim9script', 3109a72cfb80SBram Moolenaar 'function # comment', 3110a72cfb80SBram Moolenaar ]) 3111a72cfb80SBram Moolenaar CheckScriptFailure([ 3112a72cfb80SBram Moolenaar 'vim9script', 31139898107fSBram Moolenaar 'function " comment', 31149898107fSBram Moolenaar ], 'E129:') 31159898107fSBram Moolenaar CheckScriptFailure([ 31169898107fSBram Moolenaar 'vim9script', 3117a72cfb80SBram Moolenaar 'function# comment', 3118f8103f27SBram Moolenaar ], 'E1144:') 3119a72cfb80SBram Moolenaar CheckScriptSuccess([ 3120a72cfb80SBram Moolenaar 'vim9script', 3121a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3122a72cfb80SBram Moolenaar ]) 3123a72cfb80SBram Moolenaar CheckScriptFailure([ 3124a72cfb80SBram Moolenaar 'vim9script', 3125a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3126a72cfb80SBram Moolenaar ], 'E488:') 3127a72cfb80SBram Moolenaar 3128a72cfb80SBram Moolenaar CheckScriptSuccess([ 3129a72cfb80SBram Moolenaar 'vim9script', 31304c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3131a72cfb80SBram Moolenaar 'endfunc', 31324c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3133a72cfb80SBram Moolenaar ]) 3134a72cfb80SBram Moolenaar CheckScriptFailure([ 3135a72cfb80SBram Moolenaar 'vim9script', 31364c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3137a72cfb80SBram Moolenaar 'endfunc', 31384c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3139a72cfb80SBram Moolenaar ], 'E488:') 3140a72cfb80SBram Moolenaar 3141a72cfb80SBram Moolenaar CheckScriptSuccess([ 3142a72cfb80SBram Moolenaar 'vim9script', 3143a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3144a72cfb80SBram Moolenaar ]) 3145a72cfb80SBram Moolenaar CheckScriptFailure([ 3146a72cfb80SBram Moolenaar 'vim9script', 3147a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3148a72cfb80SBram Moolenaar ], 'E488:') 3149e7e4838fSBram Moolenaar 3150e7e4838fSBram Moolenaar CheckScriptFailure([ 3151e7e4838fSBram Moolenaar 'def Test() " comment', 3152e7e4838fSBram Moolenaar 'enddef', 3153e7e4838fSBram Moolenaar ], 'E488:') 3154e7e4838fSBram Moolenaar CheckScriptFailure([ 3155e7e4838fSBram Moolenaar 'vim9script', 3156e7e4838fSBram Moolenaar 'def Test() " comment', 3157e7e4838fSBram Moolenaar 'enddef', 3158e7e4838fSBram Moolenaar ], 'E488:') 3159e7e4838fSBram Moolenaar 3160e7e4838fSBram Moolenaar CheckScriptSuccess([ 3161e7e4838fSBram Moolenaar 'func Test() " comment', 3162e7e4838fSBram Moolenaar 'endfunc', 31632d870f8dSBram Moolenaar 'delfunc Test', 3164e7e4838fSBram Moolenaar ]) 31659898107fSBram Moolenaar CheckScriptSuccess([ 3166e7e4838fSBram Moolenaar 'vim9script', 3167e7e4838fSBram Moolenaar 'func Test() " comment', 3168e7e4838fSBram Moolenaar 'endfunc', 31699898107fSBram Moolenaar ]) 3170e7e4838fSBram Moolenaar 3171e7e4838fSBram Moolenaar CheckScriptSuccess([ 3172e7e4838fSBram Moolenaar 'def Test() # comment', 3173e7e4838fSBram Moolenaar 'enddef', 3174e7e4838fSBram Moolenaar ]) 3175e7e4838fSBram Moolenaar CheckScriptFailure([ 3176e7e4838fSBram Moolenaar 'func Test() # comment', 3177e7e4838fSBram Moolenaar 'endfunc', 3178e7e4838fSBram Moolenaar ], 'E488:') 31790f37e356SBram Moolenaar 31800f37e356SBram Moolenaar var lines =<< trim END 31810f37e356SBram Moolenaar vim9script 31820f37e356SBram Moolenaar syn region Text 31830f37e356SBram Moolenaar \ start='foo' 31840f37e356SBram Moolenaar #\ comment 31850f37e356SBram Moolenaar \ end='bar' 31865072b47aSBram Moolenaar syn region Text start='foo' 31875072b47aSBram Moolenaar #\ comment 31885072b47aSBram Moolenaar \ end='bar' 31890f37e356SBram Moolenaar END 31900f37e356SBram Moolenaar CheckScriptSuccess(lines) 31910f37e356SBram Moolenaar 31920f37e356SBram Moolenaar lines =<< trim END 31930f37e356SBram Moolenaar vim9script 31940f37e356SBram Moolenaar syn region Text 31950f37e356SBram Moolenaar \ start='foo' 31960f37e356SBram Moolenaar "\ comment 31970f37e356SBram Moolenaar \ end='bar' 31980f37e356SBram Moolenaar END 31990f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 32002c5ed4e3SBram Moolenaarenddef 32012c5ed4e3SBram Moolenaar 32022c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 32032c5ed4e3SBram Moolenaar CheckCanRunGui 32042c5ed4e3SBram Moolenaar 32052c5ed4e3SBram Moolenaar CheckScriptFailure([ 32062c5ed4e3SBram Moolenaar 'vim9script', 32072c5ed4e3SBram Moolenaar 'gui#comment' 3208f8103f27SBram Moolenaar ], 'E1144:') 32092c5ed4e3SBram Moolenaar CheckScriptFailure([ 32102c5ed4e3SBram Moolenaar 'vim9script', 32112c5ed4e3SBram Moolenaar 'gui -f#comment' 32122c5ed4e3SBram Moolenaar ], 'E499:') 32137a092245SBram Moolenaarenddef 32147a092245SBram Moolenaar 3215a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 32166797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 32176797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3218a26b9700SBram Moolenaar 3219a26b9700SBram Moolenaar edit test.vim 3220a26b9700SBram Moolenaar doautocmd TabEnter #comment 3221a26b9700SBram Moolenaar assert_equal(1, g:entered) 3222a26b9700SBram Moolenaar 3223a26b9700SBram Moolenaar doautocmd TabEnter f.x 3224a26b9700SBram Moolenaar assert_equal(2, g:entered) 3225a26b9700SBram Moolenaar 3226a26b9700SBram Moolenaar g:entered = 0 3227a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3228a26b9700SBram Moolenaar assert_equal(2, g:entered) 3229a26b9700SBram Moolenaar 3230a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3231a26b9700SBram Moolenaar 3232a26b9700SBram Moolenaar au! TabEnter 3233a26b9700SBram Moolenaar unlet g:entered 3234d72c1bf0SBram Moolenaar 3235d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3236d72c1bf0SBram Moolenaar 'vim9script', 32376797966dSBram Moolenaar 'g:var = 123', 3238e55b1c09SBram Moolenaar 'b:var = 456', 3239e55b1c09SBram Moolenaar 'w:var = 777', 3240e55b1c09SBram Moolenaar 't:var = 888', 3241d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3242d72c1bf0SBram Moolenaar ]) 3243d72c1bf0SBram Moolenaar 3244d72c1bf0SBram Moolenaar CheckScriptFailure([ 3245d72c1bf0SBram Moolenaar 'vim9script', 3246cfcd011fSBram Moolenaar 'let var = 123', 3247cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3248cfcd011fSBram Moolenaar 3249cfcd011fSBram Moolenaar CheckScriptFailure([ 3250cfcd011fSBram Moolenaar 'vim9script', 3251cfcd011fSBram Moolenaar 'var g:var = 123', 3252e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3253e55b1c09SBram Moolenaar 3254e55b1c09SBram Moolenaar CheckScriptFailure([ 3255e55b1c09SBram Moolenaar 'vim9script', 3256cfcd011fSBram Moolenaar 'var b:var = 123', 3257e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3258e55b1c09SBram Moolenaar 3259e55b1c09SBram Moolenaar CheckScriptFailure([ 3260e55b1c09SBram Moolenaar 'vim9script', 3261cfcd011fSBram Moolenaar 'var w:var = 123', 3262e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3263e55b1c09SBram Moolenaar 3264e55b1c09SBram Moolenaar CheckScriptFailure([ 3265e55b1c09SBram Moolenaar 'vim9script', 3266cfcd011fSBram Moolenaar 'var t:var = 123', 3267e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3268e55b1c09SBram Moolenaar 3269e55b1c09SBram Moolenaar CheckScriptFailure([ 3270e55b1c09SBram Moolenaar 'vim9script', 3271cfcd011fSBram Moolenaar 'var v:version = 123', 3272e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3273e55b1c09SBram Moolenaar 3274e55b1c09SBram Moolenaar CheckScriptFailure([ 3275e55b1c09SBram Moolenaar 'vim9script', 3276cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3277e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 32786797966dSBram Moolenaar 32796797966dSBram Moolenaar CheckScriptFailure([ 32806797966dSBram Moolenaar 'vim9script', 32816797966dSBram Moolenaar 'g:var = 123', 328232e35117SBram Moolenaar 'unlet g:var# comment1', 3283d72c1bf0SBram Moolenaar ], 'E108:') 3284d72c1bf0SBram Moolenaar 3285d72c1bf0SBram Moolenaar CheckScriptFailure([ 3286d72c1bf0SBram Moolenaar 'let g:var = 123', 3287d72c1bf0SBram Moolenaar 'unlet g:var # something', 3288d72c1bf0SBram Moolenaar ], 'E488:') 3289faac4104SBram Moolenaar 3290faac4104SBram Moolenaar CheckScriptSuccess([ 3291faac4104SBram Moolenaar 'vim9script', 329232e35117SBram Moolenaar 'if 1 # comment2', 3293faac4104SBram Moolenaar ' echo "yes"', 3294faac4104SBram Moolenaar 'elseif 2 #comment', 3295faac4104SBram Moolenaar ' echo "no"', 3296faac4104SBram Moolenaar 'endif', 3297faac4104SBram Moolenaar ]) 3298faac4104SBram Moolenaar 3299faac4104SBram Moolenaar CheckScriptFailure([ 3300faac4104SBram Moolenaar 'vim9script', 330132e35117SBram Moolenaar 'if 1# comment3', 3302faac4104SBram Moolenaar ' echo "yes"', 3303faac4104SBram Moolenaar 'endif', 3304fae55a9cSBram Moolenaar ], 'E488:') 3305faac4104SBram Moolenaar 3306faac4104SBram Moolenaar CheckScriptFailure([ 3307faac4104SBram Moolenaar 'vim9script', 330832e35117SBram Moolenaar 'if 0 # comment4', 3309faac4104SBram Moolenaar ' echo "yes"', 3310faac4104SBram Moolenaar 'elseif 2#comment', 3311faac4104SBram Moolenaar ' echo "no"', 3312faac4104SBram Moolenaar 'endif', 3313fae55a9cSBram Moolenaar ], 'E488:') 3314faac4104SBram Moolenaar 3315faac4104SBram Moolenaar CheckScriptSuccess([ 3316faac4104SBram Moolenaar 'vim9script', 3317cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3318faac4104SBram Moolenaar ]) 3319faac4104SBram Moolenaar 3320faac4104SBram Moolenaar CheckScriptFailure([ 3321faac4104SBram Moolenaar 'vim9script', 3322cfcd011fSBram Moolenaar 'var v = 1# comment6', 3323fae55a9cSBram Moolenaar ], 'E488:') 3324faac4104SBram Moolenaar 3325faac4104SBram Moolenaar CheckScriptSuccess([ 3326faac4104SBram Moolenaar 'vim9script', 3327faac4104SBram Moolenaar 'new' 3328d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3329df069eecSBram Moolenaar ':$', 3330faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3331faac4104SBram Moolenaar 'bwipe!', 3332faac4104SBram Moolenaar ]) 3333faac4104SBram Moolenaar 3334f5be8cdbSBram Moolenaar CheckScriptFailure([ 3335f5be8cdbSBram Moolenaar 'vim9script', 3336f5be8cdbSBram Moolenaar 'new' 3337d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3338f5be8cdbSBram Moolenaar ':$', 3339f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3340f5be8cdbSBram Moolenaar 'bwipe!', 3341f5be8cdbSBram Moolenaar ], 'E488:') 3342f5be8cdbSBram Moolenaar 3343f5be8cdbSBram Moolenaar CheckScriptFailure([ 3344f5be8cdbSBram Moolenaar 'vim9script', 3345f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3346f5be8cdbSBram Moolenaar ], 'E477:') 3347a26b9700SBram Moolenaarenddef 3348a26b9700SBram Moolenaar 33497e5bd91dSBram Moolenaardef Test_finish() 3350cfcd011fSBram Moolenaar var lines =<< trim END 33517e5bd91dSBram Moolenaar vim9script 33526797966dSBram Moolenaar g:res = 'one' 33537e5bd91dSBram Moolenaar if v:false | finish | endif 33546797966dSBram Moolenaar g:res = 'two' 33557e5bd91dSBram Moolenaar finish 33566797966dSBram Moolenaar g:res = 'three' 33577e5bd91dSBram Moolenaar END 33587e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 33597e5bd91dSBram Moolenaar source Xfinished 33607e5bd91dSBram Moolenaar assert_equal('two', g:res) 33617e5bd91dSBram Moolenaar 33627e5bd91dSBram Moolenaar unlet g:res 33637e5bd91dSBram Moolenaar delete('Xfinished') 33647e5bd91dSBram Moolenaarenddef 33657e5bd91dSBram Moolenaar 3366a5d0077eSBram Moolenaardef Test_forward_declaration() 3367cfcd011fSBram Moolenaar var lines =<< trim END 3368a5d0077eSBram Moolenaar vim9script 3369a5d0077eSBram Moolenaar def GetValue(): string 3370a5d0077eSBram Moolenaar return theVal 3371a5d0077eSBram Moolenaar enddef 3372cfcd011fSBram Moolenaar var theVal = 'something' 3373822ba247SBram Moolenaar g:initVal = GetValue() 3374a5d0077eSBram Moolenaar theVal = 'else' 3375a5d0077eSBram Moolenaar g:laterVal = GetValue() 3376a5d0077eSBram Moolenaar END 3377a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3378a5d0077eSBram Moolenaar source Xforward 3379a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3380a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3381a5d0077eSBram Moolenaar 3382a5d0077eSBram Moolenaar unlet g:initVal 3383a5d0077eSBram Moolenaar unlet g:laterVal 3384a5d0077eSBram Moolenaar delete('Xforward') 3385a5d0077eSBram Moolenaarenddef 3386a5d0077eSBram Moolenaar 33879721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3388a6294955SBram Moolenaar var vim9_lines =<< trim END 3389a6294955SBram Moolenaar vim9script 3390a6294955SBram Moolenaar var local = 'local' 3391a6294955SBram Moolenaar g:global = 'global' 3392a6294955SBram Moolenaar export var exported = 'exported' 3393a6294955SBram Moolenaar export def GetText(): string 3394a6294955SBram Moolenaar return 'text' 3395a6294955SBram Moolenaar enddef 3396a6294955SBram Moolenaar END 3397a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3398a6294955SBram Moolenaar 3399cfcd011fSBram Moolenaar var legacy_lines =<< trim END 34009721fb4eSBram Moolenaar source Xvim9_script.vim 34019721fb4eSBram Moolenaar 34029721fb4eSBram Moolenaar call assert_false(exists('local')) 34039721fb4eSBram Moolenaar call assert_false(exists('exported')) 34049721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 34059721fb4eSBram Moolenaar call assert_equal('global', global) 34069721fb4eSBram Moolenaar call assert_equal('global', g:global) 34079721fb4eSBram Moolenaar 34089721fb4eSBram Moolenaar " imported variable becomes script-local 34099721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 34109721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 34119721fb4eSBram Moolenaar call assert_false(exists('exported')) 34129721fb4eSBram Moolenaar 34139721fb4eSBram Moolenaar " imported function becomes script-local 34149721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 34159721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 34169721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 34179721fb4eSBram Moolenaar END 34189721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 34199721fb4eSBram Moolenaar 34209721fb4eSBram Moolenaar source Xlegacy_script.vim 34219721fb4eSBram Moolenaar assert_equal('global', g:global) 3422f5be8cdbSBram Moolenaar unlet g:global 34239721fb4eSBram Moolenaar 34249721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 34259721fb4eSBram Moolenaar delete('Xvim9_script.vim') 34269721fb4eSBram Moolenaarenddef 3427a5d0077eSBram Moolenaar 3428e535db86SBram Moolenaardef Test_declare_script_in_func() 3429e535db86SBram Moolenaar var lines =<< trim END 3430e535db86SBram Moolenaar vim9script 3431e535db86SBram Moolenaar func Declare() 3432e535db86SBram Moolenaar let s:local = 123 3433e535db86SBram Moolenaar endfunc 3434e535db86SBram Moolenaar Declare() 3435e535db86SBram Moolenaar assert_equal(123, local) 3436e535db86SBram Moolenaar 3437e535db86SBram Moolenaar var error: string 3438e535db86SBram Moolenaar try 3439e535db86SBram Moolenaar local = 'asdf' 3440e535db86SBram Moolenaar catch 3441e535db86SBram Moolenaar error = v:exception 3442e535db86SBram Moolenaar endtry 3443e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3444e535db86SBram Moolenaar 3445e535db86SBram Moolenaar lockvar local 3446e535db86SBram Moolenaar try 3447e535db86SBram Moolenaar local = 999 3448e535db86SBram Moolenaar catch 3449e535db86SBram Moolenaar error = v:exception 3450e535db86SBram Moolenaar endtry 3451e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3452e535db86SBram Moolenaar END 3453e535db86SBram Moolenaar CheckScriptSuccess(lines) 3454e535db86SBram Moolenaarenddef 3455e535db86SBram Moolenaar 3456e535db86SBram Moolenaar 34577d699701SBram Moolenaarfunc Test_vim9script_not_global() 34587d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 34597d699701SBram Moolenaar let vim9lines =<< trim END 34607d699701SBram Moolenaar vim9script 3461cfcd011fSBram Moolenaar var name = 'local' 34627d699701SBram Moolenaar func TheFunc() 34637d699701SBram Moolenaar echo 'local' 34647d699701SBram Moolenaar endfunc 34657d699701SBram Moolenaar def DefFunc() 34667d699701SBram Moolenaar echo 'local' 34677d699701SBram Moolenaar enddef 34687d699701SBram Moolenaar END 34697d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 34707d699701SBram Moolenaar source Xvim9script.vim 34717d699701SBram Moolenaar try 34727d699701SBram Moolenaar echo g:var 34737d699701SBram Moolenaar assert_report('did not fail') 34747d699701SBram Moolenaar catch /E121:/ 34757d699701SBram Moolenaar " caught 34767d699701SBram Moolenaar endtry 34777d699701SBram Moolenaar try 34787d699701SBram Moolenaar call TheFunc() 34797d699701SBram Moolenaar assert_report('did not fail') 34807d699701SBram Moolenaar catch /E117:/ 34817d699701SBram Moolenaar " caught 34827d699701SBram Moolenaar endtry 34837d699701SBram Moolenaar try 34847d699701SBram Moolenaar call DefFunc() 34857d699701SBram Moolenaar assert_report('did not fail') 34867d699701SBram Moolenaar catch /E117:/ 34877d699701SBram Moolenaar " caught 34887d699701SBram Moolenaar endtry 34897d699701SBram Moolenaar 349025859dd7SBram Moolenaar call delete('Xvim9script.vim') 34917d699701SBram Moolenaarendfunc 34927d699701SBram Moolenaar 3493eeb27bfeSBram Moolenaardef Test_vim9_copen() 3494eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3495eeb27bfeSBram Moolenaar copen 3496eeb27bfeSBram Moolenaar quit 3497eeb27bfeSBram Moolenaarenddef 3498eeb27bfeSBram Moolenaar 349903290b84SBram Moolenaar" test using an auto-loaded function and variable 35002d6b20d6SBram Moolenaardef Test_vim9_autoload() 3501cfcd011fSBram Moolenaar var lines =<< trim END 35022d6b20d6SBram Moolenaar vim9script 350303290b84SBram Moolenaar def some#gettest(): string 350403290b84SBram Moolenaar return 'test' 350503290b84SBram Moolenaar enddef 350603290b84SBram Moolenaar g:some#name = 'name' 3507227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3508e3ffcd99SBram Moolenaar 3509e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3510e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3511e3ffcd99SBram Moolenaar enddef 351203290b84SBram Moolenaar END 351303290b84SBram Moolenaar 351403290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 351503290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 351603290b84SBram Moolenaar var save_rtp = &rtp 351703290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 351803290b84SBram Moolenaar 351903290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 352003290b84SBram Moolenaar assert_equal('name', g:some#name) 3521227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 352203290b84SBram Moolenaar g:some#other = 'other' 352303290b84SBram Moolenaar assert_equal('other', g:some#other) 352403290b84SBram Moolenaar 3525e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3526e3ffcd99SBram Moolenaar 352717f700acSBram Moolenaar # upper case script name works 352817f700acSBram Moolenaar lines =<< trim END 352917f700acSBram Moolenaar vim9script 353017f700acSBram Moolenaar def Other#getOther(): string 353117f700acSBram Moolenaar return 'other' 353217f700acSBram Moolenaar enddef 353317f700acSBram Moolenaar END 353417f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 353517f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 353617f700acSBram Moolenaar 353703290b84SBram Moolenaar delete('Xdir', 'rf') 353803290b84SBram Moolenaar &rtp = save_rtp 353903290b84SBram Moolenaarenddef 354003290b84SBram Moolenaar 354103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 354203290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 354303290b84SBram Moolenaar var lines =<< trim END 354403290b84SBram Moolenaar vim9script 35452d6b20d6SBram Moolenaar def foo#test() 35462d6b20d6SBram Moolenaar echomsg getreg('"') 35472d6b20d6SBram Moolenaar enddef 35482d6b20d6SBram Moolenaar END 35492d6b20d6SBram Moolenaar 35502d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 35512d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3552cfcd011fSBram Moolenaar var save_rtp = &rtp 35532d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 35542d6b20d6SBram Moolenaar augroup test 35552d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 35562d6b20d6SBram Moolenaar augroup END 35572d6b20d6SBram Moolenaar 35582d6b20d6SBram Moolenaar normal Y 35592d6b20d6SBram Moolenaar 35602d6b20d6SBram Moolenaar augroup test 35612d6b20d6SBram Moolenaar autocmd! 35622d6b20d6SBram Moolenaar augroup END 35632d6b20d6SBram Moolenaar delete('Xdir', 'rf') 35642d6b20d6SBram Moolenaar &rtp = save_rtp 35652d6b20d6SBram Moolenaarenddef 35662d6b20d6SBram Moolenaar 356777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 356877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3569cfcd011fSBram Moolenaar var lines =<< trim END 357077e5dcc3SBram Moolenaar vim9script 357177e5dcc3SBram Moolenaar def crash#func() 357277e5dcc3SBram Moolenaar try 357377e5dcc3SBram Moolenaar for x in List() 357477e5dcc3SBram Moolenaar endfor 357577e5dcc3SBram Moolenaar catch 357677e5dcc3SBram Moolenaar endtry 357777e5dcc3SBram Moolenaar g:ok = true 357877e5dcc3SBram Moolenaar enddef 357977e5dcc3SBram Moolenaar fu List() 358077e5dcc3SBram Moolenaar invalid 358177e5dcc3SBram Moolenaar endfu 358277e5dcc3SBram Moolenaar try 358348e11c10SBram Moolenaar alsoinvalid 358477e5dcc3SBram Moolenaar catch /wontmatch/ 358577e5dcc3SBram Moolenaar endtry 358677e5dcc3SBram Moolenaar END 358777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 358877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 358977e5dcc3SBram Moolenaar 359077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 359177e5dcc3SBram Moolenaar lines =<< trim END 359277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 359377e5dcc3SBram Moolenaar call crash#func() 359477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 35959c4f5520SBram Moolenaar qall! 359677e5dcc3SBram Moolenaar END 359777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 359877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 359977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 360077e5dcc3SBram Moolenaar 360177e5dcc3SBram Moolenaar delete('Xdidit') 360277e5dcc3SBram Moolenaar delete('Xscript') 360377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 360403290b84SBram Moolenaar 360503290b84SBram Moolenaar lines =<< trim END 360603290b84SBram Moolenaar vim9script 360703290b84SBram Moolenaar var foo#bar = 'asdf' 360803290b84SBram Moolenaar END 360903290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 361077e5dcc3SBram Moolenaarenddef 361177e5dcc3SBram Moolenaar 361281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 361381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 361481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3615cfcd011fSBram Moolenaar var lines =<< trim END 361681e17fbeSBram Moolenaar let s:counter = 1 361781e17fbeSBram Moolenaar def s:Func() 361881e17fbeSBram Moolenaar au! CursorHold 361981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 362081e17fbeSBram Moolenaar enddef 362181e17fbeSBram Moolenaar call s:Func() 362281e17fbeSBram Moolenaar doau CursorHold 362381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 362481e17fbeSBram Moolenaar au! CursorHold 362581e17fbeSBram Moolenaar END 362681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 362781e17fbeSBram Moolenaarenddef 362881e17fbeSBram Moolenaar 36293896a105SBram Moolenaardef Test_cmdline_win() 36303896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 36313896a105SBram Moolenaar # the command line window. 36323896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3633cfcd011fSBram Moolenaar var export_lines =<< trim END 36343896a105SBram Moolenaar vim9script 3635cfcd011fSBram Moolenaar export var That = 'yes' 36363896a105SBram Moolenaar END 36373896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3638cfcd011fSBram Moolenaar var import_lines =<< trim END 36393896a105SBram Moolenaar vim9script 36403896a105SBram Moolenaar import That from './Xexport.vim' 36413896a105SBram Moolenaar END 36423896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3643cfcd011fSBram Moolenaar var save_rtp = &rtp 36443896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 36453896a105SBram Moolenaar syntax on 36463896a105SBram Moolenaar augroup CmdWin 36473896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 36483896a105SBram Moolenaar augroup END 36493896a105SBram Moolenaar # this will open and also close the cmdline window 36503896a105SBram Moolenaar feedkeys('q:', 'xt') 36513896a105SBram Moolenaar assert_equal('yes', g:got_there) 36523896a105SBram Moolenaar 36533896a105SBram Moolenaar augroup CmdWin 36543896a105SBram Moolenaar au! 36553896a105SBram Moolenaar augroup END 36563896a105SBram Moolenaar &rtp = save_rtp 36573896a105SBram Moolenaar delete('rtp', 'rf') 36583896a105SBram Moolenaarenddef 36593896a105SBram Moolenaar 3660e3d4685fSBram Moolenaardef Test_invalid_sid() 3661e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 366225859dd7SBram Moolenaar 36639c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3664d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3665e3d4685fSBram Moolenaar endif 3666e3d4685fSBram Moolenaar delete('Xdidit') 3667e3d4685fSBram Moolenaarenddef 3668e3d4685fSBram Moolenaar 36699ec7026fSBram Moolenaardef Test_restoring_cpo() 36709ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 36719ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 36729ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 36739ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 36749ec7026fSBram Moolenaar endif 36759ec7026fSBram Moolenaar delete('Xsourced') 36769ec7026fSBram Moolenaar delete('Xclose') 3677090728adSBram Moolenaar delete('Xdone') 36780123cc1eSBram Moolenaar 36790123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 36800123cc1eSBram Moolenaar set cpo=aABceFsMny> 36810123cc1eSBram Moolenaar edit XanotherScript 36820123cc1eSBram Moolenaar so % 36830123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36840123cc1eSBram Moolenaar :1del 36850123cc1eSBram Moolenaar w 36860123cc1eSBram Moolenaar so % 36870123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36880123cc1eSBram Moolenaar 36890123cc1eSBram Moolenaar delete('XanotherScript') 36900123cc1eSBram Moolenaar set cpo&vim 36919ec7026fSBram Moolenaarenddef 36929ec7026fSBram Moolenaar 3693ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3694ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 369537294bd6SBram Moolenaar CheckScreendump 3696ffb7dcdbSBram Moolenaar CheckFeature timers 369737294bd6SBram Moolenaar 3698ffb7dcdbSBram Moolenaar let lines =<< trim END 369937294bd6SBram Moolenaar vim9script 370037294bd6SBram Moolenaar def script#func() 370137294bd6SBram Moolenaar enddef 370237294bd6SBram Moolenaar END 3703ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3704ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 370537294bd6SBram Moolenaar 3706ffb7dcdbSBram Moolenaar let lines =<< trim END 370737294bd6SBram Moolenaar vim9script 370837294bd6SBram Moolenaar set cpo+=M 370937294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3710767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 371137294bd6SBram Moolenaar setline(1, 'some text') 371237294bd6SBram Moolenaar END 3713ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3714ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3715ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3716ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 371737294bd6SBram Moolenaar 3718ffb7dcdbSBram Moolenaar " clean up 3719ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3720ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3721ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3722ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3723ffb7dcdbSBram Moolenaarendfunc 372437294bd6SBram Moolenaar 37259ec7026fSBram Moolenaar 3726f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3727cfcd011fSBram Moolenaar var lines =<< trim END 3728cfcd011fSBram Moolenaar var name: any 3729cfcd011fSBram Moolenaar assert_equal(0, name) 3730f0afd9e1SBram Moolenaar END 3731f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3732f0afd9e1SBram Moolenaarenddef 3733f0afd9e1SBram Moolenaar 37347e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 373558dbef33SBram Moolenaar CheckRunVimInTerminal 373658dbef33SBram Moolenaar 37377e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 37387e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 37397e9210eaSBram Moolenaarendfunc 37407e9210eaSBram Moolenaar 37417e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 37429c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3743cfcd011fSBram Moolenaar var lines =<< trim END 37449c4f5520SBram Moolenaar func CheckAndQuit() 37459c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 37469c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 37479c4f5520SBram Moolenaar endfunc 37489c4f5520SBram Moolenaar END 37499c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 37509c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3751e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 37529c4f5520SBram Moolenaar # define Afunc() on the command line 37539c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 37549c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 37552949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 37569c4f5520SBram Moolenaar 37579c4f5520SBram Moolenaar call StopVimInTerminal(buf) 37589c4f5520SBram Moolenaar delete('XcallFunc') 37599c4f5520SBram Moolenaar delete('Xdidcmd') 37609c4f5520SBram Moolenaarenddef 37619c4f5520SBram Moolenaar 3762fcdc5d83SBram Moolenaardef Test_script_var_scope() 3763fcdc5d83SBram Moolenaar var lines =<< trim END 3764fcdc5d83SBram Moolenaar vim9script 3765fcdc5d83SBram Moolenaar if true 3766fcdc5d83SBram Moolenaar if true 3767fcdc5d83SBram Moolenaar var one = 'one' 3768fcdc5d83SBram Moolenaar echo one 3769fcdc5d83SBram Moolenaar endif 3770fcdc5d83SBram Moolenaar echo one 3771fcdc5d83SBram Moolenaar endif 3772fcdc5d83SBram Moolenaar END 3773fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3774fcdc5d83SBram Moolenaar 3775fcdc5d83SBram Moolenaar lines =<< trim END 3776fcdc5d83SBram Moolenaar vim9script 3777fcdc5d83SBram Moolenaar if true 3778fcdc5d83SBram Moolenaar if false 3779fcdc5d83SBram Moolenaar var one = 'one' 3780fcdc5d83SBram Moolenaar echo one 3781fcdc5d83SBram Moolenaar else 3782fcdc5d83SBram Moolenaar var one = 'one' 3783fcdc5d83SBram Moolenaar echo one 3784fcdc5d83SBram Moolenaar endif 3785fcdc5d83SBram Moolenaar echo one 3786fcdc5d83SBram Moolenaar endif 3787fcdc5d83SBram Moolenaar END 3788fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3789fcdc5d83SBram Moolenaar 3790fcdc5d83SBram Moolenaar lines =<< trim END 3791fcdc5d83SBram Moolenaar vim9script 3792fcdc5d83SBram Moolenaar while true 3793fcdc5d83SBram Moolenaar var one = 'one' 3794fcdc5d83SBram Moolenaar echo one 3795fcdc5d83SBram Moolenaar break 3796fcdc5d83SBram Moolenaar endwhile 3797fcdc5d83SBram Moolenaar echo one 3798fcdc5d83SBram Moolenaar END 3799fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3800fcdc5d83SBram Moolenaar 3801fcdc5d83SBram Moolenaar lines =<< trim END 3802fcdc5d83SBram Moolenaar vim9script 3803fcdc5d83SBram Moolenaar for i in range(1) 3804fcdc5d83SBram Moolenaar var one = 'one' 3805fcdc5d83SBram Moolenaar echo one 3806fcdc5d83SBram Moolenaar endfor 3807fcdc5d83SBram Moolenaar echo one 3808fcdc5d83SBram Moolenaar END 3809fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 38109becdf2bSBram Moolenaar 38119becdf2bSBram Moolenaar lines =<< trim END 38129becdf2bSBram Moolenaar vim9script 38139becdf2bSBram Moolenaar { 38149becdf2bSBram Moolenaar var one = 'one' 38159becdf2bSBram Moolenaar assert_equal('one', one) 38169becdf2bSBram Moolenaar } 38179becdf2bSBram Moolenaar assert_false(exists('one')) 38189becdf2bSBram Moolenaar assert_false(exists('s:one')) 38199becdf2bSBram Moolenaar END 38209becdf2bSBram Moolenaar CheckScriptSuccess(lines) 38219becdf2bSBram Moolenaar 38229becdf2bSBram Moolenaar lines =<< trim END 38239becdf2bSBram Moolenaar vim9script 38249becdf2bSBram Moolenaar { 38259becdf2bSBram Moolenaar var one = 'one' 38269becdf2bSBram Moolenaar echo one 38279becdf2bSBram Moolenaar } 38289becdf2bSBram Moolenaar echo one 38299becdf2bSBram Moolenaar END 38309becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3831fcdc5d83SBram Moolenaarenddef 3832fcdc5d83SBram Moolenaar 3833352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3834352134bbSBram Moolenaar var lines =<< trim END 3835352134bbSBram Moolenaar vim9script 38362a38908bSBram Moolenaar def Callback(...l: list<any>) 3837352134bbSBram Moolenaar try 3838352134bbSBram Moolenaar var x: string 3839352134bbSBram Moolenaar var y: string 3840352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3841352134bbSBram Moolenaar [x, y] = [''] 3842352134bbSBram Moolenaar catch 3843352134bbSBram Moolenaar g:caught = 'yes' 3844352134bbSBram Moolenaar endtry 3845352134bbSBram Moolenaar enddef 3846e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3847352134bbSBram Moolenaar feedkeys("\r", 'xt') 3848352134bbSBram Moolenaar END 3849352134bbSBram Moolenaar CheckScriptSuccess(lines) 3850352134bbSBram Moolenaar 3851352134bbSBram Moolenaar unlet g:caught 3852352134bbSBram Moolenaarenddef 3853352134bbSBram Moolenaar 3854631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3855631e8f93SBram Moolenaar if !has('unix') || !has('job') 3856631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3857631e8f93SBram Moolenaar endif 3858631e8f93SBram Moolenaar var lines =<< trim END 3859631e8f93SBram Moolenaar vim9script 3860631e8f93SBram Moolenaar var source: list<number> 38612a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3862631e8f93SBram Moolenaar eval [][0] 3863631e8f93SBram Moolenaar enddef 38642a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3865631e8f93SBram Moolenaar sleep 1m 3866631e8f93SBram Moolenaar source += l 3867631e8f93SBram Moolenaar enddef 3868e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 38696f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 38706f17a3f0SBram Moolenaar sleep 10m 38716f17a3f0SBram Moolenaar endwhile 3872206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3873fe95b94fSBram Moolenaar sleep 200m 3874631e8f93SBram Moolenaar END 3875631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3876631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3877631e8f93SBram Moolenaar delete('Xdef') 3878631e8f93SBram Moolenaarenddef 3879631e8f93SBram Moolenaar 38804324d87aSBram Moolenaardef InvokeNormal() 38814324d87aSBram Moolenaar exe "norm! :m+1\r" 38824324d87aSBram Moolenaarenddef 38834324d87aSBram Moolenaar 38844324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 38854324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 38864324d87aSBram Moolenaar new 38874324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 38884324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 38894324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 38904324d87aSBram Moolenaar xunmap <F3> 3891b5b9480eSBram Moolenaarenddef 3892b5b9480eSBram Moolenaar 3893b5b9480eSBram Moolenaardef Test_white_space_after_command() 3894b5b9480eSBram Moolenaar var lines =<< trim END 3895b5b9480eSBram Moolenaar exit_cb: Func}) 3896b5b9480eSBram Moolenaar END 3897b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3898f8103f27SBram Moolenaar 3899f8103f27SBram Moolenaar lines =<< trim END 3900f8103f27SBram Moolenaar e# 3901f8103f27SBram Moolenaar END 3902f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 39034324d87aSBram Moolenaarenddef 39044324d87aSBram Moolenaar 39054aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 39064aab88d9SBram Moolenaar var lines =<< trim END 39074aab88d9SBram Moolenaar vim9script 39084aab88d9SBram Moolenaar if exists('g:guard') 39094aab88d9SBram Moolenaar finish 39104aab88d9SBram Moolenaar endif 39114aab88d9SBram Moolenaar g:guard = 1 39124aab88d9SBram Moolenaar var name = 'thename' 39134aab88d9SBram Moolenaar def g:GetName(): string 39144aab88d9SBram Moolenaar return name 39154aab88d9SBram Moolenaar enddef 39164aab88d9SBram Moolenaar def g:SetName(arg: string) 39174aab88d9SBram Moolenaar name = arg 39184aab88d9SBram Moolenaar enddef 39194aab88d9SBram Moolenaar END 39204aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 39214aab88d9SBram Moolenaar so XscriptTwice.vim 39224aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 39234aab88d9SBram Moolenaar g:SetName('newname') 39244aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 39254aab88d9SBram Moolenaar so XscriptTwice.vim 39264aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 39274aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 39284aab88d9SBram Moolenaar 39294aab88d9SBram Moolenaar delfunc g:GetName 39304aab88d9SBram Moolenaar delfunc g:SetName 39314aab88d9SBram Moolenaar delete('XscriptTwice.vim') 39324aab88d9SBram Moolenaar unlet g:guard 39334aab88d9SBram Moolenaarenddef 39344aab88d9SBram Moolenaar 39354aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 39364aab88d9SBram Moolenaar var exportlines =<< trim END 39374aab88d9SBram Moolenaar vim9script 39384aab88d9SBram Moolenaar if exists('g:guard') 39394aab88d9SBram Moolenaar finish 39404aab88d9SBram Moolenaar endif 39414aab88d9SBram Moolenaar g:guard = 1 39424aab88d9SBram Moolenaar export var name = 'someName' 39434aab88d9SBram Moolenaar END 39444aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 39454aab88d9SBram Moolenaar 39464aab88d9SBram Moolenaar var lines =<< trim END 39474aab88d9SBram Moolenaar vim9script 39484aab88d9SBram Moolenaar import name from './XexportScript.vim' 39494aab88d9SBram Moolenaar def g:GetName(): string 39504aab88d9SBram Moolenaar return name 39514aab88d9SBram Moolenaar enddef 39524aab88d9SBram Moolenaar END 39534aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 39544aab88d9SBram Moolenaar so XscriptImport.vim 39554aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 39564aab88d9SBram Moolenaar 39574aab88d9SBram Moolenaar so XexportScript.vim 39584aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 39594aab88d9SBram Moolenaar 39604aab88d9SBram Moolenaar delfunc g:GetName 39614aab88d9SBram Moolenaar delete('XexportScript.vim') 39624aab88d9SBram Moolenaar delete('XscriptImport.vim') 39634aab88d9SBram Moolenaar unlet g:guard 39644aab88d9SBram Moolenaarenddef 39654aab88d9SBram Moolenaar 396610b9421fSBram Moolenaardef Test_unsupported_commands() 396710b9421fSBram Moolenaar var lines =<< trim END 396810b9421fSBram Moolenaar ka 396910b9421fSBram Moolenaar END 39707d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39717d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 397210b9421fSBram Moolenaar 397310b9421fSBram Moolenaar lines =<< trim END 3974ada1d870SBram Moolenaar :1ka 3975ada1d870SBram Moolenaar END 39767d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39777d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 3978ada1d870SBram Moolenaar 3979ada1d870SBram Moolenaar lines =<< trim END 398010b9421fSBram Moolenaar t 398110b9421fSBram Moolenaar END 398210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 398310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 398410b9421fSBram Moolenaar 398510b9421fSBram Moolenaar lines =<< trim END 398610b9421fSBram Moolenaar x 398710b9421fSBram Moolenaar END 398810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 398910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 399010b9421fSBram Moolenaar 399110b9421fSBram Moolenaar lines =<< trim END 399210b9421fSBram Moolenaar xit 399310b9421fSBram Moolenaar END 399410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 399510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 399610b9421fSBram Moolenaarenddef 399710b9421fSBram Moolenaar 3998c70fe460SBram Moolenaardef Test_mapping_line_number() 3999c70fe460SBram Moolenaar var lines =<< trim END 4000c70fe460SBram Moolenaar vim9script 4001c70fe460SBram Moolenaar def g:FuncA() 4002c70fe460SBram Moolenaar # Some comment 4003c70fe460SBram Moolenaar FuncB(0) 4004c70fe460SBram Moolenaar enddef 4005c70fe460SBram Moolenaar # Some comment 4006c70fe460SBram Moolenaar def FuncB( 4007c70fe460SBram Moolenaar # Some comment 4008c70fe460SBram Moolenaar n: number 4009c70fe460SBram Moolenaar ) 4010c70fe460SBram Moolenaar exe 'nno ' 4011c70fe460SBram Moolenaar # Some comment 4012c70fe460SBram Moolenaar .. '<F3> a' 4013c70fe460SBram Moolenaar .. 'b' 4014c70fe460SBram Moolenaar .. 'c' 4015c70fe460SBram Moolenaar enddef 4016c70fe460SBram Moolenaar END 4017c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4018c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4019c70fe460SBram Moolenaar assert_match('No mapping found', res) 4020c70fe460SBram Moolenaar 4021c70fe460SBram Moolenaar g:FuncA() 4022c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4023c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4024c70fe460SBram Moolenaar 4025c70fe460SBram Moolenaar nunmap <F3> 4026c70fe460SBram Moolenaar delfunc g:FuncA 4027c70fe460SBram Moolenaarenddef 4028c70fe460SBram Moolenaar 4029208f0b48SBram Moolenaardef Test_option_modifier() 4030208f0b48SBram Moolenaar var lines =<< trim END 4031208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4032208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4033208f0b48SBram Moolenaar END 4034208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4035208f0b48SBram Moolenaar 4036208f0b48SBram Moolenaar lines =<< trim END 4037208f0b48SBram Moolenaar vim9script 4038208f0b48SBram Moolenaar set hlsearch & 4039208f0b48SBram Moolenaar END 4040208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 4041208f0b48SBram Moolenaar 4042208f0b48SBram Moolenaar lines =<< trim END 4043208f0b48SBram Moolenaar vim9script 4044208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4045208f0b48SBram Moolenaar END 4046208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 4047208f0b48SBram Moolenaarenddef 4048208f0b48SBram Moolenaar 4049585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4050585fea7bSBram Moolenaardef Test_substitute_cmd() 4051585fea7bSBram Moolenaar new 4052585fea7bSBram Moolenaar setline(1, 'something') 4053585fea7bSBram Moolenaar :substitute(some(other( 4054585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4055585fea7bSBram Moolenaar bwipe! 4056585fea7bSBram Moolenaar 4057f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4058cfcd011fSBram Moolenaar var lines =<< trim END 4059585fea7bSBram Moolenaar vim9script 4060585fea7bSBram Moolenaar new 4061585fea7bSBram Moolenaar setline(1, 'something') 4062585fea7bSBram Moolenaar :substitute(some(other( 4063585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4064585fea7bSBram Moolenaar bwipe! 4065585fea7bSBram Moolenaar END 4066585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4067585fea7bSBram Moolenaar source Xvim9lines 4068585fea7bSBram Moolenaar 4069585fea7bSBram Moolenaar delete('Xvim9lines') 4070585fea7bSBram Moolenaarenddef 4071585fea7bSBram Moolenaar 40728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4073