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 6064197828dSBram Moolenaar 6074197828dSBram Moolenaar # missing catch and/or finally 6084197828dSBram Moolenaar lines =<< trim END 6094197828dSBram Moolenaar vim9script 6104197828dSBram Moolenaar try 6114197828dSBram Moolenaar echo 'something' 6124197828dSBram Moolenaar endtry 6134197828dSBram Moolenaar END 6144197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6158a7d6542SBram Moolenaarenddef 6168a7d6542SBram Moolenaar 6173f987b59SBram Moolenaardef Test_try_in_catch() 6183f987b59SBram Moolenaar var lines =<< trim END 6193f987b59SBram Moolenaar vim9script 6203f987b59SBram Moolenaar var seq = [] 6213f987b59SBram Moolenaar def DoIt() 6223f987b59SBram Moolenaar try 6233f987b59SBram Moolenaar seq->add('throw 1') 6243f987b59SBram Moolenaar eval [][0] 6253f987b59SBram Moolenaar seq->add('notreached') 6263f987b59SBram Moolenaar catch 6273f987b59SBram Moolenaar seq->add('catch') 6283f987b59SBram Moolenaar try 6293f987b59SBram Moolenaar seq->add('throw 2') 6303f987b59SBram Moolenaar eval [][0] 6313f987b59SBram Moolenaar seq->add('notreached') 6323f987b59SBram Moolenaar catch /nothing/ 6333f987b59SBram Moolenaar seq->add('notreached') 6343f987b59SBram Moolenaar endtry 6353f987b59SBram Moolenaar seq->add('done') 6363f987b59SBram Moolenaar endtry 6373f987b59SBram Moolenaar enddef 6383f987b59SBram Moolenaar DoIt() 6393f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6403f987b59SBram Moolenaar END 6413f987b59SBram Moolenaarenddef 6423f987b59SBram Moolenaar 643d3d8feebSBram Moolenaardef Test_error_in_catch() 644d3d8feebSBram Moolenaar var lines =<< trim END 645d3d8feebSBram Moolenaar try 646d3d8feebSBram Moolenaar eval [][0] 647d3d8feebSBram Moolenaar catch /E684:/ 648d3d8feebSBram Moolenaar eval [][0] 649d3d8feebSBram Moolenaar endtry 650d3d8feebSBram Moolenaar END 651d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 652d3d8feebSBram Moolenaarenddef 653d3d8feebSBram Moolenaar 6542e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6552e34c34bSBram Moolenaardef TryContinueFunc() 6562e34c34bSBram Moolenaar while g:Count < 2 6572e34c34bSBram Moolenaar g:sequence ..= 't' 6582e34c34bSBram Moolenaar try 6592e34c34bSBram Moolenaar echoerr 'Test' 6602e34c34bSBram Moolenaar catch 6612e34c34bSBram Moolenaar g:Count += 1 6622e34c34bSBram Moolenaar g:sequence ..= 'c' 6632e34c34bSBram Moolenaar continue 6642e34c34bSBram Moolenaar endtry 6652e34c34bSBram Moolenaar g:sequence ..= 'e' 6662e34c34bSBram Moolenaar g:Count += 1 6672e34c34bSBram Moolenaar endwhile 6682e34c34bSBram Moolenaarenddef 6692e34c34bSBram Moolenaar 6702e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6712e34c34bSBram Moolenaar g:Count = 0 6722e34c34bSBram Moolenaar g:sequence = '' 6732e34c34bSBram Moolenaar TryContinueFunc() 6742e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6752e34c34bSBram Moolenaar unlet g:Count 6762e34c34bSBram Moolenaar unlet g:sequence 6772e34c34bSBram Moolenaarenddef 6782e34c34bSBram Moolenaar 6799cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6809cb577a6SBram Moolenaar # return in try block returns normally 6819cb577a6SBram Moolenaar def ReturnInTry(): string 6829cb577a6SBram Moolenaar try 6839cb577a6SBram Moolenaar return '"some message"' 6849cb577a6SBram Moolenaar catch 6859cb577a6SBram Moolenaar endtry 6869cb577a6SBram Moolenaar return 'not reached' 6879cb577a6SBram Moolenaar enddef 6889cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6899cb577a6SBram Moolenaarenddef 6909cb577a6SBram Moolenaar 6911430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6921430ceebSBram Moolenaar var lines =<< trim END 6931430ceebSBram Moolenaar vim9script 694c323527dSBram Moolenaar au BufEnter * eval 1 + 2 6951430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6961430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6971430ceebSBram Moolenaar var items = [ 6981430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6991430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7001430ceebSBram Moolenaar ] 7011430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7021430ceebSBram Moolenaar cwindow 7031430ceebSBram Moolenaar 7041430ceebSBram Moolenaar def CnextOrCfirst() 7051430ceebSBram Moolenaar # if cnext fails, cfirst is used 7061430ceebSBram Moolenaar try 7071430ceebSBram Moolenaar cnext 7081430ceebSBram Moolenaar catch 7091430ceebSBram Moolenaar cfirst 7101430ceebSBram Moolenaar endtry 7111430ceebSBram Moolenaar enddef 7121430ceebSBram Moolenaar 7131430ceebSBram Moolenaar CnextOrCfirst() 7141430ceebSBram Moolenaar CnextOrCfirst() 7151430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7161430ceebSBram Moolenaar qall 7171430ceebSBram Moolenaar END 7181430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7191430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7201430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7211430ceebSBram Moolenaar 7221430ceebSBram Moolenaar delete('Xfile1') 7231430ceebSBram Moolenaar delete('Xfile2') 7241430ceebSBram Moolenaar delete('XCatchCnext') 7251430ceebSBram Moolenaar delete('Xresult') 7261430ceebSBram Moolenaarenddef 7271430ceebSBram Moolenaar 7289e1d9e34SBram Moolenaardef Test_throw_skipped() 7299e1d9e34SBram Moolenaar if 0 7309e1d9e34SBram Moolenaar throw dontgethere 7319e1d9e34SBram Moolenaar endif 7329e1d9e34SBram Moolenaarenddef 7339e1d9e34SBram Moolenaar 7348f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7358f81b22eSBram Moolenaar var lines =<< trim END 7368f81b22eSBram Moolenaar vim9script 7378f81b22eSBram Moolenaar def Func() 7388f81b22eSBram Moolenaar throw 'error' 7398f81b22eSBram Moolenaar enddef 7408f81b22eSBram Moolenaar silent! Func() 7418f81b22eSBram Moolenaar END 7428f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7438f81b22eSBram Moolenaar source XthrowSilenced 7448f81b22eSBram Moolenaar delete('XthrowSilenced') 7458f81b22eSBram Moolenaarenddef 7468f81b22eSBram Moolenaar 747e859312eSBram Moolenaardef DeletedFunc(): list<any> 748e859312eSBram Moolenaar return ['delete me'] 749e859312eSBram Moolenaarenddef 750e859312eSBram Moolenaardefcompile 751e859312eSBram Moolenaardelfunc DeletedFunc 752e859312eSBram Moolenaar 753257cc5eeSBram Moolenaardef ThrowFromDef() 754a72cfb80SBram Moolenaar throw "getout" # comment 755257cc5eeSBram Moolenaarenddef 756257cc5eeSBram Moolenaar 757257cc5eeSBram Moolenaarfunc CatchInFunc() 758257cc5eeSBram Moolenaar try 759257cc5eeSBram Moolenaar call ThrowFromDef() 760257cc5eeSBram Moolenaar catch 761257cc5eeSBram Moolenaar let g:thrown_func = v:exception 762257cc5eeSBram Moolenaar endtry 763257cc5eeSBram Moolenaarendfunc 764257cc5eeSBram Moolenaar 765257cc5eeSBram Moolenaardef CatchInDef() 766257cc5eeSBram Moolenaar try 767257cc5eeSBram Moolenaar ThrowFromDef() 768257cc5eeSBram Moolenaar catch 769257cc5eeSBram Moolenaar g:thrown_def = v:exception 770257cc5eeSBram Moolenaar endtry 771257cc5eeSBram Moolenaarenddef 772257cc5eeSBram Moolenaar 773f575adffSBram Moolenaardef ReturnFinally(): string 774f575adffSBram Moolenaar try 775f575adffSBram Moolenaar return 'intry' 776373863edSBram Moolenaar finall 777f575adffSBram Moolenaar g:in_finally = 'finally' 778f575adffSBram Moolenaar endtry 779f575adffSBram Moolenaar return 'end' 780f575adffSBram Moolenaarenddef 781f575adffSBram Moolenaar 782257cc5eeSBram Moolenaardef Test_try_catch_nested() 783257cc5eeSBram Moolenaar CatchInFunc() 784257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 785257cc5eeSBram Moolenaar 786257cc5eeSBram Moolenaar CatchInDef() 787257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 788f575adffSBram Moolenaar 789f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 790f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 791d3d8feebSBram Moolenaar 792d3d8feebSBram Moolenaar var l = [] 793d3d8feebSBram Moolenaar try 794d3d8feebSBram Moolenaar l->add('1') 795d3d8feebSBram Moolenaar throw 'bad' 796d3d8feebSBram Moolenaar l->add('x') 797d3d8feebSBram Moolenaar catch /bad/ 798d3d8feebSBram Moolenaar l->add('2') 799d3d8feebSBram Moolenaar try 800d3d8feebSBram Moolenaar l->add('3') 801d3d8feebSBram Moolenaar throw 'one' 802d3d8feebSBram Moolenaar l->add('x') 803d3d8feebSBram Moolenaar catch /one/ 804d3d8feebSBram Moolenaar l->add('4') 805d3d8feebSBram Moolenaar try 806d3d8feebSBram Moolenaar l->add('5') 807d3d8feebSBram Moolenaar throw 'more' 808d3d8feebSBram Moolenaar l->add('x') 809d3d8feebSBram Moolenaar catch /more/ 810d3d8feebSBram Moolenaar l->add('6') 811d3d8feebSBram Moolenaar endtry 812d3d8feebSBram Moolenaar endtry 813d3d8feebSBram Moolenaar endtry 814d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 815834193afSBram Moolenaar 816834193afSBram Moolenaar l = [] 817834193afSBram Moolenaar try 818834193afSBram Moolenaar try 819834193afSBram Moolenaar l->add('1') 820834193afSBram Moolenaar throw 'foo' 821834193afSBram Moolenaar l->add('x') 822834193afSBram Moolenaar catch 823834193afSBram Moolenaar l->add('2') 824834193afSBram Moolenaar throw 'bar' 825834193afSBram Moolenaar l->add('x') 826834193afSBram Moolenaar finally 827834193afSBram Moolenaar l->add('3') 828834193afSBram Moolenaar endtry 829834193afSBram Moolenaar l->add('x') 830834193afSBram Moolenaar catch /bar/ 831834193afSBram Moolenaar l->add('4') 832834193afSBram Moolenaar endtry 833834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 834f575adffSBram Moolenaarenddef 835f575adffSBram Moolenaar 8369939f57bSBram Moolenaardef TryOne(): number 8379939f57bSBram Moolenaar try 8389939f57bSBram Moolenaar return 0 8399939f57bSBram Moolenaar catch 8409939f57bSBram Moolenaar endtry 8419939f57bSBram Moolenaar return 0 8429939f57bSBram Moolenaarenddef 8439939f57bSBram Moolenaar 8449939f57bSBram Moolenaardef TryTwo(n: number): string 8459939f57bSBram Moolenaar try 846cfcd011fSBram Moolenaar var x = {} 8479939f57bSBram Moolenaar catch 8489939f57bSBram Moolenaar endtry 8499939f57bSBram Moolenaar return 'text' 8509939f57bSBram Moolenaarenddef 8519939f57bSBram Moolenaar 8529939f57bSBram Moolenaardef Test_try_catch_twice() 8539939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8549939f57bSBram Moolenaarenddef 8559939f57bSBram Moolenaar 856f575adffSBram Moolenaardef Test_try_catch_match() 857cfcd011fSBram Moolenaar var seq = 'a' 858f575adffSBram Moolenaar try 859f575adffSBram Moolenaar throw 'something' 860f575adffSBram Moolenaar catch /nothing/ 861f575adffSBram Moolenaar seq ..= 'x' 862f575adffSBram Moolenaar catch /some/ 863f575adffSBram Moolenaar seq ..= 'b' 864f575adffSBram Moolenaar catch /asdf/ 865f575adffSBram Moolenaar seq ..= 'x' 866e8c4abbbSBram Moolenaar catch ?a\?sdf? 867e8c4abbbSBram Moolenaar seq ..= 'y' 868f575adffSBram Moolenaar finally 869f575adffSBram Moolenaar seq ..= 'c' 870f575adffSBram Moolenaar endtry 871f575adffSBram Moolenaar assert_equal('abc', seq) 872257cc5eeSBram Moolenaarenddef 873257cc5eeSBram Moolenaar 874e8c4abbbSBram Moolenaardef Test_try_catch_fails() 875d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 876d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 877d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 878d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 879d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 880d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 881d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 882d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 88313106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 884d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 885585fea7bSBram Moolenaar 886e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 887d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 888e8c4abbbSBram Moolenaarenddef 889e8c4abbbSBram Moolenaar 8907c5b3c03SBram Moolenaardef Try_catch_skipped() 8917c5b3c03SBram Moolenaar var l = [] 8927c5b3c03SBram Moolenaar try 8937c5b3c03SBram Moolenaar finally 8947c5b3c03SBram Moolenaar endtry 8957c5b3c03SBram Moolenaar 8967c5b3c03SBram Moolenaar if 1 8977c5b3c03SBram Moolenaar else 8987c5b3c03SBram Moolenaar try 8997c5b3c03SBram Moolenaar endtry 9007c5b3c03SBram Moolenaar endif 9017c5b3c03SBram Moolenaarenddef 9027c5b3c03SBram Moolenaar 9037c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9047c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9057c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9067c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9077c5b3c03SBram Moolenaarenddef 9087c5b3c03SBram Moolenaar 9097c5b3c03SBram Moolenaar 9107c5b3c03SBram Moolenaar 911006ad48bSBram Moolenaardef Test_throw_vimscript() 912f5be8cdbSBram Moolenaar # only checks line continuation 913cfcd011fSBram Moolenaar var lines =<< trim END 914006ad48bSBram Moolenaar vim9script 915006ad48bSBram Moolenaar try 916006ad48bSBram Moolenaar throw 'one' 917006ad48bSBram Moolenaar .. 'two' 918006ad48bSBram Moolenaar catch 919006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 920006ad48bSBram Moolenaar endtry 921006ad48bSBram Moolenaar END 922006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9231e021e63SBram Moolenaar 9241e021e63SBram Moolenaar lines =<< trim END 9251e021e63SBram Moolenaar vim9script 926352134bbSBram Moolenaar @r = '' 9271e021e63SBram Moolenaar def Func() 9281e021e63SBram Moolenaar throw @r 9291e021e63SBram Moolenaar enddef 9301e021e63SBram Moolenaar var result = '' 9311e021e63SBram Moolenaar try 9321e021e63SBram Moolenaar Func() 9331e021e63SBram Moolenaar catch /E1129:/ 9341e021e63SBram Moolenaar result = 'caught' 9351e021e63SBram Moolenaar endtry 9361e021e63SBram Moolenaar assert_equal('caught', result) 9371e021e63SBram Moolenaar END 9381e021e63SBram Moolenaar CheckScriptSuccess(lines) 939006ad48bSBram Moolenaarenddef 940006ad48bSBram Moolenaar 941ed677f55SBram Moolenaardef Test_error_in_nested_function() 94203dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 943cfcd011fSBram Moolenaar var lines =<< trim END 944ed677f55SBram Moolenaar vim9script 945ed677f55SBram Moolenaar def Func() 946ed677f55SBram Moolenaar Error() 947ed677f55SBram Moolenaar g:test_var = 1 948ed677f55SBram Moolenaar enddef 949ed677f55SBram Moolenaar func Error() abort 950ed677f55SBram Moolenaar eval [][0] 951ed677f55SBram Moolenaar endfunc 952ed677f55SBram Moolenaar Func() 953ed677f55SBram Moolenaar END 954ed677f55SBram Moolenaar g:test_var = 0 955ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 956ed677f55SBram Moolenaar assert_equal(0, g:test_var) 957ed677f55SBram Moolenaarenddef 958ed677f55SBram Moolenaar 959227c58a4SBram Moolenaardef Test_abort_after_error() 960227c58a4SBram Moolenaar var lines =<< trim END 961227c58a4SBram Moolenaar vim9script 962227c58a4SBram Moolenaar while true 963227c58a4SBram Moolenaar echo notfound 964227c58a4SBram Moolenaar endwhile 965227c58a4SBram Moolenaar g:gotthere = true 966227c58a4SBram Moolenaar END 967227c58a4SBram Moolenaar g:gotthere = false 968227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 969227c58a4SBram Moolenaar assert_false(g:gotthere) 970227c58a4SBram Moolenaar unlet g:gotthere 971227c58a4SBram Moolenaarenddef 972227c58a4SBram Moolenaar 97337c83711SBram Moolenaardef Test_cexpr_vimscript() 974f5be8cdbSBram Moolenaar # only checks line continuation 97537c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 976cfcd011fSBram Moolenaar var lines =<< trim END 97737c83711SBram Moolenaar vim9script 97837c83711SBram Moolenaar cexpr 'File' 97937c83711SBram Moolenaar .. ' someFile' .. 98037c83711SBram Moolenaar ' line 19' 98137c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 98237c83711SBram Moolenaar END 98337c83711SBram Moolenaar CheckScriptSuccess(lines) 98437c83711SBram Moolenaar set errorformat& 98537c83711SBram Moolenaarenddef 98637c83711SBram Moolenaar 987c9edd6b5SBram Moolenaardef Test_statusline_syntax() 988c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 989cfcd011fSBram Moolenaar var lines =<< trim END 990c9edd6b5SBram Moolenaar vim9script 991c9edd6b5SBram Moolenaar func g:Status() 992c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 993c9edd6b5SBram Moolenaar endfunc 994c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 995c9edd6b5SBram Moolenaar redrawstatus 996c9edd6b5SBram Moolenaar set laststatus statusline= 997c9edd6b5SBram Moolenaar END 998c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 999c9edd6b5SBram Moolenaarenddef 1000c9edd6b5SBram Moolenaar 1001b209750bSBram Moolenaardef Test_list_vimscript() 1002b209750bSBram Moolenaar # checks line continuation and comments 1003cfcd011fSBram Moolenaar var lines =<< trim END 1004b209750bSBram Moolenaar vim9script 1005cfcd011fSBram Moolenaar var mylist = [ 1006b209750bSBram Moolenaar 'one', 1007b209750bSBram Moolenaar # comment 1008b209750bSBram Moolenaar 'two', # empty line follows 1009b209750bSBram Moolenaar 1010b209750bSBram Moolenaar 'three', 1011b209750bSBram Moolenaar ] 1012b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1013b209750bSBram Moolenaar END 1014b209750bSBram Moolenaar CheckScriptSuccess(lines) 101566250c93SBram Moolenaar 101666250c93SBram Moolenaar # check all lines from heredoc are kept 101766250c93SBram Moolenaar lines =<< trim END 101866250c93SBram Moolenaar # comment 1 101966250c93SBram Moolenaar two 102066250c93SBram Moolenaar # comment 3 102166250c93SBram Moolenaar 102266250c93SBram Moolenaar five 102366250c93SBram Moolenaar # comment 6 102466250c93SBram Moolenaar END 102566250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10264bce26bbSBram Moolenaar 10274bce26bbSBram Moolenaar lines =<< trim END 10284bce26bbSBram Moolenaar [{ 10294bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10304bce26bbSBram Moolenaar END 10314bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1032b209750bSBram Moolenaarenddef 1033b209750bSBram Moolenaar 10342a1381c3SBram Moolenaarif has('channel') 103540ee466cSBram Moolenaar let someJob = test_null_job() 103640ee466cSBram Moolenaar 103740ee466cSBram Moolenaar def FuncWithError() 103840ee466cSBram Moolenaar echomsg g:someJob 103940ee466cSBram Moolenaar enddef 104040ee466cSBram Moolenaar 104140ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 104240ee466cSBram Moolenaar try 104340ee466cSBram Moolenaar call FuncWithError() 104440ee466cSBram Moolenaar catch 104540ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 104640ee466cSBram Moolenaar endtry 104740ee466cSBram Moolenaar endfunc 10482a1381c3SBram Moolenaarendif 104940ee466cSBram Moolenaar 10508a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10518a7d6542SBram Moolenaar vim9script 1052cfcd011fSBram Moolenaar var name: string = 'bob' 10538a7d6542SBram Moolenaar def Concat(arg: string): string 10548a7d6542SBram Moolenaar return name .. arg 10558a7d6542SBram Moolenaar enddef 1056227a69deSBram Moolenaar g:result = Concat('bie') 1057227a69deSBram Moolenaar g:localname = name 10588a7d6542SBram Moolenaar 10598a7d6542SBram Moolenaar export const CONST = 1234 1060cfcd011fSBram Moolenaar export var exported = 9876 1061cfcd011fSBram Moolenaar export var exp_name = 'John' 10628a7d6542SBram Moolenaar export def Exported(): string 10638a7d6542SBram Moolenaar return 'Exported' 10648a7d6542SBram Moolenaar enddef 10650f2a5cc6SBram Moolenaar export final theList = [1] 10668a7d6542SBram MoolenaarEND 10678a7d6542SBram Moolenaar 1068b3ca9824SBram Moolenaardef Undo_export_script_lines() 1069b3ca9824SBram Moolenaar unlet g:result 1070b3ca9824SBram Moolenaar unlet g:localname 1071b3ca9824SBram Moolenaarenddef 1072b3ca9824SBram Moolenaar 10735269bd2aSBram Moolenaardef Test_vim9_import_export() 1074cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10758a7d6542SBram Moolenaar vim9script 10768a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10778a7d6542SBram Moolenaar g:imported = exported 10786e587dcbSBram Moolenaar exported += 3 10796e587dcbSBram Moolenaar g:imported_added = exported 10808a7d6542SBram Moolenaar g:imported_func = Exported() 10816e587dcbSBram Moolenaar 108240f4f7a4SBram Moolenaar def GetExported(): string 1083e0de171eSBram Moolenaar var local_dict = {ref: Exported} 108440f4f7a4SBram Moolenaar return local_dict.ref() 108540f4f7a4SBram Moolenaar enddef 108640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 108740f4f7a4SBram Moolenaar 10886e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10896e587dcbSBram Moolenaar g:imported_name = exp_name 10906e587dcbSBram Moolenaar exp_name ..= ' Doe' 10916e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10925381c7a1SBram Moolenaar g:imported_later = exported 10930f2a5cc6SBram Moolenaar 10940f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 10950f2a5cc6SBram Moolenaar theList->add(2) 10960f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 10978a7d6542SBram Moolenaar END 10988a7d6542SBram Moolenaar 10998a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11008a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11018a7d6542SBram Moolenaar 11028a7d6542SBram Moolenaar source Ximport.vim 11038a7d6542SBram Moolenaar 11048a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11058a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11068a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11076e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11085381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11098a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 111040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11116e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11126e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11138a7d6542SBram Moolenaar assert_false(exists('g:name')) 11148a7d6542SBram Moolenaar 1115b3ca9824SBram Moolenaar Undo_export_script_lines() 11168a7d6542SBram Moolenaar unlet g:imported 11176e587dcbSBram Moolenaar unlet g:imported_added 11185381c7a1SBram Moolenaar unlet g:imported_later 11198a7d6542SBram Moolenaar unlet g:imported_func 11206e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11218a7d6542SBram Moolenaar delete('Ximport.vim') 1122f2d5c240SBram Moolenaar 11231c991144SBram Moolenaar # similar, with line breaks 1124cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11251c991144SBram Moolenaar vim9script 11261c991144SBram Moolenaar import { 11271c991144SBram Moolenaar exported, 11281c991144SBram Moolenaar Exported, 11291c991144SBram Moolenaar } 11301c991144SBram Moolenaar from 11311c991144SBram Moolenaar './Xexport.vim' 11321c991144SBram Moolenaar g:imported = exported 11331c991144SBram Moolenaar exported += 5 11341c991144SBram Moolenaar g:imported_added = exported 11351c991144SBram Moolenaar g:imported_func = Exported() 11361c991144SBram Moolenaar END 11371c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11381c991144SBram Moolenaar source Ximport_lbr.vim 11391c991144SBram Moolenaar 11401c991144SBram Moolenaar assert_equal(9876, g:imported) 11411c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11421c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11431c991144SBram Moolenaar 11441c991144SBram Moolenaar # exported script not sourced again 11451c991144SBram Moolenaar assert_false(exists('g:result')) 11461c991144SBram Moolenaar unlet g:imported 11471c991144SBram Moolenaar unlet g:imported_added 11481c991144SBram Moolenaar unlet g:imported_func 11491c991144SBram Moolenaar delete('Ximport_lbr.vim') 11501c991144SBram Moolenaar 11511c991144SBram Moolenaar # import inside :def function 1152cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 11535381c7a1SBram Moolenaar vim9script 11545381c7a1SBram Moolenaar def ImportInDef() 11555381c7a1SBram Moolenaar import exported from './Xexport.vim' 11565381c7a1SBram Moolenaar g:imported = exported 11575381c7a1SBram Moolenaar exported += 7 11585381c7a1SBram Moolenaar g:imported_added = exported 11595381c7a1SBram Moolenaar enddef 11605381c7a1SBram Moolenaar ImportInDef() 11615381c7a1SBram Moolenaar END 11625381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11635381c7a1SBram Moolenaar source Ximport2.vim 1164f5be8cdbSBram Moolenaar # TODO: this should be 9879 11655381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11665381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11675381c7a1SBram Moolenaar unlet g:imported 11685381c7a1SBram Moolenaar unlet g:imported_added 11695381c7a1SBram Moolenaar delete('Ximport2.vim') 11705381c7a1SBram Moolenaar 1171cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1172f2d5c240SBram Moolenaar vim9script 1173f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1174f2d5c240SBram Moolenaar def UseExport() 1175cb4e80faSBram Moolenaar g:imported_def = Export.exported 1176f2d5c240SBram Moolenaar enddef 1177cb4e80faSBram Moolenaar g:imported_script = Export.exported 1178cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1179cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1180f2d5c240SBram Moolenaar UseExport() 1181f2d5c240SBram Moolenaar END 1182f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1183f2d5c240SBram Moolenaar source Ximport.vim 1184cb4e80faSBram Moolenaar assert_equal(9883, g:imported_def) 1185cb4e80faSBram Moolenaar assert_equal(9883, g:imported_script) 1186f2d5c240SBram Moolenaar 1187cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1188599c89c8SBram Moolenaar vim9script 1189599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1190599c89c8SBram Moolenaar def Func() 1191cfcd011fSBram Moolenaar var dummy = 1 1192cfcd011fSBram Moolenaar var imported = Export + dummy 1193599c89c8SBram Moolenaar enddef 1194822ba247SBram Moolenaar defcompile 1195599c89c8SBram Moolenaar END 1196599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 119744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1198599c89c8SBram Moolenaar 1199cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1200599c89c8SBram Moolenaar vim9script 1201599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1202599c89c8SBram Moolenaar def Func() 1203cfcd011fSBram Moolenaar var imported = Export . exported 1204599c89c8SBram Moolenaar enddef 1205822ba247SBram Moolenaar defcompile 1206599c89c8SBram Moolenaar END 1207599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 120844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1209599c89c8SBram Moolenaar 1210a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1211a6294955SBram Moolenaar vim9script 1212a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1213a6294955SBram Moolenaar var some = 'other' 1214a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1215a6294955SBram Moolenaar defcompile 1216a6294955SBram Moolenaar END 1217a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1218a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1219a6294955SBram Moolenaar 1220cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1221cb4e80faSBram Moolenaar vim9script 1222cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1223cb4e80faSBram Moolenaar g:imported_script = Export exported 1224cb4e80faSBram Moolenaar END 1225cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1226cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1227cb4e80faSBram Moolenaar 1228cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1229cb4e80faSBram Moolenaar vim9script 1230cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1231cb4e80faSBram Moolenaar g:imported_script = Export. exported 1232cb4e80faSBram Moolenaar END 1233cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1234cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1235cb4e80faSBram Moolenaar 1236cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1237599c89c8SBram Moolenaar vim9script 1238599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1239599c89c8SBram Moolenaar def Func() 1240cfcd011fSBram Moolenaar var imported = Export. 1241599c89c8SBram Moolenaar enddef 1242822ba247SBram Moolenaar defcompile 1243599c89c8SBram Moolenaar END 1244599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 124544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1246599c89c8SBram Moolenaar 1247cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12481c991144SBram Moolenaar vim9script 12491c991144SBram Moolenaar import * 12501c991144SBram Moolenaar as Export 12511c991144SBram Moolenaar from 12521c991144SBram Moolenaar './Xexport.vim' 12531c991144SBram Moolenaar def UseExport() 12541c991144SBram Moolenaar g:imported = Export.exported 12551c991144SBram Moolenaar enddef 12561c991144SBram Moolenaar UseExport() 12571c991144SBram Moolenaar END 12581c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12591c991144SBram Moolenaar source Ximport.vim 12601c991144SBram Moolenaar assert_equal(9883, g:imported) 12611c991144SBram Moolenaar 1262cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1263f2d5c240SBram Moolenaar vim9script 1264f2d5c240SBram Moolenaar import * from './Xexport.vim' 1265f2d5c240SBram Moolenaar END 1266f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 126744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1268f2d5c240SBram Moolenaar 1269f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1270cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1271fa29c8abSBram Moolenaar vim9script 1272fa29c8abSBram Moolenaar import name from './Xexport.vim' 1273fa29c8abSBram Moolenaar END 1274fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 127544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1276fa29c8abSBram Moolenaar 1277f5be8cdbSBram Moolenaar # try to import something that is already defined 1278cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12795269bd2aSBram Moolenaar vim9script 1280cfcd011fSBram Moolenaar var exported = 'something' 12815269bd2aSBram Moolenaar import exported from './Xexport.vim' 12825269bd2aSBram Moolenaar END 12835269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1284057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12855269bd2aSBram Moolenaar 1286f5be8cdbSBram Moolenaar # try to import something that is already defined 12875269bd2aSBram Moolenaar import_already_defined =<< trim END 12885269bd2aSBram Moolenaar vim9script 1289cfcd011fSBram Moolenaar var exported = 'something' 12905269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12915269bd2aSBram Moolenaar END 12925269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1293057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 12945269bd2aSBram Moolenaar 1295f5be8cdbSBram Moolenaar # try to import something that is already defined 12965269bd2aSBram Moolenaar import_already_defined =<< trim END 12975269bd2aSBram Moolenaar vim9script 1298cfcd011fSBram Moolenaar var exported = 'something' 12995269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13005269bd2aSBram Moolenaar END 13015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1302057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13035269bd2aSBram Moolenaar 1304918a4249SBram Moolenaar # try changing an imported const 1305918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1306918a4249SBram Moolenaar vim9script 1307918a4249SBram Moolenaar import CONST from './Xexport.vim' 1308918a4249SBram Moolenaar def Assign() 1309918a4249SBram Moolenaar CONST = 987 1310918a4249SBram Moolenaar enddef 1311918a4249SBram Moolenaar defcompile 1312918a4249SBram Moolenaar END 1313918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1314918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1315918a4249SBram Moolenaar 13160f2a5cc6SBram Moolenaar # try changing an imported final 13170f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13180f2a5cc6SBram Moolenaar vim9script 13190f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13200f2a5cc6SBram Moolenaar def Assign() 13210f2a5cc6SBram Moolenaar theList = [2] 13220f2a5cc6SBram Moolenaar enddef 13230f2a5cc6SBram Moolenaar defcompile 13240f2a5cc6SBram Moolenaar END 13250f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13260f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13270f2a5cc6SBram Moolenaar 1328f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1329cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1330fa29c8abSBram Moolenaar vim9script 1331fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1332fa29c8abSBram Moolenaar END 1333fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 133444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1335fa29c8abSBram Moolenaar 1336cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1337fa29c8abSBram Moolenaar vim9script 1338fa29c8abSBram Moolenaar import name './Xexport.vim' 1339fa29c8abSBram Moolenaar END 1340fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 134144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1342fa29c8abSBram Moolenaar 1343cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1344fa29c8abSBram Moolenaar vim9script 1345fa29c8abSBram Moolenaar import name from Xexport.vim 1346fa29c8abSBram Moolenaar END 1347fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 134844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1349fa29c8abSBram Moolenaar 1350cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1351fa29c8abSBram Moolenaar vim9script 1352fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1353fa29c8abSBram Moolenaar END 1354fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 135544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1356fa29c8abSBram Moolenaar 1357cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1358fa29c8abSBram Moolenaar vim9script 1359fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1360fa29c8abSBram Moolenaar END 13615269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 136244d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1363fa29c8abSBram Moolenaar 1364f2d5c240SBram Moolenaar delete('Ximport.vim') 13655269bd2aSBram Moolenaar delete('Ximport3.vim') 13668a7d6542SBram Moolenaar delete('Xexport.vim') 13678a7d6542SBram Moolenaar 1368f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 13693e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 13703e191694SBram Moolenaar set cpo=abcd 1371cfcd011fSBram Moolenaar var lines =<< trim END 1372750802b5SBram Moolenaar vim9script 1373750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 13743e191694SBram Moolenaar set cpo+=f 13753e191694SBram Moolenaar set cpo-=c 13763e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1377750802b5SBram Moolenaar END 1378750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1379750802b5SBram Moolenaar source Xvim9_script 13803e191694SBram Moolenaar assert_equal('fabd', &cpo) 1381750802b5SBram Moolenaar set cpo&vim 1382750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 13833e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 13843e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 13853e191694SBram Moolenaar 1386750802b5SBram Moolenaar delete('Xvim9_script') 1387750802b5SBram Moolenaarenddef 1388750802b5SBram Moolenaar 13890a84284eSBram Moolenaardef Test_import_as() 13900a84284eSBram Moolenaar var export_lines =<< trim END 13910a84284eSBram Moolenaar vim9script 13920a84284eSBram Moolenaar export var one = 1 13930a84284eSBram Moolenaar export var yes = 'yes' 1394c967d57aSBram Moolenaar export var slist: list<string> 13950a84284eSBram Moolenaar END 13960a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 13970a84284eSBram Moolenaar 13980a84284eSBram Moolenaar var import_lines =<< trim END 13990a84284eSBram Moolenaar vim9script 14006c7cc347SBram Moolenaar var one = 'notused' 14016c7cc347SBram Moolenaar var yes = 777 14020a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14030a84284eSBram Moolenaar assert_equal(1, thatOne) 14040a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14050a84284eSBram Moolenaar assert_equal('yes', yesYes) 14060a84284eSBram Moolenaar END 14070a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14080a84284eSBram Moolenaar 14090a84284eSBram Moolenaar import_lines =<< trim END 14100a84284eSBram Moolenaar vim9script 14110a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14120a84284eSBram Moolenaar assert_equal(1, thatOne) 14130a84284eSBram Moolenaar assert_equal('yes', yesYes) 14140a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14150a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14160a84284eSBram Moolenaar END 14170a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14180a84284eSBram Moolenaar 1419c967d57aSBram Moolenaar import_lines =<< trim END 1420c967d57aSBram Moolenaar vim9script 1421c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1422c967d57aSBram Moolenaar impSlist->add(123) 1423c967d57aSBram Moolenaar END 1424c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1425c967d57aSBram Moolenaar 14260a84284eSBram Moolenaar delete('XexportAs') 14270a84284eSBram Moolenaarenddef 14280a84284eSBram Moolenaar 1429803af686SBram Moolenaarfunc g:Trigger() 1430803af686SBram Moolenaar source Ximport.vim 1431803af686SBram Moolenaar return "echo 'yes'\<CR>" 1432803af686SBram Moolenaarendfunc 1433803af686SBram Moolenaar 1434803af686SBram Moolenaardef Test_import_export_expr_map() 1435803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1436cfcd011fSBram Moolenaar var export_lines =<< trim END 1437803af686SBram Moolenaar vim9script 1438803af686SBram Moolenaar export def That(): string 1439803af686SBram Moolenaar return 'yes' 1440803af686SBram Moolenaar enddef 1441803af686SBram Moolenaar END 1442803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1443803af686SBram Moolenaar 1444cfcd011fSBram Moolenaar var import_lines =<< trim END 1445803af686SBram Moolenaar vim9script 1446803af686SBram Moolenaar import That from './Xexport_that.vim' 1447803af686SBram Moolenaar assert_equal('yes', That()) 1448803af686SBram Moolenaar END 1449803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1450803af686SBram Moolenaar 1451803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1452803af686SBram Moolenaar feedkeys('trigger', "xt") 1453803af686SBram Moolenaar 1454730b2483SBram Moolenaar delete('Xexport_that.vim') 1455803af686SBram Moolenaar delete('Ximport.vim') 1456803af686SBram Moolenaar nunmap trigger 1457803af686SBram Moolenaarenddef 1458803af686SBram Moolenaar 14598e1986e3SBram Moolenaardef Test_import_in_filetype() 14608e1986e3SBram Moolenaar # check that :import works when the buffer is locked 14618e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1462cfcd011fSBram Moolenaar var export_lines =<< trim END 14638e1986e3SBram Moolenaar vim9script 1464cfcd011fSBram Moolenaar export var That = 'yes' 14658e1986e3SBram Moolenaar END 1466730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 14678e1986e3SBram Moolenaar 1468cfcd011fSBram Moolenaar var import_lines =<< trim END 14698e1986e3SBram Moolenaar vim9script 1470730b2483SBram Moolenaar import That from './Xexport_ft.vim' 14718e1986e3SBram Moolenaar assert_equal('yes', That) 14728e1986e3SBram Moolenaar g:did_load_mytpe = 1 14738e1986e3SBram Moolenaar END 14748e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 14758e1986e3SBram Moolenaar 1476cfcd011fSBram Moolenaar var save_rtp = &rtp 14778e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 14788e1986e3SBram Moolenaar 14798e1986e3SBram Moolenaar filetype plugin on 14808e1986e3SBram Moolenaar copen 14818e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 14828e1986e3SBram Moolenaar 14838e1986e3SBram Moolenaar quit! 1484730b2483SBram Moolenaar delete('Xexport_ft.vim') 14858e1986e3SBram Moolenaar delete('ftplugin', 'rf') 14868e1986e3SBram Moolenaar &rtp = save_rtp 14878e1986e3SBram Moolenaarenddef 14888e1986e3SBram Moolenaar 1489efa94447SBram Moolenaardef Test_use_import_in_mapping() 1490cfcd011fSBram Moolenaar var lines =<< trim END 1491efa94447SBram Moolenaar vim9script 1492efa94447SBram Moolenaar export def Funcx() 1493efa94447SBram Moolenaar g:result = 42 1494efa94447SBram Moolenaar enddef 1495efa94447SBram Moolenaar END 1496efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1497efa94447SBram Moolenaar lines =<< trim END 1498efa94447SBram Moolenaar vim9script 1499efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1500b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1501efa94447SBram Moolenaar END 1502efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1503efa94447SBram Moolenaar 1504efa94447SBram Moolenaar source Xmapscript.vim 1505b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1506efa94447SBram Moolenaar assert_equal(42, g:result) 1507efa94447SBram Moolenaar 1508efa94447SBram Moolenaar unlet g:result 1509efa94447SBram Moolenaar delete('XsomeExport.vim') 1510efa94447SBram Moolenaar delete('Xmapscript.vim') 1511b3ca9824SBram Moolenaar nunmap <F3> 1512efa94447SBram Moolenaarenddef 1513efa94447SBram Moolenaar 1514d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1515d3f8a9eeSBram Moolenaar var lines =<< trim END 1516d3f8a9eeSBram Moolenaar if has(g:feature) 1517d3f8a9eeSBram Moolenaar " legacy script 1518d3f8a9eeSBram Moolenaar let g:legacy = 1 1519d3f8a9eeSBram Moolenaar finish 1520d3f8a9eeSBram Moolenaar endif 1521d3f8a9eeSBram Moolenaar vim9script 1522d3f8a9eeSBram Moolenaar g:legacy = 0 1523d3f8a9eeSBram Moolenaar END 1524d3f8a9eeSBram Moolenaar g:feature = 'eval' 1525d3f8a9eeSBram Moolenaar g:legacy = -1 1526d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1527d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1528d3f8a9eeSBram Moolenaar 1529d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1530d3f8a9eeSBram Moolenaar g:legacy = -1 1531d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1532d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1533d3f8a9eeSBram Moolenaarenddef 1534d3f8a9eeSBram Moolenaar 1535750802b5SBram Moolenaardef Test_vim9script_fails() 15368a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15378a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1538cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15399721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1540cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1541750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1542750802b5SBram Moolenaar 1543cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1544c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1545c785b9a7SBram Moolenaar 1546e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1547e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15488a7d6542SBram Moolenaarenddef 15498a7d6542SBram Moolenaar 1550f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1551101f4810SBram Moolenaar CheckRunVimInTerminal 1552101f4810SBram Moolenaar 15539bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1554c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15559bb3eb3eSBram Moolenaarendfunc 15569bb3eb3eSBram Moolenaar 1557c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1558cfcd011fSBram Moolenaar var export =<< trim END 1559101f4810SBram Moolenaar vim9script 1560101f4810SBram Moolenaar export def Foo(): number 1561101f4810SBram Moolenaar return 0 1562101f4810SBram Moolenaar enddef 1563101f4810SBram Moolenaar END 1564730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1565101f4810SBram Moolenaar 1566e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 15679bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 15682949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1569101f4810SBram Moolenaar 1570730b2483SBram Moolenaar delete('XexportCmd.vim') 15719bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 15729bb3eb3eSBram Moolenaarenddef 1573101f4810SBram Moolenaar 15742b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 15752b32700dSBram Moolenaar var lines =<< trim END 1576a6294955SBram Moolenaar vim9script 1577a6294955SBram Moolenaar export var exported = 'thexport' 1578a6294955SBram Moolenaar END 1579a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1580a6294955SBram Moolenaar lines =<< trim END 15812b32700dSBram Moolenaar vim9script noclear 15822b32700dSBram Moolenaar g:loadCount += 1 15832b32700dSBram Moolenaar var s:reloaded = 'init' 1584a6294955SBram Moolenaar import exported from './XExportReload' 15852b32700dSBram Moolenaar 15862b32700dSBram Moolenaar def Again(): string 15872b32700dSBram Moolenaar return 'again' 15882b32700dSBram Moolenaar enddef 15892b32700dSBram Moolenaar 15902b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 15912b32700dSBram Moolenaar var s:loaded = true 15922b32700dSBram Moolenaar 15932b32700dSBram Moolenaar var s:notReloaded = 'yes' 15942b32700dSBram Moolenaar s:reloaded = 'first' 15952b32700dSBram Moolenaar def g:Values(): list<string> 1596a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 15972b32700dSBram Moolenaar enddef 15982b32700dSBram Moolenaar 15992b32700dSBram Moolenaar def Once(): string 16002b32700dSBram Moolenaar return 'once' 16012b32700dSBram Moolenaar enddef 16022b32700dSBram Moolenaar END 16032b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16042b32700dSBram Moolenaar g:loadCount = 0 16052b32700dSBram Moolenaar source XReloaded 16062b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1607a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16082b32700dSBram Moolenaar source XReloaded 16092b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1610a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16112b32700dSBram Moolenaar source XReloaded 16122b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1613a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16142b32700dSBram Moolenaar 161548e11c10SBram Moolenaar delete('XReloaded') 1616a6294955SBram Moolenaar delete('XExportReload') 16172b32700dSBram Moolenaar delfunc g:Values 16182b32700dSBram Moolenaar unlet g:loadCount 1619577dc93dSBram Moolenaar 1620577dc93dSBram Moolenaar lines =<< trim END 1621577dc93dSBram Moolenaar vim9script 1622577dc93dSBram Moolenaar def Inner() 1623577dc93dSBram Moolenaar enddef 1624577dc93dSBram Moolenaar END 1625577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1626577dc93dSBram Moolenaar source XreloadScript.vim 1627577dc93dSBram Moolenaar 1628577dc93dSBram Moolenaar lines =<< trim END 1629577dc93dSBram Moolenaar vim9script 1630577dc93dSBram Moolenaar def Outer() 1631577dc93dSBram Moolenaar def Inner() 1632577dc93dSBram Moolenaar enddef 1633577dc93dSBram Moolenaar enddef 1634577dc93dSBram Moolenaar defcompile 1635577dc93dSBram Moolenaar END 1636577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1637577dc93dSBram Moolenaar source XreloadScript.vim 1638577dc93dSBram Moolenaar 1639577dc93dSBram Moolenaar delete('XreloadScript.vim') 16402b32700dSBram Moolenaarenddef 16412b32700dSBram Moolenaar 16424c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1643cfcd011fSBram Moolenaar var lines =<< trim END 16448a7d6542SBram Moolenaar vim9script 16458a7d6542SBram Moolenaar const var = '' 1646cfcd011fSBram Moolenaar var valone = 1234 16478a7d6542SBram Moolenaar def MyFunc(arg: string) 16488a7d6542SBram Moolenaar valone = 5678 16498a7d6542SBram Moolenaar enddef 16508a7d6542SBram Moolenaar END 1651cfcd011fSBram Moolenaar var morelines =<< trim END 1652cfcd011fSBram Moolenaar var valtwo = 222 16538a7d6542SBram Moolenaar export def GetValtwo(): number 16548a7d6542SBram Moolenaar return valtwo 16558a7d6542SBram Moolenaar enddef 16568a7d6542SBram Moolenaar END 165703afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16588a7d6542SBram Moolenaar source Xreload.vim 16598a7d6542SBram Moolenaar source Xreload.vim 16608a7d6542SBram Moolenaar source Xreload.vim 16618a7d6542SBram Moolenaar 1662cfcd011fSBram Moolenaar var testlines =<< trim END 16638a7d6542SBram Moolenaar vim9script 16648a7d6542SBram Moolenaar def TheFunc() 16658a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 16668a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 16678a7d6542SBram Moolenaar enddef 16688a7d6542SBram Moolenaar TheFunc() 16698a7d6542SBram Moolenaar END 16708a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 16718a7d6542SBram Moolenaar source Ximport.vim 16728a7d6542SBram Moolenaar 1673f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1674f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 16758a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 16768a7d6542SBram Moolenaar source Ximport.vim 16778a7d6542SBram Moolenaar 1678f5be8cdbSBram Moolenaar # cannot declare a var twice 16798a7d6542SBram Moolenaar lines =<< trim END 16808a7d6542SBram Moolenaar vim9script 1681cfcd011fSBram Moolenaar var valone = 1234 1682cfcd011fSBram Moolenaar var valone = 5678 16838a7d6542SBram Moolenaar END 16848a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 168544d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 16868a7d6542SBram Moolenaar 16878a7d6542SBram Moolenaar delete('Xreload.vim') 16888a7d6542SBram Moolenaar delete('Ximport.vim') 16898a7d6542SBram Moolenaarenddef 16908a7d6542SBram Moolenaar 169107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 169207a65d26SBram Moolenaar" compiled function using that variable must fail. 169307a65d26SBram Moolenaardef Test_script_reload_change_type() 169407a65d26SBram Moolenaar var lines =<< trim END 169507a65d26SBram Moolenaar vim9script noclear 169607a65d26SBram Moolenaar var str = 'string' 169707a65d26SBram Moolenaar def g:GetStr(): string 169807a65d26SBram Moolenaar return str .. 'xxx' 169907a65d26SBram Moolenaar enddef 170007a65d26SBram Moolenaar END 170107a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 170207a65d26SBram Moolenaar source Xreload.vim 170307a65d26SBram Moolenaar echo g:GetStr() 170407a65d26SBram Moolenaar 170507a65d26SBram Moolenaar lines =<< trim END 170607a65d26SBram Moolenaar vim9script noclear 170707a65d26SBram Moolenaar var str = 1234 170807a65d26SBram Moolenaar END 170907a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 171007a65d26SBram Moolenaar source Xreload.vim 171107a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 171207a65d26SBram Moolenaar 171307a65d26SBram Moolenaar delfunc g:GetStr 171407a65d26SBram Moolenaar delete('Xreload.vim') 171507a65d26SBram Moolenaarenddef 171607a65d26SBram Moolenaar 1717c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1718c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1719c970e422SBram Moolenaar 1720c970e422SBram Moolenaardef Test_script_reload_from_function() 1721c970e422SBram Moolenaar var lines =<< trim END 1722c970e422SBram Moolenaar vim9script 1723c970e422SBram Moolenaar 1724c970e422SBram Moolenaar if exists('g:loaded') 1725c970e422SBram Moolenaar finish 1726c970e422SBram Moolenaar endif 1727c970e422SBram Moolenaar g:loaded = 1 1728c970e422SBram Moolenaar delcommand CallFunc 1729c970e422SBram Moolenaar command CallFunc Func() 1730c970e422SBram Moolenaar def Func() 1731a4c81beaSBram Moolenaar so XreloadFunc.vim 1732c970e422SBram Moolenaar g:didTheFunc = 1 1733c970e422SBram Moolenaar enddef 1734c970e422SBram Moolenaar END 1735c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1736c970e422SBram Moolenaar source XreloadFunc.vim 1737c970e422SBram Moolenaar CallFunc 1738c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1739c970e422SBram Moolenaar 1740c970e422SBram Moolenaar delete('XreloadFunc.vim') 1741c970e422SBram Moolenaar delcommand CallFunc 1742c970e422SBram Moolenaar unlet g:loaded 1743c970e422SBram Moolenaar unlet g:didTheFunc 1744c970e422SBram Moolenaarenddef 1745c970e422SBram Moolenaar 17466c3843caSBram Moolenaardef Test_script_var_shadows_function() 17476c3843caSBram Moolenaar var lines =<< trim END 17486c3843caSBram Moolenaar vim9script 17496c3843caSBram Moolenaar def Func(): number 17506c3843caSBram Moolenaar return 123 17516c3843caSBram Moolenaar enddef 17526c3843caSBram Moolenaar var Func = 1 17536c3843caSBram Moolenaar END 17546c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17556c3843caSBram Moolenaarenddef 17566c3843caSBram Moolenaar 1757c323527dSBram Moolenaardef Test_script_var_shadows_command() 1758c323527dSBram Moolenaar var lines =<< trim END 1759c323527dSBram Moolenaar var undo = 1 1760c323527dSBram Moolenaar undo = 2 1761c323527dSBram Moolenaar assert_equal(2, undo) 1762c323527dSBram Moolenaar END 1763c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1764c323527dSBram Moolenaar 1765c323527dSBram Moolenaar lines =<< trim END 1766c323527dSBram Moolenaar var undo = 1 1767c323527dSBram Moolenaar undo 1768c323527dSBram Moolenaar END 1769c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1770c323527dSBram Moolenaarenddef 1771c323527dSBram Moolenaar 177295006e3dSBram Moolenaardef s:RetSome(): string 177395006e3dSBram Moolenaar return 'some' 177495006e3dSBram Moolenaarenddef 177595006e3dSBram Moolenaar 1776fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1777fe465a01SBram Moolenaar" script-local name. 1778fe465a01SBram Moolenaardef Test_vim9script_funcref() 1779cfcd011fSBram Moolenaar var sortlines =<< trim END 1780fe465a01SBram Moolenaar vim9script 1781fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1782bed36b93SBram Moolenaar return i2 - i1 1783fe465a01SBram Moolenaar enddef 1784fe465a01SBram Moolenaar 1785fe465a01SBram Moolenaar export def FastSort(): list<number> 1786fe465a01SBram Moolenaar return range(5)->sort(Compare) 1787fe465a01SBram Moolenaar enddef 1788529fb5a5SBram Moolenaar 1789529fb5a5SBram Moolenaar export def GetString(arg: string): string 1790529fb5a5SBram Moolenaar return arg 1791529fb5a5SBram Moolenaar enddef 1792fe465a01SBram Moolenaar END 1793fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1794fe465a01SBram Moolenaar 1795cfcd011fSBram Moolenaar var lines =<< trim END 1796fe465a01SBram Moolenaar vim9script 1797fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1798fe465a01SBram Moolenaar def Test() 1799fe465a01SBram Moolenaar g:result = FastSort() 1800fe465a01SBram Moolenaar enddef 1801fe465a01SBram Moolenaar Test() 1802529fb5a5SBram Moolenaar 1803529fb5a5SBram Moolenaar # using a function imported with "as" 1804529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1805529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1806529fb5a5SBram Moolenaar 1807529fb5a5SBram Moolenaar # using the function from a compiled function 1808529fb5a5SBram Moolenaar def TestMore(): string 1809ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1810ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1811529fb5a5SBram Moolenaar enddef 1812ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1813529fb5a5SBram Moolenaar 1814529fb5a5SBram Moolenaar # error when using a function that isn't exported 1815529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1816fe465a01SBram Moolenaar END 1817fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1818fe465a01SBram Moolenaar 1819fe465a01SBram Moolenaar source Xscript.vim 1820fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1821fe465a01SBram Moolenaar 1822fe465a01SBram Moolenaar unlet g:result 1823fe465a01SBram Moolenaar delete('Xsort.vim') 1824fe465a01SBram Moolenaar delete('Xscript.vim') 182595006e3dSBram Moolenaar 1826cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 182795006e3dSBram Moolenaar assert_equal('some', Funcref()) 1828fe465a01SBram Moolenaarenddef 1829fe465a01SBram Moolenaar 1830601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1831601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1832601e76acSBram Moolenaar" function reference. 1833c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1834cfcd011fSBram Moolenaar var filterLines =<< trim END 1835c620c055SBram Moolenaar vim9script 1836c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1837c620c055SBram Moolenaar return idx % 2 == 1 1838c620c055SBram Moolenaar enddef 1839c620c055SBram Moolenaar export def FastFilter(): list<number> 1840c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1841c620c055SBram Moolenaar enddef 1842601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1843601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1844601e76acSBram Moolenaar enddef 1845c620c055SBram Moolenaar END 1846c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1847c620c055SBram Moolenaar 1848cfcd011fSBram Moolenaar var lines =<< trim END 1849c620c055SBram Moolenaar vim9script 1850601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1851c620c055SBram Moolenaar def Test() 1852cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1853c620c055SBram Moolenaar enddef 1854c620c055SBram Moolenaar Test() 1855601e76acSBram Moolenaar def TestDirect() 1856cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1857601e76acSBram Moolenaar enddef 1858601e76acSBram Moolenaar TestDirect() 1859c620c055SBram Moolenaar END 1860601e76acSBram Moolenaar CheckScriptSuccess(lines) 1861c620c055SBram Moolenaar delete('Xfilter.vim') 1862c620c055SBram Moolenaarenddef 1863c620c055SBram Moolenaar 18644c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1865cfcd011fSBram Moolenaar var first_lines =<< trim END 18664c17ad94SBram Moolenaar vim9script 18674c17ad94SBram Moolenaar def FuncYes(): string 18684c17ad94SBram Moolenaar return 'yes' 18694c17ad94SBram Moolenaar enddef 18704c17ad94SBram Moolenaar END 1871cfcd011fSBram Moolenaar var withno_lines =<< trim END 18724c17ad94SBram Moolenaar def FuncNo(): string 18734c17ad94SBram Moolenaar return 'no' 18744c17ad94SBram Moolenaar enddef 18754c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 18764c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 18774c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 187803afdcf1SBram Moolenaar enddef 187903afdcf1SBram Moolenaar END 1880cfcd011fSBram Moolenaar var nono_lines =<< trim END 188103afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 188203afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 188344d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 18844c17ad94SBram Moolenaar enddef 18854c17ad94SBram Moolenaar END 18864c17ad94SBram Moolenaar 18874c17ad94SBram Moolenaar # FuncNo() is defined 188803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18894c17ad94SBram Moolenaar source Xreloaded.vim 18904c17ad94SBram Moolenaar g:DoCheck(true) 18914c17ad94SBram Moolenaar 18924c17ad94SBram Moolenaar # FuncNo() is not redefined 189303afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 18944c17ad94SBram Moolenaar source Xreloaded.vim 18955082471fSBram Moolenaar g:DoCheck(false) 18964c17ad94SBram Moolenaar 18974c17ad94SBram Moolenaar # FuncNo() is back 189803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 18994c17ad94SBram Moolenaar source Xreloaded.vim 19005082471fSBram Moolenaar g:DoCheck(false) 19014c17ad94SBram Moolenaar 19024c17ad94SBram Moolenaar delete('Xreloaded.vim') 19034c17ad94SBram Moolenaarenddef 19044c17ad94SBram Moolenaar 190589483d40SBram Moolenaardef Test_vim9script_reload_delvar() 190689483d40SBram Moolenaar # write the script with a script-local variable 1907cfcd011fSBram Moolenaar var lines =<< trim END 190889483d40SBram Moolenaar vim9script 1909cfcd011fSBram Moolenaar var name = 'string' 191089483d40SBram Moolenaar END 191189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 191289483d40SBram Moolenaar source XreloadVar.vim 191389483d40SBram Moolenaar 191489483d40SBram Moolenaar # now write the script using the same variable locally - works 191589483d40SBram Moolenaar lines =<< trim END 191689483d40SBram Moolenaar vim9script 191789483d40SBram Moolenaar def Func() 1918cfcd011fSBram Moolenaar var name = 'string' 191989483d40SBram Moolenaar enddef 192089483d40SBram Moolenaar END 192189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 192289483d40SBram Moolenaar source XreloadVar.vim 192389483d40SBram Moolenaar 192489483d40SBram Moolenaar delete('XreloadVar.vim') 192589483d40SBram Moolenaarenddef 192689483d40SBram Moolenaar 19278a7d6542SBram Moolenaardef Test_import_absolute() 1928cfcd011fSBram Moolenaar var import_lines = [ 1929e6085c53SBram Moolenaar 'vim9script', 1930e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1931e6085c53SBram Moolenaar 'def UseExported()', 1932e6085c53SBram Moolenaar ' g:imported_abs = exported', 1933e6085c53SBram Moolenaar ' exported = 8888', 1934e6085c53SBram Moolenaar ' g:imported_after = exported', 1935e6085c53SBram Moolenaar 'enddef', 1936e6085c53SBram Moolenaar 'UseExported()', 1937e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1938e6085c53SBram Moolenaar ] 19398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19408a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19418a7d6542SBram Moolenaar 19428a7d6542SBram Moolenaar source Ximport_abs.vim 19438a7d6542SBram Moolenaar 19448a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19454e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1946fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1947fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1948fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1949fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1950fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1951fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1952fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1953fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1954fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1955fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1956e6085c53SBram Moolenaar g:import_disassembled) 1957b3ca9824SBram Moolenaar 1958b3ca9824SBram Moolenaar Undo_export_script_lines() 19598a7d6542SBram Moolenaar unlet g:imported_abs 19604e12a5dfSBram Moolenaar unlet g:import_disassembled 19618a7d6542SBram Moolenaar 19628a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19638a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19648a7d6542SBram Moolenaarenddef 19658a7d6542SBram Moolenaar 19668a7d6542SBram Moolenaardef Test_import_rtp() 1967cfcd011fSBram Moolenaar var import_lines = [ 1968e6085c53SBram Moolenaar 'vim9script', 1969e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1970e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1971e6085c53SBram Moolenaar ] 19728a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 1973b885a7c7SBram Moolenaar mkdir('import', 'p') 1974b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 19758a7d6542SBram Moolenaar 1976cfcd011fSBram Moolenaar var save_rtp = &rtp 19778a7d6542SBram Moolenaar &rtp = getcwd() 19788a7d6542SBram Moolenaar source Ximport_rtp.vim 19798a7d6542SBram Moolenaar &rtp = save_rtp 19808a7d6542SBram Moolenaar 19818a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 19828a7d6542SBram Moolenaar 1983b3ca9824SBram Moolenaar Undo_export_script_lines() 1984b3ca9824SBram Moolenaar unlet g:imported_rtp 19858a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 1986b885a7c7SBram Moolenaar delete('import', 'rf') 19878a7d6542SBram Moolenaarenddef 19888a7d6542SBram Moolenaar 198925e0f586SBram Moolenaardef Test_import_compile_error() 1990cfcd011fSBram Moolenaar var export_lines = [ 199125e0f586SBram Moolenaar 'vim9script', 199225e0f586SBram Moolenaar 'export def ExpFunc(): string', 199325e0f586SBram Moolenaar ' return notDefined', 199425e0f586SBram Moolenaar 'enddef', 199525e0f586SBram Moolenaar ] 199625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 199725e0f586SBram Moolenaar 1998cfcd011fSBram Moolenaar var import_lines = [ 199925e0f586SBram Moolenaar 'vim9script', 200025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 200125e0f586SBram Moolenaar 'def ImpFunc()', 200225e0f586SBram Moolenaar ' echo ExpFunc()', 200325e0f586SBram Moolenaar 'enddef', 200425e0f586SBram Moolenaar 'defcompile', 200525e0f586SBram Moolenaar ] 200625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 200725e0f586SBram Moolenaar 200825e0f586SBram Moolenaar try 200925e0f586SBram Moolenaar source Ximport.vim 201025e0f586SBram Moolenaar catch /E1001/ 2011f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20127707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 201325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 201425e0f586SBram Moolenaar endtry 201525e0f586SBram Moolenaar 201625e0f586SBram Moolenaar delete('Xexported.vim') 201725e0f586SBram Moolenaar delete('Ximport.vim') 201825e0f586SBram Moolenaarenddef 201925e0f586SBram Moolenaar 2020c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2021cfcd011fSBram Moolenaar var lines = [ 2022c4ce36d4SBram Moolenaar 'vim9script', 2023c4ce36d4SBram Moolenaar 'def Func()', 2024c4ce36d4SBram Moolenaar ' eval [][0]', 2025c4ce36d4SBram Moolenaar 'enddef', 2026c4ce36d4SBram Moolenaar 'Func()', 2027c4ce36d4SBram Moolenaar ] 2028c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2029c4ce36d4SBram Moolenaar 2030c4ce36d4SBram Moolenaar for count in range(3) 2031c4ce36d4SBram Moolenaar try 2032c4ce36d4SBram Moolenaar source Xtestscript.vim 2033c4ce36d4SBram Moolenaar catch /E684/ 2034c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2035c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2036c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2037c4ce36d4SBram Moolenaar endtry 2038c4ce36d4SBram Moolenaar endfor 2039c4ce36d4SBram Moolenaar 2040c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2041c4ce36d4SBram Moolenaarenddef 2042c4ce36d4SBram Moolenaar 2043eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2044cfcd011fSBram Moolenaar var export_lines =<< trim END 2045eef2102eSBram Moolenaar vim9script 2046eef2102eSBram Moolenaar export def Func() 2047eef2102eSBram Moolenaar echo 'imported' 2048eef2102eSBram Moolenaar enddef 2049eef2102eSBram Moolenaar END 2050eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2051eef2102eSBram Moolenaar 2052cfcd011fSBram Moolenaar var lines =<< trim END 2053eef2102eSBram Moolenaar vim9script 2054eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2055eef2102eSBram Moolenaar def Func() 2056eef2102eSBram Moolenaar echo 'local to function' 2057eef2102eSBram Moolenaar enddef 2058eef2102eSBram Moolenaar END 2059eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2060eef2102eSBram Moolenaar 2061eef2102eSBram Moolenaar lines =<< trim END 2062eef2102eSBram Moolenaar vim9script 2063eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2064eef2102eSBram Moolenaar def Outer() 2065eef2102eSBram Moolenaar def Func() 2066eef2102eSBram Moolenaar echo 'local to function' 2067eef2102eSBram Moolenaar enddef 2068eef2102eSBram Moolenaar enddef 2069eef2102eSBram Moolenaar defcompile 2070eef2102eSBram Moolenaar END 2071eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2072eef2102eSBram Moolenaar 2073eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2074eef2102eSBram Moolenaarenddef 2075eef2102eSBram Moolenaar 2076b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2077cfcd011fSBram Moolenaar var lines =<< trim END 2078b9a2cac3SBram Moolenaar vim9script 2079b9a2cac3SBram Moolenaar def Func() 2080b9a2cac3SBram Moolenaar echo 'one' 2081b9a2cac3SBram Moolenaar enddef 2082b9a2cac3SBram Moolenaar def Func() 2083b9a2cac3SBram Moolenaar echo 'two' 2084b9a2cac3SBram Moolenaar enddef 2085b9a2cac3SBram Moolenaar END 2086b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2087fa211f3cSBram Moolenaar 2088fa211f3cSBram Moolenaar lines =<< trim END 2089fa211f3cSBram Moolenaar vim9script 2090fa211f3cSBram Moolenaar def Foo(): string 2091fa211f3cSBram Moolenaar return 'foo' 2092fa211f3cSBram Moolenaar enddef 2093fa211f3cSBram Moolenaar def Func() 2094cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2095fa211f3cSBram Moolenaar enddef 2096fa211f3cSBram Moolenaar defcompile 2097fa211f3cSBram Moolenaar END 2098fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2099b9a2cac3SBram Moolenaarenddef 2100b9a2cac3SBram Moolenaar 21018a7d6542SBram Moolenaardef Test_fixed_size_list() 2102f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2103cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21048a7d6542SBram Moolenaar l->remove(0) 21058a7d6542SBram Moolenaar l->add(5) 21068a7d6542SBram Moolenaar l->insert(99, 1) 21070f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21088a7d6542SBram Moolenaarenddef 21098a7d6542SBram Moolenaar 2110ae616494SBram Moolenaardef Test_no_insert_xit() 2111d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2112d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2113d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2114d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2115d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2116ae616494SBram Moolenaar 2117ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2118ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2119ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2120ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2121f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2122f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21236508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21246508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2125f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2126f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2127f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2128ae616494SBram Moolenaarenddef 2129ae616494SBram Moolenaar 2130158906cfSBram Moolenaardef IfElse(what: number): string 2131cfcd011fSBram Moolenaar var res = '' 2132158906cfSBram Moolenaar if what == 1 2133158906cfSBram Moolenaar res = "one" 2134158906cfSBram Moolenaar elseif what == 2 2135158906cfSBram Moolenaar res = "two" 2136a259d8d3SBram Moolenaar else 2137158906cfSBram Moolenaar res = "three" 2138a259d8d3SBram Moolenaar endif 2139158906cfSBram Moolenaar return res 2140a259d8d3SBram Moolenaarenddef 2141a259d8d3SBram Moolenaar 2142158906cfSBram Moolenaardef Test_if_elseif_else() 2143158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2144158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2145158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21460f18b6d1SBram Moolenaarenddef 21470f18b6d1SBram Moolenaar 2148e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2149d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2150d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2151d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2152ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2153d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21546628b7ebSBram Moolenaar 21556628b7ebSBram Moolenaar var lines =<< trim END 21566628b7ebSBram Moolenaar var s = '' 21576628b7ebSBram Moolenaar if s = '' 21586628b7ebSBram Moolenaar endif 21596628b7ebSBram Moolenaar END 21606628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 21616628b7ebSBram Moolenaar 21626628b7ebSBram Moolenaar lines =<< trim END 21636628b7ebSBram Moolenaar var s = '' 21646628b7ebSBram Moolenaar if s == '' 21656628b7ebSBram Moolenaar elseif s = '' 21666628b7ebSBram Moolenaar endif 21676628b7ebSBram Moolenaar END 21686628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2169e8c4abbbSBram Moolenaarenddef 2170e8c4abbbSBram Moolenaar 21716d69bf60SBram Moolenaarlet g:bool_true = v:true 21726d69bf60SBram Moolenaarlet g:bool_false = v:false 21736d69bf60SBram Moolenaar 21746d69bf60SBram Moolenaardef Test_if_const_expr() 2175cfcd011fSBram Moolenaar var res = false 21766d69bf60SBram Moolenaar if true ? true : false 21776d69bf60SBram Moolenaar res = true 21786d69bf60SBram Moolenaar endif 21796d69bf60SBram Moolenaar assert_equal(true, res) 21806d69bf60SBram Moolenaar 2181585fea7bSBram Moolenaar g:glob = 2 2182585fea7bSBram Moolenaar if false 21836797966dSBram Moolenaar execute('g:glob = 3') 2184585fea7bSBram Moolenaar endif 2185585fea7bSBram Moolenaar assert_equal(2, g:glob) 2186585fea7bSBram Moolenaar if true 21876797966dSBram Moolenaar execute('g:glob = 3') 2188585fea7bSBram Moolenaar endif 2189585fea7bSBram Moolenaar assert_equal(3, g:glob) 2190585fea7bSBram Moolenaar 21916d69bf60SBram Moolenaar res = false 21926d69bf60SBram Moolenaar if g:bool_true ? true : false 21936d69bf60SBram Moolenaar res = true 21946d69bf60SBram Moolenaar endif 21956d69bf60SBram Moolenaar assert_equal(true, res) 21966d69bf60SBram Moolenaar 21976d69bf60SBram Moolenaar res = false 21986d69bf60SBram Moolenaar if true ? g:bool_true : false 21996d69bf60SBram Moolenaar res = true 22006d69bf60SBram Moolenaar endif 22016d69bf60SBram Moolenaar assert_equal(true, res) 22026d69bf60SBram Moolenaar 22036d69bf60SBram Moolenaar res = false 22046d69bf60SBram Moolenaar if true ? true : g:bool_false 22056d69bf60SBram Moolenaar res = true 22066d69bf60SBram Moolenaar endif 22076d69bf60SBram Moolenaar assert_equal(true, res) 22086d69bf60SBram Moolenaar 22096d69bf60SBram Moolenaar res = false 22106d69bf60SBram Moolenaar if true ? false : true 22116d69bf60SBram Moolenaar res = true 22126d69bf60SBram Moolenaar endif 22136d69bf60SBram Moolenaar assert_equal(false, res) 22146d69bf60SBram Moolenaar 22156d69bf60SBram Moolenaar res = false 22166d69bf60SBram Moolenaar if false ? false : true 22176d69bf60SBram Moolenaar res = true 22186d69bf60SBram Moolenaar endif 22196d69bf60SBram Moolenaar assert_equal(true, res) 22206d69bf60SBram Moolenaar 22216d69bf60SBram Moolenaar res = false 22226d69bf60SBram Moolenaar if false ? true : false 22236d69bf60SBram Moolenaar res = true 22246d69bf60SBram Moolenaar endif 22256d69bf60SBram Moolenaar assert_equal(false, res) 22266d69bf60SBram Moolenaar 22276d69bf60SBram Moolenaar res = false 2228e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2229e8c4abbbSBram Moolenaar res = true 2230e8c4abbbSBram Moolenaar endif 2231e8c4abbbSBram Moolenaar assert_equal(false, res) 2232e8c4abbbSBram Moolenaar 2233e8c4abbbSBram Moolenaar res = false 22346d69bf60SBram Moolenaar if true && true 22356d69bf60SBram Moolenaar res = true 22366d69bf60SBram Moolenaar endif 22376d69bf60SBram Moolenaar assert_equal(true, res) 22386d69bf60SBram Moolenaar 22396d69bf60SBram Moolenaar res = false 22406d69bf60SBram Moolenaar if true && false 22416d69bf60SBram Moolenaar res = true 22426d69bf60SBram Moolenaar endif 22436d69bf60SBram Moolenaar assert_equal(false, res) 22446d69bf60SBram Moolenaar 22456d69bf60SBram Moolenaar res = false 22466d69bf60SBram Moolenaar if g:bool_true && false 22476d69bf60SBram Moolenaar res = true 22486d69bf60SBram Moolenaar endif 22496d69bf60SBram Moolenaar assert_equal(false, res) 22506d69bf60SBram Moolenaar 22516d69bf60SBram Moolenaar res = false 22526d69bf60SBram Moolenaar if true && g:bool_false 22536d69bf60SBram Moolenaar res = true 22546d69bf60SBram Moolenaar endif 22556d69bf60SBram Moolenaar assert_equal(false, res) 22566d69bf60SBram Moolenaar 22576d69bf60SBram Moolenaar res = false 22586d69bf60SBram Moolenaar if false && false 22596d69bf60SBram Moolenaar res = true 22606d69bf60SBram Moolenaar endif 22616d69bf60SBram Moolenaar assert_equal(false, res) 22626d69bf60SBram Moolenaar 22636d69bf60SBram Moolenaar res = false 22646d69bf60SBram Moolenaar if true || false 22656d69bf60SBram Moolenaar res = true 22666d69bf60SBram Moolenaar endif 22676d69bf60SBram Moolenaar assert_equal(true, res) 22686d69bf60SBram Moolenaar 22696d69bf60SBram Moolenaar res = false 22706d69bf60SBram Moolenaar if g:bool_true || false 22716d69bf60SBram Moolenaar res = true 22726d69bf60SBram Moolenaar endif 22736d69bf60SBram Moolenaar assert_equal(true, res) 22746d69bf60SBram Moolenaar 22756d69bf60SBram Moolenaar res = false 22766d69bf60SBram Moolenaar if true || g:bool_false 22776d69bf60SBram Moolenaar res = true 22786d69bf60SBram Moolenaar endif 22796d69bf60SBram Moolenaar assert_equal(true, res) 22806d69bf60SBram Moolenaar 22816d69bf60SBram Moolenaar res = false 22826d69bf60SBram Moolenaar if false || false 22836d69bf60SBram Moolenaar res = true 22846d69bf60SBram Moolenaar endif 22856d69bf60SBram Moolenaar assert_equal(false, res) 22863988f64fSBram Moolenaar 22873988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2288c323527dSBram Moolenaar if false | eval 1 + 2 | endif 22893988f64fSBram Moolenaar if false | eval burp + 234 | endif 22903988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 22913988f64fSBram Moolenaar if false 22923988f64fSBram Moolenaar burp 22933988f64fSBram Moolenaar endif 229480c34ca3SBram Moolenaarenddef 22956d69bf60SBram Moolenaar 229680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2297d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2298d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2299d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2300d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23016d69bf60SBram Moolenaarenddef 23026d69bf60SBram Moolenaar 230372abcf42SBram Moolenaardef RunNested(i: number): number 2304cfcd011fSBram Moolenaar var x: number = 0 230572abcf42SBram Moolenaar if i % 2 230672abcf42SBram Moolenaar if 1 2307f5be8cdbSBram Moolenaar # comment 230872abcf42SBram Moolenaar else 2309f5be8cdbSBram Moolenaar # comment 231072abcf42SBram Moolenaar endif 231172abcf42SBram Moolenaar x += 1 231272abcf42SBram Moolenaar else 231372abcf42SBram Moolenaar x += 1000 231472abcf42SBram Moolenaar endif 231572abcf42SBram Moolenaar return x 231672abcf42SBram Moolenaarenddef 231772abcf42SBram Moolenaar 231872abcf42SBram Moolenaardef Test_nested_if() 231972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 232072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 232172abcf42SBram Moolenaarenddef 232272abcf42SBram Moolenaar 2323ad39c094SBram Moolenaardef Test_execute_cmd() 2324e4984290SBram Moolenaar # missing argument is ignored 2325e4984290SBram Moolenaar execute 2326e4984290SBram Moolenaar execute # comment 2327e4984290SBram Moolenaar 2328ad39c094SBram Moolenaar new 2329ad39c094SBram Moolenaar setline(1, 'default') 2330d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2331ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2332a72cfb80SBram Moolenaar 2333d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2334a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2335a72cfb80SBram Moolenaar 2336cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2337cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2338a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2339ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2340a72cfb80SBram Moolenaar 2341d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2342ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2343a72cfb80SBram Moolenaar 2344cfcd011fSBram Moolenaar var cmd_first = 'call ' 2345cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2346ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2347ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2348ad39c094SBram Moolenaar bwipe! 2349585fea7bSBram Moolenaar 2350cfcd011fSBram Moolenaar var n = true 23512d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23522d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23532d6b20d6SBram Moolenaar 2354e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2355e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2356e5abf7afSBram Moolenaar 2357d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2358d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2359d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2360ad39c094SBram Moolenaarenddef 2361ad39c094SBram Moolenaar 236247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2363f5be8cdbSBram Moolenaar # only checks line continuation 2364cfcd011fSBram Moolenaar var lines =<< trim END 236547e880d6SBram Moolenaar vim9script 236647e880d6SBram Moolenaar execute 'g:someVar' 236747e880d6SBram Moolenaar .. ' = ' .. 236847e880d6SBram Moolenaar '28' 236947e880d6SBram Moolenaar assert_equal(28, g:someVar) 237047e880d6SBram Moolenaar unlet g:someVar 237147e880d6SBram Moolenaar END 237247e880d6SBram Moolenaar CheckScriptSuccess(lines) 237347e880d6SBram Moolenaarenddef 237447e880d6SBram Moolenaar 2375ad39c094SBram Moolenaardef Test_echo_cmd() 2376a72cfb80SBram Moolenaar echo 'some' # comment 2377585fea7bSBram Moolenaar echon 'thing' 2378ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2379ad39c094SBram Moolenaar 2380a72cfb80SBram Moolenaar echo "some" # comment 2381a72cfb80SBram Moolenaar echon "thing" 2382a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2383a72cfb80SBram Moolenaar 2384cfcd011fSBram Moolenaar var str1 = 'some' 2385cfcd011fSBram Moolenaar var str2 = 'more' 2386ad39c094SBram Moolenaar echo str1 str2 2387ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2388a72cfb80SBram Moolenaar 2389d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2390ad39c094SBram Moolenaarenddef 2391ad39c094SBram Moolenaar 2392f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2393f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2394f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2395f93c7feaSBram Moolenaar echo 'clear' 2396df069eecSBram Moolenaar :1messages 2397f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2398f93c7feaSBram Moolenaar 2399d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2400f93c7feaSBram Moolenaarenddef 2401f93c7feaSBram Moolenaar 240247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2403f5be8cdbSBram Moolenaar # only checks line continuation 2404cfcd011fSBram Moolenaar var lines =<< trim END 240547e880d6SBram Moolenaar vim9script 240647e880d6SBram Moolenaar echomsg 'here' 240747e880d6SBram Moolenaar .. ' is ' .. 240847e880d6SBram Moolenaar 'a message' 240947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 241047e880d6SBram Moolenaar END 241147e880d6SBram Moolenaar CheckScriptSuccess(lines) 241247e880d6SBram Moolenaarenddef 241347e880d6SBram Moolenaar 2414f93c7feaSBram Moolenaardef Test_echoerr_cmd() 241540ee466cSBram Moolenaar try 241640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 241740ee466cSBram Moolenaar catch 241840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 241940ee466cSBram Moolenaar endtry 2420f93c7feaSBram Moolenaarenddef 2421f93c7feaSBram Moolenaar 242247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2423f5be8cdbSBram Moolenaar # only checks line continuation 2424cfcd011fSBram Moolenaar var lines =<< trim END 242547e880d6SBram Moolenaar vim9script 242647e880d6SBram Moolenaar try 242747e880d6SBram Moolenaar echoerr 'this' 242847e880d6SBram Moolenaar .. ' is ' .. 242947e880d6SBram Moolenaar 'wrong' 243047e880d6SBram Moolenaar catch 243147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 243247e880d6SBram Moolenaar endtry 243347e880d6SBram Moolenaar END 243447e880d6SBram Moolenaar CheckScriptSuccess(lines) 243547e880d6SBram Moolenaarenddef 243647e880d6SBram Moolenaar 243741fe0617SBram Moolenaardef Test_for_outside_of_function() 2438cfcd011fSBram Moolenaar var lines =<< trim END 243941fe0617SBram Moolenaar vim9script 244041fe0617SBram Moolenaar new 244141fe0617SBram Moolenaar for var in range(0, 3) 244241fe0617SBram Moolenaar append(line('$'), var) 244341fe0617SBram Moolenaar endfor 244441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 244541fe0617SBram Moolenaar bwipe! 2446522eefd9SBram Moolenaar 2447522eefd9SBram Moolenaar var result = '' 2448522eefd9SBram Moolenaar for i in [1, 2, 3] 2449522eefd9SBram Moolenaar var loop = ' loop ' .. i 2450522eefd9SBram Moolenaar result ..= loop 2451522eefd9SBram Moolenaar endfor 2452522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 245341fe0617SBram Moolenaar END 245441fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 245541fe0617SBram Moolenaar source Xvim9for.vim 245641fe0617SBram Moolenaar delete('Xvim9for.vim') 245741fe0617SBram Moolenaarenddef 24588a7d6542SBram Moolenaar 2459e8c4abbbSBram Moolenaardef Test_for_loop() 2460f2253963SBram Moolenaar var lines =<< trim END 2461cfcd011fSBram Moolenaar var result = '' 2462e8c4abbbSBram Moolenaar for cnt in range(7) 2463e8c4abbbSBram Moolenaar if cnt == 4 2464e8c4abbbSBram Moolenaar break 2465e8c4abbbSBram Moolenaar endif 2466e8c4abbbSBram Moolenaar if cnt == 2 2467e8c4abbbSBram Moolenaar continue 2468e8c4abbbSBram Moolenaar endif 2469e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2470e8c4abbbSBram Moolenaar endfor 2471e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24720ad3e894SBram Moolenaar 2473cfcd011fSBram Moolenaar var concat = '' 24740ad3e894SBram Moolenaar for str in eval('["one", "two"]') 24750ad3e894SBram Moolenaar concat ..= str 24760ad3e894SBram Moolenaar endfor 24770ad3e894SBram Moolenaar assert_equal('onetwo', concat) 247838bd8de5SBram Moolenaar 247938bd8de5SBram Moolenaar var total = 0 248038bd8de5SBram Moolenaar for nr in 248138bd8de5SBram Moolenaar [1, 2, 3] 248238bd8de5SBram Moolenaar total += nr 248338bd8de5SBram Moolenaar endfor 248438bd8de5SBram Moolenaar assert_equal(6, total) 248538bd8de5SBram Moolenaar 248638bd8de5SBram Moolenaar total = 0 248738bd8de5SBram Moolenaar for nr 248838bd8de5SBram Moolenaar in [1, 2, 3] 248938bd8de5SBram Moolenaar total += nr 249038bd8de5SBram Moolenaar endfor 249138bd8de5SBram Moolenaar assert_equal(6, total) 249238bd8de5SBram Moolenaar 249338bd8de5SBram Moolenaar total = 0 249438bd8de5SBram Moolenaar for nr 249538bd8de5SBram Moolenaar in 249638bd8de5SBram Moolenaar [1, 2, 3] 249738bd8de5SBram Moolenaar total += nr 249838bd8de5SBram Moolenaar endfor 249938bd8de5SBram Moolenaar assert_equal(6, total) 2500036d0714SBram Moolenaar 2501a3589a0dSBram Moolenaar # with type 2502a3589a0dSBram Moolenaar total = 0 2503a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2504a3589a0dSBram Moolenaar total += n 2505a3589a0dSBram Moolenaar endfor 2506a3589a0dSBram Moolenaar assert_equal(6, total) 2507a3589a0dSBram Moolenaar 2508fe090eb5SBram Moolenaar var chars = '' 2509fe090eb5SBram Moolenaar for s: string in 'foobar' 2510fe090eb5SBram Moolenaar chars ..= s 2511fe090eb5SBram Moolenaar endfor 2512fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2513fe090eb5SBram Moolenaar 25145ede5b23SBram Moolenaar chars = '' 25155ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25165ede5b23SBram Moolenaar chars ..= x 25175ede5b23SBram Moolenaar endfor 25185ede5b23SBram Moolenaar assert_equal('ab', chars) 25195ede5b23SBram Moolenaar 2520a3589a0dSBram Moolenaar # unpack with type 2521f2253963SBram Moolenaar var res = '' 2522a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2523a3589a0dSBram Moolenaar res ..= n .. s 2524a3589a0dSBram Moolenaar endfor 2525a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2526a3589a0dSBram Moolenaar 2527444d8783SBram Moolenaar # unpack with one var 2528444d8783SBram Moolenaar var reslist = [] 2529444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2530444d8783SBram Moolenaar reslist->add(x) 2531444d8783SBram Moolenaar endfor 2532444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2533444d8783SBram Moolenaar 2534a3589a0dSBram Moolenaar # loop over string 2535a3589a0dSBram Moolenaar res = '' 253674e54fcbSBram Moolenaar for c in 'aéc̀d' 253774e54fcbSBram Moolenaar res ..= c .. '-' 253874e54fcbSBram Moolenaar endfor 253974e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 254074e54fcbSBram Moolenaar 254174e54fcbSBram Moolenaar res = '' 254274e54fcbSBram Moolenaar for c in '' 254374e54fcbSBram Moolenaar res ..= c .. '-' 254474e54fcbSBram Moolenaar endfor 254574e54fcbSBram Moolenaar assert_equal('', res) 254674e54fcbSBram Moolenaar 254774e54fcbSBram Moolenaar res = '' 254874e54fcbSBram Moolenaar for c in test_null_string() 254974e54fcbSBram Moolenaar res ..= c .. '-' 255074e54fcbSBram Moolenaar endfor 255174e54fcbSBram Moolenaar assert_equal('', res) 2552f2253963SBram Moolenaar 2553f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2554f2253963SBram Moolenaar {a: 'Cat'} 2555f2253963SBram Moolenaar ] 2556f2253963SBram Moolenaar for dd in foo 2557f2253963SBram Moolenaar dd.counter = 12 2558f2253963SBram Moolenaar endfor 2559f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2560*ad2d4969SBram Moolenaar 2561*ad2d4969SBram Moolenaar reslist = [] 2562*ad2d4969SBram Moolenaar for _ in range(3) 2563*ad2d4969SBram Moolenaar reslist->add('x') 2564*ad2d4969SBram Moolenaar endfor 2565*ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2566f2253963SBram Moolenaar END 2567f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2568e8c4abbbSBram Moolenaarenddef 2569e8c4abbbSBram Moolenaar 2570e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2571442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2572442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2573442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2574442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2575442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2576442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2577d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2578822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 25792d870f8dSBram Moolenaar delfunc! g:Func 2580675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2581675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2582675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 258374e54fcbSBram Moolenaar 258474e54fcbSBram Moolenaar # wrong type detected at compile time 258574e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 258674e54fcbSBram Moolenaar 258774e54fcbSBram Moolenaar # wrong type detected at runtime 258874e54fcbSBram Moolenaar g:adict = {a: 1} 258974e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 259074e54fcbSBram Moolenaar unlet g:adict 2591f6a8d420SBram Moolenaar 2592f6a8d420SBram Moolenaar var lines =<< trim END 2593f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2594f6a8d420SBram Moolenaar for e in d 2595f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2596f6a8d420SBram Moolenaar endfor 2597f6a8d420SBram Moolenaar END 2598f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2599fe090eb5SBram Moolenaar 2600fe090eb5SBram Moolenaar lines =<< trim END 2601fe090eb5SBram Moolenaar for nr: number in ['foo'] 2602fe090eb5SBram Moolenaar endfor 2603fe090eb5SBram Moolenaar END 2604fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2605404557e6SBram Moolenaar 2606404557e6SBram Moolenaar lines =<< trim END 2607404557e6SBram Moolenaar for n : number in [1, 2] 2608404557e6SBram Moolenaar echo n 2609404557e6SBram Moolenaar endfor 2610404557e6SBram Moolenaar END 2611404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2612efc5db52SBram Moolenaar 2613efc5db52SBram Moolenaar lines =<< trim END 2614efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2615efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2616efc5db52SBram Moolenaar echo k v 2617efc5db52SBram Moolenaar endfor 2618efc5db52SBram Moolenaar END 2619efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2620e8c4abbbSBram Moolenaarenddef 2621e8c4abbbSBram Moolenaar 2622ea87069dSBram Moolenaardef Test_for_loop_script_var() 2623ea87069dSBram Moolenaar # cannot use s:var in a :def function 2624ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2625ea87069dSBram Moolenaar 2626ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2627ea87069dSBram Moolenaar var lines =<< trim END 2628ea87069dSBram Moolenaar vim9script 2629ea87069dSBram Moolenaar var total = 0 2630ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2631ea87069dSBram Moolenaar total += s:var 2632ea87069dSBram Moolenaar endfor 2633ea87069dSBram Moolenaar assert_equal(6, total) 2634ea87069dSBram Moolenaar 2635ea87069dSBram Moolenaar total = 0 2636ea87069dSBram Moolenaar for var in [1, 2, 3] 2637ea87069dSBram Moolenaar total += var 2638ea87069dSBram Moolenaar endfor 2639ea87069dSBram Moolenaar assert_equal(6, total) 2640ea87069dSBram Moolenaar END 2641ea87069dSBram Moolenaarenddef 2642ea87069dSBram Moolenaar 2643792f786aSBram Moolenaardef Test_for_loop_unpack() 26444b8a0651SBram Moolenaar var lines =<< trim END 2645792f786aSBram Moolenaar var result = [] 2646792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2647792f786aSBram Moolenaar result->add(v1) 2648792f786aSBram Moolenaar result->add(v2) 2649792f786aSBram Moolenaar endfor 2650792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2651792f786aSBram Moolenaar 2652792f786aSBram Moolenaar result = [] 2653792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2654792f786aSBram Moolenaar result->add(v1) 2655792f786aSBram Moolenaar result->add(v2) 2656792f786aSBram Moolenaar result->add(v3) 2657792f786aSBram Moolenaar endfor 2658792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2659792f786aSBram Moolenaar 26604b8a0651SBram Moolenaar result = [] 26614b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 26624b8a0651SBram Moolenaar result->add(&ts) 26634b8a0651SBram Moolenaar result->add(&sw) 26644b8a0651SBram Moolenaar endfor 26654b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 26664b8a0651SBram Moolenaar 26674b8a0651SBram Moolenaar var slist: list<string> 26684b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 26694b8a0651SBram Moolenaar slist->add($LOOPVAR) 26704b8a0651SBram Moolenaar slist->add(@r) 26714b8a0651SBram Moolenaar slist->add(v:errmsg) 26724b8a0651SBram Moolenaar endfor 26734b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 26744b8a0651SBram Moolenaar 26754b8a0651SBram Moolenaar slist = [] 26764b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 26774b8a0651SBram Moolenaar slist->add(g:globalvar) 26784b8a0651SBram Moolenaar slist->add(b:bufvar) 26794b8a0651SBram Moolenaar slist->add(w:winvar) 26804b8a0651SBram Moolenaar slist->add(t:tabvar) 26814b8a0651SBram Moolenaar endfor 26824b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2683f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2684b777da9bSBram Moolenaar 2685b777da9bSBram Moolenaar var res = [] 2686b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2687b777da9bSBram Moolenaar res->add(n) 2688b777da9bSBram Moolenaar endfor 2689b777da9bSBram Moolenaar assert_equal([2, 5], res) 26904b8a0651SBram Moolenaar END 26914b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 26924b8a0651SBram Moolenaar 26934b8a0651SBram Moolenaar lines =<< trim END 2694792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2695792f786aSBram Moolenaar echo v1 v2 2696792f786aSBram Moolenaar endfor 2697792f786aSBram Moolenaar END 2698792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2699792f786aSBram Moolenaar 2700792f786aSBram Moolenaar lines =<< trim END 2701792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2702792f786aSBram Moolenaar echo v1 v2 2703792f786aSBram Moolenaar endfor 2704792f786aSBram Moolenaar END 2705792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2706792f786aSBram Moolenaar 2707792f786aSBram Moolenaar lines =<< trim END 2708792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2709792f786aSBram Moolenaar echo v1 2710792f786aSBram Moolenaar endfor 2711792f786aSBram Moolenaar END 2712792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2713792f786aSBram Moolenaarenddef 2714792f786aSBram Moolenaar 2715c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2716f2253963SBram Moolenaar var lines =<< trim END 2717c150c09eSBram Moolenaar var looped = 0 2718c150c09eSBram Moolenaar var cleanup = 0 2719c150c09eSBram Moolenaar for i in range(3) 2720c150c09eSBram Moolenaar looped += 1 2721c150c09eSBram Moolenaar try 2722c150c09eSBram Moolenaar eval [][0] 2723c150c09eSBram Moolenaar catch 2724c150c09eSBram Moolenaar continue 2725c150c09eSBram Moolenaar finally 2726c150c09eSBram Moolenaar cleanup += 1 2727c150c09eSBram Moolenaar endtry 2728c150c09eSBram Moolenaar endfor 2729c150c09eSBram Moolenaar assert_equal(3, looped) 2730c150c09eSBram Moolenaar assert_equal(3, cleanup) 2731f2253963SBram Moolenaar END 2732f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2733c150c09eSBram Moolenaarenddef 2734c150c09eSBram Moolenaar 2735d0df1aacSBram Moolenaardef Test_while_loop() 2736cfcd011fSBram Moolenaar var result = '' 2737cfcd011fSBram Moolenaar var cnt = 0 2738d0df1aacSBram Moolenaar while cnt < 555 2739d0df1aacSBram Moolenaar if cnt == 3 2740d0df1aacSBram Moolenaar break 2741d0df1aacSBram Moolenaar endif 2742d0df1aacSBram Moolenaar cnt += 1 2743d0df1aacSBram Moolenaar if cnt == 2 2744d0df1aacSBram Moolenaar continue 2745d0df1aacSBram Moolenaar endif 2746d0df1aacSBram Moolenaar result ..= cnt .. '_' 2747d0df1aacSBram Moolenaar endwhile 2748d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2749dee37dc7SBram Moolenaar 2750dee37dc7SBram Moolenaar var s = '' 27510123cc1eSBram Moolenaar while s == 'x' # {comment} 2752dee37dc7SBram Moolenaar endwhile 2753d0df1aacSBram Moolenaarenddef 2754d0df1aacSBram Moolenaar 2755e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2756675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2757675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2758675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2759675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2760675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2761675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2762675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 27636628b7ebSBram Moolenaar 27646628b7ebSBram Moolenaar var lines =<< trim END 27656628b7ebSBram Moolenaar var s = '' 27666628b7ebSBram Moolenaar while s = '' 27676628b7ebSBram Moolenaar endwhile 27686628b7ebSBram Moolenaar END 27696628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2770bd5da371SBram Moolenaarenddef 2771bd5da371SBram Moolenaar 27729645e2d9SBram Moolenaardef Test_interrupt_loop() 2773cfcd011fSBram Moolenaar var caught = false 2774cfcd011fSBram Moolenaar var x = 0 277597acfc78SBram Moolenaar try 27769645e2d9SBram Moolenaar while 1 27779645e2d9SBram Moolenaar x += 1 27789645e2d9SBram Moolenaar if x == 100 27799645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 27809645e2d9SBram Moolenaar endif 27819645e2d9SBram Moolenaar endwhile 278297acfc78SBram Moolenaar catch 278397acfc78SBram Moolenaar caught = true 278497acfc78SBram Moolenaar assert_equal(100, x) 278597acfc78SBram Moolenaar endtry 278697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 278725859dd7SBram Moolenaar # consume the CTRL-C 278825859dd7SBram Moolenaar getchar(0) 27899645e2d9SBram Moolenaarenddef 279020431c9dSBram Moolenaar 27914fdae999SBram Moolenaardef Test_automatic_line_continuation() 2792cfcd011fSBram Moolenaar var mylist = [ 27934fdae999SBram Moolenaar 'one', 27944fdae999SBram Moolenaar 'two', 27954fdae999SBram Moolenaar 'three', 2796f5be8cdbSBram Moolenaar ] # comment 27974fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 27984fdae999SBram Moolenaar 2799cfcd011fSBram Moolenaar var mydict = { 2800e0de171eSBram Moolenaar ['one']: 1, 2801e0de171eSBram Moolenaar ['two']: 2, 2802e0de171eSBram Moolenaar ['three']: 28034fdae999SBram Moolenaar 3, 2804f5be8cdbSBram Moolenaar } # comment 2805e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2806e0de171eSBram Moolenaar mydict = { 28072c330432SBram Moolenaar one: 1, # comment 28082c330432SBram Moolenaar two: # comment 28092c330432SBram Moolenaar 2, # comment 28102c330432SBram Moolenaar three: 3 # comment 28112c330432SBram Moolenaar } 2812e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2813e0de171eSBram Moolenaar mydict = { 28142c330432SBram Moolenaar one: 1, 28154fdae999SBram Moolenaar two: 28164fdae999SBram Moolenaar 2, 28172c330432SBram Moolenaar three: 3 28184fdae999SBram Moolenaar } 2819e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2820e6085c53SBram Moolenaar 2821e6085c53SBram Moolenaar assert_equal( 2822e6085c53SBram Moolenaar ['one', 'two', 'three'], 2823e6085c53SBram Moolenaar split('one two three') 2824e6085c53SBram Moolenaar ) 28254fdae999SBram Moolenaarenddef 28264fdae999SBram Moolenaar 28277a092245SBram Moolenaardef Test_vim9_comment() 28287a092245SBram Moolenaar CheckScriptSuccess([ 28297a092245SBram Moolenaar 'vim9script', 28307a092245SBram Moolenaar '# something', 283193f82cbeSBram Moolenaar '#something', 283293f82cbeSBram Moolenaar '#{something', 28337a092245SBram Moolenaar ]) 283493f82cbeSBram Moolenaar 283593f82cbeSBram Moolenaar split Xfile 283693f82cbeSBram Moolenaar CheckScriptSuccess([ 283793f82cbeSBram Moolenaar 'vim9script', 283893f82cbeSBram Moolenaar 'edit #something', 283993f82cbeSBram Moolenaar ]) 284093f82cbeSBram Moolenaar CheckScriptSuccess([ 284193f82cbeSBram Moolenaar 'vim9script', 284293f82cbeSBram Moolenaar 'edit #{something', 284393f82cbeSBram Moolenaar ]) 284493f82cbeSBram Moolenaar close 284593f82cbeSBram Moolenaar 28467a092245SBram Moolenaar CheckScriptFailure([ 28477a092245SBram Moolenaar 'vim9script', 28487a092245SBram Moolenaar ':# something', 28497a092245SBram Moolenaar ], 'E488:') 28507a092245SBram Moolenaar CheckScriptFailure([ 28517a092245SBram Moolenaar '# something', 28527a092245SBram Moolenaar ], 'E488:') 28537a092245SBram Moolenaar CheckScriptFailure([ 28547a092245SBram Moolenaar ':# something', 28557a092245SBram Moolenaar ], 'E488:') 28567a092245SBram Moolenaar 28574a8d9f2eSBram Moolenaar { # block start 28584a8d9f2eSBram Moolenaar } # block end 28594a8d9f2eSBram Moolenaar CheckDefFailure([ 28604a8d9f2eSBram Moolenaar '{# comment', 28614a8d9f2eSBram Moolenaar ], 'E488:') 28624a8d9f2eSBram Moolenaar CheckDefFailure([ 28634a8d9f2eSBram Moolenaar '{', 28644a8d9f2eSBram Moolenaar '}# comment', 28654a8d9f2eSBram Moolenaar ], 'E488:') 28664a8d9f2eSBram Moolenaar 28674a8d9f2eSBram Moolenaar echo "yes" # comment 28684a8d9f2eSBram Moolenaar CheckDefFailure([ 28694a8d9f2eSBram Moolenaar 'echo "yes"# comment', 28704a8d9f2eSBram Moolenaar ], 'E488:') 28717a092245SBram Moolenaar CheckScriptSuccess([ 28727a092245SBram Moolenaar 'vim9script', 28737a092245SBram Moolenaar 'echo "yes" # something', 28747a092245SBram Moolenaar ]) 28757a092245SBram Moolenaar CheckScriptFailure([ 28767a092245SBram Moolenaar 'vim9script', 28777a092245SBram Moolenaar 'echo "yes"# something', 28787a092245SBram Moolenaar ], 'E121:') 28797a092245SBram Moolenaar CheckScriptFailure([ 28807a092245SBram Moolenaar 'vim9script', 28817a092245SBram Moolenaar 'echo# something', 2882f8103f27SBram Moolenaar ], 'E1144:') 28837a092245SBram Moolenaar CheckScriptFailure([ 28847a092245SBram Moolenaar 'echo "yes" # something', 28857a092245SBram Moolenaar ], 'E121:') 28867a092245SBram Moolenaar 28874a8d9f2eSBram Moolenaar exe "echo" # comment 28884a8d9f2eSBram Moolenaar CheckDefFailure([ 28894a8d9f2eSBram Moolenaar 'exe "echo"# comment', 28904a8d9f2eSBram Moolenaar ], 'E488:') 28914a8d9f2eSBram Moolenaar CheckScriptSuccess([ 28924a8d9f2eSBram Moolenaar 'vim9script', 28934a8d9f2eSBram Moolenaar 'exe "echo" # something', 28944a8d9f2eSBram Moolenaar ]) 28954a8d9f2eSBram Moolenaar CheckScriptFailure([ 28964a8d9f2eSBram Moolenaar 'vim9script', 28974a8d9f2eSBram Moolenaar 'exe "echo"# something', 28984a8d9f2eSBram Moolenaar ], 'E121:') 28994a8d9f2eSBram Moolenaar CheckScriptFailure([ 29004a8d9f2eSBram Moolenaar 'vim9script', 29014a8d9f2eSBram Moolenaar 'exe# something', 2902f8103f27SBram Moolenaar ], 'E1144:') 29034a8d9f2eSBram Moolenaar CheckScriptFailure([ 29044a8d9f2eSBram Moolenaar 'exe "echo" # something', 29054a8d9f2eSBram Moolenaar ], 'E121:') 29064a8d9f2eSBram Moolenaar 29077a092245SBram Moolenaar CheckDefFailure([ 29087a092245SBram Moolenaar 'try# comment', 29097a092245SBram Moolenaar ' echo "yes"', 29107a092245SBram Moolenaar 'catch', 29117a092245SBram Moolenaar 'endtry', 2912f8103f27SBram Moolenaar ], 'E1144:') 29132c5ed4e3SBram Moolenaar CheckScriptFailure([ 29142c5ed4e3SBram Moolenaar 'vim9script', 29152c5ed4e3SBram Moolenaar 'try# comment', 29162c5ed4e3SBram Moolenaar 'echo "yes"', 2917f8103f27SBram Moolenaar ], 'E1144:') 29187a092245SBram Moolenaar CheckDefFailure([ 29197a092245SBram Moolenaar 'try', 2920a72cfb80SBram Moolenaar ' throw#comment', 2921a72cfb80SBram Moolenaar 'catch', 2922a72cfb80SBram Moolenaar 'endtry', 2923f8103f27SBram Moolenaar ], 'E1144:') 2924a72cfb80SBram Moolenaar CheckDefFailure([ 2925a72cfb80SBram Moolenaar 'try', 2926a72cfb80SBram Moolenaar ' throw "yes"#comment', 2927a72cfb80SBram Moolenaar 'catch', 2928a72cfb80SBram Moolenaar 'endtry', 2929a72cfb80SBram Moolenaar ], 'E488:') 2930a72cfb80SBram Moolenaar CheckDefFailure([ 2931a72cfb80SBram Moolenaar 'try', 29327a092245SBram Moolenaar ' echo "yes"', 29337a092245SBram Moolenaar 'catch# comment', 29347a092245SBram Moolenaar 'endtry', 2935f8103f27SBram Moolenaar ], 'E1144:') 29362c5ed4e3SBram Moolenaar CheckScriptFailure([ 29372c5ed4e3SBram Moolenaar 'vim9script', 29382c5ed4e3SBram Moolenaar 'try', 29392c5ed4e3SBram Moolenaar ' echo "yes"', 29402c5ed4e3SBram Moolenaar 'catch# comment', 29412c5ed4e3SBram Moolenaar 'endtry', 2942f8103f27SBram Moolenaar ], 'E1144:') 29432c5ed4e3SBram Moolenaar CheckDefFailure([ 29442c5ed4e3SBram Moolenaar 'try', 29452c5ed4e3SBram Moolenaar ' echo "yes"', 29462c5ed4e3SBram Moolenaar 'catch /pat/# comment', 29472c5ed4e3SBram Moolenaar 'endtry', 29482c5ed4e3SBram Moolenaar ], 'E488:') 29497a092245SBram Moolenaar CheckDefFailure([ 29507a092245SBram Moolenaar 'try', 29517a092245SBram Moolenaar 'echo "yes"', 29527a092245SBram Moolenaar 'catch', 29537a092245SBram Moolenaar 'endtry# comment', 2954f8103f27SBram Moolenaar ], 'E1144:') 29552c5ed4e3SBram Moolenaar CheckScriptFailure([ 29562c5ed4e3SBram Moolenaar 'vim9script', 29572c5ed4e3SBram Moolenaar 'try', 29582c5ed4e3SBram Moolenaar ' echo "yes"', 29592c5ed4e3SBram Moolenaar 'catch', 29602c5ed4e3SBram Moolenaar 'endtry# comment', 2961f8103f27SBram Moolenaar ], 'E1144:') 29622c5ed4e3SBram Moolenaar 29632c5ed4e3SBram Moolenaar CheckScriptSuccess([ 29642c5ed4e3SBram Moolenaar 'vim9script', 29652c5ed4e3SBram Moolenaar 'hi # comment', 29662c5ed4e3SBram Moolenaar ]) 29672c5ed4e3SBram Moolenaar CheckScriptFailure([ 29682c5ed4e3SBram Moolenaar 'vim9script', 29692c5ed4e3SBram Moolenaar 'hi# comment', 2970f8103f27SBram Moolenaar ], 'E1144:') 29711966c248SBram Moolenaar CheckScriptSuccess([ 29721966c248SBram Moolenaar 'vim9script', 29731966c248SBram Moolenaar 'hi Search # comment', 29741966c248SBram Moolenaar ]) 29751966c248SBram Moolenaar CheckScriptFailure([ 29761966c248SBram Moolenaar 'vim9script', 29771966c248SBram Moolenaar 'hi Search# comment', 29781966c248SBram Moolenaar ], 'E416:') 29791966c248SBram Moolenaar CheckScriptSuccess([ 29801966c248SBram Moolenaar 'vim9script', 29811966c248SBram Moolenaar 'hi link This Search # comment', 29821966c248SBram Moolenaar ]) 29831966c248SBram Moolenaar CheckScriptFailure([ 29841966c248SBram Moolenaar 'vim9script', 29851966c248SBram Moolenaar 'hi link This That# comment', 29861966c248SBram Moolenaar ], 'E413:') 29871966c248SBram Moolenaar CheckScriptSuccess([ 29881966c248SBram Moolenaar 'vim9script', 29891966c248SBram Moolenaar 'hi clear This # comment', 29901966c248SBram Moolenaar 'hi clear # comment', 29911966c248SBram Moolenaar ]) 2992f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2993f5be8cdbSBram Moolenaar # hi clear This# comment', 29941966c248SBram Moolenaar CheckScriptFailure([ 29951966c248SBram Moolenaar 'vim9script', 29961966c248SBram Moolenaar 'hi clear# comment', 29971966c248SBram Moolenaar ], 'E416:') 29981966c248SBram Moolenaar 29991966c248SBram Moolenaar CheckScriptSuccess([ 30001966c248SBram Moolenaar 'vim9script', 30011966c248SBram Moolenaar 'hi Group term=bold', 30021966c248SBram Moolenaar 'match Group /todo/ # comment', 30031966c248SBram Moolenaar ]) 30041966c248SBram Moolenaar CheckScriptFailure([ 30051966c248SBram Moolenaar 'vim9script', 30061966c248SBram Moolenaar 'hi Group term=bold', 30071966c248SBram Moolenaar 'match Group /todo/# comment', 30081966c248SBram Moolenaar ], 'E488:') 30091966c248SBram Moolenaar CheckScriptSuccess([ 30101966c248SBram Moolenaar 'vim9script', 30111966c248SBram Moolenaar 'match # comment', 30121966c248SBram Moolenaar ]) 30131966c248SBram Moolenaar CheckScriptFailure([ 30141966c248SBram Moolenaar 'vim9script', 30151966c248SBram Moolenaar 'match# comment', 3016f8103f27SBram Moolenaar ], 'E1144:') 30171966c248SBram Moolenaar CheckScriptSuccess([ 30181966c248SBram Moolenaar 'vim9script', 30191966c248SBram Moolenaar 'match none # comment', 30201966c248SBram Moolenaar ]) 30211966c248SBram Moolenaar CheckScriptFailure([ 30221966c248SBram Moolenaar 'vim9script', 30231966c248SBram Moolenaar 'match none# comment', 30241966c248SBram Moolenaar ], 'E475:') 30251966c248SBram Moolenaar 30261966c248SBram Moolenaar CheckScriptSuccess([ 30271966c248SBram Moolenaar 'vim9script', 30281966c248SBram Moolenaar 'menutrans clear # comment', 30291966c248SBram Moolenaar ]) 30301966c248SBram Moolenaar CheckScriptFailure([ 30311966c248SBram Moolenaar 'vim9script', 30321966c248SBram Moolenaar 'menutrans clear# comment text', 30331966c248SBram Moolenaar ], 'E474:') 30341966c248SBram Moolenaar 30351966c248SBram Moolenaar CheckScriptSuccess([ 30361966c248SBram Moolenaar 'vim9script', 30371966c248SBram Moolenaar 'syntax clear # comment', 30381966c248SBram Moolenaar ]) 30391966c248SBram Moolenaar CheckScriptFailure([ 30401966c248SBram Moolenaar 'vim9script', 30411966c248SBram Moolenaar 'syntax clear# comment text', 30421966c248SBram Moolenaar ], 'E28:') 30431966c248SBram Moolenaar CheckScriptSuccess([ 30441966c248SBram Moolenaar 'vim9script', 30451966c248SBram Moolenaar 'syntax keyword Word some', 30461966c248SBram Moolenaar 'syntax clear Word # comment', 30471966c248SBram Moolenaar ]) 30481966c248SBram Moolenaar CheckScriptFailure([ 30491966c248SBram Moolenaar 'vim9script', 30501966c248SBram Moolenaar 'syntax keyword Word some', 30511966c248SBram Moolenaar 'syntax clear Word# comment text', 30521966c248SBram Moolenaar ], 'E28:') 30531966c248SBram Moolenaar 30541966c248SBram Moolenaar CheckScriptSuccess([ 30551966c248SBram Moolenaar 'vim9script', 30561966c248SBram Moolenaar 'syntax list # comment', 30571966c248SBram Moolenaar ]) 30581966c248SBram Moolenaar CheckScriptFailure([ 30591966c248SBram Moolenaar 'vim9script', 30601966c248SBram Moolenaar 'syntax list# comment text', 30611966c248SBram Moolenaar ], 'E28:') 30621966c248SBram Moolenaar 30631966c248SBram Moolenaar CheckScriptSuccess([ 30641966c248SBram Moolenaar 'vim9script', 30651966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 30661966c248SBram Moolenaar ]) 30671966c248SBram Moolenaar CheckScriptFailure([ 30681966c248SBram Moolenaar 'vim9script', 30691966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 30701966c248SBram Moolenaar ], 'E475:') 30711966c248SBram Moolenaar 30721966c248SBram Moolenaar CheckScriptSuccess([ 30731966c248SBram Moolenaar 'vim9script', 30741966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 30751966c248SBram Moolenaar ]) 30761966c248SBram Moolenaar CheckScriptFailure([ 30771966c248SBram Moolenaar 'vim9script', 30781966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 30791966c248SBram Moolenaar ], 'E789:') 30801966c248SBram Moolenaar 30811966c248SBram Moolenaar CheckScriptSuccess([ 30821966c248SBram Moolenaar 'vim9script', 30831966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 30841966c248SBram Moolenaar ]) 30851966c248SBram Moolenaar CheckScriptFailure([ 30861966c248SBram Moolenaar 'vim9script', 30871966c248SBram Moolenaar 'syntax match Word /pat/# comment', 30881966c248SBram Moolenaar ], 'E402:') 30891966c248SBram Moolenaar 30901966c248SBram Moolenaar CheckScriptSuccess([ 30911966c248SBram Moolenaar 'vim9script', 30921966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 30931966c248SBram Moolenaar ]) 30941966c248SBram Moolenaar CheckScriptFailure([ 30951966c248SBram Moolenaar 'vim9script', 30961966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 30971966c248SBram Moolenaar ], 'E475:') 30981966c248SBram Moolenaar CheckScriptFailure([ 30991966c248SBram Moolenaar 'vim9script', 31001966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31011966c248SBram Moolenaar ], 'E406:') 31021966c248SBram Moolenaar CheckScriptFailure([ 31031966c248SBram Moolenaar 'vim9script', 31041966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 31051966c248SBram Moolenaar ], 'E475:') 31061966c248SBram Moolenaar 31071966c248SBram Moolenaar CheckScriptSuccess([ 31081966c248SBram Moolenaar 'vim9script', 31091966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 31101966c248SBram Moolenaar ]) 31111966c248SBram Moolenaar CheckScriptFailure([ 31121966c248SBram Moolenaar 'vim9script', 31131966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3114d032f34aSBram Moolenaar ], 'E402:') 31151966c248SBram Moolenaar 31161966c248SBram Moolenaar CheckScriptSuccess([ 31171966c248SBram Moolenaar 'vim9script', 31181966c248SBram Moolenaar 'syntax sync # comment', 31191966c248SBram Moolenaar ]) 31201966c248SBram Moolenaar CheckScriptFailure([ 31211966c248SBram Moolenaar 'vim9script', 31221966c248SBram Moolenaar 'syntax sync# comment', 31231966c248SBram Moolenaar ], 'E404:') 31241966c248SBram Moolenaar CheckScriptSuccess([ 31251966c248SBram Moolenaar 'vim9script', 31261966c248SBram Moolenaar 'syntax sync ccomment # comment', 31271966c248SBram Moolenaar ]) 31281966c248SBram Moolenaar CheckScriptFailure([ 31291966c248SBram Moolenaar 'vim9script', 31301966c248SBram Moolenaar 'syntax sync ccomment# comment', 31311966c248SBram Moolenaar ], 'E404:') 31321966c248SBram Moolenaar 31331966c248SBram Moolenaar CheckScriptSuccess([ 31341966c248SBram Moolenaar 'vim9script', 31351966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 31361966c248SBram Moolenaar ]) 31371966c248SBram Moolenaar CheckScriptFailure([ 31381966c248SBram Moolenaar 'vim9script', 31391966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 31401966c248SBram Moolenaar ], 'E475:') 3141a72cfb80SBram Moolenaar 3142a72cfb80SBram Moolenaar CheckScriptSuccess([ 3143a72cfb80SBram Moolenaar 'vim9script', 3144a72cfb80SBram Moolenaar 'command Echo echo # comment', 3145a72cfb80SBram Moolenaar 'command Echo # comment', 31462d870f8dSBram Moolenaar 'delcommand Echo', 3147a72cfb80SBram Moolenaar ]) 3148a72cfb80SBram Moolenaar CheckScriptFailure([ 3149a72cfb80SBram Moolenaar 'vim9script', 3150a72cfb80SBram Moolenaar 'command Echo echo# comment', 3151a72cfb80SBram Moolenaar 'Echo', 3152f8103f27SBram Moolenaar ], 'E1144:') 31532d870f8dSBram Moolenaar delcommand Echo 315470249ee8SBram Moolenaar 315570249ee8SBram Moolenaar var curdir = getcwd() 315670249ee8SBram Moolenaar CheckScriptSuccess([ 315770249ee8SBram Moolenaar 'command Echo cd " comment', 315870249ee8SBram Moolenaar 'Echo', 315970249ee8SBram Moolenaar 'delcommand Echo', 316070249ee8SBram Moolenaar ]) 316170249ee8SBram Moolenaar CheckScriptSuccess([ 3162090728adSBram Moolenaar 'vim9script', 316370249ee8SBram Moolenaar 'command Echo cd # comment', 316470249ee8SBram Moolenaar 'Echo', 316570249ee8SBram Moolenaar 'delcommand Echo', 316670249ee8SBram Moolenaar ]) 316770249ee8SBram Moolenaar CheckScriptFailure([ 316870249ee8SBram Moolenaar 'vim9script', 316970249ee8SBram Moolenaar 'command Echo cd " comment', 317070249ee8SBram Moolenaar 'Echo', 317170249ee8SBram Moolenaar ], 'E344:') 317270249ee8SBram Moolenaar delcommand Echo 317370249ee8SBram Moolenaar chdir(curdir) 317470249ee8SBram Moolenaar 3175a72cfb80SBram Moolenaar CheckScriptFailure([ 3176a72cfb80SBram Moolenaar 'vim9script', 3177a72cfb80SBram Moolenaar 'command Echo# comment', 3178a72cfb80SBram Moolenaar ], 'E182:') 3179a72cfb80SBram Moolenaar CheckScriptFailure([ 3180a72cfb80SBram Moolenaar 'vim9script', 3181a72cfb80SBram Moolenaar 'command Echo echo', 3182a72cfb80SBram Moolenaar 'command Echo# comment', 3183a72cfb80SBram Moolenaar ], 'E182:') 31842d870f8dSBram Moolenaar delcommand Echo 3185a72cfb80SBram Moolenaar 3186a72cfb80SBram Moolenaar CheckScriptSuccess([ 3187a72cfb80SBram Moolenaar 'vim9script', 3188a72cfb80SBram Moolenaar 'function # comment', 3189a72cfb80SBram Moolenaar ]) 3190a72cfb80SBram Moolenaar CheckScriptFailure([ 3191a72cfb80SBram Moolenaar 'vim9script', 31929898107fSBram Moolenaar 'function " comment', 31939898107fSBram Moolenaar ], 'E129:') 31949898107fSBram Moolenaar CheckScriptFailure([ 31959898107fSBram Moolenaar 'vim9script', 3196a72cfb80SBram Moolenaar 'function# comment', 3197f8103f27SBram Moolenaar ], 'E1144:') 3198a72cfb80SBram Moolenaar CheckScriptSuccess([ 3199a72cfb80SBram Moolenaar 'vim9script', 3200a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3201a72cfb80SBram Moolenaar ]) 3202a72cfb80SBram Moolenaar CheckScriptFailure([ 3203a72cfb80SBram Moolenaar 'vim9script', 3204a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3205a72cfb80SBram Moolenaar ], 'E488:') 3206a72cfb80SBram Moolenaar 3207a72cfb80SBram Moolenaar CheckScriptSuccess([ 3208a72cfb80SBram Moolenaar 'vim9script', 32094c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3210a72cfb80SBram Moolenaar 'endfunc', 32114c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3212a72cfb80SBram Moolenaar ]) 3213a72cfb80SBram Moolenaar CheckScriptFailure([ 3214a72cfb80SBram Moolenaar 'vim9script', 32154c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3216a72cfb80SBram Moolenaar 'endfunc', 32174c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3218a72cfb80SBram Moolenaar ], 'E488:') 3219a72cfb80SBram Moolenaar 3220a72cfb80SBram Moolenaar CheckScriptSuccess([ 3221a72cfb80SBram Moolenaar 'vim9script', 3222a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3223a72cfb80SBram Moolenaar ]) 3224a72cfb80SBram Moolenaar CheckScriptFailure([ 3225a72cfb80SBram Moolenaar 'vim9script', 3226a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3227a72cfb80SBram Moolenaar ], 'E488:') 3228e7e4838fSBram Moolenaar 3229e7e4838fSBram Moolenaar CheckScriptFailure([ 3230e7e4838fSBram Moolenaar 'def Test() " comment', 3231e7e4838fSBram Moolenaar 'enddef', 3232e7e4838fSBram Moolenaar ], 'E488:') 3233e7e4838fSBram Moolenaar CheckScriptFailure([ 3234e7e4838fSBram Moolenaar 'vim9script', 3235e7e4838fSBram Moolenaar 'def Test() " comment', 3236e7e4838fSBram Moolenaar 'enddef', 3237e7e4838fSBram Moolenaar ], 'E488:') 3238e7e4838fSBram Moolenaar 3239e7e4838fSBram Moolenaar CheckScriptSuccess([ 3240e7e4838fSBram Moolenaar 'func Test() " comment', 3241e7e4838fSBram Moolenaar 'endfunc', 32422d870f8dSBram Moolenaar 'delfunc Test', 3243e7e4838fSBram Moolenaar ]) 32449898107fSBram Moolenaar CheckScriptSuccess([ 3245e7e4838fSBram Moolenaar 'vim9script', 3246e7e4838fSBram Moolenaar 'func Test() " comment', 3247e7e4838fSBram Moolenaar 'endfunc', 32489898107fSBram Moolenaar ]) 3249e7e4838fSBram Moolenaar 3250e7e4838fSBram Moolenaar CheckScriptSuccess([ 3251e7e4838fSBram Moolenaar 'def Test() # comment', 3252e7e4838fSBram Moolenaar 'enddef', 3253e7e4838fSBram Moolenaar ]) 3254e7e4838fSBram Moolenaar CheckScriptFailure([ 3255e7e4838fSBram Moolenaar 'func Test() # comment', 3256e7e4838fSBram Moolenaar 'endfunc', 3257e7e4838fSBram Moolenaar ], 'E488:') 32580f37e356SBram Moolenaar 32590f37e356SBram Moolenaar var lines =<< trim END 32600f37e356SBram Moolenaar vim9script 32610f37e356SBram Moolenaar syn region Text 32620f37e356SBram Moolenaar \ start='foo' 32630f37e356SBram Moolenaar #\ comment 32640f37e356SBram Moolenaar \ end='bar' 32655072b47aSBram Moolenaar syn region Text start='foo' 32665072b47aSBram Moolenaar #\ comment 32675072b47aSBram Moolenaar \ end='bar' 32680f37e356SBram Moolenaar END 32690f37e356SBram Moolenaar CheckScriptSuccess(lines) 32700f37e356SBram Moolenaar 32710f37e356SBram Moolenaar lines =<< trim END 32720f37e356SBram Moolenaar vim9script 32730f37e356SBram Moolenaar syn region Text 32740f37e356SBram Moolenaar \ start='foo' 32750f37e356SBram Moolenaar "\ comment 32760f37e356SBram Moolenaar \ end='bar' 32770f37e356SBram Moolenaar END 32780f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 32792c5ed4e3SBram Moolenaarenddef 32802c5ed4e3SBram Moolenaar 32812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 32822c5ed4e3SBram Moolenaar CheckCanRunGui 32832c5ed4e3SBram Moolenaar 32842c5ed4e3SBram Moolenaar CheckScriptFailure([ 32852c5ed4e3SBram Moolenaar 'vim9script', 32862c5ed4e3SBram Moolenaar 'gui#comment' 3287f8103f27SBram Moolenaar ], 'E1144:') 32882c5ed4e3SBram Moolenaar CheckScriptFailure([ 32892c5ed4e3SBram Moolenaar 'vim9script', 32902c5ed4e3SBram Moolenaar 'gui -f#comment' 32912c5ed4e3SBram Moolenaar ], 'E499:') 32927a092245SBram Moolenaarenddef 32937a092245SBram Moolenaar 3294a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 32956797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 32966797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3297a26b9700SBram Moolenaar 3298a26b9700SBram Moolenaar edit test.vim 3299a26b9700SBram Moolenaar doautocmd TabEnter #comment 3300a26b9700SBram Moolenaar assert_equal(1, g:entered) 3301a26b9700SBram Moolenaar 3302a26b9700SBram Moolenaar doautocmd TabEnter f.x 3303a26b9700SBram Moolenaar assert_equal(2, g:entered) 3304a26b9700SBram Moolenaar 3305a26b9700SBram Moolenaar g:entered = 0 3306a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3307a26b9700SBram Moolenaar assert_equal(2, g:entered) 3308a26b9700SBram Moolenaar 3309a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3310a26b9700SBram Moolenaar 3311a26b9700SBram Moolenaar au! TabEnter 3312a26b9700SBram Moolenaar unlet g:entered 3313d72c1bf0SBram Moolenaar 3314d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3315d72c1bf0SBram Moolenaar 'vim9script', 33166797966dSBram Moolenaar 'g:var = 123', 3317e55b1c09SBram Moolenaar 'b:var = 456', 3318e55b1c09SBram Moolenaar 'w:var = 777', 3319e55b1c09SBram Moolenaar 't:var = 888', 3320d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3321d72c1bf0SBram Moolenaar ]) 3322d72c1bf0SBram Moolenaar 3323d72c1bf0SBram Moolenaar CheckScriptFailure([ 3324d72c1bf0SBram Moolenaar 'vim9script', 3325cfcd011fSBram Moolenaar 'let var = 123', 3326cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3327cfcd011fSBram Moolenaar 3328cfcd011fSBram Moolenaar CheckScriptFailure([ 3329cfcd011fSBram Moolenaar 'vim9script', 3330cfcd011fSBram Moolenaar 'var g:var = 123', 3331e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3332e55b1c09SBram Moolenaar 3333e55b1c09SBram Moolenaar CheckScriptFailure([ 3334e55b1c09SBram Moolenaar 'vim9script', 3335cfcd011fSBram Moolenaar 'var b:var = 123', 3336e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3337e55b1c09SBram Moolenaar 3338e55b1c09SBram Moolenaar CheckScriptFailure([ 3339e55b1c09SBram Moolenaar 'vim9script', 3340cfcd011fSBram Moolenaar 'var w:var = 123', 3341e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3342e55b1c09SBram Moolenaar 3343e55b1c09SBram Moolenaar CheckScriptFailure([ 3344e55b1c09SBram Moolenaar 'vim9script', 3345cfcd011fSBram Moolenaar 'var t:var = 123', 3346e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3347e55b1c09SBram Moolenaar 3348e55b1c09SBram Moolenaar CheckScriptFailure([ 3349e55b1c09SBram Moolenaar 'vim9script', 3350cfcd011fSBram Moolenaar 'var v:version = 123', 3351e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3352e55b1c09SBram Moolenaar 3353e55b1c09SBram Moolenaar CheckScriptFailure([ 3354e55b1c09SBram Moolenaar 'vim9script', 3355cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3356e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 33576797966dSBram Moolenaar 33586797966dSBram Moolenaar CheckScriptFailure([ 33596797966dSBram Moolenaar 'vim9script', 33606797966dSBram Moolenaar 'g:var = 123', 336132e35117SBram Moolenaar 'unlet g:var# comment1', 3362d72c1bf0SBram Moolenaar ], 'E108:') 3363d72c1bf0SBram Moolenaar 3364d72c1bf0SBram Moolenaar CheckScriptFailure([ 3365d72c1bf0SBram Moolenaar 'let g:var = 123', 3366d72c1bf0SBram Moolenaar 'unlet g:var # something', 3367d72c1bf0SBram Moolenaar ], 'E488:') 3368faac4104SBram Moolenaar 3369faac4104SBram Moolenaar CheckScriptSuccess([ 3370faac4104SBram Moolenaar 'vim9script', 337132e35117SBram Moolenaar 'if 1 # comment2', 3372faac4104SBram Moolenaar ' echo "yes"', 3373faac4104SBram Moolenaar 'elseif 2 #comment', 3374faac4104SBram Moolenaar ' echo "no"', 3375faac4104SBram Moolenaar 'endif', 3376faac4104SBram Moolenaar ]) 3377faac4104SBram Moolenaar 3378faac4104SBram Moolenaar CheckScriptFailure([ 3379faac4104SBram Moolenaar 'vim9script', 338032e35117SBram Moolenaar 'if 1# comment3', 3381faac4104SBram Moolenaar ' echo "yes"', 3382faac4104SBram Moolenaar 'endif', 3383fae55a9cSBram Moolenaar ], 'E488:') 3384faac4104SBram Moolenaar 3385faac4104SBram Moolenaar CheckScriptFailure([ 3386faac4104SBram Moolenaar 'vim9script', 338732e35117SBram Moolenaar 'if 0 # comment4', 3388faac4104SBram Moolenaar ' echo "yes"', 3389faac4104SBram Moolenaar 'elseif 2#comment', 3390faac4104SBram Moolenaar ' echo "no"', 3391faac4104SBram Moolenaar 'endif', 3392fae55a9cSBram Moolenaar ], 'E488:') 3393faac4104SBram Moolenaar 3394faac4104SBram Moolenaar CheckScriptSuccess([ 3395faac4104SBram Moolenaar 'vim9script', 3396cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3397faac4104SBram Moolenaar ]) 3398faac4104SBram Moolenaar 3399faac4104SBram Moolenaar CheckScriptFailure([ 3400faac4104SBram Moolenaar 'vim9script', 3401cfcd011fSBram Moolenaar 'var v = 1# comment6', 3402fae55a9cSBram Moolenaar ], 'E488:') 3403faac4104SBram Moolenaar 3404faac4104SBram Moolenaar CheckScriptSuccess([ 3405faac4104SBram Moolenaar 'vim9script', 3406faac4104SBram Moolenaar 'new' 3407d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3408df069eecSBram Moolenaar ':$', 3409faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3410faac4104SBram Moolenaar 'bwipe!', 3411faac4104SBram Moolenaar ]) 3412faac4104SBram Moolenaar 3413f5be8cdbSBram Moolenaar CheckScriptFailure([ 3414f5be8cdbSBram Moolenaar 'vim9script', 3415f5be8cdbSBram Moolenaar 'new' 3416d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3417f5be8cdbSBram Moolenaar ':$', 3418f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3419f5be8cdbSBram Moolenaar 'bwipe!', 3420f5be8cdbSBram Moolenaar ], 'E488:') 3421f5be8cdbSBram Moolenaar 3422f5be8cdbSBram Moolenaar CheckScriptFailure([ 3423f5be8cdbSBram Moolenaar 'vim9script', 3424f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3425f5be8cdbSBram Moolenaar ], 'E477:') 3426a26b9700SBram Moolenaarenddef 3427a26b9700SBram Moolenaar 34287e5bd91dSBram Moolenaardef Test_finish() 3429cfcd011fSBram Moolenaar var lines =<< trim END 34307e5bd91dSBram Moolenaar vim9script 34316797966dSBram Moolenaar g:res = 'one' 34327e5bd91dSBram Moolenaar if v:false | finish | endif 34336797966dSBram Moolenaar g:res = 'two' 34347e5bd91dSBram Moolenaar finish 34356797966dSBram Moolenaar g:res = 'three' 34367e5bd91dSBram Moolenaar END 34377e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 34387e5bd91dSBram Moolenaar source Xfinished 34397e5bd91dSBram Moolenaar assert_equal('two', g:res) 34407e5bd91dSBram Moolenaar 34417e5bd91dSBram Moolenaar unlet g:res 34427e5bd91dSBram Moolenaar delete('Xfinished') 34437e5bd91dSBram Moolenaarenddef 34447e5bd91dSBram Moolenaar 3445a5d0077eSBram Moolenaardef Test_forward_declaration() 3446cfcd011fSBram Moolenaar var lines =<< trim END 3447a5d0077eSBram Moolenaar vim9script 3448a5d0077eSBram Moolenaar def GetValue(): string 3449a5d0077eSBram Moolenaar return theVal 3450a5d0077eSBram Moolenaar enddef 3451cfcd011fSBram Moolenaar var theVal = 'something' 3452822ba247SBram Moolenaar g:initVal = GetValue() 3453a5d0077eSBram Moolenaar theVal = 'else' 3454a5d0077eSBram Moolenaar g:laterVal = GetValue() 3455a5d0077eSBram Moolenaar END 3456a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3457a5d0077eSBram Moolenaar source Xforward 3458a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3459a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3460a5d0077eSBram Moolenaar 3461a5d0077eSBram Moolenaar unlet g:initVal 3462a5d0077eSBram Moolenaar unlet g:laterVal 3463a5d0077eSBram Moolenaar delete('Xforward') 3464a5d0077eSBram Moolenaarenddef 3465a5d0077eSBram Moolenaar 34669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3467a6294955SBram Moolenaar var vim9_lines =<< trim END 3468a6294955SBram Moolenaar vim9script 3469a6294955SBram Moolenaar var local = 'local' 3470a6294955SBram Moolenaar g:global = 'global' 3471a6294955SBram Moolenaar export var exported = 'exported' 3472a6294955SBram Moolenaar export def GetText(): string 3473a6294955SBram Moolenaar return 'text' 3474a6294955SBram Moolenaar enddef 3475a6294955SBram Moolenaar END 3476a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3477a6294955SBram Moolenaar 3478cfcd011fSBram Moolenaar var legacy_lines =<< trim END 34799721fb4eSBram Moolenaar source Xvim9_script.vim 34809721fb4eSBram Moolenaar 34819721fb4eSBram Moolenaar call assert_false(exists('local')) 34829721fb4eSBram Moolenaar call assert_false(exists('exported')) 34839721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 34849721fb4eSBram Moolenaar call assert_equal('global', global) 34859721fb4eSBram Moolenaar call assert_equal('global', g:global) 34869721fb4eSBram Moolenaar 34879721fb4eSBram Moolenaar " imported variable becomes script-local 34889721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 34899721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 34909721fb4eSBram Moolenaar call assert_false(exists('exported')) 34919721fb4eSBram Moolenaar 34929721fb4eSBram Moolenaar " imported function becomes script-local 34939721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 34949721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 34959721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 34969721fb4eSBram Moolenaar END 34979721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 34989721fb4eSBram Moolenaar 34999721fb4eSBram Moolenaar source Xlegacy_script.vim 35009721fb4eSBram Moolenaar assert_equal('global', g:global) 3501f5be8cdbSBram Moolenaar unlet g:global 35029721fb4eSBram Moolenaar 35039721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 35049721fb4eSBram Moolenaar delete('Xvim9_script.vim') 35059721fb4eSBram Moolenaarenddef 3506a5d0077eSBram Moolenaar 3507e535db86SBram Moolenaardef Test_declare_script_in_func() 3508e535db86SBram Moolenaar var lines =<< trim END 3509e535db86SBram Moolenaar vim9script 3510e535db86SBram Moolenaar func Declare() 3511e535db86SBram Moolenaar let s:local = 123 3512e535db86SBram Moolenaar endfunc 3513e535db86SBram Moolenaar Declare() 3514e535db86SBram Moolenaar assert_equal(123, local) 3515e535db86SBram Moolenaar 3516e535db86SBram Moolenaar var error: string 3517e535db86SBram Moolenaar try 3518e535db86SBram Moolenaar local = 'asdf' 3519e535db86SBram Moolenaar catch 3520e535db86SBram Moolenaar error = v:exception 3521e535db86SBram Moolenaar endtry 3522e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3523e535db86SBram Moolenaar 3524e535db86SBram Moolenaar lockvar local 3525e535db86SBram Moolenaar try 3526e535db86SBram Moolenaar local = 999 3527e535db86SBram Moolenaar catch 3528e535db86SBram Moolenaar error = v:exception 3529e535db86SBram Moolenaar endtry 3530e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3531e535db86SBram Moolenaar END 3532e535db86SBram Moolenaar CheckScriptSuccess(lines) 3533e535db86SBram Moolenaarenddef 3534e535db86SBram Moolenaar 3535e535db86SBram Moolenaar 35367d699701SBram Moolenaarfunc Test_vim9script_not_global() 35377d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 35387d699701SBram Moolenaar let vim9lines =<< trim END 35397d699701SBram Moolenaar vim9script 3540cfcd011fSBram Moolenaar var name = 'local' 35417d699701SBram Moolenaar func TheFunc() 35427d699701SBram Moolenaar echo 'local' 35437d699701SBram Moolenaar endfunc 35447d699701SBram Moolenaar def DefFunc() 35457d699701SBram Moolenaar echo 'local' 35467d699701SBram Moolenaar enddef 35477d699701SBram Moolenaar END 35487d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 35497d699701SBram Moolenaar source Xvim9script.vim 35507d699701SBram Moolenaar try 35517d699701SBram Moolenaar echo g:var 35527d699701SBram Moolenaar assert_report('did not fail') 35537d699701SBram Moolenaar catch /E121:/ 35547d699701SBram Moolenaar " caught 35557d699701SBram Moolenaar endtry 35567d699701SBram Moolenaar try 35577d699701SBram Moolenaar call TheFunc() 35587d699701SBram Moolenaar assert_report('did not fail') 35597d699701SBram Moolenaar catch /E117:/ 35607d699701SBram Moolenaar " caught 35617d699701SBram Moolenaar endtry 35627d699701SBram Moolenaar try 35637d699701SBram Moolenaar call DefFunc() 35647d699701SBram Moolenaar assert_report('did not fail') 35657d699701SBram Moolenaar catch /E117:/ 35667d699701SBram Moolenaar " caught 35677d699701SBram Moolenaar endtry 35687d699701SBram Moolenaar 356925859dd7SBram Moolenaar call delete('Xvim9script.vim') 35707d699701SBram Moolenaarendfunc 35717d699701SBram Moolenaar 3572eeb27bfeSBram Moolenaardef Test_vim9_copen() 3573eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3574eeb27bfeSBram Moolenaar copen 3575eeb27bfeSBram Moolenaar quit 3576eeb27bfeSBram Moolenaarenddef 3577eeb27bfeSBram Moolenaar 357803290b84SBram Moolenaar" test using an auto-loaded function and variable 35792d6b20d6SBram Moolenaardef Test_vim9_autoload() 3580cfcd011fSBram Moolenaar var lines =<< trim END 35812d6b20d6SBram Moolenaar vim9script 358203290b84SBram Moolenaar def some#gettest(): string 358303290b84SBram Moolenaar return 'test' 358403290b84SBram Moolenaar enddef 358503290b84SBram Moolenaar g:some#name = 'name' 3586227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3587e3ffcd99SBram Moolenaar 3588e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3589e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3590e3ffcd99SBram Moolenaar enddef 359103290b84SBram Moolenaar END 359203290b84SBram Moolenaar 359303290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 359403290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 359503290b84SBram Moolenaar var save_rtp = &rtp 359603290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 359703290b84SBram Moolenaar 359803290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 359903290b84SBram Moolenaar assert_equal('name', g:some#name) 3600227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 360103290b84SBram Moolenaar g:some#other = 'other' 360203290b84SBram Moolenaar assert_equal('other', g:some#other) 360303290b84SBram Moolenaar 3604e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3605e3ffcd99SBram Moolenaar 360617f700acSBram Moolenaar # upper case script name works 360717f700acSBram Moolenaar lines =<< trim END 360817f700acSBram Moolenaar vim9script 360917f700acSBram Moolenaar def Other#getOther(): string 361017f700acSBram Moolenaar return 'other' 361117f700acSBram Moolenaar enddef 361217f700acSBram Moolenaar END 361317f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 361417f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 361517f700acSBram Moolenaar 361603290b84SBram Moolenaar delete('Xdir', 'rf') 361703290b84SBram Moolenaar &rtp = save_rtp 361803290b84SBram Moolenaarenddef 361903290b84SBram Moolenaar 362003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 362103290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 362203290b84SBram Moolenaar var lines =<< trim END 362303290b84SBram Moolenaar vim9script 36242d6b20d6SBram Moolenaar def foo#test() 36252d6b20d6SBram Moolenaar echomsg getreg('"') 36262d6b20d6SBram Moolenaar enddef 36272d6b20d6SBram Moolenaar END 36282d6b20d6SBram Moolenaar 36292d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 36302d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3631cfcd011fSBram Moolenaar var save_rtp = &rtp 36322d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 36332d6b20d6SBram Moolenaar augroup test 36342d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 36352d6b20d6SBram Moolenaar augroup END 36362d6b20d6SBram Moolenaar 36372d6b20d6SBram Moolenaar normal Y 36382d6b20d6SBram Moolenaar 36392d6b20d6SBram Moolenaar augroup test 36402d6b20d6SBram Moolenaar autocmd! 36412d6b20d6SBram Moolenaar augroup END 36422d6b20d6SBram Moolenaar delete('Xdir', 'rf') 36432d6b20d6SBram Moolenaar &rtp = save_rtp 36442d6b20d6SBram Moolenaarenddef 36452d6b20d6SBram Moolenaar 364677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 364777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3648cfcd011fSBram Moolenaar var lines =<< trim END 364977e5dcc3SBram Moolenaar vim9script 365077e5dcc3SBram Moolenaar def crash#func() 365177e5dcc3SBram Moolenaar try 365277e5dcc3SBram Moolenaar for x in List() 365377e5dcc3SBram Moolenaar endfor 365477e5dcc3SBram Moolenaar catch 365577e5dcc3SBram Moolenaar endtry 365677e5dcc3SBram Moolenaar g:ok = true 365777e5dcc3SBram Moolenaar enddef 365877e5dcc3SBram Moolenaar fu List() 365977e5dcc3SBram Moolenaar invalid 366077e5dcc3SBram Moolenaar endfu 366177e5dcc3SBram Moolenaar try 366248e11c10SBram Moolenaar alsoinvalid 366377e5dcc3SBram Moolenaar catch /wontmatch/ 366477e5dcc3SBram Moolenaar endtry 366577e5dcc3SBram Moolenaar END 366677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 366777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 366877e5dcc3SBram Moolenaar 366977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 367077e5dcc3SBram Moolenaar lines =<< trim END 367177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 367277e5dcc3SBram Moolenaar call crash#func() 367377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 36749c4f5520SBram Moolenaar qall! 367577e5dcc3SBram Moolenaar END 367677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 367777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 367877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 367977e5dcc3SBram Moolenaar 368077e5dcc3SBram Moolenaar delete('Xdidit') 368177e5dcc3SBram Moolenaar delete('Xscript') 368277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 368303290b84SBram Moolenaar 368403290b84SBram Moolenaar lines =<< trim END 368503290b84SBram Moolenaar vim9script 368603290b84SBram Moolenaar var foo#bar = 'asdf' 368703290b84SBram Moolenaar END 368803290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 368977e5dcc3SBram Moolenaarenddef 369077e5dcc3SBram Moolenaar 369181e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 369281e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 369381e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3694cfcd011fSBram Moolenaar var lines =<< trim END 369581e17fbeSBram Moolenaar let s:counter = 1 369681e17fbeSBram Moolenaar def s:Func() 369781e17fbeSBram Moolenaar au! CursorHold 369881e17fbeSBram Moolenaar au CursorHold * s:counter += 1 369981e17fbeSBram Moolenaar enddef 370081e17fbeSBram Moolenaar call s:Func() 370181e17fbeSBram Moolenaar doau CursorHold 370281e17fbeSBram Moolenaar call assert_equal(2, s:counter) 370381e17fbeSBram Moolenaar au! CursorHold 370481e17fbeSBram Moolenaar END 370581e17fbeSBram Moolenaar CheckScriptSuccess(lines) 370681e17fbeSBram Moolenaarenddef 370781e17fbeSBram Moolenaar 3708b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3709b5841b99SBram Moolenaar var save_rtp = &rtp 3710b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3711b5841b99SBram Moolenaar &rtp = dir 3712b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3713b5841b99SBram Moolenaar 3714b5841b99SBram Moolenaar var lines =<< trim END 3715b5841b99SBram Moolenaar vim9script noclear 3716b5841b99SBram Moolenaar def script#autoloaded() 3717b5841b99SBram Moolenaar enddef 3718b5841b99SBram Moolenaar def Broken() 3719b5841b99SBram Moolenaar var x: any = '' 3720b5841b99SBram Moolenaar eval x != 0 3721b5841b99SBram Moolenaar enddef 3722b5841b99SBram Moolenaar Broken() 3723b5841b99SBram Moolenaar END 3724b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3725b5841b99SBram Moolenaar 3726b5841b99SBram Moolenaar lines =<< trim END 3727b5841b99SBram Moolenaar vim9script 3728b5841b99SBram Moolenaar def CallAutoloaded() 3729b5841b99SBram Moolenaar script#autoloaded() 3730b5841b99SBram Moolenaar enddef 3731b5841b99SBram Moolenaar 3732b5841b99SBram Moolenaar function Legacy() 3733b5841b99SBram Moolenaar try 3734b5841b99SBram Moolenaar call s:CallAutoloaded() 3735b5841b99SBram Moolenaar catch 3736b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3737b5841b99SBram Moolenaar endtry 3738b5841b99SBram Moolenaar endfunction 3739b5841b99SBram Moolenaar 3740b5841b99SBram Moolenaar Legacy() 3741b5841b99SBram Moolenaar END 3742b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3743b5841b99SBram Moolenaar 3744b5841b99SBram Moolenaar &rtp = save_rtp 3745b5841b99SBram Moolenaar delete(dir, 'rf') 3746b5841b99SBram Moolenaarenddef 3747b5841b99SBram Moolenaar 37483896a105SBram Moolenaardef Test_cmdline_win() 37493896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 37503896a105SBram Moolenaar # the command line window. 37513896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3752cfcd011fSBram Moolenaar var export_lines =<< trim END 37533896a105SBram Moolenaar vim9script 3754cfcd011fSBram Moolenaar export var That = 'yes' 37553896a105SBram Moolenaar END 37563896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3757cfcd011fSBram Moolenaar var import_lines =<< trim END 37583896a105SBram Moolenaar vim9script 37593896a105SBram Moolenaar import That from './Xexport.vim' 37603896a105SBram Moolenaar END 37613896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3762cfcd011fSBram Moolenaar var save_rtp = &rtp 37633896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 37643896a105SBram Moolenaar syntax on 37653896a105SBram Moolenaar augroup CmdWin 37663896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 37673896a105SBram Moolenaar augroup END 37683896a105SBram Moolenaar # this will open and also close the cmdline window 37693896a105SBram Moolenaar feedkeys('q:', 'xt') 37703896a105SBram Moolenaar assert_equal('yes', g:got_there) 37713896a105SBram Moolenaar 37723896a105SBram Moolenaar augroup CmdWin 37733896a105SBram Moolenaar au! 37743896a105SBram Moolenaar augroup END 37753896a105SBram Moolenaar &rtp = save_rtp 37763896a105SBram Moolenaar delete('rtp', 'rf') 37773896a105SBram Moolenaarenddef 37783896a105SBram Moolenaar 3779e3d4685fSBram Moolenaardef Test_invalid_sid() 3780e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 378125859dd7SBram Moolenaar 37829c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3783d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3784e3d4685fSBram Moolenaar endif 3785e3d4685fSBram Moolenaar delete('Xdidit') 3786e3d4685fSBram Moolenaarenddef 3787e3d4685fSBram Moolenaar 37889ec7026fSBram Moolenaardef Test_restoring_cpo() 37899ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 37909ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 37919ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 37929ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 37939ec7026fSBram Moolenaar endif 37949ec7026fSBram Moolenaar delete('Xsourced') 37959ec7026fSBram Moolenaar delete('Xclose') 3796090728adSBram Moolenaar delete('Xdone') 37970123cc1eSBram Moolenaar 37980123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 37990123cc1eSBram Moolenaar set cpo=aABceFsMny> 38000123cc1eSBram Moolenaar edit XanotherScript 38010123cc1eSBram Moolenaar so % 38020123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38030123cc1eSBram Moolenaar :1del 38040123cc1eSBram Moolenaar w 38050123cc1eSBram Moolenaar so % 38060123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38070123cc1eSBram Moolenaar 38080123cc1eSBram Moolenaar delete('XanotherScript') 38090123cc1eSBram Moolenaar set cpo&vim 38109ec7026fSBram Moolenaarenddef 38119ec7026fSBram Moolenaar 3812ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3813ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 381437294bd6SBram Moolenaar CheckScreendump 3815ffb7dcdbSBram Moolenaar CheckFeature timers 381637294bd6SBram Moolenaar 3817ffb7dcdbSBram Moolenaar let lines =<< trim END 381837294bd6SBram Moolenaar vim9script 381937294bd6SBram Moolenaar def script#func() 382037294bd6SBram Moolenaar enddef 382137294bd6SBram Moolenaar END 3822ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3823ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 382437294bd6SBram Moolenaar 3825ffb7dcdbSBram Moolenaar let lines =<< trim END 382637294bd6SBram Moolenaar vim9script 382737294bd6SBram Moolenaar set cpo+=M 382837294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3829767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 383037294bd6SBram Moolenaar setline(1, 'some text') 383137294bd6SBram Moolenaar END 3832ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3833ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3834ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3835ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 383637294bd6SBram Moolenaar 3837ffb7dcdbSBram Moolenaar " clean up 3838ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3839ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3840ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3841ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3842ffb7dcdbSBram Moolenaarendfunc 384337294bd6SBram Moolenaar 38449ec7026fSBram Moolenaar 3845f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3846cfcd011fSBram Moolenaar var lines =<< trim END 3847cfcd011fSBram Moolenaar var name: any 3848cfcd011fSBram Moolenaar assert_equal(0, name) 3849f0afd9e1SBram Moolenaar END 3850f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3851f0afd9e1SBram Moolenaarenddef 3852f0afd9e1SBram Moolenaar 38537e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 385458dbef33SBram Moolenaar CheckRunVimInTerminal 385558dbef33SBram Moolenaar 38567e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 38577e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 38587e9210eaSBram Moolenaarendfunc 38597e9210eaSBram Moolenaar 38607e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 38619c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3862cfcd011fSBram Moolenaar var lines =<< trim END 38639c4f5520SBram Moolenaar func CheckAndQuit() 38649c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 38659c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 38669c4f5520SBram Moolenaar endfunc 38679c4f5520SBram Moolenaar END 38689c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 38699c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3870e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 38719c4f5520SBram Moolenaar # define Afunc() on the command line 38729c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 38739c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 38742949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 38759c4f5520SBram Moolenaar 38769c4f5520SBram Moolenaar call StopVimInTerminal(buf) 38779c4f5520SBram Moolenaar delete('XcallFunc') 38789c4f5520SBram Moolenaar delete('Xdidcmd') 38799c4f5520SBram Moolenaarenddef 38809c4f5520SBram Moolenaar 3881fcdc5d83SBram Moolenaardef Test_script_var_scope() 3882fcdc5d83SBram Moolenaar var lines =<< trim END 3883fcdc5d83SBram Moolenaar vim9script 3884fcdc5d83SBram Moolenaar if true 3885fcdc5d83SBram Moolenaar if true 3886fcdc5d83SBram Moolenaar var one = 'one' 3887fcdc5d83SBram Moolenaar echo one 3888fcdc5d83SBram Moolenaar endif 3889fcdc5d83SBram Moolenaar echo one 3890fcdc5d83SBram Moolenaar endif 3891fcdc5d83SBram Moolenaar END 3892fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3893fcdc5d83SBram Moolenaar 3894fcdc5d83SBram Moolenaar lines =<< trim END 3895fcdc5d83SBram Moolenaar vim9script 3896fcdc5d83SBram Moolenaar if true 3897fcdc5d83SBram Moolenaar if false 3898fcdc5d83SBram Moolenaar var one = 'one' 3899fcdc5d83SBram Moolenaar echo one 3900fcdc5d83SBram Moolenaar else 3901fcdc5d83SBram Moolenaar var one = 'one' 3902fcdc5d83SBram Moolenaar echo one 3903fcdc5d83SBram Moolenaar endif 3904fcdc5d83SBram Moolenaar echo one 3905fcdc5d83SBram Moolenaar endif 3906fcdc5d83SBram Moolenaar END 3907fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3908fcdc5d83SBram Moolenaar 3909fcdc5d83SBram Moolenaar lines =<< trim END 3910fcdc5d83SBram Moolenaar vim9script 3911fcdc5d83SBram Moolenaar while true 3912fcdc5d83SBram Moolenaar var one = 'one' 3913fcdc5d83SBram Moolenaar echo one 3914fcdc5d83SBram Moolenaar break 3915fcdc5d83SBram Moolenaar endwhile 3916fcdc5d83SBram Moolenaar echo one 3917fcdc5d83SBram Moolenaar END 3918fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3919fcdc5d83SBram Moolenaar 3920fcdc5d83SBram Moolenaar lines =<< trim END 3921fcdc5d83SBram Moolenaar vim9script 3922fcdc5d83SBram Moolenaar for i in range(1) 3923fcdc5d83SBram Moolenaar var one = 'one' 3924fcdc5d83SBram Moolenaar echo one 3925fcdc5d83SBram Moolenaar endfor 3926fcdc5d83SBram Moolenaar echo one 3927fcdc5d83SBram Moolenaar END 3928fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 39299becdf2bSBram Moolenaar 39309becdf2bSBram Moolenaar lines =<< trim END 39319becdf2bSBram Moolenaar vim9script 39329becdf2bSBram Moolenaar { 39339becdf2bSBram Moolenaar var one = 'one' 39349becdf2bSBram Moolenaar assert_equal('one', one) 39359becdf2bSBram Moolenaar } 39369becdf2bSBram Moolenaar assert_false(exists('one')) 39379becdf2bSBram Moolenaar assert_false(exists('s:one')) 39389becdf2bSBram Moolenaar END 39399becdf2bSBram Moolenaar CheckScriptSuccess(lines) 39409becdf2bSBram Moolenaar 39419becdf2bSBram Moolenaar lines =<< trim END 39429becdf2bSBram Moolenaar vim9script 39439becdf2bSBram Moolenaar { 39449becdf2bSBram Moolenaar var one = 'one' 39459becdf2bSBram Moolenaar echo one 39469becdf2bSBram Moolenaar } 39479becdf2bSBram Moolenaar echo one 39489becdf2bSBram Moolenaar END 39499becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3950fcdc5d83SBram Moolenaarenddef 3951fcdc5d83SBram Moolenaar 3952352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3953352134bbSBram Moolenaar var lines =<< trim END 3954352134bbSBram Moolenaar vim9script 39552a38908bSBram Moolenaar def Callback(...l: list<any>) 3956352134bbSBram Moolenaar try 3957352134bbSBram Moolenaar var x: string 3958352134bbSBram Moolenaar var y: string 3959352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3960352134bbSBram Moolenaar [x, y] = [''] 3961352134bbSBram Moolenaar catch 3962352134bbSBram Moolenaar g:caught = 'yes' 3963352134bbSBram Moolenaar endtry 3964352134bbSBram Moolenaar enddef 3965e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3966352134bbSBram Moolenaar feedkeys("\r", 'xt') 3967352134bbSBram Moolenaar END 3968352134bbSBram Moolenaar CheckScriptSuccess(lines) 3969352134bbSBram Moolenaar 3970352134bbSBram Moolenaar unlet g:caught 3971352134bbSBram Moolenaarenddef 3972352134bbSBram Moolenaar 3973631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3974631e8f93SBram Moolenaar if !has('unix') || !has('job') 3975631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3976631e8f93SBram Moolenaar endif 3977631e8f93SBram Moolenaar var lines =<< trim END 3978631e8f93SBram Moolenaar vim9script 3979631e8f93SBram Moolenaar var source: list<number> 39802a38908bSBram Moolenaar def Out_cb(...l: list<any>) 3981631e8f93SBram Moolenaar eval [][0] 3982631e8f93SBram Moolenaar enddef 39832a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 3984631e8f93SBram Moolenaar sleep 1m 3985631e8f93SBram Moolenaar source += l 3986631e8f93SBram Moolenaar enddef 3987e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 39886f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 39896f17a3f0SBram Moolenaar sleep 10m 39906f17a3f0SBram Moolenaar endwhile 3991206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3992fe95b94fSBram Moolenaar sleep 200m 3993631e8f93SBram Moolenaar END 3994631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3995631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3996631e8f93SBram Moolenaar delete('Xdef') 3997631e8f93SBram Moolenaarenddef 3998631e8f93SBram Moolenaar 39994324d87aSBram Moolenaardef InvokeNormal() 40004324d87aSBram Moolenaar exe "norm! :m+1\r" 40014324d87aSBram Moolenaarenddef 40024324d87aSBram Moolenaar 40034324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 40044324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 40054324d87aSBram Moolenaar new 40064324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 40074324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 40084324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 40094324d87aSBram Moolenaar xunmap <F3> 4010b5b9480eSBram Moolenaarenddef 4011b5b9480eSBram Moolenaar 4012b5b9480eSBram Moolenaardef Test_white_space_after_command() 4013b5b9480eSBram Moolenaar var lines =<< trim END 4014b5b9480eSBram Moolenaar exit_cb: Func}) 4015b5b9480eSBram Moolenaar END 4016b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4017f8103f27SBram Moolenaar 4018f8103f27SBram Moolenaar lines =<< trim END 4019f8103f27SBram Moolenaar e# 4020f8103f27SBram Moolenaar END 4021f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 40224324d87aSBram Moolenaarenddef 40234324d87aSBram Moolenaar 40244aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 40254aab88d9SBram Moolenaar var lines =<< trim END 40264aab88d9SBram Moolenaar vim9script 40274aab88d9SBram Moolenaar if exists('g:guard') 40284aab88d9SBram Moolenaar finish 40294aab88d9SBram Moolenaar endif 40304aab88d9SBram Moolenaar g:guard = 1 40314aab88d9SBram Moolenaar var name = 'thename' 40324aab88d9SBram Moolenaar def g:GetName(): string 40334aab88d9SBram Moolenaar return name 40344aab88d9SBram Moolenaar enddef 40354aab88d9SBram Moolenaar def g:SetName(arg: string) 40364aab88d9SBram Moolenaar name = arg 40374aab88d9SBram Moolenaar enddef 40384aab88d9SBram Moolenaar END 40394aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 40404aab88d9SBram Moolenaar so XscriptTwice.vim 40414aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 40424aab88d9SBram Moolenaar g:SetName('newname') 40434aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 40444aab88d9SBram Moolenaar so XscriptTwice.vim 40454aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40464aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 40474aab88d9SBram Moolenaar 40484aab88d9SBram Moolenaar delfunc g:GetName 40494aab88d9SBram Moolenaar delfunc g:SetName 40504aab88d9SBram Moolenaar delete('XscriptTwice.vim') 40514aab88d9SBram Moolenaar unlet g:guard 40524aab88d9SBram Moolenaarenddef 40534aab88d9SBram Moolenaar 40544aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 40554aab88d9SBram Moolenaar var exportlines =<< trim END 40564aab88d9SBram Moolenaar vim9script 40574aab88d9SBram Moolenaar if exists('g:guard') 40584aab88d9SBram Moolenaar finish 40594aab88d9SBram Moolenaar endif 40604aab88d9SBram Moolenaar g:guard = 1 40614aab88d9SBram Moolenaar export var name = 'someName' 40624aab88d9SBram Moolenaar END 40634aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 40644aab88d9SBram Moolenaar 40654aab88d9SBram Moolenaar var lines =<< trim END 40664aab88d9SBram Moolenaar vim9script 40674aab88d9SBram Moolenaar import name from './XexportScript.vim' 40684aab88d9SBram Moolenaar def g:GetName(): string 40694aab88d9SBram Moolenaar return name 40704aab88d9SBram Moolenaar enddef 40714aab88d9SBram Moolenaar END 40724aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 40734aab88d9SBram Moolenaar so XscriptImport.vim 40744aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 40754aab88d9SBram Moolenaar 40764aab88d9SBram Moolenaar so XexportScript.vim 40774aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40784aab88d9SBram Moolenaar 40794aab88d9SBram Moolenaar delfunc g:GetName 40804aab88d9SBram Moolenaar delete('XexportScript.vim') 40814aab88d9SBram Moolenaar delete('XscriptImport.vim') 40824aab88d9SBram Moolenaar unlet g:guard 40834aab88d9SBram Moolenaarenddef 40844aab88d9SBram Moolenaar 408510b9421fSBram Moolenaardef Test_unsupported_commands() 408610b9421fSBram Moolenaar var lines =<< trim END 408710b9421fSBram Moolenaar ka 408810b9421fSBram Moolenaar END 40897d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 40907d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 409110b9421fSBram Moolenaar 409210b9421fSBram Moolenaar lines =<< trim END 4093ada1d870SBram Moolenaar :1ka 4094ada1d870SBram Moolenaar END 40957d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 40967d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4097ada1d870SBram Moolenaar 4098ada1d870SBram Moolenaar lines =<< trim END 409910b9421fSBram Moolenaar t 410010b9421fSBram Moolenaar END 410110b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 410210b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 410310b9421fSBram Moolenaar 410410b9421fSBram Moolenaar lines =<< trim END 410510b9421fSBram Moolenaar x 410610b9421fSBram Moolenaar END 410710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 410810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 410910b9421fSBram Moolenaar 411010b9421fSBram Moolenaar lines =<< trim END 411110b9421fSBram Moolenaar xit 411210b9421fSBram Moolenaar END 411310b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 411410b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 411510b9421fSBram Moolenaarenddef 411610b9421fSBram Moolenaar 4117c70fe460SBram Moolenaardef Test_mapping_line_number() 4118c70fe460SBram Moolenaar var lines =<< trim END 4119c70fe460SBram Moolenaar vim9script 4120c70fe460SBram Moolenaar def g:FuncA() 4121c70fe460SBram Moolenaar # Some comment 4122c70fe460SBram Moolenaar FuncB(0) 4123c70fe460SBram Moolenaar enddef 4124c70fe460SBram Moolenaar # Some comment 4125c70fe460SBram Moolenaar def FuncB( 4126c70fe460SBram Moolenaar # Some comment 4127c70fe460SBram Moolenaar n: number 4128c70fe460SBram Moolenaar ) 4129c70fe460SBram Moolenaar exe 'nno ' 4130c70fe460SBram Moolenaar # Some comment 4131c70fe460SBram Moolenaar .. '<F3> a' 4132c70fe460SBram Moolenaar .. 'b' 4133c70fe460SBram Moolenaar .. 'c' 4134c70fe460SBram Moolenaar enddef 4135c70fe460SBram Moolenaar END 4136c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4137c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4138c70fe460SBram Moolenaar assert_match('No mapping found', res) 4139c70fe460SBram Moolenaar 4140c70fe460SBram Moolenaar g:FuncA() 4141c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4142c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4143c70fe460SBram Moolenaar 4144c70fe460SBram Moolenaar nunmap <F3> 4145c70fe460SBram Moolenaar delfunc g:FuncA 4146c70fe460SBram Moolenaarenddef 4147c70fe460SBram Moolenaar 4148deb108baSBram Moolenaardef Test_option_set() 4149deb108baSBram Moolenaar # legacy script allows for white space 4150deb108baSBram Moolenaar var lines =<< trim END 4151deb108baSBram Moolenaar set foldlevel =11 4152deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4153deb108baSBram Moolenaar END 4154deb108baSBram Moolenaar CheckScriptSuccess(lines) 4155deb108baSBram Moolenaar 4156deb108baSBram Moolenaar set foldlevel 4157deb108baSBram Moolenaar set foldlevel=12 4158deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4159deb108baSBram Moolenaar set foldlevel+=2 4160deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4161deb108baSBram Moolenaar set foldlevel-=3 4162deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4163deb108baSBram Moolenaar 4164deb108baSBram Moolenaar lines =<< trim END 4165deb108baSBram Moolenaar set foldlevel =1 4166deb108baSBram Moolenaar END 4167deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4168deb108baSBram Moolenaar 4169deb108baSBram Moolenaar lines =<< trim END 4170deb108baSBram Moolenaar set foldlevel +=1 4171deb108baSBram Moolenaar END 4172deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4173deb108baSBram Moolenaar 4174deb108baSBram Moolenaar lines =<< trim END 4175deb108baSBram Moolenaar set foldlevel ^=1 4176deb108baSBram Moolenaar END 4177deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4178deb108baSBram Moolenaar 4179deb108baSBram Moolenaar lines =<< trim END 4180deb108baSBram Moolenaar set foldlevel -=1 4181deb108baSBram Moolenaar END 4182deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4183deb108baSBram Moolenaar 4184deb108baSBram Moolenaar set foldlevel& 4185deb108baSBram Moolenaarenddef 4186deb108baSBram Moolenaar 4187208f0b48SBram Moolenaardef Test_option_modifier() 41881594f313SBram Moolenaar # legacy script allows for white space 4189208f0b48SBram Moolenaar var lines =<< trim END 4190208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4191208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4192208f0b48SBram Moolenaar END 4193208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4194208f0b48SBram Moolenaar 41951594f313SBram Moolenaar set hlsearch 41961594f313SBram Moolenaar set hlsearch! 41971594f313SBram Moolenaar assert_equal(false, &hlsearch) 41981594f313SBram Moolenaar 41991594f313SBram Moolenaar set hlsearch 4200208f0b48SBram Moolenaar set hlsearch& 42011594f313SBram Moolenaar assert_equal(false, &hlsearch) 4202208f0b48SBram Moolenaar 4203208f0b48SBram Moolenaar lines =<< trim END 42041594f313SBram Moolenaar set hlsearch & 4205208f0b48SBram Moolenaar END 42061594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 42071594f313SBram Moolenaar 42081594f313SBram Moolenaar lines =<< trim END 42091594f313SBram Moolenaar set hlsearch ! 42101594f313SBram Moolenaar END 42111594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 42121594f313SBram Moolenaar 42131594f313SBram Moolenaar set hlsearch& 4214208f0b48SBram Moolenaarenddef 4215208f0b48SBram Moolenaar 4216c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4217c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4218c03fe66aSBram Moolenaar var lines =<< trim END 4219c03fe66aSBram Moolenaar echoerr 'some' 4220c03fe66aSBram Moolenaar .. ' error' 4221c03fe66aSBram Moolenaar .. ' continued' 4222c03fe66aSBram Moolenaar END 4223c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4224c03fe66aSBram Moolenaarenddef 4225c03fe66aSBram Moolenaar 4226648594eaSBram Moolenaardef ProfiledWithLambda() 4227d9162550SBram Moolenaar var n = 3 4228d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4229d9162550SBram Moolenaarenddef 4230d9162550SBram Moolenaar 4231648594eaSBram Moolenaardef ProfiledNested() 4232648594eaSBram Moolenaar var x = 0 4233648594eaSBram Moolenaar def Nested(): any 4234648594eaSBram Moolenaar return x 4235648594eaSBram Moolenaar enddef 4236648594eaSBram Moolenaar Nested() 4237648594eaSBram Moolenaarenddef 4238648594eaSBram Moolenaar 4239ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4240ffcfddc7SBram Moolenaar var x = 0 4241ffcfddc7SBram Moolenaar def Nested(): any 4242ffcfddc7SBram Moolenaar return x 4243ffcfddc7SBram Moolenaar enddef 4244ffcfddc7SBram Moolenaar Nested() 4245ffcfddc7SBram Moolenaarenddef 4246ffcfddc7SBram Moolenaar 4247d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4248d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4249d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 42504ece152aSBram Moolenaar CheckFeature profile 42514ece152aSBram Moolenaar 4252d9162550SBram Moolenaar profile start Xprofile.log 4253648594eaSBram Moolenaar profile func ProfiledWithLambda 4254648594eaSBram Moolenaar ProfiledWithLambda() 4255ffcfddc7SBram Moolenaar 4256648594eaSBram Moolenaar profile func ProfiledNested 4257648594eaSBram Moolenaar ProfiledNested() 4258ffcfddc7SBram Moolenaar 4259ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4260ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4261ffcfddc7SBram Moolenaar profile func * 4262ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4263ffcfddc7SBram Moolenaar 4264ffcfddc7SBram Moolenaar profdel func * 4265ffcfddc7SBram Moolenaar profile pause 4266d9162550SBram Moolenaarenddef 4267d9162550SBram Moolenaar 4268585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4269585fea7bSBram Moolenaardef Test_substitute_cmd() 4270585fea7bSBram Moolenaar new 4271585fea7bSBram Moolenaar setline(1, 'something') 4272585fea7bSBram Moolenaar :substitute(some(other( 4273585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4274585fea7bSBram Moolenaar bwipe! 4275585fea7bSBram Moolenaar 4276f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4277cfcd011fSBram Moolenaar var lines =<< trim END 4278585fea7bSBram Moolenaar vim9script 4279585fea7bSBram Moolenaar new 4280585fea7bSBram Moolenaar setline(1, 'something') 4281585fea7bSBram Moolenaar :substitute(some(other( 4282585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4283585fea7bSBram Moolenaar bwipe! 4284585fea7bSBram Moolenaar END 4285585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4286585fea7bSBram Moolenaar source Xvim9lines 4287585fea7bSBram Moolenaar 4288585fea7bSBram Moolenaar delete('Xvim9lines') 4289585fea7bSBram Moolenaarenddef 4290585fea7bSBram Moolenaar 42918a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4292