18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 837294bd6SBram Moolenaarsource screendump.vim 98a7d6542SBram Moolenaar 105d72ce69SBram Moolenaardef Test_range_only() 115d72ce69SBram Moolenaar new 125d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 135d72ce69SBram Moolenaar :/Blah/ 145d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 15c2af0affSBram Moolenaar bwipe! 16c2af0affSBram Moolenaar 17c2af0affSBram Moolenaar # without range commands use current line 18c2af0affSBram Moolenaar new 19c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 20c2af0affSBram Moolenaar :2 21c2af0affSBram Moolenaar print 22c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 23c2af0affSBram Moolenaar :3 24c2af0affSBram Moolenaar list 25c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 26b8554304SBram Moolenaar 27b8554304SBram Moolenaar # missing command does not print the line 28b8554304SBram Moolenaar var lines =<< trim END 29b8554304SBram Moolenaar vim9script 30b8554304SBram Moolenaar :1| 31b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 32b8554304SBram Moolenaar :| 33b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 34b8554304SBram Moolenaar END 35b8554304SBram Moolenaar CheckScriptSuccess(lines) 36b8554304SBram Moolenaar 37c2af0affSBram Moolenaar bwipe! 38025cb1caSBram Moolenaar 39025cb1caSBram Moolenaar # won't generate anything 40025cb1caSBram Moolenaar if false 41025cb1caSBram Moolenaar :123 42025cb1caSBram Moolenaar endif 435d72ce69SBram Moolenaarenddef 445d72ce69SBram Moolenaar 45a6e67e4fSBram Moolenaarlet g:alist = [7] 46a6e67e4fSBram Moolenaarlet g:astring = 'text' 47f0b9f43cSBram Moolenaarlet g:anumber = 123 486e587dcbSBram Moolenaar 494c17ad94SBram Moolenaardef Test_delfunction() 50f5be8cdbSBram Moolenaar # Check function is defined in script namespace 514c17ad94SBram Moolenaar CheckScriptSuccess([ 524c17ad94SBram Moolenaar 'vim9script', 534c17ad94SBram Moolenaar 'func CheckMe()', 544c17ad94SBram Moolenaar ' return 123', 554c17ad94SBram Moolenaar 'endfunc', 564c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 574c17ad94SBram Moolenaar ]) 584c17ad94SBram Moolenaar 59f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 604c17ad94SBram Moolenaar CheckScriptFailure([ 614c17ad94SBram Moolenaar 'vim9script', 624c17ad94SBram Moolenaar 'func DeleteMe1()', 634c17ad94SBram Moolenaar 'endfunc', 644c17ad94SBram Moolenaar 'delfunction DeleteMe1', 654c17ad94SBram Moolenaar ], 'E1084:') 664c17ad94SBram Moolenaar CheckScriptFailure([ 674c17ad94SBram Moolenaar 'vim9script', 684c17ad94SBram Moolenaar 'func DeleteMe2()', 694c17ad94SBram Moolenaar 'endfunc', 704c17ad94SBram Moolenaar 'def DoThat()', 714c17ad94SBram Moolenaar ' delfunction DeleteMe2', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'DoThat()', 744c17ad94SBram Moolenaar ], 'E1084:') 754c17ad94SBram Moolenaar CheckScriptFailure([ 764c17ad94SBram Moolenaar 'vim9script', 774c17ad94SBram Moolenaar 'def DeleteMe3()', 784c17ad94SBram Moolenaar 'enddef', 794c17ad94SBram Moolenaar 'delfunction DeleteMe3', 804c17ad94SBram Moolenaar ], 'E1084:') 814c17ad94SBram Moolenaar CheckScriptFailure([ 824c17ad94SBram Moolenaar 'vim9script', 834c17ad94SBram Moolenaar 'def DeleteMe4()', 844c17ad94SBram Moolenaar 'enddef', 854c17ad94SBram Moolenaar 'def DoThat()', 864c17ad94SBram Moolenaar ' delfunction DeleteMe4', 874c17ad94SBram Moolenaar 'enddef', 884c17ad94SBram Moolenaar 'DoThat()', 894c17ad94SBram Moolenaar ], 'E1084:') 90925e9fd6SBram Moolenaar 91925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 92cfcd011fSBram Moolenaar var lines =<< trim END 93925e9fd6SBram Moolenaar vim9script 94925e9fd6SBram Moolenaar def g:Global(): string 95925e9fd6SBram Moolenaar return "yes" 96925e9fd6SBram Moolenaar enddef 97925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 98925e9fd6SBram Moolenaar def! g:Global(): string 99925e9fd6SBram Moolenaar return "no" 100925e9fd6SBram Moolenaar enddef 101925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 102925e9fd6SBram Moolenaar delfunc g:Global 103925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 104925e9fd6SBram Moolenaar END 105925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 106925e9fd6SBram Moolenaar 107925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 108925e9fd6SBram Moolenaar lines =<< trim END 109925e9fd6SBram Moolenaar vim9script 110925e9fd6SBram Moolenaar func g:Global() 111925e9fd6SBram Moolenaar return "yes" 112925e9fd6SBram Moolenaar endfunc 113925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 114925e9fd6SBram Moolenaar def! g:Global(): string 115925e9fd6SBram Moolenaar return "no" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 118925e9fd6SBram Moolenaar delfunc g:Global 119925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 120925e9fd6SBram Moolenaar END 121925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 122925e9fd6SBram Moolenaar 123925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 124925e9fd6SBram Moolenaar lines =<< trim END 125925e9fd6SBram Moolenaar vim9script 126925e9fd6SBram Moolenaar def g:Global(): string 127925e9fd6SBram Moolenaar return "yes" 128925e9fd6SBram Moolenaar enddef 129925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 130925e9fd6SBram Moolenaar func! g:Global() 131925e9fd6SBram Moolenaar return "no" 132925e9fd6SBram Moolenaar endfunc 133925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 134925e9fd6SBram Moolenaar delfunc g:Global 135925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 136925e9fd6SBram Moolenaar END 137925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1384c17ad94SBram Moolenaarenddef 1394c17ad94SBram Moolenaar 14008052228SBram Moolenaardef Test_wrong_type() 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 145599c89c8SBram Moolenaar 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14842a480bfSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 159cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 160a0a9f43aSBram Moolenaar 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 162cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16308052228SBram Moolenaarenddef 1648a7d6542SBram Moolenaar 16510c65860SBram Moolenaardef Test_script_wrong_type() 16610c65860SBram Moolenaar var lines =<< trim END 16710c65860SBram Moolenaar vim9script 16810c65860SBram Moolenaar var s:dict: dict<string> 16910c65860SBram Moolenaar s:dict['a'] = ['x'] 17010c65860SBram Moolenaar END 17110c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17210c65860SBram Moolenaarenddef 17310c65860SBram Moolenaar 17408052228SBram Moolenaardef Test_const() 175cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 177cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17830fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17930fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 180dbeecb2bSBram Moolenaar 181cfcd011fSBram Moolenaar var lines =<< trim END 18230fd8204SBram Moolenaar final list = [1, 2, 3] 183dbeecb2bSBram Moolenaar list[0] = 4 1840b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18530fd8204SBram Moolenaar const other = [5, 6, 7] 1860b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18771abe482SBram Moolenaar 188cfcd011fSBram Moolenaar var varlist = [7, 8] 18930fd8204SBram Moolenaar const constlist = [1, varlist, 3] 19071abe482SBram Moolenaar varlist[0] = 77 19171abe482SBram Moolenaar # TODO: does not work yet 19271abe482SBram Moolenaar # constlist[1][1] = 88 193cfcd011fSBram Moolenaar var cl = constlist[1] 19471abe482SBram Moolenaar cl[1] = 88 19571abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 19671abe482SBram Moolenaar 197e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 198e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 19971abe482SBram Moolenaar vardict['five'] = 55 20071abe482SBram Moolenaar # TODO: does not work yet 20171abe482SBram Moolenaar # constdict['two']['six'] = 66 202cfcd011fSBram Moolenaar var cd = constdict['two'] 20371abe482SBram Moolenaar cd['six'] = 66 204e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 205dbeecb2bSBram Moolenaar END 206dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20708052228SBram Moolenaarenddef 2088a7d6542SBram Moolenaar 2090b4c66c6SBram Moolenaardef Test_const_bang() 210cfcd011fSBram Moolenaar var lines =<< trim END 21130fd8204SBram Moolenaar const var = 234 2120b4c66c6SBram Moolenaar var = 99 2130b4c66c6SBram Moolenaar END 2140b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2150b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2160b4c66c6SBram Moolenaar 2170b4c66c6SBram Moolenaar lines =<< trim END 21830fd8204SBram Moolenaar const ll = [2, 3, 4] 2190b4c66c6SBram Moolenaar ll[0] = 99 2200b4c66c6SBram Moolenaar END 2210b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2220b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2230b4c66c6SBram Moolenaar 2240b4c66c6SBram Moolenaar lines =<< trim END 22530fd8204SBram Moolenaar const ll = [2, 3, 4] 2260b4c66c6SBram Moolenaar ll[3] = 99 2270b4c66c6SBram Moolenaar END 2280b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2290b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2300b4c66c6SBram Moolenaar 2310b4c66c6SBram Moolenaar lines =<< trim END 232e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2330b4c66c6SBram Moolenaar dd["one"] = 99 2340b4c66c6SBram Moolenaar END 2350b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2360b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2370b4c66c6SBram Moolenaar 2380b4c66c6SBram Moolenaar lines =<< trim END 239e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2400b4c66c6SBram Moolenaar dd["three"] = 99 2410b4c66c6SBram Moolenaar END 2420b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2430b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2440b4c66c6SBram Moolenaarenddef 2450b4c66c6SBram Moolenaar 246df069eecSBram Moolenaardef Test_range_no_colon() 247d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 249d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 250d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 251df069eecSBram Moolenaarenddef 252df069eecSBram Moolenaar 253df069eecSBram Moolenaar 2548a7d6542SBram Moolenaardef Test_block() 255cfcd011fSBram Moolenaar var outer = 1 2568a7d6542SBram Moolenaar { 257cfcd011fSBram Moolenaar var inner = 2 2588a7d6542SBram Moolenaar assert_equal(1, outer) 2598a7d6542SBram Moolenaar assert_equal(2, inner) 2608a7d6542SBram Moolenaar } 2618a7d6542SBram Moolenaar assert_equal(1, outer) 2623f1e9f00SBram Moolenaar 2633f1e9f00SBram Moolenaar {|echo 'yes'|} 2648a7d6542SBram Moolenaarenddef 2658a7d6542SBram Moolenaar 26608052228SBram Moolenaardef Test_block_failure() 267cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26808052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26908052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 27008052228SBram Moolenaarenddef 2718a7d6542SBram Moolenaar 272fbbcd003SBram Moolenaardef Test_block_local_vars() 273fbbcd003SBram Moolenaar var lines =<< trim END 274fbbcd003SBram Moolenaar vim9script 275ed234f24SBram Moolenaar v:testing = 1 276fbbcd003SBram Moolenaar if true 277ed234f24SBram Moolenaar var text = ['hello'] 278ed234f24SBram Moolenaar def SayHello(): list<string> 279fbbcd003SBram Moolenaar return text 280fbbcd003SBram Moolenaar enddef 281fbbcd003SBram Moolenaar def SetText(v: string) 282ed234f24SBram Moolenaar text = [v] 283fbbcd003SBram Moolenaar enddef 284fbbcd003SBram Moolenaar endif 285fbbcd003SBram Moolenaar 286fbbcd003SBram Moolenaar if true 287ed234f24SBram Moolenaar var text = ['again'] 288ed234f24SBram Moolenaar def SayAgain(): list<string> 289fbbcd003SBram Moolenaar return text 290fbbcd003SBram Moolenaar enddef 291fbbcd003SBram Moolenaar endif 292ed234f24SBram Moolenaar 293ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 294ed234f24SBram Moolenaar test_garbagecollect_now() 295ed234f24SBram Moolenaar 296fbbcd003SBram Moolenaar defcompile 297fbbcd003SBram Moolenaar 298ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 299ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 300fbbcd003SBram Moolenaar 301fbbcd003SBram Moolenaar SetText('foobar') 302ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 303ed234f24SBram Moolenaar 304ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 305ed234f24SBram Moolenaar qall! 306fbbcd003SBram Moolenaar END 307ed234f24SBram Moolenaar 308ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 309ed234f24SBram Moolenaar # context gets garbage collected. 310ed234f24SBram Moolenaar writefile(lines, 'Xscript') 311ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 312ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 313ed234f24SBram Moolenaar 314ed234f24SBram Moolenaar delete('Xscript') 315ed234f24SBram Moolenaar delete('Xdidit') 316fbbcd003SBram Moolenaarenddef 317fbbcd003SBram Moolenaar 31839ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31939ca4127SBram Moolenaar var lines =<< trim END 32039ca4127SBram Moolenaar vim9script 32139ca4127SBram Moolenaar if true 32239ca4127SBram Moolenaar var foo = 'foo' 32339ca4127SBram Moolenaar if true 32439ca4127SBram Moolenaar var bar = 'bar' 32539ca4127SBram Moolenaar def Func(): list<string> 32639ca4127SBram Moolenaar return [foo, bar] 32739ca4127SBram Moolenaar enddef 32839ca4127SBram Moolenaar endif 32939ca4127SBram Moolenaar endif 33039ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 33139ca4127SBram Moolenaar # "foo" and "bar" 33239ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33339ca4127SBram Moolenaar END 33439ca4127SBram Moolenaar CheckScriptSuccess(lines) 33539ca4127SBram Moolenaarenddef 33639ca4127SBram Moolenaar 337d032f34aSBram Moolenaarfunc g:NoSuchFunc() 338d032f34aSBram Moolenaar echo 'none' 339d032f34aSBram Moolenaarendfunc 340d032f34aSBram Moolenaar 3419e1d9e34SBram Moolenaardef Test_try_catch_throw() 342cfcd011fSBram Moolenaar var l = [] 3437a092245SBram Moolenaar try # comment 3448a7d6542SBram Moolenaar add(l, '1') 3458a7d6542SBram Moolenaar throw 'wrong' 3468a7d6542SBram Moolenaar add(l, '2') 3477a092245SBram Moolenaar catch # comment 3488a7d6542SBram Moolenaar add(l, v:exception) 3497a092245SBram Moolenaar finally # comment 3508a7d6542SBram Moolenaar add(l, '3') 3517a092245SBram Moolenaar endtry # comment 3528a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35368d130c6SBram Moolenaar 354e859312eSBram Moolenaar l = [] 355e859312eSBram Moolenaar try 356e859312eSBram Moolenaar try 357e859312eSBram Moolenaar add(l, '1') 358e859312eSBram Moolenaar throw 'wrong' 359e859312eSBram Moolenaar add(l, '2') 360e859312eSBram Moolenaar catch /right/ 361e859312eSBram Moolenaar add(l, v:exception) 362e859312eSBram Moolenaar endtry 363e859312eSBram Moolenaar catch /wrong/ 364e859312eSBram Moolenaar add(l, 'caught') 365373863edSBram Moolenaar fina 366e859312eSBram Moolenaar add(l, 'finally') 367e859312eSBram Moolenaar endtry 368e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 369e859312eSBram Moolenaar 370cfcd011fSBram Moolenaar var n: number 37168d130c6SBram Moolenaar try 37268d130c6SBram Moolenaar n = l[3] 37368d130c6SBram Moolenaar catch /E684:/ 37468d130c6SBram Moolenaar n = 99 37568d130c6SBram Moolenaar endtry 37668d130c6SBram Moolenaar assert_equal(99, n) 37768d130c6SBram Moolenaar 37869f7050cSBram Moolenaar var done = 'no' 37969f7050cSBram Moolenaar if 0 38069f7050cSBram Moolenaar try | catch | endtry 38169f7050cSBram Moolenaar else 38269f7050cSBram Moolenaar done = 'yes' 38369f7050cSBram Moolenaar endif 38469f7050cSBram Moolenaar assert_equal('yes', done) 38569f7050cSBram Moolenaar 38669f7050cSBram Moolenaar done = 'no' 38769f7050cSBram Moolenaar if 1 38869f7050cSBram Moolenaar done = 'yes' 38969f7050cSBram Moolenaar else 39069f7050cSBram Moolenaar try | catch | endtry 39169f7050cSBram Moolenaar done = 'never' 39269f7050cSBram Moolenaar endif 39369f7050cSBram Moolenaar assert_equal('yes', done) 39469f7050cSBram Moolenaar 39569f7050cSBram Moolenaar if 1 39669f7050cSBram Moolenaar else 39769f7050cSBram Moolenaar try | catch /pat/ | endtry 39869f7050cSBram Moolenaar try | catch /pat/ 39969f7050cSBram Moolenaar endtry 40069f7050cSBram Moolenaar try 40169f7050cSBram Moolenaar catch /pat/ | endtry 40269f7050cSBram Moolenaar try 40369f7050cSBram Moolenaar catch /pat/ 40469f7050cSBram Moolenaar endtry 40569f7050cSBram Moolenaar endif 40669f7050cSBram Moolenaar 40768d130c6SBram Moolenaar try 408cc673e74SBram Moolenaar # string slice returns a string, not a number 40968d130c6SBram Moolenaar n = g:astring[3] 4105e654230SBram Moolenaar catch /E1012:/ 41168d130c6SBram Moolenaar n = 77 41268d130c6SBram Moolenaar endtry 41368d130c6SBram Moolenaar assert_equal(77, n) 41468d130c6SBram Moolenaar 41568d130c6SBram Moolenaar try 41668d130c6SBram Moolenaar n = l[g:astring] 4175e654230SBram Moolenaar catch /E1012:/ 41856acb094SBram Moolenaar n = 88 41968d130c6SBram Moolenaar endtry 42056acb094SBram Moolenaar assert_equal(88, n) 42168d130c6SBram Moolenaar 42268d130c6SBram Moolenaar try 42368d130c6SBram Moolenaar n = s:does_not_exist 42468d130c6SBram Moolenaar catch /E121:/ 425f0b9f43cSBram Moolenaar n = 111 426f0b9f43cSBram Moolenaar endtry 427f0b9f43cSBram Moolenaar assert_equal(111, n) 428f0b9f43cSBram Moolenaar 429f0b9f43cSBram Moolenaar try 430f0b9f43cSBram Moolenaar n = g:does_not_exist 431f0b9f43cSBram Moolenaar catch /E121:/ 43268d130c6SBram Moolenaar n = 121 43368d130c6SBram Moolenaar endtry 43468d130c6SBram Moolenaar assert_equal(121, n) 43568d130c6SBram Moolenaar 436e0de171eSBram Moolenaar var d = {one: 1} 43768d130c6SBram Moolenaar try 43868d130c6SBram Moolenaar n = d[g:astring] 43968d130c6SBram Moolenaar catch /E716:/ 44068d130c6SBram Moolenaar n = 222 44168d130c6SBram Moolenaar endtry 44268d130c6SBram Moolenaar assert_equal(222, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = -g:astring 446f0b9f43cSBram Moolenaar catch /E39:/ 447f0b9f43cSBram Moolenaar n = 233 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(233, n) 450f0b9f43cSBram Moolenaar 451f0b9f43cSBram Moolenaar try 452f0b9f43cSBram Moolenaar n = +g:astring 453f0b9f43cSBram Moolenaar catch /E1030:/ 454f0b9f43cSBram Moolenaar n = 244 455f0b9f43cSBram Moolenaar endtry 456f0b9f43cSBram Moolenaar assert_equal(244, n) 457f0b9f43cSBram Moolenaar 458f0b9f43cSBram Moolenaar try 459f0b9f43cSBram Moolenaar n = +g:alist 460f0b9f43cSBram Moolenaar catch /E745:/ 461f0b9f43cSBram Moolenaar n = 255 462f0b9f43cSBram Moolenaar endtry 463f0b9f43cSBram Moolenaar assert_equal(255, n) 464f0b9f43cSBram Moolenaar 465cfcd011fSBram Moolenaar var nd: dict<any> 466f0b9f43cSBram Moolenaar try 4672e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4682e5910bfSBram Moolenaar catch /E1105:/ 469f0b9f43cSBram Moolenaar n = 266 470f0b9f43cSBram Moolenaar endtry 471f0b9f43cSBram Moolenaar assert_equal(266, n) 472f0b9f43cSBram Moolenaar 473f0b9f43cSBram Moolenaar try 474f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 475f0b9f43cSBram Moolenaar catch /E1093:/ 476f0b9f43cSBram Moolenaar n = 277 477f0b9f43cSBram Moolenaar endtry 478f0b9f43cSBram Moolenaar assert_equal(277, n) 479f0b9f43cSBram Moolenaar 480e859312eSBram Moolenaar try 481e859312eSBram Moolenaar &ts = g:astring 4825e654230SBram Moolenaar catch /E1012:/ 483e859312eSBram Moolenaar n = 288 484e859312eSBram Moolenaar endtry 485e859312eSBram Moolenaar assert_equal(288, n) 486e859312eSBram Moolenaar 487e859312eSBram Moolenaar try 488e859312eSBram Moolenaar &backspace = 'asdf' 489e859312eSBram Moolenaar catch /E474:/ 490e859312eSBram Moolenaar n = 299 491e859312eSBram Moolenaar endtry 492e859312eSBram Moolenaar assert_equal(299, n) 493e859312eSBram Moolenaar 494e859312eSBram Moolenaar l = [1] 495e859312eSBram Moolenaar try 496e859312eSBram Moolenaar l[3] = 3 497e859312eSBram Moolenaar catch /E684:/ 498e859312eSBram Moolenaar n = 300 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(300, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar unlet g:does_not_exist 504e859312eSBram Moolenaar catch /E108:/ 505e859312eSBram Moolenaar n = 322 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(322, n) 508e859312eSBram Moolenaar 509e859312eSBram Moolenaar try 5102bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 511e859312eSBram Moolenaar catch /E721:/ 512e859312eSBram Moolenaar n = 333 513e859312eSBram Moolenaar endtry 514e859312eSBram Moolenaar assert_equal(333, n) 515e859312eSBram Moolenaar 516e859312eSBram Moolenaar try 517e859312eSBram Moolenaar l = DeletedFunc() 518e859312eSBram Moolenaar catch /E933:/ 519e859312eSBram Moolenaar n = 344 520e859312eSBram Moolenaar endtry 521e859312eSBram Moolenaar assert_equal(344, n) 522d032f34aSBram Moolenaar 523d032f34aSBram Moolenaar try 524d032f34aSBram Moolenaar echo len(v:true) 525d032f34aSBram Moolenaar catch /E701:/ 526d032f34aSBram Moolenaar n = 355 527d032f34aSBram Moolenaar endtry 528d032f34aSBram Moolenaar assert_equal(355, n) 529d032f34aSBram Moolenaar 530cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 531d032f34aSBram Moolenaar delfunc g:NoSuchFunc 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo P() 534d032f34aSBram Moolenaar catch /E117:/ 535d032f34aSBram Moolenaar n = 366 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(366, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo g:NoSuchFunc() 541d032f34aSBram Moolenaar catch /E117:/ 542d032f34aSBram Moolenaar n = 377 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(377, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist + 4 548d032f34aSBram Moolenaar catch /E745:/ 549d032f34aSBram Moolenaar n = 388 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(388, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo 4 + g:alist 555d032f34aSBram Moolenaar catch /E745:/ 556d032f34aSBram Moolenaar n = 399 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(399, n) 559d032f34aSBram Moolenaar 560d032f34aSBram Moolenaar try 561d032f34aSBram Moolenaar echo g:alist.member 562d032f34aSBram Moolenaar catch /E715:/ 563d032f34aSBram Moolenaar n = 400 564d032f34aSBram Moolenaar endtry 565d032f34aSBram Moolenaar assert_equal(400, n) 566d032f34aSBram Moolenaar 567d032f34aSBram Moolenaar try 568d032f34aSBram Moolenaar echo d.member 569d032f34aSBram Moolenaar catch /E716:/ 570d032f34aSBram Moolenaar n = 411 571d032f34aSBram Moolenaar endtry 572d032f34aSBram Moolenaar assert_equal(411, n) 573d9d7789bSBram Moolenaar 574d9d7789bSBram Moolenaar var counter = 0 575d9d7789bSBram Moolenaar for i in range(4) 576d9d7789bSBram Moolenaar try 577d9d7789bSBram Moolenaar eval [][0] 578d9d7789bSBram Moolenaar catch 579d9d7789bSBram Moolenaar endtry 580d9d7789bSBram Moolenaar counter += 1 581d9d7789bSBram Moolenaar endfor 582d9d7789bSBram Moolenaar assert_equal(4, counter) 5837e82c5f3SBram Moolenaar 5847e82c5f3SBram Moolenaar # return in finally after empty catch 5857e82c5f3SBram Moolenaar def ReturnInFinally(): number 5867e82c5f3SBram Moolenaar try 5877e82c5f3SBram Moolenaar finally 5887e82c5f3SBram Moolenaar return 4 5897e82c5f3SBram Moolenaar endtry 5907e82c5f3SBram Moolenaar return 2 5917e82c5f3SBram Moolenaar enddef 5927e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5938a7d6542SBram Moolenaarenddef 5948a7d6542SBram Moolenaar 5952e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 5962e34c34bSBram Moolenaardef TryContinueFunc() 5972e34c34bSBram Moolenaar while g:Count < 2 5982e34c34bSBram Moolenaar g:sequence ..= 't' 5992e34c34bSBram Moolenaar try 6002e34c34bSBram Moolenaar echoerr 'Test' 6012e34c34bSBram Moolenaar catch 6022e34c34bSBram Moolenaar g:Count += 1 6032e34c34bSBram Moolenaar g:sequence ..= 'c' 6042e34c34bSBram Moolenaar continue 6052e34c34bSBram Moolenaar endtry 6062e34c34bSBram Moolenaar g:sequence ..= 'e' 6072e34c34bSBram Moolenaar g:Count += 1 6082e34c34bSBram Moolenaar endwhile 6092e34c34bSBram Moolenaarenddef 6102e34c34bSBram Moolenaar 6112e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6122e34c34bSBram Moolenaar g:Count = 0 6132e34c34bSBram Moolenaar g:sequence = '' 6142e34c34bSBram Moolenaar TryContinueFunc() 6152e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6162e34c34bSBram Moolenaar unlet g:Count 6172e34c34bSBram Moolenaar unlet g:sequence 6182e34c34bSBram Moolenaarenddef 6192e34c34bSBram Moolenaar 6209cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6219cb577a6SBram Moolenaar # return in try block returns normally 6229cb577a6SBram Moolenaar def ReturnInTry(): string 6239cb577a6SBram Moolenaar try 6249cb577a6SBram Moolenaar return '"some message"' 6259cb577a6SBram Moolenaar catch 6269cb577a6SBram Moolenaar endtry 6279cb577a6SBram Moolenaar return 'not reached' 6289cb577a6SBram Moolenaar enddef 6299cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6309cb577a6SBram Moolenaarenddef 6319cb577a6SBram Moolenaar 6321430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6331430ceebSBram Moolenaar var lines =<< trim END 6341430ceebSBram Moolenaar vim9script 6351430ceebSBram Moolenaar au BufEnter * eval 0 6361430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6371430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6381430ceebSBram Moolenaar var items = [ 6391430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6401430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6411430ceebSBram Moolenaar ] 6421430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6431430ceebSBram Moolenaar cwindow 6441430ceebSBram Moolenaar 6451430ceebSBram Moolenaar def CnextOrCfirst() 6461430ceebSBram Moolenaar # if cnext fails, cfirst is used 6471430ceebSBram Moolenaar try 6481430ceebSBram Moolenaar cnext 6491430ceebSBram Moolenaar catch 6501430ceebSBram Moolenaar cfirst 6511430ceebSBram Moolenaar endtry 6521430ceebSBram Moolenaar enddef 6531430ceebSBram Moolenaar 6541430ceebSBram Moolenaar CnextOrCfirst() 6551430ceebSBram Moolenaar CnextOrCfirst() 6561430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6571430ceebSBram Moolenaar qall 6581430ceebSBram Moolenaar END 6591430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6601430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6611430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6621430ceebSBram Moolenaar 6631430ceebSBram Moolenaar delete('Xfile1') 6641430ceebSBram Moolenaar delete('Xfile2') 6651430ceebSBram Moolenaar delete('XCatchCnext') 6661430ceebSBram Moolenaar delete('Xresult') 6671430ceebSBram Moolenaarenddef 6681430ceebSBram Moolenaar 6699e1d9e34SBram Moolenaardef Test_throw_skipped() 6709e1d9e34SBram Moolenaar if 0 6719e1d9e34SBram Moolenaar throw dontgethere 6729e1d9e34SBram Moolenaar endif 6739e1d9e34SBram Moolenaarenddef 6749e1d9e34SBram Moolenaar 6758f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6768f81b22eSBram Moolenaar var lines =<< trim END 6778f81b22eSBram Moolenaar vim9script 6788f81b22eSBram Moolenaar def Func() 6798f81b22eSBram Moolenaar throw 'error' 6808f81b22eSBram Moolenaar enddef 6818f81b22eSBram Moolenaar silent! Func() 6828f81b22eSBram Moolenaar END 6838f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6848f81b22eSBram Moolenaar source XthrowSilenced 6858f81b22eSBram Moolenaar delete('XthrowSilenced') 6868f81b22eSBram Moolenaarenddef 6878f81b22eSBram Moolenaar 688e859312eSBram Moolenaardef DeletedFunc(): list<any> 689e859312eSBram Moolenaar return ['delete me'] 690e859312eSBram Moolenaarenddef 691e859312eSBram Moolenaardefcompile 692e859312eSBram Moolenaardelfunc DeletedFunc 693e859312eSBram Moolenaar 694257cc5eeSBram Moolenaardef ThrowFromDef() 695a72cfb80SBram Moolenaar throw "getout" # comment 696257cc5eeSBram Moolenaarenddef 697257cc5eeSBram Moolenaar 698257cc5eeSBram Moolenaarfunc CatchInFunc() 699257cc5eeSBram Moolenaar try 700257cc5eeSBram Moolenaar call ThrowFromDef() 701257cc5eeSBram Moolenaar catch 702257cc5eeSBram Moolenaar let g:thrown_func = v:exception 703257cc5eeSBram Moolenaar endtry 704257cc5eeSBram Moolenaarendfunc 705257cc5eeSBram Moolenaar 706257cc5eeSBram Moolenaardef CatchInDef() 707257cc5eeSBram Moolenaar try 708257cc5eeSBram Moolenaar ThrowFromDef() 709257cc5eeSBram Moolenaar catch 710257cc5eeSBram Moolenaar g:thrown_def = v:exception 711257cc5eeSBram Moolenaar endtry 712257cc5eeSBram Moolenaarenddef 713257cc5eeSBram Moolenaar 714f575adffSBram Moolenaardef ReturnFinally(): string 715f575adffSBram Moolenaar try 716f575adffSBram Moolenaar return 'intry' 717373863edSBram Moolenaar finall 718f575adffSBram Moolenaar g:in_finally = 'finally' 719f575adffSBram Moolenaar endtry 720f575adffSBram Moolenaar return 'end' 721f575adffSBram Moolenaarenddef 722f575adffSBram Moolenaar 723257cc5eeSBram Moolenaardef Test_try_catch_nested() 724257cc5eeSBram Moolenaar CatchInFunc() 725257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 726257cc5eeSBram Moolenaar 727257cc5eeSBram Moolenaar CatchInDef() 728257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 729f575adffSBram Moolenaar 730f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 731f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 732f575adffSBram Moolenaarenddef 733f575adffSBram Moolenaar 7349939f57bSBram Moolenaardef TryOne(): number 7359939f57bSBram Moolenaar try 7369939f57bSBram Moolenaar return 0 7379939f57bSBram Moolenaar catch 7389939f57bSBram Moolenaar endtry 7399939f57bSBram Moolenaar return 0 7409939f57bSBram Moolenaarenddef 7419939f57bSBram Moolenaar 7429939f57bSBram Moolenaardef TryTwo(n: number): string 7439939f57bSBram Moolenaar try 744cfcd011fSBram Moolenaar var x = {} 7459939f57bSBram Moolenaar catch 7469939f57bSBram Moolenaar endtry 7479939f57bSBram Moolenaar return 'text' 7489939f57bSBram Moolenaarenddef 7499939f57bSBram Moolenaar 7509939f57bSBram Moolenaardef Test_try_catch_twice() 7519939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7529939f57bSBram Moolenaarenddef 7539939f57bSBram Moolenaar 754f575adffSBram Moolenaardef Test_try_catch_match() 755cfcd011fSBram Moolenaar var seq = 'a' 756f575adffSBram Moolenaar try 757f575adffSBram Moolenaar throw 'something' 758f575adffSBram Moolenaar catch /nothing/ 759f575adffSBram Moolenaar seq ..= 'x' 760f575adffSBram Moolenaar catch /some/ 761f575adffSBram Moolenaar seq ..= 'b' 762f575adffSBram Moolenaar catch /asdf/ 763f575adffSBram Moolenaar seq ..= 'x' 764e8c4abbbSBram Moolenaar catch ?a\?sdf? 765e8c4abbbSBram Moolenaar seq ..= 'y' 766f575adffSBram Moolenaar finally 767f575adffSBram Moolenaar seq ..= 'c' 768f575adffSBram Moolenaar endtry 769f575adffSBram Moolenaar assert_equal('abc', seq) 770257cc5eeSBram Moolenaarenddef 771257cc5eeSBram Moolenaar 772e8c4abbbSBram Moolenaardef Test_try_catch_fails() 773d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 774d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 775d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 776d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 777d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 778d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 779d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 780d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 78113106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 782d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 783585fea7bSBram Moolenaar 784e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 785d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 786e8c4abbbSBram Moolenaarenddef 787e8c4abbbSBram Moolenaar 7887c5b3c03SBram Moolenaardef Try_catch_skipped() 7897c5b3c03SBram Moolenaar var l = [] 7907c5b3c03SBram Moolenaar try 7917c5b3c03SBram Moolenaar finally 7927c5b3c03SBram Moolenaar endtry 7937c5b3c03SBram Moolenaar 7947c5b3c03SBram Moolenaar if 1 7957c5b3c03SBram Moolenaar else 7967c5b3c03SBram Moolenaar try 7977c5b3c03SBram Moolenaar endtry 7987c5b3c03SBram Moolenaar endif 7997c5b3c03SBram Moolenaarenddef 8007c5b3c03SBram Moolenaar 8017c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 8027c5b3c03SBram Moolenaardef Test_try_catch_skipped() 8037c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 8047c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 8057c5b3c03SBram Moolenaarenddef 8067c5b3c03SBram Moolenaar 8077c5b3c03SBram Moolenaar 8087c5b3c03SBram Moolenaar 809006ad48bSBram Moolenaardef Test_throw_vimscript() 810f5be8cdbSBram Moolenaar # only checks line continuation 811cfcd011fSBram Moolenaar var lines =<< trim END 812006ad48bSBram Moolenaar vim9script 813006ad48bSBram Moolenaar try 814006ad48bSBram Moolenaar throw 'one' 815006ad48bSBram Moolenaar .. 'two' 816006ad48bSBram Moolenaar catch 817006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 818006ad48bSBram Moolenaar endtry 819006ad48bSBram Moolenaar END 820006ad48bSBram Moolenaar CheckScriptSuccess(lines) 8211e021e63SBram Moolenaar 8221e021e63SBram Moolenaar lines =<< trim END 8231e021e63SBram Moolenaar vim9script 824352134bbSBram Moolenaar @r = '' 8251e021e63SBram Moolenaar def Func() 8261e021e63SBram Moolenaar throw @r 8271e021e63SBram Moolenaar enddef 8281e021e63SBram Moolenaar var result = '' 8291e021e63SBram Moolenaar try 8301e021e63SBram Moolenaar Func() 8311e021e63SBram Moolenaar catch /E1129:/ 8321e021e63SBram Moolenaar result = 'caught' 8331e021e63SBram Moolenaar endtry 8341e021e63SBram Moolenaar assert_equal('caught', result) 8351e021e63SBram Moolenaar END 8361e021e63SBram Moolenaar CheckScriptSuccess(lines) 837006ad48bSBram Moolenaarenddef 838006ad48bSBram Moolenaar 839ed677f55SBram Moolenaardef Test_error_in_nested_function() 84003dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 841cfcd011fSBram Moolenaar var lines =<< trim END 842ed677f55SBram Moolenaar vim9script 843ed677f55SBram Moolenaar def Func() 844ed677f55SBram Moolenaar Error() 845ed677f55SBram Moolenaar g:test_var = 1 846ed677f55SBram Moolenaar enddef 847ed677f55SBram Moolenaar func Error() abort 848ed677f55SBram Moolenaar eval [][0] 849ed677f55SBram Moolenaar endfunc 850ed677f55SBram Moolenaar Func() 851ed677f55SBram Moolenaar END 852ed677f55SBram Moolenaar g:test_var = 0 853ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 854ed677f55SBram Moolenaar assert_equal(0, g:test_var) 855ed677f55SBram Moolenaarenddef 856ed677f55SBram Moolenaar 85737c83711SBram Moolenaardef Test_cexpr_vimscript() 858f5be8cdbSBram Moolenaar # only checks line continuation 85937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 860cfcd011fSBram Moolenaar var lines =<< trim END 86137c83711SBram Moolenaar vim9script 86237c83711SBram Moolenaar cexpr 'File' 86337c83711SBram Moolenaar .. ' someFile' .. 86437c83711SBram Moolenaar ' line 19' 86537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 86637c83711SBram Moolenaar END 86737c83711SBram Moolenaar CheckScriptSuccess(lines) 86837c83711SBram Moolenaar set errorformat& 86937c83711SBram Moolenaarenddef 87037c83711SBram Moolenaar 871c9edd6b5SBram Moolenaardef Test_statusline_syntax() 872c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 873cfcd011fSBram Moolenaar var lines =<< trim END 874c9edd6b5SBram Moolenaar vim9script 875c9edd6b5SBram Moolenaar func g:Status() 876c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 877c9edd6b5SBram Moolenaar endfunc 878c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 879c9edd6b5SBram Moolenaar redrawstatus 880c9edd6b5SBram Moolenaar set laststatus statusline= 881c9edd6b5SBram Moolenaar END 882c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 883c9edd6b5SBram Moolenaarenddef 884c9edd6b5SBram Moolenaar 885b209750bSBram Moolenaardef Test_list_vimscript() 886b209750bSBram Moolenaar # checks line continuation and comments 887cfcd011fSBram Moolenaar var lines =<< trim END 888b209750bSBram Moolenaar vim9script 889cfcd011fSBram Moolenaar var mylist = [ 890b209750bSBram Moolenaar 'one', 891b209750bSBram Moolenaar # comment 892b209750bSBram Moolenaar 'two', # empty line follows 893b209750bSBram Moolenaar 894b209750bSBram Moolenaar 'three', 895b209750bSBram Moolenaar ] 896b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 897b209750bSBram Moolenaar END 898b209750bSBram Moolenaar CheckScriptSuccess(lines) 89966250c93SBram Moolenaar 90066250c93SBram Moolenaar # check all lines from heredoc are kept 90166250c93SBram Moolenaar lines =<< trim END 90266250c93SBram Moolenaar # comment 1 90366250c93SBram Moolenaar two 90466250c93SBram Moolenaar # comment 3 90566250c93SBram Moolenaar 90666250c93SBram Moolenaar five 90766250c93SBram Moolenaar # comment 6 90866250c93SBram Moolenaar END 90966250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 9104bce26bbSBram Moolenaar 9114bce26bbSBram Moolenaar lines =<< trim END 9124bce26bbSBram Moolenaar [{ 9134bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 9144bce26bbSBram Moolenaar END 9154bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 916b209750bSBram Moolenaarenddef 917b209750bSBram Moolenaar 9182a1381c3SBram Moolenaarif has('channel') 91940ee466cSBram Moolenaar let someJob = test_null_job() 92040ee466cSBram Moolenaar 92140ee466cSBram Moolenaar def FuncWithError() 92240ee466cSBram Moolenaar echomsg g:someJob 92340ee466cSBram Moolenaar enddef 92440ee466cSBram Moolenaar 92540ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 92640ee466cSBram Moolenaar try 92740ee466cSBram Moolenaar call FuncWithError() 92840ee466cSBram Moolenaar catch 92940ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 93040ee466cSBram Moolenaar endtry 93140ee466cSBram Moolenaar endfunc 9322a1381c3SBram Moolenaarendif 93340ee466cSBram Moolenaar 9348a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9358a7d6542SBram Moolenaar vim9script 936cfcd011fSBram Moolenaar var name: string = 'bob' 9378a7d6542SBram Moolenaar def Concat(arg: string): string 9388a7d6542SBram Moolenaar return name .. arg 9398a7d6542SBram Moolenaar enddef 940227a69deSBram Moolenaar g:result = Concat('bie') 941227a69deSBram Moolenaar g:localname = name 9428a7d6542SBram Moolenaar 9438a7d6542SBram Moolenaar export const CONST = 1234 944cfcd011fSBram Moolenaar export var exported = 9876 945cfcd011fSBram Moolenaar export var exp_name = 'John' 9468a7d6542SBram Moolenaar export def Exported(): string 9478a7d6542SBram Moolenaar return 'Exported' 9488a7d6542SBram Moolenaar enddef 9490f2a5cc6SBram Moolenaar export final theList = [1] 9508a7d6542SBram MoolenaarEND 9518a7d6542SBram Moolenaar 952b3ca9824SBram Moolenaardef Undo_export_script_lines() 953b3ca9824SBram Moolenaar unlet g:result 954b3ca9824SBram Moolenaar unlet g:localname 955b3ca9824SBram Moolenaarenddef 956b3ca9824SBram Moolenaar 9575269bd2aSBram Moolenaardef Test_vim9_import_export() 958cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9598a7d6542SBram Moolenaar vim9script 9608a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9618a7d6542SBram Moolenaar g:imported = exported 9626e587dcbSBram Moolenaar exported += 3 9636e587dcbSBram Moolenaar g:imported_added = exported 9648a7d6542SBram Moolenaar g:imported_func = Exported() 9656e587dcbSBram Moolenaar 96640f4f7a4SBram Moolenaar def GetExported(): string 967e0de171eSBram Moolenaar var local_dict = {ref: Exported} 96840f4f7a4SBram Moolenaar return local_dict.ref() 96940f4f7a4SBram Moolenaar enddef 97040f4f7a4SBram Moolenaar g:funcref_result = GetExported() 97140f4f7a4SBram Moolenaar 9726e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9736e587dcbSBram Moolenaar g:imported_name = exp_name 9746e587dcbSBram Moolenaar exp_name ..= ' Doe' 9756e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9765381c7a1SBram Moolenaar g:imported_later = exported 9770f2a5cc6SBram Moolenaar 9780f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 9790f2a5cc6SBram Moolenaar theList->add(2) 9800f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 9818a7d6542SBram Moolenaar END 9828a7d6542SBram Moolenaar 9838a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9848a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9858a7d6542SBram Moolenaar 9868a7d6542SBram Moolenaar source Ximport.vim 9878a7d6542SBram Moolenaar 9888a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9898a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9908a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9916e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9925381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9938a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 99440f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9956e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9966e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9978a7d6542SBram Moolenaar assert_false(exists('g:name')) 9988a7d6542SBram Moolenaar 999b3ca9824SBram Moolenaar Undo_export_script_lines() 10008a7d6542SBram Moolenaar unlet g:imported 10016e587dcbSBram Moolenaar unlet g:imported_added 10025381c7a1SBram Moolenaar unlet g:imported_later 10038a7d6542SBram Moolenaar unlet g:imported_func 10046e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 10058a7d6542SBram Moolenaar delete('Ximport.vim') 1006f2d5c240SBram Moolenaar 10071c991144SBram Moolenaar # similar, with line breaks 1008cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 10091c991144SBram Moolenaar vim9script 10101c991144SBram Moolenaar import { 10111c991144SBram Moolenaar exported, 10121c991144SBram Moolenaar Exported, 10131c991144SBram Moolenaar } 10141c991144SBram Moolenaar from 10151c991144SBram Moolenaar './Xexport.vim' 10161c991144SBram Moolenaar g:imported = exported 10171c991144SBram Moolenaar exported += 5 10181c991144SBram Moolenaar g:imported_added = exported 10191c991144SBram Moolenaar g:imported_func = Exported() 10201c991144SBram Moolenaar END 10211c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 10221c991144SBram Moolenaar source Ximport_lbr.vim 10231c991144SBram Moolenaar 10241c991144SBram Moolenaar assert_equal(9876, g:imported) 10251c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10261c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10271c991144SBram Moolenaar 10281c991144SBram Moolenaar # exported script not sourced again 10291c991144SBram Moolenaar assert_false(exists('g:result')) 10301c991144SBram Moolenaar unlet g:imported 10311c991144SBram Moolenaar unlet g:imported_added 10321c991144SBram Moolenaar unlet g:imported_func 10331c991144SBram Moolenaar delete('Ximport_lbr.vim') 10341c991144SBram Moolenaar 10351c991144SBram Moolenaar # import inside :def function 1036cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10375381c7a1SBram Moolenaar vim9script 10385381c7a1SBram Moolenaar def ImportInDef() 10395381c7a1SBram Moolenaar import exported from './Xexport.vim' 10405381c7a1SBram Moolenaar g:imported = exported 10415381c7a1SBram Moolenaar exported += 7 10425381c7a1SBram Moolenaar g:imported_added = exported 10435381c7a1SBram Moolenaar enddef 10445381c7a1SBram Moolenaar ImportInDef() 10455381c7a1SBram Moolenaar END 10465381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10475381c7a1SBram Moolenaar source Ximport2.vim 1048f5be8cdbSBram Moolenaar # TODO: this should be 9879 10495381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10505381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10515381c7a1SBram Moolenaar unlet g:imported 10525381c7a1SBram Moolenaar unlet g:imported_added 10535381c7a1SBram Moolenaar delete('Ximport2.vim') 10545381c7a1SBram Moolenaar 1055cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1056f2d5c240SBram Moolenaar vim9script 1057f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1058f2d5c240SBram Moolenaar def UseExport() 1059cb4e80faSBram Moolenaar g:imported_def = Export.exported 1060f2d5c240SBram Moolenaar enddef 1061cb4e80faSBram Moolenaar g:imported_script = Export.exported 1062cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1063cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1064f2d5c240SBram Moolenaar UseExport() 1065f2d5c240SBram Moolenaar END 1066f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1067f2d5c240SBram Moolenaar source Ximport.vim 1068cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1069cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1070f2d5c240SBram Moolenaar 1071cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1072599c89c8SBram Moolenaar vim9script 1073599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1074599c89c8SBram Moolenaar def Func() 1075cfcd011fSBram Moolenaar var dummy = 1 1076cfcd011fSBram Moolenaar var imported = Export + dummy 1077599c89c8SBram Moolenaar enddef 1078822ba247SBram Moolenaar defcompile 1079599c89c8SBram Moolenaar END 1080599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 108144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1082599c89c8SBram Moolenaar 1083cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1084599c89c8SBram Moolenaar vim9script 1085599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1086599c89c8SBram Moolenaar def Func() 1087cfcd011fSBram Moolenaar var imported = Export . exported 1088599c89c8SBram Moolenaar enddef 1089822ba247SBram Moolenaar defcompile 1090599c89c8SBram Moolenaar END 1091599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 109244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1093599c89c8SBram Moolenaar 1094a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1095a6294955SBram Moolenaar vim9script 1096a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1097a6294955SBram Moolenaar var some = 'other' 1098a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1099a6294955SBram Moolenaar defcompile 1100a6294955SBram Moolenaar END 1101a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1102a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1103a6294955SBram Moolenaar 1104cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1105cb4e80faSBram Moolenaar vim9script 1106cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1107cb4e80faSBram Moolenaar g:imported_script = Export exported 1108cb4e80faSBram Moolenaar END 1109cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1110cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1111cb4e80faSBram Moolenaar 1112cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1113cb4e80faSBram Moolenaar vim9script 1114cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1115cb4e80faSBram Moolenaar g:imported_script = Export. exported 1116cb4e80faSBram Moolenaar END 1117cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1118cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1119cb4e80faSBram Moolenaar 1120cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1121599c89c8SBram Moolenaar vim9script 1122599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1123599c89c8SBram Moolenaar def Func() 1124cfcd011fSBram Moolenaar var imported = Export. 1125599c89c8SBram Moolenaar enddef 1126822ba247SBram Moolenaar defcompile 1127599c89c8SBram Moolenaar END 1128599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 112944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1130599c89c8SBram Moolenaar 1131cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 11321c991144SBram Moolenaar vim9script 11331c991144SBram Moolenaar import * 11341c991144SBram Moolenaar as Export 11351c991144SBram Moolenaar from 11361c991144SBram Moolenaar './Xexport.vim' 11371c991144SBram Moolenaar def UseExport() 11381c991144SBram Moolenaar g:imported = Export.exported 11391c991144SBram Moolenaar enddef 11401c991144SBram Moolenaar UseExport() 11411c991144SBram Moolenaar END 11421c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 11431c991144SBram Moolenaar source Ximport.vim 11441c991144SBram Moolenaar assert_equal(9883, g:imported) 11451c991144SBram Moolenaar 1146cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1147f2d5c240SBram Moolenaar vim9script 1148f2d5c240SBram Moolenaar import * from './Xexport.vim' 1149f2d5c240SBram Moolenaar END 1150f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 115144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1152f2d5c240SBram Moolenaar 1153f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1154cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1155fa29c8abSBram Moolenaar vim9script 1156fa29c8abSBram Moolenaar import name from './Xexport.vim' 1157fa29c8abSBram Moolenaar END 1158fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 115944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1160fa29c8abSBram Moolenaar 1161f5be8cdbSBram Moolenaar # try to import something that is already defined 1162cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11635269bd2aSBram Moolenaar vim9script 1164cfcd011fSBram Moolenaar var exported = 'something' 11655269bd2aSBram Moolenaar import exported from './Xexport.vim' 11665269bd2aSBram Moolenaar END 11675269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1168057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11695269bd2aSBram Moolenaar 1170f5be8cdbSBram Moolenaar # try to import something that is already defined 11715269bd2aSBram Moolenaar import_already_defined =<< trim END 11725269bd2aSBram Moolenaar vim9script 1173cfcd011fSBram Moolenaar var exported = 'something' 11745269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11755269bd2aSBram Moolenaar END 11765269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1177057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11785269bd2aSBram Moolenaar 1179f5be8cdbSBram Moolenaar # try to import something that is already defined 11805269bd2aSBram Moolenaar import_already_defined =<< trim END 11815269bd2aSBram Moolenaar vim9script 1182cfcd011fSBram Moolenaar var exported = 'something' 11835269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11845269bd2aSBram Moolenaar END 11855269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1186057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11875269bd2aSBram Moolenaar 1188918a4249SBram Moolenaar # try changing an imported const 1189918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1190918a4249SBram Moolenaar vim9script 1191918a4249SBram Moolenaar import CONST from './Xexport.vim' 1192918a4249SBram Moolenaar def Assign() 1193918a4249SBram Moolenaar CONST = 987 1194918a4249SBram Moolenaar enddef 1195918a4249SBram Moolenaar defcompile 1196918a4249SBram Moolenaar END 1197918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1198918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1199918a4249SBram Moolenaar 12000f2a5cc6SBram Moolenaar # try changing an imported final 12010f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 12020f2a5cc6SBram Moolenaar vim9script 12030f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 12040f2a5cc6SBram Moolenaar def Assign() 12050f2a5cc6SBram Moolenaar theList = [2] 12060f2a5cc6SBram Moolenaar enddef 12070f2a5cc6SBram Moolenaar defcompile 12080f2a5cc6SBram Moolenaar END 12090f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 12100f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 12110f2a5cc6SBram Moolenaar 1212f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1213cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1214fa29c8abSBram Moolenaar vim9script 1215fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1216fa29c8abSBram Moolenaar END 1217fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 121844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1219fa29c8abSBram Moolenaar 1220cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1221fa29c8abSBram Moolenaar vim9script 1222fa29c8abSBram Moolenaar import name './Xexport.vim' 1223fa29c8abSBram Moolenaar END 1224fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 122544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1226fa29c8abSBram Moolenaar 1227cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1228fa29c8abSBram Moolenaar vim9script 1229fa29c8abSBram Moolenaar import name from Xexport.vim 1230fa29c8abSBram Moolenaar END 1231fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 123244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1233fa29c8abSBram Moolenaar 1234cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1235fa29c8abSBram Moolenaar vim9script 1236fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1237fa29c8abSBram Moolenaar END 1238fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 123944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1240fa29c8abSBram Moolenaar 1241cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1242fa29c8abSBram Moolenaar vim9script 1243fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1244fa29c8abSBram Moolenaar END 12455269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 124644d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1247fa29c8abSBram Moolenaar 1248f2d5c240SBram Moolenaar delete('Ximport.vim') 12495269bd2aSBram Moolenaar delete('Ximport3.vim') 12508a7d6542SBram Moolenaar delete('Xexport.vim') 12518a7d6542SBram Moolenaar 1252f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 12533e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 12543e191694SBram Moolenaar set cpo=abcd 1255cfcd011fSBram Moolenaar var lines =<< trim END 1256750802b5SBram Moolenaar vim9script 1257750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 12583e191694SBram Moolenaar set cpo+=f 12593e191694SBram Moolenaar set cpo-=c 12603e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1261750802b5SBram Moolenaar END 1262750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1263750802b5SBram Moolenaar source Xvim9_script 12643e191694SBram Moolenaar assert_equal('fabd', &cpo) 1265750802b5SBram Moolenaar set cpo&vim 1266750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 12673e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 12683e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 12693e191694SBram Moolenaar 1270750802b5SBram Moolenaar delete('Xvim9_script') 1271750802b5SBram Moolenaarenddef 1272750802b5SBram Moolenaar 12730a84284eSBram Moolenaardef Test_import_as() 12740a84284eSBram Moolenaar var export_lines =<< trim END 12750a84284eSBram Moolenaar vim9script 12760a84284eSBram Moolenaar export var one = 1 12770a84284eSBram Moolenaar export var yes = 'yes' 12780a84284eSBram Moolenaar END 12790a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 12800a84284eSBram Moolenaar 12810a84284eSBram Moolenaar var import_lines =<< trim END 12820a84284eSBram Moolenaar vim9script 12836c7cc347SBram Moolenaar var one = 'notused' 12846c7cc347SBram Moolenaar var yes = 777 12850a84284eSBram Moolenaar import one as thatOne from './XexportAs' 12860a84284eSBram Moolenaar assert_equal(1, thatOne) 12870a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 12880a84284eSBram Moolenaar assert_equal('yes', yesYes) 12890a84284eSBram Moolenaar END 12900a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 12910a84284eSBram Moolenaar 12920a84284eSBram Moolenaar import_lines =<< trim END 12930a84284eSBram Moolenaar vim9script 12940a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 12950a84284eSBram Moolenaar assert_equal(1, thatOne) 12960a84284eSBram Moolenaar assert_equal('yes', yesYes) 12970a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 12980a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 12990a84284eSBram Moolenaar END 13000a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13010a84284eSBram Moolenaar 13020a84284eSBram Moolenaar delete('XexportAs') 13030a84284eSBram Moolenaarenddef 13040a84284eSBram Moolenaar 1305803af686SBram Moolenaarfunc g:Trigger() 1306803af686SBram Moolenaar source Ximport.vim 1307803af686SBram Moolenaar return "echo 'yes'\<CR>" 1308803af686SBram Moolenaarendfunc 1309803af686SBram Moolenaar 1310803af686SBram Moolenaardef Test_import_export_expr_map() 1311803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1312cfcd011fSBram Moolenaar var export_lines =<< trim END 1313803af686SBram Moolenaar vim9script 1314803af686SBram Moolenaar export def That(): string 1315803af686SBram Moolenaar return 'yes' 1316803af686SBram Moolenaar enddef 1317803af686SBram Moolenaar END 1318803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1319803af686SBram Moolenaar 1320cfcd011fSBram Moolenaar var import_lines =<< trim END 1321803af686SBram Moolenaar vim9script 1322803af686SBram Moolenaar import That from './Xexport_that.vim' 1323803af686SBram Moolenaar assert_equal('yes', That()) 1324803af686SBram Moolenaar END 1325803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1326803af686SBram Moolenaar 1327803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1328803af686SBram Moolenaar feedkeys('trigger', "xt") 1329803af686SBram Moolenaar 1330730b2483SBram Moolenaar delete('Xexport_that.vim') 1331803af686SBram Moolenaar delete('Ximport.vim') 1332803af686SBram Moolenaar nunmap trigger 1333803af686SBram Moolenaarenddef 1334803af686SBram Moolenaar 13358e1986e3SBram Moolenaardef Test_import_in_filetype() 13368e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13378e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1338cfcd011fSBram Moolenaar var export_lines =<< trim END 13398e1986e3SBram Moolenaar vim9script 1340cfcd011fSBram Moolenaar export var That = 'yes' 13418e1986e3SBram Moolenaar END 1342730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 13438e1986e3SBram Moolenaar 1344cfcd011fSBram Moolenaar var import_lines =<< trim END 13458e1986e3SBram Moolenaar vim9script 1346730b2483SBram Moolenaar import That from './Xexport_ft.vim' 13478e1986e3SBram Moolenaar assert_equal('yes', That) 13488e1986e3SBram Moolenaar g:did_load_mytpe = 1 13498e1986e3SBram Moolenaar END 13508e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 13518e1986e3SBram Moolenaar 1352cfcd011fSBram Moolenaar var save_rtp = &rtp 13538e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 13548e1986e3SBram Moolenaar 13558e1986e3SBram Moolenaar filetype plugin on 13568e1986e3SBram Moolenaar copen 13578e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 13588e1986e3SBram Moolenaar 13598e1986e3SBram Moolenaar quit! 1360730b2483SBram Moolenaar delete('Xexport_ft.vim') 13618e1986e3SBram Moolenaar delete('ftplugin', 'rf') 13628e1986e3SBram Moolenaar &rtp = save_rtp 13638e1986e3SBram Moolenaarenddef 13648e1986e3SBram Moolenaar 1365efa94447SBram Moolenaardef Test_use_import_in_mapping() 1366cfcd011fSBram Moolenaar var lines =<< trim END 1367efa94447SBram Moolenaar vim9script 1368efa94447SBram Moolenaar export def Funcx() 1369efa94447SBram Moolenaar g:result = 42 1370efa94447SBram Moolenaar enddef 1371efa94447SBram Moolenaar END 1372efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1373efa94447SBram Moolenaar lines =<< trim END 1374efa94447SBram Moolenaar vim9script 1375efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1376b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1377efa94447SBram Moolenaar END 1378efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1379efa94447SBram Moolenaar 1380efa94447SBram Moolenaar source Xmapscript.vim 1381b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1382efa94447SBram Moolenaar assert_equal(42, g:result) 1383efa94447SBram Moolenaar 1384efa94447SBram Moolenaar unlet g:result 1385efa94447SBram Moolenaar delete('XsomeExport.vim') 1386efa94447SBram Moolenaar delete('Xmapscript.vim') 1387b3ca9824SBram Moolenaar nunmap <F3> 1388efa94447SBram Moolenaarenddef 1389efa94447SBram Moolenaar 1390d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1391d3f8a9eeSBram Moolenaar var lines =<< trim END 1392d3f8a9eeSBram Moolenaar if has(g:feature) 1393d3f8a9eeSBram Moolenaar " legacy script 1394d3f8a9eeSBram Moolenaar let g:legacy = 1 1395d3f8a9eeSBram Moolenaar finish 1396d3f8a9eeSBram Moolenaar endif 1397d3f8a9eeSBram Moolenaar vim9script 1398d3f8a9eeSBram Moolenaar g:legacy = 0 1399d3f8a9eeSBram Moolenaar END 1400d3f8a9eeSBram Moolenaar g:feature = 'eval' 1401d3f8a9eeSBram Moolenaar g:legacy = -1 1402d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1403d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1404d3f8a9eeSBram Moolenaar 1405d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1406d3f8a9eeSBram Moolenaar g:legacy = -1 1407d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1408d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1409d3f8a9eeSBram Moolenaarenddef 1410d3f8a9eeSBram Moolenaar 1411750802b5SBram Moolenaardef Test_vim9script_fails() 14128a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14138a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1414cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 14159721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1416cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1417750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1418750802b5SBram Moolenaar 1419cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1420c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1421c785b9a7SBram Moolenaar 1422e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1423e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 14248a7d6542SBram Moolenaarenddef 14258a7d6542SBram Moolenaar 1426f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1427101f4810SBram Moolenaar CheckRunVimInTerminal 1428101f4810SBram Moolenaar 14299bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1430c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14319bb3eb3eSBram Moolenaarendfunc 14329bb3eb3eSBram Moolenaar 1433c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1434cfcd011fSBram Moolenaar var export =<< trim END 1435101f4810SBram Moolenaar vim9script 1436101f4810SBram Moolenaar export def Foo(): number 1437101f4810SBram Moolenaar return 0 1438101f4810SBram Moolenaar enddef 1439101f4810SBram Moolenaar END 1440730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1441101f4810SBram Moolenaar 1442e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 14439bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14442949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1445101f4810SBram Moolenaar 1446730b2483SBram Moolenaar delete('XexportCmd.vim') 14479bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14489bb3eb3eSBram Moolenaarenddef 1449101f4810SBram Moolenaar 14502b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 14512b32700dSBram Moolenaar var lines =<< trim END 1452a6294955SBram Moolenaar vim9script 1453a6294955SBram Moolenaar export var exported = 'thexport' 1454a6294955SBram Moolenaar END 1455a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1456a6294955SBram Moolenaar lines =<< trim END 14572b32700dSBram Moolenaar vim9script noclear 14582b32700dSBram Moolenaar g:loadCount += 1 14592b32700dSBram Moolenaar var s:reloaded = 'init' 1460a6294955SBram Moolenaar import exported from './XExportReload' 14612b32700dSBram Moolenaar 14622b32700dSBram Moolenaar def Again(): string 14632b32700dSBram Moolenaar return 'again' 14642b32700dSBram Moolenaar enddef 14652b32700dSBram Moolenaar 14662b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 14672b32700dSBram Moolenaar var s:loaded = true 14682b32700dSBram Moolenaar 14692b32700dSBram Moolenaar var s:notReloaded = 'yes' 14702b32700dSBram Moolenaar s:reloaded = 'first' 14712b32700dSBram Moolenaar def g:Values(): list<string> 1472a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 14732b32700dSBram Moolenaar enddef 14742b32700dSBram Moolenaar 14752b32700dSBram Moolenaar def Once(): string 14762b32700dSBram Moolenaar return 'once' 14772b32700dSBram Moolenaar enddef 14782b32700dSBram Moolenaar END 14792b32700dSBram Moolenaar writefile(lines, 'XReloaded') 14802b32700dSBram Moolenaar g:loadCount = 0 14812b32700dSBram Moolenaar source XReloaded 14822b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1483a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 14842b32700dSBram Moolenaar source XReloaded 14852b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1486a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14872b32700dSBram Moolenaar source XReloaded 14882b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1489a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14902b32700dSBram Moolenaar 149148e11c10SBram Moolenaar delete('XReloaded') 1492a6294955SBram Moolenaar delete('XExportReload') 14932b32700dSBram Moolenaar delfunc g:Values 14942b32700dSBram Moolenaar unlet g:loadCount 14952b32700dSBram Moolenaarenddef 14962b32700dSBram Moolenaar 14974c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1498cfcd011fSBram Moolenaar var lines =<< trim END 14998a7d6542SBram Moolenaar vim9script 15008a7d6542SBram Moolenaar const var = '' 1501cfcd011fSBram Moolenaar var valone = 1234 15028a7d6542SBram Moolenaar def MyFunc(arg: string) 15038a7d6542SBram Moolenaar valone = 5678 15048a7d6542SBram Moolenaar enddef 15058a7d6542SBram Moolenaar END 1506cfcd011fSBram Moolenaar var morelines =<< trim END 1507cfcd011fSBram Moolenaar var valtwo = 222 15088a7d6542SBram Moolenaar export def GetValtwo(): number 15098a7d6542SBram Moolenaar return valtwo 15108a7d6542SBram Moolenaar enddef 15118a7d6542SBram Moolenaar END 151203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15138a7d6542SBram Moolenaar source Xreload.vim 15148a7d6542SBram Moolenaar source Xreload.vim 15158a7d6542SBram Moolenaar source Xreload.vim 15168a7d6542SBram Moolenaar 1517cfcd011fSBram Moolenaar var testlines =<< trim END 15188a7d6542SBram Moolenaar vim9script 15198a7d6542SBram Moolenaar def TheFunc() 15208a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15218a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15228a7d6542SBram Moolenaar enddef 15238a7d6542SBram Moolenaar TheFunc() 15248a7d6542SBram Moolenaar END 15258a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15268a7d6542SBram Moolenaar source Ximport.vim 15278a7d6542SBram Moolenaar 1528f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1529f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15308a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15318a7d6542SBram Moolenaar source Ximport.vim 15328a7d6542SBram Moolenaar 1533f5be8cdbSBram Moolenaar # cannot declare a var twice 15348a7d6542SBram Moolenaar lines =<< trim END 15358a7d6542SBram Moolenaar vim9script 1536cfcd011fSBram Moolenaar var valone = 1234 1537cfcd011fSBram Moolenaar var valone = 5678 15388a7d6542SBram Moolenaar END 15398a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 154044d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 15418a7d6542SBram Moolenaar 15428a7d6542SBram Moolenaar delete('Xreload.vim') 15438a7d6542SBram Moolenaar delete('Ximport.vim') 15448a7d6542SBram Moolenaarenddef 15458a7d6542SBram Moolenaar 154607a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 154707a65d26SBram Moolenaar" compiled function using that variable must fail. 154807a65d26SBram Moolenaardef Test_script_reload_change_type() 154907a65d26SBram Moolenaar var lines =<< trim END 155007a65d26SBram Moolenaar vim9script noclear 155107a65d26SBram Moolenaar var str = 'string' 155207a65d26SBram Moolenaar def g:GetStr(): string 155307a65d26SBram Moolenaar return str .. 'xxx' 155407a65d26SBram Moolenaar enddef 155507a65d26SBram Moolenaar END 155607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 155707a65d26SBram Moolenaar source Xreload.vim 155807a65d26SBram Moolenaar echo g:GetStr() 155907a65d26SBram Moolenaar 156007a65d26SBram Moolenaar lines =<< trim END 156107a65d26SBram Moolenaar vim9script noclear 156207a65d26SBram Moolenaar var str = 1234 156307a65d26SBram Moolenaar END 156407a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 156507a65d26SBram Moolenaar source Xreload.vim 156607a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 156707a65d26SBram Moolenaar 156807a65d26SBram Moolenaar delfunc g:GetStr 156907a65d26SBram Moolenaar delete('Xreload.vim') 157007a65d26SBram Moolenaarenddef 157107a65d26SBram Moolenaar 1572c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1573c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1574c970e422SBram Moolenaar 1575c970e422SBram Moolenaardef Test_script_reload_from_function() 1576c970e422SBram Moolenaar var lines =<< trim END 1577c970e422SBram Moolenaar vim9script 1578c970e422SBram Moolenaar 1579c970e422SBram Moolenaar if exists('g:loaded') 1580c970e422SBram Moolenaar finish 1581c970e422SBram Moolenaar endif 1582c970e422SBram Moolenaar g:loaded = 1 1583c970e422SBram Moolenaar delcommand CallFunc 1584c970e422SBram Moolenaar command CallFunc Func() 1585c970e422SBram Moolenaar def Func() 1586a4c81beaSBram Moolenaar so XreloadFunc.vim 1587c970e422SBram Moolenaar g:didTheFunc = 1 1588c970e422SBram Moolenaar enddef 1589c970e422SBram Moolenaar END 1590c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1591c970e422SBram Moolenaar source XreloadFunc.vim 1592c970e422SBram Moolenaar CallFunc 1593c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1594c970e422SBram Moolenaar 1595c970e422SBram Moolenaar delete('XreloadFunc.vim') 1596c970e422SBram Moolenaar delcommand CallFunc 1597c970e422SBram Moolenaar unlet g:loaded 1598c970e422SBram Moolenaar unlet g:didTheFunc 1599c970e422SBram Moolenaarenddef 1600c970e422SBram Moolenaar 16016c3843caSBram Moolenaardef Test_script_var_shadows_function() 16026c3843caSBram Moolenaar var lines =<< trim END 16036c3843caSBram Moolenaar vim9script 16046c3843caSBram Moolenaar def Func(): number 16056c3843caSBram Moolenaar return 123 16066c3843caSBram Moolenaar enddef 16076c3843caSBram Moolenaar var Func = 1 16086c3843caSBram Moolenaar END 16096c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 16106c3843caSBram Moolenaarenddef 16116c3843caSBram Moolenaar 161295006e3dSBram Moolenaardef s:RetSome(): string 161395006e3dSBram Moolenaar return 'some' 161495006e3dSBram Moolenaarenddef 161595006e3dSBram Moolenaar 1616fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1617fe465a01SBram Moolenaar" script-local name. 1618fe465a01SBram Moolenaardef Test_vim9script_funcref() 1619cfcd011fSBram Moolenaar var sortlines =<< trim END 1620fe465a01SBram Moolenaar vim9script 1621fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1622bed36b93SBram Moolenaar return i2 - i1 1623fe465a01SBram Moolenaar enddef 1624fe465a01SBram Moolenaar 1625fe465a01SBram Moolenaar export def FastSort(): list<number> 1626fe465a01SBram Moolenaar return range(5)->sort(Compare) 1627fe465a01SBram Moolenaar enddef 1628529fb5a5SBram Moolenaar 1629529fb5a5SBram Moolenaar export def GetString(arg: string): string 1630529fb5a5SBram Moolenaar return arg 1631529fb5a5SBram Moolenaar enddef 1632fe465a01SBram Moolenaar END 1633fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1634fe465a01SBram Moolenaar 1635cfcd011fSBram Moolenaar var lines =<< trim END 1636fe465a01SBram Moolenaar vim9script 1637fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1638fe465a01SBram Moolenaar def Test() 1639fe465a01SBram Moolenaar g:result = FastSort() 1640fe465a01SBram Moolenaar enddef 1641fe465a01SBram Moolenaar Test() 1642529fb5a5SBram Moolenaar 1643529fb5a5SBram Moolenaar # using a function imported with "as" 1644529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1645529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1646529fb5a5SBram Moolenaar 1647529fb5a5SBram Moolenaar # using the function from a compiled function 1648529fb5a5SBram Moolenaar def TestMore(): string 1649ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1650ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1651529fb5a5SBram Moolenaar enddef 1652ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1653529fb5a5SBram Moolenaar 1654529fb5a5SBram Moolenaar # error when using a function that isn't exported 1655529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1656fe465a01SBram Moolenaar END 1657fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1658fe465a01SBram Moolenaar 1659fe465a01SBram Moolenaar source Xscript.vim 1660fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1661fe465a01SBram Moolenaar 1662fe465a01SBram Moolenaar unlet g:result 1663fe465a01SBram Moolenaar delete('Xsort.vim') 1664fe465a01SBram Moolenaar delete('Xscript.vim') 166595006e3dSBram Moolenaar 1666cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 166795006e3dSBram Moolenaar assert_equal('some', Funcref()) 1668fe465a01SBram Moolenaarenddef 1669fe465a01SBram Moolenaar 1670601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1671601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1672601e76acSBram Moolenaar" function reference. 1673c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1674cfcd011fSBram Moolenaar var filterLines =<< trim END 1675c620c055SBram Moolenaar vim9script 1676c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1677c620c055SBram Moolenaar return idx % 2 == 1 1678c620c055SBram Moolenaar enddef 1679c620c055SBram Moolenaar export def FastFilter(): list<number> 1680c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1681c620c055SBram Moolenaar enddef 1682601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1683601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1684601e76acSBram Moolenaar enddef 1685c620c055SBram Moolenaar END 1686c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1687c620c055SBram Moolenaar 1688cfcd011fSBram Moolenaar var lines =<< trim END 1689c620c055SBram Moolenaar vim9script 1690601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1691c620c055SBram Moolenaar def Test() 1692cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1693c620c055SBram Moolenaar enddef 1694c620c055SBram Moolenaar Test() 1695601e76acSBram Moolenaar def TestDirect() 1696cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1697601e76acSBram Moolenaar enddef 1698601e76acSBram Moolenaar TestDirect() 1699c620c055SBram Moolenaar END 1700601e76acSBram Moolenaar CheckScriptSuccess(lines) 1701c620c055SBram Moolenaar delete('Xfilter.vim') 1702c620c055SBram Moolenaarenddef 1703c620c055SBram Moolenaar 17044c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1705cfcd011fSBram Moolenaar var first_lines =<< trim END 17064c17ad94SBram Moolenaar vim9script 17074c17ad94SBram Moolenaar def FuncYes(): string 17084c17ad94SBram Moolenaar return 'yes' 17094c17ad94SBram Moolenaar enddef 17104c17ad94SBram Moolenaar END 1711cfcd011fSBram Moolenaar var withno_lines =<< trim END 17124c17ad94SBram Moolenaar def FuncNo(): string 17134c17ad94SBram Moolenaar return 'no' 17144c17ad94SBram Moolenaar enddef 17154c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17164c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17174c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 171803afdcf1SBram Moolenaar enddef 171903afdcf1SBram Moolenaar END 1720cfcd011fSBram Moolenaar var nono_lines =<< trim END 172103afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 172203afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 172344d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17244c17ad94SBram Moolenaar enddef 17254c17ad94SBram Moolenaar END 17264c17ad94SBram Moolenaar 17274c17ad94SBram Moolenaar # FuncNo() is defined 172803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17294c17ad94SBram Moolenaar source Xreloaded.vim 17304c17ad94SBram Moolenaar g:DoCheck(true) 17314c17ad94SBram Moolenaar 17324c17ad94SBram Moolenaar # FuncNo() is not redefined 173303afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17344c17ad94SBram Moolenaar source Xreloaded.vim 17355082471fSBram Moolenaar g:DoCheck(false) 17364c17ad94SBram Moolenaar 17374c17ad94SBram Moolenaar # FuncNo() is back 173803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17394c17ad94SBram Moolenaar source Xreloaded.vim 17405082471fSBram Moolenaar g:DoCheck(false) 17414c17ad94SBram Moolenaar 17424c17ad94SBram Moolenaar delete('Xreloaded.vim') 17434c17ad94SBram Moolenaarenddef 17444c17ad94SBram Moolenaar 174589483d40SBram Moolenaardef Test_vim9script_reload_delvar() 174689483d40SBram Moolenaar # write the script with a script-local variable 1747cfcd011fSBram Moolenaar var lines =<< trim END 174889483d40SBram Moolenaar vim9script 1749cfcd011fSBram Moolenaar var name = 'string' 175089483d40SBram Moolenaar END 175189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 175289483d40SBram Moolenaar source XreloadVar.vim 175389483d40SBram Moolenaar 175489483d40SBram Moolenaar # now write the script using the same variable locally - works 175589483d40SBram Moolenaar lines =<< trim END 175689483d40SBram Moolenaar vim9script 175789483d40SBram Moolenaar def Func() 1758cfcd011fSBram Moolenaar var name = 'string' 175989483d40SBram Moolenaar enddef 176089483d40SBram Moolenaar END 176189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 176289483d40SBram Moolenaar source XreloadVar.vim 176389483d40SBram Moolenaar 176489483d40SBram Moolenaar delete('XreloadVar.vim') 176589483d40SBram Moolenaarenddef 176689483d40SBram Moolenaar 17678a7d6542SBram Moolenaardef Test_import_absolute() 1768cfcd011fSBram Moolenaar var import_lines = [ 1769e6085c53SBram Moolenaar 'vim9script', 1770e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1771e6085c53SBram Moolenaar 'def UseExported()', 1772e6085c53SBram Moolenaar ' g:imported_abs = exported', 1773e6085c53SBram Moolenaar ' exported = 8888', 1774e6085c53SBram Moolenaar ' g:imported_after = exported', 1775e6085c53SBram Moolenaar 'enddef', 1776e6085c53SBram Moolenaar 'UseExported()', 1777e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1778e6085c53SBram Moolenaar ] 17798a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 17808a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 17818a7d6542SBram Moolenaar 17828a7d6542SBram Moolenaar source Ximport_abs.vim 17838a7d6542SBram Moolenaar 17848a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 17854e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1786fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1787fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1788fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1789fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1790fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1791fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1792fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1793fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1794fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1795fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1796e6085c53SBram Moolenaar g:import_disassembled) 1797b3ca9824SBram Moolenaar 1798b3ca9824SBram Moolenaar Undo_export_script_lines() 17998a7d6542SBram Moolenaar unlet g:imported_abs 18004e12a5dfSBram Moolenaar unlet g:import_disassembled 18018a7d6542SBram Moolenaar 18028a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18038a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18048a7d6542SBram Moolenaarenddef 18058a7d6542SBram Moolenaar 18068a7d6542SBram Moolenaardef Test_import_rtp() 1807cfcd011fSBram Moolenaar var import_lines = [ 1808e6085c53SBram Moolenaar 'vim9script', 1809e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1810e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1811e6085c53SBram Moolenaar ] 18128a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18138a7d6542SBram Moolenaar mkdir('import') 18148a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18158a7d6542SBram Moolenaar 1816cfcd011fSBram Moolenaar var save_rtp = &rtp 18178a7d6542SBram Moolenaar &rtp = getcwd() 18188a7d6542SBram Moolenaar source Ximport_rtp.vim 18198a7d6542SBram Moolenaar &rtp = save_rtp 18208a7d6542SBram Moolenaar 18218a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18228a7d6542SBram Moolenaar 1823b3ca9824SBram Moolenaar Undo_export_script_lines() 1824b3ca9824SBram Moolenaar unlet g:imported_rtp 18258a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 182689483d40SBram Moolenaar delete('import', 'rf') 18278a7d6542SBram Moolenaarenddef 18288a7d6542SBram Moolenaar 182925e0f586SBram Moolenaardef Test_import_compile_error() 1830cfcd011fSBram Moolenaar var export_lines = [ 183125e0f586SBram Moolenaar 'vim9script', 183225e0f586SBram Moolenaar 'export def ExpFunc(): string', 183325e0f586SBram Moolenaar ' return notDefined', 183425e0f586SBram Moolenaar 'enddef', 183525e0f586SBram Moolenaar ] 183625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 183725e0f586SBram Moolenaar 1838cfcd011fSBram Moolenaar var import_lines = [ 183925e0f586SBram Moolenaar 'vim9script', 184025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 184125e0f586SBram Moolenaar 'def ImpFunc()', 184225e0f586SBram Moolenaar ' echo ExpFunc()', 184325e0f586SBram Moolenaar 'enddef', 184425e0f586SBram Moolenaar 'defcompile', 184525e0f586SBram Moolenaar ] 184625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 184725e0f586SBram Moolenaar 184825e0f586SBram Moolenaar try 184925e0f586SBram Moolenaar source Ximport.vim 185025e0f586SBram Moolenaar catch /E1001/ 1851f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 18527707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 185325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 185425e0f586SBram Moolenaar endtry 185525e0f586SBram Moolenaar 185625e0f586SBram Moolenaar delete('Xexported.vim') 185725e0f586SBram Moolenaar delete('Ximport.vim') 185825e0f586SBram Moolenaarenddef 185925e0f586SBram Moolenaar 1860c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1861cfcd011fSBram Moolenaar var lines = [ 1862c4ce36d4SBram Moolenaar 'vim9script', 1863c4ce36d4SBram Moolenaar 'def Func()', 1864c4ce36d4SBram Moolenaar ' eval [][0]', 1865c4ce36d4SBram Moolenaar 'enddef', 1866c4ce36d4SBram Moolenaar 'Func()', 1867c4ce36d4SBram Moolenaar ] 1868c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1869c4ce36d4SBram Moolenaar 1870c4ce36d4SBram Moolenaar for count in range(3) 1871c4ce36d4SBram Moolenaar try 1872c4ce36d4SBram Moolenaar source Xtestscript.vim 1873c4ce36d4SBram Moolenaar catch /E684/ 1874c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1875c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1876c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1877c4ce36d4SBram Moolenaar endtry 1878c4ce36d4SBram Moolenaar endfor 1879c4ce36d4SBram Moolenaar 1880c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1881c4ce36d4SBram Moolenaarenddef 1882c4ce36d4SBram Moolenaar 1883eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1884cfcd011fSBram Moolenaar var export_lines =<< trim END 1885eef2102eSBram Moolenaar vim9script 1886eef2102eSBram Moolenaar export def Func() 1887eef2102eSBram Moolenaar echo 'imported' 1888eef2102eSBram Moolenaar enddef 1889eef2102eSBram Moolenaar END 1890eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1891eef2102eSBram Moolenaar 1892cfcd011fSBram Moolenaar var lines =<< trim END 1893eef2102eSBram Moolenaar vim9script 1894eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1895eef2102eSBram Moolenaar def Func() 1896eef2102eSBram Moolenaar echo 'local to function' 1897eef2102eSBram Moolenaar enddef 1898eef2102eSBram Moolenaar END 1899eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1900eef2102eSBram Moolenaar 1901eef2102eSBram Moolenaar lines =<< trim END 1902eef2102eSBram Moolenaar vim9script 1903eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1904eef2102eSBram Moolenaar def Outer() 1905eef2102eSBram Moolenaar def Func() 1906eef2102eSBram Moolenaar echo 'local to function' 1907eef2102eSBram Moolenaar enddef 1908eef2102eSBram Moolenaar enddef 1909eef2102eSBram Moolenaar defcompile 1910eef2102eSBram Moolenaar END 1911eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1912eef2102eSBram Moolenaar 1913eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1914eef2102eSBram Moolenaarenddef 1915eef2102eSBram Moolenaar 1916b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1917cfcd011fSBram Moolenaar var lines =<< trim END 1918b9a2cac3SBram Moolenaar vim9script 1919b9a2cac3SBram Moolenaar def Func() 1920b9a2cac3SBram Moolenaar echo 'one' 1921b9a2cac3SBram Moolenaar enddef 1922b9a2cac3SBram Moolenaar def Func() 1923b9a2cac3SBram Moolenaar echo 'two' 1924b9a2cac3SBram Moolenaar enddef 1925b9a2cac3SBram Moolenaar END 1926b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1927fa211f3cSBram Moolenaar 1928fa211f3cSBram Moolenaar lines =<< trim END 1929fa211f3cSBram Moolenaar vim9script 1930fa211f3cSBram Moolenaar def Foo(): string 1931fa211f3cSBram Moolenaar return 'foo' 1932fa211f3cSBram Moolenaar enddef 1933fa211f3cSBram Moolenaar def Func() 1934cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1935fa211f3cSBram Moolenaar enddef 1936fa211f3cSBram Moolenaar defcompile 1937fa211f3cSBram Moolenaar END 1938fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1939b9a2cac3SBram Moolenaarenddef 1940b9a2cac3SBram Moolenaar 19418a7d6542SBram Moolenaardef Test_fixed_size_list() 1942f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1943cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 19448a7d6542SBram Moolenaar l->remove(0) 19458a7d6542SBram Moolenaar l->add(5) 19468a7d6542SBram Moolenaar l->insert(99, 1) 19470f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19488a7d6542SBram Moolenaarenddef 19498a7d6542SBram Moolenaar 1950ae616494SBram Moolenaardef Test_no_insert_xit() 1951d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1952d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1953d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1954d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1955d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1956ae616494SBram Moolenaar 1957ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1958ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1959ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1960ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1961f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1962f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 19636508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 19646508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 1965f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1966f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1967f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1968ae616494SBram Moolenaarenddef 1969ae616494SBram Moolenaar 1970158906cfSBram Moolenaardef IfElse(what: number): string 1971cfcd011fSBram Moolenaar var res = '' 1972158906cfSBram Moolenaar if what == 1 1973158906cfSBram Moolenaar res = "one" 1974158906cfSBram Moolenaar elseif what == 2 1975158906cfSBram Moolenaar res = "two" 1976a259d8d3SBram Moolenaar else 1977158906cfSBram Moolenaar res = "three" 1978a259d8d3SBram Moolenaar endif 1979158906cfSBram Moolenaar return res 1980a259d8d3SBram Moolenaarenddef 1981a259d8d3SBram Moolenaar 1982158906cfSBram Moolenaardef Test_if_elseif_else() 1983158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1984158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1985158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 19860f18b6d1SBram Moolenaarenddef 19870f18b6d1SBram Moolenaar 1988e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1989d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1990d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1991d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1992ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1993d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 19946628b7ebSBram Moolenaar 19956628b7ebSBram Moolenaar var lines =<< trim END 19966628b7ebSBram Moolenaar var s = '' 19976628b7ebSBram Moolenaar if s = '' 19986628b7ebSBram Moolenaar endif 19996628b7ebSBram Moolenaar END 20006628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 20016628b7ebSBram Moolenaar 20026628b7ebSBram Moolenaar lines =<< trim END 20036628b7ebSBram Moolenaar var s = '' 20046628b7ebSBram Moolenaar if s == '' 20056628b7ebSBram Moolenaar elseif s = '' 20066628b7ebSBram Moolenaar endif 20076628b7ebSBram Moolenaar END 20086628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2009e8c4abbbSBram Moolenaarenddef 2010e8c4abbbSBram Moolenaar 20116d69bf60SBram Moolenaarlet g:bool_true = v:true 20126d69bf60SBram Moolenaarlet g:bool_false = v:false 20136d69bf60SBram Moolenaar 20146d69bf60SBram Moolenaardef Test_if_const_expr() 2015cfcd011fSBram Moolenaar var res = false 20166d69bf60SBram Moolenaar if true ? true : false 20176d69bf60SBram Moolenaar res = true 20186d69bf60SBram Moolenaar endif 20196d69bf60SBram Moolenaar assert_equal(true, res) 20206d69bf60SBram Moolenaar 2021585fea7bSBram Moolenaar g:glob = 2 2022585fea7bSBram Moolenaar if false 20236797966dSBram Moolenaar execute('g:glob = 3') 2024585fea7bSBram Moolenaar endif 2025585fea7bSBram Moolenaar assert_equal(2, g:glob) 2026585fea7bSBram Moolenaar if true 20276797966dSBram Moolenaar execute('g:glob = 3') 2028585fea7bSBram Moolenaar endif 2029585fea7bSBram Moolenaar assert_equal(3, g:glob) 2030585fea7bSBram Moolenaar 20316d69bf60SBram Moolenaar res = false 20326d69bf60SBram Moolenaar if g:bool_true ? true : false 20336d69bf60SBram Moolenaar res = true 20346d69bf60SBram Moolenaar endif 20356d69bf60SBram Moolenaar assert_equal(true, res) 20366d69bf60SBram Moolenaar 20376d69bf60SBram Moolenaar res = false 20386d69bf60SBram Moolenaar if true ? g:bool_true : false 20396d69bf60SBram Moolenaar res = true 20406d69bf60SBram Moolenaar endif 20416d69bf60SBram Moolenaar assert_equal(true, res) 20426d69bf60SBram Moolenaar 20436d69bf60SBram Moolenaar res = false 20446d69bf60SBram Moolenaar if true ? true : g:bool_false 20456d69bf60SBram Moolenaar res = true 20466d69bf60SBram Moolenaar endif 20476d69bf60SBram Moolenaar assert_equal(true, res) 20486d69bf60SBram Moolenaar 20496d69bf60SBram Moolenaar res = false 20506d69bf60SBram Moolenaar if true ? false : true 20516d69bf60SBram Moolenaar res = true 20526d69bf60SBram Moolenaar endif 20536d69bf60SBram Moolenaar assert_equal(false, res) 20546d69bf60SBram Moolenaar 20556d69bf60SBram Moolenaar res = false 20566d69bf60SBram Moolenaar if false ? false : true 20576d69bf60SBram Moolenaar res = true 20586d69bf60SBram Moolenaar endif 20596d69bf60SBram Moolenaar assert_equal(true, res) 20606d69bf60SBram Moolenaar 20616d69bf60SBram Moolenaar res = false 20626d69bf60SBram Moolenaar if false ? true : false 20636d69bf60SBram Moolenaar res = true 20646d69bf60SBram Moolenaar endif 20656d69bf60SBram Moolenaar assert_equal(false, res) 20666d69bf60SBram Moolenaar 20676d69bf60SBram Moolenaar res = false 2068e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2069e8c4abbbSBram Moolenaar res = true 2070e8c4abbbSBram Moolenaar endif 2071e8c4abbbSBram Moolenaar assert_equal(false, res) 2072e8c4abbbSBram Moolenaar 2073e8c4abbbSBram Moolenaar res = false 20746d69bf60SBram Moolenaar if true && true 20756d69bf60SBram Moolenaar res = true 20766d69bf60SBram Moolenaar endif 20776d69bf60SBram Moolenaar assert_equal(true, res) 20786d69bf60SBram Moolenaar 20796d69bf60SBram Moolenaar res = false 20806d69bf60SBram Moolenaar if true && false 20816d69bf60SBram Moolenaar res = true 20826d69bf60SBram Moolenaar endif 20836d69bf60SBram Moolenaar assert_equal(false, res) 20846d69bf60SBram Moolenaar 20856d69bf60SBram Moolenaar res = false 20866d69bf60SBram Moolenaar if g:bool_true && false 20876d69bf60SBram Moolenaar res = true 20886d69bf60SBram Moolenaar endif 20896d69bf60SBram Moolenaar assert_equal(false, res) 20906d69bf60SBram Moolenaar 20916d69bf60SBram Moolenaar res = false 20926d69bf60SBram Moolenaar if true && g:bool_false 20936d69bf60SBram Moolenaar res = true 20946d69bf60SBram Moolenaar endif 20956d69bf60SBram Moolenaar assert_equal(false, res) 20966d69bf60SBram Moolenaar 20976d69bf60SBram Moolenaar res = false 20986d69bf60SBram Moolenaar if false && false 20996d69bf60SBram Moolenaar res = true 21006d69bf60SBram Moolenaar endif 21016d69bf60SBram Moolenaar assert_equal(false, res) 21026d69bf60SBram Moolenaar 21036d69bf60SBram Moolenaar res = false 21046d69bf60SBram Moolenaar if true || false 21056d69bf60SBram Moolenaar res = true 21066d69bf60SBram Moolenaar endif 21076d69bf60SBram Moolenaar assert_equal(true, res) 21086d69bf60SBram Moolenaar 21096d69bf60SBram Moolenaar res = false 21106d69bf60SBram Moolenaar if g:bool_true || false 21116d69bf60SBram Moolenaar res = true 21126d69bf60SBram Moolenaar endif 21136d69bf60SBram Moolenaar assert_equal(true, res) 21146d69bf60SBram Moolenaar 21156d69bf60SBram Moolenaar res = false 21166d69bf60SBram Moolenaar if true || g:bool_false 21176d69bf60SBram Moolenaar res = true 21186d69bf60SBram Moolenaar endif 21196d69bf60SBram Moolenaar assert_equal(true, res) 21206d69bf60SBram Moolenaar 21216d69bf60SBram Moolenaar res = false 21226d69bf60SBram Moolenaar if false || false 21236d69bf60SBram Moolenaar res = true 21246d69bf60SBram Moolenaar endif 21256d69bf60SBram Moolenaar assert_equal(false, res) 21263988f64fSBram Moolenaar 21273988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21283988f64fSBram Moolenaar if false | eval 0 | endif 21293988f64fSBram Moolenaar if false | eval burp + 234 | endif 21303988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21313988f64fSBram Moolenaar if false 21323988f64fSBram Moolenaar burp 21333988f64fSBram Moolenaar endif 213480c34ca3SBram Moolenaarenddef 21356d69bf60SBram Moolenaar 213680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2137d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2138d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2139d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2140d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21416d69bf60SBram Moolenaarenddef 21426d69bf60SBram Moolenaar 214372abcf42SBram Moolenaardef RunNested(i: number): number 2144cfcd011fSBram Moolenaar var x: number = 0 214572abcf42SBram Moolenaar if i % 2 214672abcf42SBram Moolenaar if 1 2147f5be8cdbSBram Moolenaar # comment 214872abcf42SBram Moolenaar else 2149f5be8cdbSBram Moolenaar # comment 215072abcf42SBram Moolenaar endif 215172abcf42SBram Moolenaar x += 1 215272abcf42SBram Moolenaar else 215372abcf42SBram Moolenaar x += 1000 215472abcf42SBram Moolenaar endif 215572abcf42SBram Moolenaar return x 215672abcf42SBram Moolenaarenddef 215772abcf42SBram Moolenaar 215872abcf42SBram Moolenaardef Test_nested_if() 215972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 216072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 216172abcf42SBram Moolenaarenddef 216272abcf42SBram Moolenaar 2163ad39c094SBram Moolenaardef Test_execute_cmd() 2164e4984290SBram Moolenaar # missing argument is ignored 2165e4984290SBram Moolenaar execute 2166e4984290SBram Moolenaar execute # comment 2167e4984290SBram Moolenaar 2168ad39c094SBram Moolenaar new 2169ad39c094SBram Moolenaar setline(1, 'default') 2170d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2171ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2172a72cfb80SBram Moolenaar 2173d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2174a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2175a72cfb80SBram Moolenaar 2176cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2177cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2178a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2179ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2180a72cfb80SBram Moolenaar 2181d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2182ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2183a72cfb80SBram Moolenaar 2184cfcd011fSBram Moolenaar var cmd_first = 'call ' 2185cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2186ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2187ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2188ad39c094SBram Moolenaar bwipe! 2189585fea7bSBram Moolenaar 2190cfcd011fSBram Moolenaar var n = true 21912d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 21922d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 21932d6b20d6SBram Moolenaar 2194e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2195e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2196e5abf7afSBram Moolenaar 2197d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2198d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2199d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2200ad39c094SBram Moolenaarenddef 2201ad39c094SBram Moolenaar 220247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2203f5be8cdbSBram Moolenaar # only checks line continuation 2204cfcd011fSBram Moolenaar var lines =<< trim END 220547e880d6SBram Moolenaar vim9script 220647e880d6SBram Moolenaar execute 'g:someVar' 220747e880d6SBram Moolenaar .. ' = ' .. 220847e880d6SBram Moolenaar '28' 220947e880d6SBram Moolenaar assert_equal(28, g:someVar) 221047e880d6SBram Moolenaar unlet g:someVar 221147e880d6SBram Moolenaar END 221247e880d6SBram Moolenaar CheckScriptSuccess(lines) 221347e880d6SBram Moolenaarenddef 221447e880d6SBram Moolenaar 2215ad39c094SBram Moolenaardef Test_echo_cmd() 2216a72cfb80SBram Moolenaar echo 'some' # comment 2217585fea7bSBram Moolenaar echon 'thing' 2218ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2219ad39c094SBram Moolenaar 2220a72cfb80SBram Moolenaar echo "some" # comment 2221a72cfb80SBram Moolenaar echon "thing" 2222a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2223a72cfb80SBram Moolenaar 2224cfcd011fSBram Moolenaar var str1 = 'some' 2225cfcd011fSBram Moolenaar var str2 = 'more' 2226ad39c094SBram Moolenaar echo str1 str2 2227ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2228a72cfb80SBram Moolenaar 2229d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2230ad39c094SBram Moolenaarenddef 2231ad39c094SBram Moolenaar 2232f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2233f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2234f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2235f93c7feaSBram Moolenaar echo 'clear' 2236df069eecSBram Moolenaar :1messages 2237f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2238f93c7feaSBram Moolenaar 2239d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2240f93c7feaSBram Moolenaarenddef 2241f93c7feaSBram Moolenaar 224247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2243f5be8cdbSBram Moolenaar # only checks line continuation 2244cfcd011fSBram Moolenaar var lines =<< trim END 224547e880d6SBram Moolenaar vim9script 224647e880d6SBram Moolenaar echomsg 'here' 224747e880d6SBram Moolenaar .. ' is ' .. 224847e880d6SBram Moolenaar 'a message' 224947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 225047e880d6SBram Moolenaar END 225147e880d6SBram Moolenaar CheckScriptSuccess(lines) 225247e880d6SBram Moolenaarenddef 225347e880d6SBram Moolenaar 2254f93c7feaSBram Moolenaardef Test_echoerr_cmd() 225540ee466cSBram Moolenaar try 225640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 225740ee466cSBram Moolenaar catch 225840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 225940ee466cSBram Moolenaar endtry 2260f93c7feaSBram Moolenaarenddef 2261f93c7feaSBram Moolenaar 226247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2263f5be8cdbSBram Moolenaar # only checks line continuation 2264cfcd011fSBram Moolenaar var lines =<< trim END 226547e880d6SBram Moolenaar vim9script 226647e880d6SBram Moolenaar try 226747e880d6SBram Moolenaar echoerr 'this' 226847e880d6SBram Moolenaar .. ' is ' .. 226947e880d6SBram Moolenaar 'wrong' 227047e880d6SBram Moolenaar catch 227147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 227247e880d6SBram Moolenaar endtry 227347e880d6SBram Moolenaar END 227447e880d6SBram Moolenaar CheckScriptSuccess(lines) 227547e880d6SBram Moolenaarenddef 227647e880d6SBram Moolenaar 227741fe0617SBram Moolenaardef Test_for_outside_of_function() 2278cfcd011fSBram Moolenaar var lines =<< trim END 227941fe0617SBram Moolenaar vim9script 228041fe0617SBram Moolenaar new 228141fe0617SBram Moolenaar for var in range(0, 3) 228241fe0617SBram Moolenaar append(line('$'), var) 228341fe0617SBram Moolenaar endfor 228441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 228541fe0617SBram Moolenaar bwipe! 2286522eefd9SBram Moolenaar 2287522eefd9SBram Moolenaar var result = '' 2288522eefd9SBram Moolenaar for i in [1, 2, 3] 2289522eefd9SBram Moolenaar var loop = ' loop ' .. i 2290522eefd9SBram Moolenaar result ..= loop 2291522eefd9SBram Moolenaar endfor 2292522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 229341fe0617SBram Moolenaar END 229441fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 229541fe0617SBram Moolenaar source Xvim9for.vim 229641fe0617SBram Moolenaar delete('Xvim9for.vim') 229741fe0617SBram Moolenaarenddef 22988a7d6542SBram Moolenaar 2299e8c4abbbSBram Moolenaardef Test_for_loop() 2300f2253963SBram Moolenaar var lines =<< trim END 2301cfcd011fSBram Moolenaar var result = '' 2302e8c4abbbSBram Moolenaar for cnt in range(7) 2303e8c4abbbSBram Moolenaar if cnt == 4 2304e8c4abbbSBram Moolenaar break 2305e8c4abbbSBram Moolenaar endif 2306e8c4abbbSBram Moolenaar if cnt == 2 2307e8c4abbbSBram Moolenaar continue 2308e8c4abbbSBram Moolenaar endif 2309e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2310e8c4abbbSBram Moolenaar endfor 2311e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23120ad3e894SBram Moolenaar 2313cfcd011fSBram Moolenaar var concat = '' 23140ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23150ad3e894SBram Moolenaar concat ..= str 23160ad3e894SBram Moolenaar endfor 23170ad3e894SBram Moolenaar assert_equal('onetwo', concat) 231838bd8de5SBram Moolenaar 231938bd8de5SBram Moolenaar var total = 0 232038bd8de5SBram Moolenaar for nr in 232138bd8de5SBram Moolenaar [1, 2, 3] 232238bd8de5SBram Moolenaar total += nr 232338bd8de5SBram Moolenaar endfor 232438bd8de5SBram Moolenaar assert_equal(6, total) 232538bd8de5SBram Moolenaar 232638bd8de5SBram Moolenaar total = 0 232738bd8de5SBram Moolenaar for nr 232838bd8de5SBram Moolenaar in [1, 2, 3] 232938bd8de5SBram Moolenaar total += nr 233038bd8de5SBram Moolenaar endfor 233138bd8de5SBram Moolenaar assert_equal(6, total) 233238bd8de5SBram Moolenaar 233338bd8de5SBram Moolenaar total = 0 233438bd8de5SBram Moolenaar for nr 233538bd8de5SBram Moolenaar in 233638bd8de5SBram Moolenaar [1, 2, 3] 233738bd8de5SBram Moolenaar total += nr 233838bd8de5SBram Moolenaar endfor 233938bd8de5SBram Moolenaar assert_equal(6, total) 2340036d0714SBram Moolenaar 2341a3589a0dSBram Moolenaar # with type 2342a3589a0dSBram Moolenaar total = 0 2343a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2344a3589a0dSBram Moolenaar total += n 2345a3589a0dSBram Moolenaar endfor 2346a3589a0dSBram Moolenaar assert_equal(6, total) 2347a3589a0dSBram Moolenaar 2348fe090eb5SBram Moolenaar var chars = '' 2349fe090eb5SBram Moolenaar for s: string in 'foobar' 2350fe090eb5SBram Moolenaar chars ..= s 2351fe090eb5SBram Moolenaar endfor 2352fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2353fe090eb5SBram Moolenaar 2354a3589a0dSBram Moolenaar # unpack with type 2355f2253963SBram Moolenaar var res = '' 2356a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2357a3589a0dSBram Moolenaar res ..= n .. s 2358a3589a0dSBram Moolenaar endfor 2359a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2360a3589a0dSBram Moolenaar 2361a3589a0dSBram Moolenaar # loop over string 2362a3589a0dSBram Moolenaar res = '' 236374e54fcbSBram Moolenaar for c in 'aéc̀d' 236474e54fcbSBram Moolenaar res ..= c .. '-' 236574e54fcbSBram Moolenaar endfor 236674e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 236774e54fcbSBram Moolenaar 236874e54fcbSBram Moolenaar res = '' 236974e54fcbSBram Moolenaar for c in '' 237074e54fcbSBram Moolenaar res ..= c .. '-' 237174e54fcbSBram Moolenaar endfor 237274e54fcbSBram Moolenaar assert_equal('', res) 237374e54fcbSBram Moolenaar 237474e54fcbSBram Moolenaar res = '' 237574e54fcbSBram Moolenaar for c in test_null_string() 237674e54fcbSBram Moolenaar res ..= c .. '-' 237774e54fcbSBram Moolenaar endfor 237874e54fcbSBram Moolenaar assert_equal('', res) 2379f2253963SBram Moolenaar 2380f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2381f2253963SBram Moolenaar {a: 'Cat'} 2382f2253963SBram Moolenaar ] 2383f2253963SBram Moolenaar for dd in foo 2384f2253963SBram Moolenaar dd.counter = 12 2385f2253963SBram Moolenaar endfor 2386f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2387f2253963SBram Moolenaar END 2388f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2389e8c4abbbSBram Moolenaarenddef 2390e8c4abbbSBram Moolenaar 2391e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2392025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2393025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2394025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2395675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2396675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2397cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2398822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 23992d870f8dSBram Moolenaar delfunc! g:Func 2400675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2401675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2402675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 240374e54fcbSBram Moolenaar 240474e54fcbSBram Moolenaar # wrong type detected at compile time 240574e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 240674e54fcbSBram Moolenaar 240774e54fcbSBram Moolenaar # wrong type detected at runtime 240874e54fcbSBram Moolenaar g:adict = {a: 1} 240974e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 241074e54fcbSBram Moolenaar unlet g:adict 2411f6a8d420SBram Moolenaar 2412f6a8d420SBram Moolenaar var lines =<< trim END 2413f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2414f6a8d420SBram Moolenaar for e in d 2415f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2416f6a8d420SBram Moolenaar endfor 2417f6a8d420SBram Moolenaar END 2418f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2419fe090eb5SBram Moolenaar 2420fe090eb5SBram Moolenaar lines =<< trim END 2421fe090eb5SBram Moolenaar for nr: number in ['foo'] 2422fe090eb5SBram Moolenaar endfor 2423fe090eb5SBram Moolenaar END 2424fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2425e8c4abbbSBram Moolenaarenddef 2426e8c4abbbSBram Moolenaar 2427ea87069dSBram Moolenaardef Test_for_loop_script_var() 2428ea87069dSBram Moolenaar # cannot use s:var in a :def function 2429ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2430ea87069dSBram Moolenaar 2431ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2432ea87069dSBram Moolenaar var lines =<< trim END 2433ea87069dSBram Moolenaar vim9script 2434ea87069dSBram Moolenaar var total = 0 2435ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2436ea87069dSBram Moolenaar total += s:var 2437ea87069dSBram Moolenaar endfor 2438ea87069dSBram Moolenaar assert_equal(6, total) 2439ea87069dSBram Moolenaar 2440ea87069dSBram Moolenaar total = 0 2441ea87069dSBram Moolenaar for var in [1, 2, 3] 2442ea87069dSBram Moolenaar total += var 2443ea87069dSBram Moolenaar endfor 2444ea87069dSBram Moolenaar assert_equal(6, total) 2445ea87069dSBram Moolenaar END 2446ea87069dSBram Moolenaarenddef 2447ea87069dSBram Moolenaar 2448792f786aSBram Moolenaardef Test_for_loop_unpack() 24494b8a0651SBram Moolenaar var lines =<< trim END 2450792f786aSBram Moolenaar var result = [] 2451792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2452792f786aSBram Moolenaar result->add(v1) 2453792f786aSBram Moolenaar result->add(v2) 2454792f786aSBram Moolenaar endfor 2455792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2456792f786aSBram Moolenaar 2457792f786aSBram Moolenaar result = [] 2458792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2459792f786aSBram Moolenaar result->add(v1) 2460792f786aSBram Moolenaar result->add(v2) 2461792f786aSBram Moolenaar result->add(v3) 2462792f786aSBram Moolenaar endfor 2463792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2464792f786aSBram Moolenaar 24654b8a0651SBram Moolenaar result = [] 24664b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 24674b8a0651SBram Moolenaar result->add(&ts) 24684b8a0651SBram Moolenaar result->add(&sw) 24694b8a0651SBram Moolenaar endfor 24704b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 24714b8a0651SBram Moolenaar 24724b8a0651SBram Moolenaar var slist: list<string> 24734b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 24744b8a0651SBram Moolenaar slist->add($LOOPVAR) 24754b8a0651SBram Moolenaar slist->add(@r) 24764b8a0651SBram Moolenaar slist->add(v:errmsg) 24774b8a0651SBram Moolenaar endfor 24784b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 24794b8a0651SBram Moolenaar 24804b8a0651SBram Moolenaar slist = [] 24814b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 24824b8a0651SBram Moolenaar slist->add(g:globalvar) 24834b8a0651SBram Moolenaar slist->add(b:bufvar) 24844b8a0651SBram Moolenaar slist->add(w:winvar) 24854b8a0651SBram Moolenaar slist->add(t:tabvar) 24864b8a0651SBram Moolenaar endfor 24874b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2488f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 24894b8a0651SBram Moolenaar END 24904b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 24914b8a0651SBram Moolenaar 24924b8a0651SBram Moolenaar lines =<< trim END 2493792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2494792f786aSBram Moolenaar echo v1 v2 2495792f786aSBram Moolenaar endfor 2496792f786aSBram Moolenaar END 2497792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2498792f786aSBram Moolenaar 2499792f786aSBram Moolenaar lines =<< trim END 2500792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2501792f786aSBram Moolenaar echo v1 v2 2502792f786aSBram Moolenaar endfor 2503792f786aSBram Moolenaar END 2504792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2505792f786aSBram Moolenaar 2506792f786aSBram Moolenaar lines =<< trim END 2507792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2508792f786aSBram Moolenaar echo v1 2509792f786aSBram Moolenaar endfor 2510792f786aSBram Moolenaar END 2511792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2512792f786aSBram Moolenaarenddef 2513792f786aSBram Moolenaar 2514c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2515f2253963SBram Moolenaar var lines =<< trim END 2516c150c09eSBram Moolenaar var looped = 0 2517c150c09eSBram Moolenaar var cleanup = 0 2518c150c09eSBram Moolenaar for i in range(3) 2519c150c09eSBram Moolenaar looped += 1 2520c150c09eSBram Moolenaar try 2521c150c09eSBram Moolenaar eval [][0] 2522c150c09eSBram Moolenaar catch 2523c150c09eSBram Moolenaar continue 2524c150c09eSBram Moolenaar finally 2525c150c09eSBram Moolenaar cleanup += 1 2526c150c09eSBram Moolenaar endtry 2527c150c09eSBram Moolenaar endfor 2528c150c09eSBram Moolenaar assert_equal(3, looped) 2529c150c09eSBram Moolenaar assert_equal(3, cleanup) 2530f2253963SBram Moolenaar END 2531f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2532c150c09eSBram Moolenaarenddef 2533c150c09eSBram Moolenaar 2534d0df1aacSBram Moolenaardef Test_while_loop() 2535cfcd011fSBram Moolenaar var result = '' 2536cfcd011fSBram Moolenaar var cnt = 0 2537d0df1aacSBram Moolenaar while cnt < 555 2538d0df1aacSBram Moolenaar if cnt == 3 2539d0df1aacSBram Moolenaar break 2540d0df1aacSBram Moolenaar endif 2541d0df1aacSBram Moolenaar cnt += 1 2542d0df1aacSBram Moolenaar if cnt == 2 2543d0df1aacSBram Moolenaar continue 2544d0df1aacSBram Moolenaar endif 2545d0df1aacSBram Moolenaar result ..= cnt .. '_' 2546d0df1aacSBram Moolenaar endwhile 2547d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2548dee37dc7SBram Moolenaar 2549dee37dc7SBram Moolenaar var s = '' 25500123cc1eSBram Moolenaar while s == 'x' # {comment} 2551dee37dc7SBram Moolenaar endwhile 2552d0df1aacSBram Moolenaarenddef 2553d0df1aacSBram Moolenaar 2554e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2555675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2556675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2557675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2558675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2559675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2560675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2561675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 25626628b7ebSBram Moolenaar 25636628b7ebSBram Moolenaar var lines =<< trim END 25646628b7ebSBram Moolenaar var s = '' 25656628b7ebSBram Moolenaar while s = '' 25666628b7ebSBram Moolenaar endwhile 25676628b7ebSBram Moolenaar END 25686628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2569bd5da371SBram Moolenaarenddef 2570bd5da371SBram Moolenaar 25719645e2d9SBram Moolenaardef Test_interrupt_loop() 2572cfcd011fSBram Moolenaar var caught = false 2573cfcd011fSBram Moolenaar var x = 0 257497acfc78SBram Moolenaar try 25759645e2d9SBram Moolenaar while 1 25769645e2d9SBram Moolenaar x += 1 25779645e2d9SBram Moolenaar if x == 100 25789645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 25799645e2d9SBram Moolenaar endif 25809645e2d9SBram Moolenaar endwhile 258197acfc78SBram Moolenaar catch 258297acfc78SBram Moolenaar caught = true 258397acfc78SBram Moolenaar assert_equal(100, x) 258497acfc78SBram Moolenaar endtry 258597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 258625859dd7SBram Moolenaar # consume the CTRL-C 258725859dd7SBram Moolenaar getchar(0) 25889645e2d9SBram Moolenaarenddef 258920431c9dSBram Moolenaar 25904fdae999SBram Moolenaardef Test_automatic_line_continuation() 2591cfcd011fSBram Moolenaar var mylist = [ 25924fdae999SBram Moolenaar 'one', 25934fdae999SBram Moolenaar 'two', 25944fdae999SBram Moolenaar 'three', 2595f5be8cdbSBram Moolenaar ] # comment 25964fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 25974fdae999SBram Moolenaar 2598cfcd011fSBram Moolenaar var mydict = { 2599e0de171eSBram Moolenaar ['one']: 1, 2600e0de171eSBram Moolenaar ['two']: 2, 2601e0de171eSBram Moolenaar ['three']: 26024fdae999SBram Moolenaar 3, 2603f5be8cdbSBram Moolenaar } # comment 2604e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2605e0de171eSBram Moolenaar mydict = { 26062c330432SBram Moolenaar one: 1, # comment 26072c330432SBram Moolenaar two: # comment 26082c330432SBram Moolenaar 2, # comment 26092c330432SBram Moolenaar three: 3 # comment 26102c330432SBram Moolenaar } 2611e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2612e0de171eSBram Moolenaar mydict = { 26132c330432SBram Moolenaar one: 1, 26144fdae999SBram Moolenaar two: 26154fdae999SBram Moolenaar 2, 26162c330432SBram Moolenaar three: 3 26174fdae999SBram Moolenaar } 2618e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2619e6085c53SBram Moolenaar 2620e6085c53SBram Moolenaar assert_equal( 2621e6085c53SBram Moolenaar ['one', 'two', 'three'], 2622e6085c53SBram Moolenaar split('one two three') 2623e6085c53SBram Moolenaar ) 26244fdae999SBram Moolenaarenddef 26254fdae999SBram Moolenaar 26267a092245SBram Moolenaardef Test_vim9_comment() 26277a092245SBram Moolenaar CheckScriptSuccess([ 26287a092245SBram Moolenaar 'vim9script', 26297a092245SBram Moolenaar '# something', 263093f82cbeSBram Moolenaar '#something', 263193f82cbeSBram Moolenaar '#{something', 26327a092245SBram Moolenaar ]) 263393f82cbeSBram Moolenaar 263493f82cbeSBram Moolenaar split Xfile 263593f82cbeSBram Moolenaar CheckScriptSuccess([ 263693f82cbeSBram Moolenaar 'vim9script', 263793f82cbeSBram Moolenaar 'edit #something', 263893f82cbeSBram Moolenaar ]) 263993f82cbeSBram Moolenaar CheckScriptSuccess([ 264093f82cbeSBram Moolenaar 'vim9script', 264193f82cbeSBram Moolenaar 'edit #{something', 264293f82cbeSBram Moolenaar ]) 264393f82cbeSBram Moolenaar close 264493f82cbeSBram Moolenaar 26457a092245SBram Moolenaar CheckScriptFailure([ 26467a092245SBram Moolenaar 'vim9script', 26477a092245SBram Moolenaar ':# something', 26487a092245SBram Moolenaar ], 'E488:') 26497a092245SBram Moolenaar CheckScriptFailure([ 26507a092245SBram Moolenaar '# something', 26517a092245SBram Moolenaar ], 'E488:') 26527a092245SBram Moolenaar CheckScriptFailure([ 26537a092245SBram Moolenaar ':# something', 26547a092245SBram Moolenaar ], 'E488:') 26557a092245SBram Moolenaar 26564a8d9f2eSBram Moolenaar { # block start 26574a8d9f2eSBram Moolenaar } # block end 26584a8d9f2eSBram Moolenaar CheckDefFailure([ 26594a8d9f2eSBram Moolenaar '{# comment', 26604a8d9f2eSBram Moolenaar ], 'E488:') 26614a8d9f2eSBram Moolenaar CheckDefFailure([ 26624a8d9f2eSBram Moolenaar '{', 26634a8d9f2eSBram Moolenaar '}# comment', 26644a8d9f2eSBram Moolenaar ], 'E488:') 26654a8d9f2eSBram Moolenaar 26664a8d9f2eSBram Moolenaar echo "yes" # comment 26674a8d9f2eSBram Moolenaar CheckDefFailure([ 26684a8d9f2eSBram Moolenaar 'echo "yes"# comment', 26694a8d9f2eSBram Moolenaar ], 'E488:') 26707a092245SBram Moolenaar CheckScriptSuccess([ 26717a092245SBram Moolenaar 'vim9script', 26727a092245SBram Moolenaar 'echo "yes" # something', 26737a092245SBram Moolenaar ]) 26747a092245SBram Moolenaar CheckScriptFailure([ 26757a092245SBram Moolenaar 'vim9script', 26767a092245SBram Moolenaar 'echo "yes"# something', 26777a092245SBram Moolenaar ], 'E121:') 26787a092245SBram Moolenaar CheckScriptFailure([ 26797a092245SBram Moolenaar 'vim9script', 26807a092245SBram Moolenaar 'echo# something', 2681f8103f27SBram Moolenaar ], 'E1144:') 26827a092245SBram Moolenaar CheckScriptFailure([ 26837a092245SBram Moolenaar 'echo "yes" # something', 26847a092245SBram Moolenaar ], 'E121:') 26857a092245SBram Moolenaar 26864a8d9f2eSBram Moolenaar exe "echo" # comment 26874a8d9f2eSBram Moolenaar CheckDefFailure([ 26884a8d9f2eSBram Moolenaar 'exe "echo"# comment', 26894a8d9f2eSBram Moolenaar ], 'E488:') 26904a8d9f2eSBram Moolenaar CheckScriptSuccess([ 26914a8d9f2eSBram Moolenaar 'vim9script', 26924a8d9f2eSBram Moolenaar 'exe "echo" # something', 26934a8d9f2eSBram Moolenaar ]) 26944a8d9f2eSBram Moolenaar CheckScriptFailure([ 26954a8d9f2eSBram Moolenaar 'vim9script', 26964a8d9f2eSBram Moolenaar 'exe "echo"# something', 26974a8d9f2eSBram Moolenaar ], 'E121:') 26984a8d9f2eSBram Moolenaar CheckScriptFailure([ 26994a8d9f2eSBram Moolenaar 'vim9script', 27004a8d9f2eSBram Moolenaar 'exe# something', 2701f8103f27SBram Moolenaar ], 'E1144:') 27024a8d9f2eSBram Moolenaar CheckScriptFailure([ 27034a8d9f2eSBram Moolenaar 'exe "echo" # something', 27044a8d9f2eSBram Moolenaar ], 'E121:') 27054a8d9f2eSBram Moolenaar 27067a092245SBram Moolenaar CheckDefFailure([ 27077a092245SBram Moolenaar 'try# comment', 27087a092245SBram Moolenaar ' echo "yes"', 27097a092245SBram Moolenaar 'catch', 27107a092245SBram Moolenaar 'endtry', 2711f8103f27SBram Moolenaar ], 'E1144:') 27122c5ed4e3SBram Moolenaar CheckScriptFailure([ 27132c5ed4e3SBram Moolenaar 'vim9script', 27142c5ed4e3SBram Moolenaar 'try# comment', 27152c5ed4e3SBram Moolenaar 'echo "yes"', 2716f8103f27SBram Moolenaar ], 'E1144:') 27177a092245SBram Moolenaar CheckDefFailure([ 27187a092245SBram Moolenaar 'try', 2719a72cfb80SBram Moolenaar ' throw#comment', 2720a72cfb80SBram Moolenaar 'catch', 2721a72cfb80SBram Moolenaar 'endtry', 2722f8103f27SBram Moolenaar ], 'E1144:') 2723a72cfb80SBram Moolenaar CheckDefFailure([ 2724a72cfb80SBram Moolenaar 'try', 2725a72cfb80SBram Moolenaar ' throw "yes"#comment', 2726a72cfb80SBram Moolenaar 'catch', 2727a72cfb80SBram Moolenaar 'endtry', 2728a72cfb80SBram Moolenaar ], 'E488:') 2729a72cfb80SBram Moolenaar CheckDefFailure([ 2730a72cfb80SBram Moolenaar 'try', 27317a092245SBram Moolenaar ' echo "yes"', 27327a092245SBram Moolenaar 'catch# comment', 27337a092245SBram Moolenaar 'endtry', 2734f8103f27SBram Moolenaar ], 'E1144:') 27352c5ed4e3SBram Moolenaar CheckScriptFailure([ 27362c5ed4e3SBram Moolenaar 'vim9script', 27372c5ed4e3SBram Moolenaar 'try', 27382c5ed4e3SBram Moolenaar ' echo "yes"', 27392c5ed4e3SBram Moolenaar 'catch# comment', 27402c5ed4e3SBram Moolenaar 'endtry', 2741f8103f27SBram Moolenaar ], 'E1144:') 27422c5ed4e3SBram Moolenaar CheckDefFailure([ 27432c5ed4e3SBram Moolenaar 'try', 27442c5ed4e3SBram Moolenaar ' echo "yes"', 27452c5ed4e3SBram Moolenaar 'catch /pat/# comment', 27462c5ed4e3SBram Moolenaar 'endtry', 27472c5ed4e3SBram Moolenaar ], 'E488:') 27487a092245SBram Moolenaar CheckDefFailure([ 27497a092245SBram Moolenaar 'try', 27507a092245SBram Moolenaar 'echo "yes"', 27517a092245SBram Moolenaar 'catch', 27527a092245SBram Moolenaar 'endtry# comment', 2753f8103f27SBram Moolenaar ], 'E1144:') 27542c5ed4e3SBram Moolenaar CheckScriptFailure([ 27552c5ed4e3SBram Moolenaar 'vim9script', 27562c5ed4e3SBram Moolenaar 'try', 27572c5ed4e3SBram Moolenaar ' echo "yes"', 27582c5ed4e3SBram Moolenaar 'catch', 27592c5ed4e3SBram Moolenaar 'endtry# comment', 2760f8103f27SBram Moolenaar ], 'E1144:') 27612c5ed4e3SBram Moolenaar 27622c5ed4e3SBram Moolenaar CheckScriptSuccess([ 27632c5ed4e3SBram Moolenaar 'vim9script', 27642c5ed4e3SBram Moolenaar 'hi # comment', 27652c5ed4e3SBram Moolenaar ]) 27662c5ed4e3SBram Moolenaar CheckScriptFailure([ 27672c5ed4e3SBram Moolenaar 'vim9script', 27682c5ed4e3SBram Moolenaar 'hi# comment', 2769f8103f27SBram Moolenaar ], 'E1144:') 27701966c248SBram Moolenaar CheckScriptSuccess([ 27711966c248SBram Moolenaar 'vim9script', 27721966c248SBram Moolenaar 'hi Search # comment', 27731966c248SBram Moolenaar ]) 27741966c248SBram Moolenaar CheckScriptFailure([ 27751966c248SBram Moolenaar 'vim9script', 27761966c248SBram Moolenaar 'hi Search# comment', 27771966c248SBram Moolenaar ], 'E416:') 27781966c248SBram Moolenaar CheckScriptSuccess([ 27791966c248SBram Moolenaar 'vim9script', 27801966c248SBram Moolenaar 'hi link This Search # comment', 27811966c248SBram Moolenaar ]) 27821966c248SBram Moolenaar CheckScriptFailure([ 27831966c248SBram Moolenaar 'vim9script', 27841966c248SBram Moolenaar 'hi link This That# comment', 27851966c248SBram Moolenaar ], 'E413:') 27861966c248SBram Moolenaar CheckScriptSuccess([ 27871966c248SBram Moolenaar 'vim9script', 27881966c248SBram Moolenaar 'hi clear This # comment', 27891966c248SBram Moolenaar 'hi clear # comment', 27901966c248SBram Moolenaar ]) 2791f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2792f5be8cdbSBram Moolenaar # hi clear This# comment', 27931966c248SBram Moolenaar CheckScriptFailure([ 27941966c248SBram Moolenaar 'vim9script', 27951966c248SBram Moolenaar 'hi clear# comment', 27961966c248SBram Moolenaar ], 'E416:') 27971966c248SBram Moolenaar 27981966c248SBram Moolenaar CheckScriptSuccess([ 27991966c248SBram Moolenaar 'vim9script', 28001966c248SBram Moolenaar 'hi Group term=bold', 28011966c248SBram Moolenaar 'match Group /todo/ # comment', 28021966c248SBram Moolenaar ]) 28031966c248SBram Moolenaar CheckScriptFailure([ 28041966c248SBram Moolenaar 'vim9script', 28051966c248SBram Moolenaar 'hi Group term=bold', 28061966c248SBram Moolenaar 'match Group /todo/# comment', 28071966c248SBram Moolenaar ], 'E488:') 28081966c248SBram Moolenaar CheckScriptSuccess([ 28091966c248SBram Moolenaar 'vim9script', 28101966c248SBram Moolenaar 'match # comment', 28111966c248SBram Moolenaar ]) 28121966c248SBram Moolenaar CheckScriptFailure([ 28131966c248SBram Moolenaar 'vim9script', 28141966c248SBram Moolenaar 'match# comment', 2815f8103f27SBram Moolenaar ], 'E1144:') 28161966c248SBram Moolenaar CheckScriptSuccess([ 28171966c248SBram Moolenaar 'vim9script', 28181966c248SBram Moolenaar 'match none # comment', 28191966c248SBram Moolenaar ]) 28201966c248SBram Moolenaar CheckScriptFailure([ 28211966c248SBram Moolenaar 'vim9script', 28221966c248SBram Moolenaar 'match none# comment', 28231966c248SBram Moolenaar ], 'E475:') 28241966c248SBram Moolenaar 28251966c248SBram Moolenaar CheckScriptSuccess([ 28261966c248SBram Moolenaar 'vim9script', 28271966c248SBram Moolenaar 'menutrans clear # comment', 28281966c248SBram Moolenaar ]) 28291966c248SBram Moolenaar CheckScriptFailure([ 28301966c248SBram Moolenaar 'vim9script', 28311966c248SBram Moolenaar 'menutrans clear# comment text', 28321966c248SBram Moolenaar ], 'E474:') 28331966c248SBram Moolenaar 28341966c248SBram Moolenaar CheckScriptSuccess([ 28351966c248SBram Moolenaar 'vim9script', 28361966c248SBram Moolenaar 'syntax clear # comment', 28371966c248SBram Moolenaar ]) 28381966c248SBram Moolenaar CheckScriptFailure([ 28391966c248SBram Moolenaar 'vim9script', 28401966c248SBram Moolenaar 'syntax clear# comment text', 28411966c248SBram Moolenaar ], 'E28:') 28421966c248SBram Moolenaar CheckScriptSuccess([ 28431966c248SBram Moolenaar 'vim9script', 28441966c248SBram Moolenaar 'syntax keyword Word some', 28451966c248SBram Moolenaar 'syntax clear Word # comment', 28461966c248SBram Moolenaar ]) 28471966c248SBram Moolenaar CheckScriptFailure([ 28481966c248SBram Moolenaar 'vim9script', 28491966c248SBram Moolenaar 'syntax keyword Word some', 28501966c248SBram Moolenaar 'syntax clear Word# comment text', 28511966c248SBram Moolenaar ], 'E28:') 28521966c248SBram Moolenaar 28531966c248SBram Moolenaar CheckScriptSuccess([ 28541966c248SBram Moolenaar 'vim9script', 28551966c248SBram Moolenaar 'syntax list # comment', 28561966c248SBram Moolenaar ]) 28571966c248SBram Moolenaar CheckScriptFailure([ 28581966c248SBram Moolenaar 'vim9script', 28591966c248SBram Moolenaar 'syntax list# comment text', 28601966c248SBram Moolenaar ], 'E28:') 28611966c248SBram Moolenaar 28621966c248SBram Moolenaar CheckScriptSuccess([ 28631966c248SBram Moolenaar 'vim9script', 28641966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 28651966c248SBram Moolenaar ]) 28661966c248SBram Moolenaar CheckScriptFailure([ 28671966c248SBram Moolenaar 'vim9script', 28681966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 28691966c248SBram Moolenaar ], 'E475:') 28701966c248SBram Moolenaar 28711966c248SBram Moolenaar CheckScriptSuccess([ 28721966c248SBram Moolenaar 'vim9script', 28731966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 28741966c248SBram Moolenaar ]) 28751966c248SBram Moolenaar CheckScriptFailure([ 28761966c248SBram Moolenaar 'vim9script', 28771966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 28781966c248SBram Moolenaar ], 'E789:') 28791966c248SBram Moolenaar 28801966c248SBram Moolenaar CheckScriptSuccess([ 28811966c248SBram Moolenaar 'vim9script', 28821966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 28831966c248SBram Moolenaar ]) 28841966c248SBram Moolenaar CheckScriptFailure([ 28851966c248SBram Moolenaar 'vim9script', 28861966c248SBram Moolenaar 'syntax match Word /pat/# comment', 28871966c248SBram Moolenaar ], 'E402:') 28881966c248SBram Moolenaar 28891966c248SBram Moolenaar CheckScriptSuccess([ 28901966c248SBram Moolenaar 'vim9script', 28911966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 28921966c248SBram Moolenaar ]) 28931966c248SBram Moolenaar CheckScriptFailure([ 28941966c248SBram Moolenaar 'vim9script', 28951966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 28961966c248SBram Moolenaar ], 'E475:') 28971966c248SBram Moolenaar CheckScriptFailure([ 28981966c248SBram Moolenaar 'vim9script', 28991966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 29001966c248SBram Moolenaar ], 'E406:') 29011966c248SBram Moolenaar CheckScriptFailure([ 29021966c248SBram Moolenaar 'vim9script', 29031966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 29041966c248SBram Moolenaar ], 'E475:') 29051966c248SBram Moolenaar 29061966c248SBram Moolenaar CheckScriptSuccess([ 29071966c248SBram Moolenaar 'vim9script', 29081966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 29091966c248SBram Moolenaar ]) 29101966c248SBram Moolenaar CheckScriptFailure([ 29111966c248SBram Moolenaar 'vim9script', 29121966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2913d032f34aSBram Moolenaar ], 'E402:') 29141966c248SBram Moolenaar 29151966c248SBram Moolenaar CheckScriptSuccess([ 29161966c248SBram Moolenaar 'vim9script', 29171966c248SBram Moolenaar 'syntax sync # comment', 29181966c248SBram Moolenaar ]) 29191966c248SBram Moolenaar CheckScriptFailure([ 29201966c248SBram Moolenaar 'vim9script', 29211966c248SBram Moolenaar 'syntax sync# comment', 29221966c248SBram Moolenaar ], 'E404:') 29231966c248SBram Moolenaar CheckScriptSuccess([ 29241966c248SBram Moolenaar 'vim9script', 29251966c248SBram Moolenaar 'syntax sync ccomment # comment', 29261966c248SBram Moolenaar ]) 29271966c248SBram Moolenaar CheckScriptFailure([ 29281966c248SBram Moolenaar 'vim9script', 29291966c248SBram Moolenaar 'syntax sync ccomment# comment', 29301966c248SBram Moolenaar ], 'E404:') 29311966c248SBram Moolenaar 29321966c248SBram Moolenaar CheckScriptSuccess([ 29331966c248SBram Moolenaar 'vim9script', 29341966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 29351966c248SBram Moolenaar ]) 29361966c248SBram Moolenaar CheckScriptFailure([ 29371966c248SBram Moolenaar 'vim9script', 29381966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 29391966c248SBram Moolenaar ], 'E475:') 2940a72cfb80SBram Moolenaar 2941a72cfb80SBram Moolenaar CheckScriptSuccess([ 2942a72cfb80SBram Moolenaar 'vim9script', 2943a72cfb80SBram Moolenaar 'command Echo echo # comment', 2944a72cfb80SBram Moolenaar 'command Echo # comment', 29452d870f8dSBram Moolenaar 'delcommand Echo', 2946a72cfb80SBram Moolenaar ]) 2947a72cfb80SBram Moolenaar CheckScriptFailure([ 2948a72cfb80SBram Moolenaar 'vim9script', 2949a72cfb80SBram Moolenaar 'command Echo echo# comment', 2950a72cfb80SBram Moolenaar 'Echo', 2951f8103f27SBram Moolenaar ], 'E1144:') 29522d870f8dSBram Moolenaar delcommand Echo 295370249ee8SBram Moolenaar 295470249ee8SBram Moolenaar var curdir = getcwd() 295570249ee8SBram Moolenaar CheckScriptSuccess([ 295670249ee8SBram Moolenaar 'command Echo cd " comment', 295770249ee8SBram Moolenaar 'Echo', 295870249ee8SBram Moolenaar 'delcommand Echo', 295970249ee8SBram Moolenaar ]) 296070249ee8SBram Moolenaar CheckScriptSuccess([ 2961090728adSBram Moolenaar 'vim9script', 296270249ee8SBram Moolenaar 'command Echo cd # comment', 296370249ee8SBram Moolenaar 'Echo', 296470249ee8SBram Moolenaar 'delcommand Echo', 296570249ee8SBram Moolenaar ]) 296670249ee8SBram Moolenaar CheckScriptFailure([ 296770249ee8SBram Moolenaar 'vim9script', 296870249ee8SBram Moolenaar 'command Echo cd " comment', 296970249ee8SBram Moolenaar 'Echo', 297070249ee8SBram Moolenaar ], 'E344:') 297170249ee8SBram Moolenaar delcommand Echo 297270249ee8SBram Moolenaar chdir(curdir) 297370249ee8SBram Moolenaar 2974a72cfb80SBram Moolenaar CheckScriptFailure([ 2975a72cfb80SBram Moolenaar 'vim9script', 2976a72cfb80SBram Moolenaar 'command Echo# comment', 2977a72cfb80SBram Moolenaar ], 'E182:') 2978a72cfb80SBram Moolenaar CheckScriptFailure([ 2979a72cfb80SBram Moolenaar 'vim9script', 2980a72cfb80SBram Moolenaar 'command Echo echo', 2981a72cfb80SBram Moolenaar 'command Echo# comment', 2982a72cfb80SBram Moolenaar ], 'E182:') 29832d870f8dSBram Moolenaar delcommand Echo 2984a72cfb80SBram Moolenaar 2985a72cfb80SBram Moolenaar CheckScriptSuccess([ 2986a72cfb80SBram Moolenaar 'vim9script', 2987a72cfb80SBram Moolenaar 'function # comment', 2988a72cfb80SBram Moolenaar ]) 2989a72cfb80SBram Moolenaar CheckScriptFailure([ 2990a72cfb80SBram Moolenaar 'vim9script', 29919898107fSBram Moolenaar 'function " comment', 29929898107fSBram Moolenaar ], 'E129:') 29939898107fSBram Moolenaar CheckScriptFailure([ 29949898107fSBram Moolenaar 'vim9script', 2995a72cfb80SBram Moolenaar 'function# comment', 2996f8103f27SBram Moolenaar ], 'E1144:') 2997a72cfb80SBram Moolenaar CheckScriptSuccess([ 2998a72cfb80SBram Moolenaar 'vim9script', 2999a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3000a72cfb80SBram Moolenaar ]) 3001a72cfb80SBram Moolenaar CheckScriptFailure([ 3002a72cfb80SBram Moolenaar 'vim9script', 3003a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3004a72cfb80SBram Moolenaar ], 'E488:') 3005a72cfb80SBram Moolenaar 3006a72cfb80SBram Moolenaar CheckScriptSuccess([ 3007a72cfb80SBram Moolenaar 'vim9script', 30084c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3009a72cfb80SBram Moolenaar 'endfunc', 30104c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3011a72cfb80SBram Moolenaar ]) 3012a72cfb80SBram Moolenaar CheckScriptFailure([ 3013a72cfb80SBram Moolenaar 'vim9script', 30144c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3015a72cfb80SBram Moolenaar 'endfunc', 30164c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3017a72cfb80SBram Moolenaar ], 'E488:') 3018a72cfb80SBram Moolenaar 3019a72cfb80SBram Moolenaar CheckScriptSuccess([ 3020a72cfb80SBram Moolenaar 'vim9script', 3021a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3022a72cfb80SBram Moolenaar ]) 3023a72cfb80SBram Moolenaar CheckScriptFailure([ 3024a72cfb80SBram Moolenaar 'vim9script', 3025a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3026a72cfb80SBram Moolenaar ], 'E488:') 3027e7e4838fSBram Moolenaar 3028e7e4838fSBram Moolenaar CheckScriptFailure([ 3029e7e4838fSBram Moolenaar 'def Test() " comment', 3030e7e4838fSBram Moolenaar 'enddef', 3031e7e4838fSBram Moolenaar ], 'E488:') 3032e7e4838fSBram Moolenaar CheckScriptFailure([ 3033e7e4838fSBram Moolenaar 'vim9script', 3034e7e4838fSBram Moolenaar 'def Test() " comment', 3035e7e4838fSBram Moolenaar 'enddef', 3036e7e4838fSBram Moolenaar ], 'E488:') 3037e7e4838fSBram Moolenaar 3038e7e4838fSBram Moolenaar CheckScriptSuccess([ 3039e7e4838fSBram Moolenaar 'func Test() " comment', 3040e7e4838fSBram Moolenaar 'endfunc', 30412d870f8dSBram Moolenaar 'delfunc Test', 3042e7e4838fSBram Moolenaar ]) 30439898107fSBram Moolenaar CheckScriptSuccess([ 3044e7e4838fSBram Moolenaar 'vim9script', 3045e7e4838fSBram Moolenaar 'func Test() " comment', 3046e7e4838fSBram Moolenaar 'endfunc', 30479898107fSBram Moolenaar ]) 3048e7e4838fSBram Moolenaar 3049e7e4838fSBram Moolenaar CheckScriptSuccess([ 3050e7e4838fSBram Moolenaar 'def Test() # comment', 3051e7e4838fSBram Moolenaar 'enddef', 3052e7e4838fSBram Moolenaar ]) 3053e7e4838fSBram Moolenaar CheckScriptFailure([ 3054e7e4838fSBram Moolenaar 'func Test() # comment', 3055e7e4838fSBram Moolenaar 'endfunc', 3056e7e4838fSBram Moolenaar ], 'E488:') 30572c5ed4e3SBram Moolenaarenddef 30582c5ed4e3SBram Moolenaar 30592c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 30602c5ed4e3SBram Moolenaar CheckCanRunGui 30612c5ed4e3SBram Moolenaar 30622c5ed4e3SBram Moolenaar CheckScriptFailure([ 30632c5ed4e3SBram Moolenaar 'vim9script', 30642c5ed4e3SBram Moolenaar 'gui#comment' 3065f8103f27SBram Moolenaar ], 'E1144:') 30662c5ed4e3SBram Moolenaar CheckScriptFailure([ 30672c5ed4e3SBram Moolenaar 'vim9script', 30682c5ed4e3SBram Moolenaar 'gui -f#comment' 30692c5ed4e3SBram Moolenaar ], 'E499:') 30707a092245SBram Moolenaarenddef 30717a092245SBram Moolenaar 3072a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 30736797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 30746797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3075a26b9700SBram Moolenaar 3076a26b9700SBram Moolenaar edit test.vim 3077a26b9700SBram Moolenaar doautocmd TabEnter #comment 3078a26b9700SBram Moolenaar assert_equal(1, g:entered) 3079a26b9700SBram Moolenaar 3080a26b9700SBram Moolenaar doautocmd TabEnter f.x 3081a26b9700SBram Moolenaar assert_equal(2, g:entered) 3082a26b9700SBram Moolenaar 3083a26b9700SBram Moolenaar g:entered = 0 3084a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3085a26b9700SBram Moolenaar assert_equal(2, g:entered) 3086a26b9700SBram Moolenaar 3087a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3088a26b9700SBram Moolenaar 3089a26b9700SBram Moolenaar au! TabEnter 3090a26b9700SBram Moolenaar unlet g:entered 3091d72c1bf0SBram Moolenaar 3092d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3093d72c1bf0SBram Moolenaar 'vim9script', 30946797966dSBram Moolenaar 'g:var = 123', 3095e55b1c09SBram Moolenaar 'b:var = 456', 3096e55b1c09SBram Moolenaar 'w:var = 777', 3097e55b1c09SBram Moolenaar 't:var = 888', 3098d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3099d72c1bf0SBram Moolenaar ]) 3100d72c1bf0SBram Moolenaar 3101d72c1bf0SBram Moolenaar CheckScriptFailure([ 3102d72c1bf0SBram Moolenaar 'vim9script', 3103cfcd011fSBram Moolenaar 'let var = 123', 3104cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3105cfcd011fSBram Moolenaar 3106cfcd011fSBram Moolenaar CheckScriptFailure([ 3107cfcd011fSBram Moolenaar 'vim9script', 3108cfcd011fSBram Moolenaar 'var g:var = 123', 3109e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3110e55b1c09SBram Moolenaar 3111e55b1c09SBram Moolenaar CheckScriptFailure([ 3112e55b1c09SBram Moolenaar 'vim9script', 3113cfcd011fSBram Moolenaar 'var b:var = 123', 3114e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3115e55b1c09SBram Moolenaar 3116e55b1c09SBram Moolenaar CheckScriptFailure([ 3117e55b1c09SBram Moolenaar 'vim9script', 3118cfcd011fSBram Moolenaar 'var w:var = 123', 3119e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3120e55b1c09SBram Moolenaar 3121e55b1c09SBram Moolenaar CheckScriptFailure([ 3122e55b1c09SBram Moolenaar 'vim9script', 3123cfcd011fSBram Moolenaar 'var t:var = 123', 3124e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3125e55b1c09SBram Moolenaar 3126e55b1c09SBram Moolenaar CheckScriptFailure([ 3127e55b1c09SBram Moolenaar 'vim9script', 3128cfcd011fSBram Moolenaar 'var v:version = 123', 3129e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3130e55b1c09SBram Moolenaar 3131e55b1c09SBram Moolenaar CheckScriptFailure([ 3132e55b1c09SBram Moolenaar 'vim9script', 3133cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3134e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 31356797966dSBram Moolenaar 31366797966dSBram Moolenaar CheckScriptFailure([ 31376797966dSBram Moolenaar 'vim9script', 31386797966dSBram Moolenaar 'g:var = 123', 313932e35117SBram Moolenaar 'unlet g:var# comment1', 3140d72c1bf0SBram Moolenaar ], 'E108:') 3141d72c1bf0SBram Moolenaar 3142d72c1bf0SBram Moolenaar CheckScriptFailure([ 3143d72c1bf0SBram Moolenaar 'let g:var = 123', 3144d72c1bf0SBram Moolenaar 'unlet g:var # something', 3145d72c1bf0SBram Moolenaar ], 'E488:') 3146faac4104SBram Moolenaar 3147faac4104SBram Moolenaar CheckScriptSuccess([ 3148faac4104SBram Moolenaar 'vim9script', 314932e35117SBram Moolenaar 'if 1 # comment2', 3150faac4104SBram Moolenaar ' echo "yes"', 3151faac4104SBram Moolenaar 'elseif 2 #comment', 3152faac4104SBram Moolenaar ' echo "no"', 3153faac4104SBram Moolenaar 'endif', 3154faac4104SBram Moolenaar ]) 3155faac4104SBram Moolenaar 3156faac4104SBram Moolenaar CheckScriptFailure([ 3157faac4104SBram Moolenaar 'vim9script', 315832e35117SBram Moolenaar 'if 1# comment3', 3159faac4104SBram Moolenaar ' echo "yes"', 3160faac4104SBram Moolenaar 'endif', 3161faac4104SBram Moolenaar ], 'E15:') 3162faac4104SBram Moolenaar 3163faac4104SBram Moolenaar CheckScriptFailure([ 3164faac4104SBram Moolenaar 'vim9script', 316532e35117SBram Moolenaar 'if 0 # comment4', 3166faac4104SBram Moolenaar ' echo "yes"', 3167faac4104SBram Moolenaar 'elseif 2#comment', 3168faac4104SBram Moolenaar ' echo "no"', 3169faac4104SBram Moolenaar 'endif', 3170faac4104SBram Moolenaar ], 'E15:') 3171faac4104SBram Moolenaar 3172faac4104SBram Moolenaar CheckScriptSuccess([ 3173faac4104SBram Moolenaar 'vim9script', 3174cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3175faac4104SBram Moolenaar ]) 3176faac4104SBram Moolenaar 3177faac4104SBram Moolenaar CheckScriptFailure([ 3178faac4104SBram Moolenaar 'vim9script', 3179cfcd011fSBram Moolenaar 'var v = 1# comment6', 318032e35117SBram Moolenaar ], 'E15:') 3181faac4104SBram Moolenaar 3182faac4104SBram Moolenaar CheckScriptSuccess([ 3183faac4104SBram Moolenaar 'vim9script', 3184faac4104SBram Moolenaar 'new' 3185d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3186df069eecSBram Moolenaar ':$', 3187faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3188faac4104SBram Moolenaar 'bwipe!', 3189faac4104SBram Moolenaar ]) 3190faac4104SBram Moolenaar 3191f5be8cdbSBram Moolenaar CheckScriptFailure([ 3192f5be8cdbSBram Moolenaar 'vim9script', 3193f5be8cdbSBram Moolenaar 'new' 3194d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3195f5be8cdbSBram Moolenaar ':$', 3196f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3197f5be8cdbSBram Moolenaar 'bwipe!', 3198f5be8cdbSBram Moolenaar ], 'E488:') 3199f5be8cdbSBram Moolenaar 3200f5be8cdbSBram Moolenaar CheckScriptFailure([ 3201f5be8cdbSBram Moolenaar 'vim9script', 3202f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3203f5be8cdbSBram Moolenaar ], 'E477:') 3204a26b9700SBram Moolenaarenddef 3205a26b9700SBram Moolenaar 32067e5bd91dSBram Moolenaardef Test_finish() 3207cfcd011fSBram Moolenaar var lines =<< trim END 32087e5bd91dSBram Moolenaar vim9script 32096797966dSBram Moolenaar g:res = 'one' 32107e5bd91dSBram Moolenaar if v:false | finish | endif 32116797966dSBram Moolenaar g:res = 'two' 32127e5bd91dSBram Moolenaar finish 32136797966dSBram Moolenaar g:res = 'three' 32147e5bd91dSBram Moolenaar END 32157e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 32167e5bd91dSBram Moolenaar source Xfinished 32177e5bd91dSBram Moolenaar assert_equal('two', g:res) 32187e5bd91dSBram Moolenaar 32197e5bd91dSBram Moolenaar unlet g:res 32207e5bd91dSBram Moolenaar delete('Xfinished') 32217e5bd91dSBram Moolenaarenddef 32227e5bd91dSBram Moolenaar 3223a5d0077eSBram Moolenaardef Test_forward_declaration() 3224cfcd011fSBram Moolenaar var lines =<< trim END 3225a5d0077eSBram Moolenaar vim9script 3226a5d0077eSBram Moolenaar def GetValue(): string 3227a5d0077eSBram Moolenaar return theVal 3228a5d0077eSBram Moolenaar enddef 3229cfcd011fSBram Moolenaar var theVal = 'something' 3230822ba247SBram Moolenaar g:initVal = GetValue() 3231a5d0077eSBram Moolenaar theVal = 'else' 3232a5d0077eSBram Moolenaar g:laterVal = GetValue() 3233a5d0077eSBram Moolenaar END 3234a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3235a5d0077eSBram Moolenaar source Xforward 3236a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3237a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3238a5d0077eSBram Moolenaar 3239a5d0077eSBram Moolenaar unlet g:initVal 3240a5d0077eSBram Moolenaar unlet g:laterVal 3241a5d0077eSBram Moolenaar delete('Xforward') 3242a5d0077eSBram Moolenaarenddef 3243a5d0077eSBram Moolenaar 32449721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3245a6294955SBram Moolenaar var vim9_lines =<< trim END 3246a6294955SBram Moolenaar vim9script 3247a6294955SBram Moolenaar var local = 'local' 3248a6294955SBram Moolenaar g:global = 'global' 3249a6294955SBram Moolenaar export var exported = 'exported' 3250a6294955SBram Moolenaar export def GetText(): string 3251a6294955SBram Moolenaar return 'text' 3252a6294955SBram Moolenaar enddef 3253a6294955SBram Moolenaar END 3254a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3255a6294955SBram Moolenaar 3256cfcd011fSBram Moolenaar var legacy_lines =<< trim END 32579721fb4eSBram Moolenaar source Xvim9_script.vim 32589721fb4eSBram Moolenaar 32599721fb4eSBram Moolenaar call assert_false(exists('local')) 32609721fb4eSBram Moolenaar call assert_false(exists('exported')) 32619721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 32629721fb4eSBram Moolenaar call assert_equal('global', global) 32639721fb4eSBram Moolenaar call assert_equal('global', g:global) 32649721fb4eSBram Moolenaar 32659721fb4eSBram Moolenaar " imported variable becomes script-local 32669721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 32679721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 32689721fb4eSBram Moolenaar call assert_false(exists('exported')) 32699721fb4eSBram Moolenaar 32709721fb4eSBram Moolenaar " imported function becomes script-local 32719721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 32729721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 32739721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 32749721fb4eSBram Moolenaar END 32759721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 32769721fb4eSBram Moolenaar 32779721fb4eSBram Moolenaar source Xlegacy_script.vim 32789721fb4eSBram Moolenaar assert_equal('global', g:global) 3279f5be8cdbSBram Moolenaar unlet g:global 32809721fb4eSBram Moolenaar 32819721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 32829721fb4eSBram Moolenaar delete('Xvim9_script.vim') 32839721fb4eSBram Moolenaarenddef 3284a5d0077eSBram Moolenaar 3285e535db86SBram Moolenaardef Test_declare_script_in_func() 3286e535db86SBram Moolenaar var lines =<< trim END 3287e535db86SBram Moolenaar vim9script 3288e535db86SBram Moolenaar func Declare() 3289e535db86SBram Moolenaar let s:local = 123 3290e535db86SBram Moolenaar endfunc 3291e535db86SBram Moolenaar Declare() 3292e535db86SBram Moolenaar assert_equal(123, local) 3293e535db86SBram Moolenaar 3294e535db86SBram Moolenaar var error: string 3295e535db86SBram Moolenaar try 3296e535db86SBram Moolenaar local = 'asdf' 3297e535db86SBram Moolenaar catch 3298e535db86SBram Moolenaar error = v:exception 3299e535db86SBram Moolenaar endtry 3300e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3301e535db86SBram Moolenaar 3302e535db86SBram Moolenaar lockvar local 3303e535db86SBram Moolenaar try 3304e535db86SBram Moolenaar local = 999 3305e535db86SBram Moolenaar catch 3306e535db86SBram Moolenaar error = v:exception 3307e535db86SBram Moolenaar endtry 3308e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3309e535db86SBram Moolenaar END 3310e535db86SBram Moolenaar CheckScriptSuccess(lines) 3311e535db86SBram Moolenaarenddef 3312e535db86SBram Moolenaar 3313e535db86SBram Moolenaar 33147d699701SBram Moolenaarfunc Test_vim9script_not_global() 33157d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 33167d699701SBram Moolenaar let vim9lines =<< trim END 33177d699701SBram Moolenaar vim9script 3318cfcd011fSBram Moolenaar var name = 'local' 33197d699701SBram Moolenaar func TheFunc() 33207d699701SBram Moolenaar echo 'local' 33217d699701SBram Moolenaar endfunc 33227d699701SBram Moolenaar def DefFunc() 33237d699701SBram Moolenaar echo 'local' 33247d699701SBram Moolenaar enddef 33257d699701SBram Moolenaar END 33267d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 33277d699701SBram Moolenaar source Xvim9script.vim 33287d699701SBram Moolenaar try 33297d699701SBram Moolenaar echo g:var 33307d699701SBram Moolenaar assert_report('did not fail') 33317d699701SBram Moolenaar catch /E121:/ 33327d699701SBram Moolenaar " caught 33337d699701SBram Moolenaar endtry 33347d699701SBram Moolenaar try 33357d699701SBram Moolenaar call TheFunc() 33367d699701SBram Moolenaar assert_report('did not fail') 33377d699701SBram Moolenaar catch /E117:/ 33387d699701SBram Moolenaar " caught 33397d699701SBram Moolenaar endtry 33407d699701SBram Moolenaar try 33417d699701SBram Moolenaar call DefFunc() 33427d699701SBram Moolenaar assert_report('did not fail') 33437d699701SBram Moolenaar catch /E117:/ 33447d699701SBram Moolenaar " caught 33457d699701SBram Moolenaar endtry 33467d699701SBram Moolenaar 334725859dd7SBram Moolenaar call delete('Xvim9script.vim') 33487d699701SBram Moolenaarendfunc 33497d699701SBram Moolenaar 3350eeb27bfeSBram Moolenaardef Test_vim9_copen() 3351eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3352eeb27bfeSBram Moolenaar copen 3353eeb27bfeSBram Moolenaar quit 3354eeb27bfeSBram Moolenaarenddef 3355eeb27bfeSBram Moolenaar 335603290b84SBram Moolenaar" test using an auto-loaded function and variable 33572d6b20d6SBram Moolenaardef Test_vim9_autoload() 3358cfcd011fSBram Moolenaar var lines =<< trim END 33592d6b20d6SBram Moolenaar vim9script 336003290b84SBram Moolenaar def some#gettest(): string 336103290b84SBram Moolenaar return 'test' 336203290b84SBram Moolenaar enddef 336303290b84SBram Moolenaar g:some#name = 'name' 3364e3ffcd99SBram Moolenaar 3365e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3366e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3367e3ffcd99SBram Moolenaar enddef 336803290b84SBram Moolenaar END 336903290b84SBram Moolenaar 337003290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 337103290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 337203290b84SBram Moolenaar var save_rtp = &rtp 337303290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 337403290b84SBram Moolenaar 337503290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 337603290b84SBram Moolenaar assert_equal('name', g:some#name) 337703290b84SBram Moolenaar g:some#other = 'other' 337803290b84SBram Moolenaar assert_equal('other', g:some#other) 337903290b84SBram Moolenaar 3380e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3381e3ffcd99SBram Moolenaar 338217f700acSBram Moolenaar # upper case script name works 338317f700acSBram Moolenaar lines =<< trim END 338417f700acSBram Moolenaar vim9script 338517f700acSBram Moolenaar def Other#getOther(): string 338617f700acSBram Moolenaar return 'other' 338717f700acSBram Moolenaar enddef 338817f700acSBram Moolenaar END 338917f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 339017f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 339117f700acSBram Moolenaar 339203290b84SBram Moolenaar delete('Xdir', 'rf') 339303290b84SBram Moolenaar &rtp = save_rtp 339403290b84SBram Moolenaarenddef 339503290b84SBram Moolenaar 339603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 339703290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 339803290b84SBram Moolenaar var lines =<< trim END 339903290b84SBram Moolenaar vim9script 34002d6b20d6SBram Moolenaar def foo#test() 34012d6b20d6SBram Moolenaar echomsg getreg('"') 34022d6b20d6SBram Moolenaar enddef 34032d6b20d6SBram Moolenaar END 34042d6b20d6SBram Moolenaar 34052d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 34062d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3407cfcd011fSBram Moolenaar var save_rtp = &rtp 34082d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 34092d6b20d6SBram Moolenaar augroup test 34102d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 34112d6b20d6SBram Moolenaar augroup END 34122d6b20d6SBram Moolenaar 34132d6b20d6SBram Moolenaar normal Y 34142d6b20d6SBram Moolenaar 34152d6b20d6SBram Moolenaar augroup test 34162d6b20d6SBram Moolenaar autocmd! 34172d6b20d6SBram Moolenaar augroup END 34182d6b20d6SBram Moolenaar delete('Xdir', 'rf') 34192d6b20d6SBram Moolenaar &rtp = save_rtp 34202d6b20d6SBram Moolenaarenddef 34212d6b20d6SBram Moolenaar 342277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 342377e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3424cfcd011fSBram Moolenaar var lines =<< trim END 342577e5dcc3SBram Moolenaar vim9script 342677e5dcc3SBram Moolenaar def crash#func() 342777e5dcc3SBram Moolenaar try 342877e5dcc3SBram Moolenaar for x in List() 342977e5dcc3SBram Moolenaar endfor 343077e5dcc3SBram Moolenaar catch 343177e5dcc3SBram Moolenaar endtry 343277e5dcc3SBram Moolenaar g:ok = true 343377e5dcc3SBram Moolenaar enddef 343477e5dcc3SBram Moolenaar fu List() 343577e5dcc3SBram Moolenaar invalid 343677e5dcc3SBram Moolenaar endfu 343777e5dcc3SBram Moolenaar try 343848e11c10SBram Moolenaar alsoinvalid 343977e5dcc3SBram Moolenaar catch /wontmatch/ 344077e5dcc3SBram Moolenaar endtry 344177e5dcc3SBram Moolenaar END 344277e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 344377e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 344477e5dcc3SBram Moolenaar 344577e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 344677e5dcc3SBram Moolenaar lines =<< trim END 344777e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 344877e5dcc3SBram Moolenaar call crash#func() 344977e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 34509c4f5520SBram Moolenaar qall! 345177e5dcc3SBram Moolenaar END 345277e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 345377e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 345477e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 345577e5dcc3SBram Moolenaar 345677e5dcc3SBram Moolenaar delete('Xdidit') 345777e5dcc3SBram Moolenaar delete('Xscript') 345877e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 345903290b84SBram Moolenaar 346003290b84SBram Moolenaar lines =<< trim END 346103290b84SBram Moolenaar vim9script 346203290b84SBram Moolenaar var foo#bar = 'asdf' 346303290b84SBram Moolenaar END 346403290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 346577e5dcc3SBram Moolenaarenddef 346677e5dcc3SBram Moolenaar 346781e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 346881e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 346981e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3470cfcd011fSBram Moolenaar var lines =<< trim END 347181e17fbeSBram Moolenaar let s:counter = 1 347281e17fbeSBram Moolenaar def s:Func() 347381e17fbeSBram Moolenaar au! CursorHold 347481e17fbeSBram Moolenaar au CursorHold * s:counter += 1 347581e17fbeSBram Moolenaar enddef 347681e17fbeSBram Moolenaar call s:Func() 347781e17fbeSBram Moolenaar doau CursorHold 347881e17fbeSBram Moolenaar call assert_equal(2, s:counter) 347981e17fbeSBram Moolenaar au! CursorHold 348081e17fbeSBram Moolenaar END 348181e17fbeSBram Moolenaar CheckScriptSuccess(lines) 348281e17fbeSBram Moolenaarenddef 348381e17fbeSBram Moolenaar 34843896a105SBram Moolenaardef Test_cmdline_win() 34853896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 34863896a105SBram Moolenaar # the command line window. 34873896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3488cfcd011fSBram Moolenaar var export_lines =<< trim END 34893896a105SBram Moolenaar vim9script 3490cfcd011fSBram Moolenaar export var That = 'yes' 34913896a105SBram Moolenaar END 34923896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3493cfcd011fSBram Moolenaar var import_lines =<< trim END 34943896a105SBram Moolenaar vim9script 34953896a105SBram Moolenaar import That from './Xexport.vim' 34963896a105SBram Moolenaar END 34973896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3498cfcd011fSBram Moolenaar var save_rtp = &rtp 34993896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 35003896a105SBram Moolenaar syntax on 35013896a105SBram Moolenaar augroup CmdWin 35023896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 35033896a105SBram Moolenaar augroup END 35043896a105SBram Moolenaar # this will open and also close the cmdline window 35053896a105SBram Moolenaar feedkeys('q:', 'xt') 35063896a105SBram Moolenaar assert_equal('yes', g:got_there) 35073896a105SBram Moolenaar 35083896a105SBram Moolenaar augroup CmdWin 35093896a105SBram Moolenaar au! 35103896a105SBram Moolenaar augroup END 35113896a105SBram Moolenaar &rtp = save_rtp 35123896a105SBram Moolenaar delete('rtp', 'rf') 35133896a105SBram Moolenaarenddef 35143896a105SBram Moolenaar 3515e3d4685fSBram Moolenaardef Test_invalid_sid() 3516e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 351725859dd7SBram Moolenaar 35189c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3519d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3520e3d4685fSBram Moolenaar endif 3521e3d4685fSBram Moolenaar delete('Xdidit') 3522e3d4685fSBram Moolenaarenddef 3523e3d4685fSBram Moolenaar 35249ec7026fSBram Moolenaardef Test_restoring_cpo() 35259ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 35269ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 35279ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 35289ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 35299ec7026fSBram Moolenaar endif 35309ec7026fSBram Moolenaar delete('Xsourced') 35319ec7026fSBram Moolenaar delete('Xclose') 3532090728adSBram Moolenaar delete('Xdone') 35330123cc1eSBram Moolenaar 35340123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 35350123cc1eSBram Moolenaar set cpo=aABceFsMny> 35360123cc1eSBram Moolenaar edit XanotherScript 35370123cc1eSBram Moolenaar so % 35380123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 35390123cc1eSBram Moolenaar :1del 35400123cc1eSBram Moolenaar w 35410123cc1eSBram Moolenaar so % 35420123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 35430123cc1eSBram Moolenaar 35440123cc1eSBram Moolenaar delete('XanotherScript') 35450123cc1eSBram Moolenaar set cpo&vim 35469ec7026fSBram Moolenaarenddef 35479ec7026fSBram Moolenaar 3548ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3549ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 355037294bd6SBram Moolenaar CheckScreendump 3551ffb7dcdbSBram Moolenaar CheckFeature timers 355237294bd6SBram Moolenaar 3553ffb7dcdbSBram Moolenaar let lines =<< trim END 355437294bd6SBram Moolenaar vim9script 355537294bd6SBram Moolenaar def script#func() 355637294bd6SBram Moolenaar enddef 355737294bd6SBram Moolenaar END 3558ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3559ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 356037294bd6SBram Moolenaar 3561ffb7dcdbSBram Moolenaar let lines =<< trim END 356237294bd6SBram Moolenaar vim9script 356337294bd6SBram Moolenaar set cpo+=M 356437294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3565767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 356637294bd6SBram Moolenaar setline(1, 'some text') 356737294bd6SBram Moolenaar END 3568ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3569ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3570ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3571ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 357237294bd6SBram Moolenaar 3573ffb7dcdbSBram Moolenaar " clean up 3574ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3575ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3576ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3577ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3578ffb7dcdbSBram Moolenaarendfunc 357937294bd6SBram Moolenaar 35809ec7026fSBram Moolenaar 3581f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3582cfcd011fSBram Moolenaar var lines =<< trim END 3583cfcd011fSBram Moolenaar var name: any 3584cfcd011fSBram Moolenaar assert_equal(0, name) 3585f0afd9e1SBram Moolenaar END 3586f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3587f0afd9e1SBram Moolenaarenddef 3588f0afd9e1SBram Moolenaar 35897e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 359058dbef33SBram Moolenaar CheckRunVimInTerminal 359158dbef33SBram Moolenaar 35927e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 35937e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 35947e9210eaSBram Moolenaarendfunc 35957e9210eaSBram Moolenaar 35967e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 35979c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3598cfcd011fSBram Moolenaar var lines =<< trim END 35999c4f5520SBram Moolenaar func CheckAndQuit() 36009c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 36019c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 36029c4f5520SBram Moolenaar endfunc 36039c4f5520SBram Moolenaar END 36049c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 36059c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3606e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 36079c4f5520SBram Moolenaar # define Afunc() on the command line 36089c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 36099c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 36102949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 36119c4f5520SBram Moolenaar 36129c4f5520SBram Moolenaar call StopVimInTerminal(buf) 36139c4f5520SBram Moolenaar delete('XcallFunc') 36149c4f5520SBram Moolenaar delete('Xdidcmd') 36159c4f5520SBram Moolenaarenddef 36169c4f5520SBram Moolenaar 3617fcdc5d83SBram Moolenaardef Test_script_var_scope() 3618fcdc5d83SBram Moolenaar var lines =<< trim END 3619fcdc5d83SBram Moolenaar vim9script 3620fcdc5d83SBram Moolenaar if true 3621fcdc5d83SBram Moolenaar if true 3622fcdc5d83SBram Moolenaar var one = 'one' 3623fcdc5d83SBram Moolenaar echo one 3624fcdc5d83SBram Moolenaar endif 3625fcdc5d83SBram Moolenaar echo one 3626fcdc5d83SBram Moolenaar endif 3627fcdc5d83SBram Moolenaar END 3628fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3629fcdc5d83SBram Moolenaar 3630fcdc5d83SBram Moolenaar lines =<< trim END 3631fcdc5d83SBram Moolenaar vim9script 3632fcdc5d83SBram Moolenaar if true 3633fcdc5d83SBram Moolenaar if false 3634fcdc5d83SBram Moolenaar var one = 'one' 3635fcdc5d83SBram Moolenaar echo one 3636fcdc5d83SBram Moolenaar else 3637fcdc5d83SBram Moolenaar var one = 'one' 3638fcdc5d83SBram Moolenaar echo one 3639fcdc5d83SBram Moolenaar endif 3640fcdc5d83SBram Moolenaar echo one 3641fcdc5d83SBram Moolenaar endif 3642fcdc5d83SBram Moolenaar END 3643fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3644fcdc5d83SBram Moolenaar 3645fcdc5d83SBram Moolenaar lines =<< trim END 3646fcdc5d83SBram Moolenaar vim9script 3647fcdc5d83SBram Moolenaar while true 3648fcdc5d83SBram Moolenaar var one = 'one' 3649fcdc5d83SBram Moolenaar echo one 3650fcdc5d83SBram Moolenaar break 3651fcdc5d83SBram Moolenaar endwhile 3652fcdc5d83SBram Moolenaar echo one 3653fcdc5d83SBram Moolenaar END 3654fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3655fcdc5d83SBram Moolenaar 3656fcdc5d83SBram Moolenaar lines =<< trim END 3657fcdc5d83SBram Moolenaar vim9script 3658fcdc5d83SBram Moolenaar for i in range(1) 3659fcdc5d83SBram Moolenaar var one = 'one' 3660fcdc5d83SBram Moolenaar echo one 3661fcdc5d83SBram Moolenaar endfor 3662fcdc5d83SBram Moolenaar echo one 3663fcdc5d83SBram Moolenaar END 3664fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 36659becdf2bSBram Moolenaar 36669becdf2bSBram Moolenaar lines =<< trim END 36679becdf2bSBram Moolenaar vim9script 36689becdf2bSBram Moolenaar { 36699becdf2bSBram Moolenaar var one = 'one' 36709becdf2bSBram Moolenaar assert_equal('one', one) 36719becdf2bSBram Moolenaar } 36729becdf2bSBram Moolenaar assert_false(exists('one')) 36739becdf2bSBram Moolenaar assert_false(exists('s:one')) 36749becdf2bSBram Moolenaar END 36759becdf2bSBram Moolenaar CheckScriptSuccess(lines) 36769becdf2bSBram Moolenaar 36779becdf2bSBram Moolenaar lines =<< trim END 36789becdf2bSBram Moolenaar vim9script 36799becdf2bSBram Moolenaar { 36809becdf2bSBram Moolenaar var one = 'one' 36819becdf2bSBram Moolenaar echo one 36829becdf2bSBram Moolenaar } 36839becdf2bSBram Moolenaar echo one 36849becdf2bSBram Moolenaar END 36859becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3686fcdc5d83SBram Moolenaarenddef 3687fcdc5d83SBram Moolenaar 3688352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3689352134bbSBram Moolenaar var lines =<< trim END 3690352134bbSBram Moolenaar vim9script 36912a38908bSBram Moolenaar def Callback(...l: list<any>) 3692352134bbSBram Moolenaar try 3693352134bbSBram Moolenaar var x: string 3694352134bbSBram Moolenaar var y: string 3695352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3696352134bbSBram Moolenaar [x, y] = [''] 3697352134bbSBram Moolenaar catch 3698352134bbSBram Moolenaar g:caught = 'yes' 3699352134bbSBram Moolenaar endtry 3700352134bbSBram Moolenaar enddef 3701e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3702352134bbSBram Moolenaar feedkeys("\r", 'xt') 3703352134bbSBram Moolenaar END 3704352134bbSBram Moolenaar CheckScriptSuccess(lines) 3705352134bbSBram Moolenaar 3706352134bbSBram Moolenaar unlet g:caught 3707352134bbSBram Moolenaarenddef 3708352134bbSBram Moolenaar 3709631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3710631e8f93SBram Moolenaar if !has('unix') || !has('job') 3711631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3712631e8f93SBram Moolenaar endif 3713631e8f93SBram Moolenaar var lines =<< trim END 3714631e8f93SBram Moolenaar vim9script 3715631e8f93SBram Moolenaar var source: list<number> 37162a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3717631e8f93SBram Moolenaar eval [][0] 3718631e8f93SBram Moolenaar enddef 37192a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3720631e8f93SBram Moolenaar sleep 1m 3721631e8f93SBram Moolenaar source += l 3722631e8f93SBram Moolenaar enddef 3723e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 37246f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 37256f17a3f0SBram Moolenaar sleep 10m 37266f17a3f0SBram Moolenaar endwhile 3727206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3728fe95b94fSBram Moolenaar sleep 200m 3729631e8f93SBram Moolenaar END 3730631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3731631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3732631e8f93SBram Moolenaar delete('Xdef') 3733631e8f93SBram Moolenaarenddef 3734631e8f93SBram Moolenaar 37354324d87aSBram Moolenaardef InvokeNormal() 37364324d87aSBram Moolenaar exe "norm! :m+1\r" 37374324d87aSBram Moolenaarenddef 37384324d87aSBram Moolenaar 37394324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 37404324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 37414324d87aSBram Moolenaar new 37424324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 37434324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 37444324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 37454324d87aSBram Moolenaar xunmap <F3> 3746b5b9480eSBram Moolenaarenddef 3747b5b9480eSBram Moolenaar 3748b5b9480eSBram Moolenaardef Test_white_space_after_command() 3749b5b9480eSBram Moolenaar var lines =<< trim END 3750b5b9480eSBram Moolenaar exit_cb: Func}) 3751b5b9480eSBram Moolenaar END 3752b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3753f8103f27SBram Moolenaar 3754f8103f27SBram Moolenaar lines =<< trim END 3755f8103f27SBram Moolenaar e# 3756f8103f27SBram Moolenaar END 3757f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 37584324d87aSBram Moolenaarenddef 37594324d87aSBram Moolenaar 37604aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 37614aab88d9SBram Moolenaar var lines =<< trim END 37624aab88d9SBram Moolenaar vim9script 37634aab88d9SBram Moolenaar if exists('g:guard') 37644aab88d9SBram Moolenaar finish 37654aab88d9SBram Moolenaar endif 37664aab88d9SBram Moolenaar g:guard = 1 37674aab88d9SBram Moolenaar var name = 'thename' 37684aab88d9SBram Moolenaar def g:GetName(): string 37694aab88d9SBram Moolenaar return name 37704aab88d9SBram Moolenaar enddef 37714aab88d9SBram Moolenaar def g:SetName(arg: string) 37724aab88d9SBram Moolenaar name = arg 37734aab88d9SBram Moolenaar enddef 37744aab88d9SBram Moolenaar END 37754aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 37764aab88d9SBram Moolenaar so XscriptTwice.vim 37774aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 37784aab88d9SBram Moolenaar g:SetName('newname') 37794aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 37804aab88d9SBram Moolenaar so XscriptTwice.vim 37814aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 37824aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 37834aab88d9SBram Moolenaar 37844aab88d9SBram Moolenaar delfunc g:GetName 37854aab88d9SBram Moolenaar delfunc g:SetName 37864aab88d9SBram Moolenaar delete('XscriptTwice.vim') 37874aab88d9SBram Moolenaar unlet g:guard 37884aab88d9SBram Moolenaarenddef 37894aab88d9SBram Moolenaar 37904aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 37914aab88d9SBram Moolenaar var exportlines =<< trim END 37924aab88d9SBram Moolenaar vim9script 37934aab88d9SBram Moolenaar if exists('g:guard') 37944aab88d9SBram Moolenaar finish 37954aab88d9SBram Moolenaar endif 37964aab88d9SBram Moolenaar g:guard = 1 37974aab88d9SBram Moolenaar export var name = 'someName' 37984aab88d9SBram Moolenaar END 37994aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 38004aab88d9SBram Moolenaar 38014aab88d9SBram Moolenaar var lines =<< trim END 38024aab88d9SBram Moolenaar vim9script 38034aab88d9SBram Moolenaar import name from './XexportScript.vim' 38044aab88d9SBram Moolenaar def g:GetName(): string 38054aab88d9SBram Moolenaar return name 38064aab88d9SBram Moolenaar enddef 38074aab88d9SBram Moolenaar END 38084aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 38094aab88d9SBram Moolenaar so XscriptImport.vim 38104aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 38114aab88d9SBram Moolenaar 38124aab88d9SBram Moolenaar so XexportScript.vim 38134aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38144aab88d9SBram Moolenaar 38154aab88d9SBram Moolenaar delfunc g:GetName 38164aab88d9SBram Moolenaar delete('XexportScript.vim') 38174aab88d9SBram Moolenaar delete('XscriptImport.vim') 38184aab88d9SBram Moolenaar unlet g:guard 38194aab88d9SBram Moolenaarenddef 38204aab88d9SBram Moolenaar 382110b9421fSBram Moolenaardef Test_unsupported_commands() 382210b9421fSBram Moolenaar var lines =<< trim END 382310b9421fSBram Moolenaar ka 382410b9421fSBram Moolenaar END 382510b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 382610b9421fSBram Moolenaar 382710b9421fSBram Moolenaar lines =<< trim END 3828ada1d870SBram Moolenaar :1ka 3829ada1d870SBram Moolenaar END 3830ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3831ada1d870SBram Moolenaar 3832ada1d870SBram Moolenaar lines =<< trim END 383310b9421fSBram Moolenaar t 383410b9421fSBram Moolenaar END 383510b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 383610b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 383710b9421fSBram Moolenaar 383810b9421fSBram Moolenaar lines =<< trim END 383910b9421fSBram Moolenaar x 384010b9421fSBram Moolenaar END 384110b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 384210b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 384310b9421fSBram Moolenaar 384410b9421fSBram Moolenaar lines =<< trim END 384510b9421fSBram Moolenaar xit 384610b9421fSBram Moolenaar END 384710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 384810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 384910b9421fSBram Moolenaarenddef 385010b9421fSBram Moolenaar 3851*c70fe460SBram Moolenaardef Test_mapping_line_number() 3852*c70fe460SBram Moolenaar var lines =<< trim END 3853*c70fe460SBram Moolenaar vim9script 3854*c70fe460SBram Moolenaar def g:FuncA() 3855*c70fe460SBram Moolenaar # Some comment 3856*c70fe460SBram Moolenaar FuncB(0) 3857*c70fe460SBram Moolenaar enddef 3858*c70fe460SBram Moolenaar # Some comment 3859*c70fe460SBram Moolenaar def FuncB( 3860*c70fe460SBram Moolenaar # Some comment 3861*c70fe460SBram Moolenaar n: number 3862*c70fe460SBram Moolenaar ) 3863*c70fe460SBram Moolenaar exe 'nno ' 3864*c70fe460SBram Moolenaar # Some comment 3865*c70fe460SBram Moolenaar .. '<F3> a' 3866*c70fe460SBram Moolenaar .. 'b' 3867*c70fe460SBram Moolenaar .. 'c' 3868*c70fe460SBram Moolenaar enddef 3869*c70fe460SBram Moolenaar END 3870*c70fe460SBram Moolenaar CheckScriptSuccess(lines) 3871*c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 3872*c70fe460SBram Moolenaar assert_match('No mapping found', res) 3873*c70fe460SBram Moolenaar 3874*c70fe460SBram Moolenaar g:FuncA() 3875*c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 3876*c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 3877*c70fe460SBram Moolenaar 3878*c70fe460SBram Moolenaar nunmap <F3> 3879*c70fe460SBram Moolenaar delfunc g:FuncA 3880*c70fe460SBram Moolenaarenddef 3881*c70fe460SBram Moolenaar 3882585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3883585fea7bSBram Moolenaardef Test_substitute_cmd() 3884585fea7bSBram Moolenaar new 3885585fea7bSBram Moolenaar setline(1, 'something') 3886585fea7bSBram Moolenaar :substitute(some(other( 3887585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3888585fea7bSBram Moolenaar bwipe! 3889585fea7bSBram Moolenaar 3890f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3891cfcd011fSBram Moolenaar var lines =<< trim END 3892585fea7bSBram Moolenaar vim9script 3893585fea7bSBram Moolenaar new 3894585fea7bSBram Moolenaar setline(1, 'something') 3895585fea7bSBram Moolenaar :substitute(some(other( 3896585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3897585fea7bSBram Moolenaar bwipe! 3898585fea7bSBram Moolenaar END 3899585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3900585fea7bSBram Moolenaar source Xvim9lines 3901585fea7bSBram Moolenaar 3902585fea7bSBram Moolenaar delete('Xvim9lines') 3903585fea7bSBram Moolenaarenddef 3904585fea7bSBram Moolenaar 39058a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3906