18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 837294bd6SBram Moolenaarsource screendump.vim 98a7d6542SBram Moolenaar 105d72ce69SBram Moolenaardef Test_range_only() 115d72ce69SBram Moolenaar new 125d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 135d72ce69SBram Moolenaar :/Blah/ 145d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 15c2af0affSBram Moolenaar bwipe! 16c2af0affSBram Moolenaar 17c2af0affSBram Moolenaar # without range commands use current line 18c2af0affSBram Moolenaar new 19c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 20c2af0affSBram Moolenaar :2 21c2af0affSBram Moolenaar print 22c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 23c2af0affSBram Moolenaar :3 24c2af0affSBram Moolenaar list 25c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 26b8554304SBram Moolenaar 27b8554304SBram Moolenaar # missing command does not print the line 28b8554304SBram Moolenaar var lines =<< trim END 29b8554304SBram Moolenaar vim9script 30b8554304SBram Moolenaar :1| 31b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 32b8554304SBram Moolenaar :| 33b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 34b8554304SBram Moolenaar END 35b8554304SBram Moolenaar CheckScriptSuccess(lines) 36b8554304SBram Moolenaar 37c2af0affSBram Moolenaar bwipe! 38025cb1caSBram Moolenaar 39025cb1caSBram Moolenaar # won't generate anything 40025cb1caSBram Moolenaar if false 41025cb1caSBram Moolenaar :123 42025cb1caSBram Moolenaar endif 435d72ce69SBram Moolenaarenddef 445d72ce69SBram Moolenaar 45a6e67e4fSBram Moolenaarlet g:alist = [7] 46a6e67e4fSBram Moolenaarlet g:astring = 'text' 47f0b9f43cSBram Moolenaarlet g:anumber = 123 486e587dcbSBram Moolenaar 494c17ad94SBram Moolenaardef Test_delfunction() 50f5be8cdbSBram Moolenaar # Check function is defined in script namespace 514c17ad94SBram Moolenaar CheckScriptSuccess([ 524c17ad94SBram Moolenaar 'vim9script', 534c17ad94SBram Moolenaar 'func CheckMe()', 544c17ad94SBram Moolenaar ' return 123', 554c17ad94SBram Moolenaar 'endfunc', 564c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 574c17ad94SBram Moolenaar ]) 584c17ad94SBram Moolenaar 59f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 604c17ad94SBram Moolenaar CheckScriptFailure([ 614c17ad94SBram Moolenaar 'vim9script', 624c17ad94SBram Moolenaar 'func DeleteMe1()', 634c17ad94SBram Moolenaar 'endfunc', 644c17ad94SBram Moolenaar 'delfunction DeleteMe1', 654c17ad94SBram Moolenaar ], 'E1084:') 664c17ad94SBram Moolenaar CheckScriptFailure([ 674c17ad94SBram Moolenaar 'vim9script', 684c17ad94SBram Moolenaar 'func DeleteMe2()', 694c17ad94SBram Moolenaar 'endfunc', 704c17ad94SBram Moolenaar 'def DoThat()', 714c17ad94SBram Moolenaar ' delfunction DeleteMe2', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'DoThat()', 744c17ad94SBram Moolenaar ], 'E1084:') 754c17ad94SBram Moolenaar CheckScriptFailure([ 764c17ad94SBram Moolenaar 'vim9script', 774c17ad94SBram Moolenaar 'def DeleteMe3()', 784c17ad94SBram Moolenaar 'enddef', 794c17ad94SBram Moolenaar 'delfunction DeleteMe3', 804c17ad94SBram Moolenaar ], 'E1084:') 814c17ad94SBram Moolenaar CheckScriptFailure([ 824c17ad94SBram Moolenaar 'vim9script', 834c17ad94SBram Moolenaar 'def DeleteMe4()', 844c17ad94SBram Moolenaar 'enddef', 854c17ad94SBram Moolenaar 'def DoThat()', 864c17ad94SBram Moolenaar ' delfunction DeleteMe4', 874c17ad94SBram Moolenaar 'enddef', 884c17ad94SBram Moolenaar 'DoThat()', 894c17ad94SBram Moolenaar ], 'E1084:') 90925e9fd6SBram Moolenaar 91925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 92cfcd011fSBram Moolenaar var lines =<< trim END 93925e9fd6SBram Moolenaar vim9script 94925e9fd6SBram Moolenaar def g:Global(): string 95925e9fd6SBram Moolenaar return "yes" 96925e9fd6SBram Moolenaar enddef 97925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 98925e9fd6SBram Moolenaar def! g:Global(): string 99925e9fd6SBram Moolenaar return "no" 100925e9fd6SBram Moolenaar enddef 101925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 102925e9fd6SBram Moolenaar delfunc g:Global 103925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 104925e9fd6SBram Moolenaar END 105925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 106925e9fd6SBram Moolenaar 107925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 108925e9fd6SBram Moolenaar lines =<< trim END 109925e9fd6SBram Moolenaar vim9script 110925e9fd6SBram Moolenaar func g:Global() 111925e9fd6SBram Moolenaar return "yes" 112925e9fd6SBram Moolenaar endfunc 113925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 114925e9fd6SBram Moolenaar def! g:Global(): string 115925e9fd6SBram Moolenaar return "no" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 118925e9fd6SBram Moolenaar delfunc g:Global 119925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 120925e9fd6SBram Moolenaar END 121925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 122925e9fd6SBram Moolenaar 123925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 124925e9fd6SBram Moolenaar lines =<< trim END 125925e9fd6SBram Moolenaar vim9script 126925e9fd6SBram Moolenaar def g:Global(): string 127925e9fd6SBram Moolenaar return "yes" 128925e9fd6SBram Moolenaar enddef 129925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 130925e9fd6SBram Moolenaar func! g:Global() 131925e9fd6SBram Moolenaar return "no" 132925e9fd6SBram Moolenaar endfunc 133925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 134925e9fd6SBram Moolenaar delfunc g:Global 135925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 136925e9fd6SBram Moolenaar END 137925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1384c17ad94SBram Moolenaarenddef 1394c17ad94SBram Moolenaar 14008052228SBram Moolenaardef Test_wrong_type() 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 145599c89c8SBram Moolenaar 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14842a480bfSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 159cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 160a0a9f43aSBram Moolenaar 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 162cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16308052228SBram Moolenaarenddef 1648a7d6542SBram Moolenaar 16510c65860SBram Moolenaardef Test_script_wrong_type() 16610c65860SBram Moolenaar var lines =<< trim END 16710c65860SBram Moolenaar vim9script 16810c65860SBram Moolenaar var s:dict: dict<string> 16910c65860SBram Moolenaar s:dict['a'] = ['x'] 17010c65860SBram Moolenaar END 17110c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17210c65860SBram Moolenaarenddef 17310c65860SBram Moolenaar 17408052228SBram Moolenaardef Test_const() 175cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 177cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17830fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17930fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 180dbeecb2bSBram Moolenaar 181cfcd011fSBram Moolenaar var lines =<< trim END 18230fd8204SBram Moolenaar final list = [1, 2, 3] 183dbeecb2bSBram Moolenaar list[0] = 4 1840b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18530fd8204SBram Moolenaar const other = [5, 6, 7] 1860b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18771abe482SBram Moolenaar 188cfcd011fSBram Moolenaar var varlist = [7, 8] 18930fd8204SBram Moolenaar const constlist = [1, varlist, 3] 19071abe482SBram Moolenaar varlist[0] = 77 19171abe482SBram Moolenaar # TODO: does not work yet 19271abe482SBram Moolenaar # constlist[1][1] = 88 193cfcd011fSBram Moolenaar var cl = constlist[1] 19471abe482SBram Moolenaar cl[1] = 88 19571abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 19671abe482SBram Moolenaar 197e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 198e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 19971abe482SBram Moolenaar vardict['five'] = 55 20071abe482SBram Moolenaar # TODO: does not work yet 20171abe482SBram Moolenaar # constdict['two']['six'] = 66 202cfcd011fSBram Moolenaar var cd = constdict['two'] 20371abe482SBram Moolenaar cd['six'] = 66 204e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 205dbeecb2bSBram Moolenaar END 206dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20708052228SBram Moolenaarenddef 2088a7d6542SBram Moolenaar 2090b4c66c6SBram Moolenaardef Test_const_bang() 210cfcd011fSBram Moolenaar var lines =<< trim END 21130fd8204SBram Moolenaar const var = 234 2120b4c66c6SBram Moolenaar var = 99 2130b4c66c6SBram Moolenaar END 2140b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2150b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2160b4c66c6SBram Moolenaar 2170b4c66c6SBram Moolenaar lines =<< trim END 21830fd8204SBram Moolenaar const ll = [2, 3, 4] 2190b4c66c6SBram Moolenaar ll[0] = 99 2200b4c66c6SBram Moolenaar END 2210b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2220b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2230b4c66c6SBram Moolenaar 2240b4c66c6SBram Moolenaar lines =<< trim END 22530fd8204SBram Moolenaar const ll = [2, 3, 4] 2260b4c66c6SBram Moolenaar ll[3] = 99 2270b4c66c6SBram Moolenaar END 2280b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2290b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2300b4c66c6SBram Moolenaar 2310b4c66c6SBram Moolenaar lines =<< trim END 232e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2330b4c66c6SBram Moolenaar dd["one"] = 99 2340b4c66c6SBram Moolenaar END 2350b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2360b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2370b4c66c6SBram Moolenaar 2380b4c66c6SBram Moolenaar lines =<< trim END 239e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2400b4c66c6SBram Moolenaar dd["three"] = 99 2410b4c66c6SBram Moolenaar END 2420b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2430b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2440b4c66c6SBram Moolenaarenddef 2450b4c66c6SBram Moolenaar 246df069eecSBram Moolenaardef Test_range_no_colon() 247d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 249d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 250d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 251df069eecSBram Moolenaarenddef 252df069eecSBram Moolenaar 253df069eecSBram Moolenaar 2548a7d6542SBram Moolenaardef Test_block() 255cfcd011fSBram Moolenaar var outer = 1 2568a7d6542SBram Moolenaar { 257cfcd011fSBram Moolenaar var inner = 2 2588a7d6542SBram Moolenaar assert_equal(1, outer) 2598a7d6542SBram Moolenaar assert_equal(2, inner) 2608a7d6542SBram Moolenaar } 2618a7d6542SBram Moolenaar assert_equal(1, outer) 2623f1e9f00SBram Moolenaar 2633f1e9f00SBram Moolenaar {|echo 'yes'|} 2648a7d6542SBram Moolenaarenddef 2658a7d6542SBram Moolenaar 26608052228SBram Moolenaardef Test_block_failure() 267cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26808052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26908052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 27008052228SBram Moolenaarenddef 2718a7d6542SBram Moolenaar 272fbbcd003SBram Moolenaardef Test_block_local_vars() 273fbbcd003SBram Moolenaar var lines =<< trim END 274fbbcd003SBram Moolenaar vim9script 275ed234f24SBram Moolenaar v:testing = 1 276fbbcd003SBram Moolenaar if true 277ed234f24SBram Moolenaar var text = ['hello'] 278ed234f24SBram Moolenaar def SayHello(): list<string> 279fbbcd003SBram Moolenaar return text 280fbbcd003SBram Moolenaar enddef 281fbbcd003SBram Moolenaar def SetText(v: string) 282ed234f24SBram Moolenaar text = [v] 283fbbcd003SBram Moolenaar enddef 284fbbcd003SBram Moolenaar endif 285fbbcd003SBram Moolenaar 286fbbcd003SBram Moolenaar if true 287ed234f24SBram Moolenaar var text = ['again'] 288ed234f24SBram Moolenaar def SayAgain(): list<string> 289fbbcd003SBram Moolenaar return text 290fbbcd003SBram Moolenaar enddef 291fbbcd003SBram Moolenaar endif 292ed234f24SBram Moolenaar 293ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 294ed234f24SBram Moolenaar test_garbagecollect_now() 295ed234f24SBram Moolenaar 296fbbcd003SBram Moolenaar defcompile 297fbbcd003SBram Moolenaar 298ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 299ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 300fbbcd003SBram Moolenaar 301fbbcd003SBram Moolenaar SetText('foobar') 302ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 303ed234f24SBram Moolenaar 304ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 305ed234f24SBram Moolenaar qall! 306fbbcd003SBram Moolenaar END 307ed234f24SBram Moolenaar 308ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 309ed234f24SBram Moolenaar # context gets garbage collected. 310ed234f24SBram Moolenaar writefile(lines, 'Xscript') 311ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 312ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 313ed234f24SBram Moolenaar 314ed234f24SBram Moolenaar delete('Xscript') 315ed234f24SBram Moolenaar delete('Xdidit') 316fbbcd003SBram Moolenaarenddef 317fbbcd003SBram Moolenaar 31839ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31939ca4127SBram Moolenaar var lines =<< trim END 32039ca4127SBram Moolenaar vim9script 32139ca4127SBram Moolenaar if true 32239ca4127SBram Moolenaar var foo = 'foo' 32339ca4127SBram Moolenaar if true 32439ca4127SBram Moolenaar var bar = 'bar' 32539ca4127SBram Moolenaar def Func(): list<string> 32639ca4127SBram Moolenaar return [foo, bar] 32739ca4127SBram Moolenaar enddef 32839ca4127SBram Moolenaar endif 32939ca4127SBram Moolenaar endif 33039ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 33139ca4127SBram Moolenaar # "foo" and "bar" 33239ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33339ca4127SBram Moolenaar END 33439ca4127SBram Moolenaar CheckScriptSuccess(lines) 33539ca4127SBram Moolenaarenddef 33639ca4127SBram Moolenaar 337d032f34aSBram Moolenaarfunc g:NoSuchFunc() 338d032f34aSBram Moolenaar echo 'none' 339d032f34aSBram Moolenaarendfunc 340d032f34aSBram Moolenaar 3419e1d9e34SBram Moolenaardef Test_try_catch_throw() 342cfcd011fSBram Moolenaar var l = [] 3437a092245SBram Moolenaar try # comment 3448a7d6542SBram Moolenaar add(l, '1') 3458a7d6542SBram Moolenaar throw 'wrong' 3468a7d6542SBram Moolenaar add(l, '2') 3477a092245SBram Moolenaar catch # comment 3488a7d6542SBram Moolenaar add(l, v:exception) 3497a092245SBram Moolenaar finally # comment 3508a7d6542SBram Moolenaar add(l, '3') 3517a092245SBram Moolenaar endtry # comment 3528a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35368d130c6SBram Moolenaar 354e859312eSBram Moolenaar l = [] 355e859312eSBram Moolenaar try 356e859312eSBram Moolenaar try 357e859312eSBram Moolenaar add(l, '1') 358e859312eSBram Moolenaar throw 'wrong' 359e859312eSBram Moolenaar add(l, '2') 360e859312eSBram Moolenaar catch /right/ 361e859312eSBram Moolenaar add(l, v:exception) 362e859312eSBram Moolenaar endtry 363e859312eSBram Moolenaar catch /wrong/ 364e859312eSBram Moolenaar add(l, 'caught') 365373863edSBram Moolenaar fina 366e859312eSBram Moolenaar add(l, 'finally') 367e859312eSBram Moolenaar endtry 368e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 369e859312eSBram Moolenaar 370cfcd011fSBram Moolenaar var n: number 37168d130c6SBram Moolenaar try 37268d130c6SBram Moolenaar n = l[3] 37368d130c6SBram Moolenaar catch /E684:/ 37468d130c6SBram Moolenaar n = 99 37568d130c6SBram Moolenaar endtry 37668d130c6SBram Moolenaar assert_equal(99, n) 37768d130c6SBram Moolenaar 37869f7050cSBram Moolenaar var done = 'no' 37969f7050cSBram Moolenaar if 0 38069f7050cSBram Moolenaar try | catch | endtry 38169f7050cSBram Moolenaar else 38269f7050cSBram Moolenaar done = 'yes' 38369f7050cSBram Moolenaar endif 38469f7050cSBram Moolenaar assert_equal('yes', done) 38569f7050cSBram Moolenaar 38669f7050cSBram Moolenaar done = 'no' 38769f7050cSBram Moolenaar if 1 38869f7050cSBram Moolenaar done = 'yes' 38969f7050cSBram Moolenaar else 39069f7050cSBram Moolenaar try | catch | endtry 39169f7050cSBram Moolenaar done = 'never' 39269f7050cSBram Moolenaar endif 39369f7050cSBram Moolenaar assert_equal('yes', done) 39469f7050cSBram Moolenaar 39569f7050cSBram Moolenaar if 1 39669f7050cSBram Moolenaar else 39769f7050cSBram Moolenaar try | catch /pat/ | endtry 39869f7050cSBram Moolenaar try | catch /pat/ 39969f7050cSBram Moolenaar endtry 40069f7050cSBram Moolenaar try 40169f7050cSBram Moolenaar catch /pat/ | endtry 40269f7050cSBram Moolenaar try 40369f7050cSBram Moolenaar catch /pat/ 40469f7050cSBram Moolenaar endtry 40569f7050cSBram Moolenaar endif 40669f7050cSBram Moolenaar 40768d130c6SBram Moolenaar try 408cc673e74SBram Moolenaar # string slice returns a string, not a number 40968d130c6SBram Moolenaar n = g:astring[3] 4105e654230SBram Moolenaar catch /E1012:/ 41168d130c6SBram Moolenaar n = 77 41268d130c6SBram Moolenaar endtry 41368d130c6SBram Moolenaar assert_equal(77, n) 41468d130c6SBram Moolenaar 41568d130c6SBram Moolenaar try 41668d130c6SBram Moolenaar n = l[g:astring] 4175e654230SBram Moolenaar catch /E1012:/ 41856acb094SBram Moolenaar n = 88 41968d130c6SBram Moolenaar endtry 42056acb094SBram Moolenaar assert_equal(88, n) 42168d130c6SBram Moolenaar 42268d130c6SBram Moolenaar try 42368d130c6SBram Moolenaar n = s:does_not_exist 42468d130c6SBram Moolenaar catch /E121:/ 425f0b9f43cSBram Moolenaar n = 111 426f0b9f43cSBram Moolenaar endtry 427f0b9f43cSBram Moolenaar assert_equal(111, n) 428f0b9f43cSBram Moolenaar 429f0b9f43cSBram Moolenaar try 430f0b9f43cSBram Moolenaar n = g:does_not_exist 431f0b9f43cSBram Moolenaar catch /E121:/ 43268d130c6SBram Moolenaar n = 121 43368d130c6SBram Moolenaar endtry 43468d130c6SBram Moolenaar assert_equal(121, n) 43568d130c6SBram Moolenaar 436e0de171eSBram Moolenaar var d = {one: 1} 43768d130c6SBram Moolenaar try 43868d130c6SBram Moolenaar n = d[g:astring] 43968d130c6SBram Moolenaar catch /E716:/ 44068d130c6SBram Moolenaar n = 222 44168d130c6SBram Moolenaar endtry 44268d130c6SBram Moolenaar assert_equal(222, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = -g:astring 446f0b9f43cSBram Moolenaar catch /E39:/ 447f0b9f43cSBram Moolenaar n = 233 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(233, n) 450f0b9f43cSBram Moolenaar 451f0b9f43cSBram Moolenaar try 452f0b9f43cSBram Moolenaar n = +g:astring 453f0b9f43cSBram Moolenaar catch /E1030:/ 454f0b9f43cSBram Moolenaar n = 244 455f0b9f43cSBram Moolenaar endtry 456f0b9f43cSBram Moolenaar assert_equal(244, n) 457f0b9f43cSBram Moolenaar 458f0b9f43cSBram Moolenaar try 459f0b9f43cSBram Moolenaar n = +g:alist 460f0b9f43cSBram Moolenaar catch /E745:/ 461f0b9f43cSBram Moolenaar n = 255 462f0b9f43cSBram Moolenaar endtry 463f0b9f43cSBram Moolenaar assert_equal(255, n) 464f0b9f43cSBram Moolenaar 465cfcd011fSBram Moolenaar var nd: dict<any> 466f0b9f43cSBram Moolenaar try 4672e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4682e5910bfSBram Moolenaar catch /E1105:/ 469f0b9f43cSBram Moolenaar n = 266 470f0b9f43cSBram Moolenaar endtry 471f0b9f43cSBram Moolenaar assert_equal(266, n) 472f0b9f43cSBram Moolenaar 473f0b9f43cSBram Moolenaar try 474f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 475f0b9f43cSBram Moolenaar catch /E1093:/ 476f0b9f43cSBram Moolenaar n = 277 477f0b9f43cSBram Moolenaar endtry 478f0b9f43cSBram Moolenaar assert_equal(277, n) 479f0b9f43cSBram Moolenaar 480e859312eSBram Moolenaar try 481e859312eSBram Moolenaar &ts = g:astring 4825e654230SBram Moolenaar catch /E1012:/ 483e859312eSBram Moolenaar n = 288 484e859312eSBram Moolenaar endtry 485e859312eSBram Moolenaar assert_equal(288, n) 486e859312eSBram Moolenaar 487e859312eSBram Moolenaar try 488e859312eSBram Moolenaar &backspace = 'asdf' 489e859312eSBram Moolenaar catch /E474:/ 490e859312eSBram Moolenaar n = 299 491e859312eSBram Moolenaar endtry 492e859312eSBram Moolenaar assert_equal(299, n) 493e859312eSBram Moolenaar 494e859312eSBram Moolenaar l = [1] 495e859312eSBram Moolenaar try 496e859312eSBram Moolenaar l[3] = 3 497e859312eSBram Moolenaar catch /E684:/ 498e859312eSBram Moolenaar n = 300 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(300, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar unlet g:does_not_exist 504e859312eSBram Moolenaar catch /E108:/ 505e859312eSBram Moolenaar n = 322 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(322, n) 508e859312eSBram Moolenaar 509e859312eSBram Moolenaar try 5102bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 511e859312eSBram Moolenaar catch /E721:/ 512e859312eSBram Moolenaar n = 333 513e859312eSBram Moolenaar endtry 514e859312eSBram Moolenaar assert_equal(333, n) 515e859312eSBram Moolenaar 516e859312eSBram Moolenaar try 517e859312eSBram Moolenaar l = DeletedFunc() 518e859312eSBram Moolenaar catch /E933:/ 519e859312eSBram Moolenaar n = 344 520e859312eSBram Moolenaar endtry 521e859312eSBram Moolenaar assert_equal(344, n) 522d032f34aSBram Moolenaar 523d032f34aSBram Moolenaar try 524d032f34aSBram Moolenaar echo len(v:true) 525d032f34aSBram Moolenaar catch /E701:/ 526d032f34aSBram Moolenaar n = 355 527d032f34aSBram Moolenaar endtry 528d032f34aSBram Moolenaar assert_equal(355, n) 529d032f34aSBram Moolenaar 530cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 531d032f34aSBram Moolenaar delfunc g:NoSuchFunc 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo P() 534d032f34aSBram Moolenaar catch /E117:/ 535d032f34aSBram Moolenaar n = 366 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(366, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo g:NoSuchFunc() 541d032f34aSBram Moolenaar catch /E117:/ 542d032f34aSBram Moolenaar n = 377 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(377, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist + 4 548d032f34aSBram Moolenaar catch /E745:/ 549d032f34aSBram Moolenaar n = 388 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(388, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo 4 + g:alist 555d032f34aSBram Moolenaar catch /E745:/ 556d032f34aSBram Moolenaar n = 399 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(399, n) 559d032f34aSBram Moolenaar 560d032f34aSBram Moolenaar try 561d032f34aSBram Moolenaar echo g:alist.member 562d032f34aSBram Moolenaar catch /E715:/ 563d032f34aSBram Moolenaar n = 400 564d032f34aSBram Moolenaar endtry 565d032f34aSBram Moolenaar assert_equal(400, n) 566d032f34aSBram Moolenaar 567d032f34aSBram Moolenaar try 568d032f34aSBram Moolenaar echo d.member 569d032f34aSBram Moolenaar catch /E716:/ 570d032f34aSBram Moolenaar n = 411 571d032f34aSBram Moolenaar endtry 572d032f34aSBram Moolenaar assert_equal(411, n) 573d9d7789bSBram Moolenaar 574d9d7789bSBram Moolenaar var counter = 0 575d9d7789bSBram Moolenaar for i in range(4) 576d9d7789bSBram Moolenaar try 577d9d7789bSBram Moolenaar eval [][0] 578d9d7789bSBram Moolenaar catch 579d9d7789bSBram Moolenaar endtry 580d9d7789bSBram Moolenaar counter += 1 581d9d7789bSBram Moolenaar endfor 582d9d7789bSBram Moolenaar assert_equal(4, counter) 5837e82c5f3SBram Moolenaar 5847e82c5f3SBram Moolenaar # return in finally after empty catch 5857e82c5f3SBram Moolenaar def ReturnInFinally(): number 5867e82c5f3SBram Moolenaar try 5877e82c5f3SBram Moolenaar finally 5887e82c5f3SBram Moolenaar return 4 5897e82c5f3SBram Moolenaar endtry 5907e82c5f3SBram Moolenaar return 2 5917e82c5f3SBram Moolenaar enddef 5927e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5938a7d6542SBram Moolenaarenddef 5948a7d6542SBram Moolenaar 5952e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 5962e34c34bSBram Moolenaardef TryContinueFunc() 5972e34c34bSBram Moolenaar while g:Count < 2 5982e34c34bSBram Moolenaar g:sequence ..= 't' 5992e34c34bSBram Moolenaar try 6002e34c34bSBram Moolenaar echoerr 'Test' 6012e34c34bSBram Moolenaar catch 6022e34c34bSBram Moolenaar g:Count += 1 6032e34c34bSBram Moolenaar g:sequence ..= 'c' 6042e34c34bSBram Moolenaar continue 6052e34c34bSBram Moolenaar endtry 6062e34c34bSBram Moolenaar g:sequence ..= 'e' 6072e34c34bSBram Moolenaar g:Count += 1 6082e34c34bSBram Moolenaar endwhile 6092e34c34bSBram Moolenaarenddef 6102e34c34bSBram Moolenaar 6112e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6122e34c34bSBram Moolenaar g:Count = 0 6132e34c34bSBram Moolenaar g:sequence = '' 6142e34c34bSBram Moolenaar TryContinueFunc() 6152e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6162e34c34bSBram Moolenaar unlet g:Count 6172e34c34bSBram Moolenaar unlet g:sequence 6182e34c34bSBram Moolenaarenddef 6192e34c34bSBram Moolenaar 6209cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6219cb577a6SBram Moolenaar # return in try block returns normally 6229cb577a6SBram Moolenaar def ReturnInTry(): string 6239cb577a6SBram Moolenaar try 6249cb577a6SBram Moolenaar return '"some message"' 6259cb577a6SBram Moolenaar catch 6269cb577a6SBram Moolenaar endtry 6279cb577a6SBram Moolenaar return 'not reached' 6289cb577a6SBram Moolenaar enddef 6299cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6309cb577a6SBram Moolenaarenddef 6319cb577a6SBram Moolenaar 6321430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6331430ceebSBram Moolenaar var lines =<< trim END 6341430ceebSBram Moolenaar vim9script 6351430ceebSBram Moolenaar au BufEnter * eval 0 6361430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6371430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6381430ceebSBram Moolenaar var items = [ 6391430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6401430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6411430ceebSBram Moolenaar ] 6421430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6431430ceebSBram Moolenaar cwindow 6441430ceebSBram Moolenaar 6451430ceebSBram Moolenaar def CnextOrCfirst() 6461430ceebSBram Moolenaar # if cnext fails, cfirst is used 6471430ceebSBram Moolenaar try 6481430ceebSBram Moolenaar cnext 6491430ceebSBram Moolenaar catch 6501430ceebSBram Moolenaar cfirst 6511430ceebSBram Moolenaar endtry 6521430ceebSBram Moolenaar enddef 6531430ceebSBram Moolenaar 6541430ceebSBram Moolenaar CnextOrCfirst() 6551430ceebSBram Moolenaar CnextOrCfirst() 6561430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6571430ceebSBram Moolenaar qall 6581430ceebSBram Moolenaar END 6591430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6601430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6611430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6621430ceebSBram Moolenaar 6631430ceebSBram Moolenaar delete('Xfile1') 6641430ceebSBram Moolenaar delete('Xfile2') 6651430ceebSBram Moolenaar delete('XCatchCnext') 6661430ceebSBram Moolenaar delete('Xresult') 6671430ceebSBram Moolenaarenddef 6681430ceebSBram Moolenaar 6699e1d9e34SBram Moolenaardef Test_throw_skipped() 6709e1d9e34SBram Moolenaar if 0 6719e1d9e34SBram Moolenaar throw dontgethere 6729e1d9e34SBram Moolenaar endif 6739e1d9e34SBram Moolenaarenddef 6749e1d9e34SBram Moolenaar 6758f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6768f81b22eSBram Moolenaar var lines =<< trim END 6778f81b22eSBram Moolenaar vim9script 6788f81b22eSBram Moolenaar def Func() 6798f81b22eSBram Moolenaar throw 'error' 6808f81b22eSBram Moolenaar enddef 6818f81b22eSBram Moolenaar silent! Func() 6828f81b22eSBram Moolenaar END 6838f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6848f81b22eSBram Moolenaar source XthrowSilenced 6858f81b22eSBram Moolenaar delete('XthrowSilenced') 6868f81b22eSBram Moolenaarenddef 6878f81b22eSBram Moolenaar 688e859312eSBram Moolenaardef DeletedFunc(): list<any> 689e859312eSBram Moolenaar return ['delete me'] 690e859312eSBram Moolenaarenddef 691e859312eSBram Moolenaardefcompile 692e859312eSBram Moolenaardelfunc DeletedFunc 693e859312eSBram Moolenaar 694257cc5eeSBram Moolenaardef ThrowFromDef() 695a72cfb80SBram Moolenaar throw "getout" # comment 696257cc5eeSBram Moolenaarenddef 697257cc5eeSBram Moolenaar 698257cc5eeSBram Moolenaarfunc CatchInFunc() 699257cc5eeSBram Moolenaar try 700257cc5eeSBram Moolenaar call ThrowFromDef() 701257cc5eeSBram Moolenaar catch 702257cc5eeSBram Moolenaar let g:thrown_func = v:exception 703257cc5eeSBram Moolenaar endtry 704257cc5eeSBram Moolenaarendfunc 705257cc5eeSBram Moolenaar 706257cc5eeSBram Moolenaardef CatchInDef() 707257cc5eeSBram Moolenaar try 708257cc5eeSBram Moolenaar ThrowFromDef() 709257cc5eeSBram Moolenaar catch 710257cc5eeSBram Moolenaar g:thrown_def = v:exception 711257cc5eeSBram Moolenaar endtry 712257cc5eeSBram Moolenaarenddef 713257cc5eeSBram Moolenaar 714f575adffSBram Moolenaardef ReturnFinally(): string 715f575adffSBram Moolenaar try 716f575adffSBram Moolenaar return 'intry' 717373863edSBram Moolenaar finall 718f575adffSBram Moolenaar g:in_finally = 'finally' 719f575adffSBram Moolenaar endtry 720f575adffSBram Moolenaar return 'end' 721f575adffSBram Moolenaarenddef 722f575adffSBram Moolenaar 723257cc5eeSBram Moolenaardef Test_try_catch_nested() 724257cc5eeSBram Moolenaar CatchInFunc() 725257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 726257cc5eeSBram Moolenaar 727257cc5eeSBram Moolenaar CatchInDef() 728257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 729f575adffSBram Moolenaar 730f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 731f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 732f575adffSBram Moolenaarenddef 733f575adffSBram Moolenaar 7349939f57bSBram Moolenaardef TryOne(): number 7359939f57bSBram Moolenaar try 7369939f57bSBram Moolenaar return 0 7379939f57bSBram Moolenaar catch 7389939f57bSBram Moolenaar endtry 7399939f57bSBram Moolenaar return 0 7409939f57bSBram Moolenaarenddef 7419939f57bSBram Moolenaar 7429939f57bSBram Moolenaardef TryTwo(n: number): string 7439939f57bSBram Moolenaar try 744cfcd011fSBram Moolenaar var x = {} 7459939f57bSBram Moolenaar catch 7469939f57bSBram Moolenaar endtry 7479939f57bSBram Moolenaar return 'text' 7489939f57bSBram Moolenaarenddef 7499939f57bSBram Moolenaar 7509939f57bSBram Moolenaardef Test_try_catch_twice() 7519939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7529939f57bSBram Moolenaarenddef 7539939f57bSBram Moolenaar 754f575adffSBram Moolenaardef Test_try_catch_match() 755cfcd011fSBram Moolenaar var seq = 'a' 756f575adffSBram Moolenaar try 757f575adffSBram Moolenaar throw 'something' 758f575adffSBram Moolenaar catch /nothing/ 759f575adffSBram Moolenaar seq ..= 'x' 760f575adffSBram Moolenaar catch /some/ 761f575adffSBram Moolenaar seq ..= 'b' 762f575adffSBram Moolenaar catch /asdf/ 763f575adffSBram Moolenaar seq ..= 'x' 764e8c4abbbSBram Moolenaar catch ?a\?sdf? 765e8c4abbbSBram Moolenaar seq ..= 'y' 766f575adffSBram Moolenaar finally 767f575adffSBram Moolenaar seq ..= 'c' 768f575adffSBram Moolenaar endtry 769f575adffSBram Moolenaar assert_equal('abc', seq) 770257cc5eeSBram Moolenaarenddef 771257cc5eeSBram Moolenaar 772e8c4abbbSBram Moolenaardef Test_try_catch_fails() 773d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 774d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 775d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 776d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 777d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 778d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 779d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 780d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 78113106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 782d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 783585fea7bSBram Moolenaar 784e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 785d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 786e8c4abbbSBram Moolenaarenddef 787e8c4abbbSBram Moolenaar 7887c5b3c03SBram Moolenaardef Try_catch_skipped() 7897c5b3c03SBram Moolenaar var l = [] 7907c5b3c03SBram Moolenaar try 7917c5b3c03SBram Moolenaar finally 7927c5b3c03SBram Moolenaar endtry 7937c5b3c03SBram Moolenaar 7947c5b3c03SBram Moolenaar if 1 7957c5b3c03SBram Moolenaar else 7967c5b3c03SBram Moolenaar try 7977c5b3c03SBram Moolenaar endtry 7987c5b3c03SBram Moolenaar endif 7997c5b3c03SBram Moolenaarenddef 8007c5b3c03SBram Moolenaar 8017c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 8027c5b3c03SBram Moolenaardef Test_try_catch_skipped() 8037c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 8047c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 8057c5b3c03SBram Moolenaarenddef 8067c5b3c03SBram Moolenaar 8077c5b3c03SBram Moolenaar 8087c5b3c03SBram Moolenaar 809006ad48bSBram Moolenaardef Test_throw_vimscript() 810f5be8cdbSBram Moolenaar # only checks line continuation 811cfcd011fSBram Moolenaar var lines =<< trim END 812006ad48bSBram Moolenaar vim9script 813006ad48bSBram Moolenaar try 814006ad48bSBram Moolenaar throw 'one' 815006ad48bSBram Moolenaar .. 'two' 816006ad48bSBram Moolenaar catch 817006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 818006ad48bSBram Moolenaar endtry 819006ad48bSBram Moolenaar END 820006ad48bSBram Moolenaar CheckScriptSuccess(lines) 8211e021e63SBram Moolenaar 8221e021e63SBram Moolenaar lines =<< trim END 8231e021e63SBram Moolenaar vim9script 824352134bbSBram Moolenaar @r = '' 8251e021e63SBram Moolenaar def Func() 8261e021e63SBram Moolenaar throw @r 8271e021e63SBram Moolenaar enddef 8281e021e63SBram Moolenaar var result = '' 8291e021e63SBram Moolenaar try 8301e021e63SBram Moolenaar Func() 8311e021e63SBram Moolenaar catch /E1129:/ 8321e021e63SBram Moolenaar result = 'caught' 8331e021e63SBram Moolenaar endtry 8341e021e63SBram Moolenaar assert_equal('caught', result) 8351e021e63SBram Moolenaar END 8361e021e63SBram Moolenaar CheckScriptSuccess(lines) 837006ad48bSBram Moolenaarenddef 838006ad48bSBram Moolenaar 839ed677f55SBram Moolenaardef Test_error_in_nested_function() 84003dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 841cfcd011fSBram Moolenaar var lines =<< trim END 842ed677f55SBram Moolenaar vim9script 843ed677f55SBram Moolenaar def Func() 844ed677f55SBram Moolenaar Error() 845ed677f55SBram Moolenaar g:test_var = 1 846ed677f55SBram Moolenaar enddef 847ed677f55SBram Moolenaar func Error() abort 848ed677f55SBram Moolenaar eval [][0] 849ed677f55SBram Moolenaar endfunc 850ed677f55SBram Moolenaar Func() 851ed677f55SBram Moolenaar END 852ed677f55SBram Moolenaar g:test_var = 0 853ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 854ed677f55SBram Moolenaar assert_equal(0, g:test_var) 855ed677f55SBram Moolenaarenddef 856ed677f55SBram Moolenaar 857227c58a4SBram Moolenaardef Test_abort_after_error() 858227c58a4SBram Moolenaar var lines =<< trim END 859227c58a4SBram Moolenaar vim9script 860227c58a4SBram Moolenaar while true 861227c58a4SBram Moolenaar echo notfound 862227c58a4SBram Moolenaar endwhile 863227c58a4SBram Moolenaar g:gotthere = true 864227c58a4SBram Moolenaar END 865227c58a4SBram Moolenaar g:gotthere = false 866227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 867227c58a4SBram Moolenaar assert_false(g:gotthere) 868227c58a4SBram Moolenaar unlet g:gotthere 869227c58a4SBram Moolenaarenddef 870227c58a4SBram Moolenaar 87137c83711SBram Moolenaardef Test_cexpr_vimscript() 872f5be8cdbSBram Moolenaar # only checks line continuation 87337c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 874cfcd011fSBram Moolenaar var lines =<< trim END 87537c83711SBram Moolenaar vim9script 87637c83711SBram Moolenaar cexpr 'File' 87737c83711SBram Moolenaar .. ' someFile' .. 87837c83711SBram Moolenaar ' line 19' 87937c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 88037c83711SBram Moolenaar END 88137c83711SBram Moolenaar CheckScriptSuccess(lines) 88237c83711SBram Moolenaar set errorformat& 88337c83711SBram Moolenaarenddef 88437c83711SBram Moolenaar 885c9edd6b5SBram Moolenaardef Test_statusline_syntax() 886c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 887cfcd011fSBram Moolenaar var lines =<< trim END 888c9edd6b5SBram Moolenaar vim9script 889c9edd6b5SBram Moolenaar func g:Status() 890c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 891c9edd6b5SBram Moolenaar endfunc 892c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 893c9edd6b5SBram Moolenaar redrawstatus 894c9edd6b5SBram Moolenaar set laststatus statusline= 895c9edd6b5SBram Moolenaar END 896c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 897c9edd6b5SBram Moolenaarenddef 898c9edd6b5SBram Moolenaar 899b209750bSBram Moolenaardef Test_list_vimscript() 900b209750bSBram Moolenaar # checks line continuation and comments 901cfcd011fSBram Moolenaar var lines =<< trim END 902b209750bSBram Moolenaar vim9script 903cfcd011fSBram Moolenaar var mylist = [ 904b209750bSBram Moolenaar 'one', 905b209750bSBram Moolenaar # comment 906b209750bSBram Moolenaar 'two', # empty line follows 907b209750bSBram Moolenaar 908b209750bSBram Moolenaar 'three', 909b209750bSBram Moolenaar ] 910b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 911b209750bSBram Moolenaar END 912b209750bSBram Moolenaar CheckScriptSuccess(lines) 91366250c93SBram Moolenaar 91466250c93SBram Moolenaar # check all lines from heredoc are kept 91566250c93SBram Moolenaar lines =<< trim END 91666250c93SBram Moolenaar # comment 1 91766250c93SBram Moolenaar two 91866250c93SBram Moolenaar # comment 3 91966250c93SBram Moolenaar 92066250c93SBram Moolenaar five 92166250c93SBram Moolenaar # comment 6 92266250c93SBram Moolenaar END 92366250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 9244bce26bbSBram Moolenaar 9254bce26bbSBram Moolenaar lines =<< trim END 9264bce26bbSBram Moolenaar [{ 9274bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 9284bce26bbSBram Moolenaar END 9294bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 930b209750bSBram Moolenaarenddef 931b209750bSBram Moolenaar 9322a1381c3SBram Moolenaarif has('channel') 93340ee466cSBram Moolenaar let someJob = test_null_job() 93440ee466cSBram Moolenaar 93540ee466cSBram Moolenaar def FuncWithError() 93640ee466cSBram Moolenaar echomsg g:someJob 93740ee466cSBram Moolenaar enddef 93840ee466cSBram Moolenaar 93940ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 94040ee466cSBram Moolenaar try 94140ee466cSBram Moolenaar call FuncWithError() 94240ee466cSBram Moolenaar catch 94340ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 94440ee466cSBram Moolenaar endtry 94540ee466cSBram Moolenaar endfunc 9462a1381c3SBram Moolenaarendif 94740ee466cSBram Moolenaar 9488a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9498a7d6542SBram Moolenaar vim9script 950cfcd011fSBram Moolenaar var name: string = 'bob' 9518a7d6542SBram Moolenaar def Concat(arg: string): string 9528a7d6542SBram Moolenaar return name .. arg 9538a7d6542SBram Moolenaar enddef 954227a69deSBram Moolenaar g:result = Concat('bie') 955227a69deSBram Moolenaar g:localname = name 9568a7d6542SBram Moolenaar 9578a7d6542SBram Moolenaar export const CONST = 1234 958cfcd011fSBram Moolenaar export var exported = 9876 959cfcd011fSBram Moolenaar export var exp_name = 'John' 9608a7d6542SBram Moolenaar export def Exported(): string 9618a7d6542SBram Moolenaar return 'Exported' 9628a7d6542SBram Moolenaar enddef 9630f2a5cc6SBram Moolenaar export final theList = [1] 9648a7d6542SBram MoolenaarEND 9658a7d6542SBram Moolenaar 966b3ca9824SBram Moolenaardef Undo_export_script_lines() 967b3ca9824SBram Moolenaar unlet g:result 968b3ca9824SBram Moolenaar unlet g:localname 969b3ca9824SBram Moolenaarenddef 970b3ca9824SBram Moolenaar 9715269bd2aSBram Moolenaardef Test_vim9_import_export() 972cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9738a7d6542SBram Moolenaar vim9script 9748a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9758a7d6542SBram Moolenaar g:imported = exported 9766e587dcbSBram Moolenaar exported += 3 9776e587dcbSBram Moolenaar g:imported_added = exported 9788a7d6542SBram Moolenaar g:imported_func = Exported() 9796e587dcbSBram Moolenaar 98040f4f7a4SBram Moolenaar def GetExported(): string 981e0de171eSBram Moolenaar var local_dict = {ref: Exported} 98240f4f7a4SBram Moolenaar return local_dict.ref() 98340f4f7a4SBram Moolenaar enddef 98440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 98540f4f7a4SBram Moolenaar 9866e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9876e587dcbSBram Moolenaar g:imported_name = exp_name 9886e587dcbSBram Moolenaar exp_name ..= ' Doe' 9896e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9905381c7a1SBram Moolenaar g:imported_later = exported 9910f2a5cc6SBram Moolenaar 9920f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 9930f2a5cc6SBram Moolenaar theList->add(2) 9940f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 9958a7d6542SBram Moolenaar END 9968a7d6542SBram Moolenaar 9978a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9988a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9998a7d6542SBram Moolenaar 10008a7d6542SBram Moolenaar source Ximport.vim 10018a7d6542SBram Moolenaar 10028a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 10038a7d6542SBram Moolenaar assert_equal('bob', g:localname) 10048a7d6542SBram Moolenaar assert_equal(9876, g:imported) 10056e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 10065381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 10078a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 100840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 10096e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 10106e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 10118a7d6542SBram Moolenaar assert_false(exists('g:name')) 10128a7d6542SBram Moolenaar 1013b3ca9824SBram Moolenaar Undo_export_script_lines() 10148a7d6542SBram Moolenaar unlet g:imported 10156e587dcbSBram Moolenaar unlet g:imported_added 10165381c7a1SBram Moolenaar unlet g:imported_later 10178a7d6542SBram Moolenaar unlet g:imported_func 10186e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 10198a7d6542SBram Moolenaar delete('Ximport.vim') 1020f2d5c240SBram Moolenaar 10211c991144SBram Moolenaar # similar, with line breaks 1022cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 10231c991144SBram Moolenaar vim9script 10241c991144SBram Moolenaar import { 10251c991144SBram Moolenaar exported, 10261c991144SBram Moolenaar Exported, 10271c991144SBram Moolenaar } 10281c991144SBram Moolenaar from 10291c991144SBram Moolenaar './Xexport.vim' 10301c991144SBram Moolenaar g:imported = exported 10311c991144SBram Moolenaar exported += 5 10321c991144SBram Moolenaar g:imported_added = exported 10331c991144SBram Moolenaar g:imported_func = Exported() 10341c991144SBram Moolenaar END 10351c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 10361c991144SBram Moolenaar source Ximport_lbr.vim 10371c991144SBram Moolenaar 10381c991144SBram Moolenaar assert_equal(9876, g:imported) 10391c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10401c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10411c991144SBram Moolenaar 10421c991144SBram Moolenaar # exported script not sourced again 10431c991144SBram Moolenaar assert_false(exists('g:result')) 10441c991144SBram Moolenaar unlet g:imported 10451c991144SBram Moolenaar unlet g:imported_added 10461c991144SBram Moolenaar unlet g:imported_func 10471c991144SBram Moolenaar delete('Ximport_lbr.vim') 10481c991144SBram Moolenaar 10491c991144SBram Moolenaar # import inside :def function 1050cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10515381c7a1SBram Moolenaar vim9script 10525381c7a1SBram Moolenaar def ImportInDef() 10535381c7a1SBram Moolenaar import exported from './Xexport.vim' 10545381c7a1SBram Moolenaar g:imported = exported 10555381c7a1SBram Moolenaar exported += 7 10565381c7a1SBram Moolenaar g:imported_added = exported 10575381c7a1SBram Moolenaar enddef 10585381c7a1SBram Moolenaar ImportInDef() 10595381c7a1SBram Moolenaar END 10605381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10615381c7a1SBram Moolenaar source Ximport2.vim 1062f5be8cdbSBram Moolenaar # TODO: this should be 9879 10635381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10645381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10655381c7a1SBram Moolenaar unlet g:imported 10665381c7a1SBram Moolenaar unlet g:imported_added 10675381c7a1SBram Moolenaar delete('Ximport2.vim') 10685381c7a1SBram Moolenaar 1069cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1070f2d5c240SBram Moolenaar vim9script 1071f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1072f2d5c240SBram Moolenaar def UseExport() 1073cb4e80faSBram Moolenaar g:imported_def = Export.exported 1074f2d5c240SBram Moolenaar enddef 1075cb4e80faSBram Moolenaar g:imported_script = Export.exported 1076cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1077cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1078f2d5c240SBram Moolenaar UseExport() 1079f2d5c240SBram Moolenaar END 1080f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1081f2d5c240SBram Moolenaar source Ximport.vim 1082cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1083cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1084f2d5c240SBram Moolenaar 1085cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1086599c89c8SBram Moolenaar vim9script 1087599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1088599c89c8SBram Moolenaar def Func() 1089cfcd011fSBram Moolenaar var dummy = 1 1090cfcd011fSBram Moolenaar var imported = Export + dummy 1091599c89c8SBram Moolenaar enddef 1092822ba247SBram Moolenaar defcompile 1093599c89c8SBram Moolenaar END 1094599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 109544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1096599c89c8SBram Moolenaar 1097cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1098599c89c8SBram Moolenaar vim9script 1099599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1100599c89c8SBram Moolenaar def Func() 1101cfcd011fSBram Moolenaar var imported = Export . exported 1102599c89c8SBram Moolenaar enddef 1103822ba247SBram Moolenaar defcompile 1104599c89c8SBram Moolenaar END 1105599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 110644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1107599c89c8SBram Moolenaar 1108a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1109a6294955SBram Moolenaar vim9script 1110a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1111a6294955SBram Moolenaar var some = 'other' 1112a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1113a6294955SBram Moolenaar defcompile 1114a6294955SBram Moolenaar END 1115a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1116a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1117a6294955SBram Moolenaar 1118cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1119cb4e80faSBram Moolenaar vim9script 1120cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1121cb4e80faSBram Moolenaar g:imported_script = Export exported 1122cb4e80faSBram Moolenaar END 1123cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1124cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1125cb4e80faSBram Moolenaar 1126cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1127cb4e80faSBram Moolenaar vim9script 1128cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1129cb4e80faSBram Moolenaar g:imported_script = Export. exported 1130cb4e80faSBram Moolenaar END 1131cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1132cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1133cb4e80faSBram Moolenaar 1134cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1135599c89c8SBram Moolenaar vim9script 1136599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1137599c89c8SBram Moolenaar def Func() 1138cfcd011fSBram Moolenaar var imported = Export. 1139599c89c8SBram Moolenaar enddef 1140822ba247SBram Moolenaar defcompile 1141599c89c8SBram Moolenaar END 1142599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 114344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1144599c89c8SBram Moolenaar 1145cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 11461c991144SBram Moolenaar vim9script 11471c991144SBram Moolenaar import * 11481c991144SBram Moolenaar as Export 11491c991144SBram Moolenaar from 11501c991144SBram Moolenaar './Xexport.vim' 11511c991144SBram Moolenaar def UseExport() 11521c991144SBram Moolenaar g:imported = Export.exported 11531c991144SBram Moolenaar enddef 11541c991144SBram Moolenaar UseExport() 11551c991144SBram Moolenaar END 11561c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 11571c991144SBram Moolenaar source Ximport.vim 11581c991144SBram Moolenaar assert_equal(9883, g:imported) 11591c991144SBram Moolenaar 1160cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1161f2d5c240SBram Moolenaar vim9script 1162f2d5c240SBram Moolenaar import * from './Xexport.vim' 1163f2d5c240SBram Moolenaar END 1164f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 116544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1166f2d5c240SBram Moolenaar 1167f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1168cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1169fa29c8abSBram Moolenaar vim9script 1170fa29c8abSBram Moolenaar import name from './Xexport.vim' 1171fa29c8abSBram Moolenaar END 1172fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 117344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1174fa29c8abSBram Moolenaar 1175f5be8cdbSBram Moolenaar # try to import something that is already defined 1176cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11775269bd2aSBram Moolenaar vim9script 1178cfcd011fSBram Moolenaar var exported = 'something' 11795269bd2aSBram Moolenaar import exported from './Xexport.vim' 11805269bd2aSBram Moolenaar END 11815269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1182057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11835269bd2aSBram Moolenaar 1184f5be8cdbSBram Moolenaar # try to import something that is already defined 11855269bd2aSBram Moolenaar import_already_defined =<< trim END 11865269bd2aSBram Moolenaar vim9script 1187cfcd011fSBram Moolenaar var exported = 'something' 11885269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11895269bd2aSBram Moolenaar END 11905269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1191057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11925269bd2aSBram Moolenaar 1193f5be8cdbSBram Moolenaar # try to import something that is already defined 11945269bd2aSBram Moolenaar import_already_defined =<< trim END 11955269bd2aSBram Moolenaar vim9script 1196cfcd011fSBram Moolenaar var exported = 'something' 11975269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11985269bd2aSBram Moolenaar END 11995269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1200057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12015269bd2aSBram Moolenaar 1202918a4249SBram Moolenaar # try changing an imported const 1203918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1204918a4249SBram Moolenaar vim9script 1205918a4249SBram Moolenaar import CONST from './Xexport.vim' 1206918a4249SBram Moolenaar def Assign() 1207918a4249SBram Moolenaar CONST = 987 1208918a4249SBram Moolenaar enddef 1209918a4249SBram Moolenaar defcompile 1210918a4249SBram Moolenaar END 1211918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1212918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1213918a4249SBram Moolenaar 12140f2a5cc6SBram Moolenaar # try changing an imported final 12150f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 12160f2a5cc6SBram Moolenaar vim9script 12170f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 12180f2a5cc6SBram Moolenaar def Assign() 12190f2a5cc6SBram Moolenaar theList = [2] 12200f2a5cc6SBram Moolenaar enddef 12210f2a5cc6SBram Moolenaar defcompile 12220f2a5cc6SBram Moolenaar END 12230f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 12240f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 12250f2a5cc6SBram Moolenaar 1226f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1227cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1228fa29c8abSBram Moolenaar vim9script 1229fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1230fa29c8abSBram Moolenaar END 1231fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 123244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1233fa29c8abSBram Moolenaar 1234cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1235fa29c8abSBram Moolenaar vim9script 1236fa29c8abSBram Moolenaar import name './Xexport.vim' 1237fa29c8abSBram Moolenaar END 1238fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 123944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1240fa29c8abSBram Moolenaar 1241cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1242fa29c8abSBram Moolenaar vim9script 1243fa29c8abSBram Moolenaar import name from Xexport.vim 1244fa29c8abSBram Moolenaar END 1245fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 124644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1247fa29c8abSBram Moolenaar 1248cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1249fa29c8abSBram Moolenaar vim9script 1250fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1251fa29c8abSBram Moolenaar END 1252fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 125344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1254fa29c8abSBram Moolenaar 1255cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1256fa29c8abSBram Moolenaar vim9script 1257fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1258fa29c8abSBram Moolenaar END 12595269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 126044d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1261fa29c8abSBram Moolenaar 1262f2d5c240SBram Moolenaar delete('Ximport.vim') 12635269bd2aSBram Moolenaar delete('Ximport3.vim') 12648a7d6542SBram Moolenaar delete('Xexport.vim') 12658a7d6542SBram Moolenaar 1266f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 12673e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 12683e191694SBram Moolenaar set cpo=abcd 1269cfcd011fSBram Moolenaar var lines =<< trim END 1270750802b5SBram Moolenaar vim9script 1271750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 12723e191694SBram Moolenaar set cpo+=f 12733e191694SBram Moolenaar set cpo-=c 12743e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1275750802b5SBram Moolenaar END 1276750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1277750802b5SBram Moolenaar source Xvim9_script 12783e191694SBram Moolenaar assert_equal('fabd', &cpo) 1279750802b5SBram Moolenaar set cpo&vim 1280750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 12813e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 12823e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 12833e191694SBram Moolenaar 1284750802b5SBram Moolenaar delete('Xvim9_script') 1285750802b5SBram Moolenaarenddef 1286750802b5SBram Moolenaar 12870a84284eSBram Moolenaardef Test_import_as() 12880a84284eSBram Moolenaar var export_lines =<< trim END 12890a84284eSBram Moolenaar vim9script 12900a84284eSBram Moolenaar export var one = 1 12910a84284eSBram Moolenaar export var yes = 'yes' 12920a84284eSBram Moolenaar END 12930a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 12940a84284eSBram Moolenaar 12950a84284eSBram Moolenaar var import_lines =<< trim END 12960a84284eSBram Moolenaar vim9script 12976c7cc347SBram Moolenaar var one = 'notused' 12986c7cc347SBram Moolenaar var yes = 777 12990a84284eSBram Moolenaar import one as thatOne from './XexportAs' 13000a84284eSBram Moolenaar assert_equal(1, thatOne) 13010a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 13020a84284eSBram Moolenaar assert_equal('yes', yesYes) 13030a84284eSBram Moolenaar END 13040a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13050a84284eSBram Moolenaar 13060a84284eSBram Moolenaar import_lines =<< trim END 13070a84284eSBram Moolenaar vim9script 13080a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 13090a84284eSBram Moolenaar assert_equal(1, thatOne) 13100a84284eSBram Moolenaar assert_equal('yes', yesYes) 13110a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 13120a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 13130a84284eSBram Moolenaar END 13140a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13150a84284eSBram Moolenaar 13160a84284eSBram Moolenaar delete('XexportAs') 13170a84284eSBram Moolenaarenddef 13180a84284eSBram Moolenaar 1319803af686SBram Moolenaarfunc g:Trigger() 1320803af686SBram Moolenaar source Ximport.vim 1321803af686SBram Moolenaar return "echo 'yes'\<CR>" 1322803af686SBram Moolenaarendfunc 1323803af686SBram Moolenaar 1324803af686SBram Moolenaardef Test_import_export_expr_map() 1325803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1326cfcd011fSBram Moolenaar var export_lines =<< trim END 1327803af686SBram Moolenaar vim9script 1328803af686SBram Moolenaar export def That(): string 1329803af686SBram Moolenaar return 'yes' 1330803af686SBram Moolenaar enddef 1331803af686SBram Moolenaar END 1332803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1333803af686SBram Moolenaar 1334cfcd011fSBram Moolenaar var import_lines =<< trim END 1335803af686SBram Moolenaar vim9script 1336803af686SBram Moolenaar import That from './Xexport_that.vim' 1337803af686SBram Moolenaar assert_equal('yes', That()) 1338803af686SBram Moolenaar END 1339803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1340803af686SBram Moolenaar 1341803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1342803af686SBram Moolenaar feedkeys('trigger', "xt") 1343803af686SBram Moolenaar 1344730b2483SBram Moolenaar delete('Xexport_that.vim') 1345803af686SBram Moolenaar delete('Ximport.vim') 1346803af686SBram Moolenaar nunmap trigger 1347803af686SBram Moolenaarenddef 1348803af686SBram Moolenaar 13498e1986e3SBram Moolenaardef Test_import_in_filetype() 13508e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13518e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1352cfcd011fSBram Moolenaar var export_lines =<< trim END 13538e1986e3SBram Moolenaar vim9script 1354cfcd011fSBram Moolenaar export var That = 'yes' 13558e1986e3SBram Moolenaar END 1356730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 13578e1986e3SBram Moolenaar 1358cfcd011fSBram Moolenaar var import_lines =<< trim END 13598e1986e3SBram Moolenaar vim9script 1360730b2483SBram Moolenaar import That from './Xexport_ft.vim' 13618e1986e3SBram Moolenaar assert_equal('yes', That) 13628e1986e3SBram Moolenaar g:did_load_mytpe = 1 13638e1986e3SBram Moolenaar END 13648e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 13658e1986e3SBram Moolenaar 1366cfcd011fSBram Moolenaar var save_rtp = &rtp 13678e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 13688e1986e3SBram Moolenaar 13698e1986e3SBram Moolenaar filetype plugin on 13708e1986e3SBram Moolenaar copen 13718e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 13728e1986e3SBram Moolenaar 13738e1986e3SBram Moolenaar quit! 1374730b2483SBram Moolenaar delete('Xexport_ft.vim') 13758e1986e3SBram Moolenaar delete('ftplugin', 'rf') 13768e1986e3SBram Moolenaar &rtp = save_rtp 13778e1986e3SBram Moolenaarenddef 13788e1986e3SBram Moolenaar 1379efa94447SBram Moolenaardef Test_use_import_in_mapping() 1380cfcd011fSBram Moolenaar var lines =<< trim END 1381efa94447SBram Moolenaar vim9script 1382efa94447SBram Moolenaar export def Funcx() 1383efa94447SBram Moolenaar g:result = 42 1384efa94447SBram Moolenaar enddef 1385efa94447SBram Moolenaar END 1386efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1387efa94447SBram Moolenaar lines =<< trim END 1388efa94447SBram Moolenaar vim9script 1389efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1390b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1391efa94447SBram Moolenaar END 1392efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1393efa94447SBram Moolenaar 1394efa94447SBram Moolenaar source Xmapscript.vim 1395b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1396efa94447SBram Moolenaar assert_equal(42, g:result) 1397efa94447SBram Moolenaar 1398efa94447SBram Moolenaar unlet g:result 1399efa94447SBram Moolenaar delete('XsomeExport.vim') 1400efa94447SBram Moolenaar delete('Xmapscript.vim') 1401b3ca9824SBram Moolenaar nunmap <F3> 1402efa94447SBram Moolenaarenddef 1403efa94447SBram Moolenaar 1404d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1405d3f8a9eeSBram Moolenaar var lines =<< trim END 1406d3f8a9eeSBram Moolenaar if has(g:feature) 1407d3f8a9eeSBram Moolenaar " legacy script 1408d3f8a9eeSBram Moolenaar let g:legacy = 1 1409d3f8a9eeSBram Moolenaar finish 1410d3f8a9eeSBram Moolenaar endif 1411d3f8a9eeSBram Moolenaar vim9script 1412d3f8a9eeSBram Moolenaar g:legacy = 0 1413d3f8a9eeSBram Moolenaar END 1414d3f8a9eeSBram Moolenaar g:feature = 'eval' 1415d3f8a9eeSBram Moolenaar g:legacy = -1 1416d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1417d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1418d3f8a9eeSBram Moolenaar 1419d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1420d3f8a9eeSBram Moolenaar g:legacy = -1 1421d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1422d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1423d3f8a9eeSBram Moolenaarenddef 1424d3f8a9eeSBram Moolenaar 1425750802b5SBram Moolenaardef Test_vim9script_fails() 14268a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14278a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1428cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 14299721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1430cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1431750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1432750802b5SBram Moolenaar 1433cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1434c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1435c785b9a7SBram Moolenaar 1436e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1437e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 14388a7d6542SBram Moolenaarenddef 14398a7d6542SBram Moolenaar 1440f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1441101f4810SBram Moolenaar CheckRunVimInTerminal 1442101f4810SBram Moolenaar 14439bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1444c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14459bb3eb3eSBram Moolenaarendfunc 14469bb3eb3eSBram Moolenaar 1447c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1448cfcd011fSBram Moolenaar var export =<< trim END 1449101f4810SBram Moolenaar vim9script 1450101f4810SBram Moolenaar export def Foo(): number 1451101f4810SBram Moolenaar return 0 1452101f4810SBram Moolenaar enddef 1453101f4810SBram Moolenaar END 1454730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1455101f4810SBram Moolenaar 1456e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 14579bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14582949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1459101f4810SBram Moolenaar 1460730b2483SBram Moolenaar delete('XexportCmd.vim') 14619bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14629bb3eb3eSBram Moolenaarenddef 1463101f4810SBram Moolenaar 14642b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 14652b32700dSBram Moolenaar var lines =<< trim END 1466a6294955SBram Moolenaar vim9script 1467a6294955SBram Moolenaar export var exported = 'thexport' 1468a6294955SBram Moolenaar END 1469a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1470a6294955SBram Moolenaar lines =<< trim END 14712b32700dSBram Moolenaar vim9script noclear 14722b32700dSBram Moolenaar g:loadCount += 1 14732b32700dSBram Moolenaar var s:reloaded = 'init' 1474a6294955SBram Moolenaar import exported from './XExportReload' 14752b32700dSBram Moolenaar 14762b32700dSBram Moolenaar def Again(): string 14772b32700dSBram Moolenaar return 'again' 14782b32700dSBram Moolenaar enddef 14792b32700dSBram Moolenaar 14802b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 14812b32700dSBram Moolenaar var s:loaded = true 14822b32700dSBram Moolenaar 14832b32700dSBram Moolenaar var s:notReloaded = 'yes' 14842b32700dSBram Moolenaar s:reloaded = 'first' 14852b32700dSBram Moolenaar def g:Values(): list<string> 1486a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 14872b32700dSBram Moolenaar enddef 14882b32700dSBram Moolenaar 14892b32700dSBram Moolenaar def Once(): string 14902b32700dSBram Moolenaar return 'once' 14912b32700dSBram Moolenaar enddef 14922b32700dSBram Moolenaar END 14932b32700dSBram Moolenaar writefile(lines, 'XReloaded') 14942b32700dSBram Moolenaar g:loadCount = 0 14952b32700dSBram Moolenaar source XReloaded 14962b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1497a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 14982b32700dSBram Moolenaar source XReloaded 14992b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1500a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15012b32700dSBram Moolenaar source XReloaded 15022b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1503a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15042b32700dSBram Moolenaar 150548e11c10SBram Moolenaar delete('XReloaded') 1506a6294955SBram Moolenaar delete('XExportReload') 15072b32700dSBram Moolenaar delfunc g:Values 15082b32700dSBram Moolenaar unlet g:loadCount 15092b32700dSBram Moolenaarenddef 15102b32700dSBram Moolenaar 15114c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1512cfcd011fSBram Moolenaar var lines =<< trim END 15138a7d6542SBram Moolenaar vim9script 15148a7d6542SBram Moolenaar const var = '' 1515cfcd011fSBram Moolenaar var valone = 1234 15168a7d6542SBram Moolenaar def MyFunc(arg: string) 15178a7d6542SBram Moolenaar valone = 5678 15188a7d6542SBram Moolenaar enddef 15198a7d6542SBram Moolenaar END 1520cfcd011fSBram Moolenaar var morelines =<< trim END 1521cfcd011fSBram Moolenaar var valtwo = 222 15228a7d6542SBram Moolenaar export def GetValtwo(): number 15238a7d6542SBram Moolenaar return valtwo 15248a7d6542SBram Moolenaar enddef 15258a7d6542SBram Moolenaar END 152603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15278a7d6542SBram Moolenaar source Xreload.vim 15288a7d6542SBram Moolenaar source Xreload.vim 15298a7d6542SBram Moolenaar source Xreload.vim 15308a7d6542SBram Moolenaar 1531cfcd011fSBram Moolenaar var testlines =<< trim END 15328a7d6542SBram Moolenaar vim9script 15338a7d6542SBram Moolenaar def TheFunc() 15348a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15358a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15368a7d6542SBram Moolenaar enddef 15378a7d6542SBram Moolenaar TheFunc() 15388a7d6542SBram Moolenaar END 15398a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15408a7d6542SBram Moolenaar source Ximport.vim 15418a7d6542SBram Moolenaar 1542f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1543f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15448a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15458a7d6542SBram Moolenaar source Ximport.vim 15468a7d6542SBram Moolenaar 1547f5be8cdbSBram Moolenaar # cannot declare a var twice 15488a7d6542SBram Moolenaar lines =<< trim END 15498a7d6542SBram Moolenaar vim9script 1550cfcd011fSBram Moolenaar var valone = 1234 1551cfcd011fSBram Moolenaar var valone = 5678 15528a7d6542SBram Moolenaar END 15538a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 155444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 15558a7d6542SBram Moolenaar 15568a7d6542SBram Moolenaar delete('Xreload.vim') 15578a7d6542SBram Moolenaar delete('Ximport.vim') 15588a7d6542SBram Moolenaarenddef 15598a7d6542SBram Moolenaar 156007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 156107a65d26SBram Moolenaar" compiled function using that variable must fail. 156207a65d26SBram Moolenaardef Test_script_reload_change_type() 156307a65d26SBram Moolenaar var lines =<< trim END 156407a65d26SBram Moolenaar vim9script noclear 156507a65d26SBram Moolenaar var str = 'string' 156607a65d26SBram Moolenaar def g:GetStr(): string 156707a65d26SBram Moolenaar return str .. 'xxx' 156807a65d26SBram Moolenaar enddef 156907a65d26SBram Moolenaar END 157007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 157107a65d26SBram Moolenaar source Xreload.vim 157207a65d26SBram Moolenaar echo g:GetStr() 157307a65d26SBram Moolenaar 157407a65d26SBram Moolenaar lines =<< trim END 157507a65d26SBram Moolenaar vim9script noclear 157607a65d26SBram Moolenaar var str = 1234 157707a65d26SBram Moolenaar END 157807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 157907a65d26SBram Moolenaar source Xreload.vim 158007a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 158107a65d26SBram Moolenaar 158207a65d26SBram Moolenaar delfunc g:GetStr 158307a65d26SBram Moolenaar delete('Xreload.vim') 158407a65d26SBram Moolenaarenddef 158507a65d26SBram Moolenaar 1586c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1587c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1588c970e422SBram Moolenaar 1589c970e422SBram Moolenaardef Test_script_reload_from_function() 1590c970e422SBram Moolenaar var lines =<< trim END 1591c970e422SBram Moolenaar vim9script 1592c970e422SBram Moolenaar 1593c970e422SBram Moolenaar if exists('g:loaded') 1594c970e422SBram Moolenaar finish 1595c970e422SBram Moolenaar endif 1596c970e422SBram Moolenaar g:loaded = 1 1597c970e422SBram Moolenaar delcommand CallFunc 1598c970e422SBram Moolenaar command CallFunc Func() 1599c970e422SBram Moolenaar def Func() 1600a4c81beaSBram Moolenaar so XreloadFunc.vim 1601c970e422SBram Moolenaar g:didTheFunc = 1 1602c970e422SBram Moolenaar enddef 1603c970e422SBram Moolenaar END 1604c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1605c970e422SBram Moolenaar source XreloadFunc.vim 1606c970e422SBram Moolenaar CallFunc 1607c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1608c970e422SBram Moolenaar 1609c970e422SBram Moolenaar delete('XreloadFunc.vim') 1610c970e422SBram Moolenaar delcommand CallFunc 1611c970e422SBram Moolenaar unlet g:loaded 1612c970e422SBram Moolenaar unlet g:didTheFunc 1613c970e422SBram Moolenaarenddef 1614c970e422SBram Moolenaar 16156c3843caSBram Moolenaardef Test_script_var_shadows_function() 16166c3843caSBram Moolenaar var lines =<< trim END 16176c3843caSBram Moolenaar vim9script 16186c3843caSBram Moolenaar def Func(): number 16196c3843caSBram Moolenaar return 123 16206c3843caSBram Moolenaar enddef 16216c3843caSBram Moolenaar var Func = 1 16226c3843caSBram Moolenaar END 16236c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 16246c3843caSBram Moolenaarenddef 16256c3843caSBram Moolenaar 162695006e3dSBram Moolenaardef s:RetSome(): string 162795006e3dSBram Moolenaar return 'some' 162895006e3dSBram Moolenaarenddef 162995006e3dSBram Moolenaar 1630fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1631fe465a01SBram Moolenaar" script-local name. 1632fe465a01SBram Moolenaardef Test_vim9script_funcref() 1633cfcd011fSBram Moolenaar var sortlines =<< trim END 1634fe465a01SBram Moolenaar vim9script 1635fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1636bed36b93SBram Moolenaar return i2 - i1 1637fe465a01SBram Moolenaar enddef 1638fe465a01SBram Moolenaar 1639fe465a01SBram Moolenaar export def FastSort(): list<number> 1640fe465a01SBram Moolenaar return range(5)->sort(Compare) 1641fe465a01SBram Moolenaar enddef 1642529fb5a5SBram Moolenaar 1643529fb5a5SBram Moolenaar export def GetString(arg: string): string 1644529fb5a5SBram Moolenaar return arg 1645529fb5a5SBram Moolenaar enddef 1646fe465a01SBram Moolenaar END 1647fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1648fe465a01SBram Moolenaar 1649cfcd011fSBram Moolenaar var lines =<< trim END 1650fe465a01SBram Moolenaar vim9script 1651fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1652fe465a01SBram Moolenaar def Test() 1653fe465a01SBram Moolenaar g:result = FastSort() 1654fe465a01SBram Moolenaar enddef 1655fe465a01SBram Moolenaar Test() 1656529fb5a5SBram Moolenaar 1657529fb5a5SBram Moolenaar # using a function imported with "as" 1658529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1659529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1660529fb5a5SBram Moolenaar 1661529fb5a5SBram Moolenaar # using the function from a compiled function 1662529fb5a5SBram Moolenaar def TestMore(): string 1663ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1664ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1665529fb5a5SBram Moolenaar enddef 1666ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1667529fb5a5SBram Moolenaar 1668529fb5a5SBram Moolenaar # error when using a function that isn't exported 1669529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1670fe465a01SBram Moolenaar END 1671fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1672fe465a01SBram Moolenaar 1673fe465a01SBram Moolenaar source Xscript.vim 1674fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1675fe465a01SBram Moolenaar 1676fe465a01SBram Moolenaar unlet g:result 1677fe465a01SBram Moolenaar delete('Xsort.vim') 1678fe465a01SBram Moolenaar delete('Xscript.vim') 167995006e3dSBram Moolenaar 1680cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 168195006e3dSBram Moolenaar assert_equal('some', Funcref()) 1682fe465a01SBram Moolenaarenddef 1683fe465a01SBram Moolenaar 1684601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1685601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1686601e76acSBram Moolenaar" function reference. 1687c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1688cfcd011fSBram Moolenaar var filterLines =<< trim END 1689c620c055SBram Moolenaar vim9script 1690c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1691c620c055SBram Moolenaar return idx % 2 == 1 1692c620c055SBram Moolenaar enddef 1693c620c055SBram Moolenaar export def FastFilter(): list<number> 1694c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1695c620c055SBram Moolenaar enddef 1696601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1697601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1698601e76acSBram Moolenaar enddef 1699c620c055SBram Moolenaar END 1700c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1701c620c055SBram Moolenaar 1702cfcd011fSBram Moolenaar var lines =<< trim END 1703c620c055SBram Moolenaar vim9script 1704601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1705c620c055SBram Moolenaar def Test() 1706cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1707c620c055SBram Moolenaar enddef 1708c620c055SBram Moolenaar Test() 1709601e76acSBram Moolenaar def TestDirect() 1710cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1711601e76acSBram Moolenaar enddef 1712601e76acSBram Moolenaar TestDirect() 1713c620c055SBram Moolenaar END 1714601e76acSBram Moolenaar CheckScriptSuccess(lines) 1715c620c055SBram Moolenaar delete('Xfilter.vim') 1716c620c055SBram Moolenaarenddef 1717c620c055SBram Moolenaar 17184c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1719cfcd011fSBram Moolenaar var first_lines =<< trim END 17204c17ad94SBram Moolenaar vim9script 17214c17ad94SBram Moolenaar def FuncYes(): string 17224c17ad94SBram Moolenaar return 'yes' 17234c17ad94SBram Moolenaar enddef 17244c17ad94SBram Moolenaar END 1725cfcd011fSBram Moolenaar var withno_lines =<< trim END 17264c17ad94SBram Moolenaar def FuncNo(): string 17274c17ad94SBram Moolenaar return 'no' 17284c17ad94SBram Moolenaar enddef 17294c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17304c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17314c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 173203afdcf1SBram Moolenaar enddef 173303afdcf1SBram Moolenaar END 1734cfcd011fSBram Moolenaar var nono_lines =<< trim END 173503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 173603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 173744d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17384c17ad94SBram Moolenaar enddef 17394c17ad94SBram Moolenaar END 17404c17ad94SBram Moolenaar 17414c17ad94SBram Moolenaar # FuncNo() is defined 174203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17434c17ad94SBram Moolenaar source Xreloaded.vim 17444c17ad94SBram Moolenaar g:DoCheck(true) 17454c17ad94SBram Moolenaar 17464c17ad94SBram Moolenaar # FuncNo() is not redefined 174703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17484c17ad94SBram Moolenaar source Xreloaded.vim 17495082471fSBram Moolenaar g:DoCheck(false) 17504c17ad94SBram Moolenaar 17514c17ad94SBram Moolenaar # FuncNo() is back 175203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17534c17ad94SBram Moolenaar source Xreloaded.vim 17545082471fSBram Moolenaar g:DoCheck(false) 17554c17ad94SBram Moolenaar 17564c17ad94SBram Moolenaar delete('Xreloaded.vim') 17574c17ad94SBram Moolenaarenddef 17584c17ad94SBram Moolenaar 175989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 176089483d40SBram Moolenaar # write the script with a script-local variable 1761cfcd011fSBram Moolenaar var lines =<< trim END 176289483d40SBram Moolenaar vim9script 1763cfcd011fSBram Moolenaar var name = 'string' 176489483d40SBram Moolenaar END 176589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 176689483d40SBram Moolenaar source XreloadVar.vim 176789483d40SBram Moolenaar 176889483d40SBram Moolenaar # now write the script using the same variable locally - works 176989483d40SBram Moolenaar lines =<< trim END 177089483d40SBram Moolenaar vim9script 177189483d40SBram Moolenaar def Func() 1772cfcd011fSBram Moolenaar var name = 'string' 177389483d40SBram Moolenaar enddef 177489483d40SBram Moolenaar END 177589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 177689483d40SBram Moolenaar source XreloadVar.vim 177789483d40SBram Moolenaar 177889483d40SBram Moolenaar delete('XreloadVar.vim') 177989483d40SBram Moolenaarenddef 178089483d40SBram Moolenaar 17818a7d6542SBram Moolenaardef Test_import_absolute() 1782cfcd011fSBram Moolenaar var import_lines = [ 1783e6085c53SBram Moolenaar 'vim9script', 1784e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1785e6085c53SBram Moolenaar 'def UseExported()', 1786e6085c53SBram Moolenaar ' g:imported_abs = exported', 1787e6085c53SBram Moolenaar ' exported = 8888', 1788e6085c53SBram Moolenaar ' g:imported_after = exported', 1789e6085c53SBram Moolenaar 'enddef', 1790e6085c53SBram Moolenaar 'UseExported()', 1791e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1792e6085c53SBram Moolenaar ] 17938a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 17948a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 17958a7d6542SBram Moolenaar 17968a7d6542SBram Moolenaar source Ximport_abs.vim 17978a7d6542SBram Moolenaar 17988a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 17994e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1800fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1801fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1802fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1803fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1804fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1805fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1806fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1807fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1808fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1809fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1810e6085c53SBram Moolenaar g:import_disassembled) 1811b3ca9824SBram Moolenaar 1812b3ca9824SBram Moolenaar Undo_export_script_lines() 18138a7d6542SBram Moolenaar unlet g:imported_abs 18144e12a5dfSBram Moolenaar unlet g:import_disassembled 18158a7d6542SBram Moolenaar 18168a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18178a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18188a7d6542SBram Moolenaarenddef 18198a7d6542SBram Moolenaar 18208a7d6542SBram Moolenaardef Test_import_rtp() 1821cfcd011fSBram Moolenaar var import_lines = [ 1822e6085c53SBram Moolenaar 'vim9script', 1823e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1824e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1825e6085c53SBram Moolenaar ] 18268a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18278a7d6542SBram Moolenaar mkdir('import') 18288a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18298a7d6542SBram Moolenaar 1830cfcd011fSBram Moolenaar var save_rtp = &rtp 18318a7d6542SBram Moolenaar &rtp = getcwd() 18328a7d6542SBram Moolenaar source Ximport_rtp.vim 18338a7d6542SBram Moolenaar &rtp = save_rtp 18348a7d6542SBram Moolenaar 18358a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18368a7d6542SBram Moolenaar 1837b3ca9824SBram Moolenaar Undo_export_script_lines() 1838b3ca9824SBram Moolenaar unlet g:imported_rtp 18398a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 184089483d40SBram Moolenaar delete('import', 'rf') 18418a7d6542SBram Moolenaarenddef 18428a7d6542SBram Moolenaar 184325e0f586SBram Moolenaardef Test_import_compile_error() 1844cfcd011fSBram Moolenaar var export_lines = [ 184525e0f586SBram Moolenaar 'vim9script', 184625e0f586SBram Moolenaar 'export def ExpFunc(): string', 184725e0f586SBram Moolenaar ' return notDefined', 184825e0f586SBram Moolenaar 'enddef', 184925e0f586SBram Moolenaar ] 185025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 185125e0f586SBram Moolenaar 1852cfcd011fSBram Moolenaar var import_lines = [ 185325e0f586SBram Moolenaar 'vim9script', 185425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 185525e0f586SBram Moolenaar 'def ImpFunc()', 185625e0f586SBram Moolenaar ' echo ExpFunc()', 185725e0f586SBram Moolenaar 'enddef', 185825e0f586SBram Moolenaar 'defcompile', 185925e0f586SBram Moolenaar ] 186025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 186125e0f586SBram Moolenaar 186225e0f586SBram Moolenaar try 186325e0f586SBram Moolenaar source Ximport.vim 186425e0f586SBram Moolenaar catch /E1001/ 1865f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 18667707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 186725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 186825e0f586SBram Moolenaar endtry 186925e0f586SBram Moolenaar 187025e0f586SBram Moolenaar delete('Xexported.vim') 187125e0f586SBram Moolenaar delete('Ximport.vim') 187225e0f586SBram Moolenaarenddef 187325e0f586SBram Moolenaar 1874c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1875cfcd011fSBram Moolenaar var lines = [ 1876c4ce36d4SBram Moolenaar 'vim9script', 1877c4ce36d4SBram Moolenaar 'def Func()', 1878c4ce36d4SBram Moolenaar ' eval [][0]', 1879c4ce36d4SBram Moolenaar 'enddef', 1880c4ce36d4SBram Moolenaar 'Func()', 1881c4ce36d4SBram Moolenaar ] 1882c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1883c4ce36d4SBram Moolenaar 1884c4ce36d4SBram Moolenaar for count in range(3) 1885c4ce36d4SBram Moolenaar try 1886c4ce36d4SBram Moolenaar source Xtestscript.vim 1887c4ce36d4SBram Moolenaar catch /E684/ 1888c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1889c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1890c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1891c4ce36d4SBram Moolenaar endtry 1892c4ce36d4SBram Moolenaar endfor 1893c4ce36d4SBram Moolenaar 1894c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1895c4ce36d4SBram Moolenaarenddef 1896c4ce36d4SBram Moolenaar 1897eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1898cfcd011fSBram Moolenaar var export_lines =<< trim END 1899eef2102eSBram Moolenaar vim9script 1900eef2102eSBram Moolenaar export def Func() 1901eef2102eSBram Moolenaar echo 'imported' 1902eef2102eSBram Moolenaar enddef 1903eef2102eSBram Moolenaar END 1904eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1905eef2102eSBram Moolenaar 1906cfcd011fSBram Moolenaar var lines =<< trim END 1907eef2102eSBram Moolenaar vim9script 1908eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1909eef2102eSBram Moolenaar def Func() 1910eef2102eSBram Moolenaar echo 'local to function' 1911eef2102eSBram Moolenaar enddef 1912eef2102eSBram Moolenaar END 1913eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1914eef2102eSBram Moolenaar 1915eef2102eSBram Moolenaar lines =<< trim END 1916eef2102eSBram Moolenaar vim9script 1917eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1918eef2102eSBram Moolenaar def Outer() 1919eef2102eSBram Moolenaar def Func() 1920eef2102eSBram Moolenaar echo 'local to function' 1921eef2102eSBram Moolenaar enddef 1922eef2102eSBram Moolenaar enddef 1923eef2102eSBram Moolenaar defcompile 1924eef2102eSBram Moolenaar END 1925eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1926eef2102eSBram Moolenaar 1927eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1928eef2102eSBram Moolenaarenddef 1929eef2102eSBram Moolenaar 1930b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1931cfcd011fSBram Moolenaar var lines =<< trim END 1932b9a2cac3SBram Moolenaar vim9script 1933b9a2cac3SBram Moolenaar def Func() 1934b9a2cac3SBram Moolenaar echo 'one' 1935b9a2cac3SBram Moolenaar enddef 1936b9a2cac3SBram Moolenaar def Func() 1937b9a2cac3SBram Moolenaar echo 'two' 1938b9a2cac3SBram Moolenaar enddef 1939b9a2cac3SBram Moolenaar END 1940b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1941fa211f3cSBram Moolenaar 1942fa211f3cSBram Moolenaar lines =<< trim END 1943fa211f3cSBram Moolenaar vim9script 1944fa211f3cSBram Moolenaar def Foo(): string 1945fa211f3cSBram Moolenaar return 'foo' 1946fa211f3cSBram Moolenaar enddef 1947fa211f3cSBram Moolenaar def Func() 1948cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1949fa211f3cSBram Moolenaar enddef 1950fa211f3cSBram Moolenaar defcompile 1951fa211f3cSBram Moolenaar END 1952fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1953b9a2cac3SBram Moolenaarenddef 1954b9a2cac3SBram Moolenaar 19558a7d6542SBram Moolenaardef Test_fixed_size_list() 1956f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1957cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 19588a7d6542SBram Moolenaar l->remove(0) 19598a7d6542SBram Moolenaar l->add(5) 19608a7d6542SBram Moolenaar l->insert(99, 1) 19610f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19628a7d6542SBram Moolenaarenddef 19638a7d6542SBram Moolenaar 1964ae616494SBram Moolenaardef Test_no_insert_xit() 1965d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1966d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1967d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1968d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1969d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1970ae616494SBram Moolenaar 1971ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1972ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1973ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1974ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1975f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1976f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 19776508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 19786508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 1979f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1980f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1981f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1982ae616494SBram Moolenaarenddef 1983ae616494SBram Moolenaar 1984158906cfSBram Moolenaardef IfElse(what: number): string 1985cfcd011fSBram Moolenaar var res = '' 1986158906cfSBram Moolenaar if what == 1 1987158906cfSBram Moolenaar res = "one" 1988158906cfSBram Moolenaar elseif what == 2 1989158906cfSBram Moolenaar res = "two" 1990a259d8d3SBram Moolenaar else 1991158906cfSBram Moolenaar res = "three" 1992a259d8d3SBram Moolenaar endif 1993158906cfSBram Moolenaar return res 1994a259d8d3SBram Moolenaarenddef 1995a259d8d3SBram Moolenaar 1996158906cfSBram Moolenaardef Test_if_elseif_else() 1997158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1998158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1999158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20000f18b6d1SBram Moolenaarenddef 20010f18b6d1SBram Moolenaar 2002e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2003d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2004d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2005d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2006ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2007d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 20086628b7ebSBram Moolenaar 20096628b7ebSBram Moolenaar var lines =<< trim END 20106628b7ebSBram Moolenaar var s = '' 20116628b7ebSBram Moolenaar if s = '' 20126628b7ebSBram Moolenaar endif 20136628b7ebSBram Moolenaar END 20146628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 20156628b7ebSBram Moolenaar 20166628b7ebSBram Moolenaar lines =<< trim END 20176628b7ebSBram Moolenaar var s = '' 20186628b7ebSBram Moolenaar if s == '' 20196628b7ebSBram Moolenaar elseif s = '' 20206628b7ebSBram Moolenaar endif 20216628b7ebSBram Moolenaar END 20226628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2023e8c4abbbSBram Moolenaarenddef 2024e8c4abbbSBram Moolenaar 20256d69bf60SBram Moolenaarlet g:bool_true = v:true 20266d69bf60SBram Moolenaarlet g:bool_false = v:false 20276d69bf60SBram Moolenaar 20286d69bf60SBram Moolenaardef Test_if_const_expr() 2029cfcd011fSBram Moolenaar var res = false 20306d69bf60SBram Moolenaar if true ? true : false 20316d69bf60SBram Moolenaar res = true 20326d69bf60SBram Moolenaar endif 20336d69bf60SBram Moolenaar assert_equal(true, res) 20346d69bf60SBram Moolenaar 2035585fea7bSBram Moolenaar g:glob = 2 2036585fea7bSBram Moolenaar if false 20376797966dSBram Moolenaar execute('g:glob = 3') 2038585fea7bSBram Moolenaar endif 2039585fea7bSBram Moolenaar assert_equal(2, g:glob) 2040585fea7bSBram Moolenaar if true 20416797966dSBram Moolenaar execute('g:glob = 3') 2042585fea7bSBram Moolenaar endif 2043585fea7bSBram Moolenaar assert_equal(3, g:glob) 2044585fea7bSBram Moolenaar 20456d69bf60SBram Moolenaar res = false 20466d69bf60SBram Moolenaar if g:bool_true ? true : false 20476d69bf60SBram Moolenaar res = true 20486d69bf60SBram Moolenaar endif 20496d69bf60SBram Moolenaar assert_equal(true, res) 20506d69bf60SBram Moolenaar 20516d69bf60SBram Moolenaar res = false 20526d69bf60SBram Moolenaar if true ? g:bool_true : false 20536d69bf60SBram Moolenaar res = true 20546d69bf60SBram Moolenaar endif 20556d69bf60SBram Moolenaar assert_equal(true, res) 20566d69bf60SBram Moolenaar 20576d69bf60SBram Moolenaar res = false 20586d69bf60SBram Moolenaar if true ? true : g:bool_false 20596d69bf60SBram Moolenaar res = true 20606d69bf60SBram Moolenaar endif 20616d69bf60SBram Moolenaar assert_equal(true, res) 20626d69bf60SBram Moolenaar 20636d69bf60SBram Moolenaar res = false 20646d69bf60SBram Moolenaar if true ? false : true 20656d69bf60SBram Moolenaar res = true 20666d69bf60SBram Moolenaar endif 20676d69bf60SBram Moolenaar assert_equal(false, res) 20686d69bf60SBram Moolenaar 20696d69bf60SBram Moolenaar res = false 20706d69bf60SBram Moolenaar if false ? false : true 20716d69bf60SBram Moolenaar res = true 20726d69bf60SBram Moolenaar endif 20736d69bf60SBram Moolenaar assert_equal(true, res) 20746d69bf60SBram Moolenaar 20756d69bf60SBram Moolenaar res = false 20766d69bf60SBram Moolenaar if false ? true : false 20776d69bf60SBram Moolenaar res = true 20786d69bf60SBram Moolenaar endif 20796d69bf60SBram Moolenaar assert_equal(false, res) 20806d69bf60SBram Moolenaar 20816d69bf60SBram Moolenaar res = false 2082e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2083e8c4abbbSBram Moolenaar res = true 2084e8c4abbbSBram Moolenaar endif 2085e8c4abbbSBram Moolenaar assert_equal(false, res) 2086e8c4abbbSBram Moolenaar 2087e8c4abbbSBram Moolenaar res = false 20886d69bf60SBram Moolenaar if true && true 20896d69bf60SBram Moolenaar res = true 20906d69bf60SBram Moolenaar endif 20916d69bf60SBram Moolenaar assert_equal(true, res) 20926d69bf60SBram Moolenaar 20936d69bf60SBram Moolenaar res = false 20946d69bf60SBram Moolenaar if true && false 20956d69bf60SBram Moolenaar res = true 20966d69bf60SBram Moolenaar endif 20976d69bf60SBram Moolenaar assert_equal(false, res) 20986d69bf60SBram Moolenaar 20996d69bf60SBram Moolenaar res = false 21006d69bf60SBram Moolenaar if g:bool_true && false 21016d69bf60SBram Moolenaar res = true 21026d69bf60SBram Moolenaar endif 21036d69bf60SBram Moolenaar assert_equal(false, res) 21046d69bf60SBram Moolenaar 21056d69bf60SBram Moolenaar res = false 21066d69bf60SBram Moolenaar if true && g:bool_false 21076d69bf60SBram Moolenaar res = true 21086d69bf60SBram Moolenaar endif 21096d69bf60SBram Moolenaar assert_equal(false, res) 21106d69bf60SBram Moolenaar 21116d69bf60SBram Moolenaar res = false 21126d69bf60SBram Moolenaar if false && false 21136d69bf60SBram Moolenaar res = true 21146d69bf60SBram Moolenaar endif 21156d69bf60SBram Moolenaar assert_equal(false, res) 21166d69bf60SBram Moolenaar 21176d69bf60SBram Moolenaar res = false 21186d69bf60SBram Moolenaar if true || false 21196d69bf60SBram Moolenaar res = true 21206d69bf60SBram Moolenaar endif 21216d69bf60SBram Moolenaar assert_equal(true, res) 21226d69bf60SBram Moolenaar 21236d69bf60SBram Moolenaar res = false 21246d69bf60SBram Moolenaar if g:bool_true || false 21256d69bf60SBram Moolenaar res = true 21266d69bf60SBram Moolenaar endif 21276d69bf60SBram Moolenaar assert_equal(true, res) 21286d69bf60SBram Moolenaar 21296d69bf60SBram Moolenaar res = false 21306d69bf60SBram Moolenaar if true || g:bool_false 21316d69bf60SBram Moolenaar res = true 21326d69bf60SBram Moolenaar endif 21336d69bf60SBram Moolenaar assert_equal(true, res) 21346d69bf60SBram Moolenaar 21356d69bf60SBram Moolenaar res = false 21366d69bf60SBram Moolenaar if false || false 21376d69bf60SBram Moolenaar res = true 21386d69bf60SBram Moolenaar endif 21396d69bf60SBram Moolenaar assert_equal(false, res) 21403988f64fSBram Moolenaar 21413988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21423988f64fSBram Moolenaar if false | eval 0 | endif 21433988f64fSBram Moolenaar if false | eval burp + 234 | endif 21443988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21453988f64fSBram Moolenaar if false 21463988f64fSBram Moolenaar burp 21473988f64fSBram Moolenaar endif 214880c34ca3SBram Moolenaarenddef 21496d69bf60SBram Moolenaar 215080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2151d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2152d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2153d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2154d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21556d69bf60SBram Moolenaarenddef 21566d69bf60SBram Moolenaar 215772abcf42SBram Moolenaardef RunNested(i: number): number 2158cfcd011fSBram Moolenaar var x: number = 0 215972abcf42SBram Moolenaar if i % 2 216072abcf42SBram Moolenaar if 1 2161f5be8cdbSBram Moolenaar # comment 216272abcf42SBram Moolenaar else 2163f5be8cdbSBram Moolenaar # comment 216472abcf42SBram Moolenaar endif 216572abcf42SBram Moolenaar x += 1 216672abcf42SBram Moolenaar else 216772abcf42SBram Moolenaar x += 1000 216872abcf42SBram Moolenaar endif 216972abcf42SBram Moolenaar return x 217072abcf42SBram Moolenaarenddef 217172abcf42SBram Moolenaar 217272abcf42SBram Moolenaardef Test_nested_if() 217372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 217472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 217572abcf42SBram Moolenaarenddef 217672abcf42SBram Moolenaar 2177ad39c094SBram Moolenaardef Test_execute_cmd() 2178e4984290SBram Moolenaar # missing argument is ignored 2179e4984290SBram Moolenaar execute 2180e4984290SBram Moolenaar execute # comment 2181e4984290SBram Moolenaar 2182ad39c094SBram Moolenaar new 2183ad39c094SBram Moolenaar setline(1, 'default') 2184d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2185ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2186a72cfb80SBram Moolenaar 2187d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2188a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2189a72cfb80SBram Moolenaar 2190cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2191cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2192a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2193ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2194a72cfb80SBram Moolenaar 2195d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2196ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2197a72cfb80SBram Moolenaar 2198cfcd011fSBram Moolenaar var cmd_first = 'call ' 2199cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2200ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2201ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2202ad39c094SBram Moolenaar bwipe! 2203585fea7bSBram Moolenaar 2204cfcd011fSBram Moolenaar var n = true 22052d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22062d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22072d6b20d6SBram Moolenaar 2208e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2209e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2210e5abf7afSBram Moolenaar 2211d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2212d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2213d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2214ad39c094SBram Moolenaarenddef 2215ad39c094SBram Moolenaar 221647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2217f5be8cdbSBram Moolenaar # only checks line continuation 2218cfcd011fSBram Moolenaar var lines =<< trim END 221947e880d6SBram Moolenaar vim9script 222047e880d6SBram Moolenaar execute 'g:someVar' 222147e880d6SBram Moolenaar .. ' = ' .. 222247e880d6SBram Moolenaar '28' 222347e880d6SBram Moolenaar assert_equal(28, g:someVar) 222447e880d6SBram Moolenaar unlet g:someVar 222547e880d6SBram Moolenaar END 222647e880d6SBram Moolenaar CheckScriptSuccess(lines) 222747e880d6SBram Moolenaarenddef 222847e880d6SBram Moolenaar 2229ad39c094SBram Moolenaardef Test_echo_cmd() 2230a72cfb80SBram Moolenaar echo 'some' # comment 2231585fea7bSBram Moolenaar echon 'thing' 2232ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2233ad39c094SBram Moolenaar 2234a72cfb80SBram Moolenaar echo "some" # comment 2235a72cfb80SBram Moolenaar echon "thing" 2236a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2237a72cfb80SBram Moolenaar 2238cfcd011fSBram Moolenaar var str1 = 'some' 2239cfcd011fSBram Moolenaar var str2 = 'more' 2240ad39c094SBram Moolenaar echo str1 str2 2241ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2242a72cfb80SBram Moolenaar 2243d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2244ad39c094SBram Moolenaarenddef 2245ad39c094SBram Moolenaar 2246f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2247f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2248f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2249f93c7feaSBram Moolenaar echo 'clear' 2250df069eecSBram Moolenaar :1messages 2251f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2252f93c7feaSBram Moolenaar 2253d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2254f93c7feaSBram Moolenaarenddef 2255f93c7feaSBram Moolenaar 225647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2257f5be8cdbSBram Moolenaar # only checks line continuation 2258cfcd011fSBram Moolenaar var lines =<< trim END 225947e880d6SBram Moolenaar vim9script 226047e880d6SBram Moolenaar echomsg 'here' 226147e880d6SBram Moolenaar .. ' is ' .. 226247e880d6SBram Moolenaar 'a message' 226347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 226447e880d6SBram Moolenaar END 226547e880d6SBram Moolenaar CheckScriptSuccess(lines) 226647e880d6SBram Moolenaarenddef 226747e880d6SBram Moolenaar 2268f93c7feaSBram Moolenaardef Test_echoerr_cmd() 226940ee466cSBram Moolenaar try 227040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 227140ee466cSBram Moolenaar catch 227240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 227340ee466cSBram Moolenaar endtry 2274f93c7feaSBram Moolenaarenddef 2275f93c7feaSBram Moolenaar 227647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2277f5be8cdbSBram Moolenaar # only checks line continuation 2278cfcd011fSBram Moolenaar var lines =<< trim END 227947e880d6SBram Moolenaar vim9script 228047e880d6SBram Moolenaar try 228147e880d6SBram Moolenaar echoerr 'this' 228247e880d6SBram Moolenaar .. ' is ' .. 228347e880d6SBram Moolenaar 'wrong' 228447e880d6SBram Moolenaar catch 228547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 228647e880d6SBram Moolenaar endtry 228747e880d6SBram Moolenaar END 228847e880d6SBram Moolenaar CheckScriptSuccess(lines) 228947e880d6SBram Moolenaarenddef 229047e880d6SBram Moolenaar 229141fe0617SBram Moolenaardef Test_for_outside_of_function() 2292cfcd011fSBram Moolenaar var lines =<< trim END 229341fe0617SBram Moolenaar vim9script 229441fe0617SBram Moolenaar new 229541fe0617SBram Moolenaar for var in range(0, 3) 229641fe0617SBram Moolenaar append(line('$'), var) 229741fe0617SBram Moolenaar endfor 229841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 229941fe0617SBram Moolenaar bwipe! 2300522eefd9SBram Moolenaar 2301522eefd9SBram Moolenaar var result = '' 2302522eefd9SBram Moolenaar for i in [1, 2, 3] 2303522eefd9SBram Moolenaar var loop = ' loop ' .. i 2304522eefd9SBram Moolenaar result ..= loop 2305522eefd9SBram Moolenaar endfor 2306522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 230741fe0617SBram Moolenaar END 230841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 230941fe0617SBram Moolenaar source Xvim9for.vim 231041fe0617SBram Moolenaar delete('Xvim9for.vim') 231141fe0617SBram Moolenaarenddef 23128a7d6542SBram Moolenaar 2313e8c4abbbSBram Moolenaardef Test_for_loop() 2314f2253963SBram Moolenaar var lines =<< trim END 2315cfcd011fSBram Moolenaar var result = '' 2316e8c4abbbSBram Moolenaar for cnt in range(7) 2317e8c4abbbSBram Moolenaar if cnt == 4 2318e8c4abbbSBram Moolenaar break 2319e8c4abbbSBram Moolenaar endif 2320e8c4abbbSBram Moolenaar if cnt == 2 2321e8c4abbbSBram Moolenaar continue 2322e8c4abbbSBram Moolenaar endif 2323e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2324e8c4abbbSBram Moolenaar endfor 2325e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23260ad3e894SBram Moolenaar 2327cfcd011fSBram Moolenaar var concat = '' 23280ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23290ad3e894SBram Moolenaar concat ..= str 23300ad3e894SBram Moolenaar endfor 23310ad3e894SBram Moolenaar assert_equal('onetwo', concat) 233238bd8de5SBram Moolenaar 233338bd8de5SBram Moolenaar var total = 0 233438bd8de5SBram Moolenaar for nr in 233538bd8de5SBram Moolenaar [1, 2, 3] 233638bd8de5SBram Moolenaar total += nr 233738bd8de5SBram Moolenaar endfor 233838bd8de5SBram Moolenaar assert_equal(6, total) 233938bd8de5SBram Moolenaar 234038bd8de5SBram Moolenaar total = 0 234138bd8de5SBram Moolenaar for nr 234238bd8de5SBram Moolenaar in [1, 2, 3] 234338bd8de5SBram Moolenaar total += nr 234438bd8de5SBram Moolenaar endfor 234538bd8de5SBram Moolenaar assert_equal(6, total) 234638bd8de5SBram Moolenaar 234738bd8de5SBram Moolenaar total = 0 234838bd8de5SBram Moolenaar for nr 234938bd8de5SBram Moolenaar in 235038bd8de5SBram Moolenaar [1, 2, 3] 235138bd8de5SBram Moolenaar total += nr 235238bd8de5SBram Moolenaar endfor 235338bd8de5SBram Moolenaar assert_equal(6, total) 2354036d0714SBram Moolenaar 2355a3589a0dSBram Moolenaar # with type 2356a3589a0dSBram Moolenaar total = 0 2357a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2358a3589a0dSBram Moolenaar total += n 2359a3589a0dSBram Moolenaar endfor 2360a3589a0dSBram Moolenaar assert_equal(6, total) 2361a3589a0dSBram Moolenaar 2362fe090eb5SBram Moolenaar var chars = '' 2363fe090eb5SBram Moolenaar for s: string in 'foobar' 2364fe090eb5SBram Moolenaar chars ..= s 2365fe090eb5SBram Moolenaar endfor 2366fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2367fe090eb5SBram Moolenaar 2368a3589a0dSBram Moolenaar # unpack with type 2369f2253963SBram Moolenaar var res = '' 2370a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2371a3589a0dSBram Moolenaar res ..= n .. s 2372a3589a0dSBram Moolenaar endfor 2373a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2374a3589a0dSBram Moolenaar 2375a3589a0dSBram Moolenaar # loop over string 2376a3589a0dSBram Moolenaar res = '' 237774e54fcbSBram Moolenaar for c in 'aéc̀d' 237874e54fcbSBram Moolenaar res ..= c .. '-' 237974e54fcbSBram Moolenaar endfor 238074e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 238174e54fcbSBram Moolenaar 238274e54fcbSBram Moolenaar res = '' 238374e54fcbSBram Moolenaar for c in '' 238474e54fcbSBram Moolenaar res ..= c .. '-' 238574e54fcbSBram Moolenaar endfor 238674e54fcbSBram Moolenaar assert_equal('', res) 238774e54fcbSBram Moolenaar 238874e54fcbSBram Moolenaar res = '' 238974e54fcbSBram Moolenaar for c in test_null_string() 239074e54fcbSBram Moolenaar res ..= c .. '-' 239174e54fcbSBram Moolenaar endfor 239274e54fcbSBram Moolenaar assert_equal('', res) 2393f2253963SBram Moolenaar 2394f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2395f2253963SBram Moolenaar {a: 'Cat'} 2396f2253963SBram Moolenaar ] 2397f2253963SBram Moolenaar for dd in foo 2398f2253963SBram Moolenaar dd.counter = 12 2399f2253963SBram Moolenaar endfor 2400f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2401f2253963SBram Moolenaar END 2402f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2403e8c4abbbSBram Moolenaarenddef 2404e8c4abbbSBram Moolenaar 2405e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2406025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2407025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2408025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2409675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2410675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2411cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2412822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 24132d870f8dSBram Moolenaar delfunc! g:Func 2414675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2415675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2416675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 241774e54fcbSBram Moolenaar 241874e54fcbSBram Moolenaar # wrong type detected at compile time 241974e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 242074e54fcbSBram Moolenaar 242174e54fcbSBram Moolenaar # wrong type detected at runtime 242274e54fcbSBram Moolenaar g:adict = {a: 1} 242374e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 242474e54fcbSBram Moolenaar unlet g:adict 2425f6a8d420SBram Moolenaar 2426f6a8d420SBram Moolenaar var lines =<< trim END 2427f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2428f6a8d420SBram Moolenaar for e in d 2429f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2430f6a8d420SBram Moolenaar endfor 2431f6a8d420SBram Moolenaar END 2432f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2433fe090eb5SBram Moolenaar 2434fe090eb5SBram Moolenaar lines =<< trim END 2435fe090eb5SBram Moolenaar for nr: number in ['foo'] 2436fe090eb5SBram Moolenaar endfor 2437fe090eb5SBram Moolenaar END 2438fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2439e8c4abbbSBram Moolenaarenddef 2440e8c4abbbSBram Moolenaar 2441ea87069dSBram Moolenaardef Test_for_loop_script_var() 2442ea87069dSBram Moolenaar # cannot use s:var in a :def function 2443ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2444ea87069dSBram Moolenaar 2445ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2446ea87069dSBram Moolenaar var lines =<< trim END 2447ea87069dSBram Moolenaar vim9script 2448ea87069dSBram Moolenaar var total = 0 2449ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2450ea87069dSBram Moolenaar total += s:var 2451ea87069dSBram Moolenaar endfor 2452ea87069dSBram Moolenaar assert_equal(6, total) 2453ea87069dSBram Moolenaar 2454ea87069dSBram Moolenaar total = 0 2455ea87069dSBram Moolenaar for var in [1, 2, 3] 2456ea87069dSBram Moolenaar total += var 2457ea87069dSBram Moolenaar endfor 2458ea87069dSBram Moolenaar assert_equal(6, total) 2459ea87069dSBram Moolenaar END 2460ea87069dSBram Moolenaarenddef 2461ea87069dSBram Moolenaar 2462792f786aSBram Moolenaardef Test_for_loop_unpack() 24634b8a0651SBram Moolenaar var lines =<< trim END 2464792f786aSBram Moolenaar var result = [] 2465792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2466792f786aSBram Moolenaar result->add(v1) 2467792f786aSBram Moolenaar result->add(v2) 2468792f786aSBram Moolenaar endfor 2469792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2470792f786aSBram Moolenaar 2471792f786aSBram Moolenaar result = [] 2472792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2473792f786aSBram Moolenaar result->add(v1) 2474792f786aSBram Moolenaar result->add(v2) 2475792f786aSBram Moolenaar result->add(v3) 2476792f786aSBram Moolenaar endfor 2477792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2478792f786aSBram Moolenaar 24794b8a0651SBram Moolenaar result = [] 24804b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 24814b8a0651SBram Moolenaar result->add(&ts) 24824b8a0651SBram Moolenaar result->add(&sw) 24834b8a0651SBram Moolenaar endfor 24844b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 24854b8a0651SBram Moolenaar 24864b8a0651SBram Moolenaar var slist: list<string> 24874b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 24884b8a0651SBram Moolenaar slist->add($LOOPVAR) 24894b8a0651SBram Moolenaar slist->add(@r) 24904b8a0651SBram Moolenaar slist->add(v:errmsg) 24914b8a0651SBram Moolenaar endfor 24924b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 24934b8a0651SBram Moolenaar 24944b8a0651SBram Moolenaar slist = [] 24954b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 24964b8a0651SBram Moolenaar slist->add(g:globalvar) 24974b8a0651SBram Moolenaar slist->add(b:bufvar) 24984b8a0651SBram Moolenaar slist->add(w:winvar) 24994b8a0651SBram Moolenaar slist->add(t:tabvar) 25004b8a0651SBram Moolenaar endfor 25014b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2502f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2503b777da9bSBram Moolenaar 2504b777da9bSBram Moolenaar var res = [] 2505b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2506b777da9bSBram Moolenaar res->add(n) 2507b777da9bSBram Moolenaar endfor 2508b777da9bSBram Moolenaar assert_equal([2, 5], res) 25094b8a0651SBram Moolenaar END 25104b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 25114b8a0651SBram Moolenaar 25124b8a0651SBram Moolenaar lines =<< trim END 2513792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2514792f786aSBram Moolenaar echo v1 v2 2515792f786aSBram Moolenaar endfor 2516792f786aSBram Moolenaar END 2517792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2518792f786aSBram Moolenaar 2519792f786aSBram Moolenaar lines =<< trim END 2520792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2521792f786aSBram Moolenaar echo v1 v2 2522792f786aSBram Moolenaar endfor 2523792f786aSBram Moolenaar END 2524792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2525792f786aSBram Moolenaar 2526792f786aSBram Moolenaar lines =<< trim END 2527792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2528792f786aSBram Moolenaar echo v1 2529792f786aSBram Moolenaar endfor 2530792f786aSBram Moolenaar END 2531792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2532792f786aSBram Moolenaarenddef 2533792f786aSBram Moolenaar 2534c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2535f2253963SBram Moolenaar var lines =<< trim END 2536c150c09eSBram Moolenaar var looped = 0 2537c150c09eSBram Moolenaar var cleanup = 0 2538c150c09eSBram Moolenaar for i in range(3) 2539c150c09eSBram Moolenaar looped += 1 2540c150c09eSBram Moolenaar try 2541c150c09eSBram Moolenaar eval [][0] 2542c150c09eSBram Moolenaar catch 2543c150c09eSBram Moolenaar continue 2544c150c09eSBram Moolenaar finally 2545c150c09eSBram Moolenaar cleanup += 1 2546c150c09eSBram Moolenaar endtry 2547c150c09eSBram Moolenaar endfor 2548c150c09eSBram Moolenaar assert_equal(3, looped) 2549c150c09eSBram Moolenaar assert_equal(3, cleanup) 2550f2253963SBram Moolenaar END 2551f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2552c150c09eSBram Moolenaarenddef 2553c150c09eSBram Moolenaar 2554d0df1aacSBram Moolenaardef Test_while_loop() 2555cfcd011fSBram Moolenaar var result = '' 2556cfcd011fSBram Moolenaar var cnt = 0 2557d0df1aacSBram Moolenaar while cnt < 555 2558d0df1aacSBram Moolenaar if cnt == 3 2559d0df1aacSBram Moolenaar break 2560d0df1aacSBram Moolenaar endif 2561d0df1aacSBram Moolenaar cnt += 1 2562d0df1aacSBram Moolenaar if cnt == 2 2563d0df1aacSBram Moolenaar continue 2564d0df1aacSBram Moolenaar endif 2565d0df1aacSBram Moolenaar result ..= cnt .. '_' 2566d0df1aacSBram Moolenaar endwhile 2567d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2568dee37dc7SBram Moolenaar 2569dee37dc7SBram Moolenaar var s = '' 25700123cc1eSBram Moolenaar while s == 'x' # {comment} 2571dee37dc7SBram Moolenaar endwhile 2572d0df1aacSBram Moolenaarenddef 2573d0df1aacSBram Moolenaar 2574e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2575675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2576675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2577675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2578675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2579675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2580675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2581675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 25826628b7ebSBram Moolenaar 25836628b7ebSBram Moolenaar var lines =<< trim END 25846628b7ebSBram Moolenaar var s = '' 25856628b7ebSBram Moolenaar while s = '' 25866628b7ebSBram Moolenaar endwhile 25876628b7ebSBram Moolenaar END 25886628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2589bd5da371SBram Moolenaarenddef 2590bd5da371SBram Moolenaar 25919645e2d9SBram Moolenaardef Test_interrupt_loop() 2592cfcd011fSBram Moolenaar var caught = false 2593cfcd011fSBram Moolenaar var x = 0 259497acfc78SBram Moolenaar try 25959645e2d9SBram Moolenaar while 1 25969645e2d9SBram Moolenaar x += 1 25979645e2d9SBram Moolenaar if x == 100 25989645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 25999645e2d9SBram Moolenaar endif 26009645e2d9SBram Moolenaar endwhile 260197acfc78SBram Moolenaar catch 260297acfc78SBram Moolenaar caught = true 260397acfc78SBram Moolenaar assert_equal(100, x) 260497acfc78SBram Moolenaar endtry 260597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 260625859dd7SBram Moolenaar # consume the CTRL-C 260725859dd7SBram Moolenaar getchar(0) 26089645e2d9SBram Moolenaarenddef 260920431c9dSBram Moolenaar 26104fdae999SBram Moolenaardef Test_automatic_line_continuation() 2611cfcd011fSBram Moolenaar var mylist = [ 26124fdae999SBram Moolenaar 'one', 26134fdae999SBram Moolenaar 'two', 26144fdae999SBram Moolenaar 'three', 2615f5be8cdbSBram Moolenaar ] # comment 26164fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 26174fdae999SBram Moolenaar 2618cfcd011fSBram Moolenaar var mydict = { 2619e0de171eSBram Moolenaar ['one']: 1, 2620e0de171eSBram Moolenaar ['two']: 2, 2621e0de171eSBram Moolenaar ['three']: 26224fdae999SBram Moolenaar 3, 2623f5be8cdbSBram Moolenaar } # comment 2624e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2625e0de171eSBram Moolenaar mydict = { 26262c330432SBram Moolenaar one: 1, # comment 26272c330432SBram Moolenaar two: # comment 26282c330432SBram Moolenaar 2, # comment 26292c330432SBram Moolenaar three: 3 # comment 26302c330432SBram Moolenaar } 2631e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2632e0de171eSBram Moolenaar mydict = { 26332c330432SBram Moolenaar one: 1, 26344fdae999SBram Moolenaar two: 26354fdae999SBram Moolenaar 2, 26362c330432SBram Moolenaar three: 3 26374fdae999SBram Moolenaar } 2638e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2639e6085c53SBram Moolenaar 2640e6085c53SBram Moolenaar assert_equal( 2641e6085c53SBram Moolenaar ['one', 'two', 'three'], 2642e6085c53SBram Moolenaar split('one two three') 2643e6085c53SBram Moolenaar ) 26444fdae999SBram Moolenaarenddef 26454fdae999SBram Moolenaar 26467a092245SBram Moolenaardef Test_vim9_comment() 26477a092245SBram Moolenaar CheckScriptSuccess([ 26487a092245SBram Moolenaar 'vim9script', 26497a092245SBram Moolenaar '# something', 265093f82cbeSBram Moolenaar '#something', 265193f82cbeSBram Moolenaar '#{something', 26527a092245SBram Moolenaar ]) 265393f82cbeSBram Moolenaar 265493f82cbeSBram Moolenaar split Xfile 265593f82cbeSBram Moolenaar CheckScriptSuccess([ 265693f82cbeSBram Moolenaar 'vim9script', 265793f82cbeSBram Moolenaar 'edit #something', 265893f82cbeSBram Moolenaar ]) 265993f82cbeSBram Moolenaar CheckScriptSuccess([ 266093f82cbeSBram Moolenaar 'vim9script', 266193f82cbeSBram Moolenaar 'edit #{something', 266293f82cbeSBram Moolenaar ]) 266393f82cbeSBram Moolenaar close 266493f82cbeSBram Moolenaar 26657a092245SBram Moolenaar CheckScriptFailure([ 26667a092245SBram Moolenaar 'vim9script', 26677a092245SBram Moolenaar ':# something', 26687a092245SBram Moolenaar ], 'E488:') 26697a092245SBram Moolenaar CheckScriptFailure([ 26707a092245SBram Moolenaar '# something', 26717a092245SBram Moolenaar ], 'E488:') 26727a092245SBram Moolenaar CheckScriptFailure([ 26737a092245SBram Moolenaar ':# something', 26747a092245SBram Moolenaar ], 'E488:') 26757a092245SBram Moolenaar 26764a8d9f2eSBram Moolenaar { # block start 26774a8d9f2eSBram Moolenaar } # block end 26784a8d9f2eSBram Moolenaar CheckDefFailure([ 26794a8d9f2eSBram Moolenaar '{# comment', 26804a8d9f2eSBram Moolenaar ], 'E488:') 26814a8d9f2eSBram Moolenaar CheckDefFailure([ 26824a8d9f2eSBram Moolenaar '{', 26834a8d9f2eSBram Moolenaar '}# comment', 26844a8d9f2eSBram Moolenaar ], 'E488:') 26854a8d9f2eSBram Moolenaar 26864a8d9f2eSBram Moolenaar echo "yes" # comment 26874a8d9f2eSBram Moolenaar CheckDefFailure([ 26884a8d9f2eSBram Moolenaar 'echo "yes"# comment', 26894a8d9f2eSBram Moolenaar ], 'E488:') 26907a092245SBram Moolenaar CheckScriptSuccess([ 26917a092245SBram Moolenaar 'vim9script', 26927a092245SBram Moolenaar 'echo "yes" # something', 26937a092245SBram Moolenaar ]) 26947a092245SBram Moolenaar CheckScriptFailure([ 26957a092245SBram Moolenaar 'vim9script', 26967a092245SBram Moolenaar 'echo "yes"# something', 26977a092245SBram Moolenaar ], 'E121:') 26987a092245SBram Moolenaar CheckScriptFailure([ 26997a092245SBram Moolenaar 'vim9script', 27007a092245SBram Moolenaar 'echo# something', 2701f8103f27SBram Moolenaar ], 'E1144:') 27027a092245SBram Moolenaar CheckScriptFailure([ 27037a092245SBram Moolenaar 'echo "yes" # something', 27047a092245SBram Moolenaar ], 'E121:') 27057a092245SBram Moolenaar 27064a8d9f2eSBram Moolenaar exe "echo" # comment 27074a8d9f2eSBram Moolenaar CheckDefFailure([ 27084a8d9f2eSBram Moolenaar 'exe "echo"# comment', 27094a8d9f2eSBram Moolenaar ], 'E488:') 27104a8d9f2eSBram Moolenaar CheckScriptSuccess([ 27114a8d9f2eSBram Moolenaar 'vim9script', 27124a8d9f2eSBram Moolenaar 'exe "echo" # something', 27134a8d9f2eSBram Moolenaar ]) 27144a8d9f2eSBram Moolenaar CheckScriptFailure([ 27154a8d9f2eSBram Moolenaar 'vim9script', 27164a8d9f2eSBram Moolenaar 'exe "echo"# something', 27174a8d9f2eSBram Moolenaar ], 'E121:') 27184a8d9f2eSBram Moolenaar CheckScriptFailure([ 27194a8d9f2eSBram Moolenaar 'vim9script', 27204a8d9f2eSBram Moolenaar 'exe# something', 2721f8103f27SBram Moolenaar ], 'E1144:') 27224a8d9f2eSBram Moolenaar CheckScriptFailure([ 27234a8d9f2eSBram Moolenaar 'exe "echo" # something', 27244a8d9f2eSBram Moolenaar ], 'E121:') 27254a8d9f2eSBram Moolenaar 27267a092245SBram Moolenaar CheckDefFailure([ 27277a092245SBram Moolenaar 'try# comment', 27287a092245SBram Moolenaar ' echo "yes"', 27297a092245SBram Moolenaar 'catch', 27307a092245SBram Moolenaar 'endtry', 2731f8103f27SBram Moolenaar ], 'E1144:') 27322c5ed4e3SBram Moolenaar CheckScriptFailure([ 27332c5ed4e3SBram Moolenaar 'vim9script', 27342c5ed4e3SBram Moolenaar 'try# comment', 27352c5ed4e3SBram Moolenaar 'echo "yes"', 2736f8103f27SBram Moolenaar ], 'E1144:') 27377a092245SBram Moolenaar CheckDefFailure([ 27387a092245SBram Moolenaar 'try', 2739a72cfb80SBram Moolenaar ' throw#comment', 2740a72cfb80SBram Moolenaar 'catch', 2741a72cfb80SBram Moolenaar 'endtry', 2742f8103f27SBram Moolenaar ], 'E1144:') 2743a72cfb80SBram Moolenaar CheckDefFailure([ 2744a72cfb80SBram Moolenaar 'try', 2745a72cfb80SBram Moolenaar ' throw "yes"#comment', 2746a72cfb80SBram Moolenaar 'catch', 2747a72cfb80SBram Moolenaar 'endtry', 2748a72cfb80SBram Moolenaar ], 'E488:') 2749a72cfb80SBram Moolenaar CheckDefFailure([ 2750a72cfb80SBram Moolenaar 'try', 27517a092245SBram Moolenaar ' echo "yes"', 27527a092245SBram Moolenaar 'catch# comment', 27537a092245SBram Moolenaar 'endtry', 2754f8103f27SBram Moolenaar ], 'E1144:') 27552c5ed4e3SBram Moolenaar CheckScriptFailure([ 27562c5ed4e3SBram Moolenaar 'vim9script', 27572c5ed4e3SBram Moolenaar 'try', 27582c5ed4e3SBram Moolenaar ' echo "yes"', 27592c5ed4e3SBram Moolenaar 'catch# comment', 27602c5ed4e3SBram Moolenaar 'endtry', 2761f8103f27SBram Moolenaar ], 'E1144:') 27622c5ed4e3SBram Moolenaar CheckDefFailure([ 27632c5ed4e3SBram Moolenaar 'try', 27642c5ed4e3SBram Moolenaar ' echo "yes"', 27652c5ed4e3SBram Moolenaar 'catch /pat/# comment', 27662c5ed4e3SBram Moolenaar 'endtry', 27672c5ed4e3SBram Moolenaar ], 'E488:') 27687a092245SBram Moolenaar CheckDefFailure([ 27697a092245SBram Moolenaar 'try', 27707a092245SBram Moolenaar 'echo "yes"', 27717a092245SBram Moolenaar 'catch', 27727a092245SBram Moolenaar 'endtry# comment', 2773f8103f27SBram Moolenaar ], 'E1144:') 27742c5ed4e3SBram Moolenaar CheckScriptFailure([ 27752c5ed4e3SBram Moolenaar 'vim9script', 27762c5ed4e3SBram Moolenaar 'try', 27772c5ed4e3SBram Moolenaar ' echo "yes"', 27782c5ed4e3SBram Moolenaar 'catch', 27792c5ed4e3SBram Moolenaar 'endtry# comment', 2780f8103f27SBram Moolenaar ], 'E1144:') 27812c5ed4e3SBram Moolenaar 27822c5ed4e3SBram Moolenaar CheckScriptSuccess([ 27832c5ed4e3SBram Moolenaar 'vim9script', 27842c5ed4e3SBram Moolenaar 'hi # comment', 27852c5ed4e3SBram Moolenaar ]) 27862c5ed4e3SBram Moolenaar CheckScriptFailure([ 27872c5ed4e3SBram Moolenaar 'vim9script', 27882c5ed4e3SBram Moolenaar 'hi# comment', 2789f8103f27SBram Moolenaar ], 'E1144:') 27901966c248SBram Moolenaar CheckScriptSuccess([ 27911966c248SBram Moolenaar 'vim9script', 27921966c248SBram Moolenaar 'hi Search # comment', 27931966c248SBram Moolenaar ]) 27941966c248SBram Moolenaar CheckScriptFailure([ 27951966c248SBram Moolenaar 'vim9script', 27961966c248SBram Moolenaar 'hi Search# comment', 27971966c248SBram Moolenaar ], 'E416:') 27981966c248SBram Moolenaar CheckScriptSuccess([ 27991966c248SBram Moolenaar 'vim9script', 28001966c248SBram Moolenaar 'hi link This Search # comment', 28011966c248SBram Moolenaar ]) 28021966c248SBram Moolenaar CheckScriptFailure([ 28031966c248SBram Moolenaar 'vim9script', 28041966c248SBram Moolenaar 'hi link This That# comment', 28051966c248SBram Moolenaar ], 'E413:') 28061966c248SBram Moolenaar CheckScriptSuccess([ 28071966c248SBram Moolenaar 'vim9script', 28081966c248SBram Moolenaar 'hi clear This # comment', 28091966c248SBram Moolenaar 'hi clear # comment', 28101966c248SBram Moolenaar ]) 2811f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2812f5be8cdbSBram Moolenaar # hi clear This# comment', 28131966c248SBram Moolenaar CheckScriptFailure([ 28141966c248SBram Moolenaar 'vim9script', 28151966c248SBram Moolenaar 'hi clear# comment', 28161966c248SBram Moolenaar ], 'E416:') 28171966c248SBram Moolenaar 28181966c248SBram Moolenaar CheckScriptSuccess([ 28191966c248SBram Moolenaar 'vim9script', 28201966c248SBram Moolenaar 'hi Group term=bold', 28211966c248SBram Moolenaar 'match Group /todo/ # comment', 28221966c248SBram Moolenaar ]) 28231966c248SBram Moolenaar CheckScriptFailure([ 28241966c248SBram Moolenaar 'vim9script', 28251966c248SBram Moolenaar 'hi Group term=bold', 28261966c248SBram Moolenaar 'match Group /todo/# comment', 28271966c248SBram Moolenaar ], 'E488:') 28281966c248SBram Moolenaar CheckScriptSuccess([ 28291966c248SBram Moolenaar 'vim9script', 28301966c248SBram Moolenaar 'match # comment', 28311966c248SBram Moolenaar ]) 28321966c248SBram Moolenaar CheckScriptFailure([ 28331966c248SBram Moolenaar 'vim9script', 28341966c248SBram Moolenaar 'match# comment', 2835f8103f27SBram Moolenaar ], 'E1144:') 28361966c248SBram Moolenaar CheckScriptSuccess([ 28371966c248SBram Moolenaar 'vim9script', 28381966c248SBram Moolenaar 'match none # comment', 28391966c248SBram Moolenaar ]) 28401966c248SBram Moolenaar CheckScriptFailure([ 28411966c248SBram Moolenaar 'vim9script', 28421966c248SBram Moolenaar 'match none# comment', 28431966c248SBram Moolenaar ], 'E475:') 28441966c248SBram Moolenaar 28451966c248SBram Moolenaar CheckScriptSuccess([ 28461966c248SBram Moolenaar 'vim9script', 28471966c248SBram Moolenaar 'menutrans clear # comment', 28481966c248SBram Moolenaar ]) 28491966c248SBram Moolenaar CheckScriptFailure([ 28501966c248SBram Moolenaar 'vim9script', 28511966c248SBram Moolenaar 'menutrans clear# comment text', 28521966c248SBram Moolenaar ], 'E474:') 28531966c248SBram Moolenaar 28541966c248SBram Moolenaar CheckScriptSuccess([ 28551966c248SBram Moolenaar 'vim9script', 28561966c248SBram Moolenaar 'syntax clear # comment', 28571966c248SBram Moolenaar ]) 28581966c248SBram Moolenaar CheckScriptFailure([ 28591966c248SBram Moolenaar 'vim9script', 28601966c248SBram Moolenaar 'syntax clear# comment text', 28611966c248SBram Moolenaar ], 'E28:') 28621966c248SBram Moolenaar CheckScriptSuccess([ 28631966c248SBram Moolenaar 'vim9script', 28641966c248SBram Moolenaar 'syntax keyword Word some', 28651966c248SBram Moolenaar 'syntax clear Word # comment', 28661966c248SBram Moolenaar ]) 28671966c248SBram Moolenaar CheckScriptFailure([ 28681966c248SBram Moolenaar 'vim9script', 28691966c248SBram Moolenaar 'syntax keyword Word some', 28701966c248SBram Moolenaar 'syntax clear Word# comment text', 28711966c248SBram Moolenaar ], 'E28:') 28721966c248SBram Moolenaar 28731966c248SBram Moolenaar CheckScriptSuccess([ 28741966c248SBram Moolenaar 'vim9script', 28751966c248SBram Moolenaar 'syntax list # comment', 28761966c248SBram Moolenaar ]) 28771966c248SBram Moolenaar CheckScriptFailure([ 28781966c248SBram Moolenaar 'vim9script', 28791966c248SBram Moolenaar 'syntax list# comment text', 28801966c248SBram Moolenaar ], 'E28:') 28811966c248SBram Moolenaar 28821966c248SBram Moolenaar CheckScriptSuccess([ 28831966c248SBram Moolenaar 'vim9script', 28841966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 28851966c248SBram Moolenaar ]) 28861966c248SBram Moolenaar CheckScriptFailure([ 28871966c248SBram Moolenaar 'vim9script', 28881966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 28891966c248SBram Moolenaar ], 'E475:') 28901966c248SBram Moolenaar 28911966c248SBram Moolenaar CheckScriptSuccess([ 28921966c248SBram Moolenaar 'vim9script', 28931966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 28941966c248SBram Moolenaar ]) 28951966c248SBram Moolenaar CheckScriptFailure([ 28961966c248SBram Moolenaar 'vim9script', 28971966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 28981966c248SBram Moolenaar ], 'E789:') 28991966c248SBram Moolenaar 29001966c248SBram Moolenaar CheckScriptSuccess([ 29011966c248SBram Moolenaar 'vim9script', 29021966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 29031966c248SBram Moolenaar ]) 29041966c248SBram Moolenaar CheckScriptFailure([ 29051966c248SBram Moolenaar 'vim9script', 29061966c248SBram Moolenaar 'syntax match Word /pat/# comment', 29071966c248SBram Moolenaar ], 'E402:') 29081966c248SBram Moolenaar 29091966c248SBram Moolenaar CheckScriptSuccess([ 29101966c248SBram Moolenaar 'vim9script', 29111966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 29121966c248SBram Moolenaar ]) 29131966c248SBram Moolenaar CheckScriptFailure([ 29141966c248SBram Moolenaar 'vim9script', 29151966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 29161966c248SBram Moolenaar ], 'E475:') 29171966c248SBram Moolenaar CheckScriptFailure([ 29181966c248SBram Moolenaar 'vim9script', 29191966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 29201966c248SBram Moolenaar ], 'E406:') 29211966c248SBram Moolenaar CheckScriptFailure([ 29221966c248SBram Moolenaar 'vim9script', 29231966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 29241966c248SBram Moolenaar ], 'E475:') 29251966c248SBram Moolenaar 29261966c248SBram Moolenaar CheckScriptSuccess([ 29271966c248SBram Moolenaar 'vim9script', 29281966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 29291966c248SBram Moolenaar ]) 29301966c248SBram Moolenaar CheckScriptFailure([ 29311966c248SBram Moolenaar 'vim9script', 29321966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2933d032f34aSBram Moolenaar ], 'E402:') 29341966c248SBram Moolenaar 29351966c248SBram Moolenaar CheckScriptSuccess([ 29361966c248SBram Moolenaar 'vim9script', 29371966c248SBram Moolenaar 'syntax sync # comment', 29381966c248SBram Moolenaar ]) 29391966c248SBram Moolenaar CheckScriptFailure([ 29401966c248SBram Moolenaar 'vim9script', 29411966c248SBram Moolenaar 'syntax sync# comment', 29421966c248SBram Moolenaar ], 'E404:') 29431966c248SBram Moolenaar CheckScriptSuccess([ 29441966c248SBram Moolenaar 'vim9script', 29451966c248SBram Moolenaar 'syntax sync ccomment # comment', 29461966c248SBram Moolenaar ]) 29471966c248SBram Moolenaar CheckScriptFailure([ 29481966c248SBram Moolenaar 'vim9script', 29491966c248SBram Moolenaar 'syntax sync ccomment# comment', 29501966c248SBram Moolenaar ], 'E404:') 29511966c248SBram Moolenaar 29521966c248SBram Moolenaar CheckScriptSuccess([ 29531966c248SBram Moolenaar 'vim9script', 29541966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 29551966c248SBram Moolenaar ]) 29561966c248SBram Moolenaar CheckScriptFailure([ 29571966c248SBram Moolenaar 'vim9script', 29581966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 29591966c248SBram Moolenaar ], 'E475:') 2960a72cfb80SBram Moolenaar 2961a72cfb80SBram Moolenaar CheckScriptSuccess([ 2962a72cfb80SBram Moolenaar 'vim9script', 2963a72cfb80SBram Moolenaar 'command Echo echo # comment', 2964a72cfb80SBram Moolenaar 'command Echo # comment', 29652d870f8dSBram Moolenaar 'delcommand Echo', 2966a72cfb80SBram Moolenaar ]) 2967a72cfb80SBram Moolenaar CheckScriptFailure([ 2968a72cfb80SBram Moolenaar 'vim9script', 2969a72cfb80SBram Moolenaar 'command Echo echo# comment', 2970a72cfb80SBram Moolenaar 'Echo', 2971f8103f27SBram Moolenaar ], 'E1144:') 29722d870f8dSBram Moolenaar delcommand Echo 297370249ee8SBram Moolenaar 297470249ee8SBram Moolenaar var curdir = getcwd() 297570249ee8SBram Moolenaar CheckScriptSuccess([ 297670249ee8SBram Moolenaar 'command Echo cd " comment', 297770249ee8SBram Moolenaar 'Echo', 297870249ee8SBram Moolenaar 'delcommand Echo', 297970249ee8SBram Moolenaar ]) 298070249ee8SBram Moolenaar CheckScriptSuccess([ 2981090728adSBram Moolenaar 'vim9script', 298270249ee8SBram Moolenaar 'command Echo cd # comment', 298370249ee8SBram Moolenaar 'Echo', 298470249ee8SBram Moolenaar 'delcommand Echo', 298570249ee8SBram Moolenaar ]) 298670249ee8SBram Moolenaar CheckScriptFailure([ 298770249ee8SBram Moolenaar 'vim9script', 298870249ee8SBram Moolenaar 'command Echo cd " comment', 298970249ee8SBram Moolenaar 'Echo', 299070249ee8SBram Moolenaar ], 'E344:') 299170249ee8SBram Moolenaar delcommand Echo 299270249ee8SBram Moolenaar chdir(curdir) 299370249ee8SBram Moolenaar 2994a72cfb80SBram Moolenaar CheckScriptFailure([ 2995a72cfb80SBram Moolenaar 'vim9script', 2996a72cfb80SBram Moolenaar 'command Echo# comment', 2997a72cfb80SBram Moolenaar ], 'E182:') 2998a72cfb80SBram Moolenaar CheckScriptFailure([ 2999a72cfb80SBram Moolenaar 'vim9script', 3000a72cfb80SBram Moolenaar 'command Echo echo', 3001a72cfb80SBram Moolenaar 'command Echo# comment', 3002a72cfb80SBram Moolenaar ], 'E182:') 30032d870f8dSBram Moolenaar delcommand Echo 3004a72cfb80SBram Moolenaar 3005a72cfb80SBram Moolenaar CheckScriptSuccess([ 3006a72cfb80SBram Moolenaar 'vim9script', 3007a72cfb80SBram Moolenaar 'function # comment', 3008a72cfb80SBram Moolenaar ]) 3009a72cfb80SBram Moolenaar CheckScriptFailure([ 3010a72cfb80SBram Moolenaar 'vim9script', 30119898107fSBram Moolenaar 'function " comment', 30129898107fSBram Moolenaar ], 'E129:') 30139898107fSBram Moolenaar CheckScriptFailure([ 30149898107fSBram Moolenaar 'vim9script', 3015a72cfb80SBram Moolenaar 'function# comment', 3016f8103f27SBram Moolenaar ], 'E1144:') 3017a72cfb80SBram Moolenaar CheckScriptSuccess([ 3018a72cfb80SBram Moolenaar 'vim9script', 3019a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3020a72cfb80SBram Moolenaar ]) 3021a72cfb80SBram Moolenaar CheckScriptFailure([ 3022a72cfb80SBram Moolenaar 'vim9script', 3023a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3024a72cfb80SBram Moolenaar ], 'E488:') 3025a72cfb80SBram Moolenaar 3026a72cfb80SBram Moolenaar CheckScriptSuccess([ 3027a72cfb80SBram Moolenaar 'vim9script', 30284c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3029a72cfb80SBram Moolenaar 'endfunc', 30304c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3031a72cfb80SBram Moolenaar ]) 3032a72cfb80SBram Moolenaar CheckScriptFailure([ 3033a72cfb80SBram Moolenaar 'vim9script', 30344c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3035a72cfb80SBram Moolenaar 'endfunc', 30364c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3037a72cfb80SBram Moolenaar ], 'E488:') 3038a72cfb80SBram Moolenaar 3039a72cfb80SBram Moolenaar CheckScriptSuccess([ 3040a72cfb80SBram Moolenaar 'vim9script', 3041a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3042a72cfb80SBram Moolenaar ]) 3043a72cfb80SBram Moolenaar CheckScriptFailure([ 3044a72cfb80SBram Moolenaar 'vim9script', 3045a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3046a72cfb80SBram Moolenaar ], 'E488:') 3047e7e4838fSBram Moolenaar 3048e7e4838fSBram Moolenaar CheckScriptFailure([ 3049e7e4838fSBram Moolenaar 'def Test() " comment', 3050e7e4838fSBram Moolenaar 'enddef', 3051e7e4838fSBram Moolenaar ], 'E488:') 3052e7e4838fSBram Moolenaar CheckScriptFailure([ 3053e7e4838fSBram Moolenaar 'vim9script', 3054e7e4838fSBram Moolenaar 'def Test() " comment', 3055e7e4838fSBram Moolenaar 'enddef', 3056e7e4838fSBram Moolenaar ], 'E488:') 3057e7e4838fSBram Moolenaar 3058e7e4838fSBram Moolenaar CheckScriptSuccess([ 3059e7e4838fSBram Moolenaar 'func Test() " comment', 3060e7e4838fSBram Moolenaar 'endfunc', 30612d870f8dSBram Moolenaar 'delfunc Test', 3062e7e4838fSBram Moolenaar ]) 30639898107fSBram Moolenaar CheckScriptSuccess([ 3064e7e4838fSBram Moolenaar 'vim9script', 3065e7e4838fSBram Moolenaar 'func Test() " comment', 3066e7e4838fSBram Moolenaar 'endfunc', 30679898107fSBram Moolenaar ]) 3068e7e4838fSBram Moolenaar 3069e7e4838fSBram Moolenaar CheckScriptSuccess([ 3070e7e4838fSBram Moolenaar 'def Test() # comment', 3071e7e4838fSBram Moolenaar 'enddef', 3072e7e4838fSBram Moolenaar ]) 3073e7e4838fSBram Moolenaar CheckScriptFailure([ 3074e7e4838fSBram Moolenaar 'func Test() # comment', 3075e7e4838fSBram Moolenaar 'endfunc', 3076e7e4838fSBram Moolenaar ], 'E488:') 3077*0f37e356SBram Moolenaar 3078*0f37e356SBram Moolenaar var lines =<< trim END 3079*0f37e356SBram Moolenaar vim9script 3080*0f37e356SBram Moolenaar syn region Text 3081*0f37e356SBram Moolenaar \ start='foo' 3082*0f37e356SBram Moolenaar #\ comment 3083*0f37e356SBram Moolenaar \ end='bar' 3084*0f37e356SBram Moolenaar END 3085*0f37e356SBram Moolenaar CheckScriptSuccess(lines) 3086*0f37e356SBram Moolenaar 3087*0f37e356SBram Moolenaar lines =<< trim END 3088*0f37e356SBram Moolenaar vim9script 3089*0f37e356SBram Moolenaar syn region Text 3090*0f37e356SBram Moolenaar \ start='foo' 3091*0f37e356SBram Moolenaar "\ comment 3092*0f37e356SBram Moolenaar \ end='bar' 3093*0f37e356SBram Moolenaar END 3094*0f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 30952c5ed4e3SBram Moolenaarenddef 30962c5ed4e3SBram Moolenaar 30972c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 30982c5ed4e3SBram Moolenaar CheckCanRunGui 30992c5ed4e3SBram Moolenaar 31002c5ed4e3SBram Moolenaar CheckScriptFailure([ 31012c5ed4e3SBram Moolenaar 'vim9script', 31022c5ed4e3SBram Moolenaar 'gui#comment' 3103f8103f27SBram Moolenaar ], 'E1144:') 31042c5ed4e3SBram Moolenaar CheckScriptFailure([ 31052c5ed4e3SBram Moolenaar 'vim9script', 31062c5ed4e3SBram Moolenaar 'gui -f#comment' 31072c5ed4e3SBram Moolenaar ], 'E499:') 31087a092245SBram Moolenaarenddef 31097a092245SBram Moolenaar 3110a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 31116797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 31126797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3113a26b9700SBram Moolenaar 3114a26b9700SBram Moolenaar edit test.vim 3115a26b9700SBram Moolenaar doautocmd TabEnter #comment 3116a26b9700SBram Moolenaar assert_equal(1, g:entered) 3117a26b9700SBram Moolenaar 3118a26b9700SBram Moolenaar doautocmd TabEnter f.x 3119a26b9700SBram Moolenaar assert_equal(2, g:entered) 3120a26b9700SBram Moolenaar 3121a26b9700SBram Moolenaar g:entered = 0 3122a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3123a26b9700SBram Moolenaar assert_equal(2, g:entered) 3124a26b9700SBram Moolenaar 3125a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3126a26b9700SBram Moolenaar 3127a26b9700SBram Moolenaar au! TabEnter 3128a26b9700SBram Moolenaar unlet g:entered 3129d72c1bf0SBram Moolenaar 3130d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3131d72c1bf0SBram Moolenaar 'vim9script', 31326797966dSBram Moolenaar 'g:var = 123', 3133e55b1c09SBram Moolenaar 'b:var = 456', 3134e55b1c09SBram Moolenaar 'w:var = 777', 3135e55b1c09SBram Moolenaar 't:var = 888', 3136d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3137d72c1bf0SBram Moolenaar ]) 3138d72c1bf0SBram Moolenaar 3139d72c1bf0SBram Moolenaar CheckScriptFailure([ 3140d72c1bf0SBram Moolenaar 'vim9script', 3141cfcd011fSBram Moolenaar 'let var = 123', 3142cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3143cfcd011fSBram Moolenaar 3144cfcd011fSBram Moolenaar CheckScriptFailure([ 3145cfcd011fSBram Moolenaar 'vim9script', 3146cfcd011fSBram Moolenaar 'var g:var = 123', 3147e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3148e55b1c09SBram Moolenaar 3149e55b1c09SBram Moolenaar CheckScriptFailure([ 3150e55b1c09SBram Moolenaar 'vim9script', 3151cfcd011fSBram Moolenaar 'var b:var = 123', 3152e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3153e55b1c09SBram Moolenaar 3154e55b1c09SBram Moolenaar CheckScriptFailure([ 3155e55b1c09SBram Moolenaar 'vim9script', 3156cfcd011fSBram Moolenaar 'var w:var = 123', 3157e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3158e55b1c09SBram Moolenaar 3159e55b1c09SBram Moolenaar CheckScriptFailure([ 3160e55b1c09SBram Moolenaar 'vim9script', 3161cfcd011fSBram Moolenaar 'var t:var = 123', 3162e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3163e55b1c09SBram Moolenaar 3164e55b1c09SBram Moolenaar CheckScriptFailure([ 3165e55b1c09SBram Moolenaar 'vim9script', 3166cfcd011fSBram Moolenaar 'var v:version = 123', 3167e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3168e55b1c09SBram Moolenaar 3169e55b1c09SBram Moolenaar CheckScriptFailure([ 3170e55b1c09SBram Moolenaar 'vim9script', 3171cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3172e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 31736797966dSBram Moolenaar 31746797966dSBram Moolenaar CheckScriptFailure([ 31756797966dSBram Moolenaar 'vim9script', 31766797966dSBram Moolenaar 'g:var = 123', 317732e35117SBram Moolenaar 'unlet g:var# comment1', 3178d72c1bf0SBram Moolenaar ], 'E108:') 3179d72c1bf0SBram Moolenaar 3180d72c1bf0SBram Moolenaar CheckScriptFailure([ 3181d72c1bf0SBram Moolenaar 'let g:var = 123', 3182d72c1bf0SBram Moolenaar 'unlet g:var # something', 3183d72c1bf0SBram Moolenaar ], 'E488:') 3184faac4104SBram Moolenaar 3185faac4104SBram Moolenaar CheckScriptSuccess([ 3186faac4104SBram Moolenaar 'vim9script', 318732e35117SBram Moolenaar 'if 1 # comment2', 3188faac4104SBram Moolenaar ' echo "yes"', 3189faac4104SBram Moolenaar 'elseif 2 #comment', 3190faac4104SBram Moolenaar ' echo "no"', 3191faac4104SBram Moolenaar 'endif', 3192faac4104SBram Moolenaar ]) 3193faac4104SBram Moolenaar 3194faac4104SBram Moolenaar CheckScriptFailure([ 3195faac4104SBram Moolenaar 'vim9script', 319632e35117SBram Moolenaar 'if 1# comment3', 3197faac4104SBram Moolenaar ' echo "yes"', 3198faac4104SBram Moolenaar 'endif', 3199faac4104SBram Moolenaar ], 'E15:') 3200faac4104SBram Moolenaar 3201faac4104SBram Moolenaar CheckScriptFailure([ 3202faac4104SBram Moolenaar 'vim9script', 320332e35117SBram Moolenaar 'if 0 # comment4', 3204faac4104SBram Moolenaar ' echo "yes"', 3205faac4104SBram Moolenaar 'elseif 2#comment', 3206faac4104SBram Moolenaar ' echo "no"', 3207faac4104SBram Moolenaar 'endif', 3208faac4104SBram Moolenaar ], 'E15:') 3209faac4104SBram Moolenaar 3210faac4104SBram Moolenaar CheckScriptSuccess([ 3211faac4104SBram Moolenaar 'vim9script', 3212cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3213faac4104SBram Moolenaar ]) 3214faac4104SBram Moolenaar 3215faac4104SBram Moolenaar CheckScriptFailure([ 3216faac4104SBram Moolenaar 'vim9script', 3217cfcd011fSBram Moolenaar 'var v = 1# comment6', 321832e35117SBram Moolenaar ], 'E15:') 3219faac4104SBram Moolenaar 3220faac4104SBram Moolenaar CheckScriptSuccess([ 3221faac4104SBram Moolenaar 'vim9script', 3222faac4104SBram Moolenaar 'new' 3223d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3224df069eecSBram Moolenaar ':$', 3225faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3226faac4104SBram Moolenaar 'bwipe!', 3227faac4104SBram Moolenaar ]) 3228faac4104SBram Moolenaar 3229f5be8cdbSBram Moolenaar CheckScriptFailure([ 3230f5be8cdbSBram Moolenaar 'vim9script', 3231f5be8cdbSBram Moolenaar 'new' 3232d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3233f5be8cdbSBram Moolenaar ':$', 3234f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3235f5be8cdbSBram Moolenaar 'bwipe!', 3236f5be8cdbSBram Moolenaar ], 'E488:') 3237f5be8cdbSBram Moolenaar 3238f5be8cdbSBram Moolenaar CheckScriptFailure([ 3239f5be8cdbSBram Moolenaar 'vim9script', 3240f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3241f5be8cdbSBram Moolenaar ], 'E477:') 3242a26b9700SBram Moolenaarenddef 3243a26b9700SBram Moolenaar 32447e5bd91dSBram Moolenaardef Test_finish() 3245cfcd011fSBram Moolenaar var lines =<< trim END 32467e5bd91dSBram Moolenaar vim9script 32476797966dSBram Moolenaar g:res = 'one' 32487e5bd91dSBram Moolenaar if v:false | finish | endif 32496797966dSBram Moolenaar g:res = 'two' 32507e5bd91dSBram Moolenaar finish 32516797966dSBram Moolenaar g:res = 'three' 32527e5bd91dSBram Moolenaar END 32537e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 32547e5bd91dSBram Moolenaar source Xfinished 32557e5bd91dSBram Moolenaar assert_equal('two', g:res) 32567e5bd91dSBram Moolenaar 32577e5bd91dSBram Moolenaar unlet g:res 32587e5bd91dSBram Moolenaar delete('Xfinished') 32597e5bd91dSBram Moolenaarenddef 32607e5bd91dSBram Moolenaar 3261a5d0077eSBram Moolenaardef Test_forward_declaration() 3262cfcd011fSBram Moolenaar var lines =<< trim END 3263a5d0077eSBram Moolenaar vim9script 3264a5d0077eSBram Moolenaar def GetValue(): string 3265a5d0077eSBram Moolenaar return theVal 3266a5d0077eSBram Moolenaar enddef 3267cfcd011fSBram Moolenaar var theVal = 'something' 3268822ba247SBram Moolenaar g:initVal = GetValue() 3269a5d0077eSBram Moolenaar theVal = 'else' 3270a5d0077eSBram Moolenaar g:laterVal = GetValue() 3271a5d0077eSBram Moolenaar END 3272a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3273a5d0077eSBram Moolenaar source Xforward 3274a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3275a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3276a5d0077eSBram Moolenaar 3277a5d0077eSBram Moolenaar unlet g:initVal 3278a5d0077eSBram Moolenaar unlet g:laterVal 3279a5d0077eSBram Moolenaar delete('Xforward') 3280a5d0077eSBram Moolenaarenddef 3281a5d0077eSBram Moolenaar 32829721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3283a6294955SBram Moolenaar var vim9_lines =<< trim END 3284a6294955SBram Moolenaar vim9script 3285a6294955SBram Moolenaar var local = 'local' 3286a6294955SBram Moolenaar g:global = 'global' 3287a6294955SBram Moolenaar export var exported = 'exported' 3288a6294955SBram Moolenaar export def GetText(): string 3289a6294955SBram Moolenaar return 'text' 3290a6294955SBram Moolenaar enddef 3291a6294955SBram Moolenaar END 3292a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3293a6294955SBram Moolenaar 3294cfcd011fSBram Moolenaar var legacy_lines =<< trim END 32959721fb4eSBram Moolenaar source Xvim9_script.vim 32969721fb4eSBram Moolenaar 32979721fb4eSBram Moolenaar call assert_false(exists('local')) 32989721fb4eSBram Moolenaar call assert_false(exists('exported')) 32999721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 33009721fb4eSBram Moolenaar call assert_equal('global', global) 33019721fb4eSBram Moolenaar call assert_equal('global', g:global) 33029721fb4eSBram Moolenaar 33039721fb4eSBram Moolenaar " imported variable becomes script-local 33049721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 33059721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 33069721fb4eSBram Moolenaar call assert_false(exists('exported')) 33079721fb4eSBram Moolenaar 33089721fb4eSBram Moolenaar " imported function becomes script-local 33099721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 33109721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 33119721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 33129721fb4eSBram Moolenaar END 33139721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 33149721fb4eSBram Moolenaar 33159721fb4eSBram Moolenaar source Xlegacy_script.vim 33169721fb4eSBram Moolenaar assert_equal('global', g:global) 3317f5be8cdbSBram Moolenaar unlet g:global 33189721fb4eSBram Moolenaar 33199721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 33209721fb4eSBram Moolenaar delete('Xvim9_script.vim') 33219721fb4eSBram Moolenaarenddef 3322a5d0077eSBram Moolenaar 3323e535db86SBram Moolenaardef Test_declare_script_in_func() 3324e535db86SBram Moolenaar var lines =<< trim END 3325e535db86SBram Moolenaar vim9script 3326e535db86SBram Moolenaar func Declare() 3327e535db86SBram Moolenaar let s:local = 123 3328e535db86SBram Moolenaar endfunc 3329e535db86SBram Moolenaar Declare() 3330e535db86SBram Moolenaar assert_equal(123, local) 3331e535db86SBram Moolenaar 3332e535db86SBram Moolenaar var error: string 3333e535db86SBram Moolenaar try 3334e535db86SBram Moolenaar local = 'asdf' 3335e535db86SBram Moolenaar catch 3336e535db86SBram Moolenaar error = v:exception 3337e535db86SBram Moolenaar endtry 3338e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3339e535db86SBram Moolenaar 3340e535db86SBram Moolenaar lockvar local 3341e535db86SBram Moolenaar try 3342e535db86SBram Moolenaar local = 999 3343e535db86SBram Moolenaar catch 3344e535db86SBram Moolenaar error = v:exception 3345e535db86SBram Moolenaar endtry 3346e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3347e535db86SBram Moolenaar END 3348e535db86SBram Moolenaar CheckScriptSuccess(lines) 3349e535db86SBram Moolenaarenddef 3350e535db86SBram Moolenaar 3351e535db86SBram Moolenaar 33527d699701SBram Moolenaarfunc Test_vim9script_not_global() 33537d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 33547d699701SBram Moolenaar let vim9lines =<< trim END 33557d699701SBram Moolenaar vim9script 3356cfcd011fSBram Moolenaar var name = 'local' 33577d699701SBram Moolenaar func TheFunc() 33587d699701SBram Moolenaar echo 'local' 33597d699701SBram Moolenaar endfunc 33607d699701SBram Moolenaar def DefFunc() 33617d699701SBram Moolenaar echo 'local' 33627d699701SBram Moolenaar enddef 33637d699701SBram Moolenaar END 33647d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 33657d699701SBram Moolenaar source Xvim9script.vim 33667d699701SBram Moolenaar try 33677d699701SBram Moolenaar echo g:var 33687d699701SBram Moolenaar assert_report('did not fail') 33697d699701SBram Moolenaar catch /E121:/ 33707d699701SBram Moolenaar " caught 33717d699701SBram Moolenaar endtry 33727d699701SBram Moolenaar try 33737d699701SBram Moolenaar call TheFunc() 33747d699701SBram Moolenaar assert_report('did not fail') 33757d699701SBram Moolenaar catch /E117:/ 33767d699701SBram Moolenaar " caught 33777d699701SBram Moolenaar endtry 33787d699701SBram Moolenaar try 33797d699701SBram Moolenaar call DefFunc() 33807d699701SBram Moolenaar assert_report('did not fail') 33817d699701SBram Moolenaar catch /E117:/ 33827d699701SBram Moolenaar " caught 33837d699701SBram Moolenaar endtry 33847d699701SBram Moolenaar 338525859dd7SBram Moolenaar call delete('Xvim9script.vim') 33867d699701SBram Moolenaarendfunc 33877d699701SBram Moolenaar 3388eeb27bfeSBram Moolenaardef Test_vim9_copen() 3389eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3390eeb27bfeSBram Moolenaar copen 3391eeb27bfeSBram Moolenaar quit 3392eeb27bfeSBram Moolenaarenddef 3393eeb27bfeSBram Moolenaar 339403290b84SBram Moolenaar" test using an auto-loaded function and variable 33952d6b20d6SBram Moolenaardef Test_vim9_autoload() 3396cfcd011fSBram Moolenaar var lines =<< trim END 33972d6b20d6SBram Moolenaar vim9script 339803290b84SBram Moolenaar def some#gettest(): string 339903290b84SBram Moolenaar return 'test' 340003290b84SBram Moolenaar enddef 340103290b84SBram Moolenaar g:some#name = 'name' 3402227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3403e3ffcd99SBram Moolenaar 3404e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3405e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3406e3ffcd99SBram Moolenaar enddef 340703290b84SBram Moolenaar END 340803290b84SBram Moolenaar 340903290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 341003290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 341103290b84SBram Moolenaar var save_rtp = &rtp 341203290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 341303290b84SBram Moolenaar 341403290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 341503290b84SBram Moolenaar assert_equal('name', g:some#name) 3416227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 341703290b84SBram Moolenaar g:some#other = 'other' 341803290b84SBram Moolenaar assert_equal('other', g:some#other) 341903290b84SBram Moolenaar 3420e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3421e3ffcd99SBram Moolenaar 342217f700acSBram Moolenaar # upper case script name works 342317f700acSBram Moolenaar lines =<< trim END 342417f700acSBram Moolenaar vim9script 342517f700acSBram Moolenaar def Other#getOther(): string 342617f700acSBram Moolenaar return 'other' 342717f700acSBram Moolenaar enddef 342817f700acSBram Moolenaar END 342917f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 343017f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 343117f700acSBram Moolenaar 343203290b84SBram Moolenaar delete('Xdir', 'rf') 343303290b84SBram Moolenaar &rtp = save_rtp 343403290b84SBram Moolenaarenddef 343503290b84SBram Moolenaar 343603290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 343703290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 343803290b84SBram Moolenaar var lines =<< trim END 343903290b84SBram Moolenaar vim9script 34402d6b20d6SBram Moolenaar def foo#test() 34412d6b20d6SBram Moolenaar echomsg getreg('"') 34422d6b20d6SBram Moolenaar enddef 34432d6b20d6SBram Moolenaar END 34442d6b20d6SBram Moolenaar 34452d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 34462d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3447cfcd011fSBram Moolenaar var save_rtp = &rtp 34482d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 34492d6b20d6SBram Moolenaar augroup test 34502d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 34512d6b20d6SBram Moolenaar augroup END 34522d6b20d6SBram Moolenaar 34532d6b20d6SBram Moolenaar normal Y 34542d6b20d6SBram Moolenaar 34552d6b20d6SBram Moolenaar augroup test 34562d6b20d6SBram Moolenaar autocmd! 34572d6b20d6SBram Moolenaar augroup END 34582d6b20d6SBram Moolenaar delete('Xdir', 'rf') 34592d6b20d6SBram Moolenaar &rtp = save_rtp 34602d6b20d6SBram Moolenaarenddef 34612d6b20d6SBram Moolenaar 346277e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 346377e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3464cfcd011fSBram Moolenaar var lines =<< trim END 346577e5dcc3SBram Moolenaar vim9script 346677e5dcc3SBram Moolenaar def crash#func() 346777e5dcc3SBram Moolenaar try 346877e5dcc3SBram Moolenaar for x in List() 346977e5dcc3SBram Moolenaar endfor 347077e5dcc3SBram Moolenaar catch 347177e5dcc3SBram Moolenaar endtry 347277e5dcc3SBram Moolenaar g:ok = true 347377e5dcc3SBram Moolenaar enddef 347477e5dcc3SBram Moolenaar fu List() 347577e5dcc3SBram Moolenaar invalid 347677e5dcc3SBram Moolenaar endfu 347777e5dcc3SBram Moolenaar try 347848e11c10SBram Moolenaar alsoinvalid 347977e5dcc3SBram Moolenaar catch /wontmatch/ 348077e5dcc3SBram Moolenaar endtry 348177e5dcc3SBram Moolenaar END 348277e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 348377e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 348477e5dcc3SBram Moolenaar 348577e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 348677e5dcc3SBram Moolenaar lines =<< trim END 348777e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 348877e5dcc3SBram Moolenaar call crash#func() 348977e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 34909c4f5520SBram Moolenaar qall! 349177e5dcc3SBram Moolenaar END 349277e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 349377e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 349477e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 349577e5dcc3SBram Moolenaar 349677e5dcc3SBram Moolenaar delete('Xdidit') 349777e5dcc3SBram Moolenaar delete('Xscript') 349877e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 349903290b84SBram Moolenaar 350003290b84SBram Moolenaar lines =<< trim END 350103290b84SBram Moolenaar vim9script 350203290b84SBram Moolenaar var foo#bar = 'asdf' 350303290b84SBram Moolenaar END 350403290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 350577e5dcc3SBram Moolenaarenddef 350677e5dcc3SBram Moolenaar 350781e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 350881e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 350981e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3510cfcd011fSBram Moolenaar var lines =<< trim END 351181e17fbeSBram Moolenaar let s:counter = 1 351281e17fbeSBram Moolenaar def s:Func() 351381e17fbeSBram Moolenaar au! CursorHold 351481e17fbeSBram Moolenaar au CursorHold * s:counter += 1 351581e17fbeSBram Moolenaar enddef 351681e17fbeSBram Moolenaar call s:Func() 351781e17fbeSBram Moolenaar doau CursorHold 351881e17fbeSBram Moolenaar call assert_equal(2, s:counter) 351981e17fbeSBram Moolenaar au! CursorHold 352081e17fbeSBram Moolenaar END 352181e17fbeSBram Moolenaar CheckScriptSuccess(lines) 352281e17fbeSBram Moolenaarenddef 352381e17fbeSBram Moolenaar 35243896a105SBram Moolenaardef Test_cmdline_win() 35253896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 35263896a105SBram Moolenaar # the command line window. 35273896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3528cfcd011fSBram Moolenaar var export_lines =<< trim END 35293896a105SBram Moolenaar vim9script 3530cfcd011fSBram Moolenaar export var That = 'yes' 35313896a105SBram Moolenaar END 35323896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3533cfcd011fSBram Moolenaar var import_lines =<< trim END 35343896a105SBram Moolenaar vim9script 35353896a105SBram Moolenaar import That from './Xexport.vim' 35363896a105SBram Moolenaar END 35373896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3538cfcd011fSBram Moolenaar var save_rtp = &rtp 35393896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 35403896a105SBram Moolenaar syntax on 35413896a105SBram Moolenaar augroup CmdWin 35423896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 35433896a105SBram Moolenaar augroup END 35443896a105SBram Moolenaar # this will open and also close the cmdline window 35453896a105SBram Moolenaar feedkeys('q:', 'xt') 35463896a105SBram Moolenaar assert_equal('yes', g:got_there) 35473896a105SBram Moolenaar 35483896a105SBram Moolenaar augroup CmdWin 35493896a105SBram Moolenaar au! 35503896a105SBram Moolenaar augroup END 35513896a105SBram Moolenaar &rtp = save_rtp 35523896a105SBram Moolenaar delete('rtp', 'rf') 35533896a105SBram Moolenaarenddef 35543896a105SBram Moolenaar 3555e3d4685fSBram Moolenaardef Test_invalid_sid() 3556e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 355725859dd7SBram Moolenaar 35589c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3559d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3560e3d4685fSBram Moolenaar endif 3561e3d4685fSBram Moolenaar delete('Xdidit') 3562e3d4685fSBram Moolenaarenddef 3563e3d4685fSBram Moolenaar 35649ec7026fSBram Moolenaardef Test_restoring_cpo() 35659ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 35669ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 35679ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 35689ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 35699ec7026fSBram Moolenaar endif 35709ec7026fSBram Moolenaar delete('Xsourced') 35719ec7026fSBram Moolenaar delete('Xclose') 3572090728adSBram Moolenaar delete('Xdone') 35730123cc1eSBram Moolenaar 35740123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 35750123cc1eSBram Moolenaar set cpo=aABceFsMny> 35760123cc1eSBram Moolenaar edit XanotherScript 35770123cc1eSBram Moolenaar so % 35780123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 35790123cc1eSBram Moolenaar :1del 35800123cc1eSBram Moolenaar w 35810123cc1eSBram Moolenaar so % 35820123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 35830123cc1eSBram Moolenaar 35840123cc1eSBram Moolenaar delete('XanotherScript') 35850123cc1eSBram Moolenaar set cpo&vim 35869ec7026fSBram Moolenaarenddef 35879ec7026fSBram Moolenaar 3588ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3589ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 359037294bd6SBram Moolenaar CheckScreendump 3591ffb7dcdbSBram Moolenaar CheckFeature timers 359237294bd6SBram Moolenaar 3593ffb7dcdbSBram Moolenaar let lines =<< trim END 359437294bd6SBram Moolenaar vim9script 359537294bd6SBram Moolenaar def script#func() 359637294bd6SBram Moolenaar enddef 359737294bd6SBram Moolenaar END 3598ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3599ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 360037294bd6SBram Moolenaar 3601ffb7dcdbSBram Moolenaar let lines =<< trim END 360237294bd6SBram Moolenaar vim9script 360337294bd6SBram Moolenaar set cpo+=M 360437294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3605767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 360637294bd6SBram Moolenaar setline(1, 'some text') 360737294bd6SBram Moolenaar END 3608ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3609ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3610ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3611ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 361237294bd6SBram Moolenaar 3613ffb7dcdbSBram Moolenaar " clean up 3614ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3615ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3616ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3617ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3618ffb7dcdbSBram Moolenaarendfunc 361937294bd6SBram Moolenaar 36209ec7026fSBram Moolenaar 3621f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3622cfcd011fSBram Moolenaar var lines =<< trim END 3623cfcd011fSBram Moolenaar var name: any 3624cfcd011fSBram Moolenaar assert_equal(0, name) 3625f0afd9e1SBram Moolenaar END 3626f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3627f0afd9e1SBram Moolenaarenddef 3628f0afd9e1SBram Moolenaar 36297e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 363058dbef33SBram Moolenaar CheckRunVimInTerminal 363158dbef33SBram Moolenaar 36327e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 36337e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 36347e9210eaSBram Moolenaarendfunc 36357e9210eaSBram Moolenaar 36367e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 36379c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3638cfcd011fSBram Moolenaar var lines =<< trim END 36399c4f5520SBram Moolenaar func CheckAndQuit() 36409c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 36419c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 36429c4f5520SBram Moolenaar endfunc 36439c4f5520SBram Moolenaar END 36449c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 36459c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3646e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 36479c4f5520SBram Moolenaar # define Afunc() on the command line 36489c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 36499c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 36502949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 36519c4f5520SBram Moolenaar 36529c4f5520SBram Moolenaar call StopVimInTerminal(buf) 36539c4f5520SBram Moolenaar delete('XcallFunc') 36549c4f5520SBram Moolenaar delete('Xdidcmd') 36559c4f5520SBram Moolenaarenddef 36569c4f5520SBram Moolenaar 3657fcdc5d83SBram Moolenaardef Test_script_var_scope() 3658fcdc5d83SBram Moolenaar var lines =<< trim END 3659fcdc5d83SBram Moolenaar vim9script 3660fcdc5d83SBram Moolenaar if true 3661fcdc5d83SBram Moolenaar if true 3662fcdc5d83SBram Moolenaar var one = 'one' 3663fcdc5d83SBram Moolenaar echo one 3664fcdc5d83SBram Moolenaar endif 3665fcdc5d83SBram Moolenaar echo one 3666fcdc5d83SBram Moolenaar endif 3667fcdc5d83SBram Moolenaar END 3668fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3669fcdc5d83SBram Moolenaar 3670fcdc5d83SBram Moolenaar lines =<< trim END 3671fcdc5d83SBram Moolenaar vim9script 3672fcdc5d83SBram Moolenaar if true 3673fcdc5d83SBram Moolenaar if false 3674fcdc5d83SBram Moolenaar var one = 'one' 3675fcdc5d83SBram Moolenaar echo one 3676fcdc5d83SBram Moolenaar else 3677fcdc5d83SBram Moolenaar var one = 'one' 3678fcdc5d83SBram Moolenaar echo one 3679fcdc5d83SBram Moolenaar endif 3680fcdc5d83SBram Moolenaar echo one 3681fcdc5d83SBram Moolenaar endif 3682fcdc5d83SBram Moolenaar END 3683fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3684fcdc5d83SBram Moolenaar 3685fcdc5d83SBram Moolenaar lines =<< trim END 3686fcdc5d83SBram Moolenaar vim9script 3687fcdc5d83SBram Moolenaar while true 3688fcdc5d83SBram Moolenaar var one = 'one' 3689fcdc5d83SBram Moolenaar echo one 3690fcdc5d83SBram Moolenaar break 3691fcdc5d83SBram Moolenaar endwhile 3692fcdc5d83SBram Moolenaar echo one 3693fcdc5d83SBram Moolenaar END 3694fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3695fcdc5d83SBram Moolenaar 3696fcdc5d83SBram Moolenaar lines =<< trim END 3697fcdc5d83SBram Moolenaar vim9script 3698fcdc5d83SBram Moolenaar for i in range(1) 3699fcdc5d83SBram Moolenaar var one = 'one' 3700fcdc5d83SBram Moolenaar echo one 3701fcdc5d83SBram Moolenaar endfor 3702fcdc5d83SBram Moolenaar echo one 3703fcdc5d83SBram Moolenaar END 3704fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 37059becdf2bSBram Moolenaar 37069becdf2bSBram Moolenaar lines =<< trim END 37079becdf2bSBram Moolenaar vim9script 37089becdf2bSBram Moolenaar { 37099becdf2bSBram Moolenaar var one = 'one' 37109becdf2bSBram Moolenaar assert_equal('one', one) 37119becdf2bSBram Moolenaar } 37129becdf2bSBram Moolenaar assert_false(exists('one')) 37139becdf2bSBram Moolenaar assert_false(exists('s:one')) 37149becdf2bSBram Moolenaar END 37159becdf2bSBram Moolenaar CheckScriptSuccess(lines) 37169becdf2bSBram Moolenaar 37179becdf2bSBram Moolenaar lines =<< trim END 37189becdf2bSBram Moolenaar vim9script 37199becdf2bSBram Moolenaar { 37209becdf2bSBram Moolenaar var one = 'one' 37219becdf2bSBram Moolenaar echo one 37229becdf2bSBram Moolenaar } 37239becdf2bSBram Moolenaar echo one 37249becdf2bSBram Moolenaar END 37259becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3726fcdc5d83SBram Moolenaarenddef 3727fcdc5d83SBram Moolenaar 3728352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3729352134bbSBram Moolenaar var lines =<< trim END 3730352134bbSBram Moolenaar vim9script 37312a38908bSBram Moolenaar def Callback(...l: list<any>) 3732352134bbSBram Moolenaar try 3733352134bbSBram Moolenaar var x: string 3734352134bbSBram Moolenaar var y: string 3735352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3736352134bbSBram Moolenaar [x, y] = [''] 3737352134bbSBram Moolenaar catch 3738352134bbSBram Moolenaar g:caught = 'yes' 3739352134bbSBram Moolenaar endtry 3740352134bbSBram Moolenaar enddef 3741e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3742352134bbSBram Moolenaar feedkeys("\r", 'xt') 3743352134bbSBram Moolenaar END 3744352134bbSBram Moolenaar CheckScriptSuccess(lines) 3745352134bbSBram Moolenaar 3746352134bbSBram Moolenaar unlet g:caught 3747352134bbSBram Moolenaarenddef 3748352134bbSBram Moolenaar 3749631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3750631e8f93SBram Moolenaar if !has('unix') || !has('job') 3751631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3752631e8f93SBram Moolenaar endif 3753631e8f93SBram Moolenaar var lines =<< trim END 3754631e8f93SBram Moolenaar vim9script 3755631e8f93SBram Moolenaar var source: list<number> 37562a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3757631e8f93SBram Moolenaar eval [][0] 3758631e8f93SBram Moolenaar enddef 37592a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3760631e8f93SBram Moolenaar sleep 1m 3761631e8f93SBram Moolenaar source += l 3762631e8f93SBram Moolenaar enddef 3763e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 37646f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 37656f17a3f0SBram Moolenaar sleep 10m 37666f17a3f0SBram Moolenaar endwhile 3767206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3768fe95b94fSBram Moolenaar sleep 200m 3769631e8f93SBram Moolenaar END 3770631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3771631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3772631e8f93SBram Moolenaar delete('Xdef') 3773631e8f93SBram Moolenaarenddef 3774631e8f93SBram Moolenaar 37754324d87aSBram Moolenaardef InvokeNormal() 37764324d87aSBram Moolenaar exe "norm! :m+1\r" 37774324d87aSBram Moolenaarenddef 37784324d87aSBram Moolenaar 37794324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 37804324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 37814324d87aSBram Moolenaar new 37824324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 37834324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 37844324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 37854324d87aSBram Moolenaar xunmap <F3> 3786b5b9480eSBram Moolenaarenddef 3787b5b9480eSBram Moolenaar 3788b5b9480eSBram Moolenaardef Test_white_space_after_command() 3789b5b9480eSBram Moolenaar var lines =<< trim END 3790b5b9480eSBram Moolenaar exit_cb: Func}) 3791b5b9480eSBram Moolenaar END 3792b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3793f8103f27SBram Moolenaar 3794f8103f27SBram Moolenaar lines =<< trim END 3795f8103f27SBram Moolenaar e# 3796f8103f27SBram Moolenaar END 3797f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 37984324d87aSBram Moolenaarenddef 37994324d87aSBram Moolenaar 38004aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 38014aab88d9SBram Moolenaar var lines =<< trim END 38024aab88d9SBram Moolenaar vim9script 38034aab88d9SBram Moolenaar if exists('g:guard') 38044aab88d9SBram Moolenaar finish 38054aab88d9SBram Moolenaar endif 38064aab88d9SBram Moolenaar g:guard = 1 38074aab88d9SBram Moolenaar var name = 'thename' 38084aab88d9SBram Moolenaar def g:GetName(): string 38094aab88d9SBram Moolenaar return name 38104aab88d9SBram Moolenaar enddef 38114aab88d9SBram Moolenaar def g:SetName(arg: string) 38124aab88d9SBram Moolenaar name = arg 38134aab88d9SBram Moolenaar enddef 38144aab88d9SBram Moolenaar END 38154aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 38164aab88d9SBram Moolenaar so XscriptTwice.vim 38174aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 38184aab88d9SBram Moolenaar g:SetName('newname') 38194aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 38204aab88d9SBram Moolenaar so XscriptTwice.vim 38214aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38224aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 38234aab88d9SBram Moolenaar 38244aab88d9SBram Moolenaar delfunc g:GetName 38254aab88d9SBram Moolenaar delfunc g:SetName 38264aab88d9SBram Moolenaar delete('XscriptTwice.vim') 38274aab88d9SBram Moolenaar unlet g:guard 38284aab88d9SBram Moolenaarenddef 38294aab88d9SBram Moolenaar 38304aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 38314aab88d9SBram Moolenaar var exportlines =<< trim END 38324aab88d9SBram Moolenaar vim9script 38334aab88d9SBram Moolenaar if exists('g:guard') 38344aab88d9SBram Moolenaar finish 38354aab88d9SBram Moolenaar endif 38364aab88d9SBram Moolenaar g:guard = 1 38374aab88d9SBram Moolenaar export var name = 'someName' 38384aab88d9SBram Moolenaar END 38394aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 38404aab88d9SBram Moolenaar 38414aab88d9SBram Moolenaar var lines =<< trim END 38424aab88d9SBram Moolenaar vim9script 38434aab88d9SBram Moolenaar import name from './XexportScript.vim' 38444aab88d9SBram Moolenaar def g:GetName(): string 38454aab88d9SBram Moolenaar return name 38464aab88d9SBram Moolenaar enddef 38474aab88d9SBram Moolenaar END 38484aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 38494aab88d9SBram Moolenaar so XscriptImport.vim 38504aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 38514aab88d9SBram Moolenaar 38524aab88d9SBram Moolenaar so XexportScript.vim 38534aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38544aab88d9SBram Moolenaar 38554aab88d9SBram Moolenaar delfunc g:GetName 38564aab88d9SBram Moolenaar delete('XexportScript.vim') 38574aab88d9SBram Moolenaar delete('XscriptImport.vim') 38584aab88d9SBram Moolenaar unlet g:guard 38594aab88d9SBram Moolenaarenddef 38604aab88d9SBram Moolenaar 386110b9421fSBram Moolenaardef Test_unsupported_commands() 386210b9421fSBram Moolenaar var lines =<< trim END 386310b9421fSBram Moolenaar ka 386410b9421fSBram Moolenaar END 38657d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 38667d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 386710b9421fSBram Moolenaar 386810b9421fSBram Moolenaar lines =<< trim END 3869ada1d870SBram Moolenaar :1ka 3870ada1d870SBram Moolenaar END 38717d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 38727d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 3873ada1d870SBram Moolenaar 3874ada1d870SBram Moolenaar lines =<< trim END 387510b9421fSBram Moolenaar t 387610b9421fSBram Moolenaar END 387710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 387810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 387910b9421fSBram Moolenaar 388010b9421fSBram Moolenaar lines =<< trim END 388110b9421fSBram Moolenaar x 388210b9421fSBram Moolenaar END 388310b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 388410b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 388510b9421fSBram Moolenaar 388610b9421fSBram Moolenaar lines =<< trim END 388710b9421fSBram Moolenaar xit 388810b9421fSBram Moolenaar END 388910b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 389010b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 389110b9421fSBram Moolenaarenddef 389210b9421fSBram Moolenaar 3893c70fe460SBram Moolenaardef Test_mapping_line_number() 3894c70fe460SBram Moolenaar var lines =<< trim END 3895c70fe460SBram Moolenaar vim9script 3896c70fe460SBram Moolenaar def g:FuncA() 3897c70fe460SBram Moolenaar # Some comment 3898c70fe460SBram Moolenaar FuncB(0) 3899c70fe460SBram Moolenaar enddef 3900c70fe460SBram Moolenaar # Some comment 3901c70fe460SBram Moolenaar def FuncB( 3902c70fe460SBram Moolenaar # Some comment 3903c70fe460SBram Moolenaar n: number 3904c70fe460SBram Moolenaar ) 3905c70fe460SBram Moolenaar exe 'nno ' 3906c70fe460SBram Moolenaar # Some comment 3907c70fe460SBram Moolenaar .. '<F3> a' 3908c70fe460SBram Moolenaar .. 'b' 3909c70fe460SBram Moolenaar .. 'c' 3910c70fe460SBram Moolenaar enddef 3911c70fe460SBram Moolenaar END 3912c70fe460SBram Moolenaar CheckScriptSuccess(lines) 3913c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 3914c70fe460SBram Moolenaar assert_match('No mapping found', res) 3915c70fe460SBram Moolenaar 3916c70fe460SBram Moolenaar g:FuncA() 3917c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 3918c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 3919c70fe460SBram Moolenaar 3920c70fe460SBram Moolenaar nunmap <F3> 3921c70fe460SBram Moolenaar delfunc g:FuncA 3922c70fe460SBram Moolenaarenddef 3923c70fe460SBram Moolenaar 3924585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3925585fea7bSBram Moolenaardef Test_substitute_cmd() 3926585fea7bSBram Moolenaar new 3927585fea7bSBram Moolenaar setline(1, 'something') 3928585fea7bSBram Moolenaar :substitute(some(other( 3929585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3930585fea7bSBram Moolenaar bwipe! 3931585fea7bSBram Moolenaar 3932f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3933cfcd011fSBram Moolenaar var lines =<< trim END 3934585fea7bSBram Moolenaar vim9script 3935585fea7bSBram Moolenaar new 3936585fea7bSBram Moolenaar setline(1, 'something') 3937585fea7bSBram Moolenaar :substitute(some(other( 3938585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3939585fea7bSBram Moolenaar bwipe! 3940585fea7bSBram Moolenaar END 3941585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3942585fea7bSBram Moolenaar source Xvim9lines 3943585fea7bSBram Moolenaar 3944585fea7bSBram Moolenaar delete('Xvim9lines') 3945585fea7bSBram Moolenaarenddef 3946585fea7bSBram Moolenaar 39478a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3948