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) 6074490ec4eSYegappan 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 1226921ba529SBram Moolenaar var import_func_duplicated =<< trim END 1227921ba529SBram Moolenaar vim9script 1228921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1229921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1230921ba529SBram Moolenaar 1231921ba529SBram Moolenaar ExportedInc() 1232921ba529SBram Moolenaar END 1233921ba529SBram Moolenaar writefile(import_func_duplicated, 'Ximport.vim') 1234921ba529SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 1235921ba529SBram Moolenaar 1236a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1237a6294955SBram Moolenaar vim9script 1238a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1239a6294955SBram Moolenaar var some = 'other' 1240a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1241a6294955SBram Moolenaar defcompile 1242a6294955SBram Moolenaar END 1243a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1244a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1245a6294955SBram Moolenaar 1246cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1247cb4e80faSBram Moolenaar vim9script 1248cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1249cb4e80faSBram Moolenaar g:imported_script = Export exported 1250cb4e80faSBram Moolenaar END 1251cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1252cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1253cb4e80faSBram Moolenaar 1254cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1255cb4e80faSBram Moolenaar vim9script 1256cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1257cb4e80faSBram Moolenaar g:imported_script = Export. exported 1258cb4e80faSBram Moolenaar END 1259cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1260cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1261cb4e80faSBram Moolenaar 1262cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1263599c89c8SBram Moolenaar vim9script 1264599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1265599c89c8SBram Moolenaar def Func() 1266cfcd011fSBram Moolenaar var imported = Export. 1267599c89c8SBram Moolenaar enddef 1268822ba247SBram Moolenaar defcompile 1269599c89c8SBram Moolenaar END 1270599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 127144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1272599c89c8SBram Moolenaar 1273cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12741c991144SBram Moolenaar vim9script 12751c991144SBram Moolenaar import * 12761c991144SBram Moolenaar as Export 12771c991144SBram Moolenaar from 12781c991144SBram Moolenaar './Xexport.vim' 12791c991144SBram Moolenaar def UseExport() 128024e93165SBram Moolenaar g:exported = Export.exported 12811c991144SBram Moolenaar enddef 12821c991144SBram Moolenaar UseExport() 12831c991144SBram Moolenaar END 12841c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12851c991144SBram Moolenaar source Ximport.vim 128624e93165SBram Moolenaar assert_equal(18, g:exported) 128724e93165SBram Moolenaar unlet g:exported 12881c991144SBram Moolenaar 1289cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1290f2d5c240SBram Moolenaar vim9script 1291f2d5c240SBram Moolenaar import * from './Xexport.vim' 1292f2d5c240SBram Moolenaar END 1293f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 129444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1295f2d5c240SBram Moolenaar 1296f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1297cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1298fa29c8abSBram Moolenaar vim9script 1299fa29c8abSBram Moolenaar import name from './Xexport.vim' 1300fa29c8abSBram Moolenaar END 1301fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 130244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1303fa29c8abSBram Moolenaar 1304f5be8cdbSBram Moolenaar # try to import something that is already defined 1305cfcd011fSBram Moolenaar var import_already_defined =<< trim END 13065269bd2aSBram Moolenaar vim9script 1307cfcd011fSBram Moolenaar var exported = 'something' 13085269bd2aSBram Moolenaar import exported from './Xexport.vim' 13095269bd2aSBram Moolenaar END 13105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1311057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13125269bd2aSBram Moolenaar 1313f5be8cdbSBram Moolenaar # try to import something that is already defined 13145269bd2aSBram Moolenaar import_already_defined =<< trim END 13155269bd2aSBram Moolenaar vim9script 1316cfcd011fSBram Moolenaar var exported = 'something' 13175269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13185269bd2aSBram Moolenaar END 13195269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1320057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13215269bd2aSBram Moolenaar 1322f5be8cdbSBram Moolenaar # try to import something that is already defined 13235269bd2aSBram Moolenaar import_already_defined =<< trim END 13245269bd2aSBram Moolenaar vim9script 1325cfcd011fSBram Moolenaar var exported = 'something' 13265269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13275269bd2aSBram Moolenaar END 13285269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1329057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13305269bd2aSBram Moolenaar 1331918a4249SBram Moolenaar # try changing an imported const 1332918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1333918a4249SBram Moolenaar vim9script 1334918a4249SBram Moolenaar import CONST from './Xexport.vim' 1335918a4249SBram Moolenaar def Assign() 1336918a4249SBram Moolenaar CONST = 987 1337918a4249SBram Moolenaar enddef 1338918a4249SBram Moolenaar defcompile 1339918a4249SBram Moolenaar END 1340918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1341918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1342918a4249SBram Moolenaar 13430f2a5cc6SBram Moolenaar # try changing an imported final 13440f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13450f2a5cc6SBram Moolenaar vim9script 13460f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13470f2a5cc6SBram Moolenaar def Assign() 13480f2a5cc6SBram Moolenaar theList = [2] 13490f2a5cc6SBram Moolenaar enddef 13500f2a5cc6SBram Moolenaar defcompile 13510f2a5cc6SBram Moolenaar END 13520f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13530f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13540f2a5cc6SBram Moolenaar 1355f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1356cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1357fa29c8abSBram Moolenaar vim9script 1358fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1359fa29c8abSBram Moolenaar END 1360fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 136144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1362fa29c8abSBram Moolenaar 1363cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1364fa29c8abSBram Moolenaar vim9script 1365fa29c8abSBram Moolenaar import name './Xexport.vim' 1366fa29c8abSBram Moolenaar END 1367fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 136844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1369fa29c8abSBram Moolenaar 1370cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1371fa29c8abSBram Moolenaar vim9script 1372fa29c8abSBram Moolenaar import name from Xexport.vim 1373fa29c8abSBram Moolenaar END 1374fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 13754db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1376fa29c8abSBram Moolenaar 1377cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1378fa29c8abSBram Moolenaar vim9script 1379fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1380fa29c8abSBram Moolenaar END 1381fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 138244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1383fa29c8abSBram Moolenaar 1384cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1385fa29c8abSBram Moolenaar vim9script 1386fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1387fa29c8abSBram Moolenaar END 13885269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 138944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1390fa29c8abSBram Moolenaar 139160579350SBram Moolenaar var import_redefining_lines =<< trim END 139260579350SBram Moolenaar vim9script 139360579350SBram Moolenaar import exported from './Xexport.vim' 139460579350SBram Moolenaar var exported = 5 139560579350SBram Moolenaar END 139660579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 139760579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 139860579350SBram Moolenaar 139960579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 140060579350SBram Moolenaar vim9script 140160579350SBram Moolenaar import exported from './Xexport.vim' 140260579350SBram Moolenaar exported = 'xxx' 140360579350SBram Moolenaar END 140460579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 140560579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 140660579350SBram Moolenaar 140760579350SBram Moolenaar var import_assign_const_lines =<< trim END 140860579350SBram Moolenaar vim9script 140960579350SBram Moolenaar import CONST from './Xexport.vim' 141060579350SBram Moolenaar CONST = 4321 141160579350SBram Moolenaar END 141260579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 141360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 141460579350SBram Moolenaar 1415f2d5c240SBram Moolenaar delete('Ximport.vim') 14165269bd2aSBram Moolenaar delete('Ximport3.vim') 14178a7d6542SBram Moolenaar delete('Xexport.vim') 14188a7d6542SBram Moolenaar 1419f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14203e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14213e191694SBram Moolenaar set cpo=abcd 1422cfcd011fSBram Moolenaar var lines =<< trim END 1423750802b5SBram Moolenaar vim9script 1424750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14253e191694SBram Moolenaar set cpo+=f 14263e191694SBram Moolenaar set cpo-=c 14273e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1428750802b5SBram Moolenaar END 1429750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1430750802b5SBram Moolenaar source Xvim9_script 14313e191694SBram Moolenaar assert_equal('fabd', &cpo) 1432750802b5SBram Moolenaar set cpo&vim 1433750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14343e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14353e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14363e191694SBram Moolenaar 1437750802b5SBram Moolenaar delete('Xvim9_script') 1438750802b5SBram Moolenaarenddef 1439750802b5SBram Moolenaar 14400a84284eSBram Moolenaardef Test_import_as() 14410a84284eSBram Moolenaar var export_lines =<< trim END 14420a84284eSBram Moolenaar vim9script 14430a84284eSBram Moolenaar export var one = 1 14440a84284eSBram Moolenaar export var yes = 'yes' 1445c967d57aSBram Moolenaar export var slist: list<string> 14460a84284eSBram Moolenaar END 14470a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14480a84284eSBram Moolenaar 14490a84284eSBram Moolenaar var import_lines =<< trim END 14500a84284eSBram Moolenaar vim9script 14516c7cc347SBram Moolenaar var one = 'notused' 14526c7cc347SBram Moolenaar var yes = 777 14530a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14540a84284eSBram Moolenaar assert_equal(1, thatOne) 14550a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14560a84284eSBram Moolenaar assert_equal('yes', yesYes) 14570a84284eSBram Moolenaar END 14580a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14590a84284eSBram Moolenaar 14600a84284eSBram Moolenaar import_lines =<< trim END 14610a84284eSBram Moolenaar vim9script 14620a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14630a84284eSBram Moolenaar assert_equal(1, thatOne) 14640a84284eSBram Moolenaar assert_equal('yes', yesYes) 14650a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14660a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14670a84284eSBram Moolenaar END 14680a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14690a84284eSBram Moolenaar 1470c967d57aSBram Moolenaar import_lines =<< trim END 1471c967d57aSBram Moolenaar vim9script 1472c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1473c967d57aSBram Moolenaar impSlist->add(123) 1474c967d57aSBram Moolenaar END 1475c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1476c967d57aSBram Moolenaar 14770a84284eSBram Moolenaar delete('XexportAs') 14780a84284eSBram Moolenaarenddef 14790a84284eSBram Moolenaar 1480803af686SBram Moolenaarfunc g:Trigger() 1481803af686SBram Moolenaar source Ximport.vim 1482803af686SBram Moolenaar return "echo 'yes'\<CR>" 1483803af686SBram Moolenaarendfunc 1484803af686SBram Moolenaar 1485803af686SBram Moolenaardef Test_import_export_expr_map() 1486803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1487cfcd011fSBram Moolenaar var export_lines =<< trim END 1488803af686SBram Moolenaar vim9script 1489803af686SBram Moolenaar export def That(): string 1490803af686SBram Moolenaar return 'yes' 1491803af686SBram Moolenaar enddef 1492803af686SBram Moolenaar END 1493803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1494803af686SBram Moolenaar 1495cfcd011fSBram Moolenaar var import_lines =<< trim END 1496803af686SBram Moolenaar vim9script 1497803af686SBram Moolenaar import That from './Xexport_that.vim' 1498803af686SBram Moolenaar assert_equal('yes', That()) 1499803af686SBram Moolenaar END 1500803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1501803af686SBram Moolenaar 1502803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1503803af686SBram Moolenaar feedkeys('trigger', "xt") 1504803af686SBram Moolenaar 1505730b2483SBram Moolenaar delete('Xexport_that.vim') 1506803af686SBram Moolenaar delete('Ximport.vim') 1507803af686SBram Moolenaar nunmap trigger 1508803af686SBram Moolenaarenddef 1509803af686SBram Moolenaar 15108e1986e3SBram Moolenaardef Test_import_in_filetype() 15118e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15128e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1513cfcd011fSBram Moolenaar var export_lines =<< trim END 15148e1986e3SBram Moolenaar vim9script 1515cfcd011fSBram Moolenaar export var That = 'yes' 15168e1986e3SBram Moolenaar END 1517730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15188e1986e3SBram Moolenaar 1519cfcd011fSBram Moolenaar var import_lines =<< trim END 15208e1986e3SBram Moolenaar vim9script 1521730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15228e1986e3SBram Moolenaar assert_equal('yes', That) 15238e1986e3SBram Moolenaar g:did_load_mytpe = 1 15248e1986e3SBram Moolenaar END 15258e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15268e1986e3SBram Moolenaar 1527cfcd011fSBram Moolenaar var save_rtp = &rtp 15288e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15298e1986e3SBram Moolenaar 15308e1986e3SBram Moolenaar filetype plugin on 15318e1986e3SBram Moolenaar copen 15328e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15338e1986e3SBram Moolenaar 15348e1986e3SBram Moolenaar quit! 1535730b2483SBram Moolenaar delete('Xexport_ft.vim') 15368e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15378e1986e3SBram Moolenaar &rtp = save_rtp 15388e1986e3SBram Moolenaarenddef 15398e1986e3SBram Moolenaar 1540efa94447SBram Moolenaardef Test_use_import_in_mapping() 1541cfcd011fSBram Moolenaar var lines =<< trim END 1542efa94447SBram Moolenaar vim9script 1543efa94447SBram Moolenaar export def Funcx() 1544efa94447SBram Moolenaar g:result = 42 1545efa94447SBram Moolenaar enddef 1546efa94447SBram Moolenaar END 1547efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1548efa94447SBram Moolenaar lines =<< trim END 1549efa94447SBram Moolenaar vim9script 1550efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1551b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1552efa94447SBram Moolenaar END 1553efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1554efa94447SBram Moolenaar 1555efa94447SBram Moolenaar source Xmapscript.vim 1556b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1557efa94447SBram Moolenaar assert_equal(42, g:result) 1558efa94447SBram Moolenaar 1559efa94447SBram Moolenaar unlet g:result 1560efa94447SBram Moolenaar delete('XsomeExport.vim') 1561efa94447SBram Moolenaar delete('Xmapscript.vim') 1562b3ca9824SBram Moolenaar nunmap <F3> 1563efa94447SBram Moolenaarenddef 1564efa94447SBram Moolenaar 1565d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1566d3f8a9eeSBram Moolenaar var lines =<< trim END 1567d3f8a9eeSBram Moolenaar if has(g:feature) 1568d3f8a9eeSBram Moolenaar " legacy script 1569d3f8a9eeSBram Moolenaar let g:legacy = 1 1570d3f8a9eeSBram Moolenaar finish 1571d3f8a9eeSBram Moolenaar endif 1572d3f8a9eeSBram Moolenaar vim9script 1573d3f8a9eeSBram Moolenaar g:legacy = 0 1574d3f8a9eeSBram Moolenaar END 1575d3f8a9eeSBram Moolenaar g:feature = 'eval' 1576d3f8a9eeSBram Moolenaar g:legacy = -1 1577d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1578d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1579d3f8a9eeSBram Moolenaar 1580d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1581d3f8a9eeSBram Moolenaar g:legacy = -1 1582d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1583d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1584d3f8a9eeSBram Moolenaarenddef 1585d3f8a9eeSBram Moolenaar 1586750802b5SBram Moolenaardef Test_vim9script_fails() 15878a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15888a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1589cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15909721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1591cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1592750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1593750802b5SBram Moolenaar 1594cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1595c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1596c785b9a7SBram Moolenaar 1597e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1598e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15998a7d6542SBram Moolenaarenddef 16008a7d6542SBram Moolenaar 1601f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1602101f4810SBram Moolenaar CheckRunVimInTerminal 1603101f4810SBram Moolenaar 16049bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1605c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16069bb3eb3eSBram Moolenaarendfunc 16079bb3eb3eSBram Moolenaar 1608c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1609cfcd011fSBram Moolenaar var export =<< trim END 1610101f4810SBram Moolenaar vim9script 1611101f4810SBram Moolenaar export def Foo(): number 1612101f4810SBram Moolenaar return 0 1613101f4810SBram Moolenaar enddef 1614101f4810SBram Moolenaar END 1615730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1616101f4810SBram Moolenaar 1617e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16189bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16192949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1620101f4810SBram Moolenaar 1621730b2483SBram Moolenaar delete('XexportCmd.vim') 16229bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16239bb3eb3eSBram Moolenaarenddef 1624101f4810SBram Moolenaar 16252b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16262b32700dSBram Moolenaar var lines =<< trim END 1627a6294955SBram Moolenaar vim9script 1628a6294955SBram Moolenaar export var exported = 'thexport' 1629*60dc8274SBram Moolenaar 1630*60dc8274SBram Moolenaar export def TheFunc(x = 0) 1631*60dc8274SBram Moolenaar enddef 1632a6294955SBram Moolenaar END 1633a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1634a6294955SBram Moolenaar lines =<< trim END 16352b32700dSBram Moolenaar vim9script noclear 16362b32700dSBram Moolenaar g:loadCount += 1 16372b32700dSBram Moolenaar var s:reloaded = 'init' 1638a6294955SBram Moolenaar import exported from './XExportReload' 16392b32700dSBram Moolenaar 16402b32700dSBram Moolenaar def Again(): string 16412b32700dSBram Moolenaar return 'again' 16422b32700dSBram Moolenaar enddef 16432b32700dSBram Moolenaar 1644*60dc8274SBram Moolenaar import TheFunc from './XExportReload' 1645*60dc8274SBram Moolenaar TheFunc() 1646*60dc8274SBram Moolenaar 16472b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16482b32700dSBram Moolenaar var s:loaded = true 16492b32700dSBram Moolenaar 16502b32700dSBram Moolenaar var s:notReloaded = 'yes' 16512b32700dSBram Moolenaar s:reloaded = 'first' 16522b32700dSBram Moolenaar def g:Values(): list<string> 1653a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16542b32700dSBram Moolenaar enddef 16552b32700dSBram Moolenaar 16562b32700dSBram Moolenaar def Once(): string 16572b32700dSBram Moolenaar return 'once' 16582b32700dSBram Moolenaar enddef 16592b32700dSBram Moolenaar END 16602b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16612b32700dSBram Moolenaar g:loadCount = 0 16622b32700dSBram Moolenaar source XReloaded 16632b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1664a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16652b32700dSBram Moolenaar source XReloaded 16662b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1667a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16682b32700dSBram Moolenaar source XReloaded 16692b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1670a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16712b32700dSBram Moolenaar 167248e11c10SBram Moolenaar delete('XReloaded') 1673a6294955SBram Moolenaar delete('XExportReload') 16742b32700dSBram Moolenaar delfunc g:Values 16752b32700dSBram Moolenaar unlet g:loadCount 1676577dc93dSBram Moolenaar 1677577dc93dSBram Moolenaar lines =<< trim END 1678577dc93dSBram Moolenaar vim9script 1679577dc93dSBram Moolenaar def Inner() 1680577dc93dSBram Moolenaar enddef 1681577dc93dSBram Moolenaar END 1682577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1683577dc93dSBram Moolenaar source XreloadScript.vim 1684577dc93dSBram Moolenaar 1685577dc93dSBram Moolenaar lines =<< trim END 1686577dc93dSBram Moolenaar vim9script 1687577dc93dSBram Moolenaar def Outer() 1688577dc93dSBram Moolenaar def Inner() 1689577dc93dSBram Moolenaar enddef 1690577dc93dSBram Moolenaar enddef 1691577dc93dSBram Moolenaar defcompile 1692577dc93dSBram Moolenaar END 1693577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1694577dc93dSBram Moolenaar source XreloadScript.vim 1695577dc93dSBram Moolenaar 1696577dc93dSBram Moolenaar delete('XreloadScript.vim') 16972b32700dSBram Moolenaarenddef 16982b32700dSBram Moolenaar 16994c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1700cfcd011fSBram Moolenaar var lines =<< trim END 17018a7d6542SBram Moolenaar vim9script 17028a7d6542SBram Moolenaar const var = '' 1703cfcd011fSBram Moolenaar var valone = 1234 17048a7d6542SBram Moolenaar def MyFunc(arg: string) 17058a7d6542SBram Moolenaar valone = 5678 17068a7d6542SBram Moolenaar enddef 17078a7d6542SBram Moolenaar END 1708cfcd011fSBram Moolenaar var morelines =<< trim END 1709cfcd011fSBram Moolenaar var valtwo = 222 17108a7d6542SBram Moolenaar export def GetValtwo(): number 17118a7d6542SBram Moolenaar return valtwo 17128a7d6542SBram Moolenaar enddef 17138a7d6542SBram Moolenaar END 171403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17158a7d6542SBram Moolenaar source Xreload.vim 17168a7d6542SBram Moolenaar source Xreload.vim 17178a7d6542SBram Moolenaar source Xreload.vim 17188a7d6542SBram Moolenaar 1719f5be8cdbSBram Moolenaar # cannot declare a var twice 17208a7d6542SBram Moolenaar lines =<< trim END 17218a7d6542SBram Moolenaar vim9script 1722cfcd011fSBram Moolenaar var valone = 1234 1723cfcd011fSBram Moolenaar var valone = 5678 17248a7d6542SBram Moolenaar END 17258a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 172644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17278a7d6542SBram Moolenaar 17288a7d6542SBram Moolenaar delete('Xreload.vim') 17298a7d6542SBram Moolenaar delete('Ximport.vim') 17308a7d6542SBram Moolenaarenddef 17318a7d6542SBram Moolenaar 173207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 173307a65d26SBram Moolenaar" compiled function using that variable must fail. 173407a65d26SBram Moolenaardef Test_script_reload_change_type() 173507a65d26SBram Moolenaar var lines =<< trim END 173607a65d26SBram Moolenaar vim9script noclear 173707a65d26SBram Moolenaar var str = 'string' 173807a65d26SBram Moolenaar def g:GetStr(): string 173907a65d26SBram Moolenaar return str .. 'xxx' 174007a65d26SBram Moolenaar enddef 174107a65d26SBram Moolenaar END 174207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 174307a65d26SBram Moolenaar source Xreload.vim 174407a65d26SBram Moolenaar echo g:GetStr() 174507a65d26SBram Moolenaar 174607a65d26SBram Moolenaar lines =<< trim END 174707a65d26SBram Moolenaar vim9script noclear 174807a65d26SBram Moolenaar var str = 1234 174907a65d26SBram Moolenaar END 175007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 175107a65d26SBram Moolenaar source Xreload.vim 175207a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 175307a65d26SBram Moolenaar 175407a65d26SBram Moolenaar delfunc g:GetStr 175507a65d26SBram Moolenaar delete('Xreload.vim') 175607a65d26SBram Moolenaarenddef 175707a65d26SBram Moolenaar 1758c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1759c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1760c970e422SBram Moolenaar 1761c970e422SBram Moolenaardef Test_script_reload_from_function() 1762c970e422SBram Moolenaar var lines =<< trim END 1763c970e422SBram Moolenaar vim9script 1764c970e422SBram Moolenaar 1765c970e422SBram Moolenaar if exists('g:loaded') 1766c970e422SBram Moolenaar finish 1767c970e422SBram Moolenaar endif 1768c970e422SBram Moolenaar g:loaded = 1 1769c970e422SBram Moolenaar delcommand CallFunc 1770c970e422SBram Moolenaar command CallFunc Func() 1771c970e422SBram Moolenaar def Func() 1772a4c81beaSBram Moolenaar so XreloadFunc.vim 1773c970e422SBram Moolenaar g:didTheFunc = 1 1774c970e422SBram Moolenaar enddef 1775c970e422SBram Moolenaar END 1776c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1777c970e422SBram Moolenaar source XreloadFunc.vim 1778c970e422SBram Moolenaar CallFunc 1779c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1780c970e422SBram Moolenaar 1781c970e422SBram Moolenaar delete('XreloadFunc.vim') 1782c970e422SBram Moolenaar delcommand CallFunc 1783c970e422SBram Moolenaar unlet g:loaded 1784c970e422SBram Moolenaar unlet g:didTheFunc 1785c970e422SBram Moolenaarenddef 1786c970e422SBram Moolenaar 17876c3843caSBram Moolenaardef Test_script_var_shadows_function() 17886c3843caSBram Moolenaar var lines =<< trim END 17896c3843caSBram Moolenaar vim9script 17906c3843caSBram Moolenaar def Func(): number 17916c3843caSBram Moolenaar return 123 17926c3843caSBram Moolenaar enddef 17936c3843caSBram Moolenaar var Func = 1 17946c3843caSBram Moolenaar END 17956c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17966c3843caSBram Moolenaarenddef 17976c3843caSBram Moolenaar 1798c323527dSBram Moolenaardef Test_script_var_shadows_command() 1799c323527dSBram Moolenaar var lines =<< trim END 1800c323527dSBram Moolenaar var undo = 1 1801c323527dSBram Moolenaar undo = 2 1802c323527dSBram Moolenaar assert_equal(2, undo) 1803c323527dSBram Moolenaar END 1804c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1805c323527dSBram Moolenaar 1806c323527dSBram Moolenaar lines =<< trim END 1807c323527dSBram Moolenaar var undo = 1 1808c323527dSBram Moolenaar undo 1809c323527dSBram Moolenaar END 1810c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1811c323527dSBram Moolenaarenddef 1812c323527dSBram Moolenaar 181395006e3dSBram Moolenaardef s:RetSome(): string 181495006e3dSBram Moolenaar return 'some' 181595006e3dSBram Moolenaarenddef 181695006e3dSBram Moolenaar 1817fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1818fe465a01SBram Moolenaar" script-local name. 1819fe465a01SBram Moolenaardef Test_vim9script_funcref() 1820cfcd011fSBram Moolenaar var sortlines =<< trim END 1821fe465a01SBram Moolenaar vim9script 1822fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1823bed36b93SBram Moolenaar return i2 - i1 1824fe465a01SBram Moolenaar enddef 1825fe465a01SBram Moolenaar 1826fe465a01SBram Moolenaar export def FastSort(): list<number> 1827fe465a01SBram Moolenaar return range(5)->sort(Compare) 1828fe465a01SBram Moolenaar enddef 1829529fb5a5SBram Moolenaar 1830529fb5a5SBram Moolenaar export def GetString(arg: string): string 1831529fb5a5SBram Moolenaar return arg 1832529fb5a5SBram Moolenaar enddef 1833fe465a01SBram Moolenaar END 1834fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1835fe465a01SBram Moolenaar 1836cfcd011fSBram Moolenaar var lines =<< trim END 1837fe465a01SBram Moolenaar vim9script 1838fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1839fe465a01SBram Moolenaar def Test() 1840fe465a01SBram Moolenaar g:result = FastSort() 1841fe465a01SBram Moolenaar enddef 1842fe465a01SBram Moolenaar Test() 1843529fb5a5SBram Moolenaar 1844529fb5a5SBram Moolenaar # using a function imported with "as" 1845529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1846529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1847529fb5a5SBram Moolenaar 1848529fb5a5SBram Moolenaar # using the function from a compiled function 1849529fb5a5SBram Moolenaar def TestMore(): string 1850ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1851ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1852529fb5a5SBram Moolenaar enddef 1853ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1854529fb5a5SBram Moolenaar 1855529fb5a5SBram Moolenaar # error when using a function that isn't exported 1856529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1857fe465a01SBram Moolenaar END 1858fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1859fe465a01SBram Moolenaar 1860fe465a01SBram Moolenaar source Xscript.vim 1861fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1862fe465a01SBram Moolenaar 1863fe465a01SBram Moolenaar unlet g:result 1864fe465a01SBram Moolenaar delete('Xsort.vim') 1865fe465a01SBram Moolenaar delete('Xscript.vim') 186695006e3dSBram Moolenaar 1867cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 186895006e3dSBram Moolenaar assert_equal('some', Funcref()) 1869fe465a01SBram Moolenaarenddef 1870fe465a01SBram Moolenaar 1871601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1872601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1873601e76acSBram Moolenaar" function reference. 1874c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1875cfcd011fSBram Moolenaar var filterLines =<< trim END 1876c620c055SBram Moolenaar vim9script 1877c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1878c620c055SBram Moolenaar return idx % 2 == 1 1879c620c055SBram Moolenaar enddef 1880c620c055SBram Moolenaar export def FastFilter(): list<number> 1881c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1882c620c055SBram Moolenaar enddef 1883601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1884601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1885601e76acSBram Moolenaar enddef 1886c620c055SBram Moolenaar END 1887c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1888c620c055SBram Moolenaar 1889cfcd011fSBram Moolenaar var lines =<< trim END 1890c620c055SBram Moolenaar vim9script 1891601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1892c620c055SBram Moolenaar def Test() 1893cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1894c620c055SBram Moolenaar enddef 1895c620c055SBram Moolenaar Test() 1896601e76acSBram Moolenaar def TestDirect() 1897cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1898601e76acSBram Moolenaar enddef 1899601e76acSBram Moolenaar TestDirect() 1900c620c055SBram Moolenaar END 1901601e76acSBram Moolenaar CheckScriptSuccess(lines) 1902c620c055SBram Moolenaar delete('Xfilter.vim') 1903c620c055SBram Moolenaarenddef 1904c620c055SBram Moolenaar 19054c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1906cfcd011fSBram Moolenaar var first_lines =<< trim END 19074c17ad94SBram Moolenaar vim9script 19084c17ad94SBram Moolenaar def FuncYes(): string 19094c17ad94SBram Moolenaar return 'yes' 19104c17ad94SBram Moolenaar enddef 19114c17ad94SBram Moolenaar END 1912cfcd011fSBram Moolenaar var withno_lines =<< trim END 19134c17ad94SBram Moolenaar def FuncNo(): string 19144c17ad94SBram Moolenaar return 'no' 19154c17ad94SBram Moolenaar enddef 19164c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19174c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19184c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 191903afdcf1SBram Moolenaar enddef 192003afdcf1SBram Moolenaar END 1921cfcd011fSBram Moolenaar var nono_lines =<< trim END 192203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 192303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 192444d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19254c17ad94SBram Moolenaar enddef 19264c17ad94SBram Moolenaar END 19274c17ad94SBram Moolenaar 19284c17ad94SBram Moolenaar # FuncNo() is defined 192903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19304c17ad94SBram Moolenaar source Xreloaded.vim 19314c17ad94SBram Moolenaar g:DoCheck(true) 19324c17ad94SBram Moolenaar 19334c17ad94SBram Moolenaar # FuncNo() is not redefined 193403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19354c17ad94SBram Moolenaar source Xreloaded.vim 19365082471fSBram Moolenaar g:DoCheck(false) 19374c17ad94SBram Moolenaar 19384c17ad94SBram Moolenaar # FuncNo() is back 193903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19404c17ad94SBram Moolenaar source Xreloaded.vim 19415082471fSBram Moolenaar g:DoCheck(false) 19424c17ad94SBram Moolenaar 19434c17ad94SBram Moolenaar delete('Xreloaded.vim') 19444c17ad94SBram Moolenaarenddef 19454c17ad94SBram Moolenaar 194689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 194789483d40SBram Moolenaar # write the script with a script-local variable 1948cfcd011fSBram Moolenaar var lines =<< trim END 194989483d40SBram Moolenaar vim9script 1950cfcd011fSBram Moolenaar var name = 'string' 195189483d40SBram Moolenaar END 195289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 195389483d40SBram Moolenaar source XreloadVar.vim 195489483d40SBram Moolenaar 195589483d40SBram Moolenaar # now write the script using the same variable locally - works 195689483d40SBram Moolenaar lines =<< trim END 195789483d40SBram Moolenaar vim9script 195889483d40SBram Moolenaar def Func() 1959cfcd011fSBram Moolenaar var name = 'string' 196089483d40SBram Moolenaar enddef 196189483d40SBram Moolenaar END 196289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 196389483d40SBram Moolenaar source XreloadVar.vim 196489483d40SBram Moolenaar 196589483d40SBram Moolenaar delete('XreloadVar.vim') 196689483d40SBram Moolenaarenddef 196789483d40SBram Moolenaar 19688a7d6542SBram Moolenaardef Test_import_absolute() 1969cfcd011fSBram Moolenaar var import_lines = [ 1970e6085c53SBram Moolenaar 'vim9script', 1971e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1972e6085c53SBram Moolenaar 'def UseExported()', 1973e6085c53SBram Moolenaar ' g:imported_abs = exported', 1974e6085c53SBram Moolenaar ' exported = 8888', 1975e6085c53SBram Moolenaar ' g:imported_after = exported', 1976e6085c53SBram Moolenaar 'enddef', 1977e6085c53SBram Moolenaar 'UseExported()', 1978e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1979e6085c53SBram Moolenaar ] 19808a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19828a7d6542SBram Moolenaar 19838a7d6542SBram Moolenaar source Ximport_abs.vim 19848a7d6542SBram Moolenaar 19858a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19864e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1987fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1988fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1989fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1990fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1991fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1992fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1993fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1994fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1995fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1996fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1997e6085c53SBram Moolenaar g:import_disassembled) 1998b3ca9824SBram Moolenaar 1999b3ca9824SBram Moolenaar Undo_export_script_lines() 20008a7d6542SBram Moolenaar unlet g:imported_abs 20014e12a5dfSBram Moolenaar unlet g:import_disassembled 20028a7d6542SBram Moolenaar 20038a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20048a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20058a7d6542SBram Moolenaarenddef 20068a7d6542SBram Moolenaar 20078a7d6542SBram Moolenaardef Test_import_rtp() 2008cfcd011fSBram Moolenaar var import_lines = [ 2009e6085c53SBram Moolenaar 'vim9script', 2010e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2011e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2012e6085c53SBram Moolenaar ] 20138a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2014b885a7c7SBram Moolenaar mkdir('import', 'p') 2015b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20168a7d6542SBram Moolenaar 2017cfcd011fSBram Moolenaar var save_rtp = &rtp 20188a7d6542SBram Moolenaar &rtp = getcwd() 20198a7d6542SBram Moolenaar source Ximport_rtp.vim 20208a7d6542SBram Moolenaar &rtp = save_rtp 20218a7d6542SBram Moolenaar 20228a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20238a7d6542SBram Moolenaar 2024b3ca9824SBram Moolenaar Undo_export_script_lines() 2025b3ca9824SBram Moolenaar unlet g:imported_rtp 20268a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2027b885a7c7SBram Moolenaar delete('import', 'rf') 20288a7d6542SBram Moolenaarenddef 20298a7d6542SBram Moolenaar 203025e0f586SBram Moolenaardef Test_import_compile_error() 2031cfcd011fSBram Moolenaar var export_lines = [ 203225e0f586SBram Moolenaar 'vim9script', 203325e0f586SBram Moolenaar 'export def ExpFunc(): string', 203425e0f586SBram Moolenaar ' return notDefined', 203525e0f586SBram Moolenaar 'enddef', 203625e0f586SBram Moolenaar ] 203725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 203825e0f586SBram Moolenaar 2039cfcd011fSBram Moolenaar var import_lines = [ 204025e0f586SBram Moolenaar 'vim9script', 204125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 204225e0f586SBram Moolenaar 'def ImpFunc()', 204325e0f586SBram Moolenaar ' echo ExpFunc()', 204425e0f586SBram Moolenaar 'enddef', 204525e0f586SBram Moolenaar 'defcompile', 204625e0f586SBram Moolenaar ] 204725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 204825e0f586SBram Moolenaar 204925e0f586SBram Moolenaar try 205025e0f586SBram Moolenaar source Ximport.vim 205125e0f586SBram Moolenaar catch /E1001/ 2052f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20537707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 205425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 205525e0f586SBram Moolenaar endtry 205625e0f586SBram Moolenaar 205725e0f586SBram Moolenaar delete('Xexported.vim') 205825e0f586SBram Moolenaar delete('Ximport.vim') 205925e0f586SBram Moolenaarenddef 206025e0f586SBram Moolenaar 2061c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2062cfcd011fSBram Moolenaar var lines = [ 2063c4ce36d4SBram Moolenaar 'vim9script', 2064c4ce36d4SBram Moolenaar 'def Func()', 2065c4ce36d4SBram Moolenaar ' eval [][0]', 2066c4ce36d4SBram Moolenaar 'enddef', 2067c4ce36d4SBram Moolenaar 'Func()', 2068c4ce36d4SBram Moolenaar ] 2069c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2070c4ce36d4SBram Moolenaar 2071c4ce36d4SBram Moolenaar for count in range(3) 2072c4ce36d4SBram Moolenaar try 2073c4ce36d4SBram Moolenaar source Xtestscript.vim 2074c4ce36d4SBram Moolenaar catch /E684/ 2075c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2076c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2077c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2078c4ce36d4SBram Moolenaar endtry 2079c4ce36d4SBram Moolenaar endfor 2080c4ce36d4SBram Moolenaar 2081c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2082c4ce36d4SBram Moolenaarenddef 2083c4ce36d4SBram Moolenaar 2084eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2085cfcd011fSBram Moolenaar var export_lines =<< trim END 2086eef2102eSBram Moolenaar vim9script 2087eef2102eSBram Moolenaar export def Func() 2088eef2102eSBram Moolenaar echo 'imported' 2089eef2102eSBram Moolenaar enddef 2090eef2102eSBram Moolenaar END 2091eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2092eef2102eSBram Moolenaar 2093cfcd011fSBram Moolenaar var lines =<< trim END 2094eef2102eSBram Moolenaar vim9script 2095eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2096eef2102eSBram Moolenaar def Func() 2097eef2102eSBram Moolenaar echo 'local to function' 2098eef2102eSBram Moolenaar enddef 2099eef2102eSBram Moolenaar END 2100eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2101eef2102eSBram Moolenaar 2102eef2102eSBram Moolenaar lines =<< trim END 2103eef2102eSBram Moolenaar vim9script 2104eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2105eef2102eSBram Moolenaar def Outer() 2106eef2102eSBram Moolenaar def Func() 2107eef2102eSBram Moolenaar echo 'local to function' 2108eef2102eSBram Moolenaar enddef 2109eef2102eSBram Moolenaar enddef 2110eef2102eSBram Moolenaar defcompile 2111eef2102eSBram Moolenaar END 2112eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2113eef2102eSBram Moolenaar 2114eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2115eef2102eSBram Moolenaarenddef 2116eef2102eSBram Moolenaar 2117b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2118cfcd011fSBram Moolenaar var lines =<< trim END 2119b9a2cac3SBram Moolenaar vim9script 2120b9a2cac3SBram Moolenaar def Func() 2121b9a2cac3SBram Moolenaar echo 'one' 2122b9a2cac3SBram Moolenaar enddef 2123b9a2cac3SBram Moolenaar def Func() 2124b9a2cac3SBram Moolenaar echo 'two' 2125b9a2cac3SBram Moolenaar enddef 2126b9a2cac3SBram Moolenaar END 2127b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2128fa211f3cSBram Moolenaar 2129fa211f3cSBram Moolenaar lines =<< trim END 2130fa211f3cSBram Moolenaar vim9script 2131fa211f3cSBram Moolenaar def Foo(): string 2132fa211f3cSBram Moolenaar return 'foo' 2133fa211f3cSBram Moolenaar enddef 2134fa211f3cSBram Moolenaar def Func() 2135cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2136fa211f3cSBram Moolenaar enddef 2137fa211f3cSBram Moolenaar defcompile 2138fa211f3cSBram Moolenaar END 2139fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2140b9a2cac3SBram Moolenaarenddef 2141b9a2cac3SBram Moolenaar 21428a7d6542SBram Moolenaardef Test_fixed_size_list() 2143f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2144cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21458a7d6542SBram Moolenaar l->remove(0) 21468a7d6542SBram Moolenaar l->add(5) 21478a7d6542SBram Moolenaar l->insert(99, 1) 21480f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21498a7d6542SBram Moolenaarenddef 21508a7d6542SBram Moolenaar 2151ae616494SBram Moolenaardef Test_no_insert_xit() 2152d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2153d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2154d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2155d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2156d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2157ae616494SBram Moolenaar 2158ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2159ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2160ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2161ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2162f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2163f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21646508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21656508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2166f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2167f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2168f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2169ae616494SBram Moolenaarenddef 2170ae616494SBram Moolenaar 2171158906cfSBram Moolenaardef IfElse(what: number): string 2172cfcd011fSBram Moolenaar var res = '' 2173158906cfSBram Moolenaar if what == 1 2174158906cfSBram Moolenaar res = "one" 2175158906cfSBram Moolenaar elseif what == 2 2176158906cfSBram Moolenaar res = "two" 2177a259d8d3SBram Moolenaar else 2178158906cfSBram Moolenaar res = "three" 2179a259d8d3SBram Moolenaar endif 2180158906cfSBram Moolenaar return res 2181a259d8d3SBram Moolenaarenddef 2182a259d8d3SBram Moolenaar 2183158906cfSBram Moolenaardef Test_if_elseif_else() 2184158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2185158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2186158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21870f18b6d1SBram Moolenaarenddef 21880f18b6d1SBram Moolenaar 2189e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2190d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2191d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2192d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2193ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2194d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21956628b7ebSBram Moolenaar 21966628b7ebSBram Moolenaar var lines =<< trim END 21976628b7ebSBram Moolenaar var s = '' 21986628b7ebSBram Moolenaar if s = '' 21996628b7ebSBram Moolenaar endif 22006628b7ebSBram Moolenaar END 22016628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22026628b7ebSBram Moolenaar 22036628b7ebSBram Moolenaar lines =<< trim END 22046628b7ebSBram Moolenaar var s = '' 22056628b7ebSBram Moolenaar if s == '' 22066628b7ebSBram Moolenaar elseif s = '' 22076628b7ebSBram Moolenaar endif 22086628b7ebSBram Moolenaar END 22096628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2210e8c4abbbSBram Moolenaarenddef 2211e8c4abbbSBram Moolenaar 22126d69bf60SBram Moolenaarlet g:bool_true = v:true 22136d69bf60SBram Moolenaarlet g:bool_false = v:false 22146d69bf60SBram Moolenaar 22156d69bf60SBram Moolenaardef Test_if_const_expr() 2216cfcd011fSBram Moolenaar var res = false 22176d69bf60SBram Moolenaar if true ? true : false 22186d69bf60SBram Moolenaar res = true 22196d69bf60SBram Moolenaar endif 22206d69bf60SBram Moolenaar assert_equal(true, res) 22216d69bf60SBram Moolenaar 2222585fea7bSBram Moolenaar g:glob = 2 2223585fea7bSBram Moolenaar if false 22246797966dSBram Moolenaar execute('g:glob = 3') 2225585fea7bSBram Moolenaar endif 2226585fea7bSBram Moolenaar assert_equal(2, g:glob) 2227585fea7bSBram Moolenaar if true 22286797966dSBram Moolenaar execute('g:glob = 3') 2229585fea7bSBram Moolenaar endif 2230585fea7bSBram Moolenaar assert_equal(3, g:glob) 2231585fea7bSBram Moolenaar 22326d69bf60SBram Moolenaar res = false 22336d69bf60SBram Moolenaar if g:bool_true ? true : false 22346d69bf60SBram Moolenaar res = true 22356d69bf60SBram Moolenaar endif 22366d69bf60SBram Moolenaar assert_equal(true, res) 22376d69bf60SBram Moolenaar 22386d69bf60SBram Moolenaar res = false 22396d69bf60SBram Moolenaar if true ? g:bool_true : false 22406d69bf60SBram Moolenaar res = true 22416d69bf60SBram Moolenaar endif 22426d69bf60SBram Moolenaar assert_equal(true, res) 22436d69bf60SBram Moolenaar 22446d69bf60SBram Moolenaar res = false 22456d69bf60SBram Moolenaar if true ? true : g:bool_false 22466d69bf60SBram Moolenaar res = true 22476d69bf60SBram Moolenaar endif 22486d69bf60SBram Moolenaar assert_equal(true, res) 22496d69bf60SBram Moolenaar 22506d69bf60SBram Moolenaar res = false 22516d69bf60SBram Moolenaar if true ? false : true 22526d69bf60SBram Moolenaar res = true 22536d69bf60SBram Moolenaar endif 22546d69bf60SBram Moolenaar assert_equal(false, res) 22556d69bf60SBram Moolenaar 22566d69bf60SBram Moolenaar res = false 22576d69bf60SBram Moolenaar if false ? false : true 22586d69bf60SBram Moolenaar res = true 22596d69bf60SBram Moolenaar endif 22606d69bf60SBram Moolenaar assert_equal(true, res) 22616d69bf60SBram Moolenaar 22626d69bf60SBram Moolenaar res = false 22636d69bf60SBram Moolenaar if false ? true : false 22646d69bf60SBram Moolenaar res = true 22656d69bf60SBram Moolenaar endif 22666d69bf60SBram Moolenaar assert_equal(false, res) 22676d69bf60SBram Moolenaar 22686d69bf60SBram Moolenaar res = false 2269e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2270e8c4abbbSBram Moolenaar res = true 2271e8c4abbbSBram Moolenaar endif 2272e8c4abbbSBram Moolenaar assert_equal(false, res) 2273e8c4abbbSBram Moolenaar 2274e8c4abbbSBram Moolenaar res = false 22756d69bf60SBram Moolenaar if true && true 22766d69bf60SBram Moolenaar res = true 22776d69bf60SBram Moolenaar endif 22786d69bf60SBram Moolenaar assert_equal(true, res) 22796d69bf60SBram Moolenaar 22806d69bf60SBram Moolenaar res = false 22816d69bf60SBram Moolenaar if true && false 22826d69bf60SBram Moolenaar res = true 22836d69bf60SBram Moolenaar endif 22846d69bf60SBram Moolenaar assert_equal(false, res) 22856d69bf60SBram Moolenaar 22866d69bf60SBram Moolenaar res = false 22876d69bf60SBram Moolenaar if g:bool_true && false 22886d69bf60SBram Moolenaar res = true 22896d69bf60SBram Moolenaar endif 22906d69bf60SBram Moolenaar assert_equal(false, res) 22916d69bf60SBram Moolenaar 22926d69bf60SBram Moolenaar res = false 22936d69bf60SBram Moolenaar if true && g:bool_false 22946d69bf60SBram Moolenaar res = true 22956d69bf60SBram Moolenaar endif 22966d69bf60SBram Moolenaar assert_equal(false, res) 22976d69bf60SBram Moolenaar 22986d69bf60SBram Moolenaar res = false 22996d69bf60SBram Moolenaar if false && false 23006d69bf60SBram Moolenaar res = true 23016d69bf60SBram Moolenaar endif 23026d69bf60SBram Moolenaar assert_equal(false, res) 23036d69bf60SBram Moolenaar 23046d69bf60SBram Moolenaar res = false 23056d69bf60SBram Moolenaar if true || false 23066d69bf60SBram Moolenaar res = true 23076d69bf60SBram Moolenaar endif 23086d69bf60SBram Moolenaar assert_equal(true, res) 23096d69bf60SBram Moolenaar 23106d69bf60SBram Moolenaar res = false 23116d69bf60SBram Moolenaar if g:bool_true || false 23126d69bf60SBram Moolenaar res = true 23136d69bf60SBram Moolenaar endif 23146d69bf60SBram Moolenaar assert_equal(true, res) 23156d69bf60SBram Moolenaar 23166d69bf60SBram Moolenaar res = false 23176d69bf60SBram Moolenaar if true || g:bool_false 23186d69bf60SBram Moolenaar res = true 23196d69bf60SBram Moolenaar endif 23206d69bf60SBram Moolenaar assert_equal(true, res) 23216d69bf60SBram Moolenaar 23226d69bf60SBram Moolenaar res = false 23236d69bf60SBram Moolenaar if false || false 23246d69bf60SBram Moolenaar res = true 23256d69bf60SBram Moolenaar endif 23266d69bf60SBram Moolenaar assert_equal(false, res) 23273988f64fSBram Moolenaar 23283988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2329c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23303988f64fSBram Moolenaar if false | eval burp + 234 | endif 23313988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23323988f64fSBram Moolenaar if false 23333988f64fSBram Moolenaar burp 23343988f64fSBram Moolenaar endif 233580c34ca3SBram Moolenaarenddef 23366d69bf60SBram Moolenaar 233780c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2338d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2339d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2340d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2341d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23426d69bf60SBram Moolenaarenddef 23436d69bf60SBram Moolenaar 234472abcf42SBram Moolenaardef RunNested(i: number): number 2345cfcd011fSBram Moolenaar var x: number = 0 234672abcf42SBram Moolenaar if i % 2 234772abcf42SBram Moolenaar if 1 2348f5be8cdbSBram Moolenaar # comment 234972abcf42SBram Moolenaar else 2350f5be8cdbSBram Moolenaar # comment 235172abcf42SBram Moolenaar endif 235272abcf42SBram Moolenaar x += 1 235372abcf42SBram Moolenaar else 235472abcf42SBram Moolenaar x += 1000 235572abcf42SBram Moolenaar endif 235672abcf42SBram Moolenaar return x 235772abcf42SBram Moolenaarenddef 235872abcf42SBram Moolenaar 235972abcf42SBram Moolenaardef Test_nested_if() 236072abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 236172abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 236272abcf42SBram Moolenaarenddef 236372abcf42SBram Moolenaar 2364ad39c094SBram Moolenaardef Test_execute_cmd() 2365e4984290SBram Moolenaar # missing argument is ignored 2366e4984290SBram Moolenaar execute 2367e4984290SBram Moolenaar execute # comment 2368e4984290SBram Moolenaar 2369ad39c094SBram Moolenaar new 2370ad39c094SBram Moolenaar setline(1, 'default') 2371d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2372ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2373a72cfb80SBram Moolenaar 2374d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2375a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2376a72cfb80SBram Moolenaar 2377cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2378cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2379a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2380ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2381a72cfb80SBram Moolenaar 2382d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2383ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2384a72cfb80SBram Moolenaar 2385cfcd011fSBram Moolenaar var cmd_first = 'call ' 2386cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2387ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2388ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2389ad39c094SBram Moolenaar bwipe! 2390585fea7bSBram Moolenaar 2391cfcd011fSBram Moolenaar var n = true 23922d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23932d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23942d6b20d6SBram Moolenaar 2395e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2396e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2397e5abf7afSBram Moolenaar 2398d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2399d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2400d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2401ad39c094SBram Moolenaarenddef 2402ad39c094SBram Moolenaar 240347e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2404f5be8cdbSBram Moolenaar # only checks line continuation 2405cfcd011fSBram Moolenaar var lines =<< trim END 240647e880d6SBram Moolenaar vim9script 240747e880d6SBram Moolenaar execute 'g:someVar' 240847e880d6SBram Moolenaar .. ' = ' .. 240947e880d6SBram Moolenaar '28' 241047e880d6SBram Moolenaar assert_equal(28, g:someVar) 241147e880d6SBram Moolenaar unlet g:someVar 241247e880d6SBram Moolenaar END 241347e880d6SBram Moolenaar CheckScriptSuccess(lines) 241447e880d6SBram Moolenaarenddef 241547e880d6SBram Moolenaar 2416ad39c094SBram Moolenaardef Test_echo_cmd() 2417a72cfb80SBram Moolenaar echo 'some' # comment 2418585fea7bSBram Moolenaar echon 'thing' 2419ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2420ad39c094SBram Moolenaar 2421a72cfb80SBram Moolenaar echo "some" # comment 2422a72cfb80SBram Moolenaar echon "thing" 2423a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2424a72cfb80SBram Moolenaar 2425cfcd011fSBram Moolenaar var str1 = 'some' 2426cfcd011fSBram Moolenaar var str2 = 'more' 2427ad39c094SBram Moolenaar echo str1 str2 2428ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2429a72cfb80SBram Moolenaar 2430d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2431ad39c094SBram Moolenaarenddef 2432ad39c094SBram Moolenaar 2433f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2434f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2435f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2436f93c7feaSBram Moolenaar echo 'clear' 2437df069eecSBram Moolenaar :1messages 2438f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2439f93c7feaSBram Moolenaar 2440d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2441f93c7feaSBram Moolenaarenddef 2442f93c7feaSBram Moolenaar 244347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2444f5be8cdbSBram Moolenaar # only checks line continuation 2445cfcd011fSBram Moolenaar var lines =<< trim END 244647e880d6SBram Moolenaar vim9script 244747e880d6SBram Moolenaar echomsg 'here' 244847e880d6SBram Moolenaar .. ' is ' .. 244947e880d6SBram Moolenaar 'a message' 245047e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 245147e880d6SBram Moolenaar END 245247e880d6SBram Moolenaar CheckScriptSuccess(lines) 245347e880d6SBram Moolenaarenddef 245447e880d6SBram Moolenaar 2455f93c7feaSBram Moolenaardef Test_echoerr_cmd() 245640ee466cSBram Moolenaar try 245740ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 245840ee466cSBram Moolenaar catch 245940ee466cSBram Moolenaar assert_match('something wrong', v:exception) 246040ee466cSBram Moolenaar endtry 2461f93c7feaSBram Moolenaarenddef 2462f93c7feaSBram Moolenaar 246347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2464f5be8cdbSBram Moolenaar # only checks line continuation 2465cfcd011fSBram Moolenaar var lines =<< trim END 246647e880d6SBram Moolenaar vim9script 246747e880d6SBram Moolenaar try 246847e880d6SBram Moolenaar echoerr 'this' 246947e880d6SBram Moolenaar .. ' is ' .. 247047e880d6SBram Moolenaar 'wrong' 247147e880d6SBram Moolenaar catch 247247e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 247347e880d6SBram Moolenaar endtry 247447e880d6SBram Moolenaar END 247547e880d6SBram Moolenaar CheckScriptSuccess(lines) 247647e880d6SBram Moolenaarenddef 247747e880d6SBram Moolenaar 247841fe0617SBram Moolenaardef Test_for_outside_of_function() 2479cfcd011fSBram Moolenaar var lines =<< trim END 248041fe0617SBram Moolenaar vim9script 248141fe0617SBram Moolenaar new 248241fe0617SBram Moolenaar for var in range(0, 3) 248341fe0617SBram Moolenaar append(line('$'), var) 248441fe0617SBram Moolenaar endfor 248541fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 248641fe0617SBram Moolenaar bwipe! 2487522eefd9SBram Moolenaar 2488522eefd9SBram Moolenaar var result = '' 2489522eefd9SBram Moolenaar for i in [1, 2, 3] 2490522eefd9SBram Moolenaar var loop = ' loop ' .. i 2491522eefd9SBram Moolenaar result ..= loop 2492522eefd9SBram Moolenaar endfor 2493522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 249441fe0617SBram Moolenaar END 249541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 249641fe0617SBram Moolenaar source Xvim9for.vim 249741fe0617SBram Moolenaar delete('Xvim9for.vim') 249841fe0617SBram Moolenaarenddef 24998a7d6542SBram Moolenaar 2500e8c4abbbSBram Moolenaardef Test_for_loop() 2501f2253963SBram Moolenaar var lines =<< trim END 2502cfcd011fSBram Moolenaar var result = '' 2503e8c4abbbSBram Moolenaar for cnt in range(7) 2504e8c4abbbSBram Moolenaar if cnt == 4 2505e8c4abbbSBram Moolenaar break 2506e8c4abbbSBram Moolenaar endif 2507e8c4abbbSBram Moolenaar if cnt == 2 2508e8c4abbbSBram Moolenaar continue 2509e8c4abbbSBram Moolenaar endif 2510e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2511e8c4abbbSBram Moolenaar endfor 2512e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 25130ad3e894SBram Moolenaar 2514cfcd011fSBram Moolenaar var concat = '' 25150ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25160ad3e894SBram Moolenaar concat ..= str 25170ad3e894SBram Moolenaar endfor 25180ad3e894SBram Moolenaar assert_equal('onetwo', concat) 251938bd8de5SBram Moolenaar 252038bd8de5SBram Moolenaar var total = 0 252138bd8de5SBram Moolenaar for nr in 252238bd8de5SBram Moolenaar [1, 2, 3] 252338bd8de5SBram Moolenaar total += nr 252438bd8de5SBram Moolenaar endfor 252538bd8de5SBram Moolenaar assert_equal(6, total) 252638bd8de5SBram Moolenaar 252738bd8de5SBram Moolenaar total = 0 252838bd8de5SBram Moolenaar for nr 252938bd8de5SBram Moolenaar in [1, 2, 3] 253038bd8de5SBram Moolenaar total += nr 253138bd8de5SBram Moolenaar endfor 253238bd8de5SBram Moolenaar assert_equal(6, total) 253338bd8de5SBram Moolenaar 253438bd8de5SBram Moolenaar total = 0 253538bd8de5SBram Moolenaar for nr 253638bd8de5SBram Moolenaar in 253738bd8de5SBram Moolenaar [1, 2, 3] 253838bd8de5SBram Moolenaar total += nr 253938bd8de5SBram Moolenaar endfor 254038bd8de5SBram Moolenaar assert_equal(6, total) 2541036d0714SBram Moolenaar 2542a3589a0dSBram Moolenaar # with type 2543a3589a0dSBram Moolenaar total = 0 2544a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2545a3589a0dSBram Moolenaar total += n 2546a3589a0dSBram Moolenaar endfor 2547a3589a0dSBram Moolenaar assert_equal(6, total) 2548a3589a0dSBram Moolenaar 2549fe090eb5SBram Moolenaar var chars = '' 2550fe090eb5SBram Moolenaar for s: string in 'foobar' 2551fe090eb5SBram Moolenaar chars ..= s 2552fe090eb5SBram Moolenaar endfor 2553fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2554fe090eb5SBram Moolenaar 25555ede5b23SBram Moolenaar chars = '' 25565ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25575ede5b23SBram Moolenaar chars ..= x 25585ede5b23SBram Moolenaar endfor 25595ede5b23SBram Moolenaar assert_equal('ab', chars) 25605ede5b23SBram Moolenaar 2561a3589a0dSBram Moolenaar # unpack with type 2562f2253963SBram Moolenaar var res = '' 2563a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2564a3589a0dSBram Moolenaar res ..= n .. s 2565a3589a0dSBram Moolenaar endfor 2566a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2567a3589a0dSBram Moolenaar 2568444d8783SBram Moolenaar # unpack with one var 2569444d8783SBram Moolenaar var reslist = [] 2570444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2571444d8783SBram Moolenaar reslist->add(x) 2572444d8783SBram Moolenaar endfor 2573444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2574444d8783SBram Moolenaar 2575a3589a0dSBram Moolenaar # loop over string 2576a3589a0dSBram Moolenaar res = '' 257774e54fcbSBram Moolenaar for c in 'aéc̀d' 257874e54fcbSBram Moolenaar res ..= c .. '-' 257974e54fcbSBram Moolenaar endfor 258074e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 258174e54fcbSBram Moolenaar 258274e54fcbSBram Moolenaar res = '' 258374e54fcbSBram Moolenaar for c in '' 258474e54fcbSBram Moolenaar res ..= c .. '-' 258574e54fcbSBram Moolenaar endfor 258674e54fcbSBram Moolenaar assert_equal('', res) 258774e54fcbSBram Moolenaar 258874e54fcbSBram Moolenaar res = '' 258974e54fcbSBram Moolenaar for c in test_null_string() 259074e54fcbSBram Moolenaar res ..= c .. '-' 259174e54fcbSBram Moolenaar endfor 259274e54fcbSBram Moolenaar assert_equal('', res) 2593f2253963SBram Moolenaar 2594f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2595f2253963SBram Moolenaar {a: 'Cat'} 2596f2253963SBram Moolenaar ] 2597f2253963SBram Moolenaar for dd in foo 2598f2253963SBram Moolenaar dd.counter = 12 2599f2253963SBram Moolenaar endfor 2600f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2601ad2d4969SBram Moolenaar 2602ad2d4969SBram Moolenaar reslist = [] 2603ad2d4969SBram Moolenaar for _ in range(3) 2604ad2d4969SBram Moolenaar reslist->add('x') 2605ad2d4969SBram Moolenaar endfor 2606ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2607f2253963SBram Moolenaar END 2608f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2609e8c4abbbSBram Moolenaarenddef 2610e8c4abbbSBram Moolenaar 26112eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 26122eb6fc3bSBram Moolenaar var lines =<< trim END 26132eb6fc3bSBram Moolenaar var flist: list<func> 26142eb6fc3bSBram Moolenaar for i in range(5) 26152eb6fc3bSBram Moolenaar var inloop = i 26162eb6fc3bSBram Moolenaar flist[i] = () => inloop 26172eb6fc3bSBram Moolenaar endfor 26182eb6fc3bSBram Moolenaar for i in range(5) 26192eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26202eb6fc3bSBram Moolenaar endfor 26212eb6fc3bSBram Moolenaar END 26222eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26232eb6fc3bSBram Moolenaar 26242eb6fc3bSBram Moolenaar lines =<< trim END 26252eb6fc3bSBram Moolenaar var flist: list<func> 26262eb6fc3bSBram Moolenaar for i in range(5) 26272eb6fc3bSBram Moolenaar var inloop = i 26282eb6fc3bSBram Moolenaar flist[i] = () => { 26292eb6fc3bSBram Moolenaar return inloop 26302eb6fc3bSBram Moolenaar } 26312eb6fc3bSBram Moolenaar endfor 26322eb6fc3bSBram Moolenaar for i in range(5) 26332eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26342eb6fc3bSBram Moolenaar endfor 26352eb6fc3bSBram Moolenaar END 26362eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26372eb6fc3bSBram Moolenaarenddef 26382eb6fc3bSBram Moolenaar 2639e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2640442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2641442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2642442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2643442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2644442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2645442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2646d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2647822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 26482d870f8dSBram Moolenaar delfunc! g:Func 2649675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2650675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2651675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 265274e54fcbSBram Moolenaar 265374e54fcbSBram Moolenaar # wrong type detected at compile time 265474e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 265574e54fcbSBram Moolenaar 265674e54fcbSBram Moolenaar # wrong type detected at runtime 265774e54fcbSBram Moolenaar g:adict = {a: 1} 265874e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 265974e54fcbSBram Moolenaar unlet g:adict 2660f6a8d420SBram Moolenaar 2661f6a8d420SBram Moolenaar var lines =<< trim END 2662f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2663f6a8d420SBram Moolenaar for e in d 2664f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2665f6a8d420SBram Moolenaar endfor 2666f6a8d420SBram Moolenaar END 2667f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2668fe090eb5SBram Moolenaar 2669fe090eb5SBram Moolenaar lines =<< trim END 2670fe090eb5SBram Moolenaar for nr: number in ['foo'] 2671fe090eb5SBram Moolenaar endfor 2672fe090eb5SBram Moolenaar END 2673fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2674404557e6SBram Moolenaar 2675404557e6SBram Moolenaar lines =<< trim END 2676404557e6SBram Moolenaar for n : number in [1, 2] 2677404557e6SBram Moolenaar echo n 2678404557e6SBram Moolenaar endfor 2679404557e6SBram Moolenaar END 2680404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2681efc5db52SBram Moolenaar 2682efc5db52SBram Moolenaar lines =<< trim END 2683efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2684efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2685efc5db52SBram Moolenaar echo k v 2686efc5db52SBram Moolenaar endfor 2687efc5db52SBram Moolenaar END 2688efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2689e8c4abbbSBram Moolenaarenddef 2690e8c4abbbSBram Moolenaar 2691ea87069dSBram Moolenaardef Test_for_loop_script_var() 2692ea87069dSBram Moolenaar # cannot use s:var in a :def function 2693ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2694ea87069dSBram Moolenaar 2695ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2696ea87069dSBram Moolenaar var lines =<< trim END 2697ea87069dSBram Moolenaar vim9script 2698ea87069dSBram Moolenaar var total = 0 2699ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2700ea87069dSBram Moolenaar total += s:var 2701ea87069dSBram Moolenaar endfor 2702ea87069dSBram Moolenaar assert_equal(6, total) 2703ea87069dSBram Moolenaar 2704ea87069dSBram Moolenaar total = 0 2705ea87069dSBram Moolenaar for var in [1, 2, 3] 2706ea87069dSBram Moolenaar total += var 2707ea87069dSBram Moolenaar endfor 2708ea87069dSBram Moolenaar assert_equal(6, total) 2709ea87069dSBram Moolenaar END 2710ea87069dSBram Moolenaarenddef 2711ea87069dSBram Moolenaar 2712792f786aSBram Moolenaardef Test_for_loop_unpack() 27134b8a0651SBram Moolenaar var lines =<< trim END 2714792f786aSBram Moolenaar var result = [] 2715792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2716792f786aSBram Moolenaar result->add(v1) 2717792f786aSBram Moolenaar result->add(v2) 2718792f786aSBram Moolenaar endfor 2719792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2720792f786aSBram Moolenaar 2721792f786aSBram Moolenaar result = [] 2722792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2723792f786aSBram Moolenaar result->add(v1) 2724792f786aSBram Moolenaar result->add(v2) 2725792f786aSBram Moolenaar result->add(v3) 2726792f786aSBram Moolenaar endfor 2727792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2728792f786aSBram Moolenaar 27294b8a0651SBram Moolenaar result = [] 27304b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 27314b8a0651SBram Moolenaar result->add(&ts) 27324b8a0651SBram Moolenaar result->add(&sw) 27334b8a0651SBram Moolenaar endfor 27344b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 27354b8a0651SBram Moolenaar 27364b8a0651SBram Moolenaar var slist: list<string> 27374b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 27384b8a0651SBram Moolenaar slist->add($LOOPVAR) 27394b8a0651SBram Moolenaar slist->add(@r) 27404b8a0651SBram Moolenaar slist->add(v:errmsg) 27414b8a0651SBram Moolenaar endfor 27424b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 27434b8a0651SBram Moolenaar 27444b8a0651SBram Moolenaar slist = [] 27454b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 27464b8a0651SBram Moolenaar slist->add(g:globalvar) 27474b8a0651SBram Moolenaar slist->add(b:bufvar) 27484b8a0651SBram Moolenaar slist->add(w:winvar) 27494b8a0651SBram Moolenaar slist->add(t:tabvar) 27504b8a0651SBram Moolenaar endfor 27514b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2752f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2753b777da9bSBram Moolenaar 2754b777da9bSBram Moolenaar var res = [] 2755b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2756b777da9bSBram Moolenaar res->add(n) 2757b777da9bSBram Moolenaar endfor 2758b777da9bSBram Moolenaar assert_equal([2, 5], res) 27594b8a0651SBram Moolenaar END 27604b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 27614b8a0651SBram Moolenaar 27624b8a0651SBram Moolenaar lines =<< trim END 2763792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2764792f786aSBram Moolenaar echo v1 v2 2765792f786aSBram Moolenaar endfor 2766792f786aSBram Moolenaar END 2767792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2768792f786aSBram Moolenaar 2769792f786aSBram Moolenaar lines =<< trim END 2770792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2771792f786aSBram Moolenaar echo v1 v2 2772792f786aSBram Moolenaar endfor 2773792f786aSBram Moolenaar END 2774792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2775792f786aSBram Moolenaar 2776792f786aSBram Moolenaar lines =<< trim END 2777792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2778792f786aSBram Moolenaar echo v1 2779792f786aSBram Moolenaar endfor 2780792f786aSBram Moolenaar END 2781792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2782792f786aSBram Moolenaarenddef 2783792f786aSBram Moolenaar 2784c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2785f2253963SBram Moolenaar var lines =<< trim END 2786c150c09eSBram Moolenaar var looped = 0 2787c150c09eSBram Moolenaar var cleanup = 0 2788c150c09eSBram Moolenaar for i in range(3) 2789c150c09eSBram Moolenaar looped += 1 2790c150c09eSBram Moolenaar try 2791c150c09eSBram Moolenaar eval [][0] 2792c150c09eSBram Moolenaar catch 2793c150c09eSBram Moolenaar continue 2794c150c09eSBram Moolenaar finally 2795c150c09eSBram Moolenaar cleanup += 1 2796c150c09eSBram Moolenaar endtry 2797c150c09eSBram Moolenaar endfor 2798c150c09eSBram Moolenaar assert_equal(3, looped) 2799c150c09eSBram Moolenaar assert_equal(3, cleanup) 2800f2253963SBram Moolenaar END 2801f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2802c150c09eSBram Moolenaarenddef 2803c150c09eSBram Moolenaar 2804d0df1aacSBram Moolenaardef Test_while_loop() 2805cfcd011fSBram Moolenaar var result = '' 2806cfcd011fSBram Moolenaar var cnt = 0 2807d0df1aacSBram Moolenaar while cnt < 555 2808d0df1aacSBram Moolenaar if cnt == 3 2809d0df1aacSBram Moolenaar break 2810d0df1aacSBram Moolenaar endif 2811d0df1aacSBram Moolenaar cnt += 1 2812d0df1aacSBram Moolenaar if cnt == 2 2813d0df1aacSBram Moolenaar continue 2814d0df1aacSBram Moolenaar endif 2815d0df1aacSBram Moolenaar result ..= cnt .. '_' 2816d0df1aacSBram Moolenaar endwhile 2817d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2818dee37dc7SBram Moolenaar 2819dee37dc7SBram Moolenaar var s = '' 28200123cc1eSBram Moolenaar while s == 'x' # {comment} 2821dee37dc7SBram Moolenaar endwhile 2822d0df1aacSBram Moolenaarenddef 2823d0df1aacSBram Moolenaar 2824e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2825675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2826675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2827675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2828675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2829675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2830675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2831675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 28326628b7ebSBram Moolenaar 28336628b7ebSBram Moolenaar var lines =<< trim END 28346628b7ebSBram Moolenaar var s = '' 28356628b7ebSBram Moolenaar while s = '' 28366628b7ebSBram Moolenaar endwhile 28376628b7ebSBram Moolenaar END 28386628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2839bd5da371SBram Moolenaarenddef 2840bd5da371SBram Moolenaar 28419645e2d9SBram Moolenaardef Test_interrupt_loop() 2842cfcd011fSBram Moolenaar var caught = false 2843cfcd011fSBram Moolenaar var x = 0 284497acfc78SBram Moolenaar try 28459645e2d9SBram Moolenaar while 1 28469645e2d9SBram Moolenaar x += 1 28479645e2d9SBram Moolenaar if x == 100 28489645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 28499645e2d9SBram Moolenaar endif 28509645e2d9SBram Moolenaar endwhile 285197acfc78SBram Moolenaar catch 285297acfc78SBram Moolenaar caught = true 285397acfc78SBram Moolenaar assert_equal(100, x) 285497acfc78SBram Moolenaar endtry 285597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 285625859dd7SBram Moolenaar # consume the CTRL-C 285725859dd7SBram Moolenaar getchar(0) 28589645e2d9SBram Moolenaarenddef 285920431c9dSBram Moolenaar 28604fdae999SBram Moolenaardef Test_automatic_line_continuation() 2861cfcd011fSBram Moolenaar var mylist = [ 28624fdae999SBram Moolenaar 'one', 28634fdae999SBram Moolenaar 'two', 28644fdae999SBram Moolenaar 'three', 2865f5be8cdbSBram Moolenaar ] # comment 28664fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 28674fdae999SBram Moolenaar 2868cfcd011fSBram Moolenaar var mydict = { 2869e0de171eSBram Moolenaar ['one']: 1, 2870e0de171eSBram Moolenaar ['two']: 2, 2871e0de171eSBram Moolenaar ['three']: 28724fdae999SBram Moolenaar 3, 2873f5be8cdbSBram Moolenaar } # comment 2874e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2875e0de171eSBram Moolenaar mydict = { 28762c330432SBram Moolenaar one: 1, # comment 28772c330432SBram Moolenaar two: # comment 28782c330432SBram Moolenaar 2, # comment 28792c330432SBram Moolenaar three: 3 # comment 28802c330432SBram Moolenaar } 2881e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2882e0de171eSBram Moolenaar mydict = { 28832c330432SBram Moolenaar one: 1, 28844fdae999SBram Moolenaar two: 28854fdae999SBram Moolenaar 2, 28862c330432SBram Moolenaar three: 3 28874fdae999SBram Moolenaar } 2888e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2889e6085c53SBram Moolenaar 2890e6085c53SBram Moolenaar assert_equal( 2891e6085c53SBram Moolenaar ['one', 'two', 'three'], 2892e6085c53SBram Moolenaar split('one two three') 2893e6085c53SBram Moolenaar ) 28944fdae999SBram Moolenaarenddef 28954fdae999SBram Moolenaar 28967a092245SBram Moolenaardef Test_vim9_comment() 28977a092245SBram Moolenaar CheckScriptSuccess([ 28987a092245SBram Moolenaar 'vim9script', 28997a092245SBram Moolenaar '# something', 290093f82cbeSBram Moolenaar '#something', 290193f82cbeSBram Moolenaar '#{something', 29027a092245SBram Moolenaar ]) 290393f82cbeSBram Moolenaar 290493f82cbeSBram Moolenaar split Xfile 290593f82cbeSBram Moolenaar CheckScriptSuccess([ 290693f82cbeSBram Moolenaar 'vim9script', 290793f82cbeSBram Moolenaar 'edit #something', 290893f82cbeSBram Moolenaar ]) 290993f82cbeSBram Moolenaar CheckScriptSuccess([ 291093f82cbeSBram Moolenaar 'vim9script', 291193f82cbeSBram Moolenaar 'edit #{something', 291293f82cbeSBram Moolenaar ]) 291393f82cbeSBram Moolenaar close 291493f82cbeSBram Moolenaar 29157a092245SBram Moolenaar CheckScriptFailure([ 29167a092245SBram Moolenaar 'vim9script', 29177a092245SBram Moolenaar ':# something', 29187a092245SBram Moolenaar ], 'E488:') 29197a092245SBram Moolenaar CheckScriptFailure([ 29207a092245SBram Moolenaar '# something', 29217a092245SBram Moolenaar ], 'E488:') 29227a092245SBram Moolenaar CheckScriptFailure([ 29237a092245SBram Moolenaar ':# something', 29247a092245SBram Moolenaar ], 'E488:') 29257a092245SBram Moolenaar 29264a8d9f2eSBram Moolenaar { # block start 29274a8d9f2eSBram Moolenaar } # block end 29284a8d9f2eSBram Moolenaar CheckDefFailure([ 29294a8d9f2eSBram Moolenaar '{# comment', 29304a8d9f2eSBram Moolenaar ], 'E488:') 29314a8d9f2eSBram Moolenaar CheckDefFailure([ 29324a8d9f2eSBram Moolenaar '{', 29334a8d9f2eSBram Moolenaar '}# comment', 29344a8d9f2eSBram Moolenaar ], 'E488:') 29354a8d9f2eSBram Moolenaar 29364a8d9f2eSBram Moolenaar echo "yes" # comment 29374a8d9f2eSBram Moolenaar CheckDefFailure([ 29384a8d9f2eSBram Moolenaar 'echo "yes"# comment', 29394a8d9f2eSBram Moolenaar ], 'E488:') 29407a092245SBram Moolenaar CheckScriptSuccess([ 29417a092245SBram Moolenaar 'vim9script', 29427a092245SBram Moolenaar 'echo "yes" # something', 29437a092245SBram Moolenaar ]) 29447a092245SBram Moolenaar CheckScriptFailure([ 29457a092245SBram Moolenaar 'vim9script', 29467a092245SBram Moolenaar 'echo "yes"# something', 29477a092245SBram Moolenaar ], 'E121:') 29487a092245SBram Moolenaar CheckScriptFailure([ 29497a092245SBram Moolenaar 'vim9script', 29507a092245SBram Moolenaar 'echo# something', 2951f8103f27SBram Moolenaar ], 'E1144:') 29527a092245SBram Moolenaar CheckScriptFailure([ 29537a092245SBram Moolenaar 'echo "yes" # something', 29547a092245SBram Moolenaar ], 'E121:') 29557a092245SBram Moolenaar 29564a8d9f2eSBram Moolenaar exe "echo" # comment 29574a8d9f2eSBram Moolenaar CheckDefFailure([ 29584a8d9f2eSBram Moolenaar 'exe "echo"# comment', 29594a8d9f2eSBram Moolenaar ], 'E488:') 29604a8d9f2eSBram Moolenaar CheckScriptSuccess([ 29614a8d9f2eSBram Moolenaar 'vim9script', 29624a8d9f2eSBram Moolenaar 'exe "echo" # something', 29634a8d9f2eSBram Moolenaar ]) 29644a8d9f2eSBram Moolenaar CheckScriptFailure([ 29654a8d9f2eSBram Moolenaar 'vim9script', 29664a8d9f2eSBram Moolenaar 'exe "echo"# something', 29674a8d9f2eSBram Moolenaar ], 'E121:') 29684a8d9f2eSBram Moolenaar CheckScriptFailure([ 29694a8d9f2eSBram Moolenaar 'vim9script', 29704a8d9f2eSBram Moolenaar 'exe# something', 2971f8103f27SBram Moolenaar ], 'E1144:') 29724a8d9f2eSBram Moolenaar CheckScriptFailure([ 29734a8d9f2eSBram Moolenaar 'exe "echo" # something', 29744a8d9f2eSBram Moolenaar ], 'E121:') 29754a8d9f2eSBram Moolenaar 29767a092245SBram Moolenaar CheckDefFailure([ 29777a092245SBram Moolenaar 'try# comment', 29787a092245SBram Moolenaar ' echo "yes"', 29797a092245SBram Moolenaar 'catch', 29807a092245SBram Moolenaar 'endtry', 2981f8103f27SBram Moolenaar ], 'E1144:') 29822c5ed4e3SBram Moolenaar CheckScriptFailure([ 29832c5ed4e3SBram Moolenaar 'vim9script', 29842c5ed4e3SBram Moolenaar 'try# comment', 29852c5ed4e3SBram Moolenaar 'echo "yes"', 2986f8103f27SBram Moolenaar ], 'E1144:') 29877a092245SBram Moolenaar CheckDefFailure([ 29887a092245SBram Moolenaar 'try', 2989a72cfb80SBram Moolenaar ' throw#comment', 2990a72cfb80SBram Moolenaar 'catch', 2991a72cfb80SBram Moolenaar 'endtry', 2992f8103f27SBram Moolenaar ], 'E1144:') 2993a72cfb80SBram Moolenaar CheckDefFailure([ 2994a72cfb80SBram Moolenaar 'try', 2995a72cfb80SBram Moolenaar ' throw "yes"#comment', 2996a72cfb80SBram Moolenaar 'catch', 2997a72cfb80SBram Moolenaar 'endtry', 2998a72cfb80SBram Moolenaar ], 'E488:') 2999a72cfb80SBram Moolenaar CheckDefFailure([ 3000a72cfb80SBram Moolenaar 'try', 30017a092245SBram Moolenaar ' echo "yes"', 30027a092245SBram Moolenaar 'catch# comment', 30037a092245SBram Moolenaar 'endtry', 3004f8103f27SBram Moolenaar ], 'E1144:') 30052c5ed4e3SBram Moolenaar CheckScriptFailure([ 30062c5ed4e3SBram Moolenaar 'vim9script', 30072c5ed4e3SBram Moolenaar 'try', 30082c5ed4e3SBram Moolenaar ' echo "yes"', 30092c5ed4e3SBram Moolenaar 'catch# comment', 30102c5ed4e3SBram Moolenaar 'endtry', 3011f8103f27SBram Moolenaar ], 'E1144:') 30122c5ed4e3SBram Moolenaar CheckDefFailure([ 30132c5ed4e3SBram Moolenaar 'try', 30142c5ed4e3SBram Moolenaar ' echo "yes"', 30152c5ed4e3SBram Moolenaar 'catch /pat/# comment', 30162c5ed4e3SBram Moolenaar 'endtry', 30172c5ed4e3SBram Moolenaar ], 'E488:') 30187a092245SBram Moolenaar CheckDefFailure([ 30197a092245SBram Moolenaar 'try', 30207a092245SBram Moolenaar 'echo "yes"', 30217a092245SBram Moolenaar 'catch', 30227a092245SBram Moolenaar 'endtry# comment', 3023f8103f27SBram Moolenaar ], 'E1144:') 30242c5ed4e3SBram Moolenaar CheckScriptFailure([ 30252c5ed4e3SBram Moolenaar 'vim9script', 30262c5ed4e3SBram Moolenaar 'try', 30272c5ed4e3SBram Moolenaar ' echo "yes"', 30282c5ed4e3SBram Moolenaar 'catch', 30292c5ed4e3SBram Moolenaar 'endtry# comment', 3030f8103f27SBram Moolenaar ], 'E1144:') 30312c5ed4e3SBram Moolenaar 30322c5ed4e3SBram Moolenaar CheckScriptSuccess([ 30332c5ed4e3SBram Moolenaar 'vim9script', 30342c5ed4e3SBram Moolenaar 'hi # comment', 30352c5ed4e3SBram Moolenaar ]) 30362c5ed4e3SBram Moolenaar CheckScriptFailure([ 30372c5ed4e3SBram Moolenaar 'vim9script', 30382c5ed4e3SBram Moolenaar 'hi# comment', 3039f8103f27SBram Moolenaar ], 'E1144:') 30401966c248SBram Moolenaar CheckScriptSuccess([ 30411966c248SBram Moolenaar 'vim9script', 30421966c248SBram Moolenaar 'hi Search # comment', 30431966c248SBram Moolenaar ]) 30441966c248SBram Moolenaar CheckScriptFailure([ 30451966c248SBram Moolenaar 'vim9script', 30461966c248SBram Moolenaar 'hi Search# comment', 30471966c248SBram Moolenaar ], 'E416:') 30481966c248SBram Moolenaar CheckScriptSuccess([ 30491966c248SBram Moolenaar 'vim9script', 30501966c248SBram Moolenaar 'hi link This Search # comment', 30511966c248SBram Moolenaar ]) 30521966c248SBram Moolenaar CheckScriptFailure([ 30531966c248SBram Moolenaar 'vim9script', 30541966c248SBram Moolenaar 'hi link This That# comment', 30551966c248SBram Moolenaar ], 'E413:') 30561966c248SBram Moolenaar CheckScriptSuccess([ 30571966c248SBram Moolenaar 'vim9script', 30581966c248SBram Moolenaar 'hi clear This # comment', 30591966c248SBram Moolenaar 'hi clear # comment', 30601966c248SBram Moolenaar ]) 3061f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3062f5be8cdbSBram Moolenaar # hi clear This# comment', 30631966c248SBram Moolenaar CheckScriptFailure([ 30641966c248SBram Moolenaar 'vim9script', 30651966c248SBram Moolenaar 'hi clear# comment', 30661966c248SBram Moolenaar ], 'E416:') 30671966c248SBram Moolenaar 30681966c248SBram Moolenaar CheckScriptSuccess([ 30691966c248SBram Moolenaar 'vim9script', 30701966c248SBram Moolenaar 'hi Group term=bold', 30711966c248SBram Moolenaar 'match Group /todo/ # comment', 30721966c248SBram Moolenaar ]) 30731966c248SBram Moolenaar CheckScriptFailure([ 30741966c248SBram Moolenaar 'vim9script', 30751966c248SBram Moolenaar 'hi Group term=bold', 30761966c248SBram Moolenaar 'match Group /todo/# comment', 30771966c248SBram Moolenaar ], 'E488:') 30781966c248SBram Moolenaar CheckScriptSuccess([ 30791966c248SBram Moolenaar 'vim9script', 30801966c248SBram Moolenaar 'match # comment', 30811966c248SBram Moolenaar ]) 30821966c248SBram Moolenaar CheckScriptFailure([ 30831966c248SBram Moolenaar 'vim9script', 30841966c248SBram Moolenaar 'match# comment', 3085f8103f27SBram Moolenaar ], 'E1144:') 30861966c248SBram Moolenaar CheckScriptSuccess([ 30871966c248SBram Moolenaar 'vim9script', 30881966c248SBram Moolenaar 'match none # comment', 30891966c248SBram Moolenaar ]) 30901966c248SBram Moolenaar CheckScriptFailure([ 30911966c248SBram Moolenaar 'vim9script', 30921966c248SBram Moolenaar 'match none# comment', 30931966c248SBram Moolenaar ], 'E475:') 30941966c248SBram Moolenaar 30951966c248SBram Moolenaar CheckScriptSuccess([ 30961966c248SBram Moolenaar 'vim9script', 30971966c248SBram Moolenaar 'menutrans clear # comment', 30981966c248SBram Moolenaar ]) 30991966c248SBram Moolenaar CheckScriptFailure([ 31001966c248SBram Moolenaar 'vim9script', 31011966c248SBram Moolenaar 'menutrans clear# comment text', 31021966c248SBram Moolenaar ], 'E474:') 31031966c248SBram Moolenaar 31041966c248SBram Moolenaar CheckScriptSuccess([ 31051966c248SBram Moolenaar 'vim9script', 31061966c248SBram Moolenaar 'syntax clear # comment', 31071966c248SBram Moolenaar ]) 31081966c248SBram Moolenaar CheckScriptFailure([ 31091966c248SBram Moolenaar 'vim9script', 31101966c248SBram Moolenaar 'syntax clear# comment text', 31111966c248SBram Moolenaar ], 'E28:') 31121966c248SBram Moolenaar CheckScriptSuccess([ 31131966c248SBram Moolenaar 'vim9script', 31141966c248SBram Moolenaar 'syntax keyword Word some', 31151966c248SBram Moolenaar 'syntax clear Word # comment', 31161966c248SBram Moolenaar ]) 31171966c248SBram Moolenaar CheckScriptFailure([ 31181966c248SBram Moolenaar 'vim9script', 31191966c248SBram Moolenaar 'syntax keyword Word some', 31201966c248SBram Moolenaar 'syntax clear Word# comment text', 31211966c248SBram Moolenaar ], 'E28:') 31221966c248SBram Moolenaar 31231966c248SBram Moolenaar CheckScriptSuccess([ 31241966c248SBram Moolenaar 'vim9script', 31251966c248SBram Moolenaar 'syntax list # comment', 31261966c248SBram Moolenaar ]) 31271966c248SBram Moolenaar CheckScriptFailure([ 31281966c248SBram Moolenaar 'vim9script', 31291966c248SBram Moolenaar 'syntax list# comment text', 31301966c248SBram Moolenaar ], 'E28:') 31311966c248SBram Moolenaar 31321966c248SBram Moolenaar CheckScriptSuccess([ 31331966c248SBram Moolenaar 'vim9script', 31341966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 31351966c248SBram Moolenaar ]) 31361966c248SBram Moolenaar CheckScriptFailure([ 31371966c248SBram Moolenaar 'vim9script', 31381966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 31391966c248SBram Moolenaar ], 'E475:') 31401966c248SBram Moolenaar 31411966c248SBram Moolenaar CheckScriptSuccess([ 31421966c248SBram Moolenaar 'vim9script', 31431966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 31441966c248SBram Moolenaar ]) 31451966c248SBram Moolenaar CheckScriptFailure([ 31461966c248SBram Moolenaar 'vim9script', 31471966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 31481966c248SBram Moolenaar ], 'E789:') 31491966c248SBram Moolenaar 31501966c248SBram Moolenaar CheckScriptSuccess([ 31511966c248SBram Moolenaar 'vim9script', 31521966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 31531966c248SBram Moolenaar ]) 31541966c248SBram Moolenaar CheckScriptFailure([ 31551966c248SBram Moolenaar 'vim9script', 31561966c248SBram Moolenaar 'syntax match Word /pat/# comment', 31571966c248SBram Moolenaar ], 'E402:') 31581966c248SBram Moolenaar 31591966c248SBram Moolenaar CheckScriptSuccess([ 31601966c248SBram Moolenaar 'vim9script', 31611966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 31621966c248SBram Moolenaar ]) 31631966c248SBram Moolenaar CheckScriptFailure([ 31641966c248SBram Moolenaar 'vim9script', 31651966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 31661966c248SBram Moolenaar ], 'E475:') 31671966c248SBram Moolenaar CheckScriptFailure([ 31681966c248SBram Moolenaar 'vim9script', 31691966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31701966c248SBram Moolenaar ], 'E406:') 31711966c248SBram Moolenaar CheckScriptFailure([ 31721966c248SBram Moolenaar 'vim9script', 31731966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 31741966c248SBram Moolenaar ], 'E475:') 31751966c248SBram Moolenaar 31761966c248SBram Moolenaar CheckScriptSuccess([ 31771966c248SBram Moolenaar 'vim9script', 31781966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 31791966c248SBram Moolenaar ]) 31801966c248SBram Moolenaar CheckScriptFailure([ 31811966c248SBram Moolenaar 'vim9script', 31821966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3183d032f34aSBram Moolenaar ], 'E402:') 31841966c248SBram Moolenaar 31851966c248SBram Moolenaar CheckScriptSuccess([ 31861966c248SBram Moolenaar 'vim9script', 31871966c248SBram Moolenaar 'syntax sync # comment', 31881966c248SBram Moolenaar ]) 31891966c248SBram Moolenaar CheckScriptFailure([ 31901966c248SBram Moolenaar 'vim9script', 31911966c248SBram Moolenaar 'syntax sync# comment', 31921966c248SBram Moolenaar ], 'E404:') 31931966c248SBram Moolenaar CheckScriptSuccess([ 31941966c248SBram Moolenaar 'vim9script', 31951966c248SBram Moolenaar 'syntax sync ccomment # comment', 31961966c248SBram Moolenaar ]) 31971966c248SBram Moolenaar CheckScriptFailure([ 31981966c248SBram Moolenaar 'vim9script', 31991966c248SBram Moolenaar 'syntax sync ccomment# comment', 32001966c248SBram Moolenaar ], 'E404:') 32011966c248SBram Moolenaar 32021966c248SBram Moolenaar CheckScriptSuccess([ 32031966c248SBram Moolenaar 'vim9script', 32041966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 32051966c248SBram Moolenaar ]) 32061966c248SBram Moolenaar CheckScriptFailure([ 32071966c248SBram Moolenaar 'vim9script', 32081966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 32091966c248SBram Moolenaar ], 'E475:') 3210a72cfb80SBram Moolenaar 3211a72cfb80SBram Moolenaar CheckScriptSuccess([ 3212a72cfb80SBram Moolenaar 'vim9script', 3213a72cfb80SBram Moolenaar 'command Echo echo # comment', 3214a72cfb80SBram Moolenaar 'command Echo # comment', 32152d870f8dSBram Moolenaar 'delcommand Echo', 3216a72cfb80SBram Moolenaar ]) 3217a72cfb80SBram Moolenaar CheckScriptFailure([ 3218a72cfb80SBram Moolenaar 'vim9script', 3219a72cfb80SBram Moolenaar 'command Echo echo# comment', 3220a72cfb80SBram Moolenaar 'Echo', 3221f8103f27SBram Moolenaar ], 'E1144:') 32222d870f8dSBram Moolenaar delcommand Echo 322370249ee8SBram Moolenaar 322470249ee8SBram Moolenaar var curdir = getcwd() 322570249ee8SBram Moolenaar CheckScriptSuccess([ 322670249ee8SBram Moolenaar 'command Echo cd " comment', 322770249ee8SBram Moolenaar 'Echo', 322870249ee8SBram Moolenaar 'delcommand Echo', 322970249ee8SBram Moolenaar ]) 323070249ee8SBram Moolenaar CheckScriptSuccess([ 3231090728adSBram Moolenaar 'vim9script', 323270249ee8SBram Moolenaar 'command Echo cd # comment', 323370249ee8SBram Moolenaar 'Echo', 323470249ee8SBram Moolenaar 'delcommand Echo', 323570249ee8SBram Moolenaar ]) 323670249ee8SBram Moolenaar CheckScriptFailure([ 323770249ee8SBram Moolenaar 'vim9script', 323870249ee8SBram Moolenaar 'command Echo cd " comment', 323970249ee8SBram Moolenaar 'Echo', 324070249ee8SBram Moolenaar ], 'E344:') 324170249ee8SBram Moolenaar delcommand Echo 324270249ee8SBram Moolenaar chdir(curdir) 324370249ee8SBram Moolenaar 3244a72cfb80SBram Moolenaar CheckScriptFailure([ 3245a72cfb80SBram Moolenaar 'vim9script', 3246a72cfb80SBram Moolenaar 'command Echo# comment', 3247a72cfb80SBram Moolenaar ], 'E182:') 3248a72cfb80SBram Moolenaar CheckScriptFailure([ 3249a72cfb80SBram Moolenaar 'vim9script', 3250a72cfb80SBram Moolenaar 'command Echo echo', 3251a72cfb80SBram Moolenaar 'command Echo# comment', 3252a72cfb80SBram Moolenaar ], 'E182:') 32532d870f8dSBram Moolenaar delcommand Echo 3254a72cfb80SBram Moolenaar 3255a72cfb80SBram Moolenaar CheckScriptSuccess([ 3256a72cfb80SBram Moolenaar 'vim9script', 3257a72cfb80SBram Moolenaar 'function # comment', 3258a72cfb80SBram Moolenaar ]) 3259a72cfb80SBram Moolenaar CheckScriptFailure([ 3260a72cfb80SBram Moolenaar 'vim9script', 32619898107fSBram Moolenaar 'function " comment', 32629898107fSBram Moolenaar ], 'E129:') 32639898107fSBram Moolenaar CheckScriptFailure([ 32649898107fSBram Moolenaar 'vim9script', 3265a72cfb80SBram Moolenaar 'function# comment', 3266f8103f27SBram Moolenaar ], 'E1144:') 3267a72cfb80SBram Moolenaar CheckScriptSuccess([ 3268a72cfb80SBram Moolenaar 'vim9script', 3269a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3270a72cfb80SBram Moolenaar ]) 3271a72cfb80SBram Moolenaar CheckScriptFailure([ 3272a72cfb80SBram Moolenaar 'vim9script', 3273a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3274a72cfb80SBram Moolenaar ], 'E488:') 3275a72cfb80SBram Moolenaar 3276a72cfb80SBram Moolenaar CheckScriptSuccess([ 3277a72cfb80SBram Moolenaar 'vim9script', 32784c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3279a72cfb80SBram Moolenaar 'endfunc', 32804c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3281a72cfb80SBram Moolenaar ]) 3282a72cfb80SBram Moolenaar CheckScriptFailure([ 3283a72cfb80SBram Moolenaar 'vim9script', 32844c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3285a72cfb80SBram Moolenaar 'endfunc', 32864c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3287a72cfb80SBram Moolenaar ], 'E488:') 3288a72cfb80SBram Moolenaar 3289a72cfb80SBram Moolenaar CheckScriptSuccess([ 3290a72cfb80SBram Moolenaar 'vim9script', 3291a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3292a72cfb80SBram Moolenaar ]) 3293a72cfb80SBram Moolenaar CheckScriptFailure([ 3294a72cfb80SBram Moolenaar 'vim9script', 3295a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3296a72cfb80SBram Moolenaar ], 'E488:') 3297e7e4838fSBram Moolenaar 3298e7e4838fSBram Moolenaar CheckScriptFailure([ 3299e7e4838fSBram Moolenaar 'def Test() " comment', 3300e7e4838fSBram Moolenaar 'enddef', 3301e7e4838fSBram Moolenaar ], 'E488:') 3302e7e4838fSBram Moolenaar CheckScriptFailure([ 3303e7e4838fSBram Moolenaar 'vim9script', 3304e7e4838fSBram Moolenaar 'def Test() " comment', 3305e7e4838fSBram Moolenaar 'enddef', 3306e7e4838fSBram Moolenaar ], 'E488:') 3307e7e4838fSBram Moolenaar 3308e7e4838fSBram Moolenaar CheckScriptSuccess([ 3309e7e4838fSBram Moolenaar 'func Test() " comment', 3310e7e4838fSBram Moolenaar 'endfunc', 33112d870f8dSBram Moolenaar 'delfunc Test', 3312e7e4838fSBram Moolenaar ]) 33139898107fSBram Moolenaar CheckScriptSuccess([ 3314e7e4838fSBram Moolenaar 'vim9script', 3315e7e4838fSBram Moolenaar 'func Test() " comment', 3316e7e4838fSBram Moolenaar 'endfunc', 33179898107fSBram Moolenaar ]) 3318e7e4838fSBram Moolenaar 3319e7e4838fSBram Moolenaar CheckScriptSuccess([ 3320e7e4838fSBram Moolenaar 'def Test() # comment', 3321e7e4838fSBram Moolenaar 'enddef', 3322e7e4838fSBram Moolenaar ]) 3323e7e4838fSBram Moolenaar CheckScriptFailure([ 3324e7e4838fSBram Moolenaar 'func Test() # comment', 3325e7e4838fSBram Moolenaar 'endfunc', 3326e7e4838fSBram Moolenaar ], 'E488:') 33270f37e356SBram Moolenaar 33280f37e356SBram Moolenaar var lines =<< trim END 33290f37e356SBram Moolenaar vim9script 33300f37e356SBram Moolenaar syn region Text 33310f37e356SBram Moolenaar \ start='foo' 33320f37e356SBram Moolenaar #\ comment 33330f37e356SBram Moolenaar \ end='bar' 33345072b47aSBram Moolenaar syn region Text start='foo' 33355072b47aSBram Moolenaar #\ comment 33365072b47aSBram Moolenaar \ end='bar' 33370f37e356SBram Moolenaar END 33380f37e356SBram Moolenaar CheckScriptSuccess(lines) 33390f37e356SBram Moolenaar 33400f37e356SBram Moolenaar lines =<< trim END 33410f37e356SBram Moolenaar vim9script 33420f37e356SBram Moolenaar syn region Text 33430f37e356SBram Moolenaar \ start='foo' 33440f37e356SBram Moolenaar "\ comment 33450f37e356SBram Moolenaar \ end='bar' 33460f37e356SBram Moolenaar END 33470f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 33482c5ed4e3SBram Moolenaarenddef 33492c5ed4e3SBram Moolenaar 33502c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 33512c5ed4e3SBram Moolenaar CheckCanRunGui 33522c5ed4e3SBram Moolenaar 33532c5ed4e3SBram Moolenaar CheckScriptFailure([ 33542c5ed4e3SBram Moolenaar 'vim9script', 33552c5ed4e3SBram Moolenaar 'gui#comment' 3356f8103f27SBram Moolenaar ], 'E1144:') 33572c5ed4e3SBram Moolenaar CheckScriptFailure([ 33582c5ed4e3SBram Moolenaar 'vim9script', 33592c5ed4e3SBram Moolenaar 'gui -f#comment' 33602c5ed4e3SBram Moolenaar ], 'E499:') 33617a092245SBram Moolenaarenddef 33627a092245SBram Moolenaar 3363a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 33646797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 33656797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3366a26b9700SBram Moolenaar 3367a26b9700SBram Moolenaar edit test.vim 3368a26b9700SBram Moolenaar doautocmd TabEnter #comment 3369a26b9700SBram Moolenaar assert_equal(1, g:entered) 3370a26b9700SBram Moolenaar 3371a26b9700SBram Moolenaar doautocmd TabEnter f.x 3372a26b9700SBram Moolenaar assert_equal(2, g:entered) 3373a26b9700SBram Moolenaar 3374a26b9700SBram Moolenaar g:entered = 0 3375a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3376a26b9700SBram Moolenaar assert_equal(2, g:entered) 3377a26b9700SBram Moolenaar 3378a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3379a26b9700SBram Moolenaar 3380a26b9700SBram Moolenaar au! TabEnter 3381a26b9700SBram Moolenaar unlet g:entered 3382d72c1bf0SBram Moolenaar 3383d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3384d72c1bf0SBram Moolenaar 'vim9script', 33856797966dSBram Moolenaar 'g:var = 123', 3386e55b1c09SBram Moolenaar 'b:var = 456', 3387e55b1c09SBram Moolenaar 'w:var = 777', 3388e55b1c09SBram Moolenaar 't:var = 888', 3389d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3390d72c1bf0SBram Moolenaar ]) 3391d72c1bf0SBram Moolenaar 3392d72c1bf0SBram Moolenaar CheckScriptFailure([ 3393d72c1bf0SBram Moolenaar 'vim9script', 3394cfcd011fSBram Moolenaar 'let var = 123', 3395cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3396cfcd011fSBram Moolenaar 3397cfcd011fSBram Moolenaar CheckScriptFailure([ 3398cfcd011fSBram Moolenaar 'vim9script', 3399cfcd011fSBram Moolenaar 'var g:var = 123', 3400e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3401e55b1c09SBram Moolenaar 3402e55b1c09SBram Moolenaar CheckScriptFailure([ 3403e55b1c09SBram Moolenaar 'vim9script', 3404cfcd011fSBram Moolenaar 'var b:var = 123', 3405e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3406e55b1c09SBram Moolenaar 3407e55b1c09SBram Moolenaar CheckScriptFailure([ 3408e55b1c09SBram Moolenaar 'vim9script', 3409cfcd011fSBram Moolenaar 'var w:var = 123', 3410e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3411e55b1c09SBram Moolenaar 3412e55b1c09SBram Moolenaar CheckScriptFailure([ 3413e55b1c09SBram Moolenaar 'vim9script', 3414cfcd011fSBram Moolenaar 'var t:var = 123', 3415e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3416e55b1c09SBram Moolenaar 3417e55b1c09SBram Moolenaar CheckScriptFailure([ 3418e55b1c09SBram Moolenaar 'vim9script', 3419cfcd011fSBram Moolenaar 'var v:version = 123', 3420e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3421e55b1c09SBram Moolenaar 3422e55b1c09SBram Moolenaar CheckScriptFailure([ 3423e55b1c09SBram Moolenaar 'vim9script', 3424cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3425e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 34266797966dSBram Moolenaar 34276797966dSBram Moolenaar CheckScriptFailure([ 34286797966dSBram Moolenaar 'vim9script', 34296797966dSBram Moolenaar 'g:var = 123', 343032e35117SBram Moolenaar 'unlet g:var# comment1', 3431d72c1bf0SBram Moolenaar ], 'E108:') 3432d72c1bf0SBram Moolenaar 3433d72c1bf0SBram Moolenaar CheckScriptFailure([ 3434d72c1bf0SBram Moolenaar 'let g:var = 123', 3435d72c1bf0SBram Moolenaar 'unlet g:var # something', 3436d72c1bf0SBram Moolenaar ], 'E488:') 3437faac4104SBram Moolenaar 3438faac4104SBram Moolenaar CheckScriptSuccess([ 3439faac4104SBram Moolenaar 'vim9script', 344032e35117SBram Moolenaar 'if 1 # comment2', 3441faac4104SBram Moolenaar ' echo "yes"', 3442faac4104SBram Moolenaar 'elseif 2 #comment', 3443faac4104SBram Moolenaar ' echo "no"', 3444faac4104SBram Moolenaar 'endif', 3445faac4104SBram Moolenaar ]) 3446faac4104SBram Moolenaar 3447faac4104SBram Moolenaar CheckScriptFailure([ 3448faac4104SBram Moolenaar 'vim9script', 344932e35117SBram Moolenaar 'if 1# comment3', 3450faac4104SBram Moolenaar ' echo "yes"', 3451faac4104SBram Moolenaar 'endif', 3452fae55a9cSBram Moolenaar ], 'E488:') 3453faac4104SBram Moolenaar 3454faac4104SBram Moolenaar CheckScriptFailure([ 3455faac4104SBram Moolenaar 'vim9script', 345632e35117SBram Moolenaar 'if 0 # comment4', 3457faac4104SBram Moolenaar ' echo "yes"', 3458faac4104SBram Moolenaar 'elseif 2#comment', 3459faac4104SBram Moolenaar ' echo "no"', 3460faac4104SBram Moolenaar 'endif', 3461fae55a9cSBram Moolenaar ], 'E488:') 3462faac4104SBram Moolenaar 3463faac4104SBram Moolenaar CheckScriptSuccess([ 3464faac4104SBram Moolenaar 'vim9script', 3465cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3466faac4104SBram Moolenaar ]) 3467faac4104SBram Moolenaar 3468faac4104SBram Moolenaar CheckScriptFailure([ 3469faac4104SBram Moolenaar 'vim9script', 3470cfcd011fSBram Moolenaar 'var v = 1# comment6', 3471fae55a9cSBram Moolenaar ], 'E488:') 3472faac4104SBram Moolenaar 3473faac4104SBram Moolenaar CheckScriptSuccess([ 3474faac4104SBram Moolenaar 'vim9script', 3475faac4104SBram Moolenaar 'new' 3476d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3477df069eecSBram Moolenaar ':$', 3478faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3479faac4104SBram Moolenaar 'bwipe!', 3480faac4104SBram Moolenaar ]) 3481faac4104SBram Moolenaar 3482f5be8cdbSBram Moolenaar CheckScriptFailure([ 3483f5be8cdbSBram Moolenaar 'vim9script', 3484f5be8cdbSBram Moolenaar 'new' 3485d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3486f5be8cdbSBram Moolenaar ':$', 3487f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3488f5be8cdbSBram Moolenaar 'bwipe!', 3489f5be8cdbSBram Moolenaar ], 'E488:') 3490f5be8cdbSBram Moolenaar 3491f5be8cdbSBram Moolenaar CheckScriptFailure([ 3492f5be8cdbSBram Moolenaar 'vim9script', 3493f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3494f5be8cdbSBram Moolenaar ], 'E477:') 3495a26b9700SBram Moolenaarenddef 3496a26b9700SBram Moolenaar 34977e5bd91dSBram Moolenaardef Test_finish() 3498cfcd011fSBram Moolenaar var lines =<< trim END 34997e5bd91dSBram Moolenaar vim9script 35006797966dSBram Moolenaar g:res = 'one' 35017e5bd91dSBram Moolenaar if v:false | finish | endif 35026797966dSBram Moolenaar g:res = 'two' 35037e5bd91dSBram Moolenaar finish 35046797966dSBram Moolenaar g:res = 'three' 35057e5bd91dSBram Moolenaar END 35067e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 35077e5bd91dSBram Moolenaar source Xfinished 35087e5bd91dSBram Moolenaar assert_equal('two', g:res) 35097e5bd91dSBram Moolenaar 35107e5bd91dSBram Moolenaar unlet g:res 35117e5bd91dSBram Moolenaar delete('Xfinished') 35127e5bd91dSBram Moolenaarenddef 35137e5bd91dSBram Moolenaar 3514a5d0077eSBram Moolenaardef Test_forward_declaration() 3515cfcd011fSBram Moolenaar var lines =<< trim END 3516a5d0077eSBram Moolenaar vim9script 3517a5d0077eSBram Moolenaar def GetValue(): string 3518a5d0077eSBram Moolenaar return theVal 3519a5d0077eSBram Moolenaar enddef 3520cfcd011fSBram Moolenaar var theVal = 'something' 3521822ba247SBram Moolenaar g:initVal = GetValue() 3522a5d0077eSBram Moolenaar theVal = 'else' 3523a5d0077eSBram Moolenaar g:laterVal = GetValue() 3524a5d0077eSBram Moolenaar END 3525a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3526a5d0077eSBram Moolenaar source Xforward 3527a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3528a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3529a5d0077eSBram Moolenaar 3530a5d0077eSBram Moolenaar unlet g:initVal 3531a5d0077eSBram Moolenaar unlet g:laterVal 3532a5d0077eSBram Moolenaar delete('Xforward') 3533a5d0077eSBram Moolenaarenddef 3534a5d0077eSBram Moolenaar 35359721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3536a6294955SBram Moolenaar var vim9_lines =<< trim END 3537a6294955SBram Moolenaar vim9script 3538a6294955SBram Moolenaar var local = 'local' 3539a6294955SBram Moolenaar g:global = 'global' 3540a6294955SBram Moolenaar export var exported = 'exported' 3541a6294955SBram Moolenaar export def GetText(): string 3542a6294955SBram Moolenaar return 'text' 3543a6294955SBram Moolenaar enddef 3544a6294955SBram Moolenaar END 3545a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3546a6294955SBram Moolenaar 3547cfcd011fSBram Moolenaar var legacy_lines =<< trim END 35489721fb4eSBram Moolenaar source Xvim9_script.vim 35499721fb4eSBram Moolenaar 35509721fb4eSBram Moolenaar call assert_false(exists('local')) 35519721fb4eSBram Moolenaar call assert_false(exists('exported')) 35529721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 35539721fb4eSBram Moolenaar call assert_equal('global', global) 35549721fb4eSBram Moolenaar call assert_equal('global', g:global) 35559721fb4eSBram Moolenaar 35569721fb4eSBram Moolenaar " imported variable becomes script-local 35579721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 35589721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 35599721fb4eSBram Moolenaar call assert_false(exists('exported')) 35609721fb4eSBram Moolenaar 35619721fb4eSBram Moolenaar " imported function becomes script-local 35629721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 35639721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 35649721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 35659721fb4eSBram Moolenaar END 35669721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 35679721fb4eSBram Moolenaar 35689721fb4eSBram Moolenaar source Xlegacy_script.vim 35699721fb4eSBram Moolenaar assert_equal('global', g:global) 3570f5be8cdbSBram Moolenaar unlet g:global 35719721fb4eSBram Moolenaar 35729721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 35739721fb4eSBram Moolenaar delete('Xvim9_script.vim') 35749721fb4eSBram Moolenaarenddef 3575a5d0077eSBram Moolenaar 3576e535db86SBram Moolenaardef Test_declare_script_in_func() 3577e535db86SBram Moolenaar var lines =<< trim END 3578e535db86SBram Moolenaar vim9script 3579e535db86SBram Moolenaar func Declare() 3580e535db86SBram Moolenaar let s:local = 123 3581e535db86SBram Moolenaar endfunc 3582e535db86SBram Moolenaar Declare() 3583e535db86SBram Moolenaar assert_equal(123, local) 3584e535db86SBram Moolenaar 3585e535db86SBram Moolenaar var error: string 3586e535db86SBram Moolenaar try 3587e535db86SBram Moolenaar local = 'asdf' 3588e535db86SBram Moolenaar catch 3589e535db86SBram Moolenaar error = v:exception 3590e535db86SBram Moolenaar endtry 3591e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3592e535db86SBram Moolenaar 3593e535db86SBram Moolenaar lockvar local 3594e535db86SBram Moolenaar try 3595e535db86SBram Moolenaar local = 999 3596e535db86SBram Moolenaar catch 3597e535db86SBram Moolenaar error = v:exception 3598e535db86SBram Moolenaar endtry 3599e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3600e535db86SBram Moolenaar END 3601e535db86SBram Moolenaar CheckScriptSuccess(lines) 3602e535db86SBram Moolenaarenddef 3603e535db86SBram Moolenaar 3604e535db86SBram Moolenaar 36057d699701SBram Moolenaarfunc Test_vim9script_not_global() 36067d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 36077d699701SBram Moolenaar let vim9lines =<< trim END 36087d699701SBram Moolenaar vim9script 3609cfcd011fSBram Moolenaar var name = 'local' 36107d699701SBram Moolenaar func TheFunc() 36117d699701SBram Moolenaar echo 'local' 36127d699701SBram Moolenaar endfunc 36137d699701SBram Moolenaar def DefFunc() 36147d699701SBram Moolenaar echo 'local' 36157d699701SBram Moolenaar enddef 36167d699701SBram Moolenaar END 36177d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 36187d699701SBram Moolenaar source Xvim9script.vim 36197d699701SBram Moolenaar try 36207d699701SBram Moolenaar echo g:var 36217d699701SBram Moolenaar assert_report('did not fail') 36227d699701SBram Moolenaar catch /E121:/ 36237d699701SBram Moolenaar " caught 36247d699701SBram Moolenaar endtry 36257d699701SBram Moolenaar try 36267d699701SBram Moolenaar call TheFunc() 36277d699701SBram Moolenaar assert_report('did not fail') 36287d699701SBram Moolenaar catch /E117:/ 36297d699701SBram Moolenaar " caught 36307d699701SBram Moolenaar endtry 36317d699701SBram Moolenaar try 36327d699701SBram Moolenaar call DefFunc() 36337d699701SBram Moolenaar assert_report('did not fail') 36347d699701SBram Moolenaar catch /E117:/ 36357d699701SBram Moolenaar " caught 36367d699701SBram Moolenaar endtry 36377d699701SBram Moolenaar 363825859dd7SBram Moolenaar call delete('Xvim9script.vim') 36397d699701SBram Moolenaarendfunc 36407d699701SBram Moolenaar 3641eeb27bfeSBram Moolenaardef Test_vim9_copen() 3642eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3643eeb27bfeSBram Moolenaar copen 3644eeb27bfeSBram Moolenaar quit 3645eeb27bfeSBram Moolenaarenddef 3646eeb27bfeSBram Moolenaar 364703290b84SBram Moolenaar" test using an auto-loaded function and variable 36482d6b20d6SBram Moolenaardef Test_vim9_autoload() 3649cfcd011fSBram Moolenaar var lines =<< trim END 36502d6b20d6SBram Moolenaar vim9script 365103290b84SBram Moolenaar def some#gettest(): string 365203290b84SBram Moolenaar return 'test' 365303290b84SBram Moolenaar enddef 365403290b84SBram Moolenaar g:some#name = 'name' 3655227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3656e3ffcd99SBram Moolenaar 3657e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3658e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3659e3ffcd99SBram Moolenaar enddef 366003290b84SBram Moolenaar END 366103290b84SBram Moolenaar 366203290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 366303290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 366403290b84SBram Moolenaar var save_rtp = &rtp 366503290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 366603290b84SBram Moolenaar 366703290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 366803290b84SBram Moolenaar assert_equal('name', g:some#name) 3669227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 367003290b84SBram Moolenaar g:some#other = 'other' 367103290b84SBram Moolenaar assert_equal('other', g:some#other) 367203290b84SBram Moolenaar 3673e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3674e3ffcd99SBram Moolenaar 367517f700acSBram Moolenaar # upper case script name works 367617f700acSBram Moolenaar lines =<< trim END 367717f700acSBram Moolenaar vim9script 367817f700acSBram Moolenaar def Other#getOther(): string 367917f700acSBram Moolenaar return 'other' 368017f700acSBram Moolenaar enddef 368117f700acSBram Moolenaar END 368217f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 368317f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 368417f700acSBram Moolenaar 368503290b84SBram Moolenaar delete('Xdir', 'rf') 368603290b84SBram Moolenaar &rtp = save_rtp 368703290b84SBram Moolenaarenddef 368803290b84SBram Moolenaar 368903290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 369003290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 369103290b84SBram Moolenaar var lines =<< trim END 369203290b84SBram Moolenaar vim9script 36932d6b20d6SBram Moolenaar def foo#test() 36942d6b20d6SBram Moolenaar echomsg getreg('"') 36952d6b20d6SBram Moolenaar enddef 36962d6b20d6SBram Moolenaar END 36972d6b20d6SBram Moolenaar 36982d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 36992d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3700cfcd011fSBram Moolenaar var save_rtp = &rtp 37012d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 37022d6b20d6SBram Moolenaar augroup test 37032d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 37042d6b20d6SBram Moolenaar augroup END 37052d6b20d6SBram Moolenaar 37062d6b20d6SBram Moolenaar normal Y 37072d6b20d6SBram Moolenaar 37082d6b20d6SBram Moolenaar augroup test 37092d6b20d6SBram Moolenaar autocmd! 37102d6b20d6SBram Moolenaar augroup END 37112d6b20d6SBram Moolenaar delete('Xdir', 'rf') 37122d6b20d6SBram Moolenaar &rtp = save_rtp 37132d6b20d6SBram Moolenaarenddef 37142d6b20d6SBram Moolenaar 371577e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 371677e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3717cfcd011fSBram Moolenaar var lines =<< trim END 371877e5dcc3SBram Moolenaar vim9script 371977e5dcc3SBram Moolenaar def crash#func() 372077e5dcc3SBram Moolenaar try 372177e5dcc3SBram Moolenaar for x in List() 372277e5dcc3SBram Moolenaar endfor 372377e5dcc3SBram Moolenaar catch 372477e5dcc3SBram Moolenaar endtry 372577e5dcc3SBram Moolenaar g:ok = true 372677e5dcc3SBram Moolenaar enddef 372777e5dcc3SBram Moolenaar fu List() 372877e5dcc3SBram Moolenaar invalid 372977e5dcc3SBram Moolenaar endfu 373077e5dcc3SBram Moolenaar try 373148e11c10SBram Moolenaar alsoinvalid 373277e5dcc3SBram Moolenaar catch /wontmatch/ 373377e5dcc3SBram Moolenaar endtry 373477e5dcc3SBram Moolenaar END 373577e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 373677e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 373777e5dcc3SBram Moolenaar 373877e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 373977e5dcc3SBram Moolenaar lines =<< trim END 374077e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 374177e5dcc3SBram Moolenaar call crash#func() 374277e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 37439c4f5520SBram Moolenaar qall! 374477e5dcc3SBram Moolenaar END 374577e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 374677e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 374777e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 374877e5dcc3SBram Moolenaar 374977e5dcc3SBram Moolenaar delete('Xdidit') 375077e5dcc3SBram Moolenaar delete('Xscript') 375177e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 375203290b84SBram Moolenaar 375303290b84SBram Moolenaar lines =<< trim END 375403290b84SBram Moolenaar vim9script 375503290b84SBram Moolenaar var foo#bar = 'asdf' 375603290b84SBram Moolenaar END 375703290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 375877e5dcc3SBram Moolenaarenddef 375977e5dcc3SBram Moolenaar 376081e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 376181e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 376281e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3763cfcd011fSBram Moolenaar var lines =<< trim END 376481e17fbeSBram Moolenaar let s:counter = 1 376581e17fbeSBram Moolenaar def s:Func() 376681e17fbeSBram Moolenaar au! CursorHold 376781e17fbeSBram Moolenaar au CursorHold * s:counter += 1 376881e17fbeSBram Moolenaar enddef 376981e17fbeSBram Moolenaar call s:Func() 377081e17fbeSBram Moolenaar doau CursorHold 377181e17fbeSBram Moolenaar call assert_equal(2, s:counter) 377281e17fbeSBram Moolenaar au! CursorHold 377381e17fbeSBram Moolenaar END 377481e17fbeSBram Moolenaar CheckScriptSuccess(lines) 377581e17fbeSBram Moolenaarenddef 377681e17fbeSBram Moolenaar 3777b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3778b5841b99SBram Moolenaar var save_rtp = &rtp 3779b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3780b5841b99SBram Moolenaar &rtp = dir 3781b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3782b5841b99SBram Moolenaar 3783b5841b99SBram Moolenaar var lines =<< trim END 3784b5841b99SBram Moolenaar vim9script noclear 3785b5841b99SBram Moolenaar def script#autoloaded() 3786b5841b99SBram Moolenaar enddef 3787b5841b99SBram Moolenaar def Broken() 3788b5841b99SBram Moolenaar var x: any = '' 3789b5841b99SBram Moolenaar eval x != 0 3790b5841b99SBram Moolenaar enddef 3791b5841b99SBram Moolenaar Broken() 3792b5841b99SBram Moolenaar END 3793b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3794b5841b99SBram Moolenaar 3795b5841b99SBram Moolenaar lines =<< trim END 3796b5841b99SBram Moolenaar vim9script 3797b5841b99SBram Moolenaar def CallAutoloaded() 3798b5841b99SBram Moolenaar script#autoloaded() 3799b5841b99SBram Moolenaar enddef 3800b5841b99SBram Moolenaar 3801b5841b99SBram Moolenaar function Legacy() 3802b5841b99SBram Moolenaar try 3803b5841b99SBram Moolenaar call s:CallAutoloaded() 3804b5841b99SBram Moolenaar catch 3805b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3806b5841b99SBram Moolenaar endtry 3807b5841b99SBram Moolenaar endfunction 3808b5841b99SBram Moolenaar 3809b5841b99SBram Moolenaar Legacy() 3810b5841b99SBram Moolenaar END 3811b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3812b5841b99SBram Moolenaar 3813b5841b99SBram Moolenaar &rtp = save_rtp 3814b5841b99SBram Moolenaar delete(dir, 'rf') 3815b5841b99SBram Moolenaarenddef 3816b5841b99SBram Moolenaar 38173896a105SBram Moolenaardef Test_cmdline_win() 38183896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 38193896a105SBram Moolenaar # the command line window. 38203896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3821cfcd011fSBram Moolenaar var export_lines =<< trim END 38223896a105SBram Moolenaar vim9script 3823cfcd011fSBram Moolenaar export var That = 'yes' 38243896a105SBram Moolenaar END 38253896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3826cfcd011fSBram Moolenaar var import_lines =<< trim END 38273896a105SBram Moolenaar vim9script 38283896a105SBram Moolenaar import That from './Xexport.vim' 38293896a105SBram Moolenaar END 38303896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3831cfcd011fSBram Moolenaar var save_rtp = &rtp 38323896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 38333896a105SBram Moolenaar syntax on 38343896a105SBram Moolenaar augroup CmdWin 38353896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 38363896a105SBram Moolenaar augroup END 38373896a105SBram Moolenaar # this will open and also close the cmdline window 38383896a105SBram Moolenaar feedkeys('q:', 'xt') 38393896a105SBram Moolenaar assert_equal('yes', g:got_there) 38403896a105SBram Moolenaar 38413896a105SBram Moolenaar augroup CmdWin 38423896a105SBram Moolenaar au! 38433896a105SBram Moolenaar augroup END 38443896a105SBram Moolenaar &rtp = save_rtp 38453896a105SBram Moolenaar delete('rtp', 'rf') 38463896a105SBram Moolenaarenddef 38473896a105SBram Moolenaar 3848e3d4685fSBram Moolenaardef Test_invalid_sid() 3849e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 385025859dd7SBram Moolenaar 38519c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3852d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3853e3d4685fSBram Moolenaar endif 3854e3d4685fSBram Moolenaar delete('Xdidit') 3855e3d4685fSBram Moolenaarenddef 3856e3d4685fSBram Moolenaar 38579ec7026fSBram Moolenaardef Test_restoring_cpo() 38589ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 38599ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 38609ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 38619ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 38629ec7026fSBram Moolenaar endif 38639ec7026fSBram Moolenaar delete('Xsourced') 38649ec7026fSBram Moolenaar delete('Xclose') 3865090728adSBram Moolenaar delete('Xdone') 38660123cc1eSBram Moolenaar 38670123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 38680123cc1eSBram Moolenaar set cpo=aABceFsMny> 38690123cc1eSBram Moolenaar edit XanotherScript 38700123cc1eSBram Moolenaar so % 38710123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38720123cc1eSBram Moolenaar :1del 38730123cc1eSBram Moolenaar w 38740123cc1eSBram Moolenaar so % 38750123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38760123cc1eSBram Moolenaar 38770123cc1eSBram Moolenaar delete('XanotherScript') 38780123cc1eSBram Moolenaar set cpo&vim 38799ec7026fSBram Moolenaarenddef 38809ec7026fSBram Moolenaar 3881ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3882ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 388337294bd6SBram Moolenaar CheckScreendump 3884ffb7dcdbSBram Moolenaar CheckFeature timers 388537294bd6SBram Moolenaar 3886ffb7dcdbSBram Moolenaar let lines =<< trim END 388737294bd6SBram Moolenaar vim9script 388837294bd6SBram Moolenaar def script#func() 388937294bd6SBram Moolenaar enddef 389037294bd6SBram Moolenaar END 3891ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3892ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 389337294bd6SBram Moolenaar 3894ffb7dcdbSBram Moolenaar let lines =<< trim END 389537294bd6SBram Moolenaar vim9script 389637294bd6SBram Moolenaar set cpo+=M 389737294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3898767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 389937294bd6SBram Moolenaar setline(1, 'some text') 390037294bd6SBram Moolenaar END 3901ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3902ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3903ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3904ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 390537294bd6SBram Moolenaar 3906ffb7dcdbSBram Moolenaar " clean up 3907ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3908ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3909ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3910ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3911ffb7dcdbSBram Moolenaarendfunc 391237294bd6SBram Moolenaar 39139ec7026fSBram Moolenaar 3914f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3915cfcd011fSBram Moolenaar var lines =<< trim END 3916cfcd011fSBram Moolenaar var name: any 3917cfcd011fSBram Moolenaar assert_equal(0, name) 3918f0afd9e1SBram Moolenaar END 3919f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3920f0afd9e1SBram Moolenaarenddef 3921f0afd9e1SBram Moolenaar 39227e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 392358dbef33SBram Moolenaar CheckRunVimInTerminal 392458dbef33SBram Moolenaar 39257e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 39267e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 39277e9210eaSBram Moolenaarendfunc 39287e9210eaSBram Moolenaar 39297e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 39309c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3931cfcd011fSBram Moolenaar var lines =<< trim END 39329c4f5520SBram Moolenaar func CheckAndQuit() 39339c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 39349c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 39359c4f5520SBram Moolenaar endfunc 39369c4f5520SBram Moolenaar END 39379c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 39389c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3939e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 39409c4f5520SBram Moolenaar # define Afunc() on the command line 39419c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 39429c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 39432949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 39449c4f5520SBram Moolenaar 39459c4f5520SBram Moolenaar call StopVimInTerminal(buf) 39469c4f5520SBram Moolenaar delete('XcallFunc') 39479c4f5520SBram Moolenaar delete('Xdidcmd') 39489c4f5520SBram Moolenaarenddef 39499c4f5520SBram Moolenaar 3950fcdc5d83SBram Moolenaardef Test_script_var_scope() 3951fcdc5d83SBram Moolenaar var lines =<< trim END 3952fcdc5d83SBram Moolenaar vim9script 3953fcdc5d83SBram Moolenaar if true 3954fcdc5d83SBram Moolenaar if true 3955fcdc5d83SBram Moolenaar var one = 'one' 3956fcdc5d83SBram Moolenaar echo one 3957fcdc5d83SBram Moolenaar endif 3958fcdc5d83SBram Moolenaar echo one 3959fcdc5d83SBram Moolenaar endif 3960fcdc5d83SBram Moolenaar END 3961fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3962fcdc5d83SBram Moolenaar 3963fcdc5d83SBram Moolenaar lines =<< trim END 3964fcdc5d83SBram Moolenaar vim9script 3965fcdc5d83SBram Moolenaar if true 3966fcdc5d83SBram Moolenaar if false 3967fcdc5d83SBram Moolenaar var one = 'one' 3968fcdc5d83SBram Moolenaar echo one 3969fcdc5d83SBram Moolenaar else 3970fcdc5d83SBram Moolenaar var one = 'one' 3971fcdc5d83SBram Moolenaar echo one 3972fcdc5d83SBram Moolenaar endif 3973fcdc5d83SBram Moolenaar echo one 3974fcdc5d83SBram Moolenaar endif 3975fcdc5d83SBram Moolenaar END 3976fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3977fcdc5d83SBram Moolenaar 3978fcdc5d83SBram Moolenaar lines =<< trim END 3979fcdc5d83SBram Moolenaar vim9script 3980fcdc5d83SBram Moolenaar while true 3981fcdc5d83SBram Moolenaar var one = 'one' 3982fcdc5d83SBram Moolenaar echo one 3983fcdc5d83SBram Moolenaar break 3984fcdc5d83SBram Moolenaar endwhile 3985fcdc5d83SBram Moolenaar echo one 3986fcdc5d83SBram Moolenaar END 3987fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3988fcdc5d83SBram Moolenaar 3989fcdc5d83SBram Moolenaar lines =<< trim END 3990fcdc5d83SBram Moolenaar vim9script 3991fcdc5d83SBram Moolenaar for i in range(1) 3992fcdc5d83SBram Moolenaar var one = 'one' 3993fcdc5d83SBram Moolenaar echo one 3994fcdc5d83SBram Moolenaar endfor 3995fcdc5d83SBram Moolenaar echo one 3996fcdc5d83SBram Moolenaar END 3997fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 39989becdf2bSBram Moolenaar 39999becdf2bSBram Moolenaar lines =<< trim END 40009becdf2bSBram Moolenaar vim9script 40019becdf2bSBram Moolenaar { 40029becdf2bSBram Moolenaar var one = 'one' 40039becdf2bSBram Moolenaar assert_equal('one', one) 40049becdf2bSBram Moolenaar } 40059becdf2bSBram Moolenaar assert_false(exists('one')) 40069becdf2bSBram Moolenaar assert_false(exists('s:one')) 40079becdf2bSBram Moolenaar END 40089becdf2bSBram Moolenaar CheckScriptSuccess(lines) 40099becdf2bSBram Moolenaar 40109becdf2bSBram Moolenaar lines =<< trim END 40119becdf2bSBram Moolenaar vim9script 40129becdf2bSBram Moolenaar { 40139becdf2bSBram Moolenaar var one = 'one' 40149becdf2bSBram Moolenaar echo one 40159becdf2bSBram Moolenaar } 40169becdf2bSBram Moolenaar echo one 40179becdf2bSBram Moolenaar END 40189becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4019fcdc5d83SBram Moolenaarenddef 4020fcdc5d83SBram Moolenaar 4021352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4022352134bbSBram Moolenaar var lines =<< trim END 4023352134bbSBram Moolenaar vim9script 40242a38908bSBram Moolenaar def Callback(...l: list<any>) 4025352134bbSBram Moolenaar try 4026352134bbSBram Moolenaar var x: string 4027352134bbSBram Moolenaar var y: string 4028352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4029352134bbSBram Moolenaar [x, y] = [''] 4030352134bbSBram Moolenaar catch 4031352134bbSBram Moolenaar g:caught = 'yes' 4032352134bbSBram Moolenaar endtry 4033352134bbSBram Moolenaar enddef 4034e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4035352134bbSBram Moolenaar feedkeys("\r", 'xt') 4036352134bbSBram Moolenaar END 4037352134bbSBram Moolenaar CheckScriptSuccess(lines) 4038352134bbSBram Moolenaar 4039352134bbSBram Moolenaar unlet g:caught 4040352134bbSBram Moolenaarenddef 4041352134bbSBram Moolenaar 4042631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4043631e8f93SBram Moolenaar if !has('unix') || !has('job') 4044631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4045631e8f93SBram Moolenaar endif 4046631e8f93SBram Moolenaar var lines =<< trim END 4047631e8f93SBram Moolenaar vim9script 4048631e8f93SBram Moolenaar var source: list<number> 40492a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4050631e8f93SBram Moolenaar eval [][0] 4051631e8f93SBram Moolenaar enddef 40522a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4053631e8f93SBram Moolenaar sleep 1m 4054631e8f93SBram Moolenaar source += l 4055631e8f93SBram Moolenaar enddef 4056e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 40576f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 40586f17a3f0SBram Moolenaar sleep 10m 40596f17a3f0SBram Moolenaar endwhile 4060206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4061fe95b94fSBram Moolenaar sleep 200m 4062631e8f93SBram Moolenaar END 4063631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4064631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4065631e8f93SBram Moolenaar delete('Xdef') 4066631e8f93SBram Moolenaarenddef 4067631e8f93SBram Moolenaar 40684324d87aSBram Moolenaardef InvokeNormal() 40694324d87aSBram Moolenaar exe "norm! :m+1\r" 40704324d87aSBram Moolenaarenddef 40714324d87aSBram Moolenaar 40724324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 40734324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 40744324d87aSBram Moolenaar new 40754324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 40764324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 40774324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 40784324d87aSBram Moolenaar xunmap <F3> 4079b5b9480eSBram Moolenaarenddef 4080b5b9480eSBram Moolenaar 4081b5b9480eSBram Moolenaardef Test_white_space_after_command() 4082b5b9480eSBram Moolenaar var lines =<< trim END 4083b5b9480eSBram Moolenaar exit_cb: Func}) 4084b5b9480eSBram Moolenaar END 4085b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4086f8103f27SBram Moolenaar 4087f8103f27SBram Moolenaar lines =<< trim END 4088f8103f27SBram Moolenaar e# 4089f8103f27SBram Moolenaar END 4090f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 40914324d87aSBram Moolenaarenddef 40924324d87aSBram Moolenaar 40934aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 40944aab88d9SBram Moolenaar var lines =<< trim END 40954aab88d9SBram Moolenaar vim9script 40964aab88d9SBram Moolenaar if exists('g:guard') 40974aab88d9SBram Moolenaar finish 40984aab88d9SBram Moolenaar endif 40994aab88d9SBram Moolenaar g:guard = 1 41004aab88d9SBram Moolenaar var name = 'thename' 41014aab88d9SBram Moolenaar def g:GetName(): string 41024aab88d9SBram Moolenaar return name 41034aab88d9SBram Moolenaar enddef 41044aab88d9SBram Moolenaar def g:SetName(arg: string) 41054aab88d9SBram Moolenaar name = arg 41064aab88d9SBram Moolenaar enddef 41074aab88d9SBram Moolenaar END 41084aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 41094aab88d9SBram Moolenaar so XscriptTwice.vim 41104aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 41114aab88d9SBram Moolenaar g:SetName('newname') 41124aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 41134aab88d9SBram Moolenaar so XscriptTwice.vim 41144aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41154aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 41164aab88d9SBram Moolenaar 41174aab88d9SBram Moolenaar delfunc g:GetName 41184aab88d9SBram Moolenaar delfunc g:SetName 41194aab88d9SBram Moolenaar delete('XscriptTwice.vim') 41204aab88d9SBram Moolenaar unlet g:guard 41214aab88d9SBram Moolenaarenddef 41224aab88d9SBram Moolenaar 41234aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 41244aab88d9SBram Moolenaar var exportlines =<< trim END 41254aab88d9SBram Moolenaar vim9script 41264aab88d9SBram Moolenaar if exists('g:guard') 41274aab88d9SBram Moolenaar finish 41284aab88d9SBram Moolenaar endif 41294aab88d9SBram Moolenaar g:guard = 1 41304aab88d9SBram Moolenaar export var name = 'someName' 41314aab88d9SBram Moolenaar END 41324aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 41334aab88d9SBram Moolenaar 41344aab88d9SBram Moolenaar var lines =<< trim END 41354aab88d9SBram Moolenaar vim9script 41364aab88d9SBram Moolenaar import name from './XexportScript.vim' 41374aab88d9SBram Moolenaar def g:GetName(): string 41384aab88d9SBram Moolenaar return name 41394aab88d9SBram Moolenaar enddef 41404aab88d9SBram Moolenaar END 41414aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 41424aab88d9SBram Moolenaar so XscriptImport.vim 41434aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 41444aab88d9SBram Moolenaar 41454aab88d9SBram Moolenaar so XexportScript.vim 41464aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41474aab88d9SBram Moolenaar 41484aab88d9SBram Moolenaar delfunc g:GetName 41494aab88d9SBram Moolenaar delete('XexportScript.vim') 41504aab88d9SBram Moolenaar delete('XscriptImport.vim') 41514aab88d9SBram Moolenaar unlet g:guard 41524aab88d9SBram Moolenaarenddef 41534aab88d9SBram Moolenaar 415410b9421fSBram Moolenaardef Test_unsupported_commands() 415510b9421fSBram Moolenaar var lines =<< trim END 415610b9421fSBram Moolenaar ka 415710b9421fSBram Moolenaar END 41587d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41597d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 416010b9421fSBram Moolenaar 416110b9421fSBram Moolenaar lines =<< trim END 4162ada1d870SBram Moolenaar :1ka 4163ada1d870SBram Moolenaar END 41647d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41657d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4166ada1d870SBram Moolenaar 4167ada1d870SBram Moolenaar lines =<< trim END 416810b9421fSBram Moolenaar t 416910b9421fSBram Moolenaar END 417010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 417110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 417210b9421fSBram Moolenaar 417310b9421fSBram Moolenaar lines =<< trim END 417410b9421fSBram Moolenaar x 417510b9421fSBram Moolenaar END 417610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 417710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 417810b9421fSBram Moolenaar 417910b9421fSBram Moolenaar lines =<< trim END 418010b9421fSBram Moolenaar xit 418110b9421fSBram Moolenaar END 418210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 418310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 418410b9421fSBram Moolenaarenddef 418510b9421fSBram Moolenaar 4186c70fe460SBram Moolenaardef Test_mapping_line_number() 4187c70fe460SBram Moolenaar var lines =<< trim END 4188c70fe460SBram Moolenaar vim9script 4189c70fe460SBram Moolenaar def g:FuncA() 4190c70fe460SBram Moolenaar # Some comment 4191c70fe460SBram Moolenaar FuncB(0) 4192c70fe460SBram Moolenaar enddef 4193c70fe460SBram Moolenaar # Some comment 4194c70fe460SBram Moolenaar def FuncB( 4195c70fe460SBram Moolenaar # Some comment 4196c70fe460SBram Moolenaar n: number 4197c70fe460SBram Moolenaar ) 4198c70fe460SBram Moolenaar exe 'nno ' 4199c70fe460SBram Moolenaar # Some comment 4200c70fe460SBram Moolenaar .. '<F3> a' 4201c70fe460SBram Moolenaar .. 'b' 4202c70fe460SBram Moolenaar .. 'c' 4203c70fe460SBram Moolenaar enddef 4204c70fe460SBram Moolenaar END 4205c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4206c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4207c70fe460SBram Moolenaar assert_match('No mapping found', res) 4208c70fe460SBram Moolenaar 4209c70fe460SBram Moolenaar g:FuncA() 4210c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4211c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4212c70fe460SBram Moolenaar 4213c70fe460SBram Moolenaar nunmap <F3> 4214c70fe460SBram Moolenaar delfunc g:FuncA 4215c70fe460SBram Moolenaarenddef 4216c70fe460SBram Moolenaar 4217deb108baSBram Moolenaardef Test_option_set() 4218deb108baSBram Moolenaar # legacy script allows for white space 4219deb108baSBram Moolenaar var lines =<< trim END 4220deb108baSBram Moolenaar set foldlevel =11 4221deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4222deb108baSBram Moolenaar END 4223deb108baSBram Moolenaar CheckScriptSuccess(lines) 4224deb108baSBram Moolenaar 4225deb108baSBram Moolenaar set foldlevel 4226deb108baSBram Moolenaar set foldlevel=12 4227deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4228deb108baSBram Moolenaar set foldlevel+=2 4229deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4230deb108baSBram Moolenaar set foldlevel-=3 4231deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4232deb108baSBram Moolenaar 4233deb108baSBram Moolenaar lines =<< trim END 4234deb108baSBram Moolenaar set foldlevel =1 4235deb108baSBram Moolenaar END 4236deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4237deb108baSBram Moolenaar 4238deb108baSBram Moolenaar lines =<< trim END 4239deb108baSBram Moolenaar set foldlevel +=1 4240deb108baSBram Moolenaar END 4241deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4242deb108baSBram Moolenaar 4243deb108baSBram Moolenaar lines =<< trim END 4244deb108baSBram Moolenaar set foldlevel ^=1 4245deb108baSBram Moolenaar END 4246deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4247deb108baSBram Moolenaar 4248deb108baSBram Moolenaar lines =<< trim END 4249deb108baSBram Moolenaar set foldlevel -=1 4250deb108baSBram Moolenaar END 4251deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4252deb108baSBram Moolenaar 4253deb108baSBram Moolenaar set foldlevel& 4254deb108baSBram Moolenaarenddef 4255deb108baSBram Moolenaar 4256208f0b48SBram Moolenaardef Test_option_modifier() 42571594f313SBram Moolenaar # legacy script allows for white space 4258208f0b48SBram Moolenaar var lines =<< trim END 4259208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4260208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4261208f0b48SBram Moolenaar END 4262208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4263208f0b48SBram Moolenaar 42641594f313SBram Moolenaar set hlsearch 42651594f313SBram Moolenaar set hlsearch! 42661594f313SBram Moolenaar assert_equal(false, &hlsearch) 42671594f313SBram Moolenaar 42681594f313SBram Moolenaar set hlsearch 4269208f0b48SBram Moolenaar set hlsearch& 42701594f313SBram Moolenaar assert_equal(false, &hlsearch) 4271208f0b48SBram Moolenaar 4272208f0b48SBram Moolenaar lines =<< trim END 42731594f313SBram Moolenaar set hlsearch & 4274208f0b48SBram Moolenaar END 42751594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 42761594f313SBram Moolenaar 42771594f313SBram Moolenaar lines =<< trim END 42781594f313SBram Moolenaar set hlsearch ! 42791594f313SBram Moolenaar END 42801594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 42811594f313SBram Moolenaar 42821594f313SBram Moolenaar set hlsearch& 4283208f0b48SBram Moolenaarenddef 4284208f0b48SBram Moolenaar 4285c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4286c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4287c03fe66aSBram Moolenaar var lines =<< trim END 4288c03fe66aSBram Moolenaar echoerr 'some' 4289c03fe66aSBram Moolenaar .. ' error' 4290c03fe66aSBram Moolenaar .. ' continued' 4291c03fe66aSBram Moolenaar END 4292c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4293c03fe66aSBram Moolenaarenddef 4294c03fe66aSBram Moolenaar 4295648594eaSBram Moolenaardef ProfiledWithLambda() 4296d9162550SBram Moolenaar var n = 3 4297d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4298d9162550SBram Moolenaarenddef 4299d9162550SBram Moolenaar 4300648594eaSBram Moolenaardef ProfiledNested() 4301648594eaSBram Moolenaar var x = 0 4302648594eaSBram Moolenaar def Nested(): any 4303648594eaSBram Moolenaar return x 4304648594eaSBram Moolenaar enddef 4305648594eaSBram Moolenaar Nested() 4306648594eaSBram Moolenaarenddef 4307648594eaSBram Moolenaar 4308ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4309ffcfddc7SBram Moolenaar var x = 0 4310ffcfddc7SBram Moolenaar def Nested(): any 4311ffcfddc7SBram Moolenaar return x 4312ffcfddc7SBram Moolenaar enddef 4313ffcfddc7SBram Moolenaar Nested() 4314ffcfddc7SBram Moolenaarenddef 4315ffcfddc7SBram Moolenaar 4316d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4317d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4318d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 43194ece152aSBram Moolenaar CheckFeature profile 43204ece152aSBram Moolenaar 4321d9162550SBram Moolenaar profile start Xprofile.log 4322648594eaSBram Moolenaar profile func ProfiledWithLambda 4323648594eaSBram Moolenaar ProfiledWithLambda() 4324ffcfddc7SBram Moolenaar 4325648594eaSBram Moolenaar profile func ProfiledNested 4326648594eaSBram Moolenaar ProfiledNested() 4327ffcfddc7SBram Moolenaar 4328ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4329ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4330ffcfddc7SBram Moolenaar profile func * 4331ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4332ffcfddc7SBram Moolenaar 4333ffcfddc7SBram Moolenaar profdel func * 4334ffcfddc7SBram Moolenaar profile pause 4335d9162550SBram Moolenaarenddef 4336d9162550SBram Moolenaar 4337585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4338585fea7bSBram Moolenaardef Test_substitute_cmd() 4339585fea7bSBram Moolenaar new 4340585fea7bSBram Moolenaar setline(1, 'something') 4341585fea7bSBram Moolenaar :substitute(some(other( 4342585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4343585fea7bSBram Moolenaar bwipe! 4344585fea7bSBram Moolenaar 4345f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4346cfcd011fSBram Moolenaar var lines =<< trim END 4347585fea7bSBram Moolenaar vim9script 4348585fea7bSBram Moolenaar new 4349585fea7bSBram Moolenaar setline(1, 'something') 4350585fea7bSBram Moolenaar :substitute(some(other( 4351585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4352585fea7bSBram Moolenaar bwipe! 4353585fea7bSBram Moolenaar END 4354585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4355585fea7bSBram Moolenaar source Xvim9lines 4356585fea7bSBram Moolenaar 4357585fea7bSBram Moolenaar delete('Xvim9lines') 4358585fea7bSBram Moolenaarenddef 4359585fea7bSBram Moolenaar 43608a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4361