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 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25c2af0affSBram Moolenaar bwipe! 26025cb1caSBram Moolenaar 27025cb1caSBram Moolenaar # won't generate anything 28025cb1caSBram Moolenaar if false 29025cb1caSBram Moolenaar :123 30025cb1caSBram Moolenaar endif 315d72ce69SBram Moolenaarenddef 325d72ce69SBram Moolenaar 33a6e67e4fSBram Moolenaarlet g:alist = [7] 34a6e67e4fSBram Moolenaarlet g:astring = 'text' 35f0b9f43cSBram Moolenaarlet g:anumber = 123 366e587dcbSBram Moolenaar 374c17ad94SBram Moolenaardef Test_delfunction() 38f5be8cdbSBram Moolenaar # Check function is defined in script namespace 394c17ad94SBram Moolenaar CheckScriptSuccess([ 404c17ad94SBram Moolenaar 'vim9script', 414c17ad94SBram Moolenaar 'func CheckMe()', 424c17ad94SBram Moolenaar ' return 123', 434c17ad94SBram Moolenaar 'endfunc', 444c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 454c17ad94SBram Moolenaar ]) 464c17ad94SBram Moolenaar 47f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 484c17ad94SBram Moolenaar CheckScriptFailure([ 494c17ad94SBram Moolenaar 'vim9script', 504c17ad94SBram Moolenaar 'func DeleteMe1()', 514c17ad94SBram Moolenaar 'endfunc', 524c17ad94SBram Moolenaar 'delfunction DeleteMe1', 534c17ad94SBram Moolenaar ], 'E1084:') 544c17ad94SBram Moolenaar CheckScriptFailure([ 554c17ad94SBram Moolenaar 'vim9script', 564c17ad94SBram Moolenaar 'func DeleteMe2()', 574c17ad94SBram Moolenaar 'endfunc', 584c17ad94SBram Moolenaar 'def DoThat()', 594c17ad94SBram Moolenaar ' delfunction DeleteMe2', 604c17ad94SBram Moolenaar 'enddef', 614c17ad94SBram Moolenaar 'DoThat()', 624c17ad94SBram Moolenaar ], 'E1084:') 634c17ad94SBram Moolenaar CheckScriptFailure([ 644c17ad94SBram Moolenaar 'vim9script', 654c17ad94SBram Moolenaar 'def DeleteMe3()', 664c17ad94SBram Moolenaar 'enddef', 674c17ad94SBram Moolenaar 'delfunction DeleteMe3', 684c17ad94SBram Moolenaar ], 'E1084:') 694c17ad94SBram Moolenaar CheckScriptFailure([ 704c17ad94SBram Moolenaar 'vim9script', 714c17ad94SBram Moolenaar 'def DeleteMe4()', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'def DoThat()', 744c17ad94SBram Moolenaar ' delfunction DeleteMe4', 754c17ad94SBram Moolenaar 'enddef', 764c17ad94SBram Moolenaar 'DoThat()', 774c17ad94SBram Moolenaar ], 'E1084:') 78925e9fd6SBram Moolenaar 79925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 80cfcd011fSBram Moolenaar var lines =<< trim END 81925e9fd6SBram Moolenaar vim9script 82925e9fd6SBram Moolenaar def g:Global(): string 83925e9fd6SBram Moolenaar return "yes" 84925e9fd6SBram Moolenaar enddef 85925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 86925e9fd6SBram Moolenaar def! g:Global(): string 87925e9fd6SBram Moolenaar return "no" 88925e9fd6SBram Moolenaar enddef 89925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 90925e9fd6SBram Moolenaar delfunc g:Global 91925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 92925e9fd6SBram Moolenaar END 93925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 94925e9fd6SBram Moolenaar 95925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 96925e9fd6SBram Moolenaar lines =<< trim END 97925e9fd6SBram Moolenaar vim9script 98925e9fd6SBram Moolenaar func g:Global() 99925e9fd6SBram Moolenaar return "yes" 100925e9fd6SBram Moolenaar endfunc 101925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 102925e9fd6SBram Moolenaar def! g:Global(): string 103925e9fd6SBram Moolenaar return "no" 104925e9fd6SBram Moolenaar enddef 105925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 106925e9fd6SBram Moolenaar delfunc g:Global 107925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 108925e9fd6SBram Moolenaar END 109925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 110925e9fd6SBram Moolenaar 111925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 112925e9fd6SBram Moolenaar lines =<< trim END 113925e9fd6SBram Moolenaar vim9script 114925e9fd6SBram Moolenaar def g:Global(): string 115925e9fd6SBram Moolenaar return "yes" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 118925e9fd6SBram Moolenaar func! g:Global() 119925e9fd6SBram Moolenaar return "no" 120925e9fd6SBram Moolenaar endfunc 121925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 122925e9fd6SBram Moolenaar delfunc g:Global 123925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 124925e9fd6SBram Moolenaar END 125925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1264c17ad94SBram Moolenaarenddef 1274c17ad94SBram Moolenaar 12808052228SBram Moolenaardef Test_wrong_type() 129cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 130cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 131cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 132cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 133599c89c8SBram Moolenaar 134cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 135cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 13642a480bfSBram Moolenaar 137cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 138cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 139cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 145cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 148a0a9f43aSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 15108052228SBram Moolenaarenddef 1528a7d6542SBram Moolenaar 15310c65860SBram Moolenaardef Test_script_wrong_type() 15410c65860SBram Moolenaar var lines =<< trim END 15510c65860SBram Moolenaar vim9script 15610c65860SBram Moolenaar var s:dict: dict<string> 15710c65860SBram Moolenaar s:dict['a'] = ['x'] 15810c65860SBram Moolenaar END 15910c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 16010c65860SBram Moolenaarenddef 16110c65860SBram Moolenaar 16208052228SBram Moolenaardef Test_const() 163cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 164cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 165cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 16630fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 16730fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 168dbeecb2bSBram Moolenaar 169cfcd011fSBram Moolenaar var lines =<< trim END 17030fd8204SBram Moolenaar final list = [1, 2, 3] 171dbeecb2bSBram Moolenaar list[0] = 4 1720b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 17330fd8204SBram Moolenaar const other = [5, 6, 7] 1740b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 17571abe482SBram Moolenaar 176cfcd011fSBram Moolenaar var varlist = [7, 8] 17730fd8204SBram Moolenaar const constlist = [1, varlist, 3] 17871abe482SBram Moolenaar varlist[0] = 77 17971abe482SBram Moolenaar # TODO: does not work yet 18071abe482SBram Moolenaar # constlist[1][1] = 88 181cfcd011fSBram Moolenaar var cl = constlist[1] 18271abe482SBram Moolenaar cl[1] = 88 18371abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 18471abe482SBram Moolenaar 185e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 186e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 18771abe482SBram Moolenaar vardict['five'] = 55 18871abe482SBram Moolenaar # TODO: does not work yet 18971abe482SBram Moolenaar # constdict['two']['six'] = 66 190cfcd011fSBram Moolenaar var cd = constdict['two'] 19171abe482SBram Moolenaar cd['six'] = 66 192e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 193dbeecb2bSBram Moolenaar END 194dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 19508052228SBram Moolenaarenddef 1968a7d6542SBram Moolenaar 1970b4c66c6SBram Moolenaardef Test_const_bang() 198cfcd011fSBram Moolenaar var lines =<< trim END 19930fd8204SBram Moolenaar const var = 234 2000b4c66c6SBram Moolenaar var = 99 2010b4c66c6SBram Moolenaar END 2020b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2030b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2040b4c66c6SBram Moolenaar 2050b4c66c6SBram Moolenaar lines =<< trim END 20630fd8204SBram Moolenaar const ll = [2, 3, 4] 2070b4c66c6SBram Moolenaar ll[0] = 99 2080b4c66c6SBram Moolenaar END 2090b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2100b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2110b4c66c6SBram Moolenaar 2120b4c66c6SBram Moolenaar lines =<< trim END 21330fd8204SBram Moolenaar const ll = [2, 3, 4] 2140b4c66c6SBram Moolenaar ll[3] = 99 2150b4c66c6SBram Moolenaar END 2160b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2170b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2180b4c66c6SBram Moolenaar 2190b4c66c6SBram Moolenaar lines =<< trim END 220e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2210b4c66c6SBram Moolenaar dd["one"] = 99 2220b4c66c6SBram Moolenaar END 2230b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2240b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2250b4c66c6SBram Moolenaar 2260b4c66c6SBram Moolenaar lines =<< trim END 227e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2280b4c66c6SBram Moolenaar dd["three"] = 99 2290b4c66c6SBram Moolenaar END 2300b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2310b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2320b4c66c6SBram Moolenaarenddef 2330b4c66c6SBram Moolenaar 234df069eecSBram Moolenaardef Test_range_no_colon() 235d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 236d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 237d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 238d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 239df069eecSBram Moolenaarenddef 240df069eecSBram Moolenaar 241df069eecSBram Moolenaar 2428a7d6542SBram Moolenaardef Test_block() 243cfcd011fSBram Moolenaar var outer = 1 2448a7d6542SBram Moolenaar { 245cfcd011fSBram Moolenaar var inner = 2 2468a7d6542SBram Moolenaar assert_equal(1, outer) 2478a7d6542SBram Moolenaar assert_equal(2, inner) 2488a7d6542SBram Moolenaar } 2498a7d6542SBram Moolenaar assert_equal(1, outer) 2508a7d6542SBram Moolenaarenddef 2518a7d6542SBram Moolenaar 25208052228SBram Moolenaardef Test_block_failure() 253cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 25408052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 25508052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 25608052228SBram Moolenaarenddef 2578a7d6542SBram Moolenaar 258fbbcd003SBram Moolenaardef Test_block_local_vars() 259fbbcd003SBram Moolenaar var lines =<< trim END 260fbbcd003SBram Moolenaar vim9script 261ed234f24SBram Moolenaar v:testing = 1 262fbbcd003SBram Moolenaar if true 263ed234f24SBram Moolenaar var text = ['hello'] 264ed234f24SBram Moolenaar def SayHello(): list<string> 265fbbcd003SBram Moolenaar return text 266fbbcd003SBram Moolenaar enddef 267fbbcd003SBram Moolenaar def SetText(v: string) 268ed234f24SBram Moolenaar text = [v] 269fbbcd003SBram Moolenaar enddef 270fbbcd003SBram Moolenaar endif 271fbbcd003SBram Moolenaar 272fbbcd003SBram Moolenaar if true 273ed234f24SBram Moolenaar var text = ['again'] 274ed234f24SBram Moolenaar def SayAgain(): list<string> 275fbbcd003SBram Moolenaar return text 276fbbcd003SBram Moolenaar enddef 277fbbcd003SBram Moolenaar endif 278ed234f24SBram Moolenaar 279ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 280ed234f24SBram Moolenaar test_garbagecollect_now() 281ed234f24SBram Moolenaar 282fbbcd003SBram Moolenaar defcompile 283fbbcd003SBram Moolenaar 284ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 285ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 286fbbcd003SBram Moolenaar 287fbbcd003SBram Moolenaar SetText('foobar') 288ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 289ed234f24SBram Moolenaar 290ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 291ed234f24SBram Moolenaar qall! 292fbbcd003SBram Moolenaar END 293ed234f24SBram Moolenaar 294ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 295ed234f24SBram Moolenaar # context gets garbage collected. 296ed234f24SBram Moolenaar writefile(lines, 'Xscript') 297ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 298ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 299ed234f24SBram Moolenaar 300ed234f24SBram Moolenaar delete('Xscript') 301ed234f24SBram Moolenaar delete('Xdidit') 302fbbcd003SBram Moolenaarenddef 303fbbcd003SBram Moolenaar 30439ca4127SBram Moolenaardef Test_block_local_vars_with_func() 30539ca4127SBram Moolenaar var lines =<< trim END 30639ca4127SBram Moolenaar vim9script 30739ca4127SBram Moolenaar if true 30839ca4127SBram Moolenaar var foo = 'foo' 30939ca4127SBram Moolenaar if true 31039ca4127SBram Moolenaar var bar = 'bar' 31139ca4127SBram Moolenaar def Func(): list<string> 31239ca4127SBram Moolenaar return [foo, bar] 31339ca4127SBram Moolenaar enddef 31439ca4127SBram Moolenaar endif 31539ca4127SBram Moolenaar endif 31639ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 31739ca4127SBram Moolenaar # "foo" and "bar" 31839ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 31939ca4127SBram Moolenaar END 32039ca4127SBram Moolenaar CheckScriptSuccess(lines) 32139ca4127SBram Moolenaarenddef 32239ca4127SBram Moolenaar 323d032f34aSBram Moolenaarfunc g:NoSuchFunc() 324d032f34aSBram Moolenaar echo 'none' 325d032f34aSBram Moolenaarendfunc 326d032f34aSBram Moolenaar 3278a7d6542SBram Moolenaardef Test_try_catch() 328cfcd011fSBram Moolenaar var l = [] 3297a092245SBram Moolenaar try # comment 3308a7d6542SBram Moolenaar add(l, '1') 3318a7d6542SBram Moolenaar throw 'wrong' 3328a7d6542SBram Moolenaar add(l, '2') 3337a092245SBram Moolenaar catch # comment 3348a7d6542SBram Moolenaar add(l, v:exception) 3357a092245SBram Moolenaar finally # comment 3368a7d6542SBram Moolenaar add(l, '3') 3377a092245SBram Moolenaar endtry # comment 3388a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 33968d130c6SBram Moolenaar 340e859312eSBram Moolenaar l = [] 341e859312eSBram Moolenaar try 342e859312eSBram Moolenaar try 343e859312eSBram Moolenaar add(l, '1') 344e859312eSBram Moolenaar throw 'wrong' 345e859312eSBram Moolenaar add(l, '2') 346e859312eSBram Moolenaar catch /right/ 347e859312eSBram Moolenaar add(l, v:exception) 348e859312eSBram Moolenaar endtry 349e859312eSBram Moolenaar catch /wrong/ 350e859312eSBram Moolenaar add(l, 'caught') 351373863edSBram Moolenaar fina 352e859312eSBram Moolenaar add(l, 'finally') 353e859312eSBram Moolenaar endtry 354e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 355e859312eSBram Moolenaar 356cfcd011fSBram Moolenaar var n: number 35768d130c6SBram Moolenaar try 35868d130c6SBram Moolenaar n = l[3] 35968d130c6SBram Moolenaar catch /E684:/ 36068d130c6SBram Moolenaar n = 99 36168d130c6SBram Moolenaar endtry 36268d130c6SBram Moolenaar assert_equal(99, n) 36368d130c6SBram Moolenaar 36468d130c6SBram Moolenaar try 365cc673e74SBram Moolenaar # string slice returns a string, not a number 36668d130c6SBram Moolenaar n = g:astring[3] 3675e654230SBram Moolenaar catch /E1012:/ 36868d130c6SBram Moolenaar n = 77 36968d130c6SBram Moolenaar endtry 37068d130c6SBram Moolenaar assert_equal(77, n) 37168d130c6SBram Moolenaar 37268d130c6SBram Moolenaar try 37368d130c6SBram Moolenaar n = l[g:astring] 3745e654230SBram Moolenaar catch /E1012:/ 37556acb094SBram Moolenaar n = 88 37668d130c6SBram Moolenaar endtry 37756acb094SBram Moolenaar assert_equal(88, n) 37868d130c6SBram Moolenaar 37968d130c6SBram Moolenaar try 38068d130c6SBram Moolenaar n = s:does_not_exist 38168d130c6SBram Moolenaar catch /E121:/ 382f0b9f43cSBram Moolenaar n = 111 383f0b9f43cSBram Moolenaar endtry 384f0b9f43cSBram Moolenaar assert_equal(111, n) 385f0b9f43cSBram Moolenaar 386f0b9f43cSBram Moolenaar try 387f0b9f43cSBram Moolenaar n = g:does_not_exist 388f0b9f43cSBram Moolenaar catch /E121:/ 38968d130c6SBram Moolenaar n = 121 39068d130c6SBram Moolenaar endtry 39168d130c6SBram Moolenaar assert_equal(121, n) 39268d130c6SBram Moolenaar 393e0de171eSBram Moolenaar var d = {one: 1} 39468d130c6SBram Moolenaar try 39568d130c6SBram Moolenaar n = d[g:astring] 39668d130c6SBram Moolenaar catch /E716:/ 39768d130c6SBram Moolenaar n = 222 39868d130c6SBram Moolenaar endtry 39968d130c6SBram Moolenaar assert_equal(222, n) 400f0b9f43cSBram Moolenaar 401f0b9f43cSBram Moolenaar try 402f0b9f43cSBram Moolenaar n = -g:astring 403f0b9f43cSBram Moolenaar catch /E39:/ 404f0b9f43cSBram Moolenaar n = 233 405f0b9f43cSBram Moolenaar endtry 406f0b9f43cSBram Moolenaar assert_equal(233, n) 407f0b9f43cSBram Moolenaar 408f0b9f43cSBram Moolenaar try 409f0b9f43cSBram Moolenaar n = +g:astring 410f0b9f43cSBram Moolenaar catch /E1030:/ 411f0b9f43cSBram Moolenaar n = 244 412f0b9f43cSBram Moolenaar endtry 413f0b9f43cSBram Moolenaar assert_equal(244, n) 414f0b9f43cSBram Moolenaar 415f0b9f43cSBram Moolenaar try 416f0b9f43cSBram Moolenaar n = +g:alist 417f0b9f43cSBram Moolenaar catch /E745:/ 418f0b9f43cSBram Moolenaar n = 255 419f0b9f43cSBram Moolenaar endtry 420f0b9f43cSBram Moolenaar assert_equal(255, n) 421f0b9f43cSBram Moolenaar 422cfcd011fSBram Moolenaar var nd: dict<any> 423f0b9f43cSBram Moolenaar try 4242bede173SBram Moolenaar nd = {[g:anumber]: 1} 4255e654230SBram Moolenaar catch /E1012:/ 426f0b9f43cSBram Moolenaar n = 266 427f0b9f43cSBram Moolenaar endtry 428f0b9f43cSBram Moolenaar assert_equal(266, n) 429f0b9f43cSBram Moolenaar 430f0b9f43cSBram Moolenaar try 431f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 432f0b9f43cSBram Moolenaar catch /E1093:/ 433f0b9f43cSBram Moolenaar n = 277 434f0b9f43cSBram Moolenaar endtry 435f0b9f43cSBram Moolenaar assert_equal(277, n) 436f0b9f43cSBram Moolenaar 437e859312eSBram Moolenaar try 438e859312eSBram Moolenaar &ts = g:astring 4395e654230SBram Moolenaar catch /E1012:/ 440e859312eSBram Moolenaar n = 288 441e859312eSBram Moolenaar endtry 442e859312eSBram Moolenaar assert_equal(288, n) 443e859312eSBram Moolenaar 444e859312eSBram Moolenaar try 445e859312eSBram Moolenaar &backspace = 'asdf' 446e859312eSBram Moolenaar catch /E474:/ 447e859312eSBram Moolenaar n = 299 448e859312eSBram Moolenaar endtry 449e859312eSBram Moolenaar assert_equal(299, n) 450e859312eSBram Moolenaar 451e859312eSBram Moolenaar l = [1] 452e859312eSBram Moolenaar try 453e859312eSBram Moolenaar l[3] = 3 454e859312eSBram Moolenaar catch /E684:/ 455e859312eSBram Moolenaar n = 300 456e859312eSBram Moolenaar endtry 457e859312eSBram Moolenaar assert_equal(300, n) 458e859312eSBram Moolenaar 459e859312eSBram Moolenaar try 460e859312eSBram Moolenaar unlet g:does_not_exist 461e859312eSBram Moolenaar catch /E108:/ 462e859312eSBram Moolenaar n = 322 463e859312eSBram Moolenaar endtry 464e859312eSBram Moolenaar assert_equal(322, n) 465e859312eSBram Moolenaar 466e859312eSBram Moolenaar try 4672bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 468e859312eSBram Moolenaar catch /E721:/ 469e859312eSBram Moolenaar n = 333 470e859312eSBram Moolenaar endtry 471e859312eSBram Moolenaar assert_equal(333, n) 472e859312eSBram Moolenaar 473e859312eSBram Moolenaar try 474e859312eSBram Moolenaar l = DeletedFunc() 475e859312eSBram Moolenaar catch /E933:/ 476e859312eSBram Moolenaar n = 344 477e859312eSBram Moolenaar endtry 478e859312eSBram Moolenaar assert_equal(344, n) 479d032f34aSBram Moolenaar 480d032f34aSBram Moolenaar try 481d032f34aSBram Moolenaar echo len(v:true) 482d032f34aSBram Moolenaar catch /E701:/ 483d032f34aSBram Moolenaar n = 355 484d032f34aSBram Moolenaar endtry 485d032f34aSBram Moolenaar assert_equal(355, n) 486d032f34aSBram Moolenaar 487cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 488d032f34aSBram Moolenaar delfunc g:NoSuchFunc 489d032f34aSBram Moolenaar try 490d032f34aSBram Moolenaar echo P() 491d032f34aSBram Moolenaar catch /E117:/ 492d032f34aSBram Moolenaar n = 366 493d032f34aSBram Moolenaar endtry 494d032f34aSBram Moolenaar assert_equal(366, n) 495d032f34aSBram Moolenaar 496d032f34aSBram Moolenaar try 497d032f34aSBram Moolenaar echo g:NoSuchFunc() 498d032f34aSBram Moolenaar catch /E117:/ 499d032f34aSBram Moolenaar n = 377 500d032f34aSBram Moolenaar endtry 501d032f34aSBram Moolenaar assert_equal(377, n) 502d032f34aSBram Moolenaar 503d032f34aSBram Moolenaar try 504d032f34aSBram Moolenaar echo g:alist + 4 505d032f34aSBram Moolenaar catch /E745:/ 506d032f34aSBram Moolenaar n = 388 507d032f34aSBram Moolenaar endtry 508d032f34aSBram Moolenaar assert_equal(388, n) 509d032f34aSBram Moolenaar 510d032f34aSBram Moolenaar try 511d032f34aSBram Moolenaar echo 4 + g:alist 512d032f34aSBram Moolenaar catch /E745:/ 513d032f34aSBram Moolenaar n = 399 514d032f34aSBram Moolenaar endtry 515d032f34aSBram Moolenaar assert_equal(399, n) 516d032f34aSBram Moolenaar 517d032f34aSBram Moolenaar try 518d032f34aSBram Moolenaar echo g:alist.member 519d032f34aSBram Moolenaar catch /E715:/ 520d032f34aSBram Moolenaar n = 400 521d032f34aSBram Moolenaar endtry 522d032f34aSBram Moolenaar assert_equal(400, n) 523d032f34aSBram Moolenaar 524d032f34aSBram Moolenaar try 525d032f34aSBram Moolenaar echo d.member 526d032f34aSBram Moolenaar catch /E716:/ 527d032f34aSBram Moolenaar n = 411 528d032f34aSBram Moolenaar endtry 529d032f34aSBram Moolenaar assert_equal(411, n) 5308a7d6542SBram Moolenaarenddef 5318a7d6542SBram Moolenaar 532e859312eSBram Moolenaardef DeletedFunc(): list<any> 533e859312eSBram Moolenaar return ['delete me'] 534e859312eSBram Moolenaarenddef 535e859312eSBram Moolenaardefcompile 536e859312eSBram Moolenaardelfunc DeletedFunc 537e859312eSBram Moolenaar 538257cc5eeSBram Moolenaardef ThrowFromDef() 539a72cfb80SBram Moolenaar throw "getout" # comment 540257cc5eeSBram Moolenaarenddef 541257cc5eeSBram Moolenaar 542257cc5eeSBram Moolenaarfunc CatchInFunc() 543257cc5eeSBram Moolenaar try 544257cc5eeSBram Moolenaar call ThrowFromDef() 545257cc5eeSBram Moolenaar catch 546257cc5eeSBram Moolenaar let g:thrown_func = v:exception 547257cc5eeSBram Moolenaar endtry 548257cc5eeSBram Moolenaarendfunc 549257cc5eeSBram Moolenaar 550257cc5eeSBram Moolenaardef CatchInDef() 551257cc5eeSBram Moolenaar try 552257cc5eeSBram Moolenaar ThrowFromDef() 553257cc5eeSBram Moolenaar catch 554257cc5eeSBram Moolenaar g:thrown_def = v:exception 555257cc5eeSBram Moolenaar endtry 556257cc5eeSBram Moolenaarenddef 557257cc5eeSBram Moolenaar 558f575adffSBram Moolenaardef ReturnFinally(): string 559f575adffSBram Moolenaar try 560f575adffSBram Moolenaar return 'intry' 561373863edSBram Moolenaar finall 562f575adffSBram Moolenaar g:in_finally = 'finally' 563f575adffSBram Moolenaar endtry 564f575adffSBram Moolenaar return 'end' 565f575adffSBram Moolenaarenddef 566f575adffSBram Moolenaar 567257cc5eeSBram Moolenaardef Test_try_catch_nested() 568257cc5eeSBram Moolenaar CatchInFunc() 569257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 570257cc5eeSBram Moolenaar 571257cc5eeSBram Moolenaar CatchInDef() 572257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 573f575adffSBram Moolenaar 574f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 575f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 576f575adffSBram Moolenaarenddef 577f575adffSBram Moolenaar 5789939f57bSBram Moolenaardef TryOne(): number 5799939f57bSBram Moolenaar try 5809939f57bSBram Moolenaar return 0 5819939f57bSBram Moolenaar catch 5829939f57bSBram Moolenaar endtry 5839939f57bSBram Moolenaar return 0 5849939f57bSBram Moolenaarenddef 5859939f57bSBram Moolenaar 5869939f57bSBram Moolenaardef TryTwo(n: number): string 5879939f57bSBram Moolenaar try 588cfcd011fSBram Moolenaar var x = {} 5899939f57bSBram Moolenaar catch 5909939f57bSBram Moolenaar endtry 5919939f57bSBram Moolenaar return 'text' 5929939f57bSBram Moolenaarenddef 5939939f57bSBram Moolenaar 5949939f57bSBram Moolenaardef Test_try_catch_twice() 5959939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5969939f57bSBram Moolenaarenddef 5979939f57bSBram Moolenaar 598f575adffSBram Moolenaardef Test_try_catch_match() 599cfcd011fSBram Moolenaar var seq = 'a' 600f575adffSBram Moolenaar try 601f575adffSBram Moolenaar throw 'something' 602f575adffSBram Moolenaar catch /nothing/ 603f575adffSBram Moolenaar seq ..= 'x' 604f575adffSBram Moolenaar catch /some/ 605f575adffSBram Moolenaar seq ..= 'b' 606f575adffSBram Moolenaar catch /asdf/ 607f575adffSBram Moolenaar seq ..= 'x' 608e8c4abbbSBram Moolenaar catch ?a\?sdf? 609e8c4abbbSBram Moolenaar seq ..= 'y' 610f575adffSBram Moolenaar finally 611f575adffSBram Moolenaar seq ..= 'c' 612f575adffSBram Moolenaar endtry 613f575adffSBram Moolenaar assert_equal('abc', seq) 614257cc5eeSBram Moolenaarenddef 615257cc5eeSBram Moolenaar 616e8c4abbbSBram Moolenaardef Test_try_catch_fails() 617d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 618d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 619d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 620d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 621d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 622d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 623d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 624d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 62513106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 626d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 627585fea7bSBram Moolenaar 628e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 629d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 630e8c4abbbSBram Moolenaarenddef 631e8c4abbbSBram Moolenaar 632006ad48bSBram Moolenaardef Test_throw_vimscript() 633f5be8cdbSBram Moolenaar # only checks line continuation 634cfcd011fSBram Moolenaar var lines =<< trim END 635006ad48bSBram Moolenaar vim9script 636006ad48bSBram Moolenaar try 637006ad48bSBram Moolenaar throw 'one' 638006ad48bSBram Moolenaar .. 'two' 639006ad48bSBram Moolenaar catch 640006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 641006ad48bSBram Moolenaar endtry 642006ad48bSBram Moolenaar END 643006ad48bSBram Moolenaar CheckScriptSuccess(lines) 6441e021e63SBram Moolenaar 6451e021e63SBram Moolenaar lines =<< trim END 6461e021e63SBram Moolenaar vim9script 647352134bbSBram Moolenaar @r = '' 6481e021e63SBram Moolenaar def Func() 6491e021e63SBram Moolenaar throw @r 6501e021e63SBram Moolenaar enddef 6511e021e63SBram Moolenaar var result = '' 6521e021e63SBram Moolenaar try 6531e021e63SBram Moolenaar Func() 6541e021e63SBram Moolenaar catch /E1129:/ 6551e021e63SBram Moolenaar result = 'caught' 6561e021e63SBram Moolenaar endtry 6571e021e63SBram Moolenaar assert_equal('caught', result) 6581e021e63SBram Moolenaar END 6591e021e63SBram Moolenaar CheckScriptSuccess(lines) 660006ad48bSBram Moolenaarenddef 661006ad48bSBram Moolenaar 662ed677f55SBram Moolenaardef Test_error_in_nested_function() 663ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 664cfcd011fSBram Moolenaar var lines =<< trim END 665ed677f55SBram Moolenaar vim9script 666ed677f55SBram Moolenaar def Func() 667ed677f55SBram Moolenaar Error() 668ed677f55SBram Moolenaar g:test_var = 1 669ed677f55SBram Moolenaar enddef 670ed677f55SBram Moolenaar func Error() abort 671ed677f55SBram Moolenaar eval [][0] 672ed677f55SBram Moolenaar endfunc 673ed677f55SBram Moolenaar Func() 674ed677f55SBram Moolenaar END 675ed677f55SBram Moolenaar g:test_var = 0 676ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 677ed677f55SBram Moolenaar assert_equal(0, g:test_var) 678ed677f55SBram Moolenaarenddef 679ed677f55SBram Moolenaar 68037c83711SBram Moolenaardef Test_cexpr_vimscript() 681f5be8cdbSBram Moolenaar # only checks line continuation 68237c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 683cfcd011fSBram Moolenaar var lines =<< trim END 68437c83711SBram Moolenaar vim9script 68537c83711SBram Moolenaar cexpr 'File' 68637c83711SBram Moolenaar .. ' someFile' .. 68737c83711SBram Moolenaar ' line 19' 68837c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 68937c83711SBram Moolenaar END 69037c83711SBram Moolenaar CheckScriptSuccess(lines) 69137c83711SBram Moolenaar set errorformat& 69237c83711SBram Moolenaarenddef 69337c83711SBram Moolenaar 694c9edd6b5SBram Moolenaardef Test_statusline_syntax() 695c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 696cfcd011fSBram Moolenaar var lines =<< trim END 697c9edd6b5SBram Moolenaar vim9script 698c9edd6b5SBram Moolenaar func g:Status() 699c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 700c9edd6b5SBram Moolenaar endfunc 701c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 702c9edd6b5SBram Moolenaar redrawstatus 703c9edd6b5SBram Moolenaar set laststatus statusline= 704c9edd6b5SBram Moolenaar END 705c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 706c9edd6b5SBram Moolenaarenddef 707c9edd6b5SBram Moolenaar 708b209750bSBram Moolenaardef Test_list_vimscript() 709b209750bSBram Moolenaar # checks line continuation and comments 710cfcd011fSBram Moolenaar var lines =<< trim END 711b209750bSBram Moolenaar vim9script 712cfcd011fSBram Moolenaar var mylist = [ 713b209750bSBram Moolenaar 'one', 714b209750bSBram Moolenaar # comment 715b209750bSBram Moolenaar 'two', # empty line follows 716b209750bSBram Moolenaar 717b209750bSBram Moolenaar 'three', 718b209750bSBram Moolenaar ] 719b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 720b209750bSBram Moolenaar END 721b209750bSBram Moolenaar CheckScriptSuccess(lines) 72266250c93SBram Moolenaar 72366250c93SBram Moolenaar # check all lines from heredoc are kept 72466250c93SBram Moolenaar lines =<< trim END 72566250c93SBram Moolenaar # comment 1 72666250c93SBram Moolenaar two 72766250c93SBram Moolenaar # comment 3 72866250c93SBram Moolenaar 72966250c93SBram Moolenaar five 73066250c93SBram Moolenaar # comment 6 73166250c93SBram Moolenaar END 73266250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 733b209750bSBram Moolenaarenddef 734b209750bSBram Moolenaar 7352a1381c3SBram Moolenaarif has('channel') 73640ee466cSBram Moolenaar let someJob = test_null_job() 73740ee466cSBram Moolenaar 73840ee466cSBram Moolenaar def FuncWithError() 73940ee466cSBram Moolenaar echomsg g:someJob 74040ee466cSBram Moolenaar enddef 74140ee466cSBram Moolenaar 74240ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 74340ee466cSBram Moolenaar try 74440ee466cSBram Moolenaar call FuncWithError() 74540ee466cSBram Moolenaar catch 74640ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 74740ee466cSBram Moolenaar endtry 74840ee466cSBram Moolenaar endfunc 7492a1381c3SBram Moolenaarendif 75040ee466cSBram Moolenaar 7518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 7528a7d6542SBram Moolenaar vim9script 753cfcd011fSBram Moolenaar var name: string = 'bob' 7548a7d6542SBram Moolenaar def Concat(arg: string): string 7558a7d6542SBram Moolenaar return name .. arg 7568a7d6542SBram Moolenaar enddef 757227a69deSBram Moolenaar g:result = Concat('bie') 758227a69deSBram Moolenaar g:localname = name 7598a7d6542SBram Moolenaar 7608a7d6542SBram Moolenaar export const CONST = 1234 761cfcd011fSBram Moolenaar export var exported = 9876 762cfcd011fSBram Moolenaar export var exp_name = 'John' 7638a7d6542SBram Moolenaar export def Exported(): string 7648a7d6542SBram Moolenaar return 'Exported' 7658a7d6542SBram Moolenaar enddef 7668a7d6542SBram MoolenaarEND 7678a7d6542SBram Moolenaar 768b3ca9824SBram Moolenaardef Undo_export_script_lines() 769b3ca9824SBram Moolenaar unlet g:result 770b3ca9824SBram Moolenaar unlet g:localname 771b3ca9824SBram Moolenaarenddef 772b3ca9824SBram Moolenaar 7735269bd2aSBram Moolenaardef Test_vim9_import_export() 774cfcd011fSBram Moolenaar var import_script_lines =<< trim END 7758a7d6542SBram Moolenaar vim9script 7768a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 7778a7d6542SBram Moolenaar g:imported = exported 7786e587dcbSBram Moolenaar exported += 3 7796e587dcbSBram Moolenaar g:imported_added = exported 7808a7d6542SBram Moolenaar g:imported_func = Exported() 7816e587dcbSBram Moolenaar 78240f4f7a4SBram Moolenaar def GetExported(): string 783e0de171eSBram Moolenaar var local_dict = {ref: Exported} 78440f4f7a4SBram Moolenaar return local_dict.ref() 78540f4f7a4SBram Moolenaar enddef 78640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 78740f4f7a4SBram Moolenaar 7886e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7896e587dcbSBram Moolenaar g:imported_name = exp_name 7906e587dcbSBram Moolenaar exp_name ..= ' Doe' 7916e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7925381c7a1SBram Moolenaar g:imported_later = exported 7938a7d6542SBram Moolenaar END 7948a7d6542SBram Moolenaar 7958a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7968a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7978a7d6542SBram Moolenaar 7988a7d6542SBram Moolenaar source Ximport.vim 7998a7d6542SBram Moolenaar 8008a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8018a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8028a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8036e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8045381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8058a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 80640f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 8076e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8086e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8098a7d6542SBram Moolenaar assert_false(exists('g:name')) 8108a7d6542SBram Moolenaar 811b3ca9824SBram Moolenaar Undo_export_script_lines() 8128a7d6542SBram Moolenaar unlet g:imported 8136e587dcbSBram Moolenaar unlet g:imported_added 8145381c7a1SBram Moolenaar unlet g:imported_later 8158a7d6542SBram Moolenaar unlet g:imported_func 8166e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 8178a7d6542SBram Moolenaar delete('Ximport.vim') 818f2d5c240SBram Moolenaar 8191c991144SBram Moolenaar # similar, with line breaks 820cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 8211c991144SBram Moolenaar vim9script 8221c991144SBram Moolenaar import { 8231c991144SBram Moolenaar exported, 8241c991144SBram Moolenaar Exported, 8251c991144SBram Moolenaar } 8261c991144SBram Moolenaar from 8271c991144SBram Moolenaar './Xexport.vim' 8281c991144SBram Moolenaar g:imported = exported 8291c991144SBram Moolenaar exported += 5 8301c991144SBram Moolenaar g:imported_added = exported 8311c991144SBram Moolenaar g:imported_func = Exported() 8321c991144SBram Moolenaar END 8331c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 8341c991144SBram Moolenaar source Ximport_lbr.vim 8351c991144SBram Moolenaar 8361c991144SBram Moolenaar assert_equal(9876, g:imported) 8371c991144SBram Moolenaar assert_equal(9881, g:imported_added) 8381c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 8391c991144SBram Moolenaar 8401c991144SBram Moolenaar # exported script not sourced again 8411c991144SBram Moolenaar assert_false(exists('g:result')) 8421c991144SBram Moolenaar unlet g:imported 8431c991144SBram Moolenaar unlet g:imported_added 8441c991144SBram Moolenaar unlet g:imported_func 8451c991144SBram Moolenaar delete('Ximport_lbr.vim') 8461c991144SBram Moolenaar 8471c991144SBram Moolenaar # import inside :def function 848cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 8495381c7a1SBram Moolenaar vim9script 8505381c7a1SBram Moolenaar def ImportInDef() 8515381c7a1SBram Moolenaar import exported from './Xexport.vim' 8525381c7a1SBram Moolenaar g:imported = exported 8535381c7a1SBram Moolenaar exported += 7 8545381c7a1SBram Moolenaar g:imported_added = exported 8555381c7a1SBram Moolenaar enddef 8565381c7a1SBram Moolenaar ImportInDef() 8575381c7a1SBram Moolenaar END 8585381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8595381c7a1SBram Moolenaar source Ximport2.vim 860f5be8cdbSBram Moolenaar # TODO: this should be 9879 8615381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8625381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8635381c7a1SBram Moolenaar unlet g:imported 8645381c7a1SBram Moolenaar unlet g:imported_added 8655381c7a1SBram Moolenaar delete('Ximport2.vim') 8665381c7a1SBram Moolenaar 867cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 868f2d5c240SBram Moolenaar vim9script 869f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 870f2d5c240SBram Moolenaar def UseExport() 871f2d5c240SBram Moolenaar g:imported = Export.exported 872f2d5c240SBram Moolenaar enddef 873f2d5c240SBram Moolenaar UseExport() 874f2d5c240SBram Moolenaar END 875f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 876f2d5c240SBram Moolenaar source Ximport.vim 8775381c7a1SBram Moolenaar assert_equal(9883, g:imported) 878f2d5c240SBram Moolenaar 879cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 880599c89c8SBram Moolenaar vim9script 881599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 882599c89c8SBram Moolenaar def Func() 883cfcd011fSBram Moolenaar var dummy = 1 884cfcd011fSBram Moolenaar var imported = Export + dummy 885599c89c8SBram Moolenaar enddef 886822ba247SBram Moolenaar defcompile 887599c89c8SBram Moolenaar END 888599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 88944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 890599c89c8SBram Moolenaar 891cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 892599c89c8SBram Moolenaar vim9script 893599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 894599c89c8SBram Moolenaar def Func() 895cfcd011fSBram Moolenaar var imported = Export . exported 896599c89c8SBram Moolenaar enddef 897822ba247SBram Moolenaar defcompile 898599c89c8SBram Moolenaar END 899599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 90044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 901599c89c8SBram Moolenaar 902cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 903599c89c8SBram Moolenaar vim9script 904599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 905599c89c8SBram Moolenaar def Func() 906cfcd011fSBram Moolenaar var imported = Export. 907599c89c8SBram Moolenaar enddef 908822ba247SBram Moolenaar defcompile 909599c89c8SBram Moolenaar END 910599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 91144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 912599c89c8SBram Moolenaar 913cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 9141c991144SBram Moolenaar vim9script 9151c991144SBram Moolenaar import * 9161c991144SBram Moolenaar as Export 9171c991144SBram Moolenaar from 9181c991144SBram Moolenaar './Xexport.vim' 9191c991144SBram Moolenaar def UseExport() 9201c991144SBram Moolenaar g:imported = Export.exported 9211c991144SBram Moolenaar enddef 9221c991144SBram Moolenaar UseExport() 9231c991144SBram Moolenaar END 9241c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 9251c991144SBram Moolenaar source Ximport.vim 9261c991144SBram Moolenaar assert_equal(9883, g:imported) 9271c991144SBram Moolenaar 928cfcd011fSBram Moolenaar var import_star_lines =<< trim END 929f2d5c240SBram Moolenaar vim9script 930f2d5c240SBram Moolenaar import * from './Xexport.vim' 931f2d5c240SBram Moolenaar END 932f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 93344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 934f2d5c240SBram Moolenaar 935f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 936cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 937fa29c8abSBram Moolenaar vim9script 938fa29c8abSBram Moolenaar import name from './Xexport.vim' 939fa29c8abSBram Moolenaar END 940fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 94144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 942fa29c8abSBram Moolenaar 943f5be8cdbSBram Moolenaar # try to import something that is already defined 944cfcd011fSBram Moolenaar var import_already_defined =<< trim END 9455269bd2aSBram Moolenaar vim9script 946cfcd011fSBram Moolenaar var exported = 'something' 9475269bd2aSBram Moolenaar import exported from './Xexport.vim' 9485269bd2aSBram Moolenaar END 9495269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 95044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9515269bd2aSBram Moolenaar 952f5be8cdbSBram Moolenaar # try to import something that is already defined 9535269bd2aSBram Moolenaar import_already_defined =<< trim END 9545269bd2aSBram Moolenaar vim9script 955cfcd011fSBram Moolenaar var exported = 'something' 9565269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9575269bd2aSBram Moolenaar END 9585269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 95944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9605269bd2aSBram Moolenaar 961f5be8cdbSBram Moolenaar # try to import something that is already defined 9625269bd2aSBram Moolenaar import_already_defined =<< trim END 9635269bd2aSBram Moolenaar vim9script 964cfcd011fSBram Moolenaar var exported = 'something' 9655269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9665269bd2aSBram Moolenaar END 9675269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 96844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9695269bd2aSBram Moolenaar 970918a4249SBram Moolenaar # try changing an imported const 971918a4249SBram Moolenaar var import_assign_to_const =<< trim END 972918a4249SBram Moolenaar vim9script 973918a4249SBram Moolenaar import CONST from './Xexport.vim' 974918a4249SBram Moolenaar def Assign() 975918a4249SBram Moolenaar CONST = 987 976918a4249SBram Moolenaar enddef 977918a4249SBram Moolenaar defcompile 978918a4249SBram Moolenaar END 979918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 980918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 981918a4249SBram Moolenaar 982f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 983cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 984fa29c8abSBram Moolenaar vim9script 985fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 986fa29c8abSBram Moolenaar END 987fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 98844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 989fa29c8abSBram Moolenaar 990cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 991fa29c8abSBram Moolenaar vim9script 992fa29c8abSBram Moolenaar import name './Xexport.vim' 993fa29c8abSBram Moolenaar END 994fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 99544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 996fa29c8abSBram Moolenaar 997cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 998fa29c8abSBram Moolenaar vim9script 999fa29c8abSBram Moolenaar import name from Xexport.vim 1000fa29c8abSBram Moolenaar END 1001fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 100244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1003fa29c8abSBram Moolenaar 1004cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1005fa29c8abSBram Moolenaar vim9script 1006fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1007fa29c8abSBram Moolenaar END 1008fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 100944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1010fa29c8abSBram Moolenaar 1011cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1012fa29c8abSBram Moolenaar vim9script 1013fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1014fa29c8abSBram Moolenaar END 10155269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 101644d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1017fa29c8abSBram Moolenaar 1018f2d5c240SBram Moolenaar delete('Ximport.vim') 10195269bd2aSBram Moolenaar delete('Ximport3.vim') 10208a7d6542SBram Moolenaar delete('Xexport.vim') 10218a7d6542SBram Moolenaar 1022f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1023750802b5SBram Moolenaar set cpo&vi 1024cfcd011fSBram Moolenaar var cpo_before = &cpo 1025cfcd011fSBram Moolenaar var lines =<< trim END 1026750802b5SBram Moolenaar vim9script 1027750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1028750802b5SBram Moolenaar END 1029750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1030750802b5SBram Moolenaar source Xvim9_script 1031750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1032750802b5SBram Moolenaar set cpo&vim 1033750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1034750802b5SBram Moolenaar delete('Xvim9_script') 1035750802b5SBram Moolenaarenddef 1036750802b5SBram Moolenaar 1037803af686SBram Moolenaarfunc g:Trigger() 1038803af686SBram Moolenaar source Ximport.vim 1039803af686SBram Moolenaar return "echo 'yes'\<CR>" 1040803af686SBram Moolenaarendfunc 1041803af686SBram Moolenaar 1042803af686SBram Moolenaardef Test_import_export_expr_map() 1043803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1044cfcd011fSBram Moolenaar var export_lines =<< trim END 1045803af686SBram Moolenaar vim9script 1046803af686SBram Moolenaar export def That(): string 1047803af686SBram Moolenaar return 'yes' 1048803af686SBram Moolenaar enddef 1049803af686SBram Moolenaar END 1050803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1051803af686SBram Moolenaar 1052cfcd011fSBram Moolenaar var import_lines =<< trim END 1053803af686SBram Moolenaar vim9script 1054803af686SBram Moolenaar import That from './Xexport_that.vim' 1055803af686SBram Moolenaar assert_equal('yes', That()) 1056803af686SBram Moolenaar END 1057803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1058803af686SBram Moolenaar 1059803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1060803af686SBram Moolenaar feedkeys('trigger', "xt") 1061803af686SBram Moolenaar 1062730b2483SBram Moolenaar delete('Xexport_that.vim') 1063803af686SBram Moolenaar delete('Ximport.vim') 1064803af686SBram Moolenaar nunmap trigger 1065803af686SBram Moolenaarenddef 1066803af686SBram Moolenaar 10678e1986e3SBram Moolenaardef Test_import_in_filetype() 10688e1986e3SBram Moolenaar # check that :import works when the buffer is locked 10698e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1070cfcd011fSBram Moolenaar var export_lines =<< trim END 10718e1986e3SBram Moolenaar vim9script 1072cfcd011fSBram Moolenaar export var That = 'yes' 10738e1986e3SBram Moolenaar END 1074730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 10758e1986e3SBram Moolenaar 1076cfcd011fSBram Moolenaar var import_lines =<< trim END 10778e1986e3SBram Moolenaar vim9script 1078730b2483SBram Moolenaar import That from './Xexport_ft.vim' 10798e1986e3SBram Moolenaar assert_equal('yes', That) 10808e1986e3SBram Moolenaar g:did_load_mytpe = 1 10818e1986e3SBram Moolenaar END 10828e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 10838e1986e3SBram Moolenaar 1084cfcd011fSBram Moolenaar var save_rtp = &rtp 10858e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 10868e1986e3SBram Moolenaar 10878e1986e3SBram Moolenaar filetype plugin on 10888e1986e3SBram Moolenaar copen 10898e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 10908e1986e3SBram Moolenaar 10918e1986e3SBram Moolenaar quit! 1092730b2483SBram Moolenaar delete('Xexport_ft.vim') 10938e1986e3SBram Moolenaar delete('ftplugin', 'rf') 10948e1986e3SBram Moolenaar &rtp = save_rtp 10958e1986e3SBram Moolenaarenddef 10968e1986e3SBram Moolenaar 1097efa94447SBram Moolenaardef Test_use_import_in_mapping() 1098cfcd011fSBram Moolenaar var lines =<< trim END 1099efa94447SBram Moolenaar vim9script 1100efa94447SBram Moolenaar export def Funcx() 1101efa94447SBram Moolenaar g:result = 42 1102efa94447SBram Moolenaar enddef 1103efa94447SBram Moolenaar END 1104efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1105efa94447SBram Moolenaar lines =<< trim END 1106efa94447SBram Moolenaar vim9script 1107efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1108b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1109efa94447SBram Moolenaar END 1110efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1111efa94447SBram Moolenaar 1112efa94447SBram Moolenaar source Xmapscript.vim 1113b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1114efa94447SBram Moolenaar assert_equal(42, g:result) 1115efa94447SBram Moolenaar 1116efa94447SBram Moolenaar unlet g:result 1117efa94447SBram Moolenaar delete('XsomeExport.vim') 1118efa94447SBram Moolenaar delete('Xmapscript.vim') 1119b3ca9824SBram Moolenaar nunmap <F3> 1120efa94447SBram Moolenaarenddef 1121efa94447SBram Moolenaar 1122750802b5SBram Moolenaardef Test_vim9script_fails() 11238a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11248a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1125cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 11269721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1127cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1128750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1129750802b5SBram Moolenaar 1130cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1131c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1132c785b9a7SBram Moolenaar 1133e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1134e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 11358a7d6542SBram Moolenaarenddef 11368a7d6542SBram Moolenaar 1137f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1138101f4810SBram Moolenaar CheckRunVimInTerminal 1139101f4810SBram Moolenaar 11409bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1141c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11429bb3eb3eSBram Moolenaarendfunc 11439bb3eb3eSBram Moolenaar 1144c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1145cfcd011fSBram Moolenaar var export =<< trim END 1146101f4810SBram Moolenaar vim9script 1147101f4810SBram Moolenaar export def Foo(): number 1148101f4810SBram Moolenaar return 0 1149101f4810SBram Moolenaar enddef 1150101f4810SBram Moolenaar END 1151730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1152101f4810SBram Moolenaar 1153e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 11549bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11559bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1156101f4810SBram Moolenaar 1157730b2483SBram Moolenaar delete('XexportCmd.vim') 11589bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11599bb3eb3eSBram Moolenaarenddef 1160101f4810SBram Moolenaar 1161*2b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 1162*2b32700dSBram Moolenaar var lines =<< trim END 1163*2b32700dSBram Moolenaar vim9script noclear 1164*2b32700dSBram Moolenaar g:loadCount += 1 1165*2b32700dSBram Moolenaar var s:reloaded = 'init' 1166*2b32700dSBram Moolenaar 1167*2b32700dSBram Moolenaar def Again(): string 1168*2b32700dSBram Moolenaar return 'again' 1169*2b32700dSBram Moolenaar enddef 1170*2b32700dSBram Moolenaar 1171*2b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 1172*2b32700dSBram Moolenaar var s:loaded = true 1173*2b32700dSBram Moolenaar 1174*2b32700dSBram Moolenaar var s:notReloaded = 'yes' 1175*2b32700dSBram Moolenaar s:reloaded = 'first' 1176*2b32700dSBram Moolenaar def g:Values(): list<string> 1177*2b32700dSBram Moolenaar return [s:reloaded, s:notReloaded, Once()] 1178*2b32700dSBram Moolenaar enddef 1179*2b32700dSBram Moolenaar def g:CallAgain(): string 1180*2b32700dSBram Moolenaar return Again() 1181*2b32700dSBram Moolenaar enddef 1182*2b32700dSBram Moolenaar 1183*2b32700dSBram Moolenaar def Once(): string 1184*2b32700dSBram Moolenaar return 'once' 1185*2b32700dSBram Moolenaar enddef 1186*2b32700dSBram Moolenaar END 1187*2b32700dSBram Moolenaar writefile(lines, 'XReloaded') 1188*2b32700dSBram Moolenaar g:loadCount = 0 1189*2b32700dSBram Moolenaar source XReloaded 1190*2b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1191*2b32700dSBram Moolenaar assert_equal(['first', 'yes', 'once'], g:Values()) 1192*2b32700dSBram Moolenaar assert_equal('again', g:CallAgain()) 1193*2b32700dSBram Moolenaar source XReloaded 1194*2b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1195*2b32700dSBram Moolenaar assert_equal(['init', 'yes', 'once'], g:Values()) 1196*2b32700dSBram Moolenaar assert_fails('call g:CallAgain()', 'E933:') 1197*2b32700dSBram Moolenaar source XReloaded 1198*2b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1199*2b32700dSBram Moolenaar assert_equal(['init', 'yes', 'once'], g:Values()) 1200*2b32700dSBram Moolenaar assert_fails('call g:CallAgain()', 'E933:') 1201*2b32700dSBram Moolenaar 1202*2b32700dSBram Moolenaar delete('Xreloaded') 1203*2b32700dSBram Moolenaar delfunc g:Values 1204*2b32700dSBram Moolenaar delfunc g:CallAgain 1205*2b32700dSBram Moolenaar unlet g:loadCount 1206*2b32700dSBram Moolenaarenddef 1207*2b32700dSBram Moolenaar 12084c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1209cfcd011fSBram Moolenaar var lines =<< trim END 12108a7d6542SBram Moolenaar vim9script 12118a7d6542SBram Moolenaar const var = '' 1212cfcd011fSBram Moolenaar var valone = 1234 12138a7d6542SBram Moolenaar def MyFunc(arg: string) 12148a7d6542SBram Moolenaar valone = 5678 12158a7d6542SBram Moolenaar enddef 12168a7d6542SBram Moolenaar END 1217cfcd011fSBram Moolenaar var morelines =<< trim END 1218cfcd011fSBram Moolenaar var valtwo = 222 12198a7d6542SBram Moolenaar export def GetValtwo(): number 12208a7d6542SBram Moolenaar return valtwo 12218a7d6542SBram Moolenaar enddef 12228a7d6542SBram Moolenaar END 122303afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 12248a7d6542SBram Moolenaar source Xreload.vim 12258a7d6542SBram Moolenaar source Xreload.vim 12268a7d6542SBram Moolenaar source Xreload.vim 12278a7d6542SBram Moolenaar 1228cfcd011fSBram Moolenaar var testlines =<< trim END 12298a7d6542SBram Moolenaar vim9script 12308a7d6542SBram Moolenaar def TheFunc() 12318a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 12328a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 12338a7d6542SBram Moolenaar enddef 12348a7d6542SBram Moolenaar TheFunc() 12358a7d6542SBram Moolenaar END 12368a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 12378a7d6542SBram Moolenaar source Ximport.vim 12388a7d6542SBram Moolenaar 1239f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1240f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 12418a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 12428a7d6542SBram Moolenaar source Ximport.vim 12438a7d6542SBram Moolenaar 1244f5be8cdbSBram Moolenaar # cannot declare a var twice 12458a7d6542SBram Moolenaar lines =<< trim END 12468a7d6542SBram Moolenaar vim9script 1247cfcd011fSBram Moolenaar var valone = 1234 1248cfcd011fSBram Moolenaar var valone = 5678 12498a7d6542SBram Moolenaar END 12508a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 125144d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 12528a7d6542SBram Moolenaar 12538a7d6542SBram Moolenaar delete('Xreload.vim') 12548a7d6542SBram Moolenaar delete('Ximport.vim') 12558a7d6542SBram Moolenaarenddef 12568a7d6542SBram Moolenaar 125795006e3dSBram Moolenaardef s:RetSome(): string 125895006e3dSBram Moolenaar return 'some' 125995006e3dSBram Moolenaarenddef 126095006e3dSBram Moolenaar 1261fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1262fe465a01SBram Moolenaar" script-local name. 1263fe465a01SBram Moolenaardef Test_vim9script_funcref() 1264cfcd011fSBram Moolenaar var sortlines =<< trim END 1265fe465a01SBram Moolenaar vim9script 1266fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1267bed36b93SBram Moolenaar return i2 - i1 1268fe465a01SBram Moolenaar enddef 1269fe465a01SBram Moolenaar 1270fe465a01SBram Moolenaar export def FastSort(): list<number> 1271fe465a01SBram Moolenaar return range(5)->sort(Compare) 1272fe465a01SBram Moolenaar enddef 1273fe465a01SBram Moolenaar END 1274fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1275fe465a01SBram Moolenaar 1276cfcd011fSBram Moolenaar var lines =<< trim END 1277fe465a01SBram Moolenaar vim9script 1278fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1279fe465a01SBram Moolenaar def Test() 1280fe465a01SBram Moolenaar g:result = FastSort() 1281fe465a01SBram Moolenaar enddef 1282fe465a01SBram Moolenaar Test() 1283fe465a01SBram Moolenaar END 1284fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1285fe465a01SBram Moolenaar 1286fe465a01SBram Moolenaar source Xscript.vim 1287fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1288fe465a01SBram Moolenaar 1289fe465a01SBram Moolenaar unlet g:result 1290fe465a01SBram Moolenaar delete('Xsort.vim') 1291fe465a01SBram Moolenaar delete('Xscript.vim') 129295006e3dSBram Moolenaar 1293cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 129495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1295fe465a01SBram Moolenaarenddef 1296fe465a01SBram Moolenaar 1297601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1298601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1299601e76acSBram Moolenaar" function reference. 1300c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1301cfcd011fSBram Moolenaar var filterLines =<< trim END 1302c620c055SBram Moolenaar vim9script 1303c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1304c620c055SBram Moolenaar return idx % 2 == 1 1305c620c055SBram Moolenaar enddef 1306c620c055SBram Moolenaar export def FastFilter(): list<number> 1307c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1308c620c055SBram Moolenaar enddef 1309601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1310601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1311601e76acSBram Moolenaar enddef 1312c620c055SBram Moolenaar END 1313c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1314c620c055SBram Moolenaar 1315cfcd011fSBram Moolenaar var lines =<< trim END 1316c620c055SBram Moolenaar vim9script 1317601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1318c620c055SBram Moolenaar def Test() 1319cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1320c620c055SBram Moolenaar enddef 1321c620c055SBram Moolenaar Test() 1322601e76acSBram Moolenaar def TestDirect() 1323cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1324601e76acSBram Moolenaar enddef 1325601e76acSBram Moolenaar TestDirect() 1326c620c055SBram Moolenaar END 1327601e76acSBram Moolenaar CheckScriptSuccess(lines) 1328c620c055SBram Moolenaar delete('Xfilter.vim') 1329c620c055SBram Moolenaarenddef 1330c620c055SBram Moolenaar 13314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1332cfcd011fSBram Moolenaar var first_lines =<< trim END 13334c17ad94SBram Moolenaar vim9script 13344c17ad94SBram Moolenaar def FuncYes(): string 13354c17ad94SBram Moolenaar return 'yes' 13364c17ad94SBram Moolenaar enddef 13374c17ad94SBram Moolenaar END 1338cfcd011fSBram Moolenaar var withno_lines =<< trim END 13394c17ad94SBram Moolenaar def FuncNo(): string 13404c17ad94SBram Moolenaar return 'no' 13414c17ad94SBram Moolenaar enddef 13424c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 13434c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 13444c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 134503afdcf1SBram Moolenaar enddef 134603afdcf1SBram Moolenaar END 1347cfcd011fSBram Moolenaar var nono_lines =<< trim END 134803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 134903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 135044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 13514c17ad94SBram Moolenaar enddef 13524c17ad94SBram Moolenaar END 13534c17ad94SBram Moolenaar 13544c17ad94SBram Moolenaar # FuncNo() is defined 135503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13564c17ad94SBram Moolenaar source Xreloaded.vim 13574c17ad94SBram Moolenaar g:DoCheck(true) 13584c17ad94SBram Moolenaar 13594c17ad94SBram Moolenaar # FuncNo() is not redefined 136003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 13614c17ad94SBram Moolenaar source Xreloaded.vim 13625082471fSBram Moolenaar g:DoCheck(false) 13634c17ad94SBram Moolenaar 13644c17ad94SBram Moolenaar # FuncNo() is back 136503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13664c17ad94SBram Moolenaar source Xreloaded.vim 13675082471fSBram Moolenaar g:DoCheck(false) 13684c17ad94SBram Moolenaar 13694c17ad94SBram Moolenaar delete('Xreloaded.vim') 13704c17ad94SBram Moolenaarenddef 13714c17ad94SBram Moolenaar 137289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 137389483d40SBram Moolenaar # write the script with a script-local variable 1374cfcd011fSBram Moolenaar var lines =<< trim END 137589483d40SBram Moolenaar vim9script 1376cfcd011fSBram Moolenaar var name = 'string' 137789483d40SBram Moolenaar END 137889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 137989483d40SBram Moolenaar source XreloadVar.vim 138089483d40SBram Moolenaar 138189483d40SBram Moolenaar # now write the script using the same variable locally - works 138289483d40SBram Moolenaar lines =<< trim END 138389483d40SBram Moolenaar vim9script 138489483d40SBram Moolenaar def Func() 1385cfcd011fSBram Moolenaar var name = 'string' 138689483d40SBram Moolenaar enddef 138789483d40SBram Moolenaar END 138889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 138989483d40SBram Moolenaar source XreloadVar.vim 139089483d40SBram Moolenaar 139189483d40SBram Moolenaar delete('XreloadVar.vim') 139289483d40SBram Moolenaarenddef 139389483d40SBram Moolenaar 13948a7d6542SBram Moolenaardef Test_import_absolute() 1395cfcd011fSBram Moolenaar var import_lines = [ 1396e6085c53SBram Moolenaar 'vim9script', 1397e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1398e6085c53SBram Moolenaar 'def UseExported()', 1399e6085c53SBram Moolenaar ' g:imported_abs = exported', 1400e6085c53SBram Moolenaar ' exported = 8888', 1401e6085c53SBram Moolenaar ' g:imported_after = exported', 1402e6085c53SBram Moolenaar 'enddef', 1403e6085c53SBram Moolenaar 'UseExported()', 1404e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1405e6085c53SBram Moolenaar ] 14068a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 14078a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 14088a7d6542SBram Moolenaar 14098a7d6542SBram Moolenaar source Ximport_abs.vim 14108a7d6542SBram Moolenaar 14118a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 14124e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1413fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1414fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1415fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1416fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1417fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1418fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1419fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1420fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1421fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1422fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1423e6085c53SBram Moolenaar g:import_disassembled) 1424b3ca9824SBram Moolenaar 1425b3ca9824SBram Moolenaar Undo_export_script_lines() 14268a7d6542SBram Moolenaar unlet g:imported_abs 14274e12a5dfSBram Moolenaar unlet g:import_disassembled 14288a7d6542SBram Moolenaar 14298a7d6542SBram Moolenaar delete('Ximport_abs.vim') 14308a7d6542SBram Moolenaar delete('Xexport_abs.vim') 14318a7d6542SBram Moolenaarenddef 14328a7d6542SBram Moolenaar 14338a7d6542SBram Moolenaardef Test_import_rtp() 1434cfcd011fSBram Moolenaar var import_lines = [ 1435e6085c53SBram Moolenaar 'vim9script', 1436e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1437e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1438e6085c53SBram Moolenaar ] 14398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 14408a7d6542SBram Moolenaar mkdir('import') 14418a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 14428a7d6542SBram Moolenaar 1443cfcd011fSBram Moolenaar var save_rtp = &rtp 14448a7d6542SBram Moolenaar &rtp = getcwd() 14458a7d6542SBram Moolenaar source Ximport_rtp.vim 14468a7d6542SBram Moolenaar &rtp = save_rtp 14478a7d6542SBram Moolenaar 14488a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 14498a7d6542SBram Moolenaar 1450b3ca9824SBram Moolenaar Undo_export_script_lines() 1451b3ca9824SBram Moolenaar unlet g:imported_rtp 14528a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 145389483d40SBram Moolenaar delete('import', 'rf') 14548a7d6542SBram Moolenaarenddef 14558a7d6542SBram Moolenaar 145625e0f586SBram Moolenaardef Test_import_compile_error() 1457cfcd011fSBram Moolenaar var export_lines = [ 145825e0f586SBram Moolenaar 'vim9script', 145925e0f586SBram Moolenaar 'export def ExpFunc(): string', 146025e0f586SBram Moolenaar ' return notDefined', 146125e0f586SBram Moolenaar 'enddef', 146225e0f586SBram Moolenaar ] 146325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 146425e0f586SBram Moolenaar 1465cfcd011fSBram Moolenaar var import_lines = [ 146625e0f586SBram Moolenaar 'vim9script', 146725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 146825e0f586SBram Moolenaar 'def ImpFunc()', 146925e0f586SBram Moolenaar ' echo ExpFunc()', 147025e0f586SBram Moolenaar 'enddef', 147125e0f586SBram Moolenaar 'defcompile', 147225e0f586SBram Moolenaar ] 147325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 147425e0f586SBram Moolenaar 147525e0f586SBram Moolenaar try 147625e0f586SBram Moolenaar source Ximport.vim 147725e0f586SBram Moolenaar catch /E1001/ 1478f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 14797707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 148025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 148125e0f586SBram Moolenaar endtry 148225e0f586SBram Moolenaar 148325e0f586SBram Moolenaar delete('Xexported.vim') 148425e0f586SBram Moolenaar delete('Ximport.vim') 148525e0f586SBram Moolenaarenddef 148625e0f586SBram Moolenaar 1487c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1488cfcd011fSBram Moolenaar var lines = [ 1489c4ce36d4SBram Moolenaar 'vim9script', 1490c4ce36d4SBram Moolenaar 'def Func()', 1491c4ce36d4SBram Moolenaar ' eval [][0]', 1492c4ce36d4SBram Moolenaar 'enddef', 1493c4ce36d4SBram Moolenaar 'Func()', 1494c4ce36d4SBram Moolenaar ] 1495c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1496c4ce36d4SBram Moolenaar 1497c4ce36d4SBram Moolenaar for count in range(3) 1498c4ce36d4SBram Moolenaar try 1499c4ce36d4SBram Moolenaar source Xtestscript.vim 1500c4ce36d4SBram Moolenaar catch /E684/ 1501c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1502c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1503c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1504c4ce36d4SBram Moolenaar endtry 1505c4ce36d4SBram Moolenaar endfor 1506c4ce36d4SBram Moolenaar 1507c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1508c4ce36d4SBram Moolenaarenddef 1509c4ce36d4SBram Moolenaar 1510eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1511cfcd011fSBram Moolenaar var export_lines =<< trim END 1512eef2102eSBram Moolenaar vim9script 1513eef2102eSBram Moolenaar export def Func() 1514eef2102eSBram Moolenaar echo 'imported' 1515eef2102eSBram Moolenaar enddef 1516eef2102eSBram Moolenaar END 1517eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1518eef2102eSBram Moolenaar 1519cfcd011fSBram Moolenaar var lines =<< trim END 1520eef2102eSBram Moolenaar vim9script 1521eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1522eef2102eSBram Moolenaar def Func() 1523eef2102eSBram Moolenaar echo 'local to function' 1524eef2102eSBram Moolenaar enddef 1525eef2102eSBram Moolenaar END 1526eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1527eef2102eSBram Moolenaar 1528eef2102eSBram Moolenaar lines =<< trim END 1529eef2102eSBram Moolenaar vim9script 1530eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1531eef2102eSBram Moolenaar def Outer() 1532eef2102eSBram Moolenaar def Func() 1533eef2102eSBram Moolenaar echo 'local to function' 1534eef2102eSBram Moolenaar enddef 1535eef2102eSBram Moolenaar enddef 1536eef2102eSBram Moolenaar defcompile 1537eef2102eSBram Moolenaar END 1538eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1539eef2102eSBram Moolenaar 1540eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1541eef2102eSBram Moolenaarenddef 1542eef2102eSBram Moolenaar 1543b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1544cfcd011fSBram Moolenaar var lines =<< trim END 1545b9a2cac3SBram Moolenaar vim9script 1546b9a2cac3SBram Moolenaar def Func() 1547b9a2cac3SBram Moolenaar echo 'one' 1548b9a2cac3SBram Moolenaar enddef 1549b9a2cac3SBram Moolenaar def Func() 1550b9a2cac3SBram Moolenaar echo 'two' 1551b9a2cac3SBram Moolenaar enddef 1552b9a2cac3SBram Moolenaar END 1553b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1554fa211f3cSBram Moolenaar 1555fa211f3cSBram Moolenaar lines =<< trim END 1556fa211f3cSBram Moolenaar vim9script 1557fa211f3cSBram Moolenaar def Foo(): string 1558fa211f3cSBram Moolenaar return 'foo' 1559fa211f3cSBram Moolenaar enddef 1560fa211f3cSBram Moolenaar def Func() 1561cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1562fa211f3cSBram Moolenaar enddef 1563fa211f3cSBram Moolenaar defcompile 1564fa211f3cSBram Moolenaar END 1565fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1566b9a2cac3SBram Moolenaarenddef 1567b9a2cac3SBram Moolenaar 15688a7d6542SBram Moolenaardef Test_fixed_size_list() 1569f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1570cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 15718a7d6542SBram Moolenaar l->remove(0) 15728a7d6542SBram Moolenaar l->add(5) 15738a7d6542SBram Moolenaar l->insert(99, 1) 15740f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 15758a7d6542SBram Moolenaarenddef 15768a7d6542SBram Moolenaar 1577ae616494SBram Moolenaardef Test_no_insert_xit() 1578d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1579d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1580d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1581d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1582d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1583ae616494SBram Moolenaar 1584ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1585ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1586ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1587ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1588f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1589f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1590f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1591f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1592f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1593ae616494SBram Moolenaarenddef 1594ae616494SBram Moolenaar 1595158906cfSBram Moolenaardef IfElse(what: number): string 1596cfcd011fSBram Moolenaar var res = '' 1597158906cfSBram Moolenaar if what == 1 1598158906cfSBram Moolenaar res = "one" 1599158906cfSBram Moolenaar elseif what == 2 1600158906cfSBram Moolenaar res = "two" 1601a259d8d3SBram Moolenaar else 1602158906cfSBram Moolenaar res = "three" 1603a259d8d3SBram Moolenaar endif 1604158906cfSBram Moolenaar return res 1605a259d8d3SBram Moolenaarenddef 1606a259d8d3SBram Moolenaar 1607158906cfSBram Moolenaardef Test_if_elseif_else() 1608158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1609158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1610158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 16110f18b6d1SBram Moolenaarenddef 16120f18b6d1SBram Moolenaar 1613e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1614d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1615d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1616d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1617d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1618d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1619e8c4abbbSBram Moolenaarenddef 1620e8c4abbbSBram Moolenaar 16216d69bf60SBram Moolenaarlet g:bool_true = v:true 16226d69bf60SBram Moolenaarlet g:bool_false = v:false 16236d69bf60SBram Moolenaar 16246d69bf60SBram Moolenaardef Test_if_const_expr() 1625cfcd011fSBram Moolenaar var res = false 16266d69bf60SBram Moolenaar if true ? true : false 16276d69bf60SBram Moolenaar res = true 16286d69bf60SBram Moolenaar endif 16296d69bf60SBram Moolenaar assert_equal(true, res) 16306d69bf60SBram Moolenaar 1631585fea7bSBram Moolenaar g:glob = 2 1632585fea7bSBram Moolenaar if false 16336797966dSBram Moolenaar execute('g:glob = 3') 1634585fea7bSBram Moolenaar endif 1635585fea7bSBram Moolenaar assert_equal(2, g:glob) 1636585fea7bSBram Moolenaar if true 16376797966dSBram Moolenaar execute('g:glob = 3') 1638585fea7bSBram Moolenaar endif 1639585fea7bSBram Moolenaar assert_equal(3, g:glob) 1640585fea7bSBram Moolenaar 16416d69bf60SBram Moolenaar res = false 16426d69bf60SBram Moolenaar if g:bool_true ? true : false 16436d69bf60SBram Moolenaar res = true 16446d69bf60SBram Moolenaar endif 16456d69bf60SBram Moolenaar assert_equal(true, res) 16466d69bf60SBram Moolenaar 16476d69bf60SBram Moolenaar res = false 16486d69bf60SBram Moolenaar if true ? g:bool_true : false 16496d69bf60SBram Moolenaar res = true 16506d69bf60SBram Moolenaar endif 16516d69bf60SBram Moolenaar assert_equal(true, res) 16526d69bf60SBram Moolenaar 16536d69bf60SBram Moolenaar res = false 16546d69bf60SBram Moolenaar if true ? true : g:bool_false 16556d69bf60SBram Moolenaar res = true 16566d69bf60SBram Moolenaar endif 16576d69bf60SBram Moolenaar assert_equal(true, res) 16586d69bf60SBram Moolenaar 16596d69bf60SBram Moolenaar res = false 16606d69bf60SBram Moolenaar if true ? false : true 16616d69bf60SBram Moolenaar res = true 16626d69bf60SBram Moolenaar endif 16636d69bf60SBram Moolenaar assert_equal(false, res) 16646d69bf60SBram Moolenaar 16656d69bf60SBram Moolenaar res = false 16666d69bf60SBram Moolenaar if false ? false : true 16676d69bf60SBram Moolenaar res = true 16686d69bf60SBram Moolenaar endif 16696d69bf60SBram Moolenaar assert_equal(true, res) 16706d69bf60SBram Moolenaar 16716d69bf60SBram Moolenaar res = false 16726d69bf60SBram Moolenaar if false ? true : false 16736d69bf60SBram Moolenaar res = true 16746d69bf60SBram Moolenaar endif 16756d69bf60SBram Moolenaar assert_equal(false, res) 16766d69bf60SBram Moolenaar 16776d69bf60SBram Moolenaar res = false 1678e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1679e8c4abbbSBram Moolenaar res = true 1680e8c4abbbSBram Moolenaar endif 1681e8c4abbbSBram Moolenaar assert_equal(false, res) 1682e8c4abbbSBram Moolenaar 1683e8c4abbbSBram Moolenaar res = false 16846d69bf60SBram Moolenaar if true && true 16856d69bf60SBram Moolenaar res = true 16866d69bf60SBram Moolenaar endif 16876d69bf60SBram Moolenaar assert_equal(true, res) 16886d69bf60SBram Moolenaar 16896d69bf60SBram Moolenaar res = false 16906d69bf60SBram Moolenaar if true && false 16916d69bf60SBram Moolenaar res = true 16926d69bf60SBram Moolenaar endif 16936d69bf60SBram Moolenaar assert_equal(false, res) 16946d69bf60SBram Moolenaar 16956d69bf60SBram Moolenaar res = false 16966d69bf60SBram Moolenaar if g:bool_true && false 16976d69bf60SBram Moolenaar res = true 16986d69bf60SBram Moolenaar endif 16996d69bf60SBram Moolenaar assert_equal(false, res) 17006d69bf60SBram Moolenaar 17016d69bf60SBram Moolenaar res = false 17026d69bf60SBram Moolenaar if true && g:bool_false 17036d69bf60SBram Moolenaar res = true 17046d69bf60SBram Moolenaar endif 17056d69bf60SBram Moolenaar assert_equal(false, res) 17066d69bf60SBram Moolenaar 17076d69bf60SBram Moolenaar res = false 17086d69bf60SBram Moolenaar if false && false 17096d69bf60SBram Moolenaar res = true 17106d69bf60SBram Moolenaar endif 17116d69bf60SBram Moolenaar assert_equal(false, res) 17126d69bf60SBram Moolenaar 17136d69bf60SBram Moolenaar res = false 17146d69bf60SBram Moolenaar if true || false 17156d69bf60SBram Moolenaar res = true 17166d69bf60SBram Moolenaar endif 17176d69bf60SBram Moolenaar assert_equal(true, res) 17186d69bf60SBram Moolenaar 17196d69bf60SBram Moolenaar res = false 17206d69bf60SBram Moolenaar if g:bool_true || false 17216d69bf60SBram Moolenaar res = true 17226d69bf60SBram Moolenaar endif 17236d69bf60SBram Moolenaar assert_equal(true, res) 17246d69bf60SBram Moolenaar 17256d69bf60SBram Moolenaar res = false 17266d69bf60SBram Moolenaar if true || g:bool_false 17276d69bf60SBram Moolenaar res = true 17286d69bf60SBram Moolenaar endif 17296d69bf60SBram Moolenaar assert_equal(true, res) 17306d69bf60SBram Moolenaar 17316d69bf60SBram Moolenaar res = false 17326d69bf60SBram Moolenaar if false || false 17336d69bf60SBram Moolenaar res = true 17346d69bf60SBram Moolenaar endif 17356d69bf60SBram Moolenaar assert_equal(false, res) 17363988f64fSBram Moolenaar 17373988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 17383988f64fSBram Moolenaar if false | eval 0 | endif 17393988f64fSBram Moolenaar if false | eval burp + 234 | endif 17403988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 17413988f64fSBram Moolenaar if false 17423988f64fSBram Moolenaar burp 17433988f64fSBram Moolenaar endif 174480c34ca3SBram Moolenaarenddef 17456d69bf60SBram Moolenaar 174680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1747d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1748d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1749d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1750d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 17516d69bf60SBram Moolenaarenddef 17526d69bf60SBram Moolenaar 175372abcf42SBram Moolenaardef RunNested(i: number): number 1754cfcd011fSBram Moolenaar var x: number = 0 175572abcf42SBram Moolenaar if i % 2 175672abcf42SBram Moolenaar if 1 1757f5be8cdbSBram Moolenaar # comment 175872abcf42SBram Moolenaar else 1759f5be8cdbSBram Moolenaar # comment 176072abcf42SBram Moolenaar endif 176172abcf42SBram Moolenaar x += 1 176272abcf42SBram Moolenaar else 176372abcf42SBram Moolenaar x += 1000 176472abcf42SBram Moolenaar endif 176572abcf42SBram Moolenaar return x 176672abcf42SBram Moolenaarenddef 176772abcf42SBram Moolenaar 176872abcf42SBram Moolenaardef Test_nested_if() 176972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 177072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 177172abcf42SBram Moolenaarenddef 177272abcf42SBram Moolenaar 1773ad39c094SBram Moolenaardef Test_execute_cmd() 1774e4984290SBram Moolenaar # missing argument is ignored 1775e4984290SBram Moolenaar execute 1776e4984290SBram Moolenaar execute # comment 1777e4984290SBram Moolenaar 1778ad39c094SBram Moolenaar new 1779ad39c094SBram Moolenaar setline(1, 'default') 1780d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1781ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1782a72cfb80SBram Moolenaar 1783d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1784a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1785a72cfb80SBram Moolenaar 1786cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1787cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1788a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1789ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1790a72cfb80SBram Moolenaar 1791d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1792ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1793a72cfb80SBram Moolenaar 1794cfcd011fSBram Moolenaar var cmd_first = 'call ' 1795cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1796ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1797ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1798ad39c094SBram Moolenaar bwipe! 1799585fea7bSBram Moolenaar 1800cfcd011fSBram Moolenaar var n = true 18012d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 18022d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 18032d6b20d6SBram Moolenaar 1804e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1805e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1806e5abf7afSBram Moolenaar 1807d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1808d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1809d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1810ad39c094SBram Moolenaarenddef 1811ad39c094SBram Moolenaar 181247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1813f5be8cdbSBram Moolenaar # only checks line continuation 1814cfcd011fSBram Moolenaar var lines =<< trim END 181547e880d6SBram Moolenaar vim9script 181647e880d6SBram Moolenaar execute 'g:someVar' 181747e880d6SBram Moolenaar .. ' = ' .. 181847e880d6SBram Moolenaar '28' 181947e880d6SBram Moolenaar assert_equal(28, g:someVar) 182047e880d6SBram Moolenaar unlet g:someVar 182147e880d6SBram Moolenaar END 182247e880d6SBram Moolenaar CheckScriptSuccess(lines) 182347e880d6SBram Moolenaarenddef 182447e880d6SBram Moolenaar 1825ad39c094SBram Moolenaardef Test_echo_cmd() 1826a72cfb80SBram Moolenaar echo 'some' # comment 1827585fea7bSBram Moolenaar echon 'thing' 1828ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1829ad39c094SBram Moolenaar 1830a72cfb80SBram Moolenaar echo "some" # comment 1831a72cfb80SBram Moolenaar echon "thing" 1832a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1833a72cfb80SBram Moolenaar 1834cfcd011fSBram Moolenaar var str1 = 'some' 1835cfcd011fSBram Moolenaar var str2 = 'more' 1836ad39c094SBram Moolenaar echo str1 str2 1837ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1838a72cfb80SBram Moolenaar 1839d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1840ad39c094SBram Moolenaarenddef 1841ad39c094SBram Moolenaar 1842f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1843f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1844f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1845f93c7feaSBram Moolenaar echo 'clear' 1846df069eecSBram Moolenaar :1messages 1847f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1848f93c7feaSBram Moolenaar 1849d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1850f93c7feaSBram Moolenaarenddef 1851f93c7feaSBram Moolenaar 185247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1853f5be8cdbSBram Moolenaar # only checks line continuation 1854cfcd011fSBram Moolenaar var lines =<< trim END 185547e880d6SBram Moolenaar vim9script 185647e880d6SBram Moolenaar echomsg 'here' 185747e880d6SBram Moolenaar .. ' is ' .. 185847e880d6SBram Moolenaar 'a message' 185947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 186047e880d6SBram Moolenaar END 186147e880d6SBram Moolenaar CheckScriptSuccess(lines) 186247e880d6SBram Moolenaarenddef 186347e880d6SBram Moolenaar 1864f93c7feaSBram Moolenaardef Test_echoerr_cmd() 186540ee466cSBram Moolenaar try 186640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 186740ee466cSBram Moolenaar catch 186840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 186940ee466cSBram Moolenaar endtry 1870f93c7feaSBram Moolenaarenddef 1871f93c7feaSBram Moolenaar 187247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1873f5be8cdbSBram Moolenaar # only checks line continuation 1874cfcd011fSBram Moolenaar var lines =<< trim END 187547e880d6SBram Moolenaar vim9script 187647e880d6SBram Moolenaar try 187747e880d6SBram Moolenaar echoerr 'this' 187847e880d6SBram Moolenaar .. ' is ' .. 187947e880d6SBram Moolenaar 'wrong' 188047e880d6SBram Moolenaar catch 188147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 188247e880d6SBram Moolenaar endtry 188347e880d6SBram Moolenaar END 188447e880d6SBram Moolenaar CheckScriptSuccess(lines) 188547e880d6SBram Moolenaarenddef 188647e880d6SBram Moolenaar 188741fe0617SBram Moolenaardef Test_for_outside_of_function() 1888cfcd011fSBram Moolenaar var lines =<< trim END 188941fe0617SBram Moolenaar vim9script 189041fe0617SBram Moolenaar new 189141fe0617SBram Moolenaar for var in range(0, 3) 189241fe0617SBram Moolenaar append(line('$'), var) 189341fe0617SBram Moolenaar endfor 189441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 189541fe0617SBram Moolenaar bwipe! 189641fe0617SBram Moolenaar END 189741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 189841fe0617SBram Moolenaar source Xvim9for.vim 189941fe0617SBram Moolenaar delete('Xvim9for.vim') 190041fe0617SBram Moolenaarenddef 19018a7d6542SBram Moolenaar 1902e8c4abbbSBram Moolenaardef Test_for_loop() 1903cfcd011fSBram Moolenaar var result = '' 1904e8c4abbbSBram Moolenaar for cnt in range(7) 1905e8c4abbbSBram Moolenaar if cnt == 4 1906e8c4abbbSBram Moolenaar break 1907e8c4abbbSBram Moolenaar endif 1908e8c4abbbSBram Moolenaar if cnt == 2 1909e8c4abbbSBram Moolenaar continue 1910e8c4abbbSBram Moolenaar endif 1911e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1912e8c4abbbSBram Moolenaar endfor 1913e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 19140ad3e894SBram Moolenaar 1915cfcd011fSBram Moolenaar var concat = '' 19160ad3e894SBram Moolenaar for str in eval('["one", "two"]') 19170ad3e894SBram Moolenaar concat ..= str 19180ad3e894SBram Moolenaar endfor 19190ad3e894SBram Moolenaar assert_equal('onetwo', concat) 192038bd8de5SBram Moolenaar 192138bd8de5SBram Moolenaar var total = 0 192238bd8de5SBram Moolenaar for nr in 192338bd8de5SBram Moolenaar [1, 2, 3] 192438bd8de5SBram Moolenaar total += nr 192538bd8de5SBram Moolenaar endfor 192638bd8de5SBram Moolenaar assert_equal(6, total) 192738bd8de5SBram Moolenaar 192838bd8de5SBram Moolenaar total = 0 192938bd8de5SBram Moolenaar for nr 193038bd8de5SBram Moolenaar in [1, 2, 3] 193138bd8de5SBram Moolenaar total += nr 193238bd8de5SBram Moolenaar endfor 193338bd8de5SBram Moolenaar assert_equal(6, total) 193438bd8de5SBram Moolenaar 193538bd8de5SBram Moolenaar total = 0 193638bd8de5SBram Moolenaar for nr 193738bd8de5SBram Moolenaar in 193838bd8de5SBram Moolenaar [1, 2, 3] 193938bd8de5SBram Moolenaar total += nr 194038bd8de5SBram Moolenaar endfor 194138bd8de5SBram Moolenaar assert_equal(6, total) 1942e8c4abbbSBram Moolenaarenddef 1943e8c4abbbSBram Moolenaar 1944e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1945025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 1946025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 1947025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 1948675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1949675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1950cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1951822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 19522d870f8dSBram Moolenaar delfunc! g:Func 1953451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1954675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1955675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1956675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1957e8c4abbbSBram Moolenaarenddef 1958e8c4abbbSBram Moolenaar 1959ea87069dSBram Moolenaardef Test_for_loop_script_var() 1960ea87069dSBram Moolenaar # cannot use s:var in a :def function 1961ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 1962ea87069dSBram Moolenaar 1963ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 1964ea87069dSBram Moolenaar var lines =<< trim END 1965ea87069dSBram Moolenaar vim9script 1966ea87069dSBram Moolenaar var total = 0 1967ea87069dSBram Moolenaar for s:var in [1, 2, 3] 1968ea87069dSBram Moolenaar total += s:var 1969ea87069dSBram Moolenaar endfor 1970ea87069dSBram Moolenaar assert_equal(6, total) 1971ea87069dSBram Moolenaar 1972ea87069dSBram Moolenaar total = 0 1973ea87069dSBram Moolenaar for var in [1, 2, 3] 1974ea87069dSBram Moolenaar total += var 1975ea87069dSBram Moolenaar endfor 1976ea87069dSBram Moolenaar assert_equal(6, total) 1977ea87069dSBram Moolenaar END 1978ea87069dSBram Moolenaarenddef 1979ea87069dSBram Moolenaar 1980792f786aSBram Moolenaardef Test_for_loop_unpack() 19814b8a0651SBram Moolenaar var lines =<< trim END 1982792f786aSBram Moolenaar var result = [] 1983792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 1984792f786aSBram Moolenaar result->add(v1) 1985792f786aSBram Moolenaar result->add(v2) 1986792f786aSBram Moolenaar endfor 1987792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 1988792f786aSBram Moolenaar 1989792f786aSBram Moolenaar result = [] 1990792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 1991792f786aSBram Moolenaar result->add(v1) 1992792f786aSBram Moolenaar result->add(v2) 1993792f786aSBram Moolenaar result->add(v3) 1994792f786aSBram Moolenaar endfor 1995792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 1996792f786aSBram Moolenaar 19974b8a0651SBram Moolenaar result = [] 19984b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 19994b8a0651SBram Moolenaar result->add(&ts) 20004b8a0651SBram Moolenaar result->add(&sw) 20014b8a0651SBram Moolenaar endfor 20024b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 20034b8a0651SBram Moolenaar 20044b8a0651SBram Moolenaar var slist: list<string> 20054b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 20064b8a0651SBram Moolenaar slist->add($LOOPVAR) 20074b8a0651SBram Moolenaar slist->add(@r) 20084b8a0651SBram Moolenaar slist->add(v:errmsg) 20094b8a0651SBram Moolenaar endfor 20104b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 20114b8a0651SBram Moolenaar 20124b8a0651SBram Moolenaar slist = [] 20134b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 20144b8a0651SBram Moolenaar slist->add(g:globalvar) 20154b8a0651SBram Moolenaar slist->add(b:bufvar) 20164b8a0651SBram Moolenaar slist->add(w:winvar) 20174b8a0651SBram Moolenaar slist->add(t:tabvar) 20184b8a0651SBram Moolenaar endfor 20194b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2020f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 20214b8a0651SBram Moolenaar END 20224b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 20234b8a0651SBram Moolenaar 20244b8a0651SBram Moolenaar lines =<< trim END 2025792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2026792f786aSBram Moolenaar echo v1 v2 2027792f786aSBram Moolenaar endfor 2028792f786aSBram Moolenaar END 2029792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2030792f786aSBram Moolenaar 2031792f786aSBram Moolenaar lines =<< trim END 2032792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2033792f786aSBram Moolenaar echo v1 v2 2034792f786aSBram Moolenaar endfor 2035792f786aSBram Moolenaar END 2036792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2037792f786aSBram Moolenaar 2038792f786aSBram Moolenaar lines =<< trim END 2039792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2040792f786aSBram Moolenaar echo v1 2041792f786aSBram Moolenaar endfor 2042792f786aSBram Moolenaar END 2043792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2044792f786aSBram Moolenaarenddef 2045792f786aSBram Moolenaar 2046d0df1aacSBram Moolenaardef Test_while_loop() 2047cfcd011fSBram Moolenaar var result = '' 2048cfcd011fSBram Moolenaar var cnt = 0 2049d0df1aacSBram Moolenaar while cnt < 555 2050d0df1aacSBram Moolenaar if cnt == 3 2051d0df1aacSBram Moolenaar break 2052d0df1aacSBram Moolenaar endif 2053d0df1aacSBram Moolenaar cnt += 1 2054d0df1aacSBram Moolenaar if cnt == 2 2055d0df1aacSBram Moolenaar continue 2056d0df1aacSBram Moolenaar endif 2057d0df1aacSBram Moolenaar result ..= cnt .. '_' 2058d0df1aacSBram Moolenaar endwhile 2059d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2060d0df1aacSBram Moolenaarenddef 2061d0df1aacSBram Moolenaar 2062e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2063675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2064675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2065675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2066675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2067675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2068675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2069675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2070bd5da371SBram Moolenaarenddef 2071bd5da371SBram Moolenaar 20729645e2d9SBram Moolenaardef Test_interrupt_loop() 2073cfcd011fSBram Moolenaar var caught = false 2074cfcd011fSBram Moolenaar var x = 0 207597acfc78SBram Moolenaar try 20769645e2d9SBram Moolenaar while 1 20779645e2d9SBram Moolenaar x += 1 20789645e2d9SBram Moolenaar if x == 100 20799645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 20809645e2d9SBram Moolenaar endif 20819645e2d9SBram Moolenaar endwhile 208297acfc78SBram Moolenaar catch 208397acfc78SBram Moolenaar caught = true 208497acfc78SBram Moolenaar assert_equal(100, x) 208597acfc78SBram Moolenaar endtry 208697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 208725859dd7SBram Moolenaar # consume the CTRL-C 208825859dd7SBram Moolenaar getchar(0) 20899645e2d9SBram Moolenaarenddef 209020431c9dSBram Moolenaar 20914fdae999SBram Moolenaardef Test_automatic_line_continuation() 2092cfcd011fSBram Moolenaar var mylist = [ 20934fdae999SBram Moolenaar 'one', 20944fdae999SBram Moolenaar 'two', 20954fdae999SBram Moolenaar 'three', 2096f5be8cdbSBram Moolenaar ] # comment 20974fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 20984fdae999SBram Moolenaar 2099cfcd011fSBram Moolenaar var mydict = { 2100e0de171eSBram Moolenaar ['one']: 1, 2101e0de171eSBram Moolenaar ['two']: 2, 2102e0de171eSBram Moolenaar ['three']: 21034fdae999SBram Moolenaar 3, 2104f5be8cdbSBram Moolenaar } # comment 2105e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2106e0de171eSBram Moolenaar mydict = { 21072c330432SBram Moolenaar one: 1, # comment 21082c330432SBram Moolenaar two: # comment 21092c330432SBram Moolenaar 2, # comment 21102c330432SBram Moolenaar three: 3 # comment 21112c330432SBram Moolenaar } 2112e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2113e0de171eSBram Moolenaar mydict = { 21142c330432SBram Moolenaar one: 1, 21154fdae999SBram Moolenaar two: 21164fdae999SBram Moolenaar 2, 21172c330432SBram Moolenaar three: 3 21184fdae999SBram Moolenaar } 2119e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2120e6085c53SBram Moolenaar 2121e6085c53SBram Moolenaar assert_equal( 2122e6085c53SBram Moolenaar ['one', 'two', 'three'], 2123e6085c53SBram Moolenaar split('one two three') 2124e6085c53SBram Moolenaar ) 21254fdae999SBram Moolenaarenddef 21264fdae999SBram Moolenaar 21277a092245SBram Moolenaardef Test_vim9_comment() 21287a092245SBram Moolenaar CheckScriptSuccess([ 21297a092245SBram Moolenaar 'vim9script', 21307a092245SBram Moolenaar '# something', 213193f82cbeSBram Moolenaar '#something', 213293f82cbeSBram Moolenaar '#{something', 21337a092245SBram Moolenaar ]) 213493f82cbeSBram Moolenaar 213593f82cbeSBram Moolenaar split Xfile 213693f82cbeSBram Moolenaar CheckScriptSuccess([ 213793f82cbeSBram Moolenaar 'vim9script', 213893f82cbeSBram Moolenaar 'edit #something', 213993f82cbeSBram Moolenaar ]) 214093f82cbeSBram Moolenaar CheckScriptSuccess([ 214193f82cbeSBram Moolenaar 'vim9script', 214293f82cbeSBram Moolenaar 'edit #{something', 214393f82cbeSBram Moolenaar ]) 214493f82cbeSBram Moolenaar close 214593f82cbeSBram Moolenaar 21467a092245SBram Moolenaar CheckScriptFailure([ 21477a092245SBram Moolenaar 'vim9script', 21487a092245SBram Moolenaar ':# something', 21497a092245SBram Moolenaar ], 'E488:') 21507a092245SBram Moolenaar CheckScriptFailure([ 21517a092245SBram Moolenaar '# something', 21527a092245SBram Moolenaar ], 'E488:') 21537a092245SBram Moolenaar CheckScriptFailure([ 21547a092245SBram Moolenaar ':# something', 21557a092245SBram Moolenaar ], 'E488:') 21567a092245SBram Moolenaar 21574a8d9f2eSBram Moolenaar { # block start 21584a8d9f2eSBram Moolenaar } # block end 21594a8d9f2eSBram Moolenaar CheckDefFailure([ 21604a8d9f2eSBram Moolenaar '{# comment', 21614a8d9f2eSBram Moolenaar ], 'E488:') 21624a8d9f2eSBram Moolenaar CheckDefFailure([ 21634a8d9f2eSBram Moolenaar '{', 21644a8d9f2eSBram Moolenaar '}# comment', 21654a8d9f2eSBram Moolenaar ], 'E488:') 21664a8d9f2eSBram Moolenaar 21674a8d9f2eSBram Moolenaar echo "yes" # comment 21684a8d9f2eSBram Moolenaar CheckDefFailure([ 21694a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21704a8d9f2eSBram Moolenaar ], 'E488:') 21717a092245SBram Moolenaar CheckScriptSuccess([ 21727a092245SBram Moolenaar 'vim9script', 21737a092245SBram Moolenaar 'echo "yes" # something', 21747a092245SBram Moolenaar ]) 21757a092245SBram Moolenaar CheckScriptFailure([ 21767a092245SBram Moolenaar 'vim9script', 21777a092245SBram Moolenaar 'echo "yes"# something', 21787a092245SBram Moolenaar ], 'E121:') 21797a092245SBram Moolenaar CheckScriptFailure([ 21807a092245SBram Moolenaar 'vim9script', 21817a092245SBram Moolenaar 'echo# something', 2182f8103f27SBram Moolenaar ], 'E1144:') 21837a092245SBram Moolenaar CheckScriptFailure([ 21847a092245SBram Moolenaar 'echo "yes" # something', 21857a092245SBram Moolenaar ], 'E121:') 21867a092245SBram Moolenaar 21874a8d9f2eSBram Moolenaar exe "echo" # comment 21884a8d9f2eSBram Moolenaar CheckDefFailure([ 21894a8d9f2eSBram Moolenaar 'exe "echo"# comment', 21904a8d9f2eSBram Moolenaar ], 'E488:') 21914a8d9f2eSBram Moolenaar CheckScriptSuccess([ 21924a8d9f2eSBram Moolenaar 'vim9script', 21934a8d9f2eSBram Moolenaar 'exe "echo" # something', 21944a8d9f2eSBram Moolenaar ]) 21954a8d9f2eSBram Moolenaar CheckScriptFailure([ 21964a8d9f2eSBram Moolenaar 'vim9script', 21974a8d9f2eSBram Moolenaar 'exe "echo"# something', 21984a8d9f2eSBram Moolenaar ], 'E121:') 21994a8d9f2eSBram Moolenaar CheckScriptFailure([ 22004a8d9f2eSBram Moolenaar 'vim9script', 22014a8d9f2eSBram Moolenaar 'exe# something', 2202f8103f27SBram Moolenaar ], 'E1144:') 22034a8d9f2eSBram Moolenaar CheckScriptFailure([ 22044a8d9f2eSBram Moolenaar 'exe "echo" # something', 22054a8d9f2eSBram Moolenaar ], 'E121:') 22064a8d9f2eSBram Moolenaar 22077a092245SBram Moolenaar CheckDefFailure([ 22087a092245SBram Moolenaar 'try# comment', 22097a092245SBram Moolenaar ' echo "yes"', 22107a092245SBram Moolenaar 'catch', 22117a092245SBram Moolenaar 'endtry', 2212f8103f27SBram Moolenaar ], 'E1144:') 22132c5ed4e3SBram Moolenaar CheckScriptFailure([ 22142c5ed4e3SBram Moolenaar 'vim9script', 22152c5ed4e3SBram Moolenaar 'try# comment', 22162c5ed4e3SBram Moolenaar 'echo "yes"', 2217f8103f27SBram Moolenaar ], 'E1144:') 22187a092245SBram Moolenaar CheckDefFailure([ 22197a092245SBram Moolenaar 'try', 2220a72cfb80SBram Moolenaar ' throw#comment', 2221a72cfb80SBram Moolenaar 'catch', 2222a72cfb80SBram Moolenaar 'endtry', 2223f8103f27SBram Moolenaar ], 'E1144:') 2224a72cfb80SBram Moolenaar CheckDefFailure([ 2225a72cfb80SBram Moolenaar 'try', 2226a72cfb80SBram Moolenaar ' throw "yes"#comment', 2227a72cfb80SBram Moolenaar 'catch', 2228a72cfb80SBram Moolenaar 'endtry', 2229a72cfb80SBram Moolenaar ], 'E488:') 2230a72cfb80SBram Moolenaar CheckDefFailure([ 2231a72cfb80SBram Moolenaar 'try', 22327a092245SBram Moolenaar ' echo "yes"', 22337a092245SBram Moolenaar 'catch# comment', 22347a092245SBram Moolenaar 'endtry', 2235f8103f27SBram Moolenaar ], 'E1144:') 22362c5ed4e3SBram Moolenaar CheckScriptFailure([ 22372c5ed4e3SBram Moolenaar 'vim9script', 22382c5ed4e3SBram Moolenaar 'try', 22392c5ed4e3SBram Moolenaar ' echo "yes"', 22402c5ed4e3SBram Moolenaar 'catch# comment', 22412c5ed4e3SBram Moolenaar 'endtry', 2242f8103f27SBram Moolenaar ], 'E1144:') 22432c5ed4e3SBram Moolenaar CheckDefFailure([ 22442c5ed4e3SBram Moolenaar 'try', 22452c5ed4e3SBram Moolenaar ' echo "yes"', 22462c5ed4e3SBram Moolenaar 'catch /pat/# comment', 22472c5ed4e3SBram Moolenaar 'endtry', 22482c5ed4e3SBram Moolenaar ], 'E488:') 22497a092245SBram Moolenaar CheckDefFailure([ 22507a092245SBram Moolenaar 'try', 22517a092245SBram Moolenaar 'echo "yes"', 22527a092245SBram Moolenaar 'catch', 22537a092245SBram Moolenaar 'endtry# comment', 2254f8103f27SBram Moolenaar ], 'E1144:') 22552c5ed4e3SBram Moolenaar CheckScriptFailure([ 22562c5ed4e3SBram Moolenaar 'vim9script', 22572c5ed4e3SBram Moolenaar 'try', 22582c5ed4e3SBram Moolenaar ' echo "yes"', 22592c5ed4e3SBram Moolenaar 'catch', 22602c5ed4e3SBram Moolenaar 'endtry# comment', 2261f8103f27SBram Moolenaar ], 'E1144:') 22622c5ed4e3SBram Moolenaar 22632c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22642c5ed4e3SBram Moolenaar 'vim9script', 22652c5ed4e3SBram Moolenaar 'hi # comment', 22662c5ed4e3SBram Moolenaar ]) 22672c5ed4e3SBram Moolenaar CheckScriptFailure([ 22682c5ed4e3SBram Moolenaar 'vim9script', 22692c5ed4e3SBram Moolenaar 'hi# comment', 2270f8103f27SBram Moolenaar ], 'E1144:') 22711966c248SBram Moolenaar CheckScriptSuccess([ 22721966c248SBram Moolenaar 'vim9script', 22731966c248SBram Moolenaar 'hi Search # comment', 22741966c248SBram Moolenaar ]) 22751966c248SBram Moolenaar CheckScriptFailure([ 22761966c248SBram Moolenaar 'vim9script', 22771966c248SBram Moolenaar 'hi Search# comment', 22781966c248SBram Moolenaar ], 'E416:') 22791966c248SBram Moolenaar CheckScriptSuccess([ 22801966c248SBram Moolenaar 'vim9script', 22811966c248SBram Moolenaar 'hi link This Search # comment', 22821966c248SBram Moolenaar ]) 22831966c248SBram Moolenaar CheckScriptFailure([ 22841966c248SBram Moolenaar 'vim9script', 22851966c248SBram Moolenaar 'hi link This That# comment', 22861966c248SBram Moolenaar ], 'E413:') 22871966c248SBram Moolenaar CheckScriptSuccess([ 22881966c248SBram Moolenaar 'vim9script', 22891966c248SBram Moolenaar 'hi clear This # comment', 22901966c248SBram Moolenaar 'hi clear # comment', 22911966c248SBram Moolenaar ]) 2292f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2293f5be8cdbSBram Moolenaar # hi clear This# comment', 22941966c248SBram Moolenaar CheckScriptFailure([ 22951966c248SBram Moolenaar 'vim9script', 22961966c248SBram Moolenaar 'hi clear# comment', 22971966c248SBram Moolenaar ], 'E416:') 22981966c248SBram Moolenaar 22991966c248SBram Moolenaar CheckScriptSuccess([ 23001966c248SBram Moolenaar 'vim9script', 23011966c248SBram Moolenaar 'hi Group term=bold', 23021966c248SBram Moolenaar 'match Group /todo/ # comment', 23031966c248SBram Moolenaar ]) 23041966c248SBram Moolenaar CheckScriptFailure([ 23051966c248SBram Moolenaar 'vim9script', 23061966c248SBram Moolenaar 'hi Group term=bold', 23071966c248SBram Moolenaar 'match Group /todo/# comment', 23081966c248SBram Moolenaar ], 'E488:') 23091966c248SBram Moolenaar CheckScriptSuccess([ 23101966c248SBram Moolenaar 'vim9script', 23111966c248SBram Moolenaar 'match # comment', 23121966c248SBram Moolenaar ]) 23131966c248SBram Moolenaar CheckScriptFailure([ 23141966c248SBram Moolenaar 'vim9script', 23151966c248SBram Moolenaar 'match# comment', 2316f8103f27SBram Moolenaar ], 'E1144:') 23171966c248SBram Moolenaar CheckScriptSuccess([ 23181966c248SBram Moolenaar 'vim9script', 23191966c248SBram Moolenaar 'match none # comment', 23201966c248SBram Moolenaar ]) 23211966c248SBram Moolenaar CheckScriptFailure([ 23221966c248SBram Moolenaar 'vim9script', 23231966c248SBram Moolenaar 'match none# comment', 23241966c248SBram Moolenaar ], 'E475:') 23251966c248SBram Moolenaar 23261966c248SBram Moolenaar CheckScriptSuccess([ 23271966c248SBram Moolenaar 'vim9script', 23281966c248SBram Moolenaar 'menutrans clear # comment', 23291966c248SBram Moolenaar ]) 23301966c248SBram Moolenaar CheckScriptFailure([ 23311966c248SBram Moolenaar 'vim9script', 23321966c248SBram Moolenaar 'menutrans clear# comment text', 23331966c248SBram Moolenaar ], 'E474:') 23341966c248SBram Moolenaar 23351966c248SBram Moolenaar CheckScriptSuccess([ 23361966c248SBram Moolenaar 'vim9script', 23371966c248SBram Moolenaar 'syntax clear # comment', 23381966c248SBram Moolenaar ]) 23391966c248SBram Moolenaar CheckScriptFailure([ 23401966c248SBram Moolenaar 'vim9script', 23411966c248SBram Moolenaar 'syntax clear# comment text', 23421966c248SBram Moolenaar ], 'E28:') 23431966c248SBram Moolenaar CheckScriptSuccess([ 23441966c248SBram Moolenaar 'vim9script', 23451966c248SBram Moolenaar 'syntax keyword Word some', 23461966c248SBram Moolenaar 'syntax clear Word # comment', 23471966c248SBram Moolenaar ]) 23481966c248SBram Moolenaar CheckScriptFailure([ 23491966c248SBram Moolenaar 'vim9script', 23501966c248SBram Moolenaar 'syntax keyword Word some', 23511966c248SBram Moolenaar 'syntax clear Word# comment text', 23521966c248SBram Moolenaar ], 'E28:') 23531966c248SBram Moolenaar 23541966c248SBram Moolenaar CheckScriptSuccess([ 23551966c248SBram Moolenaar 'vim9script', 23561966c248SBram Moolenaar 'syntax list # comment', 23571966c248SBram Moolenaar ]) 23581966c248SBram Moolenaar CheckScriptFailure([ 23591966c248SBram Moolenaar 'vim9script', 23601966c248SBram Moolenaar 'syntax list# comment text', 23611966c248SBram Moolenaar ], 'E28:') 23621966c248SBram Moolenaar 23631966c248SBram Moolenaar CheckScriptSuccess([ 23641966c248SBram Moolenaar 'vim9script', 23651966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23661966c248SBram Moolenaar ]) 23671966c248SBram Moolenaar CheckScriptFailure([ 23681966c248SBram Moolenaar 'vim9script', 23691966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23701966c248SBram Moolenaar ], 'E475:') 23711966c248SBram Moolenaar 23721966c248SBram Moolenaar CheckScriptSuccess([ 23731966c248SBram Moolenaar 'vim9script', 23741966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23751966c248SBram Moolenaar ]) 23761966c248SBram Moolenaar CheckScriptFailure([ 23771966c248SBram Moolenaar 'vim9script', 23781966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 23791966c248SBram Moolenaar ], 'E789:') 23801966c248SBram Moolenaar 23811966c248SBram Moolenaar CheckScriptSuccess([ 23821966c248SBram Moolenaar 'vim9script', 23831966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 23841966c248SBram Moolenaar ]) 23851966c248SBram Moolenaar CheckScriptFailure([ 23861966c248SBram Moolenaar 'vim9script', 23871966c248SBram Moolenaar 'syntax match Word /pat/# comment', 23881966c248SBram Moolenaar ], 'E402:') 23891966c248SBram Moolenaar 23901966c248SBram Moolenaar CheckScriptSuccess([ 23911966c248SBram Moolenaar 'vim9script', 23921966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 23931966c248SBram Moolenaar ]) 23941966c248SBram Moolenaar CheckScriptFailure([ 23951966c248SBram Moolenaar 'vim9script', 23961966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 23971966c248SBram Moolenaar ], 'E475:') 23981966c248SBram Moolenaar CheckScriptFailure([ 23991966c248SBram Moolenaar 'vim9script', 24001966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 24011966c248SBram Moolenaar ], 'E406:') 24021966c248SBram Moolenaar CheckScriptFailure([ 24031966c248SBram Moolenaar 'vim9script', 24041966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 24051966c248SBram Moolenaar ], 'E475:') 24061966c248SBram Moolenaar 24071966c248SBram Moolenaar CheckScriptSuccess([ 24081966c248SBram Moolenaar 'vim9script', 24091966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 24101966c248SBram Moolenaar ]) 24111966c248SBram Moolenaar CheckScriptFailure([ 24121966c248SBram Moolenaar 'vim9script', 24131966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2414d032f34aSBram Moolenaar ], 'E402:') 24151966c248SBram Moolenaar 24161966c248SBram Moolenaar CheckScriptSuccess([ 24171966c248SBram Moolenaar 'vim9script', 24181966c248SBram Moolenaar 'syntax sync # comment', 24191966c248SBram Moolenaar ]) 24201966c248SBram Moolenaar CheckScriptFailure([ 24211966c248SBram Moolenaar 'vim9script', 24221966c248SBram Moolenaar 'syntax sync# comment', 24231966c248SBram Moolenaar ], 'E404:') 24241966c248SBram Moolenaar CheckScriptSuccess([ 24251966c248SBram Moolenaar 'vim9script', 24261966c248SBram Moolenaar 'syntax sync ccomment # comment', 24271966c248SBram Moolenaar ]) 24281966c248SBram Moolenaar CheckScriptFailure([ 24291966c248SBram Moolenaar 'vim9script', 24301966c248SBram Moolenaar 'syntax sync ccomment# comment', 24311966c248SBram Moolenaar ], 'E404:') 24321966c248SBram Moolenaar 24331966c248SBram Moolenaar CheckScriptSuccess([ 24341966c248SBram Moolenaar 'vim9script', 24351966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 24361966c248SBram Moolenaar ]) 24371966c248SBram Moolenaar CheckScriptFailure([ 24381966c248SBram Moolenaar 'vim9script', 24391966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 24401966c248SBram Moolenaar ], 'E475:') 2441a72cfb80SBram Moolenaar 2442a72cfb80SBram Moolenaar CheckScriptSuccess([ 2443a72cfb80SBram Moolenaar 'vim9script', 2444a72cfb80SBram Moolenaar 'command Echo echo # comment', 2445a72cfb80SBram Moolenaar 'command Echo # comment', 24462d870f8dSBram Moolenaar 'delcommand Echo', 2447a72cfb80SBram Moolenaar ]) 2448a72cfb80SBram Moolenaar CheckScriptFailure([ 2449a72cfb80SBram Moolenaar 'vim9script', 2450a72cfb80SBram Moolenaar 'command Echo echo# comment', 2451a72cfb80SBram Moolenaar 'Echo', 2452f8103f27SBram Moolenaar ], 'E1144:') 24532d870f8dSBram Moolenaar delcommand Echo 245470249ee8SBram Moolenaar 245570249ee8SBram Moolenaar var curdir = getcwd() 245670249ee8SBram Moolenaar CheckScriptSuccess([ 245770249ee8SBram Moolenaar 'command Echo cd " comment', 245870249ee8SBram Moolenaar 'Echo', 245970249ee8SBram Moolenaar 'delcommand Echo', 246070249ee8SBram Moolenaar ]) 246170249ee8SBram Moolenaar CheckScriptSuccess([ 2462090728adSBram Moolenaar 'vim9script', 246370249ee8SBram Moolenaar 'command Echo cd # comment', 246470249ee8SBram Moolenaar 'Echo', 246570249ee8SBram Moolenaar 'delcommand Echo', 246670249ee8SBram Moolenaar ]) 246770249ee8SBram Moolenaar CheckScriptFailure([ 246870249ee8SBram Moolenaar 'vim9script', 246970249ee8SBram Moolenaar 'command Echo cd " comment', 247070249ee8SBram Moolenaar 'Echo', 247170249ee8SBram Moolenaar ], 'E344:') 247270249ee8SBram Moolenaar delcommand Echo 247370249ee8SBram Moolenaar chdir(curdir) 247470249ee8SBram Moolenaar 2475a72cfb80SBram Moolenaar CheckScriptFailure([ 2476a72cfb80SBram Moolenaar 'vim9script', 2477a72cfb80SBram Moolenaar 'command Echo# comment', 2478a72cfb80SBram Moolenaar ], 'E182:') 2479a72cfb80SBram Moolenaar CheckScriptFailure([ 2480a72cfb80SBram Moolenaar 'vim9script', 2481a72cfb80SBram Moolenaar 'command Echo echo', 2482a72cfb80SBram Moolenaar 'command Echo# comment', 2483a72cfb80SBram Moolenaar ], 'E182:') 24842d870f8dSBram Moolenaar delcommand Echo 2485a72cfb80SBram Moolenaar 2486a72cfb80SBram Moolenaar CheckScriptSuccess([ 2487a72cfb80SBram Moolenaar 'vim9script', 2488a72cfb80SBram Moolenaar 'function # comment', 2489a72cfb80SBram Moolenaar ]) 2490a72cfb80SBram Moolenaar CheckScriptFailure([ 2491a72cfb80SBram Moolenaar 'vim9script', 24929898107fSBram Moolenaar 'function " comment', 24939898107fSBram Moolenaar ], 'E129:') 24949898107fSBram Moolenaar CheckScriptFailure([ 24959898107fSBram Moolenaar 'vim9script', 2496a72cfb80SBram Moolenaar 'function# comment', 2497f8103f27SBram Moolenaar ], 'E1144:') 2498a72cfb80SBram Moolenaar CheckScriptSuccess([ 2499a72cfb80SBram Moolenaar 'vim9script', 2500a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2501a72cfb80SBram Moolenaar ]) 2502a72cfb80SBram Moolenaar CheckScriptFailure([ 2503a72cfb80SBram Moolenaar 'vim9script', 2504a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2505a72cfb80SBram Moolenaar ], 'E488:') 2506a72cfb80SBram Moolenaar 2507a72cfb80SBram Moolenaar CheckScriptSuccess([ 2508a72cfb80SBram Moolenaar 'vim9script', 25094c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2510a72cfb80SBram Moolenaar 'endfunc', 25114c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2512a72cfb80SBram Moolenaar ]) 2513a72cfb80SBram Moolenaar CheckScriptFailure([ 2514a72cfb80SBram Moolenaar 'vim9script', 25154c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2516a72cfb80SBram Moolenaar 'endfunc', 25174c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2518a72cfb80SBram Moolenaar ], 'E488:') 2519a72cfb80SBram Moolenaar 2520a72cfb80SBram Moolenaar CheckScriptSuccess([ 2521a72cfb80SBram Moolenaar 'vim9script', 2522a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2523a72cfb80SBram Moolenaar ]) 2524a72cfb80SBram Moolenaar CheckScriptFailure([ 2525a72cfb80SBram Moolenaar 'vim9script', 2526a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2527a72cfb80SBram Moolenaar ], 'E488:') 2528e7e4838fSBram Moolenaar 2529e7e4838fSBram Moolenaar CheckScriptFailure([ 2530e7e4838fSBram Moolenaar 'def Test() " comment', 2531e7e4838fSBram Moolenaar 'enddef', 2532e7e4838fSBram Moolenaar ], 'E488:') 2533e7e4838fSBram Moolenaar CheckScriptFailure([ 2534e7e4838fSBram Moolenaar 'vim9script', 2535e7e4838fSBram Moolenaar 'def Test() " comment', 2536e7e4838fSBram Moolenaar 'enddef', 2537e7e4838fSBram Moolenaar ], 'E488:') 2538e7e4838fSBram Moolenaar 2539e7e4838fSBram Moolenaar CheckScriptSuccess([ 2540e7e4838fSBram Moolenaar 'func Test() " comment', 2541e7e4838fSBram Moolenaar 'endfunc', 25422d870f8dSBram Moolenaar 'delfunc Test', 2543e7e4838fSBram Moolenaar ]) 25449898107fSBram Moolenaar CheckScriptSuccess([ 2545e7e4838fSBram Moolenaar 'vim9script', 2546e7e4838fSBram Moolenaar 'func Test() " comment', 2547e7e4838fSBram Moolenaar 'endfunc', 25489898107fSBram Moolenaar ]) 2549e7e4838fSBram Moolenaar 2550e7e4838fSBram Moolenaar CheckScriptSuccess([ 2551e7e4838fSBram Moolenaar 'def Test() # comment', 2552e7e4838fSBram Moolenaar 'enddef', 2553e7e4838fSBram Moolenaar ]) 2554e7e4838fSBram Moolenaar CheckScriptFailure([ 2555e7e4838fSBram Moolenaar 'func Test() # comment', 2556e7e4838fSBram Moolenaar 'endfunc', 2557e7e4838fSBram Moolenaar ], 'E488:') 25582c5ed4e3SBram Moolenaarenddef 25592c5ed4e3SBram Moolenaar 25602c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25612c5ed4e3SBram Moolenaar CheckCanRunGui 25622c5ed4e3SBram Moolenaar 25632c5ed4e3SBram Moolenaar CheckScriptFailure([ 25642c5ed4e3SBram Moolenaar 'vim9script', 25652c5ed4e3SBram Moolenaar 'gui#comment' 2566f8103f27SBram Moolenaar ], 'E1144:') 25672c5ed4e3SBram Moolenaar CheckScriptFailure([ 25682c5ed4e3SBram Moolenaar 'vim9script', 25692c5ed4e3SBram Moolenaar 'gui -f#comment' 25702c5ed4e3SBram Moolenaar ], 'E499:') 25717a092245SBram Moolenaarenddef 25727a092245SBram Moolenaar 2573a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 25746797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 25756797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2576a26b9700SBram Moolenaar 2577a26b9700SBram Moolenaar edit test.vim 2578a26b9700SBram Moolenaar doautocmd TabEnter #comment 2579a26b9700SBram Moolenaar assert_equal(1, g:entered) 2580a26b9700SBram Moolenaar 2581a26b9700SBram Moolenaar doautocmd TabEnter f.x 2582a26b9700SBram Moolenaar assert_equal(2, g:entered) 2583a26b9700SBram Moolenaar 2584a26b9700SBram Moolenaar g:entered = 0 2585a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2586a26b9700SBram Moolenaar assert_equal(2, g:entered) 2587a26b9700SBram Moolenaar 2588a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2589a26b9700SBram Moolenaar 2590a26b9700SBram Moolenaar au! TabEnter 2591a26b9700SBram Moolenaar unlet g:entered 2592d72c1bf0SBram Moolenaar 2593d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2594d72c1bf0SBram Moolenaar 'vim9script', 25956797966dSBram Moolenaar 'g:var = 123', 2596e55b1c09SBram Moolenaar 'b:var = 456', 2597e55b1c09SBram Moolenaar 'w:var = 777', 2598e55b1c09SBram Moolenaar 't:var = 888', 2599d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2600d72c1bf0SBram Moolenaar ]) 2601d72c1bf0SBram Moolenaar 2602d72c1bf0SBram Moolenaar CheckScriptFailure([ 2603d72c1bf0SBram Moolenaar 'vim9script', 2604cfcd011fSBram Moolenaar 'let var = 123', 2605cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2606cfcd011fSBram Moolenaar 2607cfcd011fSBram Moolenaar CheckScriptFailure([ 2608cfcd011fSBram Moolenaar 'vim9script', 2609cfcd011fSBram Moolenaar 'var g:var = 123', 2610e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2611e55b1c09SBram Moolenaar 2612e55b1c09SBram Moolenaar CheckScriptFailure([ 2613e55b1c09SBram Moolenaar 'vim9script', 2614cfcd011fSBram Moolenaar 'var b:var = 123', 2615e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2616e55b1c09SBram Moolenaar 2617e55b1c09SBram Moolenaar CheckScriptFailure([ 2618e55b1c09SBram Moolenaar 'vim9script', 2619cfcd011fSBram Moolenaar 'var w:var = 123', 2620e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2621e55b1c09SBram Moolenaar 2622e55b1c09SBram Moolenaar CheckScriptFailure([ 2623e55b1c09SBram Moolenaar 'vim9script', 2624cfcd011fSBram Moolenaar 'var t:var = 123', 2625e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2626e55b1c09SBram Moolenaar 2627e55b1c09SBram Moolenaar CheckScriptFailure([ 2628e55b1c09SBram Moolenaar 'vim9script', 2629cfcd011fSBram Moolenaar 'var v:version = 123', 2630e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2631e55b1c09SBram Moolenaar 2632e55b1c09SBram Moolenaar CheckScriptFailure([ 2633e55b1c09SBram Moolenaar 'vim9script', 2634cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2635e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 26366797966dSBram Moolenaar 26376797966dSBram Moolenaar CheckScriptFailure([ 26386797966dSBram Moolenaar 'vim9script', 26396797966dSBram Moolenaar 'g:var = 123', 264032e35117SBram Moolenaar 'unlet g:var# comment1', 2641d72c1bf0SBram Moolenaar ], 'E108:') 2642d72c1bf0SBram Moolenaar 2643d72c1bf0SBram Moolenaar CheckScriptFailure([ 2644d72c1bf0SBram Moolenaar 'let g:var = 123', 2645d72c1bf0SBram Moolenaar 'unlet g:var # something', 2646d72c1bf0SBram Moolenaar ], 'E488:') 2647faac4104SBram Moolenaar 2648faac4104SBram Moolenaar CheckScriptSuccess([ 2649faac4104SBram Moolenaar 'vim9script', 265032e35117SBram Moolenaar 'if 1 # comment2', 2651faac4104SBram Moolenaar ' echo "yes"', 2652faac4104SBram Moolenaar 'elseif 2 #comment', 2653faac4104SBram Moolenaar ' echo "no"', 2654faac4104SBram Moolenaar 'endif', 2655faac4104SBram Moolenaar ]) 2656faac4104SBram Moolenaar 2657faac4104SBram Moolenaar CheckScriptFailure([ 2658faac4104SBram Moolenaar 'vim9script', 265932e35117SBram Moolenaar 'if 1# comment3', 2660faac4104SBram Moolenaar ' echo "yes"', 2661faac4104SBram Moolenaar 'endif', 2662faac4104SBram Moolenaar ], 'E15:') 2663faac4104SBram Moolenaar 2664faac4104SBram Moolenaar CheckScriptFailure([ 2665faac4104SBram Moolenaar 'vim9script', 266632e35117SBram Moolenaar 'if 0 # comment4', 2667faac4104SBram Moolenaar ' echo "yes"', 2668faac4104SBram Moolenaar 'elseif 2#comment', 2669faac4104SBram Moolenaar ' echo "no"', 2670faac4104SBram Moolenaar 'endif', 2671faac4104SBram Moolenaar ], 'E15:') 2672faac4104SBram Moolenaar 2673faac4104SBram Moolenaar CheckScriptSuccess([ 2674faac4104SBram Moolenaar 'vim9script', 2675cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2676faac4104SBram Moolenaar ]) 2677faac4104SBram Moolenaar 2678faac4104SBram Moolenaar CheckScriptFailure([ 2679faac4104SBram Moolenaar 'vim9script', 2680cfcd011fSBram Moolenaar 'var v = 1# comment6', 268132e35117SBram Moolenaar ], 'E15:') 2682faac4104SBram Moolenaar 2683faac4104SBram Moolenaar CheckScriptSuccess([ 2684faac4104SBram Moolenaar 'vim9script', 2685faac4104SBram Moolenaar 'new' 2686d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2687df069eecSBram Moolenaar ':$', 2688faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2689faac4104SBram Moolenaar 'bwipe!', 2690faac4104SBram Moolenaar ]) 2691faac4104SBram Moolenaar 2692f5be8cdbSBram Moolenaar CheckScriptFailure([ 2693f5be8cdbSBram Moolenaar 'vim9script', 2694f5be8cdbSBram Moolenaar 'new' 2695d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2696f5be8cdbSBram Moolenaar ':$', 2697f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2698f5be8cdbSBram Moolenaar 'bwipe!', 2699f5be8cdbSBram Moolenaar ], 'E488:') 2700f5be8cdbSBram Moolenaar 2701f5be8cdbSBram Moolenaar CheckScriptFailure([ 2702f5be8cdbSBram Moolenaar 'vim9script', 2703f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2704f5be8cdbSBram Moolenaar ], 'E477:') 2705a26b9700SBram Moolenaarenddef 2706a26b9700SBram Moolenaar 27077e5bd91dSBram Moolenaardef Test_finish() 2708cfcd011fSBram Moolenaar var lines =<< trim END 27097e5bd91dSBram Moolenaar vim9script 27106797966dSBram Moolenaar g:res = 'one' 27117e5bd91dSBram Moolenaar if v:false | finish | endif 27126797966dSBram Moolenaar g:res = 'two' 27137e5bd91dSBram Moolenaar finish 27146797966dSBram Moolenaar g:res = 'three' 27157e5bd91dSBram Moolenaar END 27167e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 27177e5bd91dSBram Moolenaar source Xfinished 27187e5bd91dSBram Moolenaar assert_equal('two', g:res) 27197e5bd91dSBram Moolenaar 27207e5bd91dSBram Moolenaar unlet g:res 27217e5bd91dSBram Moolenaar delete('Xfinished') 27227e5bd91dSBram Moolenaarenddef 27237e5bd91dSBram Moolenaar 2724a5d0077eSBram Moolenaardef Test_forward_declaration() 2725cfcd011fSBram Moolenaar var lines =<< trim END 2726a5d0077eSBram Moolenaar vim9script 2727a5d0077eSBram Moolenaar def GetValue(): string 2728a5d0077eSBram Moolenaar return theVal 2729a5d0077eSBram Moolenaar enddef 2730cfcd011fSBram Moolenaar var theVal = 'something' 2731822ba247SBram Moolenaar g:initVal = GetValue() 2732a5d0077eSBram Moolenaar theVal = 'else' 2733a5d0077eSBram Moolenaar g:laterVal = GetValue() 2734a5d0077eSBram Moolenaar END 2735a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2736a5d0077eSBram Moolenaar source Xforward 2737a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2738a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2739a5d0077eSBram Moolenaar 2740a5d0077eSBram Moolenaar unlet g:initVal 2741a5d0077eSBram Moolenaar unlet g:laterVal 2742a5d0077eSBram Moolenaar delete('Xforward') 2743a5d0077eSBram Moolenaarenddef 2744a5d0077eSBram Moolenaar 27459721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2746cfcd011fSBram Moolenaar var legacy_lines =<< trim END 27479721fb4eSBram Moolenaar source Xvim9_script.vim 27489721fb4eSBram Moolenaar 27499721fb4eSBram Moolenaar call assert_false(exists('local')) 27509721fb4eSBram Moolenaar call assert_false(exists('exported')) 27519721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 27529721fb4eSBram Moolenaar call assert_equal('global', global) 27539721fb4eSBram Moolenaar call assert_equal('global', g:global) 27549721fb4eSBram Moolenaar 27559721fb4eSBram Moolenaar " imported variable becomes script-local 27569721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 27579721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 27589721fb4eSBram Moolenaar call assert_false(exists('exported')) 27599721fb4eSBram Moolenaar 27609721fb4eSBram Moolenaar " imported function becomes script-local 27619721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 27629721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 27639721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 27649721fb4eSBram Moolenaar END 27659721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 27669721fb4eSBram Moolenaar 2767cfcd011fSBram Moolenaar var vim9_lines =<< trim END 27689721fb4eSBram Moolenaar vim9script 2769cfcd011fSBram Moolenaar var local = 'local' 27709721fb4eSBram Moolenaar g:global = 'global' 2771cfcd011fSBram Moolenaar export var exported = 'exported' 27729721fb4eSBram Moolenaar export def GetText(): string 27739721fb4eSBram Moolenaar return 'text' 27749721fb4eSBram Moolenaar enddef 27759721fb4eSBram Moolenaar END 27769721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 27779721fb4eSBram Moolenaar 27789721fb4eSBram Moolenaar source Xlegacy_script.vim 27799721fb4eSBram Moolenaar 27809721fb4eSBram Moolenaar assert_equal('global', g:global) 2781f5be8cdbSBram Moolenaar unlet g:global 27829721fb4eSBram Moolenaar 27839721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 27849721fb4eSBram Moolenaar delete('Xvim9_script.vim') 27859721fb4eSBram Moolenaarenddef 2786a5d0077eSBram Moolenaar 27877d699701SBram Moolenaarfunc Test_vim9script_not_global() 27887d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 27897d699701SBram Moolenaar let vim9lines =<< trim END 27907d699701SBram Moolenaar vim9script 2791cfcd011fSBram Moolenaar var name = 'local' 27927d699701SBram Moolenaar func TheFunc() 27937d699701SBram Moolenaar echo 'local' 27947d699701SBram Moolenaar endfunc 27957d699701SBram Moolenaar def DefFunc() 27967d699701SBram Moolenaar echo 'local' 27977d699701SBram Moolenaar enddef 27987d699701SBram Moolenaar END 27997d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 28007d699701SBram Moolenaar source Xvim9script.vim 28017d699701SBram Moolenaar try 28027d699701SBram Moolenaar echo g:var 28037d699701SBram Moolenaar assert_report('did not fail') 28047d699701SBram Moolenaar catch /E121:/ 28057d699701SBram Moolenaar " caught 28067d699701SBram Moolenaar endtry 28077d699701SBram Moolenaar try 28087d699701SBram Moolenaar call TheFunc() 28097d699701SBram Moolenaar assert_report('did not fail') 28107d699701SBram Moolenaar catch /E117:/ 28117d699701SBram Moolenaar " caught 28127d699701SBram Moolenaar endtry 28137d699701SBram Moolenaar try 28147d699701SBram Moolenaar call DefFunc() 28157d699701SBram Moolenaar assert_report('did not fail') 28167d699701SBram Moolenaar catch /E117:/ 28177d699701SBram Moolenaar " caught 28187d699701SBram Moolenaar endtry 28197d699701SBram Moolenaar 282025859dd7SBram Moolenaar call delete('Xvim9script.vim') 28217d699701SBram Moolenaarendfunc 28227d699701SBram Moolenaar 2823eeb27bfeSBram Moolenaardef Test_vim9_copen() 2824eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2825eeb27bfeSBram Moolenaar copen 2826eeb27bfeSBram Moolenaar quit 2827eeb27bfeSBram Moolenaarenddef 2828eeb27bfeSBram Moolenaar 282903290b84SBram Moolenaar" test using an auto-loaded function and variable 28302d6b20d6SBram Moolenaardef Test_vim9_autoload() 2831cfcd011fSBram Moolenaar var lines =<< trim END 28322d6b20d6SBram Moolenaar vim9script 283303290b84SBram Moolenaar def some#gettest(): string 283403290b84SBram Moolenaar return 'test' 283503290b84SBram Moolenaar enddef 283603290b84SBram Moolenaar g:some#name = 'name' 283703290b84SBram Moolenaar END 283803290b84SBram Moolenaar 283903290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 284003290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 284103290b84SBram Moolenaar var save_rtp = &rtp 284203290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 284303290b84SBram Moolenaar 284403290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 284503290b84SBram Moolenaar assert_equal('name', g:some#name) 284603290b84SBram Moolenaar g:some#other = 'other' 284703290b84SBram Moolenaar assert_equal('other', g:some#other) 284803290b84SBram Moolenaar 284917f700acSBram Moolenaar # upper case script name works 285017f700acSBram Moolenaar lines =<< trim END 285117f700acSBram Moolenaar vim9script 285217f700acSBram Moolenaar def Other#getOther(): string 285317f700acSBram Moolenaar return 'other' 285417f700acSBram Moolenaar enddef 285517f700acSBram Moolenaar END 285617f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 285717f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 285817f700acSBram Moolenaar 285903290b84SBram Moolenaar delete('Xdir', 'rf') 286003290b84SBram Moolenaar &rtp = save_rtp 286103290b84SBram Moolenaarenddef 286203290b84SBram Moolenaar 286303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 286403290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 286503290b84SBram Moolenaar var lines =<< trim END 286603290b84SBram Moolenaar vim9script 28672d6b20d6SBram Moolenaar def foo#test() 28682d6b20d6SBram Moolenaar echomsg getreg('"') 28692d6b20d6SBram Moolenaar enddef 28702d6b20d6SBram Moolenaar END 28712d6b20d6SBram Moolenaar 28722d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 28732d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2874cfcd011fSBram Moolenaar var save_rtp = &rtp 28752d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 28762d6b20d6SBram Moolenaar augroup test 28772d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 28782d6b20d6SBram Moolenaar augroup END 28792d6b20d6SBram Moolenaar 28802d6b20d6SBram Moolenaar normal Y 28812d6b20d6SBram Moolenaar 28822d6b20d6SBram Moolenaar augroup test 28832d6b20d6SBram Moolenaar autocmd! 28842d6b20d6SBram Moolenaar augroup END 28852d6b20d6SBram Moolenaar delete('Xdir', 'rf') 28862d6b20d6SBram Moolenaar &rtp = save_rtp 28872d6b20d6SBram Moolenaarenddef 28882d6b20d6SBram Moolenaar 288977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 289077e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2891cfcd011fSBram Moolenaar var lines =<< trim END 289277e5dcc3SBram Moolenaar vim9script 289377e5dcc3SBram Moolenaar def crash#func() 289477e5dcc3SBram Moolenaar try 289577e5dcc3SBram Moolenaar for x in List() 289677e5dcc3SBram Moolenaar endfor 289777e5dcc3SBram Moolenaar catch 289877e5dcc3SBram Moolenaar endtry 289977e5dcc3SBram Moolenaar g:ok = true 290077e5dcc3SBram Moolenaar enddef 290177e5dcc3SBram Moolenaar fu List() 290277e5dcc3SBram Moolenaar invalid 290377e5dcc3SBram Moolenaar endfu 290477e5dcc3SBram Moolenaar try 290577e5dcc3SBram Moolenaar invalid 290677e5dcc3SBram Moolenaar catch /wontmatch/ 290777e5dcc3SBram Moolenaar endtry 290877e5dcc3SBram Moolenaar END 290977e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 291077e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 291177e5dcc3SBram Moolenaar 291277e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 291377e5dcc3SBram Moolenaar lines =<< trim END 291477e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 291577e5dcc3SBram Moolenaar call crash#func() 291677e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 29179c4f5520SBram Moolenaar qall! 291877e5dcc3SBram Moolenaar END 291977e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 292077e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 292177e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 292277e5dcc3SBram Moolenaar 292377e5dcc3SBram Moolenaar delete('Xdidit') 292477e5dcc3SBram Moolenaar delete('Xscript') 292577e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 292603290b84SBram Moolenaar 292703290b84SBram Moolenaar lines =<< trim END 292803290b84SBram Moolenaar vim9script 292903290b84SBram Moolenaar var foo#bar = 'asdf' 293003290b84SBram Moolenaar END 293103290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 293277e5dcc3SBram Moolenaarenddef 293377e5dcc3SBram Moolenaar 293481e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 293581e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 293681e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2937cfcd011fSBram Moolenaar var lines =<< trim END 293881e17fbeSBram Moolenaar let s:counter = 1 293981e17fbeSBram Moolenaar def s:Func() 294081e17fbeSBram Moolenaar au! CursorHold 294181e17fbeSBram Moolenaar au CursorHold * s:counter += 1 294281e17fbeSBram Moolenaar enddef 294381e17fbeSBram Moolenaar call s:Func() 294481e17fbeSBram Moolenaar doau CursorHold 294581e17fbeSBram Moolenaar call assert_equal(2, s:counter) 294681e17fbeSBram Moolenaar au! CursorHold 294781e17fbeSBram Moolenaar END 294881e17fbeSBram Moolenaar CheckScriptSuccess(lines) 294981e17fbeSBram Moolenaarenddef 295081e17fbeSBram Moolenaar 29513896a105SBram Moolenaardef Test_cmdline_win() 29523896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 29533896a105SBram Moolenaar # the command line window. 29543896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2955cfcd011fSBram Moolenaar var export_lines =<< trim END 29563896a105SBram Moolenaar vim9script 2957cfcd011fSBram Moolenaar export var That = 'yes' 29583896a105SBram Moolenaar END 29593896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2960cfcd011fSBram Moolenaar var import_lines =<< trim END 29613896a105SBram Moolenaar vim9script 29623896a105SBram Moolenaar import That from './Xexport.vim' 29633896a105SBram Moolenaar END 29643896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2965cfcd011fSBram Moolenaar var save_rtp = &rtp 29663896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 29673896a105SBram Moolenaar syntax on 29683896a105SBram Moolenaar augroup CmdWin 29693896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 29703896a105SBram Moolenaar augroup END 29713896a105SBram Moolenaar # this will open and also close the cmdline window 29723896a105SBram Moolenaar feedkeys('q:', 'xt') 29733896a105SBram Moolenaar assert_equal('yes', g:got_there) 29743896a105SBram Moolenaar 29753896a105SBram Moolenaar augroup CmdWin 29763896a105SBram Moolenaar au! 29773896a105SBram Moolenaar augroup END 29783896a105SBram Moolenaar &rtp = save_rtp 29793896a105SBram Moolenaar delete('rtp', 'rf') 29803896a105SBram Moolenaarenddef 29813896a105SBram Moolenaar 2982e3d4685fSBram Moolenaardef Test_invalid_sid() 2983e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 298425859dd7SBram Moolenaar 29859c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2986d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2987e3d4685fSBram Moolenaar endif 2988e3d4685fSBram Moolenaar delete('Xdidit') 2989e3d4685fSBram Moolenaarenddef 2990e3d4685fSBram Moolenaar 29919ec7026fSBram Moolenaardef Test_restoring_cpo() 29929ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 29939ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 29949ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 29959ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 29969ec7026fSBram Moolenaar endif 29979ec7026fSBram Moolenaar delete('Xsourced') 29989ec7026fSBram Moolenaar delete('Xclose') 2999090728adSBram Moolenaar delete('Xdone') 30009ec7026fSBram Moolenaarenddef 30019ec7026fSBram Moolenaar 30029ec7026fSBram Moolenaar 3003f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3004cfcd011fSBram Moolenaar var lines =<< trim END 3005cfcd011fSBram Moolenaar var name: any 3006cfcd011fSBram Moolenaar assert_equal(0, name) 3007f0afd9e1SBram Moolenaar END 3008f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3009f0afd9e1SBram Moolenaarenddef 3010f0afd9e1SBram Moolenaar 30117e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 301258dbef33SBram Moolenaar CheckRunVimInTerminal 301358dbef33SBram Moolenaar 30147e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 30157e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 30167e9210eaSBram Moolenaarendfunc 30177e9210eaSBram Moolenaar 30187e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 30199c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3020cfcd011fSBram Moolenaar var lines =<< trim END 30219c4f5520SBram Moolenaar func CheckAndQuit() 30229c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 30239c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 30249c4f5520SBram Moolenaar endfunc 30259c4f5520SBram Moolenaar END 30269c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 30279c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3028e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 30299c4f5520SBram Moolenaar # define Afunc() on the command line 30309c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 30319c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 30329c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 30339c4f5520SBram Moolenaar 30349c4f5520SBram Moolenaar call StopVimInTerminal(buf) 30359c4f5520SBram Moolenaar delete('XcallFunc') 30369c4f5520SBram Moolenaar delete('Xdidcmd') 30379c4f5520SBram Moolenaarenddef 30389c4f5520SBram Moolenaar 3039fcdc5d83SBram Moolenaardef Test_script_var_scope() 3040fcdc5d83SBram Moolenaar var lines =<< trim END 3041fcdc5d83SBram Moolenaar vim9script 3042fcdc5d83SBram Moolenaar if true 3043fcdc5d83SBram Moolenaar if true 3044fcdc5d83SBram Moolenaar var one = 'one' 3045fcdc5d83SBram Moolenaar echo one 3046fcdc5d83SBram Moolenaar endif 3047fcdc5d83SBram Moolenaar echo one 3048fcdc5d83SBram Moolenaar endif 3049fcdc5d83SBram Moolenaar END 3050fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3051fcdc5d83SBram Moolenaar 3052fcdc5d83SBram Moolenaar lines =<< trim END 3053fcdc5d83SBram Moolenaar vim9script 3054fcdc5d83SBram Moolenaar if true 3055fcdc5d83SBram Moolenaar if false 3056fcdc5d83SBram Moolenaar var one = 'one' 3057fcdc5d83SBram Moolenaar echo one 3058fcdc5d83SBram Moolenaar else 3059fcdc5d83SBram Moolenaar var one = 'one' 3060fcdc5d83SBram Moolenaar echo one 3061fcdc5d83SBram Moolenaar endif 3062fcdc5d83SBram Moolenaar echo one 3063fcdc5d83SBram Moolenaar endif 3064fcdc5d83SBram Moolenaar END 3065fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3066fcdc5d83SBram Moolenaar 3067fcdc5d83SBram Moolenaar lines =<< trim END 3068fcdc5d83SBram Moolenaar vim9script 3069fcdc5d83SBram Moolenaar while true 3070fcdc5d83SBram Moolenaar var one = 'one' 3071fcdc5d83SBram Moolenaar echo one 3072fcdc5d83SBram Moolenaar break 3073fcdc5d83SBram Moolenaar endwhile 3074fcdc5d83SBram Moolenaar echo one 3075fcdc5d83SBram Moolenaar END 3076fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3077fcdc5d83SBram Moolenaar 3078fcdc5d83SBram Moolenaar lines =<< trim END 3079fcdc5d83SBram Moolenaar vim9script 3080fcdc5d83SBram Moolenaar for i in range(1) 3081fcdc5d83SBram Moolenaar var one = 'one' 3082fcdc5d83SBram Moolenaar echo one 3083fcdc5d83SBram Moolenaar endfor 3084fcdc5d83SBram Moolenaar echo one 3085fcdc5d83SBram Moolenaar END 3086fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 30879becdf2bSBram Moolenaar 30889becdf2bSBram Moolenaar lines =<< trim END 30899becdf2bSBram Moolenaar vim9script 30909becdf2bSBram Moolenaar { 30919becdf2bSBram Moolenaar var one = 'one' 30929becdf2bSBram Moolenaar assert_equal('one', one) 30939becdf2bSBram Moolenaar } 30949becdf2bSBram Moolenaar assert_false(exists('one')) 30959becdf2bSBram Moolenaar assert_false(exists('s:one')) 30969becdf2bSBram Moolenaar END 30979becdf2bSBram Moolenaar CheckScriptSuccess(lines) 30989becdf2bSBram Moolenaar 30999becdf2bSBram Moolenaar lines =<< trim END 31009becdf2bSBram Moolenaar vim9script 31019becdf2bSBram Moolenaar { 31029becdf2bSBram Moolenaar var one = 'one' 31039becdf2bSBram Moolenaar echo one 31049becdf2bSBram Moolenaar } 31059becdf2bSBram Moolenaar echo one 31069becdf2bSBram Moolenaar END 31079becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3108fcdc5d83SBram Moolenaarenddef 3109fcdc5d83SBram Moolenaar 3110352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3111352134bbSBram Moolenaar var lines =<< trim END 3112352134bbSBram Moolenaar vim9script 3113352134bbSBram Moolenaar def Callback(...l: any) 3114352134bbSBram Moolenaar try 3115352134bbSBram Moolenaar var x: string 3116352134bbSBram Moolenaar var y: string 3117352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3118352134bbSBram Moolenaar [x, y] = [''] 3119352134bbSBram Moolenaar catch 3120352134bbSBram Moolenaar g:caught = 'yes' 3121352134bbSBram Moolenaar endtry 3122352134bbSBram Moolenaar enddef 3123e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3124352134bbSBram Moolenaar feedkeys("\r", 'xt') 3125352134bbSBram Moolenaar END 3126352134bbSBram Moolenaar CheckScriptSuccess(lines) 3127352134bbSBram Moolenaar 3128352134bbSBram Moolenaar unlet g:caught 3129352134bbSBram Moolenaarenddef 3130352134bbSBram Moolenaar 3131631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3132631e8f93SBram Moolenaar if !has('unix') || !has('job') 3133631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3134631e8f93SBram Moolenaar endif 3135631e8f93SBram Moolenaar var lines =<< trim END 3136631e8f93SBram Moolenaar vim9script 3137631e8f93SBram Moolenaar var source: list<number> 3138631e8f93SBram Moolenaar def Out_cb(...l: any) 3139631e8f93SBram Moolenaar eval [][0] 3140631e8f93SBram Moolenaar enddef 3141631e8f93SBram Moolenaar def Exit_cb(...l: any) 3142631e8f93SBram Moolenaar sleep 1m 3143631e8f93SBram Moolenaar source += l 3144631e8f93SBram Moolenaar enddef 3145e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 31466f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 31476f17a3f0SBram Moolenaar sleep 10m 31486f17a3f0SBram Moolenaar endwhile 31496f17a3f0SBram Moolenaar sleep 10m 3150631e8f93SBram Moolenaar END 3151631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3152631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3153631e8f93SBram Moolenaar delete('Xdef') 3154631e8f93SBram Moolenaarenddef 3155631e8f93SBram Moolenaar 31564324d87aSBram Moolenaardef InvokeNormal() 31574324d87aSBram Moolenaar exe "norm! :m+1\r" 31584324d87aSBram Moolenaarenddef 31594324d87aSBram Moolenaar 31604324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 31614324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 31624324d87aSBram Moolenaar new 31634324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 31644324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 31654324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 31664324d87aSBram Moolenaar xunmap <F3> 3167b5b9480eSBram Moolenaarenddef 3168b5b9480eSBram Moolenaar 3169b5b9480eSBram Moolenaardef Test_white_space_after_command() 3170b5b9480eSBram Moolenaar var lines =<< trim END 3171b5b9480eSBram Moolenaar exit_cb: Func}) 3172b5b9480eSBram Moolenaar END 3173b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3174f8103f27SBram Moolenaar 3175f8103f27SBram Moolenaar lines =<< trim END 3176f8103f27SBram Moolenaar e# 3177f8103f27SBram Moolenaar END 3178f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 31794324d87aSBram Moolenaarenddef 31804324d87aSBram Moolenaar 31814aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 31824aab88d9SBram Moolenaar var lines =<< trim END 31834aab88d9SBram Moolenaar vim9script 31844aab88d9SBram Moolenaar if exists('g:guard') 31854aab88d9SBram Moolenaar finish 31864aab88d9SBram Moolenaar endif 31874aab88d9SBram Moolenaar g:guard = 1 31884aab88d9SBram Moolenaar var name = 'thename' 31894aab88d9SBram Moolenaar def g:GetName(): string 31904aab88d9SBram Moolenaar return name 31914aab88d9SBram Moolenaar enddef 31924aab88d9SBram Moolenaar def g:SetName(arg: string) 31934aab88d9SBram Moolenaar name = arg 31944aab88d9SBram Moolenaar enddef 31954aab88d9SBram Moolenaar END 31964aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 31974aab88d9SBram Moolenaar so XscriptTwice.vim 31984aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 31994aab88d9SBram Moolenaar g:SetName('newname') 32004aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 32014aab88d9SBram Moolenaar so XscriptTwice.vim 32024aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 32034aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 32044aab88d9SBram Moolenaar 32054aab88d9SBram Moolenaar delfunc g:GetName 32064aab88d9SBram Moolenaar delfunc g:SetName 32074aab88d9SBram Moolenaar delete('XscriptTwice.vim') 32084aab88d9SBram Moolenaar unlet g:guard 32094aab88d9SBram Moolenaarenddef 32104aab88d9SBram Moolenaar 32114aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 32124aab88d9SBram Moolenaar var exportlines =<< trim END 32134aab88d9SBram Moolenaar vim9script 32144aab88d9SBram Moolenaar if exists('g:guard') 32154aab88d9SBram Moolenaar finish 32164aab88d9SBram Moolenaar endif 32174aab88d9SBram Moolenaar g:guard = 1 32184aab88d9SBram Moolenaar export var name = 'someName' 32194aab88d9SBram Moolenaar END 32204aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 32214aab88d9SBram Moolenaar 32224aab88d9SBram Moolenaar var lines =<< trim END 32234aab88d9SBram Moolenaar vim9script 32244aab88d9SBram Moolenaar import name from './XexportScript.vim' 32254aab88d9SBram Moolenaar def g:GetName(): string 32264aab88d9SBram Moolenaar return name 32274aab88d9SBram Moolenaar enddef 32284aab88d9SBram Moolenaar END 32294aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 32304aab88d9SBram Moolenaar so XscriptImport.vim 32314aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 32324aab88d9SBram Moolenaar 32334aab88d9SBram Moolenaar so XexportScript.vim 32344aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 32354aab88d9SBram Moolenaar 32364aab88d9SBram Moolenaar delfunc g:GetName 32374aab88d9SBram Moolenaar delete('XexportScript.vim') 32384aab88d9SBram Moolenaar delete('XscriptImport.vim') 32394aab88d9SBram Moolenaar unlet g:guard 32404aab88d9SBram Moolenaarenddef 32414aab88d9SBram Moolenaar 3242585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3243585fea7bSBram Moolenaardef Test_substitute_cmd() 3244585fea7bSBram Moolenaar new 3245585fea7bSBram Moolenaar setline(1, 'something') 3246585fea7bSBram Moolenaar :substitute(some(other( 3247585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3248585fea7bSBram Moolenaar bwipe! 3249585fea7bSBram Moolenaar 3250f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3251cfcd011fSBram Moolenaar var lines =<< trim END 3252585fea7bSBram Moolenaar vim9script 3253585fea7bSBram Moolenaar new 3254585fea7bSBram Moolenaar setline(1, 'something') 3255585fea7bSBram Moolenaar :substitute(some(other( 3256585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3257585fea7bSBram Moolenaar bwipe! 3258585fea7bSBram Moolenaar END 3259585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3260585fea7bSBram Moolenaar source Xvim9lines 3261585fea7bSBram Moolenaar 3262585fea7bSBram Moolenaar delete('Xvim9lines') 3263585fea7bSBram Moolenaarenddef 3264585fea7bSBram Moolenaar 32658a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3266