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 337*e4db17fbSBram Moolenaar" legacy func for command that's defined later 338*e4db17fbSBram Moolenaarfunc InvokeSomeCommand() 339*e4db17fbSBram Moolenaar SomeCommand 340*e4db17fbSBram Moolenaarendfunc 341*e4db17fbSBram Moolenaar 342*e4db17fbSBram Moolenaardef Test_autocommand_block() 343*e4db17fbSBram Moolenaar com SomeCommand { 344*e4db17fbSBram Moolenaar g:someVar = 'some' 345*e4db17fbSBram Moolenaar } 346*e4db17fbSBram Moolenaar InvokeSomeCommand() 347*e4db17fbSBram Moolenaar assert_equal('some', g:someVar) 348*e4db17fbSBram Moolenaar 349*e4db17fbSBram Moolenaar delcommand SomeCommand 350*e4db17fbSBram Moolenaar unlet g:someVar 351*e4db17fbSBram Moolenaarenddef 352*e4db17fbSBram Moolenaar 353*e4db17fbSBram Moolenaardef Test_command_block() 354*e4db17fbSBram Moolenaar au BufNew *.xml { 355*e4db17fbSBram Moolenaar g:otherVar = 'other' 356*e4db17fbSBram Moolenaar } 357*e4db17fbSBram Moolenaar split other.xml 358*e4db17fbSBram Moolenaar assert_equal('other', g:otherVar) 359*e4db17fbSBram Moolenaar 360*e4db17fbSBram Moolenaar bwipe! 361*e4db17fbSBram Moolenaar au! BufNew *.xml 362*e4db17fbSBram Moolenaar unlet g:otherVar 363*e4db17fbSBram Moolenaarenddef 364*e4db17fbSBram Moolenaar 365d032f34aSBram Moolenaarfunc g:NoSuchFunc() 366d032f34aSBram Moolenaar echo 'none' 367d032f34aSBram Moolenaarendfunc 368d032f34aSBram Moolenaar 3699e1d9e34SBram Moolenaardef Test_try_catch_throw() 370cfcd011fSBram Moolenaar var l = [] 3717a092245SBram Moolenaar try # comment 3728a7d6542SBram Moolenaar add(l, '1') 3738a7d6542SBram Moolenaar throw 'wrong' 3748a7d6542SBram Moolenaar add(l, '2') 3757a092245SBram Moolenaar catch # comment 3768a7d6542SBram Moolenaar add(l, v:exception) 3777a092245SBram Moolenaar finally # comment 3788a7d6542SBram Moolenaar add(l, '3') 3797a092245SBram Moolenaar endtry # comment 3808a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 38168d130c6SBram Moolenaar 382e859312eSBram Moolenaar l = [] 383e859312eSBram Moolenaar try 384e859312eSBram Moolenaar try 385e859312eSBram Moolenaar add(l, '1') 386e859312eSBram Moolenaar throw 'wrong' 387e859312eSBram Moolenaar add(l, '2') 388e859312eSBram Moolenaar catch /right/ 389e859312eSBram Moolenaar add(l, v:exception) 390e859312eSBram Moolenaar endtry 391e859312eSBram Moolenaar catch /wrong/ 392e859312eSBram Moolenaar add(l, 'caught') 393373863edSBram Moolenaar fina 394e859312eSBram Moolenaar add(l, 'finally') 395e859312eSBram Moolenaar endtry 396e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 397e859312eSBram Moolenaar 398cfcd011fSBram Moolenaar var n: number 39968d130c6SBram Moolenaar try 40068d130c6SBram Moolenaar n = l[3] 40168d130c6SBram Moolenaar catch /E684:/ 40268d130c6SBram Moolenaar n = 99 40368d130c6SBram Moolenaar endtry 40468d130c6SBram Moolenaar assert_equal(99, n) 40568d130c6SBram Moolenaar 40669f7050cSBram Moolenaar var done = 'no' 40769f7050cSBram Moolenaar if 0 40869f7050cSBram Moolenaar try | catch | endtry 40969f7050cSBram Moolenaar else 41069f7050cSBram Moolenaar done = 'yes' 41169f7050cSBram Moolenaar endif 41269f7050cSBram Moolenaar assert_equal('yes', done) 41369f7050cSBram Moolenaar 41469f7050cSBram Moolenaar done = 'no' 41569f7050cSBram Moolenaar if 1 41669f7050cSBram Moolenaar done = 'yes' 41769f7050cSBram Moolenaar else 41869f7050cSBram Moolenaar try | catch | endtry 41969f7050cSBram Moolenaar done = 'never' 42069f7050cSBram Moolenaar endif 42169f7050cSBram Moolenaar assert_equal('yes', done) 42269f7050cSBram Moolenaar 42369f7050cSBram Moolenaar if 1 42469f7050cSBram Moolenaar else 42569f7050cSBram Moolenaar try | catch /pat/ | endtry 42669f7050cSBram Moolenaar try | catch /pat/ 42769f7050cSBram Moolenaar endtry 42869f7050cSBram Moolenaar try 42969f7050cSBram Moolenaar catch /pat/ | endtry 43069f7050cSBram Moolenaar try 43169f7050cSBram Moolenaar catch /pat/ 43269f7050cSBram Moolenaar endtry 43369f7050cSBram Moolenaar endif 43469f7050cSBram Moolenaar 43568d130c6SBram Moolenaar try 436cc673e74SBram Moolenaar # string slice returns a string, not a number 43768d130c6SBram Moolenaar n = g:astring[3] 4385e654230SBram Moolenaar catch /E1012:/ 43968d130c6SBram Moolenaar n = 77 44068d130c6SBram Moolenaar endtry 44168d130c6SBram Moolenaar assert_equal(77, n) 44268d130c6SBram Moolenaar 44368d130c6SBram Moolenaar try 44468d130c6SBram Moolenaar n = l[g:astring] 4455e654230SBram Moolenaar catch /E1012:/ 44656acb094SBram Moolenaar n = 88 44768d130c6SBram Moolenaar endtry 44856acb094SBram Moolenaar assert_equal(88, n) 44968d130c6SBram Moolenaar 45068d130c6SBram Moolenaar try 45168d130c6SBram Moolenaar n = s:does_not_exist 45268d130c6SBram Moolenaar catch /E121:/ 453f0b9f43cSBram Moolenaar n = 111 454f0b9f43cSBram Moolenaar endtry 455f0b9f43cSBram Moolenaar assert_equal(111, n) 456f0b9f43cSBram Moolenaar 457f0b9f43cSBram Moolenaar try 458f0b9f43cSBram Moolenaar n = g:does_not_exist 459f0b9f43cSBram Moolenaar catch /E121:/ 46068d130c6SBram Moolenaar n = 121 46168d130c6SBram Moolenaar endtry 46268d130c6SBram Moolenaar assert_equal(121, n) 46368d130c6SBram Moolenaar 464e0de171eSBram Moolenaar var d = {one: 1} 46568d130c6SBram Moolenaar try 46668d130c6SBram Moolenaar n = d[g:astring] 46768d130c6SBram Moolenaar catch /E716:/ 46868d130c6SBram Moolenaar n = 222 46968d130c6SBram Moolenaar endtry 47068d130c6SBram Moolenaar assert_equal(222, n) 471f0b9f43cSBram Moolenaar 472f0b9f43cSBram Moolenaar try 473f0b9f43cSBram Moolenaar n = -g:astring 474f0b9f43cSBram Moolenaar catch /E39:/ 475f0b9f43cSBram Moolenaar n = 233 476f0b9f43cSBram Moolenaar endtry 477f0b9f43cSBram Moolenaar assert_equal(233, n) 478f0b9f43cSBram Moolenaar 479f0b9f43cSBram Moolenaar try 480f0b9f43cSBram Moolenaar n = +g:astring 481f0b9f43cSBram Moolenaar catch /E1030:/ 482f0b9f43cSBram Moolenaar n = 244 483f0b9f43cSBram Moolenaar endtry 484f0b9f43cSBram Moolenaar assert_equal(244, n) 485f0b9f43cSBram Moolenaar 486f0b9f43cSBram Moolenaar try 487f0b9f43cSBram Moolenaar n = +g:alist 488f0b9f43cSBram Moolenaar catch /E745:/ 489f0b9f43cSBram Moolenaar n = 255 490f0b9f43cSBram Moolenaar endtry 491f0b9f43cSBram Moolenaar assert_equal(255, n) 492f0b9f43cSBram Moolenaar 493cfcd011fSBram Moolenaar var nd: dict<any> 494f0b9f43cSBram Moolenaar try 4952e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4962e5910bfSBram Moolenaar catch /E1105:/ 497f0b9f43cSBram Moolenaar n = 266 498f0b9f43cSBram Moolenaar endtry 499f0b9f43cSBram Moolenaar assert_equal(266, n) 500f0b9f43cSBram Moolenaar 501f0b9f43cSBram Moolenaar try 502f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 503f0b9f43cSBram Moolenaar catch /E1093:/ 504f0b9f43cSBram Moolenaar n = 277 505f0b9f43cSBram Moolenaar endtry 506f0b9f43cSBram Moolenaar assert_equal(277, n) 507f0b9f43cSBram Moolenaar 508e859312eSBram Moolenaar try 509e859312eSBram Moolenaar &ts = g:astring 5105e654230SBram Moolenaar catch /E1012:/ 511e859312eSBram Moolenaar n = 288 512e859312eSBram Moolenaar endtry 513e859312eSBram Moolenaar assert_equal(288, n) 514e859312eSBram Moolenaar 515e859312eSBram Moolenaar try 516e859312eSBram Moolenaar &backspace = 'asdf' 517e859312eSBram Moolenaar catch /E474:/ 518e859312eSBram Moolenaar n = 299 519e859312eSBram Moolenaar endtry 520e859312eSBram Moolenaar assert_equal(299, n) 521e859312eSBram Moolenaar 522e859312eSBram Moolenaar l = [1] 523e859312eSBram Moolenaar try 524e859312eSBram Moolenaar l[3] = 3 525e859312eSBram Moolenaar catch /E684:/ 526e859312eSBram Moolenaar n = 300 527e859312eSBram Moolenaar endtry 528e859312eSBram Moolenaar assert_equal(300, n) 529e859312eSBram Moolenaar 530e859312eSBram Moolenaar try 531e859312eSBram Moolenaar unlet g:does_not_exist 532e859312eSBram Moolenaar catch /E108:/ 533e859312eSBram Moolenaar n = 322 534e859312eSBram Moolenaar endtry 535e859312eSBram Moolenaar assert_equal(322, n) 536e859312eSBram Moolenaar 537e859312eSBram Moolenaar try 5382bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 539e859312eSBram Moolenaar catch /E721:/ 540e859312eSBram Moolenaar n = 333 541e859312eSBram Moolenaar endtry 542e859312eSBram Moolenaar assert_equal(333, n) 543e859312eSBram Moolenaar 544e859312eSBram Moolenaar try 545e859312eSBram Moolenaar l = DeletedFunc() 546e859312eSBram Moolenaar catch /E933:/ 547e859312eSBram Moolenaar n = 344 548e859312eSBram Moolenaar endtry 549e859312eSBram Moolenaar assert_equal(344, n) 550d032f34aSBram Moolenaar 551d032f34aSBram Moolenaar try 552a764e73dSYegappan Lakshmanan echo range(1, 2, 0) 553a764e73dSYegappan Lakshmanan catch /E726:/ 554d032f34aSBram Moolenaar n = 355 555d032f34aSBram Moolenaar endtry 556d032f34aSBram Moolenaar assert_equal(355, n) 557d032f34aSBram Moolenaar 558cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 559d032f34aSBram Moolenaar delfunc g:NoSuchFunc 560d032f34aSBram Moolenaar try 561d032f34aSBram Moolenaar echo P() 562d032f34aSBram Moolenaar catch /E117:/ 563d032f34aSBram Moolenaar n = 366 564d032f34aSBram Moolenaar endtry 565d032f34aSBram Moolenaar assert_equal(366, n) 566d032f34aSBram Moolenaar 567d032f34aSBram Moolenaar try 568d032f34aSBram Moolenaar echo g:NoSuchFunc() 569d032f34aSBram Moolenaar catch /E117:/ 570d032f34aSBram Moolenaar n = 377 571d032f34aSBram Moolenaar endtry 572d032f34aSBram Moolenaar assert_equal(377, n) 573d032f34aSBram Moolenaar 574d032f34aSBram Moolenaar try 575d032f34aSBram Moolenaar echo g:alist + 4 576d032f34aSBram Moolenaar catch /E745:/ 577d032f34aSBram Moolenaar n = 388 578d032f34aSBram Moolenaar endtry 579d032f34aSBram Moolenaar assert_equal(388, n) 580d032f34aSBram Moolenaar 581d032f34aSBram Moolenaar try 582d032f34aSBram Moolenaar echo 4 + g:alist 583d032f34aSBram Moolenaar catch /E745:/ 584d032f34aSBram Moolenaar n = 399 585d032f34aSBram Moolenaar endtry 586d032f34aSBram Moolenaar assert_equal(399, n) 587d032f34aSBram Moolenaar 588d032f34aSBram Moolenaar try 589d032f34aSBram Moolenaar echo g:alist.member 590d032f34aSBram Moolenaar catch /E715:/ 591d032f34aSBram Moolenaar n = 400 592d032f34aSBram Moolenaar endtry 593d032f34aSBram Moolenaar assert_equal(400, n) 594d032f34aSBram Moolenaar 595d032f34aSBram Moolenaar try 596d032f34aSBram Moolenaar echo d.member 597d032f34aSBram Moolenaar catch /E716:/ 598d032f34aSBram Moolenaar n = 411 599d032f34aSBram Moolenaar endtry 600d032f34aSBram Moolenaar assert_equal(411, n) 601d9d7789bSBram Moolenaar 602d9d7789bSBram Moolenaar var counter = 0 603d9d7789bSBram Moolenaar for i in range(4) 604d9d7789bSBram Moolenaar try 605d9d7789bSBram Moolenaar eval [][0] 606d9d7789bSBram Moolenaar catch 607d9d7789bSBram Moolenaar endtry 608d9d7789bSBram Moolenaar counter += 1 609d9d7789bSBram Moolenaar endfor 610d9d7789bSBram Moolenaar assert_equal(4, counter) 6117e82c5f3SBram Moolenaar 6129fa5dabeSBram Moolenaar # no requirement for spaces before | 6139fa5dabeSBram Moolenaar try|echo 0|catch|endtry 6149fa5dabeSBram Moolenaar 6157e82c5f3SBram Moolenaar # return in finally after empty catch 6167e82c5f3SBram Moolenaar def ReturnInFinally(): number 6177e82c5f3SBram Moolenaar try 6187e82c5f3SBram Moolenaar finally 6197e82c5f3SBram Moolenaar return 4 6207e82c5f3SBram Moolenaar endtry 6217e82c5f3SBram Moolenaar return 2 6227e82c5f3SBram Moolenaar enddef 6237e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 6248ac681a2SBram Moolenaar 6258ac681a2SBram Moolenaar var lines =<< trim END 6268ac681a2SBram Moolenaar vim9script 6278ac681a2SBram Moolenaar try 6288ac681a2SBram Moolenaar acos('0.5') 6298ac681a2SBram Moolenaar ->setline(1) 6308ac681a2SBram Moolenaar catch 6318ac681a2SBram Moolenaar g:caught = v:exception 6328ac681a2SBram Moolenaar endtry 6338ac681a2SBram Moolenaar END 6348ac681a2SBram Moolenaar CheckScriptSuccess(lines) 6354490ec4eSYegappan Lakshmanan assert_match('E1219: Float or Number required for argument 1', g:caught) 6368ac681a2SBram Moolenaar unlet g:caught 6374197828dSBram Moolenaar 6384197828dSBram Moolenaar # missing catch and/or finally 6394197828dSBram Moolenaar lines =<< trim END 6404197828dSBram Moolenaar vim9script 6414197828dSBram Moolenaar try 6424197828dSBram Moolenaar echo 'something' 6434197828dSBram Moolenaar endtry 6444197828dSBram Moolenaar END 6454197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6468a7d6542SBram Moolenaarenddef 6478a7d6542SBram Moolenaar 6483f987b59SBram Moolenaardef Test_try_in_catch() 6493f987b59SBram Moolenaar var lines =<< trim END 6503f987b59SBram Moolenaar vim9script 6513f987b59SBram Moolenaar var seq = [] 6523f987b59SBram Moolenaar def DoIt() 6533f987b59SBram Moolenaar try 6543f987b59SBram Moolenaar seq->add('throw 1') 6553f987b59SBram Moolenaar eval [][0] 6563f987b59SBram Moolenaar seq->add('notreached') 6573f987b59SBram Moolenaar catch 6583f987b59SBram Moolenaar seq->add('catch') 6593f987b59SBram Moolenaar try 6603f987b59SBram Moolenaar seq->add('throw 2') 6613f987b59SBram Moolenaar eval [][0] 6623f987b59SBram Moolenaar seq->add('notreached') 6633f987b59SBram Moolenaar catch /nothing/ 6643f987b59SBram Moolenaar seq->add('notreached') 6653f987b59SBram Moolenaar endtry 6663f987b59SBram Moolenaar seq->add('done') 6673f987b59SBram Moolenaar endtry 6683f987b59SBram Moolenaar enddef 6693f987b59SBram Moolenaar DoIt() 6703f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6713f987b59SBram Moolenaar END 6723f987b59SBram Moolenaarenddef 6733f987b59SBram Moolenaar 674d3d8feebSBram Moolenaardef Test_error_in_catch() 675d3d8feebSBram Moolenaar var lines =<< trim END 676d3d8feebSBram Moolenaar try 677d3d8feebSBram Moolenaar eval [][0] 678d3d8feebSBram Moolenaar catch /E684:/ 679d3d8feebSBram Moolenaar eval [][0] 680d3d8feebSBram Moolenaar endtry 681d3d8feebSBram Moolenaar END 682d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 683d3d8feebSBram Moolenaarenddef 684d3d8feebSBram Moolenaar 6852e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6862e34c34bSBram Moolenaardef TryContinueFunc() 6872e34c34bSBram Moolenaar while g:Count < 2 6882e34c34bSBram Moolenaar g:sequence ..= 't' 6892e34c34bSBram Moolenaar try 6902e34c34bSBram Moolenaar echoerr 'Test' 6912e34c34bSBram Moolenaar catch 6922e34c34bSBram Moolenaar g:Count += 1 6932e34c34bSBram Moolenaar g:sequence ..= 'c' 6942e34c34bSBram Moolenaar continue 6952e34c34bSBram Moolenaar endtry 6962e34c34bSBram Moolenaar g:sequence ..= 'e' 6972e34c34bSBram Moolenaar g:Count += 1 6982e34c34bSBram Moolenaar endwhile 6992e34c34bSBram Moolenaarenddef 7002e34c34bSBram Moolenaar 7012e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 7022e34c34bSBram Moolenaar g:Count = 0 7032e34c34bSBram Moolenaar g:sequence = '' 7042e34c34bSBram Moolenaar TryContinueFunc() 7052e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 7062e34c34bSBram Moolenaar unlet g:Count 7072e34c34bSBram Moolenaar unlet g:sequence 7082e34c34bSBram Moolenaarenddef 7092e34c34bSBram Moolenaar 7109cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 7119cb577a6SBram Moolenaar # return in try block returns normally 7129cb577a6SBram Moolenaar def ReturnInTry(): string 7139cb577a6SBram Moolenaar try 7149cb577a6SBram Moolenaar return '"some message"' 7159cb577a6SBram Moolenaar catch 7169cb577a6SBram Moolenaar endtry 7179cb577a6SBram Moolenaar return 'not reached' 7189cb577a6SBram Moolenaar enddef 7199cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 7209cb577a6SBram Moolenaarenddef 7219cb577a6SBram Moolenaar 7221430ceebSBram Moolenaardef Test_cnext_works_in_catch() 7231430ceebSBram Moolenaar var lines =<< trim END 7241430ceebSBram Moolenaar vim9script 725c323527dSBram Moolenaar au BufEnter * eval 1 + 2 7261430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 7271430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 7281430ceebSBram Moolenaar var items = [ 7291430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 7301430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7311430ceebSBram Moolenaar ] 7321430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7331430ceebSBram Moolenaar cwindow 7341430ceebSBram Moolenaar 7351430ceebSBram Moolenaar def CnextOrCfirst() 7361430ceebSBram Moolenaar # if cnext fails, cfirst is used 7371430ceebSBram Moolenaar try 7381430ceebSBram Moolenaar cnext 7391430ceebSBram Moolenaar catch 7401430ceebSBram Moolenaar cfirst 7411430ceebSBram Moolenaar endtry 7421430ceebSBram Moolenaar enddef 7431430ceebSBram Moolenaar 7441430ceebSBram Moolenaar CnextOrCfirst() 7451430ceebSBram Moolenaar CnextOrCfirst() 7461430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7471430ceebSBram Moolenaar qall 7481430ceebSBram Moolenaar END 7491430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7501430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7511430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7521430ceebSBram Moolenaar 7531430ceebSBram Moolenaar delete('Xfile1') 7541430ceebSBram Moolenaar delete('Xfile2') 7551430ceebSBram Moolenaar delete('XCatchCnext') 7561430ceebSBram Moolenaar delete('Xresult') 7571430ceebSBram Moolenaarenddef 7581430ceebSBram Moolenaar 7599e1d9e34SBram Moolenaardef Test_throw_skipped() 7609e1d9e34SBram Moolenaar if 0 7619e1d9e34SBram Moolenaar throw dontgethere 7629e1d9e34SBram Moolenaar endif 7639e1d9e34SBram Moolenaarenddef 7649e1d9e34SBram Moolenaar 7658f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7668f81b22eSBram Moolenaar var lines =<< trim END 7678f81b22eSBram Moolenaar vim9script 7688f81b22eSBram Moolenaar def Func() 7698f81b22eSBram Moolenaar throw 'error' 7708f81b22eSBram Moolenaar enddef 7718f81b22eSBram Moolenaar silent! Func() 7728f81b22eSBram Moolenaar END 7738f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7748f81b22eSBram Moolenaar source XthrowSilenced 7758f81b22eSBram Moolenaar delete('XthrowSilenced') 7768f81b22eSBram Moolenaarenddef 7778f81b22eSBram Moolenaar 778e859312eSBram Moolenaardef DeletedFunc(): list<any> 779e859312eSBram Moolenaar return ['delete me'] 780e859312eSBram Moolenaarenddef 781e859312eSBram Moolenaardefcompile 782e859312eSBram Moolenaardelfunc DeletedFunc 783e859312eSBram Moolenaar 784257cc5eeSBram Moolenaardef ThrowFromDef() 785a72cfb80SBram Moolenaar throw "getout" # comment 786257cc5eeSBram Moolenaarenddef 787257cc5eeSBram Moolenaar 788257cc5eeSBram Moolenaarfunc CatchInFunc() 789257cc5eeSBram Moolenaar try 790257cc5eeSBram Moolenaar call ThrowFromDef() 791257cc5eeSBram Moolenaar catch 792257cc5eeSBram Moolenaar let g:thrown_func = v:exception 793257cc5eeSBram Moolenaar endtry 794257cc5eeSBram Moolenaarendfunc 795257cc5eeSBram Moolenaar 796257cc5eeSBram Moolenaardef CatchInDef() 797257cc5eeSBram Moolenaar try 798257cc5eeSBram Moolenaar ThrowFromDef() 799257cc5eeSBram Moolenaar catch 800257cc5eeSBram Moolenaar g:thrown_def = v:exception 801257cc5eeSBram Moolenaar endtry 802257cc5eeSBram Moolenaarenddef 803257cc5eeSBram Moolenaar 804f575adffSBram Moolenaardef ReturnFinally(): string 805f575adffSBram Moolenaar try 806f575adffSBram Moolenaar return 'intry' 807373863edSBram Moolenaar finall 808f575adffSBram Moolenaar g:in_finally = 'finally' 809f575adffSBram Moolenaar endtry 810f575adffSBram Moolenaar return 'end' 811f575adffSBram Moolenaarenddef 812f575adffSBram Moolenaar 813257cc5eeSBram Moolenaardef Test_try_catch_nested() 814257cc5eeSBram Moolenaar CatchInFunc() 815257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 816257cc5eeSBram Moolenaar 817257cc5eeSBram Moolenaar CatchInDef() 818257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 819f575adffSBram Moolenaar 820f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 821f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 822d3d8feebSBram Moolenaar 823d3d8feebSBram Moolenaar var l = [] 824d3d8feebSBram Moolenaar try 825d3d8feebSBram Moolenaar l->add('1') 826d3d8feebSBram Moolenaar throw 'bad' 827d3d8feebSBram Moolenaar l->add('x') 828d3d8feebSBram Moolenaar catch /bad/ 829d3d8feebSBram Moolenaar l->add('2') 830d3d8feebSBram Moolenaar try 831d3d8feebSBram Moolenaar l->add('3') 832d3d8feebSBram Moolenaar throw 'one' 833d3d8feebSBram Moolenaar l->add('x') 834d3d8feebSBram Moolenaar catch /one/ 835d3d8feebSBram Moolenaar l->add('4') 836d3d8feebSBram Moolenaar try 837d3d8feebSBram Moolenaar l->add('5') 838d3d8feebSBram Moolenaar throw 'more' 839d3d8feebSBram Moolenaar l->add('x') 840d3d8feebSBram Moolenaar catch /more/ 841d3d8feebSBram Moolenaar l->add('6') 842d3d8feebSBram Moolenaar endtry 843d3d8feebSBram Moolenaar endtry 844d3d8feebSBram Moolenaar endtry 845d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 846834193afSBram Moolenaar 847834193afSBram Moolenaar l = [] 848834193afSBram Moolenaar try 849834193afSBram Moolenaar try 850834193afSBram Moolenaar l->add('1') 851834193afSBram Moolenaar throw 'foo' 852834193afSBram Moolenaar l->add('x') 853834193afSBram Moolenaar catch 854834193afSBram Moolenaar l->add('2') 855834193afSBram Moolenaar throw 'bar' 856834193afSBram Moolenaar l->add('x') 857834193afSBram Moolenaar finally 858834193afSBram Moolenaar l->add('3') 859834193afSBram Moolenaar endtry 860834193afSBram Moolenaar l->add('x') 861834193afSBram Moolenaar catch /bar/ 862834193afSBram Moolenaar l->add('4') 863834193afSBram Moolenaar endtry 864834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 865f575adffSBram Moolenaarenddef 866f575adffSBram Moolenaar 8679939f57bSBram Moolenaardef TryOne(): number 8689939f57bSBram Moolenaar try 8699939f57bSBram Moolenaar return 0 8709939f57bSBram Moolenaar catch 8719939f57bSBram Moolenaar endtry 8729939f57bSBram Moolenaar return 0 8739939f57bSBram Moolenaarenddef 8749939f57bSBram Moolenaar 8759939f57bSBram Moolenaardef TryTwo(n: number): string 8769939f57bSBram Moolenaar try 877cfcd011fSBram Moolenaar var x = {} 8789939f57bSBram Moolenaar catch 8799939f57bSBram Moolenaar endtry 8809939f57bSBram Moolenaar return 'text' 8819939f57bSBram Moolenaarenddef 8829939f57bSBram Moolenaar 8839939f57bSBram Moolenaardef Test_try_catch_twice() 8849939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8859939f57bSBram Moolenaarenddef 8869939f57bSBram Moolenaar 887f575adffSBram Moolenaardef Test_try_catch_match() 888cfcd011fSBram Moolenaar var seq = 'a' 889f575adffSBram Moolenaar try 890f575adffSBram Moolenaar throw 'something' 891f575adffSBram Moolenaar catch /nothing/ 892f575adffSBram Moolenaar seq ..= 'x' 893f575adffSBram Moolenaar catch /some/ 894f575adffSBram Moolenaar seq ..= 'b' 895f575adffSBram Moolenaar catch /asdf/ 896f575adffSBram Moolenaar seq ..= 'x' 897e8c4abbbSBram Moolenaar catch ?a\?sdf? 898e8c4abbbSBram Moolenaar seq ..= 'y' 899f575adffSBram Moolenaar finally 900f575adffSBram Moolenaar seq ..= 'c' 901f575adffSBram Moolenaar endtry 902f575adffSBram Moolenaar assert_equal('abc', seq) 903257cc5eeSBram Moolenaarenddef 904257cc5eeSBram Moolenaar 905e8c4abbbSBram Moolenaardef Test_try_catch_fails() 906d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 907d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 908d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 909d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 910d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 911d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 912d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 913d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 91413106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 915d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 916585fea7bSBram Moolenaar 917e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 918d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 919e8c4abbbSBram Moolenaarenddef 920e8c4abbbSBram Moolenaar 9217c5b3c03SBram Moolenaardef Try_catch_skipped() 9227c5b3c03SBram Moolenaar var l = [] 9237c5b3c03SBram Moolenaar try 9247c5b3c03SBram Moolenaar finally 9257c5b3c03SBram Moolenaar endtry 9267c5b3c03SBram Moolenaar 9277c5b3c03SBram Moolenaar if 1 9287c5b3c03SBram Moolenaar else 9297c5b3c03SBram Moolenaar try 9307c5b3c03SBram Moolenaar endtry 9317c5b3c03SBram Moolenaar endif 9327c5b3c03SBram Moolenaarenddef 9337c5b3c03SBram Moolenaar 9347c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9357c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9367c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9377c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9387c5b3c03SBram Moolenaarenddef 9397c5b3c03SBram Moolenaar 9407c5b3c03SBram Moolenaar 9417c5b3c03SBram Moolenaar 942006ad48bSBram Moolenaardef Test_throw_vimscript() 943f5be8cdbSBram Moolenaar # only checks line continuation 944cfcd011fSBram Moolenaar var lines =<< trim END 945006ad48bSBram Moolenaar vim9script 946006ad48bSBram Moolenaar try 947006ad48bSBram Moolenaar throw 'one' 948006ad48bSBram Moolenaar .. 'two' 949006ad48bSBram Moolenaar catch 950006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 951006ad48bSBram Moolenaar endtry 952006ad48bSBram Moolenaar END 953006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9541e021e63SBram Moolenaar 9551e021e63SBram Moolenaar lines =<< trim END 9561e021e63SBram Moolenaar vim9script 957352134bbSBram Moolenaar @r = '' 9581e021e63SBram Moolenaar def Func() 9591e021e63SBram Moolenaar throw @r 9601e021e63SBram Moolenaar enddef 9611e021e63SBram Moolenaar var result = '' 9621e021e63SBram Moolenaar try 9631e021e63SBram Moolenaar Func() 9641e021e63SBram Moolenaar catch /E1129:/ 9651e021e63SBram Moolenaar result = 'caught' 9661e021e63SBram Moolenaar endtry 9671e021e63SBram Moolenaar assert_equal('caught', result) 9681e021e63SBram Moolenaar END 9691e021e63SBram Moolenaar CheckScriptSuccess(lines) 970006ad48bSBram Moolenaarenddef 971006ad48bSBram Moolenaar 972ed677f55SBram Moolenaardef Test_error_in_nested_function() 97303dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 974cfcd011fSBram Moolenaar var lines =<< trim END 975ed677f55SBram Moolenaar vim9script 976ed677f55SBram Moolenaar def Func() 977ed677f55SBram Moolenaar Error() 978ed677f55SBram Moolenaar g:test_var = 1 979ed677f55SBram Moolenaar enddef 980ed677f55SBram Moolenaar func Error() abort 981ed677f55SBram Moolenaar eval [][0] 982ed677f55SBram Moolenaar endfunc 983ed677f55SBram Moolenaar Func() 984ed677f55SBram Moolenaar END 985ed677f55SBram Moolenaar g:test_var = 0 986ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 987ed677f55SBram Moolenaar assert_equal(0, g:test_var) 988ed677f55SBram Moolenaarenddef 989ed677f55SBram Moolenaar 990227c58a4SBram Moolenaardef Test_abort_after_error() 991227c58a4SBram Moolenaar var lines =<< trim END 992227c58a4SBram Moolenaar vim9script 993227c58a4SBram Moolenaar while true 994227c58a4SBram Moolenaar echo notfound 995227c58a4SBram Moolenaar endwhile 996227c58a4SBram Moolenaar g:gotthere = true 997227c58a4SBram Moolenaar END 998227c58a4SBram Moolenaar g:gotthere = false 999227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 1000227c58a4SBram Moolenaar assert_false(g:gotthere) 1001227c58a4SBram Moolenaar unlet g:gotthere 1002227c58a4SBram Moolenaarenddef 1003227c58a4SBram Moolenaar 100437c83711SBram Moolenaardef Test_cexpr_vimscript() 1005f5be8cdbSBram Moolenaar # only checks line continuation 100637c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 1007cfcd011fSBram Moolenaar var lines =<< trim END 100837c83711SBram Moolenaar vim9script 100937c83711SBram Moolenaar cexpr 'File' 101037c83711SBram Moolenaar .. ' someFile' .. 101137c83711SBram Moolenaar ' line 19' 101237c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 101337c83711SBram Moolenaar END 101437c83711SBram Moolenaar CheckScriptSuccess(lines) 101537c83711SBram Moolenaar set errorformat& 101637c83711SBram Moolenaarenddef 101737c83711SBram Moolenaar 1018c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1019c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1020cfcd011fSBram Moolenaar var lines =<< trim END 1021c9edd6b5SBram Moolenaar vim9script 1022c9edd6b5SBram Moolenaar func g:Status() 1023c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1024c9edd6b5SBram Moolenaar endfunc 1025c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1026c9edd6b5SBram Moolenaar redrawstatus 1027c9edd6b5SBram Moolenaar set laststatus statusline= 1028c9edd6b5SBram Moolenaar END 1029c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1030c9edd6b5SBram Moolenaarenddef 1031c9edd6b5SBram Moolenaar 1032b209750bSBram Moolenaardef Test_list_vimscript() 1033b209750bSBram Moolenaar # checks line continuation and comments 1034cfcd011fSBram Moolenaar var lines =<< trim END 1035b209750bSBram Moolenaar vim9script 1036cfcd011fSBram Moolenaar var mylist = [ 1037b209750bSBram Moolenaar 'one', 1038b209750bSBram Moolenaar # comment 1039b209750bSBram Moolenaar 'two', # empty line follows 1040b209750bSBram Moolenaar 1041b209750bSBram Moolenaar 'three', 1042b209750bSBram Moolenaar ] 1043b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1044b209750bSBram Moolenaar END 1045b209750bSBram Moolenaar CheckScriptSuccess(lines) 104666250c93SBram Moolenaar 104766250c93SBram Moolenaar # check all lines from heredoc are kept 104866250c93SBram Moolenaar lines =<< trim END 104966250c93SBram Moolenaar # comment 1 105066250c93SBram Moolenaar two 105166250c93SBram Moolenaar # comment 3 105266250c93SBram Moolenaar 105366250c93SBram Moolenaar five 105466250c93SBram Moolenaar # comment 6 105566250c93SBram Moolenaar END 105666250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10574bce26bbSBram Moolenaar 10584bce26bbSBram Moolenaar lines =<< trim END 10594bce26bbSBram Moolenaar [{ 10604bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10614bce26bbSBram Moolenaar END 10624bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1063b209750bSBram Moolenaarenddef 1064b209750bSBram Moolenaar 10652a1381c3SBram Moolenaarif has('channel') 106640ee466cSBram Moolenaar let someJob = test_null_job() 106740ee466cSBram Moolenaar 106840ee466cSBram Moolenaar def FuncWithError() 106940ee466cSBram Moolenaar echomsg g:someJob 107040ee466cSBram Moolenaar enddef 107140ee466cSBram Moolenaar 107240ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 107340ee466cSBram Moolenaar try 107440ee466cSBram Moolenaar call FuncWithError() 107540ee466cSBram Moolenaar catch 107640ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 107740ee466cSBram Moolenaar endtry 107840ee466cSBram Moolenaar endfunc 10792a1381c3SBram Moolenaarendif 108040ee466cSBram Moolenaar 10818a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10828a7d6542SBram Moolenaar vim9script 1083cfcd011fSBram Moolenaar var name: string = 'bob' 10848a7d6542SBram Moolenaar def Concat(arg: string): string 10858a7d6542SBram Moolenaar return name .. arg 10868a7d6542SBram Moolenaar enddef 1087227a69deSBram Moolenaar g:result = Concat('bie') 1088227a69deSBram Moolenaar g:localname = name 10898a7d6542SBram Moolenaar 10908a7d6542SBram Moolenaar export const CONST = 1234 1091cfcd011fSBram Moolenaar export var exported = 9876 1092cfcd011fSBram Moolenaar export var exp_name = 'John' 10938a7d6542SBram Moolenaar export def Exported(): string 10948a7d6542SBram Moolenaar return 'Exported' 10958a7d6542SBram Moolenaar enddef 109624e93165SBram Moolenaar export def ExportedValue(): number 109724e93165SBram Moolenaar return exported 109824e93165SBram Moolenaar enddef 109924e93165SBram Moolenaar export def ExportedInc() 110024e93165SBram Moolenaar exported += 5 110124e93165SBram Moolenaar enddef 11020f2a5cc6SBram Moolenaar export final theList = [1] 11038a7d6542SBram MoolenaarEND 11048a7d6542SBram Moolenaar 1105b3ca9824SBram Moolenaardef Undo_export_script_lines() 1106b3ca9824SBram Moolenaar unlet g:result 1107b3ca9824SBram Moolenaar unlet g:localname 1108b3ca9824SBram Moolenaarenddef 1109b3ca9824SBram Moolenaar 11105269bd2aSBram Moolenaardef Test_vim9_import_export() 1111cfcd011fSBram Moolenaar var import_script_lines =<< trim END 11128a7d6542SBram Moolenaar vim9script 111324e93165SBram Moolenaar import {exported, Exported, ExportedValue} from './Xexport.vim' 111424e93165SBram Moolenaar g:exported1 = exported 11156e587dcbSBram Moolenaar exported += 3 111624e93165SBram Moolenaar g:exported2 = exported 111724e93165SBram Moolenaar g:exported3 = ExportedValue() 111824e93165SBram Moolenaar 111924e93165SBram Moolenaar import ExportedInc from './Xexport.vim' 112024e93165SBram Moolenaar ExportedInc() 112124e93165SBram Moolenaar g:exported_i1 = exported 112224e93165SBram Moolenaar g:exported_i2 = ExportedValue() 112324e93165SBram Moolenaar 112424e93165SBram Moolenaar exported = 11 112524e93165SBram Moolenaar g:exported_s1 = exported 112624e93165SBram Moolenaar g:exported_s2 = ExportedValue() 112724e93165SBram Moolenaar 11288a7d6542SBram Moolenaar g:imported_func = Exported() 11296e587dcbSBram Moolenaar 113040f4f7a4SBram Moolenaar def GetExported(): string 1131e0de171eSBram Moolenaar var local_dict = {ref: Exported} 113240f4f7a4SBram Moolenaar return local_dict.ref() 113340f4f7a4SBram Moolenaar enddef 113440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 113540f4f7a4SBram Moolenaar 11364db572eeSBram Moolenaar var dir = './' 11374db572eeSBram Moolenaar var ext = ".vim" 11384db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 11396e587dcbSBram Moolenaar g:imported_name = exp_name 11406e587dcbSBram Moolenaar exp_name ..= ' Doe' 11416e587dcbSBram Moolenaar g:imported_name_appended = exp_name 114224e93165SBram Moolenaar g:exported_later = exported 11430f2a5cc6SBram Moolenaar 11440f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11450f2a5cc6SBram Moolenaar theList->add(2) 11460f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 11478a7d6542SBram Moolenaar END 11488a7d6542SBram Moolenaar 11498a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11508a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11518a7d6542SBram Moolenaar 11528a7d6542SBram Moolenaar source Ximport.vim 11538a7d6542SBram Moolenaar 11548a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11558a7d6542SBram Moolenaar assert_equal('bob', g:localname) 115624e93165SBram Moolenaar assert_equal(9876, g:exported1) 115724e93165SBram Moolenaar assert_equal(9879, g:exported2) 115824e93165SBram Moolenaar assert_equal(9879, g:exported3) 115924e93165SBram Moolenaar 116024e93165SBram Moolenaar assert_equal(9884, g:exported_i1) 116124e93165SBram Moolenaar assert_equal(9884, g:exported_i2) 116224e93165SBram Moolenaar 116324e93165SBram Moolenaar assert_equal(11, g:exported_s1) 116424e93165SBram Moolenaar assert_equal(11, g:exported_s2) 116524e93165SBram Moolenaar assert_equal(11, g:exported_later) 116624e93165SBram Moolenaar 11678a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 116840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11696e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11706e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11718a7d6542SBram Moolenaar assert_false(exists('g:name')) 11728a7d6542SBram Moolenaar 1173b3ca9824SBram Moolenaar Undo_export_script_lines() 117424e93165SBram Moolenaar unlet g:exported1 117524e93165SBram Moolenaar unlet g:exported2 117624e93165SBram Moolenaar unlet g:exported3 117724e93165SBram Moolenaar unlet g:exported_i1 117824e93165SBram Moolenaar unlet g:exported_i2 117924e93165SBram Moolenaar unlet g:exported_later 11808a7d6542SBram Moolenaar unlet g:imported_func 11816e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11828a7d6542SBram Moolenaar delete('Ximport.vim') 1183f2d5c240SBram Moolenaar 11841c991144SBram Moolenaar # similar, with line breaks 1185cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11861c991144SBram Moolenaar vim9script 11871c991144SBram Moolenaar import { 11881c991144SBram Moolenaar exported, 11891c991144SBram Moolenaar Exported, 11901c991144SBram Moolenaar } 11911c991144SBram Moolenaar from 11921c991144SBram Moolenaar './Xexport.vim' 119324e93165SBram Moolenaar g:exported = exported 119424e93165SBram Moolenaar exported += 7 119524e93165SBram Moolenaar g:exported_added = exported 11961c991144SBram Moolenaar g:imported_func = Exported() 11971c991144SBram Moolenaar END 11981c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11991c991144SBram Moolenaar source Ximport_lbr.vim 12001c991144SBram Moolenaar 120124e93165SBram Moolenaar assert_equal(11, g:exported) 120224e93165SBram Moolenaar assert_equal(18, g:exported_added) 12031c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 12041c991144SBram Moolenaar 12051c991144SBram Moolenaar # exported script not sourced again 12061c991144SBram Moolenaar assert_false(exists('g:result')) 120724e93165SBram Moolenaar unlet g:exported 120824e93165SBram Moolenaar unlet g:exported_added 12091c991144SBram Moolenaar unlet g:imported_func 12101c991144SBram Moolenaar delete('Ximport_lbr.vim') 12111c991144SBram Moolenaar 1212cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1213f2d5c240SBram Moolenaar vim9script 1214f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1215f2d5c240SBram Moolenaar def UseExport() 121624e93165SBram Moolenaar g:exported_def = Export.exported 1217f2d5c240SBram Moolenaar enddef 121824e93165SBram Moolenaar g:exported_script = Export.exported 1219cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1220cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1221f2d5c240SBram Moolenaar UseExport() 1222f2d5c240SBram Moolenaar END 1223f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1224f2d5c240SBram Moolenaar source Ximport.vim 122524e93165SBram Moolenaar 122624e93165SBram Moolenaar assert_equal(18, g:exported_def) 122724e93165SBram Moolenaar assert_equal(18, g:exported_script) 122824e93165SBram Moolenaar unlet g:exported_def 122924e93165SBram Moolenaar unlet g:exported_script 1230f2d5c240SBram Moolenaar 1231cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1232599c89c8SBram Moolenaar vim9script 1233599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1234599c89c8SBram Moolenaar def Func() 1235cfcd011fSBram Moolenaar var dummy = 1 1236cfcd011fSBram Moolenaar var imported = Export + dummy 1237599c89c8SBram Moolenaar enddef 1238822ba247SBram Moolenaar defcompile 1239599c89c8SBram Moolenaar END 1240599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 124144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1242599c89c8SBram Moolenaar 1243cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1244599c89c8SBram Moolenaar vim9script 1245599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1246599c89c8SBram Moolenaar def Func() 1247cfcd011fSBram Moolenaar var imported = Export . exported 1248599c89c8SBram Moolenaar enddef 1249822ba247SBram Moolenaar defcompile 1250599c89c8SBram Moolenaar END 1251599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 125244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1253599c89c8SBram Moolenaar 1254921ba529SBram Moolenaar var import_func_duplicated =<< trim END 1255921ba529SBram Moolenaar vim9script 1256921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1257921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1258921ba529SBram Moolenaar 1259921ba529SBram Moolenaar ExportedInc() 1260921ba529SBram Moolenaar END 1261921ba529SBram Moolenaar writefile(import_func_duplicated, 'Ximport.vim') 1262921ba529SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 1263921ba529SBram Moolenaar 1264a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1265a6294955SBram Moolenaar vim9script 1266a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1267a6294955SBram Moolenaar var some = 'other' 1268a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1269a6294955SBram Moolenaar defcompile 1270a6294955SBram Moolenaar END 1271a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1272a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1273a6294955SBram Moolenaar 1274cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1275cb4e80faSBram Moolenaar vim9script 1276cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1277cb4e80faSBram Moolenaar g:imported_script = Export exported 1278cb4e80faSBram Moolenaar END 1279cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1280cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1281cb4e80faSBram Moolenaar 1282cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1283cb4e80faSBram Moolenaar vim9script 1284cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1285cb4e80faSBram Moolenaar g:imported_script = Export. exported 1286cb4e80faSBram Moolenaar END 1287cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1288cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1289cb4e80faSBram Moolenaar 1290cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1291599c89c8SBram Moolenaar vim9script 1292599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1293599c89c8SBram Moolenaar def Func() 1294cfcd011fSBram Moolenaar var imported = Export. 1295599c89c8SBram Moolenaar enddef 1296822ba247SBram Moolenaar defcompile 1297599c89c8SBram Moolenaar END 1298599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 129944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1300599c89c8SBram Moolenaar 1301cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 13021c991144SBram Moolenaar vim9script 13031c991144SBram Moolenaar import * 13041c991144SBram Moolenaar as Export 13051c991144SBram Moolenaar from 13061c991144SBram Moolenaar './Xexport.vim' 13071c991144SBram Moolenaar def UseExport() 130824e93165SBram Moolenaar g:exported = Export.exported 13091c991144SBram Moolenaar enddef 13101c991144SBram Moolenaar UseExport() 13111c991144SBram Moolenaar END 13121c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13131c991144SBram Moolenaar source Ximport.vim 131424e93165SBram Moolenaar assert_equal(18, g:exported) 131524e93165SBram Moolenaar unlet g:exported 13161c991144SBram Moolenaar 1317cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1318f2d5c240SBram Moolenaar vim9script 1319f2d5c240SBram Moolenaar import * from './Xexport.vim' 1320f2d5c240SBram Moolenaar END 1321f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 132244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1323f2d5c240SBram Moolenaar 1324f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1325cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1326fa29c8abSBram Moolenaar vim9script 1327fa29c8abSBram Moolenaar import name from './Xexport.vim' 1328fa29c8abSBram Moolenaar END 1329fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 133044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1331fa29c8abSBram Moolenaar 1332f5be8cdbSBram Moolenaar # try to import something that is already defined 1333cfcd011fSBram Moolenaar var import_already_defined =<< trim END 13345269bd2aSBram Moolenaar vim9script 1335cfcd011fSBram Moolenaar var exported = 'something' 13365269bd2aSBram Moolenaar import exported from './Xexport.vim' 13375269bd2aSBram Moolenaar END 13385269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1339057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13405269bd2aSBram Moolenaar 1341f5be8cdbSBram Moolenaar # try to import something that is already defined 13425269bd2aSBram Moolenaar import_already_defined =<< trim END 13435269bd2aSBram Moolenaar vim9script 1344cfcd011fSBram Moolenaar var exported = 'something' 13455269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13465269bd2aSBram Moolenaar END 13475269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1348057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13495269bd2aSBram Moolenaar 1350f5be8cdbSBram Moolenaar # try to import something that is already defined 13515269bd2aSBram Moolenaar import_already_defined =<< trim END 13525269bd2aSBram Moolenaar vim9script 1353cfcd011fSBram Moolenaar var exported = 'something' 13545269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13555269bd2aSBram Moolenaar END 13565269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1357057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13585269bd2aSBram Moolenaar 1359918a4249SBram Moolenaar # try changing an imported const 1360918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1361918a4249SBram Moolenaar vim9script 1362918a4249SBram Moolenaar import CONST from './Xexport.vim' 1363918a4249SBram Moolenaar def Assign() 1364918a4249SBram Moolenaar CONST = 987 1365918a4249SBram Moolenaar enddef 1366918a4249SBram Moolenaar defcompile 1367918a4249SBram Moolenaar END 1368918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1369918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1370918a4249SBram Moolenaar 13710f2a5cc6SBram Moolenaar # try changing an imported final 13720f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13730f2a5cc6SBram Moolenaar vim9script 13740f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13750f2a5cc6SBram Moolenaar def Assign() 13760f2a5cc6SBram Moolenaar theList = [2] 13770f2a5cc6SBram Moolenaar enddef 13780f2a5cc6SBram Moolenaar defcompile 13790f2a5cc6SBram Moolenaar END 13800f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13810f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13820f2a5cc6SBram Moolenaar 1383f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1384cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1385fa29c8abSBram Moolenaar vim9script 1386fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1387fa29c8abSBram Moolenaar END 1388fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 138944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1390fa29c8abSBram Moolenaar 1391cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1392fa29c8abSBram Moolenaar vim9script 1393fa29c8abSBram Moolenaar import name './Xexport.vim' 1394fa29c8abSBram Moolenaar END 1395fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 139644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1397fa29c8abSBram Moolenaar 1398cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1399fa29c8abSBram Moolenaar vim9script 1400fa29c8abSBram Moolenaar import name from Xexport.vim 1401fa29c8abSBram Moolenaar END 1402fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 14034db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1404fa29c8abSBram Moolenaar 1405cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1406fa29c8abSBram Moolenaar vim9script 1407fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1408fa29c8abSBram Moolenaar END 1409fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 141044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1411fa29c8abSBram Moolenaar 1412cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1413fa29c8abSBram Moolenaar vim9script 1414fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1415fa29c8abSBram Moolenaar END 14165269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 141744d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1418fa29c8abSBram Moolenaar 141960579350SBram Moolenaar var import_redefining_lines =<< trim END 142060579350SBram Moolenaar vim9script 142160579350SBram Moolenaar import exported from './Xexport.vim' 142260579350SBram Moolenaar var exported = 5 142360579350SBram Moolenaar END 142460579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 142560579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 142660579350SBram Moolenaar 142760579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 142860579350SBram Moolenaar vim9script 142960579350SBram Moolenaar import exported from './Xexport.vim' 143060579350SBram Moolenaar exported = 'xxx' 143160579350SBram Moolenaar END 143260579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 143360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 143460579350SBram Moolenaar 143560579350SBram Moolenaar var import_assign_const_lines =<< trim END 143660579350SBram Moolenaar vim9script 143760579350SBram Moolenaar import CONST from './Xexport.vim' 143860579350SBram Moolenaar CONST = 4321 143960579350SBram Moolenaar END 144060579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 144160579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 144260579350SBram Moolenaar 1443f2d5c240SBram Moolenaar delete('Ximport.vim') 14445269bd2aSBram Moolenaar delete('Ximport3.vim') 14458a7d6542SBram Moolenaar delete('Xexport.vim') 14468a7d6542SBram Moolenaar 1447f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14483e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14493e191694SBram Moolenaar set cpo=abcd 1450cfcd011fSBram Moolenaar var lines =<< trim END 1451750802b5SBram Moolenaar vim9script 1452750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14533e191694SBram Moolenaar set cpo+=f 14543e191694SBram Moolenaar set cpo-=c 14553e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1456750802b5SBram Moolenaar END 1457750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1458750802b5SBram Moolenaar source Xvim9_script 14593e191694SBram Moolenaar assert_equal('fabd', &cpo) 1460750802b5SBram Moolenaar set cpo&vim 1461750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14623e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14633e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14643e191694SBram Moolenaar 1465750802b5SBram Moolenaar delete('Xvim9_script') 1466750802b5SBram Moolenaarenddef 1467750802b5SBram Moolenaar 14680a84284eSBram Moolenaardef Test_import_as() 14690a84284eSBram Moolenaar var export_lines =<< trim END 14700a84284eSBram Moolenaar vim9script 14710a84284eSBram Moolenaar export var one = 1 14720a84284eSBram Moolenaar export var yes = 'yes' 1473c967d57aSBram Moolenaar export var slist: list<string> 14740a84284eSBram Moolenaar END 14750a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14760a84284eSBram Moolenaar 14770a84284eSBram Moolenaar var import_lines =<< trim END 14780a84284eSBram Moolenaar vim9script 14796c7cc347SBram Moolenaar var one = 'notused' 14806c7cc347SBram Moolenaar var yes = 777 14810a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14820a84284eSBram Moolenaar assert_equal(1, thatOne) 14830a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14840a84284eSBram Moolenaar assert_equal('yes', yesYes) 14850a84284eSBram Moolenaar END 14860a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14870a84284eSBram Moolenaar 14880a84284eSBram Moolenaar import_lines =<< trim END 14890a84284eSBram Moolenaar vim9script 14900a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14910a84284eSBram Moolenaar assert_equal(1, thatOne) 14920a84284eSBram Moolenaar assert_equal('yes', yesYes) 14930a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14940a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14950a84284eSBram Moolenaar END 14960a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14970a84284eSBram Moolenaar 1498c967d57aSBram Moolenaar import_lines =<< trim END 1499c967d57aSBram Moolenaar vim9script 1500c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1501c967d57aSBram Moolenaar impSlist->add(123) 1502c967d57aSBram Moolenaar END 1503c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1504c967d57aSBram Moolenaar 15050a84284eSBram Moolenaar delete('XexportAs') 15060a84284eSBram Moolenaarenddef 15070a84284eSBram Moolenaar 1508803af686SBram Moolenaarfunc g:Trigger() 1509803af686SBram Moolenaar source Ximport.vim 1510803af686SBram Moolenaar return "echo 'yes'\<CR>" 1511803af686SBram Moolenaarendfunc 1512803af686SBram Moolenaar 1513803af686SBram Moolenaardef Test_import_export_expr_map() 1514803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1515cfcd011fSBram Moolenaar var export_lines =<< trim END 1516803af686SBram Moolenaar vim9script 1517803af686SBram Moolenaar export def That(): string 1518803af686SBram Moolenaar return 'yes' 1519803af686SBram Moolenaar enddef 1520803af686SBram Moolenaar END 1521803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1522803af686SBram Moolenaar 1523cfcd011fSBram Moolenaar var import_lines =<< trim END 1524803af686SBram Moolenaar vim9script 1525803af686SBram Moolenaar import That from './Xexport_that.vim' 1526803af686SBram Moolenaar assert_equal('yes', That()) 1527803af686SBram Moolenaar END 1528803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1529803af686SBram Moolenaar 1530803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1531803af686SBram Moolenaar feedkeys('trigger', "xt") 1532803af686SBram Moolenaar 1533730b2483SBram Moolenaar delete('Xexport_that.vim') 1534803af686SBram Moolenaar delete('Ximport.vim') 1535803af686SBram Moolenaar nunmap trigger 1536803af686SBram Moolenaarenddef 1537803af686SBram Moolenaar 15388e1986e3SBram Moolenaardef Test_import_in_filetype() 15398e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15408e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1541cfcd011fSBram Moolenaar var export_lines =<< trim END 15428e1986e3SBram Moolenaar vim9script 1543cfcd011fSBram Moolenaar export var That = 'yes' 15448e1986e3SBram Moolenaar END 1545730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15468e1986e3SBram Moolenaar 1547cfcd011fSBram Moolenaar var import_lines =<< trim END 15488e1986e3SBram Moolenaar vim9script 1549730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15508e1986e3SBram Moolenaar assert_equal('yes', That) 15518e1986e3SBram Moolenaar g:did_load_mytpe = 1 15528e1986e3SBram Moolenaar END 15538e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15548e1986e3SBram Moolenaar 1555cfcd011fSBram Moolenaar var save_rtp = &rtp 15568e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15578e1986e3SBram Moolenaar 15588e1986e3SBram Moolenaar filetype plugin on 15598e1986e3SBram Moolenaar copen 15608e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15618e1986e3SBram Moolenaar 15628e1986e3SBram Moolenaar quit! 1563730b2483SBram Moolenaar delete('Xexport_ft.vim') 15648e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15658e1986e3SBram Moolenaar &rtp = save_rtp 15668e1986e3SBram Moolenaarenddef 15678e1986e3SBram Moolenaar 1568efa94447SBram Moolenaardef Test_use_import_in_mapping() 1569cfcd011fSBram Moolenaar var lines =<< trim END 1570efa94447SBram Moolenaar vim9script 1571efa94447SBram Moolenaar export def Funcx() 1572efa94447SBram Moolenaar g:result = 42 1573efa94447SBram Moolenaar enddef 1574efa94447SBram Moolenaar END 1575efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1576efa94447SBram Moolenaar lines =<< trim END 1577efa94447SBram Moolenaar vim9script 1578efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1579b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1580efa94447SBram Moolenaar END 1581efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1582efa94447SBram Moolenaar 1583efa94447SBram Moolenaar source Xmapscript.vim 1584b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1585efa94447SBram Moolenaar assert_equal(42, g:result) 1586efa94447SBram Moolenaar 1587efa94447SBram Moolenaar unlet g:result 1588efa94447SBram Moolenaar delete('XsomeExport.vim') 1589efa94447SBram Moolenaar delete('Xmapscript.vim') 1590b3ca9824SBram Moolenaar nunmap <F3> 1591efa94447SBram Moolenaarenddef 1592efa94447SBram Moolenaar 1593d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1594d3f8a9eeSBram Moolenaar var lines =<< trim END 1595d3f8a9eeSBram Moolenaar if has(g:feature) 1596d3f8a9eeSBram Moolenaar " legacy script 1597d3f8a9eeSBram Moolenaar let g:legacy = 1 1598d3f8a9eeSBram Moolenaar finish 1599d3f8a9eeSBram Moolenaar endif 1600d3f8a9eeSBram Moolenaar vim9script 1601d3f8a9eeSBram Moolenaar g:legacy = 0 1602d3f8a9eeSBram Moolenaar END 1603d3f8a9eeSBram Moolenaar g:feature = 'eval' 1604d3f8a9eeSBram Moolenaar g:legacy = -1 1605d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1606d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1607d3f8a9eeSBram Moolenaar 1608d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1609d3f8a9eeSBram Moolenaar g:legacy = -1 1610d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1611d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1612d3f8a9eeSBram Moolenaarenddef 1613d3f8a9eeSBram Moolenaar 1614750802b5SBram Moolenaardef Test_vim9script_fails() 16158a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16168a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1617cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16189721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1619cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1620750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1621750802b5SBram Moolenaar 1622cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1623c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1624c785b9a7SBram Moolenaar 1625e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1626e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16278a7d6542SBram Moolenaarenddef 16288a7d6542SBram Moolenaar 1629f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1630101f4810SBram Moolenaar CheckRunVimInTerminal 1631101f4810SBram Moolenaar 16329bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1633c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16349bb3eb3eSBram Moolenaarendfunc 16359bb3eb3eSBram Moolenaar 1636c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1637cfcd011fSBram Moolenaar var export =<< trim END 1638101f4810SBram Moolenaar vim9script 1639101f4810SBram Moolenaar export def Foo(): number 1640101f4810SBram Moolenaar return 0 1641101f4810SBram Moolenaar enddef 1642101f4810SBram Moolenaar END 1643730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1644101f4810SBram Moolenaar 1645e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16469bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16472949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1648101f4810SBram Moolenaar 1649730b2483SBram Moolenaar delete('XexportCmd.vim') 16509bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16519bb3eb3eSBram Moolenaarenddef 1652101f4810SBram Moolenaar 16532b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16542b32700dSBram Moolenaar var lines =<< trim END 1655a6294955SBram Moolenaar vim9script 1656a6294955SBram Moolenaar export var exported = 'thexport' 165760dc8274SBram Moolenaar 165860dc8274SBram Moolenaar export def TheFunc(x = 0) 165960dc8274SBram Moolenaar enddef 1660a6294955SBram Moolenaar END 1661a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1662a6294955SBram Moolenaar lines =<< trim END 16632b32700dSBram Moolenaar vim9script noclear 16642b32700dSBram Moolenaar g:loadCount += 1 16652b32700dSBram Moolenaar var s:reloaded = 'init' 1666a6294955SBram Moolenaar import exported from './XExportReload' 16672b32700dSBram Moolenaar 16682b32700dSBram Moolenaar def Again(): string 16692b32700dSBram Moolenaar return 'again' 16702b32700dSBram Moolenaar enddef 16712b32700dSBram Moolenaar 167260dc8274SBram Moolenaar import TheFunc from './XExportReload' 167360dc8274SBram Moolenaar TheFunc() 167460dc8274SBram Moolenaar 16752b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16762b32700dSBram Moolenaar var s:loaded = true 16772b32700dSBram Moolenaar 16782b32700dSBram Moolenaar var s:notReloaded = 'yes' 16792b32700dSBram Moolenaar s:reloaded = 'first' 16802b32700dSBram Moolenaar def g:Values(): list<string> 1681a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16822b32700dSBram Moolenaar enddef 16832b32700dSBram Moolenaar 16842b32700dSBram Moolenaar def Once(): string 16852b32700dSBram Moolenaar return 'once' 16862b32700dSBram Moolenaar enddef 16872b32700dSBram Moolenaar END 16882b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16892b32700dSBram Moolenaar g:loadCount = 0 16902b32700dSBram Moolenaar source XReloaded 16912b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1692a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16932b32700dSBram Moolenaar source XReloaded 16942b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1695a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16962b32700dSBram Moolenaar source XReloaded 16972b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1698a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16992b32700dSBram Moolenaar 170048e11c10SBram Moolenaar delete('XReloaded') 1701a6294955SBram Moolenaar delete('XExportReload') 17022b32700dSBram Moolenaar delfunc g:Values 17032b32700dSBram Moolenaar unlet g:loadCount 1704577dc93dSBram Moolenaar 1705577dc93dSBram Moolenaar lines =<< trim END 1706577dc93dSBram Moolenaar vim9script 1707577dc93dSBram Moolenaar def Inner() 1708577dc93dSBram Moolenaar enddef 1709577dc93dSBram Moolenaar END 1710577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1711577dc93dSBram Moolenaar source XreloadScript.vim 1712577dc93dSBram Moolenaar 1713577dc93dSBram Moolenaar lines =<< trim END 1714577dc93dSBram Moolenaar vim9script 1715577dc93dSBram Moolenaar def Outer() 1716577dc93dSBram Moolenaar def Inner() 1717577dc93dSBram Moolenaar enddef 1718577dc93dSBram Moolenaar enddef 1719577dc93dSBram Moolenaar defcompile 1720577dc93dSBram Moolenaar END 1721577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1722577dc93dSBram Moolenaar source XreloadScript.vim 1723577dc93dSBram Moolenaar 1724577dc93dSBram Moolenaar delete('XreloadScript.vim') 17252b32700dSBram Moolenaarenddef 17262b32700dSBram Moolenaar 17274c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1728cfcd011fSBram Moolenaar var lines =<< trim END 17298a7d6542SBram Moolenaar vim9script 17308a7d6542SBram Moolenaar const var = '' 1731cfcd011fSBram Moolenaar var valone = 1234 17328a7d6542SBram Moolenaar def MyFunc(arg: string) 17338a7d6542SBram Moolenaar valone = 5678 17348a7d6542SBram Moolenaar enddef 17358a7d6542SBram Moolenaar END 1736cfcd011fSBram Moolenaar var morelines =<< trim END 1737cfcd011fSBram Moolenaar var valtwo = 222 17388a7d6542SBram Moolenaar export def GetValtwo(): number 17398a7d6542SBram Moolenaar return valtwo 17408a7d6542SBram Moolenaar enddef 17418a7d6542SBram Moolenaar END 174203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17438a7d6542SBram Moolenaar source Xreload.vim 17448a7d6542SBram Moolenaar source Xreload.vim 17458a7d6542SBram Moolenaar source Xreload.vim 17468a7d6542SBram Moolenaar 1747f5be8cdbSBram Moolenaar # cannot declare a var twice 17488a7d6542SBram Moolenaar lines =<< trim END 17498a7d6542SBram Moolenaar vim9script 1750cfcd011fSBram Moolenaar var valone = 1234 1751cfcd011fSBram Moolenaar var valone = 5678 17528a7d6542SBram Moolenaar END 17538a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 175444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17558a7d6542SBram Moolenaar 17568a7d6542SBram Moolenaar delete('Xreload.vim') 17578a7d6542SBram Moolenaar delete('Ximport.vim') 17588a7d6542SBram Moolenaarenddef 17598a7d6542SBram Moolenaar 176007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 176107a65d26SBram Moolenaar" compiled function using that variable must fail. 176207a65d26SBram Moolenaardef Test_script_reload_change_type() 176307a65d26SBram Moolenaar var lines =<< trim END 176407a65d26SBram Moolenaar vim9script noclear 176507a65d26SBram Moolenaar var str = 'string' 176607a65d26SBram Moolenaar def g:GetStr(): string 176707a65d26SBram Moolenaar return str .. 'xxx' 176807a65d26SBram Moolenaar enddef 176907a65d26SBram Moolenaar END 177007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 177107a65d26SBram Moolenaar source Xreload.vim 177207a65d26SBram Moolenaar echo g:GetStr() 177307a65d26SBram Moolenaar 177407a65d26SBram Moolenaar lines =<< trim END 177507a65d26SBram Moolenaar vim9script noclear 177607a65d26SBram Moolenaar var str = 1234 177707a65d26SBram Moolenaar END 177807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 177907a65d26SBram Moolenaar source Xreload.vim 178007a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 178107a65d26SBram Moolenaar 178207a65d26SBram Moolenaar delfunc g:GetStr 178307a65d26SBram Moolenaar delete('Xreload.vim') 178407a65d26SBram Moolenaarenddef 178507a65d26SBram Moolenaar 1786c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1787c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1788c970e422SBram Moolenaar 1789c970e422SBram Moolenaardef Test_script_reload_from_function() 1790c970e422SBram Moolenaar var lines =<< trim END 1791c970e422SBram Moolenaar vim9script 1792c970e422SBram Moolenaar 1793c970e422SBram Moolenaar if exists('g:loaded') 1794c970e422SBram Moolenaar finish 1795c970e422SBram Moolenaar endif 1796c970e422SBram Moolenaar g:loaded = 1 1797c970e422SBram Moolenaar delcommand CallFunc 1798c970e422SBram Moolenaar command CallFunc Func() 1799c970e422SBram Moolenaar def Func() 1800a4c81beaSBram Moolenaar so XreloadFunc.vim 1801c970e422SBram Moolenaar g:didTheFunc = 1 1802c970e422SBram Moolenaar enddef 1803c970e422SBram Moolenaar END 1804c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1805c970e422SBram Moolenaar source XreloadFunc.vim 1806c970e422SBram Moolenaar CallFunc 1807c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1808c970e422SBram Moolenaar 1809c970e422SBram Moolenaar delete('XreloadFunc.vim') 1810c970e422SBram Moolenaar delcommand CallFunc 1811c970e422SBram Moolenaar unlet g:loaded 1812c970e422SBram Moolenaar unlet g:didTheFunc 1813c970e422SBram Moolenaarenddef 1814c970e422SBram Moolenaar 18156c3843caSBram Moolenaardef Test_script_var_shadows_function() 18166c3843caSBram Moolenaar var lines =<< trim END 18176c3843caSBram Moolenaar vim9script 18186c3843caSBram Moolenaar def Func(): number 18196c3843caSBram Moolenaar return 123 18206c3843caSBram Moolenaar enddef 18216c3843caSBram Moolenaar var Func = 1 18226c3843caSBram Moolenaar END 18236c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18246c3843caSBram Moolenaarenddef 18256c3843caSBram Moolenaar 1826c323527dSBram Moolenaardef Test_script_var_shadows_command() 1827c323527dSBram Moolenaar var lines =<< trim END 1828c323527dSBram Moolenaar var undo = 1 1829c323527dSBram Moolenaar undo = 2 1830c323527dSBram Moolenaar assert_equal(2, undo) 1831c323527dSBram Moolenaar END 1832c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1833c323527dSBram Moolenaar 1834c323527dSBram Moolenaar lines =<< trim END 1835c323527dSBram Moolenaar var undo = 1 1836c323527dSBram Moolenaar undo 1837c323527dSBram Moolenaar END 1838c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1839c323527dSBram Moolenaarenddef 1840c323527dSBram Moolenaar 184195006e3dSBram Moolenaardef s:RetSome(): string 184295006e3dSBram Moolenaar return 'some' 184395006e3dSBram Moolenaarenddef 184495006e3dSBram Moolenaar 1845fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1846fe465a01SBram Moolenaar" script-local name. 1847fe465a01SBram Moolenaardef Test_vim9script_funcref() 1848cfcd011fSBram Moolenaar var sortlines =<< trim END 1849fe465a01SBram Moolenaar vim9script 1850fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1851bed36b93SBram Moolenaar return i2 - i1 1852fe465a01SBram Moolenaar enddef 1853fe465a01SBram Moolenaar 1854fe465a01SBram Moolenaar export def FastSort(): list<number> 1855fe465a01SBram Moolenaar return range(5)->sort(Compare) 1856fe465a01SBram Moolenaar enddef 1857529fb5a5SBram Moolenaar 1858529fb5a5SBram Moolenaar export def GetString(arg: string): string 1859529fb5a5SBram Moolenaar return arg 1860529fb5a5SBram Moolenaar enddef 1861fe465a01SBram Moolenaar END 1862fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1863fe465a01SBram Moolenaar 1864cfcd011fSBram Moolenaar var lines =<< trim END 1865fe465a01SBram Moolenaar vim9script 1866fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1867fe465a01SBram Moolenaar def Test() 1868fe465a01SBram Moolenaar g:result = FastSort() 1869fe465a01SBram Moolenaar enddef 1870fe465a01SBram Moolenaar Test() 1871529fb5a5SBram Moolenaar 1872529fb5a5SBram Moolenaar # using a function imported with "as" 1873529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1874529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1875529fb5a5SBram Moolenaar 1876529fb5a5SBram Moolenaar # using the function from a compiled function 1877529fb5a5SBram Moolenaar def TestMore(): string 1878ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1879ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1880529fb5a5SBram Moolenaar enddef 1881ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1882529fb5a5SBram Moolenaar 1883529fb5a5SBram Moolenaar # error when using a function that isn't exported 1884529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1885fe465a01SBram Moolenaar END 1886fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1887fe465a01SBram Moolenaar 1888fe465a01SBram Moolenaar source Xscript.vim 1889fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1890fe465a01SBram Moolenaar 1891fe465a01SBram Moolenaar unlet g:result 1892fe465a01SBram Moolenaar delete('Xsort.vim') 1893fe465a01SBram Moolenaar delete('Xscript.vim') 189495006e3dSBram Moolenaar 1895cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 189695006e3dSBram Moolenaar assert_equal('some', Funcref()) 1897fe465a01SBram Moolenaarenddef 1898fe465a01SBram Moolenaar 1899601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1900601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1901601e76acSBram Moolenaar" function reference. 1902c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1903cfcd011fSBram Moolenaar var filterLines =<< trim END 1904c620c055SBram Moolenaar vim9script 1905c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1906c620c055SBram Moolenaar return idx % 2 == 1 1907c620c055SBram Moolenaar enddef 1908c620c055SBram Moolenaar export def FastFilter(): list<number> 1909c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1910c620c055SBram Moolenaar enddef 1911601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1912601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1913601e76acSBram Moolenaar enddef 1914c620c055SBram Moolenaar END 1915c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1916c620c055SBram Moolenaar 1917cfcd011fSBram Moolenaar var lines =<< trim END 1918c620c055SBram Moolenaar vim9script 1919601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1920c620c055SBram Moolenaar def Test() 1921cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1922c620c055SBram Moolenaar enddef 1923c620c055SBram Moolenaar Test() 1924601e76acSBram Moolenaar def TestDirect() 1925cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1926601e76acSBram Moolenaar enddef 1927601e76acSBram Moolenaar TestDirect() 1928c620c055SBram Moolenaar END 1929601e76acSBram Moolenaar CheckScriptSuccess(lines) 1930c620c055SBram Moolenaar delete('Xfilter.vim') 1931c620c055SBram Moolenaarenddef 1932c620c055SBram Moolenaar 19334c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1934cfcd011fSBram Moolenaar var first_lines =<< trim END 19354c17ad94SBram Moolenaar vim9script 19364c17ad94SBram Moolenaar def FuncYes(): string 19374c17ad94SBram Moolenaar return 'yes' 19384c17ad94SBram Moolenaar enddef 19394c17ad94SBram Moolenaar END 1940cfcd011fSBram Moolenaar var withno_lines =<< trim END 19414c17ad94SBram Moolenaar def FuncNo(): string 19424c17ad94SBram Moolenaar return 'no' 19434c17ad94SBram Moolenaar enddef 19444c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19454c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19464c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 194703afdcf1SBram Moolenaar enddef 194803afdcf1SBram Moolenaar END 1949cfcd011fSBram Moolenaar var nono_lines =<< trim END 195003afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 195103afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 195244d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19534c17ad94SBram Moolenaar enddef 19544c17ad94SBram Moolenaar END 19554c17ad94SBram Moolenaar 19564c17ad94SBram Moolenaar # FuncNo() is defined 195703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19584c17ad94SBram Moolenaar source Xreloaded.vim 19594c17ad94SBram Moolenaar g:DoCheck(true) 19604c17ad94SBram Moolenaar 19614c17ad94SBram Moolenaar # FuncNo() is not redefined 196203afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19634c17ad94SBram Moolenaar source Xreloaded.vim 19645082471fSBram Moolenaar g:DoCheck(false) 19654c17ad94SBram Moolenaar 19664c17ad94SBram Moolenaar # FuncNo() is back 196703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19684c17ad94SBram Moolenaar source Xreloaded.vim 19695082471fSBram Moolenaar g:DoCheck(false) 19704c17ad94SBram Moolenaar 19714c17ad94SBram Moolenaar delete('Xreloaded.vim') 19724c17ad94SBram Moolenaarenddef 19734c17ad94SBram Moolenaar 197489483d40SBram Moolenaardef Test_vim9script_reload_delvar() 197589483d40SBram Moolenaar # write the script with a script-local variable 1976cfcd011fSBram Moolenaar var lines =<< trim END 197789483d40SBram Moolenaar vim9script 1978cfcd011fSBram Moolenaar var name = 'string' 197989483d40SBram Moolenaar END 198089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 198189483d40SBram Moolenaar source XreloadVar.vim 198289483d40SBram Moolenaar 198389483d40SBram Moolenaar # now write the script using the same variable locally - works 198489483d40SBram Moolenaar lines =<< trim END 198589483d40SBram Moolenaar vim9script 198689483d40SBram Moolenaar def Func() 1987cfcd011fSBram Moolenaar var name = 'string' 198889483d40SBram Moolenaar enddef 198989483d40SBram Moolenaar END 199089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 199189483d40SBram Moolenaar source XreloadVar.vim 199289483d40SBram Moolenaar 199389483d40SBram Moolenaar delete('XreloadVar.vim') 199489483d40SBram Moolenaarenddef 199589483d40SBram Moolenaar 19968a7d6542SBram Moolenaardef Test_import_absolute() 1997cfcd011fSBram Moolenaar var import_lines = [ 1998e6085c53SBram Moolenaar 'vim9script', 1999e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 2000e6085c53SBram Moolenaar 'def UseExported()', 2001e6085c53SBram Moolenaar ' g:imported_abs = exported', 2002e6085c53SBram Moolenaar ' exported = 8888', 2003e6085c53SBram Moolenaar ' g:imported_after = exported', 2004e6085c53SBram Moolenaar 'enddef', 2005e6085c53SBram Moolenaar 'UseExported()', 2006e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2007e6085c53SBram Moolenaar ] 20088a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20098a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20108a7d6542SBram Moolenaar 20118a7d6542SBram Moolenaar source Ximport_abs.vim 20128a7d6542SBram Moolenaar 20138a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20144e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2015fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2016fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2017fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2018fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2019fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2020fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2021fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2022fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2023fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2024fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2025e6085c53SBram Moolenaar g:import_disassembled) 2026b3ca9824SBram Moolenaar 2027b3ca9824SBram Moolenaar Undo_export_script_lines() 20288a7d6542SBram Moolenaar unlet g:imported_abs 20294e12a5dfSBram Moolenaar unlet g:import_disassembled 20308a7d6542SBram Moolenaar 20318a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20328a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20338a7d6542SBram Moolenaarenddef 20348a7d6542SBram Moolenaar 20358a7d6542SBram Moolenaardef Test_import_rtp() 2036cfcd011fSBram Moolenaar var import_lines = [ 2037e6085c53SBram Moolenaar 'vim9script', 2038e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2039e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2040e6085c53SBram Moolenaar ] 20418a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2042b885a7c7SBram Moolenaar mkdir('import', 'p') 2043b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20448a7d6542SBram Moolenaar 2045cfcd011fSBram Moolenaar var save_rtp = &rtp 20468a7d6542SBram Moolenaar &rtp = getcwd() 20478a7d6542SBram Moolenaar source Ximport_rtp.vim 20488a7d6542SBram Moolenaar &rtp = save_rtp 20498a7d6542SBram Moolenaar 20508a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20518a7d6542SBram Moolenaar 2052b3ca9824SBram Moolenaar Undo_export_script_lines() 2053b3ca9824SBram Moolenaar unlet g:imported_rtp 20548a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2055b885a7c7SBram Moolenaar delete('import', 'rf') 20568a7d6542SBram Moolenaarenddef 20578a7d6542SBram Moolenaar 205825e0f586SBram Moolenaardef Test_import_compile_error() 2059cfcd011fSBram Moolenaar var export_lines = [ 206025e0f586SBram Moolenaar 'vim9script', 206125e0f586SBram Moolenaar 'export def ExpFunc(): string', 206225e0f586SBram Moolenaar ' return notDefined', 206325e0f586SBram Moolenaar 'enddef', 206425e0f586SBram Moolenaar ] 206525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 206625e0f586SBram Moolenaar 2067cfcd011fSBram Moolenaar var import_lines = [ 206825e0f586SBram Moolenaar 'vim9script', 206925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 207025e0f586SBram Moolenaar 'def ImpFunc()', 207125e0f586SBram Moolenaar ' echo ExpFunc()', 207225e0f586SBram Moolenaar 'enddef', 207325e0f586SBram Moolenaar 'defcompile', 207425e0f586SBram Moolenaar ] 207525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 207625e0f586SBram Moolenaar 207725e0f586SBram Moolenaar try 207825e0f586SBram Moolenaar source Ximport.vim 207925e0f586SBram Moolenaar catch /E1001/ 2080f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20817707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 208225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 208325e0f586SBram Moolenaar endtry 208425e0f586SBram Moolenaar 208525e0f586SBram Moolenaar delete('Xexported.vim') 208625e0f586SBram Moolenaar delete('Ximport.vim') 208725e0f586SBram Moolenaarenddef 208825e0f586SBram Moolenaar 2089c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2090cfcd011fSBram Moolenaar var lines = [ 2091c4ce36d4SBram Moolenaar 'vim9script', 2092c4ce36d4SBram Moolenaar 'def Func()', 2093c4ce36d4SBram Moolenaar ' eval [][0]', 2094c4ce36d4SBram Moolenaar 'enddef', 2095c4ce36d4SBram Moolenaar 'Func()', 2096c4ce36d4SBram Moolenaar ] 2097c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2098c4ce36d4SBram Moolenaar 2099c4ce36d4SBram Moolenaar for count in range(3) 2100c4ce36d4SBram Moolenaar try 2101c4ce36d4SBram Moolenaar source Xtestscript.vim 2102c4ce36d4SBram Moolenaar catch /E684/ 2103c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2104c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2105c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2106c4ce36d4SBram Moolenaar endtry 2107c4ce36d4SBram Moolenaar endfor 2108c4ce36d4SBram Moolenaar 2109c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2110c4ce36d4SBram Moolenaarenddef 2111c4ce36d4SBram Moolenaar 2112eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2113cfcd011fSBram Moolenaar var export_lines =<< trim END 2114eef2102eSBram Moolenaar vim9script 2115eef2102eSBram Moolenaar export def Func() 2116eef2102eSBram Moolenaar echo 'imported' 2117eef2102eSBram Moolenaar enddef 2118eef2102eSBram Moolenaar END 2119eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2120eef2102eSBram Moolenaar 2121cfcd011fSBram Moolenaar var lines =<< trim END 2122eef2102eSBram Moolenaar vim9script 2123eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2124eef2102eSBram Moolenaar def Func() 2125eef2102eSBram Moolenaar echo 'local to function' 2126eef2102eSBram Moolenaar enddef 2127eef2102eSBram Moolenaar END 2128eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2129eef2102eSBram Moolenaar 2130eef2102eSBram Moolenaar lines =<< trim END 2131eef2102eSBram Moolenaar vim9script 2132eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2133eef2102eSBram Moolenaar def Outer() 2134eef2102eSBram Moolenaar def Func() 2135eef2102eSBram Moolenaar echo 'local to function' 2136eef2102eSBram Moolenaar enddef 2137eef2102eSBram Moolenaar enddef 2138eef2102eSBram Moolenaar defcompile 2139eef2102eSBram Moolenaar END 2140eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2141eef2102eSBram Moolenaar 2142eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2143eef2102eSBram Moolenaarenddef 2144eef2102eSBram Moolenaar 2145b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2146cfcd011fSBram Moolenaar var lines =<< trim END 2147b9a2cac3SBram Moolenaar vim9script 2148b9a2cac3SBram Moolenaar def Func() 2149b9a2cac3SBram Moolenaar echo 'one' 2150b9a2cac3SBram Moolenaar enddef 2151b9a2cac3SBram Moolenaar def Func() 2152b9a2cac3SBram Moolenaar echo 'two' 2153b9a2cac3SBram Moolenaar enddef 2154b9a2cac3SBram Moolenaar END 2155b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2156fa211f3cSBram Moolenaar 2157fa211f3cSBram Moolenaar lines =<< trim END 2158fa211f3cSBram Moolenaar vim9script 2159fa211f3cSBram Moolenaar def Foo(): string 2160fa211f3cSBram Moolenaar return 'foo' 2161fa211f3cSBram Moolenaar enddef 2162fa211f3cSBram Moolenaar def Func() 2163cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2164fa211f3cSBram Moolenaar enddef 2165fa211f3cSBram Moolenaar defcompile 2166fa211f3cSBram Moolenaar END 2167fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2168b9a2cac3SBram Moolenaarenddef 2169b9a2cac3SBram Moolenaar 21708a7d6542SBram Moolenaardef Test_fixed_size_list() 2171f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2172cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21738a7d6542SBram Moolenaar l->remove(0) 21748a7d6542SBram Moolenaar l->add(5) 21758a7d6542SBram Moolenaar l->insert(99, 1) 21760f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21778a7d6542SBram Moolenaarenddef 21788a7d6542SBram Moolenaar 2179ae616494SBram Moolenaardef Test_no_insert_xit() 2180d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2181d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2182d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2183d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2184d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2185ae616494SBram Moolenaar 2186ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2187ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2188ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2189ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2190f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2191f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21926508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21936508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2194f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2195f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2196f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2197ae616494SBram Moolenaarenddef 2198ae616494SBram Moolenaar 2199158906cfSBram Moolenaardef IfElse(what: number): string 2200cfcd011fSBram Moolenaar var res = '' 2201158906cfSBram Moolenaar if what == 1 2202158906cfSBram Moolenaar res = "one" 2203158906cfSBram Moolenaar elseif what == 2 2204158906cfSBram Moolenaar res = "two" 2205a259d8d3SBram Moolenaar else 2206158906cfSBram Moolenaar res = "three" 2207a259d8d3SBram Moolenaar endif 2208158906cfSBram Moolenaar return res 2209a259d8d3SBram Moolenaarenddef 2210a259d8d3SBram Moolenaar 2211158906cfSBram Moolenaardef Test_if_elseif_else() 2212158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2213158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2214158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22150f18b6d1SBram Moolenaarenddef 22160f18b6d1SBram Moolenaar 2217e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2218d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2219d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2220d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2221ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2222d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22236628b7ebSBram Moolenaar 22246628b7ebSBram Moolenaar var lines =<< trim END 22256628b7ebSBram Moolenaar var s = '' 22266628b7ebSBram Moolenaar if s = '' 22276628b7ebSBram Moolenaar endif 22286628b7ebSBram Moolenaar END 22296628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22306628b7ebSBram Moolenaar 22316628b7ebSBram Moolenaar lines =<< trim END 22326628b7ebSBram Moolenaar var s = '' 22336628b7ebSBram Moolenaar if s == '' 22346628b7ebSBram Moolenaar elseif s = '' 22356628b7ebSBram Moolenaar endif 22366628b7ebSBram Moolenaar END 22376628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2238e8c4abbbSBram Moolenaarenddef 2239e8c4abbbSBram Moolenaar 22406d69bf60SBram Moolenaarlet g:bool_true = v:true 22416d69bf60SBram Moolenaarlet g:bool_false = v:false 22426d69bf60SBram Moolenaar 22436d69bf60SBram Moolenaardef Test_if_const_expr() 2244cfcd011fSBram Moolenaar var res = false 22456d69bf60SBram Moolenaar if true ? true : false 22466d69bf60SBram Moolenaar res = true 22476d69bf60SBram Moolenaar endif 22486d69bf60SBram Moolenaar assert_equal(true, res) 22496d69bf60SBram Moolenaar 2250585fea7bSBram Moolenaar g:glob = 2 2251585fea7bSBram Moolenaar if false 22526797966dSBram Moolenaar execute('g:glob = 3') 2253585fea7bSBram Moolenaar endif 2254585fea7bSBram Moolenaar assert_equal(2, g:glob) 2255585fea7bSBram Moolenaar if true 22566797966dSBram Moolenaar execute('g:glob = 3') 2257585fea7bSBram Moolenaar endif 2258585fea7bSBram Moolenaar assert_equal(3, g:glob) 2259585fea7bSBram Moolenaar 22606d69bf60SBram Moolenaar res = false 22616d69bf60SBram Moolenaar if g:bool_true ? true : false 22626d69bf60SBram Moolenaar res = true 22636d69bf60SBram Moolenaar endif 22646d69bf60SBram Moolenaar assert_equal(true, res) 22656d69bf60SBram Moolenaar 22666d69bf60SBram Moolenaar res = false 22676d69bf60SBram Moolenaar if true ? g:bool_true : false 22686d69bf60SBram Moolenaar res = true 22696d69bf60SBram Moolenaar endif 22706d69bf60SBram Moolenaar assert_equal(true, res) 22716d69bf60SBram Moolenaar 22726d69bf60SBram Moolenaar res = false 22736d69bf60SBram Moolenaar if true ? true : g:bool_false 22746d69bf60SBram Moolenaar res = true 22756d69bf60SBram Moolenaar endif 22766d69bf60SBram Moolenaar assert_equal(true, res) 22776d69bf60SBram Moolenaar 22786d69bf60SBram Moolenaar res = false 22796d69bf60SBram Moolenaar if true ? false : true 22806d69bf60SBram Moolenaar res = true 22816d69bf60SBram Moolenaar endif 22826d69bf60SBram Moolenaar assert_equal(false, res) 22836d69bf60SBram Moolenaar 22846d69bf60SBram Moolenaar res = false 22856d69bf60SBram Moolenaar if false ? false : true 22866d69bf60SBram Moolenaar res = true 22876d69bf60SBram Moolenaar endif 22886d69bf60SBram Moolenaar assert_equal(true, res) 22896d69bf60SBram Moolenaar 22906d69bf60SBram Moolenaar res = false 22916d69bf60SBram Moolenaar if false ? true : false 22926d69bf60SBram Moolenaar res = true 22936d69bf60SBram Moolenaar endif 22946d69bf60SBram Moolenaar assert_equal(false, res) 22956d69bf60SBram Moolenaar 22966d69bf60SBram Moolenaar res = false 2297e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2298e8c4abbbSBram Moolenaar res = true 2299e8c4abbbSBram Moolenaar endif 2300e8c4abbbSBram Moolenaar assert_equal(false, res) 2301e8c4abbbSBram Moolenaar 2302e8c4abbbSBram Moolenaar res = false 23036d69bf60SBram Moolenaar if true && true 23046d69bf60SBram Moolenaar res = true 23056d69bf60SBram Moolenaar endif 23066d69bf60SBram Moolenaar assert_equal(true, res) 23076d69bf60SBram Moolenaar 23086d69bf60SBram Moolenaar res = false 23096d69bf60SBram Moolenaar if true && false 23106d69bf60SBram Moolenaar res = true 23116d69bf60SBram Moolenaar endif 23126d69bf60SBram Moolenaar assert_equal(false, res) 23136d69bf60SBram Moolenaar 23146d69bf60SBram Moolenaar res = false 23156d69bf60SBram Moolenaar if g:bool_true && false 23166d69bf60SBram Moolenaar res = true 23176d69bf60SBram Moolenaar endif 23186d69bf60SBram Moolenaar assert_equal(false, res) 23196d69bf60SBram Moolenaar 23206d69bf60SBram Moolenaar res = false 23216d69bf60SBram Moolenaar if true && g:bool_false 23226d69bf60SBram Moolenaar res = true 23236d69bf60SBram Moolenaar endif 23246d69bf60SBram Moolenaar assert_equal(false, res) 23256d69bf60SBram Moolenaar 23266d69bf60SBram Moolenaar res = false 23276d69bf60SBram Moolenaar if false && false 23286d69bf60SBram Moolenaar res = true 23296d69bf60SBram Moolenaar endif 23306d69bf60SBram Moolenaar assert_equal(false, res) 23316d69bf60SBram Moolenaar 23326d69bf60SBram Moolenaar res = false 23336d69bf60SBram Moolenaar if true || false 23346d69bf60SBram Moolenaar res = true 23356d69bf60SBram Moolenaar endif 23366d69bf60SBram Moolenaar assert_equal(true, res) 23376d69bf60SBram Moolenaar 23386d69bf60SBram Moolenaar res = false 23396d69bf60SBram Moolenaar if g:bool_true || false 23406d69bf60SBram Moolenaar res = true 23416d69bf60SBram Moolenaar endif 23426d69bf60SBram Moolenaar assert_equal(true, res) 23436d69bf60SBram Moolenaar 23446d69bf60SBram Moolenaar res = false 23456d69bf60SBram Moolenaar if true || g:bool_false 23466d69bf60SBram Moolenaar res = true 23476d69bf60SBram Moolenaar endif 23486d69bf60SBram Moolenaar assert_equal(true, res) 23496d69bf60SBram Moolenaar 23506d69bf60SBram Moolenaar res = false 23516d69bf60SBram Moolenaar if false || false 23526d69bf60SBram Moolenaar res = true 23536d69bf60SBram Moolenaar endif 23546d69bf60SBram Moolenaar assert_equal(false, res) 23553988f64fSBram Moolenaar 23563988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2357c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23583988f64fSBram Moolenaar if false | eval burp + 234 | endif 23593988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23603988f64fSBram Moolenaar if false 23613988f64fSBram Moolenaar burp 23623988f64fSBram Moolenaar endif 236380c34ca3SBram Moolenaarenddef 23646d69bf60SBram Moolenaar 236580c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2366d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2367d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2368d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2369d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23706d69bf60SBram Moolenaarenddef 23716d69bf60SBram Moolenaar 237272abcf42SBram Moolenaardef RunNested(i: number): number 2373cfcd011fSBram Moolenaar var x: number = 0 237472abcf42SBram Moolenaar if i % 2 237572abcf42SBram Moolenaar if 1 2376f5be8cdbSBram Moolenaar # comment 237772abcf42SBram Moolenaar else 2378f5be8cdbSBram Moolenaar # comment 237972abcf42SBram Moolenaar endif 238072abcf42SBram Moolenaar x += 1 238172abcf42SBram Moolenaar else 238272abcf42SBram Moolenaar x += 1000 238372abcf42SBram Moolenaar endif 238472abcf42SBram Moolenaar return x 238572abcf42SBram Moolenaarenddef 238672abcf42SBram Moolenaar 238772abcf42SBram Moolenaardef Test_nested_if() 238872abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 238972abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 239072abcf42SBram Moolenaarenddef 239172abcf42SBram Moolenaar 2392ad39c094SBram Moolenaardef Test_execute_cmd() 2393e4984290SBram Moolenaar # missing argument is ignored 2394e4984290SBram Moolenaar execute 2395e4984290SBram Moolenaar execute # comment 2396e4984290SBram Moolenaar 2397ad39c094SBram Moolenaar new 2398ad39c094SBram Moolenaar setline(1, 'default') 2399d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2400ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2401a72cfb80SBram Moolenaar 2402d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2403a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2404a72cfb80SBram Moolenaar 2405cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2406cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2407a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2408ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2409a72cfb80SBram Moolenaar 2410d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2411ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2412a72cfb80SBram Moolenaar 2413cfcd011fSBram Moolenaar var cmd_first = 'call ' 2414cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2415ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2416ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2417ad39c094SBram Moolenaar bwipe! 2418585fea7bSBram Moolenaar 2419cfcd011fSBram Moolenaar var n = true 24202d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 24212d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 24222d6b20d6SBram Moolenaar 2423e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2424e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2425e5abf7afSBram Moolenaar 2426d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2427d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2428d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2429ad39c094SBram Moolenaarenddef 2430ad39c094SBram Moolenaar 243147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2432f5be8cdbSBram Moolenaar # only checks line continuation 2433cfcd011fSBram Moolenaar var lines =<< trim END 243447e880d6SBram Moolenaar vim9script 243547e880d6SBram Moolenaar execute 'g:someVar' 243647e880d6SBram Moolenaar .. ' = ' .. 243747e880d6SBram Moolenaar '28' 243847e880d6SBram Moolenaar assert_equal(28, g:someVar) 243947e880d6SBram Moolenaar unlet g:someVar 244047e880d6SBram Moolenaar END 244147e880d6SBram Moolenaar CheckScriptSuccess(lines) 244247e880d6SBram Moolenaarenddef 244347e880d6SBram Moolenaar 2444ad39c094SBram Moolenaardef Test_echo_cmd() 2445a72cfb80SBram Moolenaar echo 'some' # comment 2446585fea7bSBram Moolenaar echon 'thing' 2447ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2448ad39c094SBram Moolenaar 2449a72cfb80SBram Moolenaar echo "some" # comment 2450a72cfb80SBram Moolenaar echon "thing" 2451a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2452a72cfb80SBram Moolenaar 2453cfcd011fSBram Moolenaar var str1 = 'some' 2454cfcd011fSBram Moolenaar var str2 = 'more' 2455ad39c094SBram Moolenaar echo str1 str2 2456ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2457a72cfb80SBram Moolenaar 2458d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2459ad39c094SBram Moolenaarenddef 2460ad39c094SBram Moolenaar 2461f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2462f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2463f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2464f93c7feaSBram Moolenaar echo 'clear' 2465df069eecSBram Moolenaar :1messages 2466f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2467f93c7feaSBram Moolenaar 2468d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2469f93c7feaSBram Moolenaarenddef 2470f93c7feaSBram Moolenaar 247147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2472f5be8cdbSBram Moolenaar # only checks line continuation 2473cfcd011fSBram Moolenaar var lines =<< trim END 247447e880d6SBram Moolenaar vim9script 247547e880d6SBram Moolenaar echomsg 'here' 247647e880d6SBram Moolenaar .. ' is ' .. 247747e880d6SBram Moolenaar 'a message' 247847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 247947e880d6SBram Moolenaar END 248047e880d6SBram Moolenaar CheckScriptSuccess(lines) 248147e880d6SBram Moolenaarenddef 248247e880d6SBram Moolenaar 2483f93c7feaSBram Moolenaardef Test_echoerr_cmd() 248440ee466cSBram Moolenaar try 248540ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 248640ee466cSBram Moolenaar catch 248740ee466cSBram Moolenaar assert_match('something wrong', v:exception) 248840ee466cSBram Moolenaar endtry 2489f93c7feaSBram Moolenaarenddef 2490f93c7feaSBram Moolenaar 249147e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2492f5be8cdbSBram Moolenaar # only checks line continuation 2493cfcd011fSBram Moolenaar var lines =<< trim END 249447e880d6SBram Moolenaar vim9script 249547e880d6SBram Moolenaar try 249647e880d6SBram Moolenaar echoerr 'this' 249747e880d6SBram Moolenaar .. ' is ' .. 249847e880d6SBram Moolenaar 'wrong' 249947e880d6SBram Moolenaar catch 250047e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 250147e880d6SBram Moolenaar endtry 250247e880d6SBram Moolenaar END 250347e880d6SBram Moolenaar CheckScriptSuccess(lines) 250447e880d6SBram Moolenaarenddef 250547e880d6SBram Moolenaar 250641fe0617SBram Moolenaardef Test_for_outside_of_function() 2507cfcd011fSBram Moolenaar var lines =<< trim END 250841fe0617SBram Moolenaar vim9script 250941fe0617SBram Moolenaar new 251041fe0617SBram Moolenaar for var in range(0, 3) 251141fe0617SBram Moolenaar append(line('$'), var) 251241fe0617SBram Moolenaar endfor 251341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 251441fe0617SBram Moolenaar bwipe! 2515522eefd9SBram Moolenaar 2516522eefd9SBram Moolenaar var result = '' 2517522eefd9SBram Moolenaar for i in [1, 2, 3] 2518522eefd9SBram Moolenaar var loop = ' loop ' .. i 2519522eefd9SBram Moolenaar result ..= loop 2520522eefd9SBram Moolenaar endfor 2521522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 252241fe0617SBram Moolenaar END 252341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 252441fe0617SBram Moolenaar source Xvim9for.vim 252541fe0617SBram Moolenaar delete('Xvim9for.vim') 252641fe0617SBram Moolenaarenddef 25278a7d6542SBram Moolenaar 2528e8c4abbbSBram Moolenaardef Test_for_loop() 2529f2253963SBram Moolenaar var lines =<< trim END 2530cfcd011fSBram Moolenaar var result = '' 2531e8c4abbbSBram Moolenaar for cnt in range(7) 2532e8c4abbbSBram Moolenaar if cnt == 4 2533e8c4abbbSBram Moolenaar break 2534e8c4abbbSBram Moolenaar endif 2535e8c4abbbSBram Moolenaar if cnt == 2 2536e8c4abbbSBram Moolenaar continue 2537e8c4abbbSBram Moolenaar endif 2538e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2539e8c4abbbSBram Moolenaar endfor 2540e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 25410ad3e894SBram Moolenaar 2542cfcd011fSBram Moolenaar var concat = '' 25430ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25440ad3e894SBram Moolenaar concat ..= str 25450ad3e894SBram Moolenaar endfor 25460ad3e894SBram Moolenaar assert_equal('onetwo', concat) 254738bd8de5SBram Moolenaar 254838bd8de5SBram Moolenaar var total = 0 254938bd8de5SBram Moolenaar for nr in 255038bd8de5SBram Moolenaar [1, 2, 3] 255138bd8de5SBram Moolenaar total += nr 255238bd8de5SBram Moolenaar endfor 255338bd8de5SBram Moolenaar assert_equal(6, total) 255438bd8de5SBram Moolenaar 255538bd8de5SBram Moolenaar total = 0 255638bd8de5SBram Moolenaar for nr 255738bd8de5SBram Moolenaar in [1, 2, 3] 255838bd8de5SBram Moolenaar total += nr 255938bd8de5SBram Moolenaar endfor 256038bd8de5SBram Moolenaar assert_equal(6, total) 256138bd8de5SBram Moolenaar 256238bd8de5SBram Moolenaar total = 0 256338bd8de5SBram Moolenaar for nr 256438bd8de5SBram Moolenaar in 256538bd8de5SBram Moolenaar [1, 2, 3] 256638bd8de5SBram Moolenaar total += nr 256738bd8de5SBram Moolenaar endfor 256838bd8de5SBram Moolenaar assert_equal(6, total) 2569036d0714SBram Moolenaar 2570a3589a0dSBram Moolenaar # with type 2571a3589a0dSBram Moolenaar total = 0 2572a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2573a3589a0dSBram Moolenaar total += n 2574a3589a0dSBram Moolenaar endfor 2575a3589a0dSBram Moolenaar assert_equal(6, total) 2576a3589a0dSBram Moolenaar 2577fe090eb5SBram Moolenaar var chars = '' 2578fe090eb5SBram Moolenaar for s: string in 'foobar' 2579fe090eb5SBram Moolenaar chars ..= s 2580fe090eb5SBram Moolenaar endfor 2581fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2582fe090eb5SBram Moolenaar 25835ede5b23SBram Moolenaar chars = '' 25845ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25855ede5b23SBram Moolenaar chars ..= x 25865ede5b23SBram Moolenaar endfor 25875ede5b23SBram Moolenaar assert_equal('ab', chars) 25885ede5b23SBram Moolenaar 2589a3589a0dSBram Moolenaar # unpack with type 2590f2253963SBram Moolenaar var res = '' 2591a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2592a3589a0dSBram Moolenaar res ..= n .. s 2593a3589a0dSBram Moolenaar endfor 2594a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2595a3589a0dSBram Moolenaar 2596444d8783SBram Moolenaar # unpack with one var 2597444d8783SBram Moolenaar var reslist = [] 2598444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2599444d8783SBram Moolenaar reslist->add(x) 2600444d8783SBram Moolenaar endfor 2601444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2602444d8783SBram Moolenaar 2603a3589a0dSBram Moolenaar # loop over string 2604a3589a0dSBram Moolenaar res = '' 260574e54fcbSBram Moolenaar for c in 'aéc̀d' 260674e54fcbSBram Moolenaar res ..= c .. '-' 260774e54fcbSBram Moolenaar endfor 260874e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 260974e54fcbSBram Moolenaar 261074e54fcbSBram Moolenaar res = '' 261174e54fcbSBram Moolenaar for c in '' 261274e54fcbSBram Moolenaar res ..= c .. '-' 261374e54fcbSBram Moolenaar endfor 261474e54fcbSBram Moolenaar assert_equal('', res) 261574e54fcbSBram Moolenaar 261674e54fcbSBram Moolenaar res = '' 261774e54fcbSBram Moolenaar for c in test_null_string() 261874e54fcbSBram Moolenaar res ..= c .. '-' 261974e54fcbSBram Moolenaar endfor 262074e54fcbSBram Moolenaar assert_equal('', res) 2621f2253963SBram Moolenaar 2622f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2623f2253963SBram Moolenaar {a: 'Cat'} 2624f2253963SBram Moolenaar ] 2625f2253963SBram Moolenaar for dd in foo 2626f2253963SBram Moolenaar dd.counter = 12 2627f2253963SBram Moolenaar endfor 2628f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2629ad2d4969SBram Moolenaar 2630ad2d4969SBram Moolenaar reslist = [] 2631ad2d4969SBram Moolenaar for _ in range(3) 2632ad2d4969SBram Moolenaar reslist->add('x') 2633ad2d4969SBram Moolenaar endfor 2634ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2635f2253963SBram Moolenaar END 2636f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2637e8c4abbbSBram Moolenaarenddef 2638e8c4abbbSBram Moolenaar 26392eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 26402eb6fc3bSBram Moolenaar var lines =<< trim END 26412eb6fc3bSBram Moolenaar var flist: list<func> 26422eb6fc3bSBram Moolenaar for i in range(5) 26432eb6fc3bSBram Moolenaar var inloop = i 26442eb6fc3bSBram Moolenaar flist[i] = () => inloop 26452eb6fc3bSBram Moolenaar endfor 26462eb6fc3bSBram Moolenaar for i in range(5) 26472eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26482eb6fc3bSBram Moolenaar endfor 26492eb6fc3bSBram Moolenaar END 26502eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26512eb6fc3bSBram Moolenaar 26522eb6fc3bSBram Moolenaar lines =<< trim END 26532eb6fc3bSBram Moolenaar var flist: list<func> 26542eb6fc3bSBram Moolenaar for i in range(5) 26552eb6fc3bSBram Moolenaar var inloop = i 26562eb6fc3bSBram Moolenaar flist[i] = () => { 26572eb6fc3bSBram Moolenaar return inloop 26582eb6fc3bSBram Moolenaar } 26592eb6fc3bSBram Moolenaar endfor 26602eb6fc3bSBram Moolenaar for i in range(5) 26612eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26622eb6fc3bSBram Moolenaar endfor 26632eb6fc3bSBram Moolenaar END 26642eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26652eb6fc3bSBram Moolenaarenddef 26662eb6fc3bSBram Moolenaar 2667e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2668442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2669442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2670442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2671442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2672442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2673442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2674d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2675822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 26762d870f8dSBram Moolenaar delfunc! g:Func 2677675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2678675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2679675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 268074e54fcbSBram Moolenaar 268174e54fcbSBram Moolenaar # wrong type detected at compile time 268274e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 268374e54fcbSBram Moolenaar 268474e54fcbSBram Moolenaar # wrong type detected at runtime 268574e54fcbSBram Moolenaar g:adict = {a: 1} 268674e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 268774e54fcbSBram Moolenaar unlet g:adict 2688f6a8d420SBram Moolenaar 2689f6a8d420SBram Moolenaar var lines =<< trim END 2690f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2691f6a8d420SBram Moolenaar for e in d 2692f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2693f6a8d420SBram Moolenaar endfor 2694f6a8d420SBram Moolenaar END 2695f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2696fe090eb5SBram Moolenaar 2697fe090eb5SBram Moolenaar lines =<< trim END 2698fe090eb5SBram Moolenaar for nr: number in ['foo'] 2699fe090eb5SBram Moolenaar endfor 2700fe090eb5SBram Moolenaar END 2701fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2702404557e6SBram Moolenaar 2703404557e6SBram Moolenaar lines =<< trim END 2704404557e6SBram Moolenaar for n : number in [1, 2] 2705404557e6SBram Moolenaar echo n 2706404557e6SBram Moolenaar endfor 2707404557e6SBram Moolenaar END 2708404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2709efc5db52SBram Moolenaar 2710efc5db52SBram Moolenaar lines =<< trim END 2711efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2712efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2713efc5db52SBram Moolenaar echo k v 2714efc5db52SBram Moolenaar endfor 2715efc5db52SBram Moolenaar END 2716efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2717e8c4abbbSBram Moolenaarenddef 2718e8c4abbbSBram Moolenaar 2719ea87069dSBram Moolenaardef Test_for_loop_script_var() 2720ea87069dSBram Moolenaar # cannot use s:var in a :def function 2721ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2722ea87069dSBram Moolenaar 2723ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2724ea87069dSBram Moolenaar var lines =<< trim END 2725ea87069dSBram Moolenaar vim9script 2726ea87069dSBram Moolenaar var total = 0 2727ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2728ea87069dSBram Moolenaar total += s:var 2729ea87069dSBram Moolenaar endfor 2730ea87069dSBram Moolenaar assert_equal(6, total) 2731ea87069dSBram Moolenaar 2732ea87069dSBram Moolenaar total = 0 2733ea87069dSBram Moolenaar for var in [1, 2, 3] 2734ea87069dSBram Moolenaar total += var 2735ea87069dSBram Moolenaar endfor 2736ea87069dSBram Moolenaar assert_equal(6, total) 2737ea87069dSBram Moolenaar END 2738ea87069dSBram Moolenaarenddef 2739ea87069dSBram Moolenaar 2740792f786aSBram Moolenaardef Test_for_loop_unpack() 27414b8a0651SBram Moolenaar var lines =<< trim END 2742792f786aSBram Moolenaar var result = [] 2743792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2744792f786aSBram Moolenaar result->add(v1) 2745792f786aSBram Moolenaar result->add(v2) 2746792f786aSBram Moolenaar endfor 2747792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2748792f786aSBram Moolenaar 2749792f786aSBram Moolenaar result = [] 2750792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2751792f786aSBram Moolenaar result->add(v1) 2752792f786aSBram Moolenaar result->add(v2) 2753792f786aSBram Moolenaar result->add(v3) 2754792f786aSBram Moolenaar endfor 2755792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2756792f786aSBram Moolenaar 27574b8a0651SBram Moolenaar result = [] 27584b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 27594b8a0651SBram Moolenaar result->add(&ts) 27604b8a0651SBram Moolenaar result->add(&sw) 27614b8a0651SBram Moolenaar endfor 27624b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 27634b8a0651SBram Moolenaar 27644b8a0651SBram Moolenaar var slist: list<string> 27654b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 27664b8a0651SBram Moolenaar slist->add($LOOPVAR) 27674b8a0651SBram Moolenaar slist->add(@r) 27684b8a0651SBram Moolenaar slist->add(v:errmsg) 27694b8a0651SBram Moolenaar endfor 27704b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 27714b8a0651SBram Moolenaar 27724b8a0651SBram Moolenaar slist = [] 27734b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 27744b8a0651SBram Moolenaar slist->add(g:globalvar) 27754b8a0651SBram Moolenaar slist->add(b:bufvar) 27764b8a0651SBram Moolenaar slist->add(w:winvar) 27774b8a0651SBram Moolenaar slist->add(t:tabvar) 27784b8a0651SBram Moolenaar endfor 27794b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2780f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2781b777da9bSBram Moolenaar 2782b777da9bSBram Moolenaar var res = [] 2783b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2784b777da9bSBram Moolenaar res->add(n) 2785b777da9bSBram Moolenaar endfor 2786b777da9bSBram Moolenaar assert_equal([2, 5], res) 27874b8a0651SBram Moolenaar END 27884b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 27894b8a0651SBram Moolenaar 27904b8a0651SBram Moolenaar lines =<< trim END 2791792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2792792f786aSBram Moolenaar echo v1 v2 2793792f786aSBram Moolenaar endfor 2794792f786aSBram Moolenaar END 2795792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2796792f786aSBram Moolenaar 2797792f786aSBram Moolenaar lines =<< trim END 2798792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2799792f786aSBram Moolenaar echo v1 v2 2800792f786aSBram Moolenaar endfor 2801792f786aSBram Moolenaar END 2802792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2803792f786aSBram Moolenaar 2804792f786aSBram Moolenaar lines =<< trim END 2805792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2806792f786aSBram Moolenaar echo v1 2807792f786aSBram Moolenaar endfor 2808792f786aSBram Moolenaar END 2809792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2810792f786aSBram Moolenaarenddef 2811792f786aSBram Moolenaar 2812c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2813f2253963SBram Moolenaar var lines =<< trim END 2814c150c09eSBram Moolenaar var looped = 0 2815c150c09eSBram Moolenaar var cleanup = 0 2816c150c09eSBram Moolenaar for i in range(3) 2817c150c09eSBram Moolenaar looped += 1 2818c150c09eSBram Moolenaar try 2819c150c09eSBram Moolenaar eval [][0] 2820c150c09eSBram Moolenaar catch 2821c150c09eSBram Moolenaar continue 2822c150c09eSBram Moolenaar finally 2823c150c09eSBram Moolenaar cleanup += 1 2824c150c09eSBram Moolenaar endtry 2825c150c09eSBram Moolenaar endfor 2826c150c09eSBram Moolenaar assert_equal(3, looped) 2827c150c09eSBram Moolenaar assert_equal(3, cleanup) 2828f2253963SBram Moolenaar END 2829f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2830c150c09eSBram Moolenaarenddef 2831c150c09eSBram Moolenaar 2832d0df1aacSBram Moolenaardef Test_while_loop() 2833cfcd011fSBram Moolenaar var result = '' 2834cfcd011fSBram Moolenaar var cnt = 0 2835d0df1aacSBram Moolenaar while cnt < 555 2836d0df1aacSBram Moolenaar if cnt == 3 2837d0df1aacSBram Moolenaar break 2838d0df1aacSBram Moolenaar endif 2839d0df1aacSBram Moolenaar cnt += 1 2840d0df1aacSBram Moolenaar if cnt == 2 2841d0df1aacSBram Moolenaar continue 2842d0df1aacSBram Moolenaar endif 2843d0df1aacSBram Moolenaar result ..= cnt .. '_' 2844d0df1aacSBram Moolenaar endwhile 2845d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2846dee37dc7SBram Moolenaar 2847dee37dc7SBram Moolenaar var s = '' 28480123cc1eSBram Moolenaar while s == 'x' # {comment} 2849dee37dc7SBram Moolenaar endwhile 2850d0df1aacSBram Moolenaarenddef 2851d0df1aacSBram Moolenaar 2852e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2853675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2854675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2855675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2856675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2857675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2858675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2859675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 28606628b7ebSBram Moolenaar 28616628b7ebSBram Moolenaar var lines =<< trim END 28626628b7ebSBram Moolenaar var s = '' 28636628b7ebSBram Moolenaar while s = '' 28646628b7ebSBram Moolenaar endwhile 28656628b7ebSBram Moolenaar END 28666628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2867bd5da371SBram Moolenaarenddef 2868bd5da371SBram Moolenaar 28699645e2d9SBram Moolenaardef Test_interrupt_loop() 2870cfcd011fSBram Moolenaar var caught = false 2871cfcd011fSBram Moolenaar var x = 0 287297acfc78SBram Moolenaar try 28739645e2d9SBram Moolenaar while 1 28749645e2d9SBram Moolenaar x += 1 28759645e2d9SBram Moolenaar if x == 100 28769645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 28779645e2d9SBram Moolenaar endif 28789645e2d9SBram Moolenaar endwhile 287997acfc78SBram Moolenaar catch 288097acfc78SBram Moolenaar caught = true 288197acfc78SBram Moolenaar assert_equal(100, x) 288297acfc78SBram Moolenaar endtry 288397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 288425859dd7SBram Moolenaar # consume the CTRL-C 288525859dd7SBram Moolenaar getchar(0) 28869645e2d9SBram Moolenaarenddef 288720431c9dSBram Moolenaar 28884fdae999SBram Moolenaardef Test_automatic_line_continuation() 2889cfcd011fSBram Moolenaar var mylist = [ 28904fdae999SBram Moolenaar 'one', 28914fdae999SBram Moolenaar 'two', 28924fdae999SBram Moolenaar 'three', 2893f5be8cdbSBram Moolenaar ] # comment 28944fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 28954fdae999SBram Moolenaar 2896cfcd011fSBram Moolenaar var mydict = { 2897e0de171eSBram Moolenaar ['one']: 1, 2898e0de171eSBram Moolenaar ['two']: 2, 2899e0de171eSBram Moolenaar ['three']: 29004fdae999SBram Moolenaar 3, 2901f5be8cdbSBram Moolenaar } # comment 2902e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2903e0de171eSBram Moolenaar mydict = { 29042c330432SBram Moolenaar one: 1, # comment 29052c330432SBram Moolenaar two: # comment 29062c330432SBram Moolenaar 2, # comment 29072c330432SBram Moolenaar three: 3 # comment 29082c330432SBram Moolenaar } 2909e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2910e0de171eSBram Moolenaar mydict = { 29112c330432SBram Moolenaar one: 1, 29124fdae999SBram Moolenaar two: 29134fdae999SBram Moolenaar 2, 29142c330432SBram Moolenaar three: 3 29154fdae999SBram Moolenaar } 2916e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2917e6085c53SBram Moolenaar 2918e6085c53SBram Moolenaar assert_equal( 2919e6085c53SBram Moolenaar ['one', 'two', 'three'], 2920e6085c53SBram Moolenaar split('one two three') 2921e6085c53SBram Moolenaar ) 29224fdae999SBram Moolenaarenddef 29234fdae999SBram Moolenaar 29247a092245SBram Moolenaardef Test_vim9_comment() 29257a092245SBram Moolenaar CheckScriptSuccess([ 29267a092245SBram Moolenaar 'vim9script', 29277a092245SBram Moolenaar '# something', 292893f82cbeSBram Moolenaar '#something', 292993f82cbeSBram Moolenaar '#{something', 29307a092245SBram Moolenaar ]) 293193f82cbeSBram Moolenaar 293293f82cbeSBram Moolenaar split Xfile 293393f82cbeSBram Moolenaar CheckScriptSuccess([ 293493f82cbeSBram Moolenaar 'vim9script', 293593f82cbeSBram Moolenaar 'edit #something', 293693f82cbeSBram Moolenaar ]) 293793f82cbeSBram Moolenaar CheckScriptSuccess([ 293893f82cbeSBram Moolenaar 'vim9script', 293993f82cbeSBram Moolenaar 'edit #{something', 294093f82cbeSBram Moolenaar ]) 294193f82cbeSBram Moolenaar close 294293f82cbeSBram Moolenaar 29437a092245SBram Moolenaar CheckScriptFailure([ 29447a092245SBram Moolenaar 'vim9script', 29457a092245SBram Moolenaar ':# something', 29467a092245SBram Moolenaar ], 'E488:') 29477a092245SBram Moolenaar CheckScriptFailure([ 29487a092245SBram Moolenaar '# something', 29497a092245SBram Moolenaar ], 'E488:') 29507a092245SBram Moolenaar CheckScriptFailure([ 29517a092245SBram Moolenaar ':# something', 29527a092245SBram Moolenaar ], 'E488:') 29537a092245SBram Moolenaar 29544a8d9f2eSBram Moolenaar { # block start 29554a8d9f2eSBram Moolenaar } # block end 29564a8d9f2eSBram Moolenaar CheckDefFailure([ 29574a8d9f2eSBram Moolenaar '{# comment', 29584a8d9f2eSBram Moolenaar ], 'E488:') 29594a8d9f2eSBram Moolenaar CheckDefFailure([ 29604a8d9f2eSBram Moolenaar '{', 29614a8d9f2eSBram Moolenaar '}# comment', 29624a8d9f2eSBram Moolenaar ], 'E488:') 29634a8d9f2eSBram Moolenaar 29644a8d9f2eSBram Moolenaar echo "yes" # comment 29654a8d9f2eSBram Moolenaar CheckDefFailure([ 29664a8d9f2eSBram Moolenaar 'echo "yes"# comment', 29674a8d9f2eSBram Moolenaar ], 'E488:') 29687a092245SBram Moolenaar CheckScriptSuccess([ 29697a092245SBram Moolenaar 'vim9script', 29707a092245SBram Moolenaar 'echo "yes" # something', 29717a092245SBram Moolenaar ]) 29727a092245SBram Moolenaar CheckScriptFailure([ 29737a092245SBram Moolenaar 'vim9script', 29747a092245SBram Moolenaar 'echo "yes"# something', 29757a092245SBram Moolenaar ], 'E121:') 29767a092245SBram Moolenaar CheckScriptFailure([ 29777a092245SBram Moolenaar 'vim9script', 29787a092245SBram Moolenaar 'echo# something', 2979f8103f27SBram Moolenaar ], 'E1144:') 29807a092245SBram Moolenaar CheckScriptFailure([ 29817a092245SBram Moolenaar 'echo "yes" # something', 29827a092245SBram Moolenaar ], 'E121:') 29837a092245SBram Moolenaar 29844a8d9f2eSBram Moolenaar exe "echo" # comment 29854a8d9f2eSBram Moolenaar CheckDefFailure([ 29864a8d9f2eSBram Moolenaar 'exe "echo"# comment', 29874a8d9f2eSBram Moolenaar ], 'E488:') 29884a8d9f2eSBram Moolenaar CheckScriptSuccess([ 29894a8d9f2eSBram Moolenaar 'vim9script', 29904a8d9f2eSBram Moolenaar 'exe "echo" # something', 29914a8d9f2eSBram Moolenaar ]) 29924a8d9f2eSBram Moolenaar CheckScriptFailure([ 29934a8d9f2eSBram Moolenaar 'vim9script', 29944a8d9f2eSBram Moolenaar 'exe "echo"# something', 29954a8d9f2eSBram Moolenaar ], 'E121:') 29964a8d9f2eSBram Moolenaar CheckScriptFailure([ 29974a8d9f2eSBram Moolenaar 'vim9script', 29984a8d9f2eSBram Moolenaar 'exe# something', 2999f8103f27SBram Moolenaar ], 'E1144:') 30004a8d9f2eSBram Moolenaar CheckScriptFailure([ 30014a8d9f2eSBram Moolenaar 'exe "echo" # something', 30024a8d9f2eSBram Moolenaar ], 'E121:') 30034a8d9f2eSBram Moolenaar 30047a092245SBram Moolenaar CheckDefFailure([ 30057a092245SBram Moolenaar 'try# comment', 30067a092245SBram Moolenaar ' echo "yes"', 30077a092245SBram Moolenaar 'catch', 30087a092245SBram Moolenaar 'endtry', 3009f8103f27SBram Moolenaar ], 'E1144:') 30102c5ed4e3SBram Moolenaar CheckScriptFailure([ 30112c5ed4e3SBram Moolenaar 'vim9script', 30122c5ed4e3SBram Moolenaar 'try# comment', 30132c5ed4e3SBram Moolenaar 'echo "yes"', 3014f8103f27SBram Moolenaar ], 'E1144:') 30157a092245SBram Moolenaar CheckDefFailure([ 30167a092245SBram Moolenaar 'try', 3017a72cfb80SBram Moolenaar ' throw#comment', 3018a72cfb80SBram Moolenaar 'catch', 3019a72cfb80SBram Moolenaar 'endtry', 3020f8103f27SBram Moolenaar ], 'E1144:') 3021a72cfb80SBram Moolenaar CheckDefFailure([ 3022a72cfb80SBram Moolenaar 'try', 3023a72cfb80SBram Moolenaar ' throw "yes"#comment', 3024a72cfb80SBram Moolenaar 'catch', 3025a72cfb80SBram Moolenaar 'endtry', 3026a72cfb80SBram Moolenaar ], 'E488:') 3027a72cfb80SBram Moolenaar CheckDefFailure([ 3028a72cfb80SBram Moolenaar 'try', 30297a092245SBram Moolenaar ' echo "yes"', 30307a092245SBram Moolenaar 'catch# comment', 30317a092245SBram Moolenaar 'endtry', 3032f8103f27SBram Moolenaar ], 'E1144:') 30332c5ed4e3SBram Moolenaar CheckScriptFailure([ 30342c5ed4e3SBram Moolenaar 'vim9script', 30352c5ed4e3SBram Moolenaar 'try', 30362c5ed4e3SBram Moolenaar ' echo "yes"', 30372c5ed4e3SBram Moolenaar 'catch# comment', 30382c5ed4e3SBram Moolenaar 'endtry', 3039f8103f27SBram Moolenaar ], 'E1144:') 30402c5ed4e3SBram Moolenaar CheckDefFailure([ 30412c5ed4e3SBram Moolenaar 'try', 30422c5ed4e3SBram Moolenaar ' echo "yes"', 30432c5ed4e3SBram Moolenaar 'catch /pat/# comment', 30442c5ed4e3SBram Moolenaar 'endtry', 30452c5ed4e3SBram Moolenaar ], 'E488:') 30467a092245SBram Moolenaar CheckDefFailure([ 30477a092245SBram Moolenaar 'try', 30487a092245SBram Moolenaar 'echo "yes"', 30497a092245SBram Moolenaar 'catch', 30507a092245SBram Moolenaar 'endtry# comment', 3051f8103f27SBram Moolenaar ], 'E1144:') 30522c5ed4e3SBram Moolenaar CheckScriptFailure([ 30532c5ed4e3SBram Moolenaar 'vim9script', 30542c5ed4e3SBram Moolenaar 'try', 30552c5ed4e3SBram Moolenaar ' echo "yes"', 30562c5ed4e3SBram Moolenaar 'catch', 30572c5ed4e3SBram Moolenaar 'endtry# comment', 3058f8103f27SBram Moolenaar ], 'E1144:') 30592c5ed4e3SBram Moolenaar 30602c5ed4e3SBram Moolenaar CheckScriptSuccess([ 30612c5ed4e3SBram Moolenaar 'vim9script', 30622c5ed4e3SBram Moolenaar 'hi # comment', 30632c5ed4e3SBram Moolenaar ]) 30642c5ed4e3SBram Moolenaar CheckScriptFailure([ 30652c5ed4e3SBram Moolenaar 'vim9script', 30662c5ed4e3SBram Moolenaar 'hi# comment', 3067f8103f27SBram Moolenaar ], 'E1144:') 30681966c248SBram Moolenaar CheckScriptSuccess([ 30691966c248SBram Moolenaar 'vim9script', 30701966c248SBram Moolenaar 'hi Search # comment', 30711966c248SBram Moolenaar ]) 30721966c248SBram Moolenaar CheckScriptFailure([ 30731966c248SBram Moolenaar 'vim9script', 30741966c248SBram Moolenaar 'hi Search# comment', 30751966c248SBram Moolenaar ], 'E416:') 30761966c248SBram Moolenaar CheckScriptSuccess([ 30771966c248SBram Moolenaar 'vim9script', 30781966c248SBram Moolenaar 'hi link This Search # comment', 30791966c248SBram Moolenaar ]) 30801966c248SBram Moolenaar CheckScriptFailure([ 30811966c248SBram Moolenaar 'vim9script', 30821966c248SBram Moolenaar 'hi link This That# comment', 30831966c248SBram Moolenaar ], 'E413:') 30841966c248SBram Moolenaar CheckScriptSuccess([ 30851966c248SBram Moolenaar 'vim9script', 30861966c248SBram Moolenaar 'hi clear This # comment', 30871966c248SBram Moolenaar 'hi clear # comment', 30881966c248SBram Moolenaar ]) 3089f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3090f5be8cdbSBram Moolenaar # hi clear This# comment', 30911966c248SBram Moolenaar CheckScriptFailure([ 30921966c248SBram Moolenaar 'vim9script', 30931966c248SBram Moolenaar 'hi clear# comment', 30941966c248SBram Moolenaar ], 'E416:') 30951966c248SBram Moolenaar 30961966c248SBram Moolenaar CheckScriptSuccess([ 30971966c248SBram Moolenaar 'vim9script', 30981966c248SBram Moolenaar 'hi Group term=bold', 30991966c248SBram Moolenaar 'match Group /todo/ # comment', 31001966c248SBram Moolenaar ]) 31011966c248SBram Moolenaar CheckScriptFailure([ 31021966c248SBram Moolenaar 'vim9script', 31031966c248SBram Moolenaar 'hi Group term=bold', 31041966c248SBram Moolenaar 'match Group /todo/# comment', 31051966c248SBram Moolenaar ], 'E488:') 31061966c248SBram Moolenaar CheckScriptSuccess([ 31071966c248SBram Moolenaar 'vim9script', 31081966c248SBram Moolenaar 'match # comment', 31091966c248SBram Moolenaar ]) 31101966c248SBram Moolenaar CheckScriptFailure([ 31111966c248SBram Moolenaar 'vim9script', 31121966c248SBram Moolenaar 'match# comment', 3113f8103f27SBram Moolenaar ], 'E1144:') 31141966c248SBram Moolenaar CheckScriptSuccess([ 31151966c248SBram Moolenaar 'vim9script', 31161966c248SBram Moolenaar 'match none # comment', 31171966c248SBram Moolenaar ]) 31181966c248SBram Moolenaar CheckScriptFailure([ 31191966c248SBram Moolenaar 'vim9script', 31201966c248SBram Moolenaar 'match none# comment', 31211966c248SBram Moolenaar ], 'E475:') 31221966c248SBram Moolenaar 31231966c248SBram Moolenaar CheckScriptSuccess([ 31241966c248SBram Moolenaar 'vim9script', 31251966c248SBram Moolenaar 'menutrans clear # comment', 31261966c248SBram Moolenaar ]) 31271966c248SBram Moolenaar CheckScriptFailure([ 31281966c248SBram Moolenaar 'vim9script', 31291966c248SBram Moolenaar 'menutrans clear# comment text', 31301966c248SBram Moolenaar ], 'E474:') 31311966c248SBram Moolenaar 31321966c248SBram Moolenaar CheckScriptSuccess([ 31331966c248SBram Moolenaar 'vim9script', 31341966c248SBram Moolenaar 'syntax clear # comment', 31351966c248SBram Moolenaar ]) 31361966c248SBram Moolenaar CheckScriptFailure([ 31371966c248SBram Moolenaar 'vim9script', 31381966c248SBram Moolenaar 'syntax clear# comment text', 31391966c248SBram Moolenaar ], 'E28:') 31401966c248SBram Moolenaar CheckScriptSuccess([ 31411966c248SBram Moolenaar 'vim9script', 31421966c248SBram Moolenaar 'syntax keyword Word some', 31431966c248SBram Moolenaar 'syntax clear Word # comment', 31441966c248SBram Moolenaar ]) 31451966c248SBram Moolenaar CheckScriptFailure([ 31461966c248SBram Moolenaar 'vim9script', 31471966c248SBram Moolenaar 'syntax keyword Word some', 31481966c248SBram Moolenaar 'syntax clear Word# comment text', 31491966c248SBram Moolenaar ], 'E28:') 31501966c248SBram Moolenaar 31511966c248SBram Moolenaar CheckScriptSuccess([ 31521966c248SBram Moolenaar 'vim9script', 31531966c248SBram Moolenaar 'syntax list # comment', 31541966c248SBram Moolenaar ]) 31551966c248SBram Moolenaar CheckScriptFailure([ 31561966c248SBram Moolenaar 'vim9script', 31571966c248SBram Moolenaar 'syntax list# comment text', 31581966c248SBram Moolenaar ], 'E28:') 31591966c248SBram Moolenaar 31601966c248SBram Moolenaar CheckScriptSuccess([ 31611966c248SBram Moolenaar 'vim9script', 31621966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 31631966c248SBram Moolenaar ]) 31641966c248SBram Moolenaar CheckScriptFailure([ 31651966c248SBram Moolenaar 'vim9script', 31661966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 31671966c248SBram Moolenaar ], 'E475:') 31681966c248SBram Moolenaar 31691966c248SBram Moolenaar CheckScriptSuccess([ 31701966c248SBram Moolenaar 'vim9script', 31711966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 31721966c248SBram Moolenaar ]) 31731966c248SBram Moolenaar CheckScriptFailure([ 31741966c248SBram Moolenaar 'vim9script', 31751966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 31761966c248SBram Moolenaar ], 'E789:') 31771966c248SBram Moolenaar 31781966c248SBram Moolenaar CheckScriptSuccess([ 31791966c248SBram Moolenaar 'vim9script', 31801966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 31811966c248SBram Moolenaar ]) 31821966c248SBram Moolenaar CheckScriptFailure([ 31831966c248SBram Moolenaar 'vim9script', 31841966c248SBram Moolenaar 'syntax match Word /pat/# comment', 31851966c248SBram Moolenaar ], 'E402:') 31861966c248SBram Moolenaar 31871966c248SBram Moolenaar CheckScriptSuccess([ 31881966c248SBram Moolenaar 'vim9script', 31891966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 31901966c248SBram Moolenaar ]) 31911966c248SBram Moolenaar CheckScriptFailure([ 31921966c248SBram Moolenaar 'vim9script', 31931966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 31941966c248SBram Moolenaar ], 'E475:') 31951966c248SBram Moolenaar CheckScriptFailure([ 31961966c248SBram Moolenaar 'vim9script', 31971966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31981966c248SBram Moolenaar ], 'E406:') 31991966c248SBram Moolenaar CheckScriptFailure([ 32001966c248SBram Moolenaar 'vim9script', 32011966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 32021966c248SBram Moolenaar ], 'E475:') 32031966c248SBram Moolenaar 32041966c248SBram Moolenaar CheckScriptSuccess([ 32051966c248SBram Moolenaar 'vim9script', 32061966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 32071966c248SBram Moolenaar ]) 32081966c248SBram Moolenaar CheckScriptFailure([ 32091966c248SBram Moolenaar 'vim9script', 32101966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3211d032f34aSBram Moolenaar ], 'E402:') 32121966c248SBram Moolenaar 32131966c248SBram Moolenaar CheckScriptSuccess([ 32141966c248SBram Moolenaar 'vim9script', 32151966c248SBram Moolenaar 'syntax sync # comment', 32161966c248SBram Moolenaar ]) 32171966c248SBram Moolenaar CheckScriptFailure([ 32181966c248SBram Moolenaar 'vim9script', 32191966c248SBram Moolenaar 'syntax sync# comment', 32201966c248SBram Moolenaar ], 'E404:') 32211966c248SBram Moolenaar CheckScriptSuccess([ 32221966c248SBram Moolenaar 'vim9script', 32231966c248SBram Moolenaar 'syntax sync ccomment # comment', 32241966c248SBram Moolenaar ]) 32251966c248SBram Moolenaar CheckScriptFailure([ 32261966c248SBram Moolenaar 'vim9script', 32271966c248SBram Moolenaar 'syntax sync ccomment# comment', 32281966c248SBram Moolenaar ], 'E404:') 32291966c248SBram Moolenaar 32301966c248SBram Moolenaar CheckScriptSuccess([ 32311966c248SBram Moolenaar 'vim9script', 32321966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 32331966c248SBram Moolenaar ]) 32341966c248SBram Moolenaar CheckScriptFailure([ 32351966c248SBram Moolenaar 'vim9script', 32361966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 32371966c248SBram Moolenaar ], 'E475:') 3238a72cfb80SBram Moolenaar 3239a72cfb80SBram Moolenaar CheckScriptSuccess([ 3240a72cfb80SBram Moolenaar 'vim9script', 3241a72cfb80SBram Moolenaar 'command Echo echo # comment', 3242a72cfb80SBram Moolenaar 'command Echo # comment', 32432d870f8dSBram Moolenaar 'delcommand Echo', 3244a72cfb80SBram Moolenaar ]) 3245a72cfb80SBram Moolenaar CheckScriptFailure([ 3246a72cfb80SBram Moolenaar 'vim9script', 3247a72cfb80SBram Moolenaar 'command Echo echo# comment', 3248a72cfb80SBram Moolenaar 'Echo', 3249f8103f27SBram Moolenaar ], 'E1144:') 32502d870f8dSBram Moolenaar delcommand Echo 325170249ee8SBram Moolenaar 325270249ee8SBram Moolenaar var curdir = getcwd() 325370249ee8SBram Moolenaar CheckScriptSuccess([ 325470249ee8SBram Moolenaar 'command Echo cd " comment', 325570249ee8SBram Moolenaar 'Echo', 325670249ee8SBram Moolenaar 'delcommand Echo', 325770249ee8SBram Moolenaar ]) 325870249ee8SBram Moolenaar CheckScriptSuccess([ 3259090728adSBram Moolenaar 'vim9script', 326070249ee8SBram Moolenaar 'command Echo cd # comment', 326170249ee8SBram Moolenaar 'Echo', 326270249ee8SBram Moolenaar 'delcommand Echo', 326370249ee8SBram Moolenaar ]) 326470249ee8SBram Moolenaar CheckScriptFailure([ 326570249ee8SBram Moolenaar 'vim9script', 326670249ee8SBram Moolenaar 'command Echo cd " comment', 326770249ee8SBram Moolenaar 'Echo', 326870249ee8SBram Moolenaar ], 'E344:') 326970249ee8SBram Moolenaar delcommand Echo 327070249ee8SBram Moolenaar chdir(curdir) 327170249ee8SBram Moolenaar 3272a72cfb80SBram Moolenaar CheckScriptFailure([ 3273a72cfb80SBram Moolenaar 'vim9script', 3274a72cfb80SBram Moolenaar 'command Echo# comment', 3275a72cfb80SBram Moolenaar ], 'E182:') 3276a72cfb80SBram Moolenaar CheckScriptFailure([ 3277a72cfb80SBram Moolenaar 'vim9script', 3278a72cfb80SBram Moolenaar 'command Echo echo', 3279a72cfb80SBram Moolenaar 'command Echo# comment', 3280a72cfb80SBram Moolenaar ], 'E182:') 32812d870f8dSBram Moolenaar delcommand Echo 3282a72cfb80SBram Moolenaar 3283a72cfb80SBram Moolenaar CheckScriptSuccess([ 3284a72cfb80SBram Moolenaar 'vim9script', 3285a72cfb80SBram Moolenaar 'function # comment', 3286a72cfb80SBram Moolenaar ]) 3287a72cfb80SBram Moolenaar CheckScriptFailure([ 3288a72cfb80SBram Moolenaar 'vim9script', 32899898107fSBram Moolenaar 'function " comment', 32909898107fSBram Moolenaar ], 'E129:') 32919898107fSBram Moolenaar CheckScriptFailure([ 32929898107fSBram Moolenaar 'vim9script', 3293a72cfb80SBram Moolenaar 'function# comment', 3294f8103f27SBram Moolenaar ], 'E1144:') 3295a72cfb80SBram Moolenaar CheckScriptSuccess([ 3296a72cfb80SBram Moolenaar 'vim9script', 3297a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3298a72cfb80SBram Moolenaar ]) 3299a72cfb80SBram Moolenaar CheckScriptFailure([ 3300a72cfb80SBram Moolenaar 'vim9script', 3301a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3302a72cfb80SBram Moolenaar ], 'E488:') 3303a72cfb80SBram Moolenaar 3304a72cfb80SBram Moolenaar CheckScriptSuccess([ 3305a72cfb80SBram Moolenaar 'vim9script', 33064c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3307a72cfb80SBram Moolenaar 'endfunc', 33084c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3309a72cfb80SBram Moolenaar ]) 3310a72cfb80SBram Moolenaar CheckScriptFailure([ 3311a72cfb80SBram Moolenaar 'vim9script', 33124c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3313a72cfb80SBram Moolenaar 'endfunc', 33144c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3315a72cfb80SBram Moolenaar ], 'E488:') 3316a72cfb80SBram Moolenaar 3317a72cfb80SBram Moolenaar CheckScriptSuccess([ 3318a72cfb80SBram Moolenaar 'vim9script', 3319a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3320a72cfb80SBram Moolenaar ]) 3321a72cfb80SBram Moolenaar CheckScriptFailure([ 3322a72cfb80SBram Moolenaar 'vim9script', 3323a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3324a72cfb80SBram Moolenaar ], 'E488:') 3325e7e4838fSBram Moolenaar 3326e7e4838fSBram Moolenaar CheckScriptFailure([ 3327e7e4838fSBram Moolenaar 'def Test() " comment', 3328e7e4838fSBram Moolenaar 'enddef', 3329e7e4838fSBram Moolenaar ], 'E488:') 3330e7e4838fSBram Moolenaar CheckScriptFailure([ 3331e7e4838fSBram Moolenaar 'vim9script', 3332e7e4838fSBram Moolenaar 'def Test() " comment', 3333e7e4838fSBram Moolenaar 'enddef', 3334e7e4838fSBram Moolenaar ], 'E488:') 3335e7e4838fSBram Moolenaar 3336e7e4838fSBram Moolenaar CheckScriptSuccess([ 3337e7e4838fSBram Moolenaar 'func Test() " comment', 3338e7e4838fSBram Moolenaar 'endfunc', 33392d870f8dSBram Moolenaar 'delfunc Test', 3340e7e4838fSBram Moolenaar ]) 33419898107fSBram Moolenaar CheckScriptSuccess([ 3342e7e4838fSBram Moolenaar 'vim9script', 3343e7e4838fSBram Moolenaar 'func Test() " comment', 3344e7e4838fSBram Moolenaar 'endfunc', 33459898107fSBram Moolenaar ]) 3346e7e4838fSBram Moolenaar 3347e7e4838fSBram Moolenaar CheckScriptSuccess([ 3348e7e4838fSBram Moolenaar 'def Test() # comment', 3349e7e4838fSBram Moolenaar 'enddef', 3350e7e4838fSBram Moolenaar ]) 3351e7e4838fSBram Moolenaar CheckScriptFailure([ 3352e7e4838fSBram Moolenaar 'func Test() # comment', 3353e7e4838fSBram Moolenaar 'endfunc', 3354e7e4838fSBram Moolenaar ], 'E488:') 33550f37e356SBram Moolenaar 33560f37e356SBram Moolenaar var lines =<< trim END 33570f37e356SBram Moolenaar vim9script 33580f37e356SBram Moolenaar syn region Text 33590f37e356SBram Moolenaar \ start='foo' 33600f37e356SBram Moolenaar #\ comment 33610f37e356SBram Moolenaar \ end='bar' 33625072b47aSBram Moolenaar syn region Text start='foo' 33635072b47aSBram Moolenaar #\ comment 33645072b47aSBram Moolenaar \ end='bar' 33650f37e356SBram Moolenaar END 33660f37e356SBram Moolenaar CheckScriptSuccess(lines) 33670f37e356SBram Moolenaar 33680f37e356SBram Moolenaar lines =<< trim END 33690f37e356SBram Moolenaar vim9script 33700f37e356SBram Moolenaar syn region Text 33710f37e356SBram Moolenaar \ start='foo' 33720f37e356SBram Moolenaar "\ comment 33730f37e356SBram Moolenaar \ end='bar' 33740f37e356SBram Moolenaar END 33750f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 33762c5ed4e3SBram Moolenaarenddef 33772c5ed4e3SBram Moolenaar 33782c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 33792c5ed4e3SBram Moolenaar CheckCanRunGui 33802c5ed4e3SBram Moolenaar 33812c5ed4e3SBram Moolenaar CheckScriptFailure([ 33822c5ed4e3SBram Moolenaar 'vim9script', 33832c5ed4e3SBram Moolenaar 'gui#comment' 3384f8103f27SBram Moolenaar ], 'E1144:') 33852c5ed4e3SBram Moolenaar CheckScriptFailure([ 33862c5ed4e3SBram Moolenaar 'vim9script', 33872c5ed4e3SBram Moolenaar 'gui -f#comment' 33882c5ed4e3SBram Moolenaar ], 'E499:') 33897a092245SBram Moolenaarenddef 33907a092245SBram Moolenaar 3391a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 33926797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 33936797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3394a26b9700SBram Moolenaar 3395a26b9700SBram Moolenaar edit test.vim 3396a26b9700SBram Moolenaar doautocmd TabEnter #comment 3397a26b9700SBram Moolenaar assert_equal(1, g:entered) 3398a26b9700SBram Moolenaar 3399a26b9700SBram Moolenaar doautocmd TabEnter f.x 3400a26b9700SBram Moolenaar assert_equal(2, g:entered) 3401a26b9700SBram Moolenaar 3402a26b9700SBram Moolenaar g:entered = 0 3403a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3404a26b9700SBram Moolenaar assert_equal(2, g:entered) 3405a26b9700SBram Moolenaar 3406a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3407a26b9700SBram Moolenaar 3408a26b9700SBram Moolenaar au! TabEnter 3409a26b9700SBram Moolenaar unlet g:entered 3410d72c1bf0SBram Moolenaar 3411d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3412d72c1bf0SBram Moolenaar 'vim9script', 34136797966dSBram Moolenaar 'g:var = 123', 3414e55b1c09SBram Moolenaar 'b:var = 456', 3415e55b1c09SBram Moolenaar 'w:var = 777', 3416e55b1c09SBram Moolenaar 't:var = 888', 3417d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3418d72c1bf0SBram Moolenaar ]) 3419d72c1bf0SBram Moolenaar 3420d72c1bf0SBram Moolenaar CheckScriptFailure([ 3421d72c1bf0SBram Moolenaar 'vim9script', 3422cfcd011fSBram Moolenaar 'let var = 123', 3423cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3424cfcd011fSBram Moolenaar 3425cfcd011fSBram Moolenaar CheckScriptFailure([ 3426cfcd011fSBram Moolenaar 'vim9script', 3427cfcd011fSBram Moolenaar 'var g:var = 123', 3428e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3429e55b1c09SBram Moolenaar 3430e55b1c09SBram Moolenaar CheckScriptFailure([ 3431e55b1c09SBram Moolenaar 'vim9script', 3432cfcd011fSBram Moolenaar 'var b:var = 123', 3433e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3434e55b1c09SBram Moolenaar 3435e55b1c09SBram Moolenaar CheckScriptFailure([ 3436e55b1c09SBram Moolenaar 'vim9script', 3437cfcd011fSBram Moolenaar 'var w:var = 123', 3438e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3439e55b1c09SBram Moolenaar 3440e55b1c09SBram Moolenaar CheckScriptFailure([ 3441e55b1c09SBram Moolenaar 'vim9script', 3442cfcd011fSBram Moolenaar 'var t:var = 123', 3443e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3444e55b1c09SBram Moolenaar 3445e55b1c09SBram Moolenaar CheckScriptFailure([ 3446e55b1c09SBram Moolenaar 'vim9script', 3447cfcd011fSBram Moolenaar 'var v:version = 123', 3448e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3449e55b1c09SBram Moolenaar 3450e55b1c09SBram Moolenaar CheckScriptFailure([ 3451e55b1c09SBram Moolenaar 'vim9script', 3452cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3453e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 34546797966dSBram Moolenaar 34556797966dSBram Moolenaar CheckScriptFailure([ 34566797966dSBram Moolenaar 'vim9script', 34576797966dSBram Moolenaar 'g:var = 123', 345832e35117SBram Moolenaar 'unlet g:var# comment1', 3459d72c1bf0SBram Moolenaar ], 'E108:') 3460d72c1bf0SBram Moolenaar 3461d72c1bf0SBram Moolenaar CheckScriptFailure([ 3462d72c1bf0SBram Moolenaar 'let g:var = 123', 3463d72c1bf0SBram Moolenaar 'unlet g:var # something', 3464d72c1bf0SBram Moolenaar ], 'E488:') 3465faac4104SBram Moolenaar 3466faac4104SBram Moolenaar CheckScriptSuccess([ 3467faac4104SBram Moolenaar 'vim9script', 346832e35117SBram Moolenaar 'if 1 # comment2', 3469faac4104SBram Moolenaar ' echo "yes"', 3470faac4104SBram Moolenaar 'elseif 2 #comment', 3471faac4104SBram Moolenaar ' echo "no"', 3472faac4104SBram Moolenaar 'endif', 3473faac4104SBram Moolenaar ]) 3474faac4104SBram Moolenaar 3475faac4104SBram Moolenaar CheckScriptFailure([ 3476faac4104SBram Moolenaar 'vim9script', 347732e35117SBram Moolenaar 'if 1# comment3', 3478faac4104SBram Moolenaar ' echo "yes"', 3479faac4104SBram Moolenaar 'endif', 3480fae55a9cSBram Moolenaar ], 'E488:') 3481faac4104SBram Moolenaar 3482faac4104SBram Moolenaar CheckScriptFailure([ 3483faac4104SBram Moolenaar 'vim9script', 348432e35117SBram Moolenaar 'if 0 # comment4', 3485faac4104SBram Moolenaar ' echo "yes"', 3486faac4104SBram Moolenaar 'elseif 2#comment', 3487faac4104SBram Moolenaar ' echo "no"', 3488faac4104SBram Moolenaar 'endif', 3489fae55a9cSBram Moolenaar ], 'E488:') 3490faac4104SBram Moolenaar 3491faac4104SBram Moolenaar CheckScriptSuccess([ 3492faac4104SBram Moolenaar 'vim9script', 3493cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3494faac4104SBram Moolenaar ]) 3495faac4104SBram Moolenaar 3496faac4104SBram Moolenaar CheckScriptFailure([ 3497faac4104SBram Moolenaar 'vim9script', 3498cfcd011fSBram Moolenaar 'var v = 1# comment6', 3499fae55a9cSBram Moolenaar ], 'E488:') 3500faac4104SBram Moolenaar 3501faac4104SBram Moolenaar CheckScriptSuccess([ 3502faac4104SBram Moolenaar 'vim9script', 3503faac4104SBram Moolenaar 'new' 3504d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3505df069eecSBram Moolenaar ':$', 3506faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3507faac4104SBram Moolenaar 'bwipe!', 3508faac4104SBram Moolenaar ]) 3509faac4104SBram Moolenaar 3510f5be8cdbSBram Moolenaar CheckScriptFailure([ 3511f5be8cdbSBram Moolenaar 'vim9script', 3512f5be8cdbSBram Moolenaar 'new' 3513d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3514f5be8cdbSBram Moolenaar ':$', 3515f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3516f5be8cdbSBram Moolenaar 'bwipe!', 3517f5be8cdbSBram Moolenaar ], 'E488:') 3518f5be8cdbSBram Moolenaar 3519f5be8cdbSBram Moolenaar CheckScriptFailure([ 3520f5be8cdbSBram Moolenaar 'vim9script', 3521f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3522f5be8cdbSBram Moolenaar ], 'E477:') 3523a26b9700SBram Moolenaarenddef 3524a26b9700SBram Moolenaar 35257e5bd91dSBram Moolenaardef Test_finish() 3526cfcd011fSBram Moolenaar var lines =<< trim END 35277e5bd91dSBram Moolenaar vim9script 35286797966dSBram Moolenaar g:res = 'one' 35297e5bd91dSBram Moolenaar if v:false | finish | endif 35306797966dSBram Moolenaar g:res = 'two' 35317e5bd91dSBram Moolenaar finish 35326797966dSBram Moolenaar g:res = 'three' 35337e5bd91dSBram Moolenaar END 35347e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 35357e5bd91dSBram Moolenaar source Xfinished 35367e5bd91dSBram Moolenaar assert_equal('two', g:res) 35377e5bd91dSBram Moolenaar 35387e5bd91dSBram Moolenaar unlet g:res 35397e5bd91dSBram Moolenaar delete('Xfinished') 35407e5bd91dSBram Moolenaarenddef 35417e5bd91dSBram Moolenaar 3542a5d0077eSBram Moolenaardef Test_forward_declaration() 3543cfcd011fSBram Moolenaar var lines =<< trim END 3544a5d0077eSBram Moolenaar vim9script 3545a5d0077eSBram Moolenaar def GetValue(): string 3546a5d0077eSBram Moolenaar return theVal 3547a5d0077eSBram Moolenaar enddef 3548cfcd011fSBram Moolenaar var theVal = 'something' 3549822ba247SBram Moolenaar g:initVal = GetValue() 3550a5d0077eSBram Moolenaar theVal = 'else' 3551a5d0077eSBram Moolenaar g:laterVal = GetValue() 3552a5d0077eSBram Moolenaar END 3553a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3554a5d0077eSBram Moolenaar source Xforward 3555a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3556a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3557a5d0077eSBram Moolenaar 3558a5d0077eSBram Moolenaar unlet g:initVal 3559a5d0077eSBram Moolenaar unlet g:laterVal 3560a5d0077eSBram Moolenaar delete('Xforward') 3561a5d0077eSBram Moolenaarenddef 3562a5d0077eSBram Moolenaar 35639721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3564a6294955SBram Moolenaar var vim9_lines =<< trim END 3565a6294955SBram Moolenaar vim9script 3566a6294955SBram Moolenaar var local = 'local' 3567a6294955SBram Moolenaar g:global = 'global' 3568a6294955SBram Moolenaar export var exported = 'exported' 3569a6294955SBram Moolenaar export def GetText(): string 3570a6294955SBram Moolenaar return 'text' 3571a6294955SBram Moolenaar enddef 3572a6294955SBram Moolenaar END 3573a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3574a6294955SBram Moolenaar 3575cfcd011fSBram Moolenaar var legacy_lines =<< trim END 35769721fb4eSBram Moolenaar source Xvim9_script.vim 35779721fb4eSBram Moolenaar 35789721fb4eSBram Moolenaar call assert_false(exists('local')) 35799721fb4eSBram Moolenaar call assert_false(exists('exported')) 35809721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 35819721fb4eSBram Moolenaar call assert_equal('global', global) 35829721fb4eSBram Moolenaar call assert_equal('global', g:global) 35839721fb4eSBram Moolenaar 35849721fb4eSBram Moolenaar " imported variable becomes script-local 35859721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 35869721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 35879721fb4eSBram Moolenaar call assert_false(exists('exported')) 35889721fb4eSBram Moolenaar 35899721fb4eSBram Moolenaar " imported function becomes script-local 35909721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 35919721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 35929721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 35939721fb4eSBram Moolenaar END 35949721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 35959721fb4eSBram Moolenaar 35969721fb4eSBram Moolenaar source Xlegacy_script.vim 35979721fb4eSBram Moolenaar assert_equal('global', g:global) 3598f5be8cdbSBram Moolenaar unlet g:global 35999721fb4eSBram Moolenaar 36009721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 36019721fb4eSBram Moolenaar delete('Xvim9_script.vim') 36029721fb4eSBram Moolenaarenddef 3603a5d0077eSBram Moolenaar 3604e535db86SBram Moolenaardef Test_declare_script_in_func() 3605e535db86SBram Moolenaar var lines =<< trim END 3606e535db86SBram Moolenaar vim9script 3607e535db86SBram Moolenaar func Declare() 3608e535db86SBram Moolenaar let s:local = 123 3609e535db86SBram Moolenaar endfunc 3610e535db86SBram Moolenaar Declare() 3611e535db86SBram Moolenaar assert_equal(123, local) 3612e535db86SBram Moolenaar 3613e535db86SBram Moolenaar var error: string 3614e535db86SBram Moolenaar try 3615e535db86SBram Moolenaar local = 'asdf' 3616e535db86SBram Moolenaar catch 3617e535db86SBram Moolenaar error = v:exception 3618e535db86SBram Moolenaar endtry 3619e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3620e535db86SBram Moolenaar 3621e535db86SBram Moolenaar lockvar local 3622e535db86SBram Moolenaar try 3623e535db86SBram Moolenaar local = 999 3624e535db86SBram Moolenaar catch 3625e535db86SBram Moolenaar error = v:exception 3626e535db86SBram Moolenaar endtry 3627e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3628e535db86SBram Moolenaar END 3629e535db86SBram Moolenaar CheckScriptSuccess(lines) 3630e535db86SBram Moolenaarenddef 3631e535db86SBram Moolenaar 3632e535db86SBram Moolenaar 36337d699701SBram Moolenaarfunc Test_vim9script_not_global() 36347d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 36357d699701SBram Moolenaar let vim9lines =<< trim END 36367d699701SBram Moolenaar vim9script 3637cfcd011fSBram Moolenaar var name = 'local' 36387d699701SBram Moolenaar func TheFunc() 36397d699701SBram Moolenaar echo 'local' 36407d699701SBram Moolenaar endfunc 36417d699701SBram Moolenaar def DefFunc() 36427d699701SBram Moolenaar echo 'local' 36437d699701SBram Moolenaar enddef 36447d699701SBram Moolenaar END 36457d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 36467d699701SBram Moolenaar source Xvim9script.vim 36477d699701SBram Moolenaar try 36487d699701SBram Moolenaar echo g:var 36497d699701SBram Moolenaar assert_report('did not fail') 36507d699701SBram Moolenaar catch /E121:/ 36517d699701SBram Moolenaar " caught 36527d699701SBram Moolenaar endtry 36537d699701SBram Moolenaar try 36547d699701SBram Moolenaar call TheFunc() 36557d699701SBram Moolenaar assert_report('did not fail') 36567d699701SBram Moolenaar catch /E117:/ 36577d699701SBram Moolenaar " caught 36587d699701SBram Moolenaar endtry 36597d699701SBram Moolenaar try 36607d699701SBram Moolenaar call DefFunc() 36617d699701SBram Moolenaar assert_report('did not fail') 36627d699701SBram Moolenaar catch /E117:/ 36637d699701SBram Moolenaar " caught 36647d699701SBram Moolenaar endtry 36657d699701SBram Moolenaar 366625859dd7SBram Moolenaar call delete('Xvim9script.vim') 36677d699701SBram Moolenaarendfunc 36687d699701SBram Moolenaar 3669eeb27bfeSBram Moolenaardef Test_vim9_copen() 3670eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3671eeb27bfeSBram Moolenaar copen 3672eeb27bfeSBram Moolenaar quit 3673eeb27bfeSBram Moolenaarenddef 3674eeb27bfeSBram Moolenaar 367503290b84SBram Moolenaar" test using an auto-loaded function and variable 36762d6b20d6SBram Moolenaardef Test_vim9_autoload() 3677cfcd011fSBram Moolenaar var lines =<< trim END 36782d6b20d6SBram Moolenaar vim9script 367903290b84SBram Moolenaar def some#gettest(): string 368003290b84SBram Moolenaar return 'test' 368103290b84SBram Moolenaar enddef 368203290b84SBram Moolenaar g:some#name = 'name' 3683227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3684e3ffcd99SBram Moolenaar 3685e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3686e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3687e3ffcd99SBram Moolenaar enddef 368803290b84SBram Moolenaar END 368903290b84SBram Moolenaar 369003290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 369103290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 369203290b84SBram Moolenaar var save_rtp = &rtp 369303290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 369403290b84SBram Moolenaar 369503290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 369603290b84SBram Moolenaar assert_equal('name', g:some#name) 3697227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 369803290b84SBram Moolenaar g:some#other = 'other' 369903290b84SBram Moolenaar assert_equal('other', g:some#other) 370003290b84SBram Moolenaar 3701e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3702e3ffcd99SBram Moolenaar 370317f700acSBram Moolenaar # upper case script name works 370417f700acSBram Moolenaar lines =<< trim END 370517f700acSBram Moolenaar vim9script 370617f700acSBram Moolenaar def Other#getOther(): string 370717f700acSBram Moolenaar return 'other' 370817f700acSBram Moolenaar enddef 370917f700acSBram Moolenaar END 371017f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 371117f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 371217f700acSBram Moolenaar 371303290b84SBram Moolenaar delete('Xdir', 'rf') 371403290b84SBram Moolenaar &rtp = save_rtp 371503290b84SBram Moolenaarenddef 371603290b84SBram Moolenaar 371703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 371803290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 371903290b84SBram Moolenaar var lines =<< trim END 372003290b84SBram Moolenaar vim9script 37212d6b20d6SBram Moolenaar def foo#test() 37222d6b20d6SBram Moolenaar echomsg getreg('"') 37232d6b20d6SBram Moolenaar enddef 37242d6b20d6SBram Moolenaar END 37252d6b20d6SBram Moolenaar 37262d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 37272d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3728cfcd011fSBram Moolenaar var save_rtp = &rtp 37292d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 37302d6b20d6SBram Moolenaar augroup test 37312d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 37322d6b20d6SBram Moolenaar augroup END 37332d6b20d6SBram Moolenaar 37342d6b20d6SBram Moolenaar normal Y 37352d6b20d6SBram Moolenaar 37362d6b20d6SBram Moolenaar augroup test 37372d6b20d6SBram Moolenaar autocmd! 37382d6b20d6SBram Moolenaar augroup END 37392d6b20d6SBram Moolenaar delete('Xdir', 'rf') 37402d6b20d6SBram Moolenaar &rtp = save_rtp 37412d6b20d6SBram Moolenaarenddef 37422d6b20d6SBram Moolenaar 374377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 374477e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3745cfcd011fSBram Moolenaar var lines =<< trim END 374677e5dcc3SBram Moolenaar vim9script 374777e5dcc3SBram Moolenaar def crash#func() 374877e5dcc3SBram Moolenaar try 374977e5dcc3SBram Moolenaar for x in List() 375077e5dcc3SBram Moolenaar endfor 375177e5dcc3SBram Moolenaar catch 375277e5dcc3SBram Moolenaar endtry 375377e5dcc3SBram Moolenaar g:ok = true 375477e5dcc3SBram Moolenaar enddef 375577e5dcc3SBram Moolenaar fu List() 375677e5dcc3SBram Moolenaar invalid 375777e5dcc3SBram Moolenaar endfu 375877e5dcc3SBram Moolenaar try 375948e11c10SBram Moolenaar alsoinvalid 376077e5dcc3SBram Moolenaar catch /wontmatch/ 376177e5dcc3SBram Moolenaar endtry 376277e5dcc3SBram Moolenaar END 376377e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 376477e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 376577e5dcc3SBram Moolenaar 376677e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 376777e5dcc3SBram Moolenaar lines =<< trim END 376877e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 376977e5dcc3SBram Moolenaar call crash#func() 377077e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 37719c4f5520SBram Moolenaar qall! 377277e5dcc3SBram Moolenaar END 377377e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 377477e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 377577e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 377677e5dcc3SBram Moolenaar 377777e5dcc3SBram Moolenaar delete('Xdidit') 377877e5dcc3SBram Moolenaar delete('Xscript') 377977e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 378003290b84SBram Moolenaar 378103290b84SBram Moolenaar lines =<< trim END 378203290b84SBram Moolenaar vim9script 378303290b84SBram Moolenaar var foo#bar = 'asdf' 378403290b84SBram Moolenaar END 378503290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 378677e5dcc3SBram Moolenaarenddef 378777e5dcc3SBram Moolenaar 378881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 378981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 379081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3791cfcd011fSBram Moolenaar var lines =<< trim END 379281e17fbeSBram Moolenaar let s:counter = 1 379381e17fbeSBram Moolenaar def s:Func() 379481e17fbeSBram Moolenaar au! CursorHold 379581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 379681e17fbeSBram Moolenaar enddef 379781e17fbeSBram Moolenaar call s:Func() 379881e17fbeSBram Moolenaar doau CursorHold 379981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 380081e17fbeSBram Moolenaar au! CursorHold 380181e17fbeSBram Moolenaar END 380281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 380381e17fbeSBram Moolenaarenddef 380481e17fbeSBram Moolenaar 3805b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3806b5841b99SBram Moolenaar var save_rtp = &rtp 3807b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3808b5841b99SBram Moolenaar &rtp = dir 3809b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3810b5841b99SBram Moolenaar 3811b5841b99SBram Moolenaar var lines =<< trim END 3812b5841b99SBram Moolenaar vim9script noclear 3813b5841b99SBram Moolenaar def script#autoloaded() 3814b5841b99SBram Moolenaar enddef 3815b5841b99SBram Moolenaar def Broken() 3816b5841b99SBram Moolenaar var x: any = '' 3817b5841b99SBram Moolenaar eval x != 0 3818b5841b99SBram Moolenaar enddef 3819b5841b99SBram Moolenaar Broken() 3820b5841b99SBram Moolenaar END 3821b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3822b5841b99SBram Moolenaar 3823b5841b99SBram Moolenaar lines =<< trim END 3824b5841b99SBram Moolenaar vim9script 3825b5841b99SBram Moolenaar def CallAutoloaded() 3826b5841b99SBram Moolenaar script#autoloaded() 3827b5841b99SBram Moolenaar enddef 3828b5841b99SBram Moolenaar 3829b5841b99SBram Moolenaar function Legacy() 3830b5841b99SBram Moolenaar try 3831b5841b99SBram Moolenaar call s:CallAutoloaded() 3832b5841b99SBram Moolenaar catch 3833b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3834b5841b99SBram Moolenaar endtry 3835b5841b99SBram Moolenaar endfunction 3836b5841b99SBram Moolenaar 3837b5841b99SBram Moolenaar Legacy() 3838b5841b99SBram Moolenaar END 3839b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3840b5841b99SBram Moolenaar 3841b5841b99SBram Moolenaar &rtp = save_rtp 3842b5841b99SBram Moolenaar delete(dir, 'rf') 3843b5841b99SBram Moolenaarenddef 3844b5841b99SBram Moolenaar 38453896a105SBram Moolenaardef Test_cmdline_win() 38463896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 38473896a105SBram Moolenaar # the command line window. 38483896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3849cfcd011fSBram Moolenaar var export_lines =<< trim END 38503896a105SBram Moolenaar vim9script 3851cfcd011fSBram Moolenaar export var That = 'yes' 38523896a105SBram Moolenaar END 38533896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3854cfcd011fSBram Moolenaar var import_lines =<< trim END 38553896a105SBram Moolenaar vim9script 38563896a105SBram Moolenaar import That from './Xexport.vim' 38573896a105SBram Moolenaar END 38583896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3859cfcd011fSBram Moolenaar var save_rtp = &rtp 38603896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 38613896a105SBram Moolenaar syntax on 38623896a105SBram Moolenaar augroup CmdWin 38633896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 38643896a105SBram Moolenaar augroup END 38653896a105SBram Moolenaar # this will open and also close the cmdline window 38663896a105SBram Moolenaar feedkeys('q:', 'xt') 38673896a105SBram Moolenaar assert_equal('yes', g:got_there) 38683896a105SBram Moolenaar 38693896a105SBram Moolenaar augroup CmdWin 38703896a105SBram Moolenaar au! 38713896a105SBram Moolenaar augroup END 38723896a105SBram Moolenaar &rtp = save_rtp 38733896a105SBram Moolenaar delete('rtp', 'rf') 38743896a105SBram Moolenaarenddef 38753896a105SBram Moolenaar 3876e3d4685fSBram Moolenaardef Test_invalid_sid() 3877e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 387825859dd7SBram Moolenaar 38799c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3880d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3881e3d4685fSBram Moolenaar endif 3882e3d4685fSBram Moolenaar delete('Xdidit') 3883e3d4685fSBram Moolenaarenddef 3884e3d4685fSBram Moolenaar 38859ec7026fSBram Moolenaardef Test_restoring_cpo() 38869ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 38879ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 38889ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 38899ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 38909ec7026fSBram Moolenaar endif 38919ec7026fSBram Moolenaar delete('Xsourced') 38929ec7026fSBram Moolenaar delete('Xclose') 3893090728adSBram Moolenaar delete('Xdone') 38940123cc1eSBram Moolenaar 38950123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 38960123cc1eSBram Moolenaar set cpo=aABceFsMny> 38970123cc1eSBram Moolenaar edit XanotherScript 38980123cc1eSBram Moolenaar so % 38990123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 39000123cc1eSBram Moolenaar :1del 39010123cc1eSBram Moolenaar w 39020123cc1eSBram Moolenaar so % 39030123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 39040123cc1eSBram Moolenaar 39050123cc1eSBram Moolenaar delete('XanotherScript') 39060123cc1eSBram Moolenaar set cpo&vim 39079ec7026fSBram Moolenaarenddef 39089ec7026fSBram Moolenaar 3909ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3910ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 391137294bd6SBram Moolenaar CheckScreendump 3912ffb7dcdbSBram Moolenaar CheckFeature timers 391337294bd6SBram Moolenaar 3914ffb7dcdbSBram Moolenaar let lines =<< trim END 391537294bd6SBram Moolenaar vim9script 391637294bd6SBram Moolenaar def script#func() 391737294bd6SBram Moolenaar enddef 391837294bd6SBram Moolenaar END 3919ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3920ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 392137294bd6SBram Moolenaar 3922ffb7dcdbSBram Moolenaar let lines =<< trim END 392337294bd6SBram Moolenaar vim9script 392437294bd6SBram Moolenaar set cpo+=M 392537294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3926767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 392737294bd6SBram Moolenaar setline(1, 'some text') 392837294bd6SBram Moolenaar END 3929ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3930ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3931ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3932ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 393337294bd6SBram Moolenaar 3934ffb7dcdbSBram Moolenaar " clean up 3935ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3936ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3937ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3938ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3939ffb7dcdbSBram Moolenaarendfunc 394037294bd6SBram Moolenaar 39419ec7026fSBram Moolenaar 3942f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3943cfcd011fSBram Moolenaar var lines =<< trim END 3944cfcd011fSBram Moolenaar var name: any 3945cfcd011fSBram Moolenaar assert_equal(0, name) 3946f0afd9e1SBram Moolenaar END 3947f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3948f0afd9e1SBram Moolenaarenddef 3949f0afd9e1SBram Moolenaar 39507e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 395158dbef33SBram Moolenaar CheckRunVimInTerminal 395258dbef33SBram Moolenaar 39537e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 39547e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 39557e9210eaSBram Moolenaarendfunc 39567e9210eaSBram Moolenaar 39577e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 39589c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3959cfcd011fSBram Moolenaar var lines =<< trim END 39609c4f5520SBram Moolenaar func CheckAndQuit() 39619c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 39629c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 39639c4f5520SBram Moolenaar endfunc 39649c4f5520SBram Moolenaar END 39659c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 39669c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3967e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 39689c4f5520SBram Moolenaar # define Afunc() on the command line 39699c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 39709c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 39712949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 39729c4f5520SBram Moolenaar 39739c4f5520SBram Moolenaar call StopVimInTerminal(buf) 39749c4f5520SBram Moolenaar delete('XcallFunc') 39759c4f5520SBram Moolenaar delete('Xdidcmd') 39769c4f5520SBram Moolenaarenddef 39779c4f5520SBram Moolenaar 3978fcdc5d83SBram Moolenaardef Test_script_var_scope() 3979fcdc5d83SBram Moolenaar var lines =<< trim END 3980fcdc5d83SBram Moolenaar vim9script 3981fcdc5d83SBram Moolenaar if true 3982fcdc5d83SBram Moolenaar if true 3983fcdc5d83SBram Moolenaar var one = 'one' 3984fcdc5d83SBram Moolenaar echo one 3985fcdc5d83SBram Moolenaar endif 3986fcdc5d83SBram Moolenaar echo one 3987fcdc5d83SBram Moolenaar endif 3988fcdc5d83SBram Moolenaar END 3989fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3990fcdc5d83SBram Moolenaar 3991fcdc5d83SBram Moolenaar lines =<< trim END 3992fcdc5d83SBram Moolenaar vim9script 3993fcdc5d83SBram Moolenaar if true 3994fcdc5d83SBram Moolenaar if false 3995fcdc5d83SBram Moolenaar var one = 'one' 3996fcdc5d83SBram Moolenaar echo one 3997fcdc5d83SBram Moolenaar else 3998fcdc5d83SBram Moolenaar var one = 'one' 3999fcdc5d83SBram Moolenaar echo one 4000fcdc5d83SBram Moolenaar endif 4001fcdc5d83SBram Moolenaar echo one 4002fcdc5d83SBram Moolenaar endif 4003fcdc5d83SBram Moolenaar END 4004fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4005fcdc5d83SBram Moolenaar 4006fcdc5d83SBram Moolenaar lines =<< trim END 4007fcdc5d83SBram Moolenaar vim9script 4008fcdc5d83SBram Moolenaar while true 4009fcdc5d83SBram Moolenaar var one = 'one' 4010fcdc5d83SBram Moolenaar echo one 4011fcdc5d83SBram Moolenaar break 4012fcdc5d83SBram Moolenaar endwhile 4013fcdc5d83SBram Moolenaar echo one 4014fcdc5d83SBram Moolenaar END 4015fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4016fcdc5d83SBram Moolenaar 4017fcdc5d83SBram Moolenaar lines =<< trim END 4018fcdc5d83SBram Moolenaar vim9script 4019fcdc5d83SBram Moolenaar for i in range(1) 4020fcdc5d83SBram Moolenaar var one = 'one' 4021fcdc5d83SBram Moolenaar echo one 4022fcdc5d83SBram Moolenaar endfor 4023fcdc5d83SBram Moolenaar echo one 4024fcdc5d83SBram Moolenaar END 4025fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 40269becdf2bSBram Moolenaar 40279becdf2bSBram Moolenaar lines =<< trim END 40289becdf2bSBram Moolenaar vim9script 40299becdf2bSBram Moolenaar { 40309becdf2bSBram Moolenaar var one = 'one' 40319becdf2bSBram Moolenaar assert_equal('one', one) 40329becdf2bSBram Moolenaar } 40339becdf2bSBram Moolenaar assert_false(exists('one')) 40349becdf2bSBram Moolenaar assert_false(exists('s:one')) 40359becdf2bSBram Moolenaar END 40369becdf2bSBram Moolenaar CheckScriptSuccess(lines) 40379becdf2bSBram Moolenaar 40389becdf2bSBram Moolenaar lines =<< trim END 40399becdf2bSBram Moolenaar vim9script 40409becdf2bSBram Moolenaar { 40419becdf2bSBram Moolenaar var one = 'one' 40429becdf2bSBram Moolenaar echo one 40439becdf2bSBram Moolenaar } 40449becdf2bSBram Moolenaar echo one 40459becdf2bSBram Moolenaar END 40469becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4047fcdc5d83SBram Moolenaarenddef 4048fcdc5d83SBram Moolenaar 4049352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4050352134bbSBram Moolenaar var lines =<< trim END 4051352134bbSBram Moolenaar vim9script 40522a38908bSBram Moolenaar def Callback(...l: list<any>) 4053352134bbSBram Moolenaar try 4054352134bbSBram Moolenaar var x: string 4055352134bbSBram Moolenaar var y: string 4056352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4057352134bbSBram Moolenaar [x, y] = [''] 4058352134bbSBram Moolenaar catch 4059352134bbSBram Moolenaar g:caught = 'yes' 4060352134bbSBram Moolenaar endtry 4061352134bbSBram Moolenaar enddef 4062e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4063352134bbSBram Moolenaar feedkeys("\r", 'xt') 4064352134bbSBram Moolenaar END 4065352134bbSBram Moolenaar CheckScriptSuccess(lines) 4066352134bbSBram Moolenaar 4067352134bbSBram Moolenaar unlet g:caught 4068352134bbSBram Moolenaarenddef 4069352134bbSBram Moolenaar 4070631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4071631e8f93SBram Moolenaar if !has('unix') || !has('job') 4072631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4073631e8f93SBram Moolenaar endif 4074631e8f93SBram Moolenaar var lines =<< trim END 4075631e8f93SBram Moolenaar vim9script 4076631e8f93SBram Moolenaar var source: list<number> 40772a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4078631e8f93SBram Moolenaar eval [][0] 4079631e8f93SBram Moolenaar enddef 40802a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4081631e8f93SBram Moolenaar sleep 1m 4082631e8f93SBram Moolenaar source += l 4083631e8f93SBram Moolenaar enddef 4084e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 40856f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 40866f17a3f0SBram Moolenaar sleep 10m 40876f17a3f0SBram Moolenaar endwhile 4088206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4089fe95b94fSBram Moolenaar sleep 200m 4090631e8f93SBram Moolenaar END 4091631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4092631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4093631e8f93SBram Moolenaar delete('Xdef') 4094631e8f93SBram Moolenaarenddef 4095631e8f93SBram Moolenaar 40964324d87aSBram Moolenaardef InvokeNormal() 40974324d87aSBram Moolenaar exe "norm! :m+1\r" 40984324d87aSBram Moolenaarenddef 40994324d87aSBram Moolenaar 41004324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 41014324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 41024324d87aSBram Moolenaar new 41034324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 41044324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 41054324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 41064324d87aSBram Moolenaar xunmap <F3> 4107b5b9480eSBram Moolenaarenddef 4108b5b9480eSBram Moolenaar 4109b5b9480eSBram Moolenaardef Test_white_space_after_command() 4110b5b9480eSBram Moolenaar var lines =<< trim END 4111b5b9480eSBram Moolenaar exit_cb: Func}) 4112b5b9480eSBram Moolenaar END 4113b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4114f8103f27SBram Moolenaar 4115f8103f27SBram Moolenaar lines =<< trim END 4116f8103f27SBram Moolenaar e# 4117f8103f27SBram Moolenaar END 4118f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 41194324d87aSBram Moolenaarenddef 41204324d87aSBram Moolenaar 41214aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 41224aab88d9SBram Moolenaar var lines =<< trim END 41234aab88d9SBram Moolenaar vim9script 41244aab88d9SBram Moolenaar if exists('g:guard') 41254aab88d9SBram Moolenaar finish 41264aab88d9SBram Moolenaar endif 41274aab88d9SBram Moolenaar g:guard = 1 41284aab88d9SBram Moolenaar var name = 'thename' 41294aab88d9SBram Moolenaar def g:GetName(): string 41304aab88d9SBram Moolenaar return name 41314aab88d9SBram Moolenaar enddef 41324aab88d9SBram Moolenaar def g:SetName(arg: string) 41334aab88d9SBram Moolenaar name = arg 41344aab88d9SBram Moolenaar enddef 41354aab88d9SBram Moolenaar END 41364aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 41374aab88d9SBram Moolenaar so XscriptTwice.vim 41384aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 41394aab88d9SBram Moolenaar g:SetName('newname') 41404aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 41414aab88d9SBram Moolenaar so XscriptTwice.vim 41424aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41434aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 41444aab88d9SBram Moolenaar 41454aab88d9SBram Moolenaar delfunc g:GetName 41464aab88d9SBram Moolenaar delfunc g:SetName 41474aab88d9SBram Moolenaar delete('XscriptTwice.vim') 41484aab88d9SBram Moolenaar unlet g:guard 41494aab88d9SBram Moolenaarenddef 41504aab88d9SBram Moolenaar 41514aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 41524aab88d9SBram Moolenaar var exportlines =<< trim END 41534aab88d9SBram Moolenaar vim9script 41544aab88d9SBram Moolenaar if exists('g:guard') 41554aab88d9SBram Moolenaar finish 41564aab88d9SBram Moolenaar endif 41574aab88d9SBram Moolenaar g:guard = 1 41584aab88d9SBram Moolenaar export var name = 'someName' 41594aab88d9SBram Moolenaar END 41604aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 41614aab88d9SBram Moolenaar 41624aab88d9SBram Moolenaar var lines =<< trim END 41634aab88d9SBram Moolenaar vim9script 41644aab88d9SBram Moolenaar import name from './XexportScript.vim' 41654aab88d9SBram Moolenaar def g:GetName(): string 41664aab88d9SBram Moolenaar return name 41674aab88d9SBram Moolenaar enddef 41684aab88d9SBram Moolenaar END 41694aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 41704aab88d9SBram Moolenaar so XscriptImport.vim 41714aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 41724aab88d9SBram Moolenaar 41734aab88d9SBram Moolenaar so XexportScript.vim 41744aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41754aab88d9SBram Moolenaar 41764aab88d9SBram Moolenaar delfunc g:GetName 41774aab88d9SBram Moolenaar delete('XexportScript.vim') 41784aab88d9SBram Moolenaar delete('XscriptImport.vim') 41794aab88d9SBram Moolenaar unlet g:guard 41804aab88d9SBram Moolenaarenddef 41814aab88d9SBram Moolenaar 418210b9421fSBram Moolenaardef Test_unsupported_commands() 418310b9421fSBram Moolenaar var lines =<< trim END 418410b9421fSBram Moolenaar ka 418510b9421fSBram Moolenaar END 41867d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41877d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 418810b9421fSBram Moolenaar 418910b9421fSBram Moolenaar lines =<< trim END 4190ada1d870SBram Moolenaar :1ka 4191ada1d870SBram Moolenaar END 41927d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41937d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4194ada1d870SBram Moolenaar 4195ada1d870SBram Moolenaar lines =<< trim END 419610b9421fSBram Moolenaar t 419710b9421fSBram Moolenaar END 419810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 419910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 420010b9421fSBram Moolenaar 420110b9421fSBram Moolenaar lines =<< trim END 420210b9421fSBram Moolenaar x 420310b9421fSBram Moolenaar END 420410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 420510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 420610b9421fSBram Moolenaar 420710b9421fSBram Moolenaar lines =<< trim END 420810b9421fSBram Moolenaar xit 420910b9421fSBram Moolenaar END 421010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 421110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 421210b9421fSBram Moolenaarenddef 421310b9421fSBram Moolenaar 4214c70fe460SBram Moolenaardef Test_mapping_line_number() 4215c70fe460SBram Moolenaar var lines =<< trim END 4216c70fe460SBram Moolenaar vim9script 4217c70fe460SBram Moolenaar def g:FuncA() 4218c70fe460SBram Moolenaar # Some comment 4219c70fe460SBram Moolenaar FuncB(0) 4220c70fe460SBram Moolenaar enddef 4221c70fe460SBram Moolenaar # Some comment 4222c70fe460SBram Moolenaar def FuncB( 4223c70fe460SBram Moolenaar # Some comment 4224c70fe460SBram Moolenaar n: number 4225c70fe460SBram Moolenaar ) 4226c70fe460SBram Moolenaar exe 'nno ' 4227c70fe460SBram Moolenaar # Some comment 4228c70fe460SBram Moolenaar .. '<F3> a' 4229c70fe460SBram Moolenaar .. 'b' 4230c70fe460SBram Moolenaar .. 'c' 4231c70fe460SBram Moolenaar enddef 4232c70fe460SBram Moolenaar END 4233c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4234c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4235c70fe460SBram Moolenaar assert_match('No mapping found', res) 4236c70fe460SBram Moolenaar 4237c70fe460SBram Moolenaar g:FuncA() 4238c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4239c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4240c70fe460SBram Moolenaar 4241c70fe460SBram Moolenaar nunmap <F3> 4242c70fe460SBram Moolenaar delfunc g:FuncA 4243c70fe460SBram Moolenaarenddef 4244c70fe460SBram Moolenaar 4245deb108baSBram Moolenaardef Test_option_set() 4246deb108baSBram Moolenaar # legacy script allows for white space 4247deb108baSBram Moolenaar var lines =<< trim END 4248deb108baSBram Moolenaar set foldlevel =11 4249deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4250deb108baSBram Moolenaar END 4251deb108baSBram Moolenaar CheckScriptSuccess(lines) 4252deb108baSBram Moolenaar 4253deb108baSBram Moolenaar set foldlevel 4254deb108baSBram Moolenaar set foldlevel=12 4255deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4256deb108baSBram Moolenaar set foldlevel+=2 4257deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4258deb108baSBram Moolenaar set foldlevel-=3 4259deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4260deb108baSBram Moolenaar 4261deb108baSBram Moolenaar lines =<< trim END 4262deb108baSBram Moolenaar set foldlevel =1 4263deb108baSBram Moolenaar END 4264deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4265deb108baSBram Moolenaar 4266deb108baSBram Moolenaar lines =<< trim END 4267deb108baSBram Moolenaar set foldlevel +=1 4268deb108baSBram Moolenaar END 4269deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4270deb108baSBram Moolenaar 4271deb108baSBram Moolenaar lines =<< trim END 4272deb108baSBram Moolenaar set foldlevel ^=1 4273deb108baSBram Moolenaar END 4274deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4275deb108baSBram Moolenaar 4276deb108baSBram Moolenaar lines =<< trim END 4277deb108baSBram Moolenaar set foldlevel -=1 4278deb108baSBram Moolenaar END 4279deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4280deb108baSBram Moolenaar 4281deb108baSBram Moolenaar set foldlevel& 4282deb108baSBram Moolenaarenddef 4283deb108baSBram Moolenaar 4284208f0b48SBram Moolenaardef Test_option_modifier() 42851594f313SBram Moolenaar # legacy script allows for white space 4286208f0b48SBram Moolenaar var lines =<< trim END 4287208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4288208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4289208f0b48SBram Moolenaar END 4290208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4291208f0b48SBram Moolenaar 42921594f313SBram Moolenaar set hlsearch 42931594f313SBram Moolenaar set hlsearch! 42941594f313SBram Moolenaar assert_equal(false, &hlsearch) 42951594f313SBram Moolenaar 42961594f313SBram Moolenaar set hlsearch 4297208f0b48SBram Moolenaar set hlsearch& 42981594f313SBram Moolenaar assert_equal(false, &hlsearch) 4299208f0b48SBram Moolenaar 4300208f0b48SBram Moolenaar lines =<< trim END 43011594f313SBram Moolenaar set hlsearch & 4302208f0b48SBram Moolenaar END 43031594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 43041594f313SBram Moolenaar 43051594f313SBram Moolenaar lines =<< trim END 43061594f313SBram Moolenaar set hlsearch ! 43071594f313SBram Moolenaar END 43081594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 43091594f313SBram Moolenaar 43101594f313SBram Moolenaar set hlsearch& 4311208f0b48SBram Moolenaarenddef 4312208f0b48SBram Moolenaar 4313c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4314c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4315c03fe66aSBram Moolenaar var lines =<< trim END 4316c03fe66aSBram Moolenaar echoerr 'some' 4317c03fe66aSBram Moolenaar .. ' error' 4318c03fe66aSBram Moolenaar .. ' continued' 4319c03fe66aSBram Moolenaar END 4320c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4321c03fe66aSBram Moolenaarenddef 4322c03fe66aSBram Moolenaar 4323648594eaSBram Moolenaardef ProfiledWithLambda() 4324d9162550SBram Moolenaar var n = 3 4325d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4326d9162550SBram Moolenaarenddef 4327d9162550SBram Moolenaar 4328648594eaSBram Moolenaardef ProfiledNested() 4329648594eaSBram Moolenaar var x = 0 4330648594eaSBram Moolenaar def Nested(): any 4331648594eaSBram Moolenaar return x 4332648594eaSBram Moolenaar enddef 4333648594eaSBram Moolenaar Nested() 4334648594eaSBram Moolenaarenddef 4335648594eaSBram Moolenaar 4336ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4337ffcfddc7SBram Moolenaar var x = 0 4338ffcfddc7SBram Moolenaar def Nested(): any 4339ffcfddc7SBram Moolenaar return x 4340ffcfddc7SBram Moolenaar enddef 4341ffcfddc7SBram Moolenaar Nested() 4342ffcfddc7SBram Moolenaarenddef 4343ffcfddc7SBram Moolenaar 4344d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4345d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4346d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 43474ece152aSBram Moolenaar CheckFeature profile 43484ece152aSBram Moolenaar 4349d9162550SBram Moolenaar profile start Xprofile.log 4350648594eaSBram Moolenaar profile func ProfiledWithLambda 4351648594eaSBram Moolenaar ProfiledWithLambda() 4352ffcfddc7SBram Moolenaar 4353648594eaSBram Moolenaar profile func ProfiledNested 4354648594eaSBram Moolenaar ProfiledNested() 4355ffcfddc7SBram Moolenaar 4356ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4357ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4358ffcfddc7SBram Moolenaar profile func * 4359ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4360ffcfddc7SBram Moolenaar 4361ffcfddc7SBram Moolenaar profdel func * 4362ffcfddc7SBram Moolenaar profile pause 4363d9162550SBram Moolenaarenddef 4364d9162550SBram Moolenaar 4365585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4366585fea7bSBram Moolenaardef Test_substitute_cmd() 4367585fea7bSBram Moolenaar new 4368585fea7bSBram Moolenaar setline(1, 'something') 4369585fea7bSBram Moolenaar :substitute(some(other( 4370585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4371585fea7bSBram Moolenaar bwipe! 4372585fea7bSBram Moolenaar 4373f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4374cfcd011fSBram Moolenaar var lines =<< trim END 4375585fea7bSBram Moolenaar vim9script 4376585fea7bSBram Moolenaar new 4377585fea7bSBram Moolenaar setline(1, 'something') 4378585fea7bSBram Moolenaar :substitute(some(other( 4379585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4380585fea7bSBram Moolenaar bwipe! 4381585fea7bSBram Moolenaar END 4382585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4383585fea7bSBram Moolenaar source Xvim9lines 4384585fea7bSBram Moolenaar 4385585fea7bSBram Moolenaar delete('Xvim9lines') 4386585fea7bSBram Moolenaarenddef 4387585fea7bSBram Moolenaar 43888a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4389