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 6064197828dSBram Moolenaar 6074197828dSBram Moolenaar # missing catch and/or finally 6084197828dSBram Moolenaar lines =<< trim END 6094197828dSBram Moolenaar vim9script 6104197828dSBram Moolenaar try 6114197828dSBram Moolenaar echo 'something' 6124197828dSBram Moolenaar endtry 6134197828dSBram Moolenaar END 6144197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6158a7d6542SBram Moolenaarenddef 6168a7d6542SBram Moolenaar 6173f987b59SBram Moolenaardef Test_try_in_catch() 6183f987b59SBram Moolenaar var lines =<< trim END 6193f987b59SBram Moolenaar vim9script 6203f987b59SBram Moolenaar var seq = [] 6213f987b59SBram Moolenaar def DoIt() 6223f987b59SBram Moolenaar try 6233f987b59SBram Moolenaar seq->add('throw 1') 6243f987b59SBram Moolenaar eval [][0] 6253f987b59SBram Moolenaar seq->add('notreached') 6263f987b59SBram Moolenaar catch 6273f987b59SBram Moolenaar seq->add('catch') 6283f987b59SBram Moolenaar try 6293f987b59SBram Moolenaar seq->add('throw 2') 6303f987b59SBram Moolenaar eval [][0] 6313f987b59SBram Moolenaar seq->add('notreached') 6323f987b59SBram Moolenaar catch /nothing/ 6333f987b59SBram Moolenaar seq->add('notreached') 6343f987b59SBram Moolenaar endtry 6353f987b59SBram Moolenaar seq->add('done') 6363f987b59SBram Moolenaar endtry 6373f987b59SBram Moolenaar enddef 6383f987b59SBram Moolenaar DoIt() 6393f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6403f987b59SBram Moolenaar END 6413f987b59SBram Moolenaarenddef 6423f987b59SBram Moolenaar 643d3d8feebSBram Moolenaardef Test_error_in_catch() 644d3d8feebSBram Moolenaar var lines =<< trim END 645d3d8feebSBram Moolenaar try 646d3d8feebSBram Moolenaar eval [][0] 647d3d8feebSBram Moolenaar catch /E684:/ 648d3d8feebSBram Moolenaar eval [][0] 649d3d8feebSBram Moolenaar endtry 650d3d8feebSBram Moolenaar END 651d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 652d3d8feebSBram Moolenaarenddef 653d3d8feebSBram Moolenaar 6542e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6552e34c34bSBram Moolenaardef TryContinueFunc() 6562e34c34bSBram Moolenaar while g:Count < 2 6572e34c34bSBram Moolenaar g:sequence ..= 't' 6582e34c34bSBram Moolenaar try 6592e34c34bSBram Moolenaar echoerr 'Test' 6602e34c34bSBram Moolenaar catch 6612e34c34bSBram Moolenaar g:Count += 1 6622e34c34bSBram Moolenaar g:sequence ..= 'c' 6632e34c34bSBram Moolenaar continue 6642e34c34bSBram Moolenaar endtry 6652e34c34bSBram Moolenaar g:sequence ..= 'e' 6662e34c34bSBram Moolenaar g:Count += 1 6672e34c34bSBram Moolenaar endwhile 6682e34c34bSBram Moolenaarenddef 6692e34c34bSBram Moolenaar 6702e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6712e34c34bSBram Moolenaar g:Count = 0 6722e34c34bSBram Moolenaar g:sequence = '' 6732e34c34bSBram Moolenaar TryContinueFunc() 6742e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6752e34c34bSBram Moolenaar unlet g:Count 6762e34c34bSBram Moolenaar unlet g:sequence 6772e34c34bSBram Moolenaarenddef 6782e34c34bSBram Moolenaar 6799cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6809cb577a6SBram Moolenaar # return in try block returns normally 6819cb577a6SBram Moolenaar def ReturnInTry(): string 6829cb577a6SBram Moolenaar try 6839cb577a6SBram Moolenaar return '"some message"' 6849cb577a6SBram Moolenaar catch 6859cb577a6SBram Moolenaar endtry 6869cb577a6SBram Moolenaar return 'not reached' 6879cb577a6SBram Moolenaar enddef 6889cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6899cb577a6SBram Moolenaarenddef 6909cb577a6SBram Moolenaar 6911430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6921430ceebSBram Moolenaar var lines =<< trim END 6931430ceebSBram Moolenaar vim9script 694c323527dSBram Moolenaar au BufEnter * eval 1 + 2 6951430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6961430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6971430ceebSBram Moolenaar var items = [ 6981430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6991430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7001430ceebSBram Moolenaar ] 7011430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7021430ceebSBram Moolenaar cwindow 7031430ceebSBram Moolenaar 7041430ceebSBram Moolenaar def CnextOrCfirst() 7051430ceebSBram Moolenaar # if cnext fails, cfirst is used 7061430ceebSBram Moolenaar try 7071430ceebSBram Moolenaar cnext 7081430ceebSBram Moolenaar catch 7091430ceebSBram Moolenaar cfirst 7101430ceebSBram Moolenaar endtry 7111430ceebSBram Moolenaar enddef 7121430ceebSBram Moolenaar 7131430ceebSBram Moolenaar CnextOrCfirst() 7141430ceebSBram Moolenaar CnextOrCfirst() 7151430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7161430ceebSBram Moolenaar qall 7171430ceebSBram Moolenaar END 7181430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7191430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7201430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7211430ceebSBram Moolenaar 7221430ceebSBram Moolenaar delete('Xfile1') 7231430ceebSBram Moolenaar delete('Xfile2') 7241430ceebSBram Moolenaar delete('XCatchCnext') 7251430ceebSBram Moolenaar delete('Xresult') 7261430ceebSBram Moolenaarenddef 7271430ceebSBram Moolenaar 7289e1d9e34SBram Moolenaardef Test_throw_skipped() 7299e1d9e34SBram Moolenaar if 0 7309e1d9e34SBram Moolenaar throw dontgethere 7319e1d9e34SBram Moolenaar endif 7329e1d9e34SBram Moolenaarenddef 7339e1d9e34SBram Moolenaar 7348f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7358f81b22eSBram Moolenaar var lines =<< trim END 7368f81b22eSBram Moolenaar vim9script 7378f81b22eSBram Moolenaar def Func() 7388f81b22eSBram Moolenaar throw 'error' 7398f81b22eSBram Moolenaar enddef 7408f81b22eSBram Moolenaar silent! Func() 7418f81b22eSBram Moolenaar END 7428f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7438f81b22eSBram Moolenaar source XthrowSilenced 7448f81b22eSBram Moolenaar delete('XthrowSilenced') 7458f81b22eSBram Moolenaarenddef 7468f81b22eSBram Moolenaar 747e859312eSBram Moolenaardef DeletedFunc(): list<any> 748e859312eSBram Moolenaar return ['delete me'] 749e859312eSBram Moolenaarenddef 750e859312eSBram Moolenaardefcompile 751e859312eSBram Moolenaardelfunc DeletedFunc 752e859312eSBram Moolenaar 753257cc5eeSBram Moolenaardef ThrowFromDef() 754a72cfb80SBram Moolenaar throw "getout" # comment 755257cc5eeSBram Moolenaarenddef 756257cc5eeSBram Moolenaar 757257cc5eeSBram Moolenaarfunc CatchInFunc() 758257cc5eeSBram Moolenaar try 759257cc5eeSBram Moolenaar call ThrowFromDef() 760257cc5eeSBram Moolenaar catch 761257cc5eeSBram Moolenaar let g:thrown_func = v:exception 762257cc5eeSBram Moolenaar endtry 763257cc5eeSBram Moolenaarendfunc 764257cc5eeSBram Moolenaar 765257cc5eeSBram Moolenaardef CatchInDef() 766257cc5eeSBram Moolenaar try 767257cc5eeSBram Moolenaar ThrowFromDef() 768257cc5eeSBram Moolenaar catch 769257cc5eeSBram Moolenaar g:thrown_def = v:exception 770257cc5eeSBram Moolenaar endtry 771257cc5eeSBram Moolenaarenddef 772257cc5eeSBram Moolenaar 773f575adffSBram Moolenaardef ReturnFinally(): string 774f575adffSBram Moolenaar try 775f575adffSBram Moolenaar return 'intry' 776373863edSBram Moolenaar finall 777f575adffSBram Moolenaar g:in_finally = 'finally' 778f575adffSBram Moolenaar endtry 779f575adffSBram Moolenaar return 'end' 780f575adffSBram Moolenaarenddef 781f575adffSBram Moolenaar 782257cc5eeSBram Moolenaardef Test_try_catch_nested() 783257cc5eeSBram Moolenaar CatchInFunc() 784257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 785257cc5eeSBram Moolenaar 786257cc5eeSBram Moolenaar CatchInDef() 787257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 788f575adffSBram Moolenaar 789f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 790f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 791d3d8feebSBram Moolenaar 792d3d8feebSBram Moolenaar var l = [] 793d3d8feebSBram Moolenaar try 794d3d8feebSBram Moolenaar l->add('1') 795d3d8feebSBram Moolenaar throw 'bad' 796d3d8feebSBram Moolenaar l->add('x') 797d3d8feebSBram Moolenaar catch /bad/ 798d3d8feebSBram Moolenaar l->add('2') 799d3d8feebSBram Moolenaar try 800d3d8feebSBram Moolenaar l->add('3') 801d3d8feebSBram Moolenaar throw 'one' 802d3d8feebSBram Moolenaar l->add('x') 803d3d8feebSBram Moolenaar catch /one/ 804d3d8feebSBram Moolenaar l->add('4') 805d3d8feebSBram Moolenaar try 806d3d8feebSBram Moolenaar l->add('5') 807d3d8feebSBram Moolenaar throw 'more' 808d3d8feebSBram Moolenaar l->add('x') 809d3d8feebSBram Moolenaar catch /more/ 810d3d8feebSBram Moolenaar l->add('6') 811d3d8feebSBram Moolenaar endtry 812d3d8feebSBram Moolenaar endtry 813d3d8feebSBram Moolenaar endtry 814d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 815834193afSBram Moolenaar 816834193afSBram Moolenaar l = [] 817834193afSBram Moolenaar try 818834193afSBram Moolenaar try 819834193afSBram Moolenaar l->add('1') 820834193afSBram Moolenaar throw 'foo' 821834193afSBram Moolenaar l->add('x') 822834193afSBram Moolenaar catch 823834193afSBram Moolenaar l->add('2') 824834193afSBram Moolenaar throw 'bar' 825834193afSBram Moolenaar l->add('x') 826834193afSBram Moolenaar finally 827834193afSBram Moolenaar l->add('3') 828834193afSBram Moolenaar endtry 829834193afSBram Moolenaar l->add('x') 830834193afSBram Moolenaar catch /bar/ 831834193afSBram Moolenaar l->add('4') 832834193afSBram Moolenaar endtry 833834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 834f575adffSBram Moolenaarenddef 835f575adffSBram Moolenaar 8369939f57bSBram Moolenaardef TryOne(): number 8379939f57bSBram Moolenaar try 8389939f57bSBram Moolenaar return 0 8399939f57bSBram Moolenaar catch 8409939f57bSBram Moolenaar endtry 8419939f57bSBram Moolenaar return 0 8429939f57bSBram Moolenaarenddef 8439939f57bSBram Moolenaar 8449939f57bSBram Moolenaardef TryTwo(n: number): string 8459939f57bSBram Moolenaar try 846cfcd011fSBram Moolenaar var x = {} 8479939f57bSBram Moolenaar catch 8489939f57bSBram Moolenaar endtry 8499939f57bSBram Moolenaar return 'text' 8509939f57bSBram Moolenaarenddef 8519939f57bSBram Moolenaar 8529939f57bSBram Moolenaardef Test_try_catch_twice() 8539939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8549939f57bSBram Moolenaarenddef 8559939f57bSBram Moolenaar 856f575adffSBram Moolenaardef Test_try_catch_match() 857cfcd011fSBram Moolenaar var seq = 'a' 858f575adffSBram Moolenaar try 859f575adffSBram Moolenaar throw 'something' 860f575adffSBram Moolenaar catch /nothing/ 861f575adffSBram Moolenaar seq ..= 'x' 862f575adffSBram Moolenaar catch /some/ 863f575adffSBram Moolenaar seq ..= 'b' 864f575adffSBram Moolenaar catch /asdf/ 865f575adffSBram Moolenaar seq ..= 'x' 866e8c4abbbSBram Moolenaar catch ?a\?sdf? 867e8c4abbbSBram Moolenaar seq ..= 'y' 868f575adffSBram Moolenaar finally 869f575adffSBram Moolenaar seq ..= 'c' 870f575adffSBram Moolenaar endtry 871f575adffSBram Moolenaar assert_equal('abc', seq) 872257cc5eeSBram Moolenaarenddef 873257cc5eeSBram Moolenaar 874e8c4abbbSBram Moolenaardef Test_try_catch_fails() 875d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 876d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 877d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 878d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 879d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 880d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 881d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 882d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 88313106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 884d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 885585fea7bSBram Moolenaar 886e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 887d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 888e8c4abbbSBram Moolenaarenddef 889e8c4abbbSBram Moolenaar 8907c5b3c03SBram Moolenaardef Try_catch_skipped() 8917c5b3c03SBram Moolenaar var l = [] 8927c5b3c03SBram Moolenaar try 8937c5b3c03SBram Moolenaar finally 8947c5b3c03SBram Moolenaar endtry 8957c5b3c03SBram Moolenaar 8967c5b3c03SBram Moolenaar if 1 8977c5b3c03SBram Moolenaar else 8987c5b3c03SBram Moolenaar try 8997c5b3c03SBram Moolenaar endtry 9007c5b3c03SBram Moolenaar endif 9017c5b3c03SBram Moolenaarenddef 9027c5b3c03SBram Moolenaar 9037c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9047c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9057c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9067c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9077c5b3c03SBram Moolenaarenddef 9087c5b3c03SBram Moolenaar 9097c5b3c03SBram Moolenaar 9107c5b3c03SBram Moolenaar 911006ad48bSBram Moolenaardef Test_throw_vimscript() 912f5be8cdbSBram Moolenaar # only checks line continuation 913cfcd011fSBram Moolenaar var lines =<< trim END 914006ad48bSBram Moolenaar vim9script 915006ad48bSBram Moolenaar try 916006ad48bSBram Moolenaar throw 'one' 917006ad48bSBram Moolenaar .. 'two' 918006ad48bSBram Moolenaar catch 919006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 920006ad48bSBram Moolenaar endtry 921006ad48bSBram Moolenaar END 922006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9231e021e63SBram Moolenaar 9241e021e63SBram Moolenaar lines =<< trim END 9251e021e63SBram Moolenaar vim9script 926352134bbSBram Moolenaar @r = '' 9271e021e63SBram Moolenaar def Func() 9281e021e63SBram Moolenaar throw @r 9291e021e63SBram Moolenaar enddef 9301e021e63SBram Moolenaar var result = '' 9311e021e63SBram Moolenaar try 9321e021e63SBram Moolenaar Func() 9331e021e63SBram Moolenaar catch /E1129:/ 9341e021e63SBram Moolenaar result = 'caught' 9351e021e63SBram Moolenaar endtry 9361e021e63SBram Moolenaar assert_equal('caught', result) 9371e021e63SBram Moolenaar END 9381e021e63SBram Moolenaar CheckScriptSuccess(lines) 939006ad48bSBram Moolenaarenddef 940006ad48bSBram Moolenaar 941ed677f55SBram Moolenaardef Test_error_in_nested_function() 94203dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 943cfcd011fSBram Moolenaar var lines =<< trim END 944ed677f55SBram Moolenaar vim9script 945ed677f55SBram Moolenaar def Func() 946ed677f55SBram Moolenaar Error() 947ed677f55SBram Moolenaar g:test_var = 1 948ed677f55SBram Moolenaar enddef 949ed677f55SBram Moolenaar func Error() abort 950ed677f55SBram Moolenaar eval [][0] 951ed677f55SBram Moolenaar endfunc 952ed677f55SBram Moolenaar Func() 953ed677f55SBram Moolenaar END 954ed677f55SBram Moolenaar g:test_var = 0 955ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 956ed677f55SBram Moolenaar assert_equal(0, g:test_var) 957ed677f55SBram Moolenaarenddef 958ed677f55SBram Moolenaar 959227c58a4SBram Moolenaardef Test_abort_after_error() 960227c58a4SBram Moolenaar var lines =<< trim END 961227c58a4SBram Moolenaar vim9script 962227c58a4SBram Moolenaar while true 963227c58a4SBram Moolenaar echo notfound 964227c58a4SBram Moolenaar endwhile 965227c58a4SBram Moolenaar g:gotthere = true 966227c58a4SBram Moolenaar END 967227c58a4SBram Moolenaar g:gotthere = false 968227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 969227c58a4SBram Moolenaar assert_false(g:gotthere) 970227c58a4SBram Moolenaar unlet g:gotthere 971227c58a4SBram Moolenaarenddef 972227c58a4SBram Moolenaar 97337c83711SBram Moolenaardef Test_cexpr_vimscript() 974f5be8cdbSBram Moolenaar # only checks line continuation 97537c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 976cfcd011fSBram Moolenaar var lines =<< trim END 97737c83711SBram Moolenaar vim9script 97837c83711SBram Moolenaar cexpr 'File' 97937c83711SBram Moolenaar .. ' someFile' .. 98037c83711SBram Moolenaar ' line 19' 98137c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 98237c83711SBram Moolenaar END 98337c83711SBram Moolenaar CheckScriptSuccess(lines) 98437c83711SBram Moolenaar set errorformat& 98537c83711SBram Moolenaarenddef 98637c83711SBram Moolenaar 987c9edd6b5SBram Moolenaardef Test_statusline_syntax() 988c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 989cfcd011fSBram Moolenaar var lines =<< trim END 990c9edd6b5SBram Moolenaar vim9script 991c9edd6b5SBram Moolenaar func g:Status() 992c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 993c9edd6b5SBram Moolenaar endfunc 994c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 995c9edd6b5SBram Moolenaar redrawstatus 996c9edd6b5SBram Moolenaar set laststatus statusline= 997c9edd6b5SBram Moolenaar END 998c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 999c9edd6b5SBram Moolenaarenddef 1000c9edd6b5SBram Moolenaar 1001b209750bSBram Moolenaardef Test_list_vimscript() 1002b209750bSBram Moolenaar # checks line continuation and comments 1003cfcd011fSBram Moolenaar var lines =<< trim END 1004b209750bSBram Moolenaar vim9script 1005cfcd011fSBram Moolenaar var mylist = [ 1006b209750bSBram Moolenaar 'one', 1007b209750bSBram Moolenaar # comment 1008b209750bSBram Moolenaar 'two', # empty line follows 1009b209750bSBram Moolenaar 1010b209750bSBram Moolenaar 'three', 1011b209750bSBram Moolenaar ] 1012b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1013b209750bSBram Moolenaar END 1014b209750bSBram Moolenaar CheckScriptSuccess(lines) 101566250c93SBram Moolenaar 101666250c93SBram Moolenaar # check all lines from heredoc are kept 101766250c93SBram Moolenaar lines =<< trim END 101866250c93SBram Moolenaar # comment 1 101966250c93SBram Moolenaar two 102066250c93SBram Moolenaar # comment 3 102166250c93SBram Moolenaar 102266250c93SBram Moolenaar five 102366250c93SBram Moolenaar # comment 6 102466250c93SBram Moolenaar END 102566250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10264bce26bbSBram Moolenaar 10274bce26bbSBram Moolenaar lines =<< trim END 10284bce26bbSBram Moolenaar [{ 10294bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10304bce26bbSBram Moolenaar END 10314bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1032b209750bSBram Moolenaarenddef 1033b209750bSBram Moolenaar 10342a1381c3SBram Moolenaarif has('channel') 103540ee466cSBram Moolenaar let someJob = test_null_job() 103640ee466cSBram Moolenaar 103740ee466cSBram Moolenaar def FuncWithError() 103840ee466cSBram Moolenaar echomsg g:someJob 103940ee466cSBram Moolenaar enddef 104040ee466cSBram Moolenaar 104140ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 104240ee466cSBram Moolenaar try 104340ee466cSBram Moolenaar call FuncWithError() 104440ee466cSBram Moolenaar catch 104540ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 104640ee466cSBram Moolenaar endtry 104740ee466cSBram Moolenaar endfunc 10482a1381c3SBram Moolenaarendif 104940ee466cSBram Moolenaar 10508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10518a7d6542SBram Moolenaar vim9script 1052cfcd011fSBram Moolenaar var name: string = 'bob' 10538a7d6542SBram Moolenaar def Concat(arg: string): string 10548a7d6542SBram Moolenaar return name .. arg 10558a7d6542SBram Moolenaar enddef 1056227a69deSBram Moolenaar g:result = Concat('bie') 1057227a69deSBram Moolenaar g:localname = name 10588a7d6542SBram Moolenaar 10598a7d6542SBram Moolenaar export const CONST = 1234 1060cfcd011fSBram Moolenaar export var exported = 9876 1061cfcd011fSBram Moolenaar export var exp_name = 'John' 10628a7d6542SBram Moolenaar export def Exported(): string 10638a7d6542SBram Moolenaar return 'Exported' 10648a7d6542SBram Moolenaar enddef 10650f2a5cc6SBram Moolenaar export final theList = [1] 10668a7d6542SBram MoolenaarEND 10678a7d6542SBram Moolenaar 1068b3ca9824SBram Moolenaardef Undo_export_script_lines() 1069b3ca9824SBram Moolenaar unlet g:result 1070b3ca9824SBram Moolenaar unlet g:localname 1071b3ca9824SBram Moolenaarenddef 1072b3ca9824SBram Moolenaar 10735269bd2aSBram Moolenaardef Test_vim9_import_export() 1074cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10758a7d6542SBram Moolenaar vim9script 10768a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10778a7d6542SBram Moolenaar g:imported = exported 10786e587dcbSBram Moolenaar exported += 3 10796e587dcbSBram Moolenaar g:imported_added = exported 10808a7d6542SBram Moolenaar g:imported_func = Exported() 10816e587dcbSBram Moolenaar 108240f4f7a4SBram Moolenaar def GetExported(): string 1083e0de171eSBram Moolenaar var local_dict = {ref: Exported} 108440f4f7a4SBram Moolenaar return local_dict.ref() 108540f4f7a4SBram Moolenaar enddef 108640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 108740f4f7a4SBram Moolenaar 1088*4db572eeSBram Moolenaar var dir = './' 1089*4db572eeSBram Moolenaar var ext = ".vim" 1090*4db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 10916e587dcbSBram Moolenaar g:imported_name = exp_name 10926e587dcbSBram Moolenaar exp_name ..= ' Doe' 10936e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10945381c7a1SBram Moolenaar g:imported_later = exported 10950f2a5cc6SBram Moolenaar 10960f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 10970f2a5cc6SBram Moolenaar theList->add(2) 10980f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 10998a7d6542SBram Moolenaar END 11008a7d6542SBram Moolenaar 11018a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11028a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11038a7d6542SBram Moolenaar 11048a7d6542SBram Moolenaar source Ximport.vim 11058a7d6542SBram Moolenaar 11068a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11078a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11088a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11096e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11105381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11118a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 111240f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11136e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11146e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11158a7d6542SBram Moolenaar assert_false(exists('g:name')) 11168a7d6542SBram Moolenaar 1117b3ca9824SBram Moolenaar Undo_export_script_lines() 11188a7d6542SBram Moolenaar unlet g:imported 11196e587dcbSBram Moolenaar unlet g:imported_added 11205381c7a1SBram Moolenaar unlet g:imported_later 11218a7d6542SBram Moolenaar unlet g:imported_func 11226e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11238a7d6542SBram Moolenaar delete('Ximport.vim') 1124f2d5c240SBram Moolenaar 11251c991144SBram Moolenaar # similar, with line breaks 1126cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11271c991144SBram Moolenaar vim9script 11281c991144SBram Moolenaar import { 11291c991144SBram Moolenaar exported, 11301c991144SBram Moolenaar Exported, 11311c991144SBram Moolenaar } 11321c991144SBram Moolenaar from 11331c991144SBram Moolenaar './Xexport.vim' 11341c991144SBram Moolenaar g:imported = exported 11351c991144SBram Moolenaar exported += 5 11361c991144SBram Moolenaar g:imported_added = exported 11371c991144SBram Moolenaar g:imported_func = Exported() 11381c991144SBram Moolenaar END 11391c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11401c991144SBram Moolenaar source Ximport_lbr.vim 11411c991144SBram Moolenaar 11421c991144SBram Moolenaar assert_equal(9876, g:imported) 11431c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11441c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11451c991144SBram Moolenaar 11461c991144SBram Moolenaar # exported script not sourced again 11471c991144SBram Moolenaar assert_false(exists('g:result')) 11481c991144SBram Moolenaar unlet g:imported 11491c991144SBram Moolenaar unlet g:imported_added 11501c991144SBram Moolenaar unlet g:imported_func 11511c991144SBram Moolenaar delete('Ximport_lbr.vim') 11521c991144SBram Moolenaar 1153cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1154f2d5c240SBram Moolenaar vim9script 1155f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1156f2d5c240SBram Moolenaar def UseExport() 1157cb4e80faSBram Moolenaar g:imported_def = Export.exported 1158f2d5c240SBram Moolenaar enddef 1159cb4e80faSBram Moolenaar g:imported_script = Export.exported 1160cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1161cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1162f2d5c240SBram Moolenaar UseExport() 1163f2d5c240SBram Moolenaar END 1164f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1165f2d5c240SBram Moolenaar source Ximport.vim 1166*4db572eeSBram Moolenaar # FIXME: this should be 9881 1167*4db572eeSBram Moolenaar assert_equal(9876, g:imported_def) 1168*4db572eeSBram Moolenaar assert_equal(9876, g:imported_script) 1169f2d5c240SBram Moolenaar 1170cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1171599c89c8SBram Moolenaar vim9script 1172599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1173599c89c8SBram Moolenaar def Func() 1174cfcd011fSBram Moolenaar var dummy = 1 1175cfcd011fSBram Moolenaar var imported = Export + dummy 1176599c89c8SBram Moolenaar enddef 1177822ba247SBram Moolenaar defcompile 1178599c89c8SBram Moolenaar END 1179599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 118044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1181599c89c8SBram Moolenaar 1182cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1183599c89c8SBram Moolenaar vim9script 1184599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1185599c89c8SBram Moolenaar def Func() 1186cfcd011fSBram Moolenaar var imported = Export . exported 1187599c89c8SBram Moolenaar enddef 1188822ba247SBram Moolenaar defcompile 1189599c89c8SBram Moolenaar END 1190599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 119144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1192599c89c8SBram Moolenaar 1193a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1194a6294955SBram Moolenaar vim9script 1195a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1196a6294955SBram Moolenaar var some = 'other' 1197a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1198a6294955SBram Moolenaar defcompile 1199a6294955SBram Moolenaar END 1200a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1201a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1202a6294955SBram Moolenaar 1203cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1204cb4e80faSBram Moolenaar vim9script 1205cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1206cb4e80faSBram Moolenaar g:imported_script = Export exported 1207cb4e80faSBram Moolenaar END 1208cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1209cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1210cb4e80faSBram Moolenaar 1211cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1212cb4e80faSBram Moolenaar vim9script 1213cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1214cb4e80faSBram Moolenaar g:imported_script = Export. exported 1215cb4e80faSBram Moolenaar END 1216cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1217cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1218cb4e80faSBram Moolenaar 1219cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1220599c89c8SBram Moolenaar vim9script 1221599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1222599c89c8SBram Moolenaar def Func() 1223cfcd011fSBram Moolenaar var imported = Export. 1224599c89c8SBram Moolenaar enddef 1225822ba247SBram Moolenaar defcompile 1226599c89c8SBram Moolenaar END 1227599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 122844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1229599c89c8SBram Moolenaar 1230cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12311c991144SBram Moolenaar vim9script 12321c991144SBram Moolenaar import * 12331c991144SBram Moolenaar as Export 12341c991144SBram Moolenaar from 12351c991144SBram Moolenaar './Xexport.vim' 12361c991144SBram Moolenaar def UseExport() 12371c991144SBram Moolenaar g:imported = Export.exported 12381c991144SBram Moolenaar enddef 12391c991144SBram Moolenaar UseExport() 12401c991144SBram Moolenaar END 12411c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12421c991144SBram Moolenaar source Ximport.vim 1243*4db572eeSBram Moolenaar assert_equal(9876, g:imported) 12441c991144SBram Moolenaar 1245cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1246f2d5c240SBram Moolenaar vim9script 1247f2d5c240SBram Moolenaar import * from './Xexport.vim' 1248f2d5c240SBram Moolenaar END 1249f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 125044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1251f2d5c240SBram Moolenaar 1252f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1253cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1254fa29c8abSBram Moolenaar vim9script 1255fa29c8abSBram Moolenaar import name from './Xexport.vim' 1256fa29c8abSBram Moolenaar END 1257fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 125844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1259fa29c8abSBram Moolenaar 1260f5be8cdbSBram Moolenaar # try to import something that is already defined 1261cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12625269bd2aSBram Moolenaar vim9script 1263cfcd011fSBram Moolenaar var exported = 'something' 12645269bd2aSBram Moolenaar import exported from './Xexport.vim' 12655269bd2aSBram Moolenaar END 12665269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1267057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12685269bd2aSBram Moolenaar 1269f5be8cdbSBram Moolenaar # try to import something that is already defined 12705269bd2aSBram Moolenaar import_already_defined =<< trim END 12715269bd2aSBram Moolenaar vim9script 1272cfcd011fSBram Moolenaar var exported = 'something' 12735269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12745269bd2aSBram Moolenaar END 12755269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1276057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12775269bd2aSBram Moolenaar 1278f5be8cdbSBram Moolenaar # try to import something that is already defined 12795269bd2aSBram Moolenaar import_already_defined =<< trim END 12805269bd2aSBram Moolenaar vim9script 1281cfcd011fSBram Moolenaar var exported = 'something' 12825269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12835269bd2aSBram Moolenaar END 12845269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1285057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12865269bd2aSBram Moolenaar 1287918a4249SBram Moolenaar # try changing an imported const 1288918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1289918a4249SBram Moolenaar vim9script 1290918a4249SBram Moolenaar import CONST from './Xexport.vim' 1291918a4249SBram Moolenaar def Assign() 1292918a4249SBram Moolenaar CONST = 987 1293918a4249SBram Moolenaar enddef 1294918a4249SBram Moolenaar defcompile 1295918a4249SBram Moolenaar END 1296918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1297918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1298918a4249SBram Moolenaar 12990f2a5cc6SBram Moolenaar # try changing an imported final 13000f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13010f2a5cc6SBram Moolenaar vim9script 13020f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13030f2a5cc6SBram Moolenaar def Assign() 13040f2a5cc6SBram Moolenaar theList = [2] 13050f2a5cc6SBram Moolenaar enddef 13060f2a5cc6SBram Moolenaar defcompile 13070f2a5cc6SBram Moolenaar END 13080f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13090f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13100f2a5cc6SBram Moolenaar 1311f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1312cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1313fa29c8abSBram Moolenaar vim9script 1314fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1315fa29c8abSBram Moolenaar END 1316fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 131744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1318fa29c8abSBram Moolenaar 1319cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1320fa29c8abSBram Moolenaar vim9script 1321fa29c8abSBram Moolenaar import name './Xexport.vim' 1322fa29c8abSBram Moolenaar END 1323fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 132444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1325fa29c8abSBram Moolenaar 1326cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1327fa29c8abSBram Moolenaar vim9script 1328fa29c8abSBram Moolenaar import name from Xexport.vim 1329fa29c8abSBram Moolenaar END 1330fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1331*4db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1332fa29c8abSBram Moolenaar 1333cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1334fa29c8abSBram Moolenaar vim9script 1335fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1336fa29c8abSBram Moolenaar END 1337fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 133844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1339fa29c8abSBram Moolenaar 1340cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1341fa29c8abSBram Moolenaar vim9script 1342fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1343fa29c8abSBram Moolenaar END 13445269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 134544d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1346fa29c8abSBram Moolenaar 1347f2d5c240SBram Moolenaar delete('Ximport.vim') 13485269bd2aSBram Moolenaar delete('Ximport3.vim') 13498a7d6542SBram Moolenaar delete('Xexport.vim') 13508a7d6542SBram Moolenaar 1351f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 13523e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 13533e191694SBram Moolenaar set cpo=abcd 1354cfcd011fSBram Moolenaar var lines =<< trim END 1355750802b5SBram Moolenaar vim9script 1356750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 13573e191694SBram Moolenaar set cpo+=f 13583e191694SBram Moolenaar set cpo-=c 13593e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1360750802b5SBram Moolenaar END 1361750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1362750802b5SBram Moolenaar source Xvim9_script 13633e191694SBram Moolenaar assert_equal('fabd', &cpo) 1364750802b5SBram Moolenaar set cpo&vim 1365750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 13663e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 13673e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 13683e191694SBram Moolenaar 1369750802b5SBram Moolenaar delete('Xvim9_script') 1370750802b5SBram Moolenaarenddef 1371750802b5SBram Moolenaar 13720a84284eSBram Moolenaardef Test_import_as() 13730a84284eSBram Moolenaar var export_lines =<< trim END 13740a84284eSBram Moolenaar vim9script 13750a84284eSBram Moolenaar export var one = 1 13760a84284eSBram Moolenaar export var yes = 'yes' 1377c967d57aSBram Moolenaar export var slist: list<string> 13780a84284eSBram Moolenaar END 13790a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 13800a84284eSBram Moolenaar 13810a84284eSBram Moolenaar var import_lines =<< trim END 13820a84284eSBram Moolenaar vim9script 13836c7cc347SBram Moolenaar var one = 'notused' 13846c7cc347SBram Moolenaar var yes = 777 13850a84284eSBram Moolenaar import one as thatOne from './XexportAs' 13860a84284eSBram Moolenaar assert_equal(1, thatOne) 13870a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 13880a84284eSBram Moolenaar assert_equal('yes', yesYes) 13890a84284eSBram Moolenaar END 13900a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13910a84284eSBram Moolenaar 13920a84284eSBram Moolenaar import_lines =<< trim END 13930a84284eSBram Moolenaar vim9script 13940a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 13950a84284eSBram Moolenaar assert_equal(1, thatOne) 13960a84284eSBram Moolenaar assert_equal('yes', yesYes) 13970a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 13980a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 13990a84284eSBram Moolenaar END 14000a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14010a84284eSBram Moolenaar 1402c967d57aSBram Moolenaar import_lines =<< trim END 1403c967d57aSBram Moolenaar vim9script 1404c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1405c967d57aSBram Moolenaar impSlist->add(123) 1406c967d57aSBram Moolenaar END 1407c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1408c967d57aSBram Moolenaar 14090a84284eSBram Moolenaar delete('XexportAs') 14100a84284eSBram Moolenaarenddef 14110a84284eSBram Moolenaar 1412803af686SBram Moolenaarfunc g:Trigger() 1413803af686SBram Moolenaar source Ximport.vim 1414803af686SBram Moolenaar return "echo 'yes'\<CR>" 1415803af686SBram Moolenaarendfunc 1416803af686SBram Moolenaar 1417803af686SBram Moolenaardef Test_import_export_expr_map() 1418803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1419cfcd011fSBram Moolenaar var export_lines =<< trim END 1420803af686SBram Moolenaar vim9script 1421803af686SBram Moolenaar export def That(): string 1422803af686SBram Moolenaar return 'yes' 1423803af686SBram Moolenaar enddef 1424803af686SBram Moolenaar END 1425803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1426803af686SBram Moolenaar 1427cfcd011fSBram Moolenaar var import_lines =<< trim END 1428803af686SBram Moolenaar vim9script 1429803af686SBram Moolenaar import That from './Xexport_that.vim' 1430803af686SBram Moolenaar assert_equal('yes', That()) 1431803af686SBram Moolenaar END 1432803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1433803af686SBram Moolenaar 1434803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1435803af686SBram Moolenaar feedkeys('trigger', "xt") 1436803af686SBram Moolenaar 1437730b2483SBram Moolenaar delete('Xexport_that.vim') 1438803af686SBram Moolenaar delete('Ximport.vim') 1439803af686SBram Moolenaar nunmap trigger 1440803af686SBram Moolenaarenddef 1441803af686SBram Moolenaar 14428e1986e3SBram Moolenaardef Test_import_in_filetype() 14438e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14448e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1445cfcd011fSBram Moolenaar var export_lines =<< trim END 14468e1986e3SBram Moolenaar vim9script 1447cfcd011fSBram Moolenaar export var That = 'yes' 14488e1986e3SBram Moolenaar END 1449730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 14508e1986e3SBram Moolenaar 1451cfcd011fSBram Moolenaar var import_lines =<< trim END 14528e1986e3SBram Moolenaar vim9script 1453730b2483SBram Moolenaar import That from './Xexport_ft.vim' 14548e1986e3SBram Moolenaar assert_equal('yes', That) 14558e1986e3SBram Moolenaar g:did_load_mytpe = 1 14568e1986e3SBram Moolenaar END 14578e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14588e1986e3SBram Moolenaar 1459cfcd011fSBram Moolenaar var save_rtp = &rtp 14608e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14618e1986e3SBram Moolenaar 14628e1986e3SBram Moolenaar filetype plugin on 14638e1986e3SBram Moolenaar copen 14648e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14658e1986e3SBram Moolenaar 14668e1986e3SBram Moolenaar quit! 1467730b2483SBram Moolenaar delete('Xexport_ft.vim') 14688e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14698e1986e3SBram Moolenaar &rtp = save_rtp 14708e1986e3SBram Moolenaarenddef 14718e1986e3SBram Moolenaar 1472efa94447SBram Moolenaardef Test_use_import_in_mapping() 1473cfcd011fSBram Moolenaar var lines =<< trim END 1474efa94447SBram Moolenaar vim9script 1475efa94447SBram Moolenaar export def Funcx() 1476efa94447SBram Moolenaar g:result = 42 1477efa94447SBram Moolenaar enddef 1478efa94447SBram Moolenaar END 1479efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1480efa94447SBram Moolenaar lines =<< trim END 1481efa94447SBram Moolenaar vim9script 1482efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1483b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1484efa94447SBram Moolenaar END 1485efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1486efa94447SBram Moolenaar 1487efa94447SBram Moolenaar source Xmapscript.vim 1488b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1489efa94447SBram Moolenaar assert_equal(42, g:result) 1490efa94447SBram Moolenaar 1491efa94447SBram Moolenaar unlet g:result 1492efa94447SBram Moolenaar delete('XsomeExport.vim') 1493efa94447SBram Moolenaar delete('Xmapscript.vim') 1494b3ca9824SBram Moolenaar nunmap <F3> 1495efa94447SBram Moolenaarenddef 1496efa94447SBram Moolenaar 1497d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1498d3f8a9eeSBram Moolenaar var lines =<< trim END 1499d3f8a9eeSBram Moolenaar if has(g:feature) 1500d3f8a9eeSBram Moolenaar " legacy script 1501d3f8a9eeSBram Moolenaar let g:legacy = 1 1502d3f8a9eeSBram Moolenaar finish 1503d3f8a9eeSBram Moolenaar endif 1504d3f8a9eeSBram Moolenaar vim9script 1505d3f8a9eeSBram Moolenaar g:legacy = 0 1506d3f8a9eeSBram Moolenaar END 1507d3f8a9eeSBram Moolenaar g:feature = 'eval' 1508d3f8a9eeSBram Moolenaar g:legacy = -1 1509d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1510d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1511d3f8a9eeSBram Moolenaar 1512d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1513d3f8a9eeSBram Moolenaar g:legacy = -1 1514d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1515d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1516d3f8a9eeSBram Moolenaarenddef 1517d3f8a9eeSBram Moolenaar 1518750802b5SBram Moolenaardef Test_vim9script_fails() 15198a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15208a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1521cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15229721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1523cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1524750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1525750802b5SBram Moolenaar 1526cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1527c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1528c785b9a7SBram Moolenaar 1529e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1530e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15318a7d6542SBram Moolenaarenddef 15328a7d6542SBram Moolenaar 1533f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1534101f4810SBram Moolenaar CheckRunVimInTerminal 1535101f4810SBram Moolenaar 15369bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1537c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15389bb3eb3eSBram Moolenaarendfunc 15399bb3eb3eSBram Moolenaar 1540c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1541cfcd011fSBram Moolenaar var export =<< trim END 1542101f4810SBram Moolenaar vim9script 1543101f4810SBram Moolenaar export def Foo(): number 1544101f4810SBram Moolenaar return 0 1545101f4810SBram Moolenaar enddef 1546101f4810SBram Moolenaar END 1547730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1548101f4810SBram Moolenaar 1549e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 15509bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 15512949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1552101f4810SBram Moolenaar 1553730b2483SBram Moolenaar delete('XexportCmd.vim') 15549bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 15559bb3eb3eSBram Moolenaarenddef 1556101f4810SBram Moolenaar 15572b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 15582b32700dSBram Moolenaar var lines =<< trim END 1559a6294955SBram Moolenaar vim9script 1560a6294955SBram Moolenaar export var exported = 'thexport' 1561a6294955SBram Moolenaar END 1562a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1563a6294955SBram Moolenaar lines =<< trim END 15642b32700dSBram Moolenaar vim9script noclear 15652b32700dSBram Moolenaar g:loadCount += 1 15662b32700dSBram Moolenaar var s:reloaded = 'init' 1567a6294955SBram Moolenaar import exported from './XExportReload' 15682b32700dSBram Moolenaar 15692b32700dSBram Moolenaar def Again(): string 15702b32700dSBram Moolenaar return 'again' 15712b32700dSBram Moolenaar enddef 15722b32700dSBram Moolenaar 15732b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 15742b32700dSBram Moolenaar var s:loaded = true 15752b32700dSBram Moolenaar 15762b32700dSBram Moolenaar var s:notReloaded = 'yes' 15772b32700dSBram Moolenaar s:reloaded = 'first' 15782b32700dSBram Moolenaar def g:Values(): list<string> 1579a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 15802b32700dSBram Moolenaar enddef 15812b32700dSBram Moolenaar 15822b32700dSBram Moolenaar def Once(): string 15832b32700dSBram Moolenaar return 'once' 15842b32700dSBram Moolenaar enddef 15852b32700dSBram Moolenaar END 15862b32700dSBram Moolenaar writefile(lines, 'XReloaded') 15872b32700dSBram Moolenaar g:loadCount = 0 15882b32700dSBram Moolenaar source XReloaded 15892b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1590a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 15912b32700dSBram Moolenaar source XReloaded 15922b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1593a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15942b32700dSBram Moolenaar source XReloaded 15952b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1596a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15972b32700dSBram Moolenaar 159848e11c10SBram Moolenaar delete('XReloaded') 1599a6294955SBram Moolenaar delete('XExportReload') 16002b32700dSBram Moolenaar delfunc g:Values 16012b32700dSBram Moolenaar unlet g:loadCount 1602577dc93dSBram Moolenaar 1603577dc93dSBram Moolenaar lines =<< trim END 1604577dc93dSBram Moolenaar vim9script 1605577dc93dSBram Moolenaar def Inner() 1606577dc93dSBram Moolenaar enddef 1607577dc93dSBram Moolenaar END 1608577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1609577dc93dSBram Moolenaar source XreloadScript.vim 1610577dc93dSBram Moolenaar 1611577dc93dSBram Moolenaar lines =<< trim END 1612577dc93dSBram Moolenaar vim9script 1613577dc93dSBram Moolenaar def Outer() 1614577dc93dSBram Moolenaar def Inner() 1615577dc93dSBram Moolenaar enddef 1616577dc93dSBram Moolenaar enddef 1617577dc93dSBram Moolenaar defcompile 1618577dc93dSBram Moolenaar END 1619577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1620577dc93dSBram Moolenaar source XreloadScript.vim 1621577dc93dSBram Moolenaar 1622577dc93dSBram Moolenaar delete('XreloadScript.vim') 16232b32700dSBram Moolenaarenddef 16242b32700dSBram Moolenaar 16254c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1626cfcd011fSBram Moolenaar var lines =<< trim END 16278a7d6542SBram Moolenaar vim9script 16288a7d6542SBram Moolenaar const var = '' 1629cfcd011fSBram Moolenaar var valone = 1234 16308a7d6542SBram Moolenaar def MyFunc(arg: string) 16318a7d6542SBram Moolenaar valone = 5678 16328a7d6542SBram Moolenaar enddef 16338a7d6542SBram Moolenaar END 1634cfcd011fSBram Moolenaar var morelines =<< trim END 1635cfcd011fSBram Moolenaar var valtwo = 222 16368a7d6542SBram Moolenaar export def GetValtwo(): number 16378a7d6542SBram Moolenaar return valtwo 16388a7d6542SBram Moolenaar enddef 16398a7d6542SBram Moolenaar END 164003afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16418a7d6542SBram Moolenaar source Xreload.vim 16428a7d6542SBram Moolenaar source Xreload.vim 16438a7d6542SBram Moolenaar source Xreload.vim 16448a7d6542SBram Moolenaar 1645f5be8cdbSBram Moolenaar # cannot declare a var twice 16468a7d6542SBram Moolenaar lines =<< trim END 16478a7d6542SBram Moolenaar vim9script 1648cfcd011fSBram Moolenaar var valone = 1234 1649cfcd011fSBram Moolenaar var valone = 5678 16508a7d6542SBram Moolenaar END 16518a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 165244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16538a7d6542SBram Moolenaar 16548a7d6542SBram Moolenaar delete('Xreload.vim') 16558a7d6542SBram Moolenaar delete('Ximport.vim') 16568a7d6542SBram Moolenaarenddef 16578a7d6542SBram Moolenaar 165807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 165907a65d26SBram Moolenaar" compiled function using that variable must fail. 166007a65d26SBram Moolenaardef Test_script_reload_change_type() 166107a65d26SBram Moolenaar var lines =<< trim END 166207a65d26SBram Moolenaar vim9script noclear 166307a65d26SBram Moolenaar var str = 'string' 166407a65d26SBram Moolenaar def g:GetStr(): string 166507a65d26SBram Moolenaar return str .. 'xxx' 166607a65d26SBram Moolenaar enddef 166707a65d26SBram Moolenaar END 166807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 166907a65d26SBram Moolenaar source Xreload.vim 167007a65d26SBram Moolenaar echo g:GetStr() 167107a65d26SBram Moolenaar 167207a65d26SBram Moolenaar lines =<< trim END 167307a65d26SBram Moolenaar vim9script noclear 167407a65d26SBram Moolenaar var str = 1234 167507a65d26SBram Moolenaar END 167607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 167707a65d26SBram Moolenaar source Xreload.vim 167807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 167907a65d26SBram Moolenaar 168007a65d26SBram Moolenaar delfunc g:GetStr 168107a65d26SBram Moolenaar delete('Xreload.vim') 168207a65d26SBram Moolenaarenddef 168307a65d26SBram Moolenaar 1684c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1685c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1686c970e422SBram Moolenaar 1687c970e422SBram Moolenaardef Test_script_reload_from_function() 1688c970e422SBram Moolenaar var lines =<< trim END 1689c970e422SBram Moolenaar vim9script 1690c970e422SBram Moolenaar 1691c970e422SBram Moolenaar if exists('g:loaded') 1692c970e422SBram Moolenaar finish 1693c970e422SBram Moolenaar endif 1694c970e422SBram Moolenaar g:loaded = 1 1695c970e422SBram Moolenaar delcommand CallFunc 1696c970e422SBram Moolenaar command CallFunc Func() 1697c970e422SBram Moolenaar def Func() 1698a4c81beaSBram Moolenaar so XreloadFunc.vim 1699c970e422SBram Moolenaar g:didTheFunc = 1 1700c970e422SBram Moolenaar enddef 1701c970e422SBram Moolenaar END 1702c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1703c970e422SBram Moolenaar source XreloadFunc.vim 1704c970e422SBram Moolenaar CallFunc 1705c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1706c970e422SBram Moolenaar 1707c970e422SBram Moolenaar delete('XreloadFunc.vim') 1708c970e422SBram Moolenaar delcommand CallFunc 1709c970e422SBram Moolenaar unlet g:loaded 1710c970e422SBram Moolenaar unlet g:didTheFunc 1711c970e422SBram Moolenaarenddef 1712c970e422SBram Moolenaar 17136c3843caSBram Moolenaardef Test_script_var_shadows_function() 17146c3843caSBram Moolenaar var lines =<< trim END 17156c3843caSBram Moolenaar vim9script 17166c3843caSBram Moolenaar def Func(): number 17176c3843caSBram Moolenaar return 123 17186c3843caSBram Moolenaar enddef 17196c3843caSBram Moolenaar var Func = 1 17206c3843caSBram Moolenaar END 17216c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17226c3843caSBram Moolenaarenddef 17236c3843caSBram Moolenaar 1724c323527dSBram Moolenaardef Test_script_var_shadows_command() 1725c323527dSBram Moolenaar var lines =<< trim END 1726c323527dSBram Moolenaar var undo = 1 1727c323527dSBram Moolenaar undo = 2 1728c323527dSBram Moolenaar assert_equal(2, undo) 1729c323527dSBram Moolenaar END 1730c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1731c323527dSBram Moolenaar 1732c323527dSBram Moolenaar lines =<< trim END 1733c323527dSBram Moolenaar var undo = 1 1734c323527dSBram Moolenaar undo 1735c323527dSBram Moolenaar END 1736c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1737c323527dSBram Moolenaarenddef 1738c323527dSBram Moolenaar 173995006e3dSBram Moolenaardef s:RetSome(): string 174095006e3dSBram Moolenaar return 'some' 174195006e3dSBram Moolenaarenddef 174295006e3dSBram Moolenaar 1743fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1744fe465a01SBram Moolenaar" script-local name. 1745fe465a01SBram Moolenaardef Test_vim9script_funcref() 1746cfcd011fSBram Moolenaar var sortlines =<< trim END 1747fe465a01SBram Moolenaar vim9script 1748fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1749bed36b93SBram Moolenaar return i2 - i1 1750fe465a01SBram Moolenaar enddef 1751fe465a01SBram Moolenaar 1752fe465a01SBram Moolenaar export def FastSort(): list<number> 1753fe465a01SBram Moolenaar return range(5)->sort(Compare) 1754fe465a01SBram Moolenaar enddef 1755529fb5a5SBram Moolenaar 1756529fb5a5SBram Moolenaar export def GetString(arg: string): string 1757529fb5a5SBram Moolenaar return arg 1758529fb5a5SBram Moolenaar enddef 1759fe465a01SBram Moolenaar END 1760fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1761fe465a01SBram Moolenaar 1762cfcd011fSBram Moolenaar var lines =<< trim END 1763fe465a01SBram Moolenaar vim9script 1764fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1765fe465a01SBram Moolenaar def Test() 1766fe465a01SBram Moolenaar g:result = FastSort() 1767fe465a01SBram Moolenaar enddef 1768fe465a01SBram Moolenaar Test() 1769529fb5a5SBram Moolenaar 1770529fb5a5SBram Moolenaar # using a function imported with "as" 1771529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1772529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1773529fb5a5SBram Moolenaar 1774529fb5a5SBram Moolenaar # using the function from a compiled function 1775529fb5a5SBram Moolenaar def TestMore(): string 1776ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1777ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1778529fb5a5SBram Moolenaar enddef 1779ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1780529fb5a5SBram Moolenaar 1781529fb5a5SBram Moolenaar # error when using a function that isn't exported 1782529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1783fe465a01SBram Moolenaar END 1784fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1785fe465a01SBram Moolenaar 1786fe465a01SBram Moolenaar source Xscript.vim 1787fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1788fe465a01SBram Moolenaar 1789fe465a01SBram Moolenaar unlet g:result 1790fe465a01SBram Moolenaar delete('Xsort.vim') 1791fe465a01SBram Moolenaar delete('Xscript.vim') 179295006e3dSBram Moolenaar 1793cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 179495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1795fe465a01SBram Moolenaarenddef 1796fe465a01SBram Moolenaar 1797601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1798601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1799601e76acSBram Moolenaar" function reference. 1800c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1801cfcd011fSBram Moolenaar var filterLines =<< trim END 1802c620c055SBram Moolenaar vim9script 1803c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1804c620c055SBram Moolenaar return idx % 2 == 1 1805c620c055SBram Moolenaar enddef 1806c620c055SBram Moolenaar export def FastFilter(): list<number> 1807c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1808c620c055SBram Moolenaar enddef 1809601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1810601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1811601e76acSBram Moolenaar enddef 1812c620c055SBram Moolenaar END 1813c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1814c620c055SBram Moolenaar 1815cfcd011fSBram Moolenaar var lines =<< trim END 1816c620c055SBram Moolenaar vim9script 1817601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1818c620c055SBram Moolenaar def Test() 1819cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1820c620c055SBram Moolenaar enddef 1821c620c055SBram Moolenaar Test() 1822601e76acSBram Moolenaar def TestDirect() 1823cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1824601e76acSBram Moolenaar enddef 1825601e76acSBram Moolenaar TestDirect() 1826c620c055SBram Moolenaar END 1827601e76acSBram Moolenaar CheckScriptSuccess(lines) 1828c620c055SBram Moolenaar delete('Xfilter.vim') 1829c620c055SBram Moolenaarenddef 1830c620c055SBram Moolenaar 18314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1832cfcd011fSBram Moolenaar var first_lines =<< trim END 18334c17ad94SBram Moolenaar vim9script 18344c17ad94SBram Moolenaar def FuncYes(): string 18354c17ad94SBram Moolenaar return 'yes' 18364c17ad94SBram Moolenaar enddef 18374c17ad94SBram Moolenaar END 1838cfcd011fSBram Moolenaar var withno_lines =<< trim END 18394c17ad94SBram Moolenaar def FuncNo(): string 18404c17ad94SBram Moolenaar return 'no' 18414c17ad94SBram Moolenaar enddef 18424c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 18434c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 18444c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 184503afdcf1SBram Moolenaar enddef 184603afdcf1SBram Moolenaar END 1847cfcd011fSBram Moolenaar var nono_lines =<< trim END 184803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 184903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 185044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 18514c17ad94SBram Moolenaar enddef 18524c17ad94SBram Moolenaar END 18534c17ad94SBram Moolenaar 18544c17ad94SBram Moolenaar # FuncNo() is defined 185503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18564c17ad94SBram Moolenaar source Xreloaded.vim 18574c17ad94SBram Moolenaar g:DoCheck(true) 18584c17ad94SBram Moolenaar 18594c17ad94SBram Moolenaar # FuncNo() is not redefined 186003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18614c17ad94SBram Moolenaar source Xreloaded.vim 18625082471fSBram Moolenaar g:DoCheck(false) 18634c17ad94SBram Moolenaar 18644c17ad94SBram Moolenaar # FuncNo() is back 186503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18664c17ad94SBram Moolenaar source Xreloaded.vim 18675082471fSBram Moolenaar g:DoCheck(false) 18684c17ad94SBram Moolenaar 18694c17ad94SBram Moolenaar delete('Xreloaded.vim') 18704c17ad94SBram Moolenaarenddef 18714c17ad94SBram Moolenaar 187289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 187389483d40SBram Moolenaar # write the script with a script-local variable 1874cfcd011fSBram Moolenaar var lines =<< trim END 187589483d40SBram Moolenaar vim9script 1876cfcd011fSBram Moolenaar var name = 'string' 187789483d40SBram Moolenaar END 187889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 187989483d40SBram Moolenaar source XreloadVar.vim 188089483d40SBram Moolenaar 188189483d40SBram Moolenaar # now write the script using the same variable locally - works 188289483d40SBram Moolenaar lines =<< trim END 188389483d40SBram Moolenaar vim9script 188489483d40SBram Moolenaar def Func() 1885cfcd011fSBram Moolenaar var name = 'string' 188689483d40SBram Moolenaar enddef 188789483d40SBram Moolenaar END 188889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 188989483d40SBram Moolenaar source XreloadVar.vim 189089483d40SBram Moolenaar 189189483d40SBram Moolenaar delete('XreloadVar.vim') 189289483d40SBram Moolenaarenddef 189389483d40SBram Moolenaar 18948a7d6542SBram Moolenaardef Test_import_absolute() 1895cfcd011fSBram Moolenaar var import_lines = [ 1896e6085c53SBram Moolenaar 'vim9script', 1897e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1898e6085c53SBram Moolenaar 'def UseExported()', 1899e6085c53SBram Moolenaar ' g:imported_abs = exported', 1900e6085c53SBram Moolenaar ' exported = 8888', 1901e6085c53SBram Moolenaar ' g:imported_after = exported', 1902e6085c53SBram Moolenaar 'enddef', 1903e6085c53SBram Moolenaar 'UseExported()', 1904e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1905e6085c53SBram Moolenaar ] 19068a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19078a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19088a7d6542SBram Moolenaar 19098a7d6542SBram Moolenaar source Ximport_abs.vim 19108a7d6542SBram Moolenaar 19118a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19124e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1913fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1914fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1915fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1916fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1917fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1918fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1919fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1920fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1921fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1922fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1923e6085c53SBram Moolenaar g:import_disassembled) 1924b3ca9824SBram Moolenaar 1925b3ca9824SBram Moolenaar Undo_export_script_lines() 19268a7d6542SBram Moolenaar unlet g:imported_abs 19274e12a5dfSBram Moolenaar unlet g:import_disassembled 19288a7d6542SBram Moolenaar 19298a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19308a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19318a7d6542SBram Moolenaarenddef 19328a7d6542SBram Moolenaar 19338a7d6542SBram Moolenaardef Test_import_rtp() 1934cfcd011fSBram Moolenaar var import_lines = [ 1935e6085c53SBram Moolenaar 'vim9script', 1936e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1937e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1938e6085c53SBram Moolenaar ] 19398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 1940b885a7c7SBram Moolenaar mkdir('import', 'p') 1941b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 19428a7d6542SBram Moolenaar 1943cfcd011fSBram Moolenaar var save_rtp = &rtp 19448a7d6542SBram Moolenaar &rtp = getcwd() 19458a7d6542SBram Moolenaar source Ximport_rtp.vim 19468a7d6542SBram Moolenaar &rtp = save_rtp 19478a7d6542SBram Moolenaar 19488a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 19498a7d6542SBram Moolenaar 1950b3ca9824SBram Moolenaar Undo_export_script_lines() 1951b3ca9824SBram Moolenaar unlet g:imported_rtp 19528a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 1953b885a7c7SBram Moolenaar delete('import', 'rf') 19548a7d6542SBram Moolenaarenddef 19558a7d6542SBram Moolenaar 195625e0f586SBram Moolenaardef Test_import_compile_error() 1957cfcd011fSBram Moolenaar var export_lines = [ 195825e0f586SBram Moolenaar 'vim9script', 195925e0f586SBram Moolenaar 'export def ExpFunc(): string', 196025e0f586SBram Moolenaar ' return notDefined', 196125e0f586SBram Moolenaar 'enddef', 196225e0f586SBram Moolenaar ] 196325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 196425e0f586SBram Moolenaar 1965cfcd011fSBram Moolenaar var import_lines = [ 196625e0f586SBram Moolenaar 'vim9script', 196725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 196825e0f586SBram Moolenaar 'def ImpFunc()', 196925e0f586SBram Moolenaar ' echo ExpFunc()', 197025e0f586SBram Moolenaar 'enddef', 197125e0f586SBram Moolenaar 'defcompile', 197225e0f586SBram Moolenaar ] 197325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 197425e0f586SBram Moolenaar 197525e0f586SBram Moolenaar try 197625e0f586SBram Moolenaar source Ximport.vim 197725e0f586SBram Moolenaar catch /E1001/ 1978f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 19797707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 198025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 198125e0f586SBram Moolenaar endtry 198225e0f586SBram Moolenaar 198325e0f586SBram Moolenaar delete('Xexported.vim') 198425e0f586SBram Moolenaar delete('Ximport.vim') 198525e0f586SBram Moolenaarenddef 198625e0f586SBram Moolenaar 1987c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1988cfcd011fSBram Moolenaar var lines = [ 1989c4ce36d4SBram Moolenaar 'vim9script', 1990c4ce36d4SBram Moolenaar 'def Func()', 1991c4ce36d4SBram Moolenaar ' eval [][0]', 1992c4ce36d4SBram Moolenaar 'enddef', 1993c4ce36d4SBram Moolenaar 'Func()', 1994c4ce36d4SBram Moolenaar ] 1995c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1996c4ce36d4SBram Moolenaar 1997c4ce36d4SBram Moolenaar for count in range(3) 1998c4ce36d4SBram Moolenaar try 1999c4ce36d4SBram Moolenaar source Xtestscript.vim 2000c4ce36d4SBram Moolenaar catch /E684/ 2001c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2002c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2003c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2004c4ce36d4SBram Moolenaar endtry 2005c4ce36d4SBram Moolenaar endfor 2006c4ce36d4SBram Moolenaar 2007c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2008c4ce36d4SBram Moolenaarenddef 2009c4ce36d4SBram Moolenaar 2010eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2011cfcd011fSBram Moolenaar var export_lines =<< trim END 2012eef2102eSBram Moolenaar vim9script 2013eef2102eSBram Moolenaar export def Func() 2014eef2102eSBram Moolenaar echo 'imported' 2015eef2102eSBram Moolenaar enddef 2016eef2102eSBram Moolenaar END 2017eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2018eef2102eSBram Moolenaar 2019cfcd011fSBram Moolenaar var lines =<< trim END 2020eef2102eSBram Moolenaar vim9script 2021eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2022eef2102eSBram Moolenaar def Func() 2023eef2102eSBram Moolenaar echo 'local to function' 2024eef2102eSBram Moolenaar enddef 2025eef2102eSBram Moolenaar END 2026eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2027eef2102eSBram Moolenaar 2028eef2102eSBram Moolenaar lines =<< trim END 2029eef2102eSBram Moolenaar vim9script 2030eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2031eef2102eSBram Moolenaar def Outer() 2032eef2102eSBram Moolenaar def Func() 2033eef2102eSBram Moolenaar echo 'local to function' 2034eef2102eSBram Moolenaar enddef 2035eef2102eSBram Moolenaar enddef 2036eef2102eSBram Moolenaar defcompile 2037eef2102eSBram Moolenaar END 2038eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2039eef2102eSBram Moolenaar 2040eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2041eef2102eSBram Moolenaarenddef 2042eef2102eSBram Moolenaar 2043b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2044cfcd011fSBram Moolenaar var lines =<< trim END 2045b9a2cac3SBram Moolenaar vim9script 2046b9a2cac3SBram Moolenaar def Func() 2047b9a2cac3SBram Moolenaar echo 'one' 2048b9a2cac3SBram Moolenaar enddef 2049b9a2cac3SBram Moolenaar def Func() 2050b9a2cac3SBram Moolenaar echo 'two' 2051b9a2cac3SBram Moolenaar enddef 2052b9a2cac3SBram Moolenaar END 2053b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2054fa211f3cSBram Moolenaar 2055fa211f3cSBram Moolenaar lines =<< trim END 2056fa211f3cSBram Moolenaar vim9script 2057fa211f3cSBram Moolenaar def Foo(): string 2058fa211f3cSBram Moolenaar return 'foo' 2059fa211f3cSBram Moolenaar enddef 2060fa211f3cSBram Moolenaar def Func() 2061cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2062fa211f3cSBram Moolenaar enddef 2063fa211f3cSBram Moolenaar defcompile 2064fa211f3cSBram Moolenaar END 2065fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2066b9a2cac3SBram Moolenaarenddef 2067b9a2cac3SBram Moolenaar 20688a7d6542SBram Moolenaardef Test_fixed_size_list() 2069f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2070cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 20718a7d6542SBram Moolenaar l->remove(0) 20728a7d6542SBram Moolenaar l->add(5) 20738a7d6542SBram Moolenaar l->insert(99, 1) 20740f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 20758a7d6542SBram Moolenaarenddef 20768a7d6542SBram Moolenaar 2077ae616494SBram Moolenaardef Test_no_insert_xit() 2078d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2079d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2080d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2081d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2082d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2083ae616494SBram Moolenaar 2084ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2085ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2086ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2087ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2088f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2089f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 20906508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 20916508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2092f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2093f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2094f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2095ae616494SBram Moolenaarenddef 2096ae616494SBram Moolenaar 2097158906cfSBram Moolenaardef IfElse(what: number): string 2098cfcd011fSBram Moolenaar var res = '' 2099158906cfSBram Moolenaar if what == 1 2100158906cfSBram Moolenaar res = "one" 2101158906cfSBram Moolenaar elseif what == 2 2102158906cfSBram Moolenaar res = "two" 2103a259d8d3SBram Moolenaar else 2104158906cfSBram Moolenaar res = "three" 2105a259d8d3SBram Moolenaar endif 2106158906cfSBram Moolenaar return res 2107a259d8d3SBram Moolenaarenddef 2108a259d8d3SBram Moolenaar 2109158906cfSBram Moolenaardef Test_if_elseif_else() 2110158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2111158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2112158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21130f18b6d1SBram Moolenaarenddef 21140f18b6d1SBram Moolenaar 2115e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2116d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2117d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2118d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2119ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2120d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21216628b7ebSBram Moolenaar 21226628b7ebSBram Moolenaar var lines =<< trim END 21236628b7ebSBram Moolenaar var s = '' 21246628b7ebSBram Moolenaar if s = '' 21256628b7ebSBram Moolenaar endif 21266628b7ebSBram Moolenaar END 21276628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 21286628b7ebSBram Moolenaar 21296628b7ebSBram Moolenaar lines =<< trim END 21306628b7ebSBram Moolenaar var s = '' 21316628b7ebSBram Moolenaar if s == '' 21326628b7ebSBram Moolenaar elseif s = '' 21336628b7ebSBram Moolenaar endif 21346628b7ebSBram Moolenaar END 21356628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2136e8c4abbbSBram Moolenaarenddef 2137e8c4abbbSBram Moolenaar 21386d69bf60SBram Moolenaarlet g:bool_true = v:true 21396d69bf60SBram Moolenaarlet g:bool_false = v:false 21406d69bf60SBram Moolenaar 21416d69bf60SBram Moolenaardef Test_if_const_expr() 2142cfcd011fSBram Moolenaar var res = false 21436d69bf60SBram Moolenaar if true ? true : false 21446d69bf60SBram Moolenaar res = true 21456d69bf60SBram Moolenaar endif 21466d69bf60SBram Moolenaar assert_equal(true, res) 21476d69bf60SBram Moolenaar 2148585fea7bSBram Moolenaar g:glob = 2 2149585fea7bSBram Moolenaar if false 21506797966dSBram Moolenaar execute('g:glob = 3') 2151585fea7bSBram Moolenaar endif 2152585fea7bSBram Moolenaar assert_equal(2, g:glob) 2153585fea7bSBram Moolenaar if true 21546797966dSBram Moolenaar execute('g:glob = 3') 2155585fea7bSBram Moolenaar endif 2156585fea7bSBram Moolenaar assert_equal(3, g:glob) 2157585fea7bSBram Moolenaar 21586d69bf60SBram Moolenaar res = false 21596d69bf60SBram Moolenaar if g:bool_true ? true : false 21606d69bf60SBram Moolenaar res = true 21616d69bf60SBram Moolenaar endif 21626d69bf60SBram Moolenaar assert_equal(true, res) 21636d69bf60SBram Moolenaar 21646d69bf60SBram Moolenaar res = false 21656d69bf60SBram Moolenaar if true ? g:bool_true : false 21666d69bf60SBram Moolenaar res = true 21676d69bf60SBram Moolenaar endif 21686d69bf60SBram Moolenaar assert_equal(true, res) 21696d69bf60SBram Moolenaar 21706d69bf60SBram Moolenaar res = false 21716d69bf60SBram Moolenaar if true ? true : g:bool_false 21726d69bf60SBram Moolenaar res = true 21736d69bf60SBram Moolenaar endif 21746d69bf60SBram Moolenaar assert_equal(true, res) 21756d69bf60SBram Moolenaar 21766d69bf60SBram Moolenaar res = false 21776d69bf60SBram Moolenaar if true ? false : true 21786d69bf60SBram Moolenaar res = true 21796d69bf60SBram Moolenaar endif 21806d69bf60SBram Moolenaar assert_equal(false, res) 21816d69bf60SBram Moolenaar 21826d69bf60SBram Moolenaar res = false 21836d69bf60SBram Moolenaar if false ? false : true 21846d69bf60SBram Moolenaar res = true 21856d69bf60SBram Moolenaar endif 21866d69bf60SBram Moolenaar assert_equal(true, res) 21876d69bf60SBram Moolenaar 21886d69bf60SBram Moolenaar res = false 21896d69bf60SBram Moolenaar if false ? true : false 21906d69bf60SBram Moolenaar res = true 21916d69bf60SBram Moolenaar endif 21926d69bf60SBram Moolenaar assert_equal(false, res) 21936d69bf60SBram Moolenaar 21946d69bf60SBram Moolenaar res = false 2195e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2196e8c4abbbSBram Moolenaar res = true 2197e8c4abbbSBram Moolenaar endif 2198e8c4abbbSBram Moolenaar assert_equal(false, res) 2199e8c4abbbSBram Moolenaar 2200e8c4abbbSBram Moolenaar res = false 22016d69bf60SBram Moolenaar if true && true 22026d69bf60SBram Moolenaar res = true 22036d69bf60SBram Moolenaar endif 22046d69bf60SBram Moolenaar assert_equal(true, res) 22056d69bf60SBram Moolenaar 22066d69bf60SBram Moolenaar res = false 22076d69bf60SBram Moolenaar if true && false 22086d69bf60SBram Moolenaar res = true 22096d69bf60SBram Moolenaar endif 22106d69bf60SBram Moolenaar assert_equal(false, res) 22116d69bf60SBram Moolenaar 22126d69bf60SBram Moolenaar res = false 22136d69bf60SBram Moolenaar if g:bool_true && false 22146d69bf60SBram Moolenaar res = true 22156d69bf60SBram Moolenaar endif 22166d69bf60SBram Moolenaar assert_equal(false, res) 22176d69bf60SBram Moolenaar 22186d69bf60SBram Moolenaar res = false 22196d69bf60SBram Moolenaar if true && g:bool_false 22206d69bf60SBram Moolenaar res = true 22216d69bf60SBram Moolenaar endif 22226d69bf60SBram Moolenaar assert_equal(false, res) 22236d69bf60SBram Moolenaar 22246d69bf60SBram Moolenaar res = false 22256d69bf60SBram Moolenaar if false && false 22266d69bf60SBram Moolenaar res = true 22276d69bf60SBram Moolenaar endif 22286d69bf60SBram Moolenaar assert_equal(false, res) 22296d69bf60SBram Moolenaar 22306d69bf60SBram Moolenaar res = false 22316d69bf60SBram Moolenaar if true || false 22326d69bf60SBram Moolenaar res = true 22336d69bf60SBram Moolenaar endif 22346d69bf60SBram Moolenaar assert_equal(true, res) 22356d69bf60SBram Moolenaar 22366d69bf60SBram Moolenaar res = false 22376d69bf60SBram Moolenaar if g:bool_true || false 22386d69bf60SBram Moolenaar res = true 22396d69bf60SBram Moolenaar endif 22406d69bf60SBram Moolenaar assert_equal(true, res) 22416d69bf60SBram Moolenaar 22426d69bf60SBram Moolenaar res = false 22436d69bf60SBram Moolenaar if true || g:bool_false 22446d69bf60SBram Moolenaar res = true 22456d69bf60SBram Moolenaar endif 22466d69bf60SBram Moolenaar assert_equal(true, res) 22476d69bf60SBram Moolenaar 22486d69bf60SBram Moolenaar res = false 22496d69bf60SBram Moolenaar if false || false 22506d69bf60SBram Moolenaar res = true 22516d69bf60SBram Moolenaar endif 22526d69bf60SBram Moolenaar assert_equal(false, res) 22533988f64fSBram Moolenaar 22543988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2255c323527dSBram Moolenaar if false | eval 1 + 2 | endif 22563988f64fSBram Moolenaar if false | eval burp + 234 | endif 22573988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22583988f64fSBram Moolenaar if false 22593988f64fSBram Moolenaar burp 22603988f64fSBram Moolenaar endif 226180c34ca3SBram Moolenaarenddef 22626d69bf60SBram Moolenaar 226380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2264d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2265d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2266d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2267d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 22686d69bf60SBram Moolenaarenddef 22696d69bf60SBram Moolenaar 227072abcf42SBram Moolenaardef RunNested(i: number): number 2271cfcd011fSBram Moolenaar var x: number = 0 227272abcf42SBram Moolenaar if i % 2 227372abcf42SBram Moolenaar if 1 2274f5be8cdbSBram Moolenaar # comment 227572abcf42SBram Moolenaar else 2276f5be8cdbSBram Moolenaar # comment 227772abcf42SBram Moolenaar endif 227872abcf42SBram Moolenaar x += 1 227972abcf42SBram Moolenaar else 228072abcf42SBram Moolenaar x += 1000 228172abcf42SBram Moolenaar endif 228272abcf42SBram Moolenaar return x 228372abcf42SBram Moolenaarenddef 228472abcf42SBram Moolenaar 228572abcf42SBram Moolenaardef Test_nested_if() 228672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 228772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 228872abcf42SBram Moolenaarenddef 228972abcf42SBram Moolenaar 2290ad39c094SBram Moolenaardef Test_execute_cmd() 2291e4984290SBram Moolenaar # missing argument is ignored 2292e4984290SBram Moolenaar execute 2293e4984290SBram Moolenaar execute # comment 2294e4984290SBram Moolenaar 2295ad39c094SBram Moolenaar new 2296ad39c094SBram Moolenaar setline(1, 'default') 2297d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2298ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2299a72cfb80SBram Moolenaar 2300d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2301a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2302a72cfb80SBram Moolenaar 2303cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2304cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2305a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2306ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2307a72cfb80SBram Moolenaar 2308d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2309ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2310a72cfb80SBram Moolenaar 2311cfcd011fSBram Moolenaar var cmd_first = 'call ' 2312cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2313ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2314ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2315ad39c094SBram Moolenaar bwipe! 2316585fea7bSBram Moolenaar 2317cfcd011fSBram Moolenaar var n = true 23182d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23192d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23202d6b20d6SBram Moolenaar 2321e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2322e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2323e5abf7afSBram Moolenaar 2324d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2325d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2326d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2327ad39c094SBram Moolenaarenddef 2328ad39c094SBram Moolenaar 232947e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2330f5be8cdbSBram Moolenaar # only checks line continuation 2331cfcd011fSBram Moolenaar var lines =<< trim END 233247e880d6SBram Moolenaar vim9script 233347e880d6SBram Moolenaar execute 'g:someVar' 233447e880d6SBram Moolenaar .. ' = ' .. 233547e880d6SBram Moolenaar '28' 233647e880d6SBram Moolenaar assert_equal(28, g:someVar) 233747e880d6SBram Moolenaar unlet g:someVar 233847e880d6SBram Moolenaar END 233947e880d6SBram Moolenaar CheckScriptSuccess(lines) 234047e880d6SBram Moolenaarenddef 234147e880d6SBram Moolenaar 2342ad39c094SBram Moolenaardef Test_echo_cmd() 2343a72cfb80SBram Moolenaar echo 'some' # comment 2344585fea7bSBram Moolenaar echon 'thing' 2345ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2346ad39c094SBram Moolenaar 2347a72cfb80SBram Moolenaar echo "some" # comment 2348a72cfb80SBram Moolenaar echon "thing" 2349a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2350a72cfb80SBram Moolenaar 2351cfcd011fSBram Moolenaar var str1 = 'some' 2352cfcd011fSBram Moolenaar var str2 = 'more' 2353ad39c094SBram Moolenaar echo str1 str2 2354ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2355a72cfb80SBram Moolenaar 2356d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2357ad39c094SBram Moolenaarenddef 2358ad39c094SBram Moolenaar 2359f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2360f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2361f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2362f93c7feaSBram Moolenaar echo 'clear' 2363df069eecSBram Moolenaar :1messages 2364f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2365f93c7feaSBram Moolenaar 2366d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2367f93c7feaSBram Moolenaarenddef 2368f93c7feaSBram Moolenaar 236947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2370f5be8cdbSBram Moolenaar # only checks line continuation 2371cfcd011fSBram Moolenaar var lines =<< trim END 237247e880d6SBram Moolenaar vim9script 237347e880d6SBram Moolenaar echomsg 'here' 237447e880d6SBram Moolenaar .. ' is ' .. 237547e880d6SBram Moolenaar 'a message' 237647e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 237747e880d6SBram Moolenaar END 237847e880d6SBram Moolenaar CheckScriptSuccess(lines) 237947e880d6SBram Moolenaarenddef 238047e880d6SBram Moolenaar 2381f93c7feaSBram Moolenaardef Test_echoerr_cmd() 238240ee466cSBram Moolenaar try 238340ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 238440ee466cSBram Moolenaar catch 238540ee466cSBram Moolenaar assert_match('something wrong', v:exception) 238640ee466cSBram Moolenaar endtry 2387f93c7feaSBram Moolenaarenddef 2388f93c7feaSBram Moolenaar 238947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2390f5be8cdbSBram Moolenaar # only checks line continuation 2391cfcd011fSBram Moolenaar var lines =<< trim END 239247e880d6SBram Moolenaar vim9script 239347e880d6SBram Moolenaar try 239447e880d6SBram Moolenaar echoerr 'this' 239547e880d6SBram Moolenaar .. ' is ' .. 239647e880d6SBram Moolenaar 'wrong' 239747e880d6SBram Moolenaar catch 239847e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 239947e880d6SBram Moolenaar endtry 240047e880d6SBram Moolenaar END 240147e880d6SBram Moolenaar CheckScriptSuccess(lines) 240247e880d6SBram Moolenaarenddef 240347e880d6SBram Moolenaar 240441fe0617SBram Moolenaardef Test_for_outside_of_function() 2405cfcd011fSBram Moolenaar var lines =<< trim END 240641fe0617SBram Moolenaar vim9script 240741fe0617SBram Moolenaar new 240841fe0617SBram Moolenaar for var in range(0, 3) 240941fe0617SBram Moolenaar append(line('$'), var) 241041fe0617SBram Moolenaar endfor 241141fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 241241fe0617SBram Moolenaar bwipe! 2413522eefd9SBram Moolenaar 2414522eefd9SBram Moolenaar var result = '' 2415522eefd9SBram Moolenaar for i in [1, 2, 3] 2416522eefd9SBram Moolenaar var loop = ' loop ' .. i 2417522eefd9SBram Moolenaar result ..= loop 2418522eefd9SBram Moolenaar endfor 2419522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 242041fe0617SBram Moolenaar END 242141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 242241fe0617SBram Moolenaar source Xvim9for.vim 242341fe0617SBram Moolenaar delete('Xvim9for.vim') 242441fe0617SBram Moolenaarenddef 24258a7d6542SBram Moolenaar 2426e8c4abbbSBram Moolenaardef Test_for_loop() 2427f2253963SBram Moolenaar var lines =<< trim END 2428cfcd011fSBram Moolenaar var result = '' 2429e8c4abbbSBram Moolenaar for cnt in range(7) 2430e8c4abbbSBram Moolenaar if cnt == 4 2431e8c4abbbSBram Moolenaar break 2432e8c4abbbSBram Moolenaar endif 2433e8c4abbbSBram Moolenaar if cnt == 2 2434e8c4abbbSBram Moolenaar continue 2435e8c4abbbSBram Moolenaar endif 2436e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2437e8c4abbbSBram Moolenaar endfor 2438e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24390ad3e894SBram Moolenaar 2440cfcd011fSBram Moolenaar var concat = '' 24410ad3e894SBram Moolenaar for str in eval('["one", "two"]') 24420ad3e894SBram Moolenaar concat ..= str 24430ad3e894SBram Moolenaar endfor 24440ad3e894SBram Moolenaar assert_equal('onetwo', concat) 244538bd8de5SBram Moolenaar 244638bd8de5SBram Moolenaar var total = 0 244738bd8de5SBram Moolenaar for nr in 244838bd8de5SBram Moolenaar [1, 2, 3] 244938bd8de5SBram Moolenaar total += nr 245038bd8de5SBram Moolenaar endfor 245138bd8de5SBram Moolenaar assert_equal(6, total) 245238bd8de5SBram Moolenaar 245338bd8de5SBram Moolenaar total = 0 245438bd8de5SBram Moolenaar for nr 245538bd8de5SBram Moolenaar in [1, 2, 3] 245638bd8de5SBram Moolenaar total += nr 245738bd8de5SBram Moolenaar endfor 245838bd8de5SBram Moolenaar assert_equal(6, total) 245938bd8de5SBram Moolenaar 246038bd8de5SBram Moolenaar total = 0 246138bd8de5SBram Moolenaar for nr 246238bd8de5SBram Moolenaar in 246338bd8de5SBram Moolenaar [1, 2, 3] 246438bd8de5SBram Moolenaar total += nr 246538bd8de5SBram Moolenaar endfor 246638bd8de5SBram Moolenaar assert_equal(6, total) 2467036d0714SBram Moolenaar 2468a3589a0dSBram Moolenaar # with type 2469a3589a0dSBram Moolenaar total = 0 2470a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2471a3589a0dSBram Moolenaar total += n 2472a3589a0dSBram Moolenaar endfor 2473a3589a0dSBram Moolenaar assert_equal(6, total) 2474a3589a0dSBram Moolenaar 2475fe090eb5SBram Moolenaar var chars = '' 2476fe090eb5SBram Moolenaar for s: string in 'foobar' 2477fe090eb5SBram Moolenaar chars ..= s 2478fe090eb5SBram Moolenaar endfor 2479fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2480fe090eb5SBram Moolenaar 24815ede5b23SBram Moolenaar chars = '' 24825ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 24835ede5b23SBram Moolenaar chars ..= x 24845ede5b23SBram Moolenaar endfor 24855ede5b23SBram Moolenaar assert_equal('ab', chars) 24865ede5b23SBram Moolenaar 2487a3589a0dSBram Moolenaar # unpack with type 2488f2253963SBram Moolenaar var res = '' 2489a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2490a3589a0dSBram Moolenaar res ..= n .. s 2491a3589a0dSBram Moolenaar endfor 2492a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2493a3589a0dSBram Moolenaar 2494444d8783SBram Moolenaar # unpack with one var 2495444d8783SBram Moolenaar var reslist = [] 2496444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2497444d8783SBram Moolenaar reslist->add(x) 2498444d8783SBram Moolenaar endfor 2499444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2500444d8783SBram Moolenaar 2501a3589a0dSBram Moolenaar # loop over string 2502a3589a0dSBram Moolenaar res = '' 250374e54fcbSBram Moolenaar for c in 'aéc̀d' 250474e54fcbSBram Moolenaar res ..= c .. '-' 250574e54fcbSBram Moolenaar endfor 250674e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 250774e54fcbSBram Moolenaar 250874e54fcbSBram Moolenaar res = '' 250974e54fcbSBram Moolenaar for c in '' 251074e54fcbSBram Moolenaar res ..= c .. '-' 251174e54fcbSBram Moolenaar endfor 251274e54fcbSBram Moolenaar assert_equal('', res) 251374e54fcbSBram Moolenaar 251474e54fcbSBram Moolenaar res = '' 251574e54fcbSBram Moolenaar for c in test_null_string() 251674e54fcbSBram Moolenaar res ..= c .. '-' 251774e54fcbSBram Moolenaar endfor 251874e54fcbSBram Moolenaar assert_equal('', res) 2519f2253963SBram Moolenaar 2520f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2521f2253963SBram Moolenaar {a: 'Cat'} 2522f2253963SBram Moolenaar ] 2523f2253963SBram Moolenaar for dd in foo 2524f2253963SBram Moolenaar dd.counter = 12 2525f2253963SBram Moolenaar endfor 2526f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2527ad2d4969SBram Moolenaar 2528ad2d4969SBram Moolenaar reslist = [] 2529ad2d4969SBram Moolenaar for _ in range(3) 2530ad2d4969SBram Moolenaar reslist->add('x') 2531ad2d4969SBram Moolenaar endfor 2532ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2533f2253963SBram Moolenaar END 2534f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2535e8c4abbbSBram Moolenaarenddef 2536e8c4abbbSBram Moolenaar 2537e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2538442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2539442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2540442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2541442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2542442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2543442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2544d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2545822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 25462d870f8dSBram Moolenaar delfunc! g:Func 2547675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2548675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2549675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 255074e54fcbSBram Moolenaar 255174e54fcbSBram Moolenaar # wrong type detected at compile time 255274e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 255374e54fcbSBram Moolenaar 255474e54fcbSBram Moolenaar # wrong type detected at runtime 255574e54fcbSBram Moolenaar g:adict = {a: 1} 255674e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 255774e54fcbSBram Moolenaar unlet g:adict 2558f6a8d420SBram Moolenaar 2559f6a8d420SBram Moolenaar var lines =<< trim END 2560f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2561f6a8d420SBram Moolenaar for e in d 2562f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2563f6a8d420SBram Moolenaar endfor 2564f6a8d420SBram Moolenaar END 2565f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2566fe090eb5SBram Moolenaar 2567fe090eb5SBram Moolenaar lines =<< trim END 2568fe090eb5SBram Moolenaar for nr: number in ['foo'] 2569fe090eb5SBram Moolenaar endfor 2570fe090eb5SBram Moolenaar END 2571fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2572404557e6SBram Moolenaar 2573404557e6SBram Moolenaar lines =<< trim END 2574404557e6SBram Moolenaar for n : number in [1, 2] 2575404557e6SBram Moolenaar echo n 2576404557e6SBram Moolenaar endfor 2577404557e6SBram Moolenaar END 2578404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2579efc5db52SBram Moolenaar 2580efc5db52SBram Moolenaar lines =<< trim END 2581efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2582efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2583efc5db52SBram Moolenaar echo k v 2584efc5db52SBram Moolenaar endfor 2585efc5db52SBram Moolenaar END 2586efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2587e8c4abbbSBram Moolenaarenddef 2588e8c4abbbSBram Moolenaar 2589ea87069dSBram Moolenaardef Test_for_loop_script_var() 2590ea87069dSBram Moolenaar # cannot use s:var in a :def function 2591ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2592ea87069dSBram Moolenaar 2593ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2594ea87069dSBram Moolenaar var lines =<< trim END 2595ea87069dSBram Moolenaar vim9script 2596ea87069dSBram Moolenaar var total = 0 2597ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2598ea87069dSBram Moolenaar total += s:var 2599ea87069dSBram Moolenaar endfor 2600ea87069dSBram Moolenaar assert_equal(6, total) 2601ea87069dSBram Moolenaar 2602ea87069dSBram Moolenaar total = 0 2603ea87069dSBram Moolenaar for var in [1, 2, 3] 2604ea87069dSBram Moolenaar total += var 2605ea87069dSBram Moolenaar endfor 2606ea87069dSBram Moolenaar assert_equal(6, total) 2607ea87069dSBram Moolenaar END 2608ea87069dSBram Moolenaarenddef 2609ea87069dSBram Moolenaar 2610792f786aSBram Moolenaardef Test_for_loop_unpack() 26114b8a0651SBram Moolenaar var lines =<< trim END 2612792f786aSBram Moolenaar var result = [] 2613792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2614792f786aSBram Moolenaar result->add(v1) 2615792f786aSBram Moolenaar result->add(v2) 2616792f786aSBram Moolenaar endfor 2617792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2618792f786aSBram Moolenaar 2619792f786aSBram Moolenaar result = [] 2620792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2621792f786aSBram Moolenaar result->add(v1) 2622792f786aSBram Moolenaar result->add(v2) 2623792f786aSBram Moolenaar result->add(v3) 2624792f786aSBram Moolenaar endfor 2625792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2626792f786aSBram Moolenaar 26274b8a0651SBram Moolenaar result = [] 26284b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 26294b8a0651SBram Moolenaar result->add(&ts) 26304b8a0651SBram Moolenaar result->add(&sw) 26314b8a0651SBram Moolenaar endfor 26324b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 26334b8a0651SBram Moolenaar 26344b8a0651SBram Moolenaar var slist: list<string> 26354b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 26364b8a0651SBram Moolenaar slist->add($LOOPVAR) 26374b8a0651SBram Moolenaar slist->add(@r) 26384b8a0651SBram Moolenaar slist->add(v:errmsg) 26394b8a0651SBram Moolenaar endfor 26404b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 26414b8a0651SBram Moolenaar 26424b8a0651SBram Moolenaar slist = [] 26434b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 26444b8a0651SBram Moolenaar slist->add(g:globalvar) 26454b8a0651SBram Moolenaar slist->add(b:bufvar) 26464b8a0651SBram Moolenaar slist->add(w:winvar) 26474b8a0651SBram Moolenaar slist->add(t:tabvar) 26484b8a0651SBram Moolenaar endfor 26494b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2650f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2651b777da9bSBram Moolenaar 2652b777da9bSBram Moolenaar var res = [] 2653b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2654b777da9bSBram Moolenaar res->add(n) 2655b777da9bSBram Moolenaar endfor 2656b777da9bSBram Moolenaar assert_equal([2, 5], res) 26574b8a0651SBram Moolenaar END 26584b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 26594b8a0651SBram Moolenaar 26604b8a0651SBram Moolenaar lines =<< trim END 2661792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2662792f786aSBram Moolenaar echo v1 v2 2663792f786aSBram Moolenaar endfor 2664792f786aSBram Moolenaar END 2665792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2666792f786aSBram Moolenaar 2667792f786aSBram Moolenaar lines =<< trim END 2668792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2669792f786aSBram Moolenaar echo v1 v2 2670792f786aSBram Moolenaar endfor 2671792f786aSBram Moolenaar END 2672792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2673792f786aSBram Moolenaar 2674792f786aSBram Moolenaar lines =<< trim END 2675792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2676792f786aSBram Moolenaar echo v1 2677792f786aSBram Moolenaar endfor 2678792f786aSBram Moolenaar END 2679792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2680792f786aSBram Moolenaarenddef 2681792f786aSBram Moolenaar 2682c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2683f2253963SBram Moolenaar var lines =<< trim END 2684c150c09eSBram Moolenaar var looped = 0 2685c150c09eSBram Moolenaar var cleanup = 0 2686c150c09eSBram Moolenaar for i in range(3) 2687c150c09eSBram Moolenaar looped += 1 2688c150c09eSBram Moolenaar try 2689c150c09eSBram Moolenaar eval [][0] 2690c150c09eSBram Moolenaar catch 2691c150c09eSBram Moolenaar continue 2692c150c09eSBram Moolenaar finally 2693c150c09eSBram Moolenaar cleanup += 1 2694c150c09eSBram Moolenaar endtry 2695c150c09eSBram Moolenaar endfor 2696c150c09eSBram Moolenaar assert_equal(3, looped) 2697c150c09eSBram Moolenaar assert_equal(3, cleanup) 2698f2253963SBram Moolenaar END 2699f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2700c150c09eSBram Moolenaarenddef 2701c150c09eSBram Moolenaar 2702d0df1aacSBram Moolenaardef Test_while_loop() 2703cfcd011fSBram Moolenaar var result = '' 2704cfcd011fSBram Moolenaar var cnt = 0 2705d0df1aacSBram Moolenaar while cnt < 555 2706d0df1aacSBram Moolenaar if cnt == 3 2707d0df1aacSBram Moolenaar break 2708d0df1aacSBram Moolenaar endif 2709d0df1aacSBram Moolenaar cnt += 1 2710d0df1aacSBram Moolenaar if cnt == 2 2711d0df1aacSBram Moolenaar continue 2712d0df1aacSBram Moolenaar endif 2713d0df1aacSBram Moolenaar result ..= cnt .. '_' 2714d0df1aacSBram Moolenaar endwhile 2715d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2716dee37dc7SBram Moolenaar 2717dee37dc7SBram Moolenaar var s = '' 27180123cc1eSBram Moolenaar while s == 'x' # {comment} 2719dee37dc7SBram Moolenaar endwhile 2720d0df1aacSBram Moolenaarenddef 2721d0df1aacSBram Moolenaar 2722e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2723675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2724675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2725675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2726675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2727675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2728675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2729675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 27306628b7ebSBram Moolenaar 27316628b7ebSBram Moolenaar var lines =<< trim END 27326628b7ebSBram Moolenaar var s = '' 27336628b7ebSBram Moolenaar while s = '' 27346628b7ebSBram Moolenaar endwhile 27356628b7ebSBram Moolenaar END 27366628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2737bd5da371SBram Moolenaarenddef 2738bd5da371SBram Moolenaar 27399645e2d9SBram Moolenaardef Test_interrupt_loop() 2740cfcd011fSBram Moolenaar var caught = false 2741cfcd011fSBram Moolenaar var x = 0 274297acfc78SBram Moolenaar try 27439645e2d9SBram Moolenaar while 1 27449645e2d9SBram Moolenaar x += 1 27459645e2d9SBram Moolenaar if x == 100 27469645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 27479645e2d9SBram Moolenaar endif 27489645e2d9SBram Moolenaar endwhile 274997acfc78SBram Moolenaar catch 275097acfc78SBram Moolenaar caught = true 275197acfc78SBram Moolenaar assert_equal(100, x) 275297acfc78SBram Moolenaar endtry 275397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 275425859dd7SBram Moolenaar # consume the CTRL-C 275525859dd7SBram Moolenaar getchar(0) 27569645e2d9SBram Moolenaarenddef 275720431c9dSBram Moolenaar 27584fdae999SBram Moolenaardef Test_automatic_line_continuation() 2759cfcd011fSBram Moolenaar var mylist = [ 27604fdae999SBram Moolenaar 'one', 27614fdae999SBram Moolenaar 'two', 27624fdae999SBram Moolenaar 'three', 2763f5be8cdbSBram Moolenaar ] # comment 27644fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 27654fdae999SBram Moolenaar 2766cfcd011fSBram Moolenaar var mydict = { 2767e0de171eSBram Moolenaar ['one']: 1, 2768e0de171eSBram Moolenaar ['two']: 2, 2769e0de171eSBram Moolenaar ['three']: 27704fdae999SBram Moolenaar 3, 2771f5be8cdbSBram Moolenaar } # comment 2772e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2773e0de171eSBram Moolenaar mydict = { 27742c330432SBram Moolenaar one: 1, # comment 27752c330432SBram Moolenaar two: # comment 27762c330432SBram Moolenaar 2, # comment 27772c330432SBram Moolenaar three: 3 # comment 27782c330432SBram Moolenaar } 2779e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2780e0de171eSBram Moolenaar mydict = { 27812c330432SBram Moolenaar one: 1, 27824fdae999SBram Moolenaar two: 27834fdae999SBram Moolenaar 2, 27842c330432SBram Moolenaar three: 3 27854fdae999SBram Moolenaar } 2786e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2787e6085c53SBram Moolenaar 2788e6085c53SBram Moolenaar assert_equal( 2789e6085c53SBram Moolenaar ['one', 'two', 'three'], 2790e6085c53SBram Moolenaar split('one two three') 2791e6085c53SBram Moolenaar ) 27924fdae999SBram Moolenaarenddef 27934fdae999SBram Moolenaar 27947a092245SBram Moolenaardef Test_vim9_comment() 27957a092245SBram Moolenaar CheckScriptSuccess([ 27967a092245SBram Moolenaar 'vim9script', 27977a092245SBram Moolenaar '# something', 279893f82cbeSBram Moolenaar '#something', 279993f82cbeSBram Moolenaar '#{something', 28007a092245SBram Moolenaar ]) 280193f82cbeSBram Moolenaar 280293f82cbeSBram Moolenaar split Xfile 280393f82cbeSBram Moolenaar CheckScriptSuccess([ 280493f82cbeSBram Moolenaar 'vim9script', 280593f82cbeSBram Moolenaar 'edit #something', 280693f82cbeSBram Moolenaar ]) 280793f82cbeSBram Moolenaar CheckScriptSuccess([ 280893f82cbeSBram Moolenaar 'vim9script', 280993f82cbeSBram Moolenaar 'edit #{something', 281093f82cbeSBram Moolenaar ]) 281193f82cbeSBram Moolenaar close 281293f82cbeSBram Moolenaar 28137a092245SBram Moolenaar CheckScriptFailure([ 28147a092245SBram Moolenaar 'vim9script', 28157a092245SBram Moolenaar ':# something', 28167a092245SBram Moolenaar ], 'E488:') 28177a092245SBram Moolenaar CheckScriptFailure([ 28187a092245SBram Moolenaar '# something', 28197a092245SBram Moolenaar ], 'E488:') 28207a092245SBram Moolenaar CheckScriptFailure([ 28217a092245SBram Moolenaar ':# something', 28227a092245SBram Moolenaar ], 'E488:') 28237a092245SBram Moolenaar 28244a8d9f2eSBram Moolenaar { # block start 28254a8d9f2eSBram Moolenaar } # block end 28264a8d9f2eSBram Moolenaar CheckDefFailure([ 28274a8d9f2eSBram Moolenaar '{# comment', 28284a8d9f2eSBram Moolenaar ], 'E488:') 28294a8d9f2eSBram Moolenaar CheckDefFailure([ 28304a8d9f2eSBram Moolenaar '{', 28314a8d9f2eSBram Moolenaar '}# comment', 28324a8d9f2eSBram Moolenaar ], 'E488:') 28334a8d9f2eSBram Moolenaar 28344a8d9f2eSBram Moolenaar echo "yes" # comment 28354a8d9f2eSBram Moolenaar CheckDefFailure([ 28364a8d9f2eSBram Moolenaar 'echo "yes"# comment', 28374a8d9f2eSBram Moolenaar ], 'E488:') 28387a092245SBram Moolenaar CheckScriptSuccess([ 28397a092245SBram Moolenaar 'vim9script', 28407a092245SBram Moolenaar 'echo "yes" # something', 28417a092245SBram Moolenaar ]) 28427a092245SBram Moolenaar CheckScriptFailure([ 28437a092245SBram Moolenaar 'vim9script', 28447a092245SBram Moolenaar 'echo "yes"# something', 28457a092245SBram Moolenaar ], 'E121:') 28467a092245SBram Moolenaar CheckScriptFailure([ 28477a092245SBram Moolenaar 'vim9script', 28487a092245SBram Moolenaar 'echo# something', 2849f8103f27SBram Moolenaar ], 'E1144:') 28507a092245SBram Moolenaar CheckScriptFailure([ 28517a092245SBram Moolenaar 'echo "yes" # something', 28527a092245SBram Moolenaar ], 'E121:') 28537a092245SBram Moolenaar 28544a8d9f2eSBram Moolenaar exe "echo" # comment 28554a8d9f2eSBram Moolenaar CheckDefFailure([ 28564a8d9f2eSBram Moolenaar 'exe "echo"# comment', 28574a8d9f2eSBram Moolenaar ], 'E488:') 28584a8d9f2eSBram Moolenaar CheckScriptSuccess([ 28594a8d9f2eSBram Moolenaar 'vim9script', 28604a8d9f2eSBram Moolenaar 'exe "echo" # something', 28614a8d9f2eSBram Moolenaar ]) 28624a8d9f2eSBram Moolenaar CheckScriptFailure([ 28634a8d9f2eSBram Moolenaar 'vim9script', 28644a8d9f2eSBram Moolenaar 'exe "echo"# something', 28654a8d9f2eSBram Moolenaar ], 'E121:') 28664a8d9f2eSBram Moolenaar CheckScriptFailure([ 28674a8d9f2eSBram Moolenaar 'vim9script', 28684a8d9f2eSBram Moolenaar 'exe# something', 2869f8103f27SBram Moolenaar ], 'E1144:') 28704a8d9f2eSBram Moolenaar CheckScriptFailure([ 28714a8d9f2eSBram Moolenaar 'exe "echo" # something', 28724a8d9f2eSBram Moolenaar ], 'E121:') 28734a8d9f2eSBram Moolenaar 28747a092245SBram Moolenaar CheckDefFailure([ 28757a092245SBram Moolenaar 'try# comment', 28767a092245SBram Moolenaar ' echo "yes"', 28777a092245SBram Moolenaar 'catch', 28787a092245SBram Moolenaar 'endtry', 2879f8103f27SBram Moolenaar ], 'E1144:') 28802c5ed4e3SBram Moolenaar CheckScriptFailure([ 28812c5ed4e3SBram Moolenaar 'vim9script', 28822c5ed4e3SBram Moolenaar 'try# comment', 28832c5ed4e3SBram Moolenaar 'echo "yes"', 2884f8103f27SBram Moolenaar ], 'E1144:') 28857a092245SBram Moolenaar CheckDefFailure([ 28867a092245SBram Moolenaar 'try', 2887a72cfb80SBram Moolenaar ' throw#comment', 2888a72cfb80SBram Moolenaar 'catch', 2889a72cfb80SBram Moolenaar 'endtry', 2890f8103f27SBram Moolenaar ], 'E1144:') 2891a72cfb80SBram Moolenaar CheckDefFailure([ 2892a72cfb80SBram Moolenaar 'try', 2893a72cfb80SBram Moolenaar ' throw "yes"#comment', 2894a72cfb80SBram Moolenaar 'catch', 2895a72cfb80SBram Moolenaar 'endtry', 2896a72cfb80SBram Moolenaar ], 'E488:') 2897a72cfb80SBram Moolenaar CheckDefFailure([ 2898a72cfb80SBram Moolenaar 'try', 28997a092245SBram Moolenaar ' echo "yes"', 29007a092245SBram Moolenaar 'catch# comment', 29017a092245SBram Moolenaar 'endtry', 2902f8103f27SBram Moolenaar ], 'E1144:') 29032c5ed4e3SBram Moolenaar CheckScriptFailure([ 29042c5ed4e3SBram Moolenaar 'vim9script', 29052c5ed4e3SBram Moolenaar 'try', 29062c5ed4e3SBram Moolenaar ' echo "yes"', 29072c5ed4e3SBram Moolenaar 'catch# comment', 29082c5ed4e3SBram Moolenaar 'endtry', 2909f8103f27SBram Moolenaar ], 'E1144:') 29102c5ed4e3SBram Moolenaar CheckDefFailure([ 29112c5ed4e3SBram Moolenaar 'try', 29122c5ed4e3SBram Moolenaar ' echo "yes"', 29132c5ed4e3SBram Moolenaar 'catch /pat/# comment', 29142c5ed4e3SBram Moolenaar 'endtry', 29152c5ed4e3SBram Moolenaar ], 'E488:') 29167a092245SBram Moolenaar CheckDefFailure([ 29177a092245SBram Moolenaar 'try', 29187a092245SBram Moolenaar 'echo "yes"', 29197a092245SBram Moolenaar 'catch', 29207a092245SBram Moolenaar 'endtry# comment', 2921f8103f27SBram Moolenaar ], 'E1144:') 29222c5ed4e3SBram Moolenaar CheckScriptFailure([ 29232c5ed4e3SBram Moolenaar 'vim9script', 29242c5ed4e3SBram Moolenaar 'try', 29252c5ed4e3SBram Moolenaar ' echo "yes"', 29262c5ed4e3SBram Moolenaar 'catch', 29272c5ed4e3SBram Moolenaar 'endtry# comment', 2928f8103f27SBram Moolenaar ], 'E1144:') 29292c5ed4e3SBram Moolenaar 29302c5ed4e3SBram Moolenaar CheckScriptSuccess([ 29312c5ed4e3SBram Moolenaar 'vim9script', 29322c5ed4e3SBram Moolenaar 'hi # comment', 29332c5ed4e3SBram Moolenaar ]) 29342c5ed4e3SBram Moolenaar CheckScriptFailure([ 29352c5ed4e3SBram Moolenaar 'vim9script', 29362c5ed4e3SBram Moolenaar 'hi# comment', 2937f8103f27SBram Moolenaar ], 'E1144:') 29381966c248SBram Moolenaar CheckScriptSuccess([ 29391966c248SBram Moolenaar 'vim9script', 29401966c248SBram Moolenaar 'hi Search # comment', 29411966c248SBram Moolenaar ]) 29421966c248SBram Moolenaar CheckScriptFailure([ 29431966c248SBram Moolenaar 'vim9script', 29441966c248SBram Moolenaar 'hi Search# comment', 29451966c248SBram Moolenaar ], 'E416:') 29461966c248SBram Moolenaar CheckScriptSuccess([ 29471966c248SBram Moolenaar 'vim9script', 29481966c248SBram Moolenaar 'hi link This Search # comment', 29491966c248SBram Moolenaar ]) 29501966c248SBram Moolenaar CheckScriptFailure([ 29511966c248SBram Moolenaar 'vim9script', 29521966c248SBram Moolenaar 'hi link This That# comment', 29531966c248SBram Moolenaar ], 'E413:') 29541966c248SBram Moolenaar CheckScriptSuccess([ 29551966c248SBram Moolenaar 'vim9script', 29561966c248SBram Moolenaar 'hi clear This # comment', 29571966c248SBram Moolenaar 'hi clear # comment', 29581966c248SBram Moolenaar ]) 2959f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2960f5be8cdbSBram Moolenaar # hi clear This# comment', 29611966c248SBram Moolenaar CheckScriptFailure([ 29621966c248SBram Moolenaar 'vim9script', 29631966c248SBram Moolenaar 'hi clear# comment', 29641966c248SBram Moolenaar ], 'E416:') 29651966c248SBram Moolenaar 29661966c248SBram Moolenaar CheckScriptSuccess([ 29671966c248SBram Moolenaar 'vim9script', 29681966c248SBram Moolenaar 'hi Group term=bold', 29691966c248SBram Moolenaar 'match Group /todo/ # comment', 29701966c248SBram Moolenaar ]) 29711966c248SBram Moolenaar CheckScriptFailure([ 29721966c248SBram Moolenaar 'vim9script', 29731966c248SBram Moolenaar 'hi Group term=bold', 29741966c248SBram Moolenaar 'match Group /todo/# comment', 29751966c248SBram Moolenaar ], 'E488:') 29761966c248SBram Moolenaar CheckScriptSuccess([ 29771966c248SBram Moolenaar 'vim9script', 29781966c248SBram Moolenaar 'match # comment', 29791966c248SBram Moolenaar ]) 29801966c248SBram Moolenaar CheckScriptFailure([ 29811966c248SBram Moolenaar 'vim9script', 29821966c248SBram Moolenaar 'match# comment', 2983f8103f27SBram Moolenaar ], 'E1144:') 29841966c248SBram Moolenaar CheckScriptSuccess([ 29851966c248SBram Moolenaar 'vim9script', 29861966c248SBram Moolenaar 'match none # comment', 29871966c248SBram Moolenaar ]) 29881966c248SBram Moolenaar CheckScriptFailure([ 29891966c248SBram Moolenaar 'vim9script', 29901966c248SBram Moolenaar 'match none# comment', 29911966c248SBram Moolenaar ], 'E475:') 29921966c248SBram Moolenaar 29931966c248SBram Moolenaar CheckScriptSuccess([ 29941966c248SBram Moolenaar 'vim9script', 29951966c248SBram Moolenaar 'menutrans clear # comment', 29961966c248SBram Moolenaar ]) 29971966c248SBram Moolenaar CheckScriptFailure([ 29981966c248SBram Moolenaar 'vim9script', 29991966c248SBram Moolenaar 'menutrans clear# comment text', 30001966c248SBram Moolenaar ], 'E474:') 30011966c248SBram Moolenaar 30021966c248SBram Moolenaar CheckScriptSuccess([ 30031966c248SBram Moolenaar 'vim9script', 30041966c248SBram Moolenaar 'syntax clear # comment', 30051966c248SBram Moolenaar ]) 30061966c248SBram Moolenaar CheckScriptFailure([ 30071966c248SBram Moolenaar 'vim9script', 30081966c248SBram Moolenaar 'syntax clear# comment text', 30091966c248SBram Moolenaar ], 'E28:') 30101966c248SBram Moolenaar CheckScriptSuccess([ 30111966c248SBram Moolenaar 'vim9script', 30121966c248SBram Moolenaar 'syntax keyword Word some', 30131966c248SBram Moolenaar 'syntax clear Word # comment', 30141966c248SBram Moolenaar ]) 30151966c248SBram Moolenaar CheckScriptFailure([ 30161966c248SBram Moolenaar 'vim9script', 30171966c248SBram Moolenaar 'syntax keyword Word some', 30181966c248SBram Moolenaar 'syntax clear Word# comment text', 30191966c248SBram Moolenaar ], 'E28:') 30201966c248SBram Moolenaar 30211966c248SBram Moolenaar CheckScriptSuccess([ 30221966c248SBram Moolenaar 'vim9script', 30231966c248SBram Moolenaar 'syntax list # comment', 30241966c248SBram Moolenaar ]) 30251966c248SBram Moolenaar CheckScriptFailure([ 30261966c248SBram Moolenaar 'vim9script', 30271966c248SBram Moolenaar 'syntax list# comment text', 30281966c248SBram Moolenaar ], 'E28:') 30291966c248SBram Moolenaar 30301966c248SBram Moolenaar CheckScriptSuccess([ 30311966c248SBram Moolenaar 'vim9script', 30321966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 30331966c248SBram Moolenaar ]) 30341966c248SBram Moolenaar CheckScriptFailure([ 30351966c248SBram Moolenaar 'vim9script', 30361966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 30371966c248SBram Moolenaar ], 'E475:') 30381966c248SBram Moolenaar 30391966c248SBram Moolenaar CheckScriptSuccess([ 30401966c248SBram Moolenaar 'vim9script', 30411966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 30421966c248SBram Moolenaar ]) 30431966c248SBram Moolenaar CheckScriptFailure([ 30441966c248SBram Moolenaar 'vim9script', 30451966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 30461966c248SBram Moolenaar ], 'E789:') 30471966c248SBram Moolenaar 30481966c248SBram Moolenaar CheckScriptSuccess([ 30491966c248SBram Moolenaar 'vim9script', 30501966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 30511966c248SBram Moolenaar ]) 30521966c248SBram Moolenaar CheckScriptFailure([ 30531966c248SBram Moolenaar 'vim9script', 30541966c248SBram Moolenaar 'syntax match Word /pat/# comment', 30551966c248SBram Moolenaar ], 'E402:') 30561966c248SBram Moolenaar 30571966c248SBram Moolenaar CheckScriptSuccess([ 30581966c248SBram Moolenaar 'vim9script', 30591966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 30601966c248SBram Moolenaar ]) 30611966c248SBram Moolenaar CheckScriptFailure([ 30621966c248SBram Moolenaar 'vim9script', 30631966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 30641966c248SBram Moolenaar ], 'E475:') 30651966c248SBram Moolenaar CheckScriptFailure([ 30661966c248SBram Moolenaar 'vim9script', 30671966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 30681966c248SBram Moolenaar ], 'E406:') 30691966c248SBram Moolenaar CheckScriptFailure([ 30701966c248SBram Moolenaar 'vim9script', 30711966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 30721966c248SBram Moolenaar ], 'E475:') 30731966c248SBram Moolenaar 30741966c248SBram Moolenaar CheckScriptSuccess([ 30751966c248SBram Moolenaar 'vim9script', 30761966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 30771966c248SBram Moolenaar ]) 30781966c248SBram Moolenaar CheckScriptFailure([ 30791966c248SBram Moolenaar 'vim9script', 30801966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3081d032f34aSBram Moolenaar ], 'E402:') 30821966c248SBram Moolenaar 30831966c248SBram Moolenaar CheckScriptSuccess([ 30841966c248SBram Moolenaar 'vim9script', 30851966c248SBram Moolenaar 'syntax sync # comment', 30861966c248SBram Moolenaar ]) 30871966c248SBram Moolenaar CheckScriptFailure([ 30881966c248SBram Moolenaar 'vim9script', 30891966c248SBram Moolenaar 'syntax sync# comment', 30901966c248SBram Moolenaar ], 'E404:') 30911966c248SBram Moolenaar CheckScriptSuccess([ 30921966c248SBram Moolenaar 'vim9script', 30931966c248SBram Moolenaar 'syntax sync ccomment # comment', 30941966c248SBram Moolenaar ]) 30951966c248SBram Moolenaar CheckScriptFailure([ 30961966c248SBram Moolenaar 'vim9script', 30971966c248SBram Moolenaar 'syntax sync ccomment# comment', 30981966c248SBram Moolenaar ], 'E404:') 30991966c248SBram Moolenaar 31001966c248SBram Moolenaar CheckScriptSuccess([ 31011966c248SBram Moolenaar 'vim9script', 31021966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 31031966c248SBram Moolenaar ]) 31041966c248SBram Moolenaar CheckScriptFailure([ 31051966c248SBram Moolenaar 'vim9script', 31061966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 31071966c248SBram Moolenaar ], 'E475:') 3108a72cfb80SBram Moolenaar 3109a72cfb80SBram Moolenaar CheckScriptSuccess([ 3110a72cfb80SBram Moolenaar 'vim9script', 3111a72cfb80SBram Moolenaar 'command Echo echo # comment', 3112a72cfb80SBram Moolenaar 'command Echo # comment', 31132d870f8dSBram Moolenaar 'delcommand Echo', 3114a72cfb80SBram Moolenaar ]) 3115a72cfb80SBram Moolenaar CheckScriptFailure([ 3116a72cfb80SBram Moolenaar 'vim9script', 3117a72cfb80SBram Moolenaar 'command Echo echo# comment', 3118a72cfb80SBram Moolenaar 'Echo', 3119f8103f27SBram Moolenaar ], 'E1144:') 31202d870f8dSBram Moolenaar delcommand Echo 312170249ee8SBram Moolenaar 312270249ee8SBram Moolenaar var curdir = getcwd() 312370249ee8SBram Moolenaar CheckScriptSuccess([ 312470249ee8SBram Moolenaar 'command Echo cd " comment', 312570249ee8SBram Moolenaar 'Echo', 312670249ee8SBram Moolenaar 'delcommand Echo', 312770249ee8SBram Moolenaar ]) 312870249ee8SBram Moolenaar CheckScriptSuccess([ 3129090728adSBram Moolenaar 'vim9script', 313070249ee8SBram Moolenaar 'command Echo cd # comment', 313170249ee8SBram Moolenaar 'Echo', 313270249ee8SBram Moolenaar 'delcommand Echo', 313370249ee8SBram Moolenaar ]) 313470249ee8SBram Moolenaar CheckScriptFailure([ 313570249ee8SBram Moolenaar 'vim9script', 313670249ee8SBram Moolenaar 'command Echo cd " comment', 313770249ee8SBram Moolenaar 'Echo', 313870249ee8SBram Moolenaar ], 'E344:') 313970249ee8SBram Moolenaar delcommand Echo 314070249ee8SBram Moolenaar chdir(curdir) 314170249ee8SBram Moolenaar 3142a72cfb80SBram Moolenaar CheckScriptFailure([ 3143a72cfb80SBram Moolenaar 'vim9script', 3144a72cfb80SBram Moolenaar 'command Echo# comment', 3145a72cfb80SBram Moolenaar ], 'E182:') 3146a72cfb80SBram Moolenaar CheckScriptFailure([ 3147a72cfb80SBram Moolenaar 'vim9script', 3148a72cfb80SBram Moolenaar 'command Echo echo', 3149a72cfb80SBram Moolenaar 'command Echo# comment', 3150a72cfb80SBram Moolenaar ], 'E182:') 31512d870f8dSBram Moolenaar delcommand Echo 3152a72cfb80SBram Moolenaar 3153a72cfb80SBram Moolenaar CheckScriptSuccess([ 3154a72cfb80SBram Moolenaar 'vim9script', 3155a72cfb80SBram Moolenaar 'function # comment', 3156a72cfb80SBram Moolenaar ]) 3157a72cfb80SBram Moolenaar CheckScriptFailure([ 3158a72cfb80SBram Moolenaar 'vim9script', 31599898107fSBram Moolenaar 'function " comment', 31609898107fSBram Moolenaar ], 'E129:') 31619898107fSBram Moolenaar CheckScriptFailure([ 31629898107fSBram Moolenaar 'vim9script', 3163a72cfb80SBram Moolenaar 'function# comment', 3164f8103f27SBram Moolenaar ], 'E1144:') 3165a72cfb80SBram Moolenaar CheckScriptSuccess([ 3166a72cfb80SBram Moolenaar 'vim9script', 3167a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3168a72cfb80SBram Moolenaar ]) 3169a72cfb80SBram Moolenaar CheckScriptFailure([ 3170a72cfb80SBram Moolenaar 'vim9script', 3171a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3172a72cfb80SBram Moolenaar ], 'E488:') 3173a72cfb80SBram Moolenaar 3174a72cfb80SBram Moolenaar CheckScriptSuccess([ 3175a72cfb80SBram Moolenaar 'vim9script', 31764c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3177a72cfb80SBram Moolenaar 'endfunc', 31784c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3179a72cfb80SBram Moolenaar ]) 3180a72cfb80SBram Moolenaar CheckScriptFailure([ 3181a72cfb80SBram Moolenaar 'vim9script', 31824c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3183a72cfb80SBram Moolenaar 'endfunc', 31844c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3185a72cfb80SBram Moolenaar ], 'E488:') 3186a72cfb80SBram Moolenaar 3187a72cfb80SBram Moolenaar CheckScriptSuccess([ 3188a72cfb80SBram Moolenaar 'vim9script', 3189a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3190a72cfb80SBram Moolenaar ]) 3191a72cfb80SBram Moolenaar CheckScriptFailure([ 3192a72cfb80SBram Moolenaar 'vim9script', 3193a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3194a72cfb80SBram Moolenaar ], 'E488:') 3195e7e4838fSBram Moolenaar 3196e7e4838fSBram Moolenaar CheckScriptFailure([ 3197e7e4838fSBram Moolenaar 'def Test() " comment', 3198e7e4838fSBram Moolenaar 'enddef', 3199e7e4838fSBram Moolenaar ], 'E488:') 3200e7e4838fSBram Moolenaar CheckScriptFailure([ 3201e7e4838fSBram Moolenaar 'vim9script', 3202e7e4838fSBram Moolenaar 'def Test() " comment', 3203e7e4838fSBram Moolenaar 'enddef', 3204e7e4838fSBram Moolenaar ], 'E488:') 3205e7e4838fSBram Moolenaar 3206e7e4838fSBram Moolenaar CheckScriptSuccess([ 3207e7e4838fSBram Moolenaar 'func Test() " comment', 3208e7e4838fSBram Moolenaar 'endfunc', 32092d870f8dSBram Moolenaar 'delfunc Test', 3210e7e4838fSBram Moolenaar ]) 32119898107fSBram Moolenaar CheckScriptSuccess([ 3212e7e4838fSBram Moolenaar 'vim9script', 3213e7e4838fSBram Moolenaar 'func Test() " comment', 3214e7e4838fSBram Moolenaar 'endfunc', 32159898107fSBram Moolenaar ]) 3216e7e4838fSBram Moolenaar 3217e7e4838fSBram Moolenaar CheckScriptSuccess([ 3218e7e4838fSBram Moolenaar 'def Test() # comment', 3219e7e4838fSBram Moolenaar 'enddef', 3220e7e4838fSBram Moolenaar ]) 3221e7e4838fSBram Moolenaar CheckScriptFailure([ 3222e7e4838fSBram Moolenaar 'func Test() # comment', 3223e7e4838fSBram Moolenaar 'endfunc', 3224e7e4838fSBram Moolenaar ], 'E488:') 32250f37e356SBram Moolenaar 32260f37e356SBram Moolenaar var lines =<< trim END 32270f37e356SBram Moolenaar vim9script 32280f37e356SBram Moolenaar syn region Text 32290f37e356SBram Moolenaar \ start='foo' 32300f37e356SBram Moolenaar #\ comment 32310f37e356SBram Moolenaar \ end='bar' 32325072b47aSBram Moolenaar syn region Text start='foo' 32335072b47aSBram Moolenaar #\ comment 32345072b47aSBram Moolenaar \ end='bar' 32350f37e356SBram Moolenaar END 32360f37e356SBram Moolenaar CheckScriptSuccess(lines) 32370f37e356SBram Moolenaar 32380f37e356SBram Moolenaar lines =<< trim END 32390f37e356SBram Moolenaar vim9script 32400f37e356SBram Moolenaar syn region Text 32410f37e356SBram Moolenaar \ start='foo' 32420f37e356SBram Moolenaar "\ comment 32430f37e356SBram Moolenaar \ end='bar' 32440f37e356SBram Moolenaar END 32450f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 32462c5ed4e3SBram Moolenaarenddef 32472c5ed4e3SBram Moolenaar 32482c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 32492c5ed4e3SBram Moolenaar CheckCanRunGui 32502c5ed4e3SBram Moolenaar 32512c5ed4e3SBram Moolenaar CheckScriptFailure([ 32522c5ed4e3SBram Moolenaar 'vim9script', 32532c5ed4e3SBram Moolenaar 'gui#comment' 3254f8103f27SBram Moolenaar ], 'E1144:') 32552c5ed4e3SBram Moolenaar CheckScriptFailure([ 32562c5ed4e3SBram Moolenaar 'vim9script', 32572c5ed4e3SBram Moolenaar 'gui -f#comment' 32582c5ed4e3SBram Moolenaar ], 'E499:') 32597a092245SBram Moolenaarenddef 32607a092245SBram Moolenaar 3261a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 32626797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 32636797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3264a26b9700SBram Moolenaar 3265a26b9700SBram Moolenaar edit test.vim 3266a26b9700SBram Moolenaar doautocmd TabEnter #comment 3267a26b9700SBram Moolenaar assert_equal(1, g:entered) 3268a26b9700SBram Moolenaar 3269a26b9700SBram Moolenaar doautocmd TabEnter f.x 3270a26b9700SBram Moolenaar assert_equal(2, g:entered) 3271a26b9700SBram Moolenaar 3272a26b9700SBram Moolenaar g:entered = 0 3273a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3274a26b9700SBram Moolenaar assert_equal(2, g:entered) 3275a26b9700SBram Moolenaar 3276a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3277a26b9700SBram Moolenaar 3278a26b9700SBram Moolenaar au! TabEnter 3279a26b9700SBram Moolenaar unlet g:entered 3280d72c1bf0SBram Moolenaar 3281d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3282d72c1bf0SBram Moolenaar 'vim9script', 32836797966dSBram Moolenaar 'g:var = 123', 3284e55b1c09SBram Moolenaar 'b:var = 456', 3285e55b1c09SBram Moolenaar 'w:var = 777', 3286e55b1c09SBram Moolenaar 't:var = 888', 3287d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3288d72c1bf0SBram Moolenaar ]) 3289d72c1bf0SBram Moolenaar 3290d72c1bf0SBram Moolenaar CheckScriptFailure([ 3291d72c1bf0SBram Moolenaar 'vim9script', 3292cfcd011fSBram Moolenaar 'let var = 123', 3293cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3294cfcd011fSBram Moolenaar 3295cfcd011fSBram Moolenaar CheckScriptFailure([ 3296cfcd011fSBram Moolenaar 'vim9script', 3297cfcd011fSBram Moolenaar 'var g:var = 123', 3298e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3299e55b1c09SBram Moolenaar 3300e55b1c09SBram Moolenaar CheckScriptFailure([ 3301e55b1c09SBram Moolenaar 'vim9script', 3302cfcd011fSBram Moolenaar 'var b:var = 123', 3303e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3304e55b1c09SBram Moolenaar 3305e55b1c09SBram Moolenaar CheckScriptFailure([ 3306e55b1c09SBram Moolenaar 'vim9script', 3307cfcd011fSBram Moolenaar 'var w:var = 123', 3308e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3309e55b1c09SBram Moolenaar 3310e55b1c09SBram Moolenaar CheckScriptFailure([ 3311e55b1c09SBram Moolenaar 'vim9script', 3312cfcd011fSBram Moolenaar 'var t:var = 123', 3313e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3314e55b1c09SBram Moolenaar 3315e55b1c09SBram Moolenaar CheckScriptFailure([ 3316e55b1c09SBram Moolenaar 'vim9script', 3317cfcd011fSBram Moolenaar 'var v:version = 123', 3318e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3319e55b1c09SBram Moolenaar 3320e55b1c09SBram Moolenaar CheckScriptFailure([ 3321e55b1c09SBram Moolenaar 'vim9script', 3322cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3323e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 33246797966dSBram Moolenaar 33256797966dSBram Moolenaar CheckScriptFailure([ 33266797966dSBram Moolenaar 'vim9script', 33276797966dSBram Moolenaar 'g:var = 123', 332832e35117SBram Moolenaar 'unlet g:var# comment1', 3329d72c1bf0SBram Moolenaar ], 'E108:') 3330d72c1bf0SBram Moolenaar 3331d72c1bf0SBram Moolenaar CheckScriptFailure([ 3332d72c1bf0SBram Moolenaar 'let g:var = 123', 3333d72c1bf0SBram Moolenaar 'unlet g:var # something', 3334d72c1bf0SBram Moolenaar ], 'E488:') 3335faac4104SBram Moolenaar 3336faac4104SBram Moolenaar CheckScriptSuccess([ 3337faac4104SBram Moolenaar 'vim9script', 333832e35117SBram Moolenaar 'if 1 # comment2', 3339faac4104SBram Moolenaar ' echo "yes"', 3340faac4104SBram Moolenaar 'elseif 2 #comment', 3341faac4104SBram Moolenaar ' echo "no"', 3342faac4104SBram Moolenaar 'endif', 3343faac4104SBram Moolenaar ]) 3344faac4104SBram Moolenaar 3345faac4104SBram Moolenaar CheckScriptFailure([ 3346faac4104SBram Moolenaar 'vim9script', 334732e35117SBram Moolenaar 'if 1# comment3', 3348faac4104SBram Moolenaar ' echo "yes"', 3349faac4104SBram Moolenaar 'endif', 3350fae55a9cSBram Moolenaar ], 'E488:') 3351faac4104SBram Moolenaar 3352faac4104SBram Moolenaar CheckScriptFailure([ 3353faac4104SBram Moolenaar 'vim9script', 335432e35117SBram Moolenaar 'if 0 # comment4', 3355faac4104SBram Moolenaar ' echo "yes"', 3356faac4104SBram Moolenaar 'elseif 2#comment', 3357faac4104SBram Moolenaar ' echo "no"', 3358faac4104SBram Moolenaar 'endif', 3359fae55a9cSBram Moolenaar ], 'E488:') 3360faac4104SBram Moolenaar 3361faac4104SBram Moolenaar CheckScriptSuccess([ 3362faac4104SBram Moolenaar 'vim9script', 3363cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3364faac4104SBram Moolenaar ]) 3365faac4104SBram Moolenaar 3366faac4104SBram Moolenaar CheckScriptFailure([ 3367faac4104SBram Moolenaar 'vim9script', 3368cfcd011fSBram Moolenaar 'var v = 1# comment6', 3369fae55a9cSBram Moolenaar ], 'E488:') 3370faac4104SBram Moolenaar 3371faac4104SBram Moolenaar CheckScriptSuccess([ 3372faac4104SBram Moolenaar 'vim9script', 3373faac4104SBram Moolenaar 'new' 3374d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3375df069eecSBram Moolenaar ':$', 3376faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3377faac4104SBram Moolenaar 'bwipe!', 3378faac4104SBram Moolenaar ]) 3379faac4104SBram Moolenaar 3380f5be8cdbSBram Moolenaar CheckScriptFailure([ 3381f5be8cdbSBram Moolenaar 'vim9script', 3382f5be8cdbSBram Moolenaar 'new' 3383d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3384f5be8cdbSBram Moolenaar ':$', 3385f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3386f5be8cdbSBram Moolenaar 'bwipe!', 3387f5be8cdbSBram Moolenaar ], 'E488:') 3388f5be8cdbSBram Moolenaar 3389f5be8cdbSBram Moolenaar CheckScriptFailure([ 3390f5be8cdbSBram Moolenaar 'vim9script', 3391f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3392f5be8cdbSBram Moolenaar ], 'E477:') 3393a26b9700SBram Moolenaarenddef 3394a26b9700SBram Moolenaar 33957e5bd91dSBram Moolenaardef Test_finish() 3396cfcd011fSBram Moolenaar var lines =<< trim END 33977e5bd91dSBram Moolenaar vim9script 33986797966dSBram Moolenaar g:res = 'one' 33997e5bd91dSBram Moolenaar if v:false | finish | endif 34006797966dSBram Moolenaar g:res = 'two' 34017e5bd91dSBram Moolenaar finish 34026797966dSBram Moolenaar g:res = 'three' 34037e5bd91dSBram Moolenaar END 34047e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 34057e5bd91dSBram Moolenaar source Xfinished 34067e5bd91dSBram Moolenaar assert_equal('two', g:res) 34077e5bd91dSBram Moolenaar 34087e5bd91dSBram Moolenaar unlet g:res 34097e5bd91dSBram Moolenaar delete('Xfinished') 34107e5bd91dSBram Moolenaarenddef 34117e5bd91dSBram Moolenaar 3412a5d0077eSBram Moolenaardef Test_forward_declaration() 3413cfcd011fSBram Moolenaar var lines =<< trim END 3414a5d0077eSBram Moolenaar vim9script 3415a5d0077eSBram Moolenaar def GetValue(): string 3416a5d0077eSBram Moolenaar return theVal 3417a5d0077eSBram Moolenaar enddef 3418cfcd011fSBram Moolenaar var theVal = 'something' 3419822ba247SBram Moolenaar g:initVal = GetValue() 3420a5d0077eSBram Moolenaar theVal = 'else' 3421a5d0077eSBram Moolenaar g:laterVal = GetValue() 3422a5d0077eSBram Moolenaar END 3423a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3424a5d0077eSBram Moolenaar source Xforward 3425a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3426a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3427a5d0077eSBram Moolenaar 3428a5d0077eSBram Moolenaar unlet g:initVal 3429a5d0077eSBram Moolenaar unlet g:laterVal 3430a5d0077eSBram Moolenaar delete('Xforward') 3431a5d0077eSBram Moolenaarenddef 3432a5d0077eSBram Moolenaar 34339721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3434a6294955SBram Moolenaar var vim9_lines =<< trim END 3435a6294955SBram Moolenaar vim9script 3436a6294955SBram Moolenaar var local = 'local' 3437a6294955SBram Moolenaar g:global = 'global' 3438a6294955SBram Moolenaar export var exported = 'exported' 3439a6294955SBram Moolenaar export def GetText(): string 3440a6294955SBram Moolenaar return 'text' 3441a6294955SBram Moolenaar enddef 3442a6294955SBram Moolenaar END 3443a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3444a6294955SBram Moolenaar 3445cfcd011fSBram Moolenaar var legacy_lines =<< trim END 34469721fb4eSBram Moolenaar source Xvim9_script.vim 34479721fb4eSBram Moolenaar 34489721fb4eSBram Moolenaar call assert_false(exists('local')) 34499721fb4eSBram Moolenaar call assert_false(exists('exported')) 34509721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 34519721fb4eSBram Moolenaar call assert_equal('global', global) 34529721fb4eSBram Moolenaar call assert_equal('global', g:global) 34539721fb4eSBram Moolenaar 34549721fb4eSBram Moolenaar " imported variable becomes script-local 34559721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 34569721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 34579721fb4eSBram Moolenaar call assert_false(exists('exported')) 34589721fb4eSBram Moolenaar 34599721fb4eSBram Moolenaar " imported function becomes script-local 34609721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 34619721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 34629721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 34639721fb4eSBram Moolenaar END 34649721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 34659721fb4eSBram Moolenaar 34669721fb4eSBram Moolenaar source Xlegacy_script.vim 34679721fb4eSBram Moolenaar assert_equal('global', g:global) 3468f5be8cdbSBram Moolenaar unlet g:global 34699721fb4eSBram Moolenaar 34709721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 34719721fb4eSBram Moolenaar delete('Xvim9_script.vim') 34729721fb4eSBram Moolenaarenddef 3473a5d0077eSBram Moolenaar 3474e535db86SBram Moolenaardef Test_declare_script_in_func() 3475e535db86SBram Moolenaar var lines =<< trim END 3476e535db86SBram Moolenaar vim9script 3477e535db86SBram Moolenaar func Declare() 3478e535db86SBram Moolenaar let s:local = 123 3479e535db86SBram Moolenaar endfunc 3480e535db86SBram Moolenaar Declare() 3481e535db86SBram Moolenaar assert_equal(123, local) 3482e535db86SBram Moolenaar 3483e535db86SBram Moolenaar var error: string 3484e535db86SBram Moolenaar try 3485e535db86SBram Moolenaar local = 'asdf' 3486e535db86SBram Moolenaar catch 3487e535db86SBram Moolenaar error = v:exception 3488e535db86SBram Moolenaar endtry 3489e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3490e535db86SBram Moolenaar 3491e535db86SBram Moolenaar lockvar local 3492e535db86SBram Moolenaar try 3493e535db86SBram Moolenaar local = 999 3494e535db86SBram Moolenaar catch 3495e535db86SBram Moolenaar error = v:exception 3496e535db86SBram Moolenaar endtry 3497e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3498e535db86SBram Moolenaar END 3499e535db86SBram Moolenaar CheckScriptSuccess(lines) 3500e535db86SBram Moolenaarenddef 3501e535db86SBram Moolenaar 3502e535db86SBram Moolenaar 35037d699701SBram Moolenaarfunc Test_vim9script_not_global() 35047d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 35057d699701SBram Moolenaar let vim9lines =<< trim END 35067d699701SBram Moolenaar vim9script 3507cfcd011fSBram Moolenaar var name = 'local' 35087d699701SBram Moolenaar func TheFunc() 35097d699701SBram Moolenaar echo 'local' 35107d699701SBram Moolenaar endfunc 35117d699701SBram Moolenaar def DefFunc() 35127d699701SBram Moolenaar echo 'local' 35137d699701SBram Moolenaar enddef 35147d699701SBram Moolenaar END 35157d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 35167d699701SBram Moolenaar source Xvim9script.vim 35177d699701SBram Moolenaar try 35187d699701SBram Moolenaar echo g:var 35197d699701SBram Moolenaar assert_report('did not fail') 35207d699701SBram Moolenaar catch /E121:/ 35217d699701SBram Moolenaar " caught 35227d699701SBram Moolenaar endtry 35237d699701SBram Moolenaar try 35247d699701SBram Moolenaar call TheFunc() 35257d699701SBram Moolenaar assert_report('did not fail') 35267d699701SBram Moolenaar catch /E117:/ 35277d699701SBram Moolenaar " caught 35287d699701SBram Moolenaar endtry 35297d699701SBram Moolenaar try 35307d699701SBram Moolenaar call DefFunc() 35317d699701SBram Moolenaar assert_report('did not fail') 35327d699701SBram Moolenaar catch /E117:/ 35337d699701SBram Moolenaar " caught 35347d699701SBram Moolenaar endtry 35357d699701SBram Moolenaar 353625859dd7SBram Moolenaar call delete('Xvim9script.vim') 35377d699701SBram Moolenaarendfunc 35387d699701SBram Moolenaar 3539eeb27bfeSBram Moolenaardef Test_vim9_copen() 3540eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3541eeb27bfeSBram Moolenaar copen 3542eeb27bfeSBram Moolenaar quit 3543eeb27bfeSBram Moolenaarenddef 3544eeb27bfeSBram Moolenaar 354503290b84SBram Moolenaar" test using an auto-loaded function and variable 35462d6b20d6SBram Moolenaardef Test_vim9_autoload() 3547cfcd011fSBram Moolenaar var lines =<< trim END 35482d6b20d6SBram Moolenaar vim9script 354903290b84SBram Moolenaar def some#gettest(): string 355003290b84SBram Moolenaar return 'test' 355103290b84SBram Moolenaar enddef 355203290b84SBram Moolenaar g:some#name = 'name' 3553227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3554e3ffcd99SBram Moolenaar 3555e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3556e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3557e3ffcd99SBram Moolenaar enddef 355803290b84SBram Moolenaar END 355903290b84SBram Moolenaar 356003290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 356103290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 356203290b84SBram Moolenaar var save_rtp = &rtp 356303290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 356403290b84SBram Moolenaar 356503290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 356603290b84SBram Moolenaar assert_equal('name', g:some#name) 3567227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 356803290b84SBram Moolenaar g:some#other = 'other' 356903290b84SBram Moolenaar assert_equal('other', g:some#other) 357003290b84SBram Moolenaar 3571e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3572e3ffcd99SBram Moolenaar 357317f700acSBram Moolenaar # upper case script name works 357417f700acSBram Moolenaar lines =<< trim END 357517f700acSBram Moolenaar vim9script 357617f700acSBram Moolenaar def Other#getOther(): string 357717f700acSBram Moolenaar return 'other' 357817f700acSBram Moolenaar enddef 357917f700acSBram Moolenaar END 358017f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 358117f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 358217f700acSBram Moolenaar 358303290b84SBram Moolenaar delete('Xdir', 'rf') 358403290b84SBram Moolenaar &rtp = save_rtp 358503290b84SBram Moolenaarenddef 358603290b84SBram Moolenaar 358703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 358803290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 358903290b84SBram Moolenaar var lines =<< trim END 359003290b84SBram Moolenaar vim9script 35912d6b20d6SBram Moolenaar def foo#test() 35922d6b20d6SBram Moolenaar echomsg getreg('"') 35932d6b20d6SBram Moolenaar enddef 35942d6b20d6SBram Moolenaar END 35952d6b20d6SBram Moolenaar 35962d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 35972d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3598cfcd011fSBram Moolenaar var save_rtp = &rtp 35992d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 36002d6b20d6SBram Moolenaar augroup test 36012d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 36022d6b20d6SBram Moolenaar augroup END 36032d6b20d6SBram Moolenaar 36042d6b20d6SBram Moolenaar normal Y 36052d6b20d6SBram Moolenaar 36062d6b20d6SBram Moolenaar augroup test 36072d6b20d6SBram Moolenaar autocmd! 36082d6b20d6SBram Moolenaar augroup END 36092d6b20d6SBram Moolenaar delete('Xdir', 'rf') 36102d6b20d6SBram Moolenaar &rtp = save_rtp 36112d6b20d6SBram Moolenaarenddef 36122d6b20d6SBram Moolenaar 361377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 361477e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3615cfcd011fSBram Moolenaar var lines =<< trim END 361677e5dcc3SBram Moolenaar vim9script 361777e5dcc3SBram Moolenaar def crash#func() 361877e5dcc3SBram Moolenaar try 361977e5dcc3SBram Moolenaar for x in List() 362077e5dcc3SBram Moolenaar endfor 362177e5dcc3SBram Moolenaar catch 362277e5dcc3SBram Moolenaar endtry 362377e5dcc3SBram Moolenaar g:ok = true 362477e5dcc3SBram Moolenaar enddef 362577e5dcc3SBram Moolenaar fu List() 362677e5dcc3SBram Moolenaar invalid 362777e5dcc3SBram Moolenaar endfu 362877e5dcc3SBram Moolenaar try 362948e11c10SBram Moolenaar alsoinvalid 363077e5dcc3SBram Moolenaar catch /wontmatch/ 363177e5dcc3SBram Moolenaar endtry 363277e5dcc3SBram Moolenaar END 363377e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 363477e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 363577e5dcc3SBram Moolenaar 363677e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 363777e5dcc3SBram Moolenaar lines =<< trim END 363877e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 363977e5dcc3SBram Moolenaar call crash#func() 364077e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 36419c4f5520SBram Moolenaar qall! 364277e5dcc3SBram Moolenaar END 364377e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 364477e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 364577e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 364677e5dcc3SBram Moolenaar 364777e5dcc3SBram Moolenaar delete('Xdidit') 364877e5dcc3SBram Moolenaar delete('Xscript') 364977e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 365003290b84SBram Moolenaar 365103290b84SBram Moolenaar lines =<< trim END 365203290b84SBram Moolenaar vim9script 365303290b84SBram Moolenaar var foo#bar = 'asdf' 365403290b84SBram Moolenaar END 365503290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 365677e5dcc3SBram Moolenaarenddef 365777e5dcc3SBram Moolenaar 365881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 365981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 366081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3661cfcd011fSBram Moolenaar var lines =<< trim END 366281e17fbeSBram Moolenaar let s:counter = 1 366381e17fbeSBram Moolenaar def s:Func() 366481e17fbeSBram Moolenaar au! CursorHold 366581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 366681e17fbeSBram Moolenaar enddef 366781e17fbeSBram Moolenaar call s:Func() 366881e17fbeSBram Moolenaar doau CursorHold 366981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 367081e17fbeSBram Moolenaar au! CursorHold 367181e17fbeSBram Moolenaar END 367281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 367381e17fbeSBram Moolenaarenddef 367481e17fbeSBram Moolenaar 3675b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3676b5841b99SBram Moolenaar var save_rtp = &rtp 3677b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3678b5841b99SBram Moolenaar &rtp = dir 3679b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3680b5841b99SBram Moolenaar 3681b5841b99SBram Moolenaar var lines =<< trim END 3682b5841b99SBram Moolenaar vim9script noclear 3683b5841b99SBram Moolenaar def script#autoloaded() 3684b5841b99SBram Moolenaar enddef 3685b5841b99SBram Moolenaar def Broken() 3686b5841b99SBram Moolenaar var x: any = '' 3687b5841b99SBram Moolenaar eval x != 0 3688b5841b99SBram Moolenaar enddef 3689b5841b99SBram Moolenaar Broken() 3690b5841b99SBram Moolenaar END 3691b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3692b5841b99SBram Moolenaar 3693b5841b99SBram Moolenaar lines =<< trim END 3694b5841b99SBram Moolenaar vim9script 3695b5841b99SBram Moolenaar def CallAutoloaded() 3696b5841b99SBram Moolenaar script#autoloaded() 3697b5841b99SBram Moolenaar enddef 3698b5841b99SBram Moolenaar 3699b5841b99SBram Moolenaar function Legacy() 3700b5841b99SBram Moolenaar try 3701b5841b99SBram Moolenaar call s:CallAutoloaded() 3702b5841b99SBram Moolenaar catch 3703b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3704b5841b99SBram Moolenaar endtry 3705b5841b99SBram Moolenaar endfunction 3706b5841b99SBram Moolenaar 3707b5841b99SBram Moolenaar Legacy() 3708b5841b99SBram Moolenaar END 3709b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3710b5841b99SBram Moolenaar 3711b5841b99SBram Moolenaar &rtp = save_rtp 3712b5841b99SBram Moolenaar delete(dir, 'rf') 3713b5841b99SBram Moolenaarenddef 3714b5841b99SBram Moolenaar 37153896a105SBram Moolenaardef Test_cmdline_win() 37163896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 37173896a105SBram Moolenaar # the command line window. 37183896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3719cfcd011fSBram Moolenaar var export_lines =<< trim END 37203896a105SBram Moolenaar vim9script 3721cfcd011fSBram Moolenaar export var That = 'yes' 37223896a105SBram Moolenaar END 37233896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3724cfcd011fSBram Moolenaar var import_lines =<< trim END 37253896a105SBram Moolenaar vim9script 37263896a105SBram Moolenaar import That from './Xexport.vim' 37273896a105SBram Moolenaar END 37283896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3729cfcd011fSBram Moolenaar var save_rtp = &rtp 37303896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 37313896a105SBram Moolenaar syntax on 37323896a105SBram Moolenaar augroup CmdWin 37333896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 37343896a105SBram Moolenaar augroup END 37353896a105SBram Moolenaar # this will open and also close the cmdline window 37363896a105SBram Moolenaar feedkeys('q:', 'xt') 37373896a105SBram Moolenaar assert_equal('yes', g:got_there) 37383896a105SBram Moolenaar 37393896a105SBram Moolenaar augroup CmdWin 37403896a105SBram Moolenaar au! 37413896a105SBram Moolenaar augroup END 37423896a105SBram Moolenaar &rtp = save_rtp 37433896a105SBram Moolenaar delete('rtp', 'rf') 37443896a105SBram Moolenaarenddef 37453896a105SBram Moolenaar 3746e3d4685fSBram Moolenaardef Test_invalid_sid() 3747e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 374825859dd7SBram Moolenaar 37499c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3750d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3751e3d4685fSBram Moolenaar endif 3752e3d4685fSBram Moolenaar delete('Xdidit') 3753e3d4685fSBram Moolenaarenddef 3754e3d4685fSBram Moolenaar 37559ec7026fSBram Moolenaardef Test_restoring_cpo() 37569ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 37579ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 37589ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 37599ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 37609ec7026fSBram Moolenaar endif 37619ec7026fSBram Moolenaar delete('Xsourced') 37629ec7026fSBram Moolenaar delete('Xclose') 3763090728adSBram Moolenaar delete('Xdone') 37640123cc1eSBram Moolenaar 37650123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 37660123cc1eSBram Moolenaar set cpo=aABceFsMny> 37670123cc1eSBram Moolenaar edit XanotherScript 37680123cc1eSBram Moolenaar so % 37690123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 37700123cc1eSBram Moolenaar :1del 37710123cc1eSBram Moolenaar w 37720123cc1eSBram Moolenaar so % 37730123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 37740123cc1eSBram Moolenaar 37750123cc1eSBram Moolenaar delete('XanotherScript') 37760123cc1eSBram Moolenaar set cpo&vim 37779ec7026fSBram Moolenaarenddef 37789ec7026fSBram Moolenaar 3779ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3780ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 378137294bd6SBram Moolenaar CheckScreendump 3782ffb7dcdbSBram Moolenaar CheckFeature timers 378337294bd6SBram Moolenaar 3784ffb7dcdbSBram Moolenaar let lines =<< trim END 378537294bd6SBram Moolenaar vim9script 378637294bd6SBram Moolenaar def script#func() 378737294bd6SBram Moolenaar enddef 378837294bd6SBram Moolenaar END 3789ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3790ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 379137294bd6SBram Moolenaar 3792ffb7dcdbSBram Moolenaar let lines =<< trim END 379337294bd6SBram Moolenaar vim9script 379437294bd6SBram Moolenaar set cpo+=M 379537294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3796767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 379737294bd6SBram Moolenaar setline(1, 'some text') 379837294bd6SBram Moolenaar END 3799ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3800ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3801ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3802ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 380337294bd6SBram Moolenaar 3804ffb7dcdbSBram Moolenaar " clean up 3805ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3806ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3807ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3808ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3809ffb7dcdbSBram Moolenaarendfunc 381037294bd6SBram Moolenaar 38119ec7026fSBram Moolenaar 3812f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3813cfcd011fSBram Moolenaar var lines =<< trim END 3814cfcd011fSBram Moolenaar var name: any 3815cfcd011fSBram Moolenaar assert_equal(0, name) 3816f0afd9e1SBram Moolenaar END 3817f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3818f0afd9e1SBram Moolenaarenddef 3819f0afd9e1SBram Moolenaar 38207e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 382158dbef33SBram Moolenaar CheckRunVimInTerminal 382258dbef33SBram Moolenaar 38237e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 38247e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 38257e9210eaSBram Moolenaarendfunc 38267e9210eaSBram Moolenaar 38277e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 38289c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3829cfcd011fSBram Moolenaar var lines =<< trim END 38309c4f5520SBram Moolenaar func CheckAndQuit() 38319c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 38329c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 38339c4f5520SBram Moolenaar endfunc 38349c4f5520SBram Moolenaar END 38359c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 38369c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3837e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 38389c4f5520SBram Moolenaar # define Afunc() on the command line 38399c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 38409c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 38412949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 38429c4f5520SBram Moolenaar 38439c4f5520SBram Moolenaar call StopVimInTerminal(buf) 38449c4f5520SBram Moolenaar delete('XcallFunc') 38459c4f5520SBram Moolenaar delete('Xdidcmd') 38469c4f5520SBram Moolenaarenddef 38479c4f5520SBram Moolenaar 3848fcdc5d83SBram Moolenaardef Test_script_var_scope() 3849fcdc5d83SBram Moolenaar var lines =<< trim END 3850fcdc5d83SBram Moolenaar vim9script 3851fcdc5d83SBram Moolenaar if true 3852fcdc5d83SBram Moolenaar if true 3853fcdc5d83SBram Moolenaar var one = 'one' 3854fcdc5d83SBram Moolenaar echo one 3855fcdc5d83SBram Moolenaar endif 3856fcdc5d83SBram Moolenaar echo one 3857fcdc5d83SBram Moolenaar endif 3858fcdc5d83SBram Moolenaar END 3859fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3860fcdc5d83SBram Moolenaar 3861fcdc5d83SBram Moolenaar lines =<< trim END 3862fcdc5d83SBram Moolenaar vim9script 3863fcdc5d83SBram Moolenaar if true 3864fcdc5d83SBram Moolenaar if false 3865fcdc5d83SBram Moolenaar var one = 'one' 3866fcdc5d83SBram Moolenaar echo one 3867fcdc5d83SBram Moolenaar else 3868fcdc5d83SBram Moolenaar var one = 'one' 3869fcdc5d83SBram Moolenaar echo one 3870fcdc5d83SBram Moolenaar endif 3871fcdc5d83SBram Moolenaar echo one 3872fcdc5d83SBram Moolenaar endif 3873fcdc5d83SBram Moolenaar END 3874fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3875fcdc5d83SBram Moolenaar 3876fcdc5d83SBram Moolenaar lines =<< trim END 3877fcdc5d83SBram Moolenaar vim9script 3878fcdc5d83SBram Moolenaar while true 3879fcdc5d83SBram Moolenaar var one = 'one' 3880fcdc5d83SBram Moolenaar echo one 3881fcdc5d83SBram Moolenaar break 3882fcdc5d83SBram Moolenaar endwhile 3883fcdc5d83SBram Moolenaar echo one 3884fcdc5d83SBram Moolenaar END 3885fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3886fcdc5d83SBram Moolenaar 3887fcdc5d83SBram Moolenaar lines =<< trim END 3888fcdc5d83SBram Moolenaar vim9script 3889fcdc5d83SBram Moolenaar for i in range(1) 3890fcdc5d83SBram Moolenaar var one = 'one' 3891fcdc5d83SBram Moolenaar echo one 3892fcdc5d83SBram Moolenaar endfor 3893fcdc5d83SBram Moolenaar echo one 3894fcdc5d83SBram Moolenaar END 3895fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 38969becdf2bSBram Moolenaar 38979becdf2bSBram Moolenaar lines =<< trim END 38989becdf2bSBram Moolenaar vim9script 38999becdf2bSBram Moolenaar { 39009becdf2bSBram Moolenaar var one = 'one' 39019becdf2bSBram Moolenaar assert_equal('one', one) 39029becdf2bSBram Moolenaar } 39039becdf2bSBram Moolenaar assert_false(exists('one')) 39049becdf2bSBram Moolenaar assert_false(exists('s:one')) 39059becdf2bSBram Moolenaar END 39069becdf2bSBram Moolenaar CheckScriptSuccess(lines) 39079becdf2bSBram Moolenaar 39089becdf2bSBram Moolenaar lines =<< trim END 39099becdf2bSBram Moolenaar vim9script 39109becdf2bSBram Moolenaar { 39119becdf2bSBram Moolenaar var one = 'one' 39129becdf2bSBram Moolenaar echo one 39139becdf2bSBram Moolenaar } 39149becdf2bSBram Moolenaar echo one 39159becdf2bSBram Moolenaar END 39169becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3917fcdc5d83SBram Moolenaarenddef 3918fcdc5d83SBram Moolenaar 3919352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3920352134bbSBram Moolenaar var lines =<< trim END 3921352134bbSBram Moolenaar vim9script 39222a38908bSBram Moolenaar def Callback(...l: list<any>) 3923352134bbSBram Moolenaar try 3924352134bbSBram Moolenaar var x: string 3925352134bbSBram Moolenaar var y: string 3926352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3927352134bbSBram Moolenaar [x, y] = [''] 3928352134bbSBram Moolenaar catch 3929352134bbSBram Moolenaar g:caught = 'yes' 3930352134bbSBram Moolenaar endtry 3931352134bbSBram Moolenaar enddef 3932e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3933352134bbSBram Moolenaar feedkeys("\r", 'xt') 3934352134bbSBram Moolenaar END 3935352134bbSBram Moolenaar CheckScriptSuccess(lines) 3936352134bbSBram Moolenaar 3937352134bbSBram Moolenaar unlet g:caught 3938352134bbSBram Moolenaarenddef 3939352134bbSBram Moolenaar 3940631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3941631e8f93SBram Moolenaar if !has('unix') || !has('job') 3942631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3943631e8f93SBram Moolenaar endif 3944631e8f93SBram Moolenaar var lines =<< trim END 3945631e8f93SBram Moolenaar vim9script 3946631e8f93SBram Moolenaar var source: list<number> 39472a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3948631e8f93SBram Moolenaar eval [][0] 3949631e8f93SBram Moolenaar enddef 39502a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3951631e8f93SBram Moolenaar sleep 1m 3952631e8f93SBram Moolenaar source += l 3953631e8f93SBram Moolenaar enddef 3954e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 39556f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 39566f17a3f0SBram Moolenaar sleep 10m 39576f17a3f0SBram Moolenaar endwhile 3958206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3959fe95b94fSBram Moolenaar sleep 200m 3960631e8f93SBram Moolenaar END 3961631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3962631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3963631e8f93SBram Moolenaar delete('Xdef') 3964631e8f93SBram Moolenaarenddef 3965631e8f93SBram Moolenaar 39664324d87aSBram Moolenaardef InvokeNormal() 39674324d87aSBram Moolenaar exe "norm! :m+1\r" 39684324d87aSBram Moolenaarenddef 39694324d87aSBram Moolenaar 39704324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 39714324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 39724324d87aSBram Moolenaar new 39734324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 39744324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 39754324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 39764324d87aSBram Moolenaar xunmap <F3> 3977b5b9480eSBram Moolenaarenddef 3978b5b9480eSBram Moolenaar 3979b5b9480eSBram Moolenaardef Test_white_space_after_command() 3980b5b9480eSBram Moolenaar var lines =<< trim END 3981b5b9480eSBram Moolenaar exit_cb: Func}) 3982b5b9480eSBram Moolenaar END 3983b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3984f8103f27SBram Moolenaar 3985f8103f27SBram Moolenaar lines =<< trim END 3986f8103f27SBram Moolenaar e# 3987f8103f27SBram Moolenaar END 3988f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 39894324d87aSBram Moolenaarenddef 39904324d87aSBram Moolenaar 39914aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 39924aab88d9SBram Moolenaar var lines =<< trim END 39934aab88d9SBram Moolenaar vim9script 39944aab88d9SBram Moolenaar if exists('g:guard') 39954aab88d9SBram Moolenaar finish 39964aab88d9SBram Moolenaar endif 39974aab88d9SBram Moolenaar g:guard = 1 39984aab88d9SBram Moolenaar var name = 'thename' 39994aab88d9SBram Moolenaar def g:GetName(): string 40004aab88d9SBram Moolenaar return name 40014aab88d9SBram Moolenaar enddef 40024aab88d9SBram Moolenaar def g:SetName(arg: string) 40034aab88d9SBram Moolenaar name = arg 40044aab88d9SBram Moolenaar enddef 40054aab88d9SBram Moolenaar END 40064aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 40074aab88d9SBram Moolenaar so XscriptTwice.vim 40084aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 40094aab88d9SBram Moolenaar g:SetName('newname') 40104aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 40114aab88d9SBram Moolenaar so XscriptTwice.vim 40124aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40134aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 40144aab88d9SBram Moolenaar 40154aab88d9SBram Moolenaar delfunc g:GetName 40164aab88d9SBram Moolenaar delfunc g:SetName 40174aab88d9SBram Moolenaar delete('XscriptTwice.vim') 40184aab88d9SBram Moolenaar unlet g:guard 40194aab88d9SBram Moolenaarenddef 40204aab88d9SBram Moolenaar 40214aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 40224aab88d9SBram Moolenaar var exportlines =<< trim END 40234aab88d9SBram Moolenaar vim9script 40244aab88d9SBram Moolenaar if exists('g:guard') 40254aab88d9SBram Moolenaar finish 40264aab88d9SBram Moolenaar endif 40274aab88d9SBram Moolenaar g:guard = 1 40284aab88d9SBram Moolenaar export var name = 'someName' 40294aab88d9SBram Moolenaar END 40304aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 40314aab88d9SBram Moolenaar 40324aab88d9SBram Moolenaar var lines =<< trim END 40334aab88d9SBram Moolenaar vim9script 40344aab88d9SBram Moolenaar import name from './XexportScript.vim' 40354aab88d9SBram Moolenaar def g:GetName(): string 40364aab88d9SBram Moolenaar return name 40374aab88d9SBram Moolenaar enddef 40384aab88d9SBram Moolenaar END 40394aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 40404aab88d9SBram Moolenaar so XscriptImport.vim 40414aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 40424aab88d9SBram Moolenaar 40434aab88d9SBram Moolenaar so XexportScript.vim 40444aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40454aab88d9SBram Moolenaar 40464aab88d9SBram Moolenaar delfunc g:GetName 40474aab88d9SBram Moolenaar delete('XexportScript.vim') 40484aab88d9SBram Moolenaar delete('XscriptImport.vim') 40494aab88d9SBram Moolenaar unlet g:guard 40504aab88d9SBram Moolenaarenddef 40514aab88d9SBram Moolenaar 405210b9421fSBram Moolenaardef Test_unsupported_commands() 405310b9421fSBram Moolenaar var lines =<< trim END 405410b9421fSBram Moolenaar ka 405510b9421fSBram Moolenaar END 40567d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 40577d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 405810b9421fSBram Moolenaar 405910b9421fSBram Moolenaar lines =<< trim END 4060ada1d870SBram Moolenaar :1ka 4061ada1d870SBram Moolenaar END 40627d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 40637d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4064ada1d870SBram Moolenaar 4065ada1d870SBram Moolenaar lines =<< trim END 406610b9421fSBram Moolenaar t 406710b9421fSBram Moolenaar END 406810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 406910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 407010b9421fSBram Moolenaar 407110b9421fSBram Moolenaar lines =<< trim END 407210b9421fSBram Moolenaar x 407310b9421fSBram Moolenaar END 407410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 407510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 407610b9421fSBram Moolenaar 407710b9421fSBram Moolenaar lines =<< trim END 407810b9421fSBram Moolenaar xit 407910b9421fSBram Moolenaar END 408010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 408110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 408210b9421fSBram Moolenaarenddef 408310b9421fSBram Moolenaar 4084c70fe460SBram Moolenaardef Test_mapping_line_number() 4085c70fe460SBram Moolenaar var lines =<< trim END 4086c70fe460SBram Moolenaar vim9script 4087c70fe460SBram Moolenaar def g:FuncA() 4088c70fe460SBram Moolenaar # Some comment 4089c70fe460SBram Moolenaar FuncB(0) 4090c70fe460SBram Moolenaar enddef 4091c70fe460SBram Moolenaar # Some comment 4092c70fe460SBram Moolenaar def FuncB( 4093c70fe460SBram Moolenaar # Some comment 4094c70fe460SBram Moolenaar n: number 4095c70fe460SBram Moolenaar ) 4096c70fe460SBram Moolenaar exe 'nno ' 4097c70fe460SBram Moolenaar # Some comment 4098c70fe460SBram Moolenaar .. '<F3> a' 4099c70fe460SBram Moolenaar .. 'b' 4100c70fe460SBram Moolenaar .. 'c' 4101c70fe460SBram Moolenaar enddef 4102c70fe460SBram Moolenaar END 4103c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4104c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4105c70fe460SBram Moolenaar assert_match('No mapping found', res) 4106c70fe460SBram Moolenaar 4107c70fe460SBram Moolenaar g:FuncA() 4108c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4109c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4110c70fe460SBram Moolenaar 4111c70fe460SBram Moolenaar nunmap <F3> 4112c70fe460SBram Moolenaar delfunc g:FuncA 4113c70fe460SBram Moolenaarenddef 4114c70fe460SBram Moolenaar 4115deb108baSBram Moolenaardef Test_option_set() 4116deb108baSBram Moolenaar # legacy script allows for white space 4117deb108baSBram Moolenaar var lines =<< trim END 4118deb108baSBram Moolenaar set foldlevel =11 4119deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4120deb108baSBram Moolenaar END 4121deb108baSBram Moolenaar CheckScriptSuccess(lines) 4122deb108baSBram Moolenaar 4123deb108baSBram Moolenaar set foldlevel 4124deb108baSBram Moolenaar set foldlevel=12 4125deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4126deb108baSBram Moolenaar set foldlevel+=2 4127deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4128deb108baSBram Moolenaar set foldlevel-=3 4129deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4130deb108baSBram Moolenaar 4131deb108baSBram Moolenaar lines =<< trim END 4132deb108baSBram Moolenaar set foldlevel =1 4133deb108baSBram Moolenaar END 4134deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4135deb108baSBram Moolenaar 4136deb108baSBram Moolenaar lines =<< trim END 4137deb108baSBram Moolenaar set foldlevel +=1 4138deb108baSBram Moolenaar END 4139deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4140deb108baSBram Moolenaar 4141deb108baSBram Moolenaar lines =<< trim END 4142deb108baSBram Moolenaar set foldlevel ^=1 4143deb108baSBram Moolenaar END 4144deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4145deb108baSBram Moolenaar 4146deb108baSBram Moolenaar lines =<< trim END 4147deb108baSBram Moolenaar set foldlevel -=1 4148deb108baSBram Moolenaar END 4149deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4150deb108baSBram Moolenaar 4151deb108baSBram Moolenaar set foldlevel& 4152deb108baSBram Moolenaarenddef 4153deb108baSBram Moolenaar 4154208f0b48SBram Moolenaardef Test_option_modifier() 41551594f313SBram Moolenaar # legacy script allows for white space 4156208f0b48SBram Moolenaar var lines =<< trim END 4157208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4158208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4159208f0b48SBram Moolenaar END 4160208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4161208f0b48SBram Moolenaar 41621594f313SBram Moolenaar set hlsearch 41631594f313SBram Moolenaar set hlsearch! 41641594f313SBram Moolenaar assert_equal(false, &hlsearch) 41651594f313SBram Moolenaar 41661594f313SBram Moolenaar set hlsearch 4167208f0b48SBram Moolenaar set hlsearch& 41681594f313SBram Moolenaar assert_equal(false, &hlsearch) 4169208f0b48SBram Moolenaar 4170208f0b48SBram Moolenaar lines =<< trim END 41711594f313SBram Moolenaar set hlsearch & 4172208f0b48SBram Moolenaar END 41731594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 41741594f313SBram Moolenaar 41751594f313SBram Moolenaar lines =<< trim END 41761594f313SBram Moolenaar set hlsearch ! 41771594f313SBram Moolenaar END 41781594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 41791594f313SBram Moolenaar 41801594f313SBram Moolenaar set hlsearch& 4181208f0b48SBram Moolenaarenddef 4182208f0b48SBram Moolenaar 4183c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4184c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4185c03fe66aSBram Moolenaar var lines =<< trim END 4186c03fe66aSBram Moolenaar echoerr 'some' 4187c03fe66aSBram Moolenaar .. ' error' 4188c03fe66aSBram Moolenaar .. ' continued' 4189c03fe66aSBram Moolenaar END 4190c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4191c03fe66aSBram Moolenaarenddef 4192c03fe66aSBram Moolenaar 4193648594eaSBram Moolenaardef ProfiledWithLambda() 4194d9162550SBram Moolenaar var n = 3 4195d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4196d9162550SBram Moolenaarenddef 4197d9162550SBram Moolenaar 4198648594eaSBram Moolenaardef ProfiledNested() 4199648594eaSBram Moolenaar var x = 0 4200648594eaSBram Moolenaar def Nested(): any 4201648594eaSBram Moolenaar return x 4202648594eaSBram Moolenaar enddef 4203648594eaSBram Moolenaar Nested() 4204648594eaSBram Moolenaarenddef 4205648594eaSBram Moolenaar 4206ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4207ffcfddc7SBram Moolenaar var x = 0 4208ffcfddc7SBram Moolenaar def Nested(): any 4209ffcfddc7SBram Moolenaar return x 4210ffcfddc7SBram Moolenaar enddef 4211ffcfddc7SBram Moolenaar Nested() 4212ffcfddc7SBram Moolenaarenddef 4213ffcfddc7SBram Moolenaar 4214d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4215d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4216d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 42174ece152aSBram Moolenaar CheckFeature profile 42184ece152aSBram Moolenaar 4219d9162550SBram Moolenaar profile start Xprofile.log 4220648594eaSBram Moolenaar profile func ProfiledWithLambda 4221648594eaSBram Moolenaar ProfiledWithLambda() 4222ffcfddc7SBram Moolenaar 4223648594eaSBram Moolenaar profile func ProfiledNested 4224648594eaSBram Moolenaar ProfiledNested() 4225ffcfddc7SBram Moolenaar 4226ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4227ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4228ffcfddc7SBram Moolenaar profile func * 4229ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4230ffcfddc7SBram Moolenaar 4231ffcfddc7SBram Moolenaar profdel func * 4232ffcfddc7SBram Moolenaar profile pause 4233d9162550SBram Moolenaarenddef 4234d9162550SBram Moolenaar 4235585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4236585fea7bSBram Moolenaardef Test_substitute_cmd() 4237585fea7bSBram Moolenaar new 4238585fea7bSBram Moolenaar setline(1, 'something') 4239585fea7bSBram Moolenaar :substitute(some(other( 4240585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4241585fea7bSBram Moolenaar bwipe! 4242585fea7bSBram Moolenaar 4243f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4244cfcd011fSBram Moolenaar var lines =<< trim END 4245585fea7bSBram Moolenaar vim9script 4246585fea7bSBram Moolenaar new 4247585fea7bSBram Moolenaar setline(1, 'something') 4248585fea7bSBram Moolenaar :substitute(some(other( 4249585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4250585fea7bSBram Moolenaar bwipe! 4251585fea7bSBram Moolenaar END 4252585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4253585fea7bSBram Moolenaar source Xvim9lines 4254585fea7bSBram Moolenaar 4255585fea7bSBram Moolenaar delete('Xvim9lines') 4256585fea7bSBram Moolenaarenddef 4257585fea7bSBram Moolenaar 42588a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4259