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 4532bede173SBram Moolenaar nd = {[g:anumber]: 1} 4545e654230SBram Moolenaar catch /E1012:/ 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) 5598a7d6542SBram Moolenaarenddef 5608a7d6542SBram Moolenaar 561*1430ceebSBram Moolenaardef Test_cnext_works_in_catch() 562*1430ceebSBram Moolenaar var lines =<< trim END 563*1430ceebSBram Moolenaar vim9script 564*1430ceebSBram Moolenaar au BufEnter * eval 0 565*1430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 566*1430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 567*1430ceebSBram Moolenaar var items = [ 568*1430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 569*1430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 570*1430ceebSBram Moolenaar ] 571*1430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 572*1430ceebSBram Moolenaar cwindow 573*1430ceebSBram Moolenaar 574*1430ceebSBram Moolenaar def CnextOrCfirst() 575*1430ceebSBram Moolenaar # if cnext fails, cfirst is used 576*1430ceebSBram Moolenaar try 577*1430ceebSBram Moolenaar cnext 578*1430ceebSBram Moolenaar catch 579*1430ceebSBram Moolenaar cfirst 580*1430ceebSBram Moolenaar endtry 581*1430ceebSBram Moolenaar enddef 582*1430ceebSBram Moolenaar 583*1430ceebSBram Moolenaar CnextOrCfirst() 584*1430ceebSBram Moolenaar CnextOrCfirst() 585*1430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 586*1430ceebSBram Moolenaar qall 587*1430ceebSBram Moolenaar END 588*1430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 589*1430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 590*1430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 591*1430ceebSBram Moolenaar 592*1430ceebSBram Moolenaar delete('Xfile1') 593*1430ceebSBram Moolenaar delete('Xfile2') 594*1430ceebSBram Moolenaar delete('XCatchCnext') 595*1430ceebSBram Moolenaar delete('Xresult') 596*1430ceebSBram Moolenaarenddef 597*1430ceebSBram Moolenaar 5989e1d9e34SBram Moolenaardef Test_throw_skipped() 5999e1d9e34SBram Moolenaar if 0 6009e1d9e34SBram Moolenaar throw dontgethere 6019e1d9e34SBram Moolenaar endif 6029e1d9e34SBram Moolenaarenddef 6039e1d9e34SBram Moolenaar 6048f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6058f81b22eSBram Moolenaar var lines =<< trim END 6068f81b22eSBram Moolenaar vim9script 6078f81b22eSBram Moolenaar def Func() 6088f81b22eSBram Moolenaar throw 'error' 6098f81b22eSBram Moolenaar enddef 6108f81b22eSBram Moolenaar silent! Func() 6118f81b22eSBram Moolenaar END 6128f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6138f81b22eSBram Moolenaar source XthrowSilenced 6148f81b22eSBram Moolenaar delete('XthrowSilenced') 6158f81b22eSBram Moolenaarenddef 6168f81b22eSBram Moolenaar 617e859312eSBram Moolenaardef DeletedFunc(): list<any> 618e859312eSBram Moolenaar return ['delete me'] 619e859312eSBram Moolenaarenddef 620e859312eSBram Moolenaardefcompile 621e859312eSBram Moolenaardelfunc DeletedFunc 622e859312eSBram Moolenaar 623257cc5eeSBram Moolenaardef ThrowFromDef() 624a72cfb80SBram Moolenaar throw "getout" # comment 625257cc5eeSBram Moolenaarenddef 626257cc5eeSBram Moolenaar 627257cc5eeSBram Moolenaarfunc CatchInFunc() 628257cc5eeSBram Moolenaar try 629257cc5eeSBram Moolenaar call ThrowFromDef() 630257cc5eeSBram Moolenaar catch 631257cc5eeSBram Moolenaar let g:thrown_func = v:exception 632257cc5eeSBram Moolenaar endtry 633257cc5eeSBram Moolenaarendfunc 634257cc5eeSBram Moolenaar 635257cc5eeSBram Moolenaardef CatchInDef() 636257cc5eeSBram Moolenaar try 637257cc5eeSBram Moolenaar ThrowFromDef() 638257cc5eeSBram Moolenaar catch 639257cc5eeSBram Moolenaar g:thrown_def = v:exception 640257cc5eeSBram Moolenaar endtry 641257cc5eeSBram Moolenaarenddef 642257cc5eeSBram Moolenaar 643f575adffSBram Moolenaardef ReturnFinally(): string 644f575adffSBram Moolenaar try 645f575adffSBram Moolenaar return 'intry' 646373863edSBram Moolenaar finall 647f575adffSBram Moolenaar g:in_finally = 'finally' 648f575adffSBram Moolenaar endtry 649f575adffSBram Moolenaar return 'end' 650f575adffSBram Moolenaarenddef 651f575adffSBram Moolenaar 652257cc5eeSBram Moolenaardef Test_try_catch_nested() 653257cc5eeSBram Moolenaar CatchInFunc() 654257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 655257cc5eeSBram Moolenaar 656257cc5eeSBram Moolenaar CatchInDef() 657257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 658f575adffSBram Moolenaar 659f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 660f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 661f575adffSBram Moolenaarenddef 662f575adffSBram Moolenaar 6639939f57bSBram Moolenaardef TryOne(): number 6649939f57bSBram Moolenaar try 6659939f57bSBram Moolenaar return 0 6669939f57bSBram Moolenaar catch 6679939f57bSBram Moolenaar endtry 6689939f57bSBram Moolenaar return 0 6699939f57bSBram Moolenaarenddef 6709939f57bSBram Moolenaar 6719939f57bSBram Moolenaardef TryTwo(n: number): string 6729939f57bSBram Moolenaar try 673cfcd011fSBram Moolenaar var x = {} 6749939f57bSBram Moolenaar catch 6759939f57bSBram Moolenaar endtry 6769939f57bSBram Moolenaar return 'text' 6779939f57bSBram Moolenaarenddef 6789939f57bSBram Moolenaar 6799939f57bSBram Moolenaardef Test_try_catch_twice() 6809939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 6819939f57bSBram Moolenaarenddef 6829939f57bSBram Moolenaar 683f575adffSBram Moolenaardef Test_try_catch_match() 684cfcd011fSBram Moolenaar var seq = 'a' 685f575adffSBram Moolenaar try 686f575adffSBram Moolenaar throw 'something' 687f575adffSBram Moolenaar catch /nothing/ 688f575adffSBram Moolenaar seq ..= 'x' 689f575adffSBram Moolenaar catch /some/ 690f575adffSBram Moolenaar seq ..= 'b' 691f575adffSBram Moolenaar catch /asdf/ 692f575adffSBram Moolenaar seq ..= 'x' 693e8c4abbbSBram Moolenaar catch ?a\?sdf? 694e8c4abbbSBram Moolenaar seq ..= 'y' 695f575adffSBram Moolenaar finally 696f575adffSBram Moolenaar seq ..= 'c' 697f575adffSBram Moolenaar endtry 698f575adffSBram Moolenaar assert_equal('abc', seq) 699257cc5eeSBram Moolenaarenddef 700257cc5eeSBram Moolenaar 701e8c4abbbSBram Moolenaardef Test_try_catch_fails() 702d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 703d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 704d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 705d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 706d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 707d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 708d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 709d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 71013106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 711d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 712585fea7bSBram Moolenaar 713e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 714d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 715e8c4abbbSBram Moolenaarenddef 716e8c4abbbSBram Moolenaar 717006ad48bSBram Moolenaardef Test_throw_vimscript() 718f5be8cdbSBram Moolenaar # only checks line continuation 719cfcd011fSBram Moolenaar var lines =<< trim END 720006ad48bSBram Moolenaar vim9script 721006ad48bSBram Moolenaar try 722006ad48bSBram Moolenaar throw 'one' 723006ad48bSBram Moolenaar .. 'two' 724006ad48bSBram Moolenaar catch 725006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 726006ad48bSBram Moolenaar endtry 727006ad48bSBram Moolenaar END 728006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7291e021e63SBram Moolenaar 7301e021e63SBram Moolenaar lines =<< trim END 7311e021e63SBram Moolenaar vim9script 732352134bbSBram Moolenaar @r = '' 7331e021e63SBram Moolenaar def Func() 7341e021e63SBram Moolenaar throw @r 7351e021e63SBram Moolenaar enddef 7361e021e63SBram Moolenaar var result = '' 7371e021e63SBram Moolenaar try 7381e021e63SBram Moolenaar Func() 7391e021e63SBram Moolenaar catch /E1129:/ 7401e021e63SBram Moolenaar result = 'caught' 7411e021e63SBram Moolenaar endtry 7421e021e63SBram Moolenaar assert_equal('caught', result) 7431e021e63SBram Moolenaar END 7441e021e63SBram Moolenaar CheckScriptSuccess(lines) 745006ad48bSBram Moolenaarenddef 746006ad48bSBram Moolenaar 747ed677f55SBram Moolenaardef Test_error_in_nested_function() 748ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 749cfcd011fSBram Moolenaar var lines =<< trim END 750ed677f55SBram Moolenaar vim9script 751ed677f55SBram Moolenaar def Func() 752ed677f55SBram Moolenaar Error() 753ed677f55SBram Moolenaar g:test_var = 1 754ed677f55SBram Moolenaar enddef 755ed677f55SBram Moolenaar func Error() abort 756ed677f55SBram Moolenaar eval [][0] 757ed677f55SBram Moolenaar endfunc 758ed677f55SBram Moolenaar Func() 759ed677f55SBram Moolenaar END 760ed677f55SBram Moolenaar g:test_var = 0 761ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 762ed677f55SBram Moolenaar assert_equal(0, g:test_var) 763ed677f55SBram Moolenaarenddef 764ed677f55SBram Moolenaar 76537c83711SBram Moolenaardef Test_cexpr_vimscript() 766f5be8cdbSBram Moolenaar # only checks line continuation 76737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 768cfcd011fSBram Moolenaar var lines =<< trim END 76937c83711SBram Moolenaar vim9script 77037c83711SBram Moolenaar cexpr 'File' 77137c83711SBram Moolenaar .. ' someFile' .. 77237c83711SBram Moolenaar ' line 19' 77337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 77437c83711SBram Moolenaar END 77537c83711SBram Moolenaar CheckScriptSuccess(lines) 77637c83711SBram Moolenaar set errorformat& 77737c83711SBram Moolenaarenddef 77837c83711SBram Moolenaar 779c9edd6b5SBram Moolenaardef Test_statusline_syntax() 780c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 781cfcd011fSBram Moolenaar var lines =<< trim END 782c9edd6b5SBram Moolenaar vim9script 783c9edd6b5SBram Moolenaar func g:Status() 784c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 785c9edd6b5SBram Moolenaar endfunc 786c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 787c9edd6b5SBram Moolenaar redrawstatus 788c9edd6b5SBram Moolenaar set laststatus statusline= 789c9edd6b5SBram Moolenaar END 790c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 791c9edd6b5SBram Moolenaarenddef 792c9edd6b5SBram Moolenaar 793b209750bSBram Moolenaardef Test_list_vimscript() 794b209750bSBram Moolenaar # checks line continuation and comments 795cfcd011fSBram Moolenaar var lines =<< trim END 796b209750bSBram Moolenaar vim9script 797cfcd011fSBram Moolenaar var mylist = [ 798b209750bSBram Moolenaar 'one', 799b209750bSBram Moolenaar # comment 800b209750bSBram Moolenaar 'two', # empty line follows 801b209750bSBram Moolenaar 802b209750bSBram Moolenaar 'three', 803b209750bSBram Moolenaar ] 804b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 805b209750bSBram Moolenaar END 806b209750bSBram Moolenaar CheckScriptSuccess(lines) 80766250c93SBram Moolenaar 80866250c93SBram Moolenaar # check all lines from heredoc are kept 80966250c93SBram Moolenaar lines =<< trim END 81066250c93SBram Moolenaar # comment 1 81166250c93SBram Moolenaar two 81266250c93SBram Moolenaar # comment 3 81366250c93SBram Moolenaar 81466250c93SBram Moolenaar five 81566250c93SBram Moolenaar # comment 6 81666250c93SBram Moolenaar END 81766250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 818b209750bSBram Moolenaarenddef 819b209750bSBram Moolenaar 8202a1381c3SBram Moolenaarif has('channel') 82140ee466cSBram Moolenaar let someJob = test_null_job() 82240ee466cSBram Moolenaar 82340ee466cSBram Moolenaar def FuncWithError() 82440ee466cSBram Moolenaar echomsg g:someJob 82540ee466cSBram Moolenaar enddef 82640ee466cSBram Moolenaar 82740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 82840ee466cSBram Moolenaar try 82940ee466cSBram Moolenaar call FuncWithError() 83040ee466cSBram Moolenaar catch 83140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 83240ee466cSBram Moolenaar endtry 83340ee466cSBram Moolenaar endfunc 8342a1381c3SBram Moolenaarendif 83540ee466cSBram Moolenaar 8368a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8378a7d6542SBram Moolenaar vim9script 838cfcd011fSBram Moolenaar var name: string = 'bob' 8398a7d6542SBram Moolenaar def Concat(arg: string): string 8408a7d6542SBram Moolenaar return name .. arg 8418a7d6542SBram Moolenaar enddef 842227a69deSBram Moolenaar g:result = Concat('bie') 843227a69deSBram Moolenaar g:localname = name 8448a7d6542SBram Moolenaar 8458a7d6542SBram Moolenaar export const CONST = 1234 846cfcd011fSBram Moolenaar export var exported = 9876 847cfcd011fSBram Moolenaar export var exp_name = 'John' 8488a7d6542SBram Moolenaar export def Exported(): string 8498a7d6542SBram Moolenaar return 'Exported' 8508a7d6542SBram Moolenaar enddef 8518a7d6542SBram MoolenaarEND 8528a7d6542SBram Moolenaar 853b3ca9824SBram Moolenaardef Undo_export_script_lines() 854b3ca9824SBram Moolenaar unlet g:result 855b3ca9824SBram Moolenaar unlet g:localname 856b3ca9824SBram Moolenaarenddef 857b3ca9824SBram Moolenaar 8585269bd2aSBram Moolenaardef Test_vim9_import_export() 859cfcd011fSBram Moolenaar var import_script_lines =<< trim END 8608a7d6542SBram Moolenaar vim9script 8618a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8628a7d6542SBram Moolenaar g:imported = exported 8636e587dcbSBram Moolenaar exported += 3 8646e587dcbSBram Moolenaar g:imported_added = exported 8658a7d6542SBram Moolenaar g:imported_func = Exported() 8666e587dcbSBram Moolenaar 86740f4f7a4SBram Moolenaar def GetExported(): string 868e0de171eSBram Moolenaar var local_dict = {ref: Exported} 86940f4f7a4SBram Moolenaar return local_dict.ref() 87040f4f7a4SBram Moolenaar enddef 87140f4f7a4SBram Moolenaar g:funcref_result = GetExported() 87240f4f7a4SBram Moolenaar 8736e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8746e587dcbSBram Moolenaar g:imported_name = exp_name 8756e587dcbSBram Moolenaar exp_name ..= ' Doe' 8766e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8775381c7a1SBram Moolenaar g:imported_later = exported 8788a7d6542SBram Moolenaar END 8798a7d6542SBram Moolenaar 8808a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8828a7d6542SBram Moolenaar 8838a7d6542SBram Moolenaar source Ximport.vim 8848a7d6542SBram Moolenaar 8858a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8868a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8878a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8886e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8895381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8908a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 89140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 8926e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8936e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8948a7d6542SBram Moolenaar assert_false(exists('g:name')) 8958a7d6542SBram Moolenaar 896b3ca9824SBram Moolenaar Undo_export_script_lines() 8978a7d6542SBram Moolenaar unlet g:imported 8986e587dcbSBram Moolenaar unlet g:imported_added 8995381c7a1SBram Moolenaar unlet g:imported_later 9008a7d6542SBram Moolenaar unlet g:imported_func 9016e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9028a7d6542SBram Moolenaar delete('Ximport.vim') 903f2d5c240SBram Moolenaar 9041c991144SBram Moolenaar # similar, with line breaks 905cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9061c991144SBram Moolenaar vim9script 9071c991144SBram Moolenaar import { 9081c991144SBram Moolenaar exported, 9091c991144SBram Moolenaar Exported, 9101c991144SBram Moolenaar } 9111c991144SBram Moolenaar from 9121c991144SBram Moolenaar './Xexport.vim' 9131c991144SBram Moolenaar g:imported = exported 9141c991144SBram Moolenaar exported += 5 9151c991144SBram Moolenaar g:imported_added = exported 9161c991144SBram Moolenaar g:imported_func = Exported() 9171c991144SBram Moolenaar END 9181c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9191c991144SBram Moolenaar source Ximport_lbr.vim 9201c991144SBram Moolenaar 9211c991144SBram Moolenaar assert_equal(9876, g:imported) 9221c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9231c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9241c991144SBram Moolenaar 9251c991144SBram Moolenaar # exported script not sourced again 9261c991144SBram Moolenaar assert_false(exists('g:result')) 9271c991144SBram Moolenaar unlet g:imported 9281c991144SBram Moolenaar unlet g:imported_added 9291c991144SBram Moolenaar unlet g:imported_func 9301c991144SBram Moolenaar delete('Ximport_lbr.vim') 9311c991144SBram Moolenaar 9321c991144SBram Moolenaar # import inside :def function 933cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9345381c7a1SBram Moolenaar vim9script 9355381c7a1SBram Moolenaar def ImportInDef() 9365381c7a1SBram Moolenaar import exported from './Xexport.vim' 9375381c7a1SBram Moolenaar g:imported = exported 9385381c7a1SBram Moolenaar exported += 7 9395381c7a1SBram Moolenaar g:imported_added = exported 9405381c7a1SBram Moolenaar enddef 9415381c7a1SBram Moolenaar ImportInDef() 9425381c7a1SBram Moolenaar END 9435381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9445381c7a1SBram Moolenaar source Ximport2.vim 945f5be8cdbSBram Moolenaar # TODO: this should be 9879 9465381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9475381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9485381c7a1SBram Moolenaar unlet g:imported 9495381c7a1SBram Moolenaar unlet g:imported_added 9505381c7a1SBram Moolenaar delete('Ximport2.vim') 9515381c7a1SBram Moolenaar 952cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 953f2d5c240SBram Moolenaar vim9script 954f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 955f2d5c240SBram Moolenaar def UseExport() 956f2d5c240SBram Moolenaar g:imported = Export.exported 957f2d5c240SBram Moolenaar enddef 958f2d5c240SBram Moolenaar UseExport() 959f2d5c240SBram Moolenaar END 960f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 961f2d5c240SBram Moolenaar source Ximport.vim 9625381c7a1SBram Moolenaar assert_equal(9883, g:imported) 963f2d5c240SBram Moolenaar 964cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 965599c89c8SBram Moolenaar vim9script 966599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 967599c89c8SBram Moolenaar def Func() 968cfcd011fSBram Moolenaar var dummy = 1 969cfcd011fSBram Moolenaar var imported = Export + dummy 970599c89c8SBram Moolenaar enddef 971822ba247SBram Moolenaar defcompile 972599c89c8SBram Moolenaar END 973599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 97444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 975599c89c8SBram Moolenaar 976cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 977599c89c8SBram Moolenaar vim9script 978599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 979599c89c8SBram Moolenaar def Func() 980cfcd011fSBram Moolenaar var imported = Export . exported 981599c89c8SBram Moolenaar enddef 982822ba247SBram Moolenaar defcompile 983599c89c8SBram Moolenaar END 984599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 98544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 986599c89c8SBram Moolenaar 987a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 988a6294955SBram Moolenaar vim9script 989a6294955SBram Moolenaar import * as Export from './Xexport.vim' 990a6294955SBram Moolenaar var some = 'other' 991a6294955SBram Moolenaar import * as Export from './Xexport.vim' 992a6294955SBram Moolenaar defcompile 993a6294955SBram Moolenaar END 994a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 995a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 996a6294955SBram Moolenaar 997cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 998599c89c8SBram Moolenaar vim9script 999599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1000599c89c8SBram Moolenaar def Func() 1001cfcd011fSBram Moolenaar var imported = Export. 1002599c89c8SBram Moolenaar enddef 1003822ba247SBram Moolenaar defcompile 1004599c89c8SBram Moolenaar END 1005599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 100644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1007599c89c8SBram Moolenaar 1008cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10091c991144SBram Moolenaar vim9script 10101c991144SBram Moolenaar import * 10111c991144SBram Moolenaar as Export 10121c991144SBram Moolenaar from 10131c991144SBram Moolenaar './Xexport.vim' 10141c991144SBram Moolenaar def UseExport() 10151c991144SBram Moolenaar g:imported = Export.exported 10161c991144SBram Moolenaar enddef 10171c991144SBram Moolenaar UseExport() 10181c991144SBram Moolenaar END 10191c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10201c991144SBram Moolenaar source Ximport.vim 10211c991144SBram Moolenaar assert_equal(9883, g:imported) 10221c991144SBram Moolenaar 1023cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1024f2d5c240SBram Moolenaar vim9script 1025f2d5c240SBram Moolenaar import * from './Xexport.vim' 1026f2d5c240SBram Moolenaar END 1027f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 102844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1029f2d5c240SBram Moolenaar 1030f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1031cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1032fa29c8abSBram Moolenaar vim9script 1033fa29c8abSBram Moolenaar import name from './Xexport.vim' 1034fa29c8abSBram Moolenaar END 1035fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 103644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1037fa29c8abSBram Moolenaar 1038f5be8cdbSBram Moolenaar # try to import something that is already defined 1039cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10405269bd2aSBram Moolenaar vim9script 1041cfcd011fSBram Moolenaar var exported = 'something' 10425269bd2aSBram Moolenaar import exported from './Xexport.vim' 10435269bd2aSBram Moolenaar END 10445269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 104544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10465269bd2aSBram Moolenaar 1047f5be8cdbSBram Moolenaar # try to import something that is already defined 10485269bd2aSBram Moolenaar import_already_defined =<< trim END 10495269bd2aSBram Moolenaar vim9script 1050cfcd011fSBram Moolenaar var exported = 'something' 10515269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10525269bd2aSBram Moolenaar END 10535269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 105444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10555269bd2aSBram Moolenaar 1056f5be8cdbSBram Moolenaar # try to import something that is already defined 10575269bd2aSBram Moolenaar import_already_defined =<< trim END 10585269bd2aSBram Moolenaar vim9script 1059cfcd011fSBram Moolenaar var exported = 'something' 10605269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10615269bd2aSBram Moolenaar END 10625269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 106344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10645269bd2aSBram Moolenaar 1065918a4249SBram Moolenaar # try changing an imported const 1066918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1067918a4249SBram Moolenaar vim9script 1068918a4249SBram Moolenaar import CONST from './Xexport.vim' 1069918a4249SBram Moolenaar def Assign() 1070918a4249SBram Moolenaar CONST = 987 1071918a4249SBram Moolenaar enddef 1072918a4249SBram Moolenaar defcompile 1073918a4249SBram Moolenaar END 1074918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1075918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1076918a4249SBram Moolenaar 1077f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1078cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1079fa29c8abSBram Moolenaar vim9script 1080fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1081fa29c8abSBram Moolenaar END 1082fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 108344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1084fa29c8abSBram Moolenaar 1085cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1086fa29c8abSBram Moolenaar vim9script 1087fa29c8abSBram Moolenaar import name './Xexport.vim' 1088fa29c8abSBram Moolenaar END 1089fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 109044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1091fa29c8abSBram Moolenaar 1092cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1093fa29c8abSBram Moolenaar vim9script 1094fa29c8abSBram Moolenaar import name from Xexport.vim 1095fa29c8abSBram Moolenaar END 1096fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 109744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1098fa29c8abSBram Moolenaar 1099cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1100fa29c8abSBram Moolenaar vim9script 1101fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1102fa29c8abSBram Moolenaar END 1103fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 110444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1105fa29c8abSBram Moolenaar 1106cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1107fa29c8abSBram Moolenaar vim9script 1108fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1109fa29c8abSBram Moolenaar END 11105269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 111144d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1112fa29c8abSBram Moolenaar 1113f2d5c240SBram Moolenaar delete('Ximport.vim') 11145269bd2aSBram Moolenaar delete('Ximport3.vim') 11158a7d6542SBram Moolenaar delete('Xexport.vim') 11168a7d6542SBram Moolenaar 1117f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1118750802b5SBram Moolenaar set cpo&vi 1119cfcd011fSBram Moolenaar var cpo_before = &cpo 1120cfcd011fSBram Moolenaar var lines =<< trim END 1121750802b5SBram Moolenaar vim9script 1122750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1123750802b5SBram Moolenaar END 1124750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1125750802b5SBram Moolenaar source Xvim9_script 1126750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1127750802b5SBram Moolenaar set cpo&vim 1128750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1129750802b5SBram Moolenaar delete('Xvim9_script') 1130750802b5SBram Moolenaarenddef 1131750802b5SBram Moolenaar 1132803af686SBram Moolenaarfunc g:Trigger() 1133803af686SBram Moolenaar source Ximport.vim 1134803af686SBram Moolenaar return "echo 'yes'\<CR>" 1135803af686SBram Moolenaarendfunc 1136803af686SBram Moolenaar 1137803af686SBram Moolenaardef Test_import_export_expr_map() 1138803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1139cfcd011fSBram Moolenaar var export_lines =<< trim END 1140803af686SBram Moolenaar vim9script 1141803af686SBram Moolenaar export def That(): string 1142803af686SBram Moolenaar return 'yes' 1143803af686SBram Moolenaar enddef 1144803af686SBram Moolenaar END 1145803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1146803af686SBram Moolenaar 1147cfcd011fSBram Moolenaar var import_lines =<< trim END 1148803af686SBram Moolenaar vim9script 1149803af686SBram Moolenaar import That from './Xexport_that.vim' 1150803af686SBram Moolenaar assert_equal('yes', That()) 1151803af686SBram Moolenaar END 1152803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1153803af686SBram Moolenaar 1154803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1155803af686SBram Moolenaar feedkeys('trigger', "xt") 1156803af686SBram Moolenaar 1157730b2483SBram Moolenaar delete('Xexport_that.vim') 1158803af686SBram Moolenaar delete('Ximport.vim') 1159803af686SBram Moolenaar nunmap trigger 1160803af686SBram Moolenaarenddef 1161803af686SBram Moolenaar 11628e1986e3SBram Moolenaardef Test_import_in_filetype() 11638e1986e3SBram Moolenaar # check that :import works when the buffer is locked 11648e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1165cfcd011fSBram Moolenaar var export_lines =<< trim END 11668e1986e3SBram Moolenaar vim9script 1167cfcd011fSBram Moolenaar export var That = 'yes' 11688e1986e3SBram Moolenaar END 1169730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 11708e1986e3SBram Moolenaar 1171cfcd011fSBram Moolenaar var import_lines =<< trim END 11728e1986e3SBram Moolenaar vim9script 1173730b2483SBram Moolenaar import That from './Xexport_ft.vim' 11748e1986e3SBram Moolenaar assert_equal('yes', That) 11758e1986e3SBram Moolenaar g:did_load_mytpe = 1 11768e1986e3SBram Moolenaar END 11778e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 11788e1986e3SBram Moolenaar 1179cfcd011fSBram Moolenaar var save_rtp = &rtp 11808e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 11818e1986e3SBram Moolenaar 11828e1986e3SBram Moolenaar filetype plugin on 11838e1986e3SBram Moolenaar copen 11848e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 11858e1986e3SBram Moolenaar 11868e1986e3SBram Moolenaar quit! 1187730b2483SBram Moolenaar delete('Xexport_ft.vim') 11888e1986e3SBram Moolenaar delete('ftplugin', 'rf') 11898e1986e3SBram Moolenaar &rtp = save_rtp 11908e1986e3SBram Moolenaarenddef 11918e1986e3SBram Moolenaar 1192efa94447SBram Moolenaardef Test_use_import_in_mapping() 1193cfcd011fSBram Moolenaar var lines =<< trim END 1194efa94447SBram Moolenaar vim9script 1195efa94447SBram Moolenaar export def Funcx() 1196efa94447SBram Moolenaar g:result = 42 1197efa94447SBram Moolenaar enddef 1198efa94447SBram Moolenaar END 1199efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1200efa94447SBram Moolenaar lines =<< trim END 1201efa94447SBram Moolenaar vim9script 1202efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1203b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1204efa94447SBram Moolenaar END 1205efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1206efa94447SBram Moolenaar 1207efa94447SBram Moolenaar source Xmapscript.vim 1208b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1209efa94447SBram Moolenaar assert_equal(42, g:result) 1210efa94447SBram Moolenaar 1211efa94447SBram Moolenaar unlet g:result 1212efa94447SBram Moolenaar delete('XsomeExport.vim') 1213efa94447SBram Moolenaar delete('Xmapscript.vim') 1214b3ca9824SBram Moolenaar nunmap <F3> 1215efa94447SBram Moolenaarenddef 1216efa94447SBram Moolenaar 1217750802b5SBram Moolenaardef Test_vim9script_fails() 12188a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12198a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1220cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 12219721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1222cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1223750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1224750802b5SBram Moolenaar 1225cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1226c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1227c785b9a7SBram Moolenaar 1228e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1229e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 12308a7d6542SBram Moolenaarenddef 12318a7d6542SBram Moolenaar 1232f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1233101f4810SBram Moolenaar CheckRunVimInTerminal 1234101f4810SBram Moolenaar 12359bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1236c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 12379bb3eb3eSBram Moolenaarendfunc 12389bb3eb3eSBram Moolenaar 1239c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1240cfcd011fSBram Moolenaar var export =<< trim END 1241101f4810SBram Moolenaar vim9script 1242101f4810SBram Moolenaar export def Foo(): number 1243101f4810SBram Moolenaar return 0 1244101f4810SBram Moolenaar enddef 1245101f4810SBram Moolenaar END 1246730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1247101f4810SBram Moolenaar 1248e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 12499bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 12502949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1251101f4810SBram Moolenaar 1252730b2483SBram Moolenaar delete('XexportCmd.vim') 12539bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 12549bb3eb3eSBram Moolenaarenddef 1255101f4810SBram Moolenaar 12562b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 12572b32700dSBram Moolenaar var lines =<< trim END 1258a6294955SBram Moolenaar vim9script 1259a6294955SBram Moolenaar export var exported = 'thexport' 1260a6294955SBram Moolenaar END 1261a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1262a6294955SBram Moolenaar lines =<< trim END 12632b32700dSBram Moolenaar vim9script noclear 12642b32700dSBram Moolenaar g:loadCount += 1 12652b32700dSBram Moolenaar var s:reloaded = 'init' 1266a6294955SBram Moolenaar import exported from './XExportReload' 12672b32700dSBram Moolenaar 12682b32700dSBram Moolenaar def Again(): string 12692b32700dSBram Moolenaar return 'again' 12702b32700dSBram Moolenaar enddef 12712b32700dSBram Moolenaar 12722b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 12732b32700dSBram Moolenaar var s:loaded = true 12742b32700dSBram Moolenaar 12752b32700dSBram Moolenaar var s:notReloaded = 'yes' 12762b32700dSBram Moolenaar s:reloaded = 'first' 12772b32700dSBram Moolenaar def g:Values(): list<string> 1278a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 12792b32700dSBram Moolenaar enddef 12802b32700dSBram Moolenaar 12812b32700dSBram Moolenaar def Once(): string 12822b32700dSBram Moolenaar return 'once' 12832b32700dSBram Moolenaar enddef 12842b32700dSBram Moolenaar END 12852b32700dSBram Moolenaar writefile(lines, 'XReloaded') 12862b32700dSBram Moolenaar g:loadCount = 0 12872b32700dSBram Moolenaar source XReloaded 12882b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1289a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 12902b32700dSBram Moolenaar source XReloaded 12912b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1292a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 12932b32700dSBram Moolenaar source XReloaded 12942b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1295a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 12962b32700dSBram Moolenaar 129748e11c10SBram Moolenaar delete('XReloaded') 1298a6294955SBram Moolenaar delete('XExportReload') 12992b32700dSBram Moolenaar delfunc g:Values 13002b32700dSBram Moolenaar unlet g:loadCount 13012b32700dSBram Moolenaarenddef 13022b32700dSBram Moolenaar 13034c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1304cfcd011fSBram Moolenaar var lines =<< trim END 13058a7d6542SBram Moolenaar vim9script 13068a7d6542SBram Moolenaar const var = '' 1307cfcd011fSBram Moolenaar var valone = 1234 13088a7d6542SBram Moolenaar def MyFunc(arg: string) 13098a7d6542SBram Moolenaar valone = 5678 13108a7d6542SBram Moolenaar enddef 13118a7d6542SBram Moolenaar END 1312cfcd011fSBram Moolenaar var morelines =<< trim END 1313cfcd011fSBram Moolenaar var valtwo = 222 13148a7d6542SBram Moolenaar export def GetValtwo(): number 13158a7d6542SBram Moolenaar return valtwo 13168a7d6542SBram Moolenaar enddef 13178a7d6542SBram Moolenaar END 131803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13198a7d6542SBram Moolenaar source Xreload.vim 13208a7d6542SBram Moolenaar source Xreload.vim 13218a7d6542SBram Moolenaar source Xreload.vim 13228a7d6542SBram Moolenaar 1323cfcd011fSBram Moolenaar var testlines =<< trim END 13248a7d6542SBram Moolenaar vim9script 13258a7d6542SBram Moolenaar def TheFunc() 13268a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13278a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13288a7d6542SBram Moolenaar enddef 13298a7d6542SBram Moolenaar TheFunc() 13308a7d6542SBram Moolenaar END 13318a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13328a7d6542SBram Moolenaar source Ximport.vim 13338a7d6542SBram Moolenaar 1334f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1335f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 13368a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 13378a7d6542SBram Moolenaar source Ximport.vim 13388a7d6542SBram Moolenaar 1339f5be8cdbSBram Moolenaar # cannot declare a var twice 13408a7d6542SBram Moolenaar lines =<< trim END 13418a7d6542SBram Moolenaar vim9script 1342cfcd011fSBram Moolenaar var valone = 1234 1343cfcd011fSBram Moolenaar var valone = 5678 13448a7d6542SBram Moolenaar END 13458a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 134644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 13478a7d6542SBram Moolenaar 13488a7d6542SBram Moolenaar delete('Xreload.vim') 13498a7d6542SBram Moolenaar delete('Ximport.vim') 13508a7d6542SBram Moolenaarenddef 13518a7d6542SBram Moolenaar 135207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 135307a65d26SBram Moolenaar" compiled function using that variable must fail. 135407a65d26SBram Moolenaardef Test_script_reload_change_type() 135507a65d26SBram Moolenaar var lines =<< trim END 135607a65d26SBram Moolenaar vim9script noclear 135707a65d26SBram Moolenaar var str = 'string' 135807a65d26SBram Moolenaar def g:GetStr(): string 135907a65d26SBram Moolenaar return str .. 'xxx' 136007a65d26SBram Moolenaar enddef 136107a65d26SBram Moolenaar END 136207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 136307a65d26SBram Moolenaar source Xreload.vim 136407a65d26SBram Moolenaar echo g:GetStr() 136507a65d26SBram Moolenaar 136607a65d26SBram Moolenaar lines =<< trim END 136707a65d26SBram Moolenaar vim9script noclear 136807a65d26SBram Moolenaar var str = 1234 136907a65d26SBram Moolenaar END 137007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 137107a65d26SBram Moolenaar source Xreload.vim 137207a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 137307a65d26SBram Moolenaar 137407a65d26SBram Moolenaar delfunc g:GetStr 137507a65d26SBram Moolenaar delete('Xreload.vim') 137607a65d26SBram Moolenaarenddef 137707a65d26SBram Moolenaar 137895006e3dSBram Moolenaardef s:RetSome(): string 137995006e3dSBram Moolenaar return 'some' 138095006e3dSBram Moolenaarenddef 138195006e3dSBram Moolenaar 1382fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1383fe465a01SBram Moolenaar" script-local name. 1384fe465a01SBram Moolenaardef Test_vim9script_funcref() 1385cfcd011fSBram Moolenaar var sortlines =<< trim END 1386fe465a01SBram Moolenaar vim9script 1387fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1388bed36b93SBram Moolenaar return i2 - i1 1389fe465a01SBram Moolenaar enddef 1390fe465a01SBram Moolenaar 1391fe465a01SBram Moolenaar export def FastSort(): list<number> 1392fe465a01SBram Moolenaar return range(5)->sort(Compare) 1393fe465a01SBram Moolenaar enddef 1394fe465a01SBram Moolenaar END 1395fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1396fe465a01SBram Moolenaar 1397cfcd011fSBram Moolenaar var lines =<< trim END 1398fe465a01SBram Moolenaar vim9script 1399fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1400fe465a01SBram Moolenaar def Test() 1401fe465a01SBram Moolenaar g:result = FastSort() 1402fe465a01SBram Moolenaar enddef 1403fe465a01SBram Moolenaar Test() 1404fe465a01SBram Moolenaar END 1405fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1406fe465a01SBram Moolenaar 1407fe465a01SBram Moolenaar source Xscript.vim 1408fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1409fe465a01SBram Moolenaar 1410fe465a01SBram Moolenaar unlet g:result 1411fe465a01SBram Moolenaar delete('Xsort.vim') 1412fe465a01SBram Moolenaar delete('Xscript.vim') 141395006e3dSBram Moolenaar 1414cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 141595006e3dSBram Moolenaar assert_equal('some', Funcref()) 1416fe465a01SBram Moolenaarenddef 1417fe465a01SBram Moolenaar 1418601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1419601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1420601e76acSBram Moolenaar" function reference. 1421c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1422cfcd011fSBram Moolenaar var filterLines =<< trim END 1423c620c055SBram Moolenaar vim9script 1424c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1425c620c055SBram Moolenaar return idx % 2 == 1 1426c620c055SBram Moolenaar enddef 1427c620c055SBram Moolenaar export def FastFilter(): list<number> 1428c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1429c620c055SBram Moolenaar enddef 1430601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1431601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1432601e76acSBram Moolenaar enddef 1433c620c055SBram Moolenaar END 1434c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1435c620c055SBram Moolenaar 1436cfcd011fSBram Moolenaar var lines =<< trim END 1437c620c055SBram Moolenaar vim9script 1438601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1439c620c055SBram Moolenaar def Test() 1440cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1441c620c055SBram Moolenaar enddef 1442c620c055SBram Moolenaar Test() 1443601e76acSBram Moolenaar def TestDirect() 1444cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1445601e76acSBram Moolenaar enddef 1446601e76acSBram Moolenaar TestDirect() 1447c620c055SBram Moolenaar END 1448601e76acSBram Moolenaar CheckScriptSuccess(lines) 1449c620c055SBram Moolenaar delete('Xfilter.vim') 1450c620c055SBram Moolenaarenddef 1451c620c055SBram Moolenaar 14524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1453cfcd011fSBram Moolenaar var first_lines =<< trim END 14544c17ad94SBram Moolenaar vim9script 14554c17ad94SBram Moolenaar def FuncYes(): string 14564c17ad94SBram Moolenaar return 'yes' 14574c17ad94SBram Moolenaar enddef 14584c17ad94SBram Moolenaar END 1459cfcd011fSBram Moolenaar var withno_lines =<< trim END 14604c17ad94SBram Moolenaar def FuncNo(): string 14614c17ad94SBram Moolenaar return 'no' 14624c17ad94SBram Moolenaar enddef 14634c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 14644c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 14654c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 146603afdcf1SBram Moolenaar enddef 146703afdcf1SBram Moolenaar END 1468cfcd011fSBram Moolenaar var nono_lines =<< trim END 146903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 147003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 147144d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 14724c17ad94SBram Moolenaar enddef 14734c17ad94SBram Moolenaar END 14744c17ad94SBram Moolenaar 14754c17ad94SBram Moolenaar # FuncNo() is defined 147603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14774c17ad94SBram Moolenaar source Xreloaded.vim 14784c17ad94SBram Moolenaar g:DoCheck(true) 14794c17ad94SBram Moolenaar 14804c17ad94SBram Moolenaar # FuncNo() is not redefined 148103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 14824c17ad94SBram Moolenaar source Xreloaded.vim 14835082471fSBram Moolenaar g:DoCheck(false) 14844c17ad94SBram Moolenaar 14854c17ad94SBram Moolenaar # FuncNo() is back 148603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14874c17ad94SBram Moolenaar source Xreloaded.vim 14885082471fSBram Moolenaar g:DoCheck(false) 14894c17ad94SBram Moolenaar 14904c17ad94SBram Moolenaar delete('Xreloaded.vim') 14914c17ad94SBram Moolenaarenddef 14924c17ad94SBram Moolenaar 149389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 149489483d40SBram Moolenaar # write the script with a script-local variable 1495cfcd011fSBram Moolenaar var lines =<< trim END 149689483d40SBram Moolenaar vim9script 1497cfcd011fSBram Moolenaar var name = 'string' 149889483d40SBram Moolenaar END 149989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 150089483d40SBram Moolenaar source XreloadVar.vim 150189483d40SBram Moolenaar 150289483d40SBram Moolenaar # now write the script using the same variable locally - works 150389483d40SBram Moolenaar lines =<< trim END 150489483d40SBram Moolenaar vim9script 150589483d40SBram Moolenaar def Func() 1506cfcd011fSBram Moolenaar var name = 'string' 150789483d40SBram Moolenaar enddef 150889483d40SBram Moolenaar END 150989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 151089483d40SBram Moolenaar source XreloadVar.vim 151189483d40SBram Moolenaar 151289483d40SBram Moolenaar delete('XreloadVar.vim') 151389483d40SBram Moolenaarenddef 151489483d40SBram Moolenaar 15158a7d6542SBram Moolenaardef Test_import_absolute() 1516cfcd011fSBram Moolenaar var import_lines = [ 1517e6085c53SBram Moolenaar 'vim9script', 1518e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1519e6085c53SBram Moolenaar 'def UseExported()', 1520e6085c53SBram Moolenaar ' g:imported_abs = exported', 1521e6085c53SBram Moolenaar ' exported = 8888', 1522e6085c53SBram Moolenaar ' g:imported_after = exported', 1523e6085c53SBram Moolenaar 'enddef', 1524e6085c53SBram Moolenaar 'UseExported()', 1525e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1526e6085c53SBram Moolenaar ] 15278a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15288a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15298a7d6542SBram Moolenaar 15308a7d6542SBram Moolenaar source Ximport_abs.vim 15318a7d6542SBram Moolenaar 15328a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15334e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1534fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1535fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1536fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1537fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1538fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1539fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1540fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1541fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1542fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1543fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1544e6085c53SBram Moolenaar g:import_disassembled) 1545b3ca9824SBram Moolenaar 1546b3ca9824SBram Moolenaar Undo_export_script_lines() 15478a7d6542SBram Moolenaar unlet g:imported_abs 15484e12a5dfSBram Moolenaar unlet g:import_disassembled 15498a7d6542SBram Moolenaar 15508a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15518a7d6542SBram Moolenaar delete('Xexport_abs.vim') 15528a7d6542SBram Moolenaarenddef 15538a7d6542SBram Moolenaar 15548a7d6542SBram Moolenaardef Test_import_rtp() 1555cfcd011fSBram Moolenaar var import_lines = [ 1556e6085c53SBram Moolenaar 'vim9script', 1557e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1558e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1559e6085c53SBram Moolenaar ] 15608a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 15618a7d6542SBram Moolenaar mkdir('import') 15628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 15638a7d6542SBram Moolenaar 1564cfcd011fSBram Moolenaar var save_rtp = &rtp 15658a7d6542SBram Moolenaar &rtp = getcwd() 15668a7d6542SBram Moolenaar source Ximport_rtp.vim 15678a7d6542SBram Moolenaar &rtp = save_rtp 15688a7d6542SBram Moolenaar 15698a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 15708a7d6542SBram Moolenaar 1571b3ca9824SBram Moolenaar Undo_export_script_lines() 1572b3ca9824SBram Moolenaar unlet g:imported_rtp 15738a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 157489483d40SBram Moolenaar delete('import', 'rf') 15758a7d6542SBram Moolenaarenddef 15768a7d6542SBram Moolenaar 157725e0f586SBram Moolenaardef Test_import_compile_error() 1578cfcd011fSBram Moolenaar var export_lines = [ 157925e0f586SBram Moolenaar 'vim9script', 158025e0f586SBram Moolenaar 'export def ExpFunc(): string', 158125e0f586SBram Moolenaar ' return notDefined', 158225e0f586SBram Moolenaar 'enddef', 158325e0f586SBram Moolenaar ] 158425e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 158525e0f586SBram Moolenaar 1586cfcd011fSBram Moolenaar var import_lines = [ 158725e0f586SBram Moolenaar 'vim9script', 158825e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 158925e0f586SBram Moolenaar 'def ImpFunc()', 159025e0f586SBram Moolenaar ' echo ExpFunc()', 159125e0f586SBram Moolenaar 'enddef', 159225e0f586SBram Moolenaar 'defcompile', 159325e0f586SBram Moolenaar ] 159425e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 159525e0f586SBram Moolenaar 159625e0f586SBram Moolenaar try 159725e0f586SBram Moolenaar source Ximport.vim 159825e0f586SBram Moolenaar catch /E1001/ 1599f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16007707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 160125e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 160225e0f586SBram Moolenaar endtry 160325e0f586SBram Moolenaar 160425e0f586SBram Moolenaar delete('Xexported.vim') 160525e0f586SBram Moolenaar delete('Ximport.vim') 160625e0f586SBram Moolenaarenddef 160725e0f586SBram Moolenaar 1608c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1609cfcd011fSBram Moolenaar var lines = [ 1610c4ce36d4SBram Moolenaar 'vim9script', 1611c4ce36d4SBram Moolenaar 'def Func()', 1612c4ce36d4SBram Moolenaar ' eval [][0]', 1613c4ce36d4SBram Moolenaar 'enddef', 1614c4ce36d4SBram Moolenaar 'Func()', 1615c4ce36d4SBram Moolenaar ] 1616c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1617c4ce36d4SBram Moolenaar 1618c4ce36d4SBram Moolenaar for count in range(3) 1619c4ce36d4SBram Moolenaar try 1620c4ce36d4SBram Moolenaar source Xtestscript.vim 1621c4ce36d4SBram Moolenaar catch /E684/ 1622c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1623c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1624c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1625c4ce36d4SBram Moolenaar endtry 1626c4ce36d4SBram Moolenaar endfor 1627c4ce36d4SBram Moolenaar 1628c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1629c4ce36d4SBram Moolenaarenddef 1630c4ce36d4SBram Moolenaar 1631eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1632cfcd011fSBram Moolenaar var export_lines =<< trim END 1633eef2102eSBram Moolenaar vim9script 1634eef2102eSBram Moolenaar export def Func() 1635eef2102eSBram Moolenaar echo 'imported' 1636eef2102eSBram Moolenaar enddef 1637eef2102eSBram Moolenaar END 1638eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1639eef2102eSBram Moolenaar 1640cfcd011fSBram Moolenaar var lines =<< trim END 1641eef2102eSBram Moolenaar vim9script 1642eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1643eef2102eSBram Moolenaar def Func() 1644eef2102eSBram Moolenaar echo 'local to function' 1645eef2102eSBram Moolenaar enddef 1646eef2102eSBram Moolenaar END 1647eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1648eef2102eSBram Moolenaar 1649eef2102eSBram Moolenaar lines =<< trim END 1650eef2102eSBram Moolenaar vim9script 1651eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1652eef2102eSBram Moolenaar def Outer() 1653eef2102eSBram Moolenaar def Func() 1654eef2102eSBram Moolenaar echo 'local to function' 1655eef2102eSBram Moolenaar enddef 1656eef2102eSBram Moolenaar enddef 1657eef2102eSBram Moolenaar defcompile 1658eef2102eSBram Moolenaar END 1659eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1660eef2102eSBram Moolenaar 1661eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1662eef2102eSBram Moolenaarenddef 1663eef2102eSBram Moolenaar 1664b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1665cfcd011fSBram Moolenaar var lines =<< trim END 1666b9a2cac3SBram Moolenaar vim9script 1667b9a2cac3SBram Moolenaar def Func() 1668b9a2cac3SBram Moolenaar echo 'one' 1669b9a2cac3SBram Moolenaar enddef 1670b9a2cac3SBram Moolenaar def Func() 1671b9a2cac3SBram Moolenaar echo 'two' 1672b9a2cac3SBram Moolenaar enddef 1673b9a2cac3SBram Moolenaar END 1674b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1675fa211f3cSBram Moolenaar 1676fa211f3cSBram Moolenaar lines =<< trim END 1677fa211f3cSBram Moolenaar vim9script 1678fa211f3cSBram Moolenaar def Foo(): string 1679fa211f3cSBram Moolenaar return 'foo' 1680fa211f3cSBram Moolenaar enddef 1681fa211f3cSBram Moolenaar def Func() 1682cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1683fa211f3cSBram Moolenaar enddef 1684fa211f3cSBram Moolenaar defcompile 1685fa211f3cSBram Moolenaar END 1686fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1687b9a2cac3SBram Moolenaarenddef 1688b9a2cac3SBram Moolenaar 16898a7d6542SBram Moolenaardef Test_fixed_size_list() 1690f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1691cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 16928a7d6542SBram Moolenaar l->remove(0) 16938a7d6542SBram Moolenaar l->add(5) 16948a7d6542SBram Moolenaar l->insert(99, 1) 16950f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 16968a7d6542SBram Moolenaarenddef 16978a7d6542SBram Moolenaar 1698ae616494SBram Moolenaardef Test_no_insert_xit() 1699d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1700d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1701d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1702d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1703d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1704ae616494SBram Moolenaar 1705ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1706ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1707ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1708ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1709f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1710f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1711f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1712f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1713f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1714ae616494SBram Moolenaarenddef 1715ae616494SBram Moolenaar 1716158906cfSBram Moolenaardef IfElse(what: number): string 1717cfcd011fSBram Moolenaar var res = '' 1718158906cfSBram Moolenaar if what == 1 1719158906cfSBram Moolenaar res = "one" 1720158906cfSBram Moolenaar elseif what == 2 1721158906cfSBram Moolenaar res = "two" 1722a259d8d3SBram Moolenaar else 1723158906cfSBram Moolenaar res = "three" 1724a259d8d3SBram Moolenaar endif 1725158906cfSBram Moolenaar return res 1726a259d8d3SBram Moolenaarenddef 1727a259d8d3SBram Moolenaar 1728158906cfSBram Moolenaardef Test_if_elseif_else() 1729158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1730158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1731158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17320f18b6d1SBram Moolenaarenddef 17330f18b6d1SBram Moolenaar 1734e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1735d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1736d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1737d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1738d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1739d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1740e8c4abbbSBram Moolenaarenddef 1741e8c4abbbSBram Moolenaar 17426d69bf60SBram Moolenaarlet g:bool_true = v:true 17436d69bf60SBram Moolenaarlet g:bool_false = v:false 17446d69bf60SBram Moolenaar 17456d69bf60SBram Moolenaardef Test_if_const_expr() 1746cfcd011fSBram Moolenaar var res = false 17476d69bf60SBram Moolenaar if true ? true : false 17486d69bf60SBram Moolenaar res = true 17496d69bf60SBram Moolenaar endif 17506d69bf60SBram Moolenaar assert_equal(true, res) 17516d69bf60SBram Moolenaar 1752585fea7bSBram Moolenaar g:glob = 2 1753585fea7bSBram Moolenaar if false 17546797966dSBram Moolenaar execute('g:glob = 3') 1755585fea7bSBram Moolenaar endif 1756585fea7bSBram Moolenaar assert_equal(2, g:glob) 1757585fea7bSBram Moolenaar if true 17586797966dSBram Moolenaar execute('g:glob = 3') 1759585fea7bSBram Moolenaar endif 1760585fea7bSBram Moolenaar assert_equal(3, g:glob) 1761585fea7bSBram Moolenaar 17626d69bf60SBram Moolenaar res = false 17636d69bf60SBram Moolenaar if g:bool_true ? true : false 17646d69bf60SBram Moolenaar res = true 17656d69bf60SBram Moolenaar endif 17666d69bf60SBram Moolenaar assert_equal(true, res) 17676d69bf60SBram Moolenaar 17686d69bf60SBram Moolenaar res = false 17696d69bf60SBram Moolenaar if true ? g:bool_true : false 17706d69bf60SBram Moolenaar res = true 17716d69bf60SBram Moolenaar endif 17726d69bf60SBram Moolenaar assert_equal(true, res) 17736d69bf60SBram Moolenaar 17746d69bf60SBram Moolenaar res = false 17756d69bf60SBram Moolenaar if true ? true : g:bool_false 17766d69bf60SBram Moolenaar res = true 17776d69bf60SBram Moolenaar endif 17786d69bf60SBram Moolenaar assert_equal(true, res) 17796d69bf60SBram Moolenaar 17806d69bf60SBram Moolenaar res = false 17816d69bf60SBram Moolenaar if true ? false : true 17826d69bf60SBram Moolenaar res = true 17836d69bf60SBram Moolenaar endif 17846d69bf60SBram Moolenaar assert_equal(false, res) 17856d69bf60SBram Moolenaar 17866d69bf60SBram Moolenaar res = false 17876d69bf60SBram Moolenaar if false ? false : true 17886d69bf60SBram Moolenaar res = true 17896d69bf60SBram Moolenaar endif 17906d69bf60SBram Moolenaar assert_equal(true, res) 17916d69bf60SBram Moolenaar 17926d69bf60SBram Moolenaar res = false 17936d69bf60SBram Moolenaar if false ? true : false 17946d69bf60SBram Moolenaar res = true 17956d69bf60SBram Moolenaar endif 17966d69bf60SBram Moolenaar assert_equal(false, res) 17976d69bf60SBram Moolenaar 17986d69bf60SBram Moolenaar res = false 1799e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1800e8c4abbbSBram Moolenaar res = true 1801e8c4abbbSBram Moolenaar endif 1802e8c4abbbSBram Moolenaar assert_equal(false, res) 1803e8c4abbbSBram Moolenaar 1804e8c4abbbSBram Moolenaar res = false 18056d69bf60SBram Moolenaar if true && true 18066d69bf60SBram Moolenaar res = true 18076d69bf60SBram Moolenaar endif 18086d69bf60SBram Moolenaar assert_equal(true, res) 18096d69bf60SBram Moolenaar 18106d69bf60SBram Moolenaar res = false 18116d69bf60SBram Moolenaar if true && false 18126d69bf60SBram Moolenaar res = true 18136d69bf60SBram Moolenaar endif 18146d69bf60SBram Moolenaar assert_equal(false, res) 18156d69bf60SBram Moolenaar 18166d69bf60SBram Moolenaar res = false 18176d69bf60SBram Moolenaar if g:bool_true && false 18186d69bf60SBram Moolenaar res = true 18196d69bf60SBram Moolenaar endif 18206d69bf60SBram Moolenaar assert_equal(false, res) 18216d69bf60SBram Moolenaar 18226d69bf60SBram Moolenaar res = false 18236d69bf60SBram Moolenaar if true && g:bool_false 18246d69bf60SBram Moolenaar res = true 18256d69bf60SBram Moolenaar endif 18266d69bf60SBram Moolenaar assert_equal(false, res) 18276d69bf60SBram Moolenaar 18286d69bf60SBram Moolenaar res = false 18296d69bf60SBram Moolenaar if false && false 18306d69bf60SBram Moolenaar res = true 18316d69bf60SBram Moolenaar endif 18326d69bf60SBram Moolenaar assert_equal(false, res) 18336d69bf60SBram Moolenaar 18346d69bf60SBram Moolenaar res = false 18356d69bf60SBram Moolenaar if true || false 18366d69bf60SBram Moolenaar res = true 18376d69bf60SBram Moolenaar endif 18386d69bf60SBram Moolenaar assert_equal(true, res) 18396d69bf60SBram Moolenaar 18406d69bf60SBram Moolenaar res = false 18416d69bf60SBram Moolenaar if g:bool_true || false 18426d69bf60SBram Moolenaar res = true 18436d69bf60SBram Moolenaar endif 18446d69bf60SBram Moolenaar assert_equal(true, res) 18456d69bf60SBram Moolenaar 18466d69bf60SBram Moolenaar res = false 18476d69bf60SBram Moolenaar if true || g:bool_false 18486d69bf60SBram Moolenaar res = true 18496d69bf60SBram Moolenaar endif 18506d69bf60SBram Moolenaar assert_equal(true, res) 18516d69bf60SBram Moolenaar 18526d69bf60SBram Moolenaar res = false 18536d69bf60SBram Moolenaar if false || false 18546d69bf60SBram Moolenaar res = true 18556d69bf60SBram Moolenaar endif 18566d69bf60SBram Moolenaar assert_equal(false, res) 18573988f64fSBram Moolenaar 18583988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 18593988f64fSBram Moolenaar if false | eval 0 | endif 18603988f64fSBram Moolenaar if false | eval burp + 234 | endif 18613988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 18623988f64fSBram Moolenaar if false 18633988f64fSBram Moolenaar burp 18643988f64fSBram Moolenaar endif 186580c34ca3SBram Moolenaarenddef 18666d69bf60SBram Moolenaar 186780c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1868d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1869d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1870d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1871d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 18726d69bf60SBram Moolenaarenddef 18736d69bf60SBram Moolenaar 187472abcf42SBram Moolenaardef RunNested(i: number): number 1875cfcd011fSBram Moolenaar var x: number = 0 187672abcf42SBram Moolenaar if i % 2 187772abcf42SBram Moolenaar if 1 1878f5be8cdbSBram Moolenaar # comment 187972abcf42SBram Moolenaar else 1880f5be8cdbSBram Moolenaar # comment 188172abcf42SBram Moolenaar endif 188272abcf42SBram Moolenaar x += 1 188372abcf42SBram Moolenaar else 188472abcf42SBram Moolenaar x += 1000 188572abcf42SBram Moolenaar endif 188672abcf42SBram Moolenaar return x 188772abcf42SBram Moolenaarenddef 188872abcf42SBram Moolenaar 188972abcf42SBram Moolenaardef Test_nested_if() 189072abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 189172abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 189272abcf42SBram Moolenaarenddef 189372abcf42SBram Moolenaar 1894ad39c094SBram Moolenaardef Test_execute_cmd() 1895e4984290SBram Moolenaar # missing argument is ignored 1896e4984290SBram Moolenaar execute 1897e4984290SBram Moolenaar execute # comment 1898e4984290SBram Moolenaar 1899ad39c094SBram Moolenaar new 1900ad39c094SBram Moolenaar setline(1, 'default') 1901d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1902ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1903a72cfb80SBram Moolenaar 1904d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1905a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1906a72cfb80SBram Moolenaar 1907cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1908cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1909a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1910ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1911a72cfb80SBram Moolenaar 1912d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1913ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1914a72cfb80SBram Moolenaar 1915cfcd011fSBram Moolenaar var cmd_first = 'call ' 1916cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1917ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1918ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1919ad39c094SBram Moolenaar bwipe! 1920585fea7bSBram Moolenaar 1921cfcd011fSBram Moolenaar var n = true 19222d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19232d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19242d6b20d6SBram Moolenaar 1925e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1926e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1927e5abf7afSBram Moolenaar 1928d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1929d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1930d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1931ad39c094SBram Moolenaarenddef 1932ad39c094SBram Moolenaar 193347e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1934f5be8cdbSBram Moolenaar # only checks line continuation 1935cfcd011fSBram Moolenaar var lines =<< trim END 193647e880d6SBram Moolenaar vim9script 193747e880d6SBram Moolenaar execute 'g:someVar' 193847e880d6SBram Moolenaar .. ' = ' .. 193947e880d6SBram Moolenaar '28' 194047e880d6SBram Moolenaar assert_equal(28, g:someVar) 194147e880d6SBram Moolenaar unlet g:someVar 194247e880d6SBram Moolenaar END 194347e880d6SBram Moolenaar CheckScriptSuccess(lines) 194447e880d6SBram Moolenaarenddef 194547e880d6SBram Moolenaar 1946ad39c094SBram Moolenaardef Test_echo_cmd() 1947a72cfb80SBram Moolenaar echo 'some' # comment 1948585fea7bSBram Moolenaar echon 'thing' 1949ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1950ad39c094SBram Moolenaar 1951a72cfb80SBram Moolenaar echo "some" # comment 1952a72cfb80SBram Moolenaar echon "thing" 1953a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1954a72cfb80SBram Moolenaar 1955cfcd011fSBram Moolenaar var str1 = 'some' 1956cfcd011fSBram Moolenaar var str2 = 'more' 1957ad39c094SBram Moolenaar echo str1 str2 1958ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1959a72cfb80SBram Moolenaar 1960d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1961ad39c094SBram Moolenaarenddef 1962ad39c094SBram Moolenaar 1963f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1964f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1965f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1966f93c7feaSBram Moolenaar echo 'clear' 1967df069eecSBram Moolenaar :1messages 1968f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1969f93c7feaSBram Moolenaar 1970d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1971f93c7feaSBram Moolenaarenddef 1972f93c7feaSBram Moolenaar 197347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1974f5be8cdbSBram Moolenaar # only checks line continuation 1975cfcd011fSBram Moolenaar var lines =<< trim END 197647e880d6SBram Moolenaar vim9script 197747e880d6SBram Moolenaar echomsg 'here' 197847e880d6SBram Moolenaar .. ' is ' .. 197947e880d6SBram Moolenaar 'a message' 198047e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 198147e880d6SBram Moolenaar END 198247e880d6SBram Moolenaar CheckScriptSuccess(lines) 198347e880d6SBram Moolenaarenddef 198447e880d6SBram Moolenaar 1985f93c7feaSBram Moolenaardef Test_echoerr_cmd() 198640ee466cSBram Moolenaar try 198740ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 198840ee466cSBram Moolenaar catch 198940ee466cSBram Moolenaar assert_match('something wrong', v:exception) 199040ee466cSBram Moolenaar endtry 1991f93c7feaSBram Moolenaarenddef 1992f93c7feaSBram Moolenaar 199347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1994f5be8cdbSBram Moolenaar # only checks line continuation 1995cfcd011fSBram Moolenaar var lines =<< trim END 199647e880d6SBram Moolenaar vim9script 199747e880d6SBram Moolenaar try 199847e880d6SBram Moolenaar echoerr 'this' 199947e880d6SBram Moolenaar .. ' is ' .. 200047e880d6SBram Moolenaar 'wrong' 200147e880d6SBram Moolenaar catch 200247e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 200347e880d6SBram Moolenaar endtry 200447e880d6SBram Moolenaar END 200547e880d6SBram Moolenaar CheckScriptSuccess(lines) 200647e880d6SBram Moolenaarenddef 200747e880d6SBram Moolenaar 200841fe0617SBram Moolenaardef Test_for_outside_of_function() 2009cfcd011fSBram Moolenaar var lines =<< trim END 201041fe0617SBram Moolenaar vim9script 201141fe0617SBram Moolenaar new 201241fe0617SBram Moolenaar for var in range(0, 3) 201341fe0617SBram Moolenaar append(line('$'), var) 201441fe0617SBram Moolenaar endfor 201541fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 201641fe0617SBram Moolenaar bwipe! 201741fe0617SBram Moolenaar END 201841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 201941fe0617SBram Moolenaar source Xvim9for.vim 202041fe0617SBram Moolenaar delete('Xvim9for.vim') 202141fe0617SBram Moolenaarenddef 20228a7d6542SBram Moolenaar 2023e8c4abbbSBram Moolenaardef Test_for_loop() 2024cfcd011fSBram Moolenaar var result = '' 2025e8c4abbbSBram Moolenaar for cnt in range(7) 2026e8c4abbbSBram Moolenaar if cnt == 4 2027e8c4abbbSBram Moolenaar break 2028e8c4abbbSBram Moolenaar endif 2029e8c4abbbSBram Moolenaar if cnt == 2 2030e8c4abbbSBram Moolenaar continue 2031e8c4abbbSBram Moolenaar endif 2032e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2033e8c4abbbSBram Moolenaar endfor 2034e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20350ad3e894SBram Moolenaar 2036cfcd011fSBram Moolenaar var concat = '' 20370ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20380ad3e894SBram Moolenaar concat ..= str 20390ad3e894SBram Moolenaar endfor 20400ad3e894SBram Moolenaar assert_equal('onetwo', concat) 204138bd8de5SBram Moolenaar 204238bd8de5SBram Moolenaar var total = 0 204338bd8de5SBram Moolenaar for nr in 204438bd8de5SBram Moolenaar [1, 2, 3] 204538bd8de5SBram Moolenaar total += nr 204638bd8de5SBram Moolenaar endfor 204738bd8de5SBram Moolenaar assert_equal(6, total) 204838bd8de5SBram Moolenaar 204938bd8de5SBram Moolenaar total = 0 205038bd8de5SBram Moolenaar for nr 205138bd8de5SBram Moolenaar in [1, 2, 3] 205238bd8de5SBram Moolenaar total += nr 205338bd8de5SBram Moolenaar endfor 205438bd8de5SBram Moolenaar assert_equal(6, total) 205538bd8de5SBram Moolenaar 205638bd8de5SBram Moolenaar total = 0 205738bd8de5SBram Moolenaar for nr 205838bd8de5SBram Moolenaar in 205938bd8de5SBram Moolenaar [1, 2, 3] 206038bd8de5SBram Moolenaar total += nr 206138bd8de5SBram Moolenaar endfor 206238bd8de5SBram Moolenaar assert_equal(6, total) 2063e8c4abbbSBram Moolenaarenddef 2064e8c4abbbSBram Moolenaar 2065e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2066025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2067025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2068025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2069675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2070675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2071cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2072822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 20732d870f8dSBram Moolenaar delfunc! g:Func 2074451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2075675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2076675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2077675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2078e8c4abbbSBram Moolenaarenddef 2079e8c4abbbSBram Moolenaar 2080ea87069dSBram Moolenaardef Test_for_loop_script_var() 2081ea87069dSBram Moolenaar # cannot use s:var in a :def function 2082ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2083ea87069dSBram Moolenaar 2084ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2085ea87069dSBram Moolenaar var lines =<< trim END 2086ea87069dSBram Moolenaar vim9script 2087ea87069dSBram Moolenaar var total = 0 2088ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2089ea87069dSBram Moolenaar total += s:var 2090ea87069dSBram Moolenaar endfor 2091ea87069dSBram Moolenaar assert_equal(6, total) 2092ea87069dSBram Moolenaar 2093ea87069dSBram Moolenaar total = 0 2094ea87069dSBram Moolenaar for var in [1, 2, 3] 2095ea87069dSBram Moolenaar total += var 2096ea87069dSBram Moolenaar endfor 2097ea87069dSBram Moolenaar assert_equal(6, total) 2098ea87069dSBram Moolenaar END 2099ea87069dSBram Moolenaarenddef 2100ea87069dSBram Moolenaar 2101792f786aSBram Moolenaardef Test_for_loop_unpack() 21024b8a0651SBram Moolenaar var lines =<< trim END 2103792f786aSBram Moolenaar var result = [] 2104792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2105792f786aSBram Moolenaar result->add(v1) 2106792f786aSBram Moolenaar result->add(v2) 2107792f786aSBram Moolenaar endfor 2108792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2109792f786aSBram Moolenaar 2110792f786aSBram Moolenaar result = [] 2111792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2112792f786aSBram Moolenaar result->add(v1) 2113792f786aSBram Moolenaar result->add(v2) 2114792f786aSBram Moolenaar result->add(v3) 2115792f786aSBram Moolenaar endfor 2116792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2117792f786aSBram Moolenaar 21184b8a0651SBram Moolenaar result = [] 21194b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 21204b8a0651SBram Moolenaar result->add(&ts) 21214b8a0651SBram Moolenaar result->add(&sw) 21224b8a0651SBram Moolenaar endfor 21234b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 21244b8a0651SBram Moolenaar 21254b8a0651SBram Moolenaar var slist: list<string> 21264b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 21274b8a0651SBram Moolenaar slist->add($LOOPVAR) 21284b8a0651SBram Moolenaar slist->add(@r) 21294b8a0651SBram Moolenaar slist->add(v:errmsg) 21304b8a0651SBram Moolenaar endfor 21314b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 21324b8a0651SBram Moolenaar 21334b8a0651SBram Moolenaar slist = [] 21344b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 21354b8a0651SBram Moolenaar slist->add(g:globalvar) 21364b8a0651SBram Moolenaar slist->add(b:bufvar) 21374b8a0651SBram Moolenaar slist->add(w:winvar) 21384b8a0651SBram Moolenaar slist->add(t:tabvar) 21394b8a0651SBram Moolenaar endfor 21404b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2141f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 21424b8a0651SBram Moolenaar END 21434b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 21444b8a0651SBram Moolenaar 21454b8a0651SBram Moolenaar lines =<< trim END 2146792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2147792f786aSBram Moolenaar echo v1 v2 2148792f786aSBram Moolenaar endfor 2149792f786aSBram Moolenaar END 2150792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2151792f786aSBram Moolenaar 2152792f786aSBram Moolenaar lines =<< trim END 2153792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2154792f786aSBram Moolenaar echo v1 v2 2155792f786aSBram Moolenaar endfor 2156792f786aSBram Moolenaar END 2157792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2158792f786aSBram Moolenaar 2159792f786aSBram Moolenaar lines =<< trim END 2160792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2161792f786aSBram Moolenaar echo v1 2162792f786aSBram Moolenaar endfor 2163792f786aSBram Moolenaar END 2164792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2165792f786aSBram Moolenaarenddef 2166792f786aSBram Moolenaar 2167d0df1aacSBram Moolenaardef Test_while_loop() 2168cfcd011fSBram Moolenaar var result = '' 2169cfcd011fSBram Moolenaar var cnt = 0 2170d0df1aacSBram Moolenaar while cnt < 555 2171d0df1aacSBram Moolenaar if cnt == 3 2172d0df1aacSBram Moolenaar break 2173d0df1aacSBram Moolenaar endif 2174d0df1aacSBram Moolenaar cnt += 1 2175d0df1aacSBram Moolenaar if cnt == 2 2176d0df1aacSBram Moolenaar continue 2177d0df1aacSBram Moolenaar endif 2178d0df1aacSBram Moolenaar result ..= cnt .. '_' 2179d0df1aacSBram Moolenaar endwhile 2180d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2181d0df1aacSBram Moolenaarenddef 2182d0df1aacSBram Moolenaar 2183e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2184675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2185675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2186675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2187675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2188675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2189675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2190675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2191bd5da371SBram Moolenaarenddef 2192bd5da371SBram Moolenaar 21939645e2d9SBram Moolenaardef Test_interrupt_loop() 2194cfcd011fSBram Moolenaar var caught = false 2195cfcd011fSBram Moolenaar var x = 0 219697acfc78SBram Moolenaar try 21979645e2d9SBram Moolenaar while 1 21989645e2d9SBram Moolenaar x += 1 21999645e2d9SBram Moolenaar if x == 100 22009645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22019645e2d9SBram Moolenaar endif 22029645e2d9SBram Moolenaar endwhile 220397acfc78SBram Moolenaar catch 220497acfc78SBram Moolenaar caught = true 220597acfc78SBram Moolenaar assert_equal(100, x) 220697acfc78SBram Moolenaar endtry 220797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 220825859dd7SBram Moolenaar # consume the CTRL-C 220925859dd7SBram Moolenaar getchar(0) 22109645e2d9SBram Moolenaarenddef 221120431c9dSBram Moolenaar 22124fdae999SBram Moolenaardef Test_automatic_line_continuation() 2213cfcd011fSBram Moolenaar var mylist = [ 22144fdae999SBram Moolenaar 'one', 22154fdae999SBram Moolenaar 'two', 22164fdae999SBram Moolenaar 'three', 2217f5be8cdbSBram Moolenaar ] # comment 22184fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22194fdae999SBram Moolenaar 2220cfcd011fSBram Moolenaar var mydict = { 2221e0de171eSBram Moolenaar ['one']: 1, 2222e0de171eSBram Moolenaar ['two']: 2, 2223e0de171eSBram Moolenaar ['three']: 22244fdae999SBram Moolenaar 3, 2225f5be8cdbSBram Moolenaar } # comment 2226e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2227e0de171eSBram Moolenaar mydict = { 22282c330432SBram Moolenaar one: 1, # comment 22292c330432SBram Moolenaar two: # comment 22302c330432SBram Moolenaar 2, # comment 22312c330432SBram Moolenaar three: 3 # comment 22322c330432SBram Moolenaar } 2233e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2234e0de171eSBram Moolenaar mydict = { 22352c330432SBram Moolenaar one: 1, 22364fdae999SBram Moolenaar two: 22374fdae999SBram Moolenaar 2, 22382c330432SBram Moolenaar three: 3 22394fdae999SBram Moolenaar } 2240e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2241e6085c53SBram Moolenaar 2242e6085c53SBram Moolenaar assert_equal( 2243e6085c53SBram Moolenaar ['one', 'two', 'three'], 2244e6085c53SBram Moolenaar split('one two three') 2245e6085c53SBram Moolenaar ) 22464fdae999SBram Moolenaarenddef 22474fdae999SBram Moolenaar 22487a092245SBram Moolenaardef Test_vim9_comment() 22497a092245SBram Moolenaar CheckScriptSuccess([ 22507a092245SBram Moolenaar 'vim9script', 22517a092245SBram Moolenaar '# something', 225293f82cbeSBram Moolenaar '#something', 225393f82cbeSBram Moolenaar '#{something', 22547a092245SBram Moolenaar ]) 225593f82cbeSBram Moolenaar 225693f82cbeSBram Moolenaar split Xfile 225793f82cbeSBram Moolenaar CheckScriptSuccess([ 225893f82cbeSBram Moolenaar 'vim9script', 225993f82cbeSBram Moolenaar 'edit #something', 226093f82cbeSBram Moolenaar ]) 226193f82cbeSBram Moolenaar CheckScriptSuccess([ 226293f82cbeSBram Moolenaar 'vim9script', 226393f82cbeSBram Moolenaar 'edit #{something', 226493f82cbeSBram Moolenaar ]) 226593f82cbeSBram Moolenaar close 226693f82cbeSBram Moolenaar 22677a092245SBram Moolenaar CheckScriptFailure([ 22687a092245SBram Moolenaar 'vim9script', 22697a092245SBram Moolenaar ':# something', 22707a092245SBram Moolenaar ], 'E488:') 22717a092245SBram Moolenaar CheckScriptFailure([ 22727a092245SBram Moolenaar '# something', 22737a092245SBram Moolenaar ], 'E488:') 22747a092245SBram Moolenaar CheckScriptFailure([ 22757a092245SBram Moolenaar ':# something', 22767a092245SBram Moolenaar ], 'E488:') 22777a092245SBram Moolenaar 22784a8d9f2eSBram Moolenaar { # block start 22794a8d9f2eSBram Moolenaar } # block end 22804a8d9f2eSBram Moolenaar CheckDefFailure([ 22814a8d9f2eSBram Moolenaar '{# comment', 22824a8d9f2eSBram Moolenaar ], 'E488:') 22834a8d9f2eSBram Moolenaar CheckDefFailure([ 22844a8d9f2eSBram Moolenaar '{', 22854a8d9f2eSBram Moolenaar '}# comment', 22864a8d9f2eSBram Moolenaar ], 'E488:') 22874a8d9f2eSBram Moolenaar 22884a8d9f2eSBram Moolenaar echo "yes" # comment 22894a8d9f2eSBram Moolenaar CheckDefFailure([ 22904a8d9f2eSBram Moolenaar 'echo "yes"# comment', 22914a8d9f2eSBram Moolenaar ], 'E488:') 22927a092245SBram Moolenaar CheckScriptSuccess([ 22937a092245SBram Moolenaar 'vim9script', 22947a092245SBram Moolenaar 'echo "yes" # something', 22957a092245SBram Moolenaar ]) 22967a092245SBram Moolenaar CheckScriptFailure([ 22977a092245SBram Moolenaar 'vim9script', 22987a092245SBram Moolenaar 'echo "yes"# something', 22997a092245SBram Moolenaar ], 'E121:') 23007a092245SBram Moolenaar CheckScriptFailure([ 23017a092245SBram Moolenaar 'vim9script', 23027a092245SBram Moolenaar 'echo# something', 2303f8103f27SBram Moolenaar ], 'E1144:') 23047a092245SBram Moolenaar CheckScriptFailure([ 23057a092245SBram Moolenaar 'echo "yes" # something', 23067a092245SBram Moolenaar ], 'E121:') 23077a092245SBram Moolenaar 23084a8d9f2eSBram Moolenaar exe "echo" # comment 23094a8d9f2eSBram Moolenaar CheckDefFailure([ 23104a8d9f2eSBram Moolenaar 'exe "echo"# comment', 23114a8d9f2eSBram Moolenaar ], 'E488:') 23124a8d9f2eSBram Moolenaar CheckScriptSuccess([ 23134a8d9f2eSBram Moolenaar 'vim9script', 23144a8d9f2eSBram Moolenaar 'exe "echo" # something', 23154a8d9f2eSBram Moolenaar ]) 23164a8d9f2eSBram Moolenaar CheckScriptFailure([ 23174a8d9f2eSBram Moolenaar 'vim9script', 23184a8d9f2eSBram Moolenaar 'exe "echo"# something', 23194a8d9f2eSBram Moolenaar ], 'E121:') 23204a8d9f2eSBram Moolenaar CheckScriptFailure([ 23214a8d9f2eSBram Moolenaar 'vim9script', 23224a8d9f2eSBram Moolenaar 'exe# something', 2323f8103f27SBram Moolenaar ], 'E1144:') 23244a8d9f2eSBram Moolenaar CheckScriptFailure([ 23254a8d9f2eSBram Moolenaar 'exe "echo" # something', 23264a8d9f2eSBram Moolenaar ], 'E121:') 23274a8d9f2eSBram Moolenaar 23287a092245SBram Moolenaar CheckDefFailure([ 23297a092245SBram Moolenaar 'try# comment', 23307a092245SBram Moolenaar ' echo "yes"', 23317a092245SBram Moolenaar 'catch', 23327a092245SBram Moolenaar 'endtry', 2333f8103f27SBram Moolenaar ], 'E1144:') 23342c5ed4e3SBram Moolenaar CheckScriptFailure([ 23352c5ed4e3SBram Moolenaar 'vim9script', 23362c5ed4e3SBram Moolenaar 'try# comment', 23372c5ed4e3SBram Moolenaar 'echo "yes"', 2338f8103f27SBram Moolenaar ], 'E1144:') 23397a092245SBram Moolenaar CheckDefFailure([ 23407a092245SBram Moolenaar 'try', 2341a72cfb80SBram Moolenaar ' throw#comment', 2342a72cfb80SBram Moolenaar 'catch', 2343a72cfb80SBram Moolenaar 'endtry', 2344f8103f27SBram Moolenaar ], 'E1144:') 2345a72cfb80SBram Moolenaar CheckDefFailure([ 2346a72cfb80SBram Moolenaar 'try', 2347a72cfb80SBram Moolenaar ' throw "yes"#comment', 2348a72cfb80SBram Moolenaar 'catch', 2349a72cfb80SBram Moolenaar 'endtry', 2350a72cfb80SBram Moolenaar ], 'E488:') 2351a72cfb80SBram Moolenaar CheckDefFailure([ 2352a72cfb80SBram Moolenaar 'try', 23537a092245SBram Moolenaar ' echo "yes"', 23547a092245SBram Moolenaar 'catch# comment', 23557a092245SBram Moolenaar 'endtry', 2356f8103f27SBram Moolenaar ], 'E1144:') 23572c5ed4e3SBram Moolenaar CheckScriptFailure([ 23582c5ed4e3SBram Moolenaar 'vim9script', 23592c5ed4e3SBram Moolenaar 'try', 23602c5ed4e3SBram Moolenaar ' echo "yes"', 23612c5ed4e3SBram Moolenaar 'catch# comment', 23622c5ed4e3SBram Moolenaar 'endtry', 2363f8103f27SBram Moolenaar ], 'E1144:') 23642c5ed4e3SBram Moolenaar CheckDefFailure([ 23652c5ed4e3SBram Moolenaar 'try', 23662c5ed4e3SBram Moolenaar ' echo "yes"', 23672c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23682c5ed4e3SBram Moolenaar 'endtry', 23692c5ed4e3SBram Moolenaar ], 'E488:') 23707a092245SBram Moolenaar CheckDefFailure([ 23717a092245SBram Moolenaar 'try', 23727a092245SBram Moolenaar 'echo "yes"', 23737a092245SBram Moolenaar 'catch', 23747a092245SBram Moolenaar 'endtry# comment', 2375f8103f27SBram Moolenaar ], 'E1144:') 23762c5ed4e3SBram Moolenaar CheckScriptFailure([ 23772c5ed4e3SBram Moolenaar 'vim9script', 23782c5ed4e3SBram Moolenaar 'try', 23792c5ed4e3SBram Moolenaar ' echo "yes"', 23802c5ed4e3SBram Moolenaar 'catch', 23812c5ed4e3SBram Moolenaar 'endtry# comment', 2382f8103f27SBram Moolenaar ], 'E1144:') 23832c5ed4e3SBram Moolenaar 23842c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23852c5ed4e3SBram Moolenaar 'vim9script', 23862c5ed4e3SBram Moolenaar 'hi # comment', 23872c5ed4e3SBram Moolenaar ]) 23882c5ed4e3SBram Moolenaar CheckScriptFailure([ 23892c5ed4e3SBram Moolenaar 'vim9script', 23902c5ed4e3SBram Moolenaar 'hi# comment', 2391f8103f27SBram Moolenaar ], 'E1144:') 23921966c248SBram Moolenaar CheckScriptSuccess([ 23931966c248SBram Moolenaar 'vim9script', 23941966c248SBram Moolenaar 'hi Search # comment', 23951966c248SBram Moolenaar ]) 23961966c248SBram Moolenaar CheckScriptFailure([ 23971966c248SBram Moolenaar 'vim9script', 23981966c248SBram Moolenaar 'hi Search# comment', 23991966c248SBram Moolenaar ], 'E416:') 24001966c248SBram Moolenaar CheckScriptSuccess([ 24011966c248SBram Moolenaar 'vim9script', 24021966c248SBram Moolenaar 'hi link This Search # comment', 24031966c248SBram Moolenaar ]) 24041966c248SBram Moolenaar CheckScriptFailure([ 24051966c248SBram Moolenaar 'vim9script', 24061966c248SBram Moolenaar 'hi link This That# comment', 24071966c248SBram Moolenaar ], 'E413:') 24081966c248SBram Moolenaar CheckScriptSuccess([ 24091966c248SBram Moolenaar 'vim9script', 24101966c248SBram Moolenaar 'hi clear This # comment', 24111966c248SBram Moolenaar 'hi clear # comment', 24121966c248SBram Moolenaar ]) 2413f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2414f5be8cdbSBram Moolenaar # hi clear This# comment', 24151966c248SBram Moolenaar CheckScriptFailure([ 24161966c248SBram Moolenaar 'vim9script', 24171966c248SBram Moolenaar 'hi clear# comment', 24181966c248SBram Moolenaar ], 'E416:') 24191966c248SBram Moolenaar 24201966c248SBram Moolenaar CheckScriptSuccess([ 24211966c248SBram Moolenaar 'vim9script', 24221966c248SBram Moolenaar 'hi Group term=bold', 24231966c248SBram Moolenaar 'match Group /todo/ # comment', 24241966c248SBram Moolenaar ]) 24251966c248SBram Moolenaar CheckScriptFailure([ 24261966c248SBram Moolenaar 'vim9script', 24271966c248SBram Moolenaar 'hi Group term=bold', 24281966c248SBram Moolenaar 'match Group /todo/# comment', 24291966c248SBram Moolenaar ], 'E488:') 24301966c248SBram Moolenaar CheckScriptSuccess([ 24311966c248SBram Moolenaar 'vim9script', 24321966c248SBram Moolenaar 'match # comment', 24331966c248SBram Moolenaar ]) 24341966c248SBram Moolenaar CheckScriptFailure([ 24351966c248SBram Moolenaar 'vim9script', 24361966c248SBram Moolenaar 'match# comment', 2437f8103f27SBram Moolenaar ], 'E1144:') 24381966c248SBram Moolenaar CheckScriptSuccess([ 24391966c248SBram Moolenaar 'vim9script', 24401966c248SBram Moolenaar 'match none # comment', 24411966c248SBram Moolenaar ]) 24421966c248SBram Moolenaar CheckScriptFailure([ 24431966c248SBram Moolenaar 'vim9script', 24441966c248SBram Moolenaar 'match none# comment', 24451966c248SBram Moolenaar ], 'E475:') 24461966c248SBram Moolenaar 24471966c248SBram Moolenaar CheckScriptSuccess([ 24481966c248SBram Moolenaar 'vim9script', 24491966c248SBram Moolenaar 'menutrans clear # comment', 24501966c248SBram Moolenaar ]) 24511966c248SBram Moolenaar CheckScriptFailure([ 24521966c248SBram Moolenaar 'vim9script', 24531966c248SBram Moolenaar 'menutrans clear# comment text', 24541966c248SBram Moolenaar ], 'E474:') 24551966c248SBram Moolenaar 24561966c248SBram Moolenaar CheckScriptSuccess([ 24571966c248SBram Moolenaar 'vim9script', 24581966c248SBram Moolenaar 'syntax clear # comment', 24591966c248SBram Moolenaar ]) 24601966c248SBram Moolenaar CheckScriptFailure([ 24611966c248SBram Moolenaar 'vim9script', 24621966c248SBram Moolenaar 'syntax clear# comment text', 24631966c248SBram Moolenaar ], 'E28:') 24641966c248SBram Moolenaar CheckScriptSuccess([ 24651966c248SBram Moolenaar 'vim9script', 24661966c248SBram Moolenaar 'syntax keyword Word some', 24671966c248SBram Moolenaar 'syntax clear Word # comment', 24681966c248SBram Moolenaar ]) 24691966c248SBram Moolenaar CheckScriptFailure([ 24701966c248SBram Moolenaar 'vim9script', 24711966c248SBram Moolenaar 'syntax keyword Word some', 24721966c248SBram Moolenaar 'syntax clear Word# comment text', 24731966c248SBram Moolenaar ], 'E28:') 24741966c248SBram Moolenaar 24751966c248SBram Moolenaar CheckScriptSuccess([ 24761966c248SBram Moolenaar 'vim9script', 24771966c248SBram Moolenaar 'syntax list # comment', 24781966c248SBram Moolenaar ]) 24791966c248SBram Moolenaar CheckScriptFailure([ 24801966c248SBram Moolenaar 'vim9script', 24811966c248SBram Moolenaar 'syntax list# comment text', 24821966c248SBram Moolenaar ], 'E28:') 24831966c248SBram Moolenaar 24841966c248SBram Moolenaar CheckScriptSuccess([ 24851966c248SBram Moolenaar 'vim9script', 24861966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24871966c248SBram Moolenaar ]) 24881966c248SBram Moolenaar CheckScriptFailure([ 24891966c248SBram Moolenaar 'vim9script', 24901966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 24911966c248SBram Moolenaar ], 'E475:') 24921966c248SBram Moolenaar 24931966c248SBram Moolenaar CheckScriptSuccess([ 24941966c248SBram Moolenaar 'vim9script', 24951966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 24961966c248SBram Moolenaar ]) 24971966c248SBram Moolenaar CheckScriptFailure([ 24981966c248SBram Moolenaar 'vim9script', 24991966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25001966c248SBram Moolenaar ], 'E789:') 25011966c248SBram Moolenaar 25021966c248SBram Moolenaar CheckScriptSuccess([ 25031966c248SBram Moolenaar 'vim9script', 25041966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 25051966c248SBram Moolenaar ]) 25061966c248SBram Moolenaar CheckScriptFailure([ 25071966c248SBram Moolenaar 'vim9script', 25081966c248SBram Moolenaar 'syntax match Word /pat/# comment', 25091966c248SBram Moolenaar ], 'E402:') 25101966c248SBram Moolenaar 25111966c248SBram Moolenaar CheckScriptSuccess([ 25121966c248SBram Moolenaar 'vim9script', 25131966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25141966c248SBram Moolenaar ]) 25151966c248SBram Moolenaar CheckScriptFailure([ 25161966c248SBram Moolenaar 'vim9script', 25171966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25181966c248SBram Moolenaar ], 'E475:') 25191966c248SBram Moolenaar CheckScriptFailure([ 25201966c248SBram Moolenaar 'vim9script', 25211966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25221966c248SBram Moolenaar ], 'E406:') 25231966c248SBram Moolenaar CheckScriptFailure([ 25241966c248SBram Moolenaar 'vim9script', 25251966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25261966c248SBram Moolenaar ], 'E475:') 25271966c248SBram Moolenaar 25281966c248SBram Moolenaar CheckScriptSuccess([ 25291966c248SBram Moolenaar 'vim9script', 25301966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25311966c248SBram Moolenaar ]) 25321966c248SBram Moolenaar CheckScriptFailure([ 25331966c248SBram Moolenaar 'vim9script', 25341966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2535d032f34aSBram Moolenaar ], 'E402:') 25361966c248SBram Moolenaar 25371966c248SBram Moolenaar CheckScriptSuccess([ 25381966c248SBram Moolenaar 'vim9script', 25391966c248SBram Moolenaar 'syntax sync # comment', 25401966c248SBram Moolenaar ]) 25411966c248SBram Moolenaar CheckScriptFailure([ 25421966c248SBram Moolenaar 'vim9script', 25431966c248SBram Moolenaar 'syntax sync# comment', 25441966c248SBram Moolenaar ], 'E404:') 25451966c248SBram Moolenaar CheckScriptSuccess([ 25461966c248SBram Moolenaar 'vim9script', 25471966c248SBram Moolenaar 'syntax sync ccomment # comment', 25481966c248SBram Moolenaar ]) 25491966c248SBram Moolenaar CheckScriptFailure([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'syntax sync ccomment# comment', 25521966c248SBram Moolenaar ], 'E404:') 25531966c248SBram Moolenaar 25541966c248SBram Moolenaar CheckScriptSuccess([ 25551966c248SBram Moolenaar 'vim9script', 25561966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25571966c248SBram Moolenaar ]) 25581966c248SBram Moolenaar CheckScriptFailure([ 25591966c248SBram Moolenaar 'vim9script', 25601966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25611966c248SBram Moolenaar ], 'E475:') 2562a72cfb80SBram Moolenaar 2563a72cfb80SBram Moolenaar CheckScriptSuccess([ 2564a72cfb80SBram Moolenaar 'vim9script', 2565a72cfb80SBram Moolenaar 'command Echo echo # comment', 2566a72cfb80SBram Moolenaar 'command Echo # comment', 25672d870f8dSBram Moolenaar 'delcommand Echo', 2568a72cfb80SBram Moolenaar ]) 2569a72cfb80SBram Moolenaar CheckScriptFailure([ 2570a72cfb80SBram Moolenaar 'vim9script', 2571a72cfb80SBram Moolenaar 'command Echo echo# comment', 2572a72cfb80SBram Moolenaar 'Echo', 2573f8103f27SBram Moolenaar ], 'E1144:') 25742d870f8dSBram Moolenaar delcommand Echo 257570249ee8SBram Moolenaar 257670249ee8SBram Moolenaar var curdir = getcwd() 257770249ee8SBram Moolenaar CheckScriptSuccess([ 257870249ee8SBram Moolenaar 'command Echo cd " comment', 257970249ee8SBram Moolenaar 'Echo', 258070249ee8SBram Moolenaar 'delcommand Echo', 258170249ee8SBram Moolenaar ]) 258270249ee8SBram Moolenaar CheckScriptSuccess([ 2583090728adSBram Moolenaar 'vim9script', 258470249ee8SBram Moolenaar 'command Echo cd # comment', 258570249ee8SBram Moolenaar 'Echo', 258670249ee8SBram Moolenaar 'delcommand Echo', 258770249ee8SBram Moolenaar ]) 258870249ee8SBram Moolenaar CheckScriptFailure([ 258970249ee8SBram Moolenaar 'vim9script', 259070249ee8SBram Moolenaar 'command Echo cd " comment', 259170249ee8SBram Moolenaar 'Echo', 259270249ee8SBram Moolenaar ], 'E344:') 259370249ee8SBram Moolenaar delcommand Echo 259470249ee8SBram Moolenaar chdir(curdir) 259570249ee8SBram Moolenaar 2596a72cfb80SBram Moolenaar CheckScriptFailure([ 2597a72cfb80SBram Moolenaar 'vim9script', 2598a72cfb80SBram Moolenaar 'command Echo# comment', 2599a72cfb80SBram Moolenaar ], 'E182:') 2600a72cfb80SBram Moolenaar CheckScriptFailure([ 2601a72cfb80SBram Moolenaar 'vim9script', 2602a72cfb80SBram Moolenaar 'command Echo echo', 2603a72cfb80SBram Moolenaar 'command Echo# comment', 2604a72cfb80SBram Moolenaar ], 'E182:') 26052d870f8dSBram Moolenaar delcommand Echo 2606a72cfb80SBram Moolenaar 2607a72cfb80SBram Moolenaar CheckScriptSuccess([ 2608a72cfb80SBram Moolenaar 'vim9script', 2609a72cfb80SBram Moolenaar 'function # comment', 2610a72cfb80SBram Moolenaar ]) 2611a72cfb80SBram Moolenaar CheckScriptFailure([ 2612a72cfb80SBram Moolenaar 'vim9script', 26139898107fSBram Moolenaar 'function " comment', 26149898107fSBram Moolenaar ], 'E129:') 26159898107fSBram Moolenaar CheckScriptFailure([ 26169898107fSBram Moolenaar 'vim9script', 2617a72cfb80SBram Moolenaar 'function# comment', 2618f8103f27SBram Moolenaar ], 'E1144:') 2619a72cfb80SBram Moolenaar CheckScriptSuccess([ 2620a72cfb80SBram Moolenaar 'vim9script', 2621a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2622a72cfb80SBram Moolenaar ]) 2623a72cfb80SBram Moolenaar CheckScriptFailure([ 2624a72cfb80SBram Moolenaar 'vim9script', 2625a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2626a72cfb80SBram Moolenaar ], 'E488:') 2627a72cfb80SBram Moolenaar 2628a72cfb80SBram Moolenaar CheckScriptSuccess([ 2629a72cfb80SBram Moolenaar 'vim9script', 26304c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2631a72cfb80SBram Moolenaar 'endfunc', 26324c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2633a72cfb80SBram Moolenaar ]) 2634a72cfb80SBram Moolenaar CheckScriptFailure([ 2635a72cfb80SBram Moolenaar 'vim9script', 26364c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2637a72cfb80SBram Moolenaar 'endfunc', 26384c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2639a72cfb80SBram Moolenaar ], 'E488:') 2640a72cfb80SBram Moolenaar 2641a72cfb80SBram Moolenaar CheckScriptSuccess([ 2642a72cfb80SBram Moolenaar 'vim9script', 2643a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2644a72cfb80SBram Moolenaar ]) 2645a72cfb80SBram Moolenaar CheckScriptFailure([ 2646a72cfb80SBram Moolenaar 'vim9script', 2647a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2648a72cfb80SBram Moolenaar ], 'E488:') 2649e7e4838fSBram Moolenaar 2650e7e4838fSBram Moolenaar CheckScriptFailure([ 2651e7e4838fSBram Moolenaar 'def Test() " comment', 2652e7e4838fSBram Moolenaar 'enddef', 2653e7e4838fSBram Moolenaar ], 'E488:') 2654e7e4838fSBram Moolenaar CheckScriptFailure([ 2655e7e4838fSBram Moolenaar 'vim9script', 2656e7e4838fSBram Moolenaar 'def Test() " comment', 2657e7e4838fSBram Moolenaar 'enddef', 2658e7e4838fSBram Moolenaar ], 'E488:') 2659e7e4838fSBram Moolenaar 2660e7e4838fSBram Moolenaar CheckScriptSuccess([ 2661e7e4838fSBram Moolenaar 'func Test() " comment', 2662e7e4838fSBram Moolenaar 'endfunc', 26632d870f8dSBram Moolenaar 'delfunc Test', 2664e7e4838fSBram Moolenaar ]) 26659898107fSBram Moolenaar CheckScriptSuccess([ 2666e7e4838fSBram Moolenaar 'vim9script', 2667e7e4838fSBram Moolenaar 'func Test() " comment', 2668e7e4838fSBram Moolenaar 'endfunc', 26699898107fSBram Moolenaar ]) 2670e7e4838fSBram Moolenaar 2671e7e4838fSBram Moolenaar CheckScriptSuccess([ 2672e7e4838fSBram Moolenaar 'def Test() # comment', 2673e7e4838fSBram Moolenaar 'enddef', 2674e7e4838fSBram Moolenaar ]) 2675e7e4838fSBram Moolenaar CheckScriptFailure([ 2676e7e4838fSBram Moolenaar 'func Test() # comment', 2677e7e4838fSBram Moolenaar 'endfunc', 2678e7e4838fSBram Moolenaar ], 'E488:') 26792c5ed4e3SBram Moolenaarenddef 26802c5ed4e3SBram Moolenaar 26812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 26822c5ed4e3SBram Moolenaar CheckCanRunGui 26832c5ed4e3SBram Moolenaar 26842c5ed4e3SBram Moolenaar CheckScriptFailure([ 26852c5ed4e3SBram Moolenaar 'vim9script', 26862c5ed4e3SBram Moolenaar 'gui#comment' 2687f8103f27SBram Moolenaar ], 'E1144:') 26882c5ed4e3SBram Moolenaar CheckScriptFailure([ 26892c5ed4e3SBram Moolenaar 'vim9script', 26902c5ed4e3SBram Moolenaar 'gui -f#comment' 26912c5ed4e3SBram Moolenaar ], 'E499:') 26927a092245SBram Moolenaarenddef 26937a092245SBram Moolenaar 2694a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 26956797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 26966797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2697a26b9700SBram Moolenaar 2698a26b9700SBram Moolenaar edit test.vim 2699a26b9700SBram Moolenaar doautocmd TabEnter #comment 2700a26b9700SBram Moolenaar assert_equal(1, g:entered) 2701a26b9700SBram Moolenaar 2702a26b9700SBram Moolenaar doautocmd TabEnter f.x 2703a26b9700SBram Moolenaar assert_equal(2, g:entered) 2704a26b9700SBram Moolenaar 2705a26b9700SBram Moolenaar g:entered = 0 2706a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2707a26b9700SBram Moolenaar assert_equal(2, g:entered) 2708a26b9700SBram Moolenaar 2709a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2710a26b9700SBram Moolenaar 2711a26b9700SBram Moolenaar au! TabEnter 2712a26b9700SBram Moolenaar unlet g:entered 2713d72c1bf0SBram Moolenaar 2714d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2715d72c1bf0SBram Moolenaar 'vim9script', 27166797966dSBram Moolenaar 'g:var = 123', 2717e55b1c09SBram Moolenaar 'b:var = 456', 2718e55b1c09SBram Moolenaar 'w:var = 777', 2719e55b1c09SBram Moolenaar 't:var = 888', 2720d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2721d72c1bf0SBram Moolenaar ]) 2722d72c1bf0SBram Moolenaar 2723d72c1bf0SBram Moolenaar CheckScriptFailure([ 2724d72c1bf0SBram Moolenaar 'vim9script', 2725cfcd011fSBram Moolenaar 'let var = 123', 2726cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2727cfcd011fSBram Moolenaar 2728cfcd011fSBram Moolenaar CheckScriptFailure([ 2729cfcd011fSBram Moolenaar 'vim9script', 2730cfcd011fSBram Moolenaar 'var g:var = 123', 2731e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2732e55b1c09SBram Moolenaar 2733e55b1c09SBram Moolenaar CheckScriptFailure([ 2734e55b1c09SBram Moolenaar 'vim9script', 2735cfcd011fSBram Moolenaar 'var b:var = 123', 2736e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2737e55b1c09SBram Moolenaar 2738e55b1c09SBram Moolenaar CheckScriptFailure([ 2739e55b1c09SBram Moolenaar 'vim9script', 2740cfcd011fSBram Moolenaar 'var w:var = 123', 2741e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2742e55b1c09SBram Moolenaar 2743e55b1c09SBram Moolenaar CheckScriptFailure([ 2744e55b1c09SBram Moolenaar 'vim9script', 2745cfcd011fSBram Moolenaar 'var t:var = 123', 2746e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2747e55b1c09SBram Moolenaar 2748e55b1c09SBram Moolenaar CheckScriptFailure([ 2749e55b1c09SBram Moolenaar 'vim9script', 2750cfcd011fSBram Moolenaar 'var v:version = 123', 2751e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2752e55b1c09SBram Moolenaar 2753e55b1c09SBram Moolenaar CheckScriptFailure([ 2754e55b1c09SBram Moolenaar 'vim9script', 2755cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2756e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 27576797966dSBram Moolenaar 27586797966dSBram Moolenaar CheckScriptFailure([ 27596797966dSBram Moolenaar 'vim9script', 27606797966dSBram Moolenaar 'g:var = 123', 276132e35117SBram Moolenaar 'unlet g:var# comment1', 2762d72c1bf0SBram Moolenaar ], 'E108:') 2763d72c1bf0SBram Moolenaar 2764d72c1bf0SBram Moolenaar CheckScriptFailure([ 2765d72c1bf0SBram Moolenaar 'let g:var = 123', 2766d72c1bf0SBram Moolenaar 'unlet g:var # something', 2767d72c1bf0SBram Moolenaar ], 'E488:') 2768faac4104SBram Moolenaar 2769faac4104SBram Moolenaar CheckScriptSuccess([ 2770faac4104SBram Moolenaar 'vim9script', 277132e35117SBram Moolenaar 'if 1 # comment2', 2772faac4104SBram Moolenaar ' echo "yes"', 2773faac4104SBram Moolenaar 'elseif 2 #comment', 2774faac4104SBram Moolenaar ' echo "no"', 2775faac4104SBram Moolenaar 'endif', 2776faac4104SBram Moolenaar ]) 2777faac4104SBram Moolenaar 2778faac4104SBram Moolenaar CheckScriptFailure([ 2779faac4104SBram Moolenaar 'vim9script', 278032e35117SBram Moolenaar 'if 1# comment3', 2781faac4104SBram Moolenaar ' echo "yes"', 2782faac4104SBram Moolenaar 'endif', 2783faac4104SBram Moolenaar ], 'E15:') 2784faac4104SBram Moolenaar 2785faac4104SBram Moolenaar CheckScriptFailure([ 2786faac4104SBram Moolenaar 'vim9script', 278732e35117SBram Moolenaar 'if 0 # comment4', 2788faac4104SBram Moolenaar ' echo "yes"', 2789faac4104SBram Moolenaar 'elseif 2#comment', 2790faac4104SBram Moolenaar ' echo "no"', 2791faac4104SBram Moolenaar 'endif', 2792faac4104SBram Moolenaar ], 'E15:') 2793faac4104SBram Moolenaar 2794faac4104SBram Moolenaar CheckScriptSuccess([ 2795faac4104SBram Moolenaar 'vim9script', 2796cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2797faac4104SBram Moolenaar ]) 2798faac4104SBram Moolenaar 2799faac4104SBram Moolenaar CheckScriptFailure([ 2800faac4104SBram Moolenaar 'vim9script', 2801cfcd011fSBram Moolenaar 'var v = 1# comment6', 280232e35117SBram Moolenaar ], 'E15:') 2803faac4104SBram Moolenaar 2804faac4104SBram Moolenaar CheckScriptSuccess([ 2805faac4104SBram Moolenaar 'vim9script', 2806faac4104SBram Moolenaar 'new' 2807d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2808df069eecSBram Moolenaar ':$', 2809faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2810faac4104SBram Moolenaar 'bwipe!', 2811faac4104SBram Moolenaar ]) 2812faac4104SBram Moolenaar 2813f5be8cdbSBram Moolenaar CheckScriptFailure([ 2814f5be8cdbSBram Moolenaar 'vim9script', 2815f5be8cdbSBram Moolenaar 'new' 2816d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2817f5be8cdbSBram Moolenaar ':$', 2818f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2819f5be8cdbSBram Moolenaar 'bwipe!', 2820f5be8cdbSBram Moolenaar ], 'E488:') 2821f5be8cdbSBram Moolenaar 2822f5be8cdbSBram Moolenaar CheckScriptFailure([ 2823f5be8cdbSBram Moolenaar 'vim9script', 2824f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2825f5be8cdbSBram Moolenaar ], 'E477:') 2826a26b9700SBram Moolenaarenddef 2827a26b9700SBram Moolenaar 28287e5bd91dSBram Moolenaardef Test_finish() 2829cfcd011fSBram Moolenaar var lines =<< trim END 28307e5bd91dSBram Moolenaar vim9script 28316797966dSBram Moolenaar g:res = 'one' 28327e5bd91dSBram Moolenaar if v:false | finish | endif 28336797966dSBram Moolenaar g:res = 'two' 28347e5bd91dSBram Moolenaar finish 28356797966dSBram Moolenaar g:res = 'three' 28367e5bd91dSBram Moolenaar END 28377e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 28387e5bd91dSBram Moolenaar source Xfinished 28397e5bd91dSBram Moolenaar assert_equal('two', g:res) 28407e5bd91dSBram Moolenaar 28417e5bd91dSBram Moolenaar unlet g:res 28427e5bd91dSBram Moolenaar delete('Xfinished') 28437e5bd91dSBram Moolenaarenddef 28447e5bd91dSBram Moolenaar 2845a5d0077eSBram Moolenaardef Test_forward_declaration() 2846cfcd011fSBram Moolenaar var lines =<< trim END 2847a5d0077eSBram Moolenaar vim9script 2848a5d0077eSBram Moolenaar def GetValue(): string 2849a5d0077eSBram Moolenaar return theVal 2850a5d0077eSBram Moolenaar enddef 2851cfcd011fSBram Moolenaar var theVal = 'something' 2852822ba247SBram Moolenaar g:initVal = GetValue() 2853a5d0077eSBram Moolenaar theVal = 'else' 2854a5d0077eSBram Moolenaar g:laterVal = GetValue() 2855a5d0077eSBram Moolenaar END 2856a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2857a5d0077eSBram Moolenaar source Xforward 2858a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2859a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2860a5d0077eSBram Moolenaar 2861a5d0077eSBram Moolenaar unlet g:initVal 2862a5d0077eSBram Moolenaar unlet g:laterVal 2863a5d0077eSBram Moolenaar delete('Xforward') 2864a5d0077eSBram Moolenaarenddef 2865a5d0077eSBram Moolenaar 28669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2867a6294955SBram Moolenaar var vim9_lines =<< trim END 2868a6294955SBram Moolenaar vim9script 2869a6294955SBram Moolenaar var local = 'local' 2870a6294955SBram Moolenaar g:global = 'global' 2871a6294955SBram Moolenaar export var exported = 'exported' 2872a6294955SBram Moolenaar export def GetText(): string 2873a6294955SBram Moolenaar return 'text' 2874a6294955SBram Moolenaar enddef 2875a6294955SBram Moolenaar END 2876a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2877a6294955SBram Moolenaar 2878cfcd011fSBram Moolenaar var legacy_lines =<< trim END 28799721fb4eSBram Moolenaar source Xvim9_script.vim 28809721fb4eSBram Moolenaar 28819721fb4eSBram Moolenaar call assert_false(exists('local')) 28829721fb4eSBram Moolenaar call assert_false(exists('exported')) 28839721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 28849721fb4eSBram Moolenaar call assert_equal('global', global) 28859721fb4eSBram Moolenaar call assert_equal('global', g:global) 28869721fb4eSBram Moolenaar 28879721fb4eSBram Moolenaar " imported variable becomes script-local 28889721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 28899721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 28909721fb4eSBram Moolenaar call assert_false(exists('exported')) 28919721fb4eSBram Moolenaar 28929721fb4eSBram Moolenaar " imported function becomes script-local 28939721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 28949721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 28959721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 28969721fb4eSBram Moolenaar END 28979721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 28989721fb4eSBram Moolenaar 28999721fb4eSBram Moolenaar source Xlegacy_script.vim 29009721fb4eSBram Moolenaar assert_equal('global', g:global) 2901f5be8cdbSBram Moolenaar unlet g:global 29029721fb4eSBram Moolenaar 29039721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29049721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29059721fb4eSBram Moolenaarenddef 2906a5d0077eSBram Moolenaar 29077d699701SBram Moolenaarfunc Test_vim9script_not_global() 29087d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 29097d699701SBram Moolenaar let vim9lines =<< trim END 29107d699701SBram Moolenaar vim9script 2911cfcd011fSBram Moolenaar var name = 'local' 29127d699701SBram Moolenaar func TheFunc() 29137d699701SBram Moolenaar echo 'local' 29147d699701SBram Moolenaar endfunc 29157d699701SBram Moolenaar def DefFunc() 29167d699701SBram Moolenaar echo 'local' 29177d699701SBram Moolenaar enddef 29187d699701SBram Moolenaar END 29197d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 29207d699701SBram Moolenaar source Xvim9script.vim 29217d699701SBram Moolenaar try 29227d699701SBram Moolenaar echo g:var 29237d699701SBram Moolenaar assert_report('did not fail') 29247d699701SBram Moolenaar catch /E121:/ 29257d699701SBram Moolenaar " caught 29267d699701SBram Moolenaar endtry 29277d699701SBram Moolenaar try 29287d699701SBram Moolenaar call TheFunc() 29297d699701SBram Moolenaar assert_report('did not fail') 29307d699701SBram Moolenaar catch /E117:/ 29317d699701SBram Moolenaar " caught 29327d699701SBram Moolenaar endtry 29337d699701SBram Moolenaar try 29347d699701SBram Moolenaar call DefFunc() 29357d699701SBram Moolenaar assert_report('did not fail') 29367d699701SBram Moolenaar catch /E117:/ 29377d699701SBram Moolenaar " caught 29387d699701SBram Moolenaar endtry 29397d699701SBram Moolenaar 294025859dd7SBram Moolenaar call delete('Xvim9script.vim') 29417d699701SBram Moolenaarendfunc 29427d699701SBram Moolenaar 2943eeb27bfeSBram Moolenaardef Test_vim9_copen() 2944eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2945eeb27bfeSBram Moolenaar copen 2946eeb27bfeSBram Moolenaar quit 2947eeb27bfeSBram Moolenaarenddef 2948eeb27bfeSBram Moolenaar 294903290b84SBram Moolenaar" test using an auto-loaded function and variable 29502d6b20d6SBram Moolenaardef Test_vim9_autoload() 2951cfcd011fSBram Moolenaar var lines =<< trim END 29522d6b20d6SBram Moolenaar vim9script 295303290b84SBram Moolenaar def some#gettest(): string 295403290b84SBram Moolenaar return 'test' 295503290b84SBram Moolenaar enddef 295603290b84SBram Moolenaar g:some#name = 'name' 295703290b84SBram Moolenaar END 295803290b84SBram Moolenaar 295903290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 296003290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 296103290b84SBram Moolenaar var save_rtp = &rtp 296203290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 296303290b84SBram Moolenaar 296403290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 296503290b84SBram Moolenaar assert_equal('name', g:some#name) 296603290b84SBram Moolenaar g:some#other = 'other' 296703290b84SBram Moolenaar assert_equal('other', g:some#other) 296803290b84SBram Moolenaar 296917f700acSBram Moolenaar # upper case script name works 297017f700acSBram Moolenaar lines =<< trim END 297117f700acSBram Moolenaar vim9script 297217f700acSBram Moolenaar def Other#getOther(): string 297317f700acSBram Moolenaar return 'other' 297417f700acSBram Moolenaar enddef 297517f700acSBram Moolenaar END 297617f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 297717f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 297817f700acSBram Moolenaar 297903290b84SBram Moolenaar delete('Xdir', 'rf') 298003290b84SBram Moolenaar &rtp = save_rtp 298103290b84SBram Moolenaarenddef 298203290b84SBram Moolenaar 298303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 298403290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 298503290b84SBram Moolenaar var lines =<< trim END 298603290b84SBram Moolenaar vim9script 29872d6b20d6SBram Moolenaar def foo#test() 29882d6b20d6SBram Moolenaar echomsg getreg('"') 29892d6b20d6SBram Moolenaar enddef 29902d6b20d6SBram Moolenaar END 29912d6b20d6SBram Moolenaar 29922d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 29932d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2994cfcd011fSBram Moolenaar var save_rtp = &rtp 29952d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 29962d6b20d6SBram Moolenaar augroup test 29972d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 29982d6b20d6SBram Moolenaar augroup END 29992d6b20d6SBram Moolenaar 30002d6b20d6SBram Moolenaar normal Y 30012d6b20d6SBram Moolenaar 30022d6b20d6SBram Moolenaar augroup test 30032d6b20d6SBram Moolenaar autocmd! 30042d6b20d6SBram Moolenaar augroup END 30052d6b20d6SBram Moolenaar delete('Xdir', 'rf') 30062d6b20d6SBram Moolenaar &rtp = save_rtp 30072d6b20d6SBram Moolenaarenddef 30082d6b20d6SBram Moolenaar 300977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 301077e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3011cfcd011fSBram Moolenaar var lines =<< trim END 301277e5dcc3SBram Moolenaar vim9script 301377e5dcc3SBram Moolenaar def crash#func() 301477e5dcc3SBram Moolenaar try 301577e5dcc3SBram Moolenaar for x in List() 301677e5dcc3SBram Moolenaar endfor 301777e5dcc3SBram Moolenaar catch 301877e5dcc3SBram Moolenaar endtry 301977e5dcc3SBram Moolenaar g:ok = true 302077e5dcc3SBram Moolenaar enddef 302177e5dcc3SBram Moolenaar fu List() 302277e5dcc3SBram Moolenaar invalid 302377e5dcc3SBram Moolenaar endfu 302477e5dcc3SBram Moolenaar try 302548e11c10SBram Moolenaar alsoinvalid 302677e5dcc3SBram Moolenaar catch /wontmatch/ 302777e5dcc3SBram Moolenaar endtry 302877e5dcc3SBram Moolenaar END 302977e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 303077e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 303177e5dcc3SBram Moolenaar 303277e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 303377e5dcc3SBram Moolenaar lines =<< trim END 303477e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 303577e5dcc3SBram Moolenaar call crash#func() 303677e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 30379c4f5520SBram Moolenaar qall! 303877e5dcc3SBram Moolenaar END 303977e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 304077e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 304177e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 304277e5dcc3SBram Moolenaar 304377e5dcc3SBram Moolenaar delete('Xdidit') 304477e5dcc3SBram Moolenaar delete('Xscript') 304577e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 304603290b84SBram Moolenaar 304703290b84SBram Moolenaar lines =<< trim END 304803290b84SBram Moolenaar vim9script 304903290b84SBram Moolenaar var foo#bar = 'asdf' 305003290b84SBram Moolenaar END 305103290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 305277e5dcc3SBram Moolenaarenddef 305377e5dcc3SBram Moolenaar 305481e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 305581e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 305681e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3057cfcd011fSBram Moolenaar var lines =<< trim END 305881e17fbeSBram Moolenaar let s:counter = 1 305981e17fbeSBram Moolenaar def s:Func() 306081e17fbeSBram Moolenaar au! CursorHold 306181e17fbeSBram Moolenaar au CursorHold * s:counter += 1 306281e17fbeSBram Moolenaar enddef 306381e17fbeSBram Moolenaar call s:Func() 306481e17fbeSBram Moolenaar doau CursorHold 306581e17fbeSBram Moolenaar call assert_equal(2, s:counter) 306681e17fbeSBram Moolenaar au! CursorHold 306781e17fbeSBram Moolenaar END 306881e17fbeSBram Moolenaar CheckScriptSuccess(lines) 306981e17fbeSBram Moolenaarenddef 307081e17fbeSBram Moolenaar 30713896a105SBram Moolenaardef Test_cmdline_win() 30723896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 30733896a105SBram Moolenaar # the command line window. 30743896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3075cfcd011fSBram Moolenaar var export_lines =<< trim END 30763896a105SBram Moolenaar vim9script 3077cfcd011fSBram Moolenaar export var That = 'yes' 30783896a105SBram Moolenaar END 30793896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3080cfcd011fSBram Moolenaar var import_lines =<< trim END 30813896a105SBram Moolenaar vim9script 30823896a105SBram Moolenaar import That from './Xexport.vim' 30833896a105SBram Moolenaar END 30843896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3085cfcd011fSBram Moolenaar var save_rtp = &rtp 30863896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 30873896a105SBram Moolenaar syntax on 30883896a105SBram Moolenaar augroup CmdWin 30893896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 30903896a105SBram Moolenaar augroup END 30913896a105SBram Moolenaar # this will open and also close the cmdline window 30923896a105SBram Moolenaar feedkeys('q:', 'xt') 30933896a105SBram Moolenaar assert_equal('yes', g:got_there) 30943896a105SBram Moolenaar 30953896a105SBram Moolenaar augroup CmdWin 30963896a105SBram Moolenaar au! 30973896a105SBram Moolenaar augroup END 30983896a105SBram Moolenaar &rtp = save_rtp 30993896a105SBram Moolenaar delete('rtp', 'rf') 31003896a105SBram Moolenaarenddef 31013896a105SBram Moolenaar 3102e3d4685fSBram Moolenaardef Test_invalid_sid() 3103e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 310425859dd7SBram Moolenaar 31059c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3106d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3107e3d4685fSBram Moolenaar endif 3108e3d4685fSBram Moolenaar delete('Xdidit') 3109e3d4685fSBram Moolenaarenddef 3110e3d4685fSBram Moolenaar 31119ec7026fSBram Moolenaardef Test_restoring_cpo() 31129ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 31139ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 31149ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 31159ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 31169ec7026fSBram Moolenaar endif 31179ec7026fSBram Moolenaar delete('Xsourced') 31189ec7026fSBram Moolenaar delete('Xclose') 3119090728adSBram Moolenaar delete('Xdone') 31209ec7026fSBram Moolenaarenddef 31219ec7026fSBram Moolenaar 31229ec7026fSBram Moolenaar 3123f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3124cfcd011fSBram Moolenaar var lines =<< trim END 3125cfcd011fSBram Moolenaar var name: any 3126cfcd011fSBram Moolenaar assert_equal(0, name) 3127f0afd9e1SBram Moolenaar END 3128f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3129f0afd9e1SBram Moolenaarenddef 3130f0afd9e1SBram Moolenaar 31317e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 313258dbef33SBram Moolenaar CheckRunVimInTerminal 313358dbef33SBram Moolenaar 31347e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 31357e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 31367e9210eaSBram Moolenaarendfunc 31377e9210eaSBram Moolenaar 31387e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 31399c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3140cfcd011fSBram Moolenaar var lines =<< trim END 31419c4f5520SBram Moolenaar func CheckAndQuit() 31429c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 31439c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 31449c4f5520SBram Moolenaar endfunc 31459c4f5520SBram Moolenaar END 31469c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 31479c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3148e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 31499c4f5520SBram Moolenaar # define Afunc() on the command line 31509c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 31519c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 31522949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 31539c4f5520SBram Moolenaar 31549c4f5520SBram Moolenaar call StopVimInTerminal(buf) 31559c4f5520SBram Moolenaar delete('XcallFunc') 31569c4f5520SBram Moolenaar delete('Xdidcmd') 31579c4f5520SBram Moolenaarenddef 31589c4f5520SBram Moolenaar 3159fcdc5d83SBram Moolenaardef Test_script_var_scope() 3160fcdc5d83SBram Moolenaar var lines =<< trim END 3161fcdc5d83SBram Moolenaar vim9script 3162fcdc5d83SBram Moolenaar if true 3163fcdc5d83SBram Moolenaar if true 3164fcdc5d83SBram Moolenaar var one = 'one' 3165fcdc5d83SBram Moolenaar echo one 3166fcdc5d83SBram Moolenaar endif 3167fcdc5d83SBram Moolenaar echo one 3168fcdc5d83SBram Moolenaar endif 3169fcdc5d83SBram Moolenaar END 3170fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3171fcdc5d83SBram Moolenaar 3172fcdc5d83SBram Moolenaar lines =<< trim END 3173fcdc5d83SBram Moolenaar vim9script 3174fcdc5d83SBram Moolenaar if true 3175fcdc5d83SBram Moolenaar if false 3176fcdc5d83SBram Moolenaar var one = 'one' 3177fcdc5d83SBram Moolenaar echo one 3178fcdc5d83SBram Moolenaar else 3179fcdc5d83SBram Moolenaar var one = 'one' 3180fcdc5d83SBram Moolenaar echo one 3181fcdc5d83SBram Moolenaar endif 3182fcdc5d83SBram Moolenaar echo one 3183fcdc5d83SBram Moolenaar endif 3184fcdc5d83SBram Moolenaar END 3185fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3186fcdc5d83SBram Moolenaar 3187fcdc5d83SBram Moolenaar lines =<< trim END 3188fcdc5d83SBram Moolenaar vim9script 3189fcdc5d83SBram Moolenaar while true 3190fcdc5d83SBram Moolenaar var one = 'one' 3191fcdc5d83SBram Moolenaar echo one 3192fcdc5d83SBram Moolenaar break 3193fcdc5d83SBram Moolenaar endwhile 3194fcdc5d83SBram Moolenaar echo one 3195fcdc5d83SBram Moolenaar END 3196fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3197fcdc5d83SBram Moolenaar 3198fcdc5d83SBram Moolenaar lines =<< trim END 3199fcdc5d83SBram Moolenaar vim9script 3200fcdc5d83SBram Moolenaar for i in range(1) 3201fcdc5d83SBram Moolenaar var one = 'one' 3202fcdc5d83SBram Moolenaar echo one 3203fcdc5d83SBram Moolenaar endfor 3204fcdc5d83SBram Moolenaar echo one 3205fcdc5d83SBram Moolenaar END 3206fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 32079becdf2bSBram Moolenaar 32089becdf2bSBram Moolenaar lines =<< trim END 32099becdf2bSBram Moolenaar vim9script 32109becdf2bSBram Moolenaar { 32119becdf2bSBram Moolenaar var one = 'one' 32129becdf2bSBram Moolenaar assert_equal('one', one) 32139becdf2bSBram Moolenaar } 32149becdf2bSBram Moolenaar assert_false(exists('one')) 32159becdf2bSBram Moolenaar assert_false(exists('s:one')) 32169becdf2bSBram Moolenaar END 32179becdf2bSBram Moolenaar CheckScriptSuccess(lines) 32189becdf2bSBram Moolenaar 32199becdf2bSBram Moolenaar lines =<< trim END 32209becdf2bSBram Moolenaar vim9script 32219becdf2bSBram Moolenaar { 32229becdf2bSBram Moolenaar var one = 'one' 32239becdf2bSBram Moolenaar echo one 32249becdf2bSBram Moolenaar } 32259becdf2bSBram Moolenaar echo one 32269becdf2bSBram Moolenaar END 32279becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3228fcdc5d83SBram Moolenaarenddef 3229fcdc5d83SBram Moolenaar 3230352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3231352134bbSBram Moolenaar var lines =<< trim END 3232352134bbSBram Moolenaar vim9script 3233352134bbSBram Moolenaar def Callback(...l: any) 3234352134bbSBram Moolenaar try 3235352134bbSBram Moolenaar var x: string 3236352134bbSBram Moolenaar var y: string 3237352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3238352134bbSBram Moolenaar [x, y] = [''] 3239352134bbSBram Moolenaar catch 3240352134bbSBram Moolenaar g:caught = 'yes' 3241352134bbSBram Moolenaar endtry 3242352134bbSBram Moolenaar enddef 3243e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3244352134bbSBram Moolenaar feedkeys("\r", 'xt') 3245352134bbSBram Moolenaar END 3246352134bbSBram Moolenaar CheckScriptSuccess(lines) 3247352134bbSBram Moolenaar 3248352134bbSBram Moolenaar unlet g:caught 3249352134bbSBram Moolenaarenddef 3250352134bbSBram Moolenaar 3251631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3252631e8f93SBram Moolenaar if !has('unix') || !has('job') 3253631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3254631e8f93SBram Moolenaar endif 3255631e8f93SBram Moolenaar var lines =<< trim END 3256631e8f93SBram Moolenaar vim9script 3257631e8f93SBram Moolenaar var source: list<number> 3258631e8f93SBram Moolenaar def Out_cb(...l: any) 3259631e8f93SBram Moolenaar eval [][0] 3260631e8f93SBram Moolenaar enddef 3261631e8f93SBram Moolenaar def Exit_cb(...l: any) 3262631e8f93SBram Moolenaar sleep 1m 3263631e8f93SBram Moolenaar source += l 3264631e8f93SBram Moolenaar enddef 3265e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 32666f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 32676f17a3f0SBram Moolenaar sleep 10m 32686f17a3f0SBram Moolenaar endwhile 32696f17a3f0SBram Moolenaar sleep 10m 3270631e8f93SBram Moolenaar END 3271631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3272631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3273631e8f93SBram Moolenaar delete('Xdef') 3274631e8f93SBram Moolenaarenddef 3275631e8f93SBram Moolenaar 32764324d87aSBram Moolenaardef InvokeNormal() 32774324d87aSBram Moolenaar exe "norm! :m+1\r" 32784324d87aSBram Moolenaarenddef 32794324d87aSBram Moolenaar 32804324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 32814324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 32824324d87aSBram Moolenaar new 32834324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 32844324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 32854324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 32864324d87aSBram Moolenaar xunmap <F3> 3287b5b9480eSBram Moolenaarenddef 3288b5b9480eSBram Moolenaar 3289b5b9480eSBram Moolenaardef Test_white_space_after_command() 3290b5b9480eSBram Moolenaar var lines =<< trim END 3291b5b9480eSBram Moolenaar exit_cb: Func}) 3292b5b9480eSBram Moolenaar END 3293b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3294f8103f27SBram Moolenaar 3295f8103f27SBram Moolenaar lines =<< trim END 3296f8103f27SBram Moolenaar e# 3297f8103f27SBram Moolenaar END 3298f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 32994324d87aSBram Moolenaarenddef 33004324d87aSBram Moolenaar 33014aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 33024aab88d9SBram Moolenaar var lines =<< trim END 33034aab88d9SBram Moolenaar vim9script 33044aab88d9SBram Moolenaar if exists('g:guard') 33054aab88d9SBram Moolenaar finish 33064aab88d9SBram Moolenaar endif 33074aab88d9SBram Moolenaar g:guard = 1 33084aab88d9SBram Moolenaar var name = 'thename' 33094aab88d9SBram Moolenaar def g:GetName(): string 33104aab88d9SBram Moolenaar return name 33114aab88d9SBram Moolenaar enddef 33124aab88d9SBram Moolenaar def g:SetName(arg: string) 33134aab88d9SBram Moolenaar name = arg 33144aab88d9SBram Moolenaar enddef 33154aab88d9SBram Moolenaar END 33164aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 33174aab88d9SBram Moolenaar so XscriptTwice.vim 33184aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 33194aab88d9SBram Moolenaar g:SetName('newname') 33204aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 33214aab88d9SBram Moolenaar so XscriptTwice.vim 33224aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33234aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 33244aab88d9SBram Moolenaar 33254aab88d9SBram Moolenaar delfunc g:GetName 33264aab88d9SBram Moolenaar delfunc g:SetName 33274aab88d9SBram Moolenaar delete('XscriptTwice.vim') 33284aab88d9SBram Moolenaar unlet g:guard 33294aab88d9SBram Moolenaarenddef 33304aab88d9SBram Moolenaar 33314aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 33324aab88d9SBram Moolenaar var exportlines =<< trim END 33334aab88d9SBram Moolenaar vim9script 33344aab88d9SBram Moolenaar if exists('g:guard') 33354aab88d9SBram Moolenaar finish 33364aab88d9SBram Moolenaar endif 33374aab88d9SBram Moolenaar g:guard = 1 33384aab88d9SBram Moolenaar export var name = 'someName' 33394aab88d9SBram Moolenaar END 33404aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 33414aab88d9SBram Moolenaar 33424aab88d9SBram Moolenaar var lines =<< trim END 33434aab88d9SBram Moolenaar vim9script 33444aab88d9SBram Moolenaar import name from './XexportScript.vim' 33454aab88d9SBram Moolenaar def g:GetName(): string 33464aab88d9SBram Moolenaar return name 33474aab88d9SBram Moolenaar enddef 33484aab88d9SBram Moolenaar END 33494aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 33504aab88d9SBram Moolenaar so XscriptImport.vim 33514aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 33524aab88d9SBram Moolenaar 33534aab88d9SBram Moolenaar so XexportScript.vim 33544aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33554aab88d9SBram Moolenaar 33564aab88d9SBram Moolenaar delfunc g:GetName 33574aab88d9SBram Moolenaar delete('XexportScript.vim') 33584aab88d9SBram Moolenaar delete('XscriptImport.vim') 33594aab88d9SBram Moolenaar unlet g:guard 33604aab88d9SBram Moolenaarenddef 33614aab88d9SBram Moolenaar 3362585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3363585fea7bSBram Moolenaardef Test_substitute_cmd() 3364585fea7bSBram Moolenaar new 3365585fea7bSBram Moolenaar setline(1, 'something') 3366585fea7bSBram Moolenaar :substitute(some(other( 3367585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3368585fea7bSBram Moolenaar bwipe! 3369585fea7bSBram Moolenaar 3370f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3371cfcd011fSBram Moolenaar var lines =<< trim END 3372585fea7bSBram Moolenaar vim9script 3373585fea7bSBram Moolenaar new 3374585fea7bSBram Moolenaar setline(1, 'something') 3375585fea7bSBram Moolenaar :substitute(some(other( 3376585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3377585fea7bSBram Moolenaar bwipe! 3378585fea7bSBram Moolenaar END 3379585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3380585fea7bSBram Moolenaar source Xvim9lines 3381585fea7bSBram Moolenaar 3382585fea7bSBram Moolenaar delete('Xvim9lines') 3383585fea7bSBram Moolenaarenddef 3384585fea7bSBram Moolenaar 33858a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3386