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 595*2e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 596*2e34c34bSBram Moolenaardef TryContinueFunc() 597*2e34c34bSBram Moolenaar while g:Count < 2 598*2e34c34bSBram Moolenaar g:sequence ..= 't' 599*2e34c34bSBram Moolenaar try 600*2e34c34bSBram Moolenaar echoerr 'Test' 601*2e34c34bSBram Moolenaar catch 602*2e34c34bSBram Moolenaar g:Count += 1 603*2e34c34bSBram Moolenaar g:sequence ..= 'c' 604*2e34c34bSBram Moolenaar continue 605*2e34c34bSBram Moolenaar endtry 606*2e34c34bSBram Moolenaar g:sequence ..= 'e' 607*2e34c34bSBram Moolenaar g:Count += 1 608*2e34c34bSBram Moolenaar endwhile 609*2e34c34bSBram Moolenaarenddef 610*2e34c34bSBram Moolenaar 611*2e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 612*2e34c34bSBram Moolenaar g:Count = 0 613*2e34c34bSBram Moolenaar g:sequence = '' 614*2e34c34bSBram Moolenaar TryContinueFunc() 615*2e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 616*2e34c34bSBram Moolenaar unlet g:Count 617*2e34c34bSBram Moolenaar unlet g:sequence 618*2e34c34bSBram Moolenaarenddef 619*2e34c34bSBram 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. 1253750802b5SBram Moolenaar set cpo&vi 1254cfcd011fSBram Moolenaar var cpo_before = &cpo 1255cfcd011fSBram Moolenaar var lines =<< trim END 1256750802b5SBram Moolenaar vim9script 1257750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1258750802b5SBram Moolenaar END 1259750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1260750802b5SBram Moolenaar source Xvim9_script 1261750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1262750802b5SBram Moolenaar set cpo&vim 1263750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1264750802b5SBram Moolenaar delete('Xvim9_script') 1265750802b5SBram Moolenaarenddef 1266750802b5SBram Moolenaar 12670a84284eSBram Moolenaardef Test_import_as() 12680a84284eSBram Moolenaar var export_lines =<< trim END 12690a84284eSBram Moolenaar vim9script 12700a84284eSBram Moolenaar export var one = 1 12710a84284eSBram Moolenaar export var yes = 'yes' 12720a84284eSBram Moolenaar END 12730a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 12740a84284eSBram Moolenaar 12750a84284eSBram Moolenaar var import_lines =<< trim END 12760a84284eSBram Moolenaar vim9script 12770a84284eSBram Moolenaar import one as thatOne from './XexportAs' 12780a84284eSBram Moolenaar assert_equal(1, thatOne) 12790a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 12800a84284eSBram Moolenaar assert_equal('yes', yesYes) 12810a84284eSBram Moolenaar END 12820a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 12830a84284eSBram Moolenaar 12840a84284eSBram Moolenaar import_lines =<< trim END 12850a84284eSBram Moolenaar vim9script 12860a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 12870a84284eSBram Moolenaar assert_equal(1, thatOne) 12880a84284eSBram Moolenaar assert_equal('yes', yesYes) 12890a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 12900a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 12910a84284eSBram Moolenaar END 12920a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 12930a84284eSBram Moolenaar 12940a84284eSBram Moolenaar delete('XexportAs') 12950a84284eSBram Moolenaarenddef 12960a84284eSBram Moolenaar 1297803af686SBram Moolenaarfunc g:Trigger() 1298803af686SBram Moolenaar source Ximport.vim 1299803af686SBram Moolenaar return "echo 'yes'\<CR>" 1300803af686SBram Moolenaarendfunc 1301803af686SBram Moolenaar 1302803af686SBram Moolenaardef Test_import_export_expr_map() 1303803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1304cfcd011fSBram Moolenaar var export_lines =<< trim END 1305803af686SBram Moolenaar vim9script 1306803af686SBram Moolenaar export def That(): string 1307803af686SBram Moolenaar return 'yes' 1308803af686SBram Moolenaar enddef 1309803af686SBram Moolenaar END 1310803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1311803af686SBram Moolenaar 1312cfcd011fSBram Moolenaar var import_lines =<< trim END 1313803af686SBram Moolenaar vim9script 1314803af686SBram Moolenaar import That from './Xexport_that.vim' 1315803af686SBram Moolenaar assert_equal('yes', That()) 1316803af686SBram Moolenaar END 1317803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1318803af686SBram Moolenaar 1319803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1320803af686SBram Moolenaar feedkeys('trigger', "xt") 1321803af686SBram Moolenaar 1322730b2483SBram Moolenaar delete('Xexport_that.vim') 1323803af686SBram Moolenaar delete('Ximport.vim') 1324803af686SBram Moolenaar nunmap trigger 1325803af686SBram Moolenaarenddef 1326803af686SBram Moolenaar 13278e1986e3SBram Moolenaardef Test_import_in_filetype() 13288e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13298e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1330cfcd011fSBram Moolenaar var export_lines =<< trim END 13318e1986e3SBram Moolenaar vim9script 1332cfcd011fSBram Moolenaar export var That = 'yes' 13338e1986e3SBram Moolenaar END 1334730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 13358e1986e3SBram Moolenaar 1336cfcd011fSBram Moolenaar var import_lines =<< trim END 13378e1986e3SBram Moolenaar vim9script 1338730b2483SBram Moolenaar import That from './Xexport_ft.vim' 13398e1986e3SBram Moolenaar assert_equal('yes', That) 13408e1986e3SBram Moolenaar g:did_load_mytpe = 1 13418e1986e3SBram Moolenaar END 13428e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 13438e1986e3SBram Moolenaar 1344cfcd011fSBram Moolenaar var save_rtp = &rtp 13458e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 13468e1986e3SBram Moolenaar 13478e1986e3SBram Moolenaar filetype plugin on 13488e1986e3SBram Moolenaar copen 13498e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 13508e1986e3SBram Moolenaar 13518e1986e3SBram Moolenaar quit! 1352730b2483SBram Moolenaar delete('Xexport_ft.vim') 13538e1986e3SBram Moolenaar delete('ftplugin', 'rf') 13548e1986e3SBram Moolenaar &rtp = save_rtp 13558e1986e3SBram Moolenaarenddef 13568e1986e3SBram Moolenaar 1357efa94447SBram Moolenaardef Test_use_import_in_mapping() 1358cfcd011fSBram Moolenaar var lines =<< trim END 1359efa94447SBram Moolenaar vim9script 1360efa94447SBram Moolenaar export def Funcx() 1361efa94447SBram Moolenaar g:result = 42 1362efa94447SBram Moolenaar enddef 1363efa94447SBram Moolenaar END 1364efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1365efa94447SBram Moolenaar lines =<< trim END 1366efa94447SBram Moolenaar vim9script 1367efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1368b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1369efa94447SBram Moolenaar END 1370efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1371efa94447SBram Moolenaar 1372efa94447SBram Moolenaar source Xmapscript.vim 1373b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1374efa94447SBram Moolenaar assert_equal(42, g:result) 1375efa94447SBram Moolenaar 1376efa94447SBram Moolenaar unlet g:result 1377efa94447SBram Moolenaar delete('XsomeExport.vim') 1378efa94447SBram Moolenaar delete('Xmapscript.vim') 1379b3ca9824SBram Moolenaar nunmap <F3> 1380efa94447SBram Moolenaarenddef 1381efa94447SBram Moolenaar 1382d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1383d3f8a9eeSBram Moolenaar var lines =<< trim END 1384d3f8a9eeSBram Moolenaar if has(g:feature) 1385d3f8a9eeSBram Moolenaar " legacy script 1386d3f8a9eeSBram Moolenaar let g:legacy = 1 1387d3f8a9eeSBram Moolenaar finish 1388d3f8a9eeSBram Moolenaar endif 1389d3f8a9eeSBram Moolenaar vim9script 1390d3f8a9eeSBram Moolenaar g:legacy = 0 1391d3f8a9eeSBram Moolenaar END 1392d3f8a9eeSBram Moolenaar g:feature = 'eval' 1393d3f8a9eeSBram Moolenaar g:legacy = -1 1394d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1395d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1396d3f8a9eeSBram Moolenaar 1397d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1398d3f8a9eeSBram Moolenaar g:legacy = -1 1399d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1400d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1401d3f8a9eeSBram Moolenaarenddef 1402d3f8a9eeSBram Moolenaar 1403750802b5SBram Moolenaardef Test_vim9script_fails() 14048a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14058a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1406cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 14079721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1408cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1409750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1410750802b5SBram Moolenaar 1411cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1412c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1413c785b9a7SBram Moolenaar 1414e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1415e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 14168a7d6542SBram Moolenaarenddef 14178a7d6542SBram Moolenaar 1418f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1419101f4810SBram Moolenaar CheckRunVimInTerminal 1420101f4810SBram Moolenaar 14219bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1422c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14239bb3eb3eSBram Moolenaarendfunc 14249bb3eb3eSBram Moolenaar 1425c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1426cfcd011fSBram Moolenaar var export =<< trim END 1427101f4810SBram Moolenaar vim9script 1428101f4810SBram Moolenaar export def Foo(): number 1429101f4810SBram Moolenaar return 0 1430101f4810SBram Moolenaar enddef 1431101f4810SBram Moolenaar END 1432730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1433101f4810SBram Moolenaar 1434e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 14359bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14362949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1437101f4810SBram Moolenaar 1438730b2483SBram Moolenaar delete('XexportCmd.vim') 14399bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14409bb3eb3eSBram Moolenaarenddef 1441101f4810SBram Moolenaar 14422b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 14432b32700dSBram Moolenaar var lines =<< trim END 1444a6294955SBram Moolenaar vim9script 1445a6294955SBram Moolenaar export var exported = 'thexport' 1446a6294955SBram Moolenaar END 1447a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1448a6294955SBram Moolenaar lines =<< trim END 14492b32700dSBram Moolenaar vim9script noclear 14502b32700dSBram Moolenaar g:loadCount += 1 14512b32700dSBram Moolenaar var s:reloaded = 'init' 1452a6294955SBram Moolenaar import exported from './XExportReload' 14532b32700dSBram Moolenaar 14542b32700dSBram Moolenaar def Again(): string 14552b32700dSBram Moolenaar return 'again' 14562b32700dSBram Moolenaar enddef 14572b32700dSBram Moolenaar 14582b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 14592b32700dSBram Moolenaar var s:loaded = true 14602b32700dSBram Moolenaar 14612b32700dSBram Moolenaar var s:notReloaded = 'yes' 14622b32700dSBram Moolenaar s:reloaded = 'first' 14632b32700dSBram Moolenaar def g:Values(): list<string> 1464a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 14652b32700dSBram Moolenaar enddef 14662b32700dSBram Moolenaar 14672b32700dSBram Moolenaar def Once(): string 14682b32700dSBram Moolenaar return 'once' 14692b32700dSBram Moolenaar enddef 14702b32700dSBram Moolenaar END 14712b32700dSBram Moolenaar writefile(lines, 'XReloaded') 14722b32700dSBram Moolenaar g:loadCount = 0 14732b32700dSBram Moolenaar source XReloaded 14742b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1475a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 14762b32700dSBram Moolenaar source XReloaded 14772b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1478a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14792b32700dSBram Moolenaar source XReloaded 14802b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1481a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14822b32700dSBram Moolenaar 148348e11c10SBram Moolenaar delete('XReloaded') 1484a6294955SBram Moolenaar delete('XExportReload') 14852b32700dSBram Moolenaar delfunc g:Values 14862b32700dSBram Moolenaar unlet g:loadCount 14872b32700dSBram Moolenaarenddef 14882b32700dSBram Moolenaar 14894c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1490cfcd011fSBram Moolenaar var lines =<< trim END 14918a7d6542SBram Moolenaar vim9script 14928a7d6542SBram Moolenaar const var = '' 1493cfcd011fSBram Moolenaar var valone = 1234 14948a7d6542SBram Moolenaar def MyFunc(arg: string) 14958a7d6542SBram Moolenaar valone = 5678 14968a7d6542SBram Moolenaar enddef 14978a7d6542SBram Moolenaar END 1498cfcd011fSBram Moolenaar var morelines =<< trim END 1499cfcd011fSBram Moolenaar var valtwo = 222 15008a7d6542SBram Moolenaar export def GetValtwo(): number 15018a7d6542SBram Moolenaar return valtwo 15028a7d6542SBram Moolenaar enddef 15038a7d6542SBram Moolenaar END 150403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15058a7d6542SBram Moolenaar source Xreload.vim 15068a7d6542SBram Moolenaar source Xreload.vim 15078a7d6542SBram Moolenaar source Xreload.vim 15088a7d6542SBram Moolenaar 1509cfcd011fSBram Moolenaar var testlines =<< trim END 15108a7d6542SBram Moolenaar vim9script 15118a7d6542SBram Moolenaar def TheFunc() 15128a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15138a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15148a7d6542SBram Moolenaar enddef 15158a7d6542SBram Moolenaar TheFunc() 15168a7d6542SBram Moolenaar END 15178a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15188a7d6542SBram Moolenaar source Ximport.vim 15198a7d6542SBram Moolenaar 1520f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1521f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15228a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15238a7d6542SBram Moolenaar source Ximport.vim 15248a7d6542SBram Moolenaar 1525f5be8cdbSBram Moolenaar # cannot declare a var twice 15268a7d6542SBram Moolenaar lines =<< trim END 15278a7d6542SBram Moolenaar vim9script 1528cfcd011fSBram Moolenaar var valone = 1234 1529cfcd011fSBram Moolenaar var valone = 5678 15308a7d6542SBram Moolenaar END 15318a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 153244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 15338a7d6542SBram Moolenaar 15348a7d6542SBram Moolenaar delete('Xreload.vim') 15358a7d6542SBram Moolenaar delete('Ximport.vim') 15368a7d6542SBram Moolenaarenddef 15378a7d6542SBram Moolenaar 153807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 153907a65d26SBram Moolenaar" compiled function using that variable must fail. 154007a65d26SBram Moolenaardef Test_script_reload_change_type() 154107a65d26SBram Moolenaar var lines =<< trim END 154207a65d26SBram Moolenaar vim9script noclear 154307a65d26SBram Moolenaar var str = 'string' 154407a65d26SBram Moolenaar def g:GetStr(): string 154507a65d26SBram Moolenaar return str .. 'xxx' 154607a65d26SBram Moolenaar enddef 154707a65d26SBram Moolenaar END 154807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 154907a65d26SBram Moolenaar source Xreload.vim 155007a65d26SBram Moolenaar echo g:GetStr() 155107a65d26SBram Moolenaar 155207a65d26SBram Moolenaar lines =<< trim END 155307a65d26SBram Moolenaar vim9script noclear 155407a65d26SBram Moolenaar var str = 1234 155507a65d26SBram Moolenaar END 155607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 155707a65d26SBram Moolenaar source Xreload.vim 155807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 155907a65d26SBram Moolenaar 156007a65d26SBram Moolenaar delfunc g:GetStr 156107a65d26SBram Moolenaar delete('Xreload.vim') 156207a65d26SBram Moolenaarenddef 156307a65d26SBram Moolenaar 15646c3843caSBram Moolenaardef Test_script_var_shadows_function() 15656c3843caSBram Moolenaar var lines =<< trim END 15666c3843caSBram Moolenaar vim9script 15676c3843caSBram Moolenaar def Func(): number 15686c3843caSBram Moolenaar return 123 15696c3843caSBram Moolenaar enddef 15706c3843caSBram Moolenaar var Func = 1 15716c3843caSBram Moolenaar END 15726c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 15736c3843caSBram Moolenaarenddef 15746c3843caSBram Moolenaar 157595006e3dSBram Moolenaardef s:RetSome(): string 157695006e3dSBram Moolenaar return 'some' 157795006e3dSBram Moolenaarenddef 157895006e3dSBram Moolenaar 1579fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1580fe465a01SBram Moolenaar" script-local name. 1581fe465a01SBram Moolenaardef Test_vim9script_funcref() 1582cfcd011fSBram Moolenaar var sortlines =<< trim END 1583fe465a01SBram Moolenaar vim9script 1584fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1585bed36b93SBram Moolenaar return i2 - i1 1586fe465a01SBram Moolenaar enddef 1587fe465a01SBram Moolenaar 1588fe465a01SBram Moolenaar export def FastSort(): list<number> 1589fe465a01SBram Moolenaar return range(5)->sort(Compare) 1590fe465a01SBram Moolenaar enddef 1591fe465a01SBram Moolenaar END 1592fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1593fe465a01SBram Moolenaar 1594cfcd011fSBram Moolenaar var lines =<< trim END 1595fe465a01SBram Moolenaar vim9script 1596fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1597fe465a01SBram Moolenaar def Test() 1598fe465a01SBram Moolenaar g:result = FastSort() 1599fe465a01SBram Moolenaar enddef 1600fe465a01SBram Moolenaar Test() 1601fe465a01SBram Moolenaar END 1602fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1603fe465a01SBram Moolenaar 1604fe465a01SBram Moolenaar source Xscript.vim 1605fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1606fe465a01SBram Moolenaar 1607fe465a01SBram Moolenaar unlet g:result 1608fe465a01SBram Moolenaar delete('Xsort.vim') 1609fe465a01SBram Moolenaar delete('Xscript.vim') 161095006e3dSBram Moolenaar 1611cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 161295006e3dSBram Moolenaar assert_equal('some', Funcref()) 1613fe465a01SBram Moolenaarenddef 1614fe465a01SBram Moolenaar 1615601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1616601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1617601e76acSBram Moolenaar" function reference. 1618c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1619cfcd011fSBram Moolenaar var filterLines =<< trim END 1620c620c055SBram Moolenaar vim9script 1621c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1622c620c055SBram Moolenaar return idx % 2 == 1 1623c620c055SBram Moolenaar enddef 1624c620c055SBram Moolenaar export def FastFilter(): list<number> 1625c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1626c620c055SBram Moolenaar enddef 1627601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1628601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1629601e76acSBram Moolenaar enddef 1630c620c055SBram Moolenaar END 1631c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1632c620c055SBram Moolenaar 1633cfcd011fSBram Moolenaar var lines =<< trim END 1634c620c055SBram Moolenaar vim9script 1635601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1636c620c055SBram Moolenaar def Test() 1637cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1638c620c055SBram Moolenaar enddef 1639c620c055SBram Moolenaar Test() 1640601e76acSBram Moolenaar def TestDirect() 1641cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1642601e76acSBram Moolenaar enddef 1643601e76acSBram Moolenaar TestDirect() 1644c620c055SBram Moolenaar END 1645601e76acSBram Moolenaar CheckScriptSuccess(lines) 1646c620c055SBram Moolenaar delete('Xfilter.vim') 1647c620c055SBram Moolenaarenddef 1648c620c055SBram Moolenaar 16494c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1650cfcd011fSBram Moolenaar var first_lines =<< trim END 16514c17ad94SBram Moolenaar vim9script 16524c17ad94SBram Moolenaar def FuncYes(): string 16534c17ad94SBram Moolenaar return 'yes' 16544c17ad94SBram Moolenaar enddef 16554c17ad94SBram Moolenaar END 1656cfcd011fSBram Moolenaar var withno_lines =<< trim END 16574c17ad94SBram Moolenaar def FuncNo(): string 16584c17ad94SBram Moolenaar return 'no' 16594c17ad94SBram Moolenaar enddef 16604c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 16614c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 16624c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 166303afdcf1SBram Moolenaar enddef 166403afdcf1SBram Moolenaar END 1665cfcd011fSBram Moolenaar var nono_lines =<< trim END 166603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 166703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 166844d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 16694c17ad94SBram Moolenaar enddef 16704c17ad94SBram Moolenaar END 16714c17ad94SBram Moolenaar 16724c17ad94SBram Moolenaar # FuncNo() is defined 167303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16744c17ad94SBram Moolenaar source Xreloaded.vim 16754c17ad94SBram Moolenaar g:DoCheck(true) 16764c17ad94SBram Moolenaar 16774c17ad94SBram Moolenaar # FuncNo() is not redefined 167803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16794c17ad94SBram Moolenaar source Xreloaded.vim 16805082471fSBram Moolenaar g:DoCheck(false) 16814c17ad94SBram Moolenaar 16824c17ad94SBram Moolenaar # FuncNo() is back 168303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16844c17ad94SBram Moolenaar source Xreloaded.vim 16855082471fSBram Moolenaar g:DoCheck(false) 16864c17ad94SBram Moolenaar 16874c17ad94SBram Moolenaar delete('Xreloaded.vim') 16884c17ad94SBram Moolenaarenddef 16894c17ad94SBram Moolenaar 169089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 169189483d40SBram Moolenaar # write the script with a script-local variable 1692cfcd011fSBram Moolenaar var lines =<< trim END 169389483d40SBram Moolenaar vim9script 1694cfcd011fSBram Moolenaar var name = 'string' 169589483d40SBram Moolenaar END 169689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 169789483d40SBram Moolenaar source XreloadVar.vim 169889483d40SBram Moolenaar 169989483d40SBram Moolenaar # now write the script using the same variable locally - works 170089483d40SBram Moolenaar lines =<< trim END 170189483d40SBram Moolenaar vim9script 170289483d40SBram Moolenaar def Func() 1703cfcd011fSBram Moolenaar var name = 'string' 170489483d40SBram Moolenaar enddef 170589483d40SBram Moolenaar END 170689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 170789483d40SBram Moolenaar source XreloadVar.vim 170889483d40SBram Moolenaar 170989483d40SBram Moolenaar delete('XreloadVar.vim') 171089483d40SBram Moolenaarenddef 171189483d40SBram Moolenaar 17128a7d6542SBram Moolenaardef Test_import_absolute() 1713cfcd011fSBram Moolenaar var import_lines = [ 1714e6085c53SBram Moolenaar 'vim9script', 1715e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1716e6085c53SBram Moolenaar 'def UseExported()', 1717e6085c53SBram Moolenaar ' g:imported_abs = exported', 1718e6085c53SBram Moolenaar ' exported = 8888', 1719e6085c53SBram Moolenaar ' g:imported_after = exported', 1720e6085c53SBram Moolenaar 'enddef', 1721e6085c53SBram Moolenaar 'UseExported()', 1722e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1723e6085c53SBram Moolenaar ] 17248a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 17258a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 17268a7d6542SBram Moolenaar 17278a7d6542SBram Moolenaar source Ximport_abs.vim 17288a7d6542SBram Moolenaar 17298a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 17304e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1731fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1732fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1733fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1734fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1735fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1736fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1737fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1738fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1739fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1740fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1741e6085c53SBram Moolenaar g:import_disassembled) 1742b3ca9824SBram Moolenaar 1743b3ca9824SBram Moolenaar Undo_export_script_lines() 17448a7d6542SBram Moolenaar unlet g:imported_abs 17454e12a5dfSBram Moolenaar unlet g:import_disassembled 17468a7d6542SBram Moolenaar 17478a7d6542SBram Moolenaar delete('Ximport_abs.vim') 17488a7d6542SBram Moolenaar delete('Xexport_abs.vim') 17498a7d6542SBram Moolenaarenddef 17508a7d6542SBram Moolenaar 17518a7d6542SBram Moolenaardef Test_import_rtp() 1752cfcd011fSBram Moolenaar var import_lines = [ 1753e6085c53SBram Moolenaar 'vim9script', 1754e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1755e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1756e6085c53SBram Moolenaar ] 17578a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 17588a7d6542SBram Moolenaar mkdir('import') 17598a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 17608a7d6542SBram Moolenaar 1761cfcd011fSBram Moolenaar var save_rtp = &rtp 17628a7d6542SBram Moolenaar &rtp = getcwd() 17638a7d6542SBram Moolenaar source Ximport_rtp.vim 17648a7d6542SBram Moolenaar &rtp = save_rtp 17658a7d6542SBram Moolenaar 17668a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 17678a7d6542SBram Moolenaar 1768b3ca9824SBram Moolenaar Undo_export_script_lines() 1769b3ca9824SBram Moolenaar unlet g:imported_rtp 17708a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 177189483d40SBram Moolenaar delete('import', 'rf') 17728a7d6542SBram Moolenaarenddef 17738a7d6542SBram Moolenaar 177425e0f586SBram Moolenaardef Test_import_compile_error() 1775cfcd011fSBram Moolenaar var export_lines = [ 177625e0f586SBram Moolenaar 'vim9script', 177725e0f586SBram Moolenaar 'export def ExpFunc(): string', 177825e0f586SBram Moolenaar ' return notDefined', 177925e0f586SBram Moolenaar 'enddef', 178025e0f586SBram Moolenaar ] 178125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 178225e0f586SBram Moolenaar 1783cfcd011fSBram Moolenaar var import_lines = [ 178425e0f586SBram Moolenaar 'vim9script', 178525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 178625e0f586SBram Moolenaar 'def ImpFunc()', 178725e0f586SBram Moolenaar ' echo ExpFunc()', 178825e0f586SBram Moolenaar 'enddef', 178925e0f586SBram Moolenaar 'defcompile', 179025e0f586SBram Moolenaar ] 179125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 179225e0f586SBram Moolenaar 179325e0f586SBram Moolenaar try 179425e0f586SBram Moolenaar source Ximport.vim 179525e0f586SBram Moolenaar catch /E1001/ 1796f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 17977707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 179825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 179925e0f586SBram Moolenaar endtry 180025e0f586SBram Moolenaar 180125e0f586SBram Moolenaar delete('Xexported.vim') 180225e0f586SBram Moolenaar delete('Ximport.vim') 180325e0f586SBram Moolenaarenddef 180425e0f586SBram Moolenaar 1805c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1806cfcd011fSBram Moolenaar var lines = [ 1807c4ce36d4SBram Moolenaar 'vim9script', 1808c4ce36d4SBram Moolenaar 'def Func()', 1809c4ce36d4SBram Moolenaar ' eval [][0]', 1810c4ce36d4SBram Moolenaar 'enddef', 1811c4ce36d4SBram Moolenaar 'Func()', 1812c4ce36d4SBram Moolenaar ] 1813c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1814c4ce36d4SBram Moolenaar 1815c4ce36d4SBram Moolenaar for count in range(3) 1816c4ce36d4SBram Moolenaar try 1817c4ce36d4SBram Moolenaar source Xtestscript.vim 1818c4ce36d4SBram Moolenaar catch /E684/ 1819c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1820c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1821c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1822c4ce36d4SBram Moolenaar endtry 1823c4ce36d4SBram Moolenaar endfor 1824c4ce36d4SBram Moolenaar 1825c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1826c4ce36d4SBram Moolenaarenddef 1827c4ce36d4SBram Moolenaar 1828eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1829cfcd011fSBram Moolenaar var export_lines =<< trim END 1830eef2102eSBram Moolenaar vim9script 1831eef2102eSBram Moolenaar export def Func() 1832eef2102eSBram Moolenaar echo 'imported' 1833eef2102eSBram Moolenaar enddef 1834eef2102eSBram Moolenaar END 1835eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1836eef2102eSBram Moolenaar 1837cfcd011fSBram Moolenaar var lines =<< trim END 1838eef2102eSBram Moolenaar vim9script 1839eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1840eef2102eSBram Moolenaar def Func() 1841eef2102eSBram Moolenaar echo 'local to function' 1842eef2102eSBram Moolenaar enddef 1843eef2102eSBram Moolenaar END 1844eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1845eef2102eSBram Moolenaar 1846eef2102eSBram Moolenaar lines =<< trim END 1847eef2102eSBram Moolenaar vim9script 1848eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1849eef2102eSBram Moolenaar def Outer() 1850eef2102eSBram Moolenaar def Func() 1851eef2102eSBram Moolenaar echo 'local to function' 1852eef2102eSBram Moolenaar enddef 1853eef2102eSBram Moolenaar enddef 1854eef2102eSBram Moolenaar defcompile 1855eef2102eSBram Moolenaar END 1856eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1857eef2102eSBram Moolenaar 1858eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1859eef2102eSBram Moolenaarenddef 1860eef2102eSBram Moolenaar 1861b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1862cfcd011fSBram Moolenaar var lines =<< trim END 1863b9a2cac3SBram Moolenaar vim9script 1864b9a2cac3SBram Moolenaar def Func() 1865b9a2cac3SBram Moolenaar echo 'one' 1866b9a2cac3SBram Moolenaar enddef 1867b9a2cac3SBram Moolenaar def Func() 1868b9a2cac3SBram Moolenaar echo 'two' 1869b9a2cac3SBram Moolenaar enddef 1870b9a2cac3SBram Moolenaar END 1871b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1872fa211f3cSBram Moolenaar 1873fa211f3cSBram Moolenaar lines =<< trim END 1874fa211f3cSBram Moolenaar vim9script 1875fa211f3cSBram Moolenaar def Foo(): string 1876fa211f3cSBram Moolenaar return 'foo' 1877fa211f3cSBram Moolenaar enddef 1878fa211f3cSBram Moolenaar def Func() 1879cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1880fa211f3cSBram Moolenaar enddef 1881fa211f3cSBram Moolenaar defcompile 1882fa211f3cSBram Moolenaar END 1883fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1884b9a2cac3SBram Moolenaarenddef 1885b9a2cac3SBram Moolenaar 18868a7d6542SBram Moolenaardef Test_fixed_size_list() 1887f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1888cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 18898a7d6542SBram Moolenaar l->remove(0) 18908a7d6542SBram Moolenaar l->add(5) 18918a7d6542SBram Moolenaar l->insert(99, 1) 18920f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18938a7d6542SBram Moolenaarenddef 18948a7d6542SBram Moolenaar 1895ae616494SBram Moolenaardef Test_no_insert_xit() 1896d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1897d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1898d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1899d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1900d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1901ae616494SBram Moolenaar 1902ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1903ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1904ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1905ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1906f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1907f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 19086508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 19096508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 1910f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1911f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1912f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1913ae616494SBram Moolenaarenddef 1914ae616494SBram Moolenaar 1915158906cfSBram Moolenaardef IfElse(what: number): string 1916cfcd011fSBram Moolenaar var res = '' 1917158906cfSBram Moolenaar if what == 1 1918158906cfSBram Moolenaar res = "one" 1919158906cfSBram Moolenaar elseif what == 2 1920158906cfSBram Moolenaar res = "two" 1921a259d8d3SBram Moolenaar else 1922158906cfSBram Moolenaar res = "three" 1923a259d8d3SBram Moolenaar endif 1924158906cfSBram Moolenaar return res 1925a259d8d3SBram Moolenaarenddef 1926a259d8d3SBram Moolenaar 1927158906cfSBram Moolenaardef Test_if_elseif_else() 1928158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1929158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1930158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 19310f18b6d1SBram Moolenaarenddef 19320f18b6d1SBram Moolenaar 1933e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1934d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1935d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1936d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1937ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1938d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 19396628b7ebSBram Moolenaar 19406628b7ebSBram Moolenaar var lines =<< trim END 19416628b7ebSBram Moolenaar var s = '' 19426628b7ebSBram Moolenaar if s = '' 19436628b7ebSBram Moolenaar endif 19446628b7ebSBram Moolenaar END 19456628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 19466628b7ebSBram Moolenaar 19476628b7ebSBram Moolenaar lines =<< trim END 19486628b7ebSBram Moolenaar var s = '' 19496628b7ebSBram Moolenaar if s == '' 19506628b7ebSBram Moolenaar elseif s = '' 19516628b7ebSBram Moolenaar endif 19526628b7ebSBram Moolenaar END 19536628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1954e8c4abbbSBram Moolenaarenddef 1955e8c4abbbSBram Moolenaar 19566d69bf60SBram Moolenaarlet g:bool_true = v:true 19576d69bf60SBram Moolenaarlet g:bool_false = v:false 19586d69bf60SBram Moolenaar 19596d69bf60SBram Moolenaardef Test_if_const_expr() 1960cfcd011fSBram Moolenaar var res = false 19616d69bf60SBram Moolenaar if true ? true : false 19626d69bf60SBram Moolenaar res = true 19636d69bf60SBram Moolenaar endif 19646d69bf60SBram Moolenaar assert_equal(true, res) 19656d69bf60SBram Moolenaar 1966585fea7bSBram Moolenaar g:glob = 2 1967585fea7bSBram Moolenaar if false 19686797966dSBram Moolenaar execute('g:glob = 3') 1969585fea7bSBram Moolenaar endif 1970585fea7bSBram Moolenaar assert_equal(2, g:glob) 1971585fea7bSBram Moolenaar if true 19726797966dSBram Moolenaar execute('g:glob = 3') 1973585fea7bSBram Moolenaar endif 1974585fea7bSBram Moolenaar assert_equal(3, g:glob) 1975585fea7bSBram Moolenaar 19766d69bf60SBram Moolenaar res = false 19776d69bf60SBram Moolenaar if g:bool_true ? true : false 19786d69bf60SBram Moolenaar res = true 19796d69bf60SBram Moolenaar endif 19806d69bf60SBram Moolenaar assert_equal(true, res) 19816d69bf60SBram Moolenaar 19826d69bf60SBram Moolenaar res = false 19836d69bf60SBram Moolenaar if true ? g:bool_true : false 19846d69bf60SBram Moolenaar res = true 19856d69bf60SBram Moolenaar endif 19866d69bf60SBram Moolenaar assert_equal(true, res) 19876d69bf60SBram Moolenaar 19886d69bf60SBram Moolenaar res = false 19896d69bf60SBram Moolenaar if true ? true : g:bool_false 19906d69bf60SBram Moolenaar res = true 19916d69bf60SBram Moolenaar endif 19926d69bf60SBram Moolenaar assert_equal(true, res) 19936d69bf60SBram Moolenaar 19946d69bf60SBram Moolenaar res = false 19956d69bf60SBram Moolenaar if true ? false : true 19966d69bf60SBram Moolenaar res = true 19976d69bf60SBram Moolenaar endif 19986d69bf60SBram Moolenaar assert_equal(false, res) 19996d69bf60SBram Moolenaar 20006d69bf60SBram Moolenaar res = false 20016d69bf60SBram Moolenaar if false ? false : true 20026d69bf60SBram Moolenaar res = true 20036d69bf60SBram Moolenaar endif 20046d69bf60SBram Moolenaar assert_equal(true, res) 20056d69bf60SBram Moolenaar 20066d69bf60SBram Moolenaar res = false 20076d69bf60SBram Moolenaar if false ? true : false 20086d69bf60SBram Moolenaar res = true 20096d69bf60SBram Moolenaar endif 20106d69bf60SBram Moolenaar assert_equal(false, res) 20116d69bf60SBram Moolenaar 20126d69bf60SBram Moolenaar res = false 2013e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2014e8c4abbbSBram Moolenaar res = true 2015e8c4abbbSBram Moolenaar endif 2016e8c4abbbSBram Moolenaar assert_equal(false, res) 2017e8c4abbbSBram Moolenaar 2018e8c4abbbSBram Moolenaar res = false 20196d69bf60SBram Moolenaar if true && true 20206d69bf60SBram Moolenaar res = true 20216d69bf60SBram Moolenaar endif 20226d69bf60SBram Moolenaar assert_equal(true, res) 20236d69bf60SBram Moolenaar 20246d69bf60SBram Moolenaar res = false 20256d69bf60SBram Moolenaar if true && false 20266d69bf60SBram Moolenaar res = true 20276d69bf60SBram Moolenaar endif 20286d69bf60SBram Moolenaar assert_equal(false, res) 20296d69bf60SBram Moolenaar 20306d69bf60SBram Moolenaar res = false 20316d69bf60SBram Moolenaar if g:bool_true && false 20326d69bf60SBram Moolenaar res = true 20336d69bf60SBram Moolenaar endif 20346d69bf60SBram Moolenaar assert_equal(false, res) 20356d69bf60SBram Moolenaar 20366d69bf60SBram Moolenaar res = false 20376d69bf60SBram Moolenaar if true && g:bool_false 20386d69bf60SBram Moolenaar res = true 20396d69bf60SBram Moolenaar endif 20406d69bf60SBram Moolenaar assert_equal(false, res) 20416d69bf60SBram Moolenaar 20426d69bf60SBram Moolenaar res = false 20436d69bf60SBram Moolenaar if false && false 20446d69bf60SBram Moolenaar res = true 20456d69bf60SBram Moolenaar endif 20466d69bf60SBram Moolenaar assert_equal(false, res) 20476d69bf60SBram Moolenaar 20486d69bf60SBram Moolenaar res = false 20496d69bf60SBram Moolenaar if true || false 20506d69bf60SBram Moolenaar res = true 20516d69bf60SBram Moolenaar endif 20526d69bf60SBram Moolenaar assert_equal(true, res) 20536d69bf60SBram Moolenaar 20546d69bf60SBram Moolenaar res = false 20556d69bf60SBram Moolenaar if g:bool_true || false 20566d69bf60SBram Moolenaar res = true 20576d69bf60SBram Moolenaar endif 20586d69bf60SBram Moolenaar assert_equal(true, res) 20596d69bf60SBram Moolenaar 20606d69bf60SBram Moolenaar res = false 20616d69bf60SBram Moolenaar if true || g:bool_false 20626d69bf60SBram Moolenaar res = true 20636d69bf60SBram Moolenaar endif 20646d69bf60SBram Moolenaar assert_equal(true, res) 20656d69bf60SBram Moolenaar 20666d69bf60SBram Moolenaar res = false 20676d69bf60SBram Moolenaar if false || false 20686d69bf60SBram Moolenaar res = true 20696d69bf60SBram Moolenaar endif 20706d69bf60SBram Moolenaar assert_equal(false, res) 20713988f64fSBram Moolenaar 20723988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 20733988f64fSBram Moolenaar if false | eval 0 | endif 20743988f64fSBram Moolenaar if false | eval burp + 234 | endif 20753988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 20763988f64fSBram Moolenaar if false 20773988f64fSBram Moolenaar burp 20783988f64fSBram Moolenaar endif 207980c34ca3SBram Moolenaarenddef 20806d69bf60SBram Moolenaar 208180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2082d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2083d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2084d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2085d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 20866d69bf60SBram Moolenaarenddef 20876d69bf60SBram Moolenaar 208872abcf42SBram Moolenaardef RunNested(i: number): number 2089cfcd011fSBram Moolenaar var x: number = 0 209072abcf42SBram Moolenaar if i % 2 209172abcf42SBram Moolenaar if 1 2092f5be8cdbSBram Moolenaar # comment 209372abcf42SBram Moolenaar else 2094f5be8cdbSBram Moolenaar # comment 209572abcf42SBram Moolenaar endif 209672abcf42SBram Moolenaar x += 1 209772abcf42SBram Moolenaar else 209872abcf42SBram Moolenaar x += 1000 209972abcf42SBram Moolenaar endif 210072abcf42SBram Moolenaar return x 210172abcf42SBram Moolenaarenddef 210272abcf42SBram Moolenaar 210372abcf42SBram Moolenaardef Test_nested_if() 210472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 210572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 210672abcf42SBram Moolenaarenddef 210772abcf42SBram Moolenaar 2108ad39c094SBram Moolenaardef Test_execute_cmd() 2109e4984290SBram Moolenaar # missing argument is ignored 2110e4984290SBram Moolenaar execute 2111e4984290SBram Moolenaar execute # comment 2112e4984290SBram Moolenaar 2113ad39c094SBram Moolenaar new 2114ad39c094SBram Moolenaar setline(1, 'default') 2115d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2116ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2117a72cfb80SBram Moolenaar 2118d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2119a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2120a72cfb80SBram Moolenaar 2121cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2122cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2123a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2124ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2125a72cfb80SBram Moolenaar 2126d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2127ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2128a72cfb80SBram Moolenaar 2129cfcd011fSBram Moolenaar var cmd_first = 'call ' 2130cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2131ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2132ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2133ad39c094SBram Moolenaar bwipe! 2134585fea7bSBram Moolenaar 2135cfcd011fSBram Moolenaar var n = true 21362d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 21372d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 21382d6b20d6SBram Moolenaar 2139e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2140e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2141e5abf7afSBram Moolenaar 2142d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2143d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2144d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2145ad39c094SBram Moolenaarenddef 2146ad39c094SBram Moolenaar 214747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2148f5be8cdbSBram Moolenaar # only checks line continuation 2149cfcd011fSBram Moolenaar var lines =<< trim END 215047e880d6SBram Moolenaar vim9script 215147e880d6SBram Moolenaar execute 'g:someVar' 215247e880d6SBram Moolenaar .. ' = ' .. 215347e880d6SBram Moolenaar '28' 215447e880d6SBram Moolenaar assert_equal(28, g:someVar) 215547e880d6SBram Moolenaar unlet g:someVar 215647e880d6SBram Moolenaar END 215747e880d6SBram Moolenaar CheckScriptSuccess(lines) 215847e880d6SBram Moolenaarenddef 215947e880d6SBram Moolenaar 2160ad39c094SBram Moolenaardef Test_echo_cmd() 2161a72cfb80SBram Moolenaar echo 'some' # comment 2162585fea7bSBram Moolenaar echon 'thing' 2163ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2164ad39c094SBram Moolenaar 2165a72cfb80SBram Moolenaar echo "some" # comment 2166a72cfb80SBram Moolenaar echon "thing" 2167a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2168a72cfb80SBram Moolenaar 2169cfcd011fSBram Moolenaar var str1 = 'some' 2170cfcd011fSBram Moolenaar var str2 = 'more' 2171ad39c094SBram Moolenaar echo str1 str2 2172ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2173a72cfb80SBram Moolenaar 2174d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2175ad39c094SBram Moolenaarenddef 2176ad39c094SBram Moolenaar 2177f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2178f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2179f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2180f93c7feaSBram Moolenaar echo 'clear' 2181df069eecSBram Moolenaar :1messages 2182f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2183f93c7feaSBram Moolenaar 2184d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2185f93c7feaSBram Moolenaarenddef 2186f93c7feaSBram Moolenaar 218747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2188f5be8cdbSBram Moolenaar # only checks line continuation 2189cfcd011fSBram Moolenaar var lines =<< trim END 219047e880d6SBram Moolenaar vim9script 219147e880d6SBram Moolenaar echomsg 'here' 219247e880d6SBram Moolenaar .. ' is ' .. 219347e880d6SBram Moolenaar 'a message' 219447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 219547e880d6SBram Moolenaar END 219647e880d6SBram Moolenaar CheckScriptSuccess(lines) 219747e880d6SBram Moolenaarenddef 219847e880d6SBram Moolenaar 2199f93c7feaSBram Moolenaardef Test_echoerr_cmd() 220040ee466cSBram Moolenaar try 220140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 220240ee466cSBram Moolenaar catch 220340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 220440ee466cSBram Moolenaar endtry 2205f93c7feaSBram Moolenaarenddef 2206f93c7feaSBram Moolenaar 220747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2208f5be8cdbSBram Moolenaar # only checks line continuation 2209cfcd011fSBram Moolenaar var lines =<< trim END 221047e880d6SBram Moolenaar vim9script 221147e880d6SBram Moolenaar try 221247e880d6SBram Moolenaar echoerr 'this' 221347e880d6SBram Moolenaar .. ' is ' .. 221447e880d6SBram Moolenaar 'wrong' 221547e880d6SBram Moolenaar catch 221647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 221747e880d6SBram Moolenaar endtry 221847e880d6SBram Moolenaar END 221947e880d6SBram Moolenaar CheckScriptSuccess(lines) 222047e880d6SBram Moolenaarenddef 222147e880d6SBram Moolenaar 222241fe0617SBram Moolenaardef Test_for_outside_of_function() 2223cfcd011fSBram Moolenaar var lines =<< trim END 222441fe0617SBram Moolenaar vim9script 222541fe0617SBram Moolenaar new 222641fe0617SBram Moolenaar for var in range(0, 3) 222741fe0617SBram Moolenaar append(line('$'), var) 222841fe0617SBram Moolenaar endfor 222941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 223041fe0617SBram Moolenaar bwipe! 223141fe0617SBram Moolenaar END 223241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 223341fe0617SBram Moolenaar source Xvim9for.vim 223441fe0617SBram Moolenaar delete('Xvim9for.vim') 223541fe0617SBram Moolenaarenddef 22368a7d6542SBram Moolenaar 2237e8c4abbbSBram Moolenaardef Test_for_loop() 2238cfcd011fSBram Moolenaar var result = '' 2239e8c4abbbSBram Moolenaar for cnt in range(7) 2240e8c4abbbSBram Moolenaar if cnt == 4 2241e8c4abbbSBram Moolenaar break 2242e8c4abbbSBram Moolenaar endif 2243e8c4abbbSBram Moolenaar if cnt == 2 2244e8c4abbbSBram Moolenaar continue 2245e8c4abbbSBram Moolenaar endif 2246e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2247e8c4abbbSBram Moolenaar endfor 2248e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 22490ad3e894SBram Moolenaar 2250cfcd011fSBram Moolenaar var concat = '' 22510ad3e894SBram Moolenaar for str in eval('["one", "two"]') 22520ad3e894SBram Moolenaar concat ..= str 22530ad3e894SBram Moolenaar endfor 22540ad3e894SBram Moolenaar assert_equal('onetwo', concat) 225538bd8de5SBram Moolenaar 225638bd8de5SBram Moolenaar var total = 0 225738bd8de5SBram Moolenaar for nr in 225838bd8de5SBram Moolenaar [1, 2, 3] 225938bd8de5SBram Moolenaar total += nr 226038bd8de5SBram Moolenaar endfor 226138bd8de5SBram Moolenaar assert_equal(6, total) 226238bd8de5SBram Moolenaar 226338bd8de5SBram Moolenaar total = 0 226438bd8de5SBram Moolenaar for nr 226538bd8de5SBram Moolenaar in [1, 2, 3] 226638bd8de5SBram Moolenaar total += nr 226738bd8de5SBram Moolenaar endfor 226838bd8de5SBram Moolenaar assert_equal(6, total) 226938bd8de5SBram Moolenaar 227038bd8de5SBram Moolenaar total = 0 227138bd8de5SBram Moolenaar for nr 227238bd8de5SBram Moolenaar in 227338bd8de5SBram Moolenaar [1, 2, 3] 227438bd8de5SBram Moolenaar total += nr 227538bd8de5SBram Moolenaar endfor 227638bd8de5SBram Moolenaar assert_equal(6, total) 2277036d0714SBram Moolenaar 2278036d0714SBram Moolenaar var res = "" 2279036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2280036d0714SBram Moolenaar res ..= n .. s 2281036d0714SBram Moolenaar endfor 2282036d0714SBram Moolenaar assert_equal('1a2b', res) 2283e8c4abbbSBram Moolenaarenddef 2284e8c4abbbSBram Moolenaar 2285e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2286025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2287025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2288025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2289675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2290675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2291cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2292822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 22932d870f8dSBram Moolenaar delfunc! g:Func 2294451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2295675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2296675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2297675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2298e8c4abbbSBram Moolenaarenddef 2299e8c4abbbSBram Moolenaar 2300ea87069dSBram Moolenaardef Test_for_loop_script_var() 2301ea87069dSBram Moolenaar # cannot use s:var in a :def function 2302ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2303ea87069dSBram Moolenaar 2304ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2305ea87069dSBram Moolenaar var lines =<< trim END 2306ea87069dSBram Moolenaar vim9script 2307ea87069dSBram Moolenaar var total = 0 2308ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2309ea87069dSBram Moolenaar total += s:var 2310ea87069dSBram Moolenaar endfor 2311ea87069dSBram Moolenaar assert_equal(6, total) 2312ea87069dSBram Moolenaar 2313ea87069dSBram Moolenaar total = 0 2314ea87069dSBram Moolenaar for var in [1, 2, 3] 2315ea87069dSBram Moolenaar total += var 2316ea87069dSBram Moolenaar endfor 2317ea87069dSBram Moolenaar assert_equal(6, total) 2318ea87069dSBram Moolenaar END 2319ea87069dSBram Moolenaarenddef 2320ea87069dSBram Moolenaar 2321792f786aSBram Moolenaardef Test_for_loop_unpack() 23224b8a0651SBram Moolenaar var lines =<< trim END 2323792f786aSBram Moolenaar var result = [] 2324792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2325792f786aSBram Moolenaar result->add(v1) 2326792f786aSBram Moolenaar result->add(v2) 2327792f786aSBram Moolenaar endfor 2328792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2329792f786aSBram Moolenaar 2330792f786aSBram Moolenaar result = [] 2331792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2332792f786aSBram Moolenaar result->add(v1) 2333792f786aSBram Moolenaar result->add(v2) 2334792f786aSBram Moolenaar result->add(v3) 2335792f786aSBram Moolenaar endfor 2336792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2337792f786aSBram Moolenaar 23384b8a0651SBram Moolenaar result = [] 23394b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 23404b8a0651SBram Moolenaar result->add(&ts) 23414b8a0651SBram Moolenaar result->add(&sw) 23424b8a0651SBram Moolenaar endfor 23434b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 23444b8a0651SBram Moolenaar 23454b8a0651SBram Moolenaar var slist: list<string> 23464b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 23474b8a0651SBram Moolenaar slist->add($LOOPVAR) 23484b8a0651SBram Moolenaar slist->add(@r) 23494b8a0651SBram Moolenaar slist->add(v:errmsg) 23504b8a0651SBram Moolenaar endfor 23514b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 23524b8a0651SBram Moolenaar 23534b8a0651SBram Moolenaar slist = [] 23544b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 23554b8a0651SBram Moolenaar slist->add(g:globalvar) 23564b8a0651SBram Moolenaar slist->add(b:bufvar) 23574b8a0651SBram Moolenaar slist->add(w:winvar) 23584b8a0651SBram Moolenaar slist->add(t:tabvar) 23594b8a0651SBram Moolenaar endfor 23604b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2361f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 23624b8a0651SBram Moolenaar END 23634b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 23644b8a0651SBram Moolenaar 23654b8a0651SBram Moolenaar lines =<< trim END 2366792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2367792f786aSBram Moolenaar echo v1 v2 2368792f786aSBram Moolenaar endfor 2369792f786aSBram Moolenaar END 2370792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2371792f786aSBram Moolenaar 2372792f786aSBram Moolenaar lines =<< trim END 2373792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2374792f786aSBram Moolenaar echo v1 v2 2375792f786aSBram Moolenaar endfor 2376792f786aSBram Moolenaar END 2377792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2378792f786aSBram Moolenaar 2379792f786aSBram Moolenaar lines =<< trim END 2380792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2381792f786aSBram Moolenaar echo v1 2382792f786aSBram Moolenaar endfor 2383792f786aSBram Moolenaar END 2384792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2385792f786aSBram Moolenaarenddef 2386792f786aSBram Moolenaar 2387c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2388c150c09eSBram Moolenaar var looped = 0 2389c150c09eSBram Moolenaar var cleanup = 0 2390c150c09eSBram Moolenaar for i in range(3) 2391c150c09eSBram Moolenaar looped += 1 2392c150c09eSBram Moolenaar try 2393c150c09eSBram Moolenaar eval [][0] 2394c150c09eSBram Moolenaar catch 2395c150c09eSBram Moolenaar continue 2396c150c09eSBram Moolenaar finally 2397c150c09eSBram Moolenaar cleanup += 1 2398c150c09eSBram Moolenaar endtry 2399c150c09eSBram Moolenaar endfor 2400c150c09eSBram Moolenaar assert_equal(3, looped) 2401c150c09eSBram Moolenaar assert_equal(3, cleanup) 2402c150c09eSBram Moolenaarenddef 2403c150c09eSBram Moolenaar 2404d0df1aacSBram Moolenaardef Test_while_loop() 2405cfcd011fSBram Moolenaar var result = '' 2406cfcd011fSBram Moolenaar var cnt = 0 2407d0df1aacSBram Moolenaar while cnt < 555 2408d0df1aacSBram Moolenaar if cnt == 3 2409d0df1aacSBram Moolenaar break 2410d0df1aacSBram Moolenaar endif 2411d0df1aacSBram Moolenaar cnt += 1 2412d0df1aacSBram Moolenaar if cnt == 2 2413d0df1aacSBram Moolenaar continue 2414d0df1aacSBram Moolenaar endif 2415d0df1aacSBram Moolenaar result ..= cnt .. '_' 2416d0df1aacSBram Moolenaar endwhile 2417d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2418dee37dc7SBram Moolenaar 2419dee37dc7SBram Moolenaar var s = '' 24200123cc1eSBram Moolenaar while s == 'x' #{comment} 2421dee37dc7SBram Moolenaar endwhile 2422d0df1aacSBram Moolenaarenddef 2423d0df1aacSBram Moolenaar 2424e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2425675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2426675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2427675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2428675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2429675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2430675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2431675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 24326628b7ebSBram Moolenaar 24336628b7ebSBram Moolenaar var lines =<< trim END 24346628b7ebSBram Moolenaar var s = '' 24356628b7ebSBram Moolenaar while s = '' 24366628b7ebSBram Moolenaar endwhile 24376628b7ebSBram Moolenaar END 24386628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2439bd5da371SBram Moolenaarenddef 2440bd5da371SBram Moolenaar 24419645e2d9SBram Moolenaardef Test_interrupt_loop() 2442cfcd011fSBram Moolenaar var caught = false 2443cfcd011fSBram Moolenaar var x = 0 244497acfc78SBram Moolenaar try 24459645e2d9SBram Moolenaar while 1 24469645e2d9SBram Moolenaar x += 1 24479645e2d9SBram Moolenaar if x == 100 24489645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 24499645e2d9SBram Moolenaar endif 24509645e2d9SBram Moolenaar endwhile 245197acfc78SBram Moolenaar catch 245297acfc78SBram Moolenaar caught = true 245397acfc78SBram Moolenaar assert_equal(100, x) 245497acfc78SBram Moolenaar endtry 245597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 245625859dd7SBram Moolenaar # consume the CTRL-C 245725859dd7SBram Moolenaar getchar(0) 24589645e2d9SBram Moolenaarenddef 245920431c9dSBram Moolenaar 24604fdae999SBram Moolenaardef Test_automatic_line_continuation() 2461cfcd011fSBram Moolenaar var mylist = [ 24624fdae999SBram Moolenaar 'one', 24634fdae999SBram Moolenaar 'two', 24644fdae999SBram Moolenaar 'three', 2465f5be8cdbSBram Moolenaar ] # comment 24664fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24674fdae999SBram Moolenaar 2468cfcd011fSBram Moolenaar var mydict = { 2469e0de171eSBram Moolenaar ['one']: 1, 2470e0de171eSBram Moolenaar ['two']: 2, 2471e0de171eSBram Moolenaar ['three']: 24724fdae999SBram Moolenaar 3, 2473f5be8cdbSBram Moolenaar } # comment 2474e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2475e0de171eSBram Moolenaar mydict = { 24762c330432SBram Moolenaar one: 1, # comment 24772c330432SBram Moolenaar two: # comment 24782c330432SBram Moolenaar 2, # comment 24792c330432SBram Moolenaar three: 3 # comment 24802c330432SBram Moolenaar } 2481e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2482e0de171eSBram Moolenaar mydict = { 24832c330432SBram Moolenaar one: 1, 24844fdae999SBram Moolenaar two: 24854fdae999SBram Moolenaar 2, 24862c330432SBram Moolenaar three: 3 24874fdae999SBram Moolenaar } 2488e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2489e6085c53SBram Moolenaar 2490e6085c53SBram Moolenaar assert_equal( 2491e6085c53SBram Moolenaar ['one', 'two', 'three'], 2492e6085c53SBram Moolenaar split('one two three') 2493e6085c53SBram Moolenaar ) 24944fdae999SBram Moolenaarenddef 24954fdae999SBram Moolenaar 24967a092245SBram Moolenaardef Test_vim9_comment() 24977a092245SBram Moolenaar CheckScriptSuccess([ 24987a092245SBram Moolenaar 'vim9script', 24997a092245SBram Moolenaar '# something', 250093f82cbeSBram Moolenaar '#something', 250193f82cbeSBram Moolenaar '#{something', 25027a092245SBram Moolenaar ]) 250393f82cbeSBram Moolenaar 250493f82cbeSBram Moolenaar split Xfile 250593f82cbeSBram Moolenaar CheckScriptSuccess([ 250693f82cbeSBram Moolenaar 'vim9script', 250793f82cbeSBram Moolenaar 'edit #something', 250893f82cbeSBram Moolenaar ]) 250993f82cbeSBram Moolenaar CheckScriptSuccess([ 251093f82cbeSBram Moolenaar 'vim9script', 251193f82cbeSBram Moolenaar 'edit #{something', 251293f82cbeSBram Moolenaar ]) 251393f82cbeSBram Moolenaar close 251493f82cbeSBram Moolenaar 25157a092245SBram Moolenaar CheckScriptFailure([ 25167a092245SBram Moolenaar 'vim9script', 25177a092245SBram Moolenaar ':# something', 25187a092245SBram Moolenaar ], 'E488:') 25197a092245SBram Moolenaar CheckScriptFailure([ 25207a092245SBram Moolenaar '# something', 25217a092245SBram Moolenaar ], 'E488:') 25227a092245SBram Moolenaar CheckScriptFailure([ 25237a092245SBram Moolenaar ':# something', 25247a092245SBram Moolenaar ], 'E488:') 25257a092245SBram Moolenaar 25264a8d9f2eSBram Moolenaar { # block start 25274a8d9f2eSBram Moolenaar } # block end 25284a8d9f2eSBram Moolenaar CheckDefFailure([ 25294a8d9f2eSBram Moolenaar '{# comment', 25304a8d9f2eSBram Moolenaar ], 'E488:') 25314a8d9f2eSBram Moolenaar CheckDefFailure([ 25324a8d9f2eSBram Moolenaar '{', 25334a8d9f2eSBram Moolenaar '}# comment', 25344a8d9f2eSBram Moolenaar ], 'E488:') 25354a8d9f2eSBram Moolenaar 25364a8d9f2eSBram Moolenaar echo "yes" # comment 25374a8d9f2eSBram Moolenaar CheckDefFailure([ 25384a8d9f2eSBram Moolenaar 'echo "yes"# comment', 25394a8d9f2eSBram Moolenaar ], 'E488:') 25407a092245SBram Moolenaar CheckScriptSuccess([ 25417a092245SBram Moolenaar 'vim9script', 25427a092245SBram Moolenaar 'echo "yes" # something', 25437a092245SBram Moolenaar ]) 25447a092245SBram Moolenaar CheckScriptFailure([ 25457a092245SBram Moolenaar 'vim9script', 25467a092245SBram Moolenaar 'echo "yes"# something', 25477a092245SBram Moolenaar ], 'E121:') 25487a092245SBram Moolenaar CheckScriptFailure([ 25497a092245SBram Moolenaar 'vim9script', 25507a092245SBram Moolenaar 'echo# something', 2551f8103f27SBram Moolenaar ], 'E1144:') 25527a092245SBram Moolenaar CheckScriptFailure([ 25537a092245SBram Moolenaar 'echo "yes" # something', 25547a092245SBram Moolenaar ], 'E121:') 25557a092245SBram Moolenaar 25564a8d9f2eSBram Moolenaar exe "echo" # comment 25574a8d9f2eSBram Moolenaar CheckDefFailure([ 25584a8d9f2eSBram Moolenaar 'exe "echo"# comment', 25594a8d9f2eSBram Moolenaar ], 'E488:') 25604a8d9f2eSBram Moolenaar CheckScriptSuccess([ 25614a8d9f2eSBram Moolenaar 'vim9script', 25624a8d9f2eSBram Moolenaar 'exe "echo" # something', 25634a8d9f2eSBram Moolenaar ]) 25644a8d9f2eSBram Moolenaar CheckScriptFailure([ 25654a8d9f2eSBram Moolenaar 'vim9script', 25664a8d9f2eSBram Moolenaar 'exe "echo"# something', 25674a8d9f2eSBram Moolenaar ], 'E121:') 25684a8d9f2eSBram Moolenaar CheckScriptFailure([ 25694a8d9f2eSBram Moolenaar 'vim9script', 25704a8d9f2eSBram Moolenaar 'exe# something', 2571f8103f27SBram Moolenaar ], 'E1144:') 25724a8d9f2eSBram Moolenaar CheckScriptFailure([ 25734a8d9f2eSBram Moolenaar 'exe "echo" # something', 25744a8d9f2eSBram Moolenaar ], 'E121:') 25754a8d9f2eSBram Moolenaar 25767a092245SBram Moolenaar CheckDefFailure([ 25777a092245SBram Moolenaar 'try# comment', 25787a092245SBram Moolenaar ' echo "yes"', 25797a092245SBram Moolenaar 'catch', 25807a092245SBram Moolenaar 'endtry', 2581f8103f27SBram Moolenaar ], 'E1144:') 25822c5ed4e3SBram Moolenaar CheckScriptFailure([ 25832c5ed4e3SBram Moolenaar 'vim9script', 25842c5ed4e3SBram Moolenaar 'try# comment', 25852c5ed4e3SBram Moolenaar 'echo "yes"', 2586f8103f27SBram Moolenaar ], 'E1144:') 25877a092245SBram Moolenaar CheckDefFailure([ 25887a092245SBram Moolenaar 'try', 2589a72cfb80SBram Moolenaar ' throw#comment', 2590a72cfb80SBram Moolenaar 'catch', 2591a72cfb80SBram Moolenaar 'endtry', 2592f8103f27SBram Moolenaar ], 'E1144:') 2593a72cfb80SBram Moolenaar CheckDefFailure([ 2594a72cfb80SBram Moolenaar 'try', 2595a72cfb80SBram Moolenaar ' throw "yes"#comment', 2596a72cfb80SBram Moolenaar 'catch', 2597a72cfb80SBram Moolenaar 'endtry', 2598a72cfb80SBram Moolenaar ], 'E488:') 2599a72cfb80SBram Moolenaar CheckDefFailure([ 2600a72cfb80SBram Moolenaar 'try', 26017a092245SBram Moolenaar ' echo "yes"', 26027a092245SBram Moolenaar 'catch# comment', 26037a092245SBram Moolenaar 'endtry', 2604f8103f27SBram Moolenaar ], 'E1144:') 26052c5ed4e3SBram Moolenaar CheckScriptFailure([ 26062c5ed4e3SBram Moolenaar 'vim9script', 26072c5ed4e3SBram Moolenaar 'try', 26082c5ed4e3SBram Moolenaar ' echo "yes"', 26092c5ed4e3SBram Moolenaar 'catch# comment', 26102c5ed4e3SBram Moolenaar 'endtry', 2611f8103f27SBram Moolenaar ], 'E1144:') 26122c5ed4e3SBram Moolenaar CheckDefFailure([ 26132c5ed4e3SBram Moolenaar 'try', 26142c5ed4e3SBram Moolenaar ' echo "yes"', 26152c5ed4e3SBram Moolenaar 'catch /pat/# comment', 26162c5ed4e3SBram Moolenaar 'endtry', 26172c5ed4e3SBram Moolenaar ], 'E488:') 26187a092245SBram Moolenaar CheckDefFailure([ 26197a092245SBram Moolenaar 'try', 26207a092245SBram Moolenaar 'echo "yes"', 26217a092245SBram Moolenaar 'catch', 26227a092245SBram Moolenaar 'endtry# comment', 2623f8103f27SBram Moolenaar ], 'E1144:') 26242c5ed4e3SBram Moolenaar CheckScriptFailure([ 26252c5ed4e3SBram Moolenaar 'vim9script', 26262c5ed4e3SBram Moolenaar 'try', 26272c5ed4e3SBram Moolenaar ' echo "yes"', 26282c5ed4e3SBram Moolenaar 'catch', 26292c5ed4e3SBram Moolenaar 'endtry# comment', 2630f8103f27SBram Moolenaar ], 'E1144:') 26312c5ed4e3SBram Moolenaar 26322c5ed4e3SBram Moolenaar CheckScriptSuccess([ 26332c5ed4e3SBram Moolenaar 'vim9script', 26342c5ed4e3SBram Moolenaar 'hi # comment', 26352c5ed4e3SBram Moolenaar ]) 26362c5ed4e3SBram Moolenaar CheckScriptFailure([ 26372c5ed4e3SBram Moolenaar 'vim9script', 26382c5ed4e3SBram Moolenaar 'hi# comment', 2639f8103f27SBram Moolenaar ], 'E1144:') 26401966c248SBram Moolenaar CheckScriptSuccess([ 26411966c248SBram Moolenaar 'vim9script', 26421966c248SBram Moolenaar 'hi Search # comment', 26431966c248SBram Moolenaar ]) 26441966c248SBram Moolenaar CheckScriptFailure([ 26451966c248SBram Moolenaar 'vim9script', 26461966c248SBram Moolenaar 'hi Search# comment', 26471966c248SBram Moolenaar ], 'E416:') 26481966c248SBram Moolenaar CheckScriptSuccess([ 26491966c248SBram Moolenaar 'vim9script', 26501966c248SBram Moolenaar 'hi link This Search # comment', 26511966c248SBram Moolenaar ]) 26521966c248SBram Moolenaar CheckScriptFailure([ 26531966c248SBram Moolenaar 'vim9script', 26541966c248SBram Moolenaar 'hi link This That# comment', 26551966c248SBram Moolenaar ], 'E413:') 26561966c248SBram Moolenaar CheckScriptSuccess([ 26571966c248SBram Moolenaar 'vim9script', 26581966c248SBram Moolenaar 'hi clear This # comment', 26591966c248SBram Moolenaar 'hi clear # comment', 26601966c248SBram Moolenaar ]) 2661f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2662f5be8cdbSBram Moolenaar # hi clear This# comment', 26631966c248SBram Moolenaar CheckScriptFailure([ 26641966c248SBram Moolenaar 'vim9script', 26651966c248SBram Moolenaar 'hi clear# comment', 26661966c248SBram Moolenaar ], 'E416:') 26671966c248SBram Moolenaar 26681966c248SBram Moolenaar CheckScriptSuccess([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'hi Group term=bold', 26711966c248SBram Moolenaar 'match Group /todo/ # comment', 26721966c248SBram Moolenaar ]) 26731966c248SBram Moolenaar CheckScriptFailure([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'hi Group term=bold', 26761966c248SBram Moolenaar 'match Group /todo/# comment', 26771966c248SBram Moolenaar ], 'E488:') 26781966c248SBram Moolenaar CheckScriptSuccess([ 26791966c248SBram Moolenaar 'vim9script', 26801966c248SBram Moolenaar 'match # comment', 26811966c248SBram Moolenaar ]) 26821966c248SBram Moolenaar CheckScriptFailure([ 26831966c248SBram Moolenaar 'vim9script', 26841966c248SBram Moolenaar 'match# comment', 2685f8103f27SBram Moolenaar ], 'E1144:') 26861966c248SBram Moolenaar CheckScriptSuccess([ 26871966c248SBram Moolenaar 'vim9script', 26881966c248SBram Moolenaar 'match none # comment', 26891966c248SBram Moolenaar ]) 26901966c248SBram Moolenaar CheckScriptFailure([ 26911966c248SBram Moolenaar 'vim9script', 26921966c248SBram Moolenaar 'match none# comment', 26931966c248SBram Moolenaar ], 'E475:') 26941966c248SBram Moolenaar 26951966c248SBram Moolenaar CheckScriptSuccess([ 26961966c248SBram Moolenaar 'vim9script', 26971966c248SBram Moolenaar 'menutrans clear # comment', 26981966c248SBram Moolenaar ]) 26991966c248SBram Moolenaar CheckScriptFailure([ 27001966c248SBram Moolenaar 'vim9script', 27011966c248SBram Moolenaar 'menutrans clear# comment text', 27021966c248SBram Moolenaar ], 'E474:') 27031966c248SBram Moolenaar 27041966c248SBram Moolenaar CheckScriptSuccess([ 27051966c248SBram Moolenaar 'vim9script', 27061966c248SBram Moolenaar 'syntax clear # comment', 27071966c248SBram Moolenaar ]) 27081966c248SBram Moolenaar CheckScriptFailure([ 27091966c248SBram Moolenaar 'vim9script', 27101966c248SBram Moolenaar 'syntax clear# comment text', 27111966c248SBram Moolenaar ], 'E28:') 27121966c248SBram Moolenaar CheckScriptSuccess([ 27131966c248SBram Moolenaar 'vim9script', 27141966c248SBram Moolenaar 'syntax keyword Word some', 27151966c248SBram Moolenaar 'syntax clear Word # comment', 27161966c248SBram Moolenaar ]) 27171966c248SBram Moolenaar CheckScriptFailure([ 27181966c248SBram Moolenaar 'vim9script', 27191966c248SBram Moolenaar 'syntax keyword Word some', 27201966c248SBram Moolenaar 'syntax clear Word# comment text', 27211966c248SBram Moolenaar ], 'E28:') 27221966c248SBram Moolenaar 27231966c248SBram Moolenaar CheckScriptSuccess([ 27241966c248SBram Moolenaar 'vim9script', 27251966c248SBram Moolenaar 'syntax list # comment', 27261966c248SBram Moolenaar ]) 27271966c248SBram Moolenaar CheckScriptFailure([ 27281966c248SBram Moolenaar 'vim9script', 27291966c248SBram Moolenaar 'syntax list# comment text', 27301966c248SBram Moolenaar ], 'E28:') 27311966c248SBram Moolenaar 27321966c248SBram Moolenaar CheckScriptSuccess([ 27331966c248SBram Moolenaar 'vim9script', 27341966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 27351966c248SBram Moolenaar ]) 27361966c248SBram Moolenaar CheckScriptFailure([ 27371966c248SBram Moolenaar 'vim9script', 27381966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 27391966c248SBram Moolenaar ], 'E475:') 27401966c248SBram Moolenaar 27411966c248SBram Moolenaar CheckScriptSuccess([ 27421966c248SBram Moolenaar 'vim9script', 27431966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 27441966c248SBram Moolenaar ]) 27451966c248SBram Moolenaar CheckScriptFailure([ 27461966c248SBram Moolenaar 'vim9script', 27471966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 27481966c248SBram Moolenaar ], 'E789:') 27491966c248SBram Moolenaar 27501966c248SBram Moolenaar CheckScriptSuccess([ 27511966c248SBram Moolenaar 'vim9script', 27521966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 27531966c248SBram Moolenaar ]) 27541966c248SBram Moolenaar CheckScriptFailure([ 27551966c248SBram Moolenaar 'vim9script', 27561966c248SBram Moolenaar 'syntax match Word /pat/# comment', 27571966c248SBram Moolenaar ], 'E402:') 27581966c248SBram Moolenaar 27591966c248SBram Moolenaar CheckScriptSuccess([ 27601966c248SBram Moolenaar 'vim9script', 27611966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 27621966c248SBram Moolenaar ]) 27631966c248SBram Moolenaar CheckScriptFailure([ 27641966c248SBram Moolenaar 'vim9script', 27651966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27661966c248SBram Moolenaar ], 'E475:') 27671966c248SBram Moolenaar CheckScriptFailure([ 27681966c248SBram Moolenaar 'vim9script', 27691966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27701966c248SBram Moolenaar ], 'E406:') 27711966c248SBram Moolenaar CheckScriptFailure([ 27721966c248SBram Moolenaar 'vim9script', 27731966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27741966c248SBram Moolenaar ], 'E475:') 27751966c248SBram Moolenaar 27761966c248SBram Moolenaar CheckScriptSuccess([ 27771966c248SBram Moolenaar 'vim9script', 27781966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27791966c248SBram Moolenaar ]) 27801966c248SBram Moolenaar CheckScriptFailure([ 27811966c248SBram Moolenaar 'vim9script', 27821966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2783d032f34aSBram Moolenaar ], 'E402:') 27841966c248SBram Moolenaar 27851966c248SBram Moolenaar CheckScriptSuccess([ 27861966c248SBram Moolenaar 'vim9script', 27871966c248SBram Moolenaar 'syntax sync # comment', 27881966c248SBram Moolenaar ]) 27891966c248SBram Moolenaar CheckScriptFailure([ 27901966c248SBram Moolenaar 'vim9script', 27911966c248SBram Moolenaar 'syntax sync# comment', 27921966c248SBram Moolenaar ], 'E404:') 27931966c248SBram Moolenaar CheckScriptSuccess([ 27941966c248SBram Moolenaar 'vim9script', 27951966c248SBram Moolenaar 'syntax sync ccomment # comment', 27961966c248SBram Moolenaar ]) 27971966c248SBram Moolenaar CheckScriptFailure([ 27981966c248SBram Moolenaar 'vim9script', 27991966c248SBram Moolenaar 'syntax sync ccomment# comment', 28001966c248SBram Moolenaar ], 'E404:') 28011966c248SBram Moolenaar 28021966c248SBram Moolenaar CheckScriptSuccess([ 28031966c248SBram Moolenaar 'vim9script', 28041966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 28051966c248SBram Moolenaar ]) 28061966c248SBram Moolenaar CheckScriptFailure([ 28071966c248SBram Moolenaar 'vim9script', 28081966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 28091966c248SBram Moolenaar ], 'E475:') 2810a72cfb80SBram Moolenaar 2811a72cfb80SBram Moolenaar CheckScriptSuccess([ 2812a72cfb80SBram Moolenaar 'vim9script', 2813a72cfb80SBram Moolenaar 'command Echo echo # comment', 2814a72cfb80SBram Moolenaar 'command Echo # comment', 28152d870f8dSBram Moolenaar 'delcommand Echo', 2816a72cfb80SBram Moolenaar ]) 2817a72cfb80SBram Moolenaar CheckScriptFailure([ 2818a72cfb80SBram Moolenaar 'vim9script', 2819a72cfb80SBram Moolenaar 'command Echo echo# comment', 2820a72cfb80SBram Moolenaar 'Echo', 2821f8103f27SBram Moolenaar ], 'E1144:') 28222d870f8dSBram Moolenaar delcommand Echo 282370249ee8SBram Moolenaar 282470249ee8SBram Moolenaar var curdir = getcwd() 282570249ee8SBram Moolenaar CheckScriptSuccess([ 282670249ee8SBram Moolenaar 'command Echo cd " comment', 282770249ee8SBram Moolenaar 'Echo', 282870249ee8SBram Moolenaar 'delcommand Echo', 282970249ee8SBram Moolenaar ]) 283070249ee8SBram Moolenaar CheckScriptSuccess([ 2831090728adSBram Moolenaar 'vim9script', 283270249ee8SBram Moolenaar 'command Echo cd # comment', 283370249ee8SBram Moolenaar 'Echo', 283470249ee8SBram Moolenaar 'delcommand Echo', 283570249ee8SBram Moolenaar ]) 283670249ee8SBram Moolenaar CheckScriptFailure([ 283770249ee8SBram Moolenaar 'vim9script', 283870249ee8SBram Moolenaar 'command Echo cd " comment', 283970249ee8SBram Moolenaar 'Echo', 284070249ee8SBram Moolenaar ], 'E344:') 284170249ee8SBram Moolenaar delcommand Echo 284270249ee8SBram Moolenaar chdir(curdir) 284370249ee8SBram Moolenaar 2844a72cfb80SBram Moolenaar CheckScriptFailure([ 2845a72cfb80SBram Moolenaar 'vim9script', 2846a72cfb80SBram Moolenaar 'command Echo# comment', 2847a72cfb80SBram Moolenaar ], 'E182:') 2848a72cfb80SBram Moolenaar CheckScriptFailure([ 2849a72cfb80SBram Moolenaar 'vim9script', 2850a72cfb80SBram Moolenaar 'command Echo echo', 2851a72cfb80SBram Moolenaar 'command Echo# comment', 2852a72cfb80SBram Moolenaar ], 'E182:') 28532d870f8dSBram Moolenaar delcommand Echo 2854a72cfb80SBram Moolenaar 2855a72cfb80SBram Moolenaar CheckScriptSuccess([ 2856a72cfb80SBram Moolenaar 'vim9script', 2857a72cfb80SBram Moolenaar 'function # comment', 2858a72cfb80SBram Moolenaar ]) 2859a72cfb80SBram Moolenaar CheckScriptFailure([ 2860a72cfb80SBram Moolenaar 'vim9script', 28619898107fSBram Moolenaar 'function " comment', 28629898107fSBram Moolenaar ], 'E129:') 28639898107fSBram Moolenaar CheckScriptFailure([ 28649898107fSBram Moolenaar 'vim9script', 2865a72cfb80SBram Moolenaar 'function# comment', 2866f8103f27SBram Moolenaar ], 'E1144:') 2867a72cfb80SBram Moolenaar CheckScriptSuccess([ 2868a72cfb80SBram Moolenaar 'vim9script', 2869a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2870a72cfb80SBram Moolenaar ]) 2871a72cfb80SBram Moolenaar CheckScriptFailure([ 2872a72cfb80SBram Moolenaar 'vim9script', 2873a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2874a72cfb80SBram Moolenaar ], 'E488:') 2875a72cfb80SBram Moolenaar 2876a72cfb80SBram Moolenaar CheckScriptSuccess([ 2877a72cfb80SBram Moolenaar 'vim9script', 28784c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2879a72cfb80SBram Moolenaar 'endfunc', 28804c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2881a72cfb80SBram Moolenaar ]) 2882a72cfb80SBram Moolenaar CheckScriptFailure([ 2883a72cfb80SBram Moolenaar 'vim9script', 28844c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2885a72cfb80SBram Moolenaar 'endfunc', 28864c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2887a72cfb80SBram Moolenaar ], 'E488:') 2888a72cfb80SBram Moolenaar 2889a72cfb80SBram Moolenaar CheckScriptSuccess([ 2890a72cfb80SBram Moolenaar 'vim9script', 2891a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2892a72cfb80SBram Moolenaar ]) 2893a72cfb80SBram Moolenaar CheckScriptFailure([ 2894a72cfb80SBram Moolenaar 'vim9script', 2895a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2896a72cfb80SBram Moolenaar ], 'E488:') 2897e7e4838fSBram Moolenaar 2898e7e4838fSBram Moolenaar CheckScriptFailure([ 2899e7e4838fSBram Moolenaar 'def Test() " comment', 2900e7e4838fSBram Moolenaar 'enddef', 2901e7e4838fSBram Moolenaar ], 'E488:') 2902e7e4838fSBram Moolenaar CheckScriptFailure([ 2903e7e4838fSBram Moolenaar 'vim9script', 2904e7e4838fSBram Moolenaar 'def Test() " comment', 2905e7e4838fSBram Moolenaar 'enddef', 2906e7e4838fSBram Moolenaar ], 'E488:') 2907e7e4838fSBram Moolenaar 2908e7e4838fSBram Moolenaar CheckScriptSuccess([ 2909e7e4838fSBram Moolenaar 'func Test() " comment', 2910e7e4838fSBram Moolenaar 'endfunc', 29112d870f8dSBram Moolenaar 'delfunc Test', 2912e7e4838fSBram Moolenaar ]) 29139898107fSBram Moolenaar CheckScriptSuccess([ 2914e7e4838fSBram Moolenaar 'vim9script', 2915e7e4838fSBram Moolenaar 'func Test() " comment', 2916e7e4838fSBram Moolenaar 'endfunc', 29179898107fSBram Moolenaar ]) 2918e7e4838fSBram Moolenaar 2919e7e4838fSBram Moolenaar CheckScriptSuccess([ 2920e7e4838fSBram Moolenaar 'def Test() # comment', 2921e7e4838fSBram Moolenaar 'enddef', 2922e7e4838fSBram Moolenaar ]) 2923e7e4838fSBram Moolenaar CheckScriptFailure([ 2924e7e4838fSBram Moolenaar 'func Test() # comment', 2925e7e4838fSBram Moolenaar 'endfunc', 2926e7e4838fSBram Moolenaar ], 'E488:') 29272c5ed4e3SBram Moolenaarenddef 29282c5ed4e3SBram Moolenaar 29292c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 29302c5ed4e3SBram Moolenaar CheckCanRunGui 29312c5ed4e3SBram Moolenaar 29322c5ed4e3SBram Moolenaar CheckScriptFailure([ 29332c5ed4e3SBram Moolenaar 'vim9script', 29342c5ed4e3SBram Moolenaar 'gui#comment' 2935f8103f27SBram Moolenaar ], 'E1144:') 29362c5ed4e3SBram Moolenaar CheckScriptFailure([ 29372c5ed4e3SBram Moolenaar 'vim9script', 29382c5ed4e3SBram Moolenaar 'gui -f#comment' 29392c5ed4e3SBram Moolenaar ], 'E499:') 29407a092245SBram Moolenaarenddef 29417a092245SBram Moolenaar 2942a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 29436797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 29446797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2945a26b9700SBram Moolenaar 2946a26b9700SBram Moolenaar edit test.vim 2947a26b9700SBram Moolenaar doautocmd TabEnter #comment 2948a26b9700SBram Moolenaar assert_equal(1, g:entered) 2949a26b9700SBram Moolenaar 2950a26b9700SBram Moolenaar doautocmd TabEnter f.x 2951a26b9700SBram Moolenaar assert_equal(2, g:entered) 2952a26b9700SBram Moolenaar 2953a26b9700SBram Moolenaar g:entered = 0 2954a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2955a26b9700SBram Moolenaar assert_equal(2, g:entered) 2956a26b9700SBram Moolenaar 2957a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2958a26b9700SBram Moolenaar 2959a26b9700SBram Moolenaar au! TabEnter 2960a26b9700SBram Moolenaar unlet g:entered 2961d72c1bf0SBram Moolenaar 2962d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2963d72c1bf0SBram Moolenaar 'vim9script', 29646797966dSBram Moolenaar 'g:var = 123', 2965e55b1c09SBram Moolenaar 'b:var = 456', 2966e55b1c09SBram Moolenaar 'w:var = 777', 2967e55b1c09SBram Moolenaar 't:var = 888', 2968d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2969d72c1bf0SBram Moolenaar ]) 2970d72c1bf0SBram Moolenaar 2971d72c1bf0SBram Moolenaar CheckScriptFailure([ 2972d72c1bf0SBram Moolenaar 'vim9script', 2973cfcd011fSBram Moolenaar 'let var = 123', 2974cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2975cfcd011fSBram Moolenaar 2976cfcd011fSBram Moolenaar CheckScriptFailure([ 2977cfcd011fSBram Moolenaar 'vim9script', 2978cfcd011fSBram Moolenaar 'var g:var = 123', 2979e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2980e55b1c09SBram Moolenaar 2981e55b1c09SBram Moolenaar CheckScriptFailure([ 2982e55b1c09SBram Moolenaar 'vim9script', 2983cfcd011fSBram Moolenaar 'var b:var = 123', 2984e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2985e55b1c09SBram Moolenaar 2986e55b1c09SBram Moolenaar CheckScriptFailure([ 2987e55b1c09SBram Moolenaar 'vim9script', 2988cfcd011fSBram Moolenaar 'var w:var = 123', 2989e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2990e55b1c09SBram Moolenaar 2991e55b1c09SBram Moolenaar CheckScriptFailure([ 2992e55b1c09SBram Moolenaar 'vim9script', 2993cfcd011fSBram Moolenaar 'var t:var = 123', 2994e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2995e55b1c09SBram Moolenaar 2996e55b1c09SBram Moolenaar CheckScriptFailure([ 2997e55b1c09SBram Moolenaar 'vim9script', 2998cfcd011fSBram Moolenaar 'var v:version = 123', 2999e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3000e55b1c09SBram Moolenaar 3001e55b1c09SBram Moolenaar CheckScriptFailure([ 3002e55b1c09SBram Moolenaar 'vim9script', 3003cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3004e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 30056797966dSBram Moolenaar 30066797966dSBram Moolenaar CheckScriptFailure([ 30076797966dSBram Moolenaar 'vim9script', 30086797966dSBram Moolenaar 'g:var = 123', 300932e35117SBram Moolenaar 'unlet g:var# comment1', 3010d72c1bf0SBram Moolenaar ], 'E108:') 3011d72c1bf0SBram Moolenaar 3012d72c1bf0SBram Moolenaar CheckScriptFailure([ 3013d72c1bf0SBram Moolenaar 'let g:var = 123', 3014d72c1bf0SBram Moolenaar 'unlet g:var # something', 3015d72c1bf0SBram Moolenaar ], 'E488:') 3016faac4104SBram Moolenaar 3017faac4104SBram Moolenaar CheckScriptSuccess([ 3018faac4104SBram Moolenaar 'vim9script', 301932e35117SBram Moolenaar 'if 1 # comment2', 3020faac4104SBram Moolenaar ' echo "yes"', 3021faac4104SBram Moolenaar 'elseif 2 #comment', 3022faac4104SBram Moolenaar ' echo "no"', 3023faac4104SBram Moolenaar 'endif', 3024faac4104SBram Moolenaar ]) 3025faac4104SBram Moolenaar 3026faac4104SBram Moolenaar CheckScriptFailure([ 3027faac4104SBram Moolenaar 'vim9script', 302832e35117SBram Moolenaar 'if 1# comment3', 3029faac4104SBram Moolenaar ' echo "yes"', 3030faac4104SBram Moolenaar 'endif', 3031faac4104SBram Moolenaar ], 'E15:') 3032faac4104SBram Moolenaar 3033faac4104SBram Moolenaar CheckScriptFailure([ 3034faac4104SBram Moolenaar 'vim9script', 303532e35117SBram Moolenaar 'if 0 # comment4', 3036faac4104SBram Moolenaar ' echo "yes"', 3037faac4104SBram Moolenaar 'elseif 2#comment', 3038faac4104SBram Moolenaar ' echo "no"', 3039faac4104SBram Moolenaar 'endif', 3040faac4104SBram Moolenaar ], 'E15:') 3041faac4104SBram Moolenaar 3042faac4104SBram Moolenaar CheckScriptSuccess([ 3043faac4104SBram Moolenaar 'vim9script', 3044cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3045faac4104SBram Moolenaar ]) 3046faac4104SBram Moolenaar 3047faac4104SBram Moolenaar CheckScriptFailure([ 3048faac4104SBram Moolenaar 'vim9script', 3049cfcd011fSBram Moolenaar 'var v = 1# comment6', 305032e35117SBram Moolenaar ], 'E15:') 3051faac4104SBram Moolenaar 3052faac4104SBram Moolenaar CheckScriptSuccess([ 3053faac4104SBram Moolenaar 'vim9script', 3054faac4104SBram Moolenaar 'new' 3055d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3056df069eecSBram Moolenaar ':$', 3057faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3058faac4104SBram Moolenaar 'bwipe!', 3059faac4104SBram Moolenaar ]) 3060faac4104SBram Moolenaar 3061f5be8cdbSBram Moolenaar CheckScriptFailure([ 3062f5be8cdbSBram Moolenaar 'vim9script', 3063f5be8cdbSBram Moolenaar 'new' 3064d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3065f5be8cdbSBram Moolenaar ':$', 3066f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3067f5be8cdbSBram Moolenaar 'bwipe!', 3068f5be8cdbSBram Moolenaar ], 'E488:') 3069f5be8cdbSBram Moolenaar 3070f5be8cdbSBram Moolenaar CheckScriptFailure([ 3071f5be8cdbSBram Moolenaar 'vim9script', 3072f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3073f5be8cdbSBram Moolenaar ], 'E477:') 3074a26b9700SBram Moolenaarenddef 3075a26b9700SBram Moolenaar 30767e5bd91dSBram Moolenaardef Test_finish() 3077cfcd011fSBram Moolenaar var lines =<< trim END 30787e5bd91dSBram Moolenaar vim9script 30796797966dSBram Moolenaar g:res = 'one' 30807e5bd91dSBram Moolenaar if v:false | finish | endif 30816797966dSBram Moolenaar g:res = 'two' 30827e5bd91dSBram Moolenaar finish 30836797966dSBram Moolenaar g:res = 'three' 30847e5bd91dSBram Moolenaar END 30857e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 30867e5bd91dSBram Moolenaar source Xfinished 30877e5bd91dSBram Moolenaar assert_equal('two', g:res) 30887e5bd91dSBram Moolenaar 30897e5bd91dSBram Moolenaar unlet g:res 30907e5bd91dSBram Moolenaar delete('Xfinished') 30917e5bd91dSBram Moolenaarenddef 30927e5bd91dSBram Moolenaar 3093a5d0077eSBram Moolenaardef Test_forward_declaration() 3094cfcd011fSBram Moolenaar var lines =<< trim END 3095a5d0077eSBram Moolenaar vim9script 3096a5d0077eSBram Moolenaar def GetValue(): string 3097a5d0077eSBram Moolenaar return theVal 3098a5d0077eSBram Moolenaar enddef 3099cfcd011fSBram Moolenaar var theVal = 'something' 3100822ba247SBram Moolenaar g:initVal = GetValue() 3101a5d0077eSBram Moolenaar theVal = 'else' 3102a5d0077eSBram Moolenaar g:laterVal = GetValue() 3103a5d0077eSBram Moolenaar END 3104a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3105a5d0077eSBram Moolenaar source Xforward 3106a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3107a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3108a5d0077eSBram Moolenaar 3109a5d0077eSBram Moolenaar unlet g:initVal 3110a5d0077eSBram Moolenaar unlet g:laterVal 3111a5d0077eSBram Moolenaar delete('Xforward') 3112a5d0077eSBram Moolenaarenddef 3113a5d0077eSBram Moolenaar 31149721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3115a6294955SBram Moolenaar var vim9_lines =<< trim END 3116a6294955SBram Moolenaar vim9script 3117a6294955SBram Moolenaar var local = 'local' 3118a6294955SBram Moolenaar g:global = 'global' 3119a6294955SBram Moolenaar export var exported = 'exported' 3120a6294955SBram Moolenaar export def GetText(): string 3121a6294955SBram Moolenaar return 'text' 3122a6294955SBram Moolenaar enddef 3123a6294955SBram Moolenaar END 3124a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3125a6294955SBram Moolenaar 3126cfcd011fSBram Moolenaar var legacy_lines =<< trim END 31279721fb4eSBram Moolenaar source Xvim9_script.vim 31289721fb4eSBram Moolenaar 31299721fb4eSBram Moolenaar call assert_false(exists('local')) 31309721fb4eSBram Moolenaar call assert_false(exists('exported')) 31319721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 31329721fb4eSBram Moolenaar call assert_equal('global', global) 31339721fb4eSBram Moolenaar call assert_equal('global', g:global) 31349721fb4eSBram Moolenaar 31359721fb4eSBram Moolenaar " imported variable becomes script-local 31369721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 31379721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 31389721fb4eSBram Moolenaar call assert_false(exists('exported')) 31399721fb4eSBram Moolenaar 31409721fb4eSBram Moolenaar " imported function becomes script-local 31419721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 31429721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 31439721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 31449721fb4eSBram Moolenaar END 31459721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 31469721fb4eSBram Moolenaar 31479721fb4eSBram Moolenaar source Xlegacy_script.vim 31489721fb4eSBram Moolenaar assert_equal('global', g:global) 3149f5be8cdbSBram Moolenaar unlet g:global 31509721fb4eSBram Moolenaar 31519721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 31529721fb4eSBram Moolenaar delete('Xvim9_script.vim') 31539721fb4eSBram Moolenaarenddef 3154a5d0077eSBram Moolenaar 31557d699701SBram Moolenaarfunc Test_vim9script_not_global() 31567d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 31577d699701SBram Moolenaar let vim9lines =<< trim END 31587d699701SBram Moolenaar vim9script 3159cfcd011fSBram Moolenaar var name = 'local' 31607d699701SBram Moolenaar func TheFunc() 31617d699701SBram Moolenaar echo 'local' 31627d699701SBram Moolenaar endfunc 31637d699701SBram Moolenaar def DefFunc() 31647d699701SBram Moolenaar echo 'local' 31657d699701SBram Moolenaar enddef 31667d699701SBram Moolenaar END 31677d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31687d699701SBram Moolenaar source Xvim9script.vim 31697d699701SBram Moolenaar try 31707d699701SBram Moolenaar echo g:var 31717d699701SBram Moolenaar assert_report('did not fail') 31727d699701SBram Moolenaar catch /E121:/ 31737d699701SBram Moolenaar " caught 31747d699701SBram Moolenaar endtry 31757d699701SBram Moolenaar try 31767d699701SBram Moolenaar call TheFunc() 31777d699701SBram Moolenaar assert_report('did not fail') 31787d699701SBram Moolenaar catch /E117:/ 31797d699701SBram Moolenaar " caught 31807d699701SBram Moolenaar endtry 31817d699701SBram Moolenaar try 31827d699701SBram Moolenaar call DefFunc() 31837d699701SBram Moolenaar assert_report('did not fail') 31847d699701SBram Moolenaar catch /E117:/ 31857d699701SBram Moolenaar " caught 31867d699701SBram Moolenaar endtry 31877d699701SBram Moolenaar 318825859dd7SBram Moolenaar call delete('Xvim9script.vim') 31897d699701SBram Moolenaarendfunc 31907d699701SBram Moolenaar 3191eeb27bfeSBram Moolenaardef Test_vim9_copen() 3192eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3193eeb27bfeSBram Moolenaar copen 3194eeb27bfeSBram Moolenaar quit 3195eeb27bfeSBram Moolenaarenddef 3196eeb27bfeSBram Moolenaar 319703290b84SBram Moolenaar" test using an auto-loaded function and variable 31982d6b20d6SBram Moolenaardef Test_vim9_autoload() 3199cfcd011fSBram Moolenaar var lines =<< trim END 32002d6b20d6SBram Moolenaar vim9script 320103290b84SBram Moolenaar def some#gettest(): string 320203290b84SBram Moolenaar return 'test' 320303290b84SBram Moolenaar enddef 320403290b84SBram Moolenaar g:some#name = 'name' 3205e3ffcd99SBram Moolenaar 3206e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3207e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3208e3ffcd99SBram Moolenaar enddef 320903290b84SBram Moolenaar END 321003290b84SBram Moolenaar 321103290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 321203290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 321303290b84SBram Moolenaar var save_rtp = &rtp 321403290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 321503290b84SBram Moolenaar 321603290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 321703290b84SBram Moolenaar assert_equal('name', g:some#name) 321803290b84SBram Moolenaar g:some#other = 'other' 321903290b84SBram Moolenaar assert_equal('other', g:some#other) 322003290b84SBram Moolenaar 3221e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3222e3ffcd99SBram Moolenaar 322317f700acSBram Moolenaar # upper case script name works 322417f700acSBram Moolenaar lines =<< trim END 322517f700acSBram Moolenaar vim9script 322617f700acSBram Moolenaar def Other#getOther(): string 322717f700acSBram Moolenaar return 'other' 322817f700acSBram Moolenaar enddef 322917f700acSBram Moolenaar END 323017f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 323117f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 323217f700acSBram Moolenaar 323303290b84SBram Moolenaar delete('Xdir', 'rf') 323403290b84SBram Moolenaar &rtp = save_rtp 323503290b84SBram Moolenaarenddef 323603290b84SBram Moolenaar 323703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 323803290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 323903290b84SBram Moolenaar var lines =<< trim END 324003290b84SBram Moolenaar vim9script 32412d6b20d6SBram Moolenaar def foo#test() 32422d6b20d6SBram Moolenaar echomsg getreg('"') 32432d6b20d6SBram Moolenaar enddef 32442d6b20d6SBram Moolenaar END 32452d6b20d6SBram Moolenaar 32462d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 32472d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3248cfcd011fSBram Moolenaar var save_rtp = &rtp 32492d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 32502d6b20d6SBram Moolenaar augroup test 32512d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 32522d6b20d6SBram Moolenaar augroup END 32532d6b20d6SBram Moolenaar 32542d6b20d6SBram Moolenaar normal Y 32552d6b20d6SBram Moolenaar 32562d6b20d6SBram Moolenaar augroup test 32572d6b20d6SBram Moolenaar autocmd! 32582d6b20d6SBram Moolenaar augroup END 32592d6b20d6SBram Moolenaar delete('Xdir', 'rf') 32602d6b20d6SBram Moolenaar &rtp = save_rtp 32612d6b20d6SBram Moolenaarenddef 32622d6b20d6SBram Moolenaar 326377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 326477e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3265cfcd011fSBram Moolenaar var lines =<< trim END 326677e5dcc3SBram Moolenaar vim9script 326777e5dcc3SBram Moolenaar def crash#func() 326877e5dcc3SBram Moolenaar try 326977e5dcc3SBram Moolenaar for x in List() 327077e5dcc3SBram Moolenaar endfor 327177e5dcc3SBram Moolenaar catch 327277e5dcc3SBram Moolenaar endtry 327377e5dcc3SBram Moolenaar g:ok = true 327477e5dcc3SBram Moolenaar enddef 327577e5dcc3SBram Moolenaar fu List() 327677e5dcc3SBram Moolenaar invalid 327777e5dcc3SBram Moolenaar endfu 327877e5dcc3SBram Moolenaar try 327948e11c10SBram Moolenaar alsoinvalid 328077e5dcc3SBram Moolenaar catch /wontmatch/ 328177e5dcc3SBram Moolenaar endtry 328277e5dcc3SBram Moolenaar END 328377e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 328477e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 328577e5dcc3SBram Moolenaar 328677e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 328777e5dcc3SBram Moolenaar lines =<< trim END 328877e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 328977e5dcc3SBram Moolenaar call crash#func() 329077e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 32919c4f5520SBram Moolenaar qall! 329277e5dcc3SBram Moolenaar END 329377e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 329477e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 329577e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 329677e5dcc3SBram Moolenaar 329777e5dcc3SBram Moolenaar delete('Xdidit') 329877e5dcc3SBram Moolenaar delete('Xscript') 329977e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 330003290b84SBram Moolenaar 330103290b84SBram Moolenaar lines =<< trim END 330203290b84SBram Moolenaar vim9script 330303290b84SBram Moolenaar var foo#bar = 'asdf' 330403290b84SBram Moolenaar END 330503290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 330677e5dcc3SBram Moolenaarenddef 330777e5dcc3SBram Moolenaar 330881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 330981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 331081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3311cfcd011fSBram Moolenaar var lines =<< trim END 331281e17fbeSBram Moolenaar let s:counter = 1 331381e17fbeSBram Moolenaar def s:Func() 331481e17fbeSBram Moolenaar au! CursorHold 331581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 331681e17fbeSBram Moolenaar enddef 331781e17fbeSBram Moolenaar call s:Func() 331881e17fbeSBram Moolenaar doau CursorHold 331981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 332081e17fbeSBram Moolenaar au! CursorHold 332181e17fbeSBram Moolenaar END 332281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 332381e17fbeSBram Moolenaarenddef 332481e17fbeSBram Moolenaar 33253896a105SBram Moolenaardef Test_cmdline_win() 33263896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 33273896a105SBram Moolenaar # the command line window. 33283896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3329cfcd011fSBram Moolenaar var export_lines =<< trim END 33303896a105SBram Moolenaar vim9script 3331cfcd011fSBram Moolenaar export var That = 'yes' 33323896a105SBram Moolenaar END 33333896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3334cfcd011fSBram Moolenaar var import_lines =<< trim END 33353896a105SBram Moolenaar vim9script 33363896a105SBram Moolenaar import That from './Xexport.vim' 33373896a105SBram Moolenaar END 33383896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3339cfcd011fSBram Moolenaar var save_rtp = &rtp 33403896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 33413896a105SBram Moolenaar syntax on 33423896a105SBram Moolenaar augroup CmdWin 33433896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 33443896a105SBram Moolenaar augroup END 33453896a105SBram Moolenaar # this will open and also close the cmdline window 33463896a105SBram Moolenaar feedkeys('q:', 'xt') 33473896a105SBram Moolenaar assert_equal('yes', g:got_there) 33483896a105SBram Moolenaar 33493896a105SBram Moolenaar augroup CmdWin 33503896a105SBram Moolenaar au! 33513896a105SBram Moolenaar augroup END 33523896a105SBram Moolenaar &rtp = save_rtp 33533896a105SBram Moolenaar delete('rtp', 'rf') 33543896a105SBram Moolenaarenddef 33553896a105SBram Moolenaar 3356e3d4685fSBram Moolenaardef Test_invalid_sid() 3357e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 335825859dd7SBram Moolenaar 33599c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3360d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3361e3d4685fSBram Moolenaar endif 3362e3d4685fSBram Moolenaar delete('Xdidit') 3363e3d4685fSBram Moolenaarenddef 3364e3d4685fSBram Moolenaar 33659ec7026fSBram Moolenaardef Test_restoring_cpo() 33669ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 33679ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 33689ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 33699ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 33709ec7026fSBram Moolenaar endif 33719ec7026fSBram Moolenaar delete('Xsourced') 33729ec7026fSBram Moolenaar delete('Xclose') 3373090728adSBram Moolenaar delete('Xdone') 33740123cc1eSBram Moolenaar 33750123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 33760123cc1eSBram Moolenaar set cpo=aABceFsMny> 33770123cc1eSBram Moolenaar edit XanotherScript 33780123cc1eSBram Moolenaar so % 33790123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 33800123cc1eSBram Moolenaar :1del 33810123cc1eSBram Moolenaar w 33820123cc1eSBram Moolenaar so % 33830123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 33840123cc1eSBram Moolenaar 33850123cc1eSBram Moolenaar delete('XanotherScript') 33860123cc1eSBram Moolenaar set cpo&vim 33879ec7026fSBram Moolenaarenddef 33889ec7026fSBram Moolenaar 3389ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3390ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 339137294bd6SBram Moolenaar CheckScreendump 3392ffb7dcdbSBram Moolenaar CheckFeature timers 339337294bd6SBram Moolenaar 3394ffb7dcdbSBram Moolenaar let lines =<< trim END 339537294bd6SBram Moolenaar vim9script 339637294bd6SBram Moolenaar def script#func() 339737294bd6SBram Moolenaar enddef 339837294bd6SBram Moolenaar END 3399ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3400ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 340137294bd6SBram Moolenaar 3402ffb7dcdbSBram Moolenaar let lines =<< trim END 340337294bd6SBram Moolenaar vim9script 340437294bd6SBram Moolenaar set cpo+=M 340537294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 340637294bd6SBram Moolenaar au CmdlineEnter : ++once timer_start(0, () => script#func()) 340737294bd6SBram Moolenaar setline(1, 'some text') 340837294bd6SBram Moolenaar END 3409ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3410ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3411ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3412ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 341337294bd6SBram Moolenaar 3414ffb7dcdbSBram Moolenaar " clean up 3415ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3416ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3417ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3418ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3419ffb7dcdbSBram Moolenaarendfunc 342037294bd6SBram Moolenaar 34219ec7026fSBram Moolenaar 3422f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3423cfcd011fSBram Moolenaar var lines =<< trim END 3424cfcd011fSBram Moolenaar var name: any 3425cfcd011fSBram Moolenaar assert_equal(0, name) 3426f0afd9e1SBram Moolenaar END 3427f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3428f0afd9e1SBram Moolenaarenddef 3429f0afd9e1SBram Moolenaar 34307e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 343158dbef33SBram Moolenaar CheckRunVimInTerminal 343258dbef33SBram Moolenaar 34337e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 34347e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 34357e9210eaSBram Moolenaarendfunc 34367e9210eaSBram Moolenaar 34377e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 34389c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3439cfcd011fSBram Moolenaar var lines =<< trim END 34409c4f5520SBram Moolenaar func CheckAndQuit() 34419c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 34429c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 34439c4f5520SBram Moolenaar endfunc 34449c4f5520SBram Moolenaar END 34459c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 34469c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3447e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 34489c4f5520SBram Moolenaar # define Afunc() on the command line 34499c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 34509c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 34512949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 34529c4f5520SBram Moolenaar 34539c4f5520SBram Moolenaar call StopVimInTerminal(buf) 34549c4f5520SBram Moolenaar delete('XcallFunc') 34559c4f5520SBram Moolenaar delete('Xdidcmd') 34569c4f5520SBram Moolenaarenddef 34579c4f5520SBram Moolenaar 3458fcdc5d83SBram Moolenaardef Test_script_var_scope() 3459fcdc5d83SBram Moolenaar var lines =<< trim END 3460fcdc5d83SBram Moolenaar vim9script 3461fcdc5d83SBram Moolenaar if true 3462fcdc5d83SBram Moolenaar if true 3463fcdc5d83SBram Moolenaar var one = 'one' 3464fcdc5d83SBram Moolenaar echo one 3465fcdc5d83SBram Moolenaar endif 3466fcdc5d83SBram Moolenaar echo one 3467fcdc5d83SBram Moolenaar endif 3468fcdc5d83SBram Moolenaar END 3469fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3470fcdc5d83SBram Moolenaar 3471fcdc5d83SBram Moolenaar lines =<< trim END 3472fcdc5d83SBram Moolenaar vim9script 3473fcdc5d83SBram Moolenaar if true 3474fcdc5d83SBram Moolenaar if false 3475fcdc5d83SBram Moolenaar var one = 'one' 3476fcdc5d83SBram Moolenaar echo one 3477fcdc5d83SBram Moolenaar else 3478fcdc5d83SBram Moolenaar var one = 'one' 3479fcdc5d83SBram Moolenaar echo one 3480fcdc5d83SBram Moolenaar endif 3481fcdc5d83SBram Moolenaar echo one 3482fcdc5d83SBram Moolenaar endif 3483fcdc5d83SBram Moolenaar END 3484fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3485fcdc5d83SBram Moolenaar 3486fcdc5d83SBram Moolenaar lines =<< trim END 3487fcdc5d83SBram Moolenaar vim9script 3488fcdc5d83SBram Moolenaar while true 3489fcdc5d83SBram Moolenaar var one = 'one' 3490fcdc5d83SBram Moolenaar echo one 3491fcdc5d83SBram Moolenaar break 3492fcdc5d83SBram Moolenaar endwhile 3493fcdc5d83SBram Moolenaar echo one 3494fcdc5d83SBram Moolenaar END 3495fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3496fcdc5d83SBram Moolenaar 3497fcdc5d83SBram Moolenaar lines =<< trim END 3498fcdc5d83SBram Moolenaar vim9script 3499fcdc5d83SBram Moolenaar for i in range(1) 3500fcdc5d83SBram Moolenaar var one = 'one' 3501fcdc5d83SBram Moolenaar echo one 3502fcdc5d83SBram Moolenaar endfor 3503fcdc5d83SBram Moolenaar echo one 3504fcdc5d83SBram Moolenaar END 3505fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 35069becdf2bSBram Moolenaar 35079becdf2bSBram Moolenaar lines =<< trim END 35089becdf2bSBram Moolenaar vim9script 35099becdf2bSBram Moolenaar { 35109becdf2bSBram Moolenaar var one = 'one' 35119becdf2bSBram Moolenaar assert_equal('one', one) 35129becdf2bSBram Moolenaar } 35139becdf2bSBram Moolenaar assert_false(exists('one')) 35149becdf2bSBram Moolenaar assert_false(exists('s:one')) 35159becdf2bSBram Moolenaar END 35169becdf2bSBram Moolenaar CheckScriptSuccess(lines) 35179becdf2bSBram Moolenaar 35189becdf2bSBram Moolenaar lines =<< trim END 35199becdf2bSBram Moolenaar vim9script 35209becdf2bSBram Moolenaar { 35219becdf2bSBram Moolenaar var one = 'one' 35229becdf2bSBram Moolenaar echo one 35239becdf2bSBram Moolenaar } 35249becdf2bSBram Moolenaar echo one 35259becdf2bSBram Moolenaar END 35269becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3527fcdc5d83SBram Moolenaarenddef 3528fcdc5d83SBram Moolenaar 3529352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3530352134bbSBram Moolenaar var lines =<< trim END 3531352134bbSBram Moolenaar vim9script 3532352134bbSBram Moolenaar def Callback(...l: any) 3533352134bbSBram Moolenaar try 3534352134bbSBram Moolenaar var x: string 3535352134bbSBram Moolenaar var y: string 3536352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3537352134bbSBram Moolenaar [x, y] = [''] 3538352134bbSBram Moolenaar catch 3539352134bbSBram Moolenaar g:caught = 'yes' 3540352134bbSBram Moolenaar endtry 3541352134bbSBram Moolenaar enddef 3542e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3543352134bbSBram Moolenaar feedkeys("\r", 'xt') 3544352134bbSBram Moolenaar END 3545352134bbSBram Moolenaar CheckScriptSuccess(lines) 3546352134bbSBram Moolenaar 3547352134bbSBram Moolenaar unlet g:caught 3548352134bbSBram Moolenaarenddef 3549352134bbSBram Moolenaar 3550631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3551631e8f93SBram Moolenaar if !has('unix') || !has('job') 3552631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3553631e8f93SBram Moolenaar endif 3554631e8f93SBram Moolenaar var lines =<< trim END 3555631e8f93SBram Moolenaar vim9script 3556631e8f93SBram Moolenaar var source: list<number> 3557631e8f93SBram Moolenaar def Out_cb(...l: any) 3558631e8f93SBram Moolenaar eval [][0] 3559631e8f93SBram Moolenaar enddef 3560631e8f93SBram Moolenaar def Exit_cb(...l: any) 3561631e8f93SBram Moolenaar sleep 1m 3562631e8f93SBram Moolenaar source += l 3563631e8f93SBram Moolenaar enddef 3564e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 35656f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 35666f17a3f0SBram Moolenaar sleep 10m 35676f17a3f0SBram Moolenaar endwhile 3568206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3569206c2a6eSBram Moolenaar sleep 100m 3570631e8f93SBram Moolenaar END 3571631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3572631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3573631e8f93SBram Moolenaar delete('Xdef') 3574631e8f93SBram Moolenaarenddef 3575631e8f93SBram Moolenaar 35764324d87aSBram Moolenaardef InvokeNormal() 35774324d87aSBram Moolenaar exe "norm! :m+1\r" 35784324d87aSBram Moolenaarenddef 35794324d87aSBram Moolenaar 35804324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 35814324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 35824324d87aSBram Moolenaar new 35834324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 35844324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 35854324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 35864324d87aSBram Moolenaar xunmap <F3> 3587b5b9480eSBram Moolenaarenddef 3588b5b9480eSBram Moolenaar 3589b5b9480eSBram Moolenaardef Test_white_space_after_command() 3590b5b9480eSBram Moolenaar var lines =<< trim END 3591b5b9480eSBram Moolenaar exit_cb: Func}) 3592b5b9480eSBram Moolenaar END 3593b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3594f8103f27SBram Moolenaar 3595f8103f27SBram Moolenaar lines =<< trim END 3596f8103f27SBram Moolenaar e# 3597f8103f27SBram Moolenaar END 3598f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 35994324d87aSBram Moolenaarenddef 36004324d87aSBram Moolenaar 36014aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 36024aab88d9SBram Moolenaar var lines =<< trim END 36034aab88d9SBram Moolenaar vim9script 36044aab88d9SBram Moolenaar if exists('g:guard') 36054aab88d9SBram Moolenaar finish 36064aab88d9SBram Moolenaar endif 36074aab88d9SBram Moolenaar g:guard = 1 36084aab88d9SBram Moolenaar var name = 'thename' 36094aab88d9SBram Moolenaar def g:GetName(): string 36104aab88d9SBram Moolenaar return name 36114aab88d9SBram Moolenaar enddef 36124aab88d9SBram Moolenaar def g:SetName(arg: string) 36134aab88d9SBram Moolenaar name = arg 36144aab88d9SBram Moolenaar enddef 36154aab88d9SBram Moolenaar END 36164aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 36174aab88d9SBram Moolenaar so XscriptTwice.vim 36184aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 36194aab88d9SBram Moolenaar g:SetName('newname') 36204aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 36214aab88d9SBram Moolenaar so XscriptTwice.vim 36224aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 36234aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 36244aab88d9SBram Moolenaar 36254aab88d9SBram Moolenaar delfunc g:GetName 36264aab88d9SBram Moolenaar delfunc g:SetName 36274aab88d9SBram Moolenaar delete('XscriptTwice.vim') 36284aab88d9SBram Moolenaar unlet g:guard 36294aab88d9SBram Moolenaarenddef 36304aab88d9SBram Moolenaar 36314aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 36324aab88d9SBram Moolenaar var exportlines =<< trim END 36334aab88d9SBram Moolenaar vim9script 36344aab88d9SBram Moolenaar if exists('g:guard') 36354aab88d9SBram Moolenaar finish 36364aab88d9SBram Moolenaar endif 36374aab88d9SBram Moolenaar g:guard = 1 36384aab88d9SBram Moolenaar export var name = 'someName' 36394aab88d9SBram Moolenaar END 36404aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 36414aab88d9SBram Moolenaar 36424aab88d9SBram Moolenaar var lines =<< trim END 36434aab88d9SBram Moolenaar vim9script 36444aab88d9SBram Moolenaar import name from './XexportScript.vim' 36454aab88d9SBram Moolenaar def g:GetName(): string 36464aab88d9SBram Moolenaar return name 36474aab88d9SBram Moolenaar enddef 36484aab88d9SBram Moolenaar END 36494aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 36504aab88d9SBram Moolenaar so XscriptImport.vim 36514aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 36524aab88d9SBram Moolenaar 36534aab88d9SBram Moolenaar so XexportScript.vim 36544aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 36554aab88d9SBram Moolenaar 36564aab88d9SBram Moolenaar delfunc g:GetName 36574aab88d9SBram Moolenaar delete('XexportScript.vim') 36584aab88d9SBram Moolenaar delete('XscriptImport.vim') 36594aab88d9SBram Moolenaar unlet g:guard 36604aab88d9SBram Moolenaarenddef 36614aab88d9SBram Moolenaar 366210b9421fSBram Moolenaardef Test_unsupported_commands() 366310b9421fSBram Moolenaar var lines =<< trim END 366410b9421fSBram Moolenaar ka 366510b9421fSBram Moolenaar END 366610b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 366710b9421fSBram Moolenaar 366810b9421fSBram Moolenaar lines =<< trim END 3669ada1d870SBram Moolenaar :1ka 3670ada1d870SBram Moolenaar END 3671ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3672ada1d870SBram Moolenaar 3673ada1d870SBram Moolenaar lines =<< trim END 367410b9421fSBram Moolenaar t 367510b9421fSBram Moolenaar END 367610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 367710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 367810b9421fSBram Moolenaar 367910b9421fSBram Moolenaar lines =<< trim END 368010b9421fSBram Moolenaar x 368110b9421fSBram Moolenaar END 368210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 368310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 368410b9421fSBram Moolenaar 368510b9421fSBram Moolenaar lines =<< trim END 368610b9421fSBram Moolenaar xit 368710b9421fSBram Moolenaar END 368810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 368910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 369010b9421fSBram Moolenaarenddef 369110b9421fSBram Moolenaar 3692585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3693585fea7bSBram Moolenaardef Test_substitute_cmd() 3694585fea7bSBram Moolenaar new 3695585fea7bSBram Moolenaar setline(1, 'something') 3696585fea7bSBram Moolenaar :substitute(some(other( 3697585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3698585fea7bSBram Moolenaar bwipe! 3699585fea7bSBram Moolenaar 3700f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3701cfcd011fSBram Moolenaar var lines =<< trim END 3702585fea7bSBram Moolenaar vim9script 3703585fea7bSBram Moolenaar new 3704585fea7bSBram Moolenaar setline(1, 'something') 3705585fea7bSBram Moolenaar :substitute(some(other( 3706585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3707585fea7bSBram Moolenaar bwipe! 3708585fea7bSBram Moolenaar END 3709585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3710585fea7bSBram Moolenaar source Xvim9lines 3711585fea7bSBram Moolenaar 3712585fea7bSBram Moolenaar delete('Xvim9lines') 3713585fea7bSBram Moolenaarenddef 3714585fea7bSBram Moolenaar 37158a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3716