18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25c2af0affSBram Moolenaar bwipe! 26025cb1caSBram Moolenaar 27025cb1caSBram Moolenaar # won't generate anything 28025cb1caSBram Moolenaar if false 29025cb1caSBram Moolenaar :123 30025cb1caSBram Moolenaar endif 315d72ce69SBram Moolenaarenddef 325d72ce69SBram Moolenaar 33a6e67e4fSBram Moolenaarlet g:alist = [7] 34a6e67e4fSBram Moolenaarlet g:astring = 'text' 35f0b9f43cSBram Moolenaarlet g:anumber = 123 366e587dcbSBram Moolenaar 374c17ad94SBram Moolenaardef Test_delfunction() 38f5be8cdbSBram Moolenaar # Check function is defined in script namespace 394c17ad94SBram Moolenaar CheckScriptSuccess([ 404c17ad94SBram Moolenaar 'vim9script', 414c17ad94SBram Moolenaar 'func CheckMe()', 424c17ad94SBram Moolenaar ' return 123', 434c17ad94SBram Moolenaar 'endfunc', 444c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 454c17ad94SBram Moolenaar ]) 464c17ad94SBram Moolenaar 47f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 484c17ad94SBram Moolenaar CheckScriptFailure([ 494c17ad94SBram Moolenaar 'vim9script', 504c17ad94SBram Moolenaar 'func DeleteMe1()', 514c17ad94SBram Moolenaar 'endfunc', 524c17ad94SBram Moolenaar 'delfunction DeleteMe1', 534c17ad94SBram Moolenaar ], 'E1084:') 544c17ad94SBram Moolenaar CheckScriptFailure([ 554c17ad94SBram Moolenaar 'vim9script', 564c17ad94SBram Moolenaar 'func DeleteMe2()', 574c17ad94SBram Moolenaar 'endfunc', 584c17ad94SBram Moolenaar 'def DoThat()', 594c17ad94SBram Moolenaar ' delfunction DeleteMe2', 604c17ad94SBram Moolenaar 'enddef', 614c17ad94SBram Moolenaar 'DoThat()', 624c17ad94SBram Moolenaar ], 'E1084:') 634c17ad94SBram Moolenaar CheckScriptFailure([ 644c17ad94SBram Moolenaar 'vim9script', 654c17ad94SBram Moolenaar 'def DeleteMe3()', 664c17ad94SBram Moolenaar 'enddef', 674c17ad94SBram Moolenaar 'delfunction DeleteMe3', 684c17ad94SBram Moolenaar ], 'E1084:') 694c17ad94SBram Moolenaar CheckScriptFailure([ 704c17ad94SBram Moolenaar 'vim9script', 714c17ad94SBram Moolenaar 'def DeleteMe4()', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'def DoThat()', 744c17ad94SBram Moolenaar ' delfunction DeleteMe4', 754c17ad94SBram Moolenaar 'enddef', 764c17ad94SBram Moolenaar 'DoThat()', 774c17ad94SBram Moolenaar ], 'E1084:') 78925e9fd6SBram Moolenaar 79925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 80cfcd011fSBram Moolenaar var lines =<< trim END 81925e9fd6SBram Moolenaar vim9script 82925e9fd6SBram Moolenaar def g:Global(): string 83925e9fd6SBram Moolenaar return "yes" 84925e9fd6SBram Moolenaar enddef 85925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 86925e9fd6SBram Moolenaar def! g:Global(): string 87925e9fd6SBram Moolenaar return "no" 88925e9fd6SBram Moolenaar enddef 89925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 90925e9fd6SBram Moolenaar delfunc g:Global 91925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 92925e9fd6SBram Moolenaar END 93925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 94925e9fd6SBram Moolenaar 95925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 96925e9fd6SBram Moolenaar lines =<< trim END 97925e9fd6SBram Moolenaar vim9script 98925e9fd6SBram Moolenaar func g:Global() 99925e9fd6SBram Moolenaar return "yes" 100925e9fd6SBram Moolenaar endfunc 101925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 102925e9fd6SBram Moolenaar def! g:Global(): string 103925e9fd6SBram Moolenaar return "no" 104925e9fd6SBram Moolenaar enddef 105925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 106925e9fd6SBram Moolenaar delfunc g:Global 107925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 108925e9fd6SBram Moolenaar END 109925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 110925e9fd6SBram Moolenaar 111925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 112925e9fd6SBram Moolenaar lines =<< trim END 113925e9fd6SBram Moolenaar vim9script 114925e9fd6SBram Moolenaar def g:Global(): string 115925e9fd6SBram Moolenaar return "yes" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 118925e9fd6SBram Moolenaar func! g:Global() 119925e9fd6SBram Moolenaar return "no" 120925e9fd6SBram Moolenaar endfunc 121925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 122925e9fd6SBram Moolenaar delfunc g:Global 123925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 124925e9fd6SBram Moolenaar END 125925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1264c17ad94SBram Moolenaarenddef 1274c17ad94SBram Moolenaar 12808052228SBram Moolenaardef Test_wrong_type() 129cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 130cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 131cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 132cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 133599c89c8SBram Moolenaar 134cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 135cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 13642a480bfSBram Moolenaar 137cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 138cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 139cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 145cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 148a0a9f43aSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 15108052228SBram Moolenaarenddef 1528a7d6542SBram Moolenaar 15310c65860SBram Moolenaardef Test_script_wrong_type() 15410c65860SBram Moolenaar var lines =<< trim END 15510c65860SBram Moolenaar vim9script 15610c65860SBram Moolenaar var s:dict: dict<string> 15710c65860SBram Moolenaar s:dict['a'] = ['x'] 15810c65860SBram Moolenaar END 15910c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 16010c65860SBram Moolenaarenddef 16110c65860SBram Moolenaar 16208052228SBram Moolenaardef Test_const() 163cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 164cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 165cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 16630fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 16730fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 168dbeecb2bSBram Moolenaar 169cfcd011fSBram Moolenaar var lines =<< trim END 17030fd8204SBram Moolenaar final list = [1, 2, 3] 171dbeecb2bSBram Moolenaar list[0] = 4 1720b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 17330fd8204SBram Moolenaar const other = [5, 6, 7] 1740b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 17571abe482SBram Moolenaar 176cfcd011fSBram Moolenaar var varlist = [7, 8] 17730fd8204SBram Moolenaar const constlist = [1, varlist, 3] 17871abe482SBram Moolenaar varlist[0] = 77 17971abe482SBram Moolenaar # TODO: does not work yet 18071abe482SBram Moolenaar # constlist[1][1] = 88 181cfcd011fSBram Moolenaar var cl = constlist[1] 18271abe482SBram Moolenaar cl[1] = 88 18371abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 18471abe482SBram Moolenaar 185e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 186e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 18771abe482SBram Moolenaar vardict['five'] = 55 18871abe482SBram Moolenaar # TODO: does not work yet 18971abe482SBram Moolenaar # constdict['two']['six'] = 66 190cfcd011fSBram Moolenaar var cd = constdict['two'] 19171abe482SBram Moolenaar cd['six'] = 66 192e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 193dbeecb2bSBram Moolenaar END 194dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 19508052228SBram Moolenaarenddef 1968a7d6542SBram Moolenaar 1970b4c66c6SBram Moolenaardef Test_const_bang() 198cfcd011fSBram Moolenaar var lines =<< trim END 19930fd8204SBram Moolenaar const var = 234 2000b4c66c6SBram Moolenaar var = 99 2010b4c66c6SBram Moolenaar END 2020b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2030b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2040b4c66c6SBram Moolenaar 2050b4c66c6SBram Moolenaar lines =<< trim END 20630fd8204SBram Moolenaar const ll = [2, 3, 4] 2070b4c66c6SBram Moolenaar ll[0] = 99 2080b4c66c6SBram Moolenaar END 2090b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2100b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2110b4c66c6SBram Moolenaar 2120b4c66c6SBram Moolenaar lines =<< trim END 21330fd8204SBram Moolenaar const ll = [2, 3, 4] 2140b4c66c6SBram Moolenaar ll[3] = 99 2150b4c66c6SBram Moolenaar END 2160b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2170b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2180b4c66c6SBram Moolenaar 2190b4c66c6SBram Moolenaar lines =<< trim END 220e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2210b4c66c6SBram Moolenaar dd["one"] = 99 2220b4c66c6SBram Moolenaar END 2230b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2240b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2250b4c66c6SBram Moolenaar 2260b4c66c6SBram Moolenaar lines =<< trim END 227e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2280b4c66c6SBram Moolenaar dd["three"] = 99 2290b4c66c6SBram Moolenaar END 2300b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2310b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2320b4c66c6SBram Moolenaarenddef 2330b4c66c6SBram Moolenaar 234df069eecSBram Moolenaardef Test_range_no_colon() 235d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 236d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 237d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 238d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 239df069eecSBram Moolenaarenddef 240df069eecSBram Moolenaar 241df069eecSBram Moolenaar 2428a7d6542SBram Moolenaardef Test_block() 243cfcd011fSBram Moolenaar var outer = 1 2448a7d6542SBram Moolenaar { 245cfcd011fSBram Moolenaar var inner = 2 2468a7d6542SBram Moolenaar assert_equal(1, outer) 2478a7d6542SBram Moolenaar assert_equal(2, inner) 2488a7d6542SBram Moolenaar } 2498a7d6542SBram Moolenaar assert_equal(1, outer) 2508a7d6542SBram Moolenaarenddef 2518a7d6542SBram Moolenaar 25208052228SBram Moolenaardef Test_block_failure() 253cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 25408052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 25508052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 25608052228SBram Moolenaarenddef 2578a7d6542SBram Moolenaar 258fbbcd003SBram Moolenaardef Test_block_local_vars() 259fbbcd003SBram Moolenaar var lines =<< trim END 260fbbcd003SBram Moolenaar vim9script 261ed234f24SBram Moolenaar v:testing = 1 262fbbcd003SBram Moolenaar if true 263ed234f24SBram Moolenaar var text = ['hello'] 264ed234f24SBram Moolenaar def SayHello(): list<string> 265fbbcd003SBram Moolenaar return text 266fbbcd003SBram Moolenaar enddef 267fbbcd003SBram Moolenaar def SetText(v: string) 268ed234f24SBram Moolenaar text = [v] 269fbbcd003SBram Moolenaar enddef 270fbbcd003SBram Moolenaar endif 271fbbcd003SBram Moolenaar 272fbbcd003SBram Moolenaar if true 273ed234f24SBram Moolenaar var text = ['again'] 274ed234f24SBram Moolenaar def SayAgain(): list<string> 275fbbcd003SBram Moolenaar return text 276fbbcd003SBram Moolenaar enddef 277fbbcd003SBram Moolenaar endif 278ed234f24SBram Moolenaar 279ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 280ed234f24SBram Moolenaar test_garbagecollect_now() 281ed234f24SBram Moolenaar 282fbbcd003SBram Moolenaar defcompile 283fbbcd003SBram Moolenaar 284ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 285ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 286fbbcd003SBram Moolenaar 287fbbcd003SBram Moolenaar SetText('foobar') 288ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 289ed234f24SBram Moolenaar 290ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 291ed234f24SBram Moolenaar qall! 292fbbcd003SBram Moolenaar END 293ed234f24SBram Moolenaar 294ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 295ed234f24SBram Moolenaar # context gets garbage collected. 296ed234f24SBram Moolenaar writefile(lines, 'Xscript') 297ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 298ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 299ed234f24SBram Moolenaar 300ed234f24SBram Moolenaar delete('Xscript') 301ed234f24SBram Moolenaar delete('Xdidit') 302fbbcd003SBram Moolenaarenddef 303fbbcd003SBram Moolenaar 30439ca4127SBram Moolenaardef Test_block_local_vars_with_func() 30539ca4127SBram Moolenaar var lines =<< trim END 30639ca4127SBram Moolenaar vim9script 30739ca4127SBram Moolenaar if true 30839ca4127SBram Moolenaar var foo = 'foo' 30939ca4127SBram Moolenaar if true 31039ca4127SBram Moolenaar var bar = 'bar' 31139ca4127SBram Moolenaar def Func(): list<string> 31239ca4127SBram Moolenaar return [foo, bar] 31339ca4127SBram Moolenaar enddef 31439ca4127SBram Moolenaar endif 31539ca4127SBram Moolenaar endif 31639ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 31739ca4127SBram Moolenaar # "foo" and "bar" 31839ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 31939ca4127SBram Moolenaar END 32039ca4127SBram Moolenaar CheckScriptSuccess(lines) 32139ca4127SBram Moolenaarenddef 32239ca4127SBram Moolenaar 323d032f34aSBram Moolenaarfunc g:NoSuchFunc() 324d032f34aSBram Moolenaar echo 'none' 325d032f34aSBram Moolenaarendfunc 326d032f34aSBram Moolenaar 3279e1d9e34SBram Moolenaardef Test_try_catch_throw() 328cfcd011fSBram Moolenaar var l = [] 3297a092245SBram Moolenaar try # comment 3308a7d6542SBram Moolenaar add(l, '1') 3318a7d6542SBram Moolenaar throw 'wrong' 3328a7d6542SBram Moolenaar add(l, '2') 3337a092245SBram Moolenaar catch # comment 3348a7d6542SBram Moolenaar add(l, v:exception) 3357a092245SBram Moolenaar finally # comment 3368a7d6542SBram Moolenaar add(l, '3') 3377a092245SBram Moolenaar endtry # comment 3388a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 33968d130c6SBram Moolenaar 340e859312eSBram Moolenaar l = [] 341e859312eSBram Moolenaar try 342e859312eSBram Moolenaar try 343e859312eSBram Moolenaar add(l, '1') 344e859312eSBram Moolenaar throw 'wrong' 345e859312eSBram Moolenaar add(l, '2') 346e859312eSBram Moolenaar catch /right/ 347e859312eSBram Moolenaar add(l, v:exception) 348e859312eSBram Moolenaar endtry 349e859312eSBram Moolenaar catch /wrong/ 350e859312eSBram Moolenaar add(l, 'caught') 351373863edSBram Moolenaar fina 352e859312eSBram Moolenaar add(l, 'finally') 353e859312eSBram Moolenaar endtry 354e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 355e859312eSBram Moolenaar 356cfcd011fSBram Moolenaar var n: number 35768d130c6SBram Moolenaar try 35868d130c6SBram Moolenaar n = l[3] 35968d130c6SBram Moolenaar catch /E684:/ 36068d130c6SBram Moolenaar n = 99 36168d130c6SBram Moolenaar endtry 36268d130c6SBram Moolenaar assert_equal(99, n) 36368d130c6SBram Moolenaar 36469f7050cSBram Moolenaar var done = 'no' 36569f7050cSBram Moolenaar if 0 36669f7050cSBram Moolenaar try | catch | endtry 36769f7050cSBram Moolenaar else 36869f7050cSBram Moolenaar done = 'yes' 36969f7050cSBram Moolenaar endif 37069f7050cSBram Moolenaar assert_equal('yes', done) 37169f7050cSBram Moolenaar 37269f7050cSBram Moolenaar done = 'no' 37369f7050cSBram Moolenaar if 1 37469f7050cSBram Moolenaar done = 'yes' 37569f7050cSBram Moolenaar else 37669f7050cSBram Moolenaar try | catch | endtry 37769f7050cSBram Moolenaar done = 'never' 37869f7050cSBram Moolenaar endif 37969f7050cSBram Moolenaar assert_equal('yes', done) 38069f7050cSBram Moolenaar 38169f7050cSBram Moolenaar if 1 38269f7050cSBram Moolenaar else 38369f7050cSBram Moolenaar try | catch /pat/ | endtry 38469f7050cSBram Moolenaar try | catch /pat/ 38569f7050cSBram Moolenaar endtry 38669f7050cSBram Moolenaar try 38769f7050cSBram Moolenaar catch /pat/ | endtry 38869f7050cSBram Moolenaar try 38969f7050cSBram Moolenaar catch /pat/ 39069f7050cSBram Moolenaar endtry 39169f7050cSBram Moolenaar endif 39269f7050cSBram Moolenaar 39368d130c6SBram Moolenaar try 394cc673e74SBram Moolenaar # string slice returns a string, not a number 39568d130c6SBram Moolenaar n = g:astring[3] 3965e654230SBram Moolenaar catch /E1012:/ 39768d130c6SBram Moolenaar n = 77 39868d130c6SBram Moolenaar endtry 39968d130c6SBram Moolenaar assert_equal(77, n) 40068d130c6SBram Moolenaar 40168d130c6SBram Moolenaar try 40268d130c6SBram Moolenaar n = l[g:astring] 4035e654230SBram Moolenaar catch /E1012:/ 40456acb094SBram Moolenaar n = 88 40568d130c6SBram Moolenaar endtry 40656acb094SBram Moolenaar assert_equal(88, n) 40768d130c6SBram Moolenaar 40868d130c6SBram Moolenaar try 40968d130c6SBram Moolenaar n = s:does_not_exist 41068d130c6SBram Moolenaar catch /E121:/ 411f0b9f43cSBram Moolenaar n = 111 412f0b9f43cSBram Moolenaar endtry 413f0b9f43cSBram Moolenaar assert_equal(111, n) 414f0b9f43cSBram Moolenaar 415f0b9f43cSBram Moolenaar try 416f0b9f43cSBram Moolenaar n = g:does_not_exist 417f0b9f43cSBram Moolenaar catch /E121:/ 41868d130c6SBram Moolenaar n = 121 41968d130c6SBram Moolenaar endtry 42068d130c6SBram Moolenaar assert_equal(121, n) 42168d130c6SBram Moolenaar 422e0de171eSBram Moolenaar var d = {one: 1} 42368d130c6SBram Moolenaar try 42468d130c6SBram Moolenaar n = d[g:astring] 42568d130c6SBram Moolenaar catch /E716:/ 42668d130c6SBram Moolenaar n = 222 42768d130c6SBram Moolenaar endtry 42868d130c6SBram Moolenaar assert_equal(222, n) 429f0b9f43cSBram Moolenaar 430f0b9f43cSBram Moolenaar try 431f0b9f43cSBram Moolenaar n = -g:astring 432f0b9f43cSBram Moolenaar catch /E39:/ 433f0b9f43cSBram Moolenaar n = 233 434f0b9f43cSBram Moolenaar endtry 435f0b9f43cSBram Moolenaar assert_equal(233, n) 436f0b9f43cSBram Moolenaar 437f0b9f43cSBram Moolenaar try 438f0b9f43cSBram Moolenaar n = +g:astring 439f0b9f43cSBram Moolenaar catch /E1030:/ 440f0b9f43cSBram Moolenaar n = 244 441f0b9f43cSBram Moolenaar endtry 442f0b9f43cSBram Moolenaar assert_equal(244, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = +g:alist 446f0b9f43cSBram Moolenaar catch /E745:/ 447f0b9f43cSBram Moolenaar n = 255 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(255, n) 450f0b9f43cSBram Moolenaar 451cfcd011fSBram Moolenaar var nd: dict<any> 452f0b9f43cSBram Moolenaar try 4532e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4542e5910bfSBram Moolenaar catch /E1105:/ 455f0b9f43cSBram Moolenaar n = 266 456f0b9f43cSBram Moolenaar endtry 457f0b9f43cSBram Moolenaar assert_equal(266, n) 458f0b9f43cSBram Moolenaar 459f0b9f43cSBram Moolenaar try 460f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 461f0b9f43cSBram Moolenaar catch /E1093:/ 462f0b9f43cSBram Moolenaar n = 277 463f0b9f43cSBram Moolenaar endtry 464f0b9f43cSBram Moolenaar assert_equal(277, n) 465f0b9f43cSBram Moolenaar 466e859312eSBram Moolenaar try 467e859312eSBram Moolenaar &ts = g:astring 4685e654230SBram Moolenaar catch /E1012:/ 469e859312eSBram Moolenaar n = 288 470e859312eSBram Moolenaar endtry 471e859312eSBram Moolenaar assert_equal(288, n) 472e859312eSBram Moolenaar 473e859312eSBram Moolenaar try 474e859312eSBram Moolenaar &backspace = 'asdf' 475e859312eSBram Moolenaar catch /E474:/ 476e859312eSBram Moolenaar n = 299 477e859312eSBram Moolenaar endtry 478e859312eSBram Moolenaar assert_equal(299, n) 479e859312eSBram Moolenaar 480e859312eSBram Moolenaar l = [1] 481e859312eSBram Moolenaar try 482e859312eSBram Moolenaar l[3] = 3 483e859312eSBram Moolenaar catch /E684:/ 484e859312eSBram Moolenaar n = 300 485e859312eSBram Moolenaar endtry 486e859312eSBram Moolenaar assert_equal(300, n) 487e859312eSBram Moolenaar 488e859312eSBram Moolenaar try 489e859312eSBram Moolenaar unlet g:does_not_exist 490e859312eSBram Moolenaar catch /E108:/ 491e859312eSBram Moolenaar n = 322 492e859312eSBram Moolenaar endtry 493e859312eSBram Moolenaar assert_equal(322, n) 494e859312eSBram Moolenaar 495e859312eSBram Moolenaar try 4962bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 497e859312eSBram Moolenaar catch /E721:/ 498e859312eSBram Moolenaar n = 333 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(333, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar l = DeletedFunc() 504e859312eSBram Moolenaar catch /E933:/ 505e859312eSBram Moolenaar n = 344 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(344, n) 508d032f34aSBram Moolenaar 509d032f34aSBram Moolenaar try 510d032f34aSBram Moolenaar echo len(v:true) 511d032f34aSBram Moolenaar catch /E701:/ 512d032f34aSBram Moolenaar n = 355 513d032f34aSBram Moolenaar endtry 514d032f34aSBram Moolenaar assert_equal(355, n) 515d032f34aSBram Moolenaar 516cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 517d032f34aSBram Moolenaar delfunc g:NoSuchFunc 518d032f34aSBram Moolenaar try 519d032f34aSBram Moolenaar echo P() 520d032f34aSBram Moolenaar catch /E117:/ 521d032f34aSBram Moolenaar n = 366 522d032f34aSBram Moolenaar endtry 523d032f34aSBram Moolenaar assert_equal(366, n) 524d032f34aSBram Moolenaar 525d032f34aSBram Moolenaar try 526d032f34aSBram Moolenaar echo g:NoSuchFunc() 527d032f34aSBram Moolenaar catch /E117:/ 528d032f34aSBram Moolenaar n = 377 529d032f34aSBram Moolenaar endtry 530d032f34aSBram Moolenaar assert_equal(377, n) 531d032f34aSBram Moolenaar 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo g:alist + 4 534d032f34aSBram Moolenaar catch /E745:/ 535d032f34aSBram Moolenaar n = 388 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(388, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo 4 + g:alist 541d032f34aSBram Moolenaar catch /E745:/ 542d032f34aSBram Moolenaar n = 399 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(399, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist.member 548d032f34aSBram Moolenaar catch /E715:/ 549d032f34aSBram Moolenaar n = 400 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(400, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo d.member 555d032f34aSBram Moolenaar catch /E716:/ 556d032f34aSBram Moolenaar n = 411 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(411, n) 5598a7d6542SBram Moolenaarenddef 5608a7d6542SBram Moolenaar 5611430ceebSBram Moolenaardef Test_cnext_works_in_catch() 5621430ceebSBram Moolenaar var lines =<< trim END 5631430ceebSBram Moolenaar vim9script 5641430ceebSBram Moolenaar au BufEnter * eval 0 5651430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 5661430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 5671430ceebSBram Moolenaar var items = [ 5681430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 5691430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 5701430ceebSBram Moolenaar ] 5711430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 5721430ceebSBram Moolenaar cwindow 5731430ceebSBram Moolenaar 5741430ceebSBram Moolenaar def CnextOrCfirst() 5751430ceebSBram Moolenaar # if cnext fails, cfirst is used 5761430ceebSBram Moolenaar try 5771430ceebSBram Moolenaar cnext 5781430ceebSBram Moolenaar catch 5791430ceebSBram Moolenaar cfirst 5801430ceebSBram Moolenaar endtry 5811430ceebSBram Moolenaar enddef 5821430ceebSBram Moolenaar 5831430ceebSBram Moolenaar CnextOrCfirst() 5841430ceebSBram Moolenaar CnextOrCfirst() 5851430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 5861430ceebSBram Moolenaar qall 5871430ceebSBram Moolenaar END 5881430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 5891430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 5901430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 5911430ceebSBram Moolenaar 5921430ceebSBram Moolenaar delete('Xfile1') 5931430ceebSBram Moolenaar delete('Xfile2') 5941430ceebSBram Moolenaar delete('XCatchCnext') 5951430ceebSBram Moolenaar delete('Xresult') 5961430ceebSBram Moolenaarenddef 5971430ceebSBram 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) 8184bce26bbSBram Moolenaar 8194bce26bbSBram Moolenaar lines =<< trim END 8204bce26bbSBram Moolenaar [{ 8214bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8224bce26bbSBram Moolenaar END 8234bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 824b209750bSBram Moolenaarenddef 825b209750bSBram Moolenaar 8262a1381c3SBram Moolenaarif has('channel') 82740ee466cSBram Moolenaar let someJob = test_null_job() 82840ee466cSBram Moolenaar 82940ee466cSBram Moolenaar def FuncWithError() 83040ee466cSBram Moolenaar echomsg g:someJob 83140ee466cSBram Moolenaar enddef 83240ee466cSBram Moolenaar 83340ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 83440ee466cSBram Moolenaar try 83540ee466cSBram Moolenaar call FuncWithError() 83640ee466cSBram Moolenaar catch 83740ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 83840ee466cSBram Moolenaar endtry 83940ee466cSBram Moolenaar endfunc 8402a1381c3SBram Moolenaarendif 84140ee466cSBram Moolenaar 8428a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8438a7d6542SBram Moolenaar vim9script 844cfcd011fSBram Moolenaar var name: string = 'bob' 8458a7d6542SBram Moolenaar def Concat(arg: string): string 8468a7d6542SBram Moolenaar return name .. arg 8478a7d6542SBram Moolenaar enddef 848227a69deSBram Moolenaar g:result = Concat('bie') 849227a69deSBram Moolenaar g:localname = name 8508a7d6542SBram Moolenaar 8518a7d6542SBram Moolenaar export const CONST = 1234 852cfcd011fSBram Moolenaar export var exported = 9876 853cfcd011fSBram Moolenaar export var exp_name = 'John' 8548a7d6542SBram Moolenaar export def Exported(): string 8558a7d6542SBram Moolenaar return 'Exported' 8568a7d6542SBram Moolenaar enddef 8578a7d6542SBram MoolenaarEND 8588a7d6542SBram Moolenaar 859b3ca9824SBram Moolenaardef Undo_export_script_lines() 860b3ca9824SBram Moolenaar unlet g:result 861b3ca9824SBram Moolenaar unlet g:localname 862b3ca9824SBram Moolenaarenddef 863b3ca9824SBram Moolenaar 8645269bd2aSBram Moolenaardef Test_vim9_import_export() 865cfcd011fSBram Moolenaar var import_script_lines =<< trim END 8668a7d6542SBram Moolenaar vim9script 8678a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 8688a7d6542SBram Moolenaar g:imported = exported 8696e587dcbSBram Moolenaar exported += 3 8706e587dcbSBram Moolenaar g:imported_added = exported 8718a7d6542SBram Moolenaar g:imported_func = Exported() 8726e587dcbSBram Moolenaar 87340f4f7a4SBram Moolenaar def GetExported(): string 874e0de171eSBram Moolenaar var local_dict = {ref: Exported} 87540f4f7a4SBram Moolenaar return local_dict.ref() 87640f4f7a4SBram Moolenaar enddef 87740f4f7a4SBram Moolenaar g:funcref_result = GetExported() 87840f4f7a4SBram Moolenaar 8796e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 8806e587dcbSBram Moolenaar g:imported_name = exp_name 8816e587dcbSBram Moolenaar exp_name ..= ' Doe' 8826e587dcbSBram Moolenaar g:imported_name_appended = exp_name 8835381c7a1SBram Moolenaar g:imported_later = exported 8848a7d6542SBram Moolenaar END 8858a7d6542SBram Moolenaar 8868a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 8878a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 8888a7d6542SBram Moolenaar 8898a7d6542SBram Moolenaar source Ximport.vim 8908a7d6542SBram Moolenaar 8918a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 8928a7d6542SBram Moolenaar assert_equal('bob', g:localname) 8938a7d6542SBram Moolenaar assert_equal(9876, g:imported) 8946e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 8955381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8968a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 89740f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 8986e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8996e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9008a7d6542SBram Moolenaar assert_false(exists('g:name')) 9018a7d6542SBram Moolenaar 902b3ca9824SBram Moolenaar Undo_export_script_lines() 9038a7d6542SBram Moolenaar unlet g:imported 9046e587dcbSBram Moolenaar unlet g:imported_added 9055381c7a1SBram Moolenaar unlet g:imported_later 9068a7d6542SBram Moolenaar unlet g:imported_func 9076e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9088a7d6542SBram Moolenaar delete('Ximport.vim') 909f2d5c240SBram Moolenaar 9101c991144SBram Moolenaar # similar, with line breaks 911cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9121c991144SBram Moolenaar vim9script 9131c991144SBram Moolenaar import { 9141c991144SBram Moolenaar exported, 9151c991144SBram Moolenaar Exported, 9161c991144SBram Moolenaar } 9171c991144SBram Moolenaar from 9181c991144SBram Moolenaar './Xexport.vim' 9191c991144SBram Moolenaar g:imported = exported 9201c991144SBram Moolenaar exported += 5 9211c991144SBram Moolenaar g:imported_added = exported 9221c991144SBram Moolenaar g:imported_func = Exported() 9231c991144SBram Moolenaar END 9241c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9251c991144SBram Moolenaar source Ximport_lbr.vim 9261c991144SBram Moolenaar 9271c991144SBram Moolenaar assert_equal(9876, g:imported) 9281c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9291c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9301c991144SBram Moolenaar 9311c991144SBram Moolenaar # exported script not sourced again 9321c991144SBram Moolenaar assert_false(exists('g:result')) 9331c991144SBram Moolenaar unlet g:imported 9341c991144SBram Moolenaar unlet g:imported_added 9351c991144SBram Moolenaar unlet g:imported_func 9361c991144SBram Moolenaar delete('Ximport_lbr.vim') 9371c991144SBram Moolenaar 9381c991144SBram Moolenaar # import inside :def function 939cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9405381c7a1SBram Moolenaar vim9script 9415381c7a1SBram Moolenaar def ImportInDef() 9425381c7a1SBram Moolenaar import exported from './Xexport.vim' 9435381c7a1SBram Moolenaar g:imported = exported 9445381c7a1SBram Moolenaar exported += 7 9455381c7a1SBram Moolenaar g:imported_added = exported 9465381c7a1SBram Moolenaar enddef 9475381c7a1SBram Moolenaar ImportInDef() 9485381c7a1SBram Moolenaar END 9495381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9505381c7a1SBram Moolenaar source Ximport2.vim 951f5be8cdbSBram Moolenaar # TODO: this should be 9879 9525381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9535381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9545381c7a1SBram Moolenaar unlet g:imported 9555381c7a1SBram Moolenaar unlet g:imported_added 9565381c7a1SBram Moolenaar delete('Ximport2.vim') 9575381c7a1SBram Moolenaar 958cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 959f2d5c240SBram Moolenaar vim9script 960f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 961f2d5c240SBram Moolenaar def UseExport() 962f2d5c240SBram Moolenaar g:imported = Export.exported 963f2d5c240SBram Moolenaar enddef 964f2d5c240SBram Moolenaar UseExport() 965f2d5c240SBram Moolenaar END 966f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 967f2d5c240SBram Moolenaar source Ximport.vim 9685381c7a1SBram Moolenaar assert_equal(9883, g:imported) 969f2d5c240SBram Moolenaar 970cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 971599c89c8SBram Moolenaar vim9script 972599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 973599c89c8SBram Moolenaar def Func() 974cfcd011fSBram Moolenaar var dummy = 1 975cfcd011fSBram Moolenaar var imported = Export + dummy 976599c89c8SBram Moolenaar enddef 977822ba247SBram Moolenaar defcompile 978599c89c8SBram Moolenaar END 979599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 98044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 981599c89c8SBram Moolenaar 982cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 983599c89c8SBram Moolenaar vim9script 984599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 985599c89c8SBram Moolenaar def Func() 986cfcd011fSBram Moolenaar var imported = Export . exported 987599c89c8SBram Moolenaar enddef 988822ba247SBram Moolenaar defcompile 989599c89c8SBram Moolenaar END 990599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 99144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 992599c89c8SBram Moolenaar 993a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 994a6294955SBram Moolenaar vim9script 995a6294955SBram Moolenaar import * as Export from './Xexport.vim' 996a6294955SBram Moolenaar var some = 'other' 997a6294955SBram Moolenaar import * as Export from './Xexport.vim' 998a6294955SBram Moolenaar defcompile 999a6294955SBram Moolenaar END 1000a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1001a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1002a6294955SBram Moolenaar 1003cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1004599c89c8SBram Moolenaar vim9script 1005599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1006599c89c8SBram Moolenaar def Func() 1007cfcd011fSBram Moolenaar var imported = Export. 1008599c89c8SBram Moolenaar enddef 1009822ba247SBram Moolenaar defcompile 1010599c89c8SBram Moolenaar END 1011599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 101244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1013599c89c8SBram Moolenaar 1014cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10151c991144SBram Moolenaar vim9script 10161c991144SBram Moolenaar import * 10171c991144SBram Moolenaar as Export 10181c991144SBram Moolenaar from 10191c991144SBram Moolenaar './Xexport.vim' 10201c991144SBram Moolenaar def UseExport() 10211c991144SBram Moolenaar g:imported = Export.exported 10221c991144SBram Moolenaar enddef 10231c991144SBram Moolenaar UseExport() 10241c991144SBram Moolenaar END 10251c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10261c991144SBram Moolenaar source Ximport.vim 10271c991144SBram Moolenaar assert_equal(9883, g:imported) 10281c991144SBram Moolenaar 1029cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1030f2d5c240SBram Moolenaar vim9script 1031f2d5c240SBram Moolenaar import * from './Xexport.vim' 1032f2d5c240SBram Moolenaar END 1033f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 103444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1035f2d5c240SBram Moolenaar 1036f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1037cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1038fa29c8abSBram Moolenaar vim9script 1039fa29c8abSBram Moolenaar import name from './Xexport.vim' 1040fa29c8abSBram Moolenaar END 1041fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 104244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1043fa29c8abSBram Moolenaar 1044f5be8cdbSBram Moolenaar # try to import something that is already defined 1045cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10465269bd2aSBram Moolenaar vim9script 1047cfcd011fSBram Moolenaar var exported = 'something' 10485269bd2aSBram Moolenaar import exported from './Xexport.vim' 10495269bd2aSBram Moolenaar END 10505269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 105144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10525269bd2aSBram Moolenaar 1053f5be8cdbSBram Moolenaar # try to import something that is already defined 10545269bd2aSBram Moolenaar import_already_defined =<< trim END 10555269bd2aSBram Moolenaar vim9script 1056cfcd011fSBram Moolenaar var exported = 'something' 10575269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 10585269bd2aSBram Moolenaar END 10595269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 106044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10615269bd2aSBram Moolenaar 1062f5be8cdbSBram Moolenaar # try to import something that is already defined 10635269bd2aSBram Moolenaar import_already_defined =<< trim END 10645269bd2aSBram Moolenaar vim9script 1065cfcd011fSBram Moolenaar var exported = 'something' 10665269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 10675269bd2aSBram Moolenaar END 10685269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 106944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10705269bd2aSBram Moolenaar 1071918a4249SBram Moolenaar # try changing an imported const 1072918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1073918a4249SBram Moolenaar vim9script 1074918a4249SBram Moolenaar import CONST from './Xexport.vim' 1075918a4249SBram Moolenaar def Assign() 1076918a4249SBram Moolenaar CONST = 987 1077918a4249SBram Moolenaar enddef 1078918a4249SBram Moolenaar defcompile 1079918a4249SBram Moolenaar END 1080918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1081918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1082918a4249SBram Moolenaar 1083f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1084cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1085fa29c8abSBram Moolenaar vim9script 1086fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1087fa29c8abSBram Moolenaar END 1088fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 108944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1090fa29c8abSBram Moolenaar 1091cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1092fa29c8abSBram Moolenaar vim9script 1093fa29c8abSBram Moolenaar import name './Xexport.vim' 1094fa29c8abSBram Moolenaar END 1095fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 109644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1097fa29c8abSBram Moolenaar 1098cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1099fa29c8abSBram Moolenaar vim9script 1100fa29c8abSBram Moolenaar import name from Xexport.vim 1101fa29c8abSBram Moolenaar END 1102fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 110344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1104fa29c8abSBram Moolenaar 1105cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1106fa29c8abSBram Moolenaar vim9script 1107fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1108fa29c8abSBram Moolenaar END 1109fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 111044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1111fa29c8abSBram Moolenaar 1112cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1113fa29c8abSBram Moolenaar vim9script 1114fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1115fa29c8abSBram Moolenaar END 11165269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 111744d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1118fa29c8abSBram Moolenaar 1119f2d5c240SBram Moolenaar delete('Ximport.vim') 11205269bd2aSBram Moolenaar delete('Ximport3.vim') 11218a7d6542SBram Moolenaar delete('Xexport.vim') 11228a7d6542SBram Moolenaar 1123f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1124750802b5SBram Moolenaar set cpo&vi 1125cfcd011fSBram Moolenaar var cpo_before = &cpo 1126cfcd011fSBram Moolenaar var lines =<< trim END 1127750802b5SBram Moolenaar vim9script 1128750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1129750802b5SBram Moolenaar END 1130750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1131750802b5SBram Moolenaar source Xvim9_script 1132750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1133750802b5SBram Moolenaar set cpo&vim 1134750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1135750802b5SBram Moolenaar delete('Xvim9_script') 1136750802b5SBram Moolenaarenddef 1137750802b5SBram Moolenaar 1138803af686SBram Moolenaarfunc g:Trigger() 1139803af686SBram Moolenaar source Ximport.vim 1140803af686SBram Moolenaar return "echo 'yes'\<CR>" 1141803af686SBram Moolenaarendfunc 1142803af686SBram Moolenaar 1143803af686SBram Moolenaardef Test_import_export_expr_map() 1144803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1145cfcd011fSBram Moolenaar var export_lines =<< trim END 1146803af686SBram Moolenaar vim9script 1147803af686SBram Moolenaar export def That(): string 1148803af686SBram Moolenaar return 'yes' 1149803af686SBram Moolenaar enddef 1150803af686SBram Moolenaar END 1151803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1152803af686SBram Moolenaar 1153cfcd011fSBram Moolenaar var import_lines =<< trim END 1154803af686SBram Moolenaar vim9script 1155803af686SBram Moolenaar import That from './Xexport_that.vim' 1156803af686SBram Moolenaar assert_equal('yes', That()) 1157803af686SBram Moolenaar END 1158803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1159803af686SBram Moolenaar 1160803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1161803af686SBram Moolenaar feedkeys('trigger', "xt") 1162803af686SBram Moolenaar 1163730b2483SBram Moolenaar delete('Xexport_that.vim') 1164803af686SBram Moolenaar delete('Ximport.vim') 1165803af686SBram Moolenaar nunmap trigger 1166803af686SBram Moolenaarenddef 1167803af686SBram Moolenaar 11688e1986e3SBram Moolenaardef Test_import_in_filetype() 11698e1986e3SBram Moolenaar # check that :import works when the buffer is locked 11708e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1171cfcd011fSBram Moolenaar var export_lines =<< trim END 11728e1986e3SBram Moolenaar vim9script 1173cfcd011fSBram Moolenaar export var That = 'yes' 11748e1986e3SBram Moolenaar END 1175730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 11768e1986e3SBram Moolenaar 1177cfcd011fSBram Moolenaar var import_lines =<< trim END 11788e1986e3SBram Moolenaar vim9script 1179730b2483SBram Moolenaar import That from './Xexport_ft.vim' 11808e1986e3SBram Moolenaar assert_equal('yes', That) 11818e1986e3SBram Moolenaar g:did_load_mytpe = 1 11828e1986e3SBram Moolenaar END 11838e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 11848e1986e3SBram Moolenaar 1185cfcd011fSBram Moolenaar var save_rtp = &rtp 11868e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 11878e1986e3SBram Moolenaar 11888e1986e3SBram Moolenaar filetype plugin on 11898e1986e3SBram Moolenaar copen 11908e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 11918e1986e3SBram Moolenaar 11928e1986e3SBram Moolenaar quit! 1193730b2483SBram Moolenaar delete('Xexport_ft.vim') 11948e1986e3SBram Moolenaar delete('ftplugin', 'rf') 11958e1986e3SBram Moolenaar &rtp = save_rtp 11968e1986e3SBram Moolenaarenddef 11978e1986e3SBram Moolenaar 1198efa94447SBram Moolenaardef Test_use_import_in_mapping() 1199cfcd011fSBram Moolenaar var lines =<< trim END 1200efa94447SBram Moolenaar vim9script 1201efa94447SBram Moolenaar export def Funcx() 1202efa94447SBram Moolenaar g:result = 42 1203efa94447SBram Moolenaar enddef 1204efa94447SBram Moolenaar END 1205efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1206efa94447SBram Moolenaar lines =<< trim END 1207efa94447SBram Moolenaar vim9script 1208efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1209b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1210efa94447SBram Moolenaar END 1211efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1212efa94447SBram Moolenaar 1213efa94447SBram Moolenaar source Xmapscript.vim 1214b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1215efa94447SBram Moolenaar assert_equal(42, g:result) 1216efa94447SBram Moolenaar 1217efa94447SBram Moolenaar unlet g:result 1218efa94447SBram Moolenaar delete('XsomeExport.vim') 1219efa94447SBram Moolenaar delete('Xmapscript.vim') 1220b3ca9824SBram Moolenaar nunmap <F3> 1221efa94447SBram Moolenaarenddef 1222efa94447SBram Moolenaar 1223750802b5SBram Moolenaardef Test_vim9script_fails() 12248a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12258a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1226cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 12279721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1228cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1229750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1230750802b5SBram Moolenaar 1231cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1232c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1233c785b9a7SBram Moolenaar 1234e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1235e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 12368a7d6542SBram Moolenaarenddef 12378a7d6542SBram Moolenaar 1238f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1239101f4810SBram Moolenaar CheckRunVimInTerminal 1240101f4810SBram Moolenaar 12419bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1242c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 12439bb3eb3eSBram Moolenaarendfunc 12449bb3eb3eSBram Moolenaar 1245c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1246cfcd011fSBram Moolenaar var export =<< trim END 1247101f4810SBram Moolenaar vim9script 1248101f4810SBram Moolenaar export def Foo(): number 1249101f4810SBram Moolenaar return 0 1250101f4810SBram Moolenaar enddef 1251101f4810SBram Moolenaar END 1252730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1253101f4810SBram Moolenaar 1254e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 12559bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 12562949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1257101f4810SBram Moolenaar 1258730b2483SBram Moolenaar delete('XexportCmd.vim') 12599bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 12609bb3eb3eSBram Moolenaarenddef 1261101f4810SBram Moolenaar 12622b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 12632b32700dSBram Moolenaar var lines =<< trim END 1264a6294955SBram Moolenaar vim9script 1265a6294955SBram Moolenaar export var exported = 'thexport' 1266a6294955SBram Moolenaar END 1267a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1268a6294955SBram Moolenaar lines =<< trim END 12692b32700dSBram Moolenaar vim9script noclear 12702b32700dSBram Moolenaar g:loadCount += 1 12712b32700dSBram Moolenaar var s:reloaded = 'init' 1272a6294955SBram Moolenaar import exported from './XExportReload' 12732b32700dSBram Moolenaar 12742b32700dSBram Moolenaar def Again(): string 12752b32700dSBram Moolenaar return 'again' 12762b32700dSBram Moolenaar enddef 12772b32700dSBram Moolenaar 12782b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 12792b32700dSBram Moolenaar var s:loaded = true 12802b32700dSBram Moolenaar 12812b32700dSBram Moolenaar var s:notReloaded = 'yes' 12822b32700dSBram Moolenaar s:reloaded = 'first' 12832b32700dSBram Moolenaar def g:Values(): list<string> 1284a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 12852b32700dSBram Moolenaar enddef 12862b32700dSBram Moolenaar 12872b32700dSBram Moolenaar def Once(): string 12882b32700dSBram Moolenaar return 'once' 12892b32700dSBram Moolenaar enddef 12902b32700dSBram Moolenaar END 12912b32700dSBram Moolenaar writefile(lines, 'XReloaded') 12922b32700dSBram Moolenaar g:loadCount = 0 12932b32700dSBram Moolenaar source XReloaded 12942b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1295a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 12962b32700dSBram Moolenaar source XReloaded 12972b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1298a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 12992b32700dSBram Moolenaar source XReloaded 13002b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1301a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13022b32700dSBram Moolenaar 130348e11c10SBram Moolenaar delete('XReloaded') 1304a6294955SBram Moolenaar delete('XExportReload') 13052b32700dSBram Moolenaar delfunc g:Values 13062b32700dSBram Moolenaar unlet g:loadCount 13072b32700dSBram Moolenaarenddef 13082b32700dSBram Moolenaar 13094c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1310cfcd011fSBram Moolenaar var lines =<< trim END 13118a7d6542SBram Moolenaar vim9script 13128a7d6542SBram Moolenaar const var = '' 1313cfcd011fSBram Moolenaar var valone = 1234 13148a7d6542SBram Moolenaar def MyFunc(arg: string) 13158a7d6542SBram Moolenaar valone = 5678 13168a7d6542SBram Moolenaar enddef 13178a7d6542SBram Moolenaar END 1318cfcd011fSBram Moolenaar var morelines =<< trim END 1319cfcd011fSBram Moolenaar var valtwo = 222 13208a7d6542SBram Moolenaar export def GetValtwo(): number 13218a7d6542SBram Moolenaar return valtwo 13228a7d6542SBram Moolenaar enddef 13238a7d6542SBram Moolenaar END 132403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13258a7d6542SBram Moolenaar source Xreload.vim 13268a7d6542SBram Moolenaar source Xreload.vim 13278a7d6542SBram Moolenaar source Xreload.vim 13288a7d6542SBram Moolenaar 1329cfcd011fSBram Moolenaar var testlines =<< trim END 13308a7d6542SBram Moolenaar vim9script 13318a7d6542SBram Moolenaar def TheFunc() 13328a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13338a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13348a7d6542SBram Moolenaar enddef 13358a7d6542SBram Moolenaar TheFunc() 13368a7d6542SBram Moolenaar END 13378a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13388a7d6542SBram Moolenaar source Ximport.vim 13398a7d6542SBram Moolenaar 1340f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1341f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 13428a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 13438a7d6542SBram Moolenaar source Ximport.vim 13448a7d6542SBram Moolenaar 1345f5be8cdbSBram Moolenaar # cannot declare a var twice 13468a7d6542SBram Moolenaar lines =<< trim END 13478a7d6542SBram Moolenaar vim9script 1348cfcd011fSBram Moolenaar var valone = 1234 1349cfcd011fSBram Moolenaar var valone = 5678 13508a7d6542SBram Moolenaar END 13518a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 135244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 13538a7d6542SBram Moolenaar 13548a7d6542SBram Moolenaar delete('Xreload.vim') 13558a7d6542SBram Moolenaar delete('Ximport.vim') 13568a7d6542SBram Moolenaarenddef 13578a7d6542SBram Moolenaar 135807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 135907a65d26SBram Moolenaar" compiled function using that variable must fail. 136007a65d26SBram Moolenaardef Test_script_reload_change_type() 136107a65d26SBram Moolenaar var lines =<< trim END 136207a65d26SBram Moolenaar vim9script noclear 136307a65d26SBram Moolenaar var str = 'string' 136407a65d26SBram Moolenaar def g:GetStr(): string 136507a65d26SBram Moolenaar return str .. 'xxx' 136607a65d26SBram Moolenaar enddef 136707a65d26SBram Moolenaar END 136807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 136907a65d26SBram Moolenaar source Xreload.vim 137007a65d26SBram Moolenaar echo g:GetStr() 137107a65d26SBram Moolenaar 137207a65d26SBram Moolenaar lines =<< trim END 137307a65d26SBram Moolenaar vim9script noclear 137407a65d26SBram Moolenaar var str = 1234 137507a65d26SBram Moolenaar END 137607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 137707a65d26SBram Moolenaar source Xreload.vim 137807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 137907a65d26SBram Moolenaar 138007a65d26SBram Moolenaar delfunc g:GetStr 138107a65d26SBram Moolenaar delete('Xreload.vim') 138207a65d26SBram Moolenaarenddef 138307a65d26SBram Moolenaar 138495006e3dSBram Moolenaardef s:RetSome(): string 138595006e3dSBram Moolenaar return 'some' 138695006e3dSBram Moolenaarenddef 138795006e3dSBram Moolenaar 1388fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1389fe465a01SBram Moolenaar" script-local name. 1390fe465a01SBram Moolenaardef Test_vim9script_funcref() 1391cfcd011fSBram Moolenaar var sortlines =<< trim END 1392fe465a01SBram Moolenaar vim9script 1393fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1394bed36b93SBram Moolenaar return i2 - i1 1395fe465a01SBram Moolenaar enddef 1396fe465a01SBram Moolenaar 1397fe465a01SBram Moolenaar export def FastSort(): list<number> 1398fe465a01SBram Moolenaar return range(5)->sort(Compare) 1399fe465a01SBram Moolenaar enddef 1400fe465a01SBram Moolenaar END 1401fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1402fe465a01SBram Moolenaar 1403cfcd011fSBram Moolenaar var lines =<< trim END 1404fe465a01SBram Moolenaar vim9script 1405fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1406fe465a01SBram Moolenaar def Test() 1407fe465a01SBram Moolenaar g:result = FastSort() 1408fe465a01SBram Moolenaar enddef 1409fe465a01SBram Moolenaar Test() 1410fe465a01SBram Moolenaar END 1411fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1412fe465a01SBram Moolenaar 1413fe465a01SBram Moolenaar source Xscript.vim 1414fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1415fe465a01SBram Moolenaar 1416fe465a01SBram Moolenaar unlet g:result 1417fe465a01SBram Moolenaar delete('Xsort.vim') 1418fe465a01SBram Moolenaar delete('Xscript.vim') 141995006e3dSBram Moolenaar 1420cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 142195006e3dSBram Moolenaar assert_equal('some', Funcref()) 1422fe465a01SBram Moolenaarenddef 1423fe465a01SBram Moolenaar 1424601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1425601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1426601e76acSBram Moolenaar" function reference. 1427c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1428cfcd011fSBram Moolenaar var filterLines =<< trim END 1429c620c055SBram Moolenaar vim9script 1430c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1431c620c055SBram Moolenaar return idx % 2 == 1 1432c620c055SBram Moolenaar enddef 1433c620c055SBram Moolenaar export def FastFilter(): list<number> 1434c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1435c620c055SBram Moolenaar enddef 1436601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1437601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1438601e76acSBram Moolenaar enddef 1439c620c055SBram Moolenaar END 1440c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1441c620c055SBram Moolenaar 1442cfcd011fSBram Moolenaar var lines =<< trim END 1443c620c055SBram Moolenaar vim9script 1444601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1445c620c055SBram Moolenaar def Test() 1446cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1447c620c055SBram Moolenaar enddef 1448c620c055SBram Moolenaar Test() 1449601e76acSBram Moolenaar def TestDirect() 1450cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1451601e76acSBram Moolenaar enddef 1452601e76acSBram Moolenaar TestDirect() 1453c620c055SBram Moolenaar END 1454601e76acSBram Moolenaar CheckScriptSuccess(lines) 1455c620c055SBram Moolenaar delete('Xfilter.vim') 1456c620c055SBram Moolenaarenddef 1457c620c055SBram Moolenaar 14584c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1459cfcd011fSBram Moolenaar var first_lines =<< trim END 14604c17ad94SBram Moolenaar vim9script 14614c17ad94SBram Moolenaar def FuncYes(): string 14624c17ad94SBram Moolenaar return 'yes' 14634c17ad94SBram Moolenaar enddef 14644c17ad94SBram Moolenaar END 1465cfcd011fSBram Moolenaar var withno_lines =<< trim END 14664c17ad94SBram Moolenaar def FuncNo(): string 14674c17ad94SBram Moolenaar return 'no' 14684c17ad94SBram Moolenaar enddef 14694c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 14704c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 14714c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 147203afdcf1SBram Moolenaar enddef 147303afdcf1SBram Moolenaar END 1474cfcd011fSBram Moolenaar var nono_lines =<< trim END 147503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 147603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 147744d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 14784c17ad94SBram Moolenaar enddef 14794c17ad94SBram Moolenaar END 14804c17ad94SBram Moolenaar 14814c17ad94SBram Moolenaar # FuncNo() is defined 148203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14834c17ad94SBram Moolenaar source Xreloaded.vim 14844c17ad94SBram Moolenaar g:DoCheck(true) 14854c17ad94SBram Moolenaar 14864c17ad94SBram Moolenaar # FuncNo() is not redefined 148703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 14884c17ad94SBram Moolenaar source Xreloaded.vim 14895082471fSBram Moolenaar g:DoCheck(false) 14904c17ad94SBram Moolenaar 14914c17ad94SBram Moolenaar # FuncNo() is back 149203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14934c17ad94SBram Moolenaar source Xreloaded.vim 14945082471fSBram Moolenaar g:DoCheck(false) 14954c17ad94SBram Moolenaar 14964c17ad94SBram Moolenaar delete('Xreloaded.vim') 14974c17ad94SBram Moolenaarenddef 14984c17ad94SBram Moolenaar 149989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 150089483d40SBram Moolenaar # write the script with a script-local variable 1501cfcd011fSBram Moolenaar var lines =<< trim END 150289483d40SBram Moolenaar vim9script 1503cfcd011fSBram Moolenaar var name = 'string' 150489483d40SBram Moolenaar END 150589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 150689483d40SBram Moolenaar source XreloadVar.vim 150789483d40SBram Moolenaar 150889483d40SBram Moolenaar # now write the script using the same variable locally - works 150989483d40SBram Moolenaar lines =<< trim END 151089483d40SBram Moolenaar vim9script 151189483d40SBram Moolenaar def Func() 1512cfcd011fSBram Moolenaar var name = 'string' 151389483d40SBram Moolenaar enddef 151489483d40SBram Moolenaar END 151589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 151689483d40SBram Moolenaar source XreloadVar.vim 151789483d40SBram Moolenaar 151889483d40SBram Moolenaar delete('XreloadVar.vim') 151989483d40SBram Moolenaarenddef 152089483d40SBram Moolenaar 15218a7d6542SBram Moolenaardef Test_import_absolute() 1522cfcd011fSBram Moolenaar var import_lines = [ 1523e6085c53SBram Moolenaar 'vim9script', 1524e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1525e6085c53SBram Moolenaar 'def UseExported()', 1526e6085c53SBram Moolenaar ' g:imported_abs = exported', 1527e6085c53SBram Moolenaar ' exported = 8888', 1528e6085c53SBram Moolenaar ' g:imported_after = exported', 1529e6085c53SBram Moolenaar 'enddef', 1530e6085c53SBram Moolenaar 'UseExported()', 1531e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1532e6085c53SBram Moolenaar ] 15338a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15348a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15358a7d6542SBram Moolenaar 15368a7d6542SBram Moolenaar source Ximport_abs.vim 15378a7d6542SBram Moolenaar 15388a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15394e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1540fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1541fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1542fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1543fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1544fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1545fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1546fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1547fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1548fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1549fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1550e6085c53SBram Moolenaar g:import_disassembled) 1551b3ca9824SBram Moolenaar 1552b3ca9824SBram Moolenaar Undo_export_script_lines() 15538a7d6542SBram Moolenaar unlet g:imported_abs 15544e12a5dfSBram Moolenaar unlet g:import_disassembled 15558a7d6542SBram Moolenaar 15568a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15578a7d6542SBram Moolenaar delete('Xexport_abs.vim') 15588a7d6542SBram Moolenaarenddef 15598a7d6542SBram Moolenaar 15608a7d6542SBram Moolenaardef Test_import_rtp() 1561cfcd011fSBram Moolenaar var import_lines = [ 1562e6085c53SBram Moolenaar 'vim9script', 1563e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1564e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1565e6085c53SBram Moolenaar ] 15668a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 15678a7d6542SBram Moolenaar mkdir('import') 15688a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 15698a7d6542SBram Moolenaar 1570cfcd011fSBram Moolenaar var save_rtp = &rtp 15718a7d6542SBram Moolenaar &rtp = getcwd() 15728a7d6542SBram Moolenaar source Ximport_rtp.vim 15738a7d6542SBram Moolenaar &rtp = save_rtp 15748a7d6542SBram Moolenaar 15758a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 15768a7d6542SBram Moolenaar 1577b3ca9824SBram Moolenaar Undo_export_script_lines() 1578b3ca9824SBram Moolenaar unlet g:imported_rtp 15798a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 158089483d40SBram Moolenaar delete('import', 'rf') 15818a7d6542SBram Moolenaarenddef 15828a7d6542SBram Moolenaar 158325e0f586SBram Moolenaardef Test_import_compile_error() 1584cfcd011fSBram Moolenaar var export_lines = [ 158525e0f586SBram Moolenaar 'vim9script', 158625e0f586SBram Moolenaar 'export def ExpFunc(): string', 158725e0f586SBram Moolenaar ' return notDefined', 158825e0f586SBram Moolenaar 'enddef', 158925e0f586SBram Moolenaar ] 159025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 159125e0f586SBram Moolenaar 1592cfcd011fSBram Moolenaar var import_lines = [ 159325e0f586SBram Moolenaar 'vim9script', 159425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 159525e0f586SBram Moolenaar 'def ImpFunc()', 159625e0f586SBram Moolenaar ' echo ExpFunc()', 159725e0f586SBram Moolenaar 'enddef', 159825e0f586SBram Moolenaar 'defcompile', 159925e0f586SBram Moolenaar ] 160025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 160125e0f586SBram Moolenaar 160225e0f586SBram Moolenaar try 160325e0f586SBram Moolenaar source Ximport.vim 160425e0f586SBram Moolenaar catch /E1001/ 1605f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16067707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 160725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 160825e0f586SBram Moolenaar endtry 160925e0f586SBram Moolenaar 161025e0f586SBram Moolenaar delete('Xexported.vim') 161125e0f586SBram Moolenaar delete('Ximport.vim') 161225e0f586SBram Moolenaarenddef 161325e0f586SBram Moolenaar 1614c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1615cfcd011fSBram Moolenaar var lines = [ 1616c4ce36d4SBram Moolenaar 'vim9script', 1617c4ce36d4SBram Moolenaar 'def Func()', 1618c4ce36d4SBram Moolenaar ' eval [][0]', 1619c4ce36d4SBram Moolenaar 'enddef', 1620c4ce36d4SBram Moolenaar 'Func()', 1621c4ce36d4SBram Moolenaar ] 1622c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1623c4ce36d4SBram Moolenaar 1624c4ce36d4SBram Moolenaar for count in range(3) 1625c4ce36d4SBram Moolenaar try 1626c4ce36d4SBram Moolenaar source Xtestscript.vim 1627c4ce36d4SBram Moolenaar catch /E684/ 1628c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1629c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1630c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1631c4ce36d4SBram Moolenaar endtry 1632c4ce36d4SBram Moolenaar endfor 1633c4ce36d4SBram Moolenaar 1634c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1635c4ce36d4SBram Moolenaarenddef 1636c4ce36d4SBram Moolenaar 1637eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1638cfcd011fSBram Moolenaar var export_lines =<< trim END 1639eef2102eSBram Moolenaar vim9script 1640eef2102eSBram Moolenaar export def Func() 1641eef2102eSBram Moolenaar echo 'imported' 1642eef2102eSBram Moolenaar enddef 1643eef2102eSBram Moolenaar END 1644eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1645eef2102eSBram Moolenaar 1646cfcd011fSBram Moolenaar var lines =<< trim END 1647eef2102eSBram Moolenaar vim9script 1648eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1649eef2102eSBram Moolenaar def Func() 1650eef2102eSBram Moolenaar echo 'local to function' 1651eef2102eSBram Moolenaar enddef 1652eef2102eSBram Moolenaar END 1653eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1654eef2102eSBram Moolenaar 1655eef2102eSBram Moolenaar lines =<< trim END 1656eef2102eSBram Moolenaar vim9script 1657eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1658eef2102eSBram Moolenaar def Outer() 1659eef2102eSBram Moolenaar def Func() 1660eef2102eSBram Moolenaar echo 'local to function' 1661eef2102eSBram Moolenaar enddef 1662eef2102eSBram Moolenaar enddef 1663eef2102eSBram Moolenaar defcompile 1664eef2102eSBram Moolenaar END 1665eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1666eef2102eSBram Moolenaar 1667eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1668eef2102eSBram Moolenaarenddef 1669eef2102eSBram Moolenaar 1670b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1671cfcd011fSBram Moolenaar var lines =<< trim END 1672b9a2cac3SBram Moolenaar vim9script 1673b9a2cac3SBram Moolenaar def Func() 1674b9a2cac3SBram Moolenaar echo 'one' 1675b9a2cac3SBram Moolenaar enddef 1676b9a2cac3SBram Moolenaar def Func() 1677b9a2cac3SBram Moolenaar echo 'two' 1678b9a2cac3SBram Moolenaar enddef 1679b9a2cac3SBram Moolenaar END 1680b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1681fa211f3cSBram Moolenaar 1682fa211f3cSBram Moolenaar lines =<< trim END 1683fa211f3cSBram Moolenaar vim9script 1684fa211f3cSBram Moolenaar def Foo(): string 1685fa211f3cSBram Moolenaar return 'foo' 1686fa211f3cSBram Moolenaar enddef 1687fa211f3cSBram Moolenaar def Func() 1688cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1689fa211f3cSBram Moolenaar enddef 1690fa211f3cSBram Moolenaar defcompile 1691fa211f3cSBram Moolenaar END 1692fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1693b9a2cac3SBram Moolenaarenddef 1694b9a2cac3SBram Moolenaar 16958a7d6542SBram Moolenaardef Test_fixed_size_list() 1696f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1697cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 16988a7d6542SBram Moolenaar l->remove(0) 16998a7d6542SBram Moolenaar l->add(5) 17008a7d6542SBram Moolenaar l->insert(99, 1) 17010f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17028a7d6542SBram Moolenaarenddef 17038a7d6542SBram Moolenaar 1704ae616494SBram Moolenaardef Test_no_insert_xit() 1705d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1706d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1707d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1708d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1709d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1710ae616494SBram Moolenaar 1711ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1712ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1713ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1714ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1715f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1716f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1717f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1718f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1719f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1720ae616494SBram Moolenaarenddef 1721ae616494SBram Moolenaar 1722158906cfSBram Moolenaardef IfElse(what: number): string 1723cfcd011fSBram Moolenaar var res = '' 1724158906cfSBram Moolenaar if what == 1 1725158906cfSBram Moolenaar res = "one" 1726158906cfSBram Moolenaar elseif what == 2 1727158906cfSBram Moolenaar res = "two" 1728a259d8d3SBram Moolenaar else 1729158906cfSBram Moolenaar res = "three" 1730a259d8d3SBram Moolenaar endif 1731158906cfSBram Moolenaar return res 1732a259d8d3SBram Moolenaarenddef 1733a259d8d3SBram Moolenaar 1734158906cfSBram Moolenaardef Test_if_elseif_else() 1735158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1736158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1737158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17380f18b6d1SBram Moolenaarenddef 17390f18b6d1SBram Moolenaar 1740e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1741d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1742d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1743d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1744ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1745d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 17466628b7ebSBram Moolenaar 17476628b7ebSBram Moolenaar var lines =<< trim END 17486628b7ebSBram Moolenaar var s = '' 17496628b7ebSBram Moolenaar if s = '' 17506628b7ebSBram Moolenaar endif 17516628b7ebSBram Moolenaar END 17526628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 17536628b7ebSBram Moolenaar 17546628b7ebSBram Moolenaar lines =<< trim END 17556628b7ebSBram Moolenaar var s = '' 17566628b7ebSBram Moolenaar if s == '' 17576628b7ebSBram Moolenaar elseif s = '' 17586628b7ebSBram Moolenaar endif 17596628b7ebSBram Moolenaar END 17606628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1761e8c4abbbSBram Moolenaarenddef 1762e8c4abbbSBram Moolenaar 17636d69bf60SBram Moolenaarlet g:bool_true = v:true 17646d69bf60SBram Moolenaarlet g:bool_false = v:false 17656d69bf60SBram Moolenaar 17666d69bf60SBram Moolenaardef Test_if_const_expr() 1767cfcd011fSBram Moolenaar var res = false 17686d69bf60SBram Moolenaar if true ? true : false 17696d69bf60SBram Moolenaar res = true 17706d69bf60SBram Moolenaar endif 17716d69bf60SBram Moolenaar assert_equal(true, res) 17726d69bf60SBram Moolenaar 1773585fea7bSBram Moolenaar g:glob = 2 1774585fea7bSBram Moolenaar if false 17756797966dSBram Moolenaar execute('g:glob = 3') 1776585fea7bSBram Moolenaar endif 1777585fea7bSBram Moolenaar assert_equal(2, g:glob) 1778585fea7bSBram Moolenaar if true 17796797966dSBram Moolenaar execute('g:glob = 3') 1780585fea7bSBram Moolenaar endif 1781585fea7bSBram Moolenaar assert_equal(3, g:glob) 1782585fea7bSBram Moolenaar 17836d69bf60SBram Moolenaar res = false 17846d69bf60SBram Moolenaar if g:bool_true ? true : false 17856d69bf60SBram Moolenaar res = true 17866d69bf60SBram Moolenaar endif 17876d69bf60SBram Moolenaar assert_equal(true, res) 17886d69bf60SBram Moolenaar 17896d69bf60SBram Moolenaar res = false 17906d69bf60SBram Moolenaar if true ? g:bool_true : false 17916d69bf60SBram Moolenaar res = true 17926d69bf60SBram Moolenaar endif 17936d69bf60SBram Moolenaar assert_equal(true, res) 17946d69bf60SBram Moolenaar 17956d69bf60SBram Moolenaar res = false 17966d69bf60SBram Moolenaar if true ? true : g:bool_false 17976d69bf60SBram Moolenaar res = true 17986d69bf60SBram Moolenaar endif 17996d69bf60SBram Moolenaar assert_equal(true, res) 18006d69bf60SBram Moolenaar 18016d69bf60SBram Moolenaar res = false 18026d69bf60SBram Moolenaar if true ? false : true 18036d69bf60SBram Moolenaar res = true 18046d69bf60SBram Moolenaar endif 18056d69bf60SBram Moolenaar assert_equal(false, res) 18066d69bf60SBram Moolenaar 18076d69bf60SBram Moolenaar res = false 18086d69bf60SBram Moolenaar if false ? false : true 18096d69bf60SBram Moolenaar res = true 18106d69bf60SBram Moolenaar endif 18116d69bf60SBram Moolenaar assert_equal(true, res) 18126d69bf60SBram Moolenaar 18136d69bf60SBram Moolenaar res = false 18146d69bf60SBram Moolenaar if false ? true : false 18156d69bf60SBram Moolenaar res = true 18166d69bf60SBram Moolenaar endif 18176d69bf60SBram Moolenaar assert_equal(false, res) 18186d69bf60SBram Moolenaar 18196d69bf60SBram Moolenaar res = false 1820e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1821e8c4abbbSBram Moolenaar res = true 1822e8c4abbbSBram Moolenaar endif 1823e8c4abbbSBram Moolenaar assert_equal(false, res) 1824e8c4abbbSBram Moolenaar 1825e8c4abbbSBram Moolenaar res = false 18266d69bf60SBram Moolenaar if true && true 18276d69bf60SBram Moolenaar res = true 18286d69bf60SBram Moolenaar endif 18296d69bf60SBram Moolenaar assert_equal(true, res) 18306d69bf60SBram Moolenaar 18316d69bf60SBram Moolenaar res = false 18326d69bf60SBram Moolenaar if true && false 18336d69bf60SBram Moolenaar res = true 18346d69bf60SBram Moolenaar endif 18356d69bf60SBram Moolenaar assert_equal(false, res) 18366d69bf60SBram Moolenaar 18376d69bf60SBram Moolenaar res = false 18386d69bf60SBram Moolenaar if g:bool_true && false 18396d69bf60SBram Moolenaar res = true 18406d69bf60SBram Moolenaar endif 18416d69bf60SBram Moolenaar assert_equal(false, res) 18426d69bf60SBram Moolenaar 18436d69bf60SBram Moolenaar res = false 18446d69bf60SBram Moolenaar if true && g:bool_false 18456d69bf60SBram Moolenaar res = true 18466d69bf60SBram Moolenaar endif 18476d69bf60SBram Moolenaar assert_equal(false, res) 18486d69bf60SBram Moolenaar 18496d69bf60SBram Moolenaar res = false 18506d69bf60SBram Moolenaar if false && false 18516d69bf60SBram Moolenaar res = true 18526d69bf60SBram Moolenaar endif 18536d69bf60SBram Moolenaar assert_equal(false, res) 18546d69bf60SBram Moolenaar 18556d69bf60SBram Moolenaar res = false 18566d69bf60SBram Moolenaar if true || false 18576d69bf60SBram Moolenaar res = true 18586d69bf60SBram Moolenaar endif 18596d69bf60SBram Moolenaar assert_equal(true, res) 18606d69bf60SBram Moolenaar 18616d69bf60SBram Moolenaar res = false 18626d69bf60SBram Moolenaar if g:bool_true || false 18636d69bf60SBram Moolenaar res = true 18646d69bf60SBram Moolenaar endif 18656d69bf60SBram Moolenaar assert_equal(true, res) 18666d69bf60SBram Moolenaar 18676d69bf60SBram Moolenaar res = false 18686d69bf60SBram Moolenaar if true || g:bool_false 18696d69bf60SBram Moolenaar res = true 18706d69bf60SBram Moolenaar endif 18716d69bf60SBram Moolenaar assert_equal(true, res) 18726d69bf60SBram Moolenaar 18736d69bf60SBram Moolenaar res = false 18746d69bf60SBram Moolenaar if false || false 18756d69bf60SBram Moolenaar res = true 18766d69bf60SBram Moolenaar endif 18776d69bf60SBram Moolenaar assert_equal(false, res) 18783988f64fSBram Moolenaar 18793988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 18803988f64fSBram Moolenaar if false | eval 0 | endif 18813988f64fSBram Moolenaar if false | eval burp + 234 | endif 18823988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 18833988f64fSBram Moolenaar if false 18843988f64fSBram Moolenaar burp 18853988f64fSBram Moolenaar endif 188680c34ca3SBram Moolenaarenddef 18876d69bf60SBram Moolenaar 188880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1889d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1890d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1891d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1892d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 18936d69bf60SBram Moolenaarenddef 18946d69bf60SBram Moolenaar 189572abcf42SBram Moolenaardef RunNested(i: number): number 1896cfcd011fSBram Moolenaar var x: number = 0 189772abcf42SBram Moolenaar if i % 2 189872abcf42SBram Moolenaar if 1 1899f5be8cdbSBram Moolenaar # comment 190072abcf42SBram Moolenaar else 1901f5be8cdbSBram Moolenaar # comment 190272abcf42SBram Moolenaar endif 190372abcf42SBram Moolenaar x += 1 190472abcf42SBram Moolenaar else 190572abcf42SBram Moolenaar x += 1000 190672abcf42SBram Moolenaar endif 190772abcf42SBram Moolenaar return x 190872abcf42SBram Moolenaarenddef 190972abcf42SBram Moolenaar 191072abcf42SBram Moolenaardef Test_nested_if() 191172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 191272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 191372abcf42SBram Moolenaarenddef 191472abcf42SBram Moolenaar 1915ad39c094SBram Moolenaardef Test_execute_cmd() 1916e4984290SBram Moolenaar # missing argument is ignored 1917e4984290SBram Moolenaar execute 1918e4984290SBram Moolenaar execute # comment 1919e4984290SBram Moolenaar 1920ad39c094SBram Moolenaar new 1921ad39c094SBram Moolenaar setline(1, 'default') 1922d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1923ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1924a72cfb80SBram Moolenaar 1925d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1926a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1927a72cfb80SBram Moolenaar 1928cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1929cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1930a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1931ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1932a72cfb80SBram Moolenaar 1933d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1934ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1935a72cfb80SBram Moolenaar 1936cfcd011fSBram Moolenaar var cmd_first = 'call ' 1937cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1938ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1939ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1940ad39c094SBram Moolenaar bwipe! 1941585fea7bSBram Moolenaar 1942cfcd011fSBram Moolenaar var n = true 19432d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19442d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19452d6b20d6SBram Moolenaar 1946e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1947e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1948e5abf7afSBram Moolenaar 1949d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1950d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1951d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1952ad39c094SBram Moolenaarenddef 1953ad39c094SBram Moolenaar 195447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1955f5be8cdbSBram Moolenaar # only checks line continuation 1956cfcd011fSBram Moolenaar var lines =<< trim END 195747e880d6SBram Moolenaar vim9script 195847e880d6SBram Moolenaar execute 'g:someVar' 195947e880d6SBram Moolenaar .. ' = ' .. 196047e880d6SBram Moolenaar '28' 196147e880d6SBram Moolenaar assert_equal(28, g:someVar) 196247e880d6SBram Moolenaar unlet g:someVar 196347e880d6SBram Moolenaar END 196447e880d6SBram Moolenaar CheckScriptSuccess(lines) 196547e880d6SBram Moolenaarenddef 196647e880d6SBram Moolenaar 1967ad39c094SBram Moolenaardef Test_echo_cmd() 1968a72cfb80SBram Moolenaar echo 'some' # comment 1969585fea7bSBram Moolenaar echon 'thing' 1970ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1971ad39c094SBram Moolenaar 1972a72cfb80SBram Moolenaar echo "some" # comment 1973a72cfb80SBram Moolenaar echon "thing" 1974a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1975a72cfb80SBram Moolenaar 1976cfcd011fSBram Moolenaar var str1 = 'some' 1977cfcd011fSBram Moolenaar var str2 = 'more' 1978ad39c094SBram Moolenaar echo str1 str2 1979ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1980a72cfb80SBram Moolenaar 1981d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1982ad39c094SBram Moolenaarenddef 1983ad39c094SBram Moolenaar 1984f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1985f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1986f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1987f93c7feaSBram Moolenaar echo 'clear' 1988df069eecSBram Moolenaar :1messages 1989f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1990f93c7feaSBram Moolenaar 1991d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1992f93c7feaSBram Moolenaarenddef 1993f93c7feaSBram Moolenaar 199447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1995f5be8cdbSBram Moolenaar # only checks line continuation 1996cfcd011fSBram Moolenaar var lines =<< trim END 199747e880d6SBram Moolenaar vim9script 199847e880d6SBram Moolenaar echomsg 'here' 199947e880d6SBram Moolenaar .. ' is ' .. 200047e880d6SBram Moolenaar 'a message' 200147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 200247e880d6SBram Moolenaar END 200347e880d6SBram Moolenaar CheckScriptSuccess(lines) 200447e880d6SBram Moolenaarenddef 200547e880d6SBram Moolenaar 2006f93c7feaSBram Moolenaardef Test_echoerr_cmd() 200740ee466cSBram Moolenaar try 200840ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 200940ee466cSBram Moolenaar catch 201040ee466cSBram Moolenaar assert_match('something wrong', v:exception) 201140ee466cSBram Moolenaar endtry 2012f93c7feaSBram Moolenaarenddef 2013f93c7feaSBram Moolenaar 201447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2015f5be8cdbSBram Moolenaar # only checks line continuation 2016cfcd011fSBram Moolenaar var lines =<< trim END 201747e880d6SBram Moolenaar vim9script 201847e880d6SBram Moolenaar try 201947e880d6SBram Moolenaar echoerr 'this' 202047e880d6SBram Moolenaar .. ' is ' .. 202147e880d6SBram Moolenaar 'wrong' 202247e880d6SBram Moolenaar catch 202347e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 202447e880d6SBram Moolenaar endtry 202547e880d6SBram Moolenaar END 202647e880d6SBram Moolenaar CheckScriptSuccess(lines) 202747e880d6SBram Moolenaarenddef 202847e880d6SBram Moolenaar 202941fe0617SBram Moolenaardef Test_for_outside_of_function() 2030cfcd011fSBram Moolenaar var lines =<< trim END 203141fe0617SBram Moolenaar vim9script 203241fe0617SBram Moolenaar new 203341fe0617SBram Moolenaar for var in range(0, 3) 203441fe0617SBram Moolenaar append(line('$'), var) 203541fe0617SBram Moolenaar endfor 203641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 203741fe0617SBram Moolenaar bwipe! 203841fe0617SBram Moolenaar END 203941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 204041fe0617SBram Moolenaar source Xvim9for.vim 204141fe0617SBram Moolenaar delete('Xvim9for.vim') 204241fe0617SBram Moolenaarenddef 20438a7d6542SBram Moolenaar 2044e8c4abbbSBram Moolenaardef Test_for_loop() 2045cfcd011fSBram Moolenaar var result = '' 2046e8c4abbbSBram Moolenaar for cnt in range(7) 2047e8c4abbbSBram Moolenaar if cnt == 4 2048e8c4abbbSBram Moolenaar break 2049e8c4abbbSBram Moolenaar endif 2050e8c4abbbSBram Moolenaar if cnt == 2 2051e8c4abbbSBram Moolenaar continue 2052e8c4abbbSBram Moolenaar endif 2053e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2054e8c4abbbSBram Moolenaar endfor 2055e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20560ad3e894SBram Moolenaar 2057cfcd011fSBram Moolenaar var concat = '' 20580ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20590ad3e894SBram Moolenaar concat ..= str 20600ad3e894SBram Moolenaar endfor 20610ad3e894SBram Moolenaar assert_equal('onetwo', concat) 206238bd8de5SBram Moolenaar 206338bd8de5SBram Moolenaar var total = 0 206438bd8de5SBram Moolenaar for nr in 206538bd8de5SBram Moolenaar [1, 2, 3] 206638bd8de5SBram Moolenaar total += nr 206738bd8de5SBram Moolenaar endfor 206838bd8de5SBram Moolenaar assert_equal(6, total) 206938bd8de5SBram Moolenaar 207038bd8de5SBram Moolenaar total = 0 207138bd8de5SBram Moolenaar for nr 207238bd8de5SBram Moolenaar in [1, 2, 3] 207338bd8de5SBram Moolenaar total += nr 207438bd8de5SBram Moolenaar endfor 207538bd8de5SBram Moolenaar assert_equal(6, total) 207638bd8de5SBram Moolenaar 207738bd8de5SBram Moolenaar total = 0 207838bd8de5SBram Moolenaar for nr 207938bd8de5SBram Moolenaar in 208038bd8de5SBram Moolenaar [1, 2, 3] 208138bd8de5SBram Moolenaar total += nr 208238bd8de5SBram Moolenaar endfor 208338bd8de5SBram Moolenaar assert_equal(6, total) 2084036d0714SBram Moolenaar 2085036d0714SBram Moolenaar var res = "" 2086036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2087036d0714SBram Moolenaar res ..= n .. s 2088036d0714SBram Moolenaar endfor 2089036d0714SBram Moolenaar assert_equal('1a2b', res) 2090e8c4abbbSBram Moolenaarenddef 2091e8c4abbbSBram Moolenaar 2092e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2093025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2094025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2095025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2096675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2097675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2098cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2099822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21002d870f8dSBram Moolenaar delfunc! g:Func 2101451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2102675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2103675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2104675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2105e8c4abbbSBram Moolenaarenddef 2106e8c4abbbSBram Moolenaar 2107ea87069dSBram Moolenaardef Test_for_loop_script_var() 2108ea87069dSBram Moolenaar # cannot use s:var in a :def function 2109ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2110ea87069dSBram Moolenaar 2111ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2112ea87069dSBram Moolenaar var lines =<< trim END 2113ea87069dSBram Moolenaar vim9script 2114ea87069dSBram Moolenaar var total = 0 2115ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2116ea87069dSBram Moolenaar total += s:var 2117ea87069dSBram Moolenaar endfor 2118ea87069dSBram Moolenaar assert_equal(6, total) 2119ea87069dSBram Moolenaar 2120ea87069dSBram Moolenaar total = 0 2121ea87069dSBram Moolenaar for var in [1, 2, 3] 2122ea87069dSBram Moolenaar total += var 2123ea87069dSBram Moolenaar endfor 2124ea87069dSBram Moolenaar assert_equal(6, total) 2125ea87069dSBram Moolenaar END 2126ea87069dSBram Moolenaarenddef 2127ea87069dSBram Moolenaar 2128792f786aSBram Moolenaardef Test_for_loop_unpack() 21294b8a0651SBram Moolenaar var lines =<< trim END 2130792f786aSBram Moolenaar var result = [] 2131792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2132792f786aSBram Moolenaar result->add(v1) 2133792f786aSBram Moolenaar result->add(v2) 2134792f786aSBram Moolenaar endfor 2135792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2136792f786aSBram Moolenaar 2137792f786aSBram Moolenaar result = [] 2138792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2139792f786aSBram Moolenaar result->add(v1) 2140792f786aSBram Moolenaar result->add(v2) 2141792f786aSBram Moolenaar result->add(v3) 2142792f786aSBram Moolenaar endfor 2143792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2144792f786aSBram Moolenaar 21454b8a0651SBram Moolenaar result = [] 21464b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 21474b8a0651SBram Moolenaar result->add(&ts) 21484b8a0651SBram Moolenaar result->add(&sw) 21494b8a0651SBram Moolenaar endfor 21504b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 21514b8a0651SBram Moolenaar 21524b8a0651SBram Moolenaar var slist: list<string> 21534b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 21544b8a0651SBram Moolenaar slist->add($LOOPVAR) 21554b8a0651SBram Moolenaar slist->add(@r) 21564b8a0651SBram Moolenaar slist->add(v:errmsg) 21574b8a0651SBram Moolenaar endfor 21584b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 21594b8a0651SBram Moolenaar 21604b8a0651SBram Moolenaar slist = [] 21614b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 21624b8a0651SBram Moolenaar slist->add(g:globalvar) 21634b8a0651SBram Moolenaar slist->add(b:bufvar) 21644b8a0651SBram Moolenaar slist->add(w:winvar) 21654b8a0651SBram Moolenaar slist->add(t:tabvar) 21664b8a0651SBram Moolenaar endfor 21674b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2168f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 21694b8a0651SBram Moolenaar END 21704b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 21714b8a0651SBram Moolenaar 21724b8a0651SBram Moolenaar lines =<< trim END 2173792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2174792f786aSBram Moolenaar echo v1 v2 2175792f786aSBram Moolenaar endfor 2176792f786aSBram Moolenaar END 2177792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2178792f786aSBram Moolenaar 2179792f786aSBram Moolenaar lines =<< trim END 2180792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2181792f786aSBram Moolenaar echo v1 v2 2182792f786aSBram Moolenaar endfor 2183792f786aSBram Moolenaar END 2184792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2185792f786aSBram Moolenaar 2186792f786aSBram Moolenaar lines =<< trim END 2187792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2188792f786aSBram Moolenaar echo v1 2189792f786aSBram Moolenaar endfor 2190792f786aSBram Moolenaar END 2191792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2192792f786aSBram Moolenaarenddef 2193792f786aSBram Moolenaar 2194d0df1aacSBram Moolenaardef Test_while_loop() 2195cfcd011fSBram Moolenaar var result = '' 2196cfcd011fSBram Moolenaar var cnt = 0 2197d0df1aacSBram Moolenaar while cnt < 555 2198d0df1aacSBram Moolenaar if cnt == 3 2199d0df1aacSBram Moolenaar break 2200d0df1aacSBram Moolenaar endif 2201d0df1aacSBram Moolenaar cnt += 1 2202d0df1aacSBram Moolenaar if cnt == 2 2203d0df1aacSBram Moolenaar continue 2204d0df1aacSBram Moolenaar endif 2205d0df1aacSBram Moolenaar result ..= cnt .. '_' 2206d0df1aacSBram Moolenaar endwhile 2207d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2208*dee37dc7SBram Moolenaar 2209*dee37dc7SBram Moolenaar var s = '' 2210*dee37dc7SBram Moolenaar while s == 'x' #{comment 2211*dee37dc7SBram Moolenaar endwhile 2212d0df1aacSBram Moolenaarenddef 2213d0df1aacSBram Moolenaar 2214e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2215675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2216675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2217675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2218675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2219675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2220675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2221675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 22226628b7ebSBram Moolenaar 22236628b7ebSBram Moolenaar var lines =<< trim END 22246628b7ebSBram Moolenaar var s = '' 22256628b7ebSBram Moolenaar while s = '' 22266628b7ebSBram Moolenaar endwhile 22276628b7ebSBram Moolenaar END 22286628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2229bd5da371SBram Moolenaarenddef 2230bd5da371SBram Moolenaar 22319645e2d9SBram Moolenaardef Test_interrupt_loop() 2232cfcd011fSBram Moolenaar var caught = false 2233cfcd011fSBram Moolenaar var x = 0 223497acfc78SBram Moolenaar try 22359645e2d9SBram Moolenaar while 1 22369645e2d9SBram Moolenaar x += 1 22379645e2d9SBram Moolenaar if x == 100 22389645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22399645e2d9SBram Moolenaar endif 22409645e2d9SBram Moolenaar endwhile 224197acfc78SBram Moolenaar catch 224297acfc78SBram Moolenaar caught = true 224397acfc78SBram Moolenaar assert_equal(100, x) 224497acfc78SBram Moolenaar endtry 224597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 224625859dd7SBram Moolenaar # consume the CTRL-C 224725859dd7SBram Moolenaar getchar(0) 22489645e2d9SBram Moolenaarenddef 224920431c9dSBram Moolenaar 22504fdae999SBram Moolenaardef Test_automatic_line_continuation() 2251cfcd011fSBram Moolenaar var mylist = [ 22524fdae999SBram Moolenaar 'one', 22534fdae999SBram Moolenaar 'two', 22544fdae999SBram Moolenaar 'three', 2255f5be8cdbSBram Moolenaar ] # comment 22564fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22574fdae999SBram Moolenaar 2258cfcd011fSBram Moolenaar var mydict = { 2259e0de171eSBram Moolenaar ['one']: 1, 2260e0de171eSBram Moolenaar ['two']: 2, 2261e0de171eSBram Moolenaar ['three']: 22624fdae999SBram Moolenaar 3, 2263f5be8cdbSBram Moolenaar } # comment 2264e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2265e0de171eSBram Moolenaar mydict = { 22662c330432SBram Moolenaar one: 1, # comment 22672c330432SBram Moolenaar two: # comment 22682c330432SBram Moolenaar 2, # comment 22692c330432SBram Moolenaar three: 3 # comment 22702c330432SBram Moolenaar } 2271e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2272e0de171eSBram Moolenaar mydict = { 22732c330432SBram Moolenaar one: 1, 22744fdae999SBram Moolenaar two: 22754fdae999SBram Moolenaar 2, 22762c330432SBram Moolenaar three: 3 22774fdae999SBram Moolenaar } 2278e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2279e6085c53SBram Moolenaar 2280e6085c53SBram Moolenaar assert_equal( 2281e6085c53SBram Moolenaar ['one', 'two', 'three'], 2282e6085c53SBram Moolenaar split('one two three') 2283e6085c53SBram Moolenaar ) 22844fdae999SBram Moolenaarenddef 22854fdae999SBram Moolenaar 22867a092245SBram Moolenaardef Test_vim9_comment() 22877a092245SBram Moolenaar CheckScriptSuccess([ 22887a092245SBram Moolenaar 'vim9script', 22897a092245SBram Moolenaar '# something', 229093f82cbeSBram Moolenaar '#something', 229193f82cbeSBram Moolenaar '#{something', 22927a092245SBram Moolenaar ]) 229393f82cbeSBram Moolenaar 229493f82cbeSBram Moolenaar split Xfile 229593f82cbeSBram Moolenaar CheckScriptSuccess([ 229693f82cbeSBram Moolenaar 'vim9script', 229793f82cbeSBram Moolenaar 'edit #something', 229893f82cbeSBram Moolenaar ]) 229993f82cbeSBram Moolenaar CheckScriptSuccess([ 230093f82cbeSBram Moolenaar 'vim9script', 230193f82cbeSBram Moolenaar 'edit #{something', 230293f82cbeSBram Moolenaar ]) 230393f82cbeSBram Moolenaar close 230493f82cbeSBram Moolenaar 23057a092245SBram Moolenaar CheckScriptFailure([ 23067a092245SBram Moolenaar 'vim9script', 23077a092245SBram Moolenaar ':# something', 23087a092245SBram Moolenaar ], 'E488:') 23097a092245SBram Moolenaar CheckScriptFailure([ 23107a092245SBram Moolenaar '# something', 23117a092245SBram Moolenaar ], 'E488:') 23127a092245SBram Moolenaar CheckScriptFailure([ 23137a092245SBram Moolenaar ':# something', 23147a092245SBram Moolenaar ], 'E488:') 23157a092245SBram Moolenaar 23164a8d9f2eSBram Moolenaar { # block start 23174a8d9f2eSBram Moolenaar } # block end 23184a8d9f2eSBram Moolenaar CheckDefFailure([ 23194a8d9f2eSBram Moolenaar '{# comment', 23204a8d9f2eSBram Moolenaar ], 'E488:') 23214a8d9f2eSBram Moolenaar CheckDefFailure([ 23224a8d9f2eSBram Moolenaar '{', 23234a8d9f2eSBram Moolenaar '}# comment', 23244a8d9f2eSBram Moolenaar ], 'E488:') 23254a8d9f2eSBram Moolenaar 23264a8d9f2eSBram Moolenaar echo "yes" # comment 23274a8d9f2eSBram Moolenaar CheckDefFailure([ 23284a8d9f2eSBram Moolenaar 'echo "yes"# comment', 23294a8d9f2eSBram Moolenaar ], 'E488:') 23307a092245SBram Moolenaar CheckScriptSuccess([ 23317a092245SBram Moolenaar 'vim9script', 23327a092245SBram Moolenaar 'echo "yes" # something', 23337a092245SBram Moolenaar ]) 23347a092245SBram Moolenaar CheckScriptFailure([ 23357a092245SBram Moolenaar 'vim9script', 23367a092245SBram Moolenaar 'echo "yes"# something', 23377a092245SBram Moolenaar ], 'E121:') 23387a092245SBram Moolenaar CheckScriptFailure([ 23397a092245SBram Moolenaar 'vim9script', 23407a092245SBram Moolenaar 'echo# something', 2341f8103f27SBram Moolenaar ], 'E1144:') 23427a092245SBram Moolenaar CheckScriptFailure([ 23437a092245SBram Moolenaar 'echo "yes" # something', 23447a092245SBram Moolenaar ], 'E121:') 23457a092245SBram Moolenaar 23464a8d9f2eSBram Moolenaar exe "echo" # comment 23474a8d9f2eSBram Moolenaar CheckDefFailure([ 23484a8d9f2eSBram Moolenaar 'exe "echo"# comment', 23494a8d9f2eSBram Moolenaar ], 'E488:') 23504a8d9f2eSBram Moolenaar CheckScriptSuccess([ 23514a8d9f2eSBram Moolenaar 'vim9script', 23524a8d9f2eSBram Moolenaar 'exe "echo" # something', 23534a8d9f2eSBram Moolenaar ]) 23544a8d9f2eSBram Moolenaar CheckScriptFailure([ 23554a8d9f2eSBram Moolenaar 'vim9script', 23564a8d9f2eSBram Moolenaar 'exe "echo"# something', 23574a8d9f2eSBram Moolenaar ], 'E121:') 23584a8d9f2eSBram Moolenaar CheckScriptFailure([ 23594a8d9f2eSBram Moolenaar 'vim9script', 23604a8d9f2eSBram Moolenaar 'exe# something', 2361f8103f27SBram Moolenaar ], 'E1144:') 23624a8d9f2eSBram Moolenaar CheckScriptFailure([ 23634a8d9f2eSBram Moolenaar 'exe "echo" # something', 23644a8d9f2eSBram Moolenaar ], 'E121:') 23654a8d9f2eSBram Moolenaar 23667a092245SBram Moolenaar CheckDefFailure([ 23677a092245SBram Moolenaar 'try# comment', 23687a092245SBram Moolenaar ' echo "yes"', 23697a092245SBram Moolenaar 'catch', 23707a092245SBram Moolenaar 'endtry', 2371f8103f27SBram Moolenaar ], 'E1144:') 23722c5ed4e3SBram Moolenaar CheckScriptFailure([ 23732c5ed4e3SBram Moolenaar 'vim9script', 23742c5ed4e3SBram Moolenaar 'try# comment', 23752c5ed4e3SBram Moolenaar 'echo "yes"', 2376f8103f27SBram Moolenaar ], 'E1144:') 23777a092245SBram Moolenaar CheckDefFailure([ 23787a092245SBram Moolenaar 'try', 2379a72cfb80SBram Moolenaar ' throw#comment', 2380a72cfb80SBram Moolenaar 'catch', 2381a72cfb80SBram Moolenaar 'endtry', 2382f8103f27SBram Moolenaar ], 'E1144:') 2383a72cfb80SBram Moolenaar CheckDefFailure([ 2384a72cfb80SBram Moolenaar 'try', 2385a72cfb80SBram Moolenaar ' throw "yes"#comment', 2386a72cfb80SBram Moolenaar 'catch', 2387a72cfb80SBram Moolenaar 'endtry', 2388a72cfb80SBram Moolenaar ], 'E488:') 2389a72cfb80SBram Moolenaar CheckDefFailure([ 2390a72cfb80SBram Moolenaar 'try', 23917a092245SBram Moolenaar ' echo "yes"', 23927a092245SBram Moolenaar 'catch# comment', 23937a092245SBram Moolenaar 'endtry', 2394f8103f27SBram Moolenaar ], 'E1144:') 23952c5ed4e3SBram Moolenaar CheckScriptFailure([ 23962c5ed4e3SBram Moolenaar 'vim9script', 23972c5ed4e3SBram Moolenaar 'try', 23982c5ed4e3SBram Moolenaar ' echo "yes"', 23992c5ed4e3SBram Moolenaar 'catch# comment', 24002c5ed4e3SBram Moolenaar 'endtry', 2401f8103f27SBram Moolenaar ], 'E1144:') 24022c5ed4e3SBram Moolenaar CheckDefFailure([ 24032c5ed4e3SBram Moolenaar 'try', 24042c5ed4e3SBram Moolenaar ' echo "yes"', 24052c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24062c5ed4e3SBram Moolenaar 'endtry', 24072c5ed4e3SBram Moolenaar ], 'E488:') 24087a092245SBram Moolenaar CheckDefFailure([ 24097a092245SBram Moolenaar 'try', 24107a092245SBram Moolenaar 'echo "yes"', 24117a092245SBram Moolenaar 'catch', 24127a092245SBram Moolenaar 'endtry# comment', 2413f8103f27SBram Moolenaar ], 'E1144:') 24142c5ed4e3SBram Moolenaar CheckScriptFailure([ 24152c5ed4e3SBram Moolenaar 'vim9script', 24162c5ed4e3SBram Moolenaar 'try', 24172c5ed4e3SBram Moolenaar ' echo "yes"', 24182c5ed4e3SBram Moolenaar 'catch', 24192c5ed4e3SBram Moolenaar 'endtry# comment', 2420f8103f27SBram Moolenaar ], 'E1144:') 24212c5ed4e3SBram Moolenaar 24222c5ed4e3SBram Moolenaar CheckScriptSuccess([ 24232c5ed4e3SBram Moolenaar 'vim9script', 24242c5ed4e3SBram Moolenaar 'hi # comment', 24252c5ed4e3SBram Moolenaar ]) 24262c5ed4e3SBram Moolenaar CheckScriptFailure([ 24272c5ed4e3SBram Moolenaar 'vim9script', 24282c5ed4e3SBram Moolenaar 'hi# comment', 2429f8103f27SBram Moolenaar ], 'E1144:') 24301966c248SBram Moolenaar CheckScriptSuccess([ 24311966c248SBram Moolenaar 'vim9script', 24321966c248SBram Moolenaar 'hi Search # comment', 24331966c248SBram Moolenaar ]) 24341966c248SBram Moolenaar CheckScriptFailure([ 24351966c248SBram Moolenaar 'vim9script', 24361966c248SBram Moolenaar 'hi Search# comment', 24371966c248SBram Moolenaar ], 'E416:') 24381966c248SBram Moolenaar CheckScriptSuccess([ 24391966c248SBram Moolenaar 'vim9script', 24401966c248SBram Moolenaar 'hi link This Search # comment', 24411966c248SBram Moolenaar ]) 24421966c248SBram Moolenaar CheckScriptFailure([ 24431966c248SBram Moolenaar 'vim9script', 24441966c248SBram Moolenaar 'hi link This That# comment', 24451966c248SBram Moolenaar ], 'E413:') 24461966c248SBram Moolenaar CheckScriptSuccess([ 24471966c248SBram Moolenaar 'vim9script', 24481966c248SBram Moolenaar 'hi clear This # comment', 24491966c248SBram Moolenaar 'hi clear # comment', 24501966c248SBram Moolenaar ]) 2451f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2452f5be8cdbSBram Moolenaar # hi clear This# comment', 24531966c248SBram Moolenaar CheckScriptFailure([ 24541966c248SBram Moolenaar 'vim9script', 24551966c248SBram Moolenaar 'hi clear# comment', 24561966c248SBram Moolenaar ], 'E416:') 24571966c248SBram Moolenaar 24581966c248SBram Moolenaar CheckScriptSuccess([ 24591966c248SBram Moolenaar 'vim9script', 24601966c248SBram Moolenaar 'hi Group term=bold', 24611966c248SBram Moolenaar 'match Group /todo/ # comment', 24621966c248SBram Moolenaar ]) 24631966c248SBram Moolenaar CheckScriptFailure([ 24641966c248SBram Moolenaar 'vim9script', 24651966c248SBram Moolenaar 'hi Group term=bold', 24661966c248SBram Moolenaar 'match Group /todo/# comment', 24671966c248SBram Moolenaar ], 'E488:') 24681966c248SBram Moolenaar CheckScriptSuccess([ 24691966c248SBram Moolenaar 'vim9script', 24701966c248SBram Moolenaar 'match # comment', 24711966c248SBram Moolenaar ]) 24721966c248SBram Moolenaar CheckScriptFailure([ 24731966c248SBram Moolenaar 'vim9script', 24741966c248SBram Moolenaar 'match# comment', 2475f8103f27SBram Moolenaar ], 'E1144:') 24761966c248SBram Moolenaar CheckScriptSuccess([ 24771966c248SBram Moolenaar 'vim9script', 24781966c248SBram Moolenaar 'match none # comment', 24791966c248SBram Moolenaar ]) 24801966c248SBram Moolenaar CheckScriptFailure([ 24811966c248SBram Moolenaar 'vim9script', 24821966c248SBram Moolenaar 'match none# comment', 24831966c248SBram Moolenaar ], 'E475:') 24841966c248SBram Moolenaar 24851966c248SBram Moolenaar CheckScriptSuccess([ 24861966c248SBram Moolenaar 'vim9script', 24871966c248SBram Moolenaar 'menutrans clear # comment', 24881966c248SBram Moolenaar ]) 24891966c248SBram Moolenaar CheckScriptFailure([ 24901966c248SBram Moolenaar 'vim9script', 24911966c248SBram Moolenaar 'menutrans clear# comment text', 24921966c248SBram Moolenaar ], 'E474:') 24931966c248SBram Moolenaar 24941966c248SBram Moolenaar CheckScriptSuccess([ 24951966c248SBram Moolenaar 'vim9script', 24961966c248SBram Moolenaar 'syntax clear # comment', 24971966c248SBram Moolenaar ]) 24981966c248SBram Moolenaar CheckScriptFailure([ 24991966c248SBram Moolenaar 'vim9script', 25001966c248SBram Moolenaar 'syntax clear# comment text', 25011966c248SBram Moolenaar ], 'E28:') 25021966c248SBram Moolenaar CheckScriptSuccess([ 25031966c248SBram Moolenaar 'vim9script', 25041966c248SBram Moolenaar 'syntax keyword Word some', 25051966c248SBram Moolenaar 'syntax clear Word # comment', 25061966c248SBram Moolenaar ]) 25071966c248SBram Moolenaar CheckScriptFailure([ 25081966c248SBram Moolenaar 'vim9script', 25091966c248SBram Moolenaar 'syntax keyword Word some', 25101966c248SBram Moolenaar 'syntax clear Word# comment text', 25111966c248SBram Moolenaar ], 'E28:') 25121966c248SBram Moolenaar 25131966c248SBram Moolenaar CheckScriptSuccess([ 25141966c248SBram Moolenaar 'vim9script', 25151966c248SBram Moolenaar 'syntax list # comment', 25161966c248SBram Moolenaar ]) 25171966c248SBram Moolenaar CheckScriptFailure([ 25181966c248SBram Moolenaar 'vim9script', 25191966c248SBram Moolenaar 'syntax list# comment text', 25201966c248SBram Moolenaar ], 'E28:') 25211966c248SBram Moolenaar 25221966c248SBram Moolenaar CheckScriptSuccess([ 25231966c248SBram Moolenaar 'vim9script', 25241966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 25251966c248SBram Moolenaar ]) 25261966c248SBram Moolenaar CheckScriptFailure([ 25271966c248SBram Moolenaar 'vim9script', 25281966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 25291966c248SBram Moolenaar ], 'E475:') 25301966c248SBram Moolenaar 25311966c248SBram Moolenaar CheckScriptSuccess([ 25321966c248SBram Moolenaar 'vim9script', 25331966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 25341966c248SBram Moolenaar ]) 25351966c248SBram Moolenaar CheckScriptFailure([ 25361966c248SBram Moolenaar 'vim9script', 25371966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25381966c248SBram Moolenaar ], 'E789:') 25391966c248SBram Moolenaar 25401966c248SBram Moolenaar CheckScriptSuccess([ 25411966c248SBram Moolenaar 'vim9script', 25421966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 25431966c248SBram Moolenaar ]) 25441966c248SBram Moolenaar CheckScriptFailure([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'syntax match Word /pat/# comment', 25471966c248SBram Moolenaar ], 'E402:') 25481966c248SBram Moolenaar 25491966c248SBram Moolenaar CheckScriptSuccess([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25521966c248SBram Moolenaar ]) 25531966c248SBram Moolenaar CheckScriptFailure([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25561966c248SBram Moolenaar ], 'E475:') 25571966c248SBram Moolenaar CheckScriptFailure([ 25581966c248SBram Moolenaar 'vim9script', 25591966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25601966c248SBram Moolenaar ], 'E406:') 25611966c248SBram Moolenaar CheckScriptFailure([ 25621966c248SBram Moolenaar 'vim9script', 25631966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25641966c248SBram Moolenaar ], 'E475:') 25651966c248SBram Moolenaar 25661966c248SBram Moolenaar CheckScriptSuccess([ 25671966c248SBram Moolenaar 'vim9script', 25681966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25691966c248SBram Moolenaar ]) 25701966c248SBram Moolenaar CheckScriptFailure([ 25711966c248SBram Moolenaar 'vim9script', 25721966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2573d032f34aSBram Moolenaar ], 'E402:') 25741966c248SBram Moolenaar 25751966c248SBram Moolenaar CheckScriptSuccess([ 25761966c248SBram Moolenaar 'vim9script', 25771966c248SBram Moolenaar 'syntax sync # comment', 25781966c248SBram Moolenaar ]) 25791966c248SBram Moolenaar CheckScriptFailure([ 25801966c248SBram Moolenaar 'vim9script', 25811966c248SBram Moolenaar 'syntax sync# comment', 25821966c248SBram Moolenaar ], 'E404:') 25831966c248SBram Moolenaar CheckScriptSuccess([ 25841966c248SBram Moolenaar 'vim9script', 25851966c248SBram Moolenaar 'syntax sync ccomment # comment', 25861966c248SBram Moolenaar ]) 25871966c248SBram Moolenaar CheckScriptFailure([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'syntax sync ccomment# comment', 25901966c248SBram Moolenaar ], 'E404:') 25911966c248SBram Moolenaar 25921966c248SBram Moolenaar CheckScriptSuccess([ 25931966c248SBram Moolenaar 'vim9script', 25941966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25951966c248SBram Moolenaar ]) 25961966c248SBram Moolenaar CheckScriptFailure([ 25971966c248SBram Moolenaar 'vim9script', 25981966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25991966c248SBram Moolenaar ], 'E475:') 2600a72cfb80SBram Moolenaar 2601a72cfb80SBram Moolenaar CheckScriptSuccess([ 2602a72cfb80SBram Moolenaar 'vim9script', 2603a72cfb80SBram Moolenaar 'command Echo echo # comment', 2604a72cfb80SBram Moolenaar 'command Echo # comment', 26052d870f8dSBram Moolenaar 'delcommand Echo', 2606a72cfb80SBram Moolenaar ]) 2607a72cfb80SBram Moolenaar CheckScriptFailure([ 2608a72cfb80SBram Moolenaar 'vim9script', 2609a72cfb80SBram Moolenaar 'command Echo echo# comment', 2610a72cfb80SBram Moolenaar 'Echo', 2611f8103f27SBram Moolenaar ], 'E1144:') 26122d870f8dSBram Moolenaar delcommand Echo 261370249ee8SBram Moolenaar 261470249ee8SBram Moolenaar var curdir = getcwd() 261570249ee8SBram Moolenaar CheckScriptSuccess([ 261670249ee8SBram Moolenaar 'command Echo cd " comment', 261770249ee8SBram Moolenaar 'Echo', 261870249ee8SBram Moolenaar 'delcommand Echo', 261970249ee8SBram Moolenaar ]) 262070249ee8SBram Moolenaar CheckScriptSuccess([ 2621090728adSBram Moolenaar 'vim9script', 262270249ee8SBram Moolenaar 'command Echo cd # comment', 262370249ee8SBram Moolenaar 'Echo', 262470249ee8SBram Moolenaar 'delcommand Echo', 262570249ee8SBram Moolenaar ]) 262670249ee8SBram Moolenaar CheckScriptFailure([ 262770249ee8SBram Moolenaar 'vim9script', 262870249ee8SBram Moolenaar 'command Echo cd " comment', 262970249ee8SBram Moolenaar 'Echo', 263070249ee8SBram Moolenaar ], 'E344:') 263170249ee8SBram Moolenaar delcommand Echo 263270249ee8SBram Moolenaar chdir(curdir) 263370249ee8SBram Moolenaar 2634a72cfb80SBram Moolenaar CheckScriptFailure([ 2635a72cfb80SBram Moolenaar 'vim9script', 2636a72cfb80SBram Moolenaar 'command Echo# comment', 2637a72cfb80SBram Moolenaar ], 'E182:') 2638a72cfb80SBram Moolenaar CheckScriptFailure([ 2639a72cfb80SBram Moolenaar 'vim9script', 2640a72cfb80SBram Moolenaar 'command Echo echo', 2641a72cfb80SBram Moolenaar 'command Echo# comment', 2642a72cfb80SBram Moolenaar ], 'E182:') 26432d870f8dSBram Moolenaar delcommand Echo 2644a72cfb80SBram Moolenaar 2645a72cfb80SBram Moolenaar CheckScriptSuccess([ 2646a72cfb80SBram Moolenaar 'vim9script', 2647a72cfb80SBram Moolenaar 'function # comment', 2648a72cfb80SBram Moolenaar ]) 2649a72cfb80SBram Moolenaar CheckScriptFailure([ 2650a72cfb80SBram Moolenaar 'vim9script', 26519898107fSBram Moolenaar 'function " comment', 26529898107fSBram Moolenaar ], 'E129:') 26539898107fSBram Moolenaar CheckScriptFailure([ 26549898107fSBram Moolenaar 'vim9script', 2655a72cfb80SBram Moolenaar 'function# comment', 2656f8103f27SBram Moolenaar ], 'E1144:') 2657a72cfb80SBram Moolenaar CheckScriptSuccess([ 2658a72cfb80SBram Moolenaar 'vim9script', 2659a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2660a72cfb80SBram Moolenaar ]) 2661a72cfb80SBram Moolenaar CheckScriptFailure([ 2662a72cfb80SBram Moolenaar 'vim9script', 2663a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2664a72cfb80SBram Moolenaar ], 'E488:') 2665a72cfb80SBram Moolenaar 2666a72cfb80SBram Moolenaar CheckScriptSuccess([ 2667a72cfb80SBram Moolenaar 'vim9script', 26684c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2669a72cfb80SBram Moolenaar 'endfunc', 26704c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2671a72cfb80SBram Moolenaar ]) 2672a72cfb80SBram Moolenaar CheckScriptFailure([ 2673a72cfb80SBram Moolenaar 'vim9script', 26744c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2675a72cfb80SBram Moolenaar 'endfunc', 26764c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2677a72cfb80SBram Moolenaar ], 'E488:') 2678a72cfb80SBram Moolenaar 2679a72cfb80SBram Moolenaar CheckScriptSuccess([ 2680a72cfb80SBram Moolenaar 'vim9script', 2681a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2682a72cfb80SBram Moolenaar ]) 2683a72cfb80SBram Moolenaar CheckScriptFailure([ 2684a72cfb80SBram Moolenaar 'vim9script', 2685a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2686a72cfb80SBram Moolenaar ], 'E488:') 2687e7e4838fSBram Moolenaar 2688e7e4838fSBram Moolenaar CheckScriptFailure([ 2689e7e4838fSBram Moolenaar 'def Test() " comment', 2690e7e4838fSBram Moolenaar 'enddef', 2691e7e4838fSBram Moolenaar ], 'E488:') 2692e7e4838fSBram Moolenaar CheckScriptFailure([ 2693e7e4838fSBram Moolenaar 'vim9script', 2694e7e4838fSBram Moolenaar 'def Test() " comment', 2695e7e4838fSBram Moolenaar 'enddef', 2696e7e4838fSBram Moolenaar ], 'E488:') 2697e7e4838fSBram Moolenaar 2698e7e4838fSBram Moolenaar CheckScriptSuccess([ 2699e7e4838fSBram Moolenaar 'func Test() " comment', 2700e7e4838fSBram Moolenaar 'endfunc', 27012d870f8dSBram Moolenaar 'delfunc Test', 2702e7e4838fSBram Moolenaar ]) 27039898107fSBram Moolenaar CheckScriptSuccess([ 2704e7e4838fSBram Moolenaar 'vim9script', 2705e7e4838fSBram Moolenaar 'func Test() " comment', 2706e7e4838fSBram Moolenaar 'endfunc', 27079898107fSBram Moolenaar ]) 2708e7e4838fSBram Moolenaar 2709e7e4838fSBram Moolenaar CheckScriptSuccess([ 2710e7e4838fSBram Moolenaar 'def Test() # comment', 2711e7e4838fSBram Moolenaar 'enddef', 2712e7e4838fSBram Moolenaar ]) 2713e7e4838fSBram Moolenaar CheckScriptFailure([ 2714e7e4838fSBram Moolenaar 'func Test() # comment', 2715e7e4838fSBram Moolenaar 'endfunc', 2716e7e4838fSBram Moolenaar ], 'E488:') 27172c5ed4e3SBram Moolenaarenddef 27182c5ed4e3SBram Moolenaar 27192c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 27202c5ed4e3SBram Moolenaar CheckCanRunGui 27212c5ed4e3SBram Moolenaar 27222c5ed4e3SBram Moolenaar CheckScriptFailure([ 27232c5ed4e3SBram Moolenaar 'vim9script', 27242c5ed4e3SBram Moolenaar 'gui#comment' 2725f8103f27SBram Moolenaar ], 'E1144:') 27262c5ed4e3SBram Moolenaar CheckScriptFailure([ 27272c5ed4e3SBram Moolenaar 'vim9script', 27282c5ed4e3SBram Moolenaar 'gui -f#comment' 27292c5ed4e3SBram Moolenaar ], 'E499:') 27307a092245SBram Moolenaarenddef 27317a092245SBram Moolenaar 2732a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 27336797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 27346797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2735a26b9700SBram Moolenaar 2736a26b9700SBram Moolenaar edit test.vim 2737a26b9700SBram Moolenaar doautocmd TabEnter #comment 2738a26b9700SBram Moolenaar assert_equal(1, g:entered) 2739a26b9700SBram Moolenaar 2740a26b9700SBram Moolenaar doautocmd TabEnter f.x 2741a26b9700SBram Moolenaar assert_equal(2, g:entered) 2742a26b9700SBram Moolenaar 2743a26b9700SBram Moolenaar g:entered = 0 2744a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2745a26b9700SBram Moolenaar assert_equal(2, g:entered) 2746a26b9700SBram Moolenaar 2747a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2748a26b9700SBram Moolenaar 2749a26b9700SBram Moolenaar au! TabEnter 2750a26b9700SBram Moolenaar unlet g:entered 2751d72c1bf0SBram Moolenaar 2752d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2753d72c1bf0SBram Moolenaar 'vim9script', 27546797966dSBram Moolenaar 'g:var = 123', 2755e55b1c09SBram Moolenaar 'b:var = 456', 2756e55b1c09SBram Moolenaar 'w:var = 777', 2757e55b1c09SBram Moolenaar 't:var = 888', 2758d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2759d72c1bf0SBram Moolenaar ]) 2760d72c1bf0SBram Moolenaar 2761d72c1bf0SBram Moolenaar CheckScriptFailure([ 2762d72c1bf0SBram Moolenaar 'vim9script', 2763cfcd011fSBram Moolenaar 'let var = 123', 2764cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2765cfcd011fSBram Moolenaar 2766cfcd011fSBram Moolenaar CheckScriptFailure([ 2767cfcd011fSBram Moolenaar 'vim9script', 2768cfcd011fSBram Moolenaar 'var g:var = 123', 2769e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2770e55b1c09SBram Moolenaar 2771e55b1c09SBram Moolenaar CheckScriptFailure([ 2772e55b1c09SBram Moolenaar 'vim9script', 2773cfcd011fSBram Moolenaar 'var b:var = 123', 2774e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2775e55b1c09SBram Moolenaar 2776e55b1c09SBram Moolenaar CheckScriptFailure([ 2777e55b1c09SBram Moolenaar 'vim9script', 2778cfcd011fSBram Moolenaar 'var w:var = 123', 2779e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2780e55b1c09SBram Moolenaar 2781e55b1c09SBram Moolenaar CheckScriptFailure([ 2782e55b1c09SBram Moolenaar 'vim9script', 2783cfcd011fSBram Moolenaar 'var t:var = 123', 2784e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2785e55b1c09SBram Moolenaar 2786e55b1c09SBram Moolenaar CheckScriptFailure([ 2787e55b1c09SBram Moolenaar 'vim9script', 2788cfcd011fSBram Moolenaar 'var v:version = 123', 2789e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2790e55b1c09SBram Moolenaar 2791e55b1c09SBram Moolenaar CheckScriptFailure([ 2792e55b1c09SBram Moolenaar 'vim9script', 2793cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2794e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 27956797966dSBram Moolenaar 27966797966dSBram Moolenaar CheckScriptFailure([ 27976797966dSBram Moolenaar 'vim9script', 27986797966dSBram Moolenaar 'g:var = 123', 279932e35117SBram Moolenaar 'unlet g:var# comment1', 2800d72c1bf0SBram Moolenaar ], 'E108:') 2801d72c1bf0SBram Moolenaar 2802d72c1bf0SBram Moolenaar CheckScriptFailure([ 2803d72c1bf0SBram Moolenaar 'let g:var = 123', 2804d72c1bf0SBram Moolenaar 'unlet g:var # something', 2805d72c1bf0SBram Moolenaar ], 'E488:') 2806faac4104SBram Moolenaar 2807faac4104SBram Moolenaar CheckScriptSuccess([ 2808faac4104SBram Moolenaar 'vim9script', 280932e35117SBram Moolenaar 'if 1 # comment2', 2810faac4104SBram Moolenaar ' echo "yes"', 2811faac4104SBram Moolenaar 'elseif 2 #comment', 2812faac4104SBram Moolenaar ' echo "no"', 2813faac4104SBram Moolenaar 'endif', 2814faac4104SBram Moolenaar ]) 2815faac4104SBram Moolenaar 2816faac4104SBram Moolenaar CheckScriptFailure([ 2817faac4104SBram Moolenaar 'vim9script', 281832e35117SBram Moolenaar 'if 1# comment3', 2819faac4104SBram Moolenaar ' echo "yes"', 2820faac4104SBram Moolenaar 'endif', 2821faac4104SBram Moolenaar ], 'E15:') 2822faac4104SBram Moolenaar 2823faac4104SBram Moolenaar CheckScriptFailure([ 2824faac4104SBram Moolenaar 'vim9script', 282532e35117SBram Moolenaar 'if 0 # comment4', 2826faac4104SBram Moolenaar ' echo "yes"', 2827faac4104SBram Moolenaar 'elseif 2#comment', 2828faac4104SBram Moolenaar ' echo "no"', 2829faac4104SBram Moolenaar 'endif', 2830faac4104SBram Moolenaar ], 'E15:') 2831faac4104SBram Moolenaar 2832faac4104SBram Moolenaar CheckScriptSuccess([ 2833faac4104SBram Moolenaar 'vim9script', 2834cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2835faac4104SBram Moolenaar ]) 2836faac4104SBram Moolenaar 2837faac4104SBram Moolenaar CheckScriptFailure([ 2838faac4104SBram Moolenaar 'vim9script', 2839cfcd011fSBram Moolenaar 'var v = 1# comment6', 284032e35117SBram Moolenaar ], 'E15:') 2841faac4104SBram Moolenaar 2842faac4104SBram Moolenaar CheckScriptSuccess([ 2843faac4104SBram Moolenaar 'vim9script', 2844faac4104SBram Moolenaar 'new' 2845d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2846df069eecSBram Moolenaar ':$', 2847faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2848faac4104SBram Moolenaar 'bwipe!', 2849faac4104SBram Moolenaar ]) 2850faac4104SBram Moolenaar 2851f5be8cdbSBram Moolenaar CheckScriptFailure([ 2852f5be8cdbSBram Moolenaar 'vim9script', 2853f5be8cdbSBram Moolenaar 'new' 2854d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2855f5be8cdbSBram Moolenaar ':$', 2856f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2857f5be8cdbSBram Moolenaar 'bwipe!', 2858f5be8cdbSBram Moolenaar ], 'E488:') 2859f5be8cdbSBram Moolenaar 2860f5be8cdbSBram Moolenaar CheckScriptFailure([ 2861f5be8cdbSBram Moolenaar 'vim9script', 2862f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2863f5be8cdbSBram Moolenaar ], 'E477:') 2864a26b9700SBram Moolenaarenddef 2865a26b9700SBram Moolenaar 28667e5bd91dSBram Moolenaardef Test_finish() 2867cfcd011fSBram Moolenaar var lines =<< trim END 28687e5bd91dSBram Moolenaar vim9script 28696797966dSBram Moolenaar g:res = 'one' 28707e5bd91dSBram Moolenaar if v:false | finish | endif 28716797966dSBram Moolenaar g:res = 'two' 28727e5bd91dSBram Moolenaar finish 28736797966dSBram Moolenaar g:res = 'three' 28747e5bd91dSBram Moolenaar END 28757e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 28767e5bd91dSBram Moolenaar source Xfinished 28777e5bd91dSBram Moolenaar assert_equal('two', g:res) 28787e5bd91dSBram Moolenaar 28797e5bd91dSBram Moolenaar unlet g:res 28807e5bd91dSBram Moolenaar delete('Xfinished') 28817e5bd91dSBram Moolenaarenddef 28827e5bd91dSBram Moolenaar 2883a5d0077eSBram Moolenaardef Test_forward_declaration() 2884cfcd011fSBram Moolenaar var lines =<< trim END 2885a5d0077eSBram Moolenaar vim9script 2886a5d0077eSBram Moolenaar def GetValue(): string 2887a5d0077eSBram Moolenaar return theVal 2888a5d0077eSBram Moolenaar enddef 2889cfcd011fSBram Moolenaar var theVal = 'something' 2890822ba247SBram Moolenaar g:initVal = GetValue() 2891a5d0077eSBram Moolenaar theVal = 'else' 2892a5d0077eSBram Moolenaar g:laterVal = GetValue() 2893a5d0077eSBram Moolenaar END 2894a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2895a5d0077eSBram Moolenaar source Xforward 2896a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2897a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2898a5d0077eSBram Moolenaar 2899a5d0077eSBram Moolenaar unlet g:initVal 2900a5d0077eSBram Moolenaar unlet g:laterVal 2901a5d0077eSBram Moolenaar delete('Xforward') 2902a5d0077eSBram Moolenaarenddef 2903a5d0077eSBram Moolenaar 29049721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2905a6294955SBram Moolenaar var vim9_lines =<< trim END 2906a6294955SBram Moolenaar vim9script 2907a6294955SBram Moolenaar var local = 'local' 2908a6294955SBram Moolenaar g:global = 'global' 2909a6294955SBram Moolenaar export var exported = 'exported' 2910a6294955SBram Moolenaar export def GetText(): string 2911a6294955SBram Moolenaar return 'text' 2912a6294955SBram Moolenaar enddef 2913a6294955SBram Moolenaar END 2914a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2915a6294955SBram Moolenaar 2916cfcd011fSBram Moolenaar var legacy_lines =<< trim END 29179721fb4eSBram Moolenaar source Xvim9_script.vim 29189721fb4eSBram Moolenaar 29199721fb4eSBram Moolenaar call assert_false(exists('local')) 29209721fb4eSBram Moolenaar call assert_false(exists('exported')) 29219721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29229721fb4eSBram Moolenaar call assert_equal('global', global) 29239721fb4eSBram Moolenaar call assert_equal('global', g:global) 29249721fb4eSBram Moolenaar 29259721fb4eSBram Moolenaar " imported variable becomes script-local 29269721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29279721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29289721fb4eSBram Moolenaar call assert_false(exists('exported')) 29299721fb4eSBram Moolenaar 29309721fb4eSBram Moolenaar " imported function becomes script-local 29319721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29329721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29339721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29349721fb4eSBram Moolenaar END 29359721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29369721fb4eSBram Moolenaar 29379721fb4eSBram Moolenaar source Xlegacy_script.vim 29389721fb4eSBram Moolenaar assert_equal('global', g:global) 2939f5be8cdbSBram Moolenaar unlet g:global 29409721fb4eSBram Moolenaar 29419721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29429721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29439721fb4eSBram Moolenaarenddef 2944a5d0077eSBram Moolenaar 29457d699701SBram Moolenaarfunc Test_vim9script_not_global() 29467d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 29477d699701SBram Moolenaar let vim9lines =<< trim END 29487d699701SBram Moolenaar vim9script 2949cfcd011fSBram Moolenaar var name = 'local' 29507d699701SBram Moolenaar func TheFunc() 29517d699701SBram Moolenaar echo 'local' 29527d699701SBram Moolenaar endfunc 29537d699701SBram Moolenaar def DefFunc() 29547d699701SBram Moolenaar echo 'local' 29557d699701SBram Moolenaar enddef 29567d699701SBram Moolenaar END 29577d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 29587d699701SBram Moolenaar source Xvim9script.vim 29597d699701SBram Moolenaar try 29607d699701SBram Moolenaar echo g:var 29617d699701SBram Moolenaar assert_report('did not fail') 29627d699701SBram Moolenaar catch /E121:/ 29637d699701SBram Moolenaar " caught 29647d699701SBram Moolenaar endtry 29657d699701SBram Moolenaar try 29667d699701SBram Moolenaar call TheFunc() 29677d699701SBram Moolenaar assert_report('did not fail') 29687d699701SBram Moolenaar catch /E117:/ 29697d699701SBram Moolenaar " caught 29707d699701SBram Moolenaar endtry 29717d699701SBram Moolenaar try 29727d699701SBram Moolenaar call DefFunc() 29737d699701SBram Moolenaar assert_report('did not fail') 29747d699701SBram Moolenaar catch /E117:/ 29757d699701SBram Moolenaar " caught 29767d699701SBram Moolenaar endtry 29777d699701SBram Moolenaar 297825859dd7SBram Moolenaar call delete('Xvim9script.vim') 29797d699701SBram Moolenaarendfunc 29807d699701SBram Moolenaar 2981eeb27bfeSBram Moolenaardef Test_vim9_copen() 2982eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2983eeb27bfeSBram Moolenaar copen 2984eeb27bfeSBram Moolenaar quit 2985eeb27bfeSBram Moolenaarenddef 2986eeb27bfeSBram Moolenaar 298703290b84SBram Moolenaar" test using an auto-loaded function and variable 29882d6b20d6SBram Moolenaardef Test_vim9_autoload() 2989cfcd011fSBram Moolenaar var lines =<< trim END 29902d6b20d6SBram Moolenaar vim9script 299103290b84SBram Moolenaar def some#gettest(): string 299203290b84SBram Moolenaar return 'test' 299303290b84SBram Moolenaar enddef 299403290b84SBram Moolenaar g:some#name = 'name' 299503290b84SBram Moolenaar END 299603290b84SBram Moolenaar 299703290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 299803290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 299903290b84SBram Moolenaar var save_rtp = &rtp 300003290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 300103290b84SBram Moolenaar 300203290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 300303290b84SBram Moolenaar assert_equal('name', g:some#name) 300403290b84SBram Moolenaar g:some#other = 'other' 300503290b84SBram Moolenaar assert_equal('other', g:some#other) 300603290b84SBram Moolenaar 300717f700acSBram Moolenaar # upper case script name works 300817f700acSBram Moolenaar lines =<< trim END 300917f700acSBram Moolenaar vim9script 301017f700acSBram Moolenaar def Other#getOther(): string 301117f700acSBram Moolenaar return 'other' 301217f700acSBram Moolenaar enddef 301317f700acSBram Moolenaar END 301417f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 301517f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 301617f700acSBram Moolenaar 301703290b84SBram Moolenaar delete('Xdir', 'rf') 301803290b84SBram Moolenaar &rtp = save_rtp 301903290b84SBram Moolenaarenddef 302003290b84SBram Moolenaar 302103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 302203290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 302303290b84SBram Moolenaar var lines =<< trim END 302403290b84SBram Moolenaar vim9script 30252d6b20d6SBram Moolenaar def foo#test() 30262d6b20d6SBram Moolenaar echomsg getreg('"') 30272d6b20d6SBram Moolenaar enddef 30282d6b20d6SBram Moolenaar END 30292d6b20d6SBram Moolenaar 30302d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 30312d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3032cfcd011fSBram Moolenaar var save_rtp = &rtp 30332d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 30342d6b20d6SBram Moolenaar augroup test 30352d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 30362d6b20d6SBram Moolenaar augroup END 30372d6b20d6SBram Moolenaar 30382d6b20d6SBram Moolenaar normal Y 30392d6b20d6SBram Moolenaar 30402d6b20d6SBram Moolenaar augroup test 30412d6b20d6SBram Moolenaar autocmd! 30422d6b20d6SBram Moolenaar augroup END 30432d6b20d6SBram Moolenaar delete('Xdir', 'rf') 30442d6b20d6SBram Moolenaar &rtp = save_rtp 30452d6b20d6SBram Moolenaarenddef 30462d6b20d6SBram Moolenaar 304777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 304877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3049cfcd011fSBram Moolenaar var lines =<< trim END 305077e5dcc3SBram Moolenaar vim9script 305177e5dcc3SBram Moolenaar def crash#func() 305277e5dcc3SBram Moolenaar try 305377e5dcc3SBram Moolenaar for x in List() 305477e5dcc3SBram Moolenaar endfor 305577e5dcc3SBram Moolenaar catch 305677e5dcc3SBram Moolenaar endtry 305777e5dcc3SBram Moolenaar g:ok = true 305877e5dcc3SBram Moolenaar enddef 305977e5dcc3SBram Moolenaar fu List() 306077e5dcc3SBram Moolenaar invalid 306177e5dcc3SBram Moolenaar endfu 306277e5dcc3SBram Moolenaar try 306348e11c10SBram Moolenaar alsoinvalid 306477e5dcc3SBram Moolenaar catch /wontmatch/ 306577e5dcc3SBram Moolenaar endtry 306677e5dcc3SBram Moolenaar END 306777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 306877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 306977e5dcc3SBram Moolenaar 307077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 307177e5dcc3SBram Moolenaar lines =<< trim END 307277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 307377e5dcc3SBram Moolenaar call crash#func() 307477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 30759c4f5520SBram Moolenaar qall! 307677e5dcc3SBram Moolenaar END 307777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 307877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 307977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 308077e5dcc3SBram Moolenaar 308177e5dcc3SBram Moolenaar delete('Xdidit') 308277e5dcc3SBram Moolenaar delete('Xscript') 308377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 308403290b84SBram Moolenaar 308503290b84SBram Moolenaar lines =<< trim END 308603290b84SBram Moolenaar vim9script 308703290b84SBram Moolenaar var foo#bar = 'asdf' 308803290b84SBram Moolenaar END 308903290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 309077e5dcc3SBram Moolenaarenddef 309177e5dcc3SBram Moolenaar 309281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 309381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 309481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3095cfcd011fSBram Moolenaar var lines =<< trim END 309681e17fbeSBram Moolenaar let s:counter = 1 309781e17fbeSBram Moolenaar def s:Func() 309881e17fbeSBram Moolenaar au! CursorHold 309981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 310081e17fbeSBram Moolenaar enddef 310181e17fbeSBram Moolenaar call s:Func() 310281e17fbeSBram Moolenaar doau CursorHold 310381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 310481e17fbeSBram Moolenaar au! CursorHold 310581e17fbeSBram Moolenaar END 310681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 310781e17fbeSBram Moolenaarenddef 310881e17fbeSBram Moolenaar 31093896a105SBram Moolenaardef Test_cmdline_win() 31103896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 31113896a105SBram Moolenaar # the command line window. 31123896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3113cfcd011fSBram Moolenaar var export_lines =<< trim END 31143896a105SBram Moolenaar vim9script 3115cfcd011fSBram Moolenaar export var That = 'yes' 31163896a105SBram Moolenaar END 31173896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3118cfcd011fSBram Moolenaar var import_lines =<< trim END 31193896a105SBram Moolenaar vim9script 31203896a105SBram Moolenaar import That from './Xexport.vim' 31213896a105SBram Moolenaar END 31223896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3123cfcd011fSBram Moolenaar var save_rtp = &rtp 31243896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 31253896a105SBram Moolenaar syntax on 31263896a105SBram Moolenaar augroup CmdWin 31273896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 31283896a105SBram Moolenaar augroup END 31293896a105SBram Moolenaar # this will open and also close the cmdline window 31303896a105SBram Moolenaar feedkeys('q:', 'xt') 31313896a105SBram Moolenaar assert_equal('yes', g:got_there) 31323896a105SBram Moolenaar 31333896a105SBram Moolenaar augroup CmdWin 31343896a105SBram Moolenaar au! 31353896a105SBram Moolenaar augroup END 31363896a105SBram Moolenaar &rtp = save_rtp 31373896a105SBram Moolenaar delete('rtp', 'rf') 31383896a105SBram Moolenaarenddef 31393896a105SBram Moolenaar 3140e3d4685fSBram Moolenaardef Test_invalid_sid() 3141e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 314225859dd7SBram Moolenaar 31439c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3144d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3145e3d4685fSBram Moolenaar endif 3146e3d4685fSBram Moolenaar delete('Xdidit') 3147e3d4685fSBram Moolenaarenddef 3148e3d4685fSBram Moolenaar 31499ec7026fSBram Moolenaardef Test_restoring_cpo() 31509ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 31519ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 31529ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 31539ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 31549ec7026fSBram Moolenaar endif 31559ec7026fSBram Moolenaar delete('Xsourced') 31569ec7026fSBram Moolenaar delete('Xclose') 3157090728adSBram Moolenaar delete('Xdone') 31589ec7026fSBram Moolenaarenddef 31599ec7026fSBram Moolenaar 31609ec7026fSBram Moolenaar 3161f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3162cfcd011fSBram Moolenaar var lines =<< trim END 3163cfcd011fSBram Moolenaar var name: any 3164cfcd011fSBram Moolenaar assert_equal(0, name) 3165f0afd9e1SBram Moolenaar END 3166f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3167f0afd9e1SBram Moolenaarenddef 3168f0afd9e1SBram Moolenaar 31697e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 317058dbef33SBram Moolenaar CheckRunVimInTerminal 317158dbef33SBram Moolenaar 31727e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 31737e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 31747e9210eaSBram Moolenaarendfunc 31757e9210eaSBram Moolenaar 31767e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 31779c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3178cfcd011fSBram Moolenaar var lines =<< trim END 31799c4f5520SBram Moolenaar func CheckAndQuit() 31809c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 31819c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 31829c4f5520SBram Moolenaar endfunc 31839c4f5520SBram Moolenaar END 31849c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 31859c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3186e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 31879c4f5520SBram Moolenaar # define Afunc() on the command line 31889c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 31899c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 31902949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 31919c4f5520SBram Moolenaar 31929c4f5520SBram Moolenaar call StopVimInTerminal(buf) 31939c4f5520SBram Moolenaar delete('XcallFunc') 31949c4f5520SBram Moolenaar delete('Xdidcmd') 31959c4f5520SBram Moolenaarenddef 31969c4f5520SBram Moolenaar 3197fcdc5d83SBram Moolenaardef Test_script_var_scope() 3198fcdc5d83SBram Moolenaar var lines =<< trim END 3199fcdc5d83SBram Moolenaar vim9script 3200fcdc5d83SBram Moolenaar if true 3201fcdc5d83SBram Moolenaar if true 3202fcdc5d83SBram Moolenaar var one = 'one' 3203fcdc5d83SBram Moolenaar echo one 3204fcdc5d83SBram Moolenaar endif 3205fcdc5d83SBram Moolenaar echo one 3206fcdc5d83SBram Moolenaar endif 3207fcdc5d83SBram Moolenaar END 3208fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3209fcdc5d83SBram Moolenaar 3210fcdc5d83SBram Moolenaar lines =<< trim END 3211fcdc5d83SBram Moolenaar vim9script 3212fcdc5d83SBram Moolenaar if true 3213fcdc5d83SBram Moolenaar if false 3214fcdc5d83SBram Moolenaar var one = 'one' 3215fcdc5d83SBram Moolenaar echo one 3216fcdc5d83SBram Moolenaar else 3217fcdc5d83SBram Moolenaar var one = 'one' 3218fcdc5d83SBram Moolenaar echo one 3219fcdc5d83SBram Moolenaar endif 3220fcdc5d83SBram Moolenaar echo one 3221fcdc5d83SBram Moolenaar endif 3222fcdc5d83SBram Moolenaar END 3223fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3224fcdc5d83SBram Moolenaar 3225fcdc5d83SBram Moolenaar lines =<< trim END 3226fcdc5d83SBram Moolenaar vim9script 3227fcdc5d83SBram Moolenaar while true 3228fcdc5d83SBram Moolenaar var one = 'one' 3229fcdc5d83SBram Moolenaar echo one 3230fcdc5d83SBram Moolenaar break 3231fcdc5d83SBram Moolenaar endwhile 3232fcdc5d83SBram Moolenaar echo one 3233fcdc5d83SBram Moolenaar END 3234fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3235fcdc5d83SBram Moolenaar 3236fcdc5d83SBram Moolenaar lines =<< trim END 3237fcdc5d83SBram Moolenaar vim9script 3238fcdc5d83SBram Moolenaar for i in range(1) 3239fcdc5d83SBram Moolenaar var one = 'one' 3240fcdc5d83SBram Moolenaar echo one 3241fcdc5d83SBram Moolenaar endfor 3242fcdc5d83SBram Moolenaar echo one 3243fcdc5d83SBram Moolenaar END 3244fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 32459becdf2bSBram Moolenaar 32469becdf2bSBram Moolenaar lines =<< trim END 32479becdf2bSBram Moolenaar vim9script 32489becdf2bSBram Moolenaar { 32499becdf2bSBram Moolenaar var one = 'one' 32509becdf2bSBram Moolenaar assert_equal('one', one) 32519becdf2bSBram Moolenaar } 32529becdf2bSBram Moolenaar assert_false(exists('one')) 32539becdf2bSBram Moolenaar assert_false(exists('s:one')) 32549becdf2bSBram Moolenaar END 32559becdf2bSBram Moolenaar CheckScriptSuccess(lines) 32569becdf2bSBram Moolenaar 32579becdf2bSBram Moolenaar lines =<< trim END 32589becdf2bSBram Moolenaar vim9script 32599becdf2bSBram Moolenaar { 32609becdf2bSBram Moolenaar var one = 'one' 32619becdf2bSBram Moolenaar echo one 32629becdf2bSBram Moolenaar } 32639becdf2bSBram Moolenaar echo one 32649becdf2bSBram Moolenaar END 32659becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3266fcdc5d83SBram Moolenaarenddef 3267fcdc5d83SBram Moolenaar 3268352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3269352134bbSBram Moolenaar var lines =<< trim END 3270352134bbSBram Moolenaar vim9script 3271352134bbSBram Moolenaar def Callback(...l: any) 3272352134bbSBram Moolenaar try 3273352134bbSBram Moolenaar var x: string 3274352134bbSBram Moolenaar var y: string 3275352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3276352134bbSBram Moolenaar [x, y] = [''] 3277352134bbSBram Moolenaar catch 3278352134bbSBram Moolenaar g:caught = 'yes' 3279352134bbSBram Moolenaar endtry 3280352134bbSBram Moolenaar enddef 3281e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3282352134bbSBram Moolenaar feedkeys("\r", 'xt') 3283352134bbSBram Moolenaar END 3284352134bbSBram Moolenaar CheckScriptSuccess(lines) 3285352134bbSBram Moolenaar 3286352134bbSBram Moolenaar unlet g:caught 3287352134bbSBram Moolenaarenddef 3288352134bbSBram Moolenaar 3289631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3290631e8f93SBram Moolenaar if !has('unix') || !has('job') 3291631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3292631e8f93SBram Moolenaar endif 3293631e8f93SBram Moolenaar var lines =<< trim END 3294631e8f93SBram Moolenaar vim9script 3295631e8f93SBram Moolenaar var source: list<number> 3296631e8f93SBram Moolenaar def Out_cb(...l: any) 3297631e8f93SBram Moolenaar eval [][0] 3298631e8f93SBram Moolenaar enddef 3299631e8f93SBram Moolenaar def Exit_cb(...l: any) 3300631e8f93SBram Moolenaar sleep 1m 3301631e8f93SBram Moolenaar source += l 3302631e8f93SBram Moolenaar enddef 3303e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 33046f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 33056f17a3f0SBram Moolenaar sleep 10m 33066f17a3f0SBram Moolenaar endwhile 3307206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3308206c2a6eSBram Moolenaar sleep 100m 3309631e8f93SBram Moolenaar END 3310631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3311631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3312631e8f93SBram Moolenaar delete('Xdef') 3313631e8f93SBram Moolenaarenddef 3314631e8f93SBram Moolenaar 33154324d87aSBram Moolenaardef InvokeNormal() 33164324d87aSBram Moolenaar exe "norm! :m+1\r" 33174324d87aSBram Moolenaarenddef 33184324d87aSBram Moolenaar 33194324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 33204324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 33214324d87aSBram Moolenaar new 33224324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 33234324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 33244324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 33254324d87aSBram Moolenaar xunmap <F3> 3326b5b9480eSBram Moolenaarenddef 3327b5b9480eSBram Moolenaar 3328b5b9480eSBram Moolenaardef Test_white_space_after_command() 3329b5b9480eSBram Moolenaar var lines =<< trim END 3330b5b9480eSBram Moolenaar exit_cb: Func}) 3331b5b9480eSBram Moolenaar END 3332b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3333f8103f27SBram Moolenaar 3334f8103f27SBram Moolenaar lines =<< trim END 3335f8103f27SBram Moolenaar e# 3336f8103f27SBram Moolenaar END 3337f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 33384324d87aSBram Moolenaarenddef 33394324d87aSBram Moolenaar 33404aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 33414aab88d9SBram Moolenaar var lines =<< trim END 33424aab88d9SBram Moolenaar vim9script 33434aab88d9SBram Moolenaar if exists('g:guard') 33444aab88d9SBram Moolenaar finish 33454aab88d9SBram Moolenaar endif 33464aab88d9SBram Moolenaar g:guard = 1 33474aab88d9SBram Moolenaar var name = 'thename' 33484aab88d9SBram Moolenaar def g:GetName(): string 33494aab88d9SBram Moolenaar return name 33504aab88d9SBram Moolenaar enddef 33514aab88d9SBram Moolenaar def g:SetName(arg: string) 33524aab88d9SBram Moolenaar name = arg 33534aab88d9SBram Moolenaar enddef 33544aab88d9SBram Moolenaar END 33554aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 33564aab88d9SBram Moolenaar so XscriptTwice.vim 33574aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 33584aab88d9SBram Moolenaar g:SetName('newname') 33594aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 33604aab88d9SBram Moolenaar so XscriptTwice.vim 33614aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33624aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 33634aab88d9SBram Moolenaar 33644aab88d9SBram Moolenaar delfunc g:GetName 33654aab88d9SBram Moolenaar delfunc g:SetName 33664aab88d9SBram Moolenaar delete('XscriptTwice.vim') 33674aab88d9SBram Moolenaar unlet g:guard 33684aab88d9SBram Moolenaarenddef 33694aab88d9SBram Moolenaar 33704aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 33714aab88d9SBram Moolenaar var exportlines =<< trim END 33724aab88d9SBram Moolenaar vim9script 33734aab88d9SBram Moolenaar if exists('g:guard') 33744aab88d9SBram Moolenaar finish 33754aab88d9SBram Moolenaar endif 33764aab88d9SBram Moolenaar g:guard = 1 33774aab88d9SBram Moolenaar export var name = 'someName' 33784aab88d9SBram Moolenaar END 33794aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 33804aab88d9SBram Moolenaar 33814aab88d9SBram Moolenaar var lines =<< trim END 33824aab88d9SBram Moolenaar vim9script 33834aab88d9SBram Moolenaar import name from './XexportScript.vim' 33844aab88d9SBram Moolenaar def g:GetName(): string 33854aab88d9SBram Moolenaar return name 33864aab88d9SBram Moolenaar enddef 33874aab88d9SBram Moolenaar END 33884aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 33894aab88d9SBram Moolenaar so XscriptImport.vim 33904aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 33914aab88d9SBram Moolenaar 33924aab88d9SBram Moolenaar so XexportScript.vim 33934aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33944aab88d9SBram Moolenaar 33954aab88d9SBram Moolenaar delfunc g:GetName 33964aab88d9SBram Moolenaar delete('XexportScript.vim') 33974aab88d9SBram Moolenaar delete('XscriptImport.vim') 33984aab88d9SBram Moolenaar unlet g:guard 33994aab88d9SBram Moolenaarenddef 34004aab88d9SBram Moolenaar 3401585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3402585fea7bSBram Moolenaardef Test_substitute_cmd() 3403585fea7bSBram Moolenaar new 3404585fea7bSBram Moolenaar setline(1, 'something') 3405585fea7bSBram Moolenaar :substitute(some(other( 3406585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3407585fea7bSBram Moolenaar bwipe! 3408585fea7bSBram Moolenaar 3409f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3410cfcd011fSBram Moolenaar var lines =<< trim END 3411585fea7bSBram Moolenaar vim9script 3412585fea7bSBram Moolenaar new 3413585fea7bSBram Moolenaar setline(1, 'something') 3414585fea7bSBram Moolenaar :substitute(some(other( 3415585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3416585fea7bSBram Moolenaar bwipe! 3417585fea7bSBram Moolenaar END 3418585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3419585fea7bSBram Moolenaar source Xvim9lines 3420585fea7bSBram Moolenaar 3421585fea7bSBram Moolenaar delete('Xvim9lines') 3422585fea7bSBram Moolenaarenddef 3423585fea7bSBram Moolenaar 34248a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3425