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 3279e1d9e34SBram Moolenaardef Test_try_catch_throw() 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 36469f7050cSBram Moolenaar var done = 'no' 36569f7050cSBram Moolenaar if 0 36669f7050cSBram Moolenaar try | catch | endtry 36769f7050cSBram Moolenaar else 36869f7050cSBram Moolenaar done = 'yes' 36969f7050cSBram Moolenaar endif 37069f7050cSBram Moolenaar assert_equal('yes', done) 37169f7050cSBram Moolenaar 37269f7050cSBram Moolenaar done = 'no' 37369f7050cSBram Moolenaar if 1 37469f7050cSBram Moolenaar done = 'yes' 37569f7050cSBram Moolenaar else 37669f7050cSBram Moolenaar try | catch | endtry 37769f7050cSBram Moolenaar done = 'never' 37869f7050cSBram Moolenaar endif 37969f7050cSBram Moolenaar assert_equal('yes', done) 38069f7050cSBram Moolenaar 38169f7050cSBram Moolenaar if 1 38269f7050cSBram Moolenaar else 38369f7050cSBram Moolenaar try | catch /pat/ | endtry 38469f7050cSBram Moolenaar try | catch /pat/ 38569f7050cSBram Moolenaar endtry 38669f7050cSBram Moolenaar try 38769f7050cSBram Moolenaar catch /pat/ | endtry 38869f7050cSBram Moolenaar try 38969f7050cSBram Moolenaar catch /pat/ 39069f7050cSBram Moolenaar endtry 39169f7050cSBram Moolenaar endif 39269f7050cSBram Moolenaar 39368d130c6SBram Moolenaar try 394cc673e74SBram Moolenaar # string slice returns a string, not a number 39568d130c6SBram Moolenaar n = g:astring[3] 3965e654230SBram Moolenaar catch /E1012:/ 39768d130c6SBram Moolenaar n = 77 39868d130c6SBram Moolenaar endtry 39968d130c6SBram Moolenaar assert_equal(77, n) 40068d130c6SBram Moolenaar 40168d130c6SBram Moolenaar try 40268d130c6SBram Moolenaar n = l[g:astring] 4035e654230SBram Moolenaar catch /E1012:/ 40456acb094SBram Moolenaar n = 88 40568d130c6SBram Moolenaar endtry 40656acb094SBram Moolenaar assert_equal(88, n) 40768d130c6SBram Moolenaar 40868d130c6SBram Moolenaar try 40968d130c6SBram Moolenaar n = s:does_not_exist 41068d130c6SBram Moolenaar catch /E121:/ 411f0b9f43cSBram Moolenaar n = 111 412f0b9f43cSBram Moolenaar endtry 413f0b9f43cSBram Moolenaar assert_equal(111, n) 414f0b9f43cSBram Moolenaar 415f0b9f43cSBram Moolenaar try 416f0b9f43cSBram Moolenaar n = g:does_not_exist 417f0b9f43cSBram Moolenaar catch /E121:/ 41868d130c6SBram Moolenaar n = 121 41968d130c6SBram Moolenaar endtry 42068d130c6SBram Moolenaar assert_equal(121, n) 42168d130c6SBram Moolenaar 422e0de171eSBram Moolenaar var d = {one: 1} 42368d130c6SBram Moolenaar try 42468d130c6SBram Moolenaar n = d[g:astring] 42568d130c6SBram Moolenaar catch /E716:/ 42668d130c6SBram Moolenaar n = 222 42768d130c6SBram Moolenaar endtry 42868d130c6SBram Moolenaar assert_equal(222, n) 429f0b9f43cSBram Moolenaar 430f0b9f43cSBram Moolenaar try 431f0b9f43cSBram Moolenaar n = -g:astring 432f0b9f43cSBram Moolenaar catch /E39:/ 433f0b9f43cSBram Moolenaar n = 233 434f0b9f43cSBram Moolenaar endtry 435f0b9f43cSBram Moolenaar assert_equal(233, n) 436f0b9f43cSBram Moolenaar 437f0b9f43cSBram Moolenaar try 438f0b9f43cSBram Moolenaar n = +g:astring 439f0b9f43cSBram Moolenaar catch /E1030:/ 440f0b9f43cSBram Moolenaar n = 244 441f0b9f43cSBram Moolenaar endtry 442f0b9f43cSBram Moolenaar assert_equal(244, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = +g:alist 446f0b9f43cSBram Moolenaar catch /E745:/ 447f0b9f43cSBram Moolenaar n = 255 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(255, n) 450f0b9f43cSBram Moolenaar 451cfcd011fSBram Moolenaar var nd: dict<any> 452f0b9f43cSBram Moolenaar try 4532e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4542e5910bfSBram Moolenaar catch /E1105:/ 455f0b9f43cSBram Moolenaar n = 266 456f0b9f43cSBram Moolenaar endtry 457f0b9f43cSBram Moolenaar assert_equal(266, n) 458f0b9f43cSBram Moolenaar 459f0b9f43cSBram Moolenaar try 460f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 461f0b9f43cSBram Moolenaar catch /E1093:/ 462f0b9f43cSBram Moolenaar n = 277 463f0b9f43cSBram Moolenaar endtry 464f0b9f43cSBram Moolenaar assert_equal(277, n) 465f0b9f43cSBram Moolenaar 466e859312eSBram Moolenaar try 467e859312eSBram Moolenaar &ts = g:astring 4685e654230SBram Moolenaar catch /E1012:/ 469e859312eSBram Moolenaar n = 288 470e859312eSBram Moolenaar endtry 471e859312eSBram Moolenaar assert_equal(288, n) 472e859312eSBram Moolenaar 473e859312eSBram Moolenaar try 474e859312eSBram Moolenaar &backspace = 'asdf' 475e859312eSBram Moolenaar catch /E474:/ 476e859312eSBram Moolenaar n = 299 477e859312eSBram Moolenaar endtry 478e859312eSBram Moolenaar assert_equal(299, n) 479e859312eSBram Moolenaar 480e859312eSBram Moolenaar l = [1] 481e859312eSBram Moolenaar try 482e859312eSBram Moolenaar l[3] = 3 483e859312eSBram Moolenaar catch /E684:/ 484e859312eSBram Moolenaar n = 300 485e859312eSBram Moolenaar endtry 486e859312eSBram Moolenaar assert_equal(300, n) 487e859312eSBram Moolenaar 488e859312eSBram Moolenaar try 489e859312eSBram Moolenaar unlet g:does_not_exist 490e859312eSBram Moolenaar catch /E108:/ 491e859312eSBram Moolenaar n = 322 492e859312eSBram Moolenaar endtry 493e859312eSBram Moolenaar assert_equal(322, n) 494e859312eSBram Moolenaar 495e859312eSBram Moolenaar try 4962bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 497e859312eSBram Moolenaar catch /E721:/ 498e859312eSBram Moolenaar n = 333 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(333, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar l = DeletedFunc() 504e859312eSBram Moolenaar catch /E933:/ 505e859312eSBram Moolenaar n = 344 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(344, n) 508d032f34aSBram Moolenaar 509d032f34aSBram Moolenaar try 510d032f34aSBram Moolenaar echo len(v:true) 511d032f34aSBram Moolenaar catch /E701:/ 512d032f34aSBram Moolenaar n = 355 513d032f34aSBram Moolenaar endtry 514d032f34aSBram Moolenaar assert_equal(355, n) 515d032f34aSBram Moolenaar 516cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 517d032f34aSBram Moolenaar delfunc g:NoSuchFunc 518d032f34aSBram Moolenaar try 519d032f34aSBram Moolenaar echo P() 520d032f34aSBram Moolenaar catch /E117:/ 521d032f34aSBram Moolenaar n = 366 522d032f34aSBram Moolenaar endtry 523d032f34aSBram Moolenaar assert_equal(366, n) 524d032f34aSBram Moolenaar 525d032f34aSBram Moolenaar try 526d032f34aSBram Moolenaar echo g:NoSuchFunc() 527d032f34aSBram Moolenaar catch /E117:/ 528d032f34aSBram Moolenaar n = 377 529d032f34aSBram Moolenaar endtry 530d032f34aSBram Moolenaar assert_equal(377, n) 531d032f34aSBram Moolenaar 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo g:alist + 4 534d032f34aSBram Moolenaar catch /E745:/ 535d032f34aSBram Moolenaar n = 388 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(388, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo 4 + g:alist 541d032f34aSBram Moolenaar catch /E745:/ 542d032f34aSBram Moolenaar n = 399 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(399, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist.member 548d032f34aSBram Moolenaar catch /E715:/ 549d032f34aSBram Moolenaar n = 400 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(400, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo d.member 555d032f34aSBram Moolenaar catch /E716:/ 556d032f34aSBram Moolenaar n = 411 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(411, n) 559d9d7789bSBram Moolenaar 560d9d7789bSBram Moolenaar var counter = 0 561d9d7789bSBram Moolenaar for i in range(4) 562d9d7789bSBram Moolenaar try 563d9d7789bSBram Moolenaar eval [][0] 564d9d7789bSBram Moolenaar catch 565d9d7789bSBram Moolenaar endtry 566d9d7789bSBram Moolenaar counter += 1 567d9d7789bSBram Moolenaar endfor 568d9d7789bSBram Moolenaar assert_equal(4, counter) 5698a7d6542SBram Moolenaarenddef 5708a7d6542SBram Moolenaar 5711430ceebSBram Moolenaardef Test_cnext_works_in_catch() 5721430ceebSBram Moolenaar var lines =<< trim END 5731430ceebSBram Moolenaar vim9script 5741430ceebSBram Moolenaar au BufEnter * eval 0 5751430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 5761430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 5771430ceebSBram Moolenaar var items = [ 5781430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 5791430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 5801430ceebSBram Moolenaar ] 5811430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 5821430ceebSBram Moolenaar cwindow 5831430ceebSBram Moolenaar 5841430ceebSBram Moolenaar def CnextOrCfirst() 5851430ceebSBram Moolenaar # if cnext fails, cfirst is used 5861430ceebSBram Moolenaar try 5871430ceebSBram Moolenaar cnext 5881430ceebSBram Moolenaar catch 5891430ceebSBram Moolenaar cfirst 5901430ceebSBram Moolenaar endtry 5911430ceebSBram Moolenaar enddef 5921430ceebSBram Moolenaar 5931430ceebSBram Moolenaar CnextOrCfirst() 5941430ceebSBram Moolenaar CnextOrCfirst() 5951430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 5961430ceebSBram Moolenaar qall 5971430ceebSBram Moolenaar END 5981430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 5991430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6001430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6011430ceebSBram Moolenaar 6021430ceebSBram Moolenaar delete('Xfile1') 6031430ceebSBram Moolenaar delete('Xfile2') 6041430ceebSBram Moolenaar delete('XCatchCnext') 6051430ceebSBram Moolenaar delete('Xresult') 6061430ceebSBram Moolenaarenddef 6071430ceebSBram Moolenaar 6089e1d9e34SBram Moolenaardef Test_throw_skipped() 6099e1d9e34SBram Moolenaar if 0 6109e1d9e34SBram Moolenaar throw dontgethere 6119e1d9e34SBram Moolenaar endif 6129e1d9e34SBram Moolenaarenddef 6139e1d9e34SBram Moolenaar 6148f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6158f81b22eSBram Moolenaar var lines =<< trim END 6168f81b22eSBram Moolenaar vim9script 6178f81b22eSBram Moolenaar def Func() 6188f81b22eSBram Moolenaar throw 'error' 6198f81b22eSBram Moolenaar enddef 6208f81b22eSBram Moolenaar silent! Func() 6218f81b22eSBram Moolenaar END 6228f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6238f81b22eSBram Moolenaar source XthrowSilenced 6248f81b22eSBram Moolenaar delete('XthrowSilenced') 6258f81b22eSBram Moolenaarenddef 6268f81b22eSBram Moolenaar 627e859312eSBram Moolenaardef DeletedFunc(): list<any> 628e859312eSBram Moolenaar return ['delete me'] 629e859312eSBram Moolenaarenddef 630e859312eSBram Moolenaardefcompile 631e859312eSBram Moolenaardelfunc DeletedFunc 632e859312eSBram Moolenaar 633257cc5eeSBram Moolenaardef ThrowFromDef() 634a72cfb80SBram Moolenaar throw "getout" # comment 635257cc5eeSBram Moolenaarenddef 636257cc5eeSBram Moolenaar 637257cc5eeSBram Moolenaarfunc CatchInFunc() 638257cc5eeSBram Moolenaar try 639257cc5eeSBram Moolenaar call ThrowFromDef() 640257cc5eeSBram Moolenaar catch 641257cc5eeSBram Moolenaar let g:thrown_func = v:exception 642257cc5eeSBram Moolenaar endtry 643257cc5eeSBram Moolenaarendfunc 644257cc5eeSBram Moolenaar 645257cc5eeSBram Moolenaardef CatchInDef() 646257cc5eeSBram Moolenaar try 647257cc5eeSBram Moolenaar ThrowFromDef() 648257cc5eeSBram Moolenaar catch 649257cc5eeSBram Moolenaar g:thrown_def = v:exception 650257cc5eeSBram Moolenaar endtry 651257cc5eeSBram Moolenaarenddef 652257cc5eeSBram Moolenaar 653f575adffSBram Moolenaardef ReturnFinally(): string 654f575adffSBram Moolenaar try 655f575adffSBram Moolenaar return 'intry' 656373863edSBram Moolenaar finall 657f575adffSBram Moolenaar g:in_finally = 'finally' 658f575adffSBram Moolenaar endtry 659f575adffSBram Moolenaar return 'end' 660f575adffSBram Moolenaarenddef 661f575adffSBram Moolenaar 662257cc5eeSBram Moolenaardef Test_try_catch_nested() 663257cc5eeSBram Moolenaar CatchInFunc() 664257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 665257cc5eeSBram Moolenaar 666257cc5eeSBram Moolenaar CatchInDef() 667257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 668f575adffSBram Moolenaar 669f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 670f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 671f575adffSBram Moolenaarenddef 672f575adffSBram Moolenaar 6739939f57bSBram Moolenaardef TryOne(): number 6749939f57bSBram Moolenaar try 6759939f57bSBram Moolenaar return 0 6769939f57bSBram Moolenaar catch 6779939f57bSBram Moolenaar endtry 6789939f57bSBram Moolenaar return 0 6799939f57bSBram Moolenaarenddef 6809939f57bSBram Moolenaar 6819939f57bSBram Moolenaardef TryTwo(n: number): string 6829939f57bSBram Moolenaar try 683cfcd011fSBram Moolenaar var x = {} 6849939f57bSBram Moolenaar catch 6859939f57bSBram Moolenaar endtry 6869939f57bSBram Moolenaar return 'text' 6879939f57bSBram Moolenaarenddef 6889939f57bSBram Moolenaar 6899939f57bSBram Moolenaardef Test_try_catch_twice() 6909939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 6919939f57bSBram Moolenaarenddef 6929939f57bSBram Moolenaar 693f575adffSBram Moolenaardef Test_try_catch_match() 694cfcd011fSBram Moolenaar var seq = 'a' 695f575adffSBram Moolenaar try 696f575adffSBram Moolenaar throw 'something' 697f575adffSBram Moolenaar catch /nothing/ 698f575adffSBram Moolenaar seq ..= 'x' 699f575adffSBram Moolenaar catch /some/ 700f575adffSBram Moolenaar seq ..= 'b' 701f575adffSBram Moolenaar catch /asdf/ 702f575adffSBram Moolenaar seq ..= 'x' 703e8c4abbbSBram Moolenaar catch ?a\?sdf? 704e8c4abbbSBram Moolenaar seq ..= 'y' 705f575adffSBram Moolenaar finally 706f575adffSBram Moolenaar seq ..= 'c' 707f575adffSBram Moolenaar endtry 708f575adffSBram Moolenaar assert_equal('abc', seq) 709257cc5eeSBram Moolenaarenddef 710257cc5eeSBram Moolenaar 711e8c4abbbSBram Moolenaardef Test_try_catch_fails() 712d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 713d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 714d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 715d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 716d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 717d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 718d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 719d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 72013106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 721d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 722585fea7bSBram Moolenaar 723e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 724d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 725e8c4abbbSBram Moolenaarenddef 726e8c4abbbSBram Moolenaar 727006ad48bSBram Moolenaardef Test_throw_vimscript() 728f5be8cdbSBram Moolenaar # only checks line continuation 729cfcd011fSBram Moolenaar var lines =<< trim END 730006ad48bSBram Moolenaar vim9script 731006ad48bSBram Moolenaar try 732006ad48bSBram Moolenaar throw 'one' 733006ad48bSBram Moolenaar .. 'two' 734006ad48bSBram Moolenaar catch 735006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 736006ad48bSBram Moolenaar endtry 737006ad48bSBram Moolenaar END 738006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7391e021e63SBram Moolenaar 7401e021e63SBram Moolenaar lines =<< trim END 7411e021e63SBram Moolenaar vim9script 742352134bbSBram Moolenaar @r = '' 7431e021e63SBram Moolenaar def Func() 7441e021e63SBram Moolenaar throw @r 7451e021e63SBram Moolenaar enddef 7461e021e63SBram Moolenaar var result = '' 7471e021e63SBram Moolenaar try 7481e021e63SBram Moolenaar Func() 7491e021e63SBram Moolenaar catch /E1129:/ 7501e021e63SBram Moolenaar result = 'caught' 7511e021e63SBram Moolenaar endtry 7521e021e63SBram Moolenaar assert_equal('caught', result) 7531e021e63SBram Moolenaar END 7541e021e63SBram Moolenaar CheckScriptSuccess(lines) 755006ad48bSBram Moolenaarenddef 756006ad48bSBram Moolenaar 757ed677f55SBram Moolenaardef Test_error_in_nested_function() 758*03dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 759cfcd011fSBram Moolenaar var lines =<< trim END 760ed677f55SBram Moolenaar vim9script 761ed677f55SBram Moolenaar def Func() 762ed677f55SBram Moolenaar Error() 763ed677f55SBram Moolenaar g:test_var = 1 764ed677f55SBram Moolenaar enddef 765ed677f55SBram Moolenaar func Error() abort 766ed677f55SBram Moolenaar eval [][0] 767ed677f55SBram Moolenaar endfunc 768ed677f55SBram Moolenaar Func() 769ed677f55SBram Moolenaar END 770ed677f55SBram Moolenaar g:test_var = 0 771ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 772ed677f55SBram Moolenaar assert_equal(0, g:test_var) 773ed677f55SBram Moolenaarenddef 774ed677f55SBram Moolenaar 77537c83711SBram Moolenaardef Test_cexpr_vimscript() 776f5be8cdbSBram Moolenaar # only checks line continuation 77737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 778cfcd011fSBram Moolenaar var lines =<< trim END 77937c83711SBram Moolenaar vim9script 78037c83711SBram Moolenaar cexpr 'File' 78137c83711SBram Moolenaar .. ' someFile' .. 78237c83711SBram Moolenaar ' line 19' 78337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 78437c83711SBram Moolenaar END 78537c83711SBram Moolenaar CheckScriptSuccess(lines) 78637c83711SBram Moolenaar set errorformat& 78737c83711SBram Moolenaarenddef 78837c83711SBram Moolenaar 789c9edd6b5SBram Moolenaardef Test_statusline_syntax() 790c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 791cfcd011fSBram Moolenaar var lines =<< trim END 792c9edd6b5SBram Moolenaar vim9script 793c9edd6b5SBram Moolenaar func g:Status() 794c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 795c9edd6b5SBram Moolenaar endfunc 796c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 797c9edd6b5SBram Moolenaar redrawstatus 798c9edd6b5SBram Moolenaar set laststatus statusline= 799c9edd6b5SBram Moolenaar END 800c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 801c9edd6b5SBram Moolenaarenddef 802c9edd6b5SBram Moolenaar 803b209750bSBram Moolenaardef Test_list_vimscript() 804b209750bSBram Moolenaar # checks line continuation and comments 805cfcd011fSBram Moolenaar var lines =<< trim END 806b209750bSBram Moolenaar vim9script 807cfcd011fSBram Moolenaar var mylist = [ 808b209750bSBram Moolenaar 'one', 809b209750bSBram Moolenaar # comment 810b209750bSBram Moolenaar 'two', # empty line follows 811b209750bSBram Moolenaar 812b209750bSBram Moolenaar 'three', 813b209750bSBram Moolenaar ] 814b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 815b209750bSBram Moolenaar END 816b209750bSBram Moolenaar CheckScriptSuccess(lines) 81766250c93SBram Moolenaar 81866250c93SBram Moolenaar # check all lines from heredoc are kept 81966250c93SBram Moolenaar lines =<< trim END 82066250c93SBram Moolenaar # comment 1 82166250c93SBram Moolenaar two 82266250c93SBram Moolenaar # comment 3 82366250c93SBram Moolenaar 82466250c93SBram Moolenaar five 82566250c93SBram Moolenaar # comment 6 82666250c93SBram Moolenaar END 82766250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8284bce26bbSBram Moolenaar 8294bce26bbSBram Moolenaar lines =<< trim END 8304bce26bbSBram Moolenaar [{ 8314bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8324bce26bbSBram Moolenaar END 8334bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 834b209750bSBram Moolenaarenddef 835b209750bSBram Moolenaar 8362a1381c3SBram Moolenaarif has('channel') 83740ee466cSBram Moolenaar let someJob = test_null_job() 83840ee466cSBram Moolenaar 83940ee466cSBram Moolenaar def FuncWithError() 84040ee466cSBram Moolenaar echomsg g:someJob 84140ee466cSBram Moolenaar enddef 84240ee466cSBram Moolenaar 84340ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 84440ee466cSBram Moolenaar try 84540ee466cSBram Moolenaar call FuncWithError() 84640ee466cSBram Moolenaar catch 84740ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 84840ee466cSBram Moolenaar endtry 84940ee466cSBram Moolenaar endfunc 8502a1381c3SBram Moolenaarendif 85140ee466cSBram Moolenaar 8528a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8538a7d6542SBram Moolenaar vim9script 854cfcd011fSBram Moolenaar var name: string = 'bob' 8558a7d6542SBram Moolenaar def Concat(arg: string): string 8568a7d6542SBram Moolenaar return name .. arg 8578a7d6542SBram Moolenaar enddef 858227a69deSBram Moolenaar g:result = Concat('bie') 859227a69deSBram Moolenaar g:localname = name 8608a7d6542SBram Moolenaar 8618a7d6542SBram Moolenaar export const CONST = 1234 862cfcd011fSBram Moolenaar export var exported = 9876 863cfcd011fSBram Moolenaar export var exp_name = 'John' 8648a7d6542SBram Moolenaar export def Exported(): string 8658a7d6542SBram Moolenaar return 'Exported' 8668a7d6542SBram Moolenaar enddef 8678a7d6542SBram MoolenaarEND 8688a7d6542SBram Moolenaar 869b3ca9824SBram Moolenaardef Undo_export_script_lines() 870b3ca9824SBram Moolenaar unlet g:result 871b3ca9824SBram Moolenaar unlet g:localname 872b3ca9824SBram Moolenaarenddef 873b3ca9824SBram Moolenaar 8745269bd2aSBram Moolenaardef Test_vim9_import_export() 875cfcd011fSBram Moolenaar var import_script_lines =<< trim END 8768a7d6542SBram Moolenaar vim9script 8778a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8788a7d6542SBram Moolenaar g:imported = exported 8796e587dcbSBram Moolenaar exported += 3 8806e587dcbSBram Moolenaar g:imported_added = exported 8818a7d6542SBram Moolenaar g:imported_func = Exported() 8826e587dcbSBram Moolenaar 88340f4f7a4SBram Moolenaar def GetExported(): string 884e0de171eSBram Moolenaar var local_dict = {ref: Exported} 88540f4f7a4SBram Moolenaar return local_dict.ref() 88640f4f7a4SBram Moolenaar enddef 88740f4f7a4SBram Moolenaar g:funcref_result = GetExported() 88840f4f7a4SBram Moolenaar 8896e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8906e587dcbSBram Moolenaar g:imported_name = exp_name 8916e587dcbSBram Moolenaar exp_name ..= ' Doe' 8926e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8935381c7a1SBram Moolenaar g:imported_later = exported 8948a7d6542SBram Moolenaar END 8958a7d6542SBram Moolenaar 8968a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8978a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8988a7d6542SBram Moolenaar 8998a7d6542SBram Moolenaar source Ximport.vim 9008a7d6542SBram Moolenaar 9018a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9028a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9038a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9046e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9055381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9068a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 90740f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9086e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9096e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9108a7d6542SBram Moolenaar assert_false(exists('g:name')) 9118a7d6542SBram Moolenaar 912b3ca9824SBram Moolenaar Undo_export_script_lines() 9138a7d6542SBram Moolenaar unlet g:imported 9146e587dcbSBram Moolenaar unlet g:imported_added 9155381c7a1SBram Moolenaar unlet g:imported_later 9168a7d6542SBram Moolenaar unlet g:imported_func 9176e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9188a7d6542SBram Moolenaar delete('Ximport.vim') 919f2d5c240SBram Moolenaar 9201c991144SBram Moolenaar # similar, with line breaks 921cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9221c991144SBram Moolenaar vim9script 9231c991144SBram Moolenaar import { 9241c991144SBram Moolenaar exported, 9251c991144SBram Moolenaar Exported, 9261c991144SBram Moolenaar } 9271c991144SBram Moolenaar from 9281c991144SBram Moolenaar './Xexport.vim' 9291c991144SBram Moolenaar g:imported = exported 9301c991144SBram Moolenaar exported += 5 9311c991144SBram Moolenaar g:imported_added = exported 9321c991144SBram Moolenaar g:imported_func = Exported() 9331c991144SBram Moolenaar END 9341c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9351c991144SBram Moolenaar source Ximport_lbr.vim 9361c991144SBram Moolenaar 9371c991144SBram Moolenaar assert_equal(9876, g:imported) 9381c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9391c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9401c991144SBram Moolenaar 9411c991144SBram Moolenaar # exported script not sourced again 9421c991144SBram Moolenaar assert_false(exists('g:result')) 9431c991144SBram Moolenaar unlet g:imported 9441c991144SBram Moolenaar unlet g:imported_added 9451c991144SBram Moolenaar unlet g:imported_func 9461c991144SBram Moolenaar delete('Ximport_lbr.vim') 9471c991144SBram Moolenaar 9481c991144SBram Moolenaar # import inside :def function 949cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9505381c7a1SBram Moolenaar vim9script 9515381c7a1SBram Moolenaar def ImportInDef() 9525381c7a1SBram Moolenaar import exported from './Xexport.vim' 9535381c7a1SBram Moolenaar g:imported = exported 9545381c7a1SBram Moolenaar exported += 7 9555381c7a1SBram Moolenaar g:imported_added = exported 9565381c7a1SBram Moolenaar enddef 9575381c7a1SBram Moolenaar ImportInDef() 9585381c7a1SBram Moolenaar END 9595381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9605381c7a1SBram Moolenaar source Ximport2.vim 961f5be8cdbSBram Moolenaar # TODO: this should be 9879 9625381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9635381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9645381c7a1SBram Moolenaar unlet g:imported 9655381c7a1SBram Moolenaar unlet g:imported_added 9665381c7a1SBram Moolenaar delete('Ximport2.vim') 9675381c7a1SBram Moolenaar 968cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 969f2d5c240SBram Moolenaar vim9script 970f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 971f2d5c240SBram Moolenaar def UseExport() 972f2d5c240SBram Moolenaar g:imported = Export.exported 973f2d5c240SBram Moolenaar enddef 974f2d5c240SBram Moolenaar UseExport() 975f2d5c240SBram Moolenaar END 976f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 977f2d5c240SBram Moolenaar source Ximport.vim 9785381c7a1SBram Moolenaar assert_equal(9883, g:imported) 979f2d5c240SBram Moolenaar 980cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 981599c89c8SBram Moolenaar vim9script 982599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 983599c89c8SBram Moolenaar def Func() 984cfcd011fSBram Moolenaar var dummy = 1 985cfcd011fSBram Moolenaar var imported = Export + dummy 986599c89c8SBram Moolenaar enddef 987822ba247SBram Moolenaar defcompile 988599c89c8SBram Moolenaar END 989599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 99044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 991599c89c8SBram Moolenaar 992cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 993599c89c8SBram Moolenaar vim9script 994599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 995599c89c8SBram Moolenaar def Func() 996cfcd011fSBram Moolenaar var imported = Export . exported 997599c89c8SBram Moolenaar enddef 998822ba247SBram Moolenaar defcompile 999599c89c8SBram Moolenaar END 1000599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 100144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1002599c89c8SBram Moolenaar 1003a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1004a6294955SBram Moolenaar vim9script 1005a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1006a6294955SBram Moolenaar var some = 'other' 1007a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1008a6294955SBram Moolenaar defcompile 1009a6294955SBram Moolenaar END 1010a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1011a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1012a6294955SBram Moolenaar 1013cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1014599c89c8SBram Moolenaar vim9script 1015599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1016599c89c8SBram Moolenaar def Func() 1017cfcd011fSBram Moolenaar var imported = Export. 1018599c89c8SBram Moolenaar enddef 1019822ba247SBram Moolenaar defcompile 1020599c89c8SBram Moolenaar END 1021599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 102244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1023599c89c8SBram Moolenaar 1024cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10251c991144SBram Moolenaar vim9script 10261c991144SBram Moolenaar import * 10271c991144SBram Moolenaar as Export 10281c991144SBram Moolenaar from 10291c991144SBram Moolenaar './Xexport.vim' 10301c991144SBram Moolenaar def UseExport() 10311c991144SBram Moolenaar g:imported = Export.exported 10321c991144SBram Moolenaar enddef 10331c991144SBram Moolenaar UseExport() 10341c991144SBram Moolenaar END 10351c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10361c991144SBram Moolenaar source Ximport.vim 10371c991144SBram Moolenaar assert_equal(9883, g:imported) 10381c991144SBram Moolenaar 1039cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1040f2d5c240SBram Moolenaar vim9script 1041f2d5c240SBram Moolenaar import * from './Xexport.vim' 1042f2d5c240SBram Moolenaar END 1043f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 104444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1045f2d5c240SBram Moolenaar 1046f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1047cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1048fa29c8abSBram Moolenaar vim9script 1049fa29c8abSBram Moolenaar import name from './Xexport.vim' 1050fa29c8abSBram Moolenaar END 1051fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 105244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1053fa29c8abSBram Moolenaar 1054f5be8cdbSBram Moolenaar # try to import something that is already defined 1055cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10565269bd2aSBram Moolenaar vim9script 1057cfcd011fSBram Moolenaar var exported = 'something' 10585269bd2aSBram Moolenaar import exported from './Xexport.vim' 10595269bd2aSBram Moolenaar END 10605269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 106144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10625269bd2aSBram Moolenaar 1063f5be8cdbSBram Moolenaar # try to import something that is already defined 10645269bd2aSBram Moolenaar import_already_defined =<< trim END 10655269bd2aSBram Moolenaar vim9script 1066cfcd011fSBram Moolenaar var exported = 'something' 10675269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10685269bd2aSBram Moolenaar END 10695269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 107044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10715269bd2aSBram Moolenaar 1072f5be8cdbSBram Moolenaar # try to import something that is already defined 10735269bd2aSBram Moolenaar import_already_defined =<< trim END 10745269bd2aSBram Moolenaar vim9script 1075cfcd011fSBram Moolenaar var exported = 'something' 10765269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10775269bd2aSBram Moolenaar END 10785269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 107944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10805269bd2aSBram Moolenaar 1081918a4249SBram Moolenaar # try changing an imported const 1082918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1083918a4249SBram Moolenaar vim9script 1084918a4249SBram Moolenaar import CONST from './Xexport.vim' 1085918a4249SBram Moolenaar def Assign() 1086918a4249SBram Moolenaar CONST = 987 1087918a4249SBram Moolenaar enddef 1088918a4249SBram Moolenaar defcompile 1089918a4249SBram Moolenaar END 1090918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1091918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1092918a4249SBram Moolenaar 1093f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1094cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1095fa29c8abSBram Moolenaar vim9script 1096fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1097fa29c8abSBram Moolenaar END 1098fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 109944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1100fa29c8abSBram Moolenaar 1101cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1102fa29c8abSBram Moolenaar vim9script 1103fa29c8abSBram Moolenaar import name './Xexport.vim' 1104fa29c8abSBram Moolenaar END 1105fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 110644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1107fa29c8abSBram Moolenaar 1108cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1109fa29c8abSBram Moolenaar vim9script 1110fa29c8abSBram Moolenaar import name from Xexport.vim 1111fa29c8abSBram Moolenaar END 1112fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 111344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1114fa29c8abSBram Moolenaar 1115cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1116fa29c8abSBram Moolenaar vim9script 1117fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1118fa29c8abSBram Moolenaar END 1119fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 112044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1121fa29c8abSBram Moolenaar 1122cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1123fa29c8abSBram Moolenaar vim9script 1124fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1125fa29c8abSBram Moolenaar END 11265269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 112744d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1128fa29c8abSBram Moolenaar 1129f2d5c240SBram Moolenaar delete('Ximport.vim') 11305269bd2aSBram Moolenaar delete('Ximport3.vim') 11318a7d6542SBram Moolenaar delete('Xexport.vim') 11328a7d6542SBram Moolenaar 1133f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1134750802b5SBram Moolenaar set cpo&vi 1135cfcd011fSBram Moolenaar var cpo_before = &cpo 1136cfcd011fSBram Moolenaar var lines =<< trim END 1137750802b5SBram Moolenaar vim9script 1138750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1139750802b5SBram Moolenaar END 1140750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1141750802b5SBram Moolenaar source Xvim9_script 1142750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1143750802b5SBram Moolenaar set cpo&vim 1144750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1145750802b5SBram Moolenaar delete('Xvim9_script') 1146750802b5SBram Moolenaarenddef 1147750802b5SBram Moolenaar 1148803af686SBram Moolenaarfunc g:Trigger() 1149803af686SBram Moolenaar source Ximport.vim 1150803af686SBram Moolenaar return "echo 'yes'\<CR>" 1151803af686SBram Moolenaarendfunc 1152803af686SBram Moolenaar 1153803af686SBram Moolenaardef Test_import_export_expr_map() 1154803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1155cfcd011fSBram Moolenaar var export_lines =<< trim END 1156803af686SBram Moolenaar vim9script 1157803af686SBram Moolenaar export def That(): string 1158803af686SBram Moolenaar return 'yes' 1159803af686SBram Moolenaar enddef 1160803af686SBram Moolenaar END 1161803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1162803af686SBram Moolenaar 1163cfcd011fSBram Moolenaar var import_lines =<< trim END 1164803af686SBram Moolenaar vim9script 1165803af686SBram Moolenaar import That from './Xexport_that.vim' 1166803af686SBram Moolenaar assert_equal('yes', That()) 1167803af686SBram Moolenaar END 1168803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1169803af686SBram Moolenaar 1170803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1171803af686SBram Moolenaar feedkeys('trigger', "xt") 1172803af686SBram Moolenaar 1173730b2483SBram Moolenaar delete('Xexport_that.vim') 1174803af686SBram Moolenaar delete('Ximport.vim') 1175803af686SBram Moolenaar nunmap trigger 1176803af686SBram Moolenaarenddef 1177803af686SBram Moolenaar 11788e1986e3SBram Moolenaardef Test_import_in_filetype() 11798e1986e3SBram Moolenaar # check that :import works when the buffer is locked 11808e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1181cfcd011fSBram Moolenaar var export_lines =<< trim END 11828e1986e3SBram Moolenaar vim9script 1183cfcd011fSBram Moolenaar export var That = 'yes' 11848e1986e3SBram Moolenaar END 1185730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 11868e1986e3SBram Moolenaar 1187cfcd011fSBram Moolenaar var import_lines =<< trim END 11888e1986e3SBram Moolenaar vim9script 1189730b2483SBram Moolenaar import That from './Xexport_ft.vim' 11908e1986e3SBram Moolenaar assert_equal('yes', That) 11918e1986e3SBram Moolenaar g:did_load_mytpe = 1 11928e1986e3SBram Moolenaar END 11938e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 11948e1986e3SBram Moolenaar 1195cfcd011fSBram Moolenaar var save_rtp = &rtp 11968e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 11978e1986e3SBram Moolenaar 11988e1986e3SBram Moolenaar filetype plugin on 11998e1986e3SBram Moolenaar copen 12008e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12018e1986e3SBram Moolenaar 12028e1986e3SBram Moolenaar quit! 1203730b2483SBram Moolenaar delete('Xexport_ft.vim') 12048e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12058e1986e3SBram Moolenaar &rtp = save_rtp 12068e1986e3SBram Moolenaarenddef 12078e1986e3SBram Moolenaar 1208efa94447SBram Moolenaardef Test_use_import_in_mapping() 1209cfcd011fSBram Moolenaar var lines =<< trim END 1210efa94447SBram Moolenaar vim9script 1211efa94447SBram Moolenaar export def Funcx() 1212efa94447SBram Moolenaar g:result = 42 1213efa94447SBram Moolenaar enddef 1214efa94447SBram Moolenaar END 1215efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1216efa94447SBram Moolenaar lines =<< trim END 1217efa94447SBram Moolenaar vim9script 1218efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1219b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1220efa94447SBram Moolenaar END 1221efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1222efa94447SBram Moolenaar 1223efa94447SBram Moolenaar source Xmapscript.vim 1224b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1225efa94447SBram Moolenaar assert_equal(42, g:result) 1226efa94447SBram Moolenaar 1227efa94447SBram Moolenaar unlet g:result 1228efa94447SBram Moolenaar delete('XsomeExport.vim') 1229efa94447SBram Moolenaar delete('Xmapscript.vim') 1230b3ca9824SBram Moolenaar nunmap <F3> 1231efa94447SBram Moolenaarenddef 1232efa94447SBram Moolenaar 1233750802b5SBram Moolenaardef Test_vim9script_fails() 12348a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12358a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1236cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 12379721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1238cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1239750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1240750802b5SBram Moolenaar 1241cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1242c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1243c785b9a7SBram Moolenaar 1244e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1245e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 12468a7d6542SBram Moolenaarenddef 12478a7d6542SBram Moolenaar 1248f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1249101f4810SBram Moolenaar CheckRunVimInTerminal 1250101f4810SBram Moolenaar 12519bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1252c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 12539bb3eb3eSBram Moolenaarendfunc 12549bb3eb3eSBram Moolenaar 1255c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1256cfcd011fSBram Moolenaar var export =<< trim END 1257101f4810SBram Moolenaar vim9script 1258101f4810SBram Moolenaar export def Foo(): number 1259101f4810SBram Moolenaar return 0 1260101f4810SBram Moolenaar enddef 1261101f4810SBram Moolenaar END 1262730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1263101f4810SBram Moolenaar 1264e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 12659bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 12662949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1267101f4810SBram Moolenaar 1268730b2483SBram Moolenaar delete('XexportCmd.vim') 12699bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 12709bb3eb3eSBram Moolenaarenddef 1271101f4810SBram Moolenaar 12722b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 12732b32700dSBram Moolenaar var lines =<< trim END 1274a6294955SBram Moolenaar vim9script 1275a6294955SBram Moolenaar export var exported = 'thexport' 1276a6294955SBram Moolenaar END 1277a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1278a6294955SBram Moolenaar lines =<< trim END 12792b32700dSBram Moolenaar vim9script noclear 12802b32700dSBram Moolenaar g:loadCount += 1 12812b32700dSBram Moolenaar var s:reloaded = 'init' 1282a6294955SBram Moolenaar import exported from './XExportReload' 12832b32700dSBram Moolenaar 12842b32700dSBram Moolenaar def Again(): string 12852b32700dSBram Moolenaar return 'again' 12862b32700dSBram Moolenaar enddef 12872b32700dSBram Moolenaar 12882b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 12892b32700dSBram Moolenaar var s:loaded = true 12902b32700dSBram Moolenaar 12912b32700dSBram Moolenaar var s:notReloaded = 'yes' 12922b32700dSBram Moolenaar s:reloaded = 'first' 12932b32700dSBram Moolenaar def g:Values(): list<string> 1294a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 12952b32700dSBram Moolenaar enddef 12962b32700dSBram Moolenaar 12972b32700dSBram Moolenaar def Once(): string 12982b32700dSBram Moolenaar return 'once' 12992b32700dSBram Moolenaar enddef 13002b32700dSBram Moolenaar END 13012b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13022b32700dSBram Moolenaar g:loadCount = 0 13032b32700dSBram Moolenaar source XReloaded 13042b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1305a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13062b32700dSBram Moolenaar source XReloaded 13072b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1308a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13092b32700dSBram Moolenaar source XReloaded 13102b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1311a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13122b32700dSBram Moolenaar 131348e11c10SBram Moolenaar delete('XReloaded') 1314a6294955SBram Moolenaar delete('XExportReload') 13152b32700dSBram Moolenaar delfunc g:Values 13162b32700dSBram Moolenaar unlet g:loadCount 13172b32700dSBram Moolenaarenddef 13182b32700dSBram Moolenaar 13194c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1320cfcd011fSBram Moolenaar var lines =<< trim END 13218a7d6542SBram Moolenaar vim9script 13228a7d6542SBram Moolenaar const var = '' 1323cfcd011fSBram Moolenaar var valone = 1234 13248a7d6542SBram Moolenaar def MyFunc(arg: string) 13258a7d6542SBram Moolenaar valone = 5678 13268a7d6542SBram Moolenaar enddef 13278a7d6542SBram Moolenaar END 1328cfcd011fSBram Moolenaar var morelines =<< trim END 1329cfcd011fSBram Moolenaar var valtwo = 222 13308a7d6542SBram Moolenaar export def GetValtwo(): number 13318a7d6542SBram Moolenaar return valtwo 13328a7d6542SBram Moolenaar enddef 13338a7d6542SBram Moolenaar END 133403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13358a7d6542SBram Moolenaar source Xreload.vim 13368a7d6542SBram Moolenaar source Xreload.vim 13378a7d6542SBram Moolenaar source Xreload.vim 13388a7d6542SBram Moolenaar 1339cfcd011fSBram Moolenaar var testlines =<< trim END 13408a7d6542SBram Moolenaar vim9script 13418a7d6542SBram Moolenaar def TheFunc() 13428a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13438a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13448a7d6542SBram Moolenaar enddef 13458a7d6542SBram Moolenaar TheFunc() 13468a7d6542SBram Moolenaar END 13478a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13488a7d6542SBram Moolenaar source Ximport.vim 13498a7d6542SBram Moolenaar 1350f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1351f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 13528a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 13538a7d6542SBram Moolenaar source Ximport.vim 13548a7d6542SBram Moolenaar 1355f5be8cdbSBram Moolenaar # cannot declare a var twice 13568a7d6542SBram Moolenaar lines =<< trim END 13578a7d6542SBram Moolenaar vim9script 1358cfcd011fSBram Moolenaar var valone = 1234 1359cfcd011fSBram Moolenaar var valone = 5678 13608a7d6542SBram Moolenaar END 13618a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 136244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 13638a7d6542SBram Moolenaar 13648a7d6542SBram Moolenaar delete('Xreload.vim') 13658a7d6542SBram Moolenaar delete('Ximport.vim') 13668a7d6542SBram Moolenaarenddef 13678a7d6542SBram Moolenaar 136807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 136907a65d26SBram Moolenaar" compiled function using that variable must fail. 137007a65d26SBram Moolenaardef Test_script_reload_change_type() 137107a65d26SBram Moolenaar var lines =<< trim END 137207a65d26SBram Moolenaar vim9script noclear 137307a65d26SBram Moolenaar var str = 'string' 137407a65d26SBram Moolenaar def g:GetStr(): string 137507a65d26SBram Moolenaar return str .. 'xxx' 137607a65d26SBram Moolenaar enddef 137707a65d26SBram Moolenaar END 137807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 137907a65d26SBram Moolenaar source Xreload.vim 138007a65d26SBram Moolenaar echo g:GetStr() 138107a65d26SBram Moolenaar 138207a65d26SBram Moolenaar lines =<< trim END 138307a65d26SBram Moolenaar vim9script noclear 138407a65d26SBram Moolenaar var str = 1234 138507a65d26SBram Moolenaar END 138607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 138707a65d26SBram Moolenaar source Xreload.vim 138807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 138907a65d26SBram Moolenaar 139007a65d26SBram Moolenaar delfunc g:GetStr 139107a65d26SBram Moolenaar delete('Xreload.vim') 139207a65d26SBram Moolenaarenddef 139307a65d26SBram Moolenaar 139495006e3dSBram Moolenaardef s:RetSome(): string 139595006e3dSBram Moolenaar return 'some' 139695006e3dSBram Moolenaarenddef 139795006e3dSBram Moolenaar 1398fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1399fe465a01SBram Moolenaar" script-local name. 1400fe465a01SBram Moolenaardef Test_vim9script_funcref() 1401cfcd011fSBram Moolenaar var sortlines =<< trim END 1402fe465a01SBram Moolenaar vim9script 1403fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1404bed36b93SBram Moolenaar return i2 - i1 1405fe465a01SBram Moolenaar enddef 1406fe465a01SBram Moolenaar 1407fe465a01SBram Moolenaar export def FastSort(): list<number> 1408fe465a01SBram Moolenaar return range(5)->sort(Compare) 1409fe465a01SBram Moolenaar enddef 1410fe465a01SBram Moolenaar END 1411fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1412fe465a01SBram Moolenaar 1413cfcd011fSBram Moolenaar var lines =<< trim END 1414fe465a01SBram Moolenaar vim9script 1415fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1416fe465a01SBram Moolenaar def Test() 1417fe465a01SBram Moolenaar g:result = FastSort() 1418fe465a01SBram Moolenaar enddef 1419fe465a01SBram Moolenaar Test() 1420fe465a01SBram Moolenaar END 1421fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1422fe465a01SBram Moolenaar 1423fe465a01SBram Moolenaar source Xscript.vim 1424fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1425fe465a01SBram Moolenaar 1426fe465a01SBram Moolenaar unlet g:result 1427fe465a01SBram Moolenaar delete('Xsort.vim') 1428fe465a01SBram Moolenaar delete('Xscript.vim') 142995006e3dSBram Moolenaar 1430cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 143195006e3dSBram Moolenaar assert_equal('some', Funcref()) 1432fe465a01SBram Moolenaarenddef 1433fe465a01SBram Moolenaar 1434601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1435601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1436601e76acSBram Moolenaar" function reference. 1437c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1438cfcd011fSBram Moolenaar var filterLines =<< trim END 1439c620c055SBram Moolenaar vim9script 1440c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1441c620c055SBram Moolenaar return idx % 2 == 1 1442c620c055SBram Moolenaar enddef 1443c620c055SBram Moolenaar export def FastFilter(): list<number> 1444c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1445c620c055SBram Moolenaar enddef 1446601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1447601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1448601e76acSBram Moolenaar enddef 1449c620c055SBram Moolenaar END 1450c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1451c620c055SBram Moolenaar 1452cfcd011fSBram Moolenaar var lines =<< trim END 1453c620c055SBram Moolenaar vim9script 1454601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1455c620c055SBram Moolenaar def Test() 1456cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1457c620c055SBram Moolenaar enddef 1458c620c055SBram Moolenaar Test() 1459601e76acSBram Moolenaar def TestDirect() 1460cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1461601e76acSBram Moolenaar enddef 1462601e76acSBram Moolenaar TestDirect() 1463c620c055SBram Moolenaar END 1464601e76acSBram Moolenaar CheckScriptSuccess(lines) 1465c620c055SBram Moolenaar delete('Xfilter.vim') 1466c620c055SBram Moolenaarenddef 1467c620c055SBram Moolenaar 14684c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1469cfcd011fSBram Moolenaar var first_lines =<< trim END 14704c17ad94SBram Moolenaar vim9script 14714c17ad94SBram Moolenaar def FuncYes(): string 14724c17ad94SBram Moolenaar return 'yes' 14734c17ad94SBram Moolenaar enddef 14744c17ad94SBram Moolenaar END 1475cfcd011fSBram Moolenaar var withno_lines =<< trim END 14764c17ad94SBram Moolenaar def FuncNo(): string 14774c17ad94SBram Moolenaar return 'no' 14784c17ad94SBram Moolenaar enddef 14794c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 14804c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 14814c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 148203afdcf1SBram Moolenaar enddef 148303afdcf1SBram Moolenaar END 1484cfcd011fSBram Moolenaar var nono_lines =<< trim END 148503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 148603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 148744d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 14884c17ad94SBram Moolenaar enddef 14894c17ad94SBram Moolenaar END 14904c17ad94SBram Moolenaar 14914c17ad94SBram Moolenaar # FuncNo() is defined 149203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14934c17ad94SBram Moolenaar source Xreloaded.vim 14944c17ad94SBram Moolenaar g:DoCheck(true) 14954c17ad94SBram Moolenaar 14964c17ad94SBram Moolenaar # FuncNo() is not redefined 149703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 14984c17ad94SBram Moolenaar source Xreloaded.vim 14995082471fSBram Moolenaar g:DoCheck(false) 15004c17ad94SBram Moolenaar 15014c17ad94SBram Moolenaar # FuncNo() is back 150203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15034c17ad94SBram Moolenaar source Xreloaded.vim 15045082471fSBram Moolenaar g:DoCheck(false) 15054c17ad94SBram Moolenaar 15064c17ad94SBram Moolenaar delete('Xreloaded.vim') 15074c17ad94SBram Moolenaarenddef 15084c17ad94SBram Moolenaar 150989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 151089483d40SBram Moolenaar # write the script with a script-local variable 1511cfcd011fSBram Moolenaar var lines =<< trim END 151289483d40SBram Moolenaar vim9script 1513cfcd011fSBram Moolenaar var name = 'string' 151489483d40SBram Moolenaar END 151589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 151689483d40SBram Moolenaar source XreloadVar.vim 151789483d40SBram Moolenaar 151889483d40SBram Moolenaar # now write the script using the same variable locally - works 151989483d40SBram Moolenaar lines =<< trim END 152089483d40SBram Moolenaar vim9script 152189483d40SBram Moolenaar def Func() 1522cfcd011fSBram Moolenaar var name = 'string' 152389483d40SBram Moolenaar enddef 152489483d40SBram Moolenaar END 152589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 152689483d40SBram Moolenaar source XreloadVar.vim 152789483d40SBram Moolenaar 152889483d40SBram Moolenaar delete('XreloadVar.vim') 152989483d40SBram Moolenaarenddef 153089483d40SBram Moolenaar 15318a7d6542SBram Moolenaardef Test_import_absolute() 1532cfcd011fSBram Moolenaar var import_lines = [ 1533e6085c53SBram Moolenaar 'vim9script', 1534e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1535e6085c53SBram Moolenaar 'def UseExported()', 1536e6085c53SBram Moolenaar ' g:imported_abs = exported', 1537e6085c53SBram Moolenaar ' exported = 8888', 1538e6085c53SBram Moolenaar ' g:imported_after = exported', 1539e6085c53SBram Moolenaar 'enddef', 1540e6085c53SBram Moolenaar 'UseExported()', 1541e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1542e6085c53SBram Moolenaar ] 15438a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15448a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15458a7d6542SBram Moolenaar 15468a7d6542SBram Moolenaar source Ximport_abs.vim 15478a7d6542SBram Moolenaar 15488a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15494e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1550fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1551fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1552fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1553fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1554fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1555fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1556fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1557fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1558fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1559fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1560e6085c53SBram Moolenaar g:import_disassembled) 1561b3ca9824SBram Moolenaar 1562b3ca9824SBram Moolenaar Undo_export_script_lines() 15638a7d6542SBram Moolenaar unlet g:imported_abs 15644e12a5dfSBram Moolenaar unlet g:import_disassembled 15658a7d6542SBram Moolenaar 15668a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15678a7d6542SBram Moolenaar delete('Xexport_abs.vim') 15688a7d6542SBram Moolenaarenddef 15698a7d6542SBram Moolenaar 15708a7d6542SBram Moolenaardef Test_import_rtp() 1571cfcd011fSBram Moolenaar var import_lines = [ 1572e6085c53SBram Moolenaar 'vim9script', 1573e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1574e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1575e6085c53SBram Moolenaar ] 15768a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 15778a7d6542SBram Moolenaar mkdir('import') 15788a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 15798a7d6542SBram Moolenaar 1580cfcd011fSBram Moolenaar var save_rtp = &rtp 15818a7d6542SBram Moolenaar &rtp = getcwd() 15828a7d6542SBram Moolenaar source Ximport_rtp.vim 15838a7d6542SBram Moolenaar &rtp = save_rtp 15848a7d6542SBram Moolenaar 15858a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 15868a7d6542SBram Moolenaar 1587b3ca9824SBram Moolenaar Undo_export_script_lines() 1588b3ca9824SBram Moolenaar unlet g:imported_rtp 15898a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 159089483d40SBram Moolenaar delete('import', 'rf') 15918a7d6542SBram Moolenaarenddef 15928a7d6542SBram Moolenaar 159325e0f586SBram Moolenaardef Test_import_compile_error() 1594cfcd011fSBram Moolenaar var export_lines = [ 159525e0f586SBram Moolenaar 'vim9script', 159625e0f586SBram Moolenaar 'export def ExpFunc(): string', 159725e0f586SBram Moolenaar ' return notDefined', 159825e0f586SBram Moolenaar 'enddef', 159925e0f586SBram Moolenaar ] 160025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 160125e0f586SBram Moolenaar 1602cfcd011fSBram Moolenaar var import_lines = [ 160325e0f586SBram Moolenaar 'vim9script', 160425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 160525e0f586SBram Moolenaar 'def ImpFunc()', 160625e0f586SBram Moolenaar ' echo ExpFunc()', 160725e0f586SBram Moolenaar 'enddef', 160825e0f586SBram Moolenaar 'defcompile', 160925e0f586SBram Moolenaar ] 161025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 161125e0f586SBram Moolenaar 161225e0f586SBram Moolenaar try 161325e0f586SBram Moolenaar source Ximport.vim 161425e0f586SBram Moolenaar catch /E1001/ 1615f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16167707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 161725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 161825e0f586SBram Moolenaar endtry 161925e0f586SBram Moolenaar 162025e0f586SBram Moolenaar delete('Xexported.vim') 162125e0f586SBram Moolenaar delete('Ximport.vim') 162225e0f586SBram Moolenaarenddef 162325e0f586SBram Moolenaar 1624c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1625cfcd011fSBram Moolenaar var lines = [ 1626c4ce36d4SBram Moolenaar 'vim9script', 1627c4ce36d4SBram Moolenaar 'def Func()', 1628c4ce36d4SBram Moolenaar ' eval [][0]', 1629c4ce36d4SBram Moolenaar 'enddef', 1630c4ce36d4SBram Moolenaar 'Func()', 1631c4ce36d4SBram Moolenaar ] 1632c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1633c4ce36d4SBram Moolenaar 1634c4ce36d4SBram Moolenaar for count in range(3) 1635c4ce36d4SBram Moolenaar try 1636c4ce36d4SBram Moolenaar source Xtestscript.vim 1637c4ce36d4SBram Moolenaar catch /E684/ 1638c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1639c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1640c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1641c4ce36d4SBram Moolenaar endtry 1642c4ce36d4SBram Moolenaar endfor 1643c4ce36d4SBram Moolenaar 1644c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1645c4ce36d4SBram Moolenaarenddef 1646c4ce36d4SBram Moolenaar 1647eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1648cfcd011fSBram Moolenaar var export_lines =<< trim END 1649eef2102eSBram Moolenaar vim9script 1650eef2102eSBram Moolenaar export def Func() 1651eef2102eSBram Moolenaar echo 'imported' 1652eef2102eSBram Moolenaar enddef 1653eef2102eSBram Moolenaar END 1654eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1655eef2102eSBram Moolenaar 1656cfcd011fSBram Moolenaar var lines =<< trim END 1657eef2102eSBram Moolenaar vim9script 1658eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1659eef2102eSBram Moolenaar def Func() 1660eef2102eSBram Moolenaar echo 'local to function' 1661eef2102eSBram Moolenaar enddef 1662eef2102eSBram Moolenaar END 1663eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1664eef2102eSBram Moolenaar 1665eef2102eSBram Moolenaar lines =<< trim END 1666eef2102eSBram Moolenaar vim9script 1667eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1668eef2102eSBram Moolenaar def Outer() 1669eef2102eSBram Moolenaar def Func() 1670eef2102eSBram Moolenaar echo 'local to function' 1671eef2102eSBram Moolenaar enddef 1672eef2102eSBram Moolenaar enddef 1673eef2102eSBram Moolenaar defcompile 1674eef2102eSBram Moolenaar END 1675eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1676eef2102eSBram Moolenaar 1677eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1678eef2102eSBram Moolenaarenddef 1679eef2102eSBram Moolenaar 1680b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1681cfcd011fSBram Moolenaar var lines =<< trim END 1682b9a2cac3SBram Moolenaar vim9script 1683b9a2cac3SBram Moolenaar def Func() 1684b9a2cac3SBram Moolenaar echo 'one' 1685b9a2cac3SBram Moolenaar enddef 1686b9a2cac3SBram Moolenaar def Func() 1687b9a2cac3SBram Moolenaar echo 'two' 1688b9a2cac3SBram Moolenaar enddef 1689b9a2cac3SBram Moolenaar END 1690b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1691fa211f3cSBram Moolenaar 1692fa211f3cSBram Moolenaar lines =<< trim END 1693fa211f3cSBram Moolenaar vim9script 1694fa211f3cSBram Moolenaar def Foo(): string 1695fa211f3cSBram Moolenaar return 'foo' 1696fa211f3cSBram Moolenaar enddef 1697fa211f3cSBram Moolenaar def Func() 1698cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1699fa211f3cSBram Moolenaar enddef 1700fa211f3cSBram Moolenaar defcompile 1701fa211f3cSBram Moolenaar END 1702fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1703b9a2cac3SBram Moolenaarenddef 1704b9a2cac3SBram Moolenaar 17058a7d6542SBram Moolenaardef Test_fixed_size_list() 1706f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1707cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 17088a7d6542SBram Moolenaar l->remove(0) 17098a7d6542SBram Moolenaar l->add(5) 17108a7d6542SBram Moolenaar l->insert(99, 1) 17110f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17128a7d6542SBram Moolenaarenddef 17138a7d6542SBram Moolenaar 1714ae616494SBram Moolenaardef Test_no_insert_xit() 1715d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1716d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1717d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1718d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1719d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1720ae616494SBram Moolenaar 1721ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1722ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1723ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1724ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1725f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1726f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1727f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1728f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1729f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1730ae616494SBram Moolenaarenddef 1731ae616494SBram Moolenaar 1732158906cfSBram Moolenaardef IfElse(what: number): string 1733cfcd011fSBram Moolenaar var res = '' 1734158906cfSBram Moolenaar if what == 1 1735158906cfSBram Moolenaar res = "one" 1736158906cfSBram Moolenaar elseif what == 2 1737158906cfSBram Moolenaar res = "two" 1738a259d8d3SBram Moolenaar else 1739158906cfSBram Moolenaar res = "three" 1740a259d8d3SBram Moolenaar endif 1741158906cfSBram Moolenaar return res 1742a259d8d3SBram Moolenaarenddef 1743a259d8d3SBram Moolenaar 1744158906cfSBram Moolenaardef Test_if_elseif_else() 1745158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1746158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1747158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17480f18b6d1SBram Moolenaarenddef 17490f18b6d1SBram Moolenaar 1750e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1751d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1752d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1753d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1754ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1755d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 17566628b7ebSBram Moolenaar 17576628b7ebSBram Moolenaar var lines =<< trim END 17586628b7ebSBram Moolenaar var s = '' 17596628b7ebSBram Moolenaar if s = '' 17606628b7ebSBram Moolenaar endif 17616628b7ebSBram Moolenaar END 17626628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 17636628b7ebSBram Moolenaar 17646628b7ebSBram Moolenaar lines =<< trim END 17656628b7ebSBram Moolenaar var s = '' 17666628b7ebSBram Moolenaar if s == '' 17676628b7ebSBram Moolenaar elseif s = '' 17686628b7ebSBram Moolenaar endif 17696628b7ebSBram Moolenaar END 17706628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1771e8c4abbbSBram Moolenaarenddef 1772e8c4abbbSBram Moolenaar 17736d69bf60SBram Moolenaarlet g:bool_true = v:true 17746d69bf60SBram Moolenaarlet g:bool_false = v:false 17756d69bf60SBram Moolenaar 17766d69bf60SBram Moolenaardef Test_if_const_expr() 1777cfcd011fSBram Moolenaar var res = false 17786d69bf60SBram Moolenaar if true ? true : false 17796d69bf60SBram Moolenaar res = true 17806d69bf60SBram Moolenaar endif 17816d69bf60SBram Moolenaar assert_equal(true, res) 17826d69bf60SBram Moolenaar 1783585fea7bSBram Moolenaar g:glob = 2 1784585fea7bSBram Moolenaar if false 17856797966dSBram Moolenaar execute('g:glob = 3') 1786585fea7bSBram Moolenaar endif 1787585fea7bSBram Moolenaar assert_equal(2, g:glob) 1788585fea7bSBram Moolenaar if true 17896797966dSBram Moolenaar execute('g:glob = 3') 1790585fea7bSBram Moolenaar endif 1791585fea7bSBram Moolenaar assert_equal(3, g:glob) 1792585fea7bSBram Moolenaar 17936d69bf60SBram Moolenaar res = false 17946d69bf60SBram Moolenaar if g:bool_true ? true : false 17956d69bf60SBram Moolenaar res = true 17966d69bf60SBram Moolenaar endif 17976d69bf60SBram Moolenaar assert_equal(true, res) 17986d69bf60SBram Moolenaar 17996d69bf60SBram Moolenaar res = false 18006d69bf60SBram Moolenaar if true ? g:bool_true : false 18016d69bf60SBram Moolenaar res = true 18026d69bf60SBram Moolenaar endif 18036d69bf60SBram Moolenaar assert_equal(true, res) 18046d69bf60SBram Moolenaar 18056d69bf60SBram Moolenaar res = false 18066d69bf60SBram Moolenaar if true ? true : g:bool_false 18076d69bf60SBram Moolenaar res = true 18086d69bf60SBram Moolenaar endif 18096d69bf60SBram Moolenaar assert_equal(true, res) 18106d69bf60SBram Moolenaar 18116d69bf60SBram Moolenaar res = false 18126d69bf60SBram Moolenaar if true ? false : true 18136d69bf60SBram Moolenaar res = true 18146d69bf60SBram Moolenaar endif 18156d69bf60SBram Moolenaar assert_equal(false, res) 18166d69bf60SBram Moolenaar 18176d69bf60SBram Moolenaar res = false 18186d69bf60SBram Moolenaar if false ? false : true 18196d69bf60SBram Moolenaar res = true 18206d69bf60SBram Moolenaar endif 18216d69bf60SBram Moolenaar assert_equal(true, res) 18226d69bf60SBram Moolenaar 18236d69bf60SBram Moolenaar res = false 18246d69bf60SBram Moolenaar if false ? true : false 18256d69bf60SBram Moolenaar res = true 18266d69bf60SBram Moolenaar endif 18276d69bf60SBram Moolenaar assert_equal(false, res) 18286d69bf60SBram Moolenaar 18296d69bf60SBram Moolenaar res = false 1830e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1831e8c4abbbSBram Moolenaar res = true 1832e8c4abbbSBram Moolenaar endif 1833e8c4abbbSBram Moolenaar assert_equal(false, res) 1834e8c4abbbSBram Moolenaar 1835e8c4abbbSBram Moolenaar res = false 18366d69bf60SBram Moolenaar if true && true 18376d69bf60SBram Moolenaar res = true 18386d69bf60SBram Moolenaar endif 18396d69bf60SBram Moolenaar assert_equal(true, res) 18406d69bf60SBram Moolenaar 18416d69bf60SBram Moolenaar res = false 18426d69bf60SBram Moolenaar if true && false 18436d69bf60SBram Moolenaar res = true 18446d69bf60SBram Moolenaar endif 18456d69bf60SBram Moolenaar assert_equal(false, res) 18466d69bf60SBram Moolenaar 18476d69bf60SBram Moolenaar res = false 18486d69bf60SBram Moolenaar if g:bool_true && false 18496d69bf60SBram Moolenaar res = true 18506d69bf60SBram Moolenaar endif 18516d69bf60SBram Moolenaar assert_equal(false, res) 18526d69bf60SBram Moolenaar 18536d69bf60SBram Moolenaar res = false 18546d69bf60SBram Moolenaar if true && g:bool_false 18556d69bf60SBram Moolenaar res = true 18566d69bf60SBram Moolenaar endif 18576d69bf60SBram Moolenaar assert_equal(false, res) 18586d69bf60SBram Moolenaar 18596d69bf60SBram Moolenaar res = false 18606d69bf60SBram Moolenaar if false && false 18616d69bf60SBram Moolenaar res = true 18626d69bf60SBram Moolenaar endif 18636d69bf60SBram Moolenaar assert_equal(false, res) 18646d69bf60SBram Moolenaar 18656d69bf60SBram Moolenaar res = false 18666d69bf60SBram Moolenaar if true || false 18676d69bf60SBram Moolenaar res = true 18686d69bf60SBram Moolenaar endif 18696d69bf60SBram Moolenaar assert_equal(true, res) 18706d69bf60SBram Moolenaar 18716d69bf60SBram Moolenaar res = false 18726d69bf60SBram Moolenaar if g:bool_true || false 18736d69bf60SBram Moolenaar res = true 18746d69bf60SBram Moolenaar endif 18756d69bf60SBram Moolenaar assert_equal(true, res) 18766d69bf60SBram Moolenaar 18776d69bf60SBram Moolenaar res = false 18786d69bf60SBram Moolenaar if true || g:bool_false 18796d69bf60SBram Moolenaar res = true 18806d69bf60SBram Moolenaar endif 18816d69bf60SBram Moolenaar assert_equal(true, res) 18826d69bf60SBram Moolenaar 18836d69bf60SBram Moolenaar res = false 18846d69bf60SBram Moolenaar if false || false 18856d69bf60SBram Moolenaar res = true 18866d69bf60SBram Moolenaar endif 18876d69bf60SBram Moolenaar assert_equal(false, res) 18883988f64fSBram Moolenaar 18893988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 18903988f64fSBram Moolenaar if false | eval 0 | endif 18913988f64fSBram Moolenaar if false | eval burp + 234 | endif 18923988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 18933988f64fSBram Moolenaar if false 18943988f64fSBram Moolenaar burp 18953988f64fSBram Moolenaar endif 189680c34ca3SBram Moolenaarenddef 18976d69bf60SBram Moolenaar 189880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1899d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1900d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1901d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1902d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19036d69bf60SBram Moolenaarenddef 19046d69bf60SBram Moolenaar 190572abcf42SBram Moolenaardef RunNested(i: number): number 1906cfcd011fSBram Moolenaar var x: number = 0 190772abcf42SBram Moolenaar if i % 2 190872abcf42SBram Moolenaar if 1 1909f5be8cdbSBram Moolenaar # comment 191072abcf42SBram Moolenaar else 1911f5be8cdbSBram Moolenaar # comment 191272abcf42SBram Moolenaar endif 191372abcf42SBram Moolenaar x += 1 191472abcf42SBram Moolenaar else 191572abcf42SBram Moolenaar x += 1000 191672abcf42SBram Moolenaar endif 191772abcf42SBram Moolenaar return x 191872abcf42SBram Moolenaarenddef 191972abcf42SBram Moolenaar 192072abcf42SBram Moolenaardef Test_nested_if() 192172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 192272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 192372abcf42SBram Moolenaarenddef 192472abcf42SBram Moolenaar 1925ad39c094SBram Moolenaardef Test_execute_cmd() 1926e4984290SBram Moolenaar # missing argument is ignored 1927e4984290SBram Moolenaar execute 1928e4984290SBram Moolenaar execute # comment 1929e4984290SBram Moolenaar 1930ad39c094SBram Moolenaar new 1931ad39c094SBram Moolenaar setline(1, 'default') 1932d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1933ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1934a72cfb80SBram Moolenaar 1935d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1936a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1937a72cfb80SBram Moolenaar 1938cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1939cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1940a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1941ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1942a72cfb80SBram Moolenaar 1943d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1944ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1945a72cfb80SBram Moolenaar 1946cfcd011fSBram Moolenaar var cmd_first = 'call ' 1947cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1948ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1949ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1950ad39c094SBram Moolenaar bwipe! 1951585fea7bSBram Moolenaar 1952cfcd011fSBram Moolenaar var n = true 19532d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19542d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19552d6b20d6SBram Moolenaar 1956e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1957e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1958e5abf7afSBram Moolenaar 1959d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1960d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1961d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1962ad39c094SBram Moolenaarenddef 1963ad39c094SBram Moolenaar 196447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1965f5be8cdbSBram Moolenaar # only checks line continuation 1966cfcd011fSBram Moolenaar var lines =<< trim END 196747e880d6SBram Moolenaar vim9script 196847e880d6SBram Moolenaar execute 'g:someVar' 196947e880d6SBram Moolenaar .. ' = ' .. 197047e880d6SBram Moolenaar '28' 197147e880d6SBram Moolenaar assert_equal(28, g:someVar) 197247e880d6SBram Moolenaar unlet g:someVar 197347e880d6SBram Moolenaar END 197447e880d6SBram Moolenaar CheckScriptSuccess(lines) 197547e880d6SBram Moolenaarenddef 197647e880d6SBram Moolenaar 1977ad39c094SBram Moolenaardef Test_echo_cmd() 1978a72cfb80SBram Moolenaar echo 'some' # comment 1979585fea7bSBram Moolenaar echon 'thing' 1980ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1981ad39c094SBram Moolenaar 1982a72cfb80SBram Moolenaar echo "some" # comment 1983a72cfb80SBram Moolenaar echon "thing" 1984a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1985a72cfb80SBram Moolenaar 1986cfcd011fSBram Moolenaar var str1 = 'some' 1987cfcd011fSBram Moolenaar var str2 = 'more' 1988ad39c094SBram Moolenaar echo str1 str2 1989ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1990a72cfb80SBram Moolenaar 1991d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1992ad39c094SBram Moolenaarenddef 1993ad39c094SBram Moolenaar 1994f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1995f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1996f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1997f93c7feaSBram Moolenaar echo 'clear' 1998df069eecSBram Moolenaar :1messages 1999f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2000f93c7feaSBram Moolenaar 2001d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2002f93c7feaSBram Moolenaarenddef 2003f93c7feaSBram Moolenaar 200447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2005f5be8cdbSBram Moolenaar # only checks line continuation 2006cfcd011fSBram Moolenaar var lines =<< trim END 200747e880d6SBram Moolenaar vim9script 200847e880d6SBram Moolenaar echomsg 'here' 200947e880d6SBram Moolenaar .. ' is ' .. 201047e880d6SBram Moolenaar 'a message' 201147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 201247e880d6SBram Moolenaar END 201347e880d6SBram Moolenaar CheckScriptSuccess(lines) 201447e880d6SBram Moolenaarenddef 201547e880d6SBram Moolenaar 2016f93c7feaSBram Moolenaardef Test_echoerr_cmd() 201740ee466cSBram Moolenaar try 201840ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 201940ee466cSBram Moolenaar catch 202040ee466cSBram Moolenaar assert_match('something wrong', v:exception) 202140ee466cSBram Moolenaar endtry 2022f93c7feaSBram Moolenaarenddef 2023f93c7feaSBram Moolenaar 202447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2025f5be8cdbSBram Moolenaar # only checks line continuation 2026cfcd011fSBram Moolenaar var lines =<< trim END 202747e880d6SBram Moolenaar vim9script 202847e880d6SBram Moolenaar try 202947e880d6SBram Moolenaar echoerr 'this' 203047e880d6SBram Moolenaar .. ' is ' .. 203147e880d6SBram Moolenaar 'wrong' 203247e880d6SBram Moolenaar catch 203347e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 203447e880d6SBram Moolenaar endtry 203547e880d6SBram Moolenaar END 203647e880d6SBram Moolenaar CheckScriptSuccess(lines) 203747e880d6SBram Moolenaarenddef 203847e880d6SBram Moolenaar 203941fe0617SBram Moolenaardef Test_for_outside_of_function() 2040cfcd011fSBram Moolenaar var lines =<< trim END 204141fe0617SBram Moolenaar vim9script 204241fe0617SBram Moolenaar new 204341fe0617SBram Moolenaar for var in range(0, 3) 204441fe0617SBram Moolenaar append(line('$'), var) 204541fe0617SBram Moolenaar endfor 204641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 204741fe0617SBram Moolenaar bwipe! 204841fe0617SBram Moolenaar END 204941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 205041fe0617SBram Moolenaar source Xvim9for.vim 205141fe0617SBram Moolenaar delete('Xvim9for.vim') 205241fe0617SBram Moolenaarenddef 20538a7d6542SBram Moolenaar 2054e8c4abbbSBram Moolenaardef Test_for_loop() 2055cfcd011fSBram Moolenaar var result = '' 2056e8c4abbbSBram Moolenaar for cnt in range(7) 2057e8c4abbbSBram Moolenaar if cnt == 4 2058e8c4abbbSBram Moolenaar break 2059e8c4abbbSBram Moolenaar endif 2060e8c4abbbSBram Moolenaar if cnt == 2 2061e8c4abbbSBram Moolenaar continue 2062e8c4abbbSBram Moolenaar endif 2063e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2064e8c4abbbSBram Moolenaar endfor 2065e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20660ad3e894SBram Moolenaar 2067cfcd011fSBram Moolenaar var concat = '' 20680ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20690ad3e894SBram Moolenaar concat ..= str 20700ad3e894SBram Moolenaar endfor 20710ad3e894SBram Moolenaar assert_equal('onetwo', concat) 207238bd8de5SBram Moolenaar 207338bd8de5SBram Moolenaar var total = 0 207438bd8de5SBram Moolenaar for nr in 207538bd8de5SBram Moolenaar [1, 2, 3] 207638bd8de5SBram Moolenaar total += nr 207738bd8de5SBram Moolenaar endfor 207838bd8de5SBram Moolenaar assert_equal(6, total) 207938bd8de5SBram Moolenaar 208038bd8de5SBram Moolenaar total = 0 208138bd8de5SBram Moolenaar for nr 208238bd8de5SBram Moolenaar in [1, 2, 3] 208338bd8de5SBram Moolenaar total += nr 208438bd8de5SBram Moolenaar endfor 208538bd8de5SBram Moolenaar assert_equal(6, total) 208638bd8de5SBram Moolenaar 208738bd8de5SBram Moolenaar total = 0 208838bd8de5SBram Moolenaar for nr 208938bd8de5SBram Moolenaar in 209038bd8de5SBram Moolenaar [1, 2, 3] 209138bd8de5SBram Moolenaar total += nr 209238bd8de5SBram Moolenaar endfor 209338bd8de5SBram Moolenaar assert_equal(6, total) 2094036d0714SBram Moolenaar 2095036d0714SBram Moolenaar var res = "" 2096036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2097036d0714SBram Moolenaar res ..= n .. s 2098036d0714SBram Moolenaar endfor 2099036d0714SBram Moolenaar assert_equal('1a2b', res) 2100e8c4abbbSBram Moolenaarenddef 2101e8c4abbbSBram Moolenaar 2102e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2103025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2104025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2105025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2106675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2107675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2108cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2109822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21102d870f8dSBram Moolenaar delfunc! g:Func 2111451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2112675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2113675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2114675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2115e8c4abbbSBram Moolenaarenddef 2116e8c4abbbSBram Moolenaar 2117ea87069dSBram Moolenaardef Test_for_loop_script_var() 2118ea87069dSBram Moolenaar # cannot use s:var in a :def function 2119ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2120ea87069dSBram Moolenaar 2121ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2122ea87069dSBram Moolenaar var lines =<< trim END 2123ea87069dSBram Moolenaar vim9script 2124ea87069dSBram Moolenaar var total = 0 2125ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2126ea87069dSBram Moolenaar total += s:var 2127ea87069dSBram Moolenaar endfor 2128ea87069dSBram Moolenaar assert_equal(6, total) 2129ea87069dSBram Moolenaar 2130ea87069dSBram Moolenaar total = 0 2131ea87069dSBram Moolenaar for var in [1, 2, 3] 2132ea87069dSBram Moolenaar total += var 2133ea87069dSBram Moolenaar endfor 2134ea87069dSBram Moolenaar assert_equal(6, total) 2135ea87069dSBram Moolenaar END 2136ea87069dSBram Moolenaarenddef 2137ea87069dSBram Moolenaar 2138792f786aSBram Moolenaardef Test_for_loop_unpack() 21394b8a0651SBram Moolenaar var lines =<< trim END 2140792f786aSBram Moolenaar var result = [] 2141792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2142792f786aSBram Moolenaar result->add(v1) 2143792f786aSBram Moolenaar result->add(v2) 2144792f786aSBram Moolenaar endfor 2145792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2146792f786aSBram Moolenaar 2147792f786aSBram Moolenaar result = [] 2148792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2149792f786aSBram Moolenaar result->add(v1) 2150792f786aSBram Moolenaar result->add(v2) 2151792f786aSBram Moolenaar result->add(v3) 2152792f786aSBram Moolenaar endfor 2153792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2154792f786aSBram Moolenaar 21554b8a0651SBram Moolenaar result = [] 21564b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 21574b8a0651SBram Moolenaar result->add(&ts) 21584b8a0651SBram Moolenaar result->add(&sw) 21594b8a0651SBram Moolenaar endfor 21604b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 21614b8a0651SBram Moolenaar 21624b8a0651SBram Moolenaar var slist: list<string> 21634b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 21644b8a0651SBram Moolenaar slist->add($LOOPVAR) 21654b8a0651SBram Moolenaar slist->add(@r) 21664b8a0651SBram Moolenaar slist->add(v:errmsg) 21674b8a0651SBram Moolenaar endfor 21684b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 21694b8a0651SBram Moolenaar 21704b8a0651SBram Moolenaar slist = [] 21714b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 21724b8a0651SBram Moolenaar slist->add(g:globalvar) 21734b8a0651SBram Moolenaar slist->add(b:bufvar) 21744b8a0651SBram Moolenaar slist->add(w:winvar) 21754b8a0651SBram Moolenaar slist->add(t:tabvar) 21764b8a0651SBram Moolenaar endfor 21774b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2178f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 21794b8a0651SBram Moolenaar END 21804b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 21814b8a0651SBram Moolenaar 21824b8a0651SBram Moolenaar lines =<< trim END 2183792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2184792f786aSBram Moolenaar echo v1 v2 2185792f786aSBram Moolenaar endfor 2186792f786aSBram Moolenaar END 2187792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2188792f786aSBram Moolenaar 2189792f786aSBram Moolenaar lines =<< trim END 2190792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2191792f786aSBram Moolenaar echo v1 v2 2192792f786aSBram Moolenaar endfor 2193792f786aSBram Moolenaar END 2194792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2195792f786aSBram Moolenaar 2196792f786aSBram Moolenaar lines =<< trim END 2197792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2198792f786aSBram Moolenaar echo v1 2199792f786aSBram Moolenaar endfor 2200792f786aSBram Moolenaar END 2201792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2202792f786aSBram Moolenaarenddef 2203792f786aSBram Moolenaar 2204c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2205c150c09eSBram Moolenaar var looped = 0 2206c150c09eSBram Moolenaar var cleanup = 0 2207c150c09eSBram Moolenaar for i in range(3) 2208c150c09eSBram Moolenaar looped += 1 2209c150c09eSBram Moolenaar try 2210c150c09eSBram Moolenaar eval [][0] 2211c150c09eSBram Moolenaar catch 2212c150c09eSBram Moolenaar continue 2213c150c09eSBram Moolenaar finally 2214c150c09eSBram Moolenaar cleanup += 1 2215c150c09eSBram Moolenaar endtry 2216c150c09eSBram Moolenaar endfor 2217c150c09eSBram Moolenaar assert_equal(3, looped) 2218c150c09eSBram Moolenaar assert_equal(3, cleanup) 2219c150c09eSBram Moolenaarenddef 2220c150c09eSBram Moolenaar 2221d0df1aacSBram Moolenaardef Test_while_loop() 2222cfcd011fSBram Moolenaar var result = '' 2223cfcd011fSBram Moolenaar var cnt = 0 2224d0df1aacSBram Moolenaar while cnt < 555 2225d0df1aacSBram Moolenaar if cnt == 3 2226d0df1aacSBram Moolenaar break 2227d0df1aacSBram Moolenaar endif 2228d0df1aacSBram Moolenaar cnt += 1 2229d0df1aacSBram Moolenaar if cnt == 2 2230d0df1aacSBram Moolenaar continue 2231d0df1aacSBram Moolenaar endif 2232d0df1aacSBram Moolenaar result ..= cnt .. '_' 2233d0df1aacSBram Moolenaar endwhile 2234d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2235dee37dc7SBram Moolenaar 2236dee37dc7SBram Moolenaar var s = '' 22370123cc1eSBram Moolenaar while s == 'x' #{comment} 2238dee37dc7SBram Moolenaar endwhile 2239d0df1aacSBram Moolenaarenddef 2240d0df1aacSBram Moolenaar 2241e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2242675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2243675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2244675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2245675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2246675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2247675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2248675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 22496628b7ebSBram Moolenaar 22506628b7ebSBram Moolenaar var lines =<< trim END 22516628b7ebSBram Moolenaar var s = '' 22526628b7ebSBram Moolenaar while s = '' 22536628b7ebSBram Moolenaar endwhile 22546628b7ebSBram Moolenaar END 22556628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2256bd5da371SBram Moolenaarenddef 2257bd5da371SBram Moolenaar 22589645e2d9SBram Moolenaardef Test_interrupt_loop() 2259cfcd011fSBram Moolenaar var caught = false 2260cfcd011fSBram Moolenaar var x = 0 226197acfc78SBram Moolenaar try 22629645e2d9SBram Moolenaar while 1 22639645e2d9SBram Moolenaar x += 1 22649645e2d9SBram Moolenaar if x == 100 22659645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22669645e2d9SBram Moolenaar endif 22679645e2d9SBram Moolenaar endwhile 226897acfc78SBram Moolenaar catch 226997acfc78SBram Moolenaar caught = true 227097acfc78SBram Moolenaar assert_equal(100, x) 227197acfc78SBram Moolenaar endtry 227297acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 227325859dd7SBram Moolenaar # consume the CTRL-C 227425859dd7SBram Moolenaar getchar(0) 22759645e2d9SBram Moolenaarenddef 227620431c9dSBram Moolenaar 22774fdae999SBram Moolenaardef Test_automatic_line_continuation() 2278cfcd011fSBram Moolenaar var mylist = [ 22794fdae999SBram Moolenaar 'one', 22804fdae999SBram Moolenaar 'two', 22814fdae999SBram Moolenaar 'three', 2282f5be8cdbSBram Moolenaar ] # comment 22834fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22844fdae999SBram Moolenaar 2285cfcd011fSBram Moolenaar var mydict = { 2286e0de171eSBram Moolenaar ['one']: 1, 2287e0de171eSBram Moolenaar ['two']: 2, 2288e0de171eSBram Moolenaar ['three']: 22894fdae999SBram Moolenaar 3, 2290f5be8cdbSBram Moolenaar } # comment 2291e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2292e0de171eSBram Moolenaar mydict = { 22932c330432SBram Moolenaar one: 1, # comment 22942c330432SBram Moolenaar two: # comment 22952c330432SBram Moolenaar 2, # comment 22962c330432SBram Moolenaar three: 3 # comment 22972c330432SBram Moolenaar } 2298e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2299e0de171eSBram Moolenaar mydict = { 23002c330432SBram Moolenaar one: 1, 23014fdae999SBram Moolenaar two: 23024fdae999SBram Moolenaar 2, 23032c330432SBram Moolenaar three: 3 23044fdae999SBram Moolenaar } 2305e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2306e6085c53SBram Moolenaar 2307e6085c53SBram Moolenaar assert_equal( 2308e6085c53SBram Moolenaar ['one', 'two', 'three'], 2309e6085c53SBram Moolenaar split('one two three') 2310e6085c53SBram Moolenaar ) 23114fdae999SBram Moolenaarenddef 23124fdae999SBram Moolenaar 23137a092245SBram Moolenaardef Test_vim9_comment() 23147a092245SBram Moolenaar CheckScriptSuccess([ 23157a092245SBram Moolenaar 'vim9script', 23167a092245SBram Moolenaar '# something', 231793f82cbeSBram Moolenaar '#something', 231893f82cbeSBram Moolenaar '#{something', 23197a092245SBram Moolenaar ]) 232093f82cbeSBram Moolenaar 232193f82cbeSBram Moolenaar split Xfile 232293f82cbeSBram Moolenaar CheckScriptSuccess([ 232393f82cbeSBram Moolenaar 'vim9script', 232493f82cbeSBram Moolenaar 'edit #something', 232593f82cbeSBram Moolenaar ]) 232693f82cbeSBram Moolenaar CheckScriptSuccess([ 232793f82cbeSBram Moolenaar 'vim9script', 232893f82cbeSBram Moolenaar 'edit #{something', 232993f82cbeSBram Moolenaar ]) 233093f82cbeSBram Moolenaar close 233193f82cbeSBram Moolenaar 23327a092245SBram Moolenaar CheckScriptFailure([ 23337a092245SBram Moolenaar 'vim9script', 23347a092245SBram Moolenaar ':# something', 23357a092245SBram Moolenaar ], 'E488:') 23367a092245SBram Moolenaar CheckScriptFailure([ 23377a092245SBram Moolenaar '# something', 23387a092245SBram Moolenaar ], 'E488:') 23397a092245SBram Moolenaar CheckScriptFailure([ 23407a092245SBram Moolenaar ':# something', 23417a092245SBram Moolenaar ], 'E488:') 23427a092245SBram Moolenaar 23434a8d9f2eSBram Moolenaar { # block start 23444a8d9f2eSBram Moolenaar } # block end 23454a8d9f2eSBram Moolenaar CheckDefFailure([ 23464a8d9f2eSBram Moolenaar '{# comment', 23474a8d9f2eSBram Moolenaar ], 'E488:') 23484a8d9f2eSBram Moolenaar CheckDefFailure([ 23494a8d9f2eSBram Moolenaar '{', 23504a8d9f2eSBram Moolenaar '}# comment', 23514a8d9f2eSBram Moolenaar ], 'E488:') 23524a8d9f2eSBram Moolenaar 23534a8d9f2eSBram Moolenaar echo "yes" # comment 23544a8d9f2eSBram Moolenaar CheckDefFailure([ 23554a8d9f2eSBram Moolenaar 'echo "yes"# comment', 23564a8d9f2eSBram Moolenaar ], 'E488:') 23577a092245SBram Moolenaar CheckScriptSuccess([ 23587a092245SBram Moolenaar 'vim9script', 23597a092245SBram Moolenaar 'echo "yes" # something', 23607a092245SBram Moolenaar ]) 23617a092245SBram Moolenaar CheckScriptFailure([ 23627a092245SBram Moolenaar 'vim9script', 23637a092245SBram Moolenaar 'echo "yes"# something', 23647a092245SBram Moolenaar ], 'E121:') 23657a092245SBram Moolenaar CheckScriptFailure([ 23667a092245SBram Moolenaar 'vim9script', 23677a092245SBram Moolenaar 'echo# something', 2368f8103f27SBram Moolenaar ], 'E1144:') 23697a092245SBram Moolenaar CheckScriptFailure([ 23707a092245SBram Moolenaar 'echo "yes" # something', 23717a092245SBram Moolenaar ], 'E121:') 23727a092245SBram Moolenaar 23734a8d9f2eSBram Moolenaar exe "echo" # comment 23744a8d9f2eSBram Moolenaar CheckDefFailure([ 23754a8d9f2eSBram Moolenaar 'exe "echo"# comment', 23764a8d9f2eSBram Moolenaar ], 'E488:') 23774a8d9f2eSBram Moolenaar CheckScriptSuccess([ 23784a8d9f2eSBram Moolenaar 'vim9script', 23794a8d9f2eSBram Moolenaar 'exe "echo" # something', 23804a8d9f2eSBram Moolenaar ]) 23814a8d9f2eSBram Moolenaar CheckScriptFailure([ 23824a8d9f2eSBram Moolenaar 'vim9script', 23834a8d9f2eSBram Moolenaar 'exe "echo"# something', 23844a8d9f2eSBram Moolenaar ], 'E121:') 23854a8d9f2eSBram Moolenaar CheckScriptFailure([ 23864a8d9f2eSBram Moolenaar 'vim9script', 23874a8d9f2eSBram Moolenaar 'exe# something', 2388f8103f27SBram Moolenaar ], 'E1144:') 23894a8d9f2eSBram Moolenaar CheckScriptFailure([ 23904a8d9f2eSBram Moolenaar 'exe "echo" # something', 23914a8d9f2eSBram Moolenaar ], 'E121:') 23924a8d9f2eSBram Moolenaar 23937a092245SBram Moolenaar CheckDefFailure([ 23947a092245SBram Moolenaar 'try# comment', 23957a092245SBram Moolenaar ' echo "yes"', 23967a092245SBram Moolenaar 'catch', 23977a092245SBram Moolenaar 'endtry', 2398f8103f27SBram Moolenaar ], 'E1144:') 23992c5ed4e3SBram Moolenaar CheckScriptFailure([ 24002c5ed4e3SBram Moolenaar 'vim9script', 24012c5ed4e3SBram Moolenaar 'try# comment', 24022c5ed4e3SBram Moolenaar 'echo "yes"', 2403f8103f27SBram Moolenaar ], 'E1144:') 24047a092245SBram Moolenaar CheckDefFailure([ 24057a092245SBram Moolenaar 'try', 2406a72cfb80SBram Moolenaar ' throw#comment', 2407a72cfb80SBram Moolenaar 'catch', 2408a72cfb80SBram Moolenaar 'endtry', 2409f8103f27SBram Moolenaar ], 'E1144:') 2410a72cfb80SBram Moolenaar CheckDefFailure([ 2411a72cfb80SBram Moolenaar 'try', 2412a72cfb80SBram Moolenaar ' throw "yes"#comment', 2413a72cfb80SBram Moolenaar 'catch', 2414a72cfb80SBram Moolenaar 'endtry', 2415a72cfb80SBram Moolenaar ], 'E488:') 2416a72cfb80SBram Moolenaar CheckDefFailure([ 2417a72cfb80SBram Moolenaar 'try', 24187a092245SBram Moolenaar ' echo "yes"', 24197a092245SBram Moolenaar 'catch# comment', 24207a092245SBram Moolenaar 'endtry', 2421f8103f27SBram Moolenaar ], 'E1144:') 24222c5ed4e3SBram Moolenaar CheckScriptFailure([ 24232c5ed4e3SBram Moolenaar 'vim9script', 24242c5ed4e3SBram Moolenaar 'try', 24252c5ed4e3SBram Moolenaar ' echo "yes"', 24262c5ed4e3SBram Moolenaar 'catch# comment', 24272c5ed4e3SBram Moolenaar 'endtry', 2428f8103f27SBram Moolenaar ], 'E1144:') 24292c5ed4e3SBram Moolenaar CheckDefFailure([ 24302c5ed4e3SBram Moolenaar 'try', 24312c5ed4e3SBram Moolenaar ' echo "yes"', 24322c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24332c5ed4e3SBram Moolenaar 'endtry', 24342c5ed4e3SBram Moolenaar ], 'E488:') 24357a092245SBram Moolenaar CheckDefFailure([ 24367a092245SBram Moolenaar 'try', 24377a092245SBram Moolenaar 'echo "yes"', 24387a092245SBram Moolenaar 'catch', 24397a092245SBram Moolenaar 'endtry# comment', 2440f8103f27SBram Moolenaar ], 'E1144:') 24412c5ed4e3SBram Moolenaar CheckScriptFailure([ 24422c5ed4e3SBram Moolenaar 'vim9script', 24432c5ed4e3SBram Moolenaar 'try', 24442c5ed4e3SBram Moolenaar ' echo "yes"', 24452c5ed4e3SBram Moolenaar 'catch', 24462c5ed4e3SBram Moolenaar 'endtry# comment', 2447f8103f27SBram Moolenaar ], 'E1144:') 24482c5ed4e3SBram Moolenaar 24492c5ed4e3SBram Moolenaar CheckScriptSuccess([ 24502c5ed4e3SBram Moolenaar 'vim9script', 24512c5ed4e3SBram Moolenaar 'hi # comment', 24522c5ed4e3SBram Moolenaar ]) 24532c5ed4e3SBram Moolenaar CheckScriptFailure([ 24542c5ed4e3SBram Moolenaar 'vim9script', 24552c5ed4e3SBram Moolenaar 'hi# comment', 2456f8103f27SBram Moolenaar ], 'E1144:') 24571966c248SBram Moolenaar CheckScriptSuccess([ 24581966c248SBram Moolenaar 'vim9script', 24591966c248SBram Moolenaar 'hi Search # comment', 24601966c248SBram Moolenaar ]) 24611966c248SBram Moolenaar CheckScriptFailure([ 24621966c248SBram Moolenaar 'vim9script', 24631966c248SBram Moolenaar 'hi Search# comment', 24641966c248SBram Moolenaar ], 'E416:') 24651966c248SBram Moolenaar CheckScriptSuccess([ 24661966c248SBram Moolenaar 'vim9script', 24671966c248SBram Moolenaar 'hi link This Search # comment', 24681966c248SBram Moolenaar ]) 24691966c248SBram Moolenaar CheckScriptFailure([ 24701966c248SBram Moolenaar 'vim9script', 24711966c248SBram Moolenaar 'hi link This That# comment', 24721966c248SBram Moolenaar ], 'E413:') 24731966c248SBram Moolenaar CheckScriptSuccess([ 24741966c248SBram Moolenaar 'vim9script', 24751966c248SBram Moolenaar 'hi clear This # comment', 24761966c248SBram Moolenaar 'hi clear # comment', 24771966c248SBram Moolenaar ]) 2478f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2479f5be8cdbSBram Moolenaar # hi clear This# comment', 24801966c248SBram Moolenaar CheckScriptFailure([ 24811966c248SBram Moolenaar 'vim9script', 24821966c248SBram Moolenaar 'hi clear# comment', 24831966c248SBram Moolenaar ], 'E416:') 24841966c248SBram Moolenaar 24851966c248SBram Moolenaar CheckScriptSuccess([ 24861966c248SBram Moolenaar 'vim9script', 24871966c248SBram Moolenaar 'hi Group term=bold', 24881966c248SBram Moolenaar 'match Group /todo/ # comment', 24891966c248SBram Moolenaar ]) 24901966c248SBram Moolenaar CheckScriptFailure([ 24911966c248SBram Moolenaar 'vim9script', 24921966c248SBram Moolenaar 'hi Group term=bold', 24931966c248SBram Moolenaar 'match Group /todo/# comment', 24941966c248SBram Moolenaar ], 'E488:') 24951966c248SBram Moolenaar CheckScriptSuccess([ 24961966c248SBram Moolenaar 'vim9script', 24971966c248SBram Moolenaar 'match # comment', 24981966c248SBram Moolenaar ]) 24991966c248SBram Moolenaar CheckScriptFailure([ 25001966c248SBram Moolenaar 'vim9script', 25011966c248SBram Moolenaar 'match# comment', 2502f8103f27SBram Moolenaar ], 'E1144:') 25031966c248SBram Moolenaar CheckScriptSuccess([ 25041966c248SBram Moolenaar 'vim9script', 25051966c248SBram Moolenaar 'match none # comment', 25061966c248SBram Moolenaar ]) 25071966c248SBram Moolenaar CheckScriptFailure([ 25081966c248SBram Moolenaar 'vim9script', 25091966c248SBram Moolenaar 'match none# comment', 25101966c248SBram Moolenaar ], 'E475:') 25111966c248SBram Moolenaar 25121966c248SBram Moolenaar CheckScriptSuccess([ 25131966c248SBram Moolenaar 'vim9script', 25141966c248SBram Moolenaar 'menutrans clear # comment', 25151966c248SBram Moolenaar ]) 25161966c248SBram Moolenaar CheckScriptFailure([ 25171966c248SBram Moolenaar 'vim9script', 25181966c248SBram Moolenaar 'menutrans clear# comment text', 25191966c248SBram Moolenaar ], 'E474:') 25201966c248SBram Moolenaar 25211966c248SBram Moolenaar CheckScriptSuccess([ 25221966c248SBram Moolenaar 'vim9script', 25231966c248SBram Moolenaar 'syntax clear # comment', 25241966c248SBram Moolenaar ]) 25251966c248SBram Moolenaar CheckScriptFailure([ 25261966c248SBram Moolenaar 'vim9script', 25271966c248SBram Moolenaar 'syntax clear# comment text', 25281966c248SBram Moolenaar ], 'E28:') 25291966c248SBram Moolenaar CheckScriptSuccess([ 25301966c248SBram Moolenaar 'vim9script', 25311966c248SBram Moolenaar 'syntax keyword Word some', 25321966c248SBram Moolenaar 'syntax clear Word # comment', 25331966c248SBram Moolenaar ]) 25341966c248SBram Moolenaar CheckScriptFailure([ 25351966c248SBram Moolenaar 'vim9script', 25361966c248SBram Moolenaar 'syntax keyword Word some', 25371966c248SBram Moolenaar 'syntax clear Word# comment text', 25381966c248SBram Moolenaar ], 'E28:') 25391966c248SBram Moolenaar 25401966c248SBram Moolenaar CheckScriptSuccess([ 25411966c248SBram Moolenaar 'vim9script', 25421966c248SBram Moolenaar 'syntax list # comment', 25431966c248SBram Moolenaar ]) 25441966c248SBram Moolenaar CheckScriptFailure([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'syntax list# comment text', 25471966c248SBram Moolenaar ], 'E28:') 25481966c248SBram Moolenaar 25491966c248SBram Moolenaar CheckScriptSuccess([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 25521966c248SBram Moolenaar ]) 25531966c248SBram Moolenaar CheckScriptFailure([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 25561966c248SBram Moolenaar ], 'E475:') 25571966c248SBram Moolenaar 25581966c248SBram Moolenaar CheckScriptSuccess([ 25591966c248SBram Moolenaar 'vim9script', 25601966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 25611966c248SBram Moolenaar ]) 25621966c248SBram Moolenaar CheckScriptFailure([ 25631966c248SBram Moolenaar 'vim9script', 25641966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25651966c248SBram Moolenaar ], 'E789:') 25661966c248SBram Moolenaar 25671966c248SBram Moolenaar CheckScriptSuccess([ 25681966c248SBram Moolenaar 'vim9script', 25691966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 25701966c248SBram Moolenaar ]) 25711966c248SBram Moolenaar CheckScriptFailure([ 25721966c248SBram Moolenaar 'vim9script', 25731966c248SBram Moolenaar 'syntax match Word /pat/# comment', 25741966c248SBram Moolenaar ], 'E402:') 25751966c248SBram Moolenaar 25761966c248SBram Moolenaar CheckScriptSuccess([ 25771966c248SBram Moolenaar 'vim9script', 25781966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25791966c248SBram Moolenaar ]) 25801966c248SBram Moolenaar CheckScriptFailure([ 25811966c248SBram Moolenaar 'vim9script', 25821966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25831966c248SBram Moolenaar ], 'E475:') 25841966c248SBram Moolenaar CheckScriptFailure([ 25851966c248SBram Moolenaar 'vim9script', 25861966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25871966c248SBram Moolenaar ], 'E406:') 25881966c248SBram Moolenaar CheckScriptFailure([ 25891966c248SBram Moolenaar 'vim9script', 25901966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25911966c248SBram Moolenaar ], 'E475:') 25921966c248SBram Moolenaar 25931966c248SBram Moolenaar CheckScriptSuccess([ 25941966c248SBram Moolenaar 'vim9script', 25951966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25961966c248SBram Moolenaar ]) 25971966c248SBram Moolenaar CheckScriptFailure([ 25981966c248SBram Moolenaar 'vim9script', 25991966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2600d032f34aSBram Moolenaar ], 'E402:') 26011966c248SBram Moolenaar 26021966c248SBram Moolenaar CheckScriptSuccess([ 26031966c248SBram Moolenaar 'vim9script', 26041966c248SBram Moolenaar 'syntax sync # comment', 26051966c248SBram Moolenaar ]) 26061966c248SBram Moolenaar CheckScriptFailure([ 26071966c248SBram Moolenaar 'vim9script', 26081966c248SBram Moolenaar 'syntax sync# comment', 26091966c248SBram Moolenaar ], 'E404:') 26101966c248SBram Moolenaar CheckScriptSuccess([ 26111966c248SBram Moolenaar 'vim9script', 26121966c248SBram Moolenaar 'syntax sync ccomment # comment', 26131966c248SBram Moolenaar ]) 26141966c248SBram Moolenaar CheckScriptFailure([ 26151966c248SBram Moolenaar 'vim9script', 26161966c248SBram Moolenaar 'syntax sync ccomment# comment', 26171966c248SBram Moolenaar ], 'E404:') 26181966c248SBram Moolenaar 26191966c248SBram Moolenaar CheckScriptSuccess([ 26201966c248SBram Moolenaar 'vim9script', 26211966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26221966c248SBram Moolenaar ]) 26231966c248SBram Moolenaar CheckScriptFailure([ 26241966c248SBram Moolenaar 'vim9script', 26251966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 26261966c248SBram Moolenaar ], 'E475:') 2627a72cfb80SBram Moolenaar 2628a72cfb80SBram Moolenaar CheckScriptSuccess([ 2629a72cfb80SBram Moolenaar 'vim9script', 2630a72cfb80SBram Moolenaar 'command Echo echo # comment', 2631a72cfb80SBram Moolenaar 'command Echo # comment', 26322d870f8dSBram Moolenaar 'delcommand Echo', 2633a72cfb80SBram Moolenaar ]) 2634a72cfb80SBram Moolenaar CheckScriptFailure([ 2635a72cfb80SBram Moolenaar 'vim9script', 2636a72cfb80SBram Moolenaar 'command Echo echo# comment', 2637a72cfb80SBram Moolenaar 'Echo', 2638f8103f27SBram Moolenaar ], 'E1144:') 26392d870f8dSBram Moolenaar delcommand Echo 264070249ee8SBram Moolenaar 264170249ee8SBram Moolenaar var curdir = getcwd() 264270249ee8SBram Moolenaar CheckScriptSuccess([ 264370249ee8SBram Moolenaar 'command Echo cd " comment', 264470249ee8SBram Moolenaar 'Echo', 264570249ee8SBram Moolenaar 'delcommand Echo', 264670249ee8SBram Moolenaar ]) 264770249ee8SBram Moolenaar CheckScriptSuccess([ 2648090728adSBram Moolenaar 'vim9script', 264970249ee8SBram Moolenaar 'command Echo cd # comment', 265070249ee8SBram Moolenaar 'Echo', 265170249ee8SBram Moolenaar 'delcommand Echo', 265270249ee8SBram Moolenaar ]) 265370249ee8SBram Moolenaar CheckScriptFailure([ 265470249ee8SBram Moolenaar 'vim9script', 265570249ee8SBram Moolenaar 'command Echo cd " comment', 265670249ee8SBram Moolenaar 'Echo', 265770249ee8SBram Moolenaar ], 'E344:') 265870249ee8SBram Moolenaar delcommand Echo 265970249ee8SBram Moolenaar chdir(curdir) 266070249ee8SBram Moolenaar 2661a72cfb80SBram Moolenaar CheckScriptFailure([ 2662a72cfb80SBram Moolenaar 'vim9script', 2663a72cfb80SBram Moolenaar 'command Echo# comment', 2664a72cfb80SBram Moolenaar ], 'E182:') 2665a72cfb80SBram Moolenaar CheckScriptFailure([ 2666a72cfb80SBram Moolenaar 'vim9script', 2667a72cfb80SBram Moolenaar 'command Echo echo', 2668a72cfb80SBram Moolenaar 'command Echo# comment', 2669a72cfb80SBram Moolenaar ], 'E182:') 26702d870f8dSBram Moolenaar delcommand Echo 2671a72cfb80SBram Moolenaar 2672a72cfb80SBram Moolenaar CheckScriptSuccess([ 2673a72cfb80SBram Moolenaar 'vim9script', 2674a72cfb80SBram Moolenaar 'function # comment', 2675a72cfb80SBram Moolenaar ]) 2676a72cfb80SBram Moolenaar CheckScriptFailure([ 2677a72cfb80SBram Moolenaar 'vim9script', 26789898107fSBram Moolenaar 'function " comment', 26799898107fSBram Moolenaar ], 'E129:') 26809898107fSBram Moolenaar CheckScriptFailure([ 26819898107fSBram Moolenaar 'vim9script', 2682a72cfb80SBram Moolenaar 'function# comment', 2683f8103f27SBram Moolenaar ], 'E1144:') 2684a72cfb80SBram Moolenaar CheckScriptSuccess([ 2685a72cfb80SBram Moolenaar 'vim9script', 2686a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2687a72cfb80SBram Moolenaar ]) 2688a72cfb80SBram Moolenaar CheckScriptFailure([ 2689a72cfb80SBram Moolenaar 'vim9script', 2690a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2691a72cfb80SBram Moolenaar ], 'E488:') 2692a72cfb80SBram Moolenaar 2693a72cfb80SBram Moolenaar CheckScriptSuccess([ 2694a72cfb80SBram Moolenaar 'vim9script', 26954c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2696a72cfb80SBram Moolenaar 'endfunc', 26974c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2698a72cfb80SBram Moolenaar ]) 2699a72cfb80SBram Moolenaar CheckScriptFailure([ 2700a72cfb80SBram Moolenaar 'vim9script', 27014c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2702a72cfb80SBram Moolenaar 'endfunc', 27034c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2704a72cfb80SBram Moolenaar ], 'E488:') 2705a72cfb80SBram Moolenaar 2706a72cfb80SBram Moolenaar CheckScriptSuccess([ 2707a72cfb80SBram Moolenaar 'vim9script', 2708a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2709a72cfb80SBram Moolenaar ]) 2710a72cfb80SBram Moolenaar CheckScriptFailure([ 2711a72cfb80SBram Moolenaar 'vim9script', 2712a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2713a72cfb80SBram Moolenaar ], 'E488:') 2714e7e4838fSBram Moolenaar 2715e7e4838fSBram Moolenaar CheckScriptFailure([ 2716e7e4838fSBram Moolenaar 'def Test() " comment', 2717e7e4838fSBram Moolenaar 'enddef', 2718e7e4838fSBram Moolenaar ], 'E488:') 2719e7e4838fSBram Moolenaar CheckScriptFailure([ 2720e7e4838fSBram Moolenaar 'vim9script', 2721e7e4838fSBram Moolenaar 'def Test() " comment', 2722e7e4838fSBram Moolenaar 'enddef', 2723e7e4838fSBram Moolenaar ], 'E488:') 2724e7e4838fSBram Moolenaar 2725e7e4838fSBram Moolenaar CheckScriptSuccess([ 2726e7e4838fSBram Moolenaar 'func Test() " comment', 2727e7e4838fSBram Moolenaar 'endfunc', 27282d870f8dSBram Moolenaar 'delfunc Test', 2729e7e4838fSBram Moolenaar ]) 27309898107fSBram Moolenaar CheckScriptSuccess([ 2731e7e4838fSBram Moolenaar 'vim9script', 2732e7e4838fSBram Moolenaar 'func Test() " comment', 2733e7e4838fSBram Moolenaar 'endfunc', 27349898107fSBram Moolenaar ]) 2735e7e4838fSBram Moolenaar 2736e7e4838fSBram Moolenaar CheckScriptSuccess([ 2737e7e4838fSBram Moolenaar 'def Test() # comment', 2738e7e4838fSBram Moolenaar 'enddef', 2739e7e4838fSBram Moolenaar ]) 2740e7e4838fSBram Moolenaar CheckScriptFailure([ 2741e7e4838fSBram Moolenaar 'func Test() # comment', 2742e7e4838fSBram Moolenaar 'endfunc', 2743e7e4838fSBram Moolenaar ], 'E488:') 27442c5ed4e3SBram Moolenaarenddef 27452c5ed4e3SBram Moolenaar 27462c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 27472c5ed4e3SBram Moolenaar CheckCanRunGui 27482c5ed4e3SBram Moolenaar 27492c5ed4e3SBram Moolenaar CheckScriptFailure([ 27502c5ed4e3SBram Moolenaar 'vim9script', 27512c5ed4e3SBram Moolenaar 'gui#comment' 2752f8103f27SBram Moolenaar ], 'E1144:') 27532c5ed4e3SBram Moolenaar CheckScriptFailure([ 27542c5ed4e3SBram Moolenaar 'vim9script', 27552c5ed4e3SBram Moolenaar 'gui -f#comment' 27562c5ed4e3SBram Moolenaar ], 'E499:') 27577a092245SBram Moolenaarenddef 27587a092245SBram Moolenaar 2759a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 27606797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 27616797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2762a26b9700SBram Moolenaar 2763a26b9700SBram Moolenaar edit test.vim 2764a26b9700SBram Moolenaar doautocmd TabEnter #comment 2765a26b9700SBram Moolenaar assert_equal(1, g:entered) 2766a26b9700SBram Moolenaar 2767a26b9700SBram Moolenaar doautocmd TabEnter f.x 2768a26b9700SBram Moolenaar assert_equal(2, g:entered) 2769a26b9700SBram Moolenaar 2770a26b9700SBram Moolenaar g:entered = 0 2771a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2772a26b9700SBram Moolenaar assert_equal(2, g:entered) 2773a26b9700SBram Moolenaar 2774a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2775a26b9700SBram Moolenaar 2776a26b9700SBram Moolenaar au! TabEnter 2777a26b9700SBram Moolenaar unlet g:entered 2778d72c1bf0SBram Moolenaar 2779d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2780d72c1bf0SBram Moolenaar 'vim9script', 27816797966dSBram Moolenaar 'g:var = 123', 2782e55b1c09SBram Moolenaar 'b:var = 456', 2783e55b1c09SBram Moolenaar 'w:var = 777', 2784e55b1c09SBram Moolenaar 't:var = 888', 2785d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2786d72c1bf0SBram Moolenaar ]) 2787d72c1bf0SBram Moolenaar 2788d72c1bf0SBram Moolenaar CheckScriptFailure([ 2789d72c1bf0SBram Moolenaar 'vim9script', 2790cfcd011fSBram Moolenaar 'let var = 123', 2791cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2792cfcd011fSBram Moolenaar 2793cfcd011fSBram Moolenaar CheckScriptFailure([ 2794cfcd011fSBram Moolenaar 'vim9script', 2795cfcd011fSBram Moolenaar 'var g:var = 123', 2796e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2797e55b1c09SBram Moolenaar 2798e55b1c09SBram Moolenaar CheckScriptFailure([ 2799e55b1c09SBram Moolenaar 'vim9script', 2800cfcd011fSBram Moolenaar 'var b:var = 123', 2801e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2802e55b1c09SBram Moolenaar 2803e55b1c09SBram Moolenaar CheckScriptFailure([ 2804e55b1c09SBram Moolenaar 'vim9script', 2805cfcd011fSBram Moolenaar 'var w:var = 123', 2806e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2807e55b1c09SBram Moolenaar 2808e55b1c09SBram Moolenaar CheckScriptFailure([ 2809e55b1c09SBram Moolenaar 'vim9script', 2810cfcd011fSBram Moolenaar 'var t:var = 123', 2811e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2812e55b1c09SBram Moolenaar 2813e55b1c09SBram Moolenaar CheckScriptFailure([ 2814e55b1c09SBram Moolenaar 'vim9script', 2815cfcd011fSBram Moolenaar 'var v:version = 123', 2816e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2817e55b1c09SBram Moolenaar 2818e55b1c09SBram Moolenaar CheckScriptFailure([ 2819e55b1c09SBram Moolenaar 'vim9script', 2820cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2821e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28226797966dSBram Moolenaar 28236797966dSBram Moolenaar CheckScriptFailure([ 28246797966dSBram Moolenaar 'vim9script', 28256797966dSBram Moolenaar 'g:var = 123', 282632e35117SBram Moolenaar 'unlet g:var# comment1', 2827d72c1bf0SBram Moolenaar ], 'E108:') 2828d72c1bf0SBram Moolenaar 2829d72c1bf0SBram Moolenaar CheckScriptFailure([ 2830d72c1bf0SBram Moolenaar 'let g:var = 123', 2831d72c1bf0SBram Moolenaar 'unlet g:var # something', 2832d72c1bf0SBram Moolenaar ], 'E488:') 2833faac4104SBram Moolenaar 2834faac4104SBram Moolenaar CheckScriptSuccess([ 2835faac4104SBram Moolenaar 'vim9script', 283632e35117SBram Moolenaar 'if 1 # comment2', 2837faac4104SBram Moolenaar ' echo "yes"', 2838faac4104SBram Moolenaar 'elseif 2 #comment', 2839faac4104SBram Moolenaar ' echo "no"', 2840faac4104SBram Moolenaar 'endif', 2841faac4104SBram Moolenaar ]) 2842faac4104SBram Moolenaar 2843faac4104SBram Moolenaar CheckScriptFailure([ 2844faac4104SBram Moolenaar 'vim9script', 284532e35117SBram Moolenaar 'if 1# comment3', 2846faac4104SBram Moolenaar ' echo "yes"', 2847faac4104SBram Moolenaar 'endif', 2848faac4104SBram Moolenaar ], 'E15:') 2849faac4104SBram Moolenaar 2850faac4104SBram Moolenaar CheckScriptFailure([ 2851faac4104SBram Moolenaar 'vim9script', 285232e35117SBram Moolenaar 'if 0 # comment4', 2853faac4104SBram Moolenaar ' echo "yes"', 2854faac4104SBram Moolenaar 'elseif 2#comment', 2855faac4104SBram Moolenaar ' echo "no"', 2856faac4104SBram Moolenaar 'endif', 2857faac4104SBram Moolenaar ], 'E15:') 2858faac4104SBram Moolenaar 2859faac4104SBram Moolenaar CheckScriptSuccess([ 2860faac4104SBram Moolenaar 'vim9script', 2861cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2862faac4104SBram Moolenaar ]) 2863faac4104SBram Moolenaar 2864faac4104SBram Moolenaar CheckScriptFailure([ 2865faac4104SBram Moolenaar 'vim9script', 2866cfcd011fSBram Moolenaar 'var v = 1# comment6', 286732e35117SBram Moolenaar ], 'E15:') 2868faac4104SBram Moolenaar 2869faac4104SBram Moolenaar CheckScriptSuccess([ 2870faac4104SBram Moolenaar 'vim9script', 2871faac4104SBram Moolenaar 'new' 2872d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2873df069eecSBram Moolenaar ':$', 2874faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2875faac4104SBram Moolenaar 'bwipe!', 2876faac4104SBram Moolenaar ]) 2877faac4104SBram Moolenaar 2878f5be8cdbSBram Moolenaar CheckScriptFailure([ 2879f5be8cdbSBram Moolenaar 'vim9script', 2880f5be8cdbSBram Moolenaar 'new' 2881d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2882f5be8cdbSBram Moolenaar ':$', 2883f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2884f5be8cdbSBram Moolenaar 'bwipe!', 2885f5be8cdbSBram Moolenaar ], 'E488:') 2886f5be8cdbSBram Moolenaar 2887f5be8cdbSBram Moolenaar CheckScriptFailure([ 2888f5be8cdbSBram Moolenaar 'vim9script', 2889f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2890f5be8cdbSBram Moolenaar ], 'E477:') 2891a26b9700SBram Moolenaarenddef 2892a26b9700SBram Moolenaar 28937e5bd91dSBram Moolenaardef Test_finish() 2894cfcd011fSBram Moolenaar var lines =<< trim END 28957e5bd91dSBram Moolenaar vim9script 28966797966dSBram Moolenaar g:res = 'one' 28977e5bd91dSBram Moolenaar if v:false | finish | endif 28986797966dSBram Moolenaar g:res = 'two' 28997e5bd91dSBram Moolenaar finish 29006797966dSBram Moolenaar g:res = 'three' 29017e5bd91dSBram Moolenaar END 29027e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29037e5bd91dSBram Moolenaar source Xfinished 29047e5bd91dSBram Moolenaar assert_equal('two', g:res) 29057e5bd91dSBram Moolenaar 29067e5bd91dSBram Moolenaar unlet g:res 29077e5bd91dSBram Moolenaar delete('Xfinished') 29087e5bd91dSBram Moolenaarenddef 29097e5bd91dSBram Moolenaar 2910a5d0077eSBram Moolenaardef Test_forward_declaration() 2911cfcd011fSBram Moolenaar var lines =<< trim END 2912a5d0077eSBram Moolenaar vim9script 2913a5d0077eSBram Moolenaar def GetValue(): string 2914a5d0077eSBram Moolenaar return theVal 2915a5d0077eSBram Moolenaar enddef 2916cfcd011fSBram Moolenaar var theVal = 'something' 2917822ba247SBram Moolenaar g:initVal = GetValue() 2918a5d0077eSBram Moolenaar theVal = 'else' 2919a5d0077eSBram Moolenaar g:laterVal = GetValue() 2920a5d0077eSBram Moolenaar END 2921a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2922a5d0077eSBram Moolenaar source Xforward 2923a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2924a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2925a5d0077eSBram Moolenaar 2926a5d0077eSBram Moolenaar unlet g:initVal 2927a5d0077eSBram Moolenaar unlet g:laterVal 2928a5d0077eSBram Moolenaar delete('Xforward') 2929a5d0077eSBram Moolenaarenddef 2930a5d0077eSBram Moolenaar 29319721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2932a6294955SBram Moolenaar var vim9_lines =<< trim END 2933a6294955SBram Moolenaar vim9script 2934a6294955SBram Moolenaar var local = 'local' 2935a6294955SBram Moolenaar g:global = 'global' 2936a6294955SBram Moolenaar export var exported = 'exported' 2937a6294955SBram Moolenaar export def GetText(): string 2938a6294955SBram Moolenaar return 'text' 2939a6294955SBram Moolenaar enddef 2940a6294955SBram Moolenaar END 2941a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2942a6294955SBram Moolenaar 2943cfcd011fSBram Moolenaar var legacy_lines =<< trim END 29449721fb4eSBram Moolenaar source Xvim9_script.vim 29459721fb4eSBram Moolenaar 29469721fb4eSBram Moolenaar call assert_false(exists('local')) 29479721fb4eSBram Moolenaar call assert_false(exists('exported')) 29489721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29499721fb4eSBram Moolenaar call assert_equal('global', global) 29509721fb4eSBram Moolenaar call assert_equal('global', g:global) 29519721fb4eSBram Moolenaar 29529721fb4eSBram Moolenaar " imported variable becomes script-local 29539721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29549721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29559721fb4eSBram Moolenaar call assert_false(exists('exported')) 29569721fb4eSBram Moolenaar 29579721fb4eSBram Moolenaar " imported function becomes script-local 29589721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29599721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29609721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29619721fb4eSBram Moolenaar END 29629721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29639721fb4eSBram Moolenaar 29649721fb4eSBram Moolenaar source Xlegacy_script.vim 29659721fb4eSBram Moolenaar assert_equal('global', g:global) 2966f5be8cdbSBram Moolenaar unlet g:global 29679721fb4eSBram Moolenaar 29689721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29699721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29709721fb4eSBram Moolenaarenddef 2971a5d0077eSBram Moolenaar 29727d699701SBram Moolenaarfunc Test_vim9script_not_global() 29737d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 29747d699701SBram Moolenaar let vim9lines =<< trim END 29757d699701SBram Moolenaar vim9script 2976cfcd011fSBram Moolenaar var name = 'local' 29777d699701SBram Moolenaar func TheFunc() 29787d699701SBram Moolenaar echo 'local' 29797d699701SBram Moolenaar endfunc 29807d699701SBram Moolenaar def DefFunc() 29817d699701SBram Moolenaar echo 'local' 29827d699701SBram Moolenaar enddef 29837d699701SBram Moolenaar END 29847d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 29857d699701SBram Moolenaar source Xvim9script.vim 29867d699701SBram Moolenaar try 29877d699701SBram Moolenaar echo g:var 29887d699701SBram Moolenaar assert_report('did not fail') 29897d699701SBram Moolenaar catch /E121:/ 29907d699701SBram Moolenaar " caught 29917d699701SBram Moolenaar endtry 29927d699701SBram Moolenaar try 29937d699701SBram Moolenaar call TheFunc() 29947d699701SBram Moolenaar assert_report('did not fail') 29957d699701SBram Moolenaar catch /E117:/ 29967d699701SBram Moolenaar " caught 29977d699701SBram Moolenaar endtry 29987d699701SBram Moolenaar try 29997d699701SBram Moolenaar call DefFunc() 30007d699701SBram Moolenaar assert_report('did not fail') 30017d699701SBram Moolenaar catch /E117:/ 30027d699701SBram Moolenaar " caught 30037d699701SBram Moolenaar endtry 30047d699701SBram Moolenaar 300525859dd7SBram Moolenaar call delete('Xvim9script.vim') 30067d699701SBram Moolenaarendfunc 30077d699701SBram Moolenaar 3008eeb27bfeSBram Moolenaardef Test_vim9_copen() 3009eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3010eeb27bfeSBram Moolenaar copen 3011eeb27bfeSBram Moolenaar quit 3012eeb27bfeSBram Moolenaarenddef 3013eeb27bfeSBram Moolenaar 301403290b84SBram Moolenaar" test using an auto-loaded function and variable 30152d6b20d6SBram Moolenaardef Test_vim9_autoload() 3016cfcd011fSBram Moolenaar var lines =<< trim END 30172d6b20d6SBram Moolenaar vim9script 301803290b84SBram Moolenaar def some#gettest(): string 301903290b84SBram Moolenaar return 'test' 302003290b84SBram Moolenaar enddef 302103290b84SBram Moolenaar g:some#name = 'name' 302203290b84SBram Moolenaar END 302303290b84SBram Moolenaar 302403290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 302503290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 302603290b84SBram Moolenaar var save_rtp = &rtp 302703290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 302803290b84SBram Moolenaar 302903290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 303003290b84SBram Moolenaar assert_equal('name', g:some#name) 303103290b84SBram Moolenaar g:some#other = 'other' 303203290b84SBram Moolenaar assert_equal('other', g:some#other) 303303290b84SBram Moolenaar 303417f700acSBram Moolenaar # upper case script name works 303517f700acSBram Moolenaar lines =<< trim END 303617f700acSBram Moolenaar vim9script 303717f700acSBram Moolenaar def Other#getOther(): string 303817f700acSBram Moolenaar return 'other' 303917f700acSBram Moolenaar enddef 304017f700acSBram Moolenaar END 304117f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 304217f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 304317f700acSBram Moolenaar 304403290b84SBram Moolenaar delete('Xdir', 'rf') 304503290b84SBram Moolenaar &rtp = save_rtp 304603290b84SBram Moolenaarenddef 304703290b84SBram Moolenaar 304803290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 304903290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 305003290b84SBram Moolenaar var lines =<< trim END 305103290b84SBram Moolenaar vim9script 30522d6b20d6SBram Moolenaar def foo#test() 30532d6b20d6SBram Moolenaar echomsg getreg('"') 30542d6b20d6SBram Moolenaar enddef 30552d6b20d6SBram Moolenaar END 30562d6b20d6SBram Moolenaar 30572d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 30582d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3059cfcd011fSBram Moolenaar var save_rtp = &rtp 30602d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 30612d6b20d6SBram Moolenaar augroup test 30622d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 30632d6b20d6SBram Moolenaar augroup END 30642d6b20d6SBram Moolenaar 30652d6b20d6SBram Moolenaar normal Y 30662d6b20d6SBram Moolenaar 30672d6b20d6SBram Moolenaar augroup test 30682d6b20d6SBram Moolenaar autocmd! 30692d6b20d6SBram Moolenaar augroup END 30702d6b20d6SBram Moolenaar delete('Xdir', 'rf') 30712d6b20d6SBram Moolenaar &rtp = save_rtp 30722d6b20d6SBram Moolenaarenddef 30732d6b20d6SBram Moolenaar 307477e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 307577e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3076cfcd011fSBram Moolenaar var lines =<< trim END 307777e5dcc3SBram Moolenaar vim9script 307877e5dcc3SBram Moolenaar def crash#func() 307977e5dcc3SBram Moolenaar try 308077e5dcc3SBram Moolenaar for x in List() 308177e5dcc3SBram Moolenaar endfor 308277e5dcc3SBram Moolenaar catch 308377e5dcc3SBram Moolenaar endtry 308477e5dcc3SBram Moolenaar g:ok = true 308577e5dcc3SBram Moolenaar enddef 308677e5dcc3SBram Moolenaar fu List() 308777e5dcc3SBram Moolenaar invalid 308877e5dcc3SBram Moolenaar endfu 308977e5dcc3SBram Moolenaar try 309048e11c10SBram Moolenaar alsoinvalid 309177e5dcc3SBram Moolenaar catch /wontmatch/ 309277e5dcc3SBram Moolenaar endtry 309377e5dcc3SBram Moolenaar END 309477e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 309577e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 309677e5dcc3SBram Moolenaar 309777e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 309877e5dcc3SBram Moolenaar lines =<< trim END 309977e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 310077e5dcc3SBram Moolenaar call crash#func() 310177e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31029c4f5520SBram Moolenaar qall! 310377e5dcc3SBram Moolenaar END 310477e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 310577e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 310677e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 310777e5dcc3SBram Moolenaar 310877e5dcc3SBram Moolenaar delete('Xdidit') 310977e5dcc3SBram Moolenaar delete('Xscript') 311077e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 311103290b84SBram Moolenaar 311203290b84SBram Moolenaar lines =<< trim END 311303290b84SBram Moolenaar vim9script 311403290b84SBram Moolenaar var foo#bar = 'asdf' 311503290b84SBram Moolenaar END 311603290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 311777e5dcc3SBram Moolenaarenddef 311877e5dcc3SBram Moolenaar 311981e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 312081e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 312181e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3122cfcd011fSBram Moolenaar var lines =<< trim END 312381e17fbeSBram Moolenaar let s:counter = 1 312481e17fbeSBram Moolenaar def s:Func() 312581e17fbeSBram Moolenaar au! CursorHold 312681e17fbeSBram Moolenaar au CursorHold * s:counter += 1 312781e17fbeSBram Moolenaar enddef 312881e17fbeSBram Moolenaar call s:Func() 312981e17fbeSBram Moolenaar doau CursorHold 313081e17fbeSBram Moolenaar call assert_equal(2, s:counter) 313181e17fbeSBram Moolenaar au! CursorHold 313281e17fbeSBram Moolenaar END 313381e17fbeSBram Moolenaar CheckScriptSuccess(lines) 313481e17fbeSBram Moolenaarenddef 313581e17fbeSBram Moolenaar 31363896a105SBram Moolenaardef Test_cmdline_win() 31373896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 31383896a105SBram Moolenaar # the command line window. 31393896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3140cfcd011fSBram Moolenaar var export_lines =<< trim END 31413896a105SBram Moolenaar vim9script 3142cfcd011fSBram Moolenaar export var That = 'yes' 31433896a105SBram Moolenaar END 31443896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3145cfcd011fSBram Moolenaar var import_lines =<< trim END 31463896a105SBram Moolenaar vim9script 31473896a105SBram Moolenaar import That from './Xexport.vim' 31483896a105SBram Moolenaar END 31493896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3150cfcd011fSBram Moolenaar var save_rtp = &rtp 31513896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 31523896a105SBram Moolenaar syntax on 31533896a105SBram Moolenaar augroup CmdWin 31543896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 31553896a105SBram Moolenaar augroup END 31563896a105SBram Moolenaar # this will open and also close the cmdline window 31573896a105SBram Moolenaar feedkeys('q:', 'xt') 31583896a105SBram Moolenaar assert_equal('yes', g:got_there) 31593896a105SBram Moolenaar 31603896a105SBram Moolenaar augroup CmdWin 31613896a105SBram Moolenaar au! 31623896a105SBram Moolenaar augroup END 31633896a105SBram Moolenaar &rtp = save_rtp 31643896a105SBram Moolenaar delete('rtp', 'rf') 31653896a105SBram Moolenaarenddef 31663896a105SBram Moolenaar 3167e3d4685fSBram Moolenaardef Test_invalid_sid() 3168e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 316925859dd7SBram Moolenaar 31709c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3171d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3172e3d4685fSBram Moolenaar endif 3173e3d4685fSBram Moolenaar delete('Xdidit') 3174e3d4685fSBram Moolenaarenddef 3175e3d4685fSBram Moolenaar 31769ec7026fSBram Moolenaardef Test_restoring_cpo() 31779ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 31789ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 31799ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 31809ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 31819ec7026fSBram Moolenaar endif 31829ec7026fSBram Moolenaar delete('Xsourced') 31839ec7026fSBram Moolenaar delete('Xclose') 3184090728adSBram Moolenaar delete('Xdone') 31850123cc1eSBram Moolenaar 31860123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 31870123cc1eSBram Moolenaar set cpo=aABceFsMny> 31880123cc1eSBram Moolenaar edit XanotherScript 31890123cc1eSBram Moolenaar so % 31900123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 31910123cc1eSBram Moolenaar :1del 31920123cc1eSBram Moolenaar w 31930123cc1eSBram Moolenaar so % 31940123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 31950123cc1eSBram Moolenaar 31960123cc1eSBram Moolenaar delete('XanotherScript') 31970123cc1eSBram Moolenaar set cpo&vim 31989ec7026fSBram Moolenaarenddef 31999ec7026fSBram Moolenaar 32009ec7026fSBram Moolenaar 3201f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3202cfcd011fSBram Moolenaar var lines =<< trim END 3203cfcd011fSBram Moolenaar var name: any 3204cfcd011fSBram Moolenaar assert_equal(0, name) 3205f0afd9e1SBram Moolenaar END 3206f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3207f0afd9e1SBram Moolenaarenddef 3208f0afd9e1SBram Moolenaar 32097e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 321058dbef33SBram Moolenaar CheckRunVimInTerminal 321158dbef33SBram Moolenaar 32127e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 32137e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 32147e9210eaSBram Moolenaarendfunc 32157e9210eaSBram Moolenaar 32167e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 32179c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3218cfcd011fSBram Moolenaar var lines =<< trim END 32199c4f5520SBram Moolenaar func CheckAndQuit() 32209c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 32219c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 32229c4f5520SBram Moolenaar endfunc 32239c4f5520SBram Moolenaar END 32249c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 32259c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3226e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 32279c4f5520SBram Moolenaar # define Afunc() on the command line 32289c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 32299c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 32302949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 32319c4f5520SBram Moolenaar 32329c4f5520SBram Moolenaar call StopVimInTerminal(buf) 32339c4f5520SBram Moolenaar delete('XcallFunc') 32349c4f5520SBram Moolenaar delete('Xdidcmd') 32359c4f5520SBram Moolenaarenddef 32369c4f5520SBram Moolenaar 3237fcdc5d83SBram Moolenaardef Test_script_var_scope() 3238fcdc5d83SBram Moolenaar var lines =<< trim END 3239fcdc5d83SBram Moolenaar vim9script 3240fcdc5d83SBram Moolenaar if true 3241fcdc5d83SBram Moolenaar if true 3242fcdc5d83SBram Moolenaar var one = 'one' 3243fcdc5d83SBram Moolenaar echo one 3244fcdc5d83SBram Moolenaar endif 3245fcdc5d83SBram Moolenaar echo one 3246fcdc5d83SBram Moolenaar endif 3247fcdc5d83SBram Moolenaar END 3248fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3249fcdc5d83SBram Moolenaar 3250fcdc5d83SBram Moolenaar lines =<< trim END 3251fcdc5d83SBram Moolenaar vim9script 3252fcdc5d83SBram Moolenaar if true 3253fcdc5d83SBram Moolenaar if false 3254fcdc5d83SBram Moolenaar var one = 'one' 3255fcdc5d83SBram Moolenaar echo one 3256fcdc5d83SBram Moolenaar else 3257fcdc5d83SBram Moolenaar var one = 'one' 3258fcdc5d83SBram Moolenaar echo one 3259fcdc5d83SBram Moolenaar endif 3260fcdc5d83SBram Moolenaar echo one 3261fcdc5d83SBram Moolenaar endif 3262fcdc5d83SBram Moolenaar END 3263fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3264fcdc5d83SBram Moolenaar 3265fcdc5d83SBram Moolenaar lines =<< trim END 3266fcdc5d83SBram Moolenaar vim9script 3267fcdc5d83SBram Moolenaar while true 3268fcdc5d83SBram Moolenaar var one = 'one' 3269fcdc5d83SBram Moolenaar echo one 3270fcdc5d83SBram Moolenaar break 3271fcdc5d83SBram Moolenaar endwhile 3272fcdc5d83SBram Moolenaar echo one 3273fcdc5d83SBram Moolenaar END 3274fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3275fcdc5d83SBram Moolenaar 3276fcdc5d83SBram Moolenaar lines =<< trim END 3277fcdc5d83SBram Moolenaar vim9script 3278fcdc5d83SBram Moolenaar for i in range(1) 3279fcdc5d83SBram Moolenaar var one = 'one' 3280fcdc5d83SBram Moolenaar echo one 3281fcdc5d83SBram Moolenaar endfor 3282fcdc5d83SBram Moolenaar echo one 3283fcdc5d83SBram Moolenaar END 3284fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 32859becdf2bSBram Moolenaar 32869becdf2bSBram Moolenaar lines =<< trim END 32879becdf2bSBram Moolenaar vim9script 32889becdf2bSBram Moolenaar { 32899becdf2bSBram Moolenaar var one = 'one' 32909becdf2bSBram Moolenaar assert_equal('one', one) 32919becdf2bSBram Moolenaar } 32929becdf2bSBram Moolenaar assert_false(exists('one')) 32939becdf2bSBram Moolenaar assert_false(exists('s:one')) 32949becdf2bSBram Moolenaar END 32959becdf2bSBram Moolenaar CheckScriptSuccess(lines) 32969becdf2bSBram Moolenaar 32979becdf2bSBram Moolenaar lines =<< trim END 32989becdf2bSBram Moolenaar vim9script 32999becdf2bSBram Moolenaar { 33009becdf2bSBram Moolenaar var one = 'one' 33019becdf2bSBram Moolenaar echo one 33029becdf2bSBram Moolenaar } 33039becdf2bSBram Moolenaar echo one 33049becdf2bSBram Moolenaar END 33059becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3306fcdc5d83SBram Moolenaarenddef 3307fcdc5d83SBram Moolenaar 3308352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3309352134bbSBram Moolenaar var lines =<< trim END 3310352134bbSBram Moolenaar vim9script 3311352134bbSBram Moolenaar def Callback(...l: any) 3312352134bbSBram Moolenaar try 3313352134bbSBram Moolenaar var x: string 3314352134bbSBram Moolenaar var y: string 3315352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3316352134bbSBram Moolenaar [x, y] = [''] 3317352134bbSBram Moolenaar catch 3318352134bbSBram Moolenaar g:caught = 'yes' 3319352134bbSBram Moolenaar endtry 3320352134bbSBram Moolenaar enddef 3321e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3322352134bbSBram Moolenaar feedkeys("\r", 'xt') 3323352134bbSBram Moolenaar END 3324352134bbSBram Moolenaar CheckScriptSuccess(lines) 3325352134bbSBram Moolenaar 3326352134bbSBram Moolenaar unlet g:caught 3327352134bbSBram Moolenaarenddef 3328352134bbSBram Moolenaar 3329631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3330631e8f93SBram Moolenaar if !has('unix') || !has('job') 3331631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3332631e8f93SBram Moolenaar endif 3333631e8f93SBram Moolenaar var lines =<< trim END 3334631e8f93SBram Moolenaar vim9script 3335631e8f93SBram Moolenaar var source: list<number> 3336631e8f93SBram Moolenaar def Out_cb(...l: any) 3337631e8f93SBram Moolenaar eval [][0] 3338631e8f93SBram Moolenaar enddef 3339631e8f93SBram Moolenaar def Exit_cb(...l: any) 3340631e8f93SBram Moolenaar sleep 1m 3341631e8f93SBram Moolenaar source += l 3342631e8f93SBram Moolenaar enddef 3343e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 33446f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 33456f17a3f0SBram Moolenaar sleep 10m 33466f17a3f0SBram Moolenaar endwhile 3347206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3348206c2a6eSBram Moolenaar sleep 100m 3349631e8f93SBram Moolenaar END 3350631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3351631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3352631e8f93SBram Moolenaar delete('Xdef') 3353631e8f93SBram Moolenaarenddef 3354631e8f93SBram Moolenaar 33554324d87aSBram Moolenaardef InvokeNormal() 33564324d87aSBram Moolenaar exe "norm! :m+1\r" 33574324d87aSBram Moolenaarenddef 33584324d87aSBram Moolenaar 33594324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 33604324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 33614324d87aSBram Moolenaar new 33624324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 33634324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 33644324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 33654324d87aSBram Moolenaar xunmap <F3> 3366b5b9480eSBram Moolenaarenddef 3367b5b9480eSBram Moolenaar 3368b5b9480eSBram Moolenaardef Test_white_space_after_command() 3369b5b9480eSBram Moolenaar var lines =<< trim END 3370b5b9480eSBram Moolenaar exit_cb: Func}) 3371b5b9480eSBram Moolenaar END 3372b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3373f8103f27SBram Moolenaar 3374f8103f27SBram Moolenaar lines =<< trim END 3375f8103f27SBram Moolenaar e# 3376f8103f27SBram Moolenaar END 3377f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 33784324d87aSBram Moolenaarenddef 33794324d87aSBram Moolenaar 33804aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 33814aab88d9SBram Moolenaar var lines =<< trim END 33824aab88d9SBram Moolenaar vim9script 33834aab88d9SBram Moolenaar if exists('g:guard') 33844aab88d9SBram Moolenaar finish 33854aab88d9SBram Moolenaar endif 33864aab88d9SBram Moolenaar g:guard = 1 33874aab88d9SBram Moolenaar var name = 'thename' 33884aab88d9SBram Moolenaar def g:GetName(): string 33894aab88d9SBram Moolenaar return name 33904aab88d9SBram Moolenaar enddef 33914aab88d9SBram Moolenaar def g:SetName(arg: string) 33924aab88d9SBram Moolenaar name = arg 33934aab88d9SBram Moolenaar enddef 33944aab88d9SBram Moolenaar END 33954aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 33964aab88d9SBram Moolenaar so XscriptTwice.vim 33974aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 33984aab88d9SBram Moolenaar g:SetName('newname') 33994aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34004aab88d9SBram Moolenaar so XscriptTwice.vim 34014aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34024aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34034aab88d9SBram Moolenaar 34044aab88d9SBram Moolenaar delfunc g:GetName 34054aab88d9SBram Moolenaar delfunc g:SetName 34064aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34074aab88d9SBram Moolenaar unlet g:guard 34084aab88d9SBram Moolenaarenddef 34094aab88d9SBram Moolenaar 34104aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 34114aab88d9SBram Moolenaar var exportlines =<< trim END 34124aab88d9SBram Moolenaar vim9script 34134aab88d9SBram Moolenaar if exists('g:guard') 34144aab88d9SBram Moolenaar finish 34154aab88d9SBram Moolenaar endif 34164aab88d9SBram Moolenaar g:guard = 1 34174aab88d9SBram Moolenaar export var name = 'someName' 34184aab88d9SBram Moolenaar END 34194aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 34204aab88d9SBram Moolenaar 34214aab88d9SBram Moolenaar var lines =<< trim END 34224aab88d9SBram Moolenaar vim9script 34234aab88d9SBram Moolenaar import name from './XexportScript.vim' 34244aab88d9SBram Moolenaar def g:GetName(): string 34254aab88d9SBram Moolenaar return name 34264aab88d9SBram Moolenaar enddef 34274aab88d9SBram Moolenaar END 34284aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 34294aab88d9SBram Moolenaar so XscriptImport.vim 34304aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 34314aab88d9SBram Moolenaar 34324aab88d9SBram Moolenaar so XexportScript.vim 34334aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34344aab88d9SBram Moolenaar 34354aab88d9SBram Moolenaar delfunc g:GetName 34364aab88d9SBram Moolenaar delete('XexportScript.vim') 34374aab88d9SBram Moolenaar delete('XscriptImport.vim') 34384aab88d9SBram Moolenaar unlet g:guard 34394aab88d9SBram Moolenaarenddef 34404aab88d9SBram Moolenaar 3441585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3442585fea7bSBram Moolenaardef Test_substitute_cmd() 3443585fea7bSBram Moolenaar new 3444585fea7bSBram Moolenaar setline(1, 'something') 3445585fea7bSBram Moolenaar :substitute(some(other( 3446585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3447585fea7bSBram Moolenaar bwipe! 3448585fea7bSBram Moolenaar 3449f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3450cfcd011fSBram Moolenaar var lines =<< trim END 3451585fea7bSBram Moolenaar vim9script 3452585fea7bSBram Moolenaar new 3453585fea7bSBram Moolenaar setline(1, 'something') 3454585fea7bSBram Moolenaar :substitute(some(other( 3455585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3456585fea7bSBram Moolenaar bwipe! 3457585fea7bSBram Moolenaar END 3458585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3459585fea7bSBram Moolenaar source Xvim9lines 3460585fea7bSBram Moolenaar 3461585fea7bSBram Moolenaar delete('Xvim9lines') 3462585fea7bSBram Moolenaarenddef 3463585fea7bSBram Moolenaar 34648a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3465