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()) 5938ac681a2SBram Moolenaar 5948ac681a2SBram Moolenaar var lines =<< trim END 5958ac681a2SBram Moolenaar vim9script 5968ac681a2SBram Moolenaar try 5978ac681a2SBram Moolenaar acos('0.5') 5988ac681a2SBram Moolenaar ->setline(1) 5998ac681a2SBram Moolenaar catch 6008ac681a2SBram Moolenaar g:caught = v:exception 6018ac681a2SBram Moolenaar endtry 6028ac681a2SBram Moolenaar END 6038ac681a2SBram Moolenaar CheckScriptSuccess(lines) 6048ac681a2SBram Moolenaar assert_match('E808: Number or Float required', g:caught) 6058ac681a2SBram Moolenaar unlet g:caught 6068a7d6542SBram Moolenaarenddef 6078a7d6542SBram Moolenaar 6082e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6092e34c34bSBram Moolenaardef TryContinueFunc() 6102e34c34bSBram Moolenaar while g:Count < 2 6112e34c34bSBram Moolenaar g:sequence ..= 't' 6122e34c34bSBram Moolenaar try 6132e34c34bSBram Moolenaar echoerr 'Test' 6142e34c34bSBram Moolenaar catch 6152e34c34bSBram Moolenaar g:Count += 1 6162e34c34bSBram Moolenaar g:sequence ..= 'c' 6172e34c34bSBram Moolenaar continue 6182e34c34bSBram Moolenaar endtry 6192e34c34bSBram Moolenaar g:sequence ..= 'e' 6202e34c34bSBram Moolenaar g:Count += 1 6212e34c34bSBram Moolenaar endwhile 6222e34c34bSBram Moolenaarenddef 6232e34c34bSBram Moolenaar 6242e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6252e34c34bSBram Moolenaar g:Count = 0 6262e34c34bSBram Moolenaar g:sequence = '' 6272e34c34bSBram Moolenaar TryContinueFunc() 6282e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6292e34c34bSBram Moolenaar unlet g:Count 6302e34c34bSBram Moolenaar unlet g:sequence 6312e34c34bSBram Moolenaarenddef 6322e34c34bSBram Moolenaar 6339cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6349cb577a6SBram Moolenaar # return in try block returns normally 6359cb577a6SBram Moolenaar def ReturnInTry(): string 6369cb577a6SBram Moolenaar try 6379cb577a6SBram Moolenaar return '"some message"' 6389cb577a6SBram Moolenaar catch 6399cb577a6SBram Moolenaar endtry 6409cb577a6SBram Moolenaar return 'not reached' 6419cb577a6SBram Moolenaar enddef 6429cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6439cb577a6SBram Moolenaarenddef 6449cb577a6SBram Moolenaar 6451430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6461430ceebSBram Moolenaar var lines =<< trim END 6471430ceebSBram Moolenaar vim9script 6481430ceebSBram Moolenaar au BufEnter * eval 0 6491430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6501430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6511430ceebSBram Moolenaar var items = [ 6521430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6531430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6541430ceebSBram Moolenaar ] 6551430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6561430ceebSBram Moolenaar cwindow 6571430ceebSBram Moolenaar 6581430ceebSBram Moolenaar def CnextOrCfirst() 6591430ceebSBram Moolenaar # if cnext fails, cfirst is used 6601430ceebSBram Moolenaar try 6611430ceebSBram Moolenaar cnext 6621430ceebSBram Moolenaar catch 6631430ceebSBram Moolenaar cfirst 6641430ceebSBram Moolenaar endtry 6651430ceebSBram Moolenaar enddef 6661430ceebSBram Moolenaar 6671430ceebSBram Moolenaar CnextOrCfirst() 6681430ceebSBram Moolenaar CnextOrCfirst() 6691430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6701430ceebSBram Moolenaar qall 6711430ceebSBram Moolenaar END 6721430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6731430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6741430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6751430ceebSBram Moolenaar 6761430ceebSBram Moolenaar delete('Xfile1') 6771430ceebSBram Moolenaar delete('Xfile2') 6781430ceebSBram Moolenaar delete('XCatchCnext') 6791430ceebSBram Moolenaar delete('Xresult') 6801430ceebSBram Moolenaarenddef 6811430ceebSBram Moolenaar 6829e1d9e34SBram Moolenaardef Test_throw_skipped() 6839e1d9e34SBram Moolenaar if 0 6849e1d9e34SBram Moolenaar throw dontgethere 6859e1d9e34SBram Moolenaar endif 6869e1d9e34SBram Moolenaarenddef 6879e1d9e34SBram Moolenaar 6888f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6898f81b22eSBram Moolenaar var lines =<< trim END 6908f81b22eSBram Moolenaar vim9script 6918f81b22eSBram Moolenaar def Func() 6928f81b22eSBram Moolenaar throw 'error' 6938f81b22eSBram Moolenaar enddef 6948f81b22eSBram Moolenaar silent! Func() 6958f81b22eSBram Moolenaar END 6968f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6978f81b22eSBram Moolenaar source XthrowSilenced 6988f81b22eSBram Moolenaar delete('XthrowSilenced') 6998f81b22eSBram Moolenaarenddef 7008f81b22eSBram Moolenaar 701e859312eSBram Moolenaardef DeletedFunc(): list<any> 702e859312eSBram Moolenaar return ['delete me'] 703e859312eSBram Moolenaarenddef 704e859312eSBram Moolenaardefcompile 705e859312eSBram Moolenaardelfunc DeletedFunc 706e859312eSBram Moolenaar 707257cc5eeSBram Moolenaardef ThrowFromDef() 708a72cfb80SBram Moolenaar throw "getout" # comment 709257cc5eeSBram Moolenaarenddef 710257cc5eeSBram Moolenaar 711257cc5eeSBram Moolenaarfunc CatchInFunc() 712257cc5eeSBram Moolenaar try 713257cc5eeSBram Moolenaar call ThrowFromDef() 714257cc5eeSBram Moolenaar catch 715257cc5eeSBram Moolenaar let g:thrown_func = v:exception 716257cc5eeSBram Moolenaar endtry 717257cc5eeSBram Moolenaarendfunc 718257cc5eeSBram Moolenaar 719257cc5eeSBram Moolenaardef CatchInDef() 720257cc5eeSBram Moolenaar try 721257cc5eeSBram Moolenaar ThrowFromDef() 722257cc5eeSBram Moolenaar catch 723257cc5eeSBram Moolenaar g:thrown_def = v:exception 724257cc5eeSBram Moolenaar endtry 725257cc5eeSBram Moolenaarenddef 726257cc5eeSBram Moolenaar 727f575adffSBram Moolenaardef ReturnFinally(): string 728f575adffSBram Moolenaar try 729f575adffSBram Moolenaar return 'intry' 730373863edSBram Moolenaar finall 731f575adffSBram Moolenaar g:in_finally = 'finally' 732f575adffSBram Moolenaar endtry 733f575adffSBram Moolenaar return 'end' 734f575adffSBram Moolenaarenddef 735f575adffSBram Moolenaar 736257cc5eeSBram Moolenaardef Test_try_catch_nested() 737257cc5eeSBram Moolenaar CatchInFunc() 738257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 739257cc5eeSBram Moolenaar 740257cc5eeSBram Moolenaar CatchInDef() 741257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 742f575adffSBram Moolenaar 743f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 744f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 745f575adffSBram Moolenaarenddef 746f575adffSBram Moolenaar 7479939f57bSBram Moolenaardef TryOne(): number 7489939f57bSBram Moolenaar try 7499939f57bSBram Moolenaar return 0 7509939f57bSBram Moolenaar catch 7519939f57bSBram Moolenaar endtry 7529939f57bSBram Moolenaar return 0 7539939f57bSBram Moolenaarenddef 7549939f57bSBram Moolenaar 7559939f57bSBram Moolenaardef TryTwo(n: number): string 7569939f57bSBram Moolenaar try 757cfcd011fSBram Moolenaar var x = {} 7589939f57bSBram Moolenaar catch 7599939f57bSBram Moolenaar endtry 7609939f57bSBram Moolenaar return 'text' 7619939f57bSBram Moolenaarenddef 7629939f57bSBram Moolenaar 7639939f57bSBram Moolenaardef Test_try_catch_twice() 7649939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7659939f57bSBram Moolenaarenddef 7669939f57bSBram Moolenaar 767f575adffSBram Moolenaardef Test_try_catch_match() 768cfcd011fSBram Moolenaar var seq = 'a' 769f575adffSBram Moolenaar try 770f575adffSBram Moolenaar throw 'something' 771f575adffSBram Moolenaar catch /nothing/ 772f575adffSBram Moolenaar seq ..= 'x' 773f575adffSBram Moolenaar catch /some/ 774f575adffSBram Moolenaar seq ..= 'b' 775f575adffSBram Moolenaar catch /asdf/ 776f575adffSBram Moolenaar seq ..= 'x' 777e8c4abbbSBram Moolenaar catch ?a\?sdf? 778e8c4abbbSBram Moolenaar seq ..= 'y' 779f575adffSBram Moolenaar finally 780f575adffSBram Moolenaar seq ..= 'c' 781f575adffSBram Moolenaar endtry 782f575adffSBram Moolenaar assert_equal('abc', seq) 783257cc5eeSBram Moolenaarenddef 784257cc5eeSBram Moolenaar 785e8c4abbbSBram Moolenaardef Test_try_catch_fails() 786d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 787d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 788d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 789d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 790d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 791d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 792d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 793d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 79413106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 795d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 796585fea7bSBram Moolenaar 797e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 798d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 799e8c4abbbSBram Moolenaarenddef 800e8c4abbbSBram Moolenaar 8017c5b3c03SBram Moolenaardef Try_catch_skipped() 8027c5b3c03SBram Moolenaar var l = [] 8037c5b3c03SBram Moolenaar try 8047c5b3c03SBram Moolenaar finally 8057c5b3c03SBram Moolenaar endtry 8067c5b3c03SBram Moolenaar 8077c5b3c03SBram Moolenaar if 1 8087c5b3c03SBram Moolenaar else 8097c5b3c03SBram Moolenaar try 8107c5b3c03SBram Moolenaar endtry 8117c5b3c03SBram Moolenaar endif 8127c5b3c03SBram Moolenaarenddef 8137c5b3c03SBram Moolenaar 8147c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 8157c5b3c03SBram Moolenaardef Test_try_catch_skipped() 8167c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 8177c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 8187c5b3c03SBram Moolenaarenddef 8197c5b3c03SBram Moolenaar 8207c5b3c03SBram Moolenaar 8217c5b3c03SBram Moolenaar 822006ad48bSBram Moolenaardef Test_throw_vimscript() 823f5be8cdbSBram Moolenaar # only checks line continuation 824cfcd011fSBram Moolenaar var lines =<< trim END 825006ad48bSBram Moolenaar vim9script 826006ad48bSBram Moolenaar try 827006ad48bSBram Moolenaar throw 'one' 828006ad48bSBram Moolenaar .. 'two' 829006ad48bSBram Moolenaar catch 830006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 831006ad48bSBram Moolenaar endtry 832006ad48bSBram Moolenaar END 833006ad48bSBram Moolenaar CheckScriptSuccess(lines) 8341e021e63SBram Moolenaar 8351e021e63SBram Moolenaar lines =<< trim END 8361e021e63SBram Moolenaar vim9script 837352134bbSBram Moolenaar @r = '' 8381e021e63SBram Moolenaar def Func() 8391e021e63SBram Moolenaar throw @r 8401e021e63SBram Moolenaar enddef 8411e021e63SBram Moolenaar var result = '' 8421e021e63SBram Moolenaar try 8431e021e63SBram Moolenaar Func() 8441e021e63SBram Moolenaar catch /E1129:/ 8451e021e63SBram Moolenaar result = 'caught' 8461e021e63SBram Moolenaar endtry 8471e021e63SBram Moolenaar assert_equal('caught', result) 8481e021e63SBram Moolenaar END 8491e021e63SBram Moolenaar CheckScriptSuccess(lines) 850006ad48bSBram Moolenaarenddef 851006ad48bSBram Moolenaar 852ed677f55SBram Moolenaardef Test_error_in_nested_function() 85303dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 854cfcd011fSBram Moolenaar var lines =<< trim END 855ed677f55SBram Moolenaar vim9script 856ed677f55SBram Moolenaar def Func() 857ed677f55SBram Moolenaar Error() 858ed677f55SBram Moolenaar g:test_var = 1 859ed677f55SBram Moolenaar enddef 860ed677f55SBram Moolenaar func Error() abort 861ed677f55SBram Moolenaar eval [][0] 862ed677f55SBram Moolenaar endfunc 863ed677f55SBram Moolenaar Func() 864ed677f55SBram Moolenaar END 865ed677f55SBram Moolenaar g:test_var = 0 866ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 867ed677f55SBram Moolenaar assert_equal(0, g:test_var) 868ed677f55SBram Moolenaarenddef 869ed677f55SBram Moolenaar 870227c58a4SBram Moolenaardef Test_abort_after_error() 871227c58a4SBram Moolenaar var lines =<< trim END 872227c58a4SBram Moolenaar vim9script 873227c58a4SBram Moolenaar while true 874227c58a4SBram Moolenaar echo notfound 875227c58a4SBram Moolenaar endwhile 876227c58a4SBram Moolenaar g:gotthere = true 877227c58a4SBram Moolenaar END 878227c58a4SBram Moolenaar g:gotthere = false 879227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 880227c58a4SBram Moolenaar assert_false(g:gotthere) 881227c58a4SBram Moolenaar unlet g:gotthere 882227c58a4SBram Moolenaarenddef 883227c58a4SBram Moolenaar 88437c83711SBram Moolenaardef Test_cexpr_vimscript() 885f5be8cdbSBram Moolenaar # only checks line continuation 88637c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 887cfcd011fSBram Moolenaar var lines =<< trim END 88837c83711SBram Moolenaar vim9script 88937c83711SBram Moolenaar cexpr 'File' 89037c83711SBram Moolenaar .. ' someFile' .. 89137c83711SBram Moolenaar ' line 19' 89237c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 89337c83711SBram Moolenaar END 89437c83711SBram Moolenaar CheckScriptSuccess(lines) 89537c83711SBram Moolenaar set errorformat& 89637c83711SBram Moolenaarenddef 89737c83711SBram Moolenaar 898c9edd6b5SBram Moolenaardef Test_statusline_syntax() 899c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 900cfcd011fSBram Moolenaar var lines =<< trim END 901c9edd6b5SBram Moolenaar vim9script 902c9edd6b5SBram Moolenaar func g:Status() 903c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 904c9edd6b5SBram Moolenaar endfunc 905c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 906c9edd6b5SBram Moolenaar redrawstatus 907c9edd6b5SBram Moolenaar set laststatus statusline= 908c9edd6b5SBram Moolenaar END 909c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 910c9edd6b5SBram Moolenaarenddef 911c9edd6b5SBram Moolenaar 912b209750bSBram Moolenaardef Test_list_vimscript() 913b209750bSBram Moolenaar # checks line continuation and comments 914cfcd011fSBram Moolenaar var lines =<< trim END 915b209750bSBram Moolenaar vim9script 916cfcd011fSBram Moolenaar var mylist = [ 917b209750bSBram Moolenaar 'one', 918b209750bSBram Moolenaar # comment 919b209750bSBram Moolenaar 'two', # empty line follows 920b209750bSBram Moolenaar 921b209750bSBram Moolenaar 'three', 922b209750bSBram Moolenaar ] 923b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 924b209750bSBram Moolenaar END 925b209750bSBram Moolenaar CheckScriptSuccess(lines) 92666250c93SBram Moolenaar 92766250c93SBram Moolenaar # check all lines from heredoc are kept 92866250c93SBram Moolenaar lines =<< trim END 92966250c93SBram Moolenaar # comment 1 93066250c93SBram Moolenaar two 93166250c93SBram Moolenaar # comment 3 93266250c93SBram Moolenaar 93366250c93SBram Moolenaar five 93466250c93SBram Moolenaar # comment 6 93566250c93SBram Moolenaar END 93666250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 9374bce26bbSBram Moolenaar 9384bce26bbSBram Moolenaar lines =<< trim END 9394bce26bbSBram Moolenaar [{ 9404bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 9414bce26bbSBram Moolenaar END 9424bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 943b209750bSBram Moolenaarenddef 944b209750bSBram Moolenaar 9452a1381c3SBram Moolenaarif has('channel') 94640ee466cSBram Moolenaar let someJob = test_null_job() 94740ee466cSBram Moolenaar 94840ee466cSBram Moolenaar def FuncWithError() 94940ee466cSBram Moolenaar echomsg g:someJob 95040ee466cSBram Moolenaar enddef 95140ee466cSBram Moolenaar 95240ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 95340ee466cSBram Moolenaar try 95440ee466cSBram Moolenaar call FuncWithError() 95540ee466cSBram Moolenaar catch 95640ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 95740ee466cSBram Moolenaar endtry 95840ee466cSBram Moolenaar endfunc 9592a1381c3SBram Moolenaarendif 96040ee466cSBram Moolenaar 9618a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9628a7d6542SBram Moolenaar vim9script 963cfcd011fSBram Moolenaar var name: string = 'bob' 9648a7d6542SBram Moolenaar def Concat(arg: string): string 9658a7d6542SBram Moolenaar return name .. arg 9668a7d6542SBram Moolenaar enddef 967227a69deSBram Moolenaar g:result = Concat('bie') 968227a69deSBram Moolenaar g:localname = name 9698a7d6542SBram Moolenaar 9708a7d6542SBram Moolenaar export const CONST = 1234 971cfcd011fSBram Moolenaar export var exported = 9876 972cfcd011fSBram Moolenaar export var exp_name = 'John' 9738a7d6542SBram Moolenaar export def Exported(): string 9748a7d6542SBram Moolenaar return 'Exported' 9758a7d6542SBram Moolenaar enddef 9760f2a5cc6SBram Moolenaar export final theList = [1] 9778a7d6542SBram MoolenaarEND 9788a7d6542SBram Moolenaar 979b3ca9824SBram Moolenaardef Undo_export_script_lines() 980b3ca9824SBram Moolenaar unlet g:result 981b3ca9824SBram Moolenaar unlet g:localname 982b3ca9824SBram Moolenaarenddef 983b3ca9824SBram Moolenaar 9845269bd2aSBram Moolenaardef Test_vim9_import_export() 985cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9868a7d6542SBram Moolenaar vim9script 9878a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9888a7d6542SBram Moolenaar g:imported = exported 9896e587dcbSBram Moolenaar exported += 3 9906e587dcbSBram Moolenaar g:imported_added = exported 9918a7d6542SBram Moolenaar g:imported_func = Exported() 9926e587dcbSBram Moolenaar 99340f4f7a4SBram Moolenaar def GetExported(): string 994e0de171eSBram Moolenaar var local_dict = {ref: Exported} 99540f4f7a4SBram Moolenaar return local_dict.ref() 99640f4f7a4SBram Moolenaar enddef 99740f4f7a4SBram Moolenaar g:funcref_result = GetExported() 99840f4f7a4SBram Moolenaar 9996e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10006e587dcbSBram Moolenaar g:imported_name = exp_name 10016e587dcbSBram Moolenaar exp_name ..= ' Doe' 10026e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10035381c7a1SBram Moolenaar g:imported_later = exported 10040f2a5cc6SBram Moolenaar 10050f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 10060f2a5cc6SBram Moolenaar theList->add(2) 10070f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 10088a7d6542SBram Moolenaar END 10098a7d6542SBram Moolenaar 10108a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 10118a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 10128a7d6542SBram Moolenaar 10138a7d6542SBram Moolenaar source Ximport.vim 10148a7d6542SBram Moolenaar 10158a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 10168a7d6542SBram Moolenaar assert_equal('bob', g:localname) 10178a7d6542SBram Moolenaar assert_equal(9876, g:imported) 10186e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 10195381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 10208a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 102140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 10226e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 10236e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 10248a7d6542SBram Moolenaar assert_false(exists('g:name')) 10258a7d6542SBram Moolenaar 1026b3ca9824SBram Moolenaar Undo_export_script_lines() 10278a7d6542SBram Moolenaar unlet g:imported 10286e587dcbSBram Moolenaar unlet g:imported_added 10295381c7a1SBram Moolenaar unlet g:imported_later 10308a7d6542SBram Moolenaar unlet g:imported_func 10316e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 10328a7d6542SBram Moolenaar delete('Ximport.vim') 1033f2d5c240SBram Moolenaar 10341c991144SBram Moolenaar # similar, with line breaks 1035cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 10361c991144SBram Moolenaar vim9script 10371c991144SBram Moolenaar import { 10381c991144SBram Moolenaar exported, 10391c991144SBram Moolenaar Exported, 10401c991144SBram Moolenaar } 10411c991144SBram Moolenaar from 10421c991144SBram Moolenaar './Xexport.vim' 10431c991144SBram Moolenaar g:imported = exported 10441c991144SBram Moolenaar exported += 5 10451c991144SBram Moolenaar g:imported_added = exported 10461c991144SBram Moolenaar g:imported_func = Exported() 10471c991144SBram Moolenaar END 10481c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 10491c991144SBram Moolenaar source Ximport_lbr.vim 10501c991144SBram Moolenaar 10511c991144SBram Moolenaar assert_equal(9876, g:imported) 10521c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10531c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10541c991144SBram Moolenaar 10551c991144SBram Moolenaar # exported script not sourced again 10561c991144SBram Moolenaar assert_false(exists('g:result')) 10571c991144SBram Moolenaar unlet g:imported 10581c991144SBram Moolenaar unlet g:imported_added 10591c991144SBram Moolenaar unlet g:imported_func 10601c991144SBram Moolenaar delete('Ximport_lbr.vim') 10611c991144SBram Moolenaar 10621c991144SBram Moolenaar # import inside :def function 1063cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10645381c7a1SBram Moolenaar vim9script 10655381c7a1SBram Moolenaar def ImportInDef() 10665381c7a1SBram Moolenaar import exported from './Xexport.vim' 10675381c7a1SBram Moolenaar g:imported = exported 10685381c7a1SBram Moolenaar exported += 7 10695381c7a1SBram Moolenaar g:imported_added = exported 10705381c7a1SBram Moolenaar enddef 10715381c7a1SBram Moolenaar ImportInDef() 10725381c7a1SBram Moolenaar END 10735381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10745381c7a1SBram Moolenaar source Ximport2.vim 1075f5be8cdbSBram Moolenaar # TODO: this should be 9879 10765381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10775381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10785381c7a1SBram Moolenaar unlet g:imported 10795381c7a1SBram Moolenaar unlet g:imported_added 10805381c7a1SBram Moolenaar delete('Ximport2.vim') 10815381c7a1SBram Moolenaar 1082cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1083f2d5c240SBram Moolenaar vim9script 1084f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1085f2d5c240SBram Moolenaar def UseExport() 1086cb4e80faSBram Moolenaar g:imported_def = Export.exported 1087f2d5c240SBram Moolenaar enddef 1088cb4e80faSBram Moolenaar g:imported_script = Export.exported 1089cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1090cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1091f2d5c240SBram Moolenaar UseExport() 1092f2d5c240SBram Moolenaar END 1093f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1094f2d5c240SBram Moolenaar source Ximport.vim 1095cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1096cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1097f2d5c240SBram Moolenaar 1098cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1099599c89c8SBram Moolenaar vim9script 1100599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1101599c89c8SBram Moolenaar def Func() 1102cfcd011fSBram Moolenaar var dummy = 1 1103cfcd011fSBram Moolenaar var imported = Export + dummy 1104599c89c8SBram Moolenaar enddef 1105822ba247SBram Moolenaar defcompile 1106599c89c8SBram Moolenaar END 1107599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 110844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1109599c89c8SBram Moolenaar 1110cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1111599c89c8SBram Moolenaar vim9script 1112599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1113599c89c8SBram Moolenaar def Func() 1114cfcd011fSBram Moolenaar var imported = Export . exported 1115599c89c8SBram Moolenaar enddef 1116822ba247SBram Moolenaar defcompile 1117599c89c8SBram Moolenaar END 1118599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 111944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1120599c89c8SBram Moolenaar 1121a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1122a6294955SBram Moolenaar vim9script 1123a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1124a6294955SBram Moolenaar var some = 'other' 1125a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1126a6294955SBram Moolenaar defcompile 1127a6294955SBram Moolenaar END 1128a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1129a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1130a6294955SBram Moolenaar 1131cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1132cb4e80faSBram Moolenaar vim9script 1133cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1134cb4e80faSBram Moolenaar g:imported_script = Export exported 1135cb4e80faSBram Moolenaar END 1136cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1137cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1138cb4e80faSBram Moolenaar 1139cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1140cb4e80faSBram Moolenaar vim9script 1141cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1142cb4e80faSBram Moolenaar g:imported_script = Export. exported 1143cb4e80faSBram Moolenaar END 1144cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1145cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1146cb4e80faSBram Moolenaar 1147cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1148599c89c8SBram Moolenaar vim9script 1149599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1150599c89c8SBram Moolenaar def Func() 1151cfcd011fSBram Moolenaar var imported = Export. 1152599c89c8SBram Moolenaar enddef 1153822ba247SBram Moolenaar defcompile 1154599c89c8SBram Moolenaar END 1155599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 115644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1157599c89c8SBram Moolenaar 1158cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 11591c991144SBram Moolenaar vim9script 11601c991144SBram Moolenaar import * 11611c991144SBram Moolenaar as Export 11621c991144SBram Moolenaar from 11631c991144SBram Moolenaar './Xexport.vim' 11641c991144SBram Moolenaar def UseExport() 11651c991144SBram Moolenaar g:imported = Export.exported 11661c991144SBram Moolenaar enddef 11671c991144SBram Moolenaar UseExport() 11681c991144SBram Moolenaar END 11691c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 11701c991144SBram Moolenaar source Ximport.vim 11711c991144SBram Moolenaar assert_equal(9883, g:imported) 11721c991144SBram Moolenaar 1173cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1174f2d5c240SBram Moolenaar vim9script 1175f2d5c240SBram Moolenaar import * from './Xexport.vim' 1176f2d5c240SBram Moolenaar END 1177f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 117844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1179f2d5c240SBram Moolenaar 1180f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1181cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1182fa29c8abSBram Moolenaar vim9script 1183fa29c8abSBram Moolenaar import name from './Xexport.vim' 1184fa29c8abSBram Moolenaar END 1185fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 118644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1187fa29c8abSBram Moolenaar 1188f5be8cdbSBram Moolenaar # try to import something that is already defined 1189cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11905269bd2aSBram Moolenaar vim9script 1191cfcd011fSBram Moolenaar var exported = 'something' 11925269bd2aSBram Moolenaar import exported from './Xexport.vim' 11935269bd2aSBram Moolenaar END 11945269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1195057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11965269bd2aSBram Moolenaar 1197f5be8cdbSBram Moolenaar # try to import something that is already defined 11985269bd2aSBram Moolenaar import_already_defined =<< trim END 11995269bd2aSBram Moolenaar vim9script 1200cfcd011fSBram Moolenaar var exported = 'something' 12015269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12025269bd2aSBram Moolenaar END 12035269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1204057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12055269bd2aSBram Moolenaar 1206f5be8cdbSBram Moolenaar # try to import something that is already defined 12075269bd2aSBram Moolenaar import_already_defined =<< trim END 12085269bd2aSBram Moolenaar vim9script 1209cfcd011fSBram Moolenaar var exported = 'something' 12105269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12115269bd2aSBram Moolenaar END 12125269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1213057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12145269bd2aSBram Moolenaar 1215918a4249SBram Moolenaar # try changing an imported const 1216918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1217918a4249SBram Moolenaar vim9script 1218918a4249SBram Moolenaar import CONST from './Xexport.vim' 1219918a4249SBram Moolenaar def Assign() 1220918a4249SBram Moolenaar CONST = 987 1221918a4249SBram Moolenaar enddef 1222918a4249SBram Moolenaar defcompile 1223918a4249SBram Moolenaar END 1224918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1225918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1226918a4249SBram Moolenaar 12270f2a5cc6SBram Moolenaar # try changing an imported final 12280f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 12290f2a5cc6SBram Moolenaar vim9script 12300f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 12310f2a5cc6SBram Moolenaar def Assign() 12320f2a5cc6SBram Moolenaar theList = [2] 12330f2a5cc6SBram Moolenaar enddef 12340f2a5cc6SBram Moolenaar defcompile 12350f2a5cc6SBram Moolenaar END 12360f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 12370f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 12380f2a5cc6SBram Moolenaar 1239f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1240cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1241fa29c8abSBram Moolenaar vim9script 1242fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1243fa29c8abSBram Moolenaar END 1244fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 124544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1246fa29c8abSBram Moolenaar 1247cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1248fa29c8abSBram Moolenaar vim9script 1249fa29c8abSBram Moolenaar import name './Xexport.vim' 1250fa29c8abSBram Moolenaar END 1251fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 125244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1253fa29c8abSBram Moolenaar 1254cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1255fa29c8abSBram Moolenaar vim9script 1256fa29c8abSBram Moolenaar import name from Xexport.vim 1257fa29c8abSBram Moolenaar END 1258fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 125944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1260fa29c8abSBram Moolenaar 1261cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1262fa29c8abSBram Moolenaar vim9script 1263fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1264fa29c8abSBram Moolenaar END 1265fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 126644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1267fa29c8abSBram Moolenaar 1268cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1269fa29c8abSBram Moolenaar vim9script 1270fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1271fa29c8abSBram Moolenaar END 12725269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 127344d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1274fa29c8abSBram Moolenaar 1275f2d5c240SBram Moolenaar delete('Ximport.vim') 12765269bd2aSBram Moolenaar delete('Ximport3.vim') 12778a7d6542SBram Moolenaar delete('Xexport.vim') 12788a7d6542SBram Moolenaar 1279f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 12803e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 12813e191694SBram Moolenaar set cpo=abcd 1282cfcd011fSBram Moolenaar var lines =<< trim END 1283750802b5SBram Moolenaar vim9script 1284750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 12853e191694SBram Moolenaar set cpo+=f 12863e191694SBram Moolenaar set cpo-=c 12873e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1288750802b5SBram Moolenaar END 1289750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1290750802b5SBram Moolenaar source Xvim9_script 12913e191694SBram Moolenaar assert_equal('fabd', &cpo) 1292750802b5SBram Moolenaar set cpo&vim 1293750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 12943e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 12953e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 12963e191694SBram Moolenaar 1297750802b5SBram Moolenaar delete('Xvim9_script') 1298750802b5SBram Moolenaarenddef 1299750802b5SBram Moolenaar 13000a84284eSBram Moolenaardef Test_import_as() 13010a84284eSBram Moolenaar var export_lines =<< trim END 13020a84284eSBram Moolenaar vim9script 13030a84284eSBram Moolenaar export var one = 1 13040a84284eSBram Moolenaar export var yes = 'yes' 13050a84284eSBram Moolenaar END 13060a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 13070a84284eSBram Moolenaar 13080a84284eSBram Moolenaar var import_lines =<< trim END 13090a84284eSBram Moolenaar vim9script 13106c7cc347SBram Moolenaar var one = 'notused' 13116c7cc347SBram Moolenaar var yes = 777 13120a84284eSBram Moolenaar import one as thatOne from './XexportAs' 13130a84284eSBram Moolenaar assert_equal(1, thatOne) 13140a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 13150a84284eSBram Moolenaar assert_equal('yes', yesYes) 13160a84284eSBram Moolenaar END 13170a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13180a84284eSBram Moolenaar 13190a84284eSBram Moolenaar import_lines =<< trim END 13200a84284eSBram Moolenaar vim9script 13210a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 13220a84284eSBram Moolenaar assert_equal(1, thatOne) 13230a84284eSBram Moolenaar assert_equal('yes', yesYes) 13240a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 13250a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 13260a84284eSBram Moolenaar END 13270a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 13280a84284eSBram Moolenaar 13290a84284eSBram Moolenaar delete('XexportAs') 13300a84284eSBram Moolenaarenddef 13310a84284eSBram Moolenaar 1332803af686SBram Moolenaarfunc g:Trigger() 1333803af686SBram Moolenaar source Ximport.vim 1334803af686SBram Moolenaar return "echo 'yes'\<CR>" 1335803af686SBram Moolenaarendfunc 1336803af686SBram Moolenaar 1337803af686SBram Moolenaardef Test_import_export_expr_map() 1338803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1339cfcd011fSBram Moolenaar var export_lines =<< trim END 1340803af686SBram Moolenaar vim9script 1341803af686SBram Moolenaar export def That(): string 1342803af686SBram Moolenaar return 'yes' 1343803af686SBram Moolenaar enddef 1344803af686SBram Moolenaar END 1345803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1346803af686SBram Moolenaar 1347cfcd011fSBram Moolenaar var import_lines =<< trim END 1348803af686SBram Moolenaar vim9script 1349803af686SBram Moolenaar import That from './Xexport_that.vim' 1350803af686SBram Moolenaar assert_equal('yes', That()) 1351803af686SBram Moolenaar END 1352803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1353803af686SBram Moolenaar 1354803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1355803af686SBram Moolenaar feedkeys('trigger', "xt") 1356803af686SBram Moolenaar 1357730b2483SBram Moolenaar delete('Xexport_that.vim') 1358803af686SBram Moolenaar delete('Ximport.vim') 1359803af686SBram Moolenaar nunmap trigger 1360803af686SBram Moolenaarenddef 1361803af686SBram Moolenaar 13628e1986e3SBram Moolenaardef Test_import_in_filetype() 13638e1986e3SBram Moolenaar # check that :import works when the buffer is locked 13648e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1365cfcd011fSBram Moolenaar var export_lines =<< trim END 13668e1986e3SBram Moolenaar vim9script 1367cfcd011fSBram Moolenaar export var That = 'yes' 13688e1986e3SBram Moolenaar END 1369730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 13708e1986e3SBram Moolenaar 1371cfcd011fSBram Moolenaar var import_lines =<< trim END 13728e1986e3SBram Moolenaar vim9script 1373730b2483SBram Moolenaar import That from './Xexport_ft.vim' 13748e1986e3SBram Moolenaar assert_equal('yes', That) 13758e1986e3SBram Moolenaar g:did_load_mytpe = 1 13768e1986e3SBram Moolenaar END 13778e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 13788e1986e3SBram Moolenaar 1379cfcd011fSBram Moolenaar var save_rtp = &rtp 13808e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 13818e1986e3SBram Moolenaar 13828e1986e3SBram Moolenaar filetype plugin on 13838e1986e3SBram Moolenaar copen 13848e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 13858e1986e3SBram Moolenaar 13868e1986e3SBram Moolenaar quit! 1387730b2483SBram Moolenaar delete('Xexport_ft.vim') 13888e1986e3SBram Moolenaar delete('ftplugin', 'rf') 13898e1986e3SBram Moolenaar &rtp = save_rtp 13908e1986e3SBram Moolenaarenddef 13918e1986e3SBram Moolenaar 1392efa94447SBram Moolenaardef Test_use_import_in_mapping() 1393cfcd011fSBram Moolenaar var lines =<< trim END 1394efa94447SBram Moolenaar vim9script 1395efa94447SBram Moolenaar export def Funcx() 1396efa94447SBram Moolenaar g:result = 42 1397efa94447SBram Moolenaar enddef 1398efa94447SBram Moolenaar END 1399efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1400efa94447SBram Moolenaar lines =<< trim END 1401efa94447SBram Moolenaar vim9script 1402efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1403b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1404efa94447SBram Moolenaar END 1405efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1406efa94447SBram Moolenaar 1407efa94447SBram Moolenaar source Xmapscript.vim 1408b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1409efa94447SBram Moolenaar assert_equal(42, g:result) 1410efa94447SBram Moolenaar 1411efa94447SBram Moolenaar unlet g:result 1412efa94447SBram Moolenaar delete('XsomeExport.vim') 1413efa94447SBram Moolenaar delete('Xmapscript.vim') 1414b3ca9824SBram Moolenaar nunmap <F3> 1415efa94447SBram Moolenaarenddef 1416efa94447SBram Moolenaar 1417d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1418d3f8a9eeSBram Moolenaar var lines =<< trim END 1419d3f8a9eeSBram Moolenaar if has(g:feature) 1420d3f8a9eeSBram Moolenaar " legacy script 1421d3f8a9eeSBram Moolenaar let g:legacy = 1 1422d3f8a9eeSBram Moolenaar finish 1423d3f8a9eeSBram Moolenaar endif 1424d3f8a9eeSBram Moolenaar vim9script 1425d3f8a9eeSBram Moolenaar g:legacy = 0 1426d3f8a9eeSBram Moolenaar END 1427d3f8a9eeSBram Moolenaar g:feature = 'eval' 1428d3f8a9eeSBram Moolenaar g:legacy = -1 1429d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1430d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1431d3f8a9eeSBram Moolenaar 1432d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1433d3f8a9eeSBram Moolenaar g:legacy = -1 1434d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1435d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1436d3f8a9eeSBram Moolenaarenddef 1437d3f8a9eeSBram Moolenaar 1438750802b5SBram Moolenaardef Test_vim9script_fails() 14398a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 14408a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1441cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 14429721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1443cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1444750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1445750802b5SBram Moolenaar 1446cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1447c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1448c785b9a7SBram Moolenaar 1449e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1450e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 14518a7d6542SBram Moolenaarenddef 14528a7d6542SBram Moolenaar 1453f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1454101f4810SBram Moolenaar CheckRunVimInTerminal 1455101f4810SBram Moolenaar 14569bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1457c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 14589bb3eb3eSBram Moolenaarendfunc 14599bb3eb3eSBram Moolenaar 1460c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1461cfcd011fSBram Moolenaar var export =<< trim END 1462101f4810SBram Moolenaar vim9script 1463101f4810SBram Moolenaar export def Foo(): number 1464101f4810SBram Moolenaar return 0 1465101f4810SBram Moolenaar enddef 1466101f4810SBram Moolenaar END 1467730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1468101f4810SBram Moolenaar 1469e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 14709bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 14712949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1472101f4810SBram Moolenaar 1473730b2483SBram Moolenaar delete('XexportCmd.vim') 14749bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 14759bb3eb3eSBram Moolenaarenddef 1476101f4810SBram Moolenaar 14772b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 14782b32700dSBram Moolenaar var lines =<< trim END 1479a6294955SBram Moolenaar vim9script 1480a6294955SBram Moolenaar export var exported = 'thexport' 1481a6294955SBram Moolenaar END 1482a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1483a6294955SBram Moolenaar lines =<< trim END 14842b32700dSBram Moolenaar vim9script noclear 14852b32700dSBram Moolenaar g:loadCount += 1 14862b32700dSBram Moolenaar var s:reloaded = 'init' 1487a6294955SBram Moolenaar import exported from './XExportReload' 14882b32700dSBram Moolenaar 14892b32700dSBram Moolenaar def Again(): string 14902b32700dSBram Moolenaar return 'again' 14912b32700dSBram Moolenaar enddef 14922b32700dSBram Moolenaar 14932b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 14942b32700dSBram Moolenaar var s:loaded = true 14952b32700dSBram Moolenaar 14962b32700dSBram Moolenaar var s:notReloaded = 'yes' 14972b32700dSBram Moolenaar s:reloaded = 'first' 14982b32700dSBram Moolenaar def g:Values(): list<string> 1499a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 15002b32700dSBram Moolenaar enddef 15012b32700dSBram Moolenaar 15022b32700dSBram Moolenaar def Once(): string 15032b32700dSBram Moolenaar return 'once' 15042b32700dSBram Moolenaar enddef 15052b32700dSBram Moolenaar END 15062b32700dSBram Moolenaar writefile(lines, 'XReloaded') 15072b32700dSBram Moolenaar g:loadCount = 0 15082b32700dSBram Moolenaar source XReloaded 15092b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1510a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 15112b32700dSBram Moolenaar source XReloaded 15122b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1513a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15142b32700dSBram Moolenaar source XReloaded 15152b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1516a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 15172b32700dSBram Moolenaar 151848e11c10SBram Moolenaar delete('XReloaded') 1519a6294955SBram Moolenaar delete('XExportReload') 15202b32700dSBram Moolenaar delfunc g:Values 15212b32700dSBram Moolenaar unlet g:loadCount 1522*577dc93dSBram Moolenaar 1523*577dc93dSBram Moolenaar lines =<< trim END 1524*577dc93dSBram Moolenaar vim9script 1525*577dc93dSBram Moolenaar def Inner() 1526*577dc93dSBram Moolenaar enddef 1527*577dc93dSBram Moolenaar END 1528*577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1529*577dc93dSBram Moolenaar source XreloadScript.vim 1530*577dc93dSBram Moolenaar 1531*577dc93dSBram Moolenaar lines =<< trim END 1532*577dc93dSBram Moolenaar vim9script 1533*577dc93dSBram Moolenaar def Outer() 1534*577dc93dSBram Moolenaar def Inner() 1535*577dc93dSBram Moolenaar enddef 1536*577dc93dSBram Moolenaar enddef 1537*577dc93dSBram Moolenaar defcompile 1538*577dc93dSBram Moolenaar END 1539*577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1540*577dc93dSBram Moolenaar source XreloadScript.vim 1541*577dc93dSBram Moolenaar 1542*577dc93dSBram Moolenaar delete('XreloadScript.vim') 15432b32700dSBram Moolenaarenddef 15442b32700dSBram Moolenaar 15454c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1546cfcd011fSBram Moolenaar var lines =<< trim END 15478a7d6542SBram Moolenaar vim9script 15488a7d6542SBram Moolenaar const var = '' 1549cfcd011fSBram Moolenaar var valone = 1234 15508a7d6542SBram Moolenaar def MyFunc(arg: string) 15518a7d6542SBram Moolenaar valone = 5678 15528a7d6542SBram Moolenaar enddef 15538a7d6542SBram Moolenaar END 1554cfcd011fSBram Moolenaar var morelines =<< trim END 1555cfcd011fSBram Moolenaar var valtwo = 222 15568a7d6542SBram Moolenaar export def GetValtwo(): number 15578a7d6542SBram Moolenaar return valtwo 15588a7d6542SBram Moolenaar enddef 15598a7d6542SBram Moolenaar END 156003afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 15618a7d6542SBram Moolenaar source Xreload.vim 15628a7d6542SBram Moolenaar source Xreload.vim 15638a7d6542SBram Moolenaar source Xreload.vim 15648a7d6542SBram Moolenaar 1565cfcd011fSBram Moolenaar var testlines =<< trim END 15668a7d6542SBram Moolenaar vim9script 15678a7d6542SBram Moolenaar def TheFunc() 15688a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 15698a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 15708a7d6542SBram Moolenaar enddef 15718a7d6542SBram Moolenaar TheFunc() 15728a7d6542SBram Moolenaar END 15738a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 15748a7d6542SBram Moolenaar source Ximport.vim 15758a7d6542SBram Moolenaar 1576f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1577f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 15788a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 15798a7d6542SBram Moolenaar source Ximport.vim 15808a7d6542SBram Moolenaar 1581f5be8cdbSBram Moolenaar # cannot declare a var twice 15828a7d6542SBram Moolenaar lines =<< trim END 15838a7d6542SBram Moolenaar vim9script 1584cfcd011fSBram Moolenaar var valone = 1234 1585cfcd011fSBram Moolenaar var valone = 5678 15868a7d6542SBram Moolenaar END 15878a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 158844d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 15898a7d6542SBram Moolenaar 15908a7d6542SBram Moolenaar delete('Xreload.vim') 15918a7d6542SBram Moolenaar delete('Ximport.vim') 15928a7d6542SBram Moolenaarenddef 15938a7d6542SBram Moolenaar 159407a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 159507a65d26SBram Moolenaar" compiled function using that variable must fail. 159607a65d26SBram Moolenaardef Test_script_reload_change_type() 159707a65d26SBram Moolenaar var lines =<< trim END 159807a65d26SBram Moolenaar vim9script noclear 159907a65d26SBram Moolenaar var str = 'string' 160007a65d26SBram Moolenaar def g:GetStr(): string 160107a65d26SBram Moolenaar return str .. 'xxx' 160207a65d26SBram Moolenaar enddef 160307a65d26SBram Moolenaar END 160407a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 160507a65d26SBram Moolenaar source Xreload.vim 160607a65d26SBram Moolenaar echo g:GetStr() 160707a65d26SBram Moolenaar 160807a65d26SBram Moolenaar lines =<< trim END 160907a65d26SBram Moolenaar vim9script noclear 161007a65d26SBram Moolenaar var str = 1234 161107a65d26SBram Moolenaar END 161207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 161307a65d26SBram Moolenaar source Xreload.vim 161407a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 161507a65d26SBram Moolenaar 161607a65d26SBram Moolenaar delfunc g:GetStr 161707a65d26SBram Moolenaar delete('Xreload.vim') 161807a65d26SBram Moolenaarenddef 161907a65d26SBram Moolenaar 1620c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1621c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1622c970e422SBram Moolenaar 1623c970e422SBram Moolenaardef Test_script_reload_from_function() 1624c970e422SBram Moolenaar var lines =<< trim END 1625c970e422SBram Moolenaar vim9script 1626c970e422SBram Moolenaar 1627c970e422SBram Moolenaar if exists('g:loaded') 1628c970e422SBram Moolenaar finish 1629c970e422SBram Moolenaar endif 1630c970e422SBram Moolenaar g:loaded = 1 1631c970e422SBram Moolenaar delcommand CallFunc 1632c970e422SBram Moolenaar command CallFunc Func() 1633c970e422SBram Moolenaar def Func() 1634a4c81beaSBram Moolenaar so XreloadFunc.vim 1635c970e422SBram Moolenaar g:didTheFunc = 1 1636c970e422SBram Moolenaar enddef 1637c970e422SBram Moolenaar END 1638c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1639c970e422SBram Moolenaar source XreloadFunc.vim 1640c970e422SBram Moolenaar CallFunc 1641c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1642c970e422SBram Moolenaar 1643c970e422SBram Moolenaar delete('XreloadFunc.vim') 1644c970e422SBram Moolenaar delcommand CallFunc 1645c970e422SBram Moolenaar unlet g:loaded 1646c970e422SBram Moolenaar unlet g:didTheFunc 1647c970e422SBram Moolenaarenddef 1648c970e422SBram Moolenaar 16496c3843caSBram Moolenaardef Test_script_var_shadows_function() 16506c3843caSBram Moolenaar var lines =<< trim END 16516c3843caSBram Moolenaar vim9script 16526c3843caSBram Moolenaar def Func(): number 16536c3843caSBram Moolenaar return 123 16546c3843caSBram Moolenaar enddef 16556c3843caSBram Moolenaar var Func = 1 16566c3843caSBram Moolenaar END 16576c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 16586c3843caSBram Moolenaarenddef 16596c3843caSBram Moolenaar 166095006e3dSBram Moolenaardef s:RetSome(): string 166195006e3dSBram Moolenaar return 'some' 166295006e3dSBram Moolenaarenddef 166395006e3dSBram Moolenaar 1664fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1665fe465a01SBram Moolenaar" script-local name. 1666fe465a01SBram Moolenaardef Test_vim9script_funcref() 1667cfcd011fSBram Moolenaar var sortlines =<< trim END 1668fe465a01SBram Moolenaar vim9script 1669fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1670bed36b93SBram Moolenaar return i2 - i1 1671fe465a01SBram Moolenaar enddef 1672fe465a01SBram Moolenaar 1673fe465a01SBram Moolenaar export def FastSort(): list<number> 1674fe465a01SBram Moolenaar return range(5)->sort(Compare) 1675fe465a01SBram Moolenaar enddef 1676529fb5a5SBram Moolenaar 1677529fb5a5SBram Moolenaar export def GetString(arg: string): string 1678529fb5a5SBram Moolenaar return arg 1679529fb5a5SBram Moolenaar enddef 1680fe465a01SBram Moolenaar END 1681fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1682fe465a01SBram Moolenaar 1683cfcd011fSBram Moolenaar var lines =<< trim END 1684fe465a01SBram Moolenaar vim9script 1685fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1686fe465a01SBram Moolenaar def Test() 1687fe465a01SBram Moolenaar g:result = FastSort() 1688fe465a01SBram Moolenaar enddef 1689fe465a01SBram Moolenaar Test() 1690529fb5a5SBram Moolenaar 1691529fb5a5SBram Moolenaar # using a function imported with "as" 1692529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1693529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1694529fb5a5SBram Moolenaar 1695529fb5a5SBram Moolenaar # using the function from a compiled function 1696529fb5a5SBram Moolenaar def TestMore(): string 1697ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1698ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1699529fb5a5SBram Moolenaar enddef 1700ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1701529fb5a5SBram Moolenaar 1702529fb5a5SBram Moolenaar # error when using a function that isn't exported 1703529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1704fe465a01SBram Moolenaar END 1705fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1706fe465a01SBram Moolenaar 1707fe465a01SBram Moolenaar source Xscript.vim 1708fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1709fe465a01SBram Moolenaar 1710fe465a01SBram Moolenaar unlet g:result 1711fe465a01SBram Moolenaar delete('Xsort.vim') 1712fe465a01SBram Moolenaar delete('Xscript.vim') 171395006e3dSBram Moolenaar 1714cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 171595006e3dSBram Moolenaar assert_equal('some', Funcref()) 1716fe465a01SBram Moolenaarenddef 1717fe465a01SBram Moolenaar 1718601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1719601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1720601e76acSBram Moolenaar" function reference. 1721c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1722cfcd011fSBram Moolenaar var filterLines =<< trim END 1723c620c055SBram Moolenaar vim9script 1724c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1725c620c055SBram Moolenaar return idx % 2 == 1 1726c620c055SBram Moolenaar enddef 1727c620c055SBram Moolenaar export def FastFilter(): list<number> 1728c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1729c620c055SBram Moolenaar enddef 1730601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1731601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1732601e76acSBram Moolenaar enddef 1733c620c055SBram Moolenaar END 1734c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1735c620c055SBram Moolenaar 1736cfcd011fSBram Moolenaar var lines =<< trim END 1737c620c055SBram Moolenaar vim9script 1738601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1739c620c055SBram Moolenaar def Test() 1740cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1741c620c055SBram Moolenaar enddef 1742c620c055SBram Moolenaar Test() 1743601e76acSBram Moolenaar def TestDirect() 1744cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1745601e76acSBram Moolenaar enddef 1746601e76acSBram Moolenaar TestDirect() 1747c620c055SBram Moolenaar END 1748601e76acSBram Moolenaar CheckScriptSuccess(lines) 1749c620c055SBram Moolenaar delete('Xfilter.vim') 1750c620c055SBram Moolenaarenddef 1751c620c055SBram Moolenaar 17524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1753cfcd011fSBram Moolenaar var first_lines =<< trim END 17544c17ad94SBram Moolenaar vim9script 17554c17ad94SBram Moolenaar def FuncYes(): string 17564c17ad94SBram Moolenaar return 'yes' 17574c17ad94SBram Moolenaar enddef 17584c17ad94SBram Moolenaar END 1759cfcd011fSBram Moolenaar var withno_lines =<< trim END 17604c17ad94SBram Moolenaar def FuncNo(): string 17614c17ad94SBram Moolenaar return 'no' 17624c17ad94SBram Moolenaar enddef 17634c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 17644c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 17654c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 176603afdcf1SBram Moolenaar enddef 176703afdcf1SBram Moolenaar END 1768cfcd011fSBram Moolenaar var nono_lines =<< trim END 176903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 177003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 177144d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 17724c17ad94SBram Moolenaar enddef 17734c17ad94SBram Moolenaar END 17744c17ad94SBram Moolenaar 17754c17ad94SBram Moolenaar # FuncNo() is defined 177603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17774c17ad94SBram Moolenaar source Xreloaded.vim 17784c17ad94SBram Moolenaar g:DoCheck(true) 17794c17ad94SBram Moolenaar 17804c17ad94SBram Moolenaar # FuncNo() is not redefined 178103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 17824c17ad94SBram Moolenaar source Xreloaded.vim 17835082471fSBram Moolenaar g:DoCheck(false) 17844c17ad94SBram Moolenaar 17854c17ad94SBram Moolenaar # FuncNo() is back 178603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 17874c17ad94SBram Moolenaar source Xreloaded.vim 17885082471fSBram Moolenaar g:DoCheck(false) 17894c17ad94SBram Moolenaar 17904c17ad94SBram Moolenaar delete('Xreloaded.vim') 17914c17ad94SBram Moolenaarenddef 17924c17ad94SBram Moolenaar 179389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 179489483d40SBram Moolenaar # write the script with a script-local variable 1795cfcd011fSBram Moolenaar var lines =<< trim END 179689483d40SBram Moolenaar vim9script 1797cfcd011fSBram Moolenaar var name = 'string' 179889483d40SBram Moolenaar END 179989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 180089483d40SBram Moolenaar source XreloadVar.vim 180189483d40SBram Moolenaar 180289483d40SBram Moolenaar # now write the script using the same variable locally - works 180389483d40SBram Moolenaar lines =<< trim END 180489483d40SBram Moolenaar vim9script 180589483d40SBram Moolenaar def Func() 1806cfcd011fSBram Moolenaar var name = 'string' 180789483d40SBram Moolenaar enddef 180889483d40SBram Moolenaar END 180989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 181089483d40SBram Moolenaar source XreloadVar.vim 181189483d40SBram Moolenaar 181289483d40SBram Moolenaar delete('XreloadVar.vim') 181389483d40SBram Moolenaarenddef 181489483d40SBram Moolenaar 18158a7d6542SBram Moolenaardef Test_import_absolute() 1816cfcd011fSBram Moolenaar var import_lines = [ 1817e6085c53SBram Moolenaar 'vim9script', 1818e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1819e6085c53SBram Moolenaar 'def UseExported()', 1820e6085c53SBram Moolenaar ' g:imported_abs = exported', 1821e6085c53SBram Moolenaar ' exported = 8888', 1822e6085c53SBram Moolenaar ' g:imported_after = exported', 1823e6085c53SBram Moolenaar 'enddef', 1824e6085c53SBram Moolenaar 'UseExported()', 1825e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1826e6085c53SBram Moolenaar ] 18278a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 18288a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 18298a7d6542SBram Moolenaar 18308a7d6542SBram Moolenaar source Ximport_abs.vim 18318a7d6542SBram Moolenaar 18328a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 18334e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1834fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1835fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1836fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1837fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1838fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1839fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1840fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1841fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1842fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1843fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1844e6085c53SBram Moolenaar g:import_disassembled) 1845b3ca9824SBram Moolenaar 1846b3ca9824SBram Moolenaar Undo_export_script_lines() 18478a7d6542SBram Moolenaar unlet g:imported_abs 18484e12a5dfSBram Moolenaar unlet g:import_disassembled 18498a7d6542SBram Moolenaar 18508a7d6542SBram Moolenaar delete('Ximport_abs.vim') 18518a7d6542SBram Moolenaar delete('Xexport_abs.vim') 18528a7d6542SBram Moolenaarenddef 18538a7d6542SBram Moolenaar 18548a7d6542SBram Moolenaardef Test_import_rtp() 1855cfcd011fSBram Moolenaar var import_lines = [ 1856e6085c53SBram Moolenaar 'vim9script', 1857e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1858e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1859e6085c53SBram Moolenaar ] 18608a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 18618a7d6542SBram Moolenaar mkdir('import') 18628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 18638a7d6542SBram Moolenaar 1864cfcd011fSBram Moolenaar var save_rtp = &rtp 18658a7d6542SBram Moolenaar &rtp = getcwd() 18668a7d6542SBram Moolenaar source Ximport_rtp.vim 18678a7d6542SBram Moolenaar &rtp = save_rtp 18688a7d6542SBram Moolenaar 18698a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 18708a7d6542SBram Moolenaar 1871b3ca9824SBram Moolenaar Undo_export_script_lines() 1872b3ca9824SBram Moolenaar unlet g:imported_rtp 18738a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 187489483d40SBram Moolenaar delete('import', 'rf') 18758a7d6542SBram Moolenaarenddef 18768a7d6542SBram Moolenaar 187725e0f586SBram Moolenaardef Test_import_compile_error() 1878cfcd011fSBram Moolenaar var export_lines = [ 187925e0f586SBram Moolenaar 'vim9script', 188025e0f586SBram Moolenaar 'export def ExpFunc(): string', 188125e0f586SBram Moolenaar ' return notDefined', 188225e0f586SBram Moolenaar 'enddef', 188325e0f586SBram Moolenaar ] 188425e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 188525e0f586SBram Moolenaar 1886cfcd011fSBram Moolenaar var import_lines = [ 188725e0f586SBram Moolenaar 'vim9script', 188825e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 188925e0f586SBram Moolenaar 'def ImpFunc()', 189025e0f586SBram Moolenaar ' echo ExpFunc()', 189125e0f586SBram Moolenaar 'enddef', 189225e0f586SBram Moolenaar 'defcompile', 189325e0f586SBram Moolenaar ] 189425e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 189525e0f586SBram Moolenaar 189625e0f586SBram Moolenaar try 189725e0f586SBram Moolenaar source Ximport.vim 189825e0f586SBram Moolenaar catch /E1001/ 1899f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 19007707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 190125e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 190225e0f586SBram Moolenaar endtry 190325e0f586SBram Moolenaar 190425e0f586SBram Moolenaar delete('Xexported.vim') 190525e0f586SBram Moolenaar delete('Ximport.vim') 190625e0f586SBram Moolenaarenddef 190725e0f586SBram Moolenaar 1908c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1909cfcd011fSBram Moolenaar var lines = [ 1910c4ce36d4SBram Moolenaar 'vim9script', 1911c4ce36d4SBram Moolenaar 'def Func()', 1912c4ce36d4SBram Moolenaar ' eval [][0]', 1913c4ce36d4SBram Moolenaar 'enddef', 1914c4ce36d4SBram Moolenaar 'Func()', 1915c4ce36d4SBram Moolenaar ] 1916c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1917c4ce36d4SBram Moolenaar 1918c4ce36d4SBram Moolenaar for count in range(3) 1919c4ce36d4SBram Moolenaar try 1920c4ce36d4SBram Moolenaar source Xtestscript.vim 1921c4ce36d4SBram Moolenaar catch /E684/ 1922c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1923c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1924c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1925c4ce36d4SBram Moolenaar endtry 1926c4ce36d4SBram Moolenaar endfor 1927c4ce36d4SBram Moolenaar 1928c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1929c4ce36d4SBram Moolenaarenddef 1930c4ce36d4SBram Moolenaar 1931eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1932cfcd011fSBram Moolenaar var export_lines =<< trim END 1933eef2102eSBram Moolenaar vim9script 1934eef2102eSBram Moolenaar export def Func() 1935eef2102eSBram Moolenaar echo 'imported' 1936eef2102eSBram Moolenaar enddef 1937eef2102eSBram Moolenaar END 1938eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1939eef2102eSBram Moolenaar 1940cfcd011fSBram Moolenaar var lines =<< trim END 1941eef2102eSBram Moolenaar vim9script 1942eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1943eef2102eSBram Moolenaar def Func() 1944eef2102eSBram Moolenaar echo 'local to function' 1945eef2102eSBram Moolenaar enddef 1946eef2102eSBram Moolenaar END 1947eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1948eef2102eSBram Moolenaar 1949eef2102eSBram Moolenaar lines =<< trim END 1950eef2102eSBram Moolenaar vim9script 1951eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1952eef2102eSBram Moolenaar def Outer() 1953eef2102eSBram Moolenaar def Func() 1954eef2102eSBram Moolenaar echo 'local to function' 1955eef2102eSBram Moolenaar enddef 1956eef2102eSBram Moolenaar enddef 1957eef2102eSBram Moolenaar defcompile 1958eef2102eSBram Moolenaar END 1959eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1960eef2102eSBram Moolenaar 1961eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1962eef2102eSBram Moolenaarenddef 1963eef2102eSBram Moolenaar 1964b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1965cfcd011fSBram Moolenaar var lines =<< trim END 1966b9a2cac3SBram Moolenaar vim9script 1967b9a2cac3SBram Moolenaar def Func() 1968b9a2cac3SBram Moolenaar echo 'one' 1969b9a2cac3SBram Moolenaar enddef 1970b9a2cac3SBram Moolenaar def Func() 1971b9a2cac3SBram Moolenaar echo 'two' 1972b9a2cac3SBram Moolenaar enddef 1973b9a2cac3SBram Moolenaar END 1974b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1975fa211f3cSBram Moolenaar 1976fa211f3cSBram Moolenaar lines =<< trim END 1977fa211f3cSBram Moolenaar vim9script 1978fa211f3cSBram Moolenaar def Foo(): string 1979fa211f3cSBram Moolenaar return 'foo' 1980fa211f3cSBram Moolenaar enddef 1981fa211f3cSBram Moolenaar def Func() 1982cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1983fa211f3cSBram Moolenaar enddef 1984fa211f3cSBram Moolenaar defcompile 1985fa211f3cSBram Moolenaar END 1986fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1987b9a2cac3SBram Moolenaarenddef 1988b9a2cac3SBram Moolenaar 19898a7d6542SBram Moolenaardef Test_fixed_size_list() 1990f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1991cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 19928a7d6542SBram Moolenaar l->remove(0) 19938a7d6542SBram Moolenaar l->add(5) 19948a7d6542SBram Moolenaar l->insert(99, 1) 19950f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 19968a7d6542SBram Moolenaarenddef 19978a7d6542SBram Moolenaar 1998ae616494SBram Moolenaardef Test_no_insert_xit() 1999d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2000d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2001d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2002d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2003d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2004ae616494SBram Moolenaar 2005ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2006ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2007ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2008ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2009f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2010f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 20116508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 20126508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2013f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2014f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2015f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2016ae616494SBram Moolenaarenddef 2017ae616494SBram Moolenaar 2018158906cfSBram Moolenaardef IfElse(what: number): string 2019cfcd011fSBram Moolenaar var res = '' 2020158906cfSBram Moolenaar if what == 1 2021158906cfSBram Moolenaar res = "one" 2022158906cfSBram Moolenaar elseif what == 2 2023158906cfSBram Moolenaar res = "two" 2024a259d8d3SBram Moolenaar else 2025158906cfSBram Moolenaar res = "three" 2026a259d8d3SBram Moolenaar endif 2027158906cfSBram Moolenaar return res 2028a259d8d3SBram Moolenaarenddef 2029a259d8d3SBram Moolenaar 2030158906cfSBram Moolenaardef Test_if_elseif_else() 2031158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2032158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2033158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 20340f18b6d1SBram Moolenaarenddef 20350f18b6d1SBram Moolenaar 2036e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2037d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2038d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2039d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2040ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2041d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 20426628b7ebSBram Moolenaar 20436628b7ebSBram Moolenaar var lines =<< trim END 20446628b7ebSBram Moolenaar var s = '' 20456628b7ebSBram Moolenaar if s = '' 20466628b7ebSBram Moolenaar endif 20476628b7ebSBram Moolenaar END 20486628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 20496628b7ebSBram Moolenaar 20506628b7ebSBram Moolenaar lines =<< trim END 20516628b7ebSBram Moolenaar var s = '' 20526628b7ebSBram Moolenaar if s == '' 20536628b7ebSBram Moolenaar elseif s = '' 20546628b7ebSBram Moolenaar endif 20556628b7ebSBram Moolenaar END 20566628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2057e8c4abbbSBram Moolenaarenddef 2058e8c4abbbSBram Moolenaar 20596d69bf60SBram Moolenaarlet g:bool_true = v:true 20606d69bf60SBram Moolenaarlet g:bool_false = v:false 20616d69bf60SBram Moolenaar 20626d69bf60SBram Moolenaardef Test_if_const_expr() 2063cfcd011fSBram Moolenaar var res = false 20646d69bf60SBram Moolenaar if true ? true : false 20656d69bf60SBram Moolenaar res = true 20666d69bf60SBram Moolenaar endif 20676d69bf60SBram Moolenaar assert_equal(true, res) 20686d69bf60SBram Moolenaar 2069585fea7bSBram Moolenaar g:glob = 2 2070585fea7bSBram Moolenaar if false 20716797966dSBram Moolenaar execute('g:glob = 3') 2072585fea7bSBram Moolenaar endif 2073585fea7bSBram Moolenaar assert_equal(2, g:glob) 2074585fea7bSBram Moolenaar if true 20756797966dSBram Moolenaar execute('g:glob = 3') 2076585fea7bSBram Moolenaar endif 2077585fea7bSBram Moolenaar assert_equal(3, g:glob) 2078585fea7bSBram Moolenaar 20796d69bf60SBram Moolenaar res = false 20806d69bf60SBram Moolenaar if g:bool_true ? true : false 20816d69bf60SBram Moolenaar res = true 20826d69bf60SBram Moolenaar endif 20836d69bf60SBram Moolenaar assert_equal(true, res) 20846d69bf60SBram Moolenaar 20856d69bf60SBram Moolenaar res = false 20866d69bf60SBram Moolenaar if true ? g:bool_true : false 20876d69bf60SBram Moolenaar res = true 20886d69bf60SBram Moolenaar endif 20896d69bf60SBram Moolenaar assert_equal(true, res) 20906d69bf60SBram Moolenaar 20916d69bf60SBram Moolenaar res = false 20926d69bf60SBram Moolenaar if true ? true : g:bool_false 20936d69bf60SBram Moolenaar res = true 20946d69bf60SBram Moolenaar endif 20956d69bf60SBram Moolenaar assert_equal(true, res) 20966d69bf60SBram Moolenaar 20976d69bf60SBram Moolenaar res = false 20986d69bf60SBram Moolenaar if true ? false : true 20996d69bf60SBram Moolenaar res = true 21006d69bf60SBram Moolenaar endif 21016d69bf60SBram Moolenaar assert_equal(false, res) 21026d69bf60SBram Moolenaar 21036d69bf60SBram Moolenaar res = false 21046d69bf60SBram Moolenaar if false ? false : true 21056d69bf60SBram Moolenaar res = true 21066d69bf60SBram Moolenaar endif 21076d69bf60SBram Moolenaar assert_equal(true, res) 21086d69bf60SBram Moolenaar 21096d69bf60SBram Moolenaar res = false 21106d69bf60SBram Moolenaar if false ? true : false 21116d69bf60SBram Moolenaar res = true 21126d69bf60SBram Moolenaar endif 21136d69bf60SBram Moolenaar assert_equal(false, res) 21146d69bf60SBram Moolenaar 21156d69bf60SBram Moolenaar res = false 2116e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2117e8c4abbbSBram Moolenaar res = true 2118e8c4abbbSBram Moolenaar endif 2119e8c4abbbSBram Moolenaar assert_equal(false, res) 2120e8c4abbbSBram Moolenaar 2121e8c4abbbSBram Moolenaar res = false 21226d69bf60SBram Moolenaar if true && true 21236d69bf60SBram Moolenaar res = true 21246d69bf60SBram Moolenaar endif 21256d69bf60SBram Moolenaar assert_equal(true, res) 21266d69bf60SBram Moolenaar 21276d69bf60SBram Moolenaar res = false 21286d69bf60SBram Moolenaar if true && false 21296d69bf60SBram Moolenaar res = true 21306d69bf60SBram Moolenaar endif 21316d69bf60SBram Moolenaar assert_equal(false, res) 21326d69bf60SBram Moolenaar 21336d69bf60SBram Moolenaar res = false 21346d69bf60SBram Moolenaar if g:bool_true && false 21356d69bf60SBram Moolenaar res = true 21366d69bf60SBram Moolenaar endif 21376d69bf60SBram Moolenaar assert_equal(false, res) 21386d69bf60SBram Moolenaar 21396d69bf60SBram Moolenaar res = false 21406d69bf60SBram Moolenaar if true && g:bool_false 21416d69bf60SBram Moolenaar res = true 21426d69bf60SBram Moolenaar endif 21436d69bf60SBram Moolenaar assert_equal(false, res) 21446d69bf60SBram Moolenaar 21456d69bf60SBram Moolenaar res = false 21466d69bf60SBram Moolenaar if false && false 21476d69bf60SBram Moolenaar res = true 21486d69bf60SBram Moolenaar endif 21496d69bf60SBram Moolenaar assert_equal(false, res) 21506d69bf60SBram Moolenaar 21516d69bf60SBram Moolenaar res = false 21526d69bf60SBram Moolenaar if true || false 21536d69bf60SBram Moolenaar res = true 21546d69bf60SBram Moolenaar endif 21556d69bf60SBram Moolenaar assert_equal(true, res) 21566d69bf60SBram Moolenaar 21576d69bf60SBram Moolenaar res = false 21586d69bf60SBram Moolenaar if g:bool_true || false 21596d69bf60SBram Moolenaar res = true 21606d69bf60SBram Moolenaar endif 21616d69bf60SBram Moolenaar assert_equal(true, res) 21626d69bf60SBram Moolenaar 21636d69bf60SBram Moolenaar res = false 21646d69bf60SBram Moolenaar if true || g:bool_false 21656d69bf60SBram Moolenaar res = true 21666d69bf60SBram Moolenaar endif 21676d69bf60SBram Moolenaar assert_equal(true, res) 21686d69bf60SBram Moolenaar 21696d69bf60SBram Moolenaar res = false 21706d69bf60SBram Moolenaar if false || false 21716d69bf60SBram Moolenaar res = true 21726d69bf60SBram Moolenaar endif 21736d69bf60SBram Moolenaar assert_equal(false, res) 21743988f64fSBram Moolenaar 21753988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 21763988f64fSBram Moolenaar if false | eval 0 | endif 21773988f64fSBram Moolenaar if false | eval burp + 234 | endif 21783988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 21793988f64fSBram Moolenaar if false 21803988f64fSBram Moolenaar burp 21813988f64fSBram Moolenaar endif 218280c34ca3SBram Moolenaarenddef 21836d69bf60SBram Moolenaar 218480c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2185d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2186d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2187d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2188d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 21896d69bf60SBram Moolenaarenddef 21906d69bf60SBram Moolenaar 219172abcf42SBram Moolenaardef RunNested(i: number): number 2192cfcd011fSBram Moolenaar var x: number = 0 219372abcf42SBram Moolenaar if i % 2 219472abcf42SBram Moolenaar if 1 2195f5be8cdbSBram Moolenaar # comment 219672abcf42SBram Moolenaar else 2197f5be8cdbSBram Moolenaar # comment 219872abcf42SBram Moolenaar endif 219972abcf42SBram Moolenaar x += 1 220072abcf42SBram Moolenaar else 220172abcf42SBram Moolenaar x += 1000 220272abcf42SBram Moolenaar endif 220372abcf42SBram Moolenaar return x 220472abcf42SBram Moolenaarenddef 220572abcf42SBram Moolenaar 220672abcf42SBram Moolenaardef Test_nested_if() 220772abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 220872abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 220972abcf42SBram Moolenaarenddef 221072abcf42SBram Moolenaar 2211ad39c094SBram Moolenaardef Test_execute_cmd() 2212e4984290SBram Moolenaar # missing argument is ignored 2213e4984290SBram Moolenaar execute 2214e4984290SBram Moolenaar execute # comment 2215e4984290SBram Moolenaar 2216ad39c094SBram Moolenaar new 2217ad39c094SBram Moolenaar setline(1, 'default') 2218d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2219ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2220a72cfb80SBram Moolenaar 2221d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2222a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2223a72cfb80SBram Moolenaar 2224cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2225cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2226a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2227ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2228a72cfb80SBram Moolenaar 2229d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2230ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2231a72cfb80SBram Moolenaar 2232cfcd011fSBram Moolenaar var cmd_first = 'call ' 2233cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2234ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2235ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2236ad39c094SBram Moolenaar bwipe! 2237585fea7bSBram Moolenaar 2238cfcd011fSBram Moolenaar var n = true 22392d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 22402d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 22412d6b20d6SBram Moolenaar 2242e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2243e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2244e5abf7afSBram Moolenaar 2245d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2246d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2247d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2248ad39c094SBram Moolenaarenddef 2249ad39c094SBram Moolenaar 225047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2251f5be8cdbSBram Moolenaar # only checks line continuation 2252cfcd011fSBram Moolenaar var lines =<< trim END 225347e880d6SBram Moolenaar vim9script 225447e880d6SBram Moolenaar execute 'g:someVar' 225547e880d6SBram Moolenaar .. ' = ' .. 225647e880d6SBram Moolenaar '28' 225747e880d6SBram Moolenaar assert_equal(28, g:someVar) 225847e880d6SBram Moolenaar unlet g:someVar 225947e880d6SBram Moolenaar END 226047e880d6SBram Moolenaar CheckScriptSuccess(lines) 226147e880d6SBram Moolenaarenddef 226247e880d6SBram Moolenaar 2263ad39c094SBram Moolenaardef Test_echo_cmd() 2264a72cfb80SBram Moolenaar echo 'some' # comment 2265585fea7bSBram Moolenaar echon 'thing' 2266ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2267ad39c094SBram Moolenaar 2268a72cfb80SBram Moolenaar echo "some" # comment 2269a72cfb80SBram Moolenaar echon "thing" 2270a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2271a72cfb80SBram Moolenaar 2272cfcd011fSBram Moolenaar var str1 = 'some' 2273cfcd011fSBram Moolenaar var str2 = 'more' 2274ad39c094SBram Moolenaar echo str1 str2 2275ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2276a72cfb80SBram Moolenaar 2277d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2278ad39c094SBram Moolenaarenddef 2279ad39c094SBram Moolenaar 2280f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2281f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2282f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2283f93c7feaSBram Moolenaar echo 'clear' 2284df069eecSBram Moolenaar :1messages 2285f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2286f93c7feaSBram Moolenaar 2287d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2288f93c7feaSBram Moolenaarenddef 2289f93c7feaSBram Moolenaar 229047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2291f5be8cdbSBram Moolenaar # only checks line continuation 2292cfcd011fSBram Moolenaar var lines =<< trim END 229347e880d6SBram Moolenaar vim9script 229447e880d6SBram Moolenaar echomsg 'here' 229547e880d6SBram Moolenaar .. ' is ' .. 229647e880d6SBram Moolenaar 'a message' 229747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 229847e880d6SBram Moolenaar END 229947e880d6SBram Moolenaar CheckScriptSuccess(lines) 230047e880d6SBram Moolenaarenddef 230147e880d6SBram Moolenaar 2302f93c7feaSBram Moolenaardef Test_echoerr_cmd() 230340ee466cSBram Moolenaar try 230440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 230540ee466cSBram Moolenaar catch 230640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 230740ee466cSBram Moolenaar endtry 2308f93c7feaSBram Moolenaarenddef 2309f93c7feaSBram Moolenaar 231047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2311f5be8cdbSBram Moolenaar # only checks line continuation 2312cfcd011fSBram Moolenaar var lines =<< trim END 231347e880d6SBram Moolenaar vim9script 231447e880d6SBram Moolenaar try 231547e880d6SBram Moolenaar echoerr 'this' 231647e880d6SBram Moolenaar .. ' is ' .. 231747e880d6SBram Moolenaar 'wrong' 231847e880d6SBram Moolenaar catch 231947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 232047e880d6SBram Moolenaar endtry 232147e880d6SBram Moolenaar END 232247e880d6SBram Moolenaar CheckScriptSuccess(lines) 232347e880d6SBram Moolenaarenddef 232447e880d6SBram Moolenaar 232541fe0617SBram Moolenaardef Test_for_outside_of_function() 2326cfcd011fSBram Moolenaar var lines =<< trim END 232741fe0617SBram Moolenaar vim9script 232841fe0617SBram Moolenaar new 232941fe0617SBram Moolenaar for var in range(0, 3) 233041fe0617SBram Moolenaar append(line('$'), var) 233141fe0617SBram Moolenaar endfor 233241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 233341fe0617SBram Moolenaar bwipe! 2334522eefd9SBram Moolenaar 2335522eefd9SBram Moolenaar var result = '' 2336522eefd9SBram Moolenaar for i in [1, 2, 3] 2337522eefd9SBram Moolenaar var loop = ' loop ' .. i 2338522eefd9SBram Moolenaar result ..= loop 2339522eefd9SBram Moolenaar endfor 2340522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 234141fe0617SBram Moolenaar END 234241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 234341fe0617SBram Moolenaar source Xvim9for.vim 234441fe0617SBram Moolenaar delete('Xvim9for.vim') 234541fe0617SBram Moolenaarenddef 23468a7d6542SBram Moolenaar 2347e8c4abbbSBram Moolenaardef Test_for_loop() 2348f2253963SBram Moolenaar var lines =<< trim END 2349cfcd011fSBram Moolenaar var result = '' 2350e8c4abbbSBram Moolenaar for cnt in range(7) 2351e8c4abbbSBram Moolenaar if cnt == 4 2352e8c4abbbSBram Moolenaar break 2353e8c4abbbSBram Moolenaar endif 2354e8c4abbbSBram Moolenaar if cnt == 2 2355e8c4abbbSBram Moolenaar continue 2356e8c4abbbSBram Moolenaar endif 2357e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2358e8c4abbbSBram Moolenaar endfor 2359e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 23600ad3e894SBram Moolenaar 2361cfcd011fSBram Moolenaar var concat = '' 23620ad3e894SBram Moolenaar for str in eval('["one", "two"]') 23630ad3e894SBram Moolenaar concat ..= str 23640ad3e894SBram Moolenaar endfor 23650ad3e894SBram Moolenaar assert_equal('onetwo', concat) 236638bd8de5SBram Moolenaar 236738bd8de5SBram Moolenaar var total = 0 236838bd8de5SBram Moolenaar for nr in 236938bd8de5SBram Moolenaar [1, 2, 3] 237038bd8de5SBram Moolenaar total += nr 237138bd8de5SBram Moolenaar endfor 237238bd8de5SBram Moolenaar assert_equal(6, total) 237338bd8de5SBram Moolenaar 237438bd8de5SBram Moolenaar total = 0 237538bd8de5SBram Moolenaar for nr 237638bd8de5SBram Moolenaar in [1, 2, 3] 237738bd8de5SBram Moolenaar total += nr 237838bd8de5SBram Moolenaar endfor 237938bd8de5SBram Moolenaar assert_equal(6, total) 238038bd8de5SBram Moolenaar 238138bd8de5SBram Moolenaar total = 0 238238bd8de5SBram Moolenaar for nr 238338bd8de5SBram Moolenaar in 238438bd8de5SBram Moolenaar [1, 2, 3] 238538bd8de5SBram Moolenaar total += nr 238638bd8de5SBram Moolenaar endfor 238738bd8de5SBram Moolenaar assert_equal(6, total) 2388036d0714SBram Moolenaar 2389a3589a0dSBram Moolenaar # with type 2390a3589a0dSBram Moolenaar total = 0 2391a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2392a3589a0dSBram Moolenaar total += n 2393a3589a0dSBram Moolenaar endfor 2394a3589a0dSBram Moolenaar assert_equal(6, total) 2395a3589a0dSBram Moolenaar 2396fe090eb5SBram Moolenaar var chars = '' 2397fe090eb5SBram Moolenaar for s: string in 'foobar' 2398fe090eb5SBram Moolenaar chars ..= s 2399fe090eb5SBram Moolenaar endfor 2400fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2401fe090eb5SBram Moolenaar 2402a3589a0dSBram Moolenaar # unpack with type 2403f2253963SBram Moolenaar var res = '' 2404a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2405a3589a0dSBram Moolenaar res ..= n .. s 2406a3589a0dSBram Moolenaar endfor 2407a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2408a3589a0dSBram Moolenaar 2409444d8783SBram Moolenaar # unpack with one var 2410444d8783SBram Moolenaar var reslist = [] 2411444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2412444d8783SBram Moolenaar reslist->add(x) 2413444d8783SBram Moolenaar endfor 2414444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2415444d8783SBram Moolenaar 2416a3589a0dSBram Moolenaar # loop over string 2417a3589a0dSBram Moolenaar res = '' 241874e54fcbSBram Moolenaar for c in 'aéc̀d' 241974e54fcbSBram Moolenaar res ..= c .. '-' 242074e54fcbSBram Moolenaar endfor 242174e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 242274e54fcbSBram Moolenaar 242374e54fcbSBram Moolenaar res = '' 242474e54fcbSBram Moolenaar for c in '' 242574e54fcbSBram Moolenaar res ..= c .. '-' 242674e54fcbSBram Moolenaar endfor 242774e54fcbSBram Moolenaar assert_equal('', res) 242874e54fcbSBram Moolenaar 242974e54fcbSBram Moolenaar res = '' 243074e54fcbSBram Moolenaar for c in test_null_string() 243174e54fcbSBram Moolenaar res ..= c .. '-' 243274e54fcbSBram Moolenaar endfor 243374e54fcbSBram Moolenaar assert_equal('', res) 2434f2253963SBram Moolenaar 2435f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2436f2253963SBram Moolenaar {a: 'Cat'} 2437f2253963SBram Moolenaar ] 2438f2253963SBram Moolenaar for dd in foo 2439f2253963SBram Moolenaar dd.counter = 12 2440f2253963SBram Moolenaar endfor 2441f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2442f2253963SBram Moolenaar END 2443f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2444e8c4abbbSBram Moolenaarenddef 2445e8c4abbbSBram Moolenaar 2446e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2447025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2448025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2449025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2450675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2451675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2452cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2453822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 24542d870f8dSBram Moolenaar delfunc! g:Func 2455675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2456675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2457675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 245874e54fcbSBram Moolenaar 245974e54fcbSBram Moolenaar # wrong type detected at compile time 246074e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 246174e54fcbSBram Moolenaar 246274e54fcbSBram Moolenaar # wrong type detected at runtime 246374e54fcbSBram Moolenaar g:adict = {a: 1} 246474e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 246574e54fcbSBram Moolenaar unlet g:adict 2466f6a8d420SBram Moolenaar 2467f6a8d420SBram Moolenaar var lines =<< trim END 2468f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2469f6a8d420SBram Moolenaar for e in d 2470f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2471f6a8d420SBram Moolenaar endfor 2472f6a8d420SBram Moolenaar END 2473f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2474fe090eb5SBram Moolenaar 2475fe090eb5SBram Moolenaar lines =<< trim END 2476fe090eb5SBram Moolenaar for nr: number in ['foo'] 2477fe090eb5SBram Moolenaar endfor 2478fe090eb5SBram Moolenaar END 2479fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2480e8c4abbbSBram Moolenaarenddef 2481e8c4abbbSBram Moolenaar 2482ea87069dSBram Moolenaardef Test_for_loop_script_var() 2483ea87069dSBram Moolenaar # cannot use s:var in a :def function 2484ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2485ea87069dSBram Moolenaar 2486ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2487ea87069dSBram Moolenaar var lines =<< trim END 2488ea87069dSBram Moolenaar vim9script 2489ea87069dSBram Moolenaar var total = 0 2490ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2491ea87069dSBram Moolenaar total += s:var 2492ea87069dSBram Moolenaar endfor 2493ea87069dSBram Moolenaar assert_equal(6, total) 2494ea87069dSBram Moolenaar 2495ea87069dSBram Moolenaar total = 0 2496ea87069dSBram Moolenaar for var in [1, 2, 3] 2497ea87069dSBram Moolenaar total += var 2498ea87069dSBram Moolenaar endfor 2499ea87069dSBram Moolenaar assert_equal(6, total) 2500ea87069dSBram Moolenaar END 2501ea87069dSBram Moolenaarenddef 2502ea87069dSBram Moolenaar 2503792f786aSBram Moolenaardef Test_for_loop_unpack() 25044b8a0651SBram Moolenaar var lines =<< trim END 2505792f786aSBram Moolenaar var result = [] 2506792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2507792f786aSBram Moolenaar result->add(v1) 2508792f786aSBram Moolenaar result->add(v2) 2509792f786aSBram Moolenaar endfor 2510792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2511792f786aSBram Moolenaar 2512792f786aSBram Moolenaar result = [] 2513792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2514792f786aSBram Moolenaar result->add(v1) 2515792f786aSBram Moolenaar result->add(v2) 2516792f786aSBram Moolenaar result->add(v3) 2517792f786aSBram Moolenaar endfor 2518792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2519792f786aSBram Moolenaar 25204b8a0651SBram Moolenaar result = [] 25214b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 25224b8a0651SBram Moolenaar result->add(&ts) 25234b8a0651SBram Moolenaar result->add(&sw) 25244b8a0651SBram Moolenaar endfor 25254b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 25264b8a0651SBram Moolenaar 25274b8a0651SBram Moolenaar var slist: list<string> 25284b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 25294b8a0651SBram Moolenaar slist->add($LOOPVAR) 25304b8a0651SBram Moolenaar slist->add(@r) 25314b8a0651SBram Moolenaar slist->add(v:errmsg) 25324b8a0651SBram Moolenaar endfor 25334b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 25344b8a0651SBram Moolenaar 25354b8a0651SBram Moolenaar slist = [] 25364b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 25374b8a0651SBram Moolenaar slist->add(g:globalvar) 25384b8a0651SBram Moolenaar slist->add(b:bufvar) 25394b8a0651SBram Moolenaar slist->add(w:winvar) 25404b8a0651SBram Moolenaar slist->add(t:tabvar) 25414b8a0651SBram Moolenaar endfor 25424b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2543f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2544b777da9bSBram Moolenaar 2545b777da9bSBram Moolenaar var res = [] 2546b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2547b777da9bSBram Moolenaar res->add(n) 2548b777da9bSBram Moolenaar endfor 2549b777da9bSBram Moolenaar assert_equal([2, 5], res) 25504b8a0651SBram Moolenaar END 25514b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 25524b8a0651SBram Moolenaar 25534b8a0651SBram Moolenaar lines =<< trim END 2554792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2555792f786aSBram Moolenaar echo v1 v2 2556792f786aSBram Moolenaar endfor 2557792f786aSBram Moolenaar END 2558792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2559792f786aSBram Moolenaar 2560792f786aSBram Moolenaar lines =<< trim END 2561792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2562792f786aSBram Moolenaar echo v1 v2 2563792f786aSBram Moolenaar endfor 2564792f786aSBram Moolenaar END 2565792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2566792f786aSBram Moolenaar 2567792f786aSBram Moolenaar lines =<< trim END 2568792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2569792f786aSBram Moolenaar echo v1 2570792f786aSBram Moolenaar endfor 2571792f786aSBram Moolenaar END 2572792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2573792f786aSBram Moolenaarenddef 2574792f786aSBram Moolenaar 2575c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2576f2253963SBram Moolenaar var lines =<< trim END 2577c150c09eSBram Moolenaar var looped = 0 2578c150c09eSBram Moolenaar var cleanup = 0 2579c150c09eSBram Moolenaar for i in range(3) 2580c150c09eSBram Moolenaar looped += 1 2581c150c09eSBram Moolenaar try 2582c150c09eSBram Moolenaar eval [][0] 2583c150c09eSBram Moolenaar catch 2584c150c09eSBram Moolenaar continue 2585c150c09eSBram Moolenaar finally 2586c150c09eSBram Moolenaar cleanup += 1 2587c150c09eSBram Moolenaar endtry 2588c150c09eSBram Moolenaar endfor 2589c150c09eSBram Moolenaar assert_equal(3, looped) 2590c150c09eSBram Moolenaar assert_equal(3, cleanup) 2591f2253963SBram Moolenaar END 2592f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2593c150c09eSBram Moolenaarenddef 2594c150c09eSBram Moolenaar 2595d0df1aacSBram Moolenaardef Test_while_loop() 2596cfcd011fSBram Moolenaar var result = '' 2597cfcd011fSBram Moolenaar var cnt = 0 2598d0df1aacSBram Moolenaar while cnt < 555 2599d0df1aacSBram Moolenaar if cnt == 3 2600d0df1aacSBram Moolenaar break 2601d0df1aacSBram Moolenaar endif 2602d0df1aacSBram Moolenaar cnt += 1 2603d0df1aacSBram Moolenaar if cnt == 2 2604d0df1aacSBram Moolenaar continue 2605d0df1aacSBram Moolenaar endif 2606d0df1aacSBram Moolenaar result ..= cnt .. '_' 2607d0df1aacSBram Moolenaar endwhile 2608d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2609dee37dc7SBram Moolenaar 2610dee37dc7SBram Moolenaar var s = '' 26110123cc1eSBram Moolenaar while s == 'x' # {comment} 2612dee37dc7SBram Moolenaar endwhile 2613d0df1aacSBram Moolenaarenddef 2614d0df1aacSBram Moolenaar 2615e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2616675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2617675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2618675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2619675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2620675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2621675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2622675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 26236628b7ebSBram Moolenaar 26246628b7ebSBram Moolenaar var lines =<< trim END 26256628b7ebSBram Moolenaar var s = '' 26266628b7ebSBram Moolenaar while s = '' 26276628b7ebSBram Moolenaar endwhile 26286628b7ebSBram Moolenaar END 26296628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2630bd5da371SBram Moolenaarenddef 2631bd5da371SBram Moolenaar 26329645e2d9SBram Moolenaardef Test_interrupt_loop() 2633cfcd011fSBram Moolenaar var caught = false 2634cfcd011fSBram Moolenaar var x = 0 263597acfc78SBram Moolenaar try 26369645e2d9SBram Moolenaar while 1 26379645e2d9SBram Moolenaar x += 1 26389645e2d9SBram Moolenaar if x == 100 26399645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 26409645e2d9SBram Moolenaar endif 26419645e2d9SBram Moolenaar endwhile 264297acfc78SBram Moolenaar catch 264397acfc78SBram Moolenaar caught = true 264497acfc78SBram Moolenaar assert_equal(100, x) 264597acfc78SBram Moolenaar endtry 264697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 264725859dd7SBram Moolenaar # consume the CTRL-C 264825859dd7SBram Moolenaar getchar(0) 26499645e2d9SBram Moolenaarenddef 265020431c9dSBram Moolenaar 26514fdae999SBram Moolenaardef Test_automatic_line_continuation() 2652cfcd011fSBram Moolenaar var mylist = [ 26534fdae999SBram Moolenaar 'one', 26544fdae999SBram Moolenaar 'two', 26554fdae999SBram Moolenaar 'three', 2656f5be8cdbSBram Moolenaar ] # comment 26574fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 26584fdae999SBram Moolenaar 2659cfcd011fSBram Moolenaar var mydict = { 2660e0de171eSBram Moolenaar ['one']: 1, 2661e0de171eSBram Moolenaar ['two']: 2, 2662e0de171eSBram Moolenaar ['three']: 26634fdae999SBram Moolenaar 3, 2664f5be8cdbSBram Moolenaar } # comment 2665e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2666e0de171eSBram Moolenaar mydict = { 26672c330432SBram Moolenaar one: 1, # comment 26682c330432SBram Moolenaar two: # comment 26692c330432SBram Moolenaar 2, # comment 26702c330432SBram Moolenaar three: 3 # comment 26712c330432SBram Moolenaar } 2672e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2673e0de171eSBram Moolenaar mydict = { 26742c330432SBram Moolenaar one: 1, 26754fdae999SBram Moolenaar two: 26764fdae999SBram Moolenaar 2, 26772c330432SBram Moolenaar three: 3 26784fdae999SBram Moolenaar } 2679e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2680e6085c53SBram Moolenaar 2681e6085c53SBram Moolenaar assert_equal( 2682e6085c53SBram Moolenaar ['one', 'two', 'three'], 2683e6085c53SBram Moolenaar split('one two three') 2684e6085c53SBram Moolenaar ) 26854fdae999SBram Moolenaarenddef 26864fdae999SBram Moolenaar 26877a092245SBram Moolenaardef Test_vim9_comment() 26887a092245SBram Moolenaar CheckScriptSuccess([ 26897a092245SBram Moolenaar 'vim9script', 26907a092245SBram Moolenaar '# something', 269193f82cbeSBram Moolenaar '#something', 269293f82cbeSBram Moolenaar '#{something', 26937a092245SBram Moolenaar ]) 269493f82cbeSBram Moolenaar 269593f82cbeSBram Moolenaar split Xfile 269693f82cbeSBram Moolenaar CheckScriptSuccess([ 269793f82cbeSBram Moolenaar 'vim9script', 269893f82cbeSBram Moolenaar 'edit #something', 269993f82cbeSBram Moolenaar ]) 270093f82cbeSBram Moolenaar CheckScriptSuccess([ 270193f82cbeSBram Moolenaar 'vim9script', 270293f82cbeSBram Moolenaar 'edit #{something', 270393f82cbeSBram Moolenaar ]) 270493f82cbeSBram Moolenaar close 270593f82cbeSBram Moolenaar 27067a092245SBram Moolenaar CheckScriptFailure([ 27077a092245SBram Moolenaar 'vim9script', 27087a092245SBram Moolenaar ':# something', 27097a092245SBram Moolenaar ], 'E488:') 27107a092245SBram Moolenaar CheckScriptFailure([ 27117a092245SBram Moolenaar '# something', 27127a092245SBram Moolenaar ], 'E488:') 27137a092245SBram Moolenaar CheckScriptFailure([ 27147a092245SBram Moolenaar ':# something', 27157a092245SBram Moolenaar ], 'E488:') 27167a092245SBram Moolenaar 27174a8d9f2eSBram Moolenaar { # block start 27184a8d9f2eSBram Moolenaar } # block end 27194a8d9f2eSBram Moolenaar CheckDefFailure([ 27204a8d9f2eSBram Moolenaar '{# comment', 27214a8d9f2eSBram Moolenaar ], 'E488:') 27224a8d9f2eSBram Moolenaar CheckDefFailure([ 27234a8d9f2eSBram Moolenaar '{', 27244a8d9f2eSBram Moolenaar '}# comment', 27254a8d9f2eSBram Moolenaar ], 'E488:') 27264a8d9f2eSBram Moolenaar 27274a8d9f2eSBram Moolenaar echo "yes" # comment 27284a8d9f2eSBram Moolenaar CheckDefFailure([ 27294a8d9f2eSBram Moolenaar 'echo "yes"# comment', 27304a8d9f2eSBram Moolenaar ], 'E488:') 27317a092245SBram Moolenaar CheckScriptSuccess([ 27327a092245SBram Moolenaar 'vim9script', 27337a092245SBram Moolenaar 'echo "yes" # something', 27347a092245SBram Moolenaar ]) 27357a092245SBram Moolenaar CheckScriptFailure([ 27367a092245SBram Moolenaar 'vim9script', 27377a092245SBram Moolenaar 'echo "yes"# something', 27387a092245SBram Moolenaar ], 'E121:') 27397a092245SBram Moolenaar CheckScriptFailure([ 27407a092245SBram Moolenaar 'vim9script', 27417a092245SBram Moolenaar 'echo# something', 2742f8103f27SBram Moolenaar ], 'E1144:') 27437a092245SBram Moolenaar CheckScriptFailure([ 27447a092245SBram Moolenaar 'echo "yes" # something', 27457a092245SBram Moolenaar ], 'E121:') 27467a092245SBram Moolenaar 27474a8d9f2eSBram Moolenaar exe "echo" # comment 27484a8d9f2eSBram Moolenaar CheckDefFailure([ 27494a8d9f2eSBram Moolenaar 'exe "echo"# comment', 27504a8d9f2eSBram Moolenaar ], 'E488:') 27514a8d9f2eSBram Moolenaar CheckScriptSuccess([ 27524a8d9f2eSBram Moolenaar 'vim9script', 27534a8d9f2eSBram Moolenaar 'exe "echo" # something', 27544a8d9f2eSBram Moolenaar ]) 27554a8d9f2eSBram Moolenaar CheckScriptFailure([ 27564a8d9f2eSBram Moolenaar 'vim9script', 27574a8d9f2eSBram Moolenaar 'exe "echo"# something', 27584a8d9f2eSBram Moolenaar ], 'E121:') 27594a8d9f2eSBram Moolenaar CheckScriptFailure([ 27604a8d9f2eSBram Moolenaar 'vim9script', 27614a8d9f2eSBram Moolenaar 'exe# something', 2762f8103f27SBram Moolenaar ], 'E1144:') 27634a8d9f2eSBram Moolenaar CheckScriptFailure([ 27644a8d9f2eSBram Moolenaar 'exe "echo" # something', 27654a8d9f2eSBram Moolenaar ], 'E121:') 27664a8d9f2eSBram Moolenaar 27677a092245SBram Moolenaar CheckDefFailure([ 27687a092245SBram Moolenaar 'try# comment', 27697a092245SBram Moolenaar ' echo "yes"', 27707a092245SBram Moolenaar 'catch', 27717a092245SBram Moolenaar 'endtry', 2772f8103f27SBram Moolenaar ], 'E1144:') 27732c5ed4e3SBram Moolenaar CheckScriptFailure([ 27742c5ed4e3SBram Moolenaar 'vim9script', 27752c5ed4e3SBram Moolenaar 'try# comment', 27762c5ed4e3SBram Moolenaar 'echo "yes"', 2777f8103f27SBram Moolenaar ], 'E1144:') 27787a092245SBram Moolenaar CheckDefFailure([ 27797a092245SBram Moolenaar 'try', 2780a72cfb80SBram Moolenaar ' throw#comment', 2781a72cfb80SBram Moolenaar 'catch', 2782a72cfb80SBram Moolenaar 'endtry', 2783f8103f27SBram Moolenaar ], 'E1144:') 2784a72cfb80SBram Moolenaar CheckDefFailure([ 2785a72cfb80SBram Moolenaar 'try', 2786a72cfb80SBram Moolenaar ' throw "yes"#comment', 2787a72cfb80SBram Moolenaar 'catch', 2788a72cfb80SBram Moolenaar 'endtry', 2789a72cfb80SBram Moolenaar ], 'E488:') 2790a72cfb80SBram Moolenaar CheckDefFailure([ 2791a72cfb80SBram Moolenaar 'try', 27927a092245SBram Moolenaar ' echo "yes"', 27937a092245SBram Moolenaar 'catch# comment', 27947a092245SBram Moolenaar 'endtry', 2795f8103f27SBram Moolenaar ], 'E1144:') 27962c5ed4e3SBram Moolenaar CheckScriptFailure([ 27972c5ed4e3SBram Moolenaar 'vim9script', 27982c5ed4e3SBram Moolenaar 'try', 27992c5ed4e3SBram Moolenaar ' echo "yes"', 28002c5ed4e3SBram Moolenaar 'catch# comment', 28012c5ed4e3SBram Moolenaar 'endtry', 2802f8103f27SBram Moolenaar ], 'E1144:') 28032c5ed4e3SBram Moolenaar CheckDefFailure([ 28042c5ed4e3SBram Moolenaar 'try', 28052c5ed4e3SBram Moolenaar ' echo "yes"', 28062c5ed4e3SBram Moolenaar 'catch /pat/# comment', 28072c5ed4e3SBram Moolenaar 'endtry', 28082c5ed4e3SBram Moolenaar ], 'E488:') 28097a092245SBram Moolenaar CheckDefFailure([ 28107a092245SBram Moolenaar 'try', 28117a092245SBram Moolenaar 'echo "yes"', 28127a092245SBram Moolenaar 'catch', 28137a092245SBram Moolenaar 'endtry# comment', 2814f8103f27SBram Moolenaar ], 'E1144:') 28152c5ed4e3SBram Moolenaar CheckScriptFailure([ 28162c5ed4e3SBram Moolenaar 'vim9script', 28172c5ed4e3SBram Moolenaar 'try', 28182c5ed4e3SBram Moolenaar ' echo "yes"', 28192c5ed4e3SBram Moolenaar 'catch', 28202c5ed4e3SBram Moolenaar 'endtry# comment', 2821f8103f27SBram Moolenaar ], 'E1144:') 28222c5ed4e3SBram Moolenaar 28232c5ed4e3SBram Moolenaar CheckScriptSuccess([ 28242c5ed4e3SBram Moolenaar 'vim9script', 28252c5ed4e3SBram Moolenaar 'hi # comment', 28262c5ed4e3SBram Moolenaar ]) 28272c5ed4e3SBram Moolenaar CheckScriptFailure([ 28282c5ed4e3SBram Moolenaar 'vim9script', 28292c5ed4e3SBram Moolenaar 'hi# comment', 2830f8103f27SBram Moolenaar ], 'E1144:') 28311966c248SBram Moolenaar CheckScriptSuccess([ 28321966c248SBram Moolenaar 'vim9script', 28331966c248SBram Moolenaar 'hi Search # comment', 28341966c248SBram Moolenaar ]) 28351966c248SBram Moolenaar CheckScriptFailure([ 28361966c248SBram Moolenaar 'vim9script', 28371966c248SBram Moolenaar 'hi Search# comment', 28381966c248SBram Moolenaar ], 'E416:') 28391966c248SBram Moolenaar CheckScriptSuccess([ 28401966c248SBram Moolenaar 'vim9script', 28411966c248SBram Moolenaar 'hi link This Search # comment', 28421966c248SBram Moolenaar ]) 28431966c248SBram Moolenaar CheckScriptFailure([ 28441966c248SBram Moolenaar 'vim9script', 28451966c248SBram Moolenaar 'hi link This That# comment', 28461966c248SBram Moolenaar ], 'E413:') 28471966c248SBram Moolenaar CheckScriptSuccess([ 28481966c248SBram Moolenaar 'vim9script', 28491966c248SBram Moolenaar 'hi clear This # comment', 28501966c248SBram Moolenaar 'hi clear # comment', 28511966c248SBram Moolenaar ]) 2852f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2853f5be8cdbSBram Moolenaar # hi clear This# comment', 28541966c248SBram Moolenaar CheckScriptFailure([ 28551966c248SBram Moolenaar 'vim9script', 28561966c248SBram Moolenaar 'hi clear# comment', 28571966c248SBram Moolenaar ], 'E416:') 28581966c248SBram Moolenaar 28591966c248SBram Moolenaar CheckScriptSuccess([ 28601966c248SBram Moolenaar 'vim9script', 28611966c248SBram Moolenaar 'hi Group term=bold', 28621966c248SBram Moolenaar 'match Group /todo/ # comment', 28631966c248SBram Moolenaar ]) 28641966c248SBram Moolenaar CheckScriptFailure([ 28651966c248SBram Moolenaar 'vim9script', 28661966c248SBram Moolenaar 'hi Group term=bold', 28671966c248SBram Moolenaar 'match Group /todo/# comment', 28681966c248SBram Moolenaar ], 'E488:') 28691966c248SBram Moolenaar CheckScriptSuccess([ 28701966c248SBram Moolenaar 'vim9script', 28711966c248SBram Moolenaar 'match # comment', 28721966c248SBram Moolenaar ]) 28731966c248SBram Moolenaar CheckScriptFailure([ 28741966c248SBram Moolenaar 'vim9script', 28751966c248SBram Moolenaar 'match# comment', 2876f8103f27SBram Moolenaar ], 'E1144:') 28771966c248SBram Moolenaar CheckScriptSuccess([ 28781966c248SBram Moolenaar 'vim9script', 28791966c248SBram Moolenaar 'match none # comment', 28801966c248SBram Moolenaar ]) 28811966c248SBram Moolenaar CheckScriptFailure([ 28821966c248SBram Moolenaar 'vim9script', 28831966c248SBram Moolenaar 'match none# comment', 28841966c248SBram Moolenaar ], 'E475:') 28851966c248SBram Moolenaar 28861966c248SBram Moolenaar CheckScriptSuccess([ 28871966c248SBram Moolenaar 'vim9script', 28881966c248SBram Moolenaar 'menutrans clear # comment', 28891966c248SBram Moolenaar ]) 28901966c248SBram Moolenaar CheckScriptFailure([ 28911966c248SBram Moolenaar 'vim9script', 28921966c248SBram Moolenaar 'menutrans clear# comment text', 28931966c248SBram Moolenaar ], 'E474:') 28941966c248SBram Moolenaar 28951966c248SBram Moolenaar CheckScriptSuccess([ 28961966c248SBram Moolenaar 'vim9script', 28971966c248SBram Moolenaar 'syntax clear # comment', 28981966c248SBram Moolenaar ]) 28991966c248SBram Moolenaar CheckScriptFailure([ 29001966c248SBram Moolenaar 'vim9script', 29011966c248SBram Moolenaar 'syntax clear# comment text', 29021966c248SBram Moolenaar ], 'E28:') 29031966c248SBram Moolenaar CheckScriptSuccess([ 29041966c248SBram Moolenaar 'vim9script', 29051966c248SBram Moolenaar 'syntax keyword Word some', 29061966c248SBram Moolenaar 'syntax clear Word # comment', 29071966c248SBram Moolenaar ]) 29081966c248SBram Moolenaar CheckScriptFailure([ 29091966c248SBram Moolenaar 'vim9script', 29101966c248SBram Moolenaar 'syntax keyword Word some', 29111966c248SBram Moolenaar 'syntax clear Word# comment text', 29121966c248SBram Moolenaar ], 'E28:') 29131966c248SBram Moolenaar 29141966c248SBram Moolenaar CheckScriptSuccess([ 29151966c248SBram Moolenaar 'vim9script', 29161966c248SBram Moolenaar 'syntax list # comment', 29171966c248SBram Moolenaar ]) 29181966c248SBram Moolenaar CheckScriptFailure([ 29191966c248SBram Moolenaar 'vim9script', 29201966c248SBram Moolenaar 'syntax list# comment text', 29211966c248SBram Moolenaar ], 'E28:') 29221966c248SBram Moolenaar 29231966c248SBram Moolenaar CheckScriptSuccess([ 29241966c248SBram Moolenaar 'vim9script', 29251966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 29261966c248SBram Moolenaar ]) 29271966c248SBram Moolenaar CheckScriptFailure([ 29281966c248SBram Moolenaar 'vim9script', 29291966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 29301966c248SBram Moolenaar ], 'E475:') 29311966c248SBram Moolenaar 29321966c248SBram Moolenaar CheckScriptSuccess([ 29331966c248SBram Moolenaar 'vim9script', 29341966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 29351966c248SBram Moolenaar ]) 29361966c248SBram Moolenaar CheckScriptFailure([ 29371966c248SBram Moolenaar 'vim9script', 29381966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 29391966c248SBram Moolenaar ], 'E789:') 29401966c248SBram Moolenaar 29411966c248SBram Moolenaar CheckScriptSuccess([ 29421966c248SBram Moolenaar 'vim9script', 29431966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 29441966c248SBram Moolenaar ]) 29451966c248SBram Moolenaar CheckScriptFailure([ 29461966c248SBram Moolenaar 'vim9script', 29471966c248SBram Moolenaar 'syntax match Word /pat/# comment', 29481966c248SBram Moolenaar ], 'E402:') 29491966c248SBram Moolenaar 29501966c248SBram Moolenaar CheckScriptSuccess([ 29511966c248SBram Moolenaar 'vim9script', 29521966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 29531966c248SBram Moolenaar ]) 29541966c248SBram Moolenaar CheckScriptFailure([ 29551966c248SBram Moolenaar 'vim9script', 29561966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 29571966c248SBram Moolenaar ], 'E475:') 29581966c248SBram Moolenaar CheckScriptFailure([ 29591966c248SBram Moolenaar 'vim9script', 29601966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 29611966c248SBram Moolenaar ], 'E406:') 29621966c248SBram Moolenaar CheckScriptFailure([ 29631966c248SBram Moolenaar 'vim9script', 29641966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 29651966c248SBram Moolenaar ], 'E475:') 29661966c248SBram Moolenaar 29671966c248SBram Moolenaar CheckScriptSuccess([ 29681966c248SBram Moolenaar 'vim9script', 29691966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 29701966c248SBram Moolenaar ]) 29711966c248SBram Moolenaar CheckScriptFailure([ 29721966c248SBram Moolenaar 'vim9script', 29731966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2974d032f34aSBram Moolenaar ], 'E402:') 29751966c248SBram Moolenaar 29761966c248SBram Moolenaar CheckScriptSuccess([ 29771966c248SBram Moolenaar 'vim9script', 29781966c248SBram Moolenaar 'syntax sync # comment', 29791966c248SBram Moolenaar ]) 29801966c248SBram Moolenaar CheckScriptFailure([ 29811966c248SBram Moolenaar 'vim9script', 29821966c248SBram Moolenaar 'syntax sync# comment', 29831966c248SBram Moolenaar ], 'E404:') 29841966c248SBram Moolenaar CheckScriptSuccess([ 29851966c248SBram Moolenaar 'vim9script', 29861966c248SBram Moolenaar 'syntax sync ccomment # comment', 29871966c248SBram Moolenaar ]) 29881966c248SBram Moolenaar CheckScriptFailure([ 29891966c248SBram Moolenaar 'vim9script', 29901966c248SBram Moolenaar 'syntax sync ccomment# comment', 29911966c248SBram Moolenaar ], 'E404:') 29921966c248SBram Moolenaar 29931966c248SBram Moolenaar CheckScriptSuccess([ 29941966c248SBram Moolenaar 'vim9script', 29951966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 29961966c248SBram Moolenaar ]) 29971966c248SBram Moolenaar CheckScriptFailure([ 29981966c248SBram Moolenaar 'vim9script', 29991966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 30001966c248SBram Moolenaar ], 'E475:') 3001a72cfb80SBram Moolenaar 3002a72cfb80SBram Moolenaar CheckScriptSuccess([ 3003a72cfb80SBram Moolenaar 'vim9script', 3004a72cfb80SBram Moolenaar 'command Echo echo # comment', 3005a72cfb80SBram Moolenaar 'command Echo # comment', 30062d870f8dSBram Moolenaar 'delcommand Echo', 3007a72cfb80SBram Moolenaar ]) 3008a72cfb80SBram Moolenaar CheckScriptFailure([ 3009a72cfb80SBram Moolenaar 'vim9script', 3010a72cfb80SBram Moolenaar 'command Echo echo# comment', 3011a72cfb80SBram Moolenaar 'Echo', 3012f8103f27SBram Moolenaar ], 'E1144:') 30132d870f8dSBram Moolenaar delcommand Echo 301470249ee8SBram Moolenaar 301570249ee8SBram Moolenaar var curdir = getcwd() 301670249ee8SBram Moolenaar CheckScriptSuccess([ 301770249ee8SBram Moolenaar 'command Echo cd " comment', 301870249ee8SBram Moolenaar 'Echo', 301970249ee8SBram Moolenaar 'delcommand Echo', 302070249ee8SBram Moolenaar ]) 302170249ee8SBram Moolenaar CheckScriptSuccess([ 3022090728adSBram Moolenaar 'vim9script', 302370249ee8SBram Moolenaar 'command Echo cd # comment', 302470249ee8SBram Moolenaar 'Echo', 302570249ee8SBram Moolenaar 'delcommand Echo', 302670249ee8SBram Moolenaar ]) 302770249ee8SBram Moolenaar CheckScriptFailure([ 302870249ee8SBram Moolenaar 'vim9script', 302970249ee8SBram Moolenaar 'command Echo cd " comment', 303070249ee8SBram Moolenaar 'Echo', 303170249ee8SBram Moolenaar ], 'E344:') 303270249ee8SBram Moolenaar delcommand Echo 303370249ee8SBram Moolenaar chdir(curdir) 303470249ee8SBram Moolenaar 3035a72cfb80SBram Moolenaar CheckScriptFailure([ 3036a72cfb80SBram Moolenaar 'vim9script', 3037a72cfb80SBram Moolenaar 'command Echo# comment', 3038a72cfb80SBram Moolenaar ], 'E182:') 3039a72cfb80SBram Moolenaar CheckScriptFailure([ 3040a72cfb80SBram Moolenaar 'vim9script', 3041a72cfb80SBram Moolenaar 'command Echo echo', 3042a72cfb80SBram Moolenaar 'command Echo# comment', 3043a72cfb80SBram Moolenaar ], 'E182:') 30442d870f8dSBram Moolenaar delcommand Echo 3045a72cfb80SBram Moolenaar 3046a72cfb80SBram Moolenaar CheckScriptSuccess([ 3047a72cfb80SBram Moolenaar 'vim9script', 3048a72cfb80SBram Moolenaar 'function # comment', 3049a72cfb80SBram Moolenaar ]) 3050a72cfb80SBram Moolenaar CheckScriptFailure([ 3051a72cfb80SBram Moolenaar 'vim9script', 30529898107fSBram Moolenaar 'function " comment', 30539898107fSBram Moolenaar ], 'E129:') 30549898107fSBram Moolenaar CheckScriptFailure([ 30559898107fSBram Moolenaar 'vim9script', 3056a72cfb80SBram Moolenaar 'function# comment', 3057f8103f27SBram Moolenaar ], 'E1144:') 3058a72cfb80SBram Moolenaar CheckScriptSuccess([ 3059a72cfb80SBram Moolenaar 'vim9script', 3060a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3061a72cfb80SBram Moolenaar ]) 3062a72cfb80SBram Moolenaar CheckScriptFailure([ 3063a72cfb80SBram Moolenaar 'vim9script', 3064a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3065a72cfb80SBram Moolenaar ], 'E488:') 3066a72cfb80SBram Moolenaar 3067a72cfb80SBram Moolenaar CheckScriptSuccess([ 3068a72cfb80SBram Moolenaar 'vim9script', 30694c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3070a72cfb80SBram Moolenaar 'endfunc', 30714c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3072a72cfb80SBram Moolenaar ]) 3073a72cfb80SBram Moolenaar CheckScriptFailure([ 3074a72cfb80SBram Moolenaar 'vim9script', 30754c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3076a72cfb80SBram Moolenaar 'endfunc', 30774c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3078a72cfb80SBram Moolenaar ], 'E488:') 3079a72cfb80SBram Moolenaar 3080a72cfb80SBram Moolenaar CheckScriptSuccess([ 3081a72cfb80SBram Moolenaar 'vim9script', 3082a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3083a72cfb80SBram Moolenaar ]) 3084a72cfb80SBram Moolenaar CheckScriptFailure([ 3085a72cfb80SBram Moolenaar 'vim9script', 3086a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3087a72cfb80SBram Moolenaar ], 'E488:') 3088e7e4838fSBram Moolenaar 3089e7e4838fSBram Moolenaar CheckScriptFailure([ 3090e7e4838fSBram Moolenaar 'def Test() " comment', 3091e7e4838fSBram Moolenaar 'enddef', 3092e7e4838fSBram Moolenaar ], 'E488:') 3093e7e4838fSBram Moolenaar CheckScriptFailure([ 3094e7e4838fSBram Moolenaar 'vim9script', 3095e7e4838fSBram Moolenaar 'def Test() " comment', 3096e7e4838fSBram Moolenaar 'enddef', 3097e7e4838fSBram Moolenaar ], 'E488:') 3098e7e4838fSBram Moolenaar 3099e7e4838fSBram Moolenaar CheckScriptSuccess([ 3100e7e4838fSBram Moolenaar 'func Test() " comment', 3101e7e4838fSBram Moolenaar 'endfunc', 31022d870f8dSBram Moolenaar 'delfunc Test', 3103e7e4838fSBram Moolenaar ]) 31049898107fSBram Moolenaar CheckScriptSuccess([ 3105e7e4838fSBram Moolenaar 'vim9script', 3106e7e4838fSBram Moolenaar 'func Test() " comment', 3107e7e4838fSBram Moolenaar 'endfunc', 31089898107fSBram Moolenaar ]) 3109e7e4838fSBram Moolenaar 3110e7e4838fSBram Moolenaar CheckScriptSuccess([ 3111e7e4838fSBram Moolenaar 'def Test() # comment', 3112e7e4838fSBram Moolenaar 'enddef', 3113e7e4838fSBram Moolenaar ]) 3114e7e4838fSBram Moolenaar CheckScriptFailure([ 3115e7e4838fSBram Moolenaar 'func Test() # comment', 3116e7e4838fSBram Moolenaar 'endfunc', 3117e7e4838fSBram Moolenaar ], 'E488:') 31180f37e356SBram Moolenaar 31190f37e356SBram Moolenaar var lines =<< trim END 31200f37e356SBram Moolenaar vim9script 31210f37e356SBram Moolenaar syn region Text 31220f37e356SBram Moolenaar \ start='foo' 31230f37e356SBram Moolenaar #\ comment 31240f37e356SBram Moolenaar \ end='bar' 31255072b47aSBram Moolenaar syn region Text start='foo' 31265072b47aSBram Moolenaar #\ comment 31275072b47aSBram Moolenaar \ end='bar' 31280f37e356SBram Moolenaar END 31290f37e356SBram Moolenaar CheckScriptSuccess(lines) 31300f37e356SBram Moolenaar 31310f37e356SBram Moolenaar lines =<< trim END 31320f37e356SBram Moolenaar vim9script 31330f37e356SBram Moolenaar syn region Text 31340f37e356SBram Moolenaar \ start='foo' 31350f37e356SBram Moolenaar "\ comment 31360f37e356SBram Moolenaar \ end='bar' 31370f37e356SBram Moolenaar END 31380f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 31392c5ed4e3SBram Moolenaarenddef 31402c5ed4e3SBram Moolenaar 31412c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 31422c5ed4e3SBram Moolenaar CheckCanRunGui 31432c5ed4e3SBram Moolenaar 31442c5ed4e3SBram Moolenaar CheckScriptFailure([ 31452c5ed4e3SBram Moolenaar 'vim9script', 31462c5ed4e3SBram Moolenaar 'gui#comment' 3147f8103f27SBram Moolenaar ], 'E1144:') 31482c5ed4e3SBram Moolenaar CheckScriptFailure([ 31492c5ed4e3SBram Moolenaar 'vim9script', 31502c5ed4e3SBram Moolenaar 'gui -f#comment' 31512c5ed4e3SBram Moolenaar ], 'E499:') 31527a092245SBram Moolenaarenddef 31537a092245SBram Moolenaar 3154a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 31556797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 31566797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3157a26b9700SBram Moolenaar 3158a26b9700SBram Moolenaar edit test.vim 3159a26b9700SBram Moolenaar doautocmd TabEnter #comment 3160a26b9700SBram Moolenaar assert_equal(1, g:entered) 3161a26b9700SBram Moolenaar 3162a26b9700SBram Moolenaar doautocmd TabEnter f.x 3163a26b9700SBram Moolenaar assert_equal(2, g:entered) 3164a26b9700SBram Moolenaar 3165a26b9700SBram Moolenaar g:entered = 0 3166a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3167a26b9700SBram Moolenaar assert_equal(2, g:entered) 3168a26b9700SBram Moolenaar 3169a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3170a26b9700SBram Moolenaar 3171a26b9700SBram Moolenaar au! TabEnter 3172a26b9700SBram Moolenaar unlet g:entered 3173d72c1bf0SBram Moolenaar 3174d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3175d72c1bf0SBram Moolenaar 'vim9script', 31766797966dSBram Moolenaar 'g:var = 123', 3177e55b1c09SBram Moolenaar 'b:var = 456', 3178e55b1c09SBram Moolenaar 'w:var = 777', 3179e55b1c09SBram Moolenaar 't:var = 888', 3180d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3181d72c1bf0SBram Moolenaar ]) 3182d72c1bf0SBram Moolenaar 3183d72c1bf0SBram Moolenaar CheckScriptFailure([ 3184d72c1bf0SBram Moolenaar 'vim9script', 3185cfcd011fSBram Moolenaar 'let var = 123', 3186cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3187cfcd011fSBram Moolenaar 3188cfcd011fSBram Moolenaar CheckScriptFailure([ 3189cfcd011fSBram Moolenaar 'vim9script', 3190cfcd011fSBram Moolenaar 'var g:var = 123', 3191e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3192e55b1c09SBram Moolenaar 3193e55b1c09SBram Moolenaar CheckScriptFailure([ 3194e55b1c09SBram Moolenaar 'vim9script', 3195cfcd011fSBram Moolenaar 'var b:var = 123', 3196e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3197e55b1c09SBram Moolenaar 3198e55b1c09SBram Moolenaar CheckScriptFailure([ 3199e55b1c09SBram Moolenaar 'vim9script', 3200cfcd011fSBram Moolenaar 'var w:var = 123', 3201e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3202e55b1c09SBram Moolenaar 3203e55b1c09SBram Moolenaar CheckScriptFailure([ 3204e55b1c09SBram Moolenaar 'vim9script', 3205cfcd011fSBram Moolenaar 'var t:var = 123', 3206e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3207e55b1c09SBram Moolenaar 3208e55b1c09SBram Moolenaar CheckScriptFailure([ 3209e55b1c09SBram Moolenaar 'vim9script', 3210cfcd011fSBram Moolenaar 'var v:version = 123', 3211e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3212e55b1c09SBram Moolenaar 3213e55b1c09SBram Moolenaar CheckScriptFailure([ 3214e55b1c09SBram Moolenaar 'vim9script', 3215cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3216e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 32176797966dSBram Moolenaar 32186797966dSBram Moolenaar CheckScriptFailure([ 32196797966dSBram Moolenaar 'vim9script', 32206797966dSBram Moolenaar 'g:var = 123', 322132e35117SBram Moolenaar 'unlet g:var# comment1', 3222d72c1bf0SBram Moolenaar ], 'E108:') 3223d72c1bf0SBram Moolenaar 3224d72c1bf0SBram Moolenaar CheckScriptFailure([ 3225d72c1bf0SBram Moolenaar 'let g:var = 123', 3226d72c1bf0SBram Moolenaar 'unlet g:var # something', 3227d72c1bf0SBram Moolenaar ], 'E488:') 3228faac4104SBram Moolenaar 3229faac4104SBram Moolenaar CheckScriptSuccess([ 3230faac4104SBram Moolenaar 'vim9script', 323132e35117SBram Moolenaar 'if 1 # comment2', 3232faac4104SBram Moolenaar ' echo "yes"', 3233faac4104SBram Moolenaar 'elseif 2 #comment', 3234faac4104SBram Moolenaar ' echo "no"', 3235faac4104SBram Moolenaar 'endif', 3236faac4104SBram Moolenaar ]) 3237faac4104SBram Moolenaar 3238faac4104SBram Moolenaar CheckScriptFailure([ 3239faac4104SBram Moolenaar 'vim9script', 324032e35117SBram Moolenaar 'if 1# comment3', 3241faac4104SBram Moolenaar ' echo "yes"', 3242faac4104SBram Moolenaar 'endif', 3243fae55a9cSBram Moolenaar ], 'E488:') 3244faac4104SBram Moolenaar 3245faac4104SBram Moolenaar CheckScriptFailure([ 3246faac4104SBram Moolenaar 'vim9script', 324732e35117SBram Moolenaar 'if 0 # comment4', 3248faac4104SBram Moolenaar ' echo "yes"', 3249faac4104SBram Moolenaar 'elseif 2#comment', 3250faac4104SBram Moolenaar ' echo "no"', 3251faac4104SBram Moolenaar 'endif', 3252fae55a9cSBram Moolenaar ], 'E488:') 3253faac4104SBram Moolenaar 3254faac4104SBram Moolenaar CheckScriptSuccess([ 3255faac4104SBram Moolenaar 'vim9script', 3256cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3257faac4104SBram Moolenaar ]) 3258faac4104SBram Moolenaar 3259faac4104SBram Moolenaar CheckScriptFailure([ 3260faac4104SBram Moolenaar 'vim9script', 3261cfcd011fSBram Moolenaar 'var v = 1# comment6', 3262fae55a9cSBram Moolenaar ], 'E488:') 3263faac4104SBram Moolenaar 3264faac4104SBram Moolenaar CheckScriptSuccess([ 3265faac4104SBram Moolenaar 'vim9script', 3266faac4104SBram Moolenaar 'new' 3267d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3268df069eecSBram Moolenaar ':$', 3269faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3270faac4104SBram Moolenaar 'bwipe!', 3271faac4104SBram Moolenaar ]) 3272faac4104SBram Moolenaar 3273f5be8cdbSBram Moolenaar CheckScriptFailure([ 3274f5be8cdbSBram Moolenaar 'vim9script', 3275f5be8cdbSBram Moolenaar 'new' 3276d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3277f5be8cdbSBram Moolenaar ':$', 3278f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3279f5be8cdbSBram Moolenaar 'bwipe!', 3280f5be8cdbSBram Moolenaar ], 'E488:') 3281f5be8cdbSBram Moolenaar 3282f5be8cdbSBram Moolenaar CheckScriptFailure([ 3283f5be8cdbSBram Moolenaar 'vim9script', 3284f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3285f5be8cdbSBram Moolenaar ], 'E477:') 3286a26b9700SBram Moolenaarenddef 3287a26b9700SBram Moolenaar 32887e5bd91dSBram Moolenaardef Test_finish() 3289cfcd011fSBram Moolenaar var lines =<< trim END 32907e5bd91dSBram Moolenaar vim9script 32916797966dSBram Moolenaar g:res = 'one' 32927e5bd91dSBram Moolenaar if v:false | finish | endif 32936797966dSBram Moolenaar g:res = 'two' 32947e5bd91dSBram Moolenaar finish 32956797966dSBram Moolenaar g:res = 'three' 32967e5bd91dSBram Moolenaar END 32977e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 32987e5bd91dSBram Moolenaar source Xfinished 32997e5bd91dSBram Moolenaar assert_equal('two', g:res) 33007e5bd91dSBram Moolenaar 33017e5bd91dSBram Moolenaar unlet g:res 33027e5bd91dSBram Moolenaar delete('Xfinished') 33037e5bd91dSBram Moolenaarenddef 33047e5bd91dSBram Moolenaar 3305a5d0077eSBram Moolenaardef Test_forward_declaration() 3306cfcd011fSBram Moolenaar var lines =<< trim END 3307a5d0077eSBram Moolenaar vim9script 3308a5d0077eSBram Moolenaar def GetValue(): string 3309a5d0077eSBram Moolenaar return theVal 3310a5d0077eSBram Moolenaar enddef 3311cfcd011fSBram Moolenaar var theVal = 'something' 3312822ba247SBram Moolenaar g:initVal = GetValue() 3313a5d0077eSBram Moolenaar theVal = 'else' 3314a5d0077eSBram Moolenaar g:laterVal = GetValue() 3315a5d0077eSBram Moolenaar END 3316a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3317a5d0077eSBram Moolenaar source Xforward 3318a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3319a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3320a5d0077eSBram Moolenaar 3321a5d0077eSBram Moolenaar unlet g:initVal 3322a5d0077eSBram Moolenaar unlet g:laterVal 3323a5d0077eSBram Moolenaar delete('Xforward') 3324a5d0077eSBram Moolenaarenddef 3325a5d0077eSBram Moolenaar 33269721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3327a6294955SBram Moolenaar var vim9_lines =<< trim END 3328a6294955SBram Moolenaar vim9script 3329a6294955SBram Moolenaar var local = 'local' 3330a6294955SBram Moolenaar g:global = 'global' 3331a6294955SBram Moolenaar export var exported = 'exported' 3332a6294955SBram Moolenaar export def GetText(): string 3333a6294955SBram Moolenaar return 'text' 3334a6294955SBram Moolenaar enddef 3335a6294955SBram Moolenaar END 3336a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3337a6294955SBram Moolenaar 3338cfcd011fSBram Moolenaar var legacy_lines =<< trim END 33399721fb4eSBram Moolenaar source Xvim9_script.vim 33409721fb4eSBram Moolenaar 33419721fb4eSBram Moolenaar call assert_false(exists('local')) 33429721fb4eSBram Moolenaar call assert_false(exists('exported')) 33439721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 33449721fb4eSBram Moolenaar call assert_equal('global', global) 33459721fb4eSBram Moolenaar call assert_equal('global', g:global) 33469721fb4eSBram Moolenaar 33479721fb4eSBram Moolenaar " imported variable becomes script-local 33489721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 33499721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 33509721fb4eSBram Moolenaar call assert_false(exists('exported')) 33519721fb4eSBram Moolenaar 33529721fb4eSBram Moolenaar " imported function becomes script-local 33539721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 33549721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 33559721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 33569721fb4eSBram Moolenaar END 33579721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 33589721fb4eSBram Moolenaar 33599721fb4eSBram Moolenaar source Xlegacy_script.vim 33609721fb4eSBram Moolenaar assert_equal('global', g:global) 3361f5be8cdbSBram Moolenaar unlet g:global 33629721fb4eSBram Moolenaar 33639721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 33649721fb4eSBram Moolenaar delete('Xvim9_script.vim') 33659721fb4eSBram Moolenaarenddef 3366a5d0077eSBram Moolenaar 3367e535db86SBram Moolenaardef Test_declare_script_in_func() 3368e535db86SBram Moolenaar var lines =<< trim END 3369e535db86SBram Moolenaar vim9script 3370e535db86SBram Moolenaar func Declare() 3371e535db86SBram Moolenaar let s:local = 123 3372e535db86SBram Moolenaar endfunc 3373e535db86SBram Moolenaar Declare() 3374e535db86SBram Moolenaar assert_equal(123, local) 3375e535db86SBram Moolenaar 3376e535db86SBram Moolenaar var error: string 3377e535db86SBram Moolenaar try 3378e535db86SBram Moolenaar local = 'asdf' 3379e535db86SBram Moolenaar catch 3380e535db86SBram Moolenaar error = v:exception 3381e535db86SBram Moolenaar endtry 3382e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3383e535db86SBram Moolenaar 3384e535db86SBram Moolenaar lockvar local 3385e535db86SBram Moolenaar try 3386e535db86SBram Moolenaar local = 999 3387e535db86SBram Moolenaar catch 3388e535db86SBram Moolenaar error = v:exception 3389e535db86SBram Moolenaar endtry 3390e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3391e535db86SBram Moolenaar END 3392e535db86SBram Moolenaar CheckScriptSuccess(lines) 3393e535db86SBram Moolenaarenddef 3394e535db86SBram Moolenaar 3395e535db86SBram Moolenaar 33967d699701SBram Moolenaarfunc Test_vim9script_not_global() 33977d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 33987d699701SBram Moolenaar let vim9lines =<< trim END 33997d699701SBram Moolenaar vim9script 3400cfcd011fSBram Moolenaar var name = 'local' 34017d699701SBram Moolenaar func TheFunc() 34027d699701SBram Moolenaar echo 'local' 34037d699701SBram Moolenaar endfunc 34047d699701SBram Moolenaar def DefFunc() 34057d699701SBram Moolenaar echo 'local' 34067d699701SBram Moolenaar enddef 34077d699701SBram Moolenaar END 34087d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 34097d699701SBram Moolenaar source Xvim9script.vim 34107d699701SBram Moolenaar try 34117d699701SBram Moolenaar echo g:var 34127d699701SBram Moolenaar assert_report('did not fail') 34137d699701SBram Moolenaar catch /E121:/ 34147d699701SBram Moolenaar " caught 34157d699701SBram Moolenaar endtry 34167d699701SBram Moolenaar try 34177d699701SBram Moolenaar call TheFunc() 34187d699701SBram Moolenaar assert_report('did not fail') 34197d699701SBram Moolenaar catch /E117:/ 34207d699701SBram Moolenaar " caught 34217d699701SBram Moolenaar endtry 34227d699701SBram Moolenaar try 34237d699701SBram Moolenaar call DefFunc() 34247d699701SBram Moolenaar assert_report('did not fail') 34257d699701SBram Moolenaar catch /E117:/ 34267d699701SBram Moolenaar " caught 34277d699701SBram Moolenaar endtry 34287d699701SBram Moolenaar 342925859dd7SBram Moolenaar call delete('Xvim9script.vim') 34307d699701SBram Moolenaarendfunc 34317d699701SBram Moolenaar 3432eeb27bfeSBram Moolenaardef Test_vim9_copen() 3433eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3434eeb27bfeSBram Moolenaar copen 3435eeb27bfeSBram Moolenaar quit 3436eeb27bfeSBram Moolenaarenddef 3437eeb27bfeSBram Moolenaar 343803290b84SBram Moolenaar" test using an auto-loaded function and variable 34392d6b20d6SBram Moolenaardef Test_vim9_autoload() 3440cfcd011fSBram Moolenaar var lines =<< trim END 34412d6b20d6SBram Moolenaar vim9script 344203290b84SBram Moolenaar def some#gettest(): string 344303290b84SBram Moolenaar return 'test' 344403290b84SBram Moolenaar enddef 344503290b84SBram Moolenaar g:some#name = 'name' 3446227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3447e3ffcd99SBram Moolenaar 3448e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3449e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3450e3ffcd99SBram Moolenaar enddef 345103290b84SBram Moolenaar END 345203290b84SBram Moolenaar 345303290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 345403290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 345503290b84SBram Moolenaar var save_rtp = &rtp 345603290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 345703290b84SBram Moolenaar 345803290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 345903290b84SBram Moolenaar assert_equal('name', g:some#name) 3460227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 346103290b84SBram Moolenaar g:some#other = 'other' 346203290b84SBram Moolenaar assert_equal('other', g:some#other) 346303290b84SBram Moolenaar 3464e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3465e3ffcd99SBram Moolenaar 346617f700acSBram Moolenaar # upper case script name works 346717f700acSBram Moolenaar lines =<< trim END 346817f700acSBram Moolenaar vim9script 346917f700acSBram Moolenaar def Other#getOther(): string 347017f700acSBram Moolenaar return 'other' 347117f700acSBram Moolenaar enddef 347217f700acSBram Moolenaar END 347317f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 347417f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 347517f700acSBram Moolenaar 347603290b84SBram Moolenaar delete('Xdir', 'rf') 347703290b84SBram Moolenaar &rtp = save_rtp 347803290b84SBram Moolenaarenddef 347903290b84SBram Moolenaar 348003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 348103290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 348203290b84SBram Moolenaar var lines =<< trim END 348303290b84SBram Moolenaar vim9script 34842d6b20d6SBram Moolenaar def foo#test() 34852d6b20d6SBram Moolenaar echomsg getreg('"') 34862d6b20d6SBram Moolenaar enddef 34872d6b20d6SBram Moolenaar END 34882d6b20d6SBram Moolenaar 34892d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 34902d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3491cfcd011fSBram Moolenaar var save_rtp = &rtp 34922d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 34932d6b20d6SBram Moolenaar augroup test 34942d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 34952d6b20d6SBram Moolenaar augroup END 34962d6b20d6SBram Moolenaar 34972d6b20d6SBram Moolenaar normal Y 34982d6b20d6SBram Moolenaar 34992d6b20d6SBram Moolenaar augroup test 35002d6b20d6SBram Moolenaar autocmd! 35012d6b20d6SBram Moolenaar augroup END 35022d6b20d6SBram Moolenaar delete('Xdir', 'rf') 35032d6b20d6SBram Moolenaar &rtp = save_rtp 35042d6b20d6SBram Moolenaarenddef 35052d6b20d6SBram Moolenaar 350677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 350777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3508cfcd011fSBram Moolenaar var lines =<< trim END 350977e5dcc3SBram Moolenaar vim9script 351077e5dcc3SBram Moolenaar def crash#func() 351177e5dcc3SBram Moolenaar try 351277e5dcc3SBram Moolenaar for x in List() 351377e5dcc3SBram Moolenaar endfor 351477e5dcc3SBram Moolenaar catch 351577e5dcc3SBram Moolenaar endtry 351677e5dcc3SBram Moolenaar g:ok = true 351777e5dcc3SBram Moolenaar enddef 351877e5dcc3SBram Moolenaar fu List() 351977e5dcc3SBram Moolenaar invalid 352077e5dcc3SBram Moolenaar endfu 352177e5dcc3SBram Moolenaar try 352248e11c10SBram Moolenaar alsoinvalid 352377e5dcc3SBram Moolenaar catch /wontmatch/ 352477e5dcc3SBram Moolenaar endtry 352577e5dcc3SBram Moolenaar END 352677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 352777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 352877e5dcc3SBram Moolenaar 352977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 353077e5dcc3SBram Moolenaar lines =<< trim END 353177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 353277e5dcc3SBram Moolenaar call crash#func() 353377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 35349c4f5520SBram Moolenaar qall! 353577e5dcc3SBram Moolenaar END 353677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 353777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 353877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 353977e5dcc3SBram Moolenaar 354077e5dcc3SBram Moolenaar delete('Xdidit') 354177e5dcc3SBram Moolenaar delete('Xscript') 354277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 354303290b84SBram Moolenaar 354403290b84SBram Moolenaar lines =<< trim END 354503290b84SBram Moolenaar vim9script 354603290b84SBram Moolenaar var foo#bar = 'asdf' 354703290b84SBram Moolenaar END 354803290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 354977e5dcc3SBram Moolenaarenddef 355077e5dcc3SBram Moolenaar 355181e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 355281e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 355381e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3554cfcd011fSBram Moolenaar var lines =<< trim END 355581e17fbeSBram Moolenaar let s:counter = 1 355681e17fbeSBram Moolenaar def s:Func() 355781e17fbeSBram Moolenaar au! CursorHold 355881e17fbeSBram Moolenaar au CursorHold * s:counter += 1 355981e17fbeSBram Moolenaar enddef 356081e17fbeSBram Moolenaar call s:Func() 356181e17fbeSBram Moolenaar doau CursorHold 356281e17fbeSBram Moolenaar call assert_equal(2, s:counter) 356381e17fbeSBram Moolenaar au! CursorHold 356481e17fbeSBram Moolenaar END 356581e17fbeSBram Moolenaar CheckScriptSuccess(lines) 356681e17fbeSBram Moolenaarenddef 356781e17fbeSBram Moolenaar 35683896a105SBram Moolenaardef Test_cmdline_win() 35693896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 35703896a105SBram Moolenaar # the command line window. 35713896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3572cfcd011fSBram Moolenaar var export_lines =<< trim END 35733896a105SBram Moolenaar vim9script 3574cfcd011fSBram Moolenaar export var That = 'yes' 35753896a105SBram Moolenaar END 35763896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3577cfcd011fSBram Moolenaar var import_lines =<< trim END 35783896a105SBram Moolenaar vim9script 35793896a105SBram Moolenaar import That from './Xexport.vim' 35803896a105SBram Moolenaar END 35813896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3582cfcd011fSBram Moolenaar var save_rtp = &rtp 35833896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 35843896a105SBram Moolenaar syntax on 35853896a105SBram Moolenaar augroup CmdWin 35863896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 35873896a105SBram Moolenaar augroup END 35883896a105SBram Moolenaar # this will open and also close the cmdline window 35893896a105SBram Moolenaar feedkeys('q:', 'xt') 35903896a105SBram Moolenaar assert_equal('yes', g:got_there) 35913896a105SBram Moolenaar 35923896a105SBram Moolenaar augroup CmdWin 35933896a105SBram Moolenaar au! 35943896a105SBram Moolenaar augroup END 35953896a105SBram Moolenaar &rtp = save_rtp 35963896a105SBram Moolenaar delete('rtp', 'rf') 35973896a105SBram Moolenaarenddef 35983896a105SBram Moolenaar 3599e3d4685fSBram Moolenaardef Test_invalid_sid() 3600e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 360125859dd7SBram Moolenaar 36029c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3603d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3604e3d4685fSBram Moolenaar endif 3605e3d4685fSBram Moolenaar delete('Xdidit') 3606e3d4685fSBram Moolenaarenddef 3607e3d4685fSBram Moolenaar 36089ec7026fSBram Moolenaardef Test_restoring_cpo() 36099ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 36109ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 36119ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 36129ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 36139ec7026fSBram Moolenaar endif 36149ec7026fSBram Moolenaar delete('Xsourced') 36159ec7026fSBram Moolenaar delete('Xclose') 3616090728adSBram Moolenaar delete('Xdone') 36170123cc1eSBram Moolenaar 36180123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 36190123cc1eSBram Moolenaar set cpo=aABceFsMny> 36200123cc1eSBram Moolenaar edit XanotherScript 36210123cc1eSBram Moolenaar so % 36220123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36230123cc1eSBram Moolenaar :1del 36240123cc1eSBram Moolenaar w 36250123cc1eSBram Moolenaar so % 36260123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 36270123cc1eSBram Moolenaar 36280123cc1eSBram Moolenaar delete('XanotherScript') 36290123cc1eSBram Moolenaar set cpo&vim 36309ec7026fSBram Moolenaarenddef 36319ec7026fSBram Moolenaar 3632ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3633ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 363437294bd6SBram Moolenaar CheckScreendump 3635ffb7dcdbSBram Moolenaar CheckFeature timers 363637294bd6SBram Moolenaar 3637ffb7dcdbSBram Moolenaar let lines =<< trim END 363837294bd6SBram Moolenaar vim9script 363937294bd6SBram Moolenaar def script#func() 364037294bd6SBram Moolenaar enddef 364137294bd6SBram Moolenaar END 3642ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3643ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 364437294bd6SBram Moolenaar 3645ffb7dcdbSBram Moolenaar let lines =<< trim END 364637294bd6SBram Moolenaar vim9script 364737294bd6SBram Moolenaar set cpo+=M 364837294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3649767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 365037294bd6SBram Moolenaar setline(1, 'some text') 365137294bd6SBram Moolenaar END 3652ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3653ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3654ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3655ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 365637294bd6SBram Moolenaar 3657ffb7dcdbSBram Moolenaar " clean up 3658ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3659ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3660ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3661ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3662ffb7dcdbSBram Moolenaarendfunc 366337294bd6SBram Moolenaar 36649ec7026fSBram Moolenaar 3665f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3666cfcd011fSBram Moolenaar var lines =<< trim END 3667cfcd011fSBram Moolenaar var name: any 3668cfcd011fSBram Moolenaar assert_equal(0, name) 3669f0afd9e1SBram Moolenaar END 3670f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3671f0afd9e1SBram Moolenaarenddef 3672f0afd9e1SBram Moolenaar 36737e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 367458dbef33SBram Moolenaar CheckRunVimInTerminal 367558dbef33SBram Moolenaar 36767e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 36777e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 36787e9210eaSBram Moolenaarendfunc 36797e9210eaSBram Moolenaar 36807e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 36819c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3682cfcd011fSBram Moolenaar var lines =<< trim END 36839c4f5520SBram Moolenaar func CheckAndQuit() 36849c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 36859c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 36869c4f5520SBram Moolenaar endfunc 36879c4f5520SBram Moolenaar END 36889c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 36899c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3690e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 36919c4f5520SBram Moolenaar # define Afunc() on the command line 36929c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 36939c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 36942949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 36959c4f5520SBram Moolenaar 36969c4f5520SBram Moolenaar call StopVimInTerminal(buf) 36979c4f5520SBram Moolenaar delete('XcallFunc') 36989c4f5520SBram Moolenaar delete('Xdidcmd') 36999c4f5520SBram Moolenaarenddef 37009c4f5520SBram Moolenaar 3701fcdc5d83SBram Moolenaardef Test_script_var_scope() 3702fcdc5d83SBram Moolenaar var lines =<< trim END 3703fcdc5d83SBram Moolenaar vim9script 3704fcdc5d83SBram Moolenaar if true 3705fcdc5d83SBram Moolenaar if true 3706fcdc5d83SBram Moolenaar var one = 'one' 3707fcdc5d83SBram Moolenaar echo one 3708fcdc5d83SBram Moolenaar endif 3709fcdc5d83SBram Moolenaar echo one 3710fcdc5d83SBram Moolenaar endif 3711fcdc5d83SBram Moolenaar END 3712fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3713fcdc5d83SBram Moolenaar 3714fcdc5d83SBram Moolenaar lines =<< trim END 3715fcdc5d83SBram Moolenaar vim9script 3716fcdc5d83SBram Moolenaar if true 3717fcdc5d83SBram Moolenaar if false 3718fcdc5d83SBram Moolenaar var one = 'one' 3719fcdc5d83SBram Moolenaar echo one 3720fcdc5d83SBram Moolenaar else 3721fcdc5d83SBram Moolenaar var one = 'one' 3722fcdc5d83SBram Moolenaar echo one 3723fcdc5d83SBram Moolenaar endif 3724fcdc5d83SBram Moolenaar echo one 3725fcdc5d83SBram Moolenaar endif 3726fcdc5d83SBram Moolenaar END 3727fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3728fcdc5d83SBram Moolenaar 3729fcdc5d83SBram Moolenaar lines =<< trim END 3730fcdc5d83SBram Moolenaar vim9script 3731fcdc5d83SBram Moolenaar while true 3732fcdc5d83SBram Moolenaar var one = 'one' 3733fcdc5d83SBram Moolenaar echo one 3734fcdc5d83SBram Moolenaar break 3735fcdc5d83SBram Moolenaar endwhile 3736fcdc5d83SBram Moolenaar echo one 3737fcdc5d83SBram Moolenaar END 3738fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3739fcdc5d83SBram Moolenaar 3740fcdc5d83SBram Moolenaar lines =<< trim END 3741fcdc5d83SBram Moolenaar vim9script 3742fcdc5d83SBram Moolenaar for i in range(1) 3743fcdc5d83SBram Moolenaar var one = 'one' 3744fcdc5d83SBram Moolenaar echo one 3745fcdc5d83SBram Moolenaar endfor 3746fcdc5d83SBram Moolenaar echo one 3747fcdc5d83SBram Moolenaar END 3748fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 37499becdf2bSBram Moolenaar 37509becdf2bSBram Moolenaar lines =<< trim END 37519becdf2bSBram Moolenaar vim9script 37529becdf2bSBram Moolenaar { 37539becdf2bSBram Moolenaar var one = 'one' 37549becdf2bSBram Moolenaar assert_equal('one', one) 37559becdf2bSBram Moolenaar } 37569becdf2bSBram Moolenaar assert_false(exists('one')) 37579becdf2bSBram Moolenaar assert_false(exists('s:one')) 37589becdf2bSBram Moolenaar END 37599becdf2bSBram Moolenaar CheckScriptSuccess(lines) 37609becdf2bSBram Moolenaar 37619becdf2bSBram Moolenaar lines =<< trim END 37629becdf2bSBram Moolenaar vim9script 37639becdf2bSBram Moolenaar { 37649becdf2bSBram Moolenaar var one = 'one' 37659becdf2bSBram Moolenaar echo one 37669becdf2bSBram Moolenaar } 37679becdf2bSBram Moolenaar echo one 37689becdf2bSBram Moolenaar END 37699becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3770fcdc5d83SBram Moolenaarenddef 3771fcdc5d83SBram Moolenaar 3772352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3773352134bbSBram Moolenaar var lines =<< trim END 3774352134bbSBram Moolenaar vim9script 37752a38908bSBram Moolenaar def Callback(...l: list<any>) 3776352134bbSBram Moolenaar try 3777352134bbSBram Moolenaar var x: string 3778352134bbSBram Moolenaar var y: string 3779352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3780352134bbSBram Moolenaar [x, y] = [''] 3781352134bbSBram Moolenaar catch 3782352134bbSBram Moolenaar g:caught = 'yes' 3783352134bbSBram Moolenaar endtry 3784352134bbSBram Moolenaar enddef 3785e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3786352134bbSBram Moolenaar feedkeys("\r", 'xt') 3787352134bbSBram Moolenaar END 3788352134bbSBram Moolenaar CheckScriptSuccess(lines) 3789352134bbSBram Moolenaar 3790352134bbSBram Moolenaar unlet g:caught 3791352134bbSBram Moolenaarenddef 3792352134bbSBram Moolenaar 3793631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3794631e8f93SBram Moolenaar if !has('unix') || !has('job') 3795631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3796631e8f93SBram Moolenaar endif 3797631e8f93SBram Moolenaar var lines =<< trim END 3798631e8f93SBram Moolenaar vim9script 3799631e8f93SBram Moolenaar var source: list<number> 38002a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3801631e8f93SBram Moolenaar eval [][0] 3802631e8f93SBram Moolenaar enddef 38032a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3804631e8f93SBram Moolenaar sleep 1m 3805631e8f93SBram Moolenaar source += l 3806631e8f93SBram Moolenaar enddef 3807e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 38086f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 38096f17a3f0SBram Moolenaar sleep 10m 38106f17a3f0SBram Moolenaar endwhile 3811206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3812fe95b94fSBram Moolenaar sleep 200m 3813631e8f93SBram Moolenaar END 3814631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3815631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3816631e8f93SBram Moolenaar delete('Xdef') 3817631e8f93SBram Moolenaarenddef 3818631e8f93SBram Moolenaar 38194324d87aSBram Moolenaardef InvokeNormal() 38204324d87aSBram Moolenaar exe "norm! :m+1\r" 38214324d87aSBram Moolenaarenddef 38224324d87aSBram Moolenaar 38234324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 38244324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 38254324d87aSBram Moolenaar new 38264324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 38274324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 38284324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 38294324d87aSBram Moolenaar xunmap <F3> 3830b5b9480eSBram Moolenaarenddef 3831b5b9480eSBram Moolenaar 3832b5b9480eSBram Moolenaardef Test_white_space_after_command() 3833b5b9480eSBram Moolenaar var lines =<< trim END 3834b5b9480eSBram Moolenaar exit_cb: Func}) 3835b5b9480eSBram Moolenaar END 3836b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3837f8103f27SBram Moolenaar 3838f8103f27SBram Moolenaar lines =<< trim END 3839f8103f27SBram Moolenaar e# 3840f8103f27SBram Moolenaar END 3841f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 38424324d87aSBram Moolenaarenddef 38434324d87aSBram Moolenaar 38444aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 38454aab88d9SBram Moolenaar var lines =<< trim END 38464aab88d9SBram Moolenaar vim9script 38474aab88d9SBram Moolenaar if exists('g:guard') 38484aab88d9SBram Moolenaar finish 38494aab88d9SBram Moolenaar endif 38504aab88d9SBram Moolenaar g:guard = 1 38514aab88d9SBram Moolenaar var name = 'thename' 38524aab88d9SBram Moolenaar def g:GetName(): string 38534aab88d9SBram Moolenaar return name 38544aab88d9SBram Moolenaar enddef 38554aab88d9SBram Moolenaar def g:SetName(arg: string) 38564aab88d9SBram Moolenaar name = arg 38574aab88d9SBram Moolenaar enddef 38584aab88d9SBram Moolenaar END 38594aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 38604aab88d9SBram Moolenaar so XscriptTwice.vim 38614aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 38624aab88d9SBram Moolenaar g:SetName('newname') 38634aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 38644aab88d9SBram Moolenaar so XscriptTwice.vim 38654aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38664aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 38674aab88d9SBram Moolenaar 38684aab88d9SBram Moolenaar delfunc g:GetName 38694aab88d9SBram Moolenaar delfunc g:SetName 38704aab88d9SBram Moolenaar delete('XscriptTwice.vim') 38714aab88d9SBram Moolenaar unlet g:guard 38724aab88d9SBram Moolenaarenddef 38734aab88d9SBram Moolenaar 38744aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 38754aab88d9SBram Moolenaar var exportlines =<< trim END 38764aab88d9SBram Moolenaar vim9script 38774aab88d9SBram Moolenaar if exists('g:guard') 38784aab88d9SBram Moolenaar finish 38794aab88d9SBram Moolenaar endif 38804aab88d9SBram Moolenaar g:guard = 1 38814aab88d9SBram Moolenaar export var name = 'someName' 38824aab88d9SBram Moolenaar END 38834aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 38844aab88d9SBram Moolenaar 38854aab88d9SBram Moolenaar var lines =<< trim END 38864aab88d9SBram Moolenaar vim9script 38874aab88d9SBram Moolenaar import name from './XexportScript.vim' 38884aab88d9SBram Moolenaar def g:GetName(): string 38894aab88d9SBram Moolenaar return name 38904aab88d9SBram Moolenaar enddef 38914aab88d9SBram Moolenaar END 38924aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 38934aab88d9SBram Moolenaar so XscriptImport.vim 38944aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 38954aab88d9SBram Moolenaar 38964aab88d9SBram Moolenaar so XexportScript.vim 38974aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 38984aab88d9SBram Moolenaar 38994aab88d9SBram Moolenaar delfunc g:GetName 39004aab88d9SBram Moolenaar delete('XexportScript.vim') 39014aab88d9SBram Moolenaar delete('XscriptImport.vim') 39024aab88d9SBram Moolenaar unlet g:guard 39034aab88d9SBram Moolenaarenddef 39044aab88d9SBram Moolenaar 390510b9421fSBram Moolenaardef Test_unsupported_commands() 390610b9421fSBram Moolenaar var lines =<< trim END 390710b9421fSBram Moolenaar ka 390810b9421fSBram Moolenaar END 39097d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39107d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 391110b9421fSBram Moolenaar 391210b9421fSBram Moolenaar lines =<< trim END 3913ada1d870SBram Moolenaar :1ka 3914ada1d870SBram Moolenaar END 39157d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 39167d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 3917ada1d870SBram Moolenaar 3918ada1d870SBram Moolenaar lines =<< trim END 391910b9421fSBram Moolenaar t 392010b9421fSBram Moolenaar END 392110b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 392210b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 392310b9421fSBram Moolenaar 392410b9421fSBram Moolenaar lines =<< trim END 392510b9421fSBram Moolenaar x 392610b9421fSBram Moolenaar END 392710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 392810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 392910b9421fSBram Moolenaar 393010b9421fSBram Moolenaar lines =<< trim END 393110b9421fSBram Moolenaar xit 393210b9421fSBram Moolenaar END 393310b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 393410b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 393510b9421fSBram Moolenaarenddef 393610b9421fSBram Moolenaar 3937c70fe460SBram Moolenaardef Test_mapping_line_number() 3938c70fe460SBram Moolenaar var lines =<< trim END 3939c70fe460SBram Moolenaar vim9script 3940c70fe460SBram Moolenaar def g:FuncA() 3941c70fe460SBram Moolenaar # Some comment 3942c70fe460SBram Moolenaar FuncB(0) 3943c70fe460SBram Moolenaar enddef 3944c70fe460SBram Moolenaar # Some comment 3945c70fe460SBram Moolenaar def FuncB( 3946c70fe460SBram Moolenaar # Some comment 3947c70fe460SBram Moolenaar n: number 3948c70fe460SBram Moolenaar ) 3949c70fe460SBram Moolenaar exe 'nno ' 3950c70fe460SBram Moolenaar # Some comment 3951c70fe460SBram Moolenaar .. '<F3> a' 3952c70fe460SBram Moolenaar .. 'b' 3953c70fe460SBram Moolenaar .. 'c' 3954c70fe460SBram Moolenaar enddef 3955c70fe460SBram Moolenaar END 3956c70fe460SBram Moolenaar CheckScriptSuccess(lines) 3957c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 3958c70fe460SBram Moolenaar assert_match('No mapping found', res) 3959c70fe460SBram Moolenaar 3960c70fe460SBram Moolenaar g:FuncA() 3961c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 3962c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 3963c70fe460SBram Moolenaar 3964c70fe460SBram Moolenaar nunmap <F3> 3965c70fe460SBram Moolenaar delfunc g:FuncA 3966c70fe460SBram Moolenaarenddef 3967c70fe460SBram Moolenaar 3968208f0b48SBram Moolenaardef Test_option_modifier() 3969208f0b48SBram Moolenaar var lines =<< trim END 3970208f0b48SBram Moolenaar set hlsearch & hlsearch ! 3971208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 3972208f0b48SBram Moolenaar END 3973208f0b48SBram Moolenaar CheckScriptSuccess(lines) 3974208f0b48SBram Moolenaar 3975208f0b48SBram Moolenaar lines =<< trim END 3976208f0b48SBram Moolenaar vim9script 3977208f0b48SBram Moolenaar set hlsearch & 3978208f0b48SBram Moolenaar END 3979208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 3980208f0b48SBram Moolenaar 3981208f0b48SBram Moolenaar lines =<< trim END 3982208f0b48SBram Moolenaar vim9script 3983208f0b48SBram Moolenaar set hlsearch & hlsearch ! 3984208f0b48SBram Moolenaar END 3985208f0b48SBram Moolenaar CheckScriptFailure(lines, 'E518:') 3986208f0b48SBram Moolenaarenddef 3987208f0b48SBram Moolenaar 3988585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3989585fea7bSBram Moolenaardef Test_substitute_cmd() 3990585fea7bSBram Moolenaar new 3991585fea7bSBram Moolenaar setline(1, 'something') 3992585fea7bSBram Moolenaar :substitute(some(other( 3993585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3994585fea7bSBram Moolenaar bwipe! 3995585fea7bSBram Moolenaar 3996f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3997cfcd011fSBram Moolenaar var lines =<< trim END 3998585fea7bSBram Moolenaar vim9script 3999585fea7bSBram Moolenaar new 4000585fea7bSBram Moolenaar setline(1, 'something') 4001585fea7bSBram Moolenaar :substitute(some(other( 4002585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4003585fea7bSBram Moolenaar bwipe! 4004585fea7bSBram Moolenaar END 4005585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4006585fea7bSBram Moolenaar source Xvim9lines 4007585fea7bSBram Moolenaar 4008585fea7bSBram Moolenaar delete('Xvim9lines') 4009585fea7bSBram Moolenaarenddef 4010585fea7bSBram Moolenaar 40118a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4012