18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25c2af0affSBram Moolenaar bwipe! 26025cb1caSBram Moolenaar 27025cb1caSBram Moolenaar # won't generate anything 28025cb1caSBram Moolenaar if false 29025cb1caSBram Moolenaar :123 30025cb1caSBram Moolenaar endif 315d72ce69SBram Moolenaarenddef 325d72ce69SBram Moolenaar 33a6e67e4fSBram Moolenaarlet g:alist = [7] 34a6e67e4fSBram Moolenaarlet g:astring = 'text' 35f0b9f43cSBram Moolenaarlet g:anumber = 123 366e587dcbSBram Moolenaar 374c17ad94SBram Moolenaardef Test_delfunction() 38f5be8cdbSBram Moolenaar # Check function is defined in script namespace 394c17ad94SBram Moolenaar CheckScriptSuccess([ 404c17ad94SBram Moolenaar 'vim9script', 414c17ad94SBram Moolenaar 'func CheckMe()', 424c17ad94SBram Moolenaar ' return 123', 434c17ad94SBram Moolenaar 'endfunc', 444c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 454c17ad94SBram Moolenaar ]) 464c17ad94SBram Moolenaar 47f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 484c17ad94SBram Moolenaar CheckScriptFailure([ 494c17ad94SBram Moolenaar 'vim9script', 504c17ad94SBram Moolenaar 'func DeleteMe1()', 514c17ad94SBram Moolenaar 'endfunc', 524c17ad94SBram Moolenaar 'delfunction DeleteMe1', 534c17ad94SBram Moolenaar ], 'E1084:') 544c17ad94SBram Moolenaar CheckScriptFailure([ 554c17ad94SBram Moolenaar 'vim9script', 564c17ad94SBram Moolenaar 'func DeleteMe2()', 574c17ad94SBram Moolenaar 'endfunc', 584c17ad94SBram Moolenaar 'def DoThat()', 594c17ad94SBram Moolenaar ' delfunction DeleteMe2', 604c17ad94SBram Moolenaar 'enddef', 614c17ad94SBram Moolenaar 'DoThat()', 624c17ad94SBram Moolenaar ], 'E1084:') 634c17ad94SBram Moolenaar CheckScriptFailure([ 644c17ad94SBram Moolenaar 'vim9script', 654c17ad94SBram Moolenaar 'def DeleteMe3()', 664c17ad94SBram Moolenaar 'enddef', 674c17ad94SBram Moolenaar 'delfunction DeleteMe3', 684c17ad94SBram Moolenaar ], 'E1084:') 694c17ad94SBram Moolenaar CheckScriptFailure([ 704c17ad94SBram Moolenaar 'vim9script', 714c17ad94SBram Moolenaar 'def DeleteMe4()', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'def DoThat()', 744c17ad94SBram Moolenaar ' delfunction DeleteMe4', 754c17ad94SBram Moolenaar 'enddef', 764c17ad94SBram Moolenaar 'DoThat()', 774c17ad94SBram Moolenaar ], 'E1084:') 78925e9fd6SBram Moolenaar 79925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 80cfcd011fSBram Moolenaar var lines =<< trim END 81925e9fd6SBram Moolenaar vim9script 82925e9fd6SBram Moolenaar def g:Global(): string 83925e9fd6SBram Moolenaar return "yes" 84925e9fd6SBram Moolenaar enddef 85925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 86925e9fd6SBram Moolenaar def! g:Global(): string 87925e9fd6SBram Moolenaar return "no" 88925e9fd6SBram Moolenaar enddef 89925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 90925e9fd6SBram Moolenaar delfunc g:Global 91925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 92925e9fd6SBram Moolenaar END 93925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 94925e9fd6SBram Moolenaar 95925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 96925e9fd6SBram Moolenaar lines =<< trim END 97925e9fd6SBram Moolenaar vim9script 98925e9fd6SBram Moolenaar func g:Global() 99925e9fd6SBram Moolenaar return "yes" 100925e9fd6SBram Moolenaar endfunc 101925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 102925e9fd6SBram Moolenaar def! g:Global(): string 103925e9fd6SBram Moolenaar return "no" 104925e9fd6SBram Moolenaar enddef 105925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 106925e9fd6SBram Moolenaar delfunc g:Global 107925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 108925e9fd6SBram Moolenaar END 109925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 110925e9fd6SBram Moolenaar 111925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 112925e9fd6SBram Moolenaar lines =<< trim END 113925e9fd6SBram Moolenaar vim9script 114925e9fd6SBram Moolenaar def g:Global(): string 115925e9fd6SBram Moolenaar return "yes" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 118925e9fd6SBram Moolenaar func! g:Global() 119925e9fd6SBram Moolenaar return "no" 120925e9fd6SBram Moolenaar endfunc 121925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 122925e9fd6SBram Moolenaar delfunc g:Global 123925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 124925e9fd6SBram Moolenaar END 125925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1264c17ad94SBram Moolenaarenddef 1274c17ad94SBram Moolenaar 12808052228SBram Moolenaardef Test_wrong_type() 129cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 130cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 131cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 132cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 133599c89c8SBram Moolenaar 134cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 135cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 13642a480bfSBram Moolenaar 137cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 138cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 139cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 145cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 148a0a9f43aSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 15108052228SBram Moolenaarenddef 1528a7d6542SBram Moolenaar 15310c65860SBram Moolenaardef Test_script_wrong_type() 15410c65860SBram Moolenaar var lines =<< trim END 15510c65860SBram Moolenaar vim9script 15610c65860SBram Moolenaar var s:dict: dict<string> 15710c65860SBram Moolenaar s:dict['a'] = ['x'] 15810c65860SBram Moolenaar END 15910c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 16010c65860SBram Moolenaarenddef 16110c65860SBram Moolenaar 16208052228SBram Moolenaardef Test_const() 163cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 164cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 165cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 16630fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 16730fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 168dbeecb2bSBram Moolenaar 169cfcd011fSBram Moolenaar var lines =<< trim END 17030fd8204SBram Moolenaar final list = [1, 2, 3] 171dbeecb2bSBram Moolenaar list[0] = 4 1720b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 17330fd8204SBram Moolenaar const other = [5, 6, 7] 1740b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 17571abe482SBram Moolenaar 176cfcd011fSBram Moolenaar var varlist = [7, 8] 17730fd8204SBram Moolenaar const constlist = [1, varlist, 3] 17871abe482SBram Moolenaar varlist[0] = 77 17971abe482SBram Moolenaar # TODO: does not work yet 18071abe482SBram Moolenaar # constlist[1][1] = 88 181cfcd011fSBram Moolenaar var cl = constlist[1] 18271abe482SBram Moolenaar cl[1] = 88 18371abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 18471abe482SBram Moolenaar 185e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 186e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 18771abe482SBram Moolenaar vardict['five'] = 55 18871abe482SBram Moolenaar # TODO: does not work yet 18971abe482SBram Moolenaar # constdict['two']['six'] = 66 190cfcd011fSBram Moolenaar var cd = constdict['two'] 19171abe482SBram Moolenaar cd['six'] = 66 192e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 193dbeecb2bSBram Moolenaar END 194dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 19508052228SBram Moolenaarenddef 1968a7d6542SBram Moolenaar 1970b4c66c6SBram Moolenaardef Test_const_bang() 198cfcd011fSBram Moolenaar var lines =<< trim END 19930fd8204SBram Moolenaar const var = 234 2000b4c66c6SBram Moolenaar var = 99 2010b4c66c6SBram Moolenaar END 2020b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2030b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2040b4c66c6SBram Moolenaar 2050b4c66c6SBram Moolenaar lines =<< trim END 20630fd8204SBram Moolenaar const ll = [2, 3, 4] 2070b4c66c6SBram Moolenaar ll[0] = 99 2080b4c66c6SBram Moolenaar END 2090b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2100b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2110b4c66c6SBram Moolenaar 2120b4c66c6SBram Moolenaar lines =<< trim END 21330fd8204SBram Moolenaar const ll = [2, 3, 4] 2140b4c66c6SBram Moolenaar ll[3] = 99 2150b4c66c6SBram Moolenaar END 2160b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2170b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2180b4c66c6SBram Moolenaar 2190b4c66c6SBram Moolenaar lines =<< trim END 220e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2210b4c66c6SBram Moolenaar dd["one"] = 99 2220b4c66c6SBram Moolenaar END 2230b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2240b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2250b4c66c6SBram Moolenaar 2260b4c66c6SBram Moolenaar lines =<< trim END 227e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2280b4c66c6SBram Moolenaar dd["three"] = 99 2290b4c66c6SBram Moolenaar END 2300b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2310b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2320b4c66c6SBram Moolenaarenddef 2330b4c66c6SBram Moolenaar 234df069eecSBram Moolenaardef Test_range_no_colon() 235d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 236d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 237d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 238d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 239df069eecSBram Moolenaarenddef 240df069eecSBram Moolenaar 241df069eecSBram Moolenaar 2428a7d6542SBram Moolenaardef Test_block() 243cfcd011fSBram Moolenaar var outer = 1 2448a7d6542SBram Moolenaar { 245cfcd011fSBram Moolenaar var inner = 2 2468a7d6542SBram Moolenaar assert_equal(1, outer) 2478a7d6542SBram Moolenaar assert_equal(2, inner) 2488a7d6542SBram Moolenaar } 2498a7d6542SBram Moolenaar assert_equal(1, outer) 2508a7d6542SBram Moolenaarenddef 2518a7d6542SBram Moolenaar 25208052228SBram Moolenaardef Test_block_failure() 253cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 25408052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 25508052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 25608052228SBram Moolenaarenddef 2578a7d6542SBram Moolenaar 258fbbcd003SBram Moolenaardef Test_block_local_vars() 259fbbcd003SBram Moolenaar var lines =<< trim END 260fbbcd003SBram Moolenaar vim9script 261ed234f24SBram Moolenaar v:testing = 1 262fbbcd003SBram Moolenaar if true 263ed234f24SBram Moolenaar var text = ['hello'] 264ed234f24SBram Moolenaar def SayHello(): list<string> 265fbbcd003SBram Moolenaar return text 266fbbcd003SBram Moolenaar enddef 267fbbcd003SBram Moolenaar def SetText(v: string) 268ed234f24SBram Moolenaar text = [v] 269fbbcd003SBram Moolenaar enddef 270fbbcd003SBram Moolenaar endif 271fbbcd003SBram Moolenaar 272fbbcd003SBram Moolenaar if true 273ed234f24SBram Moolenaar var text = ['again'] 274ed234f24SBram Moolenaar def SayAgain(): list<string> 275fbbcd003SBram Moolenaar return text 276fbbcd003SBram Moolenaar enddef 277fbbcd003SBram Moolenaar endif 278ed234f24SBram Moolenaar 279ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 280ed234f24SBram Moolenaar test_garbagecollect_now() 281ed234f24SBram Moolenaar 282fbbcd003SBram Moolenaar defcompile 283fbbcd003SBram Moolenaar 284ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 285ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 286fbbcd003SBram Moolenaar 287fbbcd003SBram Moolenaar SetText('foobar') 288ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 289ed234f24SBram Moolenaar 290ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 291ed234f24SBram Moolenaar qall! 292fbbcd003SBram Moolenaar END 293ed234f24SBram Moolenaar 294ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 295ed234f24SBram Moolenaar # context gets garbage collected. 296ed234f24SBram Moolenaar writefile(lines, 'Xscript') 297ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 298ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 299ed234f24SBram Moolenaar 300ed234f24SBram Moolenaar delete('Xscript') 301ed234f24SBram Moolenaar delete('Xdidit') 302fbbcd003SBram Moolenaarenddef 303fbbcd003SBram Moolenaar 30439ca4127SBram Moolenaardef Test_block_local_vars_with_func() 30539ca4127SBram Moolenaar var lines =<< trim END 30639ca4127SBram Moolenaar vim9script 30739ca4127SBram Moolenaar if true 30839ca4127SBram Moolenaar var foo = 'foo' 30939ca4127SBram Moolenaar if true 31039ca4127SBram Moolenaar var bar = 'bar' 31139ca4127SBram Moolenaar def Func(): list<string> 31239ca4127SBram Moolenaar return [foo, bar] 31339ca4127SBram Moolenaar enddef 31439ca4127SBram Moolenaar endif 31539ca4127SBram Moolenaar endif 31639ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 31739ca4127SBram Moolenaar # "foo" and "bar" 31839ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 31939ca4127SBram Moolenaar END 32039ca4127SBram Moolenaar CheckScriptSuccess(lines) 32139ca4127SBram Moolenaarenddef 32239ca4127SBram Moolenaar 323d032f34aSBram Moolenaarfunc g:NoSuchFunc() 324d032f34aSBram Moolenaar echo 'none' 325d032f34aSBram Moolenaarendfunc 326d032f34aSBram Moolenaar 3279e1d9e34SBram Moolenaardef Test_try_catch_throw() 328cfcd011fSBram Moolenaar var l = [] 3297a092245SBram Moolenaar try # comment 3308a7d6542SBram Moolenaar add(l, '1') 3318a7d6542SBram Moolenaar throw 'wrong' 3328a7d6542SBram Moolenaar add(l, '2') 3337a092245SBram Moolenaar catch # comment 3348a7d6542SBram Moolenaar add(l, v:exception) 3357a092245SBram Moolenaar finally # comment 3368a7d6542SBram Moolenaar add(l, '3') 3377a092245SBram Moolenaar endtry # comment 3388a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 33968d130c6SBram Moolenaar 340e859312eSBram Moolenaar l = [] 341e859312eSBram Moolenaar try 342e859312eSBram Moolenaar try 343e859312eSBram Moolenaar add(l, '1') 344e859312eSBram Moolenaar throw 'wrong' 345e859312eSBram Moolenaar add(l, '2') 346e859312eSBram Moolenaar catch /right/ 347e859312eSBram Moolenaar add(l, v:exception) 348e859312eSBram Moolenaar endtry 349e859312eSBram Moolenaar catch /wrong/ 350e859312eSBram Moolenaar add(l, 'caught') 351373863edSBram Moolenaar fina 352e859312eSBram Moolenaar add(l, 'finally') 353e859312eSBram Moolenaar endtry 354e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 355e859312eSBram Moolenaar 356cfcd011fSBram Moolenaar var n: number 35768d130c6SBram Moolenaar try 35868d130c6SBram Moolenaar n = l[3] 35968d130c6SBram Moolenaar catch /E684:/ 36068d130c6SBram Moolenaar n = 99 36168d130c6SBram Moolenaar endtry 36268d130c6SBram Moolenaar assert_equal(99, n) 36368d130c6SBram Moolenaar 36469f7050cSBram Moolenaar var done = 'no' 36569f7050cSBram Moolenaar if 0 36669f7050cSBram Moolenaar try | catch | endtry 36769f7050cSBram Moolenaar else 36869f7050cSBram Moolenaar done = 'yes' 36969f7050cSBram Moolenaar endif 37069f7050cSBram Moolenaar assert_equal('yes', done) 37169f7050cSBram Moolenaar 37269f7050cSBram Moolenaar done = 'no' 37369f7050cSBram Moolenaar if 1 37469f7050cSBram Moolenaar done = 'yes' 37569f7050cSBram Moolenaar else 37669f7050cSBram Moolenaar try | catch | endtry 37769f7050cSBram Moolenaar done = 'never' 37869f7050cSBram Moolenaar endif 37969f7050cSBram Moolenaar assert_equal('yes', done) 38069f7050cSBram Moolenaar 38169f7050cSBram Moolenaar if 1 38269f7050cSBram Moolenaar else 38369f7050cSBram Moolenaar try | catch /pat/ | endtry 38469f7050cSBram Moolenaar try | catch /pat/ 38569f7050cSBram Moolenaar endtry 38669f7050cSBram Moolenaar try 38769f7050cSBram Moolenaar catch /pat/ | endtry 38869f7050cSBram Moolenaar try 38969f7050cSBram Moolenaar catch /pat/ 39069f7050cSBram Moolenaar endtry 39169f7050cSBram Moolenaar endif 39269f7050cSBram Moolenaar 39368d130c6SBram Moolenaar try 394cc673e74SBram Moolenaar # string slice returns a string, not a number 39568d130c6SBram Moolenaar n = g:astring[3] 3965e654230SBram Moolenaar catch /E1012:/ 39768d130c6SBram Moolenaar n = 77 39868d130c6SBram Moolenaar endtry 39968d130c6SBram Moolenaar assert_equal(77, n) 40068d130c6SBram Moolenaar 40168d130c6SBram Moolenaar try 40268d130c6SBram Moolenaar n = l[g:astring] 4035e654230SBram Moolenaar catch /E1012:/ 40456acb094SBram Moolenaar n = 88 40568d130c6SBram Moolenaar endtry 40656acb094SBram Moolenaar assert_equal(88, n) 40768d130c6SBram Moolenaar 40868d130c6SBram Moolenaar try 40968d130c6SBram Moolenaar n = s:does_not_exist 41068d130c6SBram Moolenaar catch /E121:/ 411f0b9f43cSBram Moolenaar n = 111 412f0b9f43cSBram Moolenaar endtry 413f0b9f43cSBram Moolenaar assert_equal(111, n) 414f0b9f43cSBram Moolenaar 415f0b9f43cSBram Moolenaar try 416f0b9f43cSBram Moolenaar n = g:does_not_exist 417f0b9f43cSBram Moolenaar catch /E121:/ 41868d130c6SBram Moolenaar n = 121 41968d130c6SBram Moolenaar endtry 42068d130c6SBram Moolenaar assert_equal(121, n) 42168d130c6SBram Moolenaar 422e0de171eSBram Moolenaar var d = {one: 1} 42368d130c6SBram Moolenaar try 42468d130c6SBram Moolenaar n = d[g:astring] 42568d130c6SBram Moolenaar catch /E716:/ 42668d130c6SBram Moolenaar n = 222 42768d130c6SBram Moolenaar endtry 42868d130c6SBram Moolenaar assert_equal(222, n) 429f0b9f43cSBram Moolenaar 430f0b9f43cSBram Moolenaar try 431f0b9f43cSBram Moolenaar n = -g:astring 432f0b9f43cSBram Moolenaar catch /E39:/ 433f0b9f43cSBram Moolenaar n = 233 434f0b9f43cSBram Moolenaar endtry 435f0b9f43cSBram Moolenaar assert_equal(233, n) 436f0b9f43cSBram Moolenaar 437f0b9f43cSBram Moolenaar try 438f0b9f43cSBram Moolenaar n = +g:astring 439f0b9f43cSBram Moolenaar catch /E1030:/ 440f0b9f43cSBram Moolenaar n = 244 441f0b9f43cSBram Moolenaar endtry 442f0b9f43cSBram Moolenaar assert_equal(244, n) 443f0b9f43cSBram Moolenaar 444f0b9f43cSBram Moolenaar try 445f0b9f43cSBram Moolenaar n = +g:alist 446f0b9f43cSBram Moolenaar catch /E745:/ 447f0b9f43cSBram Moolenaar n = 255 448f0b9f43cSBram Moolenaar endtry 449f0b9f43cSBram Moolenaar assert_equal(255, n) 450f0b9f43cSBram Moolenaar 451cfcd011fSBram Moolenaar var nd: dict<any> 452f0b9f43cSBram Moolenaar try 4532bede173SBram Moolenaar nd = {[g:anumber]: 1} 4545e654230SBram Moolenaar catch /E1012:/ 455f0b9f43cSBram Moolenaar n = 266 456f0b9f43cSBram Moolenaar endtry 457f0b9f43cSBram Moolenaar assert_equal(266, n) 458f0b9f43cSBram Moolenaar 459f0b9f43cSBram Moolenaar try 460f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 461f0b9f43cSBram Moolenaar catch /E1093:/ 462f0b9f43cSBram Moolenaar n = 277 463f0b9f43cSBram Moolenaar endtry 464f0b9f43cSBram Moolenaar assert_equal(277, n) 465f0b9f43cSBram Moolenaar 466e859312eSBram Moolenaar try 467e859312eSBram Moolenaar &ts = g:astring 4685e654230SBram Moolenaar catch /E1012:/ 469e859312eSBram Moolenaar n = 288 470e859312eSBram Moolenaar endtry 471e859312eSBram Moolenaar assert_equal(288, n) 472e859312eSBram Moolenaar 473e859312eSBram Moolenaar try 474e859312eSBram Moolenaar &backspace = 'asdf' 475e859312eSBram Moolenaar catch /E474:/ 476e859312eSBram Moolenaar n = 299 477e859312eSBram Moolenaar endtry 478e859312eSBram Moolenaar assert_equal(299, n) 479e859312eSBram Moolenaar 480e859312eSBram Moolenaar l = [1] 481e859312eSBram Moolenaar try 482e859312eSBram Moolenaar l[3] = 3 483e859312eSBram Moolenaar catch /E684:/ 484e859312eSBram Moolenaar n = 300 485e859312eSBram Moolenaar endtry 486e859312eSBram Moolenaar assert_equal(300, n) 487e859312eSBram Moolenaar 488e859312eSBram Moolenaar try 489e859312eSBram Moolenaar unlet g:does_not_exist 490e859312eSBram Moolenaar catch /E108:/ 491e859312eSBram Moolenaar n = 322 492e859312eSBram Moolenaar endtry 493e859312eSBram Moolenaar assert_equal(322, n) 494e859312eSBram Moolenaar 495e859312eSBram Moolenaar try 4962bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 497e859312eSBram Moolenaar catch /E721:/ 498e859312eSBram Moolenaar n = 333 499e859312eSBram Moolenaar endtry 500e859312eSBram Moolenaar assert_equal(333, n) 501e859312eSBram Moolenaar 502e859312eSBram Moolenaar try 503e859312eSBram Moolenaar l = DeletedFunc() 504e859312eSBram Moolenaar catch /E933:/ 505e859312eSBram Moolenaar n = 344 506e859312eSBram Moolenaar endtry 507e859312eSBram Moolenaar assert_equal(344, n) 508d032f34aSBram Moolenaar 509d032f34aSBram Moolenaar try 510d032f34aSBram Moolenaar echo len(v:true) 511d032f34aSBram Moolenaar catch /E701:/ 512d032f34aSBram Moolenaar n = 355 513d032f34aSBram Moolenaar endtry 514d032f34aSBram Moolenaar assert_equal(355, n) 515d032f34aSBram Moolenaar 516cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 517d032f34aSBram Moolenaar delfunc g:NoSuchFunc 518d032f34aSBram Moolenaar try 519d032f34aSBram Moolenaar echo P() 520d032f34aSBram Moolenaar catch /E117:/ 521d032f34aSBram Moolenaar n = 366 522d032f34aSBram Moolenaar endtry 523d032f34aSBram Moolenaar assert_equal(366, n) 524d032f34aSBram Moolenaar 525d032f34aSBram Moolenaar try 526d032f34aSBram Moolenaar echo g:NoSuchFunc() 527d032f34aSBram Moolenaar catch /E117:/ 528d032f34aSBram Moolenaar n = 377 529d032f34aSBram Moolenaar endtry 530d032f34aSBram Moolenaar assert_equal(377, n) 531d032f34aSBram Moolenaar 532d032f34aSBram Moolenaar try 533d032f34aSBram Moolenaar echo g:alist + 4 534d032f34aSBram Moolenaar catch /E745:/ 535d032f34aSBram Moolenaar n = 388 536d032f34aSBram Moolenaar endtry 537d032f34aSBram Moolenaar assert_equal(388, n) 538d032f34aSBram Moolenaar 539d032f34aSBram Moolenaar try 540d032f34aSBram Moolenaar echo 4 + g:alist 541d032f34aSBram Moolenaar catch /E745:/ 542d032f34aSBram Moolenaar n = 399 543d032f34aSBram Moolenaar endtry 544d032f34aSBram Moolenaar assert_equal(399, n) 545d032f34aSBram Moolenaar 546d032f34aSBram Moolenaar try 547d032f34aSBram Moolenaar echo g:alist.member 548d032f34aSBram Moolenaar catch /E715:/ 549d032f34aSBram Moolenaar n = 400 550d032f34aSBram Moolenaar endtry 551d032f34aSBram Moolenaar assert_equal(400, n) 552d032f34aSBram Moolenaar 553d032f34aSBram Moolenaar try 554d032f34aSBram Moolenaar echo d.member 555d032f34aSBram Moolenaar catch /E716:/ 556d032f34aSBram Moolenaar n = 411 557d032f34aSBram Moolenaar endtry 558d032f34aSBram Moolenaar assert_equal(411, n) 5598a7d6542SBram Moolenaarenddef 5608a7d6542SBram Moolenaar 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) 818*4bce26bbSBram Moolenaar 819*4bce26bbSBram Moolenaar lines =<< trim END 820*4bce26bbSBram Moolenaar [{ 821*4bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 822*4bce26bbSBram Moolenaar END 823*4bce26bbSBram 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:') 1744d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1745d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1746e8c4abbbSBram Moolenaarenddef 1747e8c4abbbSBram Moolenaar 17486d69bf60SBram Moolenaarlet g:bool_true = v:true 17496d69bf60SBram Moolenaarlet g:bool_false = v:false 17506d69bf60SBram Moolenaar 17516d69bf60SBram Moolenaardef Test_if_const_expr() 1752cfcd011fSBram Moolenaar var res = false 17536d69bf60SBram Moolenaar if true ? true : false 17546d69bf60SBram Moolenaar res = true 17556d69bf60SBram Moolenaar endif 17566d69bf60SBram Moolenaar assert_equal(true, res) 17576d69bf60SBram Moolenaar 1758585fea7bSBram Moolenaar g:glob = 2 1759585fea7bSBram Moolenaar if false 17606797966dSBram Moolenaar execute('g:glob = 3') 1761585fea7bSBram Moolenaar endif 1762585fea7bSBram Moolenaar assert_equal(2, g:glob) 1763585fea7bSBram Moolenaar if true 17646797966dSBram Moolenaar execute('g:glob = 3') 1765585fea7bSBram Moolenaar endif 1766585fea7bSBram Moolenaar assert_equal(3, g:glob) 1767585fea7bSBram Moolenaar 17686d69bf60SBram Moolenaar res = false 17696d69bf60SBram Moolenaar if g:bool_true ? true : false 17706d69bf60SBram Moolenaar res = true 17716d69bf60SBram Moolenaar endif 17726d69bf60SBram Moolenaar assert_equal(true, res) 17736d69bf60SBram Moolenaar 17746d69bf60SBram Moolenaar res = false 17756d69bf60SBram Moolenaar if true ? g:bool_true : false 17766d69bf60SBram Moolenaar res = true 17776d69bf60SBram Moolenaar endif 17786d69bf60SBram Moolenaar assert_equal(true, res) 17796d69bf60SBram Moolenaar 17806d69bf60SBram Moolenaar res = false 17816d69bf60SBram Moolenaar if true ? true : g:bool_false 17826d69bf60SBram Moolenaar res = true 17836d69bf60SBram Moolenaar endif 17846d69bf60SBram Moolenaar assert_equal(true, res) 17856d69bf60SBram Moolenaar 17866d69bf60SBram Moolenaar res = false 17876d69bf60SBram Moolenaar if true ? false : true 17886d69bf60SBram Moolenaar res = true 17896d69bf60SBram Moolenaar endif 17906d69bf60SBram Moolenaar assert_equal(false, res) 17916d69bf60SBram Moolenaar 17926d69bf60SBram Moolenaar res = false 17936d69bf60SBram Moolenaar if false ? false : true 17946d69bf60SBram Moolenaar res = true 17956d69bf60SBram Moolenaar endif 17966d69bf60SBram Moolenaar assert_equal(true, res) 17976d69bf60SBram Moolenaar 17986d69bf60SBram Moolenaar res = false 17996d69bf60SBram Moolenaar if false ? true : false 18006d69bf60SBram Moolenaar res = true 18016d69bf60SBram Moolenaar endif 18026d69bf60SBram Moolenaar assert_equal(false, res) 18036d69bf60SBram Moolenaar 18046d69bf60SBram Moolenaar res = false 1805e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1806e8c4abbbSBram Moolenaar res = true 1807e8c4abbbSBram Moolenaar endif 1808e8c4abbbSBram Moolenaar assert_equal(false, res) 1809e8c4abbbSBram Moolenaar 1810e8c4abbbSBram Moolenaar res = false 18116d69bf60SBram Moolenaar if true && true 18126d69bf60SBram Moolenaar res = true 18136d69bf60SBram Moolenaar endif 18146d69bf60SBram Moolenaar assert_equal(true, res) 18156d69bf60SBram Moolenaar 18166d69bf60SBram Moolenaar res = false 18176d69bf60SBram Moolenaar if true && false 18186d69bf60SBram Moolenaar res = true 18196d69bf60SBram Moolenaar endif 18206d69bf60SBram Moolenaar assert_equal(false, res) 18216d69bf60SBram Moolenaar 18226d69bf60SBram Moolenaar res = false 18236d69bf60SBram Moolenaar if g:bool_true && false 18246d69bf60SBram Moolenaar res = true 18256d69bf60SBram Moolenaar endif 18266d69bf60SBram Moolenaar assert_equal(false, res) 18276d69bf60SBram Moolenaar 18286d69bf60SBram Moolenaar res = false 18296d69bf60SBram Moolenaar if true && g:bool_false 18306d69bf60SBram Moolenaar res = true 18316d69bf60SBram Moolenaar endif 18326d69bf60SBram Moolenaar assert_equal(false, res) 18336d69bf60SBram Moolenaar 18346d69bf60SBram Moolenaar res = false 18356d69bf60SBram Moolenaar if false && false 18366d69bf60SBram Moolenaar res = true 18376d69bf60SBram Moolenaar endif 18386d69bf60SBram Moolenaar assert_equal(false, res) 18396d69bf60SBram Moolenaar 18406d69bf60SBram Moolenaar res = false 18416d69bf60SBram Moolenaar if true || false 18426d69bf60SBram Moolenaar res = true 18436d69bf60SBram Moolenaar endif 18446d69bf60SBram Moolenaar assert_equal(true, res) 18456d69bf60SBram Moolenaar 18466d69bf60SBram Moolenaar res = false 18476d69bf60SBram Moolenaar if g:bool_true || false 18486d69bf60SBram Moolenaar res = true 18496d69bf60SBram Moolenaar endif 18506d69bf60SBram Moolenaar assert_equal(true, res) 18516d69bf60SBram Moolenaar 18526d69bf60SBram Moolenaar res = false 18536d69bf60SBram Moolenaar if true || g:bool_false 18546d69bf60SBram Moolenaar res = true 18556d69bf60SBram Moolenaar endif 18566d69bf60SBram Moolenaar assert_equal(true, res) 18576d69bf60SBram Moolenaar 18586d69bf60SBram Moolenaar res = false 18596d69bf60SBram Moolenaar if false || false 18606d69bf60SBram Moolenaar res = true 18616d69bf60SBram Moolenaar endif 18626d69bf60SBram Moolenaar assert_equal(false, res) 18633988f64fSBram Moolenaar 18643988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 18653988f64fSBram Moolenaar if false | eval 0 | endif 18663988f64fSBram Moolenaar if false | eval burp + 234 | endif 18673988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 18683988f64fSBram Moolenaar if false 18693988f64fSBram Moolenaar burp 18703988f64fSBram Moolenaar endif 187180c34ca3SBram Moolenaarenddef 18726d69bf60SBram Moolenaar 187380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1874d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1875d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1876d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1877d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 18786d69bf60SBram Moolenaarenddef 18796d69bf60SBram Moolenaar 188072abcf42SBram Moolenaardef RunNested(i: number): number 1881cfcd011fSBram Moolenaar var x: number = 0 188272abcf42SBram Moolenaar if i % 2 188372abcf42SBram Moolenaar if 1 1884f5be8cdbSBram Moolenaar # comment 188572abcf42SBram Moolenaar else 1886f5be8cdbSBram Moolenaar # comment 188772abcf42SBram Moolenaar endif 188872abcf42SBram Moolenaar x += 1 188972abcf42SBram Moolenaar else 189072abcf42SBram Moolenaar x += 1000 189172abcf42SBram Moolenaar endif 189272abcf42SBram Moolenaar return x 189372abcf42SBram Moolenaarenddef 189472abcf42SBram Moolenaar 189572abcf42SBram Moolenaardef Test_nested_if() 189672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 189772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 189872abcf42SBram Moolenaarenddef 189972abcf42SBram Moolenaar 1900ad39c094SBram Moolenaardef Test_execute_cmd() 1901e4984290SBram Moolenaar # missing argument is ignored 1902e4984290SBram Moolenaar execute 1903e4984290SBram Moolenaar execute # comment 1904e4984290SBram Moolenaar 1905ad39c094SBram Moolenaar new 1906ad39c094SBram Moolenaar setline(1, 'default') 1907d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1908ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1909a72cfb80SBram Moolenaar 1910d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1911a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1912a72cfb80SBram Moolenaar 1913cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1914cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1915a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1916ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1917a72cfb80SBram Moolenaar 1918d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1919ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1920a72cfb80SBram Moolenaar 1921cfcd011fSBram Moolenaar var cmd_first = 'call ' 1922cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1923ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1924ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1925ad39c094SBram Moolenaar bwipe! 1926585fea7bSBram Moolenaar 1927cfcd011fSBram Moolenaar var n = true 19282d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19292d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19302d6b20d6SBram Moolenaar 1931e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1932e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1933e5abf7afSBram Moolenaar 1934d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1935d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1936d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1937ad39c094SBram Moolenaarenddef 1938ad39c094SBram Moolenaar 193947e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1940f5be8cdbSBram Moolenaar # only checks line continuation 1941cfcd011fSBram Moolenaar var lines =<< trim END 194247e880d6SBram Moolenaar vim9script 194347e880d6SBram Moolenaar execute 'g:someVar' 194447e880d6SBram Moolenaar .. ' = ' .. 194547e880d6SBram Moolenaar '28' 194647e880d6SBram Moolenaar assert_equal(28, g:someVar) 194747e880d6SBram Moolenaar unlet g:someVar 194847e880d6SBram Moolenaar END 194947e880d6SBram Moolenaar CheckScriptSuccess(lines) 195047e880d6SBram Moolenaarenddef 195147e880d6SBram Moolenaar 1952ad39c094SBram Moolenaardef Test_echo_cmd() 1953a72cfb80SBram Moolenaar echo 'some' # comment 1954585fea7bSBram Moolenaar echon 'thing' 1955ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1956ad39c094SBram Moolenaar 1957a72cfb80SBram Moolenaar echo "some" # comment 1958a72cfb80SBram Moolenaar echon "thing" 1959a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1960a72cfb80SBram Moolenaar 1961cfcd011fSBram Moolenaar var str1 = 'some' 1962cfcd011fSBram Moolenaar var str2 = 'more' 1963ad39c094SBram Moolenaar echo str1 str2 1964ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1965a72cfb80SBram Moolenaar 1966d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1967ad39c094SBram Moolenaarenddef 1968ad39c094SBram Moolenaar 1969f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1970f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1971f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1972f93c7feaSBram Moolenaar echo 'clear' 1973df069eecSBram Moolenaar :1messages 1974f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1975f93c7feaSBram Moolenaar 1976d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1977f93c7feaSBram Moolenaarenddef 1978f93c7feaSBram Moolenaar 197947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1980f5be8cdbSBram Moolenaar # only checks line continuation 1981cfcd011fSBram Moolenaar var lines =<< trim END 198247e880d6SBram Moolenaar vim9script 198347e880d6SBram Moolenaar echomsg 'here' 198447e880d6SBram Moolenaar .. ' is ' .. 198547e880d6SBram Moolenaar 'a message' 198647e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 198747e880d6SBram Moolenaar END 198847e880d6SBram Moolenaar CheckScriptSuccess(lines) 198947e880d6SBram Moolenaarenddef 199047e880d6SBram Moolenaar 1991f93c7feaSBram Moolenaardef Test_echoerr_cmd() 199240ee466cSBram Moolenaar try 199340ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 199440ee466cSBram Moolenaar catch 199540ee466cSBram Moolenaar assert_match('something wrong', v:exception) 199640ee466cSBram Moolenaar endtry 1997f93c7feaSBram Moolenaarenddef 1998f93c7feaSBram Moolenaar 199947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2000f5be8cdbSBram Moolenaar # only checks line continuation 2001cfcd011fSBram Moolenaar var lines =<< trim END 200247e880d6SBram Moolenaar vim9script 200347e880d6SBram Moolenaar try 200447e880d6SBram Moolenaar echoerr 'this' 200547e880d6SBram Moolenaar .. ' is ' .. 200647e880d6SBram Moolenaar 'wrong' 200747e880d6SBram Moolenaar catch 200847e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 200947e880d6SBram Moolenaar endtry 201047e880d6SBram Moolenaar END 201147e880d6SBram Moolenaar CheckScriptSuccess(lines) 201247e880d6SBram Moolenaarenddef 201347e880d6SBram Moolenaar 201441fe0617SBram Moolenaardef Test_for_outside_of_function() 2015cfcd011fSBram Moolenaar var lines =<< trim END 201641fe0617SBram Moolenaar vim9script 201741fe0617SBram Moolenaar new 201841fe0617SBram Moolenaar for var in range(0, 3) 201941fe0617SBram Moolenaar append(line('$'), var) 202041fe0617SBram Moolenaar endfor 202141fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 202241fe0617SBram Moolenaar bwipe! 202341fe0617SBram Moolenaar END 202441fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 202541fe0617SBram Moolenaar source Xvim9for.vim 202641fe0617SBram Moolenaar delete('Xvim9for.vim') 202741fe0617SBram Moolenaarenddef 20288a7d6542SBram Moolenaar 2029e8c4abbbSBram Moolenaardef Test_for_loop() 2030cfcd011fSBram Moolenaar var result = '' 2031e8c4abbbSBram Moolenaar for cnt in range(7) 2032e8c4abbbSBram Moolenaar if cnt == 4 2033e8c4abbbSBram Moolenaar break 2034e8c4abbbSBram Moolenaar endif 2035e8c4abbbSBram Moolenaar if cnt == 2 2036e8c4abbbSBram Moolenaar continue 2037e8c4abbbSBram Moolenaar endif 2038e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2039e8c4abbbSBram Moolenaar endfor 2040e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20410ad3e894SBram Moolenaar 2042cfcd011fSBram Moolenaar var concat = '' 20430ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20440ad3e894SBram Moolenaar concat ..= str 20450ad3e894SBram Moolenaar endfor 20460ad3e894SBram Moolenaar assert_equal('onetwo', concat) 204738bd8de5SBram Moolenaar 204838bd8de5SBram Moolenaar var total = 0 204938bd8de5SBram Moolenaar for nr in 205038bd8de5SBram Moolenaar [1, 2, 3] 205138bd8de5SBram Moolenaar total += nr 205238bd8de5SBram Moolenaar endfor 205338bd8de5SBram Moolenaar assert_equal(6, total) 205438bd8de5SBram Moolenaar 205538bd8de5SBram Moolenaar total = 0 205638bd8de5SBram Moolenaar for nr 205738bd8de5SBram Moolenaar in [1, 2, 3] 205838bd8de5SBram Moolenaar total += nr 205938bd8de5SBram Moolenaar endfor 206038bd8de5SBram Moolenaar assert_equal(6, total) 206138bd8de5SBram Moolenaar 206238bd8de5SBram Moolenaar total = 0 206338bd8de5SBram Moolenaar for nr 206438bd8de5SBram Moolenaar in 206538bd8de5SBram Moolenaar [1, 2, 3] 206638bd8de5SBram Moolenaar total += nr 206738bd8de5SBram Moolenaar endfor 206838bd8de5SBram Moolenaar assert_equal(6, total) 2069036d0714SBram Moolenaar 2070036d0714SBram Moolenaar var res = "" 2071036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2072036d0714SBram Moolenaar res ..= n .. s 2073036d0714SBram Moolenaar endfor 2074036d0714SBram Moolenaar assert_equal('1a2b', res) 2075e8c4abbbSBram Moolenaarenddef 2076e8c4abbbSBram Moolenaar 2077e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2078025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2079025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2080025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2081675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2082675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2083cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2084822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 20852d870f8dSBram Moolenaar delfunc! g:Func 2086451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2087675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2088675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2089675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2090e8c4abbbSBram Moolenaarenddef 2091e8c4abbbSBram Moolenaar 2092ea87069dSBram Moolenaardef Test_for_loop_script_var() 2093ea87069dSBram Moolenaar # cannot use s:var in a :def function 2094ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2095ea87069dSBram Moolenaar 2096ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2097ea87069dSBram Moolenaar var lines =<< trim END 2098ea87069dSBram Moolenaar vim9script 2099ea87069dSBram Moolenaar var total = 0 2100ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2101ea87069dSBram Moolenaar total += s:var 2102ea87069dSBram Moolenaar endfor 2103ea87069dSBram Moolenaar assert_equal(6, total) 2104ea87069dSBram Moolenaar 2105ea87069dSBram Moolenaar total = 0 2106ea87069dSBram Moolenaar for var in [1, 2, 3] 2107ea87069dSBram Moolenaar total += var 2108ea87069dSBram Moolenaar endfor 2109ea87069dSBram Moolenaar assert_equal(6, total) 2110ea87069dSBram Moolenaar END 2111ea87069dSBram Moolenaarenddef 2112ea87069dSBram Moolenaar 2113792f786aSBram Moolenaardef Test_for_loop_unpack() 21144b8a0651SBram Moolenaar var lines =<< trim END 2115792f786aSBram Moolenaar var result = [] 2116792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2117792f786aSBram Moolenaar result->add(v1) 2118792f786aSBram Moolenaar result->add(v2) 2119792f786aSBram Moolenaar endfor 2120792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2121792f786aSBram Moolenaar 2122792f786aSBram Moolenaar result = [] 2123792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2124792f786aSBram Moolenaar result->add(v1) 2125792f786aSBram Moolenaar result->add(v2) 2126792f786aSBram Moolenaar result->add(v3) 2127792f786aSBram Moolenaar endfor 2128792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2129792f786aSBram Moolenaar 21304b8a0651SBram Moolenaar result = [] 21314b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 21324b8a0651SBram Moolenaar result->add(&ts) 21334b8a0651SBram Moolenaar result->add(&sw) 21344b8a0651SBram Moolenaar endfor 21354b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 21364b8a0651SBram Moolenaar 21374b8a0651SBram Moolenaar var slist: list<string> 21384b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 21394b8a0651SBram Moolenaar slist->add($LOOPVAR) 21404b8a0651SBram Moolenaar slist->add(@r) 21414b8a0651SBram Moolenaar slist->add(v:errmsg) 21424b8a0651SBram Moolenaar endfor 21434b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 21444b8a0651SBram Moolenaar 21454b8a0651SBram Moolenaar slist = [] 21464b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 21474b8a0651SBram Moolenaar slist->add(g:globalvar) 21484b8a0651SBram Moolenaar slist->add(b:bufvar) 21494b8a0651SBram Moolenaar slist->add(w:winvar) 21504b8a0651SBram Moolenaar slist->add(t:tabvar) 21514b8a0651SBram Moolenaar endfor 21524b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2153f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 21544b8a0651SBram Moolenaar END 21554b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 21564b8a0651SBram Moolenaar 21574b8a0651SBram Moolenaar lines =<< trim END 2158792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2159792f786aSBram Moolenaar echo v1 v2 2160792f786aSBram Moolenaar endfor 2161792f786aSBram Moolenaar END 2162792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2163792f786aSBram Moolenaar 2164792f786aSBram Moolenaar lines =<< trim END 2165792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2166792f786aSBram Moolenaar echo v1 v2 2167792f786aSBram Moolenaar endfor 2168792f786aSBram Moolenaar END 2169792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2170792f786aSBram Moolenaar 2171792f786aSBram Moolenaar lines =<< trim END 2172792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2173792f786aSBram Moolenaar echo v1 2174792f786aSBram Moolenaar endfor 2175792f786aSBram Moolenaar END 2176792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2177792f786aSBram Moolenaarenddef 2178792f786aSBram Moolenaar 2179d0df1aacSBram Moolenaardef Test_while_loop() 2180cfcd011fSBram Moolenaar var result = '' 2181cfcd011fSBram Moolenaar var cnt = 0 2182d0df1aacSBram Moolenaar while cnt < 555 2183d0df1aacSBram Moolenaar if cnt == 3 2184d0df1aacSBram Moolenaar break 2185d0df1aacSBram Moolenaar endif 2186d0df1aacSBram Moolenaar cnt += 1 2187d0df1aacSBram Moolenaar if cnt == 2 2188d0df1aacSBram Moolenaar continue 2189d0df1aacSBram Moolenaar endif 2190d0df1aacSBram Moolenaar result ..= cnt .. '_' 2191d0df1aacSBram Moolenaar endwhile 2192d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2193d0df1aacSBram Moolenaarenddef 2194d0df1aacSBram Moolenaar 2195e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2196675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2197675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2198675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2199675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2200675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2201675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2202675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2203bd5da371SBram Moolenaarenddef 2204bd5da371SBram Moolenaar 22059645e2d9SBram Moolenaardef Test_interrupt_loop() 2206cfcd011fSBram Moolenaar var caught = false 2207cfcd011fSBram Moolenaar var x = 0 220897acfc78SBram Moolenaar try 22099645e2d9SBram Moolenaar while 1 22109645e2d9SBram Moolenaar x += 1 22119645e2d9SBram Moolenaar if x == 100 22129645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22139645e2d9SBram Moolenaar endif 22149645e2d9SBram Moolenaar endwhile 221597acfc78SBram Moolenaar catch 221697acfc78SBram Moolenaar caught = true 221797acfc78SBram Moolenaar assert_equal(100, x) 221897acfc78SBram Moolenaar endtry 221997acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 222025859dd7SBram Moolenaar # consume the CTRL-C 222125859dd7SBram Moolenaar getchar(0) 22229645e2d9SBram Moolenaarenddef 222320431c9dSBram Moolenaar 22244fdae999SBram Moolenaardef Test_automatic_line_continuation() 2225cfcd011fSBram Moolenaar var mylist = [ 22264fdae999SBram Moolenaar 'one', 22274fdae999SBram Moolenaar 'two', 22284fdae999SBram Moolenaar 'three', 2229f5be8cdbSBram Moolenaar ] # comment 22304fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 22314fdae999SBram Moolenaar 2232cfcd011fSBram Moolenaar var mydict = { 2233e0de171eSBram Moolenaar ['one']: 1, 2234e0de171eSBram Moolenaar ['two']: 2, 2235e0de171eSBram Moolenaar ['three']: 22364fdae999SBram Moolenaar 3, 2237f5be8cdbSBram Moolenaar } # comment 2238e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2239e0de171eSBram Moolenaar mydict = { 22402c330432SBram Moolenaar one: 1, # comment 22412c330432SBram Moolenaar two: # comment 22422c330432SBram Moolenaar 2, # comment 22432c330432SBram Moolenaar three: 3 # comment 22442c330432SBram Moolenaar } 2245e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2246e0de171eSBram Moolenaar mydict = { 22472c330432SBram Moolenaar one: 1, 22484fdae999SBram Moolenaar two: 22494fdae999SBram Moolenaar 2, 22502c330432SBram Moolenaar three: 3 22514fdae999SBram Moolenaar } 2252e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2253e6085c53SBram Moolenaar 2254e6085c53SBram Moolenaar assert_equal( 2255e6085c53SBram Moolenaar ['one', 'two', 'three'], 2256e6085c53SBram Moolenaar split('one two three') 2257e6085c53SBram Moolenaar ) 22584fdae999SBram Moolenaarenddef 22594fdae999SBram Moolenaar 22607a092245SBram Moolenaardef Test_vim9_comment() 22617a092245SBram Moolenaar CheckScriptSuccess([ 22627a092245SBram Moolenaar 'vim9script', 22637a092245SBram Moolenaar '# something', 226493f82cbeSBram Moolenaar '#something', 226593f82cbeSBram Moolenaar '#{something', 22667a092245SBram Moolenaar ]) 226793f82cbeSBram Moolenaar 226893f82cbeSBram Moolenaar split Xfile 226993f82cbeSBram Moolenaar CheckScriptSuccess([ 227093f82cbeSBram Moolenaar 'vim9script', 227193f82cbeSBram Moolenaar 'edit #something', 227293f82cbeSBram Moolenaar ]) 227393f82cbeSBram Moolenaar CheckScriptSuccess([ 227493f82cbeSBram Moolenaar 'vim9script', 227593f82cbeSBram Moolenaar 'edit #{something', 227693f82cbeSBram Moolenaar ]) 227793f82cbeSBram Moolenaar close 227893f82cbeSBram Moolenaar 22797a092245SBram Moolenaar CheckScriptFailure([ 22807a092245SBram Moolenaar 'vim9script', 22817a092245SBram Moolenaar ':# something', 22827a092245SBram Moolenaar ], 'E488:') 22837a092245SBram Moolenaar CheckScriptFailure([ 22847a092245SBram Moolenaar '# something', 22857a092245SBram Moolenaar ], 'E488:') 22867a092245SBram Moolenaar CheckScriptFailure([ 22877a092245SBram Moolenaar ':# something', 22887a092245SBram Moolenaar ], 'E488:') 22897a092245SBram Moolenaar 22904a8d9f2eSBram Moolenaar { # block start 22914a8d9f2eSBram Moolenaar } # block end 22924a8d9f2eSBram Moolenaar CheckDefFailure([ 22934a8d9f2eSBram Moolenaar '{# comment', 22944a8d9f2eSBram Moolenaar ], 'E488:') 22954a8d9f2eSBram Moolenaar CheckDefFailure([ 22964a8d9f2eSBram Moolenaar '{', 22974a8d9f2eSBram Moolenaar '}# comment', 22984a8d9f2eSBram Moolenaar ], 'E488:') 22994a8d9f2eSBram Moolenaar 23004a8d9f2eSBram Moolenaar echo "yes" # comment 23014a8d9f2eSBram Moolenaar CheckDefFailure([ 23024a8d9f2eSBram Moolenaar 'echo "yes"# comment', 23034a8d9f2eSBram Moolenaar ], 'E488:') 23047a092245SBram Moolenaar CheckScriptSuccess([ 23057a092245SBram Moolenaar 'vim9script', 23067a092245SBram Moolenaar 'echo "yes" # something', 23077a092245SBram Moolenaar ]) 23087a092245SBram Moolenaar CheckScriptFailure([ 23097a092245SBram Moolenaar 'vim9script', 23107a092245SBram Moolenaar 'echo "yes"# something', 23117a092245SBram Moolenaar ], 'E121:') 23127a092245SBram Moolenaar CheckScriptFailure([ 23137a092245SBram Moolenaar 'vim9script', 23147a092245SBram Moolenaar 'echo# something', 2315f8103f27SBram Moolenaar ], 'E1144:') 23167a092245SBram Moolenaar CheckScriptFailure([ 23177a092245SBram Moolenaar 'echo "yes" # something', 23187a092245SBram Moolenaar ], 'E121:') 23197a092245SBram Moolenaar 23204a8d9f2eSBram Moolenaar exe "echo" # comment 23214a8d9f2eSBram Moolenaar CheckDefFailure([ 23224a8d9f2eSBram Moolenaar 'exe "echo"# comment', 23234a8d9f2eSBram Moolenaar ], 'E488:') 23244a8d9f2eSBram Moolenaar CheckScriptSuccess([ 23254a8d9f2eSBram Moolenaar 'vim9script', 23264a8d9f2eSBram Moolenaar 'exe "echo" # something', 23274a8d9f2eSBram Moolenaar ]) 23284a8d9f2eSBram Moolenaar CheckScriptFailure([ 23294a8d9f2eSBram Moolenaar 'vim9script', 23304a8d9f2eSBram Moolenaar 'exe "echo"# something', 23314a8d9f2eSBram Moolenaar ], 'E121:') 23324a8d9f2eSBram Moolenaar CheckScriptFailure([ 23334a8d9f2eSBram Moolenaar 'vim9script', 23344a8d9f2eSBram Moolenaar 'exe# something', 2335f8103f27SBram Moolenaar ], 'E1144:') 23364a8d9f2eSBram Moolenaar CheckScriptFailure([ 23374a8d9f2eSBram Moolenaar 'exe "echo" # something', 23384a8d9f2eSBram Moolenaar ], 'E121:') 23394a8d9f2eSBram Moolenaar 23407a092245SBram Moolenaar CheckDefFailure([ 23417a092245SBram Moolenaar 'try# comment', 23427a092245SBram Moolenaar ' echo "yes"', 23437a092245SBram Moolenaar 'catch', 23447a092245SBram Moolenaar 'endtry', 2345f8103f27SBram Moolenaar ], 'E1144:') 23462c5ed4e3SBram Moolenaar CheckScriptFailure([ 23472c5ed4e3SBram Moolenaar 'vim9script', 23482c5ed4e3SBram Moolenaar 'try# comment', 23492c5ed4e3SBram Moolenaar 'echo "yes"', 2350f8103f27SBram Moolenaar ], 'E1144:') 23517a092245SBram Moolenaar CheckDefFailure([ 23527a092245SBram Moolenaar 'try', 2353a72cfb80SBram Moolenaar ' throw#comment', 2354a72cfb80SBram Moolenaar 'catch', 2355a72cfb80SBram Moolenaar 'endtry', 2356f8103f27SBram Moolenaar ], 'E1144:') 2357a72cfb80SBram Moolenaar CheckDefFailure([ 2358a72cfb80SBram Moolenaar 'try', 2359a72cfb80SBram Moolenaar ' throw "yes"#comment', 2360a72cfb80SBram Moolenaar 'catch', 2361a72cfb80SBram Moolenaar 'endtry', 2362a72cfb80SBram Moolenaar ], 'E488:') 2363a72cfb80SBram Moolenaar CheckDefFailure([ 2364a72cfb80SBram Moolenaar 'try', 23657a092245SBram Moolenaar ' echo "yes"', 23667a092245SBram Moolenaar 'catch# comment', 23677a092245SBram Moolenaar 'endtry', 2368f8103f27SBram Moolenaar ], 'E1144:') 23692c5ed4e3SBram Moolenaar CheckScriptFailure([ 23702c5ed4e3SBram Moolenaar 'vim9script', 23712c5ed4e3SBram Moolenaar 'try', 23722c5ed4e3SBram Moolenaar ' echo "yes"', 23732c5ed4e3SBram Moolenaar 'catch# comment', 23742c5ed4e3SBram Moolenaar 'endtry', 2375f8103f27SBram Moolenaar ], 'E1144:') 23762c5ed4e3SBram Moolenaar CheckDefFailure([ 23772c5ed4e3SBram Moolenaar 'try', 23782c5ed4e3SBram Moolenaar ' echo "yes"', 23792c5ed4e3SBram Moolenaar 'catch /pat/# comment', 23802c5ed4e3SBram Moolenaar 'endtry', 23812c5ed4e3SBram Moolenaar ], 'E488:') 23827a092245SBram Moolenaar CheckDefFailure([ 23837a092245SBram Moolenaar 'try', 23847a092245SBram Moolenaar 'echo "yes"', 23857a092245SBram Moolenaar 'catch', 23867a092245SBram Moolenaar 'endtry# comment', 2387f8103f27SBram Moolenaar ], 'E1144:') 23882c5ed4e3SBram Moolenaar CheckScriptFailure([ 23892c5ed4e3SBram Moolenaar 'vim9script', 23902c5ed4e3SBram Moolenaar 'try', 23912c5ed4e3SBram Moolenaar ' echo "yes"', 23922c5ed4e3SBram Moolenaar 'catch', 23932c5ed4e3SBram Moolenaar 'endtry# comment', 2394f8103f27SBram Moolenaar ], 'E1144:') 23952c5ed4e3SBram Moolenaar 23962c5ed4e3SBram Moolenaar CheckScriptSuccess([ 23972c5ed4e3SBram Moolenaar 'vim9script', 23982c5ed4e3SBram Moolenaar 'hi # comment', 23992c5ed4e3SBram Moolenaar ]) 24002c5ed4e3SBram Moolenaar CheckScriptFailure([ 24012c5ed4e3SBram Moolenaar 'vim9script', 24022c5ed4e3SBram Moolenaar 'hi# comment', 2403f8103f27SBram Moolenaar ], 'E1144:') 24041966c248SBram Moolenaar CheckScriptSuccess([ 24051966c248SBram Moolenaar 'vim9script', 24061966c248SBram Moolenaar 'hi Search # comment', 24071966c248SBram Moolenaar ]) 24081966c248SBram Moolenaar CheckScriptFailure([ 24091966c248SBram Moolenaar 'vim9script', 24101966c248SBram Moolenaar 'hi Search# comment', 24111966c248SBram Moolenaar ], 'E416:') 24121966c248SBram Moolenaar CheckScriptSuccess([ 24131966c248SBram Moolenaar 'vim9script', 24141966c248SBram Moolenaar 'hi link This Search # comment', 24151966c248SBram Moolenaar ]) 24161966c248SBram Moolenaar CheckScriptFailure([ 24171966c248SBram Moolenaar 'vim9script', 24181966c248SBram Moolenaar 'hi link This That# comment', 24191966c248SBram Moolenaar ], 'E413:') 24201966c248SBram Moolenaar CheckScriptSuccess([ 24211966c248SBram Moolenaar 'vim9script', 24221966c248SBram Moolenaar 'hi clear This # comment', 24231966c248SBram Moolenaar 'hi clear # comment', 24241966c248SBram Moolenaar ]) 2425f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2426f5be8cdbSBram Moolenaar # hi clear This# comment', 24271966c248SBram Moolenaar CheckScriptFailure([ 24281966c248SBram Moolenaar 'vim9script', 24291966c248SBram Moolenaar 'hi clear# comment', 24301966c248SBram Moolenaar ], 'E416:') 24311966c248SBram Moolenaar 24321966c248SBram Moolenaar CheckScriptSuccess([ 24331966c248SBram Moolenaar 'vim9script', 24341966c248SBram Moolenaar 'hi Group term=bold', 24351966c248SBram Moolenaar 'match Group /todo/ # comment', 24361966c248SBram Moolenaar ]) 24371966c248SBram Moolenaar CheckScriptFailure([ 24381966c248SBram Moolenaar 'vim9script', 24391966c248SBram Moolenaar 'hi Group term=bold', 24401966c248SBram Moolenaar 'match Group /todo/# comment', 24411966c248SBram Moolenaar ], 'E488:') 24421966c248SBram Moolenaar CheckScriptSuccess([ 24431966c248SBram Moolenaar 'vim9script', 24441966c248SBram Moolenaar 'match # comment', 24451966c248SBram Moolenaar ]) 24461966c248SBram Moolenaar CheckScriptFailure([ 24471966c248SBram Moolenaar 'vim9script', 24481966c248SBram Moolenaar 'match# comment', 2449f8103f27SBram Moolenaar ], 'E1144:') 24501966c248SBram Moolenaar CheckScriptSuccess([ 24511966c248SBram Moolenaar 'vim9script', 24521966c248SBram Moolenaar 'match none # comment', 24531966c248SBram Moolenaar ]) 24541966c248SBram Moolenaar CheckScriptFailure([ 24551966c248SBram Moolenaar 'vim9script', 24561966c248SBram Moolenaar 'match none# comment', 24571966c248SBram Moolenaar ], 'E475:') 24581966c248SBram Moolenaar 24591966c248SBram Moolenaar CheckScriptSuccess([ 24601966c248SBram Moolenaar 'vim9script', 24611966c248SBram Moolenaar 'menutrans clear # comment', 24621966c248SBram Moolenaar ]) 24631966c248SBram Moolenaar CheckScriptFailure([ 24641966c248SBram Moolenaar 'vim9script', 24651966c248SBram Moolenaar 'menutrans clear# comment text', 24661966c248SBram Moolenaar ], 'E474:') 24671966c248SBram Moolenaar 24681966c248SBram Moolenaar CheckScriptSuccess([ 24691966c248SBram Moolenaar 'vim9script', 24701966c248SBram Moolenaar 'syntax clear # comment', 24711966c248SBram Moolenaar ]) 24721966c248SBram Moolenaar CheckScriptFailure([ 24731966c248SBram Moolenaar 'vim9script', 24741966c248SBram Moolenaar 'syntax clear# comment text', 24751966c248SBram Moolenaar ], 'E28:') 24761966c248SBram Moolenaar CheckScriptSuccess([ 24771966c248SBram Moolenaar 'vim9script', 24781966c248SBram Moolenaar 'syntax keyword Word some', 24791966c248SBram Moolenaar 'syntax clear Word # comment', 24801966c248SBram Moolenaar ]) 24811966c248SBram Moolenaar CheckScriptFailure([ 24821966c248SBram Moolenaar 'vim9script', 24831966c248SBram Moolenaar 'syntax keyword Word some', 24841966c248SBram Moolenaar 'syntax clear Word# comment text', 24851966c248SBram Moolenaar ], 'E28:') 24861966c248SBram Moolenaar 24871966c248SBram Moolenaar CheckScriptSuccess([ 24881966c248SBram Moolenaar 'vim9script', 24891966c248SBram Moolenaar 'syntax list # comment', 24901966c248SBram Moolenaar ]) 24911966c248SBram Moolenaar CheckScriptFailure([ 24921966c248SBram Moolenaar 'vim9script', 24931966c248SBram Moolenaar 'syntax list# comment text', 24941966c248SBram Moolenaar ], 'E28:') 24951966c248SBram Moolenaar 24961966c248SBram Moolenaar CheckScriptSuccess([ 24971966c248SBram Moolenaar 'vim9script', 24981966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 24991966c248SBram Moolenaar ]) 25001966c248SBram Moolenaar CheckScriptFailure([ 25011966c248SBram Moolenaar 'vim9script', 25021966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 25031966c248SBram Moolenaar ], 'E475:') 25041966c248SBram Moolenaar 25051966c248SBram Moolenaar CheckScriptSuccess([ 25061966c248SBram Moolenaar 'vim9script', 25071966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 25081966c248SBram Moolenaar ]) 25091966c248SBram Moolenaar CheckScriptFailure([ 25101966c248SBram Moolenaar 'vim9script', 25111966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25121966c248SBram Moolenaar ], 'E789:') 25131966c248SBram Moolenaar 25141966c248SBram Moolenaar CheckScriptSuccess([ 25151966c248SBram Moolenaar 'vim9script', 25161966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 25171966c248SBram Moolenaar ]) 25181966c248SBram Moolenaar CheckScriptFailure([ 25191966c248SBram Moolenaar 'vim9script', 25201966c248SBram Moolenaar 'syntax match Word /pat/# comment', 25211966c248SBram Moolenaar ], 'E402:') 25221966c248SBram Moolenaar 25231966c248SBram Moolenaar CheckScriptSuccess([ 25241966c248SBram Moolenaar 'vim9script', 25251966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 25261966c248SBram Moolenaar ]) 25271966c248SBram Moolenaar CheckScriptFailure([ 25281966c248SBram Moolenaar 'vim9script', 25291966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 25301966c248SBram Moolenaar ], 'E475:') 25311966c248SBram Moolenaar CheckScriptFailure([ 25321966c248SBram Moolenaar 'vim9script', 25331966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 25341966c248SBram Moolenaar ], 'E406:') 25351966c248SBram Moolenaar CheckScriptFailure([ 25361966c248SBram Moolenaar 'vim9script', 25371966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 25381966c248SBram Moolenaar ], 'E475:') 25391966c248SBram Moolenaar 25401966c248SBram Moolenaar CheckScriptSuccess([ 25411966c248SBram Moolenaar 'vim9script', 25421966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 25431966c248SBram Moolenaar ]) 25441966c248SBram Moolenaar CheckScriptFailure([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2547d032f34aSBram Moolenaar ], 'E402:') 25481966c248SBram Moolenaar 25491966c248SBram Moolenaar CheckScriptSuccess([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'syntax sync # comment', 25521966c248SBram Moolenaar ]) 25531966c248SBram Moolenaar CheckScriptFailure([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'syntax sync# comment', 25561966c248SBram Moolenaar ], 'E404:') 25571966c248SBram Moolenaar CheckScriptSuccess([ 25581966c248SBram Moolenaar 'vim9script', 25591966c248SBram Moolenaar 'syntax sync ccomment # comment', 25601966c248SBram Moolenaar ]) 25611966c248SBram Moolenaar CheckScriptFailure([ 25621966c248SBram Moolenaar 'vim9script', 25631966c248SBram Moolenaar 'syntax sync ccomment# comment', 25641966c248SBram Moolenaar ], 'E404:') 25651966c248SBram Moolenaar 25661966c248SBram Moolenaar CheckScriptSuccess([ 25671966c248SBram Moolenaar 'vim9script', 25681966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 25691966c248SBram Moolenaar ]) 25701966c248SBram Moolenaar CheckScriptFailure([ 25711966c248SBram Moolenaar 'vim9script', 25721966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 25731966c248SBram Moolenaar ], 'E475:') 2574a72cfb80SBram Moolenaar 2575a72cfb80SBram Moolenaar CheckScriptSuccess([ 2576a72cfb80SBram Moolenaar 'vim9script', 2577a72cfb80SBram Moolenaar 'command Echo echo # comment', 2578a72cfb80SBram Moolenaar 'command Echo # comment', 25792d870f8dSBram Moolenaar 'delcommand Echo', 2580a72cfb80SBram Moolenaar ]) 2581a72cfb80SBram Moolenaar CheckScriptFailure([ 2582a72cfb80SBram Moolenaar 'vim9script', 2583a72cfb80SBram Moolenaar 'command Echo echo# comment', 2584a72cfb80SBram Moolenaar 'Echo', 2585f8103f27SBram Moolenaar ], 'E1144:') 25862d870f8dSBram Moolenaar delcommand Echo 258770249ee8SBram Moolenaar 258870249ee8SBram Moolenaar var curdir = getcwd() 258970249ee8SBram Moolenaar CheckScriptSuccess([ 259070249ee8SBram Moolenaar 'command Echo cd " comment', 259170249ee8SBram Moolenaar 'Echo', 259270249ee8SBram Moolenaar 'delcommand Echo', 259370249ee8SBram Moolenaar ]) 259470249ee8SBram Moolenaar CheckScriptSuccess([ 2595090728adSBram Moolenaar 'vim9script', 259670249ee8SBram Moolenaar 'command Echo cd # comment', 259770249ee8SBram Moolenaar 'Echo', 259870249ee8SBram Moolenaar 'delcommand Echo', 259970249ee8SBram Moolenaar ]) 260070249ee8SBram Moolenaar CheckScriptFailure([ 260170249ee8SBram Moolenaar 'vim9script', 260270249ee8SBram Moolenaar 'command Echo cd " comment', 260370249ee8SBram Moolenaar 'Echo', 260470249ee8SBram Moolenaar ], 'E344:') 260570249ee8SBram Moolenaar delcommand Echo 260670249ee8SBram Moolenaar chdir(curdir) 260770249ee8SBram Moolenaar 2608a72cfb80SBram Moolenaar CheckScriptFailure([ 2609a72cfb80SBram Moolenaar 'vim9script', 2610a72cfb80SBram Moolenaar 'command Echo# comment', 2611a72cfb80SBram Moolenaar ], 'E182:') 2612a72cfb80SBram Moolenaar CheckScriptFailure([ 2613a72cfb80SBram Moolenaar 'vim9script', 2614a72cfb80SBram Moolenaar 'command Echo echo', 2615a72cfb80SBram Moolenaar 'command Echo# comment', 2616a72cfb80SBram Moolenaar ], 'E182:') 26172d870f8dSBram Moolenaar delcommand Echo 2618a72cfb80SBram Moolenaar 2619a72cfb80SBram Moolenaar CheckScriptSuccess([ 2620a72cfb80SBram Moolenaar 'vim9script', 2621a72cfb80SBram Moolenaar 'function # comment', 2622a72cfb80SBram Moolenaar ]) 2623a72cfb80SBram Moolenaar CheckScriptFailure([ 2624a72cfb80SBram Moolenaar 'vim9script', 26259898107fSBram Moolenaar 'function " comment', 26269898107fSBram Moolenaar ], 'E129:') 26279898107fSBram Moolenaar CheckScriptFailure([ 26289898107fSBram Moolenaar 'vim9script', 2629a72cfb80SBram Moolenaar 'function# comment', 2630f8103f27SBram Moolenaar ], 'E1144:') 2631a72cfb80SBram Moolenaar CheckScriptSuccess([ 2632a72cfb80SBram Moolenaar 'vim9script', 2633a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2634a72cfb80SBram Moolenaar ]) 2635a72cfb80SBram Moolenaar CheckScriptFailure([ 2636a72cfb80SBram Moolenaar 'vim9script', 2637a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2638a72cfb80SBram Moolenaar ], 'E488:') 2639a72cfb80SBram Moolenaar 2640a72cfb80SBram Moolenaar CheckScriptSuccess([ 2641a72cfb80SBram Moolenaar 'vim9script', 26424c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2643a72cfb80SBram Moolenaar 'endfunc', 26444c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2645a72cfb80SBram Moolenaar ]) 2646a72cfb80SBram Moolenaar CheckScriptFailure([ 2647a72cfb80SBram Moolenaar 'vim9script', 26484c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2649a72cfb80SBram Moolenaar 'endfunc', 26504c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2651a72cfb80SBram Moolenaar ], 'E488:') 2652a72cfb80SBram Moolenaar 2653a72cfb80SBram Moolenaar CheckScriptSuccess([ 2654a72cfb80SBram Moolenaar 'vim9script', 2655a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2656a72cfb80SBram Moolenaar ]) 2657a72cfb80SBram Moolenaar CheckScriptFailure([ 2658a72cfb80SBram Moolenaar 'vim9script', 2659a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2660a72cfb80SBram Moolenaar ], 'E488:') 2661e7e4838fSBram Moolenaar 2662e7e4838fSBram Moolenaar CheckScriptFailure([ 2663e7e4838fSBram Moolenaar 'def Test() " comment', 2664e7e4838fSBram Moolenaar 'enddef', 2665e7e4838fSBram Moolenaar ], 'E488:') 2666e7e4838fSBram Moolenaar CheckScriptFailure([ 2667e7e4838fSBram Moolenaar 'vim9script', 2668e7e4838fSBram Moolenaar 'def Test() " comment', 2669e7e4838fSBram Moolenaar 'enddef', 2670e7e4838fSBram Moolenaar ], 'E488:') 2671e7e4838fSBram Moolenaar 2672e7e4838fSBram Moolenaar CheckScriptSuccess([ 2673e7e4838fSBram Moolenaar 'func Test() " comment', 2674e7e4838fSBram Moolenaar 'endfunc', 26752d870f8dSBram Moolenaar 'delfunc Test', 2676e7e4838fSBram Moolenaar ]) 26779898107fSBram Moolenaar CheckScriptSuccess([ 2678e7e4838fSBram Moolenaar 'vim9script', 2679e7e4838fSBram Moolenaar 'func Test() " comment', 2680e7e4838fSBram Moolenaar 'endfunc', 26819898107fSBram Moolenaar ]) 2682e7e4838fSBram Moolenaar 2683e7e4838fSBram Moolenaar CheckScriptSuccess([ 2684e7e4838fSBram Moolenaar 'def Test() # comment', 2685e7e4838fSBram Moolenaar 'enddef', 2686e7e4838fSBram Moolenaar ]) 2687e7e4838fSBram Moolenaar CheckScriptFailure([ 2688e7e4838fSBram Moolenaar 'func Test() # comment', 2689e7e4838fSBram Moolenaar 'endfunc', 2690e7e4838fSBram Moolenaar ], 'E488:') 26912c5ed4e3SBram Moolenaarenddef 26922c5ed4e3SBram Moolenaar 26932c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 26942c5ed4e3SBram Moolenaar CheckCanRunGui 26952c5ed4e3SBram Moolenaar 26962c5ed4e3SBram Moolenaar CheckScriptFailure([ 26972c5ed4e3SBram Moolenaar 'vim9script', 26982c5ed4e3SBram Moolenaar 'gui#comment' 2699f8103f27SBram Moolenaar ], 'E1144:') 27002c5ed4e3SBram Moolenaar CheckScriptFailure([ 27012c5ed4e3SBram Moolenaar 'vim9script', 27022c5ed4e3SBram Moolenaar 'gui -f#comment' 27032c5ed4e3SBram Moolenaar ], 'E499:') 27047a092245SBram Moolenaarenddef 27057a092245SBram Moolenaar 2706a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 27076797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 27086797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2709a26b9700SBram Moolenaar 2710a26b9700SBram Moolenaar edit test.vim 2711a26b9700SBram Moolenaar doautocmd TabEnter #comment 2712a26b9700SBram Moolenaar assert_equal(1, g:entered) 2713a26b9700SBram Moolenaar 2714a26b9700SBram Moolenaar doautocmd TabEnter f.x 2715a26b9700SBram Moolenaar assert_equal(2, g:entered) 2716a26b9700SBram Moolenaar 2717a26b9700SBram Moolenaar g:entered = 0 2718a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2719a26b9700SBram Moolenaar assert_equal(2, g:entered) 2720a26b9700SBram Moolenaar 2721a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2722a26b9700SBram Moolenaar 2723a26b9700SBram Moolenaar au! TabEnter 2724a26b9700SBram Moolenaar unlet g:entered 2725d72c1bf0SBram Moolenaar 2726d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2727d72c1bf0SBram Moolenaar 'vim9script', 27286797966dSBram Moolenaar 'g:var = 123', 2729e55b1c09SBram Moolenaar 'b:var = 456', 2730e55b1c09SBram Moolenaar 'w:var = 777', 2731e55b1c09SBram Moolenaar 't:var = 888', 2732d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2733d72c1bf0SBram Moolenaar ]) 2734d72c1bf0SBram Moolenaar 2735d72c1bf0SBram Moolenaar CheckScriptFailure([ 2736d72c1bf0SBram Moolenaar 'vim9script', 2737cfcd011fSBram Moolenaar 'let var = 123', 2738cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2739cfcd011fSBram Moolenaar 2740cfcd011fSBram Moolenaar CheckScriptFailure([ 2741cfcd011fSBram Moolenaar 'vim9script', 2742cfcd011fSBram Moolenaar 'var g:var = 123', 2743e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2744e55b1c09SBram Moolenaar 2745e55b1c09SBram Moolenaar CheckScriptFailure([ 2746e55b1c09SBram Moolenaar 'vim9script', 2747cfcd011fSBram Moolenaar 'var b:var = 123', 2748e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2749e55b1c09SBram Moolenaar 2750e55b1c09SBram Moolenaar CheckScriptFailure([ 2751e55b1c09SBram Moolenaar 'vim9script', 2752cfcd011fSBram Moolenaar 'var w:var = 123', 2753e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2754e55b1c09SBram Moolenaar 2755e55b1c09SBram Moolenaar CheckScriptFailure([ 2756e55b1c09SBram Moolenaar 'vim9script', 2757cfcd011fSBram Moolenaar 'var t:var = 123', 2758e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2759e55b1c09SBram Moolenaar 2760e55b1c09SBram Moolenaar CheckScriptFailure([ 2761e55b1c09SBram Moolenaar 'vim9script', 2762cfcd011fSBram Moolenaar 'var v:version = 123', 2763e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2764e55b1c09SBram Moolenaar 2765e55b1c09SBram Moolenaar CheckScriptFailure([ 2766e55b1c09SBram Moolenaar 'vim9script', 2767cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2768e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 27696797966dSBram Moolenaar 27706797966dSBram Moolenaar CheckScriptFailure([ 27716797966dSBram Moolenaar 'vim9script', 27726797966dSBram Moolenaar 'g:var = 123', 277332e35117SBram Moolenaar 'unlet g:var# comment1', 2774d72c1bf0SBram Moolenaar ], 'E108:') 2775d72c1bf0SBram Moolenaar 2776d72c1bf0SBram Moolenaar CheckScriptFailure([ 2777d72c1bf0SBram Moolenaar 'let g:var = 123', 2778d72c1bf0SBram Moolenaar 'unlet g:var # something', 2779d72c1bf0SBram Moolenaar ], 'E488:') 2780faac4104SBram Moolenaar 2781faac4104SBram Moolenaar CheckScriptSuccess([ 2782faac4104SBram Moolenaar 'vim9script', 278332e35117SBram Moolenaar 'if 1 # comment2', 2784faac4104SBram Moolenaar ' echo "yes"', 2785faac4104SBram Moolenaar 'elseif 2 #comment', 2786faac4104SBram Moolenaar ' echo "no"', 2787faac4104SBram Moolenaar 'endif', 2788faac4104SBram Moolenaar ]) 2789faac4104SBram Moolenaar 2790faac4104SBram Moolenaar CheckScriptFailure([ 2791faac4104SBram Moolenaar 'vim9script', 279232e35117SBram Moolenaar 'if 1# comment3', 2793faac4104SBram Moolenaar ' echo "yes"', 2794faac4104SBram Moolenaar 'endif', 2795faac4104SBram Moolenaar ], 'E15:') 2796faac4104SBram Moolenaar 2797faac4104SBram Moolenaar CheckScriptFailure([ 2798faac4104SBram Moolenaar 'vim9script', 279932e35117SBram Moolenaar 'if 0 # comment4', 2800faac4104SBram Moolenaar ' echo "yes"', 2801faac4104SBram Moolenaar 'elseif 2#comment', 2802faac4104SBram Moolenaar ' echo "no"', 2803faac4104SBram Moolenaar 'endif', 2804faac4104SBram Moolenaar ], 'E15:') 2805faac4104SBram Moolenaar 2806faac4104SBram Moolenaar CheckScriptSuccess([ 2807faac4104SBram Moolenaar 'vim9script', 2808cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2809faac4104SBram Moolenaar ]) 2810faac4104SBram Moolenaar 2811faac4104SBram Moolenaar CheckScriptFailure([ 2812faac4104SBram Moolenaar 'vim9script', 2813cfcd011fSBram Moolenaar 'var v = 1# comment6', 281432e35117SBram Moolenaar ], 'E15:') 2815faac4104SBram Moolenaar 2816faac4104SBram Moolenaar CheckScriptSuccess([ 2817faac4104SBram Moolenaar 'vim9script', 2818faac4104SBram Moolenaar 'new' 2819d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2820df069eecSBram Moolenaar ':$', 2821faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2822faac4104SBram Moolenaar 'bwipe!', 2823faac4104SBram Moolenaar ]) 2824faac4104SBram Moolenaar 2825f5be8cdbSBram Moolenaar CheckScriptFailure([ 2826f5be8cdbSBram Moolenaar 'vim9script', 2827f5be8cdbSBram Moolenaar 'new' 2828d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2829f5be8cdbSBram Moolenaar ':$', 2830f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2831f5be8cdbSBram Moolenaar 'bwipe!', 2832f5be8cdbSBram Moolenaar ], 'E488:') 2833f5be8cdbSBram Moolenaar 2834f5be8cdbSBram Moolenaar CheckScriptFailure([ 2835f5be8cdbSBram Moolenaar 'vim9script', 2836f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2837f5be8cdbSBram Moolenaar ], 'E477:') 2838a26b9700SBram Moolenaarenddef 2839a26b9700SBram Moolenaar 28407e5bd91dSBram Moolenaardef Test_finish() 2841cfcd011fSBram Moolenaar var lines =<< trim END 28427e5bd91dSBram Moolenaar vim9script 28436797966dSBram Moolenaar g:res = 'one' 28447e5bd91dSBram Moolenaar if v:false | finish | endif 28456797966dSBram Moolenaar g:res = 'two' 28467e5bd91dSBram Moolenaar finish 28476797966dSBram Moolenaar g:res = 'three' 28487e5bd91dSBram Moolenaar END 28497e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 28507e5bd91dSBram Moolenaar source Xfinished 28517e5bd91dSBram Moolenaar assert_equal('two', g:res) 28527e5bd91dSBram Moolenaar 28537e5bd91dSBram Moolenaar unlet g:res 28547e5bd91dSBram Moolenaar delete('Xfinished') 28557e5bd91dSBram Moolenaarenddef 28567e5bd91dSBram Moolenaar 2857a5d0077eSBram Moolenaardef Test_forward_declaration() 2858cfcd011fSBram Moolenaar var lines =<< trim END 2859a5d0077eSBram Moolenaar vim9script 2860a5d0077eSBram Moolenaar def GetValue(): string 2861a5d0077eSBram Moolenaar return theVal 2862a5d0077eSBram Moolenaar enddef 2863cfcd011fSBram Moolenaar var theVal = 'something' 2864822ba247SBram Moolenaar g:initVal = GetValue() 2865a5d0077eSBram Moolenaar theVal = 'else' 2866a5d0077eSBram Moolenaar g:laterVal = GetValue() 2867a5d0077eSBram Moolenaar END 2868a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2869a5d0077eSBram Moolenaar source Xforward 2870a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2871a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2872a5d0077eSBram Moolenaar 2873a5d0077eSBram Moolenaar unlet g:initVal 2874a5d0077eSBram Moolenaar unlet g:laterVal 2875a5d0077eSBram Moolenaar delete('Xforward') 2876a5d0077eSBram Moolenaarenddef 2877a5d0077eSBram Moolenaar 28789721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2879a6294955SBram Moolenaar var vim9_lines =<< trim END 2880a6294955SBram Moolenaar vim9script 2881a6294955SBram Moolenaar var local = 'local' 2882a6294955SBram Moolenaar g:global = 'global' 2883a6294955SBram Moolenaar export var exported = 'exported' 2884a6294955SBram Moolenaar export def GetText(): string 2885a6294955SBram Moolenaar return 'text' 2886a6294955SBram Moolenaar enddef 2887a6294955SBram Moolenaar END 2888a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2889a6294955SBram Moolenaar 2890cfcd011fSBram Moolenaar var legacy_lines =<< trim END 28919721fb4eSBram Moolenaar source Xvim9_script.vim 28929721fb4eSBram Moolenaar 28939721fb4eSBram Moolenaar call assert_false(exists('local')) 28949721fb4eSBram Moolenaar call assert_false(exists('exported')) 28959721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 28969721fb4eSBram Moolenaar call assert_equal('global', global) 28979721fb4eSBram Moolenaar call assert_equal('global', g:global) 28989721fb4eSBram Moolenaar 28999721fb4eSBram Moolenaar " imported variable becomes script-local 29009721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29019721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29029721fb4eSBram Moolenaar call assert_false(exists('exported')) 29039721fb4eSBram Moolenaar 29049721fb4eSBram Moolenaar " imported function becomes script-local 29059721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29069721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29079721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29089721fb4eSBram Moolenaar END 29099721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29109721fb4eSBram Moolenaar 29119721fb4eSBram Moolenaar source Xlegacy_script.vim 29129721fb4eSBram Moolenaar assert_equal('global', g:global) 2913f5be8cdbSBram Moolenaar unlet g:global 29149721fb4eSBram Moolenaar 29159721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 29169721fb4eSBram Moolenaar delete('Xvim9_script.vim') 29179721fb4eSBram Moolenaarenddef 2918a5d0077eSBram Moolenaar 29197d699701SBram Moolenaarfunc Test_vim9script_not_global() 29207d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 29217d699701SBram Moolenaar let vim9lines =<< trim END 29227d699701SBram Moolenaar vim9script 2923cfcd011fSBram Moolenaar var name = 'local' 29247d699701SBram Moolenaar func TheFunc() 29257d699701SBram Moolenaar echo 'local' 29267d699701SBram Moolenaar endfunc 29277d699701SBram Moolenaar def DefFunc() 29287d699701SBram Moolenaar echo 'local' 29297d699701SBram Moolenaar enddef 29307d699701SBram Moolenaar END 29317d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 29327d699701SBram Moolenaar source Xvim9script.vim 29337d699701SBram Moolenaar try 29347d699701SBram Moolenaar echo g:var 29357d699701SBram Moolenaar assert_report('did not fail') 29367d699701SBram Moolenaar catch /E121:/ 29377d699701SBram Moolenaar " caught 29387d699701SBram Moolenaar endtry 29397d699701SBram Moolenaar try 29407d699701SBram Moolenaar call TheFunc() 29417d699701SBram Moolenaar assert_report('did not fail') 29427d699701SBram Moolenaar catch /E117:/ 29437d699701SBram Moolenaar " caught 29447d699701SBram Moolenaar endtry 29457d699701SBram Moolenaar try 29467d699701SBram Moolenaar call DefFunc() 29477d699701SBram Moolenaar assert_report('did not fail') 29487d699701SBram Moolenaar catch /E117:/ 29497d699701SBram Moolenaar " caught 29507d699701SBram Moolenaar endtry 29517d699701SBram Moolenaar 295225859dd7SBram Moolenaar call delete('Xvim9script.vim') 29537d699701SBram Moolenaarendfunc 29547d699701SBram Moolenaar 2955eeb27bfeSBram Moolenaardef Test_vim9_copen() 2956eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2957eeb27bfeSBram Moolenaar copen 2958eeb27bfeSBram Moolenaar quit 2959eeb27bfeSBram Moolenaarenddef 2960eeb27bfeSBram Moolenaar 296103290b84SBram Moolenaar" test using an auto-loaded function and variable 29622d6b20d6SBram Moolenaardef Test_vim9_autoload() 2963cfcd011fSBram Moolenaar var lines =<< trim END 29642d6b20d6SBram Moolenaar vim9script 296503290b84SBram Moolenaar def some#gettest(): string 296603290b84SBram Moolenaar return 'test' 296703290b84SBram Moolenaar enddef 296803290b84SBram Moolenaar g:some#name = 'name' 296903290b84SBram Moolenaar END 297003290b84SBram Moolenaar 297103290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 297203290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 297303290b84SBram Moolenaar var save_rtp = &rtp 297403290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 297503290b84SBram Moolenaar 297603290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 297703290b84SBram Moolenaar assert_equal('name', g:some#name) 297803290b84SBram Moolenaar g:some#other = 'other' 297903290b84SBram Moolenaar assert_equal('other', g:some#other) 298003290b84SBram Moolenaar 298117f700acSBram Moolenaar # upper case script name works 298217f700acSBram Moolenaar lines =<< trim END 298317f700acSBram Moolenaar vim9script 298417f700acSBram Moolenaar def Other#getOther(): string 298517f700acSBram Moolenaar return 'other' 298617f700acSBram Moolenaar enddef 298717f700acSBram Moolenaar END 298817f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 298917f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 299017f700acSBram Moolenaar 299103290b84SBram Moolenaar delete('Xdir', 'rf') 299203290b84SBram Moolenaar &rtp = save_rtp 299303290b84SBram Moolenaarenddef 299403290b84SBram Moolenaar 299503290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 299603290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 299703290b84SBram Moolenaar var lines =<< trim END 299803290b84SBram Moolenaar vim9script 29992d6b20d6SBram Moolenaar def foo#test() 30002d6b20d6SBram Moolenaar echomsg getreg('"') 30012d6b20d6SBram Moolenaar enddef 30022d6b20d6SBram Moolenaar END 30032d6b20d6SBram Moolenaar 30042d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 30052d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3006cfcd011fSBram Moolenaar var save_rtp = &rtp 30072d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 30082d6b20d6SBram Moolenaar augroup test 30092d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 30102d6b20d6SBram Moolenaar augroup END 30112d6b20d6SBram Moolenaar 30122d6b20d6SBram Moolenaar normal Y 30132d6b20d6SBram Moolenaar 30142d6b20d6SBram Moolenaar augroup test 30152d6b20d6SBram Moolenaar autocmd! 30162d6b20d6SBram Moolenaar augroup END 30172d6b20d6SBram Moolenaar delete('Xdir', 'rf') 30182d6b20d6SBram Moolenaar &rtp = save_rtp 30192d6b20d6SBram Moolenaarenddef 30202d6b20d6SBram Moolenaar 302177e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 302277e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3023cfcd011fSBram Moolenaar var lines =<< trim END 302477e5dcc3SBram Moolenaar vim9script 302577e5dcc3SBram Moolenaar def crash#func() 302677e5dcc3SBram Moolenaar try 302777e5dcc3SBram Moolenaar for x in List() 302877e5dcc3SBram Moolenaar endfor 302977e5dcc3SBram Moolenaar catch 303077e5dcc3SBram Moolenaar endtry 303177e5dcc3SBram Moolenaar g:ok = true 303277e5dcc3SBram Moolenaar enddef 303377e5dcc3SBram Moolenaar fu List() 303477e5dcc3SBram Moolenaar invalid 303577e5dcc3SBram Moolenaar endfu 303677e5dcc3SBram Moolenaar try 303748e11c10SBram Moolenaar alsoinvalid 303877e5dcc3SBram Moolenaar catch /wontmatch/ 303977e5dcc3SBram Moolenaar endtry 304077e5dcc3SBram Moolenaar END 304177e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 304277e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 304377e5dcc3SBram Moolenaar 304477e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 304577e5dcc3SBram Moolenaar lines =<< trim END 304677e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 304777e5dcc3SBram Moolenaar call crash#func() 304877e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 30499c4f5520SBram Moolenaar qall! 305077e5dcc3SBram Moolenaar END 305177e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 305277e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 305377e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 305477e5dcc3SBram Moolenaar 305577e5dcc3SBram Moolenaar delete('Xdidit') 305677e5dcc3SBram Moolenaar delete('Xscript') 305777e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 305803290b84SBram Moolenaar 305903290b84SBram Moolenaar lines =<< trim END 306003290b84SBram Moolenaar vim9script 306103290b84SBram Moolenaar var foo#bar = 'asdf' 306203290b84SBram Moolenaar END 306303290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 306477e5dcc3SBram Moolenaarenddef 306577e5dcc3SBram Moolenaar 306681e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 306781e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 306881e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3069cfcd011fSBram Moolenaar var lines =<< trim END 307081e17fbeSBram Moolenaar let s:counter = 1 307181e17fbeSBram Moolenaar def s:Func() 307281e17fbeSBram Moolenaar au! CursorHold 307381e17fbeSBram Moolenaar au CursorHold * s:counter += 1 307481e17fbeSBram Moolenaar enddef 307581e17fbeSBram Moolenaar call s:Func() 307681e17fbeSBram Moolenaar doau CursorHold 307781e17fbeSBram Moolenaar call assert_equal(2, s:counter) 307881e17fbeSBram Moolenaar au! CursorHold 307981e17fbeSBram Moolenaar END 308081e17fbeSBram Moolenaar CheckScriptSuccess(lines) 308181e17fbeSBram Moolenaarenddef 308281e17fbeSBram Moolenaar 30833896a105SBram Moolenaardef Test_cmdline_win() 30843896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 30853896a105SBram Moolenaar # the command line window. 30863896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3087cfcd011fSBram Moolenaar var export_lines =<< trim END 30883896a105SBram Moolenaar vim9script 3089cfcd011fSBram Moolenaar export var That = 'yes' 30903896a105SBram Moolenaar END 30913896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3092cfcd011fSBram Moolenaar var import_lines =<< trim END 30933896a105SBram Moolenaar vim9script 30943896a105SBram Moolenaar import That from './Xexport.vim' 30953896a105SBram Moolenaar END 30963896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3097cfcd011fSBram Moolenaar var save_rtp = &rtp 30983896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 30993896a105SBram Moolenaar syntax on 31003896a105SBram Moolenaar augroup CmdWin 31013896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 31023896a105SBram Moolenaar augroup END 31033896a105SBram Moolenaar # this will open and also close the cmdline window 31043896a105SBram Moolenaar feedkeys('q:', 'xt') 31053896a105SBram Moolenaar assert_equal('yes', g:got_there) 31063896a105SBram Moolenaar 31073896a105SBram Moolenaar augroup CmdWin 31083896a105SBram Moolenaar au! 31093896a105SBram Moolenaar augroup END 31103896a105SBram Moolenaar &rtp = save_rtp 31113896a105SBram Moolenaar delete('rtp', 'rf') 31123896a105SBram Moolenaarenddef 31133896a105SBram Moolenaar 3114e3d4685fSBram Moolenaardef Test_invalid_sid() 3115e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 311625859dd7SBram Moolenaar 31179c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3118d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3119e3d4685fSBram Moolenaar endif 3120e3d4685fSBram Moolenaar delete('Xdidit') 3121e3d4685fSBram Moolenaarenddef 3122e3d4685fSBram Moolenaar 31239ec7026fSBram Moolenaardef Test_restoring_cpo() 31249ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 31259ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 31269ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 31279ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 31289ec7026fSBram Moolenaar endif 31299ec7026fSBram Moolenaar delete('Xsourced') 31309ec7026fSBram Moolenaar delete('Xclose') 3131090728adSBram Moolenaar delete('Xdone') 31329ec7026fSBram Moolenaarenddef 31339ec7026fSBram Moolenaar 31349ec7026fSBram Moolenaar 3135f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3136cfcd011fSBram Moolenaar var lines =<< trim END 3137cfcd011fSBram Moolenaar var name: any 3138cfcd011fSBram Moolenaar assert_equal(0, name) 3139f0afd9e1SBram Moolenaar END 3140f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3141f0afd9e1SBram Moolenaarenddef 3142f0afd9e1SBram Moolenaar 31437e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 314458dbef33SBram Moolenaar CheckRunVimInTerminal 314558dbef33SBram Moolenaar 31467e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 31477e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 31487e9210eaSBram Moolenaarendfunc 31497e9210eaSBram Moolenaar 31507e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 31519c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3152cfcd011fSBram Moolenaar var lines =<< trim END 31539c4f5520SBram Moolenaar func CheckAndQuit() 31549c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 31559c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 31569c4f5520SBram Moolenaar endfunc 31579c4f5520SBram Moolenaar END 31589c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 31599c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3160e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 31619c4f5520SBram Moolenaar # define Afunc() on the command line 31629c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 31639c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 31642949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 31659c4f5520SBram Moolenaar 31669c4f5520SBram Moolenaar call StopVimInTerminal(buf) 31679c4f5520SBram Moolenaar delete('XcallFunc') 31689c4f5520SBram Moolenaar delete('Xdidcmd') 31699c4f5520SBram Moolenaarenddef 31709c4f5520SBram Moolenaar 3171fcdc5d83SBram Moolenaardef Test_script_var_scope() 3172fcdc5d83SBram Moolenaar var lines =<< trim END 3173fcdc5d83SBram Moolenaar vim9script 3174fcdc5d83SBram Moolenaar if true 3175fcdc5d83SBram Moolenaar if true 3176fcdc5d83SBram Moolenaar var one = 'one' 3177fcdc5d83SBram Moolenaar echo one 3178fcdc5d83SBram Moolenaar endif 3179fcdc5d83SBram Moolenaar echo one 3180fcdc5d83SBram Moolenaar endif 3181fcdc5d83SBram Moolenaar END 3182fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3183fcdc5d83SBram Moolenaar 3184fcdc5d83SBram Moolenaar lines =<< trim END 3185fcdc5d83SBram Moolenaar vim9script 3186fcdc5d83SBram Moolenaar if true 3187fcdc5d83SBram Moolenaar if false 3188fcdc5d83SBram Moolenaar var one = 'one' 3189fcdc5d83SBram Moolenaar echo one 3190fcdc5d83SBram Moolenaar else 3191fcdc5d83SBram Moolenaar var one = 'one' 3192fcdc5d83SBram Moolenaar echo one 3193fcdc5d83SBram Moolenaar endif 3194fcdc5d83SBram Moolenaar echo one 3195fcdc5d83SBram Moolenaar endif 3196fcdc5d83SBram Moolenaar END 3197fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3198fcdc5d83SBram Moolenaar 3199fcdc5d83SBram Moolenaar lines =<< trim END 3200fcdc5d83SBram Moolenaar vim9script 3201fcdc5d83SBram Moolenaar while true 3202fcdc5d83SBram Moolenaar var one = 'one' 3203fcdc5d83SBram Moolenaar echo one 3204fcdc5d83SBram Moolenaar break 3205fcdc5d83SBram Moolenaar endwhile 3206fcdc5d83SBram Moolenaar echo one 3207fcdc5d83SBram Moolenaar END 3208fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3209fcdc5d83SBram Moolenaar 3210fcdc5d83SBram Moolenaar lines =<< trim END 3211fcdc5d83SBram Moolenaar vim9script 3212fcdc5d83SBram Moolenaar for i in range(1) 3213fcdc5d83SBram Moolenaar var one = 'one' 3214fcdc5d83SBram Moolenaar echo one 3215fcdc5d83SBram Moolenaar endfor 3216fcdc5d83SBram Moolenaar echo one 3217fcdc5d83SBram Moolenaar END 3218fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 32199becdf2bSBram Moolenaar 32209becdf2bSBram Moolenaar lines =<< trim END 32219becdf2bSBram Moolenaar vim9script 32229becdf2bSBram Moolenaar { 32239becdf2bSBram Moolenaar var one = 'one' 32249becdf2bSBram Moolenaar assert_equal('one', one) 32259becdf2bSBram Moolenaar } 32269becdf2bSBram Moolenaar assert_false(exists('one')) 32279becdf2bSBram Moolenaar assert_false(exists('s:one')) 32289becdf2bSBram Moolenaar END 32299becdf2bSBram Moolenaar CheckScriptSuccess(lines) 32309becdf2bSBram Moolenaar 32319becdf2bSBram Moolenaar lines =<< trim END 32329becdf2bSBram Moolenaar vim9script 32339becdf2bSBram Moolenaar { 32349becdf2bSBram Moolenaar var one = 'one' 32359becdf2bSBram Moolenaar echo one 32369becdf2bSBram Moolenaar } 32379becdf2bSBram Moolenaar echo one 32389becdf2bSBram Moolenaar END 32399becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3240fcdc5d83SBram Moolenaarenddef 3241fcdc5d83SBram Moolenaar 3242352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3243352134bbSBram Moolenaar var lines =<< trim END 3244352134bbSBram Moolenaar vim9script 3245352134bbSBram Moolenaar def Callback(...l: any) 3246352134bbSBram Moolenaar try 3247352134bbSBram Moolenaar var x: string 3248352134bbSBram Moolenaar var y: string 3249352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3250352134bbSBram Moolenaar [x, y] = [''] 3251352134bbSBram Moolenaar catch 3252352134bbSBram Moolenaar g:caught = 'yes' 3253352134bbSBram Moolenaar endtry 3254352134bbSBram Moolenaar enddef 3255e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3256352134bbSBram Moolenaar feedkeys("\r", 'xt') 3257352134bbSBram Moolenaar END 3258352134bbSBram Moolenaar CheckScriptSuccess(lines) 3259352134bbSBram Moolenaar 3260352134bbSBram Moolenaar unlet g:caught 3261352134bbSBram Moolenaarenddef 3262352134bbSBram Moolenaar 3263631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3264631e8f93SBram Moolenaar if !has('unix') || !has('job') 3265631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3266631e8f93SBram Moolenaar endif 3267631e8f93SBram Moolenaar var lines =<< trim END 3268631e8f93SBram Moolenaar vim9script 3269631e8f93SBram Moolenaar var source: list<number> 3270631e8f93SBram Moolenaar def Out_cb(...l: any) 3271631e8f93SBram Moolenaar eval [][0] 3272631e8f93SBram Moolenaar enddef 3273631e8f93SBram Moolenaar def Exit_cb(...l: any) 3274631e8f93SBram Moolenaar sleep 1m 3275631e8f93SBram Moolenaar source += l 3276631e8f93SBram Moolenaar enddef 3277e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 32786f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 32796f17a3f0SBram Moolenaar sleep 10m 32806f17a3f0SBram Moolenaar endwhile 32816f17a3f0SBram Moolenaar sleep 10m 3282631e8f93SBram Moolenaar END 3283631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3284631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3285631e8f93SBram Moolenaar delete('Xdef') 3286631e8f93SBram Moolenaarenddef 3287631e8f93SBram Moolenaar 32884324d87aSBram Moolenaardef InvokeNormal() 32894324d87aSBram Moolenaar exe "norm! :m+1\r" 32904324d87aSBram Moolenaarenddef 32914324d87aSBram Moolenaar 32924324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 32934324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 32944324d87aSBram Moolenaar new 32954324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 32964324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 32974324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 32984324d87aSBram Moolenaar xunmap <F3> 3299b5b9480eSBram Moolenaarenddef 3300b5b9480eSBram Moolenaar 3301b5b9480eSBram Moolenaardef Test_white_space_after_command() 3302b5b9480eSBram Moolenaar var lines =<< trim END 3303b5b9480eSBram Moolenaar exit_cb: Func}) 3304b5b9480eSBram Moolenaar END 3305b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3306f8103f27SBram Moolenaar 3307f8103f27SBram Moolenaar lines =<< trim END 3308f8103f27SBram Moolenaar e# 3309f8103f27SBram Moolenaar END 3310f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 33114324d87aSBram Moolenaarenddef 33124324d87aSBram Moolenaar 33134aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 33144aab88d9SBram Moolenaar var lines =<< trim END 33154aab88d9SBram Moolenaar vim9script 33164aab88d9SBram Moolenaar if exists('g:guard') 33174aab88d9SBram Moolenaar finish 33184aab88d9SBram Moolenaar endif 33194aab88d9SBram Moolenaar g:guard = 1 33204aab88d9SBram Moolenaar var name = 'thename' 33214aab88d9SBram Moolenaar def g:GetName(): string 33224aab88d9SBram Moolenaar return name 33234aab88d9SBram Moolenaar enddef 33244aab88d9SBram Moolenaar def g:SetName(arg: string) 33254aab88d9SBram Moolenaar name = arg 33264aab88d9SBram Moolenaar enddef 33274aab88d9SBram Moolenaar END 33284aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 33294aab88d9SBram Moolenaar so XscriptTwice.vim 33304aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 33314aab88d9SBram Moolenaar g:SetName('newname') 33324aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 33334aab88d9SBram Moolenaar so XscriptTwice.vim 33344aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33354aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 33364aab88d9SBram Moolenaar 33374aab88d9SBram Moolenaar delfunc g:GetName 33384aab88d9SBram Moolenaar delfunc g:SetName 33394aab88d9SBram Moolenaar delete('XscriptTwice.vim') 33404aab88d9SBram Moolenaar unlet g:guard 33414aab88d9SBram Moolenaarenddef 33424aab88d9SBram Moolenaar 33434aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 33444aab88d9SBram Moolenaar var exportlines =<< trim END 33454aab88d9SBram Moolenaar vim9script 33464aab88d9SBram Moolenaar if exists('g:guard') 33474aab88d9SBram Moolenaar finish 33484aab88d9SBram Moolenaar endif 33494aab88d9SBram Moolenaar g:guard = 1 33504aab88d9SBram Moolenaar export var name = 'someName' 33514aab88d9SBram Moolenaar END 33524aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 33534aab88d9SBram Moolenaar 33544aab88d9SBram Moolenaar var lines =<< trim END 33554aab88d9SBram Moolenaar vim9script 33564aab88d9SBram Moolenaar import name from './XexportScript.vim' 33574aab88d9SBram Moolenaar def g:GetName(): string 33584aab88d9SBram Moolenaar return name 33594aab88d9SBram Moolenaar enddef 33604aab88d9SBram Moolenaar END 33614aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 33624aab88d9SBram Moolenaar so XscriptImport.vim 33634aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 33644aab88d9SBram Moolenaar 33654aab88d9SBram Moolenaar so XexportScript.vim 33664aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 33674aab88d9SBram Moolenaar 33684aab88d9SBram Moolenaar delfunc g:GetName 33694aab88d9SBram Moolenaar delete('XexportScript.vim') 33704aab88d9SBram Moolenaar delete('XscriptImport.vim') 33714aab88d9SBram Moolenaar unlet g:guard 33724aab88d9SBram Moolenaarenddef 33734aab88d9SBram Moolenaar 3374585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3375585fea7bSBram Moolenaardef Test_substitute_cmd() 3376585fea7bSBram Moolenaar new 3377585fea7bSBram Moolenaar setline(1, 'something') 3378585fea7bSBram Moolenaar :substitute(some(other( 3379585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3380585fea7bSBram Moolenaar bwipe! 3381585fea7bSBram Moolenaar 3382f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3383cfcd011fSBram Moolenaar var lines =<< trim END 3384585fea7bSBram Moolenaar vim9script 3385585fea7bSBram Moolenaar new 3386585fea7bSBram Moolenaar setline(1, 'something') 3387585fea7bSBram Moolenaar :substitute(some(other( 3388585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3389585fea7bSBram Moolenaar bwipe! 3390585fea7bSBram Moolenaar END 3391585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3392585fea7bSBram Moolenaar source Xvim9lines 3393585fea7bSBram Moolenaar 3394585fea7bSBram Moolenaar delete('Xvim9lines') 3395585fea7bSBram Moolenaarenddef 3396585fea7bSBram Moolenaar 33978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3398