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 584*9fa5dabeSBram Moolenaar # no requirement for spaces before | 585*9fa5dabeSBram Moolenaar try|echo 0|catch|endtry 586*9fa5dabeSBram Moolenaar 5877e82c5f3SBram Moolenaar # return in finally after empty catch 5887e82c5f3SBram Moolenaar def ReturnInFinally(): number 5897e82c5f3SBram Moolenaar try 5907e82c5f3SBram Moolenaar finally 5917e82c5f3SBram Moolenaar return 4 5927e82c5f3SBram Moolenaar endtry 5937e82c5f3SBram Moolenaar return 2 5947e82c5f3SBram Moolenaar enddef 5957e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5968ac681a2SBram Moolenaar 5978ac681a2SBram Moolenaar var lines =<< trim END 5988ac681a2SBram Moolenaar vim9script 5998ac681a2SBram Moolenaar try 6008ac681a2SBram Moolenaar acos('0.5') 6018ac681a2SBram Moolenaar ->setline(1) 6028ac681a2SBram Moolenaar catch 6038ac681a2SBram Moolenaar g:caught = v:exception 6048ac681a2SBram Moolenaar endtry 6058ac681a2SBram Moolenaar END 6068ac681a2SBram Moolenaar CheckScriptSuccess(lines) 6078ac681a2SBram Moolenaar assert_match('E808: Number or Float required', g:caught) 6088ac681a2SBram Moolenaar unlet g:caught 6094197828dSBram Moolenaar 6104197828dSBram Moolenaar # missing catch and/or finally 6114197828dSBram Moolenaar lines =<< trim END 6124197828dSBram Moolenaar vim9script 6134197828dSBram Moolenaar try 6144197828dSBram Moolenaar echo 'something' 6154197828dSBram Moolenaar endtry 6164197828dSBram Moolenaar END 6174197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6188a7d6542SBram Moolenaarenddef 6198a7d6542SBram Moolenaar 6203f987b59SBram Moolenaardef Test_try_in_catch() 6213f987b59SBram Moolenaar var lines =<< trim END 6223f987b59SBram Moolenaar vim9script 6233f987b59SBram Moolenaar var seq = [] 6243f987b59SBram Moolenaar def DoIt() 6253f987b59SBram Moolenaar try 6263f987b59SBram Moolenaar seq->add('throw 1') 6273f987b59SBram Moolenaar eval [][0] 6283f987b59SBram Moolenaar seq->add('notreached') 6293f987b59SBram Moolenaar catch 6303f987b59SBram Moolenaar seq->add('catch') 6313f987b59SBram Moolenaar try 6323f987b59SBram Moolenaar seq->add('throw 2') 6333f987b59SBram Moolenaar eval [][0] 6343f987b59SBram Moolenaar seq->add('notreached') 6353f987b59SBram Moolenaar catch /nothing/ 6363f987b59SBram Moolenaar seq->add('notreached') 6373f987b59SBram Moolenaar endtry 6383f987b59SBram Moolenaar seq->add('done') 6393f987b59SBram Moolenaar endtry 6403f987b59SBram Moolenaar enddef 6413f987b59SBram Moolenaar DoIt() 6423f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6433f987b59SBram Moolenaar END 6443f987b59SBram Moolenaarenddef 6453f987b59SBram Moolenaar 646d3d8feebSBram Moolenaardef Test_error_in_catch() 647d3d8feebSBram Moolenaar var lines =<< trim END 648d3d8feebSBram Moolenaar try 649d3d8feebSBram Moolenaar eval [][0] 650d3d8feebSBram Moolenaar catch /E684:/ 651d3d8feebSBram Moolenaar eval [][0] 652d3d8feebSBram Moolenaar endtry 653d3d8feebSBram Moolenaar END 654d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 655d3d8feebSBram Moolenaarenddef 656d3d8feebSBram Moolenaar 6572e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6582e34c34bSBram Moolenaardef TryContinueFunc() 6592e34c34bSBram Moolenaar while g:Count < 2 6602e34c34bSBram Moolenaar g:sequence ..= 't' 6612e34c34bSBram Moolenaar try 6622e34c34bSBram Moolenaar echoerr 'Test' 6632e34c34bSBram Moolenaar catch 6642e34c34bSBram Moolenaar g:Count += 1 6652e34c34bSBram Moolenaar g:sequence ..= 'c' 6662e34c34bSBram Moolenaar continue 6672e34c34bSBram Moolenaar endtry 6682e34c34bSBram Moolenaar g:sequence ..= 'e' 6692e34c34bSBram Moolenaar g:Count += 1 6702e34c34bSBram Moolenaar endwhile 6712e34c34bSBram Moolenaarenddef 6722e34c34bSBram Moolenaar 6732e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 6742e34c34bSBram Moolenaar g:Count = 0 6752e34c34bSBram Moolenaar g:sequence = '' 6762e34c34bSBram Moolenaar TryContinueFunc() 6772e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 6782e34c34bSBram Moolenaar unlet g:Count 6792e34c34bSBram Moolenaar unlet g:sequence 6802e34c34bSBram Moolenaarenddef 6812e34c34bSBram Moolenaar 6829cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 6839cb577a6SBram Moolenaar # return in try block returns normally 6849cb577a6SBram Moolenaar def ReturnInTry(): string 6859cb577a6SBram Moolenaar try 6869cb577a6SBram Moolenaar return '"some message"' 6879cb577a6SBram Moolenaar catch 6889cb577a6SBram Moolenaar endtry 6899cb577a6SBram Moolenaar return 'not reached' 6909cb577a6SBram Moolenaar enddef 6919cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6929cb577a6SBram Moolenaarenddef 6939cb577a6SBram Moolenaar 6941430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6951430ceebSBram Moolenaar var lines =<< trim END 6961430ceebSBram Moolenaar vim9script 697c323527dSBram Moolenaar au BufEnter * eval 1 + 2 6981430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6991430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 7001430ceebSBram Moolenaar var items = [ 7011430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 7021430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7031430ceebSBram Moolenaar ] 7041430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7051430ceebSBram Moolenaar cwindow 7061430ceebSBram Moolenaar 7071430ceebSBram Moolenaar def CnextOrCfirst() 7081430ceebSBram Moolenaar # if cnext fails, cfirst is used 7091430ceebSBram Moolenaar try 7101430ceebSBram Moolenaar cnext 7111430ceebSBram Moolenaar catch 7121430ceebSBram Moolenaar cfirst 7131430ceebSBram Moolenaar endtry 7141430ceebSBram Moolenaar enddef 7151430ceebSBram Moolenaar 7161430ceebSBram Moolenaar CnextOrCfirst() 7171430ceebSBram Moolenaar CnextOrCfirst() 7181430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7191430ceebSBram Moolenaar qall 7201430ceebSBram Moolenaar END 7211430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7221430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7231430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7241430ceebSBram Moolenaar 7251430ceebSBram Moolenaar delete('Xfile1') 7261430ceebSBram Moolenaar delete('Xfile2') 7271430ceebSBram Moolenaar delete('XCatchCnext') 7281430ceebSBram Moolenaar delete('Xresult') 7291430ceebSBram Moolenaarenddef 7301430ceebSBram Moolenaar 7319e1d9e34SBram Moolenaardef Test_throw_skipped() 7329e1d9e34SBram Moolenaar if 0 7339e1d9e34SBram Moolenaar throw dontgethere 7349e1d9e34SBram Moolenaar endif 7359e1d9e34SBram Moolenaarenddef 7369e1d9e34SBram Moolenaar 7378f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7388f81b22eSBram Moolenaar var lines =<< trim END 7398f81b22eSBram Moolenaar vim9script 7408f81b22eSBram Moolenaar def Func() 7418f81b22eSBram Moolenaar throw 'error' 7428f81b22eSBram Moolenaar enddef 7438f81b22eSBram Moolenaar silent! Func() 7448f81b22eSBram Moolenaar END 7458f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7468f81b22eSBram Moolenaar source XthrowSilenced 7478f81b22eSBram Moolenaar delete('XthrowSilenced') 7488f81b22eSBram Moolenaarenddef 7498f81b22eSBram Moolenaar 750e859312eSBram Moolenaardef DeletedFunc(): list<any> 751e859312eSBram Moolenaar return ['delete me'] 752e859312eSBram Moolenaarenddef 753e859312eSBram Moolenaardefcompile 754e859312eSBram Moolenaardelfunc DeletedFunc 755e859312eSBram Moolenaar 756257cc5eeSBram Moolenaardef ThrowFromDef() 757a72cfb80SBram Moolenaar throw "getout" # comment 758257cc5eeSBram Moolenaarenddef 759257cc5eeSBram Moolenaar 760257cc5eeSBram Moolenaarfunc CatchInFunc() 761257cc5eeSBram Moolenaar try 762257cc5eeSBram Moolenaar call ThrowFromDef() 763257cc5eeSBram Moolenaar catch 764257cc5eeSBram Moolenaar let g:thrown_func = v:exception 765257cc5eeSBram Moolenaar endtry 766257cc5eeSBram Moolenaarendfunc 767257cc5eeSBram Moolenaar 768257cc5eeSBram Moolenaardef CatchInDef() 769257cc5eeSBram Moolenaar try 770257cc5eeSBram Moolenaar ThrowFromDef() 771257cc5eeSBram Moolenaar catch 772257cc5eeSBram Moolenaar g:thrown_def = v:exception 773257cc5eeSBram Moolenaar endtry 774257cc5eeSBram Moolenaarenddef 775257cc5eeSBram Moolenaar 776f575adffSBram Moolenaardef ReturnFinally(): string 777f575adffSBram Moolenaar try 778f575adffSBram Moolenaar return 'intry' 779373863edSBram Moolenaar finall 780f575adffSBram Moolenaar g:in_finally = 'finally' 781f575adffSBram Moolenaar endtry 782f575adffSBram Moolenaar return 'end' 783f575adffSBram Moolenaarenddef 784f575adffSBram Moolenaar 785257cc5eeSBram Moolenaardef Test_try_catch_nested() 786257cc5eeSBram Moolenaar CatchInFunc() 787257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 788257cc5eeSBram Moolenaar 789257cc5eeSBram Moolenaar CatchInDef() 790257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 791f575adffSBram Moolenaar 792f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 793f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 794d3d8feebSBram Moolenaar 795d3d8feebSBram Moolenaar var l = [] 796d3d8feebSBram Moolenaar try 797d3d8feebSBram Moolenaar l->add('1') 798d3d8feebSBram Moolenaar throw 'bad' 799d3d8feebSBram Moolenaar l->add('x') 800d3d8feebSBram Moolenaar catch /bad/ 801d3d8feebSBram Moolenaar l->add('2') 802d3d8feebSBram Moolenaar try 803d3d8feebSBram Moolenaar l->add('3') 804d3d8feebSBram Moolenaar throw 'one' 805d3d8feebSBram Moolenaar l->add('x') 806d3d8feebSBram Moolenaar catch /one/ 807d3d8feebSBram Moolenaar l->add('4') 808d3d8feebSBram Moolenaar try 809d3d8feebSBram Moolenaar l->add('5') 810d3d8feebSBram Moolenaar throw 'more' 811d3d8feebSBram Moolenaar l->add('x') 812d3d8feebSBram Moolenaar catch /more/ 813d3d8feebSBram Moolenaar l->add('6') 814d3d8feebSBram Moolenaar endtry 815d3d8feebSBram Moolenaar endtry 816d3d8feebSBram Moolenaar endtry 817d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 818834193afSBram Moolenaar 819834193afSBram Moolenaar l = [] 820834193afSBram Moolenaar try 821834193afSBram Moolenaar try 822834193afSBram Moolenaar l->add('1') 823834193afSBram Moolenaar throw 'foo' 824834193afSBram Moolenaar l->add('x') 825834193afSBram Moolenaar catch 826834193afSBram Moolenaar l->add('2') 827834193afSBram Moolenaar throw 'bar' 828834193afSBram Moolenaar l->add('x') 829834193afSBram Moolenaar finally 830834193afSBram Moolenaar l->add('3') 831834193afSBram Moolenaar endtry 832834193afSBram Moolenaar l->add('x') 833834193afSBram Moolenaar catch /bar/ 834834193afSBram Moolenaar l->add('4') 835834193afSBram Moolenaar endtry 836834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 837f575adffSBram Moolenaarenddef 838f575adffSBram Moolenaar 8399939f57bSBram Moolenaardef TryOne(): number 8409939f57bSBram Moolenaar try 8419939f57bSBram Moolenaar return 0 8429939f57bSBram Moolenaar catch 8439939f57bSBram Moolenaar endtry 8449939f57bSBram Moolenaar return 0 8459939f57bSBram Moolenaarenddef 8469939f57bSBram Moolenaar 8479939f57bSBram Moolenaardef TryTwo(n: number): string 8489939f57bSBram Moolenaar try 849cfcd011fSBram Moolenaar var x = {} 8509939f57bSBram Moolenaar catch 8519939f57bSBram Moolenaar endtry 8529939f57bSBram Moolenaar return 'text' 8539939f57bSBram Moolenaarenddef 8549939f57bSBram Moolenaar 8559939f57bSBram Moolenaardef Test_try_catch_twice() 8569939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8579939f57bSBram Moolenaarenddef 8589939f57bSBram Moolenaar 859f575adffSBram Moolenaardef Test_try_catch_match() 860cfcd011fSBram Moolenaar var seq = 'a' 861f575adffSBram Moolenaar try 862f575adffSBram Moolenaar throw 'something' 863f575adffSBram Moolenaar catch /nothing/ 864f575adffSBram Moolenaar seq ..= 'x' 865f575adffSBram Moolenaar catch /some/ 866f575adffSBram Moolenaar seq ..= 'b' 867f575adffSBram Moolenaar catch /asdf/ 868f575adffSBram Moolenaar seq ..= 'x' 869e8c4abbbSBram Moolenaar catch ?a\?sdf? 870e8c4abbbSBram Moolenaar seq ..= 'y' 871f575adffSBram Moolenaar finally 872f575adffSBram Moolenaar seq ..= 'c' 873f575adffSBram Moolenaar endtry 874f575adffSBram Moolenaar assert_equal('abc', seq) 875257cc5eeSBram Moolenaarenddef 876257cc5eeSBram Moolenaar 877e8c4abbbSBram Moolenaardef Test_try_catch_fails() 878d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 879d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 880d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 881d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 882d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 883d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 884d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 885d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 88613106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 887d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 888585fea7bSBram Moolenaar 889e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 890d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 891e8c4abbbSBram Moolenaarenddef 892e8c4abbbSBram Moolenaar 8937c5b3c03SBram Moolenaardef Try_catch_skipped() 8947c5b3c03SBram Moolenaar var l = [] 8957c5b3c03SBram Moolenaar try 8967c5b3c03SBram Moolenaar finally 8977c5b3c03SBram Moolenaar endtry 8987c5b3c03SBram Moolenaar 8997c5b3c03SBram Moolenaar if 1 9007c5b3c03SBram Moolenaar else 9017c5b3c03SBram Moolenaar try 9027c5b3c03SBram Moolenaar endtry 9037c5b3c03SBram Moolenaar endif 9047c5b3c03SBram Moolenaarenddef 9057c5b3c03SBram Moolenaar 9067c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9077c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9087c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9097c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9107c5b3c03SBram Moolenaarenddef 9117c5b3c03SBram Moolenaar 9127c5b3c03SBram Moolenaar 9137c5b3c03SBram Moolenaar 914006ad48bSBram Moolenaardef Test_throw_vimscript() 915f5be8cdbSBram Moolenaar # only checks line continuation 916cfcd011fSBram Moolenaar var lines =<< trim END 917006ad48bSBram Moolenaar vim9script 918006ad48bSBram Moolenaar try 919006ad48bSBram Moolenaar throw 'one' 920006ad48bSBram Moolenaar .. 'two' 921006ad48bSBram Moolenaar catch 922006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 923006ad48bSBram Moolenaar endtry 924006ad48bSBram Moolenaar END 925006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9261e021e63SBram Moolenaar 9271e021e63SBram Moolenaar lines =<< trim END 9281e021e63SBram Moolenaar vim9script 929352134bbSBram Moolenaar @r = '' 9301e021e63SBram Moolenaar def Func() 9311e021e63SBram Moolenaar throw @r 9321e021e63SBram Moolenaar enddef 9331e021e63SBram Moolenaar var result = '' 9341e021e63SBram Moolenaar try 9351e021e63SBram Moolenaar Func() 9361e021e63SBram Moolenaar catch /E1129:/ 9371e021e63SBram Moolenaar result = 'caught' 9381e021e63SBram Moolenaar endtry 9391e021e63SBram Moolenaar assert_equal('caught', result) 9401e021e63SBram Moolenaar END 9411e021e63SBram Moolenaar CheckScriptSuccess(lines) 942006ad48bSBram Moolenaarenddef 943006ad48bSBram Moolenaar 944ed677f55SBram Moolenaardef Test_error_in_nested_function() 94503dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 946cfcd011fSBram Moolenaar var lines =<< trim END 947ed677f55SBram Moolenaar vim9script 948ed677f55SBram Moolenaar def Func() 949ed677f55SBram Moolenaar Error() 950ed677f55SBram Moolenaar g:test_var = 1 951ed677f55SBram Moolenaar enddef 952ed677f55SBram Moolenaar func Error() abort 953ed677f55SBram Moolenaar eval [][0] 954ed677f55SBram Moolenaar endfunc 955ed677f55SBram Moolenaar Func() 956ed677f55SBram Moolenaar END 957ed677f55SBram Moolenaar g:test_var = 0 958ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 959ed677f55SBram Moolenaar assert_equal(0, g:test_var) 960ed677f55SBram Moolenaarenddef 961ed677f55SBram Moolenaar 962227c58a4SBram Moolenaardef Test_abort_after_error() 963227c58a4SBram Moolenaar var lines =<< trim END 964227c58a4SBram Moolenaar vim9script 965227c58a4SBram Moolenaar while true 966227c58a4SBram Moolenaar echo notfound 967227c58a4SBram Moolenaar endwhile 968227c58a4SBram Moolenaar g:gotthere = true 969227c58a4SBram Moolenaar END 970227c58a4SBram Moolenaar g:gotthere = false 971227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 972227c58a4SBram Moolenaar assert_false(g:gotthere) 973227c58a4SBram Moolenaar unlet g:gotthere 974227c58a4SBram Moolenaarenddef 975227c58a4SBram Moolenaar 97637c83711SBram Moolenaardef Test_cexpr_vimscript() 977f5be8cdbSBram Moolenaar # only checks line continuation 97837c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 979cfcd011fSBram Moolenaar var lines =<< trim END 98037c83711SBram Moolenaar vim9script 98137c83711SBram Moolenaar cexpr 'File' 98237c83711SBram Moolenaar .. ' someFile' .. 98337c83711SBram Moolenaar ' line 19' 98437c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 98537c83711SBram Moolenaar END 98637c83711SBram Moolenaar CheckScriptSuccess(lines) 98737c83711SBram Moolenaar set errorformat& 98837c83711SBram Moolenaarenddef 98937c83711SBram Moolenaar 990c9edd6b5SBram Moolenaardef Test_statusline_syntax() 991c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 992cfcd011fSBram Moolenaar var lines =<< trim END 993c9edd6b5SBram Moolenaar vim9script 994c9edd6b5SBram Moolenaar func g:Status() 995c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 996c9edd6b5SBram Moolenaar endfunc 997c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 998c9edd6b5SBram Moolenaar redrawstatus 999c9edd6b5SBram Moolenaar set laststatus statusline= 1000c9edd6b5SBram Moolenaar END 1001c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1002c9edd6b5SBram Moolenaarenddef 1003c9edd6b5SBram Moolenaar 1004b209750bSBram Moolenaardef Test_list_vimscript() 1005b209750bSBram Moolenaar # checks line continuation and comments 1006cfcd011fSBram Moolenaar var lines =<< trim END 1007b209750bSBram Moolenaar vim9script 1008cfcd011fSBram Moolenaar var mylist = [ 1009b209750bSBram Moolenaar 'one', 1010b209750bSBram Moolenaar # comment 1011b209750bSBram Moolenaar 'two', # empty line follows 1012b209750bSBram Moolenaar 1013b209750bSBram Moolenaar 'three', 1014b209750bSBram Moolenaar ] 1015b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1016b209750bSBram Moolenaar END 1017b209750bSBram Moolenaar CheckScriptSuccess(lines) 101866250c93SBram Moolenaar 101966250c93SBram Moolenaar # check all lines from heredoc are kept 102066250c93SBram Moolenaar lines =<< trim END 102166250c93SBram Moolenaar # comment 1 102266250c93SBram Moolenaar two 102366250c93SBram Moolenaar # comment 3 102466250c93SBram Moolenaar 102566250c93SBram Moolenaar five 102666250c93SBram Moolenaar # comment 6 102766250c93SBram Moolenaar END 102866250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10294bce26bbSBram Moolenaar 10304bce26bbSBram Moolenaar lines =<< trim END 10314bce26bbSBram Moolenaar [{ 10324bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10334bce26bbSBram Moolenaar END 10344bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1035b209750bSBram Moolenaarenddef 1036b209750bSBram Moolenaar 10372a1381c3SBram Moolenaarif has('channel') 103840ee466cSBram Moolenaar let someJob = test_null_job() 103940ee466cSBram Moolenaar 104040ee466cSBram Moolenaar def FuncWithError() 104140ee466cSBram Moolenaar echomsg g:someJob 104240ee466cSBram Moolenaar enddef 104340ee466cSBram Moolenaar 104440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 104540ee466cSBram Moolenaar try 104640ee466cSBram Moolenaar call FuncWithError() 104740ee466cSBram Moolenaar catch 104840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 104940ee466cSBram Moolenaar endtry 105040ee466cSBram Moolenaar endfunc 10512a1381c3SBram Moolenaarendif 105240ee466cSBram Moolenaar 10538a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10548a7d6542SBram Moolenaar vim9script 1055cfcd011fSBram Moolenaar var name: string = 'bob' 10568a7d6542SBram Moolenaar def Concat(arg: string): string 10578a7d6542SBram Moolenaar return name .. arg 10588a7d6542SBram Moolenaar enddef 1059227a69deSBram Moolenaar g:result = Concat('bie') 1060227a69deSBram Moolenaar g:localname = name 10618a7d6542SBram Moolenaar 10628a7d6542SBram Moolenaar export const CONST = 1234 1063cfcd011fSBram Moolenaar export var exported = 9876 1064cfcd011fSBram Moolenaar export var exp_name = 'John' 10658a7d6542SBram Moolenaar export def Exported(): string 10668a7d6542SBram Moolenaar return 'Exported' 10678a7d6542SBram Moolenaar enddef 106824e93165SBram Moolenaar export def ExportedValue(): number 106924e93165SBram Moolenaar return exported 107024e93165SBram Moolenaar enddef 107124e93165SBram Moolenaar export def ExportedInc() 107224e93165SBram Moolenaar exported += 5 107324e93165SBram Moolenaar enddef 10740f2a5cc6SBram Moolenaar export final theList = [1] 10758a7d6542SBram MoolenaarEND 10768a7d6542SBram Moolenaar 1077b3ca9824SBram Moolenaardef Undo_export_script_lines() 1078b3ca9824SBram Moolenaar unlet g:result 1079b3ca9824SBram Moolenaar unlet g:localname 1080b3ca9824SBram Moolenaarenddef 1081b3ca9824SBram Moolenaar 10825269bd2aSBram Moolenaardef Test_vim9_import_export() 1083cfcd011fSBram Moolenaar var import_script_lines =<< trim END 10848a7d6542SBram Moolenaar vim9script 108524e93165SBram Moolenaar import {exported, Exported, ExportedValue} from './Xexport.vim' 108624e93165SBram Moolenaar g:exported1 = exported 10876e587dcbSBram Moolenaar exported += 3 108824e93165SBram Moolenaar g:exported2 = exported 108924e93165SBram Moolenaar g:exported3 = ExportedValue() 109024e93165SBram Moolenaar 109124e93165SBram Moolenaar import ExportedInc from './Xexport.vim' 109224e93165SBram Moolenaar ExportedInc() 109324e93165SBram Moolenaar g:exported_i1 = exported 109424e93165SBram Moolenaar g:exported_i2 = ExportedValue() 109524e93165SBram Moolenaar 109624e93165SBram Moolenaar exported = 11 109724e93165SBram Moolenaar g:exported_s1 = exported 109824e93165SBram Moolenaar g:exported_s2 = ExportedValue() 109924e93165SBram Moolenaar 11008a7d6542SBram Moolenaar g:imported_func = Exported() 11016e587dcbSBram Moolenaar 110240f4f7a4SBram Moolenaar def GetExported(): string 1103e0de171eSBram Moolenaar var local_dict = {ref: Exported} 110440f4f7a4SBram Moolenaar return local_dict.ref() 110540f4f7a4SBram Moolenaar enddef 110640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 110740f4f7a4SBram Moolenaar 11084db572eeSBram Moolenaar var dir = './' 11094db572eeSBram Moolenaar var ext = ".vim" 11104db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 11116e587dcbSBram Moolenaar g:imported_name = exp_name 11126e587dcbSBram Moolenaar exp_name ..= ' Doe' 11136e587dcbSBram Moolenaar g:imported_name_appended = exp_name 111424e93165SBram Moolenaar g:exported_later = exported 11150f2a5cc6SBram Moolenaar 11160f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11170f2a5cc6SBram Moolenaar theList->add(2) 11180f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 11198a7d6542SBram Moolenaar END 11208a7d6542SBram Moolenaar 11218a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11228a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11238a7d6542SBram Moolenaar 11248a7d6542SBram Moolenaar source Ximport.vim 11258a7d6542SBram Moolenaar 11268a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11278a7d6542SBram Moolenaar assert_equal('bob', g:localname) 112824e93165SBram Moolenaar assert_equal(9876, g:exported1) 112924e93165SBram Moolenaar assert_equal(9879, g:exported2) 113024e93165SBram Moolenaar assert_equal(9879, g:exported3) 113124e93165SBram Moolenaar 113224e93165SBram Moolenaar assert_equal(9884, g:exported_i1) 113324e93165SBram Moolenaar assert_equal(9884, g:exported_i2) 113424e93165SBram Moolenaar 113524e93165SBram Moolenaar assert_equal(11, g:exported_s1) 113624e93165SBram Moolenaar assert_equal(11, g:exported_s2) 113724e93165SBram Moolenaar assert_equal(11, g:exported_later) 113824e93165SBram Moolenaar 11398a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 114040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11416e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11426e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11438a7d6542SBram Moolenaar assert_false(exists('g:name')) 11448a7d6542SBram Moolenaar 1145b3ca9824SBram Moolenaar Undo_export_script_lines() 114624e93165SBram Moolenaar unlet g:exported1 114724e93165SBram Moolenaar unlet g:exported2 114824e93165SBram Moolenaar unlet g:exported3 114924e93165SBram Moolenaar unlet g:exported_i1 115024e93165SBram Moolenaar unlet g:exported_i2 115124e93165SBram Moolenaar unlet g:exported_later 11528a7d6542SBram Moolenaar unlet g:imported_func 11536e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11548a7d6542SBram Moolenaar delete('Ximport.vim') 1155f2d5c240SBram Moolenaar 11561c991144SBram Moolenaar # similar, with line breaks 1157cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11581c991144SBram Moolenaar vim9script 11591c991144SBram Moolenaar import { 11601c991144SBram Moolenaar exported, 11611c991144SBram Moolenaar Exported, 11621c991144SBram Moolenaar } 11631c991144SBram Moolenaar from 11641c991144SBram Moolenaar './Xexport.vim' 116524e93165SBram Moolenaar g:exported = exported 116624e93165SBram Moolenaar exported += 7 116724e93165SBram Moolenaar g:exported_added = exported 11681c991144SBram Moolenaar g:imported_func = Exported() 11691c991144SBram Moolenaar END 11701c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11711c991144SBram Moolenaar source Ximport_lbr.vim 11721c991144SBram Moolenaar 117324e93165SBram Moolenaar assert_equal(11, g:exported) 117424e93165SBram Moolenaar assert_equal(18, g:exported_added) 11751c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11761c991144SBram Moolenaar 11771c991144SBram Moolenaar # exported script not sourced again 11781c991144SBram Moolenaar assert_false(exists('g:result')) 117924e93165SBram Moolenaar unlet g:exported 118024e93165SBram Moolenaar unlet g:exported_added 11811c991144SBram Moolenaar unlet g:imported_func 11821c991144SBram Moolenaar delete('Ximport_lbr.vim') 11831c991144SBram Moolenaar 1184cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1185f2d5c240SBram Moolenaar vim9script 1186f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1187f2d5c240SBram Moolenaar def UseExport() 118824e93165SBram Moolenaar g:exported_def = Export.exported 1189f2d5c240SBram Moolenaar enddef 119024e93165SBram Moolenaar g:exported_script = Export.exported 1191cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1192cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1193f2d5c240SBram Moolenaar UseExport() 1194f2d5c240SBram Moolenaar END 1195f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1196f2d5c240SBram Moolenaar source Ximport.vim 119724e93165SBram Moolenaar 119824e93165SBram Moolenaar assert_equal(18, g:exported_def) 119924e93165SBram Moolenaar assert_equal(18, g:exported_script) 120024e93165SBram Moolenaar unlet g:exported_def 120124e93165SBram Moolenaar unlet g:exported_script 1202f2d5c240SBram Moolenaar 1203cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1204599c89c8SBram Moolenaar vim9script 1205599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1206599c89c8SBram Moolenaar def Func() 1207cfcd011fSBram Moolenaar var dummy = 1 1208cfcd011fSBram Moolenaar var imported = Export + dummy 1209599c89c8SBram Moolenaar enddef 1210822ba247SBram Moolenaar defcompile 1211599c89c8SBram Moolenaar END 1212599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 121344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1214599c89c8SBram Moolenaar 1215cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1216599c89c8SBram Moolenaar vim9script 1217599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1218599c89c8SBram Moolenaar def Func() 1219cfcd011fSBram Moolenaar var imported = Export . exported 1220599c89c8SBram Moolenaar enddef 1221822ba247SBram Moolenaar defcompile 1222599c89c8SBram Moolenaar END 1223599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 122444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1225599c89c8SBram Moolenaar 1226a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1227a6294955SBram Moolenaar vim9script 1228a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1229a6294955SBram Moolenaar var some = 'other' 1230a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1231a6294955SBram Moolenaar defcompile 1232a6294955SBram Moolenaar END 1233a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1234a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1235a6294955SBram Moolenaar 1236cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1237cb4e80faSBram Moolenaar vim9script 1238cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1239cb4e80faSBram Moolenaar g:imported_script = Export exported 1240cb4e80faSBram Moolenaar END 1241cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1242cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1243cb4e80faSBram Moolenaar 1244cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1245cb4e80faSBram Moolenaar vim9script 1246cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1247cb4e80faSBram Moolenaar g:imported_script = Export. exported 1248cb4e80faSBram Moolenaar END 1249cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1250cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1251cb4e80faSBram Moolenaar 1252cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1253599c89c8SBram Moolenaar vim9script 1254599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1255599c89c8SBram Moolenaar def Func() 1256cfcd011fSBram Moolenaar var imported = Export. 1257599c89c8SBram Moolenaar enddef 1258822ba247SBram Moolenaar defcompile 1259599c89c8SBram Moolenaar END 1260599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 126144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1262599c89c8SBram Moolenaar 1263cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 12641c991144SBram Moolenaar vim9script 12651c991144SBram Moolenaar import * 12661c991144SBram Moolenaar as Export 12671c991144SBram Moolenaar from 12681c991144SBram Moolenaar './Xexport.vim' 12691c991144SBram Moolenaar def UseExport() 127024e93165SBram Moolenaar g:exported = Export.exported 12711c991144SBram Moolenaar enddef 12721c991144SBram Moolenaar UseExport() 12731c991144SBram Moolenaar END 12741c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12751c991144SBram Moolenaar source Ximport.vim 127624e93165SBram Moolenaar assert_equal(18, g:exported) 127724e93165SBram Moolenaar unlet g:exported 12781c991144SBram Moolenaar 1279cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1280f2d5c240SBram Moolenaar vim9script 1281f2d5c240SBram Moolenaar import * from './Xexport.vim' 1282f2d5c240SBram Moolenaar END 1283f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 128444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1285f2d5c240SBram Moolenaar 1286f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1287cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1288fa29c8abSBram Moolenaar vim9script 1289fa29c8abSBram Moolenaar import name from './Xexport.vim' 1290fa29c8abSBram Moolenaar END 1291fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 129244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1293fa29c8abSBram Moolenaar 1294f5be8cdbSBram Moolenaar # try to import something that is already defined 1295cfcd011fSBram Moolenaar var import_already_defined =<< trim END 12965269bd2aSBram Moolenaar vim9script 1297cfcd011fSBram Moolenaar var exported = 'something' 12985269bd2aSBram Moolenaar import exported from './Xexport.vim' 12995269bd2aSBram Moolenaar END 13005269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1301057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13025269bd2aSBram Moolenaar 1303f5be8cdbSBram Moolenaar # try to import something that is already defined 13045269bd2aSBram Moolenaar import_already_defined =<< trim END 13055269bd2aSBram Moolenaar vim9script 1306cfcd011fSBram Moolenaar var exported = 'something' 13075269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13085269bd2aSBram Moolenaar END 13095269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1310057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13115269bd2aSBram Moolenaar 1312f5be8cdbSBram Moolenaar # try to import something that is already defined 13135269bd2aSBram Moolenaar import_already_defined =<< trim END 13145269bd2aSBram Moolenaar vim9script 1315cfcd011fSBram Moolenaar var exported = 'something' 13165269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13175269bd2aSBram Moolenaar END 13185269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1319057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13205269bd2aSBram Moolenaar 1321918a4249SBram Moolenaar # try changing an imported const 1322918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1323918a4249SBram Moolenaar vim9script 1324918a4249SBram Moolenaar import CONST from './Xexport.vim' 1325918a4249SBram Moolenaar def Assign() 1326918a4249SBram Moolenaar CONST = 987 1327918a4249SBram Moolenaar enddef 1328918a4249SBram Moolenaar defcompile 1329918a4249SBram Moolenaar END 1330918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1331918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1332918a4249SBram Moolenaar 13330f2a5cc6SBram Moolenaar # try changing an imported final 13340f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13350f2a5cc6SBram Moolenaar vim9script 13360f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13370f2a5cc6SBram Moolenaar def Assign() 13380f2a5cc6SBram Moolenaar theList = [2] 13390f2a5cc6SBram Moolenaar enddef 13400f2a5cc6SBram Moolenaar defcompile 13410f2a5cc6SBram Moolenaar END 13420f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13430f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13440f2a5cc6SBram Moolenaar 1345f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1346cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1347fa29c8abSBram Moolenaar vim9script 1348fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1349fa29c8abSBram Moolenaar END 1350fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 135144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1352fa29c8abSBram Moolenaar 1353cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1354fa29c8abSBram Moolenaar vim9script 1355fa29c8abSBram Moolenaar import name './Xexport.vim' 1356fa29c8abSBram Moolenaar END 1357fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 135844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1359fa29c8abSBram Moolenaar 1360cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1361fa29c8abSBram Moolenaar vim9script 1362fa29c8abSBram Moolenaar import name from Xexport.vim 1363fa29c8abSBram Moolenaar END 1364fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 13654db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1366fa29c8abSBram Moolenaar 1367cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1368fa29c8abSBram Moolenaar vim9script 1369fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1370fa29c8abSBram Moolenaar END 1371fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 137244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1373fa29c8abSBram Moolenaar 1374cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1375fa29c8abSBram Moolenaar vim9script 1376fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1377fa29c8abSBram Moolenaar END 13785269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 137944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1380fa29c8abSBram Moolenaar 138160579350SBram Moolenaar var import_redefining_lines =<< trim END 138260579350SBram Moolenaar vim9script 138360579350SBram Moolenaar import exported from './Xexport.vim' 138460579350SBram Moolenaar var exported = 5 138560579350SBram Moolenaar END 138660579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 138760579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 138860579350SBram Moolenaar 138960579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 139060579350SBram Moolenaar vim9script 139160579350SBram Moolenaar import exported from './Xexport.vim' 139260579350SBram Moolenaar exported = 'xxx' 139360579350SBram Moolenaar END 139460579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 139560579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 139660579350SBram Moolenaar 139760579350SBram Moolenaar var import_assign_const_lines =<< trim END 139860579350SBram Moolenaar vim9script 139960579350SBram Moolenaar import CONST from './Xexport.vim' 140060579350SBram Moolenaar CONST = 4321 140160579350SBram Moolenaar END 140260579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 140360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 140460579350SBram Moolenaar 1405f2d5c240SBram Moolenaar delete('Ximport.vim') 14065269bd2aSBram Moolenaar delete('Ximport3.vim') 14078a7d6542SBram Moolenaar delete('Xexport.vim') 14088a7d6542SBram Moolenaar 1409f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14103e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14113e191694SBram Moolenaar set cpo=abcd 1412cfcd011fSBram Moolenaar var lines =<< trim END 1413750802b5SBram Moolenaar vim9script 1414750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14153e191694SBram Moolenaar set cpo+=f 14163e191694SBram Moolenaar set cpo-=c 14173e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1418750802b5SBram Moolenaar END 1419750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1420750802b5SBram Moolenaar source Xvim9_script 14213e191694SBram Moolenaar assert_equal('fabd', &cpo) 1422750802b5SBram Moolenaar set cpo&vim 1423750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14243e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14253e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14263e191694SBram Moolenaar 1427750802b5SBram Moolenaar delete('Xvim9_script') 1428750802b5SBram Moolenaarenddef 1429750802b5SBram Moolenaar 14300a84284eSBram Moolenaardef Test_import_as() 14310a84284eSBram Moolenaar var export_lines =<< trim END 14320a84284eSBram Moolenaar vim9script 14330a84284eSBram Moolenaar export var one = 1 14340a84284eSBram Moolenaar export var yes = 'yes' 1435c967d57aSBram Moolenaar export var slist: list<string> 14360a84284eSBram Moolenaar END 14370a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14380a84284eSBram Moolenaar 14390a84284eSBram Moolenaar var import_lines =<< trim END 14400a84284eSBram Moolenaar vim9script 14416c7cc347SBram Moolenaar var one = 'notused' 14426c7cc347SBram Moolenaar var yes = 777 14430a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14440a84284eSBram Moolenaar assert_equal(1, thatOne) 14450a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14460a84284eSBram Moolenaar assert_equal('yes', yesYes) 14470a84284eSBram Moolenaar END 14480a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14490a84284eSBram Moolenaar 14500a84284eSBram Moolenaar import_lines =<< trim END 14510a84284eSBram Moolenaar vim9script 14520a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14530a84284eSBram Moolenaar assert_equal(1, thatOne) 14540a84284eSBram Moolenaar assert_equal('yes', yesYes) 14550a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14560a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14570a84284eSBram Moolenaar END 14580a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14590a84284eSBram Moolenaar 1460c967d57aSBram Moolenaar import_lines =<< trim END 1461c967d57aSBram Moolenaar vim9script 1462c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1463c967d57aSBram Moolenaar impSlist->add(123) 1464c967d57aSBram Moolenaar END 1465c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1466c967d57aSBram Moolenaar 14670a84284eSBram Moolenaar delete('XexportAs') 14680a84284eSBram Moolenaarenddef 14690a84284eSBram Moolenaar 1470803af686SBram Moolenaarfunc g:Trigger() 1471803af686SBram Moolenaar source Ximport.vim 1472803af686SBram Moolenaar return "echo 'yes'\<CR>" 1473803af686SBram Moolenaarendfunc 1474803af686SBram Moolenaar 1475803af686SBram Moolenaardef Test_import_export_expr_map() 1476803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1477cfcd011fSBram Moolenaar var export_lines =<< trim END 1478803af686SBram Moolenaar vim9script 1479803af686SBram Moolenaar export def That(): string 1480803af686SBram Moolenaar return 'yes' 1481803af686SBram Moolenaar enddef 1482803af686SBram Moolenaar END 1483803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1484803af686SBram Moolenaar 1485cfcd011fSBram Moolenaar var import_lines =<< trim END 1486803af686SBram Moolenaar vim9script 1487803af686SBram Moolenaar import That from './Xexport_that.vim' 1488803af686SBram Moolenaar assert_equal('yes', That()) 1489803af686SBram Moolenaar END 1490803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1491803af686SBram Moolenaar 1492803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1493803af686SBram Moolenaar feedkeys('trigger', "xt") 1494803af686SBram Moolenaar 1495730b2483SBram Moolenaar delete('Xexport_that.vim') 1496803af686SBram Moolenaar delete('Ximport.vim') 1497803af686SBram Moolenaar nunmap trigger 1498803af686SBram Moolenaarenddef 1499803af686SBram Moolenaar 15008e1986e3SBram Moolenaardef Test_import_in_filetype() 15018e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15028e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1503cfcd011fSBram Moolenaar var export_lines =<< trim END 15048e1986e3SBram Moolenaar vim9script 1505cfcd011fSBram Moolenaar export var That = 'yes' 15068e1986e3SBram Moolenaar END 1507730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15088e1986e3SBram Moolenaar 1509cfcd011fSBram Moolenaar var import_lines =<< trim END 15108e1986e3SBram Moolenaar vim9script 1511730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15128e1986e3SBram Moolenaar assert_equal('yes', That) 15138e1986e3SBram Moolenaar g:did_load_mytpe = 1 15148e1986e3SBram Moolenaar END 15158e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15168e1986e3SBram Moolenaar 1517cfcd011fSBram Moolenaar var save_rtp = &rtp 15188e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15198e1986e3SBram Moolenaar 15208e1986e3SBram Moolenaar filetype plugin on 15218e1986e3SBram Moolenaar copen 15228e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15238e1986e3SBram Moolenaar 15248e1986e3SBram Moolenaar quit! 1525730b2483SBram Moolenaar delete('Xexport_ft.vim') 15268e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15278e1986e3SBram Moolenaar &rtp = save_rtp 15288e1986e3SBram Moolenaarenddef 15298e1986e3SBram Moolenaar 1530efa94447SBram Moolenaardef Test_use_import_in_mapping() 1531cfcd011fSBram Moolenaar var lines =<< trim END 1532efa94447SBram Moolenaar vim9script 1533efa94447SBram Moolenaar export def Funcx() 1534efa94447SBram Moolenaar g:result = 42 1535efa94447SBram Moolenaar enddef 1536efa94447SBram Moolenaar END 1537efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1538efa94447SBram Moolenaar lines =<< trim END 1539efa94447SBram Moolenaar vim9script 1540efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1541b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1542efa94447SBram Moolenaar END 1543efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1544efa94447SBram Moolenaar 1545efa94447SBram Moolenaar source Xmapscript.vim 1546b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1547efa94447SBram Moolenaar assert_equal(42, g:result) 1548efa94447SBram Moolenaar 1549efa94447SBram Moolenaar unlet g:result 1550efa94447SBram Moolenaar delete('XsomeExport.vim') 1551efa94447SBram Moolenaar delete('Xmapscript.vim') 1552b3ca9824SBram Moolenaar nunmap <F3> 1553efa94447SBram Moolenaarenddef 1554efa94447SBram Moolenaar 1555d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1556d3f8a9eeSBram Moolenaar var lines =<< trim END 1557d3f8a9eeSBram Moolenaar if has(g:feature) 1558d3f8a9eeSBram Moolenaar " legacy script 1559d3f8a9eeSBram Moolenaar let g:legacy = 1 1560d3f8a9eeSBram Moolenaar finish 1561d3f8a9eeSBram Moolenaar endif 1562d3f8a9eeSBram Moolenaar vim9script 1563d3f8a9eeSBram Moolenaar g:legacy = 0 1564d3f8a9eeSBram Moolenaar END 1565d3f8a9eeSBram Moolenaar g:feature = 'eval' 1566d3f8a9eeSBram Moolenaar g:legacy = -1 1567d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1568d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1569d3f8a9eeSBram Moolenaar 1570d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1571d3f8a9eeSBram Moolenaar g:legacy = -1 1572d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1573d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1574d3f8a9eeSBram Moolenaarenddef 1575d3f8a9eeSBram Moolenaar 1576750802b5SBram Moolenaardef Test_vim9script_fails() 15778a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 15788a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1579cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 15809721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1581cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1582750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1583750802b5SBram Moolenaar 1584cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1585c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1586c785b9a7SBram Moolenaar 1587e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1588e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 15898a7d6542SBram Moolenaarenddef 15908a7d6542SBram Moolenaar 1591f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1592101f4810SBram Moolenaar CheckRunVimInTerminal 1593101f4810SBram Moolenaar 15949bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1595c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 15969bb3eb3eSBram Moolenaarendfunc 15979bb3eb3eSBram Moolenaar 1598c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1599cfcd011fSBram Moolenaar var export =<< trim END 1600101f4810SBram Moolenaar vim9script 1601101f4810SBram Moolenaar export def Foo(): number 1602101f4810SBram Moolenaar return 0 1603101f4810SBram Moolenaar enddef 1604101f4810SBram Moolenaar END 1605730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1606101f4810SBram Moolenaar 1607e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16089bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16092949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1610101f4810SBram Moolenaar 1611730b2483SBram Moolenaar delete('XexportCmd.vim') 16129bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16139bb3eb3eSBram Moolenaarenddef 1614101f4810SBram Moolenaar 16152b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16162b32700dSBram Moolenaar var lines =<< trim END 1617a6294955SBram Moolenaar vim9script 1618a6294955SBram Moolenaar export var exported = 'thexport' 1619a6294955SBram Moolenaar END 1620a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1621a6294955SBram Moolenaar lines =<< trim END 16222b32700dSBram Moolenaar vim9script noclear 16232b32700dSBram Moolenaar g:loadCount += 1 16242b32700dSBram Moolenaar var s:reloaded = 'init' 1625a6294955SBram Moolenaar import exported from './XExportReload' 16262b32700dSBram Moolenaar 16272b32700dSBram Moolenaar def Again(): string 16282b32700dSBram Moolenaar return 'again' 16292b32700dSBram Moolenaar enddef 16302b32700dSBram Moolenaar 16312b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16322b32700dSBram Moolenaar var s:loaded = true 16332b32700dSBram Moolenaar 16342b32700dSBram Moolenaar var s:notReloaded = 'yes' 16352b32700dSBram Moolenaar s:reloaded = 'first' 16362b32700dSBram Moolenaar def g:Values(): list<string> 1637a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16382b32700dSBram Moolenaar enddef 16392b32700dSBram Moolenaar 16402b32700dSBram Moolenaar def Once(): string 16412b32700dSBram Moolenaar return 'once' 16422b32700dSBram Moolenaar enddef 16432b32700dSBram Moolenaar END 16442b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16452b32700dSBram Moolenaar g:loadCount = 0 16462b32700dSBram Moolenaar source XReloaded 16472b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1648a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16492b32700dSBram Moolenaar source XReloaded 16502b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1651a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16522b32700dSBram Moolenaar source XReloaded 16532b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1654a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16552b32700dSBram Moolenaar 165648e11c10SBram Moolenaar delete('XReloaded') 1657a6294955SBram Moolenaar delete('XExportReload') 16582b32700dSBram Moolenaar delfunc g:Values 16592b32700dSBram Moolenaar unlet g:loadCount 1660577dc93dSBram Moolenaar 1661577dc93dSBram Moolenaar lines =<< trim END 1662577dc93dSBram Moolenaar vim9script 1663577dc93dSBram Moolenaar def Inner() 1664577dc93dSBram Moolenaar enddef 1665577dc93dSBram Moolenaar END 1666577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1667577dc93dSBram Moolenaar source XreloadScript.vim 1668577dc93dSBram Moolenaar 1669577dc93dSBram Moolenaar lines =<< trim END 1670577dc93dSBram Moolenaar vim9script 1671577dc93dSBram Moolenaar def Outer() 1672577dc93dSBram Moolenaar def Inner() 1673577dc93dSBram Moolenaar enddef 1674577dc93dSBram Moolenaar enddef 1675577dc93dSBram Moolenaar defcompile 1676577dc93dSBram Moolenaar END 1677577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1678577dc93dSBram Moolenaar source XreloadScript.vim 1679577dc93dSBram Moolenaar 1680577dc93dSBram Moolenaar delete('XreloadScript.vim') 16812b32700dSBram Moolenaarenddef 16822b32700dSBram Moolenaar 16834c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1684cfcd011fSBram Moolenaar var lines =<< trim END 16858a7d6542SBram Moolenaar vim9script 16868a7d6542SBram Moolenaar const var = '' 1687cfcd011fSBram Moolenaar var valone = 1234 16888a7d6542SBram Moolenaar def MyFunc(arg: string) 16898a7d6542SBram Moolenaar valone = 5678 16908a7d6542SBram Moolenaar enddef 16918a7d6542SBram Moolenaar END 1692cfcd011fSBram Moolenaar var morelines =<< trim END 1693cfcd011fSBram Moolenaar var valtwo = 222 16948a7d6542SBram Moolenaar export def GetValtwo(): number 16958a7d6542SBram Moolenaar return valtwo 16968a7d6542SBram Moolenaar enddef 16978a7d6542SBram Moolenaar END 169803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 16998a7d6542SBram Moolenaar source Xreload.vim 17008a7d6542SBram Moolenaar source Xreload.vim 17018a7d6542SBram Moolenaar source Xreload.vim 17028a7d6542SBram Moolenaar 1703f5be8cdbSBram Moolenaar # cannot declare a var twice 17048a7d6542SBram Moolenaar lines =<< trim END 17058a7d6542SBram Moolenaar vim9script 1706cfcd011fSBram Moolenaar var valone = 1234 1707cfcd011fSBram Moolenaar var valone = 5678 17088a7d6542SBram Moolenaar END 17098a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 171044d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17118a7d6542SBram Moolenaar 17128a7d6542SBram Moolenaar delete('Xreload.vim') 17138a7d6542SBram Moolenaar delete('Ximport.vim') 17148a7d6542SBram Moolenaarenddef 17158a7d6542SBram Moolenaar 171607a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 171707a65d26SBram Moolenaar" compiled function using that variable must fail. 171807a65d26SBram Moolenaardef Test_script_reload_change_type() 171907a65d26SBram Moolenaar var lines =<< trim END 172007a65d26SBram Moolenaar vim9script noclear 172107a65d26SBram Moolenaar var str = 'string' 172207a65d26SBram Moolenaar def g:GetStr(): string 172307a65d26SBram Moolenaar return str .. 'xxx' 172407a65d26SBram Moolenaar enddef 172507a65d26SBram Moolenaar END 172607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 172707a65d26SBram Moolenaar source Xreload.vim 172807a65d26SBram Moolenaar echo g:GetStr() 172907a65d26SBram Moolenaar 173007a65d26SBram Moolenaar lines =<< trim END 173107a65d26SBram Moolenaar vim9script noclear 173207a65d26SBram Moolenaar var str = 1234 173307a65d26SBram Moolenaar END 173407a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 173507a65d26SBram Moolenaar source Xreload.vim 173607a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 173707a65d26SBram Moolenaar 173807a65d26SBram Moolenaar delfunc g:GetStr 173907a65d26SBram Moolenaar delete('Xreload.vim') 174007a65d26SBram Moolenaarenddef 174107a65d26SBram Moolenaar 1742c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1743c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1744c970e422SBram Moolenaar 1745c970e422SBram Moolenaardef Test_script_reload_from_function() 1746c970e422SBram Moolenaar var lines =<< trim END 1747c970e422SBram Moolenaar vim9script 1748c970e422SBram Moolenaar 1749c970e422SBram Moolenaar if exists('g:loaded') 1750c970e422SBram Moolenaar finish 1751c970e422SBram Moolenaar endif 1752c970e422SBram Moolenaar g:loaded = 1 1753c970e422SBram Moolenaar delcommand CallFunc 1754c970e422SBram Moolenaar command CallFunc Func() 1755c970e422SBram Moolenaar def Func() 1756a4c81beaSBram Moolenaar so XreloadFunc.vim 1757c970e422SBram Moolenaar g:didTheFunc = 1 1758c970e422SBram Moolenaar enddef 1759c970e422SBram Moolenaar END 1760c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1761c970e422SBram Moolenaar source XreloadFunc.vim 1762c970e422SBram Moolenaar CallFunc 1763c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1764c970e422SBram Moolenaar 1765c970e422SBram Moolenaar delete('XreloadFunc.vim') 1766c970e422SBram Moolenaar delcommand CallFunc 1767c970e422SBram Moolenaar unlet g:loaded 1768c970e422SBram Moolenaar unlet g:didTheFunc 1769c970e422SBram Moolenaarenddef 1770c970e422SBram Moolenaar 17716c3843caSBram Moolenaardef Test_script_var_shadows_function() 17726c3843caSBram Moolenaar var lines =<< trim END 17736c3843caSBram Moolenaar vim9script 17746c3843caSBram Moolenaar def Func(): number 17756c3843caSBram Moolenaar return 123 17766c3843caSBram Moolenaar enddef 17776c3843caSBram Moolenaar var Func = 1 17786c3843caSBram Moolenaar END 17796c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 17806c3843caSBram Moolenaarenddef 17816c3843caSBram Moolenaar 1782c323527dSBram Moolenaardef Test_script_var_shadows_command() 1783c323527dSBram Moolenaar var lines =<< trim END 1784c323527dSBram Moolenaar var undo = 1 1785c323527dSBram Moolenaar undo = 2 1786c323527dSBram Moolenaar assert_equal(2, undo) 1787c323527dSBram Moolenaar END 1788c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1789c323527dSBram Moolenaar 1790c323527dSBram Moolenaar lines =<< trim END 1791c323527dSBram Moolenaar var undo = 1 1792c323527dSBram Moolenaar undo 1793c323527dSBram Moolenaar END 1794c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1795c323527dSBram Moolenaarenddef 1796c323527dSBram Moolenaar 179795006e3dSBram Moolenaardef s:RetSome(): string 179895006e3dSBram Moolenaar return 'some' 179995006e3dSBram Moolenaarenddef 180095006e3dSBram Moolenaar 1801fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1802fe465a01SBram Moolenaar" script-local name. 1803fe465a01SBram Moolenaardef Test_vim9script_funcref() 1804cfcd011fSBram Moolenaar var sortlines =<< trim END 1805fe465a01SBram Moolenaar vim9script 1806fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1807bed36b93SBram Moolenaar return i2 - i1 1808fe465a01SBram Moolenaar enddef 1809fe465a01SBram Moolenaar 1810fe465a01SBram Moolenaar export def FastSort(): list<number> 1811fe465a01SBram Moolenaar return range(5)->sort(Compare) 1812fe465a01SBram Moolenaar enddef 1813529fb5a5SBram Moolenaar 1814529fb5a5SBram Moolenaar export def GetString(arg: string): string 1815529fb5a5SBram Moolenaar return arg 1816529fb5a5SBram Moolenaar enddef 1817fe465a01SBram Moolenaar END 1818fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1819fe465a01SBram Moolenaar 1820cfcd011fSBram Moolenaar var lines =<< trim END 1821fe465a01SBram Moolenaar vim9script 1822fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1823fe465a01SBram Moolenaar def Test() 1824fe465a01SBram Moolenaar g:result = FastSort() 1825fe465a01SBram Moolenaar enddef 1826fe465a01SBram Moolenaar Test() 1827529fb5a5SBram Moolenaar 1828529fb5a5SBram Moolenaar # using a function imported with "as" 1829529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1830529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1831529fb5a5SBram Moolenaar 1832529fb5a5SBram Moolenaar # using the function from a compiled function 1833529fb5a5SBram Moolenaar def TestMore(): string 1834ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1835ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1836529fb5a5SBram Moolenaar enddef 1837ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1838529fb5a5SBram Moolenaar 1839529fb5a5SBram Moolenaar # error when using a function that isn't exported 1840529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1841fe465a01SBram Moolenaar END 1842fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1843fe465a01SBram Moolenaar 1844fe465a01SBram Moolenaar source Xscript.vim 1845fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1846fe465a01SBram Moolenaar 1847fe465a01SBram Moolenaar unlet g:result 1848fe465a01SBram Moolenaar delete('Xsort.vim') 1849fe465a01SBram Moolenaar delete('Xscript.vim') 185095006e3dSBram Moolenaar 1851cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 185295006e3dSBram Moolenaar assert_equal('some', Funcref()) 1853fe465a01SBram Moolenaarenddef 1854fe465a01SBram Moolenaar 1855601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1856601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1857601e76acSBram Moolenaar" function reference. 1858c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1859cfcd011fSBram Moolenaar var filterLines =<< trim END 1860c620c055SBram Moolenaar vim9script 1861c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1862c620c055SBram Moolenaar return idx % 2 == 1 1863c620c055SBram Moolenaar enddef 1864c620c055SBram Moolenaar export def FastFilter(): list<number> 1865c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1866c620c055SBram Moolenaar enddef 1867601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1868601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1869601e76acSBram Moolenaar enddef 1870c620c055SBram Moolenaar END 1871c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1872c620c055SBram Moolenaar 1873cfcd011fSBram Moolenaar var lines =<< trim END 1874c620c055SBram Moolenaar vim9script 1875601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1876c620c055SBram Moolenaar def Test() 1877cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1878c620c055SBram Moolenaar enddef 1879c620c055SBram Moolenaar Test() 1880601e76acSBram Moolenaar def TestDirect() 1881cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1882601e76acSBram Moolenaar enddef 1883601e76acSBram Moolenaar TestDirect() 1884c620c055SBram Moolenaar END 1885601e76acSBram Moolenaar CheckScriptSuccess(lines) 1886c620c055SBram Moolenaar delete('Xfilter.vim') 1887c620c055SBram Moolenaarenddef 1888c620c055SBram Moolenaar 18894c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1890cfcd011fSBram Moolenaar var first_lines =<< trim END 18914c17ad94SBram Moolenaar vim9script 18924c17ad94SBram Moolenaar def FuncYes(): string 18934c17ad94SBram Moolenaar return 'yes' 18944c17ad94SBram Moolenaar enddef 18954c17ad94SBram Moolenaar END 1896cfcd011fSBram Moolenaar var withno_lines =<< trim END 18974c17ad94SBram Moolenaar def FuncNo(): string 18984c17ad94SBram Moolenaar return 'no' 18994c17ad94SBram Moolenaar enddef 19004c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19014c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19024c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 190303afdcf1SBram Moolenaar enddef 190403afdcf1SBram Moolenaar END 1905cfcd011fSBram Moolenaar var nono_lines =<< trim END 190603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 190703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 190844d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19094c17ad94SBram Moolenaar enddef 19104c17ad94SBram Moolenaar END 19114c17ad94SBram Moolenaar 19124c17ad94SBram Moolenaar # FuncNo() is defined 191303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19144c17ad94SBram Moolenaar source Xreloaded.vim 19154c17ad94SBram Moolenaar g:DoCheck(true) 19164c17ad94SBram Moolenaar 19174c17ad94SBram Moolenaar # FuncNo() is not redefined 191803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19194c17ad94SBram Moolenaar source Xreloaded.vim 19205082471fSBram Moolenaar g:DoCheck(false) 19214c17ad94SBram Moolenaar 19224c17ad94SBram Moolenaar # FuncNo() is back 192303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19244c17ad94SBram Moolenaar source Xreloaded.vim 19255082471fSBram Moolenaar g:DoCheck(false) 19264c17ad94SBram Moolenaar 19274c17ad94SBram Moolenaar delete('Xreloaded.vim') 19284c17ad94SBram Moolenaarenddef 19294c17ad94SBram Moolenaar 193089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 193189483d40SBram Moolenaar # write the script with a script-local variable 1932cfcd011fSBram Moolenaar var lines =<< trim END 193389483d40SBram Moolenaar vim9script 1934cfcd011fSBram Moolenaar var name = 'string' 193589483d40SBram Moolenaar END 193689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 193789483d40SBram Moolenaar source XreloadVar.vim 193889483d40SBram Moolenaar 193989483d40SBram Moolenaar # now write the script using the same variable locally - works 194089483d40SBram Moolenaar lines =<< trim END 194189483d40SBram Moolenaar vim9script 194289483d40SBram Moolenaar def Func() 1943cfcd011fSBram Moolenaar var name = 'string' 194489483d40SBram Moolenaar enddef 194589483d40SBram Moolenaar END 194689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 194789483d40SBram Moolenaar source XreloadVar.vim 194889483d40SBram Moolenaar 194989483d40SBram Moolenaar delete('XreloadVar.vim') 195089483d40SBram Moolenaarenddef 195189483d40SBram Moolenaar 19528a7d6542SBram Moolenaardef Test_import_absolute() 1953cfcd011fSBram Moolenaar var import_lines = [ 1954e6085c53SBram Moolenaar 'vim9script', 1955e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1956e6085c53SBram Moolenaar 'def UseExported()', 1957e6085c53SBram Moolenaar ' g:imported_abs = exported', 1958e6085c53SBram Moolenaar ' exported = 8888', 1959e6085c53SBram Moolenaar ' g:imported_after = exported', 1960e6085c53SBram Moolenaar 'enddef', 1961e6085c53SBram Moolenaar 'UseExported()', 1962e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1963e6085c53SBram Moolenaar ] 19648a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 19658a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 19668a7d6542SBram Moolenaar 19678a7d6542SBram Moolenaar source Ximport_abs.vim 19688a7d6542SBram Moolenaar 19698a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 19704e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1971fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1972fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1973fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1974fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1975fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1976fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1977fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1978fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1979fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1980fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1981e6085c53SBram Moolenaar g:import_disassembled) 1982b3ca9824SBram Moolenaar 1983b3ca9824SBram Moolenaar Undo_export_script_lines() 19848a7d6542SBram Moolenaar unlet g:imported_abs 19854e12a5dfSBram Moolenaar unlet g:import_disassembled 19868a7d6542SBram Moolenaar 19878a7d6542SBram Moolenaar delete('Ximport_abs.vim') 19888a7d6542SBram Moolenaar delete('Xexport_abs.vim') 19898a7d6542SBram Moolenaarenddef 19908a7d6542SBram Moolenaar 19918a7d6542SBram Moolenaardef Test_import_rtp() 1992cfcd011fSBram Moolenaar var import_lines = [ 1993e6085c53SBram Moolenaar 'vim9script', 1994e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1995e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1996e6085c53SBram Moolenaar ] 19978a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 1998b885a7c7SBram Moolenaar mkdir('import', 'p') 1999b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20008a7d6542SBram Moolenaar 2001cfcd011fSBram Moolenaar var save_rtp = &rtp 20028a7d6542SBram Moolenaar &rtp = getcwd() 20038a7d6542SBram Moolenaar source Ximport_rtp.vim 20048a7d6542SBram Moolenaar &rtp = save_rtp 20058a7d6542SBram Moolenaar 20068a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20078a7d6542SBram Moolenaar 2008b3ca9824SBram Moolenaar Undo_export_script_lines() 2009b3ca9824SBram Moolenaar unlet g:imported_rtp 20108a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2011b885a7c7SBram Moolenaar delete('import', 'rf') 20128a7d6542SBram Moolenaarenddef 20138a7d6542SBram Moolenaar 201425e0f586SBram Moolenaardef Test_import_compile_error() 2015cfcd011fSBram Moolenaar var export_lines = [ 201625e0f586SBram Moolenaar 'vim9script', 201725e0f586SBram Moolenaar 'export def ExpFunc(): string', 201825e0f586SBram Moolenaar ' return notDefined', 201925e0f586SBram Moolenaar 'enddef', 202025e0f586SBram Moolenaar ] 202125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 202225e0f586SBram Moolenaar 2023cfcd011fSBram Moolenaar var import_lines = [ 202425e0f586SBram Moolenaar 'vim9script', 202525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 202625e0f586SBram Moolenaar 'def ImpFunc()', 202725e0f586SBram Moolenaar ' echo ExpFunc()', 202825e0f586SBram Moolenaar 'enddef', 202925e0f586SBram Moolenaar 'defcompile', 203025e0f586SBram Moolenaar ] 203125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 203225e0f586SBram Moolenaar 203325e0f586SBram Moolenaar try 203425e0f586SBram Moolenaar source Ximport.vim 203525e0f586SBram Moolenaar catch /E1001/ 2036f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20377707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 203825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 203925e0f586SBram Moolenaar endtry 204025e0f586SBram Moolenaar 204125e0f586SBram Moolenaar delete('Xexported.vim') 204225e0f586SBram Moolenaar delete('Ximport.vim') 204325e0f586SBram Moolenaarenddef 204425e0f586SBram Moolenaar 2045c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2046cfcd011fSBram Moolenaar var lines = [ 2047c4ce36d4SBram Moolenaar 'vim9script', 2048c4ce36d4SBram Moolenaar 'def Func()', 2049c4ce36d4SBram Moolenaar ' eval [][0]', 2050c4ce36d4SBram Moolenaar 'enddef', 2051c4ce36d4SBram Moolenaar 'Func()', 2052c4ce36d4SBram Moolenaar ] 2053c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2054c4ce36d4SBram Moolenaar 2055c4ce36d4SBram Moolenaar for count in range(3) 2056c4ce36d4SBram Moolenaar try 2057c4ce36d4SBram Moolenaar source Xtestscript.vim 2058c4ce36d4SBram Moolenaar catch /E684/ 2059c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2060c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2061c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2062c4ce36d4SBram Moolenaar endtry 2063c4ce36d4SBram Moolenaar endfor 2064c4ce36d4SBram Moolenaar 2065c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2066c4ce36d4SBram Moolenaarenddef 2067c4ce36d4SBram Moolenaar 2068eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2069cfcd011fSBram Moolenaar var export_lines =<< trim END 2070eef2102eSBram Moolenaar vim9script 2071eef2102eSBram Moolenaar export def Func() 2072eef2102eSBram Moolenaar echo 'imported' 2073eef2102eSBram Moolenaar enddef 2074eef2102eSBram Moolenaar END 2075eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2076eef2102eSBram Moolenaar 2077cfcd011fSBram Moolenaar var lines =<< trim END 2078eef2102eSBram Moolenaar vim9script 2079eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2080eef2102eSBram Moolenaar def Func() 2081eef2102eSBram Moolenaar echo 'local to function' 2082eef2102eSBram Moolenaar enddef 2083eef2102eSBram Moolenaar END 2084eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2085eef2102eSBram Moolenaar 2086eef2102eSBram Moolenaar lines =<< trim END 2087eef2102eSBram Moolenaar vim9script 2088eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2089eef2102eSBram Moolenaar def Outer() 2090eef2102eSBram Moolenaar def Func() 2091eef2102eSBram Moolenaar echo 'local to function' 2092eef2102eSBram Moolenaar enddef 2093eef2102eSBram Moolenaar enddef 2094eef2102eSBram Moolenaar defcompile 2095eef2102eSBram Moolenaar END 2096eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2097eef2102eSBram Moolenaar 2098eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2099eef2102eSBram Moolenaarenddef 2100eef2102eSBram Moolenaar 2101b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2102cfcd011fSBram Moolenaar var lines =<< trim END 2103b9a2cac3SBram Moolenaar vim9script 2104b9a2cac3SBram Moolenaar def Func() 2105b9a2cac3SBram Moolenaar echo 'one' 2106b9a2cac3SBram Moolenaar enddef 2107b9a2cac3SBram Moolenaar def Func() 2108b9a2cac3SBram Moolenaar echo 'two' 2109b9a2cac3SBram Moolenaar enddef 2110b9a2cac3SBram Moolenaar END 2111b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2112fa211f3cSBram Moolenaar 2113fa211f3cSBram Moolenaar lines =<< trim END 2114fa211f3cSBram Moolenaar vim9script 2115fa211f3cSBram Moolenaar def Foo(): string 2116fa211f3cSBram Moolenaar return 'foo' 2117fa211f3cSBram Moolenaar enddef 2118fa211f3cSBram Moolenaar def Func() 2119cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2120fa211f3cSBram Moolenaar enddef 2121fa211f3cSBram Moolenaar defcompile 2122fa211f3cSBram Moolenaar END 2123fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2124b9a2cac3SBram Moolenaarenddef 2125b9a2cac3SBram Moolenaar 21268a7d6542SBram Moolenaardef Test_fixed_size_list() 2127f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2128cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21298a7d6542SBram Moolenaar l->remove(0) 21308a7d6542SBram Moolenaar l->add(5) 21318a7d6542SBram Moolenaar l->insert(99, 1) 21320f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21338a7d6542SBram Moolenaarenddef 21348a7d6542SBram Moolenaar 2135ae616494SBram Moolenaardef Test_no_insert_xit() 2136d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2137d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2138d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2139d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2140d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2141ae616494SBram Moolenaar 2142ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2143ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2144ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2145ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2146f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2147f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21486508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21496508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2150f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2151f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2152f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2153ae616494SBram Moolenaarenddef 2154ae616494SBram Moolenaar 2155158906cfSBram Moolenaardef IfElse(what: number): string 2156cfcd011fSBram Moolenaar var res = '' 2157158906cfSBram Moolenaar if what == 1 2158158906cfSBram Moolenaar res = "one" 2159158906cfSBram Moolenaar elseif what == 2 2160158906cfSBram Moolenaar res = "two" 2161a259d8d3SBram Moolenaar else 2162158906cfSBram Moolenaar res = "three" 2163a259d8d3SBram Moolenaar endif 2164158906cfSBram Moolenaar return res 2165a259d8d3SBram Moolenaarenddef 2166a259d8d3SBram Moolenaar 2167158906cfSBram Moolenaardef Test_if_elseif_else() 2168158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2169158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2170158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 21710f18b6d1SBram Moolenaarenddef 21720f18b6d1SBram Moolenaar 2173e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2174d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2175d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2176d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2177ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2178d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 21796628b7ebSBram Moolenaar 21806628b7ebSBram Moolenaar var lines =<< trim END 21816628b7ebSBram Moolenaar var s = '' 21826628b7ebSBram Moolenaar if s = '' 21836628b7ebSBram Moolenaar endif 21846628b7ebSBram Moolenaar END 21856628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 21866628b7ebSBram Moolenaar 21876628b7ebSBram Moolenaar lines =<< trim END 21886628b7ebSBram Moolenaar var s = '' 21896628b7ebSBram Moolenaar if s == '' 21906628b7ebSBram Moolenaar elseif s = '' 21916628b7ebSBram Moolenaar endif 21926628b7ebSBram Moolenaar END 21936628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2194e8c4abbbSBram Moolenaarenddef 2195e8c4abbbSBram Moolenaar 21966d69bf60SBram Moolenaarlet g:bool_true = v:true 21976d69bf60SBram Moolenaarlet g:bool_false = v:false 21986d69bf60SBram Moolenaar 21996d69bf60SBram Moolenaardef Test_if_const_expr() 2200cfcd011fSBram Moolenaar var res = false 22016d69bf60SBram Moolenaar if true ? true : false 22026d69bf60SBram Moolenaar res = true 22036d69bf60SBram Moolenaar endif 22046d69bf60SBram Moolenaar assert_equal(true, res) 22056d69bf60SBram Moolenaar 2206585fea7bSBram Moolenaar g:glob = 2 2207585fea7bSBram Moolenaar if false 22086797966dSBram Moolenaar execute('g:glob = 3') 2209585fea7bSBram Moolenaar endif 2210585fea7bSBram Moolenaar assert_equal(2, g:glob) 2211585fea7bSBram Moolenaar if true 22126797966dSBram Moolenaar execute('g:glob = 3') 2213585fea7bSBram Moolenaar endif 2214585fea7bSBram Moolenaar assert_equal(3, g:glob) 2215585fea7bSBram Moolenaar 22166d69bf60SBram Moolenaar res = false 22176d69bf60SBram Moolenaar if g:bool_true ? true : false 22186d69bf60SBram Moolenaar res = true 22196d69bf60SBram Moolenaar endif 22206d69bf60SBram Moolenaar assert_equal(true, res) 22216d69bf60SBram Moolenaar 22226d69bf60SBram Moolenaar res = false 22236d69bf60SBram Moolenaar if true ? g:bool_true : false 22246d69bf60SBram Moolenaar res = true 22256d69bf60SBram Moolenaar endif 22266d69bf60SBram Moolenaar assert_equal(true, res) 22276d69bf60SBram Moolenaar 22286d69bf60SBram Moolenaar res = false 22296d69bf60SBram Moolenaar if true ? true : g:bool_false 22306d69bf60SBram Moolenaar res = true 22316d69bf60SBram Moolenaar endif 22326d69bf60SBram Moolenaar assert_equal(true, res) 22336d69bf60SBram Moolenaar 22346d69bf60SBram Moolenaar res = false 22356d69bf60SBram Moolenaar if true ? false : true 22366d69bf60SBram Moolenaar res = true 22376d69bf60SBram Moolenaar endif 22386d69bf60SBram Moolenaar assert_equal(false, res) 22396d69bf60SBram Moolenaar 22406d69bf60SBram Moolenaar res = false 22416d69bf60SBram Moolenaar if false ? false : true 22426d69bf60SBram Moolenaar res = true 22436d69bf60SBram Moolenaar endif 22446d69bf60SBram Moolenaar assert_equal(true, res) 22456d69bf60SBram Moolenaar 22466d69bf60SBram Moolenaar res = false 22476d69bf60SBram Moolenaar if false ? true : false 22486d69bf60SBram Moolenaar res = true 22496d69bf60SBram Moolenaar endif 22506d69bf60SBram Moolenaar assert_equal(false, res) 22516d69bf60SBram Moolenaar 22526d69bf60SBram Moolenaar res = false 2253e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2254e8c4abbbSBram Moolenaar res = true 2255e8c4abbbSBram Moolenaar endif 2256e8c4abbbSBram Moolenaar assert_equal(false, res) 2257e8c4abbbSBram Moolenaar 2258e8c4abbbSBram Moolenaar res = false 22596d69bf60SBram Moolenaar if true && true 22606d69bf60SBram Moolenaar res = true 22616d69bf60SBram Moolenaar endif 22626d69bf60SBram Moolenaar assert_equal(true, res) 22636d69bf60SBram Moolenaar 22646d69bf60SBram Moolenaar res = false 22656d69bf60SBram Moolenaar if true && false 22666d69bf60SBram Moolenaar res = true 22676d69bf60SBram Moolenaar endif 22686d69bf60SBram Moolenaar assert_equal(false, res) 22696d69bf60SBram Moolenaar 22706d69bf60SBram Moolenaar res = false 22716d69bf60SBram Moolenaar if g:bool_true && false 22726d69bf60SBram Moolenaar res = true 22736d69bf60SBram Moolenaar endif 22746d69bf60SBram Moolenaar assert_equal(false, res) 22756d69bf60SBram Moolenaar 22766d69bf60SBram Moolenaar res = false 22776d69bf60SBram Moolenaar if true && g:bool_false 22786d69bf60SBram Moolenaar res = true 22796d69bf60SBram Moolenaar endif 22806d69bf60SBram Moolenaar assert_equal(false, res) 22816d69bf60SBram Moolenaar 22826d69bf60SBram Moolenaar res = false 22836d69bf60SBram Moolenaar if false && false 22846d69bf60SBram Moolenaar res = true 22856d69bf60SBram Moolenaar endif 22866d69bf60SBram Moolenaar assert_equal(false, res) 22876d69bf60SBram Moolenaar 22886d69bf60SBram Moolenaar res = false 22896d69bf60SBram Moolenaar if true || false 22906d69bf60SBram Moolenaar res = true 22916d69bf60SBram Moolenaar endif 22926d69bf60SBram Moolenaar assert_equal(true, res) 22936d69bf60SBram Moolenaar 22946d69bf60SBram Moolenaar res = false 22956d69bf60SBram Moolenaar if g:bool_true || false 22966d69bf60SBram Moolenaar res = true 22976d69bf60SBram Moolenaar endif 22986d69bf60SBram Moolenaar assert_equal(true, res) 22996d69bf60SBram Moolenaar 23006d69bf60SBram Moolenaar res = false 23016d69bf60SBram Moolenaar if true || g:bool_false 23026d69bf60SBram Moolenaar res = true 23036d69bf60SBram Moolenaar endif 23046d69bf60SBram Moolenaar assert_equal(true, res) 23056d69bf60SBram Moolenaar 23066d69bf60SBram Moolenaar res = false 23076d69bf60SBram Moolenaar if false || false 23086d69bf60SBram Moolenaar res = true 23096d69bf60SBram Moolenaar endif 23106d69bf60SBram Moolenaar assert_equal(false, res) 23113988f64fSBram Moolenaar 23123988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2313c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23143988f64fSBram Moolenaar if false | eval burp + 234 | endif 23153988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23163988f64fSBram Moolenaar if false 23173988f64fSBram Moolenaar burp 23183988f64fSBram Moolenaar endif 231980c34ca3SBram Moolenaarenddef 23206d69bf60SBram Moolenaar 232180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2322d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2323d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2324d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2325d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23266d69bf60SBram Moolenaarenddef 23276d69bf60SBram Moolenaar 232872abcf42SBram Moolenaardef RunNested(i: number): number 2329cfcd011fSBram Moolenaar var x: number = 0 233072abcf42SBram Moolenaar if i % 2 233172abcf42SBram Moolenaar if 1 2332f5be8cdbSBram Moolenaar # comment 233372abcf42SBram Moolenaar else 2334f5be8cdbSBram Moolenaar # comment 233572abcf42SBram Moolenaar endif 233672abcf42SBram Moolenaar x += 1 233772abcf42SBram Moolenaar else 233872abcf42SBram Moolenaar x += 1000 233972abcf42SBram Moolenaar endif 234072abcf42SBram Moolenaar return x 234172abcf42SBram Moolenaarenddef 234272abcf42SBram Moolenaar 234372abcf42SBram Moolenaardef Test_nested_if() 234472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 234572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 234672abcf42SBram Moolenaarenddef 234772abcf42SBram Moolenaar 2348ad39c094SBram Moolenaardef Test_execute_cmd() 2349e4984290SBram Moolenaar # missing argument is ignored 2350e4984290SBram Moolenaar execute 2351e4984290SBram Moolenaar execute # comment 2352e4984290SBram Moolenaar 2353ad39c094SBram Moolenaar new 2354ad39c094SBram Moolenaar setline(1, 'default') 2355d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2356ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2357a72cfb80SBram Moolenaar 2358d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2359a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2360a72cfb80SBram Moolenaar 2361cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2362cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2363a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2364ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2365a72cfb80SBram Moolenaar 2366d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2367ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2368a72cfb80SBram Moolenaar 2369cfcd011fSBram Moolenaar var cmd_first = 'call ' 2370cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2371ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2372ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2373ad39c094SBram Moolenaar bwipe! 2374585fea7bSBram Moolenaar 2375cfcd011fSBram Moolenaar var n = true 23762d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 23772d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 23782d6b20d6SBram Moolenaar 2379e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2380e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2381e5abf7afSBram Moolenaar 2382d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2383d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2384d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2385ad39c094SBram Moolenaarenddef 2386ad39c094SBram Moolenaar 238747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2388f5be8cdbSBram Moolenaar # only checks line continuation 2389cfcd011fSBram Moolenaar var lines =<< trim END 239047e880d6SBram Moolenaar vim9script 239147e880d6SBram Moolenaar execute 'g:someVar' 239247e880d6SBram Moolenaar .. ' = ' .. 239347e880d6SBram Moolenaar '28' 239447e880d6SBram Moolenaar assert_equal(28, g:someVar) 239547e880d6SBram Moolenaar unlet g:someVar 239647e880d6SBram Moolenaar END 239747e880d6SBram Moolenaar CheckScriptSuccess(lines) 239847e880d6SBram Moolenaarenddef 239947e880d6SBram Moolenaar 2400ad39c094SBram Moolenaardef Test_echo_cmd() 2401a72cfb80SBram Moolenaar echo 'some' # comment 2402585fea7bSBram Moolenaar echon 'thing' 2403ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2404ad39c094SBram Moolenaar 2405a72cfb80SBram Moolenaar echo "some" # comment 2406a72cfb80SBram Moolenaar echon "thing" 2407a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2408a72cfb80SBram Moolenaar 2409cfcd011fSBram Moolenaar var str1 = 'some' 2410cfcd011fSBram Moolenaar var str2 = 'more' 2411ad39c094SBram Moolenaar echo str1 str2 2412ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2413a72cfb80SBram Moolenaar 2414d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2415ad39c094SBram Moolenaarenddef 2416ad39c094SBram Moolenaar 2417f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2418f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2419f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2420f93c7feaSBram Moolenaar echo 'clear' 2421df069eecSBram Moolenaar :1messages 2422f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2423f93c7feaSBram Moolenaar 2424d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2425f93c7feaSBram Moolenaarenddef 2426f93c7feaSBram Moolenaar 242747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2428f5be8cdbSBram Moolenaar # only checks line continuation 2429cfcd011fSBram Moolenaar var lines =<< trim END 243047e880d6SBram Moolenaar vim9script 243147e880d6SBram Moolenaar echomsg 'here' 243247e880d6SBram Moolenaar .. ' is ' .. 243347e880d6SBram Moolenaar 'a message' 243447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 243547e880d6SBram Moolenaar END 243647e880d6SBram Moolenaar CheckScriptSuccess(lines) 243747e880d6SBram Moolenaarenddef 243847e880d6SBram Moolenaar 2439f93c7feaSBram Moolenaardef Test_echoerr_cmd() 244040ee466cSBram Moolenaar try 244140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 244240ee466cSBram Moolenaar catch 244340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 244440ee466cSBram Moolenaar endtry 2445f93c7feaSBram Moolenaarenddef 2446f93c7feaSBram Moolenaar 244747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2448f5be8cdbSBram Moolenaar # only checks line continuation 2449cfcd011fSBram Moolenaar var lines =<< trim END 245047e880d6SBram Moolenaar vim9script 245147e880d6SBram Moolenaar try 245247e880d6SBram Moolenaar echoerr 'this' 245347e880d6SBram Moolenaar .. ' is ' .. 245447e880d6SBram Moolenaar 'wrong' 245547e880d6SBram Moolenaar catch 245647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 245747e880d6SBram Moolenaar endtry 245847e880d6SBram Moolenaar END 245947e880d6SBram Moolenaar CheckScriptSuccess(lines) 246047e880d6SBram Moolenaarenddef 246147e880d6SBram Moolenaar 246241fe0617SBram Moolenaardef Test_for_outside_of_function() 2463cfcd011fSBram Moolenaar var lines =<< trim END 246441fe0617SBram Moolenaar vim9script 246541fe0617SBram Moolenaar new 246641fe0617SBram Moolenaar for var in range(0, 3) 246741fe0617SBram Moolenaar append(line('$'), var) 246841fe0617SBram Moolenaar endfor 246941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 247041fe0617SBram Moolenaar bwipe! 2471522eefd9SBram Moolenaar 2472522eefd9SBram Moolenaar var result = '' 2473522eefd9SBram Moolenaar for i in [1, 2, 3] 2474522eefd9SBram Moolenaar var loop = ' loop ' .. i 2475522eefd9SBram Moolenaar result ..= loop 2476522eefd9SBram Moolenaar endfor 2477522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 247841fe0617SBram Moolenaar END 247941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 248041fe0617SBram Moolenaar source Xvim9for.vim 248141fe0617SBram Moolenaar delete('Xvim9for.vim') 248241fe0617SBram Moolenaarenddef 24838a7d6542SBram Moolenaar 2484e8c4abbbSBram Moolenaardef Test_for_loop() 2485f2253963SBram Moolenaar var lines =<< trim END 2486cfcd011fSBram Moolenaar var result = '' 2487e8c4abbbSBram Moolenaar for cnt in range(7) 2488e8c4abbbSBram Moolenaar if cnt == 4 2489e8c4abbbSBram Moolenaar break 2490e8c4abbbSBram Moolenaar endif 2491e8c4abbbSBram Moolenaar if cnt == 2 2492e8c4abbbSBram Moolenaar continue 2493e8c4abbbSBram Moolenaar endif 2494e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2495e8c4abbbSBram Moolenaar endfor 2496e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 24970ad3e894SBram Moolenaar 2498cfcd011fSBram Moolenaar var concat = '' 24990ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25000ad3e894SBram Moolenaar concat ..= str 25010ad3e894SBram Moolenaar endfor 25020ad3e894SBram Moolenaar assert_equal('onetwo', concat) 250338bd8de5SBram Moolenaar 250438bd8de5SBram Moolenaar var total = 0 250538bd8de5SBram Moolenaar for nr in 250638bd8de5SBram Moolenaar [1, 2, 3] 250738bd8de5SBram Moolenaar total += nr 250838bd8de5SBram Moolenaar endfor 250938bd8de5SBram Moolenaar assert_equal(6, total) 251038bd8de5SBram Moolenaar 251138bd8de5SBram Moolenaar total = 0 251238bd8de5SBram Moolenaar for nr 251338bd8de5SBram Moolenaar in [1, 2, 3] 251438bd8de5SBram Moolenaar total += nr 251538bd8de5SBram Moolenaar endfor 251638bd8de5SBram Moolenaar assert_equal(6, total) 251738bd8de5SBram Moolenaar 251838bd8de5SBram Moolenaar total = 0 251938bd8de5SBram Moolenaar for nr 252038bd8de5SBram Moolenaar in 252138bd8de5SBram Moolenaar [1, 2, 3] 252238bd8de5SBram Moolenaar total += nr 252338bd8de5SBram Moolenaar endfor 252438bd8de5SBram Moolenaar assert_equal(6, total) 2525036d0714SBram Moolenaar 2526a3589a0dSBram Moolenaar # with type 2527a3589a0dSBram Moolenaar total = 0 2528a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2529a3589a0dSBram Moolenaar total += n 2530a3589a0dSBram Moolenaar endfor 2531a3589a0dSBram Moolenaar assert_equal(6, total) 2532a3589a0dSBram Moolenaar 2533fe090eb5SBram Moolenaar var chars = '' 2534fe090eb5SBram Moolenaar for s: string in 'foobar' 2535fe090eb5SBram Moolenaar chars ..= s 2536fe090eb5SBram Moolenaar endfor 2537fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2538fe090eb5SBram Moolenaar 25395ede5b23SBram Moolenaar chars = '' 25405ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25415ede5b23SBram Moolenaar chars ..= x 25425ede5b23SBram Moolenaar endfor 25435ede5b23SBram Moolenaar assert_equal('ab', chars) 25445ede5b23SBram Moolenaar 2545a3589a0dSBram Moolenaar # unpack with type 2546f2253963SBram Moolenaar var res = '' 2547a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2548a3589a0dSBram Moolenaar res ..= n .. s 2549a3589a0dSBram Moolenaar endfor 2550a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2551a3589a0dSBram Moolenaar 2552444d8783SBram Moolenaar # unpack with one var 2553444d8783SBram Moolenaar var reslist = [] 2554444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2555444d8783SBram Moolenaar reslist->add(x) 2556444d8783SBram Moolenaar endfor 2557444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2558444d8783SBram Moolenaar 2559a3589a0dSBram Moolenaar # loop over string 2560a3589a0dSBram Moolenaar res = '' 256174e54fcbSBram Moolenaar for c in 'aéc̀d' 256274e54fcbSBram Moolenaar res ..= c .. '-' 256374e54fcbSBram Moolenaar endfor 256474e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 256574e54fcbSBram Moolenaar 256674e54fcbSBram Moolenaar res = '' 256774e54fcbSBram Moolenaar for c in '' 256874e54fcbSBram Moolenaar res ..= c .. '-' 256974e54fcbSBram Moolenaar endfor 257074e54fcbSBram Moolenaar assert_equal('', res) 257174e54fcbSBram Moolenaar 257274e54fcbSBram Moolenaar res = '' 257374e54fcbSBram Moolenaar for c in test_null_string() 257474e54fcbSBram Moolenaar res ..= c .. '-' 257574e54fcbSBram Moolenaar endfor 257674e54fcbSBram Moolenaar assert_equal('', res) 2577f2253963SBram Moolenaar 2578f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2579f2253963SBram Moolenaar {a: 'Cat'} 2580f2253963SBram Moolenaar ] 2581f2253963SBram Moolenaar for dd in foo 2582f2253963SBram Moolenaar dd.counter = 12 2583f2253963SBram Moolenaar endfor 2584f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2585ad2d4969SBram Moolenaar 2586ad2d4969SBram Moolenaar reslist = [] 2587ad2d4969SBram Moolenaar for _ in range(3) 2588ad2d4969SBram Moolenaar reslist->add('x') 2589ad2d4969SBram Moolenaar endfor 2590ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2591f2253963SBram Moolenaar END 2592f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2593e8c4abbbSBram Moolenaarenddef 2594e8c4abbbSBram Moolenaar 2595e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2596442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2597442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2598442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2599442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2600442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2601442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2602d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2603822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 26042d870f8dSBram Moolenaar delfunc! g:Func 2605675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2606675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2607675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 260874e54fcbSBram Moolenaar 260974e54fcbSBram Moolenaar # wrong type detected at compile time 261074e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 261174e54fcbSBram Moolenaar 261274e54fcbSBram Moolenaar # wrong type detected at runtime 261374e54fcbSBram Moolenaar g:adict = {a: 1} 261474e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 261574e54fcbSBram Moolenaar unlet g:adict 2616f6a8d420SBram Moolenaar 2617f6a8d420SBram Moolenaar var lines =<< trim END 2618f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2619f6a8d420SBram Moolenaar for e in d 2620f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2621f6a8d420SBram Moolenaar endfor 2622f6a8d420SBram Moolenaar END 2623f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2624fe090eb5SBram Moolenaar 2625fe090eb5SBram Moolenaar lines =<< trim END 2626fe090eb5SBram Moolenaar for nr: number in ['foo'] 2627fe090eb5SBram Moolenaar endfor 2628fe090eb5SBram Moolenaar END 2629fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2630404557e6SBram Moolenaar 2631404557e6SBram Moolenaar lines =<< trim END 2632404557e6SBram Moolenaar for n : number in [1, 2] 2633404557e6SBram Moolenaar echo n 2634404557e6SBram Moolenaar endfor 2635404557e6SBram Moolenaar END 2636404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2637efc5db52SBram Moolenaar 2638efc5db52SBram Moolenaar lines =<< trim END 2639efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2640efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2641efc5db52SBram Moolenaar echo k v 2642efc5db52SBram Moolenaar endfor 2643efc5db52SBram Moolenaar END 2644efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2645e8c4abbbSBram Moolenaarenddef 2646e8c4abbbSBram Moolenaar 2647ea87069dSBram Moolenaardef Test_for_loop_script_var() 2648ea87069dSBram Moolenaar # cannot use s:var in a :def function 2649ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2650ea87069dSBram Moolenaar 2651ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2652ea87069dSBram Moolenaar var lines =<< trim END 2653ea87069dSBram Moolenaar vim9script 2654ea87069dSBram Moolenaar var total = 0 2655ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2656ea87069dSBram Moolenaar total += s:var 2657ea87069dSBram Moolenaar endfor 2658ea87069dSBram Moolenaar assert_equal(6, total) 2659ea87069dSBram Moolenaar 2660ea87069dSBram Moolenaar total = 0 2661ea87069dSBram Moolenaar for var in [1, 2, 3] 2662ea87069dSBram Moolenaar total += var 2663ea87069dSBram Moolenaar endfor 2664ea87069dSBram Moolenaar assert_equal(6, total) 2665ea87069dSBram Moolenaar END 2666ea87069dSBram Moolenaarenddef 2667ea87069dSBram Moolenaar 2668792f786aSBram Moolenaardef Test_for_loop_unpack() 26694b8a0651SBram Moolenaar var lines =<< trim END 2670792f786aSBram Moolenaar var result = [] 2671792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2672792f786aSBram Moolenaar result->add(v1) 2673792f786aSBram Moolenaar result->add(v2) 2674792f786aSBram Moolenaar endfor 2675792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2676792f786aSBram Moolenaar 2677792f786aSBram Moolenaar result = [] 2678792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2679792f786aSBram Moolenaar result->add(v1) 2680792f786aSBram Moolenaar result->add(v2) 2681792f786aSBram Moolenaar result->add(v3) 2682792f786aSBram Moolenaar endfor 2683792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2684792f786aSBram Moolenaar 26854b8a0651SBram Moolenaar result = [] 26864b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 26874b8a0651SBram Moolenaar result->add(&ts) 26884b8a0651SBram Moolenaar result->add(&sw) 26894b8a0651SBram Moolenaar endfor 26904b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 26914b8a0651SBram Moolenaar 26924b8a0651SBram Moolenaar var slist: list<string> 26934b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 26944b8a0651SBram Moolenaar slist->add($LOOPVAR) 26954b8a0651SBram Moolenaar slist->add(@r) 26964b8a0651SBram Moolenaar slist->add(v:errmsg) 26974b8a0651SBram Moolenaar endfor 26984b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 26994b8a0651SBram Moolenaar 27004b8a0651SBram Moolenaar slist = [] 27014b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 27024b8a0651SBram Moolenaar slist->add(g:globalvar) 27034b8a0651SBram Moolenaar slist->add(b:bufvar) 27044b8a0651SBram Moolenaar slist->add(w:winvar) 27054b8a0651SBram Moolenaar slist->add(t:tabvar) 27064b8a0651SBram Moolenaar endfor 27074b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2708f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2709b777da9bSBram Moolenaar 2710b777da9bSBram Moolenaar var res = [] 2711b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2712b777da9bSBram Moolenaar res->add(n) 2713b777da9bSBram Moolenaar endfor 2714b777da9bSBram Moolenaar assert_equal([2, 5], res) 27154b8a0651SBram Moolenaar END 27164b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 27174b8a0651SBram Moolenaar 27184b8a0651SBram Moolenaar lines =<< trim END 2719792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2720792f786aSBram Moolenaar echo v1 v2 2721792f786aSBram Moolenaar endfor 2722792f786aSBram Moolenaar END 2723792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2724792f786aSBram Moolenaar 2725792f786aSBram Moolenaar lines =<< trim END 2726792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2727792f786aSBram Moolenaar echo v1 v2 2728792f786aSBram Moolenaar endfor 2729792f786aSBram Moolenaar END 2730792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2731792f786aSBram Moolenaar 2732792f786aSBram Moolenaar lines =<< trim END 2733792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2734792f786aSBram Moolenaar echo v1 2735792f786aSBram Moolenaar endfor 2736792f786aSBram Moolenaar END 2737792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2738792f786aSBram Moolenaarenddef 2739792f786aSBram Moolenaar 2740c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2741f2253963SBram Moolenaar var lines =<< trim END 2742c150c09eSBram Moolenaar var looped = 0 2743c150c09eSBram Moolenaar var cleanup = 0 2744c150c09eSBram Moolenaar for i in range(3) 2745c150c09eSBram Moolenaar looped += 1 2746c150c09eSBram Moolenaar try 2747c150c09eSBram Moolenaar eval [][0] 2748c150c09eSBram Moolenaar catch 2749c150c09eSBram Moolenaar continue 2750c150c09eSBram Moolenaar finally 2751c150c09eSBram Moolenaar cleanup += 1 2752c150c09eSBram Moolenaar endtry 2753c150c09eSBram Moolenaar endfor 2754c150c09eSBram Moolenaar assert_equal(3, looped) 2755c150c09eSBram Moolenaar assert_equal(3, cleanup) 2756f2253963SBram Moolenaar END 2757f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2758c150c09eSBram Moolenaarenddef 2759c150c09eSBram Moolenaar 2760d0df1aacSBram Moolenaardef Test_while_loop() 2761cfcd011fSBram Moolenaar var result = '' 2762cfcd011fSBram Moolenaar var cnt = 0 2763d0df1aacSBram Moolenaar while cnt < 555 2764d0df1aacSBram Moolenaar if cnt == 3 2765d0df1aacSBram Moolenaar break 2766d0df1aacSBram Moolenaar endif 2767d0df1aacSBram Moolenaar cnt += 1 2768d0df1aacSBram Moolenaar if cnt == 2 2769d0df1aacSBram Moolenaar continue 2770d0df1aacSBram Moolenaar endif 2771d0df1aacSBram Moolenaar result ..= cnt .. '_' 2772d0df1aacSBram Moolenaar endwhile 2773d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2774dee37dc7SBram Moolenaar 2775dee37dc7SBram Moolenaar var s = '' 27760123cc1eSBram Moolenaar while s == 'x' # {comment} 2777dee37dc7SBram Moolenaar endwhile 2778d0df1aacSBram Moolenaarenddef 2779d0df1aacSBram Moolenaar 2780e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2781675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2782675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2783675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2784675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2785675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2786675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2787675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 27886628b7ebSBram Moolenaar 27896628b7ebSBram Moolenaar var lines =<< trim END 27906628b7ebSBram Moolenaar var s = '' 27916628b7ebSBram Moolenaar while s = '' 27926628b7ebSBram Moolenaar endwhile 27936628b7ebSBram Moolenaar END 27946628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2795bd5da371SBram Moolenaarenddef 2796bd5da371SBram Moolenaar 27979645e2d9SBram Moolenaardef Test_interrupt_loop() 2798cfcd011fSBram Moolenaar var caught = false 2799cfcd011fSBram Moolenaar var x = 0 280097acfc78SBram Moolenaar try 28019645e2d9SBram Moolenaar while 1 28029645e2d9SBram Moolenaar x += 1 28039645e2d9SBram Moolenaar if x == 100 28049645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 28059645e2d9SBram Moolenaar endif 28069645e2d9SBram Moolenaar endwhile 280797acfc78SBram Moolenaar catch 280897acfc78SBram Moolenaar caught = true 280997acfc78SBram Moolenaar assert_equal(100, x) 281097acfc78SBram Moolenaar endtry 281197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 281225859dd7SBram Moolenaar # consume the CTRL-C 281325859dd7SBram Moolenaar getchar(0) 28149645e2d9SBram Moolenaarenddef 281520431c9dSBram Moolenaar 28164fdae999SBram Moolenaardef Test_automatic_line_continuation() 2817cfcd011fSBram Moolenaar var mylist = [ 28184fdae999SBram Moolenaar 'one', 28194fdae999SBram Moolenaar 'two', 28204fdae999SBram Moolenaar 'three', 2821f5be8cdbSBram Moolenaar ] # comment 28224fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 28234fdae999SBram Moolenaar 2824cfcd011fSBram Moolenaar var mydict = { 2825e0de171eSBram Moolenaar ['one']: 1, 2826e0de171eSBram Moolenaar ['two']: 2, 2827e0de171eSBram Moolenaar ['three']: 28284fdae999SBram Moolenaar 3, 2829f5be8cdbSBram Moolenaar } # comment 2830e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2831e0de171eSBram Moolenaar mydict = { 28322c330432SBram Moolenaar one: 1, # comment 28332c330432SBram Moolenaar two: # comment 28342c330432SBram Moolenaar 2, # comment 28352c330432SBram Moolenaar three: 3 # comment 28362c330432SBram Moolenaar } 2837e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2838e0de171eSBram Moolenaar mydict = { 28392c330432SBram Moolenaar one: 1, 28404fdae999SBram Moolenaar two: 28414fdae999SBram Moolenaar 2, 28422c330432SBram Moolenaar three: 3 28434fdae999SBram Moolenaar } 2844e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2845e6085c53SBram Moolenaar 2846e6085c53SBram Moolenaar assert_equal( 2847e6085c53SBram Moolenaar ['one', 'two', 'three'], 2848e6085c53SBram Moolenaar split('one two three') 2849e6085c53SBram Moolenaar ) 28504fdae999SBram Moolenaarenddef 28514fdae999SBram Moolenaar 28527a092245SBram Moolenaardef Test_vim9_comment() 28537a092245SBram Moolenaar CheckScriptSuccess([ 28547a092245SBram Moolenaar 'vim9script', 28557a092245SBram Moolenaar '# something', 285693f82cbeSBram Moolenaar '#something', 285793f82cbeSBram Moolenaar '#{something', 28587a092245SBram Moolenaar ]) 285993f82cbeSBram Moolenaar 286093f82cbeSBram Moolenaar split Xfile 286193f82cbeSBram Moolenaar CheckScriptSuccess([ 286293f82cbeSBram Moolenaar 'vim9script', 286393f82cbeSBram Moolenaar 'edit #something', 286493f82cbeSBram Moolenaar ]) 286593f82cbeSBram Moolenaar CheckScriptSuccess([ 286693f82cbeSBram Moolenaar 'vim9script', 286793f82cbeSBram Moolenaar 'edit #{something', 286893f82cbeSBram Moolenaar ]) 286993f82cbeSBram Moolenaar close 287093f82cbeSBram Moolenaar 28717a092245SBram Moolenaar CheckScriptFailure([ 28727a092245SBram Moolenaar 'vim9script', 28737a092245SBram Moolenaar ':# something', 28747a092245SBram Moolenaar ], 'E488:') 28757a092245SBram Moolenaar CheckScriptFailure([ 28767a092245SBram Moolenaar '# something', 28777a092245SBram Moolenaar ], 'E488:') 28787a092245SBram Moolenaar CheckScriptFailure([ 28797a092245SBram Moolenaar ':# something', 28807a092245SBram Moolenaar ], 'E488:') 28817a092245SBram Moolenaar 28824a8d9f2eSBram Moolenaar { # block start 28834a8d9f2eSBram Moolenaar } # block end 28844a8d9f2eSBram Moolenaar CheckDefFailure([ 28854a8d9f2eSBram Moolenaar '{# comment', 28864a8d9f2eSBram Moolenaar ], 'E488:') 28874a8d9f2eSBram Moolenaar CheckDefFailure([ 28884a8d9f2eSBram Moolenaar '{', 28894a8d9f2eSBram Moolenaar '}# comment', 28904a8d9f2eSBram Moolenaar ], 'E488:') 28914a8d9f2eSBram Moolenaar 28924a8d9f2eSBram Moolenaar echo "yes" # comment 28934a8d9f2eSBram Moolenaar CheckDefFailure([ 28944a8d9f2eSBram Moolenaar 'echo "yes"# comment', 28954a8d9f2eSBram Moolenaar ], 'E488:') 28967a092245SBram Moolenaar CheckScriptSuccess([ 28977a092245SBram Moolenaar 'vim9script', 28987a092245SBram Moolenaar 'echo "yes" # something', 28997a092245SBram Moolenaar ]) 29007a092245SBram Moolenaar CheckScriptFailure([ 29017a092245SBram Moolenaar 'vim9script', 29027a092245SBram Moolenaar 'echo "yes"# something', 29037a092245SBram Moolenaar ], 'E121:') 29047a092245SBram Moolenaar CheckScriptFailure([ 29057a092245SBram Moolenaar 'vim9script', 29067a092245SBram Moolenaar 'echo# something', 2907f8103f27SBram Moolenaar ], 'E1144:') 29087a092245SBram Moolenaar CheckScriptFailure([ 29097a092245SBram Moolenaar 'echo "yes" # something', 29107a092245SBram Moolenaar ], 'E121:') 29117a092245SBram Moolenaar 29124a8d9f2eSBram Moolenaar exe "echo" # comment 29134a8d9f2eSBram Moolenaar CheckDefFailure([ 29144a8d9f2eSBram Moolenaar 'exe "echo"# comment', 29154a8d9f2eSBram Moolenaar ], 'E488:') 29164a8d9f2eSBram Moolenaar CheckScriptSuccess([ 29174a8d9f2eSBram Moolenaar 'vim9script', 29184a8d9f2eSBram Moolenaar 'exe "echo" # something', 29194a8d9f2eSBram Moolenaar ]) 29204a8d9f2eSBram Moolenaar CheckScriptFailure([ 29214a8d9f2eSBram Moolenaar 'vim9script', 29224a8d9f2eSBram Moolenaar 'exe "echo"# something', 29234a8d9f2eSBram Moolenaar ], 'E121:') 29244a8d9f2eSBram Moolenaar CheckScriptFailure([ 29254a8d9f2eSBram Moolenaar 'vim9script', 29264a8d9f2eSBram Moolenaar 'exe# something', 2927f8103f27SBram Moolenaar ], 'E1144:') 29284a8d9f2eSBram Moolenaar CheckScriptFailure([ 29294a8d9f2eSBram Moolenaar 'exe "echo" # something', 29304a8d9f2eSBram Moolenaar ], 'E121:') 29314a8d9f2eSBram Moolenaar 29327a092245SBram Moolenaar CheckDefFailure([ 29337a092245SBram Moolenaar 'try# comment', 29347a092245SBram Moolenaar ' echo "yes"', 29357a092245SBram Moolenaar 'catch', 29367a092245SBram Moolenaar 'endtry', 2937f8103f27SBram Moolenaar ], 'E1144:') 29382c5ed4e3SBram Moolenaar CheckScriptFailure([ 29392c5ed4e3SBram Moolenaar 'vim9script', 29402c5ed4e3SBram Moolenaar 'try# comment', 29412c5ed4e3SBram Moolenaar 'echo "yes"', 2942f8103f27SBram Moolenaar ], 'E1144:') 29437a092245SBram Moolenaar CheckDefFailure([ 29447a092245SBram Moolenaar 'try', 2945a72cfb80SBram Moolenaar ' throw#comment', 2946a72cfb80SBram Moolenaar 'catch', 2947a72cfb80SBram Moolenaar 'endtry', 2948f8103f27SBram Moolenaar ], 'E1144:') 2949a72cfb80SBram Moolenaar CheckDefFailure([ 2950a72cfb80SBram Moolenaar 'try', 2951a72cfb80SBram Moolenaar ' throw "yes"#comment', 2952a72cfb80SBram Moolenaar 'catch', 2953a72cfb80SBram Moolenaar 'endtry', 2954a72cfb80SBram Moolenaar ], 'E488:') 2955a72cfb80SBram Moolenaar CheckDefFailure([ 2956a72cfb80SBram Moolenaar 'try', 29577a092245SBram Moolenaar ' echo "yes"', 29587a092245SBram Moolenaar 'catch# comment', 29597a092245SBram Moolenaar 'endtry', 2960f8103f27SBram Moolenaar ], 'E1144:') 29612c5ed4e3SBram Moolenaar CheckScriptFailure([ 29622c5ed4e3SBram Moolenaar 'vim9script', 29632c5ed4e3SBram Moolenaar 'try', 29642c5ed4e3SBram Moolenaar ' echo "yes"', 29652c5ed4e3SBram Moolenaar 'catch# comment', 29662c5ed4e3SBram Moolenaar 'endtry', 2967f8103f27SBram Moolenaar ], 'E1144:') 29682c5ed4e3SBram Moolenaar CheckDefFailure([ 29692c5ed4e3SBram Moolenaar 'try', 29702c5ed4e3SBram Moolenaar ' echo "yes"', 29712c5ed4e3SBram Moolenaar 'catch /pat/# comment', 29722c5ed4e3SBram Moolenaar 'endtry', 29732c5ed4e3SBram Moolenaar ], 'E488:') 29747a092245SBram Moolenaar CheckDefFailure([ 29757a092245SBram Moolenaar 'try', 29767a092245SBram Moolenaar 'echo "yes"', 29777a092245SBram Moolenaar 'catch', 29787a092245SBram Moolenaar 'endtry# comment', 2979f8103f27SBram Moolenaar ], 'E1144:') 29802c5ed4e3SBram Moolenaar CheckScriptFailure([ 29812c5ed4e3SBram Moolenaar 'vim9script', 29822c5ed4e3SBram Moolenaar 'try', 29832c5ed4e3SBram Moolenaar ' echo "yes"', 29842c5ed4e3SBram Moolenaar 'catch', 29852c5ed4e3SBram Moolenaar 'endtry# comment', 2986f8103f27SBram Moolenaar ], 'E1144:') 29872c5ed4e3SBram Moolenaar 29882c5ed4e3SBram Moolenaar CheckScriptSuccess([ 29892c5ed4e3SBram Moolenaar 'vim9script', 29902c5ed4e3SBram Moolenaar 'hi # comment', 29912c5ed4e3SBram Moolenaar ]) 29922c5ed4e3SBram Moolenaar CheckScriptFailure([ 29932c5ed4e3SBram Moolenaar 'vim9script', 29942c5ed4e3SBram Moolenaar 'hi# comment', 2995f8103f27SBram Moolenaar ], 'E1144:') 29961966c248SBram Moolenaar CheckScriptSuccess([ 29971966c248SBram Moolenaar 'vim9script', 29981966c248SBram Moolenaar 'hi Search # comment', 29991966c248SBram Moolenaar ]) 30001966c248SBram Moolenaar CheckScriptFailure([ 30011966c248SBram Moolenaar 'vim9script', 30021966c248SBram Moolenaar 'hi Search# comment', 30031966c248SBram Moolenaar ], 'E416:') 30041966c248SBram Moolenaar CheckScriptSuccess([ 30051966c248SBram Moolenaar 'vim9script', 30061966c248SBram Moolenaar 'hi link This Search # comment', 30071966c248SBram Moolenaar ]) 30081966c248SBram Moolenaar CheckScriptFailure([ 30091966c248SBram Moolenaar 'vim9script', 30101966c248SBram Moolenaar 'hi link This That# comment', 30111966c248SBram Moolenaar ], 'E413:') 30121966c248SBram Moolenaar CheckScriptSuccess([ 30131966c248SBram Moolenaar 'vim9script', 30141966c248SBram Moolenaar 'hi clear This # comment', 30151966c248SBram Moolenaar 'hi clear # comment', 30161966c248SBram Moolenaar ]) 3017f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3018f5be8cdbSBram Moolenaar # hi clear This# comment', 30191966c248SBram Moolenaar CheckScriptFailure([ 30201966c248SBram Moolenaar 'vim9script', 30211966c248SBram Moolenaar 'hi clear# comment', 30221966c248SBram Moolenaar ], 'E416:') 30231966c248SBram Moolenaar 30241966c248SBram Moolenaar CheckScriptSuccess([ 30251966c248SBram Moolenaar 'vim9script', 30261966c248SBram Moolenaar 'hi Group term=bold', 30271966c248SBram Moolenaar 'match Group /todo/ # comment', 30281966c248SBram Moolenaar ]) 30291966c248SBram Moolenaar CheckScriptFailure([ 30301966c248SBram Moolenaar 'vim9script', 30311966c248SBram Moolenaar 'hi Group term=bold', 30321966c248SBram Moolenaar 'match Group /todo/# comment', 30331966c248SBram Moolenaar ], 'E488:') 30341966c248SBram Moolenaar CheckScriptSuccess([ 30351966c248SBram Moolenaar 'vim9script', 30361966c248SBram Moolenaar 'match # comment', 30371966c248SBram Moolenaar ]) 30381966c248SBram Moolenaar CheckScriptFailure([ 30391966c248SBram Moolenaar 'vim9script', 30401966c248SBram Moolenaar 'match# comment', 3041f8103f27SBram Moolenaar ], 'E1144:') 30421966c248SBram Moolenaar CheckScriptSuccess([ 30431966c248SBram Moolenaar 'vim9script', 30441966c248SBram Moolenaar 'match none # comment', 30451966c248SBram Moolenaar ]) 30461966c248SBram Moolenaar CheckScriptFailure([ 30471966c248SBram Moolenaar 'vim9script', 30481966c248SBram Moolenaar 'match none# comment', 30491966c248SBram Moolenaar ], 'E475:') 30501966c248SBram Moolenaar 30511966c248SBram Moolenaar CheckScriptSuccess([ 30521966c248SBram Moolenaar 'vim9script', 30531966c248SBram Moolenaar 'menutrans clear # comment', 30541966c248SBram Moolenaar ]) 30551966c248SBram Moolenaar CheckScriptFailure([ 30561966c248SBram Moolenaar 'vim9script', 30571966c248SBram Moolenaar 'menutrans clear# comment text', 30581966c248SBram Moolenaar ], 'E474:') 30591966c248SBram Moolenaar 30601966c248SBram Moolenaar CheckScriptSuccess([ 30611966c248SBram Moolenaar 'vim9script', 30621966c248SBram Moolenaar 'syntax clear # comment', 30631966c248SBram Moolenaar ]) 30641966c248SBram Moolenaar CheckScriptFailure([ 30651966c248SBram Moolenaar 'vim9script', 30661966c248SBram Moolenaar 'syntax clear# comment text', 30671966c248SBram Moolenaar ], 'E28:') 30681966c248SBram Moolenaar CheckScriptSuccess([ 30691966c248SBram Moolenaar 'vim9script', 30701966c248SBram Moolenaar 'syntax keyword Word some', 30711966c248SBram Moolenaar 'syntax clear Word # comment', 30721966c248SBram Moolenaar ]) 30731966c248SBram Moolenaar CheckScriptFailure([ 30741966c248SBram Moolenaar 'vim9script', 30751966c248SBram Moolenaar 'syntax keyword Word some', 30761966c248SBram Moolenaar 'syntax clear Word# comment text', 30771966c248SBram Moolenaar ], 'E28:') 30781966c248SBram Moolenaar 30791966c248SBram Moolenaar CheckScriptSuccess([ 30801966c248SBram Moolenaar 'vim9script', 30811966c248SBram Moolenaar 'syntax list # comment', 30821966c248SBram Moolenaar ]) 30831966c248SBram Moolenaar CheckScriptFailure([ 30841966c248SBram Moolenaar 'vim9script', 30851966c248SBram Moolenaar 'syntax list# comment text', 30861966c248SBram Moolenaar ], 'E28:') 30871966c248SBram Moolenaar 30881966c248SBram Moolenaar CheckScriptSuccess([ 30891966c248SBram Moolenaar 'vim9script', 30901966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 30911966c248SBram Moolenaar ]) 30921966c248SBram Moolenaar CheckScriptFailure([ 30931966c248SBram Moolenaar 'vim9script', 30941966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 30951966c248SBram Moolenaar ], 'E475:') 30961966c248SBram Moolenaar 30971966c248SBram Moolenaar CheckScriptSuccess([ 30981966c248SBram Moolenaar 'vim9script', 30991966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 31001966c248SBram Moolenaar ]) 31011966c248SBram Moolenaar CheckScriptFailure([ 31021966c248SBram Moolenaar 'vim9script', 31031966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 31041966c248SBram Moolenaar ], 'E789:') 31051966c248SBram Moolenaar 31061966c248SBram Moolenaar CheckScriptSuccess([ 31071966c248SBram Moolenaar 'vim9script', 31081966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 31091966c248SBram Moolenaar ]) 31101966c248SBram Moolenaar CheckScriptFailure([ 31111966c248SBram Moolenaar 'vim9script', 31121966c248SBram Moolenaar 'syntax match Word /pat/# comment', 31131966c248SBram Moolenaar ], 'E402:') 31141966c248SBram Moolenaar 31151966c248SBram Moolenaar CheckScriptSuccess([ 31161966c248SBram Moolenaar 'vim9script', 31171966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 31181966c248SBram Moolenaar ]) 31191966c248SBram Moolenaar CheckScriptFailure([ 31201966c248SBram Moolenaar 'vim9script', 31211966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 31221966c248SBram Moolenaar ], 'E475:') 31231966c248SBram Moolenaar CheckScriptFailure([ 31241966c248SBram Moolenaar 'vim9script', 31251966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31261966c248SBram Moolenaar ], 'E406:') 31271966c248SBram Moolenaar CheckScriptFailure([ 31281966c248SBram Moolenaar 'vim9script', 31291966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 31301966c248SBram Moolenaar ], 'E475:') 31311966c248SBram Moolenaar 31321966c248SBram Moolenaar CheckScriptSuccess([ 31331966c248SBram Moolenaar 'vim9script', 31341966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 31351966c248SBram Moolenaar ]) 31361966c248SBram Moolenaar CheckScriptFailure([ 31371966c248SBram Moolenaar 'vim9script', 31381966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3139d032f34aSBram Moolenaar ], 'E402:') 31401966c248SBram Moolenaar 31411966c248SBram Moolenaar CheckScriptSuccess([ 31421966c248SBram Moolenaar 'vim9script', 31431966c248SBram Moolenaar 'syntax sync # comment', 31441966c248SBram Moolenaar ]) 31451966c248SBram Moolenaar CheckScriptFailure([ 31461966c248SBram Moolenaar 'vim9script', 31471966c248SBram Moolenaar 'syntax sync# comment', 31481966c248SBram Moolenaar ], 'E404:') 31491966c248SBram Moolenaar CheckScriptSuccess([ 31501966c248SBram Moolenaar 'vim9script', 31511966c248SBram Moolenaar 'syntax sync ccomment # comment', 31521966c248SBram Moolenaar ]) 31531966c248SBram Moolenaar CheckScriptFailure([ 31541966c248SBram Moolenaar 'vim9script', 31551966c248SBram Moolenaar 'syntax sync ccomment# comment', 31561966c248SBram Moolenaar ], 'E404:') 31571966c248SBram Moolenaar 31581966c248SBram Moolenaar CheckScriptSuccess([ 31591966c248SBram Moolenaar 'vim9script', 31601966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 31611966c248SBram Moolenaar ]) 31621966c248SBram Moolenaar CheckScriptFailure([ 31631966c248SBram Moolenaar 'vim9script', 31641966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 31651966c248SBram Moolenaar ], 'E475:') 3166a72cfb80SBram Moolenaar 3167a72cfb80SBram Moolenaar CheckScriptSuccess([ 3168a72cfb80SBram Moolenaar 'vim9script', 3169a72cfb80SBram Moolenaar 'command Echo echo # comment', 3170a72cfb80SBram Moolenaar 'command Echo # comment', 31712d870f8dSBram Moolenaar 'delcommand Echo', 3172a72cfb80SBram Moolenaar ]) 3173a72cfb80SBram Moolenaar CheckScriptFailure([ 3174a72cfb80SBram Moolenaar 'vim9script', 3175a72cfb80SBram Moolenaar 'command Echo echo# comment', 3176a72cfb80SBram Moolenaar 'Echo', 3177f8103f27SBram Moolenaar ], 'E1144:') 31782d870f8dSBram Moolenaar delcommand Echo 317970249ee8SBram Moolenaar 318070249ee8SBram Moolenaar var curdir = getcwd() 318170249ee8SBram Moolenaar CheckScriptSuccess([ 318270249ee8SBram Moolenaar 'command Echo cd " comment', 318370249ee8SBram Moolenaar 'Echo', 318470249ee8SBram Moolenaar 'delcommand Echo', 318570249ee8SBram Moolenaar ]) 318670249ee8SBram Moolenaar CheckScriptSuccess([ 3187090728adSBram Moolenaar 'vim9script', 318870249ee8SBram Moolenaar 'command Echo cd # comment', 318970249ee8SBram Moolenaar 'Echo', 319070249ee8SBram Moolenaar 'delcommand Echo', 319170249ee8SBram Moolenaar ]) 319270249ee8SBram Moolenaar CheckScriptFailure([ 319370249ee8SBram Moolenaar 'vim9script', 319470249ee8SBram Moolenaar 'command Echo cd " comment', 319570249ee8SBram Moolenaar 'Echo', 319670249ee8SBram Moolenaar ], 'E344:') 319770249ee8SBram Moolenaar delcommand Echo 319870249ee8SBram Moolenaar chdir(curdir) 319970249ee8SBram Moolenaar 3200a72cfb80SBram Moolenaar CheckScriptFailure([ 3201a72cfb80SBram Moolenaar 'vim9script', 3202a72cfb80SBram Moolenaar 'command Echo# comment', 3203a72cfb80SBram Moolenaar ], 'E182:') 3204a72cfb80SBram Moolenaar CheckScriptFailure([ 3205a72cfb80SBram Moolenaar 'vim9script', 3206a72cfb80SBram Moolenaar 'command Echo echo', 3207a72cfb80SBram Moolenaar 'command Echo# comment', 3208a72cfb80SBram Moolenaar ], 'E182:') 32092d870f8dSBram Moolenaar delcommand Echo 3210a72cfb80SBram Moolenaar 3211a72cfb80SBram Moolenaar CheckScriptSuccess([ 3212a72cfb80SBram Moolenaar 'vim9script', 3213a72cfb80SBram Moolenaar 'function # comment', 3214a72cfb80SBram Moolenaar ]) 3215a72cfb80SBram Moolenaar CheckScriptFailure([ 3216a72cfb80SBram Moolenaar 'vim9script', 32179898107fSBram Moolenaar 'function " comment', 32189898107fSBram Moolenaar ], 'E129:') 32199898107fSBram Moolenaar CheckScriptFailure([ 32209898107fSBram Moolenaar 'vim9script', 3221a72cfb80SBram Moolenaar 'function# comment', 3222f8103f27SBram Moolenaar ], 'E1144:') 3223a72cfb80SBram Moolenaar CheckScriptSuccess([ 3224a72cfb80SBram Moolenaar 'vim9script', 3225a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3226a72cfb80SBram Moolenaar ]) 3227a72cfb80SBram Moolenaar CheckScriptFailure([ 3228a72cfb80SBram Moolenaar 'vim9script', 3229a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3230a72cfb80SBram Moolenaar ], 'E488:') 3231a72cfb80SBram Moolenaar 3232a72cfb80SBram Moolenaar CheckScriptSuccess([ 3233a72cfb80SBram Moolenaar 'vim9script', 32344c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3235a72cfb80SBram Moolenaar 'endfunc', 32364c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3237a72cfb80SBram Moolenaar ]) 3238a72cfb80SBram Moolenaar CheckScriptFailure([ 3239a72cfb80SBram Moolenaar 'vim9script', 32404c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3241a72cfb80SBram Moolenaar 'endfunc', 32424c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3243a72cfb80SBram Moolenaar ], 'E488:') 3244a72cfb80SBram Moolenaar 3245a72cfb80SBram Moolenaar CheckScriptSuccess([ 3246a72cfb80SBram Moolenaar 'vim9script', 3247a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3248a72cfb80SBram Moolenaar ]) 3249a72cfb80SBram Moolenaar CheckScriptFailure([ 3250a72cfb80SBram Moolenaar 'vim9script', 3251a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3252a72cfb80SBram Moolenaar ], 'E488:') 3253e7e4838fSBram Moolenaar 3254e7e4838fSBram Moolenaar CheckScriptFailure([ 3255e7e4838fSBram Moolenaar 'def Test() " comment', 3256e7e4838fSBram Moolenaar 'enddef', 3257e7e4838fSBram Moolenaar ], 'E488:') 3258e7e4838fSBram Moolenaar CheckScriptFailure([ 3259e7e4838fSBram Moolenaar 'vim9script', 3260e7e4838fSBram Moolenaar 'def Test() " comment', 3261e7e4838fSBram Moolenaar 'enddef', 3262e7e4838fSBram Moolenaar ], 'E488:') 3263e7e4838fSBram Moolenaar 3264e7e4838fSBram Moolenaar CheckScriptSuccess([ 3265e7e4838fSBram Moolenaar 'func Test() " comment', 3266e7e4838fSBram Moolenaar 'endfunc', 32672d870f8dSBram Moolenaar 'delfunc Test', 3268e7e4838fSBram Moolenaar ]) 32699898107fSBram Moolenaar CheckScriptSuccess([ 3270e7e4838fSBram Moolenaar 'vim9script', 3271e7e4838fSBram Moolenaar 'func Test() " comment', 3272e7e4838fSBram Moolenaar 'endfunc', 32739898107fSBram Moolenaar ]) 3274e7e4838fSBram Moolenaar 3275e7e4838fSBram Moolenaar CheckScriptSuccess([ 3276e7e4838fSBram Moolenaar 'def Test() # comment', 3277e7e4838fSBram Moolenaar 'enddef', 3278e7e4838fSBram Moolenaar ]) 3279e7e4838fSBram Moolenaar CheckScriptFailure([ 3280e7e4838fSBram Moolenaar 'func Test() # comment', 3281e7e4838fSBram Moolenaar 'endfunc', 3282e7e4838fSBram Moolenaar ], 'E488:') 32830f37e356SBram Moolenaar 32840f37e356SBram Moolenaar var lines =<< trim END 32850f37e356SBram Moolenaar vim9script 32860f37e356SBram Moolenaar syn region Text 32870f37e356SBram Moolenaar \ start='foo' 32880f37e356SBram Moolenaar #\ comment 32890f37e356SBram Moolenaar \ end='bar' 32905072b47aSBram Moolenaar syn region Text start='foo' 32915072b47aSBram Moolenaar #\ comment 32925072b47aSBram Moolenaar \ end='bar' 32930f37e356SBram Moolenaar END 32940f37e356SBram Moolenaar CheckScriptSuccess(lines) 32950f37e356SBram Moolenaar 32960f37e356SBram Moolenaar lines =<< trim END 32970f37e356SBram Moolenaar vim9script 32980f37e356SBram Moolenaar syn region Text 32990f37e356SBram Moolenaar \ start='foo' 33000f37e356SBram Moolenaar "\ comment 33010f37e356SBram Moolenaar \ end='bar' 33020f37e356SBram Moolenaar END 33030f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 33042c5ed4e3SBram Moolenaarenddef 33052c5ed4e3SBram Moolenaar 33062c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 33072c5ed4e3SBram Moolenaar CheckCanRunGui 33082c5ed4e3SBram Moolenaar 33092c5ed4e3SBram Moolenaar CheckScriptFailure([ 33102c5ed4e3SBram Moolenaar 'vim9script', 33112c5ed4e3SBram Moolenaar 'gui#comment' 3312f8103f27SBram Moolenaar ], 'E1144:') 33132c5ed4e3SBram Moolenaar CheckScriptFailure([ 33142c5ed4e3SBram Moolenaar 'vim9script', 33152c5ed4e3SBram Moolenaar 'gui -f#comment' 33162c5ed4e3SBram Moolenaar ], 'E499:') 33177a092245SBram Moolenaarenddef 33187a092245SBram Moolenaar 3319a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 33206797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 33216797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3322a26b9700SBram Moolenaar 3323a26b9700SBram Moolenaar edit test.vim 3324a26b9700SBram Moolenaar doautocmd TabEnter #comment 3325a26b9700SBram Moolenaar assert_equal(1, g:entered) 3326a26b9700SBram Moolenaar 3327a26b9700SBram Moolenaar doautocmd TabEnter f.x 3328a26b9700SBram Moolenaar assert_equal(2, g:entered) 3329a26b9700SBram Moolenaar 3330a26b9700SBram Moolenaar g:entered = 0 3331a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3332a26b9700SBram Moolenaar assert_equal(2, g:entered) 3333a26b9700SBram Moolenaar 3334a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3335a26b9700SBram Moolenaar 3336a26b9700SBram Moolenaar au! TabEnter 3337a26b9700SBram Moolenaar unlet g:entered 3338d72c1bf0SBram Moolenaar 3339d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3340d72c1bf0SBram Moolenaar 'vim9script', 33416797966dSBram Moolenaar 'g:var = 123', 3342e55b1c09SBram Moolenaar 'b:var = 456', 3343e55b1c09SBram Moolenaar 'w:var = 777', 3344e55b1c09SBram Moolenaar 't:var = 888', 3345d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3346d72c1bf0SBram Moolenaar ]) 3347d72c1bf0SBram Moolenaar 3348d72c1bf0SBram Moolenaar CheckScriptFailure([ 3349d72c1bf0SBram Moolenaar 'vim9script', 3350cfcd011fSBram Moolenaar 'let var = 123', 3351cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3352cfcd011fSBram Moolenaar 3353cfcd011fSBram Moolenaar CheckScriptFailure([ 3354cfcd011fSBram Moolenaar 'vim9script', 3355cfcd011fSBram Moolenaar 'var g:var = 123', 3356e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3357e55b1c09SBram Moolenaar 3358e55b1c09SBram Moolenaar CheckScriptFailure([ 3359e55b1c09SBram Moolenaar 'vim9script', 3360cfcd011fSBram Moolenaar 'var b:var = 123', 3361e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3362e55b1c09SBram Moolenaar 3363e55b1c09SBram Moolenaar CheckScriptFailure([ 3364e55b1c09SBram Moolenaar 'vim9script', 3365cfcd011fSBram Moolenaar 'var w:var = 123', 3366e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3367e55b1c09SBram Moolenaar 3368e55b1c09SBram Moolenaar CheckScriptFailure([ 3369e55b1c09SBram Moolenaar 'vim9script', 3370cfcd011fSBram Moolenaar 'var t:var = 123', 3371e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3372e55b1c09SBram Moolenaar 3373e55b1c09SBram Moolenaar CheckScriptFailure([ 3374e55b1c09SBram Moolenaar 'vim9script', 3375cfcd011fSBram Moolenaar 'var v:version = 123', 3376e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3377e55b1c09SBram Moolenaar 3378e55b1c09SBram Moolenaar CheckScriptFailure([ 3379e55b1c09SBram Moolenaar 'vim9script', 3380cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3381e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 33826797966dSBram Moolenaar 33836797966dSBram Moolenaar CheckScriptFailure([ 33846797966dSBram Moolenaar 'vim9script', 33856797966dSBram Moolenaar 'g:var = 123', 338632e35117SBram Moolenaar 'unlet g:var# comment1', 3387d72c1bf0SBram Moolenaar ], 'E108:') 3388d72c1bf0SBram Moolenaar 3389d72c1bf0SBram Moolenaar CheckScriptFailure([ 3390d72c1bf0SBram Moolenaar 'let g:var = 123', 3391d72c1bf0SBram Moolenaar 'unlet g:var # something', 3392d72c1bf0SBram Moolenaar ], 'E488:') 3393faac4104SBram Moolenaar 3394faac4104SBram Moolenaar CheckScriptSuccess([ 3395faac4104SBram Moolenaar 'vim9script', 339632e35117SBram Moolenaar 'if 1 # comment2', 3397faac4104SBram Moolenaar ' echo "yes"', 3398faac4104SBram Moolenaar 'elseif 2 #comment', 3399faac4104SBram Moolenaar ' echo "no"', 3400faac4104SBram Moolenaar 'endif', 3401faac4104SBram Moolenaar ]) 3402faac4104SBram Moolenaar 3403faac4104SBram Moolenaar CheckScriptFailure([ 3404faac4104SBram Moolenaar 'vim9script', 340532e35117SBram Moolenaar 'if 1# comment3', 3406faac4104SBram Moolenaar ' echo "yes"', 3407faac4104SBram Moolenaar 'endif', 3408fae55a9cSBram Moolenaar ], 'E488:') 3409faac4104SBram Moolenaar 3410faac4104SBram Moolenaar CheckScriptFailure([ 3411faac4104SBram Moolenaar 'vim9script', 341232e35117SBram Moolenaar 'if 0 # comment4', 3413faac4104SBram Moolenaar ' echo "yes"', 3414faac4104SBram Moolenaar 'elseif 2#comment', 3415faac4104SBram Moolenaar ' echo "no"', 3416faac4104SBram Moolenaar 'endif', 3417fae55a9cSBram Moolenaar ], 'E488:') 3418faac4104SBram Moolenaar 3419faac4104SBram Moolenaar CheckScriptSuccess([ 3420faac4104SBram Moolenaar 'vim9script', 3421cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3422faac4104SBram Moolenaar ]) 3423faac4104SBram Moolenaar 3424faac4104SBram Moolenaar CheckScriptFailure([ 3425faac4104SBram Moolenaar 'vim9script', 3426cfcd011fSBram Moolenaar 'var v = 1# comment6', 3427fae55a9cSBram Moolenaar ], 'E488:') 3428faac4104SBram Moolenaar 3429faac4104SBram Moolenaar CheckScriptSuccess([ 3430faac4104SBram Moolenaar 'vim9script', 3431faac4104SBram Moolenaar 'new' 3432d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3433df069eecSBram Moolenaar ':$', 3434faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3435faac4104SBram Moolenaar 'bwipe!', 3436faac4104SBram Moolenaar ]) 3437faac4104SBram Moolenaar 3438f5be8cdbSBram Moolenaar CheckScriptFailure([ 3439f5be8cdbSBram Moolenaar 'vim9script', 3440f5be8cdbSBram Moolenaar 'new' 3441d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3442f5be8cdbSBram Moolenaar ':$', 3443f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3444f5be8cdbSBram Moolenaar 'bwipe!', 3445f5be8cdbSBram Moolenaar ], 'E488:') 3446f5be8cdbSBram Moolenaar 3447f5be8cdbSBram Moolenaar CheckScriptFailure([ 3448f5be8cdbSBram Moolenaar 'vim9script', 3449f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3450f5be8cdbSBram Moolenaar ], 'E477:') 3451a26b9700SBram Moolenaarenddef 3452a26b9700SBram Moolenaar 34537e5bd91dSBram Moolenaardef Test_finish() 3454cfcd011fSBram Moolenaar var lines =<< trim END 34557e5bd91dSBram Moolenaar vim9script 34566797966dSBram Moolenaar g:res = 'one' 34577e5bd91dSBram Moolenaar if v:false | finish | endif 34586797966dSBram Moolenaar g:res = 'two' 34597e5bd91dSBram Moolenaar finish 34606797966dSBram Moolenaar g:res = 'three' 34617e5bd91dSBram Moolenaar END 34627e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 34637e5bd91dSBram Moolenaar source Xfinished 34647e5bd91dSBram Moolenaar assert_equal('two', g:res) 34657e5bd91dSBram Moolenaar 34667e5bd91dSBram Moolenaar unlet g:res 34677e5bd91dSBram Moolenaar delete('Xfinished') 34687e5bd91dSBram Moolenaarenddef 34697e5bd91dSBram Moolenaar 3470a5d0077eSBram Moolenaardef Test_forward_declaration() 3471cfcd011fSBram Moolenaar var lines =<< trim END 3472a5d0077eSBram Moolenaar vim9script 3473a5d0077eSBram Moolenaar def GetValue(): string 3474a5d0077eSBram Moolenaar return theVal 3475a5d0077eSBram Moolenaar enddef 3476cfcd011fSBram Moolenaar var theVal = 'something' 3477822ba247SBram Moolenaar g:initVal = GetValue() 3478a5d0077eSBram Moolenaar theVal = 'else' 3479a5d0077eSBram Moolenaar g:laterVal = GetValue() 3480a5d0077eSBram Moolenaar END 3481a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3482a5d0077eSBram Moolenaar source Xforward 3483a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3484a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3485a5d0077eSBram Moolenaar 3486a5d0077eSBram Moolenaar unlet g:initVal 3487a5d0077eSBram Moolenaar unlet g:laterVal 3488a5d0077eSBram Moolenaar delete('Xforward') 3489a5d0077eSBram Moolenaarenddef 3490a5d0077eSBram Moolenaar 34919721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3492a6294955SBram Moolenaar var vim9_lines =<< trim END 3493a6294955SBram Moolenaar vim9script 3494a6294955SBram Moolenaar var local = 'local' 3495a6294955SBram Moolenaar g:global = 'global' 3496a6294955SBram Moolenaar export var exported = 'exported' 3497a6294955SBram Moolenaar export def GetText(): string 3498a6294955SBram Moolenaar return 'text' 3499a6294955SBram Moolenaar enddef 3500a6294955SBram Moolenaar END 3501a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3502a6294955SBram Moolenaar 3503cfcd011fSBram Moolenaar var legacy_lines =<< trim END 35049721fb4eSBram Moolenaar source Xvim9_script.vim 35059721fb4eSBram Moolenaar 35069721fb4eSBram Moolenaar call assert_false(exists('local')) 35079721fb4eSBram Moolenaar call assert_false(exists('exported')) 35089721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 35099721fb4eSBram Moolenaar call assert_equal('global', global) 35109721fb4eSBram Moolenaar call assert_equal('global', g:global) 35119721fb4eSBram Moolenaar 35129721fb4eSBram Moolenaar " imported variable becomes script-local 35139721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 35149721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 35159721fb4eSBram Moolenaar call assert_false(exists('exported')) 35169721fb4eSBram Moolenaar 35179721fb4eSBram Moolenaar " imported function becomes script-local 35189721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 35199721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 35209721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 35219721fb4eSBram Moolenaar END 35229721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 35239721fb4eSBram Moolenaar 35249721fb4eSBram Moolenaar source Xlegacy_script.vim 35259721fb4eSBram Moolenaar assert_equal('global', g:global) 3526f5be8cdbSBram Moolenaar unlet g:global 35279721fb4eSBram Moolenaar 35289721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 35299721fb4eSBram Moolenaar delete('Xvim9_script.vim') 35309721fb4eSBram Moolenaarenddef 3531a5d0077eSBram Moolenaar 3532e535db86SBram Moolenaardef Test_declare_script_in_func() 3533e535db86SBram Moolenaar var lines =<< trim END 3534e535db86SBram Moolenaar vim9script 3535e535db86SBram Moolenaar func Declare() 3536e535db86SBram Moolenaar let s:local = 123 3537e535db86SBram Moolenaar endfunc 3538e535db86SBram Moolenaar Declare() 3539e535db86SBram Moolenaar assert_equal(123, local) 3540e535db86SBram Moolenaar 3541e535db86SBram Moolenaar var error: string 3542e535db86SBram Moolenaar try 3543e535db86SBram Moolenaar local = 'asdf' 3544e535db86SBram Moolenaar catch 3545e535db86SBram Moolenaar error = v:exception 3546e535db86SBram Moolenaar endtry 3547e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3548e535db86SBram Moolenaar 3549e535db86SBram Moolenaar lockvar local 3550e535db86SBram Moolenaar try 3551e535db86SBram Moolenaar local = 999 3552e535db86SBram Moolenaar catch 3553e535db86SBram Moolenaar error = v:exception 3554e535db86SBram Moolenaar endtry 3555e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3556e535db86SBram Moolenaar END 3557e535db86SBram Moolenaar CheckScriptSuccess(lines) 3558e535db86SBram Moolenaarenddef 3559e535db86SBram Moolenaar 3560e535db86SBram Moolenaar 35617d699701SBram Moolenaarfunc Test_vim9script_not_global() 35627d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 35637d699701SBram Moolenaar let vim9lines =<< trim END 35647d699701SBram Moolenaar vim9script 3565cfcd011fSBram Moolenaar var name = 'local' 35667d699701SBram Moolenaar func TheFunc() 35677d699701SBram Moolenaar echo 'local' 35687d699701SBram Moolenaar endfunc 35697d699701SBram Moolenaar def DefFunc() 35707d699701SBram Moolenaar echo 'local' 35717d699701SBram Moolenaar enddef 35727d699701SBram Moolenaar END 35737d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 35747d699701SBram Moolenaar source Xvim9script.vim 35757d699701SBram Moolenaar try 35767d699701SBram Moolenaar echo g:var 35777d699701SBram Moolenaar assert_report('did not fail') 35787d699701SBram Moolenaar catch /E121:/ 35797d699701SBram Moolenaar " caught 35807d699701SBram Moolenaar endtry 35817d699701SBram Moolenaar try 35827d699701SBram Moolenaar call TheFunc() 35837d699701SBram Moolenaar assert_report('did not fail') 35847d699701SBram Moolenaar catch /E117:/ 35857d699701SBram Moolenaar " caught 35867d699701SBram Moolenaar endtry 35877d699701SBram Moolenaar try 35887d699701SBram Moolenaar call DefFunc() 35897d699701SBram Moolenaar assert_report('did not fail') 35907d699701SBram Moolenaar catch /E117:/ 35917d699701SBram Moolenaar " caught 35927d699701SBram Moolenaar endtry 35937d699701SBram Moolenaar 359425859dd7SBram Moolenaar call delete('Xvim9script.vim') 35957d699701SBram Moolenaarendfunc 35967d699701SBram Moolenaar 3597eeb27bfeSBram Moolenaardef Test_vim9_copen() 3598eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3599eeb27bfeSBram Moolenaar copen 3600eeb27bfeSBram Moolenaar quit 3601eeb27bfeSBram Moolenaarenddef 3602eeb27bfeSBram Moolenaar 360303290b84SBram Moolenaar" test using an auto-loaded function and variable 36042d6b20d6SBram Moolenaardef Test_vim9_autoload() 3605cfcd011fSBram Moolenaar var lines =<< trim END 36062d6b20d6SBram Moolenaar vim9script 360703290b84SBram Moolenaar def some#gettest(): string 360803290b84SBram Moolenaar return 'test' 360903290b84SBram Moolenaar enddef 361003290b84SBram Moolenaar g:some#name = 'name' 3611227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3612e3ffcd99SBram Moolenaar 3613e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3614e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3615e3ffcd99SBram Moolenaar enddef 361603290b84SBram Moolenaar END 361703290b84SBram Moolenaar 361803290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 361903290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 362003290b84SBram Moolenaar var save_rtp = &rtp 362103290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 362203290b84SBram Moolenaar 362303290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 362403290b84SBram Moolenaar assert_equal('name', g:some#name) 3625227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 362603290b84SBram Moolenaar g:some#other = 'other' 362703290b84SBram Moolenaar assert_equal('other', g:some#other) 362803290b84SBram Moolenaar 3629e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3630e3ffcd99SBram Moolenaar 363117f700acSBram Moolenaar # upper case script name works 363217f700acSBram Moolenaar lines =<< trim END 363317f700acSBram Moolenaar vim9script 363417f700acSBram Moolenaar def Other#getOther(): string 363517f700acSBram Moolenaar return 'other' 363617f700acSBram Moolenaar enddef 363717f700acSBram Moolenaar END 363817f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 363917f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 364017f700acSBram Moolenaar 364103290b84SBram Moolenaar delete('Xdir', 'rf') 364203290b84SBram Moolenaar &rtp = save_rtp 364303290b84SBram Moolenaarenddef 364403290b84SBram Moolenaar 364503290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 364603290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 364703290b84SBram Moolenaar var lines =<< trim END 364803290b84SBram Moolenaar vim9script 36492d6b20d6SBram Moolenaar def foo#test() 36502d6b20d6SBram Moolenaar echomsg getreg('"') 36512d6b20d6SBram Moolenaar enddef 36522d6b20d6SBram Moolenaar END 36532d6b20d6SBram Moolenaar 36542d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 36552d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3656cfcd011fSBram Moolenaar var save_rtp = &rtp 36572d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 36582d6b20d6SBram Moolenaar augroup test 36592d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 36602d6b20d6SBram Moolenaar augroup END 36612d6b20d6SBram Moolenaar 36622d6b20d6SBram Moolenaar normal Y 36632d6b20d6SBram Moolenaar 36642d6b20d6SBram Moolenaar augroup test 36652d6b20d6SBram Moolenaar autocmd! 36662d6b20d6SBram Moolenaar augroup END 36672d6b20d6SBram Moolenaar delete('Xdir', 'rf') 36682d6b20d6SBram Moolenaar &rtp = save_rtp 36692d6b20d6SBram Moolenaarenddef 36702d6b20d6SBram Moolenaar 367177e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 367277e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3673cfcd011fSBram Moolenaar var lines =<< trim END 367477e5dcc3SBram Moolenaar vim9script 367577e5dcc3SBram Moolenaar def crash#func() 367677e5dcc3SBram Moolenaar try 367777e5dcc3SBram Moolenaar for x in List() 367877e5dcc3SBram Moolenaar endfor 367977e5dcc3SBram Moolenaar catch 368077e5dcc3SBram Moolenaar endtry 368177e5dcc3SBram Moolenaar g:ok = true 368277e5dcc3SBram Moolenaar enddef 368377e5dcc3SBram Moolenaar fu List() 368477e5dcc3SBram Moolenaar invalid 368577e5dcc3SBram Moolenaar endfu 368677e5dcc3SBram Moolenaar try 368748e11c10SBram Moolenaar alsoinvalid 368877e5dcc3SBram Moolenaar catch /wontmatch/ 368977e5dcc3SBram Moolenaar endtry 369077e5dcc3SBram Moolenaar END 369177e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 369277e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 369377e5dcc3SBram Moolenaar 369477e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 369577e5dcc3SBram Moolenaar lines =<< trim END 369677e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 369777e5dcc3SBram Moolenaar call crash#func() 369877e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 36999c4f5520SBram Moolenaar qall! 370077e5dcc3SBram Moolenaar END 370177e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 370277e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 370377e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 370477e5dcc3SBram Moolenaar 370577e5dcc3SBram Moolenaar delete('Xdidit') 370677e5dcc3SBram Moolenaar delete('Xscript') 370777e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 370803290b84SBram Moolenaar 370903290b84SBram Moolenaar lines =<< trim END 371003290b84SBram Moolenaar vim9script 371103290b84SBram Moolenaar var foo#bar = 'asdf' 371203290b84SBram Moolenaar END 371303290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 371477e5dcc3SBram Moolenaarenddef 371577e5dcc3SBram Moolenaar 371681e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 371781e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 371881e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3719cfcd011fSBram Moolenaar var lines =<< trim END 372081e17fbeSBram Moolenaar let s:counter = 1 372181e17fbeSBram Moolenaar def s:Func() 372281e17fbeSBram Moolenaar au! CursorHold 372381e17fbeSBram Moolenaar au CursorHold * s:counter += 1 372481e17fbeSBram Moolenaar enddef 372581e17fbeSBram Moolenaar call s:Func() 372681e17fbeSBram Moolenaar doau CursorHold 372781e17fbeSBram Moolenaar call assert_equal(2, s:counter) 372881e17fbeSBram Moolenaar au! CursorHold 372981e17fbeSBram Moolenaar END 373081e17fbeSBram Moolenaar CheckScriptSuccess(lines) 373181e17fbeSBram Moolenaarenddef 373281e17fbeSBram Moolenaar 3733b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3734b5841b99SBram Moolenaar var save_rtp = &rtp 3735b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3736b5841b99SBram Moolenaar &rtp = dir 3737b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3738b5841b99SBram Moolenaar 3739b5841b99SBram Moolenaar var lines =<< trim END 3740b5841b99SBram Moolenaar vim9script noclear 3741b5841b99SBram Moolenaar def script#autoloaded() 3742b5841b99SBram Moolenaar enddef 3743b5841b99SBram Moolenaar def Broken() 3744b5841b99SBram Moolenaar var x: any = '' 3745b5841b99SBram Moolenaar eval x != 0 3746b5841b99SBram Moolenaar enddef 3747b5841b99SBram Moolenaar Broken() 3748b5841b99SBram Moolenaar END 3749b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3750b5841b99SBram Moolenaar 3751b5841b99SBram Moolenaar lines =<< trim END 3752b5841b99SBram Moolenaar vim9script 3753b5841b99SBram Moolenaar def CallAutoloaded() 3754b5841b99SBram Moolenaar script#autoloaded() 3755b5841b99SBram Moolenaar enddef 3756b5841b99SBram Moolenaar 3757b5841b99SBram Moolenaar function Legacy() 3758b5841b99SBram Moolenaar try 3759b5841b99SBram Moolenaar call s:CallAutoloaded() 3760b5841b99SBram Moolenaar catch 3761b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3762b5841b99SBram Moolenaar endtry 3763b5841b99SBram Moolenaar endfunction 3764b5841b99SBram Moolenaar 3765b5841b99SBram Moolenaar Legacy() 3766b5841b99SBram Moolenaar END 3767b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3768b5841b99SBram Moolenaar 3769b5841b99SBram Moolenaar &rtp = save_rtp 3770b5841b99SBram Moolenaar delete(dir, 'rf') 3771b5841b99SBram Moolenaarenddef 3772b5841b99SBram Moolenaar 37733896a105SBram Moolenaardef Test_cmdline_win() 37743896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 37753896a105SBram Moolenaar # the command line window. 37763896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3777cfcd011fSBram Moolenaar var export_lines =<< trim END 37783896a105SBram Moolenaar vim9script 3779cfcd011fSBram Moolenaar export var That = 'yes' 37803896a105SBram Moolenaar END 37813896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3782cfcd011fSBram Moolenaar var import_lines =<< trim END 37833896a105SBram Moolenaar vim9script 37843896a105SBram Moolenaar import That from './Xexport.vim' 37853896a105SBram Moolenaar END 37863896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3787cfcd011fSBram Moolenaar var save_rtp = &rtp 37883896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 37893896a105SBram Moolenaar syntax on 37903896a105SBram Moolenaar augroup CmdWin 37913896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 37923896a105SBram Moolenaar augroup END 37933896a105SBram Moolenaar # this will open and also close the cmdline window 37943896a105SBram Moolenaar feedkeys('q:', 'xt') 37953896a105SBram Moolenaar assert_equal('yes', g:got_there) 37963896a105SBram Moolenaar 37973896a105SBram Moolenaar augroup CmdWin 37983896a105SBram Moolenaar au! 37993896a105SBram Moolenaar augroup END 38003896a105SBram Moolenaar &rtp = save_rtp 38013896a105SBram Moolenaar delete('rtp', 'rf') 38023896a105SBram Moolenaarenddef 38033896a105SBram Moolenaar 3804e3d4685fSBram Moolenaardef Test_invalid_sid() 3805e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 380625859dd7SBram Moolenaar 38079c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3808d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3809e3d4685fSBram Moolenaar endif 3810e3d4685fSBram Moolenaar delete('Xdidit') 3811e3d4685fSBram Moolenaarenddef 3812e3d4685fSBram Moolenaar 38139ec7026fSBram Moolenaardef Test_restoring_cpo() 38149ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 38159ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 38169ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 38179ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 38189ec7026fSBram Moolenaar endif 38199ec7026fSBram Moolenaar delete('Xsourced') 38209ec7026fSBram Moolenaar delete('Xclose') 3821090728adSBram Moolenaar delete('Xdone') 38220123cc1eSBram Moolenaar 38230123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 38240123cc1eSBram Moolenaar set cpo=aABceFsMny> 38250123cc1eSBram Moolenaar edit XanotherScript 38260123cc1eSBram Moolenaar so % 38270123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38280123cc1eSBram Moolenaar :1del 38290123cc1eSBram Moolenaar w 38300123cc1eSBram Moolenaar so % 38310123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38320123cc1eSBram Moolenaar 38330123cc1eSBram Moolenaar delete('XanotherScript') 38340123cc1eSBram Moolenaar set cpo&vim 38359ec7026fSBram Moolenaarenddef 38369ec7026fSBram Moolenaar 3837ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3838ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 383937294bd6SBram Moolenaar CheckScreendump 3840ffb7dcdbSBram Moolenaar CheckFeature timers 384137294bd6SBram Moolenaar 3842ffb7dcdbSBram Moolenaar let lines =<< trim END 384337294bd6SBram Moolenaar vim9script 384437294bd6SBram Moolenaar def script#func() 384537294bd6SBram Moolenaar enddef 384637294bd6SBram Moolenaar END 3847ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3848ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 384937294bd6SBram Moolenaar 3850ffb7dcdbSBram Moolenaar let lines =<< trim END 385137294bd6SBram Moolenaar vim9script 385237294bd6SBram Moolenaar set cpo+=M 385337294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3854767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 385537294bd6SBram Moolenaar setline(1, 'some text') 385637294bd6SBram Moolenaar END 3857ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3858ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3859ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3860ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 386137294bd6SBram Moolenaar 3862ffb7dcdbSBram Moolenaar " clean up 3863ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3864ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3865ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3866ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3867ffb7dcdbSBram Moolenaarendfunc 386837294bd6SBram Moolenaar 38699ec7026fSBram Moolenaar 3870f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3871cfcd011fSBram Moolenaar var lines =<< trim END 3872cfcd011fSBram Moolenaar var name: any 3873cfcd011fSBram Moolenaar assert_equal(0, name) 3874f0afd9e1SBram Moolenaar END 3875f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3876f0afd9e1SBram Moolenaarenddef 3877f0afd9e1SBram Moolenaar 38787e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 387958dbef33SBram Moolenaar CheckRunVimInTerminal 388058dbef33SBram Moolenaar 38817e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 38827e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 38837e9210eaSBram Moolenaarendfunc 38847e9210eaSBram Moolenaar 38857e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 38869c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3887cfcd011fSBram Moolenaar var lines =<< trim END 38889c4f5520SBram Moolenaar func CheckAndQuit() 38899c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 38909c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 38919c4f5520SBram Moolenaar endfunc 38929c4f5520SBram Moolenaar END 38939c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 38949c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3895e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 38969c4f5520SBram Moolenaar # define Afunc() on the command line 38979c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 38989c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 38992949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 39009c4f5520SBram Moolenaar 39019c4f5520SBram Moolenaar call StopVimInTerminal(buf) 39029c4f5520SBram Moolenaar delete('XcallFunc') 39039c4f5520SBram Moolenaar delete('Xdidcmd') 39049c4f5520SBram Moolenaarenddef 39059c4f5520SBram Moolenaar 3906fcdc5d83SBram Moolenaardef Test_script_var_scope() 3907fcdc5d83SBram Moolenaar var lines =<< trim END 3908fcdc5d83SBram Moolenaar vim9script 3909fcdc5d83SBram Moolenaar if true 3910fcdc5d83SBram Moolenaar if true 3911fcdc5d83SBram Moolenaar var one = 'one' 3912fcdc5d83SBram Moolenaar echo one 3913fcdc5d83SBram Moolenaar endif 3914fcdc5d83SBram Moolenaar echo one 3915fcdc5d83SBram Moolenaar endif 3916fcdc5d83SBram Moolenaar END 3917fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3918fcdc5d83SBram Moolenaar 3919fcdc5d83SBram Moolenaar lines =<< trim END 3920fcdc5d83SBram Moolenaar vim9script 3921fcdc5d83SBram Moolenaar if true 3922fcdc5d83SBram Moolenaar if false 3923fcdc5d83SBram Moolenaar var one = 'one' 3924fcdc5d83SBram Moolenaar echo one 3925fcdc5d83SBram Moolenaar else 3926fcdc5d83SBram Moolenaar var one = 'one' 3927fcdc5d83SBram Moolenaar echo one 3928fcdc5d83SBram Moolenaar endif 3929fcdc5d83SBram Moolenaar echo one 3930fcdc5d83SBram Moolenaar endif 3931fcdc5d83SBram Moolenaar END 3932fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3933fcdc5d83SBram Moolenaar 3934fcdc5d83SBram Moolenaar lines =<< trim END 3935fcdc5d83SBram Moolenaar vim9script 3936fcdc5d83SBram Moolenaar while true 3937fcdc5d83SBram Moolenaar var one = 'one' 3938fcdc5d83SBram Moolenaar echo one 3939fcdc5d83SBram Moolenaar break 3940fcdc5d83SBram Moolenaar endwhile 3941fcdc5d83SBram Moolenaar echo one 3942fcdc5d83SBram Moolenaar END 3943fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3944fcdc5d83SBram Moolenaar 3945fcdc5d83SBram Moolenaar lines =<< trim END 3946fcdc5d83SBram Moolenaar vim9script 3947fcdc5d83SBram Moolenaar for i in range(1) 3948fcdc5d83SBram Moolenaar var one = 'one' 3949fcdc5d83SBram Moolenaar echo one 3950fcdc5d83SBram Moolenaar endfor 3951fcdc5d83SBram Moolenaar echo one 3952fcdc5d83SBram Moolenaar END 3953fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 39549becdf2bSBram Moolenaar 39559becdf2bSBram Moolenaar lines =<< trim END 39569becdf2bSBram Moolenaar vim9script 39579becdf2bSBram Moolenaar { 39589becdf2bSBram Moolenaar var one = 'one' 39599becdf2bSBram Moolenaar assert_equal('one', one) 39609becdf2bSBram Moolenaar } 39619becdf2bSBram Moolenaar assert_false(exists('one')) 39629becdf2bSBram Moolenaar assert_false(exists('s:one')) 39639becdf2bSBram Moolenaar END 39649becdf2bSBram Moolenaar CheckScriptSuccess(lines) 39659becdf2bSBram Moolenaar 39669becdf2bSBram Moolenaar lines =<< trim END 39679becdf2bSBram Moolenaar vim9script 39689becdf2bSBram Moolenaar { 39699becdf2bSBram Moolenaar var one = 'one' 39709becdf2bSBram Moolenaar echo one 39719becdf2bSBram Moolenaar } 39729becdf2bSBram Moolenaar echo one 39739becdf2bSBram Moolenaar END 39749becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3975fcdc5d83SBram Moolenaarenddef 3976fcdc5d83SBram Moolenaar 3977352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3978352134bbSBram Moolenaar var lines =<< trim END 3979352134bbSBram Moolenaar vim9script 39802a38908bSBram Moolenaar def Callback(...l: list<any>) 3981352134bbSBram Moolenaar try 3982352134bbSBram Moolenaar var x: string 3983352134bbSBram Moolenaar var y: string 3984352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3985352134bbSBram Moolenaar [x, y] = [''] 3986352134bbSBram Moolenaar catch 3987352134bbSBram Moolenaar g:caught = 'yes' 3988352134bbSBram Moolenaar endtry 3989352134bbSBram Moolenaar enddef 3990e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3991352134bbSBram Moolenaar feedkeys("\r", 'xt') 3992352134bbSBram Moolenaar END 3993352134bbSBram Moolenaar CheckScriptSuccess(lines) 3994352134bbSBram Moolenaar 3995352134bbSBram Moolenaar unlet g:caught 3996352134bbSBram Moolenaarenddef 3997352134bbSBram Moolenaar 3998631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3999631e8f93SBram Moolenaar if !has('unix') || !has('job') 4000631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4001631e8f93SBram Moolenaar endif 4002631e8f93SBram Moolenaar var lines =<< trim END 4003631e8f93SBram Moolenaar vim9script 4004631e8f93SBram Moolenaar var source: list<number> 40052a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4006631e8f93SBram Moolenaar eval [][0] 4007631e8f93SBram Moolenaar enddef 40082a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4009631e8f93SBram Moolenaar sleep 1m 4010631e8f93SBram Moolenaar source += l 4011631e8f93SBram Moolenaar enddef 4012e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 40136f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 40146f17a3f0SBram Moolenaar sleep 10m 40156f17a3f0SBram Moolenaar endwhile 4016206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4017fe95b94fSBram Moolenaar sleep 200m 4018631e8f93SBram Moolenaar END 4019631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4020631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4021631e8f93SBram Moolenaar delete('Xdef') 4022631e8f93SBram Moolenaarenddef 4023631e8f93SBram Moolenaar 40244324d87aSBram Moolenaardef InvokeNormal() 40254324d87aSBram Moolenaar exe "norm! :m+1\r" 40264324d87aSBram Moolenaarenddef 40274324d87aSBram Moolenaar 40284324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 40294324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 40304324d87aSBram Moolenaar new 40314324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 40324324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 40334324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 40344324d87aSBram Moolenaar xunmap <F3> 4035b5b9480eSBram Moolenaarenddef 4036b5b9480eSBram Moolenaar 4037b5b9480eSBram Moolenaardef Test_white_space_after_command() 4038b5b9480eSBram Moolenaar var lines =<< trim END 4039b5b9480eSBram Moolenaar exit_cb: Func}) 4040b5b9480eSBram Moolenaar END 4041b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4042f8103f27SBram Moolenaar 4043f8103f27SBram Moolenaar lines =<< trim END 4044f8103f27SBram Moolenaar e# 4045f8103f27SBram Moolenaar END 4046f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 40474324d87aSBram Moolenaarenddef 40484324d87aSBram Moolenaar 40494aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 40504aab88d9SBram Moolenaar var lines =<< trim END 40514aab88d9SBram Moolenaar vim9script 40524aab88d9SBram Moolenaar if exists('g:guard') 40534aab88d9SBram Moolenaar finish 40544aab88d9SBram Moolenaar endif 40554aab88d9SBram Moolenaar g:guard = 1 40564aab88d9SBram Moolenaar var name = 'thename' 40574aab88d9SBram Moolenaar def g:GetName(): string 40584aab88d9SBram Moolenaar return name 40594aab88d9SBram Moolenaar enddef 40604aab88d9SBram Moolenaar def g:SetName(arg: string) 40614aab88d9SBram Moolenaar name = arg 40624aab88d9SBram Moolenaar enddef 40634aab88d9SBram Moolenaar END 40644aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 40654aab88d9SBram Moolenaar so XscriptTwice.vim 40664aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 40674aab88d9SBram Moolenaar g:SetName('newname') 40684aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 40694aab88d9SBram Moolenaar so XscriptTwice.vim 40704aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 40714aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 40724aab88d9SBram Moolenaar 40734aab88d9SBram Moolenaar delfunc g:GetName 40744aab88d9SBram Moolenaar delfunc g:SetName 40754aab88d9SBram Moolenaar delete('XscriptTwice.vim') 40764aab88d9SBram Moolenaar unlet g:guard 40774aab88d9SBram Moolenaarenddef 40784aab88d9SBram Moolenaar 40794aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 40804aab88d9SBram Moolenaar var exportlines =<< trim END 40814aab88d9SBram Moolenaar vim9script 40824aab88d9SBram Moolenaar if exists('g:guard') 40834aab88d9SBram Moolenaar finish 40844aab88d9SBram Moolenaar endif 40854aab88d9SBram Moolenaar g:guard = 1 40864aab88d9SBram Moolenaar export var name = 'someName' 40874aab88d9SBram Moolenaar END 40884aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 40894aab88d9SBram Moolenaar 40904aab88d9SBram Moolenaar var lines =<< trim END 40914aab88d9SBram Moolenaar vim9script 40924aab88d9SBram Moolenaar import name from './XexportScript.vim' 40934aab88d9SBram Moolenaar def g:GetName(): string 40944aab88d9SBram Moolenaar return name 40954aab88d9SBram Moolenaar enddef 40964aab88d9SBram Moolenaar END 40974aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 40984aab88d9SBram Moolenaar so XscriptImport.vim 40994aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 41004aab88d9SBram Moolenaar 41014aab88d9SBram Moolenaar so XexportScript.vim 41024aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41034aab88d9SBram Moolenaar 41044aab88d9SBram Moolenaar delfunc g:GetName 41054aab88d9SBram Moolenaar delete('XexportScript.vim') 41064aab88d9SBram Moolenaar delete('XscriptImport.vim') 41074aab88d9SBram Moolenaar unlet g:guard 41084aab88d9SBram Moolenaarenddef 41094aab88d9SBram Moolenaar 411010b9421fSBram Moolenaardef Test_unsupported_commands() 411110b9421fSBram Moolenaar var lines =<< trim END 411210b9421fSBram Moolenaar ka 411310b9421fSBram Moolenaar END 41147d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41157d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 411610b9421fSBram Moolenaar 411710b9421fSBram Moolenaar lines =<< trim END 4118ada1d870SBram Moolenaar :1ka 4119ada1d870SBram Moolenaar END 41207d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41217d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4122ada1d870SBram Moolenaar 4123ada1d870SBram Moolenaar lines =<< trim END 412410b9421fSBram Moolenaar t 412510b9421fSBram Moolenaar END 412610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 412710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 412810b9421fSBram Moolenaar 412910b9421fSBram Moolenaar lines =<< trim END 413010b9421fSBram Moolenaar x 413110b9421fSBram Moolenaar END 413210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 413310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 413410b9421fSBram Moolenaar 413510b9421fSBram Moolenaar lines =<< trim END 413610b9421fSBram Moolenaar xit 413710b9421fSBram Moolenaar END 413810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 413910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 414010b9421fSBram Moolenaarenddef 414110b9421fSBram Moolenaar 4142c70fe460SBram Moolenaardef Test_mapping_line_number() 4143c70fe460SBram Moolenaar var lines =<< trim END 4144c70fe460SBram Moolenaar vim9script 4145c70fe460SBram Moolenaar def g:FuncA() 4146c70fe460SBram Moolenaar # Some comment 4147c70fe460SBram Moolenaar FuncB(0) 4148c70fe460SBram Moolenaar enddef 4149c70fe460SBram Moolenaar # Some comment 4150c70fe460SBram Moolenaar def FuncB( 4151c70fe460SBram Moolenaar # Some comment 4152c70fe460SBram Moolenaar n: number 4153c70fe460SBram Moolenaar ) 4154c70fe460SBram Moolenaar exe 'nno ' 4155c70fe460SBram Moolenaar # Some comment 4156c70fe460SBram Moolenaar .. '<F3> a' 4157c70fe460SBram Moolenaar .. 'b' 4158c70fe460SBram Moolenaar .. 'c' 4159c70fe460SBram Moolenaar enddef 4160c70fe460SBram Moolenaar END 4161c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4162c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4163c70fe460SBram Moolenaar assert_match('No mapping found', res) 4164c70fe460SBram Moolenaar 4165c70fe460SBram Moolenaar g:FuncA() 4166c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4167c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4168c70fe460SBram Moolenaar 4169c70fe460SBram Moolenaar nunmap <F3> 4170c70fe460SBram Moolenaar delfunc g:FuncA 4171c70fe460SBram Moolenaarenddef 4172c70fe460SBram Moolenaar 4173deb108baSBram Moolenaardef Test_option_set() 4174deb108baSBram Moolenaar # legacy script allows for white space 4175deb108baSBram Moolenaar var lines =<< trim END 4176deb108baSBram Moolenaar set foldlevel =11 4177deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4178deb108baSBram Moolenaar END 4179deb108baSBram Moolenaar CheckScriptSuccess(lines) 4180deb108baSBram Moolenaar 4181deb108baSBram Moolenaar set foldlevel 4182deb108baSBram Moolenaar set foldlevel=12 4183deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4184deb108baSBram Moolenaar set foldlevel+=2 4185deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4186deb108baSBram Moolenaar set foldlevel-=3 4187deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4188deb108baSBram Moolenaar 4189deb108baSBram Moolenaar lines =<< trim END 4190deb108baSBram Moolenaar set foldlevel =1 4191deb108baSBram Moolenaar END 4192deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4193deb108baSBram Moolenaar 4194deb108baSBram Moolenaar lines =<< trim END 4195deb108baSBram Moolenaar set foldlevel +=1 4196deb108baSBram Moolenaar END 4197deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4198deb108baSBram Moolenaar 4199deb108baSBram Moolenaar lines =<< trim END 4200deb108baSBram Moolenaar set foldlevel ^=1 4201deb108baSBram Moolenaar END 4202deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4203deb108baSBram Moolenaar 4204deb108baSBram Moolenaar lines =<< trim END 4205deb108baSBram Moolenaar set foldlevel -=1 4206deb108baSBram Moolenaar END 4207deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4208deb108baSBram Moolenaar 4209deb108baSBram Moolenaar set foldlevel& 4210deb108baSBram Moolenaarenddef 4211deb108baSBram Moolenaar 4212208f0b48SBram Moolenaardef Test_option_modifier() 42131594f313SBram Moolenaar # legacy script allows for white space 4214208f0b48SBram Moolenaar var lines =<< trim END 4215208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4216208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4217208f0b48SBram Moolenaar END 4218208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4219208f0b48SBram Moolenaar 42201594f313SBram Moolenaar set hlsearch 42211594f313SBram Moolenaar set hlsearch! 42221594f313SBram Moolenaar assert_equal(false, &hlsearch) 42231594f313SBram Moolenaar 42241594f313SBram Moolenaar set hlsearch 4225208f0b48SBram Moolenaar set hlsearch& 42261594f313SBram Moolenaar assert_equal(false, &hlsearch) 4227208f0b48SBram Moolenaar 4228208f0b48SBram Moolenaar lines =<< trim END 42291594f313SBram Moolenaar set hlsearch & 4230208f0b48SBram Moolenaar END 42311594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 42321594f313SBram Moolenaar 42331594f313SBram Moolenaar lines =<< trim END 42341594f313SBram Moolenaar set hlsearch ! 42351594f313SBram Moolenaar END 42361594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 42371594f313SBram Moolenaar 42381594f313SBram Moolenaar set hlsearch& 4239208f0b48SBram Moolenaarenddef 4240208f0b48SBram Moolenaar 4241c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4242c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4243c03fe66aSBram Moolenaar var lines =<< trim END 4244c03fe66aSBram Moolenaar echoerr 'some' 4245c03fe66aSBram Moolenaar .. ' error' 4246c03fe66aSBram Moolenaar .. ' continued' 4247c03fe66aSBram Moolenaar END 4248c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4249c03fe66aSBram Moolenaarenddef 4250c03fe66aSBram Moolenaar 4251648594eaSBram Moolenaardef ProfiledWithLambda() 4252d9162550SBram Moolenaar var n = 3 4253d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4254d9162550SBram Moolenaarenddef 4255d9162550SBram Moolenaar 4256648594eaSBram Moolenaardef ProfiledNested() 4257648594eaSBram Moolenaar var x = 0 4258648594eaSBram Moolenaar def Nested(): any 4259648594eaSBram Moolenaar return x 4260648594eaSBram Moolenaar enddef 4261648594eaSBram Moolenaar Nested() 4262648594eaSBram Moolenaarenddef 4263648594eaSBram Moolenaar 4264ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4265ffcfddc7SBram Moolenaar var x = 0 4266ffcfddc7SBram Moolenaar def Nested(): any 4267ffcfddc7SBram Moolenaar return x 4268ffcfddc7SBram Moolenaar enddef 4269ffcfddc7SBram Moolenaar Nested() 4270ffcfddc7SBram Moolenaarenddef 4271ffcfddc7SBram Moolenaar 4272d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4273d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4274d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 42754ece152aSBram Moolenaar CheckFeature profile 42764ece152aSBram Moolenaar 4277d9162550SBram Moolenaar profile start Xprofile.log 4278648594eaSBram Moolenaar profile func ProfiledWithLambda 4279648594eaSBram Moolenaar ProfiledWithLambda() 4280ffcfddc7SBram Moolenaar 4281648594eaSBram Moolenaar profile func ProfiledNested 4282648594eaSBram Moolenaar ProfiledNested() 4283ffcfddc7SBram Moolenaar 4284ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4285ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4286ffcfddc7SBram Moolenaar profile func * 4287ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4288ffcfddc7SBram Moolenaar 4289ffcfddc7SBram Moolenaar profdel func * 4290ffcfddc7SBram Moolenaar profile pause 4291d9162550SBram Moolenaarenddef 4292d9162550SBram Moolenaar 4293585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4294585fea7bSBram Moolenaardef Test_substitute_cmd() 4295585fea7bSBram Moolenaar new 4296585fea7bSBram Moolenaar setline(1, 'something') 4297585fea7bSBram Moolenaar :substitute(some(other( 4298585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4299585fea7bSBram Moolenaar bwipe! 4300585fea7bSBram Moolenaar 4301f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4302cfcd011fSBram Moolenaar var lines =<< trim END 4303585fea7bSBram Moolenaar vim9script 4304585fea7bSBram Moolenaar new 4305585fea7bSBram Moolenaar setline(1, 'something') 4306585fea7bSBram Moolenaar :substitute(some(other( 4307585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4308585fea7bSBram Moolenaar bwipe! 4309585fea7bSBram Moolenaar END 4310585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4311585fea7bSBram Moolenaar source Xvim9lines 4312585fea7bSBram Moolenaar 4313585fea7bSBram Moolenaar delete('Xvim9lines') 4314585fea7bSBram Moolenaarenddef 4315585fea7bSBram Moolenaar 43168a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4317