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)) 25*b8554304SBram Moolenaar 26*b8554304SBram Moolenaar # missing command does not print the line 27*b8554304SBram Moolenaar var lines =<< trim END 28*b8554304SBram Moolenaar vim9script 29*b8554304SBram Moolenaar :1| 30*b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 31*b8554304SBram Moolenaar :| 32*b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 33*b8554304SBram Moolenaar END 34*b8554304SBram Moolenaar CheckScriptSuccess(lines) 35*b8554304SBram Moolenaar 36c2af0affSBram Moolenaar bwipe! 37025cb1caSBram Moolenaar 38025cb1caSBram Moolenaar # won't generate anything 39025cb1caSBram Moolenaar if false 40025cb1caSBram Moolenaar :123 41025cb1caSBram Moolenaar endif 425d72ce69SBram Moolenaarenddef 435d72ce69SBram Moolenaar 44a6e67e4fSBram Moolenaarlet g:alist = [7] 45a6e67e4fSBram Moolenaarlet g:astring = 'text' 46f0b9f43cSBram Moolenaarlet g:anumber = 123 476e587dcbSBram Moolenaar 484c17ad94SBram Moolenaardef Test_delfunction() 49f5be8cdbSBram Moolenaar # Check function is defined in script namespace 504c17ad94SBram Moolenaar CheckScriptSuccess([ 514c17ad94SBram Moolenaar 'vim9script', 524c17ad94SBram Moolenaar 'func CheckMe()', 534c17ad94SBram Moolenaar ' return 123', 544c17ad94SBram Moolenaar 'endfunc', 554c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 564c17ad94SBram Moolenaar ]) 574c17ad94SBram Moolenaar 58f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 594c17ad94SBram Moolenaar CheckScriptFailure([ 604c17ad94SBram Moolenaar 'vim9script', 614c17ad94SBram Moolenaar 'func DeleteMe1()', 624c17ad94SBram Moolenaar 'endfunc', 634c17ad94SBram Moolenaar 'delfunction DeleteMe1', 644c17ad94SBram Moolenaar ], 'E1084:') 654c17ad94SBram Moolenaar CheckScriptFailure([ 664c17ad94SBram Moolenaar 'vim9script', 674c17ad94SBram Moolenaar 'func DeleteMe2()', 684c17ad94SBram Moolenaar 'endfunc', 694c17ad94SBram Moolenaar 'def DoThat()', 704c17ad94SBram Moolenaar ' delfunction DeleteMe2', 714c17ad94SBram Moolenaar 'enddef', 724c17ad94SBram Moolenaar 'DoThat()', 734c17ad94SBram Moolenaar ], 'E1084:') 744c17ad94SBram Moolenaar CheckScriptFailure([ 754c17ad94SBram Moolenaar 'vim9script', 764c17ad94SBram Moolenaar 'def DeleteMe3()', 774c17ad94SBram Moolenaar 'enddef', 784c17ad94SBram Moolenaar 'delfunction DeleteMe3', 794c17ad94SBram Moolenaar ], 'E1084:') 804c17ad94SBram Moolenaar CheckScriptFailure([ 814c17ad94SBram Moolenaar 'vim9script', 824c17ad94SBram Moolenaar 'def DeleteMe4()', 834c17ad94SBram Moolenaar 'enddef', 844c17ad94SBram Moolenaar 'def DoThat()', 854c17ad94SBram Moolenaar ' delfunction DeleteMe4', 864c17ad94SBram Moolenaar 'enddef', 874c17ad94SBram Moolenaar 'DoThat()', 884c17ad94SBram Moolenaar ], 'E1084:') 89925e9fd6SBram Moolenaar 90925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 91cfcd011fSBram Moolenaar var lines =<< trim END 92925e9fd6SBram Moolenaar vim9script 93925e9fd6SBram Moolenaar def g:Global(): string 94925e9fd6SBram Moolenaar return "yes" 95925e9fd6SBram Moolenaar enddef 96925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 97925e9fd6SBram Moolenaar def! g:Global(): string 98925e9fd6SBram Moolenaar return "no" 99925e9fd6SBram Moolenaar enddef 100925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 101925e9fd6SBram Moolenaar delfunc g:Global 102925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 103925e9fd6SBram Moolenaar END 104925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 105925e9fd6SBram Moolenaar 106925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 107925e9fd6SBram Moolenaar lines =<< trim END 108925e9fd6SBram Moolenaar vim9script 109925e9fd6SBram Moolenaar func g:Global() 110925e9fd6SBram Moolenaar return "yes" 111925e9fd6SBram Moolenaar endfunc 112925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 113925e9fd6SBram Moolenaar def! g:Global(): string 114925e9fd6SBram Moolenaar return "no" 115925e9fd6SBram Moolenaar enddef 116925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 117925e9fd6SBram Moolenaar delfunc g:Global 118925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 119925e9fd6SBram Moolenaar END 120925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 121925e9fd6SBram Moolenaar 122925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 123925e9fd6SBram Moolenaar lines =<< trim END 124925e9fd6SBram Moolenaar vim9script 125925e9fd6SBram Moolenaar def g:Global(): string 126925e9fd6SBram Moolenaar return "yes" 127925e9fd6SBram Moolenaar enddef 128925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 129925e9fd6SBram Moolenaar func! g:Global() 130925e9fd6SBram Moolenaar return "no" 131925e9fd6SBram Moolenaar endfunc 132925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 133925e9fd6SBram Moolenaar delfunc g:Global 134925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 135925e9fd6SBram Moolenaar END 136925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1374c17ad94SBram Moolenaarenddef 1384c17ad94SBram Moolenaar 13908052228SBram Moolenaardef Test_wrong_type() 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 144599c89c8SBram Moolenaar 145cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14742a480bfSBram Moolenaar 148cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 159a0a9f43aSBram Moolenaar 160cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16208052228SBram Moolenaarenddef 1638a7d6542SBram Moolenaar 16410c65860SBram Moolenaardef Test_script_wrong_type() 16510c65860SBram Moolenaar var lines =<< trim END 16610c65860SBram Moolenaar vim9script 16710c65860SBram Moolenaar var s:dict: dict<string> 16810c65860SBram Moolenaar s:dict['a'] = ['x'] 16910c65860SBram Moolenaar END 17010c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17110c65860SBram Moolenaarenddef 17210c65860SBram Moolenaar 17308052228SBram Moolenaardef Test_const() 174cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 175cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17730fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17830fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 179dbeecb2bSBram Moolenaar 180cfcd011fSBram Moolenaar var lines =<< trim END 18130fd8204SBram Moolenaar final list = [1, 2, 3] 182dbeecb2bSBram Moolenaar list[0] = 4 1830b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18430fd8204SBram Moolenaar const other = [5, 6, 7] 1850b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18671abe482SBram Moolenaar 187cfcd011fSBram Moolenaar var varlist = [7, 8] 18830fd8204SBram Moolenaar const constlist = [1, varlist, 3] 18971abe482SBram Moolenaar varlist[0] = 77 19071abe482SBram Moolenaar # TODO: does not work yet 19171abe482SBram Moolenaar # constlist[1][1] = 88 192cfcd011fSBram Moolenaar var cl = constlist[1] 19371abe482SBram Moolenaar cl[1] = 88 19471abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 19571abe482SBram Moolenaar 196e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 197e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 19871abe482SBram Moolenaar vardict['five'] = 55 19971abe482SBram Moolenaar # TODO: does not work yet 20071abe482SBram Moolenaar # constdict['two']['six'] = 66 201cfcd011fSBram Moolenaar var cd = constdict['two'] 20271abe482SBram Moolenaar cd['six'] = 66 203e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 204dbeecb2bSBram Moolenaar END 205dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20608052228SBram Moolenaarenddef 2078a7d6542SBram Moolenaar 2080b4c66c6SBram Moolenaardef Test_const_bang() 209cfcd011fSBram Moolenaar var lines =<< trim END 21030fd8204SBram Moolenaar const var = 234 2110b4c66c6SBram Moolenaar var = 99 2120b4c66c6SBram Moolenaar END 2130b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2140b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2150b4c66c6SBram Moolenaar 2160b4c66c6SBram Moolenaar lines =<< trim END 21730fd8204SBram Moolenaar const ll = [2, 3, 4] 2180b4c66c6SBram Moolenaar ll[0] = 99 2190b4c66c6SBram Moolenaar END 2200b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2210b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2220b4c66c6SBram Moolenaar 2230b4c66c6SBram Moolenaar lines =<< trim END 22430fd8204SBram Moolenaar const ll = [2, 3, 4] 2250b4c66c6SBram Moolenaar ll[3] = 99 2260b4c66c6SBram Moolenaar END 2270b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2280b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2290b4c66c6SBram Moolenaar 2300b4c66c6SBram Moolenaar lines =<< trim END 231e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2320b4c66c6SBram Moolenaar dd["one"] = 99 2330b4c66c6SBram Moolenaar END 2340b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2350b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2360b4c66c6SBram Moolenaar 2370b4c66c6SBram Moolenaar lines =<< trim END 238e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2390b4c66c6SBram Moolenaar dd["three"] = 99 2400b4c66c6SBram Moolenaar END 2410b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2420b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2430b4c66c6SBram Moolenaarenddef 2440b4c66c6SBram Moolenaar 245df069eecSBram Moolenaardef Test_range_no_colon() 246d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 247d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 249d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 250df069eecSBram Moolenaarenddef 251df069eecSBram Moolenaar 252df069eecSBram Moolenaar 2538a7d6542SBram Moolenaardef Test_block() 254cfcd011fSBram Moolenaar var outer = 1 2558a7d6542SBram Moolenaar { 256cfcd011fSBram Moolenaar var inner = 2 2578a7d6542SBram Moolenaar assert_equal(1, outer) 2588a7d6542SBram Moolenaar assert_equal(2, inner) 2598a7d6542SBram Moolenaar } 2608a7d6542SBram Moolenaar assert_equal(1, outer) 2618a7d6542SBram Moolenaarenddef 2628a7d6542SBram Moolenaar 26308052228SBram Moolenaardef Test_block_failure() 264cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26508052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26608052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 26708052228SBram Moolenaarenddef 2688a7d6542SBram Moolenaar 269fbbcd003SBram Moolenaardef Test_block_local_vars() 270fbbcd003SBram Moolenaar var lines =<< trim END 271fbbcd003SBram Moolenaar vim9script 272ed234f24SBram Moolenaar v:testing = 1 273fbbcd003SBram Moolenaar if true 274ed234f24SBram Moolenaar var text = ['hello'] 275ed234f24SBram Moolenaar def SayHello(): list<string> 276fbbcd003SBram Moolenaar return text 277fbbcd003SBram Moolenaar enddef 278fbbcd003SBram Moolenaar def SetText(v: string) 279ed234f24SBram Moolenaar text = [v] 280fbbcd003SBram Moolenaar enddef 281fbbcd003SBram Moolenaar endif 282fbbcd003SBram Moolenaar 283fbbcd003SBram Moolenaar if true 284ed234f24SBram Moolenaar var text = ['again'] 285ed234f24SBram Moolenaar def SayAgain(): list<string> 286fbbcd003SBram Moolenaar return text 287fbbcd003SBram Moolenaar enddef 288fbbcd003SBram Moolenaar endif 289ed234f24SBram Moolenaar 290ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 291ed234f24SBram Moolenaar test_garbagecollect_now() 292ed234f24SBram Moolenaar 293fbbcd003SBram Moolenaar defcompile 294fbbcd003SBram Moolenaar 295ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 296ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 297fbbcd003SBram Moolenaar 298fbbcd003SBram Moolenaar SetText('foobar') 299ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 300ed234f24SBram Moolenaar 301ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 302ed234f24SBram Moolenaar qall! 303fbbcd003SBram Moolenaar END 304ed234f24SBram Moolenaar 305ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 306ed234f24SBram Moolenaar # context gets garbage collected. 307ed234f24SBram Moolenaar writefile(lines, 'Xscript') 308ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 309ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 310ed234f24SBram Moolenaar 311ed234f24SBram Moolenaar delete('Xscript') 312ed234f24SBram Moolenaar delete('Xdidit') 313fbbcd003SBram Moolenaarenddef 314fbbcd003SBram Moolenaar 31539ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31639ca4127SBram Moolenaar var lines =<< trim END 31739ca4127SBram Moolenaar vim9script 31839ca4127SBram Moolenaar if true 31939ca4127SBram Moolenaar var foo = 'foo' 32039ca4127SBram Moolenaar if true 32139ca4127SBram Moolenaar var bar = 'bar' 32239ca4127SBram Moolenaar def Func(): list<string> 32339ca4127SBram Moolenaar return [foo, bar] 32439ca4127SBram Moolenaar enddef 32539ca4127SBram Moolenaar endif 32639ca4127SBram Moolenaar endif 32739ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 32839ca4127SBram Moolenaar # "foo" and "bar" 32939ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33039ca4127SBram Moolenaar END 33139ca4127SBram Moolenaar CheckScriptSuccess(lines) 33239ca4127SBram Moolenaarenddef 33339ca4127SBram Moolenaar 334d032f34aSBram Moolenaarfunc g:NoSuchFunc() 335d032f34aSBram Moolenaar echo 'none' 336d032f34aSBram Moolenaarendfunc 337d032f34aSBram Moolenaar 3389e1d9e34SBram Moolenaardef Test_try_catch_throw() 339cfcd011fSBram Moolenaar var l = [] 3407a092245SBram Moolenaar try # comment 3418a7d6542SBram Moolenaar add(l, '1') 3428a7d6542SBram Moolenaar throw 'wrong' 3438a7d6542SBram Moolenaar add(l, '2') 3447a092245SBram Moolenaar catch # comment 3458a7d6542SBram Moolenaar add(l, v:exception) 3467a092245SBram Moolenaar finally # comment 3478a7d6542SBram Moolenaar add(l, '3') 3487a092245SBram Moolenaar endtry # comment 3498a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35068d130c6SBram Moolenaar 351e859312eSBram Moolenaar l = [] 352e859312eSBram Moolenaar try 353e859312eSBram Moolenaar try 354e859312eSBram Moolenaar add(l, '1') 355e859312eSBram Moolenaar throw 'wrong' 356e859312eSBram Moolenaar add(l, '2') 357e859312eSBram Moolenaar catch /right/ 358e859312eSBram Moolenaar add(l, v:exception) 359e859312eSBram Moolenaar endtry 360e859312eSBram Moolenaar catch /wrong/ 361e859312eSBram Moolenaar add(l, 'caught') 362373863edSBram Moolenaar fina 363e859312eSBram Moolenaar add(l, 'finally') 364e859312eSBram Moolenaar endtry 365e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 366e859312eSBram Moolenaar 367cfcd011fSBram Moolenaar var n: number 36868d130c6SBram Moolenaar try 36968d130c6SBram Moolenaar n = l[3] 37068d130c6SBram Moolenaar catch /E684:/ 37168d130c6SBram Moolenaar n = 99 37268d130c6SBram Moolenaar endtry 37368d130c6SBram Moolenaar assert_equal(99, n) 37468d130c6SBram Moolenaar 37569f7050cSBram Moolenaar var done = 'no' 37669f7050cSBram Moolenaar if 0 37769f7050cSBram Moolenaar try | catch | endtry 37869f7050cSBram Moolenaar else 37969f7050cSBram Moolenaar done = 'yes' 38069f7050cSBram Moolenaar endif 38169f7050cSBram Moolenaar assert_equal('yes', done) 38269f7050cSBram Moolenaar 38369f7050cSBram Moolenaar done = 'no' 38469f7050cSBram Moolenaar if 1 38569f7050cSBram Moolenaar done = 'yes' 38669f7050cSBram Moolenaar else 38769f7050cSBram Moolenaar try | catch | endtry 38869f7050cSBram Moolenaar done = 'never' 38969f7050cSBram Moolenaar endif 39069f7050cSBram Moolenaar assert_equal('yes', done) 39169f7050cSBram Moolenaar 39269f7050cSBram Moolenaar if 1 39369f7050cSBram Moolenaar else 39469f7050cSBram Moolenaar try | catch /pat/ | endtry 39569f7050cSBram Moolenaar try | catch /pat/ 39669f7050cSBram Moolenaar endtry 39769f7050cSBram Moolenaar try 39869f7050cSBram Moolenaar catch /pat/ | endtry 39969f7050cSBram Moolenaar try 40069f7050cSBram Moolenaar catch /pat/ 40169f7050cSBram Moolenaar endtry 40269f7050cSBram Moolenaar endif 40369f7050cSBram Moolenaar 40468d130c6SBram Moolenaar try 405cc673e74SBram Moolenaar # string slice returns a string, not a number 40668d130c6SBram Moolenaar n = g:astring[3] 4075e654230SBram Moolenaar catch /E1012:/ 40868d130c6SBram Moolenaar n = 77 40968d130c6SBram Moolenaar endtry 41068d130c6SBram Moolenaar assert_equal(77, n) 41168d130c6SBram Moolenaar 41268d130c6SBram Moolenaar try 41368d130c6SBram Moolenaar n = l[g:astring] 4145e654230SBram Moolenaar catch /E1012:/ 41556acb094SBram Moolenaar n = 88 41668d130c6SBram Moolenaar endtry 41756acb094SBram Moolenaar assert_equal(88, n) 41868d130c6SBram Moolenaar 41968d130c6SBram Moolenaar try 42068d130c6SBram Moolenaar n = s:does_not_exist 42168d130c6SBram Moolenaar catch /E121:/ 422f0b9f43cSBram Moolenaar n = 111 423f0b9f43cSBram Moolenaar endtry 424f0b9f43cSBram Moolenaar assert_equal(111, n) 425f0b9f43cSBram Moolenaar 426f0b9f43cSBram Moolenaar try 427f0b9f43cSBram Moolenaar n = g:does_not_exist 428f0b9f43cSBram Moolenaar catch /E121:/ 42968d130c6SBram Moolenaar n = 121 43068d130c6SBram Moolenaar endtry 43168d130c6SBram Moolenaar assert_equal(121, n) 43268d130c6SBram Moolenaar 433e0de171eSBram Moolenaar var d = {one: 1} 43468d130c6SBram Moolenaar try 43568d130c6SBram Moolenaar n = d[g:astring] 43668d130c6SBram Moolenaar catch /E716:/ 43768d130c6SBram Moolenaar n = 222 43868d130c6SBram Moolenaar endtry 43968d130c6SBram Moolenaar assert_equal(222, n) 440f0b9f43cSBram Moolenaar 441f0b9f43cSBram Moolenaar try 442f0b9f43cSBram Moolenaar n = -g:astring 443f0b9f43cSBram Moolenaar catch /E39:/ 444f0b9f43cSBram Moolenaar n = 233 445f0b9f43cSBram Moolenaar endtry 446f0b9f43cSBram Moolenaar assert_equal(233, n) 447f0b9f43cSBram Moolenaar 448f0b9f43cSBram Moolenaar try 449f0b9f43cSBram Moolenaar n = +g:astring 450f0b9f43cSBram Moolenaar catch /E1030:/ 451f0b9f43cSBram Moolenaar n = 244 452f0b9f43cSBram Moolenaar endtry 453f0b9f43cSBram Moolenaar assert_equal(244, n) 454f0b9f43cSBram Moolenaar 455f0b9f43cSBram Moolenaar try 456f0b9f43cSBram Moolenaar n = +g:alist 457f0b9f43cSBram Moolenaar catch /E745:/ 458f0b9f43cSBram Moolenaar n = 255 459f0b9f43cSBram Moolenaar endtry 460f0b9f43cSBram Moolenaar assert_equal(255, n) 461f0b9f43cSBram Moolenaar 462cfcd011fSBram Moolenaar var nd: dict<any> 463f0b9f43cSBram Moolenaar try 4642e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4652e5910bfSBram Moolenaar catch /E1105:/ 466f0b9f43cSBram Moolenaar n = 266 467f0b9f43cSBram Moolenaar endtry 468f0b9f43cSBram Moolenaar assert_equal(266, n) 469f0b9f43cSBram Moolenaar 470f0b9f43cSBram Moolenaar try 471f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 472f0b9f43cSBram Moolenaar catch /E1093:/ 473f0b9f43cSBram Moolenaar n = 277 474f0b9f43cSBram Moolenaar endtry 475f0b9f43cSBram Moolenaar assert_equal(277, n) 476f0b9f43cSBram Moolenaar 477e859312eSBram Moolenaar try 478e859312eSBram Moolenaar &ts = g:astring 4795e654230SBram Moolenaar catch /E1012:/ 480e859312eSBram Moolenaar n = 288 481e859312eSBram Moolenaar endtry 482e859312eSBram Moolenaar assert_equal(288, n) 483e859312eSBram Moolenaar 484e859312eSBram Moolenaar try 485e859312eSBram Moolenaar &backspace = 'asdf' 486e859312eSBram Moolenaar catch /E474:/ 487e859312eSBram Moolenaar n = 299 488e859312eSBram Moolenaar endtry 489e859312eSBram Moolenaar assert_equal(299, n) 490e859312eSBram Moolenaar 491e859312eSBram Moolenaar l = [1] 492e859312eSBram Moolenaar try 493e859312eSBram Moolenaar l[3] = 3 494e859312eSBram Moolenaar catch /E684:/ 495e859312eSBram Moolenaar n = 300 496e859312eSBram Moolenaar endtry 497e859312eSBram Moolenaar assert_equal(300, n) 498e859312eSBram Moolenaar 499e859312eSBram Moolenaar try 500e859312eSBram Moolenaar unlet g:does_not_exist 501e859312eSBram Moolenaar catch /E108:/ 502e859312eSBram Moolenaar n = 322 503e859312eSBram Moolenaar endtry 504e859312eSBram Moolenaar assert_equal(322, n) 505e859312eSBram Moolenaar 506e859312eSBram Moolenaar try 5072bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 508e859312eSBram Moolenaar catch /E721:/ 509e859312eSBram Moolenaar n = 333 510e859312eSBram Moolenaar endtry 511e859312eSBram Moolenaar assert_equal(333, n) 512e859312eSBram Moolenaar 513e859312eSBram Moolenaar try 514e859312eSBram Moolenaar l = DeletedFunc() 515e859312eSBram Moolenaar catch /E933:/ 516e859312eSBram Moolenaar n = 344 517e859312eSBram Moolenaar endtry 518e859312eSBram Moolenaar assert_equal(344, n) 519d032f34aSBram Moolenaar 520d032f34aSBram Moolenaar try 521d032f34aSBram Moolenaar echo len(v:true) 522d032f34aSBram Moolenaar catch /E701:/ 523d032f34aSBram Moolenaar n = 355 524d032f34aSBram Moolenaar endtry 525d032f34aSBram Moolenaar assert_equal(355, n) 526d032f34aSBram Moolenaar 527cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 528d032f34aSBram Moolenaar delfunc g:NoSuchFunc 529d032f34aSBram Moolenaar try 530d032f34aSBram Moolenaar echo P() 531d032f34aSBram Moolenaar catch /E117:/ 532d032f34aSBram Moolenaar n = 366 533d032f34aSBram Moolenaar endtry 534d032f34aSBram Moolenaar assert_equal(366, n) 535d032f34aSBram Moolenaar 536d032f34aSBram Moolenaar try 537d032f34aSBram Moolenaar echo g:NoSuchFunc() 538d032f34aSBram Moolenaar catch /E117:/ 539d032f34aSBram Moolenaar n = 377 540d032f34aSBram Moolenaar endtry 541d032f34aSBram Moolenaar assert_equal(377, n) 542d032f34aSBram Moolenaar 543d032f34aSBram Moolenaar try 544d032f34aSBram Moolenaar echo g:alist + 4 545d032f34aSBram Moolenaar catch /E745:/ 546d032f34aSBram Moolenaar n = 388 547d032f34aSBram Moolenaar endtry 548d032f34aSBram Moolenaar assert_equal(388, n) 549d032f34aSBram Moolenaar 550d032f34aSBram Moolenaar try 551d032f34aSBram Moolenaar echo 4 + g:alist 552d032f34aSBram Moolenaar catch /E745:/ 553d032f34aSBram Moolenaar n = 399 554d032f34aSBram Moolenaar endtry 555d032f34aSBram Moolenaar assert_equal(399, n) 556d032f34aSBram Moolenaar 557d032f34aSBram Moolenaar try 558d032f34aSBram Moolenaar echo g:alist.member 559d032f34aSBram Moolenaar catch /E715:/ 560d032f34aSBram Moolenaar n = 400 561d032f34aSBram Moolenaar endtry 562d032f34aSBram Moolenaar assert_equal(400, n) 563d032f34aSBram Moolenaar 564d032f34aSBram Moolenaar try 565d032f34aSBram Moolenaar echo d.member 566d032f34aSBram Moolenaar catch /E716:/ 567d032f34aSBram Moolenaar n = 411 568d032f34aSBram Moolenaar endtry 569d032f34aSBram Moolenaar assert_equal(411, n) 570d9d7789bSBram Moolenaar 571d9d7789bSBram Moolenaar var counter = 0 572d9d7789bSBram Moolenaar for i in range(4) 573d9d7789bSBram Moolenaar try 574d9d7789bSBram Moolenaar eval [][0] 575d9d7789bSBram Moolenaar catch 576d9d7789bSBram Moolenaar endtry 577d9d7789bSBram Moolenaar counter += 1 578d9d7789bSBram Moolenaar endfor 579d9d7789bSBram Moolenaar assert_equal(4, counter) 5808a7d6542SBram Moolenaarenddef 5818a7d6542SBram Moolenaar 5821430ceebSBram Moolenaardef Test_cnext_works_in_catch() 5831430ceebSBram Moolenaar var lines =<< trim END 5841430ceebSBram Moolenaar vim9script 5851430ceebSBram Moolenaar au BufEnter * eval 0 5861430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 5871430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 5881430ceebSBram Moolenaar var items = [ 5891430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 5901430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 5911430ceebSBram Moolenaar ] 5921430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 5931430ceebSBram Moolenaar cwindow 5941430ceebSBram Moolenaar 5951430ceebSBram Moolenaar def CnextOrCfirst() 5961430ceebSBram Moolenaar # if cnext fails, cfirst is used 5971430ceebSBram Moolenaar try 5981430ceebSBram Moolenaar cnext 5991430ceebSBram Moolenaar catch 6001430ceebSBram Moolenaar cfirst 6011430ceebSBram Moolenaar endtry 6021430ceebSBram Moolenaar enddef 6031430ceebSBram Moolenaar 6041430ceebSBram Moolenaar CnextOrCfirst() 6051430ceebSBram Moolenaar CnextOrCfirst() 6061430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6071430ceebSBram Moolenaar qall 6081430ceebSBram Moolenaar END 6091430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6101430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6111430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6121430ceebSBram Moolenaar 6131430ceebSBram Moolenaar delete('Xfile1') 6141430ceebSBram Moolenaar delete('Xfile2') 6151430ceebSBram Moolenaar delete('XCatchCnext') 6161430ceebSBram Moolenaar delete('Xresult') 6171430ceebSBram Moolenaarenddef 6181430ceebSBram Moolenaar 6199e1d9e34SBram Moolenaardef Test_throw_skipped() 6209e1d9e34SBram Moolenaar if 0 6219e1d9e34SBram Moolenaar throw dontgethere 6229e1d9e34SBram Moolenaar endif 6239e1d9e34SBram Moolenaarenddef 6249e1d9e34SBram Moolenaar 6258f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6268f81b22eSBram Moolenaar var lines =<< trim END 6278f81b22eSBram Moolenaar vim9script 6288f81b22eSBram Moolenaar def Func() 6298f81b22eSBram Moolenaar throw 'error' 6308f81b22eSBram Moolenaar enddef 6318f81b22eSBram Moolenaar silent! Func() 6328f81b22eSBram Moolenaar END 6338f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6348f81b22eSBram Moolenaar source XthrowSilenced 6358f81b22eSBram Moolenaar delete('XthrowSilenced') 6368f81b22eSBram Moolenaarenddef 6378f81b22eSBram Moolenaar 638e859312eSBram Moolenaardef DeletedFunc(): list<any> 639e859312eSBram Moolenaar return ['delete me'] 640e859312eSBram Moolenaarenddef 641e859312eSBram Moolenaardefcompile 642e859312eSBram Moolenaardelfunc DeletedFunc 643e859312eSBram Moolenaar 644257cc5eeSBram Moolenaardef ThrowFromDef() 645a72cfb80SBram Moolenaar throw "getout" # comment 646257cc5eeSBram Moolenaarenddef 647257cc5eeSBram Moolenaar 648257cc5eeSBram Moolenaarfunc CatchInFunc() 649257cc5eeSBram Moolenaar try 650257cc5eeSBram Moolenaar call ThrowFromDef() 651257cc5eeSBram Moolenaar catch 652257cc5eeSBram Moolenaar let g:thrown_func = v:exception 653257cc5eeSBram Moolenaar endtry 654257cc5eeSBram Moolenaarendfunc 655257cc5eeSBram Moolenaar 656257cc5eeSBram Moolenaardef CatchInDef() 657257cc5eeSBram Moolenaar try 658257cc5eeSBram Moolenaar ThrowFromDef() 659257cc5eeSBram Moolenaar catch 660257cc5eeSBram Moolenaar g:thrown_def = v:exception 661257cc5eeSBram Moolenaar endtry 662257cc5eeSBram Moolenaarenddef 663257cc5eeSBram Moolenaar 664f575adffSBram Moolenaardef ReturnFinally(): string 665f575adffSBram Moolenaar try 666f575adffSBram Moolenaar return 'intry' 667373863edSBram Moolenaar finall 668f575adffSBram Moolenaar g:in_finally = 'finally' 669f575adffSBram Moolenaar endtry 670f575adffSBram Moolenaar return 'end' 671f575adffSBram Moolenaarenddef 672f575adffSBram Moolenaar 673257cc5eeSBram Moolenaardef Test_try_catch_nested() 674257cc5eeSBram Moolenaar CatchInFunc() 675257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 676257cc5eeSBram Moolenaar 677257cc5eeSBram Moolenaar CatchInDef() 678257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 679f575adffSBram Moolenaar 680f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 681f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 682f575adffSBram Moolenaarenddef 683f575adffSBram Moolenaar 6849939f57bSBram Moolenaardef TryOne(): number 6859939f57bSBram Moolenaar try 6869939f57bSBram Moolenaar return 0 6879939f57bSBram Moolenaar catch 6889939f57bSBram Moolenaar endtry 6899939f57bSBram Moolenaar return 0 6909939f57bSBram Moolenaarenddef 6919939f57bSBram Moolenaar 6929939f57bSBram Moolenaardef TryTwo(n: number): string 6939939f57bSBram Moolenaar try 694cfcd011fSBram Moolenaar var x = {} 6959939f57bSBram Moolenaar catch 6969939f57bSBram Moolenaar endtry 6979939f57bSBram Moolenaar return 'text' 6989939f57bSBram Moolenaarenddef 6999939f57bSBram Moolenaar 7009939f57bSBram Moolenaardef Test_try_catch_twice() 7019939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7029939f57bSBram Moolenaarenddef 7039939f57bSBram Moolenaar 704f575adffSBram Moolenaardef Test_try_catch_match() 705cfcd011fSBram Moolenaar var seq = 'a' 706f575adffSBram Moolenaar try 707f575adffSBram Moolenaar throw 'something' 708f575adffSBram Moolenaar catch /nothing/ 709f575adffSBram Moolenaar seq ..= 'x' 710f575adffSBram Moolenaar catch /some/ 711f575adffSBram Moolenaar seq ..= 'b' 712f575adffSBram Moolenaar catch /asdf/ 713f575adffSBram Moolenaar seq ..= 'x' 714e8c4abbbSBram Moolenaar catch ?a\?sdf? 715e8c4abbbSBram Moolenaar seq ..= 'y' 716f575adffSBram Moolenaar finally 717f575adffSBram Moolenaar seq ..= 'c' 718f575adffSBram Moolenaar endtry 719f575adffSBram Moolenaar assert_equal('abc', seq) 720257cc5eeSBram Moolenaarenddef 721257cc5eeSBram Moolenaar 722e8c4abbbSBram Moolenaardef Test_try_catch_fails() 723d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 724d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 725d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 726d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 727d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 728d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 729d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 730d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 73113106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 732d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 733585fea7bSBram Moolenaar 734e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 735d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 736e8c4abbbSBram Moolenaarenddef 737e8c4abbbSBram Moolenaar 7387c5b3c03SBram Moolenaardef Try_catch_skipped() 7397c5b3c03SBram Moolenaar var l = [] 7407c5b3c03SBram Moolenaar try 7417c5b3c03SBram Moolenaar finally 7427c5b3c03SBram Moolenaar endtry 7437c5b3c03SBram Moolenaar 7447c5b3c03SBram Moolenaar if 1 7457c5b3c03SBram Moolenaar else 7467c5b3c03SBram Moolenaar try 7477c5b3c03SBram Moolenaar endtry 7487c5b3c03SBram Moolenaar endif 7497c5b3c03SBram Moolenaarenddef 7507c5b3c03SBram Moolenaar 7517c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7527c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7537c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7547c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7557c5b3c03SBram Moolenaarenddef 7567c5b3c03SBram Moolenaar 7577c5b3c03SBram Moolenaar 7587c5b3c03SBram Moolenaar 759006ad48bSBram Moolenaardef Test_throw_vimscript() 760f5be8cdbSBram Moolenaar # only checks line continuation 761cfcd011fSBram Moolenaar var lines =<< trim END 762006ad48bSBram Moolenaar vim9script 763006ad48bSBram Moolenaar try 764006ad48bSBram Moolenaar throw 'one' 765006ad48bSBram Moolenaar .. 'two' 766006ad48bSBram Moolenaar catch 767006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 768006ad48bSBram Moolenaar endtry 769006ad48bSBram Moolenaar END 770006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7711e021e63SBram Moolenaar 7721e021e63SBram Moolenaar lines =<< trim END 7731e021e63SBram Moolenaar vim9script 774352134bbSBram Moolenaar @r = '' 7751e021e63SBram Moolenaar def Func() 7761e021e63SBram Moolenaar throw @r 7771e021e63SBram Moolenaar enddef 7781e021e63SBram Moolenaar var result = '' 7791e021e63SBram Moolenaar try 7801e021e63SBram Moolenaar Func() 7811e021e63SBram Moolenaar catch /E1129:/ 7821e021e63SBram Moolenaar result = 'caught' 7831e021e63SBram Moolenaar endtry 7841e021e63SBram Moolenaar assert_equal('caught', result) 7851e021e63SBram Moolenaar END 7861e021e63SBram Moolenaar CheckScriptSuccess(lines) 787006ad48bSBram Moolenaarenddef 788006ad48bSBram Moolenaar 789ed677f55SBram Moolenaardef Test_error_in_nested_function() 79003dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 791cfcd011fSBram Moolenaar var lines =<< trim END 792ed677f55SBram Moolenaar vim9script 793ed677f55SBram Moolenaar def Func() 794ed677f55SBram Moolenaar Error() 795ed677f55SBram Moolenaar g:test_var = 1 796ed677f55SBram Moolenaar enddef 797ed677f55SBram Moolenaar func Error() abort 798ed677f55SBram Moolenaar eval [][0] 799ed677f55SBram Moolenaar endfunc 800ed677f55SBram Moolenaar Func() 801ed677f55SBram Moolenaar END 802ed677f55SBram Moolenaar g:test_var = 0 803ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 804ed677f55SBram Moolenaar assert_equal(0, g:test_var) 805ed677f55SBram Moolenaarenddef 806ed677f55SBram Moolenaar 80737c83711SBram Moolenaardef Test_cexpr_vimscript() 808f5be8cdbSBram Moolenaar # only checks line continuation 80937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 810cfcd011fSBram Moolenaar var lines =<< trim END 81137c83711SBram Moolenaar vim9script 81237c83711SBram Moolenaar cexpr 'File' 81337c83711SBram Moolenaar .. ' someFile' .. 81437c83711SBram Moolenaar ' line 19' 81537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 81637c83711SBram Moolenaar END 81737c83711SBram Moolenaar CheckScriptSuccess(lines) 81837c83711SBram Moolenaar set errorformat& 81937c83711SBram Moolenaarenddef 82037c83711SBram Moolenaar 821c9edd6b5SBram Moolenaardef Test_statusline_syntax() 822c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 823cfcd011fSBram Moolenaar var lines =<< trim END 824c9edd6b5SBram Moolenaar vim9script 825c9edd6b5SBram Moolenaar func g:Status() 826c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 827c9edd6b5SBram Moolenaar endfunc 828c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 829c9edd6b5SBram Moolenaar redrawstatus 830c9edd6b5SBram Moolenaar set laststatus statusline= 831c9edd6b5SBram Moolenaar END 832c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 833c9edd6b5SBram Moolenaarenddef 834c9edd6b5SBram Moolenaar 835b209750bSBram Moolenaardef Test_list_vimscript() 836b209750bSBram Moolenaar # checks line continuation and comments 837cfcd011fSBram Moolenaar var lines =<< trim END 838b209750bSBram Moolenaar vim9script 839cfcd011fSBram Moolenaar var mylist = [ 840b209750bSBram Moolenaar 'one', 841b209750bSBram Moolenaar # comment 842b209750bSBram Moolenaar 'two', # empty line follows 843b209750bSBram Moolenaar 844b209750bSBram Moolenaar 'three', 845b209750bSBram Moolenaar ] 846b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 847b209750bSBram Moolenaar END 848b209750bSBram Moolenaar CheckScriptSuccess(lines) 84966250c93SBram Moolenaar 85066250c93SBram Moolenaar # check all lines from heredoc are kept 85166250c93SBram Moolenaar lines =<< trim END 85266250c93SBram Moolenaar # comment 1 85366250c93SBram Moolenaar two 85466250c93SBram Moolenaar # comment 3 85566250c93SBram Moolenaar 85666250c93SBram Moolenaar five 85766250c93SBram Moolenaar # comment 6 85866250c93SBram Moolenaar END 85966250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8604bce26bbSBram Moolenaar 8614bce26bbSBram Moolenaar lines =<< trim END 8624bce26bbSBram Moolenaar [{ 8634bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8644bce26bbSBram Moolenaar END 8654bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 866b209750bSBram Moolenaarenddef 867b209750bSBram Moolenaar 8682a1381c3SBram Moolenaarif has('channel') 86940ee466cSBram Moolenaar let someJob = test_null_job() 87040ee466cSBram Moolenaar 87140ee466cSBram Moolenaar def FuncWithError() 87240ee466cSBram Moolenaar echomsg g:someJob 87340ee466cSBram Moolenaar enddef 87440ee466cSBram Moolenaar 87540ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 87640ee466cSBram Moolenaar try 87740ee466cSBram Moolenaar call FuncWithError() 87840ee466cSBram Moolenaar catch 87940ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 88040ee466cSBram Moolenaar endtry 88140ee466cSBram Moolenaar endfunc 8822a1381c3SBram Moolenaarendif 88340ee466cSBram Moolenaar 8848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8858a7d6542SBram Moolenaar vim9script 886cfcd011fSBram Moolenaar var name: string = 'bob' 8878a7d6542SBram Moolenaar def Concat(arg: string): string 8888a7d6542SBram Moolenaar return name .. arg 8898a7d6542SBram Moolenaar enddef 890227a69deSBram Moolenaar g:result = Concat('bie') 891227a69deSBram Moolenaar g:localname = name 8928a7d6542SBram Moolenaar 8938a7d6542SBram Moolenaar export const CONST = 1234 894cfcd011fSBram Moolenaar export var exported = 9876 895cfcd011fSBram Moolenaar export var exp_name = 'John' 8968a7d6542SBram Moolenaar export def Exported(): string 8978a7d6542SBram Moolenaar return 'Exported' 8988a7d6542SBram Moolenaar enddef 8998a7d6542SBram MoolenaarEND 9008a7d6542SBram Moolenaar 901b3ca9824SBram Moolenaardef Undo_export_script_lines() 902b3ca9824SBram Moolenaar unlet g:result 903b3ca9824SBram Moolenaar unlet g:localname 904b3ca9824SBram Moolenaarenddef 905b3ca9824SBram Moolenaar 9065269bd2aSBram Moolenaardef Test_vim9_import_export() 907cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9088a7d6542SBram Moolenaar vim9script 9098a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9108a7d6542SBram Moolenaar g:imported = exported 9116e587dcbSBram Moolenaar exported += 3 9126e587dcbSBram Moolenaar g:imported_added = exported 9138a7d6542SBram Moolenaar g:imported_func = Exported() 9146e587dcbSBram Moolenaar 91540f4f7a4SBram Moolenaar def GetExported(): string 916e0de171eSBram Moolenaar var local_dict = {ref: Exported} 91740f4f7a4SBram Moolenaar return local_dict.ref() 91840f4f7a4SBram Moolenaar enddef 91940f4f7a4SBram Moolenaar g:funcref_result = GetExported() 92040f4f7a4SBram Moolenaar 9216e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9226e587dcbSBram Moolenaar g:imported_name = exp_name 9236e587dcbSBram Moolenaar exp_name ..= ' Doe' 9246e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9255381c7a1SBram Moolenaar g:imported_later = exported 9268a7d6542SBram Moolenaar END 9278a7d6542SBram Moolenaar 9288a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9298a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9308a7d6542SBram Moolenaar 9318a7d6542SBram Moolenaar source Ximport.vim 9328a7d6542SBram Moolenaar 9338a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9348a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9358a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9366e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9375381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9388a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 93940f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9406e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9416e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9428a7d6542SBram Moolenaar assert_false(exists('g:name')) 9438a7d6542SBram Moolenaar 944b3ca9824SBram Moolenaar Undo_export_script_lines() 9458a7d6542SBram Moolenaar unlet g:imported 9466e587dcbSBram Moolenaar unlet g:imported_added 9475381c7a1SBram Moolenaar unlet g:imported_later 9488a7d6542SBram Moolenaar unlet g:imported_func 9496e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9508a7d6542SBram Moolenaar delete('Ximport.vim') 951f2d5c240SBram Moolenaar 9521c991144SBram Moolenaar # similar, with line breaks 953cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9541c991144SBram Moolenaar vim9script 9551c991144SBram Moolenaar import { 9561c991144SBram Moolenaar exported, 9571c991144SBram Moolenaar Exported, 9581c991144SBram Moolenaar } 9591c991144SBram Moolenaar from 9601c991144SBram Moolenaar './Xexport.vim' 9611c991144SBram Moolenaar g:imported = exported 9621c991144SBram Moolenaar exported += 5 9631c991144SBram Moolenaar g:imported_added = exported 9641c991144SBram Moolenaar g:imported_func = Exported() 9651c991144SBram Moolenaar END 9661c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9671c991144SBram Moolenaar source Ximport_lbr.vim 9681c991144SBram Moolenaar 9691c991144SBram Moolenaar assert_equal(9876, g:imported) 9701c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9711c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9721c991144SBram Moolenaar 9731c991144SBram Moolenaar # exported script not sourced again 9741c991144SBram Moolenaar assert_false(exists('g:result')) 9751c991144SBram Moolenaar unlet g:imported 9761c991144SBram Moolenaar unlet g:imported_added 9771c991144SBram Moolenaar unlet g:imported_func 9781c991144SBram Moolenaar delete('Ximport_lbr.vim') 9791c991144SBram Moolenaar 9801c991144SBram Moolenaar # import inside :def function 981cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9825381c7a1SBram Moolenaar vim9script 9835381c7a1SBram Moolenaar def ImportInDef() 9845381c7a1SBram Moolenaar import exported from './Xexport.vim' 9855381c7a1SBram Moolenaar g:imported = exported 9865381c7a1SBram Moolenaar exported += 7 9875381c7a1SBram Moolenaar g:imported_added = exported 9885381c7a1SBram Moolenaar enddef 9895381c7a1SBram Moolenaar ImportInDef() 9905381c7a1SBram Moolenaar END 9915381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9925381c7a1SBram Moolenaar source Ximport2.vim 993f5be8cdbSBram Moolenaar # TODO: this should be 9879 9945381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9955381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9965381c7a1SBram Moolenaar unlet g:imported 9975381c7a1SBram Moolenaar unlet g:imported_added 9985381c7a1SBram Moolenaar delete('Ximport2.vim') 9995381c7a1SBram Moolenaar 1000cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1001f2d5c240SBram Moolenaar vim9script 1002f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1003f2d5c240SBram Moolenaar def UseExport() 1004f2d5c240SBram Moolenaar g:imported = Export.exported 1005f2d5c240SBram Moolenaar enddef 1006f2d5c240SBram Moolenaar UseExport() 1007f2d5c240SBram Moolenaar END 1008f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1009f2d5c240SBram Moolenaar source Ximport.vim 10105381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1011f2d5c240SBram Moolenaar 1012cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1013599c89c8SBram Moolenaar vim9script 1014599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1015599c89c8SBram Moolenaar def Func() 1016cfcd011fSBram Moolenaar var dummy = 1 1017cfcd011fSBram Moolenaar var imported = Export + dummy 1018599c89c8SBram Moolenaar enddef 1019822ba247SBram Moolenaar defcompile 1020599c89c8SBram Moolenaar END 1021599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 102244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1023599c89c8SBram Moolenaar 1024cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1025599c89c8SBram Moolenaar vim9script 1026599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1027599c89c8SBram Moolenaar def Func() 1028cfcd011fSBram Moolenaar var imported = Export . exported 1029599c89c8SBram Moolenaar enddef 1030822ba247SBram Moolenaar defcompile 1031599c89c8SBram Moolenaar END 1032599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 103344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1034599c89c8SBram Moolenaar 1035a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1036a6294955SBram Moolenaar vim9script 1037a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1038a6294955SBram Moolenaar var some = 'other' 1039a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1040a6294955SBram Moolenaar defcompile 1041a6294955SBram Moolenaar END 1042a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1043a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1044a6294955SBram Moolenaar 1045cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1046599c89c8SBram Moolenaar vim9script 1047599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1048599c89c8SBram Moolenaar def Func() 1049cfcd011fSBram Moolenaar var imported = Export. 1050599c89c8SBram Moolenaar enddef 1051822ba247SBram Moolenaar defcompile 1052599c89c8SBram Moolenaar END 1053599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 105444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1055599c89c8SBram Moolenaar 1056cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10571c991144SBram Moolenaar vim9script 10581c991144SBram Moolenaar import * 10591c991144SBram Moolenaar as Export 10601c991144SBram Moolenaar from 10611c991144SBram Moolenaar './Xexport.vim' 10621c991144SBram Moolenaar def UseExport() 10631c991144SBram Moolenaar g:imported = Export.exported 10641c991144SBram Moolenaar enddef 10651c991144SBram Moolenaar UseExport() 10661c991144SBram Moolenaar END 10671c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10681c991144SBram Moolenaar source Ximport.vim 10691c991144SBram Moolenaar assert_equal(9883, g:imported) 10701c991144SBram Moolenaar 1071cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1072f2d5c240SBram Moolenaar vim9script 1073f2d5c240SBram Moolenaar import * from './Xexport.vim' 1074f2d5c240SBram Moolenaar END 1075f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 107644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1077f2d5c240SBram Moolenaar 1078f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1079cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1080fa29c8abSBram Moolenaar vim9script 1081fa29c8abSBram Moolenaar import name from './Xexport.vim' 1082fa29c8abSBram Moolenaar END 1083fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 108444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1085fa29c8abSBram Moolenaar 1086f5be8cdbSBram Moolenaar # try to import something that is already defined 1087cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10885269bd2aSBram Moolenaar vim9script 1089cfcd011fSBram Moolenaar var exported = 'something' 10905269bd2aSBram Moolenaar import exported from './Xexport.vim' 10915269bd2aSBram Moolenaar END 10925269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 109344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10945269bd2aSBram Moolenaar 1095f5be8cdbSBram Moolenaar # try to import something that is already defined 10965269bd2aSBram Moolenaar import_already_defined =<< trim END 10975269bd2aSBram Moolenaar vim9script 1098cfcd011fSBram Moolenaar var exported = 'something' 10995269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11005269bd2aSBram Moolenaar END 11015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 110244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11035269bd2aSBram Moolenaar 1104f5be8cdbSBram Moolenaar # try to import something that is already defined 11055269bd2aSBram Moolenaar import_already_defined =<< trim END 11065269bd2aSBram Moolenaar vim9script 1107cfcd011fSBram Moolenaar var exported = 'something' 11085269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11095269bd2aSBram Moolenaar END 11105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 111144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11125269bd2aSBram Moolenaar 1113918a4249SBram Moolenaar # try changing an imported const 1114918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1115918a4249SBram Moolenaar vim9script 1116918a4249SBram Moolenaar import CONST from './Xexport.vim' 1117918a4249SBram Moolenaar def Assign() 1118918a4249SBram Moolenaar CONST = 987 1119918a4249SBram Moolenaar enddef 1120918a4249SBram Moolenaar defcompile 1121918a4249SBram Moolenaar END 1122918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1123918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1124918a4249SBram Moolenaar 1125f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1126cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1127fa29c8abSBram Moolenaar vim9script 1128fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1129fa29c8abSBram Moolenaar END 1130fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 113144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1132fa29c8abSBram Moolenaar 1133cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1134fa29c8abSBram Moolenaar vim9script 1135fa29c8abSBram Moolenaar import name './Xexport.vim' 1136fa29c8abSBram Moolenaar END 1137fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 113844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1139fa29c8abSBram Moolenaar 1140cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1141fa29c8abSBram Moolenaar vim9script 1142fa29c8abSBram Moolenaar import name from Xexport.vim 1143fa29c8abSBram Moolenaar END 1144fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 114544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1146fa29c8abSBram Moolenaar 1147cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1148fa29c8abSBram Moolenaar vim9script 1149fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1150fa29c8abSBram Moolenaar END 1151fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 115244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1153fa29c8abSBram Moolenaar 1154cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1155fa29c8abSBram Moolenaar vim9script 1156fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1157fa29c8abSBram Moolenaar END 11585269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 115944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1160fa29c8abSBram Moolenaar 1161f2d5c240SBram Moolenaar delete('Ximport.vim') 11625269bd2aSBram Moolenaar delete('Ximport3.vim') 11638a7d6542SBram Moolenaar delete('Xexport.vim') 11648a7d6542SBram Moolenaar 1165f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1166750802b5SBram Moolenaar set cpo&vi 1167cfcd011fSBram Moolenaar var cpo_before = &cpo 1168cfcd011fSBram Moolenaar var lines =<< trim END 1169750802b5SBram Moolenaar vim9script 1170750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1171750802b5SBram Moolenaar END 1172750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1173750802b5SBram Moolenaar source Xvim9_script 1174750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1175750802b5SBram Moolenaar set cpo&vim 1176750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1177750802b5SBram Moolenaar delete('Xvim9_script') 1178750802b5SBram Moolenaarenddef 1179750802b5SBram Moolenaar 1180803af686SBram Moolenaarfunc g:Trigger() 1181803af686SBram Moolenaar source Ximport.vim 1182803af686SBram Moolenaar return "echo 'yes'\<CR>" 1183803af686SBram Moolenaarendfunc 1184803af686SBram Moolenaar 1185803af686SBram Moolenaardef Test_import_export_expr_map() 1186803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1187cfcd011fSBram Moolenaar var export_lines =<< trim END 1188803af686SBram Moolenaar vim9script 1189803af686SBram Moolenaar export def That(): string 1190803af686SBram Moolenaar return 'yes' 1191803af686SBram Moolenaar enddef 1192803af686SBram Moolenaar END 1193803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1194803af686SBram Moolenaar 1195cfcd011fSBram Moolenaar var import_lines =<< trim END 1196803af686SBram Moolenaar vim9script 1197803af686SBram Moolenaar import That from './Xexport_that.vim' 1198803af686SBram Moolenaar assert_equal('yes', That()) 1199803af686SBram Moolenaar END 1200803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1201803af686SBram Moolenaar 1202803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1203803af686SBram Moolenaar feedkeys('trigger', "xt") 1204803af686SBram Moolenaar 1205730b2483SBram Moolenaar delete('Xexport_that.vim') 1206803af686SBram Moolenaar delete('Ximport.vim') 1207803af686SBram Moolenaar nunmap trigger 1208803af686SBram Moolenaarenddef 1209803af686SBram Moolenaar 12108e1986e3SBram Moolenaardef Test_import_in_filetype() 12118e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12128e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1213cfcd011fSBram Moolenaar var export_lines =<< trim END 12148e1986e3SBram Moolenaar vim9script 1215cfcd011fSBram Moolenaar export var That = 'yes' 12168e1986e3SBram Moolenaar END 1217730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12188e1986e3SBram Moolenaar 1219cfcd011fSBram Moolenaar var import_lines =<< trim END 12208e1986e3SBram Moolenaar vim9script 1221730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12228e1986e3SBram Moolenaar assert_equal('yes', That) 12238e1986e3SBram Moolenaar g:did_load_mytpe = 1 12248e1986e3SBram Moolenaar END 12258e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12268e1986e3SBram Moolenaar 1227cfcd011fSBram Moolenaar var save_rtp = &rtp 12288e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 12298e1986e3SBram Moolenaar 12308e1986e3SBram Moolenaar filetype plugin on 12318e1986e3SBram Moolenaar copen 12328e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12338e1986e3SBram Moolenaar 12348e1986e3SBram Moolenaar quit! 1235730b2483SBram Moolenaar delete('Xexport_ft.vim') 12368e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12378e1986e3SBram Moolenaar &rtp = save_rtp 12388e1986e3SBram Moolenaarenddef 12398e1986e3SBram Moolenaar 1240efa94447SBram Moolenaardef Test_use_import_in_mapping() 1241cfcd011fSBram Moolenaar var lines =<< trim END 1242efa94447SBram Moolenaar vim9script 1243efa94447SBram Moolenaar export def Funcx() 1244efa94447SBram Moolenaar g:result = 42 1245efa94447SBram Moolenaar enddef 1246efa94447SBram Moolenaar END 1247efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1248efa94447SBram Moolenaar lines =<< trim END 1249efa94447SBram Moolenaar vim9script 1250efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1251b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1252efa94447SBram Moolenaar END 1253efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1254efa94447SBram Moolenaar 1255efa94447SBram Moolenaar source Xmapscript.vim 1256b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1257efa94447SBram Moolenaar assert_equal(42, g:result) 1258efa94447SBram Moolenaar 1259efa94447SBram Moolenaar unlet g:result 1260efa94447SBram Moolenaar delete('XsomeExport.vim') 1261efa94447SBram Moolenaar delete('Xmapscript.vim') 1262b3ca9824SBram Moolenaar nunmap <F3> 1263efa94447SBram Moolenaarenddef 1264efa94447SBram Moolenaar 1265750802b5SBram Moolenaardef Test_vim9script_fails() 12668a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12678a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1268cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 12699721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1270cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1271750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1272750802b5SBram Moolenaar 1273cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1274c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1275c785b9a7SBram Moolenaar 1276e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1277e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 12788a7d6542SBram Moolenaarenddef 12798a7d6542SBram Moolenaar 1280f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1281101f4810SBram Moolenaar CheckRunVimInTerminal 1282101f4810SBram Moolenaar 12839bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1284c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 12859bb3eb3eSBram Moolenaarendfunc 12869bb3eb3eSBram Moolenaar 1287c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1288cfcd011fSBram Moolenaar var export =<< trim END 1289101f4810SBram Moolenaar vim9script 1290101f4810SBram Moolenaar export def Foo(): number 1291101f4810SBram Moolenaar return 0 1292101f4810SBram Moolenaar enddef 1293101f4810SBram Moolenaar END 1294730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1295101f4810SBram Moolenaar 1296e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 12979bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 12982949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1299101f4810SBram Moolenaar 1300730b2483SBram Moolenaar delete('XexportCmd.vim') 13019bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13029bb3eb3eSBram Moolenaarenddef 1303101f4810SBram Moolenaar 13042b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13052b32700dSBram Moolenaar var lines =<< trim END 1306a6294955SBram Moolenaar vim9script 1307a6294955SBram Moolenaar export var exported = 'thexport' 1308a6294955SBram Moolenaar END 1309a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1310a6294955SBram Moolenaar lines =<< trim END 13112b32700dSBram Moolenaar vim9script noclear 13122b32700dSBram Moolenaar g:loadCount += 1 13132b32700dSBram Moolenaar var s:reloaded = 'init' 1314a6294955SBram Moolenaar import exported from './XExportReload' 13152b32700dSBram Moolenaar 13162b32700dSBram Moolenaar def Again(): string 13172b32700dSBram Moolenaar return 'again' 13182b32700dSBram Moolenaar enddef 13192b32700dSBram Moolenaar 13202b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 13212b32700dSBram Moolenaar var s:loaded = true 13222b32700dSBram Moolenaar 13232b32700dSBram Moolenaar var s:notReloaded = 'yes' 13242b32700dSBram Moolenaar s:reloaded = 'first' 13252b32700dSBram Moolenaar def g:Values(): list<string> 1326a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 13272b32700dSBram Moolenaar enddef 13282b32700dSBram Moolenaar 13292b32700dSBram Moolenaar def Once(): string 13302b32700dSBram Moolenaar return 'once' 13312b32700dSBram Moolenaar enddef 13322b32700dSBram Moolenaar END 13332b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13342b32700dSBram Moolenaar g:loadCount = 0 13352b32700dSBram Moolenaar source XReloaded 13362b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1337a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13382b32700dSBram Moolenaar source XReloaded 13392b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1340a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13412b32700dSBram Moolenaar source XReloaded 13422b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1343a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13442b32700dSBram Moolenaar 134548e11c10SBram Moolenaar delete('XReloaded') 1346a6294955SBram Moolenaar delete('XExportReload') 13472b32700dSBram Moolenaar delfunc g:Values 13482b32700dSBram Moolenaar unlet g:loadCount 13492b32700dSBram Moolenaarenddef 13502b32700dSBram Moolenaar 13514c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1352cfcd011fSBram Moolenaar var lines =<< trim END 13538a7d6542SBram Moolenaar vim9script 13548a7d6542SBram Moolenaar const var = '' 1355cfcd011fSBram Moolenaar var valone = 1234 13568a7d6542SBram Moolenaar def MyFunc(arg: string) 13578a7d6542SBram Moolenaar valone = 5678 13588a7d6542SBram Moolenaar enddef 13598a7d6542SBram Moolenaar END 1360cfcd011fSBram Moolenaar var morelines =<< trim END 1361cfcd011fSBram Moolenaar var valtwo = 222 13628a7d6542SBram Moolenaar export def GetValtwo(): number 13638a7d6542SBram Moolenaar return valtwo 13648a7d6542SBram Moolenaar enddef 13658a7d6542SBram Moolenaar END 136603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13678a7d6542SBram Moolenaar source Xreload.vim 13688a7d6542SBram Moolenaar source Xreload.vim 13698a7d6542SBram Moolenaar source Xreload.vim 13708a7d6542SBram Moolenaar 1371cfcd011fSBram Moolenaar var testlines =<< trim END 13728a7d6542SBram Moolenaar vim9script 13738a7d6542SBram Moolenaar def TheFunc() 13748a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13758a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13768a7d6542SBram Moolenaar enddef 13778a7d6542SBram Moolenaar TheFunc() 13788a7d6542SBram Moolenaar END 13798a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13808a7d6542SBram Moolenaar source Ximport.vim 13818a7d6542SBram Moolenaar 1382f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1383f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 13848a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 13858a7d6542SBram Moolenaar source Ximport.vim 13868a7d6542SBram Moolenaar 1387f5be8cdbSBram Moolenaar # cannot declare a var twice 13888a7d6542SBram Moolenaar lines =<< trim END 13898a7d6542SBram Moolenaar vim9script 1390cfcd011fSBram Moolenaar var valone = 1234 1391cfcd011fSBram Moolenaar var valone = 5678 13928a7d6542SBram Moolenaar END 13938a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 139444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 13958a7d6542SBram Moolenaar 13968a7d6542SBram Moolenaar delete('Xreload.vim') 13978a7d6542SBram Moolenaar delete('Ximport.vim') 13988a7d6542SBram Moolenaarenddef 13998a7d6542SBram Moolenaar 140007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 140107a65d26SBram Moolenaar" compiled function using that variable must fail. 140207a65d26SBram Moolenaardef Test_script_reload_change_type() 140307a65d26SBram Moolenaar var lines =<< trim END 140407a65d26SBram Moolenaar vim9script noclear 140507a65d26SBram Moolenaar var str = 'string' 140607a65d26SBram Moolenaar def g:GetStr(): string 140707a65d26SBram Moolenaar return str .. 'xxx' 140807a65d26SBram Moolenaar enddef 140907a65d26SBram Moolenaar END 141007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 141107a65d26SBram Moolenaar source Xreload.vim 141207a65d26SBram Moolenaar echo g:GetStr() 141307a65d26SBram Moolenaar 141407a65d26SBram Moolenaar lines =<< trim END 141507a65d26SBram Moolenaar vim9script noclear 141607a65d26SBram Moolenaar var str = 1234 141707a65d26SBram Moolenaar END 141807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 141907a65d26SBram Moolenaar source Xreload.vim 142007a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 142107a65d26SBram Moolenaar 142207a65d26SBram Moolenaar delfunc g:GetStr 142307a65d26SBram Moolenaar delete('Xreload.vim') 142407a65d26SBram Moolenaarenddef 142507a65d26SBram Moolenaar 142695006e3dSBram Moolenaardef s:RetSome(): string 142795006e3dSBram Moolenaar return 'some' 142895006e3dSBram Moolenaarenddef 142995006e3dSBram Moolenaar 1430fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1431fe465a01SBram Moolenaar" script-local name. 1432fe465a01SBram Moolenaardef Test_vim9script_funcref() 1433cfcd011fSBram Moolenaar var sortlines =<< trim END 1434fe465a01SBram Moolenaar vim9script 1435fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1436bed36b93SBram Moolenaar return i2 - i1 1437fe465a01SBram Moolenaar enddef 1438fe465a01SBram Moolenaar 1439fe465a01SBram Moolenaar export def FastSort(): list<number> 1440fe465a01SBram Moolenaar return range(5)->sort(Compare) 1441fe465a01SBram Moolenaar enddef 1442fe465a01SBram Moolenaar END 1443fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1444fe465a01SBram Moolenaar 1445cfcd011fSBram Moolenaar var lines =<< trim END 1446fe465a01SBram Moolenaar vim9script 1447fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1448fe465a01SBram Moolenaar def Test() 1449fe465a01SBram Moolenaar g:result = FastSort() 1450fe465a01SBram Moolenaar enddef 1451fe465a01SBram Moolenaar Test() 1452fe465a01SBram Moolenaar END 1453fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1454fe465a01SBram Moolenaar 1455fe465a01SBram Moolenaar source Xscript.vim 1456fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1457fe465a01SBram Moolenaar 1458fe465a01SBram Moolenaar unlet g:result 1459fe465a01SBram Moolenaar delete('Xsort.vim') 1460fe465a01SBram Moolenaar delete('Xscript.vim') 146195006e3dSBram Moolenaar 1462cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 146395006e3dSBram Moolenaar assert_equal('some', Funcref()) 1464fe465a01SBram Moolenaarenddef 1465fe465a01SBram Moolenaar 1466601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1467601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1468601e76acSBram Moolenaar" function reference. 1469c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1470cfcd011fSBram Moolenaar var filterLines =<< trim END 1471c620c055SBram Moolenaar vim9script 1472c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1473c620c055SBram Moolenaar return idx % 2 == 1 1474c620c055SBram Moolenaar enddef 1475c620c055SBram Moolenaar export def FastFilter(): list<number> 1476c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1477c620c055SBram Moolenaar enddef 1478601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1479601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1480601e76acSBram Moolenaar enddef 1481c620c055SBram Moolenaar END 1482c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1483c620c055SBram Moolenaar 1484cfcd011fSBram Moolenaar var lines =<< trim END 1485c620c055SBram Moolenaar vim9script 1486601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1487c620c055SBram Moolenaar def Test() 1488cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1489c620c055SBram Moolenaar enddef 1490c620c055SBram Moolenaar Test() 1491601e76acSBram Moolenaar def TestDirect() 1492cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1493601e76acSBram Moolenaar enddef 1494601e76acSBram Moolenaar TestDirect() 1495c620c055SBram Moolenaar END 1496601e76acSBram Moolenaar CheckScriptSuccess(lines) 1497c620c055SBram Moolenaar delete('Xfilter.vim') 1498c620c055SBram Moolenaarenddef 1499c620c055SBram Moolenaar 15004c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1501cfcd011fSBram Moolenaar var first_lines =<< trim END 15024c17ad94SBram Moolenaar vim9script 15034c17ad94SBram Moolenaar def FuncYes(): string 15044c17ad94SBram Moolenaar return 'yes' 15054c17ad94SBram Moolenaar enddef 15064c17ad94SBram Moolenaar END 1507cfcd011fSBram Moolenaar var withno_lines =<< trim END 15084c17ad94SBram Moolenaar def FuncNo(): string 15094c17ad94SBram Moolenaar return 'no' 15104c17ad94SBram Moolenaar enddef 15114c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15124c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15134c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 151403afdcf1SBram Moolenaar enddef 151503afdcf1SBram Moolenaar END 1516cfcd011fSBram Moolenaar var nono_lines =<< trim END 151703afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 151803afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 151944d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 15204c17ad94SBram Moolenaar enddef 15214c17ad94SBram Moolenaar END 15224c17ad94SBram Moolenaar 15234c17ad94SBram Moolenaar # FuncNo() is defined 152403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15254c17ad94SBram Moolenaar source Xreloaded.vim 15264c17ad94SBram Moolenaar g:DoCheck(true) 15274c17ad94SBram Moolenaar 15284c17ad94SBram Moolenaar # FuncNo() is not redefined 152903afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15304c17ad94SBram Moolenaar source Xreloaded.vim 15315082471fSBram Moolenaar g:DoCheck(false) 15324c17ad94SBram Moolenaar 15334c17ad94SBram Moolenaar # FuncNo() is back 153403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15354c17ad94SBram Moolenaar source Xreloaded.vim 15365082471fSBram Moolenaar g:DoCheck(false) 15374c17ad94SBram Moolenaar 15384c17ad94SBram Moolenaar delete('Xreloaded.vim') 15394c17ad94SBram Moolenaarenddef 15404c17ad94SBram Moolenaar 154189483d40SBram Moolenaardef Test_vim9script_reload_delvar() 154289483d40SBram Moolenaar # write the script with a script-local variable 1543cfcd011fSBram Moolenaar var lines =<< trim END 154489483d40SBram Moolenaar vim9script 1545cfcd011fSBram Moolenaar var name = 'string' 154689483d40SBram Moolenaar END 154789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 154889483d40SBram Moolenaar source XreloadVar.vim 154989483d40SBram Moolenaar 155089483d40SBram Moolenaar # now write the script using the same variable locally - works 155189483d40SBram Moolenaar lines =<< trim END 155289483d40SBram Moolenaar vim9script 155389483d40SBram Moolenaar def Func() 1554cfcd011fSBram Moolenaar var name = 'string' 155589483d40SBram Moolenaar enddef 155689483d40SBram Moolenaar END 155789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 155889483d40SBram Moolenaar source XreloadVar.vim 155989483d40SBram Moolenaar 156089483d40SBram Moolenaar delete('XreloadVar.vim') 156189483d40SBram Moolenaarenddef 156289483d40SBram Moolenaar 15638a7d6542SBram Moolenaardef Test_import_absolute() 1564cfcd011fSBram Moolenaar var import_lines = [ 1565e6085c53SBram Moolenaar 'vim9script', 1566e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1567e6085c53SBram Moolenaar 'def UseExported()', 1568e6085c53SBram Moolenaar ' g:imported_abs = exported', 1569e6085c53SBram Moolenaar ' exported = 8888', 1570e6085c53SBram Moolenaar ' g:imported_after = exported', 1571e6085c53SBram Moolenaar 'enddef', 1572e6085c53SBram Moolenaar 'UseExported()', 1573e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1574e6085c53SBram Moolenaar ] 15758a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15768a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15778a7d6542SBram Moolenaar 15788a7d6542SBram Moolenaar source Ximport_abs.vim 15798a7d6542SBram Moolenaar 15808a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15814e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1582fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1583fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1584fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1585fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1586fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1587fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1588fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1589fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1590fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1591fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1592e6085c53SBram Moolenaar g:import_disassembled) 1593b3ca9824SBram Moolenaar 1594b3ca9824SBram Moolenaar Undo_export_script_lines() 15958a7d6542SBram Moolenaar unlet g:imported_abs 15964e12a5dfSBram Moolenaar unlet g:import_disassembled 15978a7d6542SBram Moolenaar 15988a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15998a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16008a7d6542SBram Moolenaarenddef 16018a7d6542SBram Moolenaar 16028a7d6542SBram Moolenaardef Test_import_rtp() 1603cfcd011fSBram Moolenaar var import_lines = [ 1604e6085c53SBram Moolenaar 'vim9script', 1605e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1606e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1607e6085c53SBram Moolenaar ] 16088a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16098a7d6542SBram Moolenaar mkdir('import') 16108a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16118a7d6542SBram Moolenaar 1612cfcd011fSBram Moolenaar var save_rtp = &rtp 16138a7d6542SBram Moolenaar &rtp = getcwd() 16148a7d6542SBram Moolenaar source Ximport_rtp.vim 16158a7d6542SBram Moolenaar &rtp = save_rtp 16168a7d6542SBram Moolenaar 16178a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16188a7d6542SBram Moolenaar 1619b3ca9824SBram Moolenaar Undo_export_script_lines() 1620b3ca9824SBram Moolenaar unlet g:imported_rtp 16218a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 162289483d40SBram Moolenaar delete('import', 'rf') 16238a7d6542SBram Moolenaarenddef 16248a7d6542SBram Moolenaar 162525e0f586SBram Moolenaardef Test_import_compile_error() 1626cfcd011fSBram Moolenaar var export_lines = [ 162725e0f586SBram Moolenaar 'vim9script', 162825e0f586SBram Moolenaar 'export def ExpFunc(): string', 162925e0f586SBram Moolenaar ' return notDefined', 163025e0f586SBram Moolenaar 'enddef', 163125e0f586SBram Moolenaar ] 163225e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 163325e0f586SBram Moolenaar 1634cfcd011fSBram Moolenaar var import_lines = [ 163525e0f586SBram Moolenaar 'vim9script', 163625e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 163725e0f586SBram Moolenaar 'def ImpFunc()', 163825e0f586SBram Moolenaar ' echo ExpFunc()', 163925e0f586SBram Moolenaar 'enddef', 164025e0f586SBram Moolenaar 'defcompile', 164125e0f586SBram Moolenaar ] 164225e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 164325e0f586SBram Moolenaar 164425e0f586SBram Moolenaar try 164525e0f586SBram Moolenaar source Ximport.vim 164625e0f586SBram Moolenaar catch /E1001/ 1647f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16487707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 164925e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 165025e0f586SBram Moolenaar endtry 165125e0f586SBram Moolenaar 165225e0f586SBram Moolenaar delete('Xexported.vim') 165325e0f586SBram Moolenaar delete('Ximport.vim') 165425e0f586SBram Moolenaarenddef 165525e0f586SBram Moolenaar 1656c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1657cfcd011fSBram Moolenaar var lines = [ 1658c4ce36d4SBram Moolenaar 'vim9script', 1659c4ce36d4SBram Moolenaar 'def Func()', 1660c4ce36d4SBram Moolenaar ' eval [][0]', 1661c4ce36d4SBram Moolenaar 'enddef', 1662c4ce36d4SBram Moolenaar 'Func()', 1663c4ce36d4SBram Moolenaar ] 1664c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1665c4ce36d4SBram Moolenaar 1666c4ce36d4SBram Moolenaar for count in range(3) 1667c4ce36d4SBram Moolenaar try 1668c4ce36d4SBram Moolenaar source Xtestscript.vim 1669c4ce36d4SBram Moolenaar catch /E684/ 1670c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1671c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1672c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1673c4ce36d4SBram Moolenaar endtry 1674c4ce36d4SBram Moolenaar endfor 1675c4ce36d4SBram Moolenaar 1676c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1677c4ce36d4SBram Moolenaarenddef 1678c4ce36d4SBram Moolenaar 1679eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1680cfcd011fSBram Moolenaar var export_lines =<< trim END 1681eef2102eSBram Moolenaar vim9script 1682eef2102eSBram Moolenaar export def Func() 1683eef2102eSBram Moolenaar echo 'imported' 1684eef2102eSBram Moolenaar enddef 1685eef2102eSBram Moolenaar END 1686eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1687eef2102eSBram Moolenaar 1688cfcd011fSBram Moolenaar var lines =<< trim END 1689eef2102eSBram Moolenaar vim9script 1690eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1691eef2102eSBram Moolenaar def Func() 1692eef2102eSBram Moolenaar echo 'local to function' 1693eef2102eSBram Moolenaar enddef 1694eef2102eSBram Moolenaar END 1695eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1696eef2102eSBram Moolenaar 1697eef2102eSBram Moolenaar lines =<< trim END 1698eef2102eSBram Moolenaar vim9script 1699eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1700eef2102eSBram Moolenaar def Outer() 1701eef2102eSBram Moolenaar def Func() 1702eef2102eSBram Moolenaar echo 'local to function' 1703eef2102eSBram Moolenaar enddef 1704eef2102eSBram Moolenaar enddef 1705eef2102eSBram Moolenaar defcompile 1706eef2102eSBram Moolenaar END 1707eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1708eef2102eSBram Moolenaar 1709eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1710eef2102eSBram Moolenaarenddef 1711eef2102eSBram Moolenaar 1712b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1713cfcd011fSBram Moolenaar var lines =<< trim END 1714b9a2cac3SBram Moolenaar vim9script 1715b9a2cac3SBram Moolenaar def Func() 1716b9a2cac3SBram Moolenaar echo 'one' 1717b9a2cac3SBram Moolenaar enddef 1718b9a2cac3SBram Moolenaar def Func() 1719b9a2cac3SBram Moolenaar echo 'two' 1720b9a2cac3SBram Moolenaar enddef 1721b9a2cac3SBram Moolenaar END 1722b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1723fa211f3cSBram Moolenaar 1724fa211f3cSBram Moolenaar lines =<< trim END 1725fa211f3cSBram Moolenaar vim9script 1726fa211f3cSBram Moolenaar def Foo(): string 1727fa211f3cSBram Moolenaar return 'foo' 1728fa211f3cSBram Moolenaar enddef 1729fa211f3cSBram Moolenaar def Func() 1730cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1731fa211f3cSBram Moolenaar enddef 1732fa211f3cSBram Moolenaar defcompile 1733fa211f3cSBram Moolenaar END 1734fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1735b9a2cac3SBram Moolenaarenddef 1736b9a2cac3SBram Moolenaar 17378a7d6542SBram Moolenaardef Test_fixed_size_list() 1738f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1739cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 17408a7d6542SBram Moolenaar l->remove(0) 17418a7d6542SBram Moolenaar l->add(5) 17428a7d6542SBram Moolenaar l->insert(99, 1) 17430f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17448a7d6542SBram Moolenaarenddef 17458a7d6542SBram Moolenaar 1746ae616494SBram Moolenaardef Test_no_insert_xit() 1747d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1748d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1749d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1750d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1751d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1752ae616494SBram Moolenaar 1753ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1754ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1755ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1756ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1757f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1758f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1759f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1760f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1761f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1762ae616494SBram Moolenaarenddef 1763ae616494SBram Moolenaar 1764158906cfSBram Moolenaardef IfElse(what: number): string 1765cfcd011fSBram Moolenaar var res = '' 1766158906cfSBram Moolenaar if what == 1 1767158906cfSBram Moolenaar res = "one" 1768158906cfSBram Moolenaar elseif what == 2 1769158906cfSBram Moolenaar res = "two" 1770a259d8d3SBram Moolenaar else 1771158906cfSBram Moolenaar res = "three" 1772a259d8d3SBram Moolenaar endif 1773158906cfSBram Moolenaar return res 1774a259d8d3SBram Moolenaarenddef 1775a259d8d3SBram Moolenaar 1776158906cfSBram Moolenaardef Test_if_elseif_else() 1777158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1778158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1779158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17800f18b6d1SBram Moolenaarenddef 17810f18b6d1SBram Moolenaar 1782e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1783d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1784d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1785d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1786ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1787d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 17886628b7ebSBram Moolenaar 17896628b7ebSBram Moolenaar var lines =<< trim END 17906628b7ebSBram Moolenaar var s = '' 17916628b7ebSBram Moolenaar if s = '' 17926628b7ebSBram Moolenaar endif 17936628b7ebSBram Moolenaar END 17946628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 17956628b7ebSBram Moolenaar 17966628b7ebSBram Moolenaar lines =<< trim END 17976628b7ebSBram Moolenaar var s = '' 17986628b7ebSBram Moolenaar if s == '' 17996628b7ebSBram Moolenaar elseif s = '' 18006628b7ebSBram Moolenaar endif 18016628b7ebSBram Moolenaar END 18026628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1803e8c4abbbSBram Moolenaarenddef 1804e8c4abbbSBram Moolenaar 18056d69bf60SBram Moolenaarlet g:bool_true = v:true 18066d69bf60SBram Moolenaarlet g:bool_false = v:false 18076d69bf60SBram Moolenaar 18086d69bf60SBram Moolenaardef Test_if_const_expr() 1809cfcd011fSBram Moolenaar var res = false 18106d69bf60SBram Moolenaar if true ? true : false 18116d69bf60SBram Moolenaar res = true 18126d69bf60SBram Moolenaar endif 18136d69bf60SBram Moolenaar assert_equal(true, res) 18146d69bf60SBram Moolenaar 1815585fea7bSBram Moolenaar g:glob = 2 1816585fea7bSBram Moolenaar if false 18176797966dSBram Moolenaar execute('g:glob = 3') 1818585fea7bSBram Moolenaar endif 1819585fea7bSBram Moolenaar assert_equal(2, g:glob) 1820585fea7bSBram Moolenaar if true 18216797966dSBram Moolenaar execute('g:glob = 3') 1822585fea7bSBram Moolenaar endif 1823585fea7bSBram Moolenaar assert_equal(3, g:glob) 1824585fea7bSBram Moolenaar 18256d69bf60SBram Moolenaar res = false 18266d69bf60SBram Moolenaar if g:bool_true ? true : false 18276d69bf60SBram Moolenaar res = true 18286d69bf60SBram Moolenaar endif 18296d69bf60SBram Moolenaar assert_equal(true, res) 18306d69bf60SBram Moolenaar 18316d69bf60SBram Moolenaar res = false 18326d69bf60SBram Moolenaar if true ? g:bool_true : false 18336d69bf60SBram Moolenaar res = true 18346d69bf60SBram Moolenaar endif 18356d69bf60SBram Moolenaar assert_equal(true, res) 18366d69bf60SBram Moolenaar 18376d69bf60SBram Moolenaar res = false 18386d69bf60SBram Moolenaar if true ? true : g:bool_false 18396d69bf60SBram Moolenaar res = true 18406d69bf60SBram Moolenaar endif 18416d69bf60SBram Moolenaar assert_equal(true, res) 18426d69bf60SBram Moolenaar 18436d69bf60SBram Moolenaar res = false 18446d69bf60SBram Moolenaar if true ? false : true 18456d69bf60SBram Moolenaar res = true 18466d69bf60SBram Moolenaar endif 18476d69bf60SBram Moolenaar assert_equal(false, res) 18486d69bf60SBram Moolenaar 18496d69bf60SBram Moolenaar res = false 18506d69bf60SBram Moolenaar if false ? false : true 18516d69bf60SBram Moolenaar res = true 18526d69bf60SBram Moolenaar endif 18536d69bf60SBram Moolenaar assert_equal(true, res) 18546d69bf60SBram Moolenaar 18556d69bf60SBram Moolenaar res = false 18566d69bf60SBram Moolenaar if false ? true : false 18576d69bf60SBram Moolenaar res = true 18586d69bf60SBram Moolenaar endif 18596d69bf60SBram Moolenaar assert_equal(false, res) 18606d69bf60SBram Moolenaar 18616d69bf60SBram Moolenaar res = false 1862e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1863e8c4abbbSBram Moolenaar res = true 1864e8c4abbbSBram Moolenaar endif 1865e8c4abbbSBram Moolenaar assert_equal(false, res) 1866e8c4abbbSBram Moolenaar 1867e8c4abbbSBram Moolenaar res = false 18686d69bf60SBram Moolenaar if true && true 18696d69bf60SBram Moolenaar res = true 18706d69bf60SBram Moolenaar endif 18716d69bf60SBram Moolenaar assert_equal(true, res) 18726d69bf60SBram Moolenaar 18736d69bf60SBram Moolenaar res = false 18746d69bf60SBram Moolenaar if true && false 18756d69bf60SBram Moolenaar res = true 18766d69bf60SBram Moolenaar endif 18776d69bf60SBram Moolenaar assert_equal(false, res) 18786d69bf60SBram Moolenaar 18796d69bf60SBram Moolenaar res = false 18806d69bf60SBram Moolenaar if g:bool_true && false 18816d69bf60SBram Moolenaar res = true 18826d69bf60SBram Moolenaar endif 18836d69bf60SBram Moolenaar assert_equal(false, res) 18846d69bf60SBram Moolenaar 18856d69bf60SBram Moolenaar res = false 18866d69bf60SBram Moolenaar if true && g:bool_false 18876d69bf60SBram Moolenaar res = true 18886d69bf60SBram Moolenaar endif 18896d69bf60SBram Moolenaar assert_equal(false, res) 18906d69bf60SBram Moolenaar 18916d69bf60SBram Moolenaar res = false 18926d69bf60SBram Moolenaar if false && false 18936d69bf60SBram Moolenaar res = true 18946d69bf60SBram Moolenaar endif 18956d69bf60SBram Moolenaar assert_equal(false, res) 18966d69bf60SBram Moolenaar 18976d69bf60SBram Moolenaar res = false 18986d69bf60SBram Moolenaar if true || false 18996d69bf60SBram Moolenaar res = true 19006d69bf60SBram Moolenaar endif 19016d69bf60SBram Moolenaar assert_equal(true, res) 19026d69bf60SBram Moolenaar 19036d69bf60SBram Moolenaar res = false 19046d69bf60SBram Moolenaar if g:bool_true || false 19056d69bf60SBram Moolenaar res = true 19066d69bf60SBram Moolenaar endif 19076d69bf60SBram Moolenaar assert_equal(true, res) 19086d69bf60SBram Moolenaar 19096d69bf60SBram Moolenaar res = false 19106d69bf60SBram Moolenaar if true || g:bool_false 19116d69bf60SBram Moolenaar res = true 19126d69bf60SBram Moolenaar endif 19136d69bf60SBram Moolenaar assert_equal(true, res) 19146d69bf60SBram Moolenaar 19156d69bf60SBram Moolenaar res = false 19166d69bf60SBram Moolenaar if false || false 19176d69bf60SBram Moolenaar res = true 19186d69bf60SBram Moolenaar endif 19196d69bf60SBram Moolenaar assert_equal(false, res) 19203988f64fSBram Moolenaar 19213988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 19223988f64fSBram Moolenaar if false | eval 0 | endif 19233988f64fSBram Moolenaar if false | eval burp + 234 | endif 19243988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 19253988f64fSBram Moolenaar if false 19263988f64fSBram Moolenaar burp 19273988f64fSBram Moolenaar endif 192880c34ca3SBram Moolenaarenddef 19296d69bf60SBram Moolenaar 193080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1931d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1932d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1933d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1934d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19356d69bf60SBram Moolenaarenddef 19366d69bf60SBram Moolenaar 193772abcf42SBram Moolenaardef RunNested(i: number): number 1938cfcd011fSBram Moolenaar var x: number = 0 193972abcf42SBram Moolenaar if i % 2 194072abcf42SBram Moolenaar if 1 1941f5be8cdbSBram Moolenaar # comment 194272abcf42SBram Moolenaar else 1943f5be8cdbSBram Moolenaar # comment 194472abcf42SBram Moolenaar endif 194572abcf42SBram Moolenaar x += 1 194672abcf42SBram Moolenaar else 194772abcf42SBram Moolenaar x += 1000 194872abcf42SBram Moolenaar endif 194972abcf42SBram Moolenaar return x 195072abcf42SBram Moolenaarenddef 195172abcf42SBram Moolenaar 195272abcf42SBram Moolenaardef Test_nested_if() 195372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 195472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 195572abcf42SBram Moolenaarenddef 195672abcf42SBram Moolenaar 1957ad39c094SBram Moolenaardef Test_execute_cmd() 1958e4984290SBram Moolenaar # missing argument is ignored 1959e4984290SBram Moolenaar execute 1960e4984290SBram Moolenaar execute # comment 1961e4984290SBram Moolenaar 1962ad39c094SBram Moolenaar new 1963ad39c094SBram Moolenaar setline(1, 'default') 1964d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1965ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1966a72cfb80SBram Moolenaar 1967d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1968a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1969a72cfb80SBram Moolenaar 1970cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1971cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1972a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1973ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1974a72cfb80SBram Moolenaar 1975d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1976ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1977a72cfb80SBram Moolenaar 1978cfcd011fSBram Moolenaar var cmd_first = 'call ' 1979cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1980ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1981ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1982ad39c094SBram Moolenaar bwipe! 1983585fea7bSBram Moolenaar 1984cfcd011fSBram Moolenaar var n = true 19852d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 19862d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 19872d6b20d6SBram Moolenaar 1988e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1989e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1990e5abf7afSBram Moolenaar 1991d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1992d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1993d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1994ad39c094SBram Moolenaarenddef 1995ad39c094SBram Moolenaar 199647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1997f5be8cdbSBram Moolenaar # only checks line continuation 1998cfcd011fSBram Moolenaar var lines =<< trim END 199947e880d6SBram Moolenaar vim9script 200047e880d6SBram Moolenaar execute 'g:someVar' 200147e880d6SBram Moolenaar .. ' = ' .. 200247e880d6SBram Moolenaar '28' 200347e880d6SBram Moolenaar assert_equal(28, g:someVar) 200447e880d6SBram Moolenaar unlet g:someVar 200547e880d6SBram Moolenaar END 200647e880d6SBram Moolenaar CheckScriptSuccess(lines) 200747e880d6SBram Moolenaarenddef 200847e880d6SBram Moolenaar 2009ad39c094SBram Moolenaardef Test_echo_cmd() 2010a72cfb80SBram Moolenaar echo 'some' # comment 2011585fea7bSBram Moolenaar echon 'thing' 2012ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2013ad39c094SBram Moolenaar 2014a72cfb80SBram Moolenaar echo "some" # comment 2015a72cfb80SBram Moolenaar echon "thing" 2016a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2017a72cfb80SBram Moolenaar 2018cfcd011fSBram Moolenaar var str1 = 'some' 2019cfcd011fSBram Moolenaar var str2 = 'more' 2020ad39c094SBram Moolenaar echo str1 str2 2021ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2022a72cfb80SBram Moolenaar 2023d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2024ad39c094SBram Moolenaarenddef 2025ad39c094SBram Moolenaar 2026f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2027f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2028f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2029f93c7feaSBram Moolenaar echo 'clear' 2030df069eecSBram Moolenaar :1messages 2031f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2032f93c7feaSBram Moolenaar 2033d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2034f93c7feaSBram Moolenaarenddef 2035f93c7feaSBram Moolenaar 203647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2037f5be8cdbSBram Moolenaar # only checks line continuation 2038cfcd011fSBram Moolenaar var lines =<< trim END 203947e880d6SBram Moolenaar vim9script 204047e880d6SBram Moolenaar echomsg 'here' 204147e880d6SBram Moolenaar .. ' is ' .. 204247e880d6SBram Moolenaar 'a message' 204347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 204447e880d6SBram Moolenaar END 204547e880d6SBram Moolenaar CheckScriptSuccess(lines) 204647e880d6SBram Moolenaarenddef 204747e880d6SBram Moolenaar 2048f93c7feaSBram Moolenaardef Test_echoerr_cmd() 204940ee466cSBram Moolenaar try 205040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 205140ee466cSBram Moolenaar catch 205240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 205340ee466cSBram Moolenaar endtry 2054f93c7feaSBram Moolenaarenddef 2055f93c7feaSBram Moolenaar 205647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2057f5be8cdbSBram Moolenaar # only checks line continuation 2058cfcd011fSBram Moolenaar var lines =<< trim END 205947e880d6SBram Moolenaar vim9script 206047e880d6SBram Moolenaar try 206147e880d6SBram Moolenaar echoerr 'this' 206247e880d6SBram Moolenaar .. ' is ' .. 206347e880d6SBram Moolenaar 'wrong' 206447e880d6SBram Moolenaar catch 206547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 206647e880d6SBram Moolenaar endtry 206747e880d6SBram Moolenaar END 206847e880d6SBram Moolenaar CheckScriptSuccess(lines) 206947e880d6SBram Moolenaarenddef 207047e880d6SBram Moolenaar 207141fe0617SBram Moolenaardef Test_for_outside_of_function() 2072cfcd011fSBram Moolenaar var lines =<< trim END 207341fe0617SBram Moolenaar vim9script 207441fe0617SBram Moolenaar new 207541fe0617SBram Moolenaar for var in range(0, 3) 207641fe0617SBram Moolenaar append(line('$'), var) 207741fe0617SBram Moolenaar endfor 207841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 207941fe0617SBram Moolenaar bwipe! 208041fe0617SBram Moolenaar END 208141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 208241fe0617SBram Moolenaar source Xvim9for.vim 208341fe0617SBram Moolenaar delete('Xvim9for.vim') 208441fe0617SBram Moolenaarenddef 20858a7d6542SBram Moolenaar 2086e8c4abbbSBram Moolenaardef Test_for_loop() 2087cfcd011fSBram Moolenaar var result = '' 2088e8c4abbbSBram Moolenaar for cnt in range(7) 2089e8c4abbbSBram Moolenaar if cnt == 4 2090e8c4abbbSBram Moolenaar break 2091e8c4abbbSBram Moolenaar endif 2092e8c4abbbSBram Moolenaar if cnt == 2 2093e8c4abbbSBram Moolenaar continue 2094e8c4abbbSBram Moolenaar endif 2095e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2096e8c4abbbSBram Moolenaar endfor 2097e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20980ad3e894SBram Moolenaar 2099cfcd011fSBram Moolenaar var concat = '' 21000ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21010ad3e894SBram Moolenaar concat ..= str 21020ad3e894SBram Moolenaar endfor 21030ad3e894SBram Moolenaar assert_equal('onetwo', concat) 210438bd8de5SBram Moolenaar 210538bd8de5SBram Moolenaar var total = 0 210638bd8de5SBram Moolenaar for nr in 210738bd8de5SBram Moolenaar [1, 2, 3] 210838bd8de5SBram Moolenaar total += nr 210938bd8de5SBram Moolenaar endfor 211038bd8de5SBram Moolenaar assert_equal(6, total) 211138bd8de5SBram Moolenaar 211238bd8de5SBram Moolenaar total = 0 211338bd8de5SBram Moolenaar for nr 211438bd8de5SBram Moolenaar in [1, 2, 3] 211538bd8de5SBram Moolenaar total += nr 211638bd8de5SBram Moolenaar endfor 211738bd8de5SBram Moolenaar assert_equal(6, total) 211838bd8de5SBram Moolenaar 211938bd8de5SBram Moolenaar total = 0 212038bd8de5SBram Moolenaar for nr 212138bd8de5SBram Moolenaar in 212238bd8de5SBram Moolenaar [1, 2, 3] 212338bd8de5SBram Moolenaar total += nr 212438bd8de5SBram Moolenaar endfor 212538bd8de5SBram Moolenaar assert_equal(6, total) 2126036d0714SBram Moolenaar 2127036d0714SBram Moolenaar var res = "" 2128036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2129036d0714SBram Moolenaar res ..= n .. s 2130036d0714SBram Moolenaar endfor 2131036d0714SBram Moolenaar assert_equal('1a2b', res) 2132e8c4abbbSBram Moolenaarenddef 2133e8c4abbbSBram Moolenaar 2134e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2135025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2136025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2137025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2138675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2139675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2140cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2141822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21422d870f8dSBram Moolenaar delfunc! g:Func 2143451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2144675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2145675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2146675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2147e8c4abbbSBram Moolenaarenddef 2148e8c4abbbSBram Moolenaar 2149ea87069dSBram Moolenaardef Test_for_loop_script_var() 2150ea87069dSBram Moolenaar # cannot use s:var in a :def function 2151ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2152ea87069dSBram Moolenaar 2153ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2154ea87069dSBram Moolenaar var lines =<< trim END 2155ea87069dSBram Moolenaar vim9script 2156ea87069dSBram Moolenaar var total = 0 2157ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2158ea87069dSBram Moolenaar total += s:var 2159ea87069dSBram Moolenaar endfor 2160ea87069dSBram Moolenaar assert_equal(6, total) 2161ea87069dSBram Moolenaar 2162ea87069dSBram Moolenaar total = 0 2163ea87069dSBram Moolenaar for var in [1, 2, 3] 2164ea87069dSBram Moolenaar total += var 2165ea87069dSBram Moolenaar endfor 2166ea87069dSBram Moolenaar assert_equal(6, total) 2167ea87069dSBram Moolenaar END 2168ea87069dSBram Moolenaarenddef 2169ea87069dSBram Moolenaar 2170792f786aSBram Moolenaardef Test_for_loop_unpack() 21714b8a0651SBram Moolenaar var lines =<< trim END 2172792f786aSBram Moolenaar var result = [] 2173792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2174792f786aSBram Moolenaar result->add(v1) 2175792f786aSBram Moolenaar result->add(v2) 2176792f786aSBram Moolenaar endfor 2177792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2178792f786aSBram Moolenaar 2179792f786aSBram Moolenaar result = [] 2180792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2181792f786aSBram Moolenaar result->add(v1) 2182792f786aSBram Moolenaar result->add(v2) 2183792f786aSBram Moolenaar result->add(v3) 2184792f786aSBram Moolenaar endfor 2185792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2186792f786aSBram Moolenaar 21874b8a0651SBram Moolenaar result = [] 21884b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 21894b8a0651SBram Moolenaar result->add(&ts) 21904b8a0651SBram Moolenaar result->add(&sw) 21914b8a0651SBram Moolenaar endfor 21924b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 21934b8a0651SBram Moolenaar 21944b8a0651SBram Moolenaar var slist: list<string> 21954b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 21964b8a0651SBram Moolenaar slist->add($LOOPVAR) 21974b8a0651SBram Moolenaar slist->add(@r) 21984b8a0651SBram Moolenaar slist->add(v:errmsg) 21994b8a0651SBram Moolenaar endfor 22004b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22014b8a0651SBram Moolenaar 22024b8a0651SBram Moolenaar slist = [] 22034b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22044b8a0651SBram Moolenaar slist->add(g:globalvar) 22054b8a0651SBram Moolenaar slist->add(b:bufvar) 22064b8a0651SBram Moolenaar slist->add(w:winvar) 22074b8a0651SBram Moolenaar slist->add(t:tabvar) 22084b8a0651SBram Moolenaar endfor 22094b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2210f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 22114b8a0651SBram Moolenaar END 22124b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 22134b8a0651SBram Moolenaar 22144b8a0651SBram Moolenaar lines =<< trim END 2215792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2216792f786aSBram Moolenaar echo v1 v2 2217792f786aSBram Moolenaar endfor 2218792f786aSBram Moolenaar END 2219792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2220792f786aSBram Moolenaar 2221792f786aSBram Moolenaar lines =<< trim END 2222792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2223792f786aSBram Moolenaar echo v1 v2 2224792f786aSBram Moolenaar endfor 2225792f786aSBram Moolenaar END 2226792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2227792f786aSBram Moolenaar 2228792f786aSBram Moolenaar lines =<< trim END 2229792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2230792f786aSBram Moolenaar echo v1 2231792f786aSBram Moolenaar endfor 2232792f786aSBram Moolenaar END 2233792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2234792f786aSBram Moolenaarenddef 2235792f786aSBram Moolenaar 2236c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2237c150c09eSBram Moolenaar var looped = 0 2238c150c09eSBram Moolenaar var cleanup = 0 2239c150c09eSBram Moolenaar for i in range(3) 2240c150c09eSBram Moolenaar looped += 1 2241c150c09eSBram Moolenaar try 2242c150c09eSBram Moolenaar eval [][0] 2243c150c09eSBram Moolenaar catch 2244c150c09eSBram Moolenaar continue 2245c150c09eSBram Moolenaar finally 2246c150c09eSBram Moolenaar cleanup += 1 2247c150c09eSBram Moolenaar endtry 2248c150c09eSBram Moolenaar endfor 2249c150c09eSBram Moolenaar assert_equal(3, looped) 2250c150c09eSBram Moolenaar assert_equal(3, cleanup) 2251c150c09eSBram Moolenaarenddef 2252c150c09eSBram Moolenaar 2253d0df1aacSBram Moolenaardef Test_while_loop() 2254cfcd011fSBram Moolenaar var result = '' 2255cfcd011fSBram Moolenaar var cnt = 0 2256d0df1aacSBram Moolenaar while cnt < 555 2257d0df1aacSBram Moolenaar if cnt == 3 2258d0df1aacSBram Moolenaar break 2259d0df1aacSBram Moolenaar endif 2260d0df1aacSBram Moolenaar cnt += 1 2261d0df1aacSBram Moolenaar if cnt == 2 2262d0df1aacSBram Moolenaar continue 2263d0df1aacSBram Moolenaar endif 2264d0df1aacSBram Moolenaar result ..= cnt .. '_' 2265d0df1aacSBram Moolenaar endwhile 2266d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2267dee37dc7SBram Moolenaar 2268dee37dc7SBram Moolenaar var s = '' 22690123cc1eSBram Moolenaar while s == 'x' #{comment} 2270dee37dc7SBram Moolenaar endwhile 2271d0df1aacSBram Moolenaarenddef 2272d0df1aacSBram Moolenaar 2273e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2274675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2275675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2276675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2277675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2278675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2279675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2280675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 22816628b7ebSBram Moolenaar 22826628b7ebSBram Moolenaar var lines =<< trim END 22836628b7ebSBram Moolenaar var s = '' 22846628b7ebSBram Moolenaar while s = '' 22856628b7ebSBram Moolenaar endwhile 22866628b7ebSBram Moolenaar END 22876628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2288bd5da371SBram Moolenaarenddef 2289bd5da371SBram Moolenaar 22909645e2d9SBram Moolenaardef Test_interrupt_loop() 2291cfcd011fSBram Moolenaar var caught = false 2292cfcd011fSBram Moolenaar var x = 0 229397acfc78SBram Moolenaar try 22949645e2d9SBram Moolenaar while 1 22959645e2d9SBram Moolenaar x += 1 22969645e2d9SBram Moolenaar if x == 100 22979645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 22989645e2d9SBram Moolenaar endif 22999645e2d9SBram Moolenaar endwhile 230097acfc78SBram Moolenaar catch 230197acfc78SBram Moolenaar caught = true 230297acfc78SBram Moolenaar assert_equal(100, x) 230397acfc78SBram Moolenaar endtry 230497acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 230525859dd7SBram Moolenaar # consume the CTRL-C 230625859dd7SBram Moolenaar getchar(0) 23079645e2d9SBram Moolenaarenddef 230820431c9dSBram Moolenaar 23094fdae999SBram Moolenaardef Test_automatic_line_continuation() 2310cfcd011fSBram Moolenaar var mylist = [ 23114fdae999SBram Moolenaar 'one', 23124fdae999SBram Moolenaar 'two', 23134fdae999SBram Moolenaar 'three', 2314f5be8cdbSBram Moolenaar ] # comment 23154fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23164fdae999SBram Moolenaar 2317cfcd011fSBram Moolenaar var mydict = { 2318e0de171eSBram Moolenaar ['one']: 1, 2319e0de171eSBram Moolenaar ['two']: 2, 2320e0de171eSBram Moolenaar ['three']: 23214fdae999SBram Moolenaar 3, 2322f5be8cdbSBram Moolenaar } # comment 2323e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2324e0de171eSBram Moolenaar mydict = { 23252c330432SBram Moolenaar one: 1, # comment 23262c330432SBram Moolenaar two: # comment 23272c330432SBram Moolenaar 2, # comment 23282c330432SBram Moolenaar three: 3 # comment 23292c330432SBram Moolenaar } 2330e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2331e0de171eSBram Moolenaar mydict = { 23322c330432SBram Moolenaar one: 1, 23334fdae999SBram Moolenaar two: 23344fdae999SBram Moolenaar 2, 23352c330432SBram Moolenaar three: 3 23364fdae999SBram Moolenaar } 2337e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2338e6085c53SBram Moolenaar 2339e6085c53SBram Moolenaar assert_equal( 2340e6085c53SBram Moolenaar ['one', 'two', 'three'], 2341e6085c53SBram Moolenaar split('one two three') 2342e6085c53SBram Moolenaar ) 23434fdae999SBram Moolenaarenddef 23444fdae999SBram Moolenaar 23457a092245SBram Moolenaardef Test_vim9_comment() 23467a092245SBram Moolenaar CheckScriptSuccess([ 23477a092245SBram Moolenaar 'vim9script', 23487a092245SBram Moolenaar '# something', 234993f82cbeSBram Moolenaar '#something', 235093f82cbeSBram Moolenaar '#{something', 23517a092245SBram Moolenaar ]) 235293f82cbeSBram Moolenaar 235393f82cbeSBram Moolenaar split Xfile 235493f82cbeSBram Moolenaar CheckScriptSuccess([ 235593f82cbeSBram Moolenaar 'vim9script', 235693f82cbeSBram Moolenaar 'edit #something', 235793f82cbeSBram Moolenaar ]) 235893f82cbeSBram Moolenaar CheckScriptSuccess([ 235993f82cbeSBram Moolenaar 'vim9script', 236093f82cbeSBram Moolenaar 'edit #{something', 236193f82cbeSBram Moolenaar ]) 236293f82cbeSBram Moolenaar close 236393f82cbeSBram Moolenaar 23647a092245SBram Moolenaar CheckScriptFailure([ 23657a092245SBram Moolenaar 'vim9script', 23667a092245SBram Moolenaar ':# something', 23677a092245SBram Moolenaar ], 'E488:') 23687a092245SBram Moolenaar CheckScriptFailure([ 23697a092245SBram Moolenaar '# something', 23707a092245SBram Moolenaar ], 'E488:') 23717a092245SBram Moolenaar CheckScriptFailure([ 23727a092245SBram Moolenaar ':# something', 23737a092245SBram Moolenaar ], 'E488:') 23747a092245SBram Moolenaar 23754a8d9f2eSBram Moolenaar { # block start 23764a8d9f2eSBram Moolenaar } # block end 23774a8d9f2eSBram Moolenaar CheckDefFailure([ 23784a8d9f2eSBram Moolenaar '{# comment', 23794a8d9f2eSBram Moolenaar ], 'E488:') 23804a8d9f2eSBram Moolenaar CheckDefFailure([ 23814a8d9f2eSBram Moolenaar '{', 23824a8d9f2eSBram Moolenaar '}# comment', 23834a8d9f2eSBram Moolenaar ], 'E488:') 23844a8d9f2eSBram Moolenaar 23854a8d9f2eSBram Moolenaar echo "yes" # comment 23864a8d9f2eSBram Moolenaar CheckDefFailure([ 23874a8d9f2eSBram Moolenaar 'echo "yes"# comment', 23884a8d9f2eSBram Moolenaar ], 'E488:') 23897a092245SBram Moolenaar CheckScriptSuccess([ 23907a092245SBram Moolenaar 'vim9script', 23917a092245SBram Moolenaar 'echo "yes" # something', 23927a092245SBram Moolenaar ]) 23937a092245SBram Moolenaar CheckScriptFailure([ 23947a092245SBram Moolenaar 'vim9script', 23957a092245SBram Moolenaar 'echo "yes"# something', 23967a092245SBram Moolenaar ], 'E121:') 23977a092245SBram Moolenaar CheckScriptFailure([ 23987a092245SBram Moolenaar 'vim9script', 23997a092245SBram Moolenaar 'echo# something', 2400f8103f27SBram Moolenaar ], 'E1144:') 24017a092245SBram Moolenaar CheckScriptFailure([ 24027a092245SBram Moolenaar 'echo "yes" # something', 24037a092245SBram Moolenaar ], 'E121:') 24047a092245SBram Moolenaar 24054a8d9f2eSBram Moolenaar exe "echo" # comment 24064a8d9f2eSBram Moolenaar CheckDefFailure([ 24074a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24084a8d9f2eSBram Moolenaar ], 'E488:') 24094a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24104a8d9f2eSBram Moolenaar 'vim9script', 24114a8d9f2eSBram Moolenaar 'exe "echo" # something', 24124a8d9f2eSBram Moolenaar ]) 24134a8d9f2eSBram Moolenaar CheckScriptFailure([ 24144a8d9f2eSBram Moolenaar 'vim9script', 24154a8d9f2eSBram Moolenaar 'exe "echo"# something', 24164a8d9f2eSBram Moolenaar ], 'E121:') 24174a8d9f2eSBram Moolenaar CheckScriptFailure([ 24184a8d9f2eSBram Moolenaar 'vim9script', 24194a8d9f2eSBram Moolenaar 'exe# something', 2420f8103f27SBram Moolenaar ], 'E1144:') 24214a8d9f2eSBram Moolenaar CheckScriptFailure([ 24224a8d9f2eSBram Moolenaar 'exe "echo" # something', 24234a8d9f2eSBram Moolenaar ], 'E121:') 24244a8d9f2eSBram Moolenaar 24257a092245SBram Moolenaar CheckDefFailure([ 24267a092245SBram Moolenaar 'try# comment', 24277a092245SBram Moolenaar ' echo "yes"', 24287a092245SBram Moolenaar 'catch', 24297a092245SBram Moolenaar 'endtry', 2430f8103f27SBram Moolenaar ], 'E1144:') 24312c5ed4e3SBram Moolenaar CheckScriptFailure([ 24322c5ed4e3SBram Moolenaar 'vim9script', 24332c5ed4e3SBram Moolenaar 'try# comment', 24342c5ed4e3SBram Moolenaar 'echo "yes"', 2435f8103f27SBram Moolenaar ], 'E1144:') 24367a092245SBram Moolenaar CheckDefFailure([ 24377a092245SBram Moolenaar 'try', 2438a72cfb80SBram Moolenaar ' throw#comment', 2439a72cfb80SBram Moolenaar 'catch', 2440a72cfb80SBram Moolenaar 'endtry', 2441f8103f27SBram Moolenaar ], 'E1144:') 2442a72cfb80SBram Moolenaar CheckDefFailure([ 2443a72cfb80SBram Moolenaar 'try', 2444a72cfb80SBram Moolenaar ' throw "yes"#comment', 2445a72cfb80SBram Moolenaar 'catch', 2446a72cfb80SBram Moolenaar 'endtry', 2447a72cfb80SBram Moolenaar ], 'E488:') 2448a72cfb80SBram Moolenaar CheckDefFailure([ 2449a72cfb80SBram Moolenaar 'try', 24507a092245SBram Moolenaar ' echo "yes"', 24517a092245SBram Moolenaar 'catch# comment', 24527a092245SBram Moolenaar 'endtry', 2453f8103f27SBram Moolenaar ], 'E1144:') 24542c5ed4e3SBram Moolenaar CheckScriptFailure([ 24552c5ed4e3SBram Moolenaar 'vim9script', 24562c5ed4e3SBram Moolenaar 'try', 24572c5ed4e3SBram Moolenaar ' echo "yes"', 24582c5ed4e3SBram Moolenaar 'catch# comment', 24592c5ed4e3SBram Moolenaar 'endtry', 2460f8103f27SBram Moolenaar ], 'E1144:') 24612c5ed4e3SBram Moolenaar CheckDefFailure([ 24622c5ed4e3SBram Moolenaar 'try', 24632c5ed4e3SBram Moolenaar ' echo "yes"', 24642c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24652c5ed4e3SBram Moolenaar 'endtry', 24662c5ed4e3SBram Moolenaar ], 'E488:') 24677a092245SBram Moolenaar CheckDefFailure([ 24687a092245SBram Moolenaar 'try', 24697a092245SBram Moolenaar 'echo "yes"', 24707a092245SBram Moolenaar 'catch', 24717a092245SBram Moolenaar 'endtry# comment', 2472f8103f27SBram Moolenaar ], 'E1144:') 24732c5ed4e3SBram Moolenaar CheckScriptFailure([ 24742c5ed4e3SBram Moolenaar 'vim9script', 24752c5ed4e3SBram Moolenaar 'try', 24762c5ed4e3SBram Moolenaar ' echo "yes"', 24772c5ed4e3SBram Moolenaar 'catch', 24782c5ed4e3SBram Moolenaar 'endtry# comment', 2479f8103f27SBram Moolenaar ], 'E1144:') 24802c5ed4e3SBram Moolenaar 24812c5ed4e3SBram Moolenaar CheckScriptSuccess([ 24822c5ed4e3SBram Moolenaar 'vim9script', 24832c5ed4e3SBram Moolenaar 'hi # comment', 24842c5ed4e3SBram Moolenaar ]) 24852c5ed4e3SBram Moolenaar CheckScriptFailure([ 24862c5ed4e3SBram Moolenaar 'vim9script', 24872c5ed4e3SBram Moolenaar 'hi# comment', 2488f8103f27SBram Moolenaar ], 'E1144:') 24891966c248SBram Moolenaar CheckScriptSuccess([ 24901966c248SBram Moolenaar 'vim9script', 24911966c248SBram Moolenaar 'hi Search # comment', 24921966c248SBram Moolenaar ]) 24931966c248SBram Moolenaar CheckScriptFailure([ 24941966c248SBram Moolenaar 'vim9script', 24951966c248SBram Moolenaar 'hi Search# comment', 24961966c248SBram Moolenaar ], 'E416:') 24971966c248SBram Moolenaar CheckScriptSuccess([ 24981966c248SBram Moolenaar 'vim9script', 24991966c248SBram Moolenaar 'hi link This Search # comment', 25001966c248SBram Moolenaar ]) 25011966c248SBram Moolenaar CheckScriptFailure([ 25021966c248SBram Moolenaar 'vim9script', 25031966c248SBram Moolenaar 'hi link This That# comment', 25041966c248SBram Moolenaar ], 'E413:') 25051966c248SBram Moolenaar CheckScriptSuccess([ 25061966c248SBram Moolenaar 'vim9script', 25071966c248SBram Moolenaar 'hi clear This # comment', 25081966c248SBram Moolenaar 'hi clear # comment', 25091966c248SBram Moolenaar ]) 2510f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2511f5be8cdbSBram Moolenaar # hi clear This# comment', 25121966c248SBram Moolenaar CheckScriptFailure([ 25131966c248SBram Moolenaar 'vim9script', 25141966c248SBram Moolenaar 'hi clear# comment', 25151966c248SBram Moolenaar ], 'E416:') 25161966c248SBram Moolenaar 25171966c248SBram Moolenaar CheckScriptSuccess([ 25181966c248SBram Moolenaar 'vim9script', 25191966c248SBram Moolenaar 'hi Group term=bold', 25201966c248SBram Moolenaar 'match Group /todo/ # comment', 25211966c248SBram Moolenaar ]) 25221966c248SBram Moolenaar CheckScriptFailure([ 25231966c248SBram Moolenaar 'vim9script', 25241966c248SBram Moolenaar 'hi Group term=bold', 25251966c248SBram Moolenaar 'match Group /todo/# comment', 25261966c248SBram Moolenaar ], 'E488:') 25271966c248SBram Moolenaar CheckScriptSuccess([ 25281966c248SBram Moolenaar 'vim9script', 25291966c248SBram Moolenaar 'match # comment', 25301966c248SBram Moolenaar ]) 25311966c248SBram Moolenaar CheckScriptFailure([ 25321966c248SBram Moolenaar 'vim9script', 25331966c248SBram Moolenaar 'match# comment', 2534f8103f27SBram Moolenaar ], 'E1144:') 25351966c248SBram Moolenaar CheckScriptSuccess([ 25361966c248SBram Moolenaar 'vim9script', 25371966c248SBram Moolenaar 'match none # comment', 25381966c248SBram Moolenaar ]) 25391966c248SBram Moolenaar CheckScriptFailure([ 25401966c248SBram Moolenaar 'vim9script', 25411966c248SBram Moolenaar 'match none# comment', 25421966c248SBram Moolenaar ], 'E475:') 25431966c248SBram Moolenaar 25441966c248SBram Moolenaar CheckScriptSuccess([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'menutrans clear # comment', 25471966c248SBram Moolenaar ]) 25481966c248SBram Moolenaar CheckScriptFailure([ 25491966c248SBram Moolenaar 'vim9script', 25501966c248SBram Moolenaar 'menutrans clear# comment text', 25511966c248SBram Moolenaar ], 'E474:') 25521966c248SBram Moolenaar 25531966c248SBram Moolenaar CheckScriptSuccess([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'syntax clear # comment', 25561966c248SBram Moolenaar ]) 25571966c248SBram Moolenaar CheckScriptFailure([ 25581966c248SBram Moolenaar 'vim9script', 25591966c248SBram Moolenaar 'syntax clear# comment text', 25601966c248SBram Moolenaar ], 'E28:') 25611966c248SBram Moolenaar CheckScriptSuccess([ 25621966c248SBram Moolenaar 'vim9script', 25631966c248SBram Moolenaar 'syntax keyword Word some', 25641966c248SBram Moolenaar 'syntax clear Word # comment', 25651966c248SBram Moolenaar ]) 25661966c248SBram Moolenaar CheckScriptFailure([ 25671966c248SBram Moolenaar 'vim9script', 25681966c248SBram Moolenaar 'syntax keyword Word some', 25691966c248SBram Moolenaar 'syntax clear Word# comment text', 25701966c248SBram Moolenaar ], 'E28:') 25711966c248SBram Moolenaar 25721966c248SBram Moolenaar CheckScriptSuccess([ 25731966c248SBram Moolenaar 'vim9script', 25741966c248SBram Moolenaar 'syntax list # comment', 25751966c248SBram Moolenaar ]) 25761966c248SBram Moolenaar CheckScriptFailure([ 25771966c248SBram Moolenaar 'vim9script', 25781966c248SBram Moolenaar 'syntax list# comment text', 25791966c248SBram Moolenaar ], 'E28:') 25801966c248SBram Moolenaar 25811966c248SBram Moolenaar CheckScriptSuccess([ 25821966c248SBram Moolenaar 'vim9script', 25831966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 25841966c248SBram Moolenaar ]) 25851966c248SBram Moolenaar CheckScriptFailure([ 25861966c248SBram Moolenaar 'vim9script', 25871966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 25881966c248SBram Moolenaar ], 'E475:') 25891966c248SBram Moolenaar 25901966c248SBram Moolenaar CheckScriptSuccess([ 25911966c248SBram Moolenaar 'vim9script', 25921966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 25931966c248SBram Moolenaar ]) 25941966c248SBram Moolenaar CheckScriptFailure([ 25951966c248SBram Moolenaar 'vim9script', 25961966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 25971966c248SBram Moolenaar ], 'E789:') 25981966c248SBram Moolenaar 25991966c248SBram Moolenaar CheckScriptSuccess([ 26001966c248SBram Moolenaar 'vim9script', 26011966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26021966c248SBram Moolenaar ]) 26031966c248SBram Moolenaar CheckScriptFailure([ 26041966c248SBram Moolenaar 'vim9script', 26051966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26061966c248SBram Moolenaar ], 'E402:') 26071966c248SBram Moolenaar 26081966c248SBram Moolenaar CheckScriptSuccess([ 26091966c248SBram Moolenaar 'vim9script', 26101966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26111966c248SBram Moolenaar ]) 26121966c248SBram Moolenaar CheckScriptFailure([ 26131966c248SBram Moolenaar 'vim9script', 26141966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26151966c248SBram Moolenaar ], 'E475:') 26161966c248SBram Moolenaar CheckScriptFailure([ 26171966c248SBram Moolenaar 'vim9script', 26181966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26191966c248SBram Moolenaar ], 'E406:') 26201966c248SBram Moolenaar CheckScriptFailure([ 26211966c248SBram Moolenaar 'vim9script', 26221966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26231966c248SBram Moolenaar ], 'E475:') 26241966c248SBram Moolenaar 26251966c248SBram Moolenaar CheckScriptSuccess([ 26261966c248SBram Moolenaar 'vim9script', 26271966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26281966c248SBram Moolenaar ]) 26291966c248SBram Moolenaar CheckScriptFailure([ 26301966c248SBram Moolenaar 'vim9script', 26311966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2632d032f34aSBram Moolenaar ], 'E402:') 26331966c248SBram Moolenaar 26341966c248SBram Moolenaar CheckScriptSuccess([ 26351966c248SBram Moolenaar 'vim9script', 26361966c248SBram Moolenaar 'syntax sync # comment', 26371966c248SBram Moolenaar ]) 26381966c248SBram Moolenaar CheckScriptFailure([ 26391966c248SBram Moolenaar 'vim9script', 26401966c248SBram Moolenaar 'syntax sync# comment', 26411966c248SBram Moolenaar ], 'E404:') 26421966c248SBram Moolenaar CheckScriptSuccess([ 26431966c248SBram Moolenaar 'vim9script', 26441966c248SBram Moolenaar 'syntax sync ccomment # comment', 26451966c248SBram Moolenaar ]) 26461966c248SBram Moolenaar CheckScriptFailure([ 26471966c248SBram Moolenaar 'vim9script', 26481966c248SBram Moolenaar 'syntax sync ccomment# comment', 26491966c248SBram Moolenaar ], 'E404:') 26501966c248SBram Moolenaar 26511966c248SBram Moolenaar CheckScriptSuccess([ 26521966c248SBram Moolenaar 'vim9script', 26531966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26541966c248SBram Moolenaar ]) 26551966c248SBram Moolenaar CheckScriptFailure([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 26581966c248SBram Moolenaar ], 'E475:') 2659a72cfb80SBram Moolenaar 2660a72cfb80SBram Moolenaar CheckScriptSuccess([ 2661a72cfb80SBram Moolenaar 'vim9script', 2662a72cfb80SBram Moolenaar 'command Echo echo # comment', 2663a72cfb80SBram Moolenaar 'command Echo # comment', 26642d870f8dSBram Moolenaar 'delcommand Echo', 2665a72cfb80SBram Moolenaar ]) 2666a72cfb80SBram Moolenaar CheckScriptFailure([ 2667a72cfb80SBram Moolenaar 'vim9script', 2668a72cfb80SBram Moolenaar 'command Echo echo# comment', 2669a72cfb80SBram Moolenaar 'Echo', 2670f8103f27SBram Moolenaar ], 'E1144:') 26712d870f8dSBram Moolenaar delcommand Echo 267270249ee8SBram Moolenaar 267370249ee8SBram Moolenaar var curdir = getcwd() 267470249ee8SBram Moolenaar CheckScriptSuccess([ 267570249ee8SBram Moolenaar 'command Echo cd " comment', 267670249ee8SBram Moolenaar 'Echo', 267770249ee8SBram Moolenaar 'delcommand Echo', 267870249ee8SBram Moolenaar ]) 267970249ee8SBram Moolenaar CheckScriptSuccess([ 2680090728adSBram Moolenaar 'vim9script', 268170249ee8SBram Moolenaar 'command Echo cd # comment', 268270249ee8SBram Moolenaar 'Echo', 268370249ee8SBram Moolenaar 'delcommand Echo', 268470249ee8SBram Moolenaar ]) 268570249ee8SBram Moolenaar CheckScriptFailure([ 268670249ee8SBram Moolenaar 'vim9script', 268770249ee8SBram Moolenaar 'command Echo cd " comment', 268870249ee8SBram Moolenaar 'Echo', 268970249ee8SBram Moolenaar ], 'E344:') 269070249ee8SBram Moolenaar delcommand Echo 269170249ee8SBram Moolenaar chdir(curdir) 269270249ee8SBram Moolenaar 2693a72cfb80SBram Moolenaar CheckScriptFailure([ 2694a72cfb80SBram Moolenaar 'vim9script', 2695a72cfb80SBram Moolenaar 'command Echo# comment', 2696a72cfb80SBram Moolenaar ], 'E182:') 2697a72cfb80SBram Moolenaar CheckScriptFailure([ 2698a72cfb80SBram Moolenaar 'vim9script', 2699a72cfb80SBram Moolenaar 'command Echo echo', 2700a72cfb80SBram Moolenaar 'command Echo# comment', 2701a72cfb80SBram Moolenaar ], 'E182:') 27022d870f8dSBram Moolenaar delcommand Echo 2703a72cfb80SBram Moolenaar 2704a72cfb80SBram Moolenaar CheckScriptSuccess([ 2705a72cfb80SBram Moolenaar 'vim9script', 2706a72cfb80SBram Moolenaar 'function # comment', 2707a72cfb80SBram Moolenaar ]) 2708a72cfb80SBram Moolenaar CheckScriptFailure([ 2709a72cfb80SBram Moolenaar 'vim9script', 27109898107fSBram Moolenaar 'function " comment', 27119898107fSBram Moolenaar ], 'E129:') 27129898107fSBram Moolenaar CheckScriptFailure([ 27139898107fSBram Moolenaar 'vim9script', 2714a72cfb80SBram Moolenaar 'function# comment', 2715f8103f27SBram Moolenaar ], 'E1144:') 2716a72cfb80SBram Moolenaar CheckScriptSuccess([ 2717a72cfb80SBram Moolenaar 'vim9script', 2718a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2719a72cfb80SBram Moolenaar ]) 2720a72cfb80SBram Moolenaar CheckScriptFailure([ 2721a72cfb80SBram Moolenaar 'vim9script', 2722a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2723a72cfb80SBram Moolenaar ], 'E488:') 2724a72cfb80SBram Moolenaar 2725a72cfb80SBram Moolenaar CheckScriptSuccess([ 2726a72cfb80SBram Moolenaar 'vim9script', 27274c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2728a72cfb80SBram Moolenaar 'endfunc', 27294c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2730a72cfb80SBram Moolenaar ]) 2731a72cfb80SBram Moolenaar CheckScriptFailure([ 2732a72cfb80SBram Moolenaar 'vim9script', 27334c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2734a72cfb80SBram Moolenaar 'endfunc', 27354c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2736a72cfb80SBram Moolenaar ], 'E488:') 2737a72cfb80SBram Moolenaar 2738a72cfb80SBram Moolenaar CheckScriptSuccess([ 2739a72cfb80SBram Moolenaar 'vim9script', 2740a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2741a72cfb80SBram Moolenaar ]) 2742a72cfb80SBram Moolenaar CheckScriptFailure([ 2743a72cfb80SBram Moolenaar 'vim9script', 2744a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2745a72cfb80SBram Moolenaar ], 'E488:') 2746e7e4838fSBram Moolenaar 2747e7e4838fSBram Moolenaar CheckScriptFailure([ 2748e7e4838fSBram Moolenaar 'def Test() " comment', 2749e7e4838fSBram Moolenaar 'enddef', 2750e7e4838fSBram Moolenaar ], 'E488:') 2751e7e4838fSBram Moolenaar CheckScriptFailure([ 2752e7e4838fSBram Moolenaar 'vim9script', 2753e7e4838fSBram Moolenaar 'def Test() " comment', 2754e7e4838fSBram Moolenaar 'enddef', 2755e7e4838fSBram Moolenaar ], 'E488:') 2756e7e4838fSBram Moolenaar 2757e7e4838fSBram Moolenaar CheckScriptSuccess([ 2758e7e4838fSBram Moolenaar 'func Test() " comment', 2759e7e4838fSBram Moolenaar 'endfunc', 27602d870f8dSBram Moolenaar 'delfunc Test', 2761e7e4838fSBram Moolenaar ]) 27629898107fSBram Moolenaar CheckScriptSuccess([ 2763e7e4838fSBram Moolenaar 'vim9script', 2764e7e4838fSBram Moolenaar 'func Test() " comment', 2765e7e4838fSBram Moolenaar 'endfunc', 27669898107fSBram Moolenaar ]) 2767e7e4838fSBram Moolenaar 2768e7e4838fSBram Moolenaar CheckScriptSuccess([ 2769e7e4838fSBram Moolenaar 'def Test() # comment', 2770e7e4838fSBram Moolenaar 'enddef', 2771e7e4838fSBram Moolenaar ]) 2772e7e4838fSBram Moolenaar CheckScriptFailure([ 2773e7e4838fSBram Moolenaar 'func Test() # comment', 2774e7e4838fSBram Moolenaar 'endfunc', 2775e7e4838fSBram Moolenaar ], 'E488:') 27762c5ed4e3SBram Moolenaarenddef 27772c5ed4e3SBram Moolenaar 27782c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 27792c5ed4e3SBram Moolenaar CheckCanRunGui 27802c5ed4e3SBram Moolenaar 27812c5ed4e3SBram Moolenaar CheckScriptFailure([ 27822c5ed4e3SBram Moolenaar 'vim9script', 27832c5ed4e3SBram Moolenaar 'gui#comment' 2784f8103f27SBram Moolenaar ], 'E1144:') 27852c5ed4e3SBram Moolenaar CheckScriptFailure([ 27862c5ed4e3SBram Moolenaar 'vim9script', 27872c5ed4e3SBram Moolenaar 'gui -f#comment' 27882c5ed4e3SBram Moolenaar ], 'E499:') 27897a092245SBram Moolenaarenddef 27907a092245SBram Moolenaar 2791a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 27926797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 27936797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2794a26b9700SBram Moolenaar 2795a26b9700SBram Moolenaar edit test.vim 2796a26b9700SBram Moolenaar doautocmd TabEnter #comment 2797a26b9700SBram Moolenaar assert_equal(1, g:entered) 2798a26b9700SBram Moolenaar 2799a26b9700SBram Moolenaar doautocmd TabEnter f.x 2800a26b9700SBram Moolenaar assert_equal(2, g:entered) 2801a26b9700SBram Moolenaar 2802a26b9700SBram Moolenaar g:entered = 0 2803a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2804a26b9700SBram Moolenaar assert_equal(2, g:entered) 2805a26b9700SBram Moolenaar 2806a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2807a26b9700SBram Moolenaar 2808a26b9700SBram Moolenaar au! TabEnter 2809a26b9700SBram Moolenaar unlet g:entered 2810d72c1bf0SBram Moolenaar 2811d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2812d72c1bf0SBram Moolenaar 'vim9script', 28136797966dSBram Moolenaar 'g:var = 123', 2814e55b1c09SBram Moolenaar 'b:var = 456', 2815e55b1c09SBram Moolenaar 'w:var = 777', 2816e55b1c09SBram Moolenaar 't:var = 888', 2817d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2818d72c1bf0SBram Moolenaar ]) 2819d72c1bf0SBram Moolenaar 2820d72c1bf0SBram Moolenaar CheckScriptFailure([ 2821d72c1bf0SBram Moolenaar 'vim9script', 2822cfcd011fSBram Moolenaar 'let var = 123', 2823cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2824cfcd011fSBram Moolenaar 2825cfcd011fSBram Moolenaar CheckScriptFailure([ 2826cfcd011fSBram Moolenaar 'vim9script', 2827cfcd011fSBram Moolenaar 'var g:var = 123', 2828e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2829e55b1c09SBram Moolenaar 2830e55b1c09SBram Moolenaar CheckScriptFailure([ 2831e55b1c09SBram Moolenaar 'vim9script', 2832cfcd011fSBram Moolenaar 'var b:var = 123', 2833e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2834e55b1c09SBram Moolenaar 2835e55b1c09SBram Moolenaar CheckScriptFailure([ 2836e55b1c09SBram Moolenaar 'vim9script', 2837cfcd011fSBram Moolenaar 'var w:var = 123', 2838e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2839e55b1c09SBram Moolenaar 2840e55b1c09SBram Moolenaar CheckScriptFailure([ 2841e55b1c09SBram Moolenaar 'vim9script', 2842cfcd011fSBram Moolenaar 'var t:var = 123', 2843e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2844e55b1c09SBram Moolenaar 2845e55b1c09SBram Moolenaar CheckScriptFailure([ 2846e55b1c09SBram Moolenaar 'vim9script', 2847cfcd011fSBram Moolenaar 'var v:version = 123', 2848e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2849e55b1c09SBram Moolenaar 2850e55b1c09SBram Moolenaar CheckScriptFailure([ 2851e55b1c09SBram Moolenaar 'vim9script', 2852cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2853e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28546797966dSBram Moolenaar 28556797966dSBram Moolenaar CheckScriptFailure([ 28566797966dSBram Moolenaar 'vim9script', 28576797966dSBram Moolenaar 'g:var = 123', 285832e35117SBram Moolenaar 'unlet g:var# comment1', 2859d72c1bf0SBram Moolenaar ], 'E108:') 2860d72c1bf0SBram Moolenaar 2861d72c1bf0SBram Moolenaar CheckScriptFailure([ 2862d72c1bf0SBram Moolenaar 'let g:var = 123', 2863d72c1bf0SBram Moolenaar 'unlet g:var # something', 2864d72c1bf0SBram Moolenaar ], 'E488:') 2865faac4104SBram Moolenaar 2866faac4104SBram Moolenaar CheckScriptSuccess([ 2867faac4104SBram Moolenaar 'vim9script', 286832e35117SBram Moolenaar 'if 1 # comment2', 2869faac4104SBram Moolenaar ' echo "yes"', 2870faac4104SBram Moolenaar 'elseif 2 #comment', 2871faac4104SBram Moolenaar ' echo "no"', 2872faac4104SBram Moolenaar 'endif', 2873faac4104SBram Moolenaar ]) 2874faac4104SBram Moolenaar 2875faac4104SBram Moolenaar CheckScriptFailure([ 2876faac4104SBram Moolenaar 'vim9script', 287732e35117SBram Moolenaar 'if 1# comment3', 2878faac4104SBram Moolenaar ' echo "yes"', 2879faac4104SBram Moolenaar 'endif', 2880faac4104SBram Moolenaar ], 'E15:') 2881faac4104SBram Moolenaar 2882faac4104SBram Moolenaar CheckScriptFailure([ 2883faac4104SBram Moolenaar 'vim9script', 288432e35117SBram Moolenaar 'if 0 # comment4', 2885faac4104SBram Moolenaar ' echo "yes"', 2886faac4104SBram Moolenaar 'elseif 2#comment', 2887faac4104SBram Moolenaar ' echo "no"', 2888faac4104SBram Moolenaar 'endif', 2889faac4104SBram Moolenaar ], 'E15:') 2890faac4104SBram Moolenaar 2891faac4104SBram Moolenaar CheckScriptSuccess([ 2892faac4104SBram Moolenaar 'vim9script', 2893cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2894faac4104SBram Moolenaar ]) 2895faac4104SBram Moolenaar 2896faac4104SBram Moolenaar CheckScriptFailure([ 2897faac4104SBram Moolenaar 'vim9script', 2898cfcd011fSBram Moolenaar 'var v = 1# comment6', 289932e35117SBram Moolenaar ], 'E15:') 2900faac4104SBram Moolenaar 2901faac4104SBram Moolenaar CheckScriptSuccess([ 2902faac4104SBram Moolenaar 'vim9script', 2903faac4104SBram Moolenaar 'new' 2904d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2905df069eecSBram Moolenaar ':$', 2906faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2907faac4104SBram Moolenaar 'bwipe!', 2908faac4104SBram Moolenaar ]) 2909faac4104SBram Moolenaar 2910f5be8cdbSBram Moolenaar CheckScriptFailure([ 2911f5be8cdbSBram Moolenaar 'vim9script', 2912f5be8cdbSBram Moolenaar 'new' 2913d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2914f5be8cdbSBram Moolenaar ':$', 2915f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2916f5be8cdbSBram Moolenaar 'bwipe!', 2917f5be8cdbSBram Moolenaar ], 'E488:') 2918f5be8cdbSBram Moolenaar 2919f5be8cdbSBram Moolenaar CheckScriptFailure([ 2920f5be8cdbSBram Moolenaar 'vim9script', 2921f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2922f5be8cdbSBram Moolenaar ], 'E477:') 2923a26b9700SBram Moolenaarenddef 2924a26b9700SBram Moolenaar 29257e5bd91dSBram Moolenaardef Test_finish() 2926cfcd011fSBram Moolenaar var lines =<< trim END 29277e5bd91dSBram Moolenaar vim9script 29286797966dSBram Moolenaar g:res = 'one' 29297e5bd91dSBram Moolenaar if v:false | finish | endif 29306797966dSBram Moolenaar g:res = 'two' 29317e5bd91dSBram Moolenaar finish 29326797966dSBram Moolenaar g:res = 'three' 29337e5bd91dSBram Moolenaar END 29347e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29357e5bd91dSBram Moolenaar source Xfinished 29367e5bd91dSBram Moolenaar assert_equal('two', g:res) 29377e5bd91dSBram Moolenaar 29387e5bd91dSBram Moolenaar unlet g:res 29397e5bd91dSBram Moolenaar delete('Xfinished') 29407e5bd91dSBram Moolenaarenddef 29417e5bd91dSBram Moolenaar 2942a5d0077eSBram Moolenaardef Test_forward_declaration() 2943cfcd011fSBram Moolenaar var lines =<< trim END 2944a5d0077eSBram Moolenaar vim9script 2945a5d0077eSBram Moolenaar def GetValue(): string 2946a5d0077eSBram Moolenaar return theVal 2947a5d0077eSBram Moolenaar enddef 2948cfcd011fSBram Moolenaar var theVal = 'something' 2949822ba247SBram Moolenaar g:initVal = GetValue() 2950a5d0077eSBram Moolenaar theVal = 'else' 2951a5d0077eSBram Moolenaar g:laterVal = GetValue() 2952a5d0077eSBram Moolenaar END 2953a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2954a5d0077eSBram Moolenaar source Xforward 2955a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2956a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2957a5d0077eSBram Moolenaar 2958a5d0077eSBram Moolenaar unlet g:initVal 2959a5d0077eSBram Moolenaar unlet g:laterVal 2960a5d0077eSBram Moolenaar delete('Xforward') 2961a5d0077eSBram Moolenaarenddef 2962a5d0077eSBram Moolenaar 29639721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2964a6294955SBram Moolenaar var vim9_lines =<< trim END 2965a6294955SBram Moolenaar vim9script 2966a6294955SBram Moolenaar var local = 'local' 2967a6294955SBram Moolenaar g:global = 'global' 2968a6294955SBram Moolenaar export var exported = 'exported' 2969a6294955SBram Moolenaar export def GetText(): string 2970a6294955SBram Moolenaar return 'text' 2971a6294955SBram Moolenaar enddef 2972a6294955SBram Moolenaar END 2973a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2974a6294955SBram Moolenaar 2975cfcd011fSBram Moolenaar var legacy_lines =<< trim END 29769721fb4eSBram Moolenaar source Xvim9_script.vim 29779721fb4eSBram Moolenaar 29789721fb4eSBram Moolenaar call assert_false(exists('local')) 29799721fb4eSBram Moolenaar call assert_false(exists('exported')) 29809721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 29819721fb4eSBram Moolenaar call assert_equal('global', global) 29829721fb4eSBram Moolenaar call assert_equal('global', g:global) 29839721fb4eSBram Moolenaar 29849721fb4eSBram Moolenaar " imported variable becomes script-local 29859721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 29869721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 29879721fb4eSBram Moolenaar call assert_false(exists('exported')) 29889721fb4eSBram Moolenaar 29899721fb4eSBram Moolenaar " imported function becomes script-local 29909721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 29919721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 29929721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 29939721fb4eSBram Moolenaar END 29949721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 29959721fb4eSBram Moolenaar 29969721fb4eSBram Moolenaar source Xlegacy_script.vim 29979721fb4eSBram Moolenaar assert_equal('global', g:global) 2998f5be8cdbSBram Moolenaar unlet g:global 29999721fb4eSBram Moolenaar 30009721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30019721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30029721fb4eSBram Moolenaarenddef 3003a5d0077eSBram Moolenaar 30047d699701SBram Moolenaarfunc Test_vim9script_not_global() 30057d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30067d699701SBram Moolenaar let vim9lines =<< trim END 30077d699701SBram Moolenaar vim9script 3008cfcd011fSBram Moolenaar var name = 'local' 30097d699701SBram Moolenaar func TheFunc() 30107d699701SBram Moolenaar echo 'local' 30117d699701SBram Moolenaar endfunc 30127d699701SBram Moolenaar def DefFunc() 30137d699701SBram Moolenaar echo 'local' 30147d699701SBram Moolenaar enddef 30157d699701SBram Moolenaar END 30167d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30177d699701SBram Moolenaar source Xvim9script.vim 30187d699701SBram Moolenaar try 30197d699701SBram Moolenaar echo g:var 30207d699701SBram Moolenaar assert_report('did not fail') 30217d699701SBram Moolenaar catch /E121:/ 30227d699701SBram Moolenaar " caught 30237d699701SBram Moolenaar endtry 30247d699701SBram Moolenaar try 30257d699701SBram Moolenaar call TheFunc() 30267d699701SBram Moolenaar assert_report('did not fail') 30277d699701SBram Moolenaar catch /E117:/ 30287d699701SBram Moolenaar " caught 30297d699701SBram Moolenaar endtry 30307d699701SBram Moolenaar try 30317d699701SBram Moolenaar call DefFunc() 30327d699701SBram Moolenaar assert_report('did not fail') 30337d699701SBram Moolenaar catch /E117:/ 30347d699701SBram Moolenaar " caught 30357d699701SBram Moolenaar endtry 30367d699701SBram Moolenaar 303725859dd7SBram Moolenaar call delete('Xvim9script.vim') 30387d699701SBram Moolenaarendfunc 30397d699701SBram Moolenaar 3040eeb27bfeSBram Moolenaardef Test_vim9_copen() 3041eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3042eeb27bfeSBram Moolenaar copen 3043eeb27bfeSBram Moolenaar quit 3044eeb27bfeSBram Moolenaarenddef 3045eeb27bfeSBram Moolenaar 304603290b84SBram Moolenaar" test using an auto-loaded function and variable 30472d6b20d6SBram Moolenaardef Test_vim9_autoload() 3048cfcd011fSBram Moolenaar var lines =<< trim END 30492d6b20d6SBram Moolenaar vim9script 305003290b84SBram Moolenaar def some#gettest(): string 305103290b84SBram Moolenaar return 'test' 305203290b84SBram Moolenaar enddef 305303290b84SBram Moolenaar g:some#name = 'name' 305403290b84SBram Moolenaar END 305503290b84SBram Moolenaar 305603290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 305703290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 305803290b84SBram Moolenaar var save_rtp = &rtp 305903290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 306003290b84SBram Moolenaar 306103290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 306203290b84SBram Moolenaar assert_equal('name', g:some#name) 306303290b84SBram Moolenaar g:some#other = 'other' 306403290b84SBram Moolenaar assert_equal('other', g:some#other) 306503290b84SBram Moolenaar 306617f700acSBram Moolenaar # upper case script name works 306717f700acSBram Moolenaar lines =<< trim END 306817f700acSBram Moolenaar vim9script 306917f700acSBram Moolenaar def Other#getOther(): string 307017f700acSBram Moolenaar return 'other' 307117f700acSBram Moolenaar enddef 307217f700acSBram Moolenaar END 307317f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 307417f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 307517f700acSBram Moolenaar 307603290b84SBram Moolenaar delete('Xdir', 'rf') 307703290b84SBram Moolenaar &rtp = save_rtp 307803290b84SBram Moolenaarenddef 307903290b84SBram Moolenaar 308003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 308103290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 308203290b84SBram Moolenaar var lines =<< trim END 308303290b84SBram Moolenaar vim9script 30842d6b20d6SBram Moolenaar def foo#test() 30852d6b20d6SBram Moolenaar echomsg getreg('"') 30862d6b20d6SBram Moolenaar enddef 30872d6b20d6SBram Moolenaar END 30882d6b20d6SBram Moolenaar 30892d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 30902d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3091cfcd011fSBram Moolenaar var save_rtp = &rtp 30922d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 30932d6b20d6SBram Moolenaar augroup test 30942d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 30952d6b20d6SBram Moolenaar augroup END 30962d6b20d6SBram Moolenaar 30972d6b20d6SBram Moolenaar normal Y 30982d6b20d6SBram Moolenaar 30992d6b20d6SBram Moolenaar augroup test 31002d6b20d6SBram Moolenaar autocmd! 31012d6b20d6SBram Moolenaar augroup END 31022d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31032d6b20d6SBram Moolenaar &rtp = save_rtp 31042d6b20d6SBram Moolenaarenddef 31052d6b20d6SBram Moolenaar 310677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 310777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3108cfcd011fSBram Moolenaar var lines =<< trim END 310977e5dcc3SBram Moolenaar vim9script 311077e5dcc3SBram Moolenaar def crash#func() 311177e5dcc3SBram Moolenaar try 311277e5dcc3SBram Moolenaar for x in List() 311377e5dcc3SBram Moolenaar endfor 311477e5dcc3SBram Moolenaar catch 311577e5dcc3SBram Moolenaar endtry 311677e5dcc3SBram Moolenaar g:ok = true 311777e5dcc3SBram Moolenaar enddef 311877e5dcc3SBram Moolenaar fu List() 311977e5dcc3SBram Moolenaar invalid 312077e5dcc3SBram Moolenaar endfu 312177e5dcc3SBram Moolenaar try 312248e11c10SBram Moolenaar alsoinvalid 312377e5dcc3SBram Moolenaar catch /wontmatch/ 312477e5dcc3SBram Moolenaar endtry 312577e5dcc3SBram Moolenaar END 312677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 312777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 312877e5dcc3SBram Moolenaar 312977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 313077e5dcc3SBram Moolenaar lines =<< trim END 313177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 313277e5dcc3SBram Moolenaar call crash#func() 313377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31349c4f5520SBram Moolenaar qall! 313577e5dcc3SBram Moolenaar END 313677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 313777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 313877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 313977e5dcc3SBram Moolenaar 314077e5dcc3SBram Moolenaar delete('Xdidit') 314177e5dcc3SBram Moolenaar delete('Xscript') 314277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 314303290b84SBram Moolenaar 314403290b84SBram Moolenaar lines =<< trim END 314503290b84SBram Moolenaar vim9script 314603290b84SBram Moolenaar var foo#bar = 'asdf' 314703290b84SBram Moolenaar END 314803290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 314977e5dcc3SBram Moolenaarenddef 315077e5dcc3SBram Moolenaar 315181e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 315281e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 315381e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3154cfcd011fSBram Moolenaar var lines =<< trim END 315581e17fbeSBram Moolenaar let s:counter = 1 315681e17fbeSBram Moolenaar def s:Func() 315781e17fbeSBram Moolenaar au! CursorHold 315881e17fbeSBram Moolenaar au CursorHold * s:counter += 1 315981e17fbeSBram Moolenaar enddef 316081e17fbeSBram Moolenaar call s:Func() 316181e17fbeSBram Moolenaar doau CursorHold 316281e17fbeSBram Moolenaar call assert_equal(2, s:counter) 316381e17fbeSBram Moolenaar au! CursorHold 316481e17fbeSBram Moolenaar END 316581e17fbeSBram Moolenaar CheckScriptSuccess(lines) 316681e17fbeSBram Moolenaarenddef 316781e17fbeSBram Moolenaar 31683896a105SBram Moolenaardef Test_cmdline_win() 31693896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 31703896a105SBram Moolenaar # the command line window. 31713896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3172cfcd011fSBram Moolenaar var export_lines =<< trim END 31733896a105SBram Moolenaar vim9script 3174cfcd011fSBram Moolenaar export var That = 'yes' 31753896a105SBram Moolenaar END 31763896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3177cfcd011fSBram Moolenaar var import_lines =<< trim END 31783896a105SBram Moolenaar vim9script 31793896a105SBram Moolenaar import That from './Xexport.vim' 31803896a105SBram Moolenaar END 31813896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3182cfcd011fSBram Moolenaar var save_rtp = &rtp 31833896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 31843896a105SBram Moolenaar syntax on 31853896a105SBram Moolenaar augroup CmdWin 31863896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 31873896a105SBram Moolenaar augroup END 31883896a105SBram Moolenaar # this will open and also close the cmdline window 31893896a105SBram Moolenaar feedkeys('q:', 'xt') 31903896a105SBram Moolenaar assert_equal('yes', g:got_there) 31913896a105SBram Moolenaar 31923896a105SBram Moolenaar augroup CmdWin 31933896a105SBram Moolenaar au! 31943896a105SBram Moolenaar augroup END 31953896a105SBram Moolenaar &rtp = save_rtp 31963896a105SBram Moolenaar delete('rtp', 'rf') 31973896a105SBram Moolenaarenddef 31983896a105SBram Moolenaar 3199e3d4685fSBram Moolenaardef Test_invalid_sid() 3200e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 320125859dd7SBram Moolenaar 32029c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3203d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3204e3d4685fSBram Moolenaar endif 3205e3d4685fSBram Moolenaar delete('Xdidit') 3206e3d4685fSBram Moolenaarenddef 3207e3d4685fSBram Moolenaar 32089ec7026fSBram Moolenaardef Test_restoring_cpo() 32099ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 32109ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 32119ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 32129ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 32139ec7026fSBram Moolenaar endif 32149ec7026fSBram Moolenaar delete('Xsourced') 32159ec7026fSBram Moolenaar delete('Xclose') 3216090728adSBram Moolenaar delete('Xdone') 32170123cc1eSBram Moolenaar 32180123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 32190123cc1eSBram Moolenaar set cpo=aABceFsMny> 32200123cc1eSBram Moolenaar edit XanotherScript 32210123cc1eSBram Moolenaar so % 32220123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32230123cc1eSBram Moolenaar :1del 32240123cc1eSBram Moolenaar w 32250123cc1eSBram Moolenaar so % 32260123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32270123cc1eSBram Moolenaar 32280123cc1eSBram Moolenaar delete('XanotherScript') 32290123cc1eSBram Moolenaar set cpo&vim 32309ec7026fSBram Moolenaarenddef 32319ec7026fSBram Moolenaar 32329ec7026fSBram Moolenaar 3233f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3234cfcd011fSBram Moolenaar var lines =<< trim END 3235cfcd011fSBram Moolenaar var name: any 3236cfcd011fSBram Moolenaar assert_equal(0, name) 3237f0afd9e1SBram Moolenaar END 3238f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3239f0afd9e1SBram Moolenaarenddef 3240f0afd9e1SBram Moolenaar 32417e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 324258dbef33SBram Moolenaar CheckRunVimInTerminal 324358dbef33SBram Moolenaar 32447e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 32457e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 32467e9210eaSBram Moolenaarendfunc 32477e9210eaSBram Moolenaar 32487e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 32499c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3250cfcd011fSBram Moolenaar var lines =<< trim END 32519c4f5520SBram Moolenaar func CheckAndQuit() 32529c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 32539c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 32549c4f5520SBram Moolenaar endfunc 32559c4f5520SBram Moolenaar END 32569c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 32579c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3258e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 32599c4f5520SBram Moolenaar # define Afunc() on the command line 32609c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 32619c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 32622949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 32639c4f5520SBram Moolenaar 32649c4f5520SBram Moolenaar call StopVimInTerminal(buf) 32659c4f5520SBram Moolenaar delete('XcallFunc') 32669c4f5520SBram Moolenaar delete('Xdidcmd') 32679c4f5520SBram Moolenaarenddef 32689c4f5520SBram Moolenaar 3269fcdc5d83SBram Moolenaardef Test_script_var_scope() 3270fcdc5d83SBram Moolenaar var lines =<< trim END 3271fcdc5d83SBram Moolenaar vim9script 3272fcdc5d83SBram Moolenaar if true 3273fcdc5d83SBram Moolenaar if true 3274fcdc5d83SBram Moolenaar var one = 'one' 3275fcdc5d83SBram Moolenaar echo one 3276fcdc5d83SBram Moolenaar endif 3277fcdc5d83SBram Moolenaar echo one 3278fcdc5d83SBram Moolenaar endif 3279fcdc5d83SBram Moolenaar END 3280fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3281fcdc5d83SBram Moolenaar 3282fcdc5d83SBram Moolenaar lines =<< trim END 3283fcdc5d83SBram Moolenaar vim9script 3284fcdc5d83SBram Moolenaar if true 3285fcdc5d83SBram Moolenaar if false 3286fcdc5d83SBram Moolenaar var one = 'one' 3287fcdc5d83SBram Moolenaar echo one 3288fcdc5d83SBram Moolenaar else 3289fcdc5d83SBram Moolenaar var one = 'one' 3290fcdc5d83SBram Moolenaar echo one 3291fcdc5d83SBram Moolenaar endif 3292fcdc5d83SBram Moolenaar echo one 3293fcdc5d83SBram Moolenaar endif 3294fcdc5d83SBram Moolenaar END 3295fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3296fcdc5d83SBram Moolenaar 3297fcdc5d83SBram Moolenaar lines =<< trim END 3298fcdc5d83SBram Moolenaar vim9script 3299fcdc5d83SBram Moolenaar while true 3300fcdc5d83SBram Moolenaar var one = 'one' 3301fcdc5d83SBram Moolenaar echo one 3302fcdc5d83SBram Moolenaar break 3303fcdc5d83SBram Moolenaar endwhile 3304fcdc5d83SBram Moolenaar echo one 3305fcdc5d83SBram Moolenaar END 3306fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3307fcdc5d83SBram Moolenaar 3308fcdc5d83SBram Moolenaar lines =<< trim END 3309fcdc5d83SBram Moolenaar vim9script 3310fcdc5d83SBram Moolenaar for i in range(1) 3311fcdc5d83SBram Moolenaar var one = 'one' 3312fcdc5d83SBram Moolenaar echo one 3313fcdc5d83SBram Moolenaar endfor 3314fcdc5d83SBram Moolenaar echo one 3315fcdc5d83SBram Moolenaar END 3316fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 33179becdf2bSBram Moolenaar 33189becdf2bSBram Moolenaar lines =<< trim END 33199becdf2bSBram Moolenaar vim9script 33209becdf2bSBram Moolenaar { 33219becdf2bSBram Moolenaar var one = 'one' 33229becdf2bSBram Moolenaar assert_equal('one', one) 33239becdf2bSBram Moolenaar } 33249becdf2bSBram Moolenaar assert_false(exists('one')) 33259becdf2bSBram Moolenaar assert_false(exists('s:one')) 33269becdf2bSBram Moolenaar END 33279becdf2bSBram Moolenaar CheckScriptSuccess(lines) 33289becdf2bSBram Moolenaar 33299becdf2bSBram Moolenaar lines =<< trim END 33309becdf2bSBram Moolenaar vim9script 33319becdf2bSBram Moolenaar { 33329becdf2bSBram Moolenaar var one = 'one' 33339becdf2bSBram Moolenaar echo one 33349becdf2bSBram Moolenaar } 33359becdf2bSBram Moolenaar echo one 33369becdf2bSBram Moolenaar END 33379becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3338fcdc5d83SBram Moolenaarenddef 3339fcdc5d83SBram Moolenaar 3340352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3341352134bbSBram Moolenaar var lines =<< trim END 3342352134bbSBram Moolenaar vim9script 3343352134bbSBram Moolenaar def Callback(...l: any) 3344352134bbSBram Moolenaar try 3345352134bbSBram Moolenaar var x: string 3346352134bbSBram Moolenaar var y: string 3347352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3348352134bbSBram Moolenaar [x, y] = [''] 3349352134bbSBram Moolenaar catch 3350352134bbSBram Moolenaar g:caught = 'yes' 3351352134bbSBram Moolenaar endtry 3352352134bbSBram Moolenaar enddef 3353e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3354352134bbSBram Moolenaar feedkeys("\r", 'xt') 3355352134bbSBram Moolenaar END 3356352134bbSBram Moolenaar CheckScriptSuccess(lines) 3357352134bbSBram Moolenaar 3358352134bbSBram Moolenaar unlet g:caught 3359352134bbSBram Moolenaarenddef 3360352134bbSBram Moolenaar 3361631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3362631e8f93SBram Moolenaar if !has('unix') || !has('job') 3363631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3364631e8f93SBram Moolenaar endif 3365631e8f93SBram Moolenaar var lines =<< trim END 3366631e8f93SBram Moolenaar vim9script 3367631e8f93SBram Moolenaar var source: list<number> 3368631e8f93SBram Moolenaar def Out_cb(...l: any) 3369631e8f93SBram Moolenaar eval [][0] 3370631e8f93SBram Moolenaar enddef 3371631e8f93SBram Moolenaar def Exit_cb(...l: any) 3372631e8f93SBram Moolenaar sleep 1m 3373631e8f93SBram Moolenaar source += l 3374631e8f93SBram Moolenaar enddef 3375e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 33766f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 33776f17a3f0SBram Moolenaar sleep 10m 33786f17a3f0SBram Moolenaar endwhile 3379206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3380206c2a6eSBram Moolenaar sleep 100m 3381631e8f93SBram Moolenaar END 3382631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3383631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3384631e8f93SBram Moolenaar delete('Xdef') 3385631e8f93SBram Moolenaarenddef 3386631e8f93SBram Moolenaar 33874324d87aSBram Moolenaardef InvokeNormal() 33884324d87aSBram Moolenaar exe "norm! :m+1\r" 33894324d87aSBram Moolenaarenddef 33904324d87aSBram Moolenaar 33914324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 33924324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 33934324d87aSBram Moolenaar new 33944324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 33954324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 33964324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 33974324d87aSBram Moolenaar xunmap <F3> 3398b5b9480eSBram Moolenaarenddef 3399b5b9480eSBram Moolenaar 3400b5b9480eSBram Moolenaardef Test_white_space_after_command() 3401b5b9480eSBram Moolenaar var lines =<< trim END 3402b5b9480eSBram Moolenaar exit_cb: Func}) 3403b5b9480eSBram Moolenaar END 3404b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3405f8103f27SBram Moolenaar 3406f8103f27SBram Moolenaar lines =<< trim END 3407f8103f27SBram Moolenaar e# 3408f8103f27SBram Moolenaar END 3409f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 34104324d87aSBram Moolenaarenddef 34114324d87aSBram Moolenaar 34124aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 34134aab88d9SBram Moolenaar var lines =<< trim END 34144aab88d9SBram Moolenaar vim9script 34154aab88d9SBram Moolenaar if exists('g:guard') 34164aab88d9SBram Moolenaar finish 34174aab88d9SBram Moolenaar endif 34184aab88d9SBram Moolenaar g:guard = 1 34194aab88d9SBram Moolenaar var name = 'thename' 34204aab88d9SBram Moolenaar def g:GetName(): string 34214aab88d9SBram Moolenaar return name 34224aab88d9SBram Moolenaar enddef 34234aab88d9SBram Moolenaar def g:SetName(arg: string) 34244aab88d9SBram Moolenaar name = arg 34254aab88d9SBram Moolenaar enddef 34264aab88d9SBram Moolenaar END 34274aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 34284aab88d9SBram Moolenaar so XscriptTwice.vim 34294aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 34304aab88d9SBram Moolenaar g:SetName('newname') 34314aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34324aab88d9SBram Moolenaar so XscriptTwice.vim 34334aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34344aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34354aab88d9SBram Moolenaar 34364aab88d9SBram Moolenaar delfunc g:GetName 34374aab88d9SBram Moolenaar delfunc g:SetName 34384aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34394aab88d9SBram Moolenaar unlet g:guard 34404aab88d9SBram Moolenaarenddef 34414aab88d9SBram Moolenaar 34424aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 34434aab88d9SBram Moolenaar var exportlines =<< trim END 34444aab88d9SBram Moolenaar vim9script 34454aab88d9SBram Moolenaar if exists('g:guard') 34464aab88d9SBram Moolenaar finish 34474aab88d9SBram Moolenaar endif 34484aab88d9SBram Moolenaar g:guard = 1 34494aab88d9SBram Moolenaar export var name = 'someName' 34504aab88d9SBram Moolenaar END 34514aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 34524aab88d9SBram Moolenaar 34534aab88d9SBram Moolenaar var lines =<< trim END 34544aab88d9SBram Moolenaar vim9script 34554aab88d9SBram Moolenaar import name from './XexportScript.vim' 34564aab88d9SBram Moolenaar def g:GetName(): string 34574aab88d9SBram Moolenaar return name 34584aab88d9SBram Moolenaar enddef 34594aab88d9SBram Moolenaar END 34604aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 34614aab88d9SBram Moolenaar so XscriptImport.vim 34624aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 34634aab88d9SBram Moolenaar 34644aab88d9SBram Moolenaar so XexportScript.vim 34654aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34664aab88d9SBram Moolenaar 34674aab88d9SBram Moolenaar delfunc g:GetName 34684aab88d9SBram Moolenaar delete('XexportScript.vim') 34694aab88d9SBram Moolenaar delete('XscriptImport.vim') 34704aab88d9SBram Moolenaar unlet g:guard 34714aab88d9SBram Moolenaarenddef 34724aab88d9SBram Moolenaar 3473585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3474585fea7bSBram Moolenaardef Test_substitute_cmd() 3475585fea7bSBram Moolenaar new 3476585fea7bSBram Moolenaar setline(1, 'something') 3477585fea7bSBram Moolenaar :substitute(some(other( 3478585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3479585fea7bSBram Moolenaar bwipe! 3480585fea7bSBram Moolenaar 3481f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3482cfcd011fSBram Moolenaar var lines =<< trim END 3483585fea7bSBram Moolenaar vim9script 3484585fea7bSBram Moolenaar new 3485585fea7bSBram Moolenaar setline(1, 'something') 3486585fea7bSBram Moolenaar :substitute(some(other( 3487585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3488585fea7bSBram Moolenaar bwipe! 3489585fea7bSBram Moolenaar END 3490585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3491585fea7bSBram Moolenaar source Xvim9lines 3492585fea7bSBram Moolenaar 3493585fea7bSBram Moolenaar delete('Xvim9lines') 3494585fea7bSBram Moolenaarenddef 3495585fea7bSBram Moolenaar 34968a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3497