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 524a764e73dSYegappan Lakshmanan echo range(1, 2, 0) 525a764e73dSYegappan Lakshmanan catch /E726:/ 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 5849fa5dabeSBram Moolenaar # no requirement for spaces before | 5859fa5dabeSBram Moolenaar try|echo 0|catch|endtry 5869fa5dabeSBram Moolenaar 5877e82c5f3SBram Moolenaar # return in finally after empty catch 5887e82c5f3SBram Moolenaar def ReturnInFinally(): number 5897e82c5f3SBram Moolenaar try 5907e82c5f3SBram Moolenaar finally 5917e82c5f3SBram Moolenaar return 4 5927e82c5f3SBram Moolenaar endtry 5937e82c5f3SBram Moolenaar return 2 5947e82c5f3SBram Moolenaar enddef 5957e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5968ac681a2SBram Moolenaar 5978ac681a2SBram Moolenaar var lines =<< trim END 5988ac681a2SBram Moolenaar vim9script 5998ac681a2SBram Moolenaar try 6008ac681a2SBram Moolenaar acos('0.5') 6018ac681a2SBram Moolenaar ->setline(1) 6028ac681a2SBram Moolenaar catch 6038ac681a2SBram Moolenaar g:caught = v:exception 6048ac681a2SBram Moolenaar endtry 6058ac681a2SBram Moolenaar END 6068ac681a2SBram Moolenaar CheckScriptSuccess(lines) 607*4490ec4eSYegappan Lakshmanan assert_match('E1219: Float or Number required for argument 1', g:caught) 6088ac681a2SBram Moolenaar unlet g:caught 6094197828dSBram Moolenaar 6104197828dSBram Moolenaar # missing catch and/or finally 6114197828dSBram Moolenaar lines =<< trim END 6124197828dSBram Moolenaar vim9script 6134197828dSBram Moolenaar try 6144197828dSBram Moolenaar echo 'something' 6154197828dSBram Moolenaar endtry 6164197828dSBram Moolenaar END 6174197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6188a7d6542SBram Moolenaarenddef 6198a7d6542SBram Moolenaar 6203f987b59SBram Moolenaardef Test_try_in_catch() 6213f987b59SBram Moolenaar var lines =<< trim END 6223f987b59SBram Moolenaar vim9script 6233f987b59SBram Moolenaar var seq = [] 6243f987b59SBram Moolenaar def DoIt() 6253f987b59SBram Moolenaar try 6263f987b59SBram Moolenaar seq->add('throw 1') 6273f987b59SBram Moolenaar eval [][0] 6283f987b59SBram Moolenaar seq->add('notreached') 6293f987b59SBram Moolenaar catch 6303f987b59SBram Moolenaar seq->add('catch') 6313f987b59SBram Moolenaar try 6323f987b59SBram Moolenaar seq->add('throw 2') 6333f987b59SBram Moolenaar eval [][0] 6343f987b59SBram Moolenaar seq->add('notreached') 6353f987b59SBram Moolenaar catch /nothing/ 6363f987b59SBram Moolenaar seq->add('notreached') 6373f987b59SBram Moolenaar endtry 6383f987b59SBram Moolenaar seq->add('done') 6393f987b59SBram Moolenaar endtry 6403f987b59SBram Moolenaar enddef 6413f987b59SBram Moolenaar DoIt() 6423f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6433f987b59SBram Moolenaar END 6443f987b59SBram Moolenaarenddef 6453f987b59SBram Moolenaar 646d3d8feebSBram Moolenaardef Test_error_in_catch() 647d3d8feebSBram Moolenaar var lines =<< trim END 648d3d8feebSBram Moolenaar try 649d3d8feebSBram Moolenaar eval [][0] 650d3d8feebSBram Moolenaar catch /E684:/ 651d3d8feebSBram Moolenaar eval [][0] 652d3d8feebSBram Moolenaar endtry 653d3d8feebSBram Moolenaar END 654d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 655d3d8feebSBram Moolenaarenddef 656d3d8feebSBram Moolenaar 6572e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6582e34c34bSBram Moolenaardef TryContinueFunc() 6592e34c34bSBram Moolenaar while g:Count < 2 6602e34c34bSBram Moolenaar g:sequence ..= 't' 6612e34c34bSBram Moolenaar try 6622e34c34bSBram Moolenaar echoerr 'Test' 6632e34c34bSBram Moolenaar catch 6642e34c34bSBram Moolenaar g:Count += 1 6652e34c34bSBram Moolenaar g:sequence ..= 'c' 6662e34c34bSBram Moolenaar continue 6672e34c34bSBram Moolenaar endtry 6682e34c34bSBram Moolenaar g:sequence ..= 'e' 6692e34c34bSBram Moolenaar g:Count += 1 6702e34c34bSBram Moolenaar endwhile 6712e34c34bSBram Moolenaarenddef 6722e34c34bSBram Moolenaar 6732e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6742e34c34bSBram Moolenaar g:Count = 0 6752e34c34bSBram Moolenaar g:sequence = '' 6762e34c34bSBram Moolenaar TryContinueFunc() 6772e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6782e34c34bSBram Moolenaar unlet g:Count 6792e34c34bSBram Moolenaar unlet g:sequence 6802e34c34bSBram Moolenaarenddef 6812e34c34bSBram Moolenaar 6829cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6839cb577a6SBram Moolenaar # return in try block returns normally 6849cb577a6SBram Moolenaar def ReturnInTry(): string 6859cb577a6SBram Moolenaar try 6869cb577a6SBram Moolenaar return '"some message"' 6879cb577a6SBram Moolenaar catch 6889cb577a6SBram Moolenaar endtry 6899cb577a6SBram Moolenaar return 'not reached' 6909cb577a6SBram Moolenaar enddef 6919cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6929cb577a6SBram Moolenaarenddef 6939cb577a6SBram Moolenaar 6941430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6951430ceebSBram Moolenaar var lines =<< trim END 6961430ceebSBram Moolenaar vim9script 697c323527dSBram Moolenaar au BufEnter * eval 1 + 2 6981430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6991430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 7001430ceebSBram Moolenaar var items = [ 7011430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 7021430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7031430ceebSBram Moolenaar ] 7041430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7051430ceebSBram Moolenaar cwindow 7061430ceebSBram Moolenaar 7071430ceebSBram Moolenaar def CnextOrCfirst() 7081430ceebSBram Moolenaar # if cnext fails, cfirst is used 7091430ceebSBram Moolenaar try 7101430ceebSBram Moolenaar cnext 7111430ceebSBram Moolenaar catch 7121430ceebSBram Moolenaar cfirst 7131430ceebSBram Moolenaar endtry 7141430ceebSBram Moolenaar enddef 7151430ceebSBram Moolenaar 7161430ceebSBram Moolenaar CnextOrCfirst() 7171430ceebSBram Moolenaar CnextOrCfirst() 7181430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7191430ceebSBram Moolenaar qall 7201430ceebSBram Moolenaar END 7211430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7221430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7231430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7241430ceebSBram Moolenaar 7251430ceebSBram Moolenaar delete('Xfile1') 7261430ceebSBram Moolenaar delete('Xfile2') 7271430ceebSBram Moolenaar delete('XCatchCnext') 7281430ceebSBram Moolenaar delete('Xresult') 7291430ceebSBram Moolenaarenddef 7301430ceebSBram Moolenaar 7319e1d9e34SBram Moolenaardef Test_throw_skipped() 7329e1d9e34SBram Moolenaar if 0 7339e1d9e34SBram Moolenaar throw dontgethere 7349e1d9e34SBram Moolenaar endif 7359e1d9e34SBram Moolenaarenddef 7369e1d9e34SBram Moolenaar 7378f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7388f81b22eSBram Moolenaar var lines =<< trim END 7398f81b22eSBram Moolenaar vim9script 7408f81b22eSBram Moolenaar def Func() 7418f81b22eSBram Moolenaar throw 'error' 7428f81b22eSBram Moolenaar enddef 7438f81b22eSBram Moolenaar silent! Func() 7448f81b22eSBram Moolenaar END 7458f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7468f81b22eSBram Moolenaar source XthrowSilenced 7478f81b22eSBram Moolenaar delete('XthrowSilenced') 7488f81b22eSBram Moolenaarenddef 7498f81b22eSBram Moolenaar 750e859312eSBram Moolenaardef DeletedFunc(): list<any> 751e859312eSBram Moolenaar return ['delete me'] 752e859312eSBram Moolenaarenddef 753e859312eSBram Moolenaardefcompile 754e859312eSBram Moolenaardelfunc DeletedFunc 755e859312eSBram Moolenaar 756257cc5eeSBram Moolenaardef ThrowFromDef() 757a72cfb80SBram Moolenaar throw "getout" # comment 758257cc5eeSBram Moolenaarenddef 759257cc5eeSBram Moolenaar 760257cc5eeSBram Moolenaarfunc CatchInFunc() 761257cc5eeSBram Moolenaar try 762257cc5eeSBram Moolenaar call ThrowFromDef() 763257cc5eeSBram Moolenaar catch 764257cc5eeSBram Moolenaar let g:thrown_func = v:exception 765257cc5eeSBram Moolenaar endtry 766257cc5eeSBram Moolenaarendfunc 767257cc5eeSBram Moolenaar 768257cc5eeSBram Moolenaardef CatchInDef() 769257cc5eeSBram Moolenaar try 770257cc5eeSBram Moolenaar ThrowFromDef() 771257cc5eeSBram Moolenaar catch 772257cc5eeSBram Moolenaar g:thrown_def = v:exception 773257cc5eeSBram Moolenaar endtry 774257cc5eeSBram Moolenaarenddef 775257cc5eeSBram Moolenaar 776f575adffSBram Moolenaardef ReturnFinally(): string 777f575adffSBram Moolenaar try 778f575adffSBram Moolenaar return 'intry' 779373863edSBram Moolenaar finall 780f575adffSBram Moolenaar g:in_finally = 'finally' 781f575adffSBram Moolenaar endtry 782f575adffSBram Moolenaar return 'end' 783f575adffSBram Moolenaarenddef 784f575adffSBram Moolenaar 785257cc5eeSBram Moolenaardef Test_try_catch_nested() 786257cc5eeSBram Moolenaar CatchInFunc() 787257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 788257cc5eeSBram Moolenaar 789257cc5eeSBram Moolenaar CatchInDef() 790257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 791f575adffSBram Moolenaar 792f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 793f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 794d3d8feebSBram Moolenaar 795d3d8feebSBram Moolenaar var l = [] 796d3d8feebSBram Moolenaar try 797d3d8feebSBram Moolenaar l->add('1') 798d3d8feebSBram Moolenaar throw 'bad' 799d3d8feebSBram Moolenaar l->add('x') 800d3d8feebSBram Moolenaar catch /bad/ 801d3d8feebSBram Moolenaar l->add('2') 802d3d8feebSBram Moolenaar try 803d3d8feebSBram Moolenaar l->add('3') 804d3d8feebSBram Moolenaar throw 'one' 805d3d8feebSBram Moolenaar l->add('x') 806d3d8feebSBram Moolenaar catch /one/ 807d3d8feebSBram Moolenaar l->add('4') 808d3d8feebSBram Moolenaar try 809d3d8feebSBram Moolenaar l->add('5') 810d3d8feebSBram Moolenaar throw 'more' 811d3d8feebSBram Moolenaar l->add('x') 812d3d8feebSBram Moolenaar catch /more/ 813d3d8feebSBram Moolenaar l->add('6') 814d3d8feebSBram Moolenaar endtry 815d3d8feebSBram Moolenaar endtry 816d3d8feebSBram Moolenaar endtry 817d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 818834193afSBram Moolenaar 819834193afSBram Moolenaar l = [] 820834193afSBram Moolenaar try 821834193afSBram Moolenaar try 822834193afSBram Moolenaar l->add('1') 823834193afSBram Moolenaar throw 'foo' 824834193afSBram Moolenaar l->add('x') 825834193afSBram Moolenaar catch 826834193afSBram Moolenaar l->add('2') 827834193afSBram Moolenaar throw 'bar' 828834193afSBram Moolenaar l->add('x') 829834193afSBram Moolenaar finally 830834193afSBram Moolenaar l->add('3') 831834193afSBram Moolenaar endtry 832834193afSBram Moolenaar l->add('x') 833834193afSBram Moolenaar catch /bar/ 834834193afSBram Moolenaar l->add('4') 835834193afSBram Moolenaar endtry 836834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 837f575adffSBram Moolenaarenddef 838f575adffSBram Moolenaar 8399939f57bSBram Moolenaardef TryOne(): number 8409939f57bSBram Moolenaar try 8419939f57bSBram Moolenaar return 0 8429939f57bSBram Moolenaar catch 8439939f57bSBram Moolenaar endtry 8449939f57bSBram Moolenaar return 0 8459939f57bSBram Moolenaarenddef 8469939f57bSBram Moolenaar 8479939f57bSBram Moolenaardef TryTwo(n: number): string 8489939f57bSBram Moolenaar try 849cfcd011fSBram Moolenaar var x = {} 8509939f57bSBram Moolenaar catch 8519939f57bSBram Moolenaar endtry 8529939f57bSBram Moolenaar return 'text' 8539939f57bSBram Moolenaarenddef 8549939f57bSBram Moolenaar 8559939f57bSBram Moolenaardef Test_try_catch_twice() 8569939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8579939f57bSBram Moolenaarenddef 8589939f57bSBram Moolenaar 859f575adffSBram Moolenaardef Test_try_catch_match() 860cfcd011fSBram Moolenaar var seq = 'a' 861f575adffSBram Moolenaar try 862f575adffSBram Moolenaar throw 'something' 863f575adffSBram Moolenaar catch /nothing/ 864f575adffSBram Moolenaar seq ..= 'x' 865f575adffSBram Moolenaar catch /some/ 866f575adffSBram Moolenaar seq ..= 'b' 867f575adffSBram Moolenaar catch /asdf/ 868f575adffSBram Moolenaar seq ..= 'x' 869e8c4abbbSBram Moolenaar catch ?a\?sdf? 870e8c4abbbSBram Moolenaar seq ..= 'y' 871f575adffSBram Moolenaar finally 872f575adffSBram Moolenaar seq ..= 'c' 873f575adffSBram Moolenaar endtry 874f575adffSBram Moolenaar assert_equal('abc', seq) 875257cc5eeSBram Moolenaarenddef 876257cc5eeSBram Moolenaar 877e8c4abbbSBram Moolenaardef Test_try_catch_fails() 878d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 879d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 880d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 881d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 882d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 883d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 884d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 885d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 88613106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 887d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 888585fea7bSBram Moolenaar 889e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 890d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 891e8c4abbbSBram Moolenaarenddef 892e8c4abbbSBram Moolenaar 8937c5b3c03SBram Moolenaardef Try_catch_skipped() 8947c5b3c03SBram Moolenaar var l = [] 8957c5b3c03SBram Moolenaar try 8967c5b3c03SBram Moolenaar finally 8977c5b3c03SBram Moolenaar endtry 8987c5b3c03SBram Moolenaar 8997c5b3c03SBram Moolenaar if 1 9007c5b3c03SBram Moolenaar else 9017c5b3c03SBram Moolenaar try 9027c5b3c03SBram Moolenaar endtry 9037c5b3c03SBram Moolenaar endif 9047c5b3c03SBram Moolenaarenddef 9057c5b3c03SBram Moolenaar 9067c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9077c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9087c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9097c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9107c5b3c03SBram Moolenaarenddef 9117c5b3c03SBram Moolenaar 9127c5b3c03SBram Moolenaar 9137c5b3c03SBram Moolenaar 914006ad48bSBram Moolenaardef Test_throw_vimscript() 915f5be8cdbSBram Moolenaar # only checks line continuation 916cfcd011fSBram Moolenaar var lines =<< trim END 917006ad48bSBram Moolenaar vim9script 918006ad48bSBram Moolenaar try 919006ad48bSBram Moolenaar throw 'one' 920006ad48bSBram Moolenaar .. 'two' 921006ad48bSBram Moolenaar catch 922006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 923006ad48bSBram Moolenaar endtry 924006ad48bSBram Moolenaar END 925006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9261e021e63SBram Moolenaar 9271e021e63SBram Moolenaar lines =<< trim END 9281e021e63SBram Moolenaar vim9script 929352134bbSBram Moolenaar @r = '' 9301e021e63SBram Moolenaar def Func() 9311e021e63SBram Moolenaar throw @r 9321e021e63SBram Moolenaar enddef 9331e021e63SBram Moolenaar var result = '' 9341e021e63SBram Moolenaar try 9351e021e63SBram Moolenaar Func() 9361e021e63SBram Moolenaar catch /E1129:/ 9371e021e63SBram Moolenaar result = 'caught' 9381e021e63SBram Moolenaar endtry 9391e021e63SBram Moolenaar assert_equal('caught', result) 9401e021e63SBram Moolenaar END 9411e021e63SBram Moolenaar CheckScriptSuccess(lines) 942006ad48bSBram Moolenaarenddef 943006ad48bSBram Moolenaar 944ed677f55SBram Moolenaardef Test_error_in_nested_function() 94503dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 946cfcd011fSBram Moolenaar var lines =<< trim END 947ed677f55SBram Moolenaar vim9script 948ed677f55SBram Moolenaar def Func() 949ed677f55SBram Moolenaar Error() 950ed677f55SBram Moolenaar g:test_var = 1 951ed677f55SBram Moolenaar enddef 952ed677f55SBram Moolenaar func Error() abort 953ed677f55SBram Moolenaar eval [][0] 954ed677f55SBram Moolenaar endfunc 955ed677f55SBram Moolenaar Func() 956ed677f55SBram Moolenaar END 957ed677f55SBram Moolenaar g:test_var = 0 958ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 959ed677f55SBram Moolenaar assert_equal(0, g:test_var) 960ed677f55SBram Moolenaarenddef 961ed677f55SBram Moolenaar 962227c58a4SBram Moolenaardef Test_abort_after_error() 963227c58a4SBram Moolenaar var lines =<< trim END 964227c58a4SBram Moolenaar vim9script 965227c58a4SBram Moolenaar while true 966227c58a4SBram Moolenaar echo notfound 967227c58a4SBram Moolenaar endwhile 968227c58a4SBram Moolenaar g:gotthere = true 969227c58a4SBram Moolenaar END 970227c58a4SBram Moolenaar g:gotthere = false 971227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 972227c58a4SBram Moolenaar assert_false(g:gotthere) 973227c58a4SBram Moolenaar unlet g:gotthere 974227c58a4SBram Moolenaarenddef 975227c58a4SBram Moolenaar 97637c83711SBram Moolenaardef Test_cexpr_vimscript() 977f5be8cdbSBram Moolenaar # only checks line continuation 97837c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 979cfcd011fSBram Moolenaar var lines =<< trim END 98037c83711SBram Moolenaar vim9script 98137c83711SBram Moolenaar cexpr 'File' 98237c83711SBram Moolenaar .. ' someFile' .. 98337c83711SBram Moolenaar ' line 19' 98437c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 98537c83711SBram Moolenaar END 98637c83711SBram Moolenaar CheckScriptSuccess(lines) 98737c83711SBram Moolenaar set errorformat& 98837c83711SBram Moolenaarenddef 98937c83711SBram Moolenaar 990c9edd6b5SBram Moolenaardef Test_statusline_syntax() 991c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 992cfcd011fSBram Moolenaar var lines =<< trim END 993c9edd6b5SBram Moolenaar vim9script 994c9edd6b5SBram Moolenaar func g:Status() 995c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 996c9edd6b5SBram Moolenaar endfunc 997c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 998c9edd6b5SBram Moolenaar redrawstatus 999c9edd6b5SBram Moolenaar set laststatus statusline= 1000c9edd6b5SBram Moolenaar END 1001c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1002c9edd6b5SBram Moolenaarenddef 1003c9edd6b5SBram Moolenaar 1004b209750bSBram Moolenaardef Test_list_vimscript() 1005b209750bSBram Moolenaar # checks line continuation and comments 1006cfcd011fSBram Moolenaar var lines =<< trim END 1007b209750bSBram Moolenaar vim9script 1008cfcd011fSBram Moolenaar var mylist = [ 1009b209750bSBram Moolenaar 'one', 1010b209750bSBram Moolenaar # comment 1011b209750bSBram Moolenaar 'two', # empty line follows 1012b209750bSBram Moolenaar 1013b209750bSBram Moolenaar 'three', 1014b209750bSBram Moolenaar ] 1015b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1016b209750bSBram Moolenaar END 1017b209750bSBram Moolenaar CheckScriptSuccess(lines) 101866250c93SBram Moolenaar 101966250c93SBram Moolenaar # check all lines from heredoc are kept 102066250c93SBram Moolenaar lines =<< trim END 102166250c93SBram Moolenaar # comment 1 102266250c93SBram Moolenaar two 102366250c93SBram Moolenaar # comment 3 102466250c93SBram Moolenaar 102566250c93SBram Moolenaar five 102666250c93SBram Moolenaar # comment 6 102766250c93SBram Moolenaar END 102866250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10294bce26bbSBram Moolenaar 10304bce26bbSBram Moolenaar lines =<< trim END 10314bce26bbSBram Moolenaar [{ 10324bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10334bce26bbSBram Moolenaar END 10344bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1035b209750bSBram Moolenaarenddef 1036b209750bSBram Moolenaar 10372a1381c3SBram Moolenaarif has('channel') 103840ee466cSBram Moolenaar let someJob = test_null_job() 103940ee466cSBram Moolenaar 104040ee466cSBram Moolenaar def FuncWithError() 104140ee466cSBram Moolenaar echomsg g:someJob 104240ee466cSBram Moolenaar enddef 104340ee466cSBram Moolenaar 104440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 104540ee466cSBram Moolenaar try 104640ee466cSBram Moolenaar call FuncWithError() 104740ee466cSBram Moolenaar catch 104840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 104940ee466cSBram Moolenaar endtry 105040ee466cSBram Moolenaar endfunc 10512a1381c3SBram Moolenaarendif 105240ee466cSBram Moolenaar 10538a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10548a7d6542SBram Moolenaar vim9script 1055cfcd011fSBram Moolenaar var name: string = 'bob' 10568a7d6542SBram Moolenaar def Concat(arg: string): string 10578a7d6542SBram Moolenaar return name .. arg 10588a7d6542SBram Moolenaar enddef 1059227a69deSBram Moolenaar g:result = Concat('bie') 1060227a69deSBram Moolenaar g:localname = name 10618a7d6542SBram Moolenaar 10628a7d6542SBram Moolenaar export const CONST = 1234 1063cfcd011fSBram Moolenaar export var exported = 9876 1064cfcd011fSBram Moolenaar export var exp_name = 'John' 10658a7d6542SBram Moolenaar export def Exported(): string 10668a7d6542SBram Moolenaar return 'Exported' 10678a7d6542SBram Moolenaar enddef 106824e93165SBram Moolenaar export def ExportedValue(): number 106924e93165SBram Moolenaar return exported 107024e93165SBram Moolenaar enddef 107124e93165SBram Moolenaar export def ExportedInc() 107224e93165SBram Moolenaar exported += 5 107324e93165SBram Moolenaar enddef 10740f2a5cc6SBram Moolenaar export final theList = [1] 10758a7d6542SBram MoolenaarEND 10768a7d6542SBram Moolenaar 1077b3ca9824SBram Moolenaardef Undo_export_script_lines() 1078b3ca9824SBram Moolenaar unlet g:result 1079b3ca9824SBram Moolenaar unlet g:localname 1080b3ca9824SBram Moolenaarenddef 1081b3ca9824SBram Moolenaar 10825269bd2aSBram Moolenaardef Test_vim9_import_export() 1083cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10848a7d6542SBram Moolenaar vim9script 108524e93165SBram Moolenaar import {exported, Exported, ExportedValue} from './Xexport.vim' 108624e93165SBram Moolenaar g:exported1 = exported 10876e587dcbSBram Moolenaar exported += 3 108824e93165SBram Moolenaar g:exported2 = exported 108924e93165SBram Moolenaar g:exported3 = ExportedValue() 109024e93165SBram Moolenaar 109124e93165SBram Moolenaar import ExportedInc from './Xexport.vim' 109224e93165SBram Moolenaar ExportedInc() 109324e93165SBram Moolenaar g:exported_i1 = exported 109424e93165SBram Moolenaar g:exported_i2 = ExportedValue() 109524e93165SBram Moolenaar 109624e93165SBram Moolenaar exported = 11 109724e93165SBram Moolenaar g:exported_s1 = exported 109824e93165SBram Moolenaar g:exported_s2 = ExportedValue() 109924e93165SBram Moolenaar 11008a7d6542SBram Moolenaar g:imported_func = Exported() 11016e587dcbSBram Moolenaar 110240f4f7a4SBram Moolenaar def GetExported(): string 1103e0de171eSBram Moolenaar var local_dict = {ref: Exported} 110440f4f7a4SBram Moolenaar return local_dict.ref() 110540f4f7a4SBram Moolenaar enddef 110640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 110740f4f7a4SBram Moolenaar 11084db572eeSBram Moolenaar var dir = './' 11094db572eeSBram Moolenaar var ext = ".vim" 11104db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 11116e587dcbSBram Moolenaar g:imported_name = exp_name 11126e587dcbSBram Moolenaar exp_name ..= ' Doe' 11136e587dcbSBram Moolenaar g:imported_name_appended = exp_name 111424e93165SBram Moolenaar g:exported_later = exported 11150f2a5cc6SBram Moolenaar 11160f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11170f2a5cc6SBram Moolenaar theList->add(2) 11180f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 11198a7d6542SBram Moolenaar END 11208a7d6542SBram Moolenaar 11218a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11228a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11238a7d6542SBram Moolenaar 11248a7d6542SBram Moolenaar source Ximport.vim 11258a7d6542SBram Moolenaar 11268a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11278a7d6542SBram Moolenaar assert_equal('bob', g:localname) 112824e93165SBram Moolenaar assert_equal(9876, g:exported1) 112924e93165SBram Moolenaar assert_equal(9879, g:exported2) 113024e93165SBram Moolenaar assert_equal(9879, g:exported3) 113124e93165SBram Moolenaar 113224e93165SBram Moolenaar assert_equal(9884, g:exported_i1) 113324e93165SBram Moolenaar assert_equal(9884, g:exported_i2) 113424e93165SBram Moolenaar 113524e93165SBram Moolenaar assert_equal(11, g:exported_s1) 113624e93165SBram Moolenaar assert_equal(11, g:exported_s2) 113724e93165SBram Moolenaar assert_equal(11, g:exported_later) 113824e93165SBram Moolenaar 11398a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 114040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11416e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11426e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11438a7d6542SBram Moolenaar assert_false(exists('g:name')) 11448a7d6542SBram Moolenaar 1145b3ca9824SBram Moolenaar Undo_export_script_lines() 114624e93165SBram Moolenaar unlet g:exported1 114724e93165SBram Moolenaar unlet g:exported2 114824e93165SBram Moolenaar unlet g:exported3 114924e93165SBram Moolenaar unlet g:exported_i1 115024e93165SBram Moolenaar unlet g:exported_i2 115124e93165SBram Moolenaar unlet g:exported_later 11528a7d6542SBram Moolenaar unlet g:imported_func 11536e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11548a7d6542SBram Moolenaar delete('Ximport.vim') 1155f2d5c240SBram Moolenaar 11561c991144SBram Moolenaar # similar, with line breaks 1157cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11581c991144SBram Moolenaar vim9script 11591c991144SBram Moolenaar import { 11601c991144SBram Moolenaar exported, 11611c991144SBram Moolenaar Exported, 11621c991144SBram Moolenaar } 11631c991144SBram Moolenaar from 11641c991144SBram Moolenaar './Xexport.vim' 116524e93165SBram Moolenaar g:exported = exported 116624e93165SBram Moolenaar exported += 7 116724e93165SBram Moolenaar g:exported_added = exported 11681c991144SBram Moolenaar g:imported_func = Exported() 11691c991144SBram Moolenaar END 11701c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11711c991144SBram Moolenaar source Ximport_lbr.vim 11721c991144SBram Moolenaar 117324e93165SBram Moolenaar assert_equal(11, g:exported) 117424e93165SBram Moolenaar assert_equal(18, g:exported_added) 11751c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11761c991144SBram Moolenaar 11771c991144SBram Moolenaar # exported script not sourced again 11781c991144SBram Moolenaar assert_false(exists('g:result')) 117924e93165SBram Moolenaar unlet g:exported 118024e93165SBram Moolenaar unlet g:exported_added 11811c991144SBram Moolenaar unlet g:imported_func 11821c991144SBram Moolenaar delete('Ximport_lbr.vim') 11831c991144SBram Moolenaar 1184cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1185f2d5c240SBram Moolenaar vim9script 1186f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1187f2d5c240SBram Moolenaar def UseExport() 118824e93165SBram Moolenaar g:exported_def = Export.exported 1189f2d5c240SBram Moolenaar enddef 119024e93165SBram Moolenaar g:exported_script = Export.exported 1191cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1192cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1193f2d5c240SBram Moolenaar UseExport() 1194f2d5c240SBram Moolenaar END 1195f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1196f2d5c240SBram Moolenaar source Ximport.vim 119724e93165SBram Moolenaar 119824e93165SBram Moolenaar assert_equal(18, g:exported_def) 119924e93165SBram Moolenaar assert_equal(18, g:exported_script) 120024e93165SBram Moolenaar unlet g:exported_def 120124e93165SBram Moolenaar unlet g:exported_script 1202f2d5c240SBram Moolenaar 1203cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1204599c89c8SBram Moolenaar vim9script 1205599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1206599c89c8SBram Moolenaar def Func() 1207cfcd011fSBram Moolenaar var dummy = 1 1208cfcd011fSBram Moolenaar var imported = Export + dummy 1209599c89c8SBram Moolenaar enddef 1210822ba247SBram Moolenaar defcompile 1211599c89c8SBram Moolenaar END 1212599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 121344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1214599c89c8SBram Moolenaar 1215cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1216599c89c8SBram Moolenaar vim9script 1217599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1218599c89c8SBram Moolenaar def Func() 1219cfcd011fSBram Moolenaar var imported = Export . exported 1220599c89c8SBram Moolenaar enddef 1221822ba247SBram Moolenaar defcompile 1222599c89c8SBram Moolenaar END 1223599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 122444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1225599c89c8SBram Moolenaar 1226a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1227a6294955SBram Moolenaar vim9script 1228a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1229a6294955SBram Moolenaar var some = 'other' 1230a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1231a6294955SBram Moolenaar defcompile 1232a6294955SBram Moolenaar END 1233a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1234a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1235a6294955SBram Moolenaar 1236cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1237cb4e80faSBram Moolenaar vim9script 1238cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1239cb4e80faSBram Moolenaar g:imported_script = Export exported 1240cb4e80faSBram Moolenaar END 1241cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1242cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1243cb4e80faSBram Moolenaar 1244cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1245cb4e80faSBram Moolenaar vim9script 1246cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1247cb4e80faSBram Moolenaar g:imported_script = Export. exported 1248cb4e80faSBram Moolenaar END 1249cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1250cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1251cb4e80faSBram Moolenaar 1252cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1253599c89c8SBram Moolenaar vim9script 1254599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1255599c89c8SBram Moolenaar def Func() 1256cfcd011fSBram Moolenaar var imported = Export. 1257599c89c8SBram Moolenaar enddef 1258822ba247SBram Moolenaar defcompile 1259599c89c8SBram Moolenaar END 1260599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 126144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1262599c89c8SBram Moolenaar 1263cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12641c991144SBram Moolenaar vim9script 12651c991144SBram Moolenaar import * 12661c991144SBram Moolenaar as Export 12671c991144SBram Moolenaar from 12681c991144SBram Moolenaar './Xexport.vim' 12691c991144SBram Moolenaar def UseExport() 127024e93165SBram Moolenaar g:exported = Export.exported 12711c991144SBram Moolenaar enddef 12721c991144SBram Moolenaar UseExport() 12731c991144SBram Moolenaar END 12741c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12751c991144SBram Moolenaar source Ximport.vim 127624e93165SBram Moolenaar assert_equal(18, g:exported) 127724e93165SBram Moolenaar unlet g:exported 12781c991144SBram Moolenaar 1279cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1280f2d5c240SBram Moolenaar vim9script 1281f2d5c240SBram Moolenaar import * from './Xexport.vim' 1282f2d5c240SBram Moolenaar END 1283f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 128444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1285f2d5c240SBram Moolenaar 1286f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1287cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1288fa29c8abSBram Moolenaar vim9script 1289fa29c8abSBram Moolenaar import name from './Xexport.vim' 1290fa29c8abSBram Moolenaar END 1291fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 129244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1293fa29c8abSBram Moolenaar 1294f5be8cdbSBram Moolenaar # try to import something that is already defined 1295cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12965269bd2aSBram Moolenaar vim9script 1297cfcd011fSBram Moolenaar var exported = 'something' 12985269bd2aSBram Moolenaar import exported from './Xexport.vim' 12995269bd2aSBram Moolenaar END 13005269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1301057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13025269bd2aSBram Moolenaar 1303f5be8cdbSBram Moolenaar # try to import something that is already defined 13045269bd2aSBram Moolenaar import_already_defined =<< trim END 13055269bd2aSBram Moolenaar vim9script 1306cfcd011fSBram Moolenaar var exported = 'something' 13075269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13085269bd2aSBram Moolenaar END 13095269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1310057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13115269bd2aSBram Moolenaar 1312f5be8cdbSBram Moolenaar # try to import something that is already defined 13135269bd2aSBram Moolenaar import_already_defined =<< trim END 13145269bd2aSBram Moolenaar vim9script 1315cfcd011fSBram Moolenaar var exported = 'something' 13165269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13175269bd2aSBram Moolenaar END 13185269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1319057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13205269bd2aSBram Moolenaar 1321918a4249SBram Moolenaar # try changing an imported const 1322918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1323918a4249SBram Moolenaar vim9script 1324918a4249SBram Moolenaar import CONST from './Xexport.vim' 1325918a4249SBram Moolenaar def Assign() 1326918a4249SBram Moolenaar CONST = 987 1327918a4249SBram Moolenaar enddef 1328918a4249SBram Moolenaar defcompile 1329918a4249SBram Moolenaar END 1330918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1331918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1332918a4249SBram Moolenaar 13330f2a5cc6SBram Moolenaar # try changing an imported final 13340f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13350f2a5cc6SBram Moolenaar vim9script 13360f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13370f2a5cc6SBram Moolenaar def Assign() 13380f2a5cc6SBram Moolenaar theList = [2] 13390f2a5cc6SBram Moolenaar enddef 13400f2a5cc6SBram Moolenaar defcompile 13410f2a5cc6SBram Moolenaar END 13420f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13430f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13440f2a5cc6SBram Moolenaar 1345f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1346cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1347fa29c8abSBram Moolenaar vim9script 1348fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1349fa29c8abSBram Moolenaar END 1350fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 135144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1352fa29c8abSBram Moolenaar 1353cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1354fa29c8abSBram Moolenaar vim9script 1355fa29c8abSBram Moolenaar import name './Xexport.vim' 1356fa29c8abSBram Moolenaar END 1357fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 135844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1359fa29c8abSBram Moolenaar 1360cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1361fa29c8abSBram Moolenaar vim9script 1362fa29c8abSBram Moolenaar import name from Xexport.vim 1363fa29c8abSBram Moolenaar END 1364fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 13654db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1366fa29c8abSBram Moolenaar 1367cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1368fa29c8abSBram Moolenaar vim9script 1369fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1370fa29c8abSBram Moolenaar END 1371fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 137244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1373fa29c8abSBram Moolenaar 1374cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1375fa29c8abSBram Moolenaar vim9script 1376fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1377fa29c8abSBram Moolenaar END 13785269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 137944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1380fa29c8abSBram Moolenaar 138160579350SBram Moolenaar var import_redefining_lines =<< trim END 138260579350SBram Moolenaar vim9script 138360579350SBram Moolenaar import exported from './Xexport.vim' 138460579350SBram Moolenaar var exported = 5 138560579350SBram Moolenaar END 138660579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 138760579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 138860579350SBram Moolenaar 138960579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 139060579350SBram Moolenaar vim9script 139160579350SBram Moolenaar import exported from './Xexport.vim' 139260579350SBram Moolenaar exported = 'xxx' 139360579350SBram Moolenaar END 139460579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 139560579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 139660579350SBram Moolenaar 139760579350SBram Moolenaar var import_assign_const_lines =<< trim END 139860579350SBram Moolenaar vim9script 139960579350SBram Moolenaar import CONST from './Xexport.vim' 140060579350SBram Moolenaar CONST = 4321 140160579350SBram Moolenaar END 140260579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 140360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 140460579350SBram Moolenaar 1405f2d5c240SBram Moolenaar delete('Ximport.vim') 14065269bd2aSBram Moolenaar delete('Ximport3.vim') 14078a7d6542SBram Moolenaar delete('Xexport.vim') 14088a7d6542SBram Moolenaar 1409f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14103e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14113e191694SBram Moolenaar set cpo=abcd 1412cfcd011fSBram Moolenaar var lines =<< trim END 1413750802b5SBram Moolenaar vim9script 1414750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14153e191694SBram Moolenaar set cpo+=f 14163e191694SBram Moolenaar set cpo-=c 14173e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1418750802b5SBram Moolenaar END 1419750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1420750802b5SBram Moolenaar source Xvim9_script 14213e191694SBram Moolenaar assert_equal('fabd', &cpo) 1422750802b5SBram Moolenaar set cpo&vim 1423750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14243e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14253e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14263e191694SBram Moolenaar 1427750802b5SBram Moolenaar delete('Xvim9_script') 1428750802b5SBram Moolenaarenddef 1429750802b5SBram Moolenaar 14300a84284eSBram Moolenaardef Test_import_as() 14310a84284eSBram Moolenaar var export_lines =<< trim END 14320a84284eSBram Moolenaar vim9script 14330a84284eSBram Moolenaar export var one = 1 14340a84284eSBram Moolenaar export var yes = 'yes' 1435c967d57aSBram Moolenaar export var slist: list<string> 14360a84284eSBram Moolenaar END 14370a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14380a84284eSBram Moolenaar 14390a84284eSBram Moolenaar var import_lines =<< trim END 14400a84284eSBram Moolenaar vim9script 14416c7cc347SBram Moolenaar var one = 'notused' 14426c7cc347SBram Moolenaar var yes = 777 14430a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14440a84284eSBram Moolenaar assert_equal(1, thatOne) 14450a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14460a84284eSBram Moolenaar assert_equal('yes', yesYes) 14470a84284eSBram Moolenaar END 14480a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14490a84284eSBram Moolenaar 14500a84284eSBram Moolenaar import_lines =<< trim END 14510a84284eSBram Moolenaar vim9script 14520a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14530a84284eSBram Moolenaar assert_equal(1, thatOne) 14540a84284eSBram Moolenaar assert_equal('yes', yesYes) 14550a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14560a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14570a84284eSBram Moolenaar END 14580a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14590a84284eSBram Moolenaar 1460c967d57aSBram Moolenaar import_lines =<< trim END 1461c967d57aSBram Moolenaar vim9script 1462c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1463c967d57aSBram Moolenaar impSlist->add(123) 1464c967d57aSBram Moolenaar END 1465c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1466c967d57aSBram Moolenaar 14670a84284eSBram Moolenaar delete('XexportAs') 14680a84284eSBram Moolenaarenddef 14690a84284eSBram Moolenaar 1470803af686SBram Moolenaarfunc g:Trigger() 1471803af686SBram Moolenaar source Ximport.vim 1472803af686SBram Moolenaar return "echo 'yes'\<CR>" 1473803af686SBram Moolenaarendfunc 1474803af686SBram Moolenaar 1475803af686SBram Moolenaardef Test_import_export_expr_map() 1476803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1477cfcd011fSBram Moolenaar var export_lines =<< trim END 1478803af686SBram Moolenaar vim9script 1479803af686SBram Moolenaar export def That(): string 1480803af686SBram Moolenaar return 'yes' 1481803af686SBram Moolenaar enddef 1482803af686SBram Moolenaar END 1483803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1484803af686SBram Moolenaar 1485cfcd011fSBram Moolenaar var import_lines =<< trim END 1486803af686SBram Moolenaar vim9script 1487803af686SBram Moolenaar import That from './Xexport_that.vim' 1488803af686SBram Moolenaar assert_equal('yes', That()) 1489803af686SBram Moolenaar END 1490803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1491803af686SBram Moolenaar 1492803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1493803af686SBram Moolenaar feedkeys('trigger', "xt") 1494803af686SBram Moolenaar 1495730b2483SBram Moolenaar delete('Xexport_that.vim') 1496803af686SBram Moolenaar delete('Ximport.vim') 1497803af686SBram Moolenaar nunmap trigger 1498803af686SBram Moolenaarenddef 1499803af686SBram Moolenaar 15008e1986e3SBram Moolenaardef Test_import_in_filetype() 15018e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15028e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1503cfcd011fSBram Moolenaar var export_lines =<< trim END 15048e1986e3SBram Moolenaar vim9script 1505cfcd011fSBram Moolenaar export var That = 'yes' 15068e1986e3SBram Moolenaar END 1507730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15088e1986e3SBram Moolenaar 1509cfcd011fSBram Moolenaar var import_lines =<< trim END 15108e1986e3SBram Moolenaar vim9script 1511730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15128e1986e3SBram Moolenaar assert_equal('yes', That) 15138e1986e3SBram Moolenaar g:did_load_mytpe = 1 15148e1986e3SBram Moolenaar END 15158e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15168e1986e3SBram Moolenaar 1517cfcd011fSBram Moolenaar var save_rtp = &rtp 15188e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15198e1986e3SBram Moolenaar 15208e1986e3SBram Moolenaar filetype plugin on 15218e1986e3SBram Moolenaar copen 15228e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15238e1986e3SBram Moolenaar 15248e1986e3SBram Moolenaar quit! 1525730b2483SBram Moolenaar delete('Xexport_ft.vim') 15268e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15278e1986e3SBram Moolenaar &rtp = save_rtp 15288e1986e3SBram Moolenaarenddef 15298e1986e3SBram Moolenaar 1530efa94447SBram Moolenaardef Test_use_import_in_mapping() 1531cfcd011fSBram Moolenaar var lines =<< trim END 1532efa94447SBram Moolenaar vim9script 1533efa94447SBram Moolenaar export def Funcx() 1534efa94447SBram Moolenaar g:result = 42 1535efa94447SBram Moolenaar enddef 1536efa94447SBram Moolenaar END 1537efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1538efa94447SBram Moolenaar lines =<< trim END 1539efa94447SBram Moolenaar vim9script 1540efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1541b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1542efa94447SBram Moolenaar END 1543efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1544efa94447SBram Moolenaar 1545efa94447SBram Moolenaar source Xmapscript.vim 1546b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1547efa94447SBram Moolenaar assert_equal(42, g:result) 1548efa94447SBram Moolenaar 1549efa94447SBram Moolenaar unlet g:result 1550efa94447SBram Moolenaar delete('XsomeExport.vim') 1551efa94447SBram Moolenaar delete('Xmapscript.vim') 1552b3ca9824SBram Moolenaar nunmap <F3> 1553efa94447SBram Moolenaarenddef 1554efa94447SBram Moolenaar 1555d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1556d3f8a9eeSBram Moolenaar var lines =<< trim END 1557d3f8a9eeSBram Moolenaar if has(g:feature) 1558d3f8a9eeSBram Moolenaar " legacy script 1559d3f8a9eeSBram Moolenaar let g:legacy = 1 1560d3f8a9eeSBram Moolenaar finish 1561d3f8a9eeSBram Moolenaar endif 1562d3f8a9eeSBram Moolenaar vim9script 1563d3f8a9eeSBram Moolenaar g:legacy = 0 1564d3f8a9eeSBram Moolenaar END 1565d3f8a9eeSBram Moolenaar g:feature = 'eval' 1566d3f8a9eeSBram Moolenaar g:legacy = -1 1567d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1568d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1569d3f8a9eeSBram Moolenaar 1570d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1571d3f8a9eeSBram Moolenaar g:legacy = -1 1572d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1573d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1574d3f8a9eeSBram Moolenaarenddef 1575d3f8a9eeSBram Moolenaar 1576750802b5SBram Moolenaardef Test_vim9script_fails() 15778a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15788a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1579cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15809721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1581cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1582750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1583750802b5SBram Moolenaar 1584cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1585c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1586c785b9a7SBram Moolenaar 1587e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1588e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15898a7d6542SBram Moolenaarenddef 15908a7d6542SBram Moolenaar 1591f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1592101f4810SBram Moolenaar CheckRunVimInTerminal 1593101f4810SBram Moolenaar 15949bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1595c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15969bb3eb3eSBram Moolenaarendfunc 15979bb3eb3eSBram Moolenaar 1598c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1599cfcd011fSBram Moolenaar var export =<< trim END 1600101f4810SBram Moolenaar vim9script 1601101f4810SBram Moolenaar export def Foo(): number 1602101f4810SBram Moolenaar return 0 1603101f4810SBram Moolenaar enddef 1604101f4810SBram Moolenaar END 1605730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1606101f4810SBram Moolenaar 1607e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16089bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16092949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1610101f4810SBram Moolenaar 1611730b2483SBram Moolenaar delete('XexportCmd.vim') 16129bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16139bb3eb3eSBram Moolenaarenddef 1614101f4810SBram Moolenaar 16152b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16162b32700dSBram Moolenaar var lines =<< trim END 1617a6294955SBram Moolenaar vim9script 1618a6294955SBram Moolenaar export var exported = 'thexport' 1619a6294955SBram Moolenaar END 1620a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1621a6294955SBram Moolenaar lines =<< trim END 16222b32700dSBram Moolenaar vim9script noclear 16232b32700dSBram Moolenaar g:loadCount += 1 16242b32700dSBram Moolenaar var s:reloaded = 'init' 1625a6294955SBram Moolenaar import exported from './XExportReload' 16262b32700dSBram Moolenaar 16272b32700dSBram Moolenaar def Again(): string 16282b32700dSBram Moolenaar return 'again' 16292b32700dSBram Moolenaar enddef 16302b32700dSBram Moolenaar 16312b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16322b32700dSBram Moolenaar var s:loaded = true 16332b32700dSBram Moolenaar 16342b32700dSBram Moolenaar var s:notReloaded = 'yes' 16352b32700dSBram Moolenaar s:reloaded = 'first' 16362b32700dSBram Moolenaar def g:Values(): list<string> 1637a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16382b32700dSBram Moolenaar enddef 16392b32700dSBram Moolenaar 16402b32700dSBram Moolenaar def Once(): string 16412b32700dSBram Moolenaar return 'once' 16422b32700dSBram Moolenaar enddef 16432b32700dSBram Moolenaar END 16442b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16452b32700dSBram Moolenaar g:loadCount = 0 16462b32700dSBram Moolenaar source XReloaded 16472b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1648a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16492b32700dSBram Moolenaar source XReloaded 16502b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1651a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16522b32700dSBram Moolenaar source XReloaded 16532b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1654a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16552b32700dSBram Moolenaar 165648e11c10SBram Moolenaar delete('XReloaded') 1657a6294955SBram Moolenaar delete('XExportReload') 16582b32700dSBram Moolenaar delfunc g:Values 16592b32700dSBram Moolenaar unlet g:loadCount 1660577dc93dSBram Moolenaar 1661577dc93dSBram Moolenaar lines =<< trim END 1662577dc93dSBram Moolenaar vim9script 1663577dc93dSBram Moolenaar def Inner() 1664577dc93dSBram Moolenaar enddef 1665577dc93dSBram Moolenaar END 1666577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1667577dc93dSBram Moolenaar source XreloadScript.vim 1668577dc93dSBram Moolenaar 1669577dc93dSBram Moolenaar lines =<< trim END 1670577dc93dSBram Moolenaar vim9script 1671577dc93dSBram Moolenaar def Outer() 1672577dc93dSBram Moolenaar def Inner() 1673577dc93dSBram Moolenaar enddef 1674577dc93dSBram Moolenaar enddef 1675577dc93dSBram Moolenaar defcompile 1676577dc93dSBram Moolenaar END 1677577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1678577dc93dSBram Moolenaar source XreloadScript.vim 1679577dc93dSBram Moolenaar 1680577dc93dSBram Moolenaar delete('XreloadScript.vim') 16812b32700dSBram Moolenaarenddef 16822b32700dSBram Moolenaar 16834c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1684cfcd011fSBram Moolenaar var lines =<< trim END 16858a7d6542SBram Moolenaar vim9script 16868a7d6542SBram Moolenaar const var = '' 1687cfcd011fSBram Moolenaar var valone = 1234 16888a7d6542SBram Moolenaar def MyFunc(arg: string) 16898a7d6542SBram Moolenaar valone = 5678 16908a7d6542SBram Moolenaar enddef 16918a7d6542SBram Moolenaar END 1692cfcd011fSBram Moolenaar var morelines =<< trim END 1693cfcd011fSBram Moolenaar var valtwo = 222 16948a7d6542SBram Moolenaar export def GetValtwo(): number 16958a7d6542SBram Moolenaar return valtwo 16968a7d6542SBram Moolenaar enddef 16978a7d6542SBram Moolenaar END 169803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16998a7d6542SBram Moolenaar source Xreload.vim 17008a7d6542SBram Moolenaar source Xreload.vim 17018a7d6542SBram Moolenaar source Xreload.vim 17028a7d6542SBram Moolenaar 1703f5be8cdbSBram Moolenaar # cannot declare a var twice 17048a7d6542SBram Moolenaar lines =<< trim END 17058a7d6542SBram Moolenaar vim9script 1706cfcd011fSBram Moolenaar var valone = 1234 1707cfcd011fSBram Moolenaar var valone = 5678 17088a7d6542SBram Moolenaar END 17098a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 171044d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17118a7d6542SBram Moolenaar 17128a7d6542SBram Moolenaar delete('Xreload.vim') 17138a7d6542SBram Moolenaar delete('Ximport.vim') 17148a7d6542SBram Moolenaarenddef 17158a7d6542SBram Moolenaar 171607a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 171707a65d26SBram Moolenaar" compiled function using that variable must fail. 171807a65d26SBram Moolenaardef Test_script_reload_change_type() 171907a65d26SBram Moolenaar var lines =<< trim END 172007a65d26SBram Moolenaar vim9script noclear 172107a65d26SBram Moolenaar var str = 'string' 172207a65d26SBram Moolenaar def g:GetStr(): string 172307a65d26SBram Moolenaar return str .. 'xxx' 172407a65d26SBram Moolenaar enddef 172507a65d26SBram Moolenaar END 172607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 172707a65d26SBram Moolenaar source Xreload.vim 172807a65d26SBram Moolenaar echo g:GetStr() 172907a65d26SBram Moolenaar 173007a65d26SBram Moolenaar lines =<< trim END 173107a65d26SBram Moolenaar vim9script noclear 173207a65d26SBram Moolenaar var str = 1234 173307a65d26SBram Moolenaar END 173407a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 173507a65d26SBram Moolenaar source Xreload.vim 173607a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 173707a65d26SBram Moolenaar 173807a65d26SBram Moolenaar delfunc g:GetStr 173907a65d26SBram Moolenaar delete('Xreload.vim') 174007a65d26SBram Moolenaarenddef 174107a65d26SBram Moolenaar 1742c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1743c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1744c970e422SBram Moolenaar 1745c970e422SBram Moolenaardef Test_script_reload_from_function() 1746c970e422SBram Moolenaar var lines =<< trim END 1747c970e422SBram Moolenaar vim9script 1748c970e422SBram Moolenaar 1749c970e422SBram Moolenaar if exists('g:loaded') 1750c970e422SBram Moolenaar finish 1751c970e422SBram Moolenaar endif 1752c970e422SBram Moolenaar g:loaded = 1 1753c970e422SBram Moolenaar delcommand CallFunc 1754c970e422SBram Moolenaar command CallFunc Func() 1755c970e422SBram Moolenaar def Func() 1756a4c81beaSBram Moolenaar so XreloadFunc.vim 1757c970e422SBram Moolenaar g:didTheFunc = 1 1758c970e422SBram Moolenaar enddef 1759c970e422SBram Moolenaar END 1760c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1761c970e422SBram Moolenaar source XreloadFunc.vim 1762c970e422SBram Moolenaar CallFunc 1763c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1764c970e422SBram Moolenaar 1765c970e422SBram Moolenaar delete('XreloadFunc.vim') 1766c970e422SBram Moolenaar delcommand CallFunc 1767c970e422SBram Moolenaar unlet g:loaded 1768c970e422SBram Moolenaar unlet g:didTheFunc 1769c970e422SBram Moolenaarenddef 1770c970e422SBram Moolenaar 17716c3843caSBram Moolenaardef Test_script_var_shadows_function() 17726c3843caSBram Moolenaar var lines =<< trim END 17736c3843caSBram Moolenaar vim9script 17746c3843caSBram Moolenaar def Func(): number 17756c3843caSBram Moolenaar return 123 17766c3843caSBram Moolenaar enddef 17776c3843caSBram Moolenaar var Func = 1 17786c3843caSBram Moolenaar END 17796c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17806c3843caSBram Moolenaarenddef 17816c3843caSBram Moolenaar 1782c323527dSBram Moolenaardef Test_script_var_shadows_command() 1783c323527dSBram Moolenaar var lines =<< trim END 1784c323527dSBram Moolenaar var undo = 1 1785c323527dSBram Moolenaar undo = 2 1786c323527dSBram Moolenaar assert_equal(2, undo) 1787c323527dSBram Moolenaar END 1788c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1789c323527dSBram Moolenaar 1790c323527dSBram Moolenaar lines =<< trim END 1791c323527dSBram Moolenaar var undo = 1 1792c323527dSBram Moolenaar undo 1793c323527dSBram Moolenaar END 1794c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1795c323527dSBram Moolenaarenddef 1796c323527dSBram Moolenaar 179795006e3dSBram Moolenaardef s:RetSome(): string 179895006e3dSBram Moolenaar return 'some' 179995006e3dSBram Moolenaarenddef 180095006e3dSBram Moolenaar 1801fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1802fe465a01SBram Moolenaar" script-local name. 1803fe465a01SBram Moolenaardef Test_vim9script_funcref() 1804cfcd011fSBram Moolenaar var sortlines =<< trim END 1805fe465a01SBram Moolenaar vim9script 1806fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1807bed36b93SBram Moolenaar return i2 - i1 1808fe465a01SBram Moolenaar enddef 1809fe465a01SBram Moolenaar 1810fe465a01SBram Moolenaar export def FastSort(): list<number> 1811fe465a01SBram Moolenaar return range(5)->sort(Compare) 1812fe465a01SBram Moolenaar enddef 1813529fb5a5SBram Moolenaar 1814529fb5a5SBram Moolenaar export def GetString(arg: string): string 1815529fb5a5SBram Moolenaar return arg 1816529fb5a5SBram Moolenaar enddef 1817fe465a01SBram Moolenaar END 1818fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1819fe465a01SBram Moolenaar 1820cfcd011fSBram Moolenaar var lines =<< trim END 1821fe465a01SBram Moolenaar vim9script 1822fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1823fe465a01SBram Moolenaar def Test() 1824fe465a01SBram Moolenaar g:result = FastSort() 1825fe465a01SBram Moolenaar enddef 1826fe465a01SBram Moolenaar Test() 1827529fb5a5SBram Moolenaar 1828529fb5a5SBram Moolenaar # using a function imported with "as" 1829529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1830529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1831529fb5a5SBram Moolenaar 1832529fb5a5SBram Moolenaar # using the function from a compiled function 1833529fb5a5SBram Moolenaar def TestMore(): string 1834ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1835ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1836529fb5a5SBram Moolenaar enddef 1837ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1838529fb5a5SBram Moolenaar 1839529fb5a5SBram Moolenaar # error when using a function that isn't exported 1840529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1841fe465a01SBram Moolenaar END 1842fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1843fe465a01SBram Moolenaar 1844fe465a01SBram Moolenaar source Xscript.vim 1845fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1846fe465a01SBram Moolenaar 1847fe465a01SBram Moolenaar unlet g:result 1848fe465a01SBram Moolenaar delete('Xsort.vim') 1849fe465a01SBram Moolenaar delete('Xscript.vim') 185095006e3dSBram Moolenaar 1851cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 185295006e3dSBram Moolenaar assert_equal('some', Funcref()) 1853fe465a01SBram Moolenaarenddef 1854fe465a01SBram Moolenaar 1855601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1856601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1857601e76acSBram Moolenaar" function reference. 1858c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1859cfcd011fSBram Moolenaar var filterLines =<< trim END 1860c620c055SBram Moolenaar vim9script 1861c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1862c620c055SBram Moolenaar return idx % 2 == 1 1863c620c055SBram Moolenaar enddef 1864c620c055SBram Moolenaar export def FastFilter(): list<number> 1865c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1866c620c055SBram Moolenaar enddef 1867601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1868601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1869601e76acSBram Moolenaar enddef 1870c620c055SBram Moolenaar END 1871c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1872c620c055SBram Moolenaar 1873cfcd011fSBram Moolenaar var lines =<< trim END 1874c620c055SBram Moolenaar vim9script 1875601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1876c620c055SBram Moolenaar def Test() 1877cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1878c620c055SBram Moolenaar enddef 1879c620c055SBram Moolenaar Test() 1880601e76acSBram Moolenaar def TestDirect() 1881cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1882601e76acSBram Moolenaar enddef 1883601e76acSBram Moolenaar TestDirect() 1884c620c055SBram Moolenaar END 1885601e76acSBram Moolenaar CheckScriptSuccess(lines) 1886c620c055SBram Moolenaar delete('Xfilter.vim') 1887c620c055SBram Moolenaarenddef 1888c620c055SBram Moolenaar 18894c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1890cfcd011fSBram Moolenaar var first_lines =<< trim END 18914c17ad94SBram Moolenaar vim9script 18924c17ad94SBram Moolenaar def FuncYes(): string 18934c17ad94SBram Moolenaar return 'yes' 18944c17ad94SBram Moolenaar enddef 18954c17ad94SBram Moolenaar END 1896cfcd011fSBram Moolenaar var withno_lines =<< trim END 18974c17ad94SBram Moolenaar def FuncNo(): string 18984c17ad94SBram Moolenaar return 'no' 18994c17ad94SBram Moolenaar enddef 19004c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19014c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19024c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 190303afdcf1SBram Moolenaar enddef 190403afdcf1SBram Moolenaar END 1905cfcd011fSBram Moolenaar var nono_lines =<< trim END 190603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 190703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 190844d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19094c17ad94SBram Moolenaar enddef 19104c17ad94SBram Moolenaar END 19114c17ad94SBram Moolenaar 19124c17ad94SBram Moolenaar # FuncNo() is defined 191303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19144c17ad94SBram Moolenaar source Xreloaded.vim 19154c17ad94SBram Moolenaar g:DoCheck(true) 19164c17ad94SBram Moolenaar 19174c17ad94SBram Moolenaar # FuncNo() is not redefined 191803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19194c17ad94SBram Moolenaar source Xreloaded.vim 19205082471fSBram Moolenaar g:DoCheck(false) 19214c17ad94SBram Moolenaar 19224c17ad94SBram Moolenaar # FuncNo() is back 192303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19244c17ad94SBram Moolenaar source Xreloaded.vim 19255082471fSBram Moolenaar g:DoCheck(false) 19264c17ad94SBram Moolenaar 19274c17ad94SBram Moolenaar delete('Xreloaded.vim') 19284c17ad94SBram Moolenaarenddef 19294c17ad94SBram Moolenaar 193089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 193189483d40SBram Moolenaar # write the script with a script-local variable 1932cfcd011fSBram Moolenaar var lines =<< trim END 193389483d40SBram Moolenaar vim9script 1934cfcd011fSBram Moolenaar var name = 'string' 193589483d40SBram Moolenaar END 193689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 193789483d40SBram Moolenaar source XreloadVar.vim 193889483d40SBram Moolenaar 193989483d40SBram Moolenaar # now write the script using the same variable locally - works 194089483d40SBram Moolenaar lines =<< trim END 194189483d40SBram Moolenaar vim9script 194289483d40SBram Moolenaar def Func() 1943cfcd011fSBram Moolenaar var name = 'string' 194489483d40SBram Moolenaar enddef 194589483d40SBram Moolenaar END 194689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 194789483d40SBram Moolenaar source XreloadVar.vim 194889483d40SBram Moolenaar 194989483d40SBram Moolenaar delete('XreloadVar.vim') 195089483d40SBram Moolenaarenddef 195189483d40SBram Moolenaar 19528a7d6542SBram Moolenaardef Test_import_absolute() 1953cfcd011fSBram Moolenaar var import_lines = [ 1954e6085c53SBram Moolenaar 'vim9script', 1955e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1956e6085c53SBram Moolenaar 'def UseExported()', 1957e6085c53SBram Moolenaar ' g:imported_abs = exported', 1958e6085c53SBram Moolenaar ' exported = 8888', 1959e6085c53SBram Moolenaar ' g:imported_after = exported', 1960e6085c53SBram Moolenaar 'enddef', 1961e6085c53SBram Moolenaar 'UseExported()', 1962e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1963e6085c53SBram Moolenaar ] 19648a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19658a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19668a7d6542SBram Moolenaar 19678a7d6542SBram Moolenaar source Ximport_abs.vim 19688a7d6542SBram Moolenaar 19698a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19704e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1971fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1972fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1973fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1974fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1975fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1976fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1977fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1978fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1979fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1980fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1981e6085c53SBram Moolenaar g:import_disassembled) 1982b3ca9824SBram Moolenaar 1983b3ca9824SBram Moolenaar Undo_export_script_lines() 19848a7d6542SBram Moolenaar unlet g:imported_abs 19854e12a5dfSBram Moolenaar unlet g:import_disassembled 19868a7d6542SBram Moolenaar 19878a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19888a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19898a7d6542SBram Moolenaarenddef 19908a7d6542SBram Moolenaar 19918a7d6542SBram Moolenaardef Test_import_rtp() 1992cfcd011fSBram Moolenaar var import_lines = [ 1993e6085c53SBram Moolenaar 'vim9script', 1994e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1995e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1996e6085c53SBram Moolenaar ] 19978a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 1998b885a7c7SBram Moolenaar mkdir('import', 'p') 1999b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20008a7d6542SBram Moolenaar 2001cfcd011fSBram Moolenaar var save_rtp = &rtp 20028a7d6542SBram Moolenaar &rtp = getcwd() 20038a7d6542SBram Moolenaar source Ximport_rtp.vim 20048a7d6542SBram Moolenaar &rtp = save_rtp 20058a7d6542SBram Moolenaar 20068a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20078a7d6542SBram Moolenaar 2008b3ca9824SBram Moolenaar Undo_export_script_lines() 2009b3ca9824SBram Moolenaar unlet g:imported_rtp 20108a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2011b885a7c7SBram Moolenaar delete('import', 'rf') 20128a7d6542SBram Moolenaarenddef 20138a7d6542SBram Moolenaar 201425e0f586SBram Moolenaardef Test_import_compile_error() 2015cfcd011fSBram Moolenaar var export_lines = [ 201625e0f586SBram Moolenaar 'vim9script', 201725e0f586SBram Moolenaar 'export def ExpFunc(): string', 201825e0f586SBram Moolenaar ' return notDefined', 201925e0f586SBram Moolenaar 'enddef', 202025e0f586SBram Moolenaar ] 202125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 202225e0f586SBram Moolenaar 2023cfcd011fSBram Moolenaar var import_lines = [ 202425e0f586SBram Moolenaar 'vim9script', 202525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 202625e0f586SBram Moolenaar 'def ImpFunc()', 202725e0f586SBram Moolenaar ' echo ExpFunc()', 202825e0f586SBram Moolenaar 'enddef', 202925e0f586SBram Moolenaar 'defcompile', 203025e0f586SBram Moolenaar ] 203125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 203225e0f586SBram Moolenaar 203325e0f586SBram Moolenaar try 203425e0f586SBram Moolenaar source Ximport.vim 203525e0f586SBram Moolenaar catch /E1001/ 2036f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20377707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 203825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 203925e0f586SBram Moolenaar endtry 204025e0f586SBram Moolenaar 204125e0f586SBram Moolenaar delete('Xexported.vim') 204225e0f586SBram Moolenaar delete('Ximport.vim') 204325e0f586SBram Moolenaarenddef 204425e0f586SBram Moolenaar 2045c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2046cfcd011fSBram Moolenaar var lines = [ 2047c4ce36d4SBram Moolenaar 'vim9script', 2048c4ce36d4SBram Moolenaar 'def Func()', 2049c4ce36d4SBram Moolenaar ' eval [][0]', 2050c4ce36d4SBram Moolenaar 'enddef', 2051c4ce36d4SBram Moolenaar 'Func()', 2052c4ce36d4SBram Moolenaar ] 2053c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2054c4ce36d4SBram Moolenaar 2055c4ce36d4SBram Moolenaar for count in range(3) 2056c4ce36d4SBram Moolenaar try 2057c4ce36d4SBram Moolenaar source Xtestscript.vim 2058c4ce36d4SBram Moolenaar catch /E684/ 2059c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2060c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2061c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2062c4ce36d4SBram Moolenaar endtry 2063c4ce36d4SBram Moolenaar endfor 2064c4ce36d4SBram Moolenaar 2065c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2066c4ce36d4SBram Moolenaarenddef 2067c4ce36d4SBram Moolenaar 2068eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2069cfcd011fSBram Moolenaar var export_lines =<< trim END 2070eef2102eSBram Moolenaar vim9script 2071eef2102eSBram Moolenaar export def Func() 2072eef2102eSBram Moolenaar echo 'imported' 2073eef2102eSBram Moolenaar enddef 2074eef2102eSBram Moolenaar END 2075eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2076eef2102eSBram Moolenaar 2077cfcd011fSBram Moolenaar var lines =<< trim END 2078eef2102eSBram Moolenaar vim9script 2079eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2080eef2102eSBram Moolenaar def Func() 2081eef2102eSBram Moolenaar echo 'local to function' 2082eef2102eSBram Moolenaar enddef 2083eef2102eSBram Moolenaar END 2084eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2085eef2102eSBram Moolenaar 2086eef2102eSBram Moolenaar lines =<< trim END 2087eef2102eSBram Moolenaar vim9script 2088eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2089eef2102eSBram Moolenaar def Outer() 2090eef2102eSBram Moolenaar def Func() 2091eef2102eSBram Moolenaar echo 'local to function' 2092eef2102eSBram Moolenaar enddef 2093eef2102eSBram Moolenaar enddef 2094eef2102eSBram Moolenaar defcompile 2095eef2102eSBram Moolenaar END 2096eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2097eef2102eSBram Moolenaar 2098eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2099eef2102eSBram Moolenaarenddef 2100eef2102eSBram Moolenaar 2101b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2102cfcd011fSBram Moolenaar var lines =<< trim END 2103b9a2cac3SBram Moolenaar vim9script 2104b9a2cac3SBram Moolenaar def Func() 2105b9a2cac3SBram Moolenaar echo 'one' 2106b9a2cac3SBram Moolenaar enddef 2107b9a2cac3SBram Moolenaar def Func() 2108b9a2cac3SBram Moolenaar echo 'two' 2109b9a2cac3SBram Moolenaar enddef 2110b9a2cac3SBram Moolenaar END 2111b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2112fa211f3cSBram Moolenaar 2113fa211f3cSBram Moolenaar lines =<< trim END 2114fa211f3cSBram Moolenaar vim9script 2115fa211f3cSBram Moolenaar def Foo(): string 2116fa211f3cSBram Moolenaar return 'foo' 2117fa211f3cSBram Moolenaar enddef 2118fa211f3cSBram Moolenaar def Func() 2119cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2120fa211f3cSBram Moolenaar enddef 2121fa211f3cSBram Moolenaar defcompile 2122fa211f3cSBram Moolenaar END 2123fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2124b9a2cac3SBram Moolenaarenddef 2125b9a2cac3SBram Moolenaar 21268a7d6542SBram Moolenaardef Test_fixed_size_list() 2127f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2128cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21298a7d6542SBram Moolenaar l->remove(0) 21308a7d6542SBram Moolenaar l->add(5) 21318a7d6542SBram Moolenaar l->insert(99, 1) 21320f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21338a7d6542SBram Moolenaarenddef 21348a7d6542SBram Moolenaar 2135ae616494SBram Moolenaardef Test_no_insert_xit() 2136d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2137d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2138d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2139d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2140d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2141ae616494SBram Moolenaar 2142ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2143ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2144ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2145ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2146f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2147f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21486508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21496508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2150f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2151f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2152f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2153ae616494SBram Moolenaarenddef 2154ae616494SBram Moolenaar 2155158906cfSBram Moolenaardef IfElse(what: number): string 2156cfcd011fSBram Moolenaar var res = '' 2157158906cfSBram Moolenaar if what == 1 2158158906cfSBram Moolenaar res = "one" 2159158906cfSBram Moolenaar elseif what == 2 2160158906cfSBram Moolenaar res = "two" 2161a259d8d3SBram Moolenaar else 2162158906cfSBram Moolenaar res = "three" 2163a259d8d3SBram Moolenaar endif 2164158906cfSBram Moolenaar return res 2165a259d8d3SBram Moolenaarenddef 2166a259d8d3SBram Moolenaar 2167158906cfSBram Moolenaardef Test_if_elseif_else() 2168158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2169158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2170158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21710f18b6d1SBram Moolenaarenddef 21720f18b6d1SBram Moolenaar 2173e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2174d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2175d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2176d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2177ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2178d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21796628b7ebSBram Moolenaar 21806628b7ebSBram Moolenaar var lines =<< trim END 21816628b7ebSBram Moolenaar var s = '' 21826628b7ebSBram Moolenaar if s = '' 21836628b7ebSBram Moolenaar endif 21846628b7ebSBram Moolenaar END 21856628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 21866628b7ebSBram Moolenaar 21876628b7ebSBram Moolenaar lines =<< trim END 21886628b7ebSBram Moolenaar var s = '' 21896628b7ebSBram Moolenaar if s == '' 21906628b7ebSBram Moolenaar elseif s = '' 21916628b7ebSBram Moolenaar endif 21926628b7ebSBram Moolenaar END 21936628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2194e8c4abbbSBram Moolenaarenddef 2195e8c4abbbSBram Moolenaar 21966d69bf60SBram Moolenaarlet g:bool_true = v:true 21976d69bf60SBram Moolenaarlet g:bool_false = v:false 21986d69bf60SBram Moolenaar 21996d69bf60SBram Moolenaardef Test_if_const_expr() 2200cfcd011fSBram Moolenaar var res = false 22016d69bf60SBram Moolenaar if true ? true : false 22026d69bf60SBram Moolenaar res = true 22036d69bf60SBram Moolenaar endif 22046d69bf60SBram Moolenaar assert_equal(true, res) 22056d69bf60SBram Moolenaar 2206585fea7bSBram Moolenaar g:glob = 2 2207585fea7bSBram Moolenaar if false 22086797966dSBram Moolenaar execute('g:glob = 3') 2209585fea7bSBram Moolenaar endif 2210585fea7bSBram Moolenaar assert_equal(2, g:glob) 2211585fea7bSBram Moolenaar if true 22126797966dSBram Moolenaar execute('g:glob = 3') 2213585fea7bSBram Moolenaar endif 2214585fea7bSBram Moolenaar assert_equal(3, g:glob) 2215585fea7bSBram Moolenaar 22166d69bf60SBram Moolenaar res = false 22176d69bf60SBram Moolenaar if g:bool_true ? true : false 22186d69bf60SBram Moolenaar res = true 22196d69bf60SBram Moolenaar endif 22206d69bf60SBram Moolenaar assert_equal(true, res) 22216d69bf60SBram Moolenaar 22226d69bf60SBram Moolenaar res = false 22236d69bf60SBram Moolenaar if true ? g:bool_true : false 22246d69bf60SBram Moolenaar res = true 22256d69bf60SBram Moolenaar endif 22266d69bf60SBram Moolenaar assert_equal(true, res) 22276d69bf60SBram Moolenaar 22286d69bf60SBram Moolenaar res = false 22296d69bf60SBram Moolenaar if true ? true : g:bool_false 22306d69bf60SBram Moolenaar res = true 22316d69bf60SBram Moolenaar endif 22326d69bf60SBram Moolenaar assert_equal(true, res) 22336d69bf60SBram Moolenaar 22346d69bf60SBram Moolenaar res = false 22356d69bf60SBram Moolenaar if true ? false : true 22366d69bf60SBram Moolenaar res = true 22376d69bf60SBram Moolenaar endif 22386d69bf60SBram Moolenaar assert_equal(false, res) 22396d69bf60SBram Moolenaar 22406d69bf60SBram Moolenaar res = false 22416d69bf60SBram Moolenaar if false ? false : true 22426d69bf60SBram Moolenaar res = true 22436d69bf60SBram Moolenaar endif 22446d69bf60SBram Moolenaar assert_equal(true, res) 22456d69bf60SBram Moolenaar 22466d69bf60SBram Moolenaar res = false 22476d69bf60SBram Moolenaar if false ? true : false 22486d69bf60SBram Moolenaar res = true 22496d69bf60SBram Moolenaar endif 22506d69bf60SBram Moolenaar assert_equal(false, res) 22516d69bf60SBram Moolenaar 22526d69bf60SBram Moolenaar res = false 2253e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2254e8c4abbbSBram Moolenaar res = true 2255e8c4abbbSBram Moolenaar endif 2256e8c4abbbSBram Moolenaar assert_equal(false, res) 2257e8c4abbbSBram Moolenaar 2258e8c4abbbSBram Moolenaar res = false 22596d69bf60SBram Moolenaar if true && true 22606d69bf60SBram Moolenaar res = true 22616d69bf60SBram Moolenaar endif 22626d69bf60SBram Moolenaar assert_equal(true, res) 22636d69bf60SBram Moolenaar 22646d69bf60SBram Moolenaar res = false 22656d69bf60SBram Moolenaar if true && false 22666d69bf60SBram Moolenaar res = true 22676d69bf60SBram Moolenaar endif 22686d69bf60SBram Moolenaar assert_equal(false, res) 22696d69bf60SBram Moolenaar 22706d69bf60SBram Moolenaar res = false 22716d69bf60SBram Moolenaar if g:bool_true && false 22726d69bf60SBram Moolenaar res = true 22736d69bf60SBram Moolenaar endif 22746d69bf60SBram Moolenaar assert_equal(false, res) 22756d69bf60SBram Moolenaar 22766d69bf60SBram Moolenaar res = false 22776d69bf60SBram Moolenaar if true && g:bool_false 22786d69bf60SBram Moolenaar res = true 22796d69bf60SBram Moolenaar endif 22806d69bf60SBram Moolenaar assert_equal(false, res) 22816d69bf60SBram Moolenaar 22826d69bf60SBram Moolenaar res = false 22836d69bf60SBram Moolenaar if false && false 22846d69bf60SBram Moolenaar res = true 22856d69bf60SBram Moolenaar endif 22866d69bf60SBram Moolenaar assert_equal(false, res) 22876d69bf60SBram Moolenaar 22886d69bf60SBram Moolenaar res = false 22896d69bf60SBram Moolenaar if true || false 22906d69bf60SBram Moolenaar res = true 22916d69bf60SBram Moolenaar endif 22926d69bf60SBram Moolenaar assert_equal(true, res) 22936d69bf60SBram Moolenaar 22946d69bf60SBram Moolenaar res = false 22956d69bf60SBram Moolenaar if g:bool_true || false 22966d69bf60SBram Moolenaar res = true 22976d69bf60SBram Moolenaar endif 22986d69bf60SBram Moolenaar assert_equal(true, res) 22996d69bf60SBram Moolenaar 23006d69bf60SBram Moolenaar res = false 23016d69bf60SBram Moolenaar if true || g:bool_false 23026d69bf60SBram Moolenaar res = true 23036d69bf60SBram Moolenaar endif 23046d69bf60SBram Moolenaar assert_equal(true, res) 23056d69bf60SBram Moolenaar 23066d69bf60SBram Moolenaar res = false 23076d69bf60SBram Moolenaar if false || false 23086d69bf60SBram Moolenaar res = true 23096d69bf60SBram Moolenaar endif 23106d69bf60SBram Moolenaar assert_equal(false, res) 23113988f64fSBram Moolenaar 23123988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2313c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23143988f64fSBram Moolenaar if false | eval burp + 234 | endif 23153988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23163988f64fSBram Moolenaar if false 23173988f64fSBram Moolenaar burp 23183988f64fSBram Moolenaar endif 231980c34ca3SBram Moolenaarenddef 23206d69bf60SBram Moolenaar 232180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2322d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2323d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2324d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2325d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23266d69bf60SBram Moolenaarenddef 23276d69bf60SBram Moolenaar 232872abcf42SBram Moolenaardef RunNested(i: number): number 2329cfcd011fSBram Moolenaar var x: number = 0 233072abcf42SBram Moolenaar if i % 2 233172abcf42SBram Moolenaar if 1 2332f5be8cdbSBram Moolenaar # comment 233372abcf42SBram Moolenaar else 2334f5be8cdbSBram Moolenaar # comment 233572abcf42SBram Moolenaar endif 233672abcf42SBram Moolenaar x += 1 233772abcf42SBram Moolenaar else 233872abcf42SBram Moolenaar x += 1000 233972abcf42SBram Moolenaar endif 234072abcf42SBram Moolenaar return x 234172abcf42SBram Moolenaarenddef 234272abcf42SBram Moolenaar 234372abcf42SBram Moolenaardef Test_nested_if() 234472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 234572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 234672abcf42SBram Moolenaarenddef 234772abcf42SBram Moolenaar 2348ad39c094SBram Moolenaardef Test_execute_cmd() 2349e4984290SBram Moolenaar # missing argument is ignored 2350e4984290SBram Moolenaar execute 2351e4984290SBram Moolenaar execute # comment 2352e4984290SBram Moolenaar 2353ad39c094SBram Moolenaar new 2354ad39c094SBram Moolenaar setline(1, 'default') 2355d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2356ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2357a72cfb80SBram Moolenaar 2358d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2359a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2360a72cfb80SBram Moolenaar 2361cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2362cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2363a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2364ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2365a72cfb80SBram Moolenaar 2366d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2367ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2368a72cfb80SBram Moolenaar 2369cfcd011fSBram Moolenaar var cmd_first = 'call ' 2370cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2371ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2372ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2373ad39c094SBram Moolenaar bwipe! 2374585fea7bSBram Moolenaar 2375cfcd011fSBram Moolenaar var n = true 23762d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23772d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23782d6b20d6SBram Moolenaar 2379e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2380e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2381e5abf7afSBram Moolenaar 2382d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2383d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2384d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2385ad39c094SBram Moolenaarenddef 2386ad39c094SBram Moolenaar 238747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2388f5be8cdbSBram Moolenaar # only checks line continuation 2389cfcd011fSBram Moolenaar var lines =<< trim END 239047e880d6SBram Moolenaar vim9script 239147e880d6SBram Moolenaar execute 'g:someVar' 239247e880d6SBram Moolenaar .. ' = ' .. 239347e880d6SBram Moolenaar '28' 239447e880d6SBram Moolenaar assert_equal(28, g:someVar) 239547e880d6SBram Moolenaar unlet g:someVar 239647e880d6SBram Moolenaar END 239747e880d6SBram Moolenaar CheckScriptSuccess(lines) 239847e880d6SBram Moolenaarenddef 239947e880d6SBram Moolenaar 2400ad39c094SBram Moolenaardef Test_echo_cmd() 2401a72cfb80SBram Moolenaar echo 'some' # comment 2402585fea7bSBram Moolenaar echon 'thing' 2403ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2404ad39c094SBram Moolenaar 2405a72cfb80SBram Moolenaar echo "some" # comment 2406a72cfb80SBram Moolenaar echon "thing" 2407a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2408a72cfb80SBram Moolenaar 2409cfcd011fSBram Moolenaar var str1 = 'some' 2410cfcd011fSBram Moolenaar var str2 = 'more' 2411ad39c094SBram Moolenaar echo str1 str2 2412ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2413a72cfb80SBram Moolenaar 2414d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2415ad39c094SBram Moolenaarenddef 2416ad39c094SBram Moolenaar 2417f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2418f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2419f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2420f93c7feaSBram Moolenaar echo 'clear' 2421df069eecSBram Moolenaar :1messages 2422f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2423f93c7feaSBram Moolenaar 2424d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2425f93c7feaSBram Moolenaarenddef 2426f93c7feaSBram Moolenaar 242747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2428f5be8cdbSBram Moolenaar # only checks line continuation 2429cfcd011fSBram Moolenaar var lines =<< trim END 243047e880d6SBram Moolenaar vim9script 243147e880d6SBram Moolenaar echomsg 'here' 243247e880d6SBram Moolenaar .. ' is ' .. 243347e880d6SBram Moolenaar 'a message' 243447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 243547e880d6SBram Moolenaar END 243647e880d6SBram Moolenaar CheckScriptSuccess(lines) 243747e880d6SBram Moolenaarenddef 243847e880d6SBram Moolenaar 2439f93c7feaSBram Moolenaardef Test_echoerr_cmd() 244040ee466cSBram Moolenaar try 244140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 244240ee466cSBram Moolenaar catch 244340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 244440ee466cSBram Moolenaar endtry 2445f93c7feaSBram Moolenaarenddef 2446f93c7feaSBram Moolenaar 244747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2448f5be8cdbSBram Moolenaar # only checks line continuation 2449cfcd011fSBram Moolenaar var lines =<< trim END 245047e880d6SBram Moolenaar vim9script 245147e880d6SBram Moolenaar try 245247e880d6SBram Moolenaar echoerr 'this' 245347e880d6SBram Moolenaar .. ' is ' .. 245447e880d6SBram Moolenaar 'wrong' 245547e880d6SBram Moolenaar catch 245647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 245747e880d6SBram Moolenaar endtry 245847e880d6SBram Moolenaar END 245947e880d6SBram Moolenaar CheckScriptSuccess(lines) 246047e880d6SBram Moolenaarenddef 246147e880d6SBram Moolenaar 246241fe0617SBram Moolenaardef Test_for_outside_of_function() 2463cfcd011fSBram Moolenaar var lines =<< trim END 246441fe0617SBram Moolenaar vim9script 246541fe0617SBram Moolenaar new 246641fe0617SBram Moolenaar for var in range(0, 3) 246741fe0617SBram Moolenaar append(line('$'), var) 246841fe0617SBram Moolenaar endfor 246941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 247041fe0617SBram Moolenaar bwipe! 2471522eefd9SBram Moolenaar 2472522eefd9SBram Moolenaar var result = '' 2473522eefd9SBram Moolenaar for i in [1, 2, 3] 2474522eefd9SBram Moolenaar var loop = ' loop ' .. i 2475522eefd9SBram Moolenaar result ..= loop 2476522eefd9SBram Moolenaar endfor 2477522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 247841fe0617SBram Moolenaar END 247941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 248041fe0617SBram Moolenaar source Xvim9for.vim 248141fe0617SBram Moolenaar delete('Xvim9for.vim') 248241fe0617SBram Moolenaarenddef 24838a7d6542SBram Moolenaar 2484e8c4abbbSBram Moolenaardef Test_for_loop() 2485f2253963SBram Moolenaar var lines =<< trim END 2486cfcd011fSBram Moolenaar var result = '' 2487e8c4abbbSBram Moolenaar for cnt in range(7) 2488e8c4abbbSBram Moolenaar if cnt == 4 2489e8c4abbbSBram Moolenaar break 2490e8c4abbbSBram Moolenaar endif 2491e8c4abbbSBram Moolenaar if cnt == 2 2492e8c4abbbSBram Moolenaar continue 2493e8c4abbbSBram Moolenaar endif 2494e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2495e8c4abbbSBram Moolenaar endfor 2496e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24970ad3e894SBram Moolenaar 2498cfcd011fSBram Moolenaar var concat = '' 24990ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25000ad3e894SBram Moolenaar concat ..= str 25010ad3e894SBram Moolenaar endfor 25020ad3e894SBram Moolenaar assert_equal('onetwo', concat) 250338bd8de5SBram Moolenaar 250438bd8de5SBram Moolenaar var total = 0 250538bd8de5SBram Moolenaar for nr in 250638bd8de5SBram Moolenaar [1, 2, 3] 250738bd8de5SBram Moolenaar total += nr 250838bd8de5SBram Moolenaar endfor 250938bd8de5SBram Moolenaar assert_equal(6, total) 251038bd8de5SBram Moolenaar 251138bd8de5SBram Moolenaar total = 0 251238bd8de5SBram Moolenaar for nr 251338bd8de5SBram Moolenaar in [1, 2, 3] 251438bd8de5SBram Moolenaar total += nr 251538bd8de5SBram Moolenaar endfor 251638bd8de5SBram Moolenaar assert_equal(6, total) 251738bd8de5SBram Moolenaar 251838bd8de5SBram Moolenaar total = 0 251938bd8de5SBram Moolenaar for nr 252038bd8de5SBram Moolenaar in 252138bd8de5SBram Moolenaar [1, 2, 3] 252238bd8de5SBram Moolenaar total += nr 252338bd8de5SBram Moolenaar endfor 252438bd8de5SBram Moolenaar assert_equal(6, total) 2525036d0714SBram Moolenaar 2526a3589a0dSBram Moolenaar # with type 2527a3589a0dSBram Moolenaar total = 0 2528a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2529a3589a0dSBram Moolenaar total += n 2530a3589a0dSBram Moolenaar endfor 2531a3589a0dSBram Moolenaar assert_equal(6, total) 2532a3589a0dSBram Moolenaar 2533fe090eb5SBram Moolenaar var chars = '' 2534fe090eb5SBram Moolenaar for s: string in 'foobar' 2535fe090eb5SBram Moolenaar chars ..= s 2536fe090eb5SBram Moolenaar endfor 2537fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2538fe090eb5SBram Moolenaar 25395ede5b23SBram Moolenaar chars = '' 25405ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25415ede5b23SBram Moolenaar chars ..= x 25425ede5b23SBram Moolenaar endfor 25435ede5b23SBram Moolenaar assert_equal('ab', chars) 25445ede5b23SBram Moolenaar 2545a3589a0dSBram Moolenaar # unpack with type 2546f2253963SBram Moolenaar var res = '' 2547a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2548a3589a0dSBram Moolenaar res ..= n .. s 2549a3589a0dSBram Moolenaar endfor 2550a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2551a3589a0dSBram Moolenaar 2552444d8783SBram Moolenaar # unpack with one var 2553444d8783SBram Moolenaar var reslist = [] 2554444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2555444d8783SBram Moolenaar reslist->add(x) 2556444d8783SBram Moolenaar endfor 2557444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2558444d8783SBram Moolenaar 2559a3589a0dSBram Moolenaar # loop over string 2560a3589a0dSBram Moolenaar res = '' 256174e54fcbSBram Moolenaar for c in 'aéc̀d' 256274e54fcbSBram Moolenaar res ..= c .. '-' 256374e54fcbSBram Moolenaar endfor 256474e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 256574e54fcbSBram Moolenaar 256674e54fcbSBram Moolenaar res = '' 256774e54fcbSBram Moolenaar for c in '' 256874e54fcbSBram Moolenaar res ..= c .. '-' 256974e54fcbSBram Moolenaar endfor 257074e54fcbSBram Moolenaar assert_equal('', res) 257174e54fcbSBram Moolenaar 257274e54fcbSBram Moolenaar res = '' 257374e54fcbSBram Moolenaar for c in test_null_string() 257474e54fcbSBram Moolenaar res ..= c .. '-' 257574e54fcbSBram Moolenaar endfor 257674e54fcbSBram Moolenaar assert_equal('', res) 2577f2253963SBram Moolenaar 2578f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2579f2253963SBram Moolenaar {a: 'Cat'} 2580f2253963SBram Moolenaar ] 2581f2253963SBram Moolenaar for dd in foo 2582f2253963SBram Moolenaar dd.counter = 12 2583f2253963SBram Moolenaar endfor 2584f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2585ad2d4969SBram Moolenaar 2586ad2d4969SBram Moolenaar reslist = [] 2587ad2d4969SBram Moolenaar for _ in range(3) 2588ad2d4969SBram Moolenaar reslist->add('x') 2589ad2d4969SBram Moolenaar endfor 2590ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2591f2253963SBram Moolenaar END 2592f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2593e8c4abbbSBram Moolenaarenddef 2594e8c4abbbSBram Moolenaar 25952eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 25962eb6fc3bSBram Moolenaar var lines =<< trim END 25972eb6fc3bSBram Moolenaar var flist: list<func> 25982eb6fc3bSBram Moolenaar for i in range(5) 25992eb6fc3bSBram Moolenaar var inloop = i 26002eb6fc3bSBram Moolenaar flist[i] = () => inloop 26012eb6fc3bSBram Moolenaar endfor 26022eb6fc3bSBram Moolenaar for i in range(5) 26032eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26042eb6fc3bSBram Moolenaar endfor 26052eb6fc3bSBram Moolenaar END 26062eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26072eb6fc3bSBram Moolenaar 26082eb6fc3bSBram Moolenaar lines =<< trim END 26092eb6fc3bSBram Moolenaar var flist: list<func> 26102eb6fc3bSBram Moolenaar for i in range(5) 26112eb6fc3bSBram Moolenaar var inloop = i 26122eb6fc3bSBram Moolenaar flist[i] = () => { 26132eb6fc3bSBram Moolenaar return inloop 26142eb6fc3bSBram Moolenaar } 26152eb6fc3bSBram Moolenaar endfor 26162eb6fc3bSBram Moolenaar for i in range(5) 26172eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26182eb6fc3bSBram Moolenaar endfor 26192eb6fc3bSBram Moolenaar END 26202eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26212eb6fc3bSBram Moolenaarenddef 26222eb6fc3bSBram Moolenaar 2623e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2624442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2625442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2626442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2627442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2628442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2629442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2630d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2631822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 26322d870f8dSBram Moolenaar delfunc! g:Func 2633675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2634675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2635675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 263674e54fcbSBram Moolenaar 263774e54fcbSBram Moolenaar # wrong type detected at compile time 263874e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 263974e54fcbSBram Moolenaar 264074e54fcbSBram Moolenaar # wrong type detected at runtime 264174e54fcbSBram Moolenaar g:adict = {a: 1} 264274e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 264374e54fcbSBram Moolenaar unlet g:adict 2644f6a8d420SBram Moolenaar 2645f6a8d420SBram Moolenaar var lines =<< trim END 2646f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2647f6a8d420SBram Moolenaar for e in d 2648f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2649f6a8d420SBram Moolenaar endfor 2650f6a8d420SBram Moolenaar END 2651f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2652fe090eb5SBram Moolenaar 2653fe090eb5SBram Moolenaar lines =<< trim END 2654fe090eb5SBram Moolenaar for nr: number in ['foo'] 2655fe090eb5SBram Moolenaar endfor 2656fe090eb5SBram Moolenaar END 2657fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2658404557e6SBram Moolenaar 2659404557e6SBram Moolenaar lines =<< trim END 2660404557e6SBram Moolenaar for n : number in [1, 2] 2661404557e6SBram Moolenaar echo n 2662404557e6SBram Moolenaar endfor 2663404557e6SBram Moolenaar END 2664404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2665efc5db52SBram Moolenaar 2666efc5db52SBram Moolenaar lines =<< trim END 2667efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2668efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2669efc5db52SBram Moolenaar echo k v 2670efc5db52SBram Moolenaar endfor 2671efc5db52SBram Moolenaar END 2672efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2673e8c4abbbSBram Moolenaarenddef 2674e8c4abbbSBram Moolenaar 2675ea87069dSBram Moolenaardef Test_for_loop_script_var() 2676ea87069dSBram Moolenaar # cannot use s:var in a :def function 2677ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2678ea87069dSBram Moolenaar 2679ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2680ea87069dSBram Moolenaar var lines =<< trim END 2681ea87069dSBram Moolenaar vim9script 2682ea87069dSBram Moolenaar var total = 0 2683ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2684ea87069dSBram Moolenaar total += s:var 2685ea87069dSBram Moolenaar endfor 2686ea87069dSBram Moolenaar assert_equal(6, total) 2687ea87069dSBram Moolenaar 2688ea87069dSBram Moolenaar total = 0 2689ea87069dSBram Moolenaar for var in [1, 2, 3] 2690ea87069dSBram Moolenaar total += var 2691ea87069dSBram Moolenaar endfor 2692ea87069dSBram Moolenaar assert_equal(6, total) 2693ea87069dSBram Moolenaar END 2694ea87069dSBram Moolenaarenddef 2695ea87069dSBram Moolenaar 2696792f786aSBram Moolenaardef Test_for_loop_unpack() 26974b8a0651SBram Moolenaar var lines =<< trim END 2698792f786aSBram Moolenaar var result = [] 2699792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2700792f786aSBram Moolenaar result->add(v1) 2701792f786aSBram Moolenaar result->add(v2) 2702792f786aSBram Moolenaar endfor 2703792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2704792f786aSBram Moolenaar 2705792f786aSBram Moolenaar result = [] 2706792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2707792f786aSBram Moolenaar result->add(v1) 2708792f786aSBram Moolenaar result->add(v2) 2709792f786aSBram Moolenaar result->add(v3) 2710792f786aSBram Moolenaar endfor 2711792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2712792f786aSBram Moolenaar 27134b8a0651SBram Moolenaar result = [] 27144b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 27154b8a0651SBram Moolenaar result->add(&ts) 27164b8a0651SBram Moolenaar result->add(&sw) 27174b8a0651SBram Moolenaar endfor 27184b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 27194b8a0651SBram Moolenaar 27204b8a0651SBram Moolenaar var slist: list<string> 27214b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 27224b8a0651SBram Moolenaar slist->add($LOOPVAR) 27234b8a0651SBram Moolenaar slist->add(@r) 27244b8a0651SBram Moolenaar slist->add(v:errmsg) 27254b8a0651SBram Moolenaar endfor 27264b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 27274b8a0651SBram Moolenaar 27284b8a0651SBram Moolenaar slist = [] 27294b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 27304b8a0651SBram Moolenaar slist->add(g:globalvar) 27314b8a0651SBram Moolenaar slist->add(b:bufvar) 27324b8a0651SBram Moolenaar slist->add(w:winvar) 27334b8a0651SBram Moolenaar slist->add(t:tabvar) 27344b8a0651SBram Moolenaar endfor 27354b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2736f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2737b777da9bSBram Moolenaar 2738b777da9bSBram Moolenaar var res = [] 2739b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2740b777da9bSBram Moolenaar res->add(n) 2741b777da9bSBram Moolenaar endfor 2742b777da9bSBram Moolenaar assert_equal([2, 5], res) 27434b8a0651SBram Moolenaar END 27444b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 27454b8a0651SBram Moolenaar 27464b8a0651SBram Moolenaar lines =<< trim END 2747792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2748792f786aSBram Moolenaar echo v1 v2 2749792f786aSBram Moolenaar endfor 2750792f786aSBram Moolenaar END 2751792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2752792f786aSBram Moolenaar 2753792f786aSBram Moolenaar lines =<< trim END 2754792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2755792f786aSBram Moolenaar echo v1 v2 2756792f786aSBram Moolenaar endfor 2757792f786aSBram Moolenaar END 2758792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2759792f786aSBram Moolenaar 2760792f786aSBram Moolenaar lines =<< trim END 2761792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2762792f786aSBram Moolenaar echo v1 2763792f786aSBram Moolenaar endfor 2764792f786aSBram Moolenaar END 2765792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2766792f786aSBram Moolenaarenddef 2767792f786aSBram Moolenaar 2768c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2769f2253963SBram Moolenaar var lines =<< trim END 2770c150c09eSBram Moolenaar var looped = 0 2771c150c09eSBram Moolenaar var cleanup = 0 2772c150c09eSBram Moolenaar for i in range(3) 2773c150c09eSBram Moolenaar looped += 1 2774c150c09eSBram Moolenaar try 2775c150c09eSBram Moolenaar eval [][0] 2776c150c09eSBram Moolenaar catch 2777c150c09eSBram Moolenaar continue 2778c150c09eSBram Moolenaar finally 2779c150c09eSBram Moolenaar cleanup += 1 2780c150c09eSBram Moolenaar endtry 2781c150c09eSBram Moolenaar endfor 2782c150c09eSBram Moolenaar assert_equal(3, looped) 2783c150c09eSBram Moolenaar assert_equal(3, cleanup) 2784f2253963SBram Moolenaar END 2785f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2786c150c09eSBram Moolenaarenddef 2787c150c09eSBram Moolenaar 2788d0df1aacSBram Moolenaardef Test_while_loop() 2789cfcd011fSBram Moolenaar var result = '' 2790cfcd011fSBram Moolenaar var cnt = 0 2791d0df1aacSBram Moolenaar while cnt < 555 2792d0df1aacSBram Moolenaar if cnt == 3 2793d0df1aacSBram Moolenaar break 2794d0df1aacSBram Moolenaar endif 2795d0df1aacSBram Moolenaar cnt += 1 2796d0df1aacSBram Moolenaar if cnt == 2 2797d0df1aacSBram Moolenaar continue 2798d0df1aacSBram Moolenaar endif 2799d0df1aacSBram Moolenaar result ..= cnt .. '_' 2800d0df1aacSBram Moolenaar endwhile 2801d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2802dee37dc7SBram Moolenaar 2803dee37dc7SBram Moolenaar var s = '' 28040123cc1eSBram Moolenaar while s == 'x' # {comment} 2805dee37dc7SBram Moolenaar endwhile 2806d0df1aacSBram Moolenaarenddef 2807d0df1aacSBram Moolenaar 2808e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2809675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2810675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2811675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2812675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2813675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2814675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2815675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 28166628b7ebSBram Moolenaar 28176628b7ebSBram Moolenaar var lines =<< trim END 28186628b7ebSBram Moolenaar var s = '' 28196628b7ebSBram Moolenaar while s = '' 28206628b7ebSBram Moolenaar endwhile 28216628b7ebSBram Moolenaar END 28226628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2823bd5da371SBram Moolenaarenddef 2824bd5da371SBram Moolenaar 28259645e2d9SBram Moolenaardef Test_interrupt_loop() 2826cfcd011fSBram Moolenaar var caught = false 2827cfcd011fSBram Moolenaar var x = 0 282897acfc78SBram Moolenaar try 28299645e2d9SBram Moolenaar while 1 28309645e2d9SBram Moolenaar x += 1 28319645e2d9SBram Moolenaar if x == 100 28329645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 28339645e2d9SBram Moolenaar endif 28349645e2d9SBram Moolenaar endwhile 283597acfc78SBram Moolenaar catch 283697acfc78SBram Moolenaar caught = true 283797acfc78SBram Moolenaar assert_equal(100, x) 283897acfc78SBram Moolenaar endtry 283997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 284025859dd7SBram Moolenaar # consume the CTRL-C 284125859dd7SBram Moolenaar getchar(0) 28429645e2d9SBram Moolenaarenddef 284320431c9dSBram Moolenaar 28444fdae999SBram Moolenaardef Test_automatic_line_continuation() 2845cfcd011fSBram Moolenaar var mylist = [ 28464fdae999SBram Moolenaar 'one', 28474fdae999SBram Moolenaar 'two', 28484fdae999SBram Moolenaar 'three', 2849f5be8cdbSBram Moolenaar ] # comment 28504fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 28514fdae999SBram Moolenaar 2852cfcd011fSBram Moolenaar var mydict = { 2853e0de171eSBram Moolenaar ['one']: 1, 2854e0de171eSBram Moolenaar ['two']: 2, 2855e0de171eSBram Moolenaar ['three']: 28564fdae999SBram Moolenaar 3, 2857f5be8cdbSBram Moolenaar } # comment 2858e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2859e0de171eSBram Moolenaar mydict = { 28602c330432SBram Moolenaar one: 1, # comment 28612c330432SBram Moolenaar two: # comment 28622c330432SBram Moolenaar 2, # comment 28632c330432SBram Moolenaar three: 3 # comment 28642c330432SBram Moolenaar } 2865e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2866e0de171eSBram Moolenaar mydict = { 28672c330432SBram Moolenaar one: 1, 28684fdae999SBram Moolenaar two: 28694fdae999SBram Moolenaar 2, 28702c330432SBram Moolenaar three: 3 28714fdae999SBram Moolenaar } 2872e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2873e6085c53SBram Moolenaar 2874e6085c53SBram Moolenaar assert_equal( 2875e6085c53SBram Moolenaar ['one', 'two', 'three'], 2876e6085c53SBram Moolenaar split('one two three') 2877e6085c53SBram Moolenaar ) 28784fdae999SBram Moolenaarenddef 28794fdae999SBram Moolenaar 28807a092245SBram Moolenaardef Test_vim9_comment() 28817a092245SBram Moolenaar CheckScriptSuccess([ 28827a092245SBram Moolenaar 'vim9script', 28837a092245SBram Moolenaar '# something', 288493f82cbeSBram Moolenaar '#something', 288593f82cbeSBram Moolenaar '#{something', 28867a092245SBram Moolenaar ]) 288793f82cbeSBram Moolenaar 288893f82cbeSBram Moolenaar split Xfile 288993f82cbeSBram Moolenaar CheckScriptSuccess([ 289093f82cbeSBram Moolenaar 'vim9script', 289193f82cbeSBram Moolenaar 'edit #something', 289293f82cbeSBram Moolenaar ]) 289393f82cbeSBram Moolenaar CheckScriptSuccess([ 289493f82cbeSBram Moolenaar 'vim9script', 289593f82cbeSBram Moolenaar 'edit #{something', 289693f82cbeSBram Moolenaar ]) 289793f82cbeSBram Moolenaar close 289893f82cbeSBram Moolenaar 28997a092245SBram Moolenaar CheckScriptFailure([ 29007a092245SBram Moolenaar 'vim9script', 29017a092245SBram Moolenaar ':# something', 29027a092245SBram Moolenaar ], 'E488:') 29037a092245SBram Moolenaar CheckScriptFailure([ 29047a092245SBram Moolenaar '# something', 29057a092245SBram Moolenaar ], 'E488:') 29067a092245SBram Moolenaar CheckScriptFailure([ 29077a092245SBram Moolenaar ':# something', 29087a092245SBram Moolenaar ], 'E488:') 29097a092245SBram Moolenaar 29104a8d9f2eSBram Moolenaar { # block start 29114a8d9f2eSBram Moolenaar } # block end 29124a8d9f2eSBram Moolenaar CheckDefFailure([ 29134a8d9f2eSBram Moolenaar '{# comment', 29144a8d9f2eSBram Moolenaar ], 'E488:') 29154a8d9f2eSBram Moolenaar CheckDefFailure([ 29164a8d9f2eSBram Moolenaar '{', 29174a8d9f2eSBram Moolenaar '}# comment', 29184a8d9f2eSBram Moolenaar ], 'E488:') 29194a8d9f2eSBram Moolenaar 29204a8d9f2eSBram Moolenaar echo "yes" # comment 29214a8d9f2eSBram Moolenaar CheckDefFailure([ 29224a8d9f2eSBram Moolenaar 'echo "yes"# comment', 29234a8d9f2eSBram Moolenaar ], 'E488:') 29247a092245SBram Moolenaar CheckScriptSuccess([ 29257a092245SBram Moolenaar 'vim9script', 29267a092245SBram Moolenaar 'echo "yes" # something', 29277a092245SBram Moolenaar ]) 29287a092245SBram Moolenaar CheckScriptFailure([ 29297a092245SBram Moolenaar 'vim9script', 29307a092245SBram Moolenaar 'echo "yes"# something', 29317a092245SBram Moolenaar ], 'E121:') 29327a092245SBram Moolenaar CheckScriptFailure([ 29337a092245SBram Moolenaar 'vim9script', 29347a092245SBram Moolenaar 'echo# something', 2935f8103f27SBram Moolenaar ], 'E1144:') 29367a092245SBram Moolenaar CheckScriptFailure([ 29377a092245SBram Moolenaar 'echo "yes" # something', 29387a092245SBram Moolenaar ], 'E121:') 29397a092245SBram Moolenaar 29404a8d9f2eSBram Moolenaar exe "echo" # comment 29414a8d9f2eSBram Moolenaar CheckDefFailure([ 29424a8d9f2eSBram Moolenaar 'exe "echo"# comment', 29434a8d9f2eSBram Moolenaar ], 'E488:') 29444a8d9f2eSBram Moolenaar CheckScriptSuccess([ 29454a8d9f2eSBram Moolenaar 'vim9script', 29464a8d9f2eSBram Moolenaar 'exe "echo" # something', 29474a8d9f2eSBram Moolenaar ]) 29484a8d9f2eSBram Moolenaar CheckScriptFailure([ 29494a8d9f2eSBram Moolenaar 'vim9script', 29504a8d9f2eSBram Moolenaar 'exe "echo"# something', 29514a8d9f2eSBram Moolenaar ], 'E121:') 29524a8d9f2eSBram Moolenaar CheckScriptFailure([ 29534a8d9f2eSBram Moolenaar 'vim9script', 29544a8d9f2eSBram Moolenaar 'exe# something', 2955f8103f27SBram Moolenaar ], 'E1144:') 29564a8d9f2eSBram Moolenaar CheckScriptFailure([ 29574a8d9f2eSBram Moolenaar 'exe "echo" # something', 29584a8d9f2eSBram Moolenaar ], 'E121:') 29594a8d9f2eSBram Moolenaar 29607a092245SBram Moolenaar CheckDefFailure([ 29617a092245SBram Moolenaar 'try# comment', 29627a092245SBram Moolenaar ' echo "yes"', 29637a092245SBram Moolenaar 'catch', 29647a092245SBram Moolenaar 'endtry', 2965f8103f27SBram Moolenaar ], 'E1144:') 29662c5ed4e3SBram Moolenaar CheckScriptFailure([ 29672c5ed4e3SBram Moolenaar 'vim9script', 29682c5ed4e3SBram Moolenaar 'try# comment', 29692c5ed4e3SBram Moolenaar 'echo "yes"', 2970f8103f27SBram Moolenaar ], 'E1144:') 29717a092245SBram Moolenaar CheckDefFailure([ 29727a092245SBram Moolenaar 'try', 2973a72cfb80SBram Moolenaar ' throw#comment', 2974a72cfb80SBram Moolenaar 'catch', 2975a72cfb80SBram Moolenaar 'endtry', 2976f8103f27SBram Moolenaar ], 'E1144:') 2977a72cfb80SBram Moolenaar CheckDefFailure([ 2978a72cfb80SBram Moolenaar 'try', 2979a72cfb80SBram Moolenaar ' throw "yes"#comment', 2980a72cfb80SBram Moolenaar 'catch', 2981a72cfb80SBram Moolenaar 'endtry', 2982a72cfb80SBram Moolenaar ], 'E488:') 2983a72cfb80SBram Moolenaar CheckDefFailure([ 2984a72cfb80SBram Moolenaar 'try', 29857a092245SBram Moolenaar ' echo "yes"', 29867a092245SBram Moolenaar 'catch# comment', 29877a092245SBram Moolenaar 'endtry', 2988f8103f27SBram Moolenaar ], 'E1144:') 29892c5ed4e3SBram Moolenaar CheckScriptFailure([ 29902c5ed4e3SBram Moolenaar 'vim9script', 29912c5ed4e3SBram Moolenaar 'try', 29922c5ed4e3SBram Moolenaar ' echo "yes"', 29932c5ed4e3SBram Moolenaar 'catch# comment', 29942c5ed4e3SBram Moolenaar 'endtry', 2995f8103f27SBram Moolenaar ], 'E1144:') 29962c5ed4e3SBram Moolenaar CheckDefFailure([ 29972c5ed4e3SBram Moolenaar 'try', 29982c5ed4e3SBram Moolenaar ' echo "yes"', 29992c5ed4e3SBram Moolenaar 'catch /pat/# comment', 30002c5ed4e3SBram Moolenaar 'endtry', 30012c5ed4e3SBram Moolenaar ], 'E488:') 30027a092245SBram Moolenaar CheckDefFailure([ 30037a092245SBram Moolenaar 'try', 30047a092245SBram Moolenaar 'echo "yes"', 30057a092245SBram Moolenaar 'catch', 30067a092245SBram Moolenaar 'endtry# comment', 3007f8103f27SBram Moolenaar ], 'E1144:') 30082c5ed4e3SBram Moolenaar CheckScriptFailure([ 30092c5ed4e3SBram Moolenaar 'vim9script', 30102c5ed4e3SBram Moolenaar 'try', 30112c5ed4e3SBram Moolenaar ' echo "yes"', 30122c5ed4e3SBram Moolenaar 'catch', 30132c5ed4e3SBram Moolenaar 'endtry# comment', 3014f8103f27SBram Moolenaar ], 'E1144:') 30152c5ed4e3SBram Moolenaar 30162c5ed4e3SBram Moolenaar CheckScriptSuccess([ 30172c5ed4e3SBram Moolenaar 'vim9script', 30182c5ed4e3SBram Moolenaar 'hi # comment', 30192c5ed4e3SBram Moolenaar ]) 30202c5ed4e3SBram Moolenaar CheckScriptFailure([ 30212c5ed4e3SBram Moolenaar 'vim9script', 30222c5ed4e3SBram Moolenaar 'hi# comment', 3023f8103f27SBram Moolenaar ], 'E1144:') 30241966c248SBram Moolenaar CheckScriptSuccess([ 30251966c248SBram Moolenaar 'vim9script', 30261966c248SBram Moolenaar 'hi Search # comment', 30271966c248SBram Moolenaar ]) 30281966c248SBram Moolenaar CheckScriptFailure([ 30291966c248SBram Moolenaar 'vim9script', 30301966c248SBram Moolenaar 'hi Search# comment', 30311966c248SBram Moolenaar ], 'E416:') 30321966c248SBram Moolenaar CheckScriptSuccess([ 30331966c248SBram Moolenaar 'vim9script', 30341966c248SBram Moolenaar 'hi link This Search # comment', 30351966c248SBram Moolenaar ]) 30361966c248SBram Moolenaar CheckScriptFailure([ 30371966c248SBram Moolenaar 'vim9script', 30381966c248SBram Moolenaar 'hi link This That# comment', 30391966c248SBram Moolenaar ], 'E413:') 30401966c248SBram Moolenaar CheckScriptSuccess([ 30411966c248SBram Moolenaar 'vim9script', 30421966c248SBram Moolenaar 'hi clear This # comment', 30431966c248SBram Moolenaar 'hi clear # comment', 30441966c248SBram Moolenaar ]) 3045f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3046f5be8cdbSBram Moolenaar # hi clear This# comment', 30471966c248SBram Moolenaar CheckScriptFailure([ 30481966c248SBram Moolenaar 'vim9script', 30491966c248SBram Moolenaar 'hi clear# comment', 30501966c248SBram Moolenaar ], 'E416:') 30511966c248SBram Moolenaar 30521966c248SBram Moolenaar CheckScriptSuccess([ 30531966c248SBram Moolenaar 'vim9script', 30541966c248SBram Moolenaar 'hi Group term=bold', 30551966c248SBram Moolenaar 'match Group /todo/ # comment', 30561966c248SBram Moolenaar ]) 30571966c248SBram Moolenaar CheckScriptFailure([ 30581966c248SBram Moolenaar 'vim9script', 30591966c248SBram Moolenaar 'hi Group term=bold', 30601966c248SBram Moolenaar 'match Group /todo/# comment', 30611966c248SBram Moolenaar ], 'E488:') 30621966c248SBram Moolenaar CheckScriptSuccess([ 30631966c248SBram Moolenaar 'vim9script', 30641966c248SBram Moolenaar 'match # comment', 30651966c248SBram Moolenaar ]) 30661966c248SBram Moolenaar CheckScriptFailure([ 30671966c248SBram Moolenaar 'vim9script', 30681966c248SBram Moolenaar 'match# comment', 3069f8103f27SBram Moolenaar ], 'E1144:') 30701966c248SBram Moolenaar CheckScriptSuccess([ 30711966c248SBram Moolenaar 'vim9script', 30721966c248SBram Moolenaar 'match none # comment', 30731966c248SBram Moolenaar ]) 30741966c248SBram Moolenaar CheckScriptFailure([ 30751966c248SBram Moolenaar 'vim9script', 30761966c248SBram Moolenaar 'match none# comment', 30771966c248SBram Moolenaar ], 'E475:') 30781966c248SBram Moolenaar 30791966c248SBram Moolenaar CheckScriptSuccess([ 30801966c248SBram Moolenaar 'vim9script', 30811966c248SBram Moolenaar 'menutrans clear # comment', 30821966c248SBram Moolenaar ]) 30831966c248SBram Moolenaar CheckScriptFailure([ 30841966c248SBram Moolenaar 'vim9script', 30851966c248SBram Moolenaar 'menutrans clear# comment text', 30861966c248SBram Moolenaar ], 'E474:') 30871966c248SBram Moolenaar 30881966c248SBram Moolenaar CheckScriptSuccess([ 30891966c248SBram Moolenaar 'vim9script', 30901966c248SBram Moolenaar 'syntax clear # comment', 30911966c248SBram Moolenaar ]) 30921966c248SBram Moolenaar CheckScriptFailure([ 30931966c248SBram Moolenaar 'vim9script', 30941966c248SBram Moolenaar 'syntax clear# comment text', 30951966c248SBram Moolenaar ], 'E28:') 30961966c248SBram Moolenaar CheckScriptSuccess([ 30971966c248SBram Moolenaar 'vim9script', 30981966c248SBram Moolenaar 'syntax keyword Word some', 30991966c248SBram Moolenaar 'syntax clear Word # comment', 31001966c248SBram Moolenaar ]) 31011966c248SBram Moolenaar CheckScriptFailure([ 31021966c248SBram Moolenaar 'vim9script', 31031966c248SBram Moolenaar 'syntax keyword Word some', 31041966c248SBram Moolenaar 'syntax clear Word# comment text', 31051966c248SBram Moolenaar ], 'E28:') 31061966c248SBram Moolenaar 31071966c248SBram Moolenaar CheckScriptSuccess([ 31081966c248SBram Moolenaar 'vim9script', 31091966c248SBram Moolenaar 'syntax list # comment', 31101966c248SBram Moolenaar ]) 31111966c248SBram Moolenaar CheckScriptFailure([ 31121966c248SBram Moolenaar 'vim9script', 31131966c248SBram Moolenaar 'syntax list# comment text', 31141966c248SBram Moolenaar ], 'E28:') 31151966c248SBram Moolenaar 31161966c248SBram Moolenaar CheckScriptSuccess([ 31171966c248SBram Moolenaar 'vim9script', 31181966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 31191966c248SBram Moolenaar ]) 31201966c248SBram Moolenaar CheckScriptFailure([ 31211966c248SBram Moolenaar 'vim9script', 31221966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 31231966c248SBram Moolenaar ], 'E475:') 31241966c248SBram Moolenaar 31251966c248SBram Moolenaar CheckScriptSuccess([ 31261966c248SBram Moolenaar 'vim9script', 31271966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 31281966c248SBram Moolenaar ]) 31291966c248SBram Moolenaar CheckScriptFailure([ 31301966c248SBram Moolenaar 'vim9script', 31311966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 31321966c248SBram Moolenaar ], 'E789:') 31331966c248SBram Moolenaar 31341966c248SBram Moolenaar CheckScriptSuccess([ 31351966c248SBram Moolenaar 'vim9script', 31361966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 31371966c248SBram Moolenaar ]) 31381966c248SBram Moolenaar CheckScriptFailure([ 31391966c248SBram Moolenaar 'vim9script', 31401966c248SBram Moolenaar 'syntax match Word /pat/# comment', 31411966c248SBram Moolenaar ], 'E402:') 31421966c248SBram Moolenaar 31431966c248SBram Moolenaar CheckScriptSuccess([ 31441966c248SBram Moolenaar 'vim9script', 31451966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 31461966c248SBram Moolenaar ]) 31471966c248SBram Moolenaar CheckScriptFailure([ 31481966c248SBram Moolenaar 'vim9script', 31491966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 31501966c248SBram Moolenaar ], 'E475:') 31511966c248SBram Moolenaar CheckScriptFailure([ 31521966c248SBram Moolenaar 'vim9script', 31531966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31541966c248SBram Moolenaar ], 'E406:') 31551966c248SBram Moolenaar CheckScriptFailure([ 31561966c248SBram Moolenaar 'vim9script', 31571966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 31581966c248SBram Moolenaar ], 'E475:') 31591966c248SBram Moolenaar 31601966c248SBram Moolenaar CheckScriptSuccess([ 31611966c248SBram Moolenaar 'vim9script', 31621966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 31631966c248SBram Moolenaar ]) 31641966c248SBram Moolenaar CheckScriptFailure([ 31651966c248SBram Moolenaar 'vim9script', 31661966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3167d032f34aSBram Moolenaar ], 'E402:') 31681966c248SBram Moolenaar 31691966c248SBram Moolenaar CheckScriptSuccess([ 31701966c248SBram Moolenaar 'vim9script', 31711966c248SBram Moolenaar 'syntax sync # comment', 31721966c248SBram Moolenaar ]) 31731966c248SBram Moolenaar CheckScriptFailure([ 31741966c248SBram Moolenaar 'vim9script', 31751966c248SBram Moolenaar 'syntax sync# comment', 31761966c248SBram Moolenaar ], 'E404:') 31771966c248SBram Moolenaar CheckScriptSuccess([ 31781966c248SBram Moolenaar 'vim9script', 31791966c248SBram Moolenaar 'syntax sync ccomment # comment', 31801966c248SBram Moolenaar ]) 31811966c248SBram Moolenaar CheckScriptFailure([ 31821966c248SBram Moolenaar 'vim9script', 31831966c248SBram Moolenaar 'syntax sync ccomment# comment', 31841966c248SBram Moolenaar ], 'E404:') 31851966c248SBram Moolenaar 31861966c248SBram Moolenaar CheckScriptSuccess([ 31871966c248SBram Moolenaar 'vim9script', 31881966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 31891966c248SBram Moolenaar ]) 31901966c248SBram Moolenaar CheckScriptFailure([ 31911966c248SBram Moolenaar 'vim9script', 31921966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 31931966c248SBram Moolenaar ], 'E475:') 3194a72cfb80SBram Moolenaar 3195a72cfb80SBram Moolenaar CheckScriptSuccess([ 3196a72cfb80SBram Moolenaar 'vim9script', 3197a72cfb80SBram Moolenaar 'command Echo echo # comment', 3198a72cfb80SBram Moolenaar 'command Echo # comment', 31992d870f8dSBram Moolenaar 'delcommand Echo', 3200a72cfb80SBram Moolenaar ]) 3201a72cfb80SBram Moolenaar CheckScriptFailure([ 3202a72cfb80SBram Moolenaar 'vim9script', 3203a72cfb80SBram Moolenaar 'command Echo echo# comment', 3204a72cfb80SBram Moolenaar 'Echo', 3205f8103f27SBram Moolenaar ], 'E1144:') 32062d870f8dSBram Moolenaar delcommand Echo 320770249ee8SBram Moolenaar 320870249ee8SBram Moolenaar var curdir = getcwd() 320970249ee8SBram Moolenaar CheckScriptSuccess([ 321070249ee8SBram Moolenaar 'command Echo cd " comment', 321170249ee8SBram Moolenaar 'Echo', 321270249ee8SBram Moolenaar 'delcommand Echo', 321370249ee8SBram Moolenaar ]) 321470249ee8SBram Moolenaar CheckScriptSuccess([ 3215090728adSBram Moolenaar 'vim9script', 321670249ee8SBram Moolenaar 'command Echo cd # comment', 321770249ee8SBram Moolenaar 'Echo', 321870249ee8SBram Moolenaar 'delcommand Echo', 321970249ee8SBram Moolenaar ]) 322070249ee8SBram Moolenaar CheckScriptFailure([ 322170249ee8SBram Moolenaar 'vim9script', 322270249ee8SBram Moolenaar 'command Echo cd " comment', 322370249ee8SBram Moolenaar 'Echo', 322470249ee8SBram Moolenaar ], 'E344:') 322570249ee8SBram Moolenaar delcommand Echo 322670249ee8SBram Moolenaar chdir(curdir) 322770249ee8SBram Moolenaar 3228a72cfb80SBram Moolenaar CheckScriptFailure([ 3229a72cfb80SBram Moolenaar 'vim9script', 3230a72cfb80SBram Moolenaar 'command Echo# comment', 3231a72cfb80SBram Moolenaar ], 'E182:') 3232a72cfb80SBram Moolenaar CheckScriptFailure([ 3233a72cfb80SBram Moolenaar 'vim9script', 3234a72cfb80SBram Moolenaar 'command Echo echo', 3235a72cfb80SBram Moolenaar 'command Echo# comment', 3236a72cfb80SBram Moolenaar ], 'E182:') 32372d870f8dSBram Moolenaar delcommand Echo 3238a72cfb80SBram Moolenaar 3239a72cfb80SBram Moolenaar CheckScriptSuccess([ 3240a72cfb80SBram Moolenaar 'vim9script', 3241a72cfb80SBram Moolenaar 'function # comment', 3242a72cfb80SBram Moolenaar ]) 3243a72cfb80SBram Moolenaar CheckScriptFailure([ 3244a72cfb80SBram Moolenaar 'vim9script', 32459898107fSBram Moolenaar 'function " comment', 32469898107fSBram Moolenaar ], 'E129:') 32479898107fSBram Moolenaar CheckScriptFailure([ 32489898107fSBram Moolenaar 'vim9script', 3249a72cfb80SBram Moolenaar 'function# comment', 3250f8103f27SBram Moolenaar ], 'E1144:') 3251a72cfb80SBram Moolenaar CheckScriptSuccess([ 3252a72cfb80SBram Moolenaar 'vim9script', 3253a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3254a72cfb80SBram Moolenaar ]) 3255a72cfb80SBram Moolenaar CheckScriptFailure([ 3256a72cfb80SBram Moolenaar 'vim9script', 3257a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3258a72cfb80SBram Moolenaar ], 'E488:') 3259a72cfb80SBram Moolenaar 3260a72cfb80SBram Moolenaar CheckScriptSuccess([ 3261a72cfb80SBram Moolenaar 'vim9script', 32624c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3263a72cfb80SBram Moolenaar 'endfunc', 32644c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3265a72cfb80SBram Moolenaar ]) 3266a72cfb80SBram Moolenaar CheckScriptFailure([ 3267a72cfb80SBram Moolenaar 'vim9script', 32684c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3269a72cfb80SBram Moolenaar 'endfunc', 32704c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3271a72cfb80SBram Moolenaar ], 'E488:') 3272a72cfb80SBram Moolenaar 3273a72cfb80SBram Moolenaar CheckScriptSuccess([ 3274a72cfb80SBram Moolenaar 'vim9script', 3275a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3276a72cfb80SBram Moolenaar ]) 3277a72cfb80SBram Moolenaar CheckScriptFailure([ 3278a72cfb80SBram Moolenaar 'vim9script', 3279a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3280a72cfb80SBram Moolenaar ], 'E488:') 3281e7e4838fSBram Moolenaar 3282e7e4838fSBram Moolenaar CheckScriptFailure([ 3283e7e4838fSBram Moolenaar 'def Test() " comment', 3284e7e4838fSBram Moolenaar 'enddef', 3285e7e4838fSBram Moolenaar ], 'E488:') 3286e7e4838fSBram Moolenaar CheckScriptFailure([ 3287e7e4838fSBram Moolenaar 'vim9script', 3288e7e4838fSBram Moolenaar 'def Test() " comment', 3289e7e4838fSBram Moolenaar 'enddef', 3290e7e4838fSBram Moolenaar ], 'E488:') 3291e7e4838fSBram Moolenaar 3292e7e4838fSBram Moolenaar CheckScriptSuccess([ 3293e7e4838fSBram Moolenaar 'func Test() " comment', 3294e7e4838fSBram Moolenaar 'endfunc', 32952d870f8dSBram Moolenaar 'delfunc Test', 3296e7e4838fSBram Moolenaar ]) 32979898107fSBram Moolenaar CheckScriptSuccess([ 3298e7e4838fSBram Moolenaar 'vim9script', 3299e7e4838fSBram Moolenaar 'func Test() " comment', 3300e7e4838fSBram Moolenaar 'endfunc', 33019898107fSBram Moolenaar ]) 3302e7e4838fSBram Moolenaar 3303e7e4838fSBram Moolenaar CheckScriptSuccess([ 3304e7e4838fSBram Moolenaar 'def Test() # comment', 3305e7e4838fSBram Moolenaar 'enddef', 3306e7e4838fSBram Moolenaar ]) 3307e7e4838fSBram Moolenaar CheckScriptFailure([ 3308e7e4838fSBram Moolenaar 'func Test() # comment', 3309e7e4838fSBram Moolenaar 'endfunc', 3310e7e4838fSBram Moolenaar ], 'E488:') 33110f37e356SBram Moolenaar 33120f37e356SBram Moolenaar var lines =<< trim END 33130f37e356SBram Moolenaar vim9script 33140f37e356SBram Moolenaar syn region Text 33150f37e356SBram Moolenaar \ start='foo' 33160f37e356SBram Moolenaar #\ comment 33170f37e356SBram Moolenaar \ end='bar' 33185072b47aSBram Moolenaar syn region Text start='foo' 33195072b47aSBram Moolenaar #\ comment 33205072b47aSBram Moolenaar \ end='bar' 33210f37e356SBram Moolenaar END 33220f37e356SBram Moolenaar CheckScriptSuccess(lines) 33230f37e356SBram Moolenaar 33240f37e356SBram Moolenaar lines =<< trim END 33250f37e356SBram Moolenaar vim9script 33260f37e356SBram Moolenaar syn region Text 33270f37e356SBram Moolenaar \ start='foo' 33280f37e356SBram Moolenaar "\ comment 33290f37e356SBram Moolenaar \ end='bar' 33300f37e356SBram Moolenaar END 33310f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 33322c5ed4e3SBram Moolenaarenddef 33332c5ed4e3SBram Moolenaar 33342c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 33352c5ed4e3SBram Moolenaar CheckCanRunGui 33362c5ed4e3SBram Moolenaar 33372c5ed4e3SBram Moolenaar CheckScriptFailure([ 33382c5ed4e3SBram Moolenaar 'vim9script', 33392c5ed4e3SBram Moolenaar 'gui#comment' 3340f8103f27SBram Moolenaar ], 'E1144:') 33412c5ed4e3SBram Moolenaar CheckScriptFailure([ 33422c5ed4e3SBram Moolenaar 'vim9script', 33432c5ed4e3SBram Moolenaar 'gui -f#comment' 33442c5ed4e3SBram Moolenaar ], 'E499:') 33457a092245SBram Moolenaarenddef 33467a092245SBram Moolenaar 3347a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 33486797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 33496797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3350a26b9700SBram Moolenaar 3351a26b9700SBram Moolenaar edit test.vim 3352a26b9700SBram Moolenaar doautocmd TabEnter #comment 3353a26b9700SBram Moolenaar assert_equal(1, g:entered) 3354a26b9700SBram Moolenaar 3355a26b9700SBram Moolenaar doautocmd TabEnter f.x 3356a26b9700SBram Moolenaar assert_equal(2, g:entered) 3357a26b9700SBram Moolenaar 3358a26b9700SBram Moolenaar g:entered = 0 3359a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3360a26b9700SBram Moolenaar assert_equal(2, g:entered) 3361a26b9700SBram Moolenaar 3362a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3363a26b9700SBram Moolenaar 3364a26b9700SBram Moolenaar au! TabEnter 3365a26b9700SBram Moolenaar unlet g:entered 3366d72c1bf0SBram Moolenaar 3367d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3368d72c1bf0SBram Moolenaar 'vim9script', 33696797966dSBram Moolenaar 'g:var = 123', 3370e55b1c09SBram Moolenaar 'b:var = 456', 3371e55b1c09SBram Moolenaar 'w:var = 777', 3372e55b1c09SBram Moolenaar 't:var = 888', 3373d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3374d72c1bf0SBram Moolenaar ]) 3375d72c1bf0SBram Moolenaar 3376d72c1bf0SBram Moolenaar CheckScriptFailure([ 3377d72c1bf0SBram Moolenaar 'vim9script', 3378cfcd011fSBram Moolenaar 'let var = 123', 3379cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3380cfcd011fSBram Moolenaar 3381cfcd011fSBram Moolenaar CheckScriptFailure([ 3382cfcd011fSBram Moolenaar 'vim9script', 3383cfcd011fSBram Moolenaar 'var g:var = 123', 3384e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3385e55b1c09SBram Moolenaar 3386e55b1c09SBram Moolenaar CheckScriptFailure([ 3387e55b1c09SBram Moolenaar 'vim9script', 3388cfcd011fSBram Moolenaar 'var b:var = 123', 3389e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3390e55b1c09SBram Moolenaar 3391e55b1c09SBram Moolenaar CheckScriptFailure([ 3392e55b1c09SBram Moolenaar 'vim9script', 3393cfcd011fSBram Moolenaar 'var w:var = 123', 3394e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3395e55b1c09SBram Moolenaar 3396e55b1c09SBram Moolenaar CheckScriptFailure([ 3397e55b1c09SBram Moolenaar 'vim9script', 3398cfcd011fSBram Moolenaar 'var t:var = 123', 3399e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3400e55b1c09SBram Moolenaar 3401e55b1c09SBram Moolenaar CheckScriptFailure([ 3402e55b1c09SBram Moolenaar 'vim9script', 3403cfcd011fSBram Moolenaar 'var v:version = 123', 3404e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3405e55b1c09SBram Moolenaar 3406e55b1c09SBram Moolenaar CheckScriptFailure([ 3407e55b1c09SBram Moolenaar 'vim9script', 3408cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3409e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 34106797966dSBram Moolenaar 34116797966dSBram Moolenaar CheckScriptFailure([ 34126797966dSBram Moolenaar 'vim9script', 34136797966dSBram Moolenaar 'g:var = 123', 341432e35117SBram Moolenaar 'unlet g:var# comment1', 3415d72c1bf0SBram Moolenaar ], 'E108:') 3416d72c1bf0SBram Moolenaar 3417d72c1bf0SBram Moolenaar CheckScriptFailure([ 3418d72c1bf0SBram Moolenaar 'let g:var = 123', 3419d72c1bf0SBram Moolenaar 'unlet g:var # something', 3420d72c1bf0SBram Moolenaar ], 'E488:') 3421faac4104SBram Moolenaar 3422faac4104SBram Moolenaar CheckScriptSuccess([ 3423faac4104SBram Moolenaar 'vim9script', 342432e35117SBram Moolenaar 'if 1 # comment2', 3425faac4104SBram Moolenaar ' echo "yes"', 3426faac4104SBram Moolenaar 'elseif 2 #comment', 3427faac4104SBram Moolenaar ' echo "no"', 3428faac4104SBram Moolenaar 'endif', 3429faac4104SBram Moolenaar ]) 3430faac4104SBram Moolenaar 3431faac4104SBram Moolenaar CheckScriptFailure([ 3432faac4104SBram Moolenaar 'vim9script', 343332e35117SBram Moolenaar 'if 1# comment3', 3434faac4104SBram Moolenaar ' echo "yes"', 3435faac4104SBram Moolenaar 'endif', 3436fae55a9cSBram Moolenaar ], 'E488:') 3437faac4104SBram Moolenaar 3438faac4104SBram Moolenaar CheckScriptFailure([ 3439faac4104SBram Moolenaar 'vim9script', 344032e35117SBram Moolenaar 'if 0 # comment4', 3441faac4104SBram Moolenaar ' echo "yes"', 3442faac4104SBram Moolenaar 'elseif 2#comment', 3443faac4104SBram Moolenaar ' echo "no"', 3444faac4104SBram Moolenaar 'endif', 3445fae55a9cSBram Moolenaar ], 'E488:') 3446faac4104SBram Moolenaar 3447faac4104SBram Moolenaar CheckScriptSuccess([ 3448faac4104SBram Moolenaar 'vim9script', 3449cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3450faac4104SBram Moolenaar ]) 3451faac4104SBram Moolenaar 3452faac4104SBram Moolenaar CheckScriptFailure([ 3453faac4104SBram Moolenaar 'vim9script', 3454cfcd011fSBram Moolenaar 'var v = 1# comment6', 3455fae55a9cSBram Moolenaar ], 'E488:') 3456faac4104SBram Moolenaar 3457faac4104SBram Moolenaar CheckScriptSuccess([ 3458faac4104SBram Moolenaar 'vim9script', 3459faac4104SBram Moolenaar 'new' 3460d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3461df069eecSBram Moolenaar ':$', 3462faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3463faac4104SBram Moolenaar 'bwipe!', 3464faac4104SBram Moolenaar ]) 3465faac4104SBram Moolenaar 3466f5be8cdbSBram Moolenaar CheckScriptFailure([ 3467f5be8cdbSBram Moolenaar 'vim9script', 3468f5be8cdbSBram Moolenaar 'new' 3469d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3470f5be8cdbSBram Moolenaar ':$', 3471f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3472f5be8cdbSBram Moolenaar 'bwipe!', 3473f5be8cdbSBram Moolenaar ], 'E488:') 3474f5be8cdbSBram Moolenaar 3475f5be8cdbSBram Moolenaar CheckScriptFailure([ 3476f5be8cdbSBram Moolenaar 'vim9script', 3477f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3478f5be8cdbSBram Moolenaar ], 'E477:') 3479a26b9700SBram Moolenaarenddef 3480a26b9700SBram Moolenaar 34817e5bd91dSBram Moolenaardef Test_finish() 3482cfcd011fSBram Moolenaar var lines =<< trim END 34837e5bd91dSBram Moolenaar vim9script 34846797966dSBram Moolenaar g:res = 'one' 34857e5bd91dSBram Moolenaar if v:false | finish | endif 34866797966dSBram Moolenaar g:res = 'two' 34877e5bd91dSBram Moolenaar finish 34886797966dSBram Moolenaar g:res = 'three' 34897e5bd91dSBram Moolenaar END 34907e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 34917e5bd91dSBram Moolenaar source Xfinished 34927e5bd91dSBram Moolenaar assert_equal('two', g:res) 34937e5bd91dSBram Moolenaar 34947e5bd91dSBram Moolenaar unlet g:res 34957e5bd91dSBram Moolenaar delete('Xfinished') 34967e5bd91dSBram Moolenaarenddef 34977e5bd91dSBram Moolenaar 3498a5d0077eSBram Moolenaardef Test_forward_declaration() 3499cfcd011fSBram Moolenaar var lines =<< trim END 3500a5d0077eSBram Moolenaar vim9script 3501a5d0077eSBram Moolenaar def GetValue(): string 3502a5d0077eSBram Moolenaar return theVal 3503a5d0077eSBram Moolenaar enddef 3504cfcd011fSBram Moolenaar var theVal = 'something' 3505822ba247SBram Moolenaar g:initVal = GetValue() 3506a5d0077eSBram Moolenaar theVal = 'else' 3507a5d0077eSBram Moolenaar g:laterVal = GetValue() 3508a5d0077eSBram Moolenaar END 3509a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3510a5d0077eSBram Moolenaar source Xforward 3511a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3512a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3513a5d0077eSBram Moolenaar 3514a5d0077eSBram Moolenaar unlet g:initVal 3515a5d0077eSBram Moolenaar unlet g:laterVal 3516a5d0077eSBram Moolenaar delete('Xforward') 3517a5d0077eSBram Moolenaarenddef 3518a5d0077eSBram Moolenaar 35199721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3520a6294955SBram Moolenaar var vim9_lines =<< trim END 3521a6294955SBram Moolenaar vim9script 3522a6294955SBram Moolenaar var local = 'local' 3523a6294955SBram Moolenaar g:global = 'global' 3524a6294955SBram Moolenaar export var exported = 'exported' 3525a6294955SBram Moolenaar export def GetText(): string 3526a6294955SBram Moolenaar return 'text' 3527a6294955SBram Moolenaar enddef 3528a6294955SBram Moolenaar END 3529a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3530a6294955SBram Moolenaar 3531cfcd011fSBram Moolenaar var legacy_lines =<< trim END 35329721fb4eSBram Moolenaar source Xvim9_script.vim 35339721fb4eSBram Moolenaar 35349721fb4eSBram Moolenaar call assert_false(exists('local')) 35359721fb4eSBram Moolenaar call assert_false(exists('exported')) 35369721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 35379721fb4eSBram Moolenaar call assert_equal('global', global) 35389721fb4eSBram Moolenaar call assert_equal('global', g:global) 35399721fb4eSBram Moolenaar 35409721fb4eSBram Moolenaar " imported variable becomes script-local 35419721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 35429721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 35439721fb4eSBram Moolenaar call assert_false(exists('exported')) 35449721fb4eSBram Moolenaar 35459721fb4eSBram Moolenaar " imported function becomes script-local 35469721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 35479721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 35489721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 35499721fb4eSBram Moolenaar END 35509721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 35519721fb4eSBram Moolenaar 35529721fb4eSBram Moolenaar source Xlegacy_script.vim 35539721fb4eSBram Moolenaar assert_equal('global', g:global) 3554f5be8cdbSBram Moolenaar unlet g:global 35559721fb4eSBram Moolenaar 35569721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 35579721fb4eSBram Moolenaar delete('Xvim9_script.vim') 35589721fb4eSBram Moolenaarenddef 3559a5d0077eSBram Moolenaar 3560e535db86SBram Moolenaardef Test_declare_script_in_func() 3561e535db86SBram Moolenaar var lines =<< trim END 3562e535db86SBram Moolenaar vim9script 3563e535db86SBram Moolenaar func Declare() 3564e535db86SBram Moolenaar let s:local = 123 3565e535db86SBram Moolenaar endfunc 3566e535db86SBram Moolenaar Declare() 3567e535db86SBram Moolenaar assert_equal(123, local) 3568e535db86SBram Moolenaar 3569e535db86SBram Moolenaar var error: string 3570e535db86SBram Moolenaar try 3571e535db86SBram Moolenaar local = 'asdf' 3572e535db86SBram Moolenaar catch 3573e535db86SBram Moolenaar error = v:exception 3574e535db86SBram Moolenaar endtry 3575e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3576e535db86SBram Moolenaar 3577e535db86SBram Moolenaar lockvar local 3578e535db86SBram Moolenaar try 3579e535db86SBram Moolenaar local = 999 3580e535db86SBram Moolenaar catch 3581e535db86SBram Moolenaar error = v:exception 3582e535db86SBram Moolenaar endtry 3583e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3584e535db86SBram Moolenaar END 3585e535db86SBram Moolenaar CheckScriptSuccess(lines) 3586e535db86SBram Moolenaarenddef 3587e535db86SBram Moolenaar 3588e535db86SBram Moolenaar 35897d699701SBram Moolenaarfunc Test_vim9script_not_global() 35907d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 35917d699701SBram Moolenaar let vim9lines =<< trim END 35927d699701SBram Moolenaar vim9script 3593cfcd011fSBram Moolenaar var name = 'local' 35947d699701SBram Moolenaar func TheFunc() 35957d699701SBram Moolenaar echo 'local' 35967d699701SBram Moolenaar endfunc 35977d699701SBram Moolenaar def DefFunc() 35987d699701SBram Moolenaar echo 'local' 35997d699701SBram Moolenaar enddef 36007d699701SBram Moolenaar END 36017d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 36027d699701SBram Moolenaar source Xvim9script.vim 36037d699701SBram Moolenaar try 36047d699701SBram Moolenaar echo g:var 36057d699701SBram Moolenaar assert_report('did not fail') 36067d699701SBram Moolenaar catch /E121:/ 36077d699701SBram Moolenaar " caught 36087d699701SBram Moolenaar endtry 36097d699701SBram Moolenaar try 36107d699701SBram Moolenaar call TheFunc() 36117d699701SBram Moolenaar assert_report('did not fail') 36127d699701SBram Moolenaar catch /E117:/ 36137d699701SBram Moolenaar " caught 36147d699701SBram Moolenaar endtry 36157d699701SBram Moolenaar try 36167d699701SBram Moolenaar call DefFunc() 36177d699701SBram Moolenaar assert_report('did not fail') 36187d699701SBram Moolenaar catch /E117:/ 36197d699701SBram Moolenaar " caught 36207d699701SBram Moolenaar endtry 36217d699701SBram Moolenaar 362225859dd7SBram Moolenaar call delete('Xvim9script.vim') 36237d699701SBram Moolenaarendfunc 36247d699701SBram Moolenaar 3625eeb27bfeSBram Moolenaardef Test_vim9_copen() 3626eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3627eeb27bfeSBram Moolenaar copen 3628eeb27bfeSBram Moolenaar quit 3629eeb27bfeSBram Moolenaarenddef 3630eeb27bfeSBram Moolenaar 363103290b84SBram Moolenaar" test using an auto-loaded function and variable 36322d6b20d6SBram Moolenaardef Test_vim9_autoload() 3633cfcd011fSBram Moolenaar var lines =<< trim END 36342d6b20d6SBram Moolenaar vim9script 363503290b84SBram Moolenaar def some#gettest(): string 363603290b84SBram Moolenaar return 'test' 363703290b84SBram Moolenaar enddef 363803290b84SBram Moolenaar g:some#name = 'name' 3639227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3640e3ffcd99SBram Moolenaar 3641e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3642e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3643e3ffcd99SBram Moolenaar enddef 364403290b84SBram Moolenaar END 364503290b84SBram Moolenaar 364603290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 364703290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 364803290b84SBram Moolenaar var save_rtp = &rtp 364903290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 365003290b84SBram Moolenaar 365103290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 365203290b84SBram Moolenaar assert_equal('name', g:some#name) 3653227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 365403290b84SBram Moolenaar g:some#other = 'other' 365503290b84SBram Moolenaar assert_equal('other', g:some#other) 365603290b84SBram Moolenaar 3657e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3658e3ffcd99SBram Moolenaar 365917f700acSBram Moolenaar # upper case script name works 366017f700acSBram Moolenaar lines =<< trim END 366117f700acSBram Moolenaar vim9script 366217f700acSBram Moolenaar def Other#getOther(): string 366317f700acSBram Moolenaar return 'other' 366417f700acSBram Moolenaar enddef 366517f700acSBram Moolenaar END 366617f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 366717f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 366817f700acSBram Moolenaar 366903290b84SBram Moolenaar delete('Xdir', 'rf') 367003290b84SBram Moolenaar &rtp = save_rtp 367103290b84SBram Moolenaarenddef 367203290b84SBram Moolenaar 367303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 367403290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 367503290b84SBram Moolenaar var lines =<< trim END 367603290b84SBram Moolenaar vim9script 36772d6b20d6SBram Moolenaar def foo#test() 36782d6b20d6SBram Moolenaar echomsg getreg('"') 36792d6b20d6SBram Moolenaar enddef 36802d6b20d6SBram Moolenaar END 36812d6b20d6SBram Moolenaar 36822d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 36832d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3684cfcd011fSBram Moolenaar var save_rtp = &rtp 36852d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 36862d6b20d6SBram Moolenaar augroup test 36872d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 36882d6b20d6SBram Moolenaar augroup END 36892d6b20d6SBram Moolenaar 36902d6b20d6SBram Moolenaar normal Y 36912d6b20d6SBram Moolenaar 36922d6b20d6SBram Moolenaar augroup test 36932d6b20d6SBram Moolenaar autocmd! 36942d6b20d6SBram Moolenaar augroup END 36952d6b20d6SBram Moolenaar delete('Xdir', 'rf') 36962d6b20d6SBram Moolenaar &rtp = save_rtp 36972d6b20d6SBram Moolenaarenddef 36982d6b20d6SBram Moolenaar 369977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 370077e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3701cfcd011fSBram Moolenaar var lines =<< trim END 370277e5dcc3SBram Moolenaar vim9script 370377e5dcc3SBram Moolenaar def crash#func() 370477e5dcc3SBram Moolenaar try 370577e5dcc3SBram Moolenaar for x in List() 370677e5dcc3SBram Moolenaar endfor 370777e5dcc3SBram Moolenaar catch 370877e5dcc3SBram Moolenaar endtry 370977e5dcc3SBram Moolenaar g:ok = true 371077e5dcc3SBram Moolenaar enddef 371177e5dcc3SBram Moolenaar fu List() 371277e5dcc3SBram Moolenaar invalid 371377e5dcc3SBram Moolenaar endfu 371477e5dcc3SBram Moolenaar try 371548e11c10SBram Moolenaar alsoinvalid 371677e5dcc3SBram Moolenaar catch /wontmatch/ 371777e5dcc3SBram Moolenaar endtry 371877e5dcc3SBram Moolenaar END 371977e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 372077e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 372177e5dcc3SBram Moolenaar 372277e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 372377e5dcc3SBram Moolenaar lines =<< trim END 372477e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 372577e5dcc3SBram Moolenaar call crash#func() 372677e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 37279c4f5520SBram Moolenaar qall! 372877e5dcc3SBram Moolenaar END 372977e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 373077e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 373177e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 373277e5dcc3SBram Moolenaar 373377e5dcc3SBram Moolenaar delete('Xdidit') 373477e5dcc3SBram Moolenaar delete('Xscript') 373577e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 373603290b84SBram Moolenaar 373703290b84SBram Moolenaar lines =<< trim END 373803290b84SBram Moolenaar vim9script 373903290b84SBram Moolenaar var foo#bar = 'asdf' 374003290b84SBram Moolenaar END 374103290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 374277e5dcc3SBram Moolenaarenddef 374377e5dcc3SBram Moolenaar 374481e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 374581e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 374681e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3747cfcd011fSBram Moolenaar var lines =<< trim END 374881e17fbeSBram Moolenaar let s:counter = 1 374981e17fbeSBram Moolenaar def s:Func() 375081e17fbeSBram Moolenaar au! CursorHold 375181e17fbeSBram Moolenaar au CursorHold * s:counter += 1 375281e17fbeSBram Moolenaar enddef 375381e17fbeSBram Moolenaar call s:Func() 375481e17fbeSBram Moolenaar doau CursorHold 375581e17fbeSBram Moolenaar call assert_equal(2, s:counter) 375681e17fbeSBram Moolenaar au! CursorHold 375781e17fbeSBram Moolenaar END 375881e17fbeSBram Moolenaar CheckScriptSuccess(lines) 375981e17fbeSBram Moolenaarenddef 376081e17fbeSBram Moolenaar 3761b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3762b5841b99SBram Moolenaar var save_rtp = &rtp 3763b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3764b5841b99SBram Moolenaar &rtp = dir 3765b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3766b5841b99SBram Moolenaar 3767b5841b99SBram Moolenaar var lines =<< trim END 3768b5841b99SBram Moolenaar vim9script noclear 3769b5841b99SBram Moolenaar def script#autoloaded() 3770b5841b99SBram Moolenaar enddef 3771b5841b99SBram Moolenaar def Broken() 3772b5841b99SBram Moolenaar var x: any = '' 3773b5841b99SBram Moolenaar eval x != 0 3774b5841b99SBram Moolenaar enddef 3775b5841b99SBram Moolenaar Broken() 3776b5841b99SBram Moolenaar END 3777b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3778b5841b99SBram Moolenaar 3779b5841b99SBram Moolenaar lines =<< trim END 3780b5841b99SBram Moolenaar vim9script 3781b5841b99SBram Moolenaar def CallAutoloaded() 3782b5841b99SBram Moolenaar script#autoloaded() 3783b5841b99SBram Moolenaar enddef 3784b5841b99SBram Moolenaar 3785b5841b99SBram Moolenaar function Legacy() 3786b5841b99SBram Moolenaar try 3787b5841b99SBram Moolenaar call s:CallAutoloaded() 3788b5841b99SBram Moolenaar catch 3789b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3790b5841b99SBram Moolenaar endtry 3791b5841b99SBram Moolenaar endfunction 3792b5841b99SBram Moolenaar 3793b5841b99SBram Moolenaar Legacy() 3794b5841b99SBram Moolenaar END 3795b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3796b5841b99SBram Moolenaar 3797b5841b99SBram Moolenaar &rtp = save_rtp 3798b5841b99SBram Moolenaar delete(dir, 'rf') 3799b5841b99SBram Moolenaarenddef 3800b5841b99SBram Moolenaar 38013896a105SBram Moolenaardef Test_cmdline_win() 38023896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 38033896a105SBram Moolenaar # the command line window. 38043896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3805cfcd011fSBram Moolenaar var export_lines =<< trim END 38063896a105SBram Moolenaar vim9script 3807cfcd011fSBram Moolenaar export var That = 'yes' 38083896a105SBram Moolenaar END 38093896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3810cfcd011fSBram Moolenaar var import_lines =<< trim END 38113896a105SBram Moolenaar vim9script 38123896a105SBram Moolenaar import That from './Xexport.vim' 38133896a105SBram Moolenaar END 38143896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3815cfcd011fSBram Moolenaar var save_rtp = &rtp 38163896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 38173896a105SBram Moolenaar syntax on 38183896a105SBram Moolenaar augroup CmdWin 38193896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 38203896a105SBram Moolenaar augroup END 38213896a105SBram Moolenaar # this will open and also close the cmdline window 38223896a105SBram Moolenaar feedkeys('q:', 'xt') 38233896a105SBram Moolenaar assert_equal('yes', g:got_there) 38243896a105SBram Moolenaar 38253896a105SBram Moolenaar augroup CmdWin 38263896a105SBram Moolenaar au! 38273896a105SBram Moolenaar augroup END 38283896a105SBram Moolenaar &rtp = save_rtp 38293896a105SBram Moolenaar delete('rtp', 'rf') 38303896a105SBram Moolenaarenddef 38313896a105SBram Moolenaar 3832e3d4685fSBram Moolenaardef Test_invalid_sid() 3833e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 383425859dd7SBram Moolenaar 38359c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3836d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3837e3d4685fSBram Moolenaar endif 3838e3d4685fSBram Moolenaar delete('Xdidit') 3839e3d4685fSBram Moolenaarenddef 3840e3d4685fSBram Moolenaar 38419ec7026fSBram Moolenaardef Test_restoring_cpo() 38429ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 38439ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 38449ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 38459ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 38469ec7026fSBram Moolenaar endif 38479ec7026fSBram Moolenaar delete('Xsourced') 38489ec7026fSBram Moolenaar delete('Xclose') 3849090728adSBram Moolenaar delete('Xdone') 38500123cc1eSBram Moolenaar 38510123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 38520123cc1eSBram Moolenaar set cpo=aABceFsMny> 38530123cc1eSBram Moolenaar edit XanotherScript 38540123cc1eSBram Moolenaar so % 38550123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38560123cc1eSBram Moolenaar :1del 38570123cc1eSBram Moolenaar w 38580123cc1eSBram Moolenaar so % 38590123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38600123cc1eSBram Moolenaar 38610123cc1eSBram Moolenaar delete('XanotherScript') 38620123cc1eSBram Moolenaar set cpo&vim 38639ec7026fSBram Moolenaarenddef 38649ec7026fSBram Moolenaar 3865ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3866ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 386737294bd6SBram Moolenaar CheckScreendump 3868ffb7dcdbSBram Moolenaar CheckFeature timers 386937294bd6SBram Moolenaar 3870ffb7dcdbSBram Moolenaar let lines =<< trim END 387137294bd6SBram Moolenaar vim9script 387237294bd6SBram Moolenaar def script#func() 387337294bd6SBram Moolenaar enddef 387437294bd6SBram Moolenaar END 3875ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3876ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 387737294bd6SBram Moolenaar 3878ffb7dcdbSBram Moolenaar let lines =<< trim END 387937294bd6SBram Moolenaar vim9script 388037294bd6SBram Moolenaar set cpo+=M 388137294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3882767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 388337294bd6SBram Moolenaar setline(1, 'some text') 388437294bd6SBram Moolenaar END 3885ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3886ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3887ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3888ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 388937294bd6SBram Moolenaar 3890ffb7dcdbSBram Moolenaar " clean up 3891ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3892ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3893ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3894ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3895ffb7dcdbSBram Moolenaarendfunc 389637294bd6SBram Moolenaar 38979ec7026fSBram Moolenaar 3898f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3899cfcd011fSBram Moolenaar var lines =<< trim END 3900cfcd011fSBram Moolenaar var name: any 3901cfcd011fSBram Moolenaar assert_equal(0, name) 3902f0afd9e1SBram Moolenaar END 3903f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3904f0afd9e1SBram Moolenaarenddef 3905f0afd9e1SBram Moolenaar 39067e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 390758dbef33SBram Moolenaar CheckRunVimInTerminal 390858dbef33SBram Moolenaar 39097e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 39107e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 39117e9210eaSBram Moolenaarendfunc 39127e9210eaSBram Moolenaar 39137e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 39149c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3915cfcd011fSBram Moolenaar var lines =<< trim END 39169c4f5520SBram Moolenaar func CheckAndQuit() 39179c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 39189c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 39199c4f5520SBram Moolenaar endfunc 39209c4f5520SBram Moolenaar END 39219c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 39229c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3923e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 39249c4f5520SBram Moolenaar # define Afunc() on the command line 39259c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 39269c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 39272949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 39289c4f5520SBram Moolenaar 39299c4f5520SBram Moolenaar call StopVimInTerminal(buf) 39309c4f5520SBram Moolenaar delete('XcallFunc') 39319c4f5520SBram Moolenaar delete('Xdidcmd') 39329c4f5520SBram Moolenaarenddef 39339c4f5520SBram Moolenaar 3934fcdc5d83SBram Moolenaardef Test_script_var_scope() 3935fcdc5d83SBram Moolenaar var lines =<< trim END 3936fcdc5d83SBram Moolenaar vim9script 3937fcdc5d83SBram Moolenaar if true 3938fcdc5d83SBram Moolenaar if true 3939fcdc5d83SBram Moolenaar var one = 'one' 3940fcdc5d83SBram Moolenaar echo one 3941fcdc5d83SBram Moolenaar endif 3942fcdc5d83SBram Moolenaar echo one 3943fcdc5d83SBram Moolenaar endif 3944fcdc5d83SBram Moolenaar END 3945fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3946fcdc5d83SBram Moolenaar 3947fcdc5d83SBram Moolenaar lines =<< trim END 3948fcdc5d83SBram Moolenaar vim9script 3949fcdc5d83SBram Moolenaar if true 3950fcdc5d83SBram Moolenaar if false 3951fcdc5d83SBram Moolenaar var one = 'one' 3952fcdc5d83SBram Moolenaar echo one 3953fcdc5d83SBram Moolenaar else 3954fcdc5d83SBram Moolenaar var one = 'one' 3955fcdc5d83SBram Moolenaar echo one 3956fcdc5d83SBram Moolenaar endif 3957fcdc5d83SBram Moolenaar echo one 3958fcdc5d83SBram Moolenaar endif 3959fcdc5d83SBram Moolenaar END 3960fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3961fcdc5d83SBram Moolenaar 3962fcdc5d83SBram Moolenaar lines =<< trim END 3963fcdc5d83SBram Moolenaar vim9script 3964fcdc5d83SBram Moolenaar while true 3965fcdc5d83SBram Moolenaar var one = 'one' 3966fcdc5d83SBram Moolenaar echo one 3967fcdc5d83SBram Moolenaar break 3968fcdc5d83SBram Moolenaar endwhile 3969fcdc5d83SBram Moolenaar echo one 3970fcdc5d83SBram Moolenaar END 3971fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3972fcdc5d83SBram Moolenaar 3973fcdc5d83SBram Moolenaar lines =<< trim END 3974fcdc5d83SBram Moolenaar vim9script 3975fcdc5d83SBram Moolenaar for i in range(1) 3976fcdc5d83SBram Moolenaar var one = 'one' 3977fcdc5d83SBram Moolenaar echo one 3978fcdc5d83SBram Moolenaar endfor 3979fcdc5d83SBram Moolenaar echo one 3980fcdc5d83SBram Moolenaar END 3981fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 39829becdf2bSBram Moolenaar 39839becdf2bSBram Moolenaar lines =<< trim END 39849becdf2bSBram Moolenaar vim9script 39859becdf2bSBram Moolenaar { 39869becdf2bSBram Moolenaar var one = 'one' 39879becdf2bSBram Moolenaar assert_equal('one', one) 39889becdf2bSBram Moolenaar } 39899becdf2bSBram Moolenaar assert_false(exists('one')) 39909becdf2bSBram Moolenaar assert_false(exists('s:one')) 39919becdf2bSBram Moolenaar END 39929becdf2bSBram Moolenaar CheckScriptSuccess(lines) 39939becdf2bSBram Moolenaar 39949becdf2bSBram Moolenaar lines =<< trim END 39959becdf2bSBram Moolenaar vim9script 39969becdf2bSBram Moolenaar { 39979becdf2bSBram Moolenaar var one = 'one' 39989becdf2bSBram Moolenaar echo one 39999becdf2bSBram Moolenaar } 40009becdf2bSBram Moolenaar echo one 40019becdf2bSBram Moolenaar END 40029becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4003fcdc5d83SBram Moolenaarenddef 4004fcdc5d83SBram Moolenaar 4005352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4006352134bbSBram Moolenaar var lines =<< trim END 4007352134bbSBram Moolenaar vim9script 40082a38908bSBram Moolenaar def Callback(...l: list<any>) 4009352134bbSBram Moolenaar try 4010352134bbSBram Moolenaar var x: string 4011352134bbSBram Moolenaar var y: string 4012352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4013352134bbSBram Moolenaar [x, y] = [''] 4014352134bbSBram Moolenaar catch 4015352134bbSBram Moolenaar g:caught = 'yes' 4016352134bbSBram Moolenaar endtry 4017352134bbSBram Moolenaar enddef 4018e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4019352134bbSBram Moolenaar feedkeys("\r", 'xt') 4020352134bbSBram Moolenaar END 4021352134bbSBram Moolenaar CheckScriptSuccess(lines) 4022352134bbSBram Moolenaar 4023352134bbSBram Moolenaar unlet g:caught 4024352134bbSBram Moolenaarenddef 4025352134bbSBram Moolenaar 4026631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4027631e8f93SBram Moolenaar if !has('unix') || !has('job') 4028631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4029631e8f93SBram Moolenaar endif 4030631e8f93SBram Moolenaar var lines =<< trim END 4031631e8f93SBram Moolenaar vim9script 4032631e8f93SBram Moolenaar var source: list<number> 40332a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4034631e8f93SBram Moolenaar eval [][0] 4035631e8f93SBram Moolenaar enddef 40362a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4037631e8f93SBram Moolenaar sleep 1m 4038631e8f93SBram Moolenaar source += l 4039631e8f93SBram Moolenaar enddef 4040e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 40416f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 40426f17a3f0SBram Moolenaar sleep 10m 40436f17a3f0SBram Moolenaar endwhile 4044206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4045fe95b94fSBram Moolenaar sleep 200m 4046631e8f93SBram Moolenaar END 4047631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4048631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4049631e8f93SBram Moolenaar delete('Xdef') 4050631e8f93SBram Moolenaarenddef 4051631e8f93SBram Moolenaar 40524324d87aSBram Moolenaardef InvokeNormal() 40534324d87aSBram Moolenaar exe "norm! :m+1\r" 40544324d87aSBram Moolenaarenddef 40554324d87aSBram Moolenaar 40564324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 40574324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 40584324d87aSBram Moolenaar new 40594324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 40604324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 40614324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 40624324d87aSBram Moolenaar xunmap <F3> 4063b5b9480eSBram Moolenaarenddef 4064b5b9480eSBram Moolenaar 4065b5b9480eSBram Moolenaardef Test_white_space_after_command() 4066b5b9480eSBram Moolenaar var lines =<< trim END 4067b5b9480eSBram Moolenaar exit_cb: Func}) 4068b5b9480eSBram Moolenaar END 4069b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4070f8103f27SBram Moolenaar 4071f8103f27SBram Moolenaar lines =<< trim END 4072f8103f27SBram Moolenaar e# 4073f8103f27SBram Moolenaar END 4074f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 40754324d87aSBram Moolenaarenddef 40764324d87aSBram Moolenaar 40774aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 40784aab88d9SBram Moolenaar var lines =<< trim END 40794aab88d9SBram Moolenaar vim9script 40804aab88d9SBram Moolenaar if exists('g:guard') 40814aab88d9SBram Moolenaar finish 40824aab88d9SBram Moolenaar endif 40834aab88d9SBram Moolenaar g:guard = 1 40844aab88d9SBram Moolenaar var name = 'thename' 40854aab88d9SBram Moolenaar def g:GetName(): string 40864aab88d9SBram Moolenaar return name 40874aab88d9SBram Moolenaar enddef 40884aab88d9SBram Moolenaar def g:SetName(arg: string) 40894aab88d9SBram Moolenaar name = arg 40904aab88d9SBram Moolenaar enddef 40914aab88d9SBram Moolenaar END 40924aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 40934aab88d9SBram Moolenaar so XscriptTwice.vim 40944aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 40954aab88d9SBram Moolenaar g:SetName('newname') 40964aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 40974aab88d9SBram Moolenaar so XscriptTwice.vim 40984aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40994aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 41004aab88d9SBram Moolenaar 41014aab88d9SBram Moolenaar delfunc g:GetName 41024aab88d9SBram Moolenaar delfunc g:SetName 41034aab88d9SBram Moolenaar delete('XscriptTwice.vim') 41044aab88d9SBram Moolenaar unlet g:guard 41054aab88d9SBram Moolenaarenddef 41064aab88d9SBram Moolenaar 41074aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 41084aab88d9SBram Moolenaar var exportlines =<< trim END 41094aab88d9SBram Moolenaar vim9script 41104aab88d9SBram Moolenaar if exists('g:guard') 41114aab88d9SBram Moolenaar finish 41124aab88d9SBram Moolenaar endif 41134aab88d9SBram Moolenaar g:guard = 1 41144aab88d9SBram Moolenaar export var name = 'someName' 41154aab88d9SBram Moolenaar END 41164aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 41174aab88d9SBram Moolenaar 41184aab88d9SBram Moolenaar var lines =<< trim END 41194aab88d9SBram Moolenaar vim9script 41204aab88d9SBram Moolenaar import name from './XexportScript.vim' 41214aab88d9SBram Moolenaar def g:GetName(): string 41224aab88d9SBram Moolenaar return name 41234aab88d9SBram Moolenaar enddef 41244aab88d9SBram Moolenaar END 41254aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 41264aab88d9SBram Moolenaar so XscriptImport.vim 41274aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 41284aab88d9SBram Moolenaar 41294aab88d9SBram Moolenaar so XexportScript.vim 41304aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41314aab88d9SBram Moolenaar 41324aab88d9SBram Moolenaar delfunc g:GetName 41334aab88d9SBram Moolenaar delete('XexportScript.vim') 41344aab88d9SBram Moolenaar delete('XscriptImport.vim') 41354aab88d9SBram Moolenaar unlet g:guard 41364aab88d9SBram Moolenaarenddef 41374aab88d9SBram Moolenaar 413810b9421fSBram Moolenaardef Test_unsupported_commands() 413910b9421fSBram Moolenaar var lines =<< trim END 414010b9421fSBram Moolenaar ka 414110b9421fSBram Moolenaar END 41427d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41437d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 414410b9421fSBram Moolenaar 414510b9421fSBram Moolenaar lines =<< trim END 4146ada1d870SBram Moolenaar :1ka 4147ada1d870SBram Moolenaar END 41487d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41497d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4150ada1d870SBram Moolenaar 4151ada1d870SBram Moolenaar lines =<< trim END 415210b9421fSBram Moolenaar t 415310b9421fSBram Moolenaar END 415410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 415510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 415610b9421fSBram Moolenaar 415710b9421fSBram Moolenaar lines =<< trim END 415810b9421fSBram Moolenaar x 415910b9421fSBram Moolenaar END 416010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 416110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 416210b9421fSBram Moolenaar 416310b9421fSBram Moolenaar lines =<< trim END 416410b9421fSBram Moolenaar xit 416510b9421fSBram Moolenaar END 416610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 416710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 416810b9421fSBram Moolenaarenddef 416910b9421fSBram Moolenaar 4170c70fe460SBram Moolenaardef Test_mapping_line_number() 4171c70fe460SBram Moolenaar var lines =<< trim END 4172c70fe460SBram Moolenaar vim9script 4173c70fe460SBram Moolenaar def g:FuncA() 4174c70fe460SBram Moolenaar # Some comment 4175c70fe460SBram Moolenaar FuncB(0) 4176c70fe460SBram Moolenaar enddef 4177c70fe460SBram Moolenaar # Some comment 4178c70fe460SBram Moolenaar def FuncB( 4179c70fe460SBram Moolenaar # Some comment 4180c70fe460SBram Moolenaar n: number 4181c70fe460SBram Moolenaar ) 4182c70fe460SBram Moolenaar exe 'nno ' 4183c70fe460SBram Moolenaar # Some comment 4184c70fe460SBram Moolenaar .. '<F3> a' 4185c70fe460SBram Moolenaar .. 'b' 4186c70fe460SBram Moolenaar .. 'c' 4187c70fe460SBram Moolenaar enddef 4188c70fe460SBram Moolenaar END 4189c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4190c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4191c70fe460SBram Moolenaar assert_match('No mapping found', res) 4192c70fe460SBram Moolenaar 4193c70fe460SBram Moolenaar g:FuncA() 4194c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4195c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4196c70fe460SBram Moolenaar 4197c70fe460SBram Moolenaar nunmap <F3> 4198c70fe460SBram Moolenaar delfunc g:FuncA 4199c70fe460SBram Moolenaarenddef 4200c70fe460SBram Moolenaar 4201deb108baSBram Moolenaardef Test_option_set() 4202deb108baSBram Moolenaar # legacy script allows for white space 4203deb108baSBram Moolenaar var lines =<< trim END 4204deb108baSBram Moolenaar set foldlevel =11 4205deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4206deb108baSBram Moolenaar END 4207deb108baSBram Moolenaar CheckScriptSuccess(lines) 4208deb108baSBram Moolenaar 4209deb108baSBram Moolenaar set foldlevel 4210deb108baSBram Moolenaar set foldlevel=12 4211deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4212deb108baSBram Moolenaar set foldlevel+=2 4213deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4214deb108baSBram Moolenaar set foldlevel-=3 4215deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4216deb108baSBram Moolenaar 4217deb108baSBram Moolenaar lines =<< trim END 4218deb108baSBram Moolenaar set foldlevel =1 4219deb108baSBram Moolenaar END 4220deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4221deb108baSBram Moolenaar 4222deb108baSBram Moolenaar lines =<< trim END 4223deb108baSBram Moolenaar set foldlevel +=1 4224deb108baSBram Moolenaar END 4225deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4226deb108baSBram Moolenaar 4227deb108baSBram Moolenaar lines =<< trim END 4228deb108baSBram Moolenaar set foldlevel ^=1 4229deb108baSBram Moolenaar END 4230deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4231deb108baSBram Moolenaar 4232deb108baSBram Moolenaar lines =<< trim END 4233deb108baSBram Moolenaar set foldlevel -=1 4234deb108baSBram Moolenaar END 4235deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4236deb108baSBram Moolenaar 4237deb108baSBram Moolenaar set foldlevel& 4238deb108baSBram Moolenaarenddef 4239deb108baSBram Moolenaar 4240208f0b48SBram Moolenaardef Test_option_modifier() 42411594f313SBram Moolenaar # legacy script allows for white space 4242208f0b48SBram Moolenaar var lines =<< trim END 4243208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4244208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4245208f0b48SBram Moolenaar END 4246208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4247208f0b48SBram Moolenaar 42481594f313SBram Moolenaar set hlsearch 42491594f313SBram Moolenaar set hlsearch! 42501594f313SBram Moolenaar assert_equal(false, &hlsearch) 42511594f313SBram Moolenaar 42521594f313SBram Moolenaar set hlsearch 4253208f0b48SBram Moolenaar set hlsearch& 42541594f313SBram Moolenaar assert_equal(false, &hlsearch) 4255208f0b48SBram Moolenaar 4256208f0b48SBram Moolenaar lines =<< trim END 42571594f313SBram Moolenaar set hlsearch & 4258208f0b48SBram Moolenaar END 42591594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 42601594f313SBram Moolenaar 42611594f313SBram Moolenaar lines =<< trim END 42621594f313SBram Moolenaar set hlsearch ! 42631594f313SBram Moolenaar END 42641594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 42651594f313SBram Moolenaar 42661594f313SBram Moolenaar set hlsearch& 4267208f0b48SBram Moolenaarenddef 4268208f0b48SBram Moolenaar 4269c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4270c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4271c03fe66aSBram Moolenaar var lines =<< trim END 4272c03fe66aSBram Moolenaar echoerr 'some' 4273c03fe66aSBram Moolenaar .. ' error' 4274c03fe66aSBram Moolenaar .. ' continued' 4275c03fe66aSBram Moolenaar END 4276c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4277c03fe66aSBram Moolenaarenddef 4278c03fe66aSBram Moolenaar 4279648594eaSBram Moolenaardef ProfiledWithLambda() 4280d9162550SBram Moolenaar var n = 3 4281d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4282d9162550SBram Moolenaarenddef 4283d9162550SBram Moolenaar 4284648594eaSBram Moolenaardef ProfiledNested() 4285648594eaSBram Moolenaar var x = 0 4286648594eaSBram Moolenaar def Nested(): any 4287648594eaSBram Moolenaar return x 4288648594eaSBram Moolenaar enddef 4289648594eaSBram Moolenaar Nested() 4290648594eaSBram Moolenaarenddef 4291648594eaSBram Moolenaar 4292ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4293ffcfddc7SBram Moolenaar var x = 0 4294ffcfddc7SBram Moolenaar def Nested(): any 4295ffcfddc7SBram Moolenaar return x 4296ffcfddc7SBram Moolenaar enddef 4297ffcfddc7SBram Moolenaar Nested() 4298ffcfddc7SBram Moolenaarenddef 4299ffcfddc7SBram Moolenaar 4300d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4301d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4302d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 43034ece152aSBram Moolenaar CheckFeature profile 43044ece152aSBram Moolenaar 4305d9162550SBram Moolenaar profile start Xprofile.log 4306648594eaSBram Moolenaar profile func ProfiledWithLambda 4307648594eaSBram Moolenaar ProfiledWithLambda() 4308ffcfddc7SBram Moolenaar 4309648594eaSBram Moolenaar profile func ProfiledNested 4310648594eaSBram Moolenaar ProfiledNested() 4311ffcfddc7SBram Moolenaar 4312ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4313ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4314ffcfddc7SBram Moolenaar profile func * 4315ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4316ffcfddc7SBram Moolenaar 4317ffcfddc7SBram Moolenaar profdel func * 4318ffcfddc7SBram Moolenaar profile pause 4319d9162550SBram Moolenaarenddef 4320d9162550SBram Moolenaar 4321585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4322585fea7bSBram Moolenaardef Test_substitute_cmd() 4323585fea7bSBram Moolenaar new 4324585fea7bSBram Moolenaar setline(1, 'something') 4325585fea7bSBram Moolenaar :substitute(some(other( 4326585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4327585fea7bSBram Moolenaar bwipe! 4328585fea7bSBram Moolenaar 4329f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4330cfcd011fSBram Moolenaar var lines =<< trim END 4331585fea7bSBram Moolenaar vim9script 4332585fea7bSBram Moolenaar new 4333585fea7bSBram Moolenaar setline(1, 'something') 4334585fea7bSBram Moolenaar :substitute(some(other( 4335585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4336585fea7bSBram Moolenaar bwipe! 4337585fea7bSBram Moolenaar END 4338585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4339585fea7bSBram Moolenaar source Xvim9lines 4340585fea7bSBram Moolenaar 4341585fea7bSBram Moolenaar delete('Xvim9lines') 4342585fea7bSBram Moolenaarenddef 4343585fea7bSBram Moolenaar 43448a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4345