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)) 25b8554304SBram Moolenaar 26b8554304SBram Moolenaar # missing command does not print the line 27b8554304SBram Moolenaar var lines =<< trim END 28b8554304SBram Moolenaar vim9script 29b8554304SBram Moolenaar :1| 30b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 31b8554304SBram Moolenaar :| 32b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 33b8554304SBram Moolenaar END 34b8554304SBram Moolenaar CheckScriptSuccess(lines) 35b8554304SBram 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) 5807e82c5f3SBram Moolenaar 5817e82c5f3SBram Moolenaar # return in finally after empty catch 5827e82c5f3SBram Moolenaar def ReturnInFinally(): number 5837e82c5f3SBram Moolenaar try 5847e82c5f3SBram Moolenaar finally 5857e82c5f3SBram Moolenaar return 4 5867e82c5f3SBram Moolenaar endtry 5877e82c5f3SBram Moolenaar return 2 5887e82c5f3SBram Moolenaar enddef 5897e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5908a7d6542SBram Moolenaarenddef 5918a7d6542SBram Moolenaar 592*9cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 593*9cb577a6SBram Moolenaar # return in try block returns normally 594*9cb577a6SBram Moolenaar def ReturnInTry(): string 595*9cb577a6SBram Moolenaar try 596*9cb577a6SBram Moolenaar return '"some message"' 597*9cb577a6SBram Moolenaar catch 598*9cb577a6SBram Moolenaar endtry 599*9cb577a6SBram Moolenaar return 'not reached' 600*9cb577a6SBram Moolenaar enddef 601*9cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 602*9cb577a6SBram Moolenaarenddef 603*9cb577a6SBram Moolenaar 6041430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6051430ceebSBram Moolenaar var lines =<< trim END 6061430ceebSBram Moolenaar vim9script 6071430ceebSBram Moolenaar au BufEnter * eval 0 6081430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6091430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6101430ceebSBram Moolenaar var items = [ 6111430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6121430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6131430ceebSBram Moolenaar ] 6141430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6151430ceebSBram Moolenaar cwindow 6161430ceebSBram Moolenaar 6171430ceebSBram Moolenaar def CnextOrCfirst() 6181430ceebSBram Moolenaar # if cnext fails, cfirst is used 6191430ceebSBram Moolenaar try 6201430ceebSBram Moolenaar cnext 6211430ceebSBram Moolenaar catch 6221430ceebSBram Moolenaar cfirst 6231430ceebSBram Moolenaar endtry 6241430ceebSBram Moolenaar enddef 6251430ceebSBram Moolenaar 6261430ceebSBram Moolenaar CnextOrCfirst() 6271430ceebSBram Moolenaar CnextOrCfirst() 6281430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6291430ceebSBram Moolenaar qall 6301430ceebSBram Moolenaar END 6311430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6321430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6331430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6341430ceebSBram Moolenaar 6351430ceebSBram Moolenaar delete('Xfile1') 6361430ceebSBram Moolenaar delete('Xfile2') 6371430ceebSBram Moolenaar delete('XCatchCnext') 6381430ceebSBram Moolenaar delete('Xresult') 6391430ceebSBram Moolenaarenddef 6401430ceebSBram Moolenaar 6419e1d9e34SBram Moolenaardef Test_throw_skipped() 6429e1d9e34SBram Moolenaar if 0 6439e1d9e34SBram Moolenaar throw dontgethere 6449e1d9e34SBram Moolenaar endif 6459e1d9e34SBram Moolenaarenddef 6469e1d9e34SBram Moolenaar 6478f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6488f81b22eSBram Moolenaar var lines =<< trim END 6498f81b22eSBram Moolenaar vim9script 6508f81b22eSBram Moolenaar def Func() 6518f81b22eSBram Moolenaar throw 'error' 6528f81b22eSBram Moolenaar enddef 6538f81b22eSBram Moolenaar silent! Func() 6548f81b22eSBram Moolenaar END 6558f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6568f81b22eSBram Moolenaar source XthrowSilenced 6578f81b22eSBram Moolenaar delete('XthrowSilenced') 6588f81b22eSBram Moolenaarenddef 6598f81b22eSBram Moolenaar 660e859312eSBram Moolenaardef DeletedFunc(): list<any> 661e859312eSBram Moolenaar return ['delete me'] 662e859312eSBram Moolenaarenddef 663e859312eSBram Moolenaardefcompile 664e859312eSBram Moolenaardelfunc DeletedFunc 665e859312eSBram Moolenaar 666257cc5eeSBram Moolenaardef ThrowFromDef() 667a72cfb80SBram Moolenaar throw "getout" # comment 668257cc5eeSBram Moolenaarenddef 669257cc5eeSBram Moolenaar 670257cc5eeSBram Moolenaarfunc CatchInFunc() 671257cc5eeSBram Moolenaar try 672257cc5eeSBram Moolenaar call ThrowFromDef() 673257cc5eeSBram Moolenaar catch 674257cc5eeSBram Moolenaar let g:thrown_func = v:exception 675257cc5eeSBram Moolenaar endtry 676257cc5eeSBram Moolenaarendfunc 677257cc5eeSBram Moolenaar 678257cc5eeSBram Moolenaardef CatchInDef() 679257cc5eeSBram Moolenaar try 680257cc5eeSBram Moolenaar ThrowFromDef() 681257cc5eeSBram Moolenaar catch 682257cc5eeSBram Moolenaar g:thrown_def = v:exception 683257cc5eeSBram Moolenaar endtry 684257cc5eeSBram Moolenaarenddef 685257cc5eeSBram Moolenaar 686f575adffSBram Moolenaardef ReturnFinally(): string 687f575adffSBram Moolenaar try 688f575adffSBram Moolenaar return 'intry' 689373863edSBram Moolenaar finall 690f575adffSBram Moolenaar g:in_finally = 'finally' 691f575adffSBram Moolenaar endtry 692f575adffSBram Moolenaar return 'end' 693f575adffSBram Moolenaarenddef 694f575adffSBram Moolenaar 695257cc5eeSBram Moolenaardef Test_try_catch_nested() 696257cc5eeSBram Moolenaar CatchInFunc() 697257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 698257cc5eeSBram Moolenaar 699257cc5eeSBram Moolenaar CatchInDef() 700257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 701f575adffSBram Moolenaar 702f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 703f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 704f575adffSBram Moolenaarenddef 705f575adffSBram Moolenaar 7069939f57bSBram Moolenaardef TryOne(): number 7079939f57bSBram Moolenaar try 7089939f57bSBram Moolenaar return 0 7099939f57bSBram Moolenaar catch 7109939f57bSBram Moolenaar endtry 7119939f57bSBram Moolenaar return 0 7129939f57bSBram Moolenaarenddef 7139939f57bSBram Moolenaar 7149939f57bSBram Moolenaardef TryTwo(n: number): string 7159939f57bSBram Moolenaar try 716cfcd011fSBram Moolenaar var x = {} 7179939f57bSBram Moolenaar catch 7189939f57bSBram Moolenaar endtry 7199939f57bSBram Moolenaar return 'text' 7209939f57bSBram Moolenaarenddef 7219939f57bSBram Moolenaar 7229939f57bSBram Moolenaardef Test_try_catch_twice() 7239939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7249939f57bSBram Moolenaarenddef 7259939f57bSBram Moolenaar 726f575adffSBram Moolenaardef Test_try_catch_match() 727cfcd011fSBram Moolenaar var seq = 'a' 728f575adffSBram Moolenaar try 729f575adffSBram Moolenaar throw 'something' 730f575adffSBram Moolenaar catch /nothing/ 731f575adffSBram Moolenaar seq ..= 'x' 732f575adffSBram Moolenaar catch /some/ 733f575adffSBram Moolenaar seq ..= 'b' 734f575adffSBram Moolenaar catch /asdf/ 735f575adffSBram Moolenaar seq ..= 'x' 736e8c4abbbSBram Moolenaar catch ?a\?sdf? 737e8c4abbbSBram Moolenaar seq ..= 'y' 738f575adffSBram Moolenaar finally 739f575adffSBram Moolenaar seq ..= 'c' 740f575adffSBram Moolenaar endtry 741f575adffSBram Moolenaar assert_equal('abc', seq) 742257cc5eeSBram Moolenaarenddef 743257cc5eeSBram Moolenaar 744e8c4abbbSBram Moolenaardef Test_try_catch_fails() 745d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 746d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 747d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 748d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 749d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 750d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 751d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 752d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 75313106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 754d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 755585fea7bSBram Moolenaar 756e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 757d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 758e8c4abbbSBram Moolenaarenddef 759e8c4abbbSBram Moolenaar 7607c5b3c03SBram Moolenaardef Try_catch_skipped() 7617c5b3c03SBram Moolenaar var l = [] 7627c5b3c03SBram Moolenaar try 7637c5b3c03SBram Moolenaar finally 7647c5b3c03SBram Moolenaar endtry 7657c5b3c03SBram Moolenaar 7667c5b3c03SBram Moolenaar if 1 7677c5b3c03SBram Moolenaar else 7687c5b3c03SBram Moolenaar try 7697c5b3c03SBram Moolenaar endtry 7707c5b3c03SBram Moolenaar endif 7717c5b3c03SBram Moolenaarenddef 7727c5b3c03SBram Moolenaar 7737c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7747c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7757c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7767c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7777c5b3c03SBram Moolenaarenddef 7787c5b3c03SBram Moolenaar 7797c5b3c03SBram Moolenaar 7807c5b3c03SBram Moolenaar 781006ad48bSBram Moolenaardef Test_throw_vimscript() 782f5be8cdbSBram Moolenaar # only checks line continuation 783cfcd011fSBram Moolenaar var lines =<< trim END 784006ad48bSBram Moolenaar vim9script 785006ad48bSBram Moolenaar try 786006ad48bSBram Moolenaar throw 'one' 787006ad48bSBram Moolenaar .. 'two' 788006ad48bSBram Moolenaar catch 789006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 790006ad48bSBram Moolenaar endtry 791006ad48bSBram Moolenaar END 792006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7931e021e63SBram Moolenaar 7941e021e63SBram Moolenaar lines =<< trim END 7951e021e63SBram Moolenaar vim9script 796352134bbSBram Moolenaar @r = '' 7971e021e63SBram Moolenaar def Func() 7981e021e63SBram Moolenaar throw @r 7991e021e63SBram Moolenaar enddef 8001e021e63SBram Moolenaar var result = '' 8011e021e63SBram Moolenaar try 8021e021e63SBram Moolenaar Func() 8031e021e63SBram Moolenaar catch /E1129:/ 8041e021e63SBram Moolenaar result = 'caught' 8051e021e63SBram Moolenaar endtry 8061e021e63SBram Moolenaar assert_equal('caught', result) 8071e021e63SBram Moolenaar END 8081e021e63SBram Moolenaar CheckScriptSuccess(lines) 809006ad48bSBram Moolenaarenddef 810006ad48bSBram Moolenaar 811ed677f55SBram Moolenaardef Test_error_in_nested_function() 81203dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 813cfcd011fSBram Moolenaar var lines =<< trim END 814ed677f55SBram Moolenaar vim9script 815ed677f55SBram Moolenaar def Func() 816ed677f55SBram Moolenaar Error() 817ed677f55SBram Moolenaar g:test_var = 1 818ed677f55SBram Moolenaar enddef 819ed677f55SBram Moolenaar func Error() abort 820ed677f55SBram Moolenaar eval [][0] 821ed677f55SBram Moolenaar endfunc 822ed677f55SBram Moolenaar Func() 823ed677f55SBram Moolenaar END 824ed677f55SBram Moolenaar g:test_var = 0 825ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 826ed677f55SBram Moolenaar assert_equal(0, g:test_var) 827ed677f55SBram Moolenaarenddef 828ed677f55SBram Moolenaar 82937c83711SBram Moolenaardef Test_cexpr_vimscript() 830f5be8cdbSBram Moolenaar # only checks line continuation 83137c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 832cfcd011fSBram Moolenaar var lines =<< trim END 83337c83711SBram Moolenaar vim9script 83437c83711SBram Moolenaar cexpr 'File' 83537c83711SBram Moolenaar .. ' someFile' .. 83637c83711SBram Moolenaar ' line 19' 83737c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 83837c83711SBram Moolenaar END 83937c83711SBram Moolenaar CheckScriptSuccess(lines) 84037c83711SBram Moolenaar set errorformat& 84137c83711SBram Moolenaarenddef 84237c83711SBram Moolenaar 843c9edd6b5SBram Moolenaardef Test_statusline_syntax() 844c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 845cfcd011fSBram Moolenaar var lines =<< trim END 846c9edd6b5SBram Moolenaar vim9script 847c9edd6b5SBram Moolenaar func g:Status() 848c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 849c9edd6b5SBram Moolenaar endfunc 850c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 851c9edd6b5SBram Moolenaar redrawstatus 852c9edd6b5SBram Moolenaar set laststatus statusline= 853c9edd6b5SBram Moolenaar END 854c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 855c9edd6b5SBram Moolenaarenddef 856c9edd6b5SBram Moolenaar 857b209750bSBram Moolenaardef Test_list_vimscript() 858b209750bSBram Moolenaar # checks line continuation and comments 859cfcd011fSBram Moolenaar var lines =<< trim END 860b209750bSBram Moolenaar vim9script 861cfcd011fSBram Moolenaar var mylist = [ 862b209750bSBram Moolenaar 'one', 863b209750bSBram Moolenaar # comment 864b209750bSBram Moolenaar 'two', # empty line follows 865b209750bSBram Moolenaar 866b209750bSBram Moolenaar 'three', 867b209750bSBram Moolenaar ] 868b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 869b209750bSBram Moolenaar END 870b209750bSBram Moolenaar CheckScriptSuccess(lines) 87166250c93SBram Moolenaar 87266250c93SBram Moolenaar # check all lines from heredoc are kept 87366250c93SBram Moolenaar lines =<< trim END 87466250c93SBram Moolenaar # comment 1 87566250c93SBram Moolenaar two 87666250c93SBram Moolenaar # comment 3 87766250c93SBram Moolenaar 87866250c93SBram Moolenaar five 87966250c93SBram Moolenaar # comment 6 88066250c93SBram Moolenaar END 88166250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8824bce26bbSBram Moolenaar 8834bce26bbSBram Moolenaar lines =<< trim END 8844bce26bbSBram Moolenaar [{ 8854bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8864bce26bbSBram Moolenaar END 8874bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 888b209750bSBram Moolenaarenddef 889b209750bSBram Moolenaar 8902a1381c3SBram Moolenaarif has('channel') 89140ee466cSBram Moolenaar let someJob = test_null_job() 89240ee466cSBram Moolenaar 89340ee466cSBram Moolenaar def FuncWithError() 89440ee466cSBram Moolenaar echomsg g:someJob 89540ee466cSBram Moolenaar enddef 89640ee466cSBram Moolenaar 89740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 89840ee466cSBram Moolenaar try 89940ee466cSBram Moolenaar call FuncWithError() 90040ee466cSBram Moolenaar catch 90140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 90240ee466cSBram Moolenaar endtry 90340ee466cSBram Moolenaar endfunc 9042a1381c3SBram Moolenaarendif 90540ee466cSBram Moolenaar 9068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9078a7d6542SBram Moolenaar vim9script 908cfcd011fSBram Moolenaar var name: string = 'bob' 9098a7d6542SBram Moolenaar def Concat(arg: string): string 9108a7d6542SBram Moolenaar return name .. arg 9118a7d6542SBram Moolenaar enddef 912227a69deSBram Moolenaar g:result = Concat('bie') 913227a69deSBram Moolenaar g:localname = name 9148a7d6542SBram Moolenaar 9158a7d6542SBram Moolenaar export const CONST = 1234 916cfcd011fSBram Moolenaar export var exported = 9876 917cfcd011fSBram Moolenaar export var exp_name = 'John' 9188a7d6542SBram Moolenaar export def Exported(): string 9198a7d6542SBram Moolenaar return 'Exported' 9208a7d6542SBram Moolenaar enddef 9218a7d6542SBram MoolenaarEND 9228a7d6542SBram Moolenaar 923b3ca9824SBram Moolenaardef Undo_export_script_lines() 924b3ca9824SBram Moolenaar unlet g:result 925b3ca9824SBram Moolenaar unlet g:localname 926b3ca9824SBram Moolenaarenddef 927b3ca9824SBram Moolenaar 9285269bd2aSBram Moolenaardef Test_vim9_import_export() 929cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9308a7d6542SBram Moolenaar vim9script 9318a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9328a7d6542SBram Moolenaar g:imported = exported 9336e587dcbSBram Moolenaar exported += 3 9346e587dcbSBram Moolenaar g:imported_added = exported 9358a7d6542SBram Moolenaar g:imported_func = Exported() 9366e587dcbSBram Moolenaar 93740f4f7a4SBram Moolenaar def GetExported(): string 938e0de171eSBram Moolenaar var local_dict = {ref: Exported} 93940f4f7a4SBram Moolenaar return local_dict.ref() 94040f4f7a4SBram Moolenaar enddef 94140f4f7a4SBram Moolenaar g:funcref_result = GetExported() 94240f4f7a4SBram Moolenaar 9436e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9446e587dcbSBram Moolenaar g:imported_name = exp_name 9456e587dcbSBram Moolenaar exp_name ..= ' Doe' 9466e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9475381c7a1SBram Moolenaar g:imported_later = exported 9488a7d6542SBram Moolenaar END 9498a7d6542SBram Moolenaar 9508a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9518a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9528a7d6542SBram Moolenaar 9538a7d6542SBram Moolenaar source Ximport.vim 9548a7d6542SBram Moolenaar 9558a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9568a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9578a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9586e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9595381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9608a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 96140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9626e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9636e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9648a7d6542SBram Moolenaar assert_false(exists('g:name')) 9658a7d6542SBram Moolenaar 966b3ca9824SBram Moolenaar Undo_export_script_lines() 9678a7d6542SBram Moolenaar unlet g:imported 9686e587dcbSBram Moolenaar unlet g:imported_added 9695381c7a1SBram Moolenaar unlet g:imported_later 9708a7d6542SBram Moolenaar unlet g:imported_func 9716e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9728a7d6542SBram Moolenaar delete('Ximport.vim') 973f2d5c240SBram Moolenaar 9741c991144SBram Moolenaar # similar, with line breaks 975cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9761c991144SBram Moolenaar vim9script 9771c991144SBram Moolenaar import { 9781c991144SBram Moolenaar exported, 9791c991144SBram Moolenaar Exported, 9801c991144SBram Moolenaar } 9811c991144SBram Moolenaar from 9821c991144SBram Moolenaar './Xexport.vim' 9831c991144SBram Moolenaar g:imported = exported 9841c991144SBram Moolenaar exported += 5 9851c991144SBram Moolenaar g:imported_added = exported 9861c991144SBram Moolenaar g:imported_func = Exported() 9871c991144SBram Moolenaar END 9881c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9891c991144SBram Moolenaar source Ximport_lbr.vim 9901c991144SBram Moolenaar 9911c991144SBram Moolenaar assert_equal(9876, g:imported) 9921c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9931c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9941c991144SBram Moolenaar 9951c991144SBram Moolenaar # exported script not sourced again 9961c991144SBram Moolenaar assert_false(exists('g:result')) 9971c991144SBram Moolenaar unlet g:imported 9981c991144SBram Moolenaar unlet g:imported_added 9991c991144SBram Moolenaar unlet g:imported_func 10001c991144SBram Moolenaar delete('Ximport_lbr.vim') 10011c991144SBram Moolenaar 10021c991144SBram Moolenaar # import inside :def function 1003cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10045381c7a1SBram Moolenaar vim9script 10055381c7a1SBram Moolenaar def ImportInDef() 10065381c7a1SBram Moolenaar import exported from './Xexport.vim' 10075381c7a1SBram Moolenaar g:imported = exported 10085381c7a1SBram Moolenaar exported += 7 10095381c7a1SBram Moolenaar g:imported_added = exported 10105381c7a1SBram Moolenaar enddef 10115381c7a1SBram Moolenaar ImportInDef() 10125381c7a1SBram Moolenaar END 10135381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10145381c7a1SBram Moolenaar source Ximport2.vim 1015f5be8cdbSBram Moolenaar # TODO: this should be 9879 10165381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10175381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10185381c7a1SBram Moolenaar unlet g:imported 10195381c7a1SBram Moolenaar unlet g:imported_added 10205381c7a1SBram Moolenaar delete('Ximport2.vim') 10215381c7a1SBram Moolenaar 1022cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1023f2d5c240SBram Moolenaar vim9script 1024f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1025f2d5c240SBram Moolenaar def UseExport() 1026f2d5c240SBram Moolenaar g:imported = Export.exported 1027f2d5c240SBram Moolenaar enddef 1028f2d5c240SBram Moolenaar UseExport() 1029f2d5c240SBram Moolenaar END 1030f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1031f2d5c240SBram Moolenaar source Ximport.vim 10325381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1033f2d5c240SBram Moolenaar 1034cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1035599c89c8SBram Moolenaar vim9script 1036599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1037599c89c8SBram Moolenaar def Func() 1038cfcd011fSBram Moolenaar var dummy = 1 1039cfcd011fSBram Moolenaar var imported = Export + dummy 1040599c89c8SBram Moolenaar enddef 1041822ba247SBram Moolenaar defcompile 1042599c89c8SBram Moolenaar END 1043599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 104444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1045599c89c8SBram Moolenaar 1046cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1047599c89c8SBram Moolenaar vim9script 1048599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1049599c89c8SBram Moolenaar def Func() 1050cfcd011fSBram Moolenaar var imported = Export . exported 1051599c89c8SBram Moolenaar enddef 1052822ba247SBram Moolenaar defcompile 1053599c89c8SBram Moolenaar END 1054599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 105544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1056599c89c8SBram Moolenaar 1057a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1058a6294955SBram Moolenaar vim9script 1059a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1060a6294955SBram Moolenaar var some = 'other' 1061a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1062a6294955SBram Moolenaar defcompile 1063a6294955SBram Moolenaar END 1064a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1065a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1066a6294955SBram Moolenaar 1067cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1068599c89c8SBram Moolenaar vim9script 1069599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1070599c89c8SBram Moolenaar def Func() 1071cfcd011fSBram Moolenaar var imported = Export. 1072599c89c8SBram Moolenaar enddef 1073822ba247SBram Moolenaar defcompile 1074599c89c8SBram Moolenaar END 1075599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 107644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1077599c89c8SBram Moolenaar 1078cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10791c991144SBram Moolenaar vim9script 10801c991144SBram Moolenaar import * 10811c991144SBram Moolenaar as Export 10821c991144SBram Moolenaar from 10831c991144SBram Moolenaar './Xexport.vim' 10841c991144SBram Moolenaar def UseExport() 10851c991144SBram Moolenaar g:imported = Export.exported 10861c991144SBram Moolenaar enddef 10871c991144SBram Moolenaar UseExport() 10881c991144SBram Moolenaar END 10891c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10901c991144SBram Moolenaar source Ximport.vim 10911c991144SBram Moolenaar assert_equal(9883, g:imported) 10921c991144SBram Moolenaar 1093cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1094f2d5c240SBram Moolenaar vim9script 1095f2d5c240SBram Moolenaar import * from './Xexport.vim' 1096f2d5c240SBram Moolenaar END 1097f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 109844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1099f2d5c240SBram Moolenaar 1100f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1101cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1102fa29c8abSBram Moolenaar vim9script 1103fa29c8abSBram Moolenaar import name from './Xexport.vim' 1104fa29c8abSBram Moolenaar END 1105fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 110644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1107fa29c8abSBram Moolenaar 1108f5be8cdbSBram Moolenaar # try to import something that is already defined 1109cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11105269bd2aSBram Moolenaar vim9script 1111cfcd011fSBram Moolenaar var exported = 'something' 11125269bd2aSBram Moolenaar import exported from './Xexport.vim' 11135269bd2aSBram Moolenaar END 11145269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 111544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11165269bd2aSBram Moolenaar 1117f5be8cdbSBram Moolenaar # try to import something that is already defined 11185269bd2aSBram Moolenaar import_already_defined =<< trim END 11195269bd2aSBram Moolenaar vim9script 1120cfcd011fSBram Moolenaar var exported = 'something' 11215269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11225269bd2aSBram Moolenaar END 11235269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 112444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11255269bd2aSBram Moolenaar 1126f5be8cdbSBram Moolenaar # try to import something that is already defined 11275269bd2aSBram Moolenaar import_already_defined =<< trim END 11285269bd2aSBram Moolenaar vim9script 1129cfcd011fSBram Moolenaar var exported = 'something' 11305269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11315269bd2aSBram Moolenaar END 11325269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 113344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11345269bd2aSBram Moolenaar 1135918a4249SBram Moolenaar # try changing an imported const 1136918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1137918a4249SBram Moolenaar vim9script 1138918a4249SBram Moolenaar import CONST from './Xexport.vim' 1139918a4249SBram Moolenaar def Assign() 1140918a4249SBram Moolenaar CONST = 987 1141918a4249SBram Moolenaar enddef 1142918a4249SBram Moolenaar defcompile 1143918a4249SBram Moolenaar END 1144918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1145918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1146918a4249SBram Moolenaar 1147f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1148cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1149fa29c8abSBram Moolenaar vim9script 1150fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1151fa29c8abSBram Moolenaar END 1152fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 115344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1154fa29c8abSBram Moolenaar 1155cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1156fa29c8abSBram Moolenaar vim9script 1157fa29c8abSBram Moolenaar import name './Xexport.vim' 1158fa29c8abSBram Moolenaar END 1159fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 116044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1161fa29c8abSBram Moolenaar 1162cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1163fa29c8abSBram Moolenaar vim9script 1164fa29c8abSBram Moolenaar import name from Xexport.vim 1165fa29c8abSBram Moolenaar END 1166fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 116744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1168fa29c8abSBram Moolenaar 1169cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1170fa29c8abSBram Moolenaar vim9script 1171fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1172fa29c8abSBram Moolenaar END 1173fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 117444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1175fa29c8abSBram Moolenaar 1176cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1177fa29c8abSBram Moolenaar vim9script 1178fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1179fa29c8abSBram Moolenaar END 11805269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 118144d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1182fa29c8abSBram Moolenaar 1183f2d5c240SBram Moolenaar delete('Ximport.vim') 11845269bd2aSBram Moolenaar delete('Ximport3.vim') 11858a7d6542SBram Moolenaar delete('Xexport.vim') 11868a7d6542SBram Moolenaar 1187f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1188750802b5SBram Moolenaar set cpo&vi 1189cfcd011fSBram Moolenaar var cpo_before = &cpo 1190cfcd011fSBram Moolenaar var lines =<< trim END 1191750802b5SBram Moolenaar vim9script 1192750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1193750802b5SBram Moolenaar END 1194750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1195750802b5SBram Moolenaar source Xvim9_script 1196750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1197750802b5SBram Moolenaar set cpo&vim 1198750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1199750802b5SBram Moolenaar delete('Xvim9_script') 1200750802b5SBram Moolenaarenddef 1201750802b5SBram Moolenaar 1202803af686SBram Moolenaarfunc g:Trigger() 1203803af686SBram Moolenaar source Ximport.vim 1204803af686SBram Moolenaar return "echo 'yes'\<CR>" 1205803af686SBram Moolenaarendfunc 1206803af686SBram Moolenaar 1207803af686SBram Moolenaardef Test_import_export_expr_map() 1208803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1209cfcd011fSBram Moolenaar var export_lines =<< trim END 1210803af686SBram Moolenaar vim9script 1211803af686SBram Moolenaar export def That(): string 1212803af686SBram Moolenaar return 'yes' 1213803af686SBram Moolenaar enddef 1214803af686SBram Moolenaar END 1215803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1216803af686SBram Moolenaar 1217cfcd011fSBram Moolenaar var import_lines =<< trim END 1218803af686SBram Moolenaar vim9script 1219803af686SBram Moolenaar import That from './Xexport_that.vim' 1220803af686SBram Moolenaar assert_equal('yes', That()) 1221803af686SBram Moolenaar END 1222803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1223803af686SBram Moolenaar 1224803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1225803af686SBram Moolenaar feedkeys('trigger', "xt") 1226803af686SBram Moolenaar 1227730b2483SBram Moolenaar delete('Xexport_that.vim') 1228803af686SBram Moolenaar delete('Ximport.vim') 1229803af686SBram Moolenaar nunmap trigger 1230803af686SBram Moolenaarenddef 1231803af686SBram Moolenaar 12328e1986e3SBram Moolenaardef Test_import_in_filetype() 12338e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12348e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1235cfcd011fSBram Moolenaar var export_lines =<< trim END 12368e1986e3SBram Moolenaar vim9script 1237cfcd011fSBram Moolenaar export var That = 'yes' 12388e1986e3SBram Moolenaar END 1239730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12408e1986e3SBram Moolenaar 1241cfcd011fSBram Moolenaar var import_lines =<< trim END 12428e1986e3SBram Moolenaar vim9script 1243730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12448e1986e3SBram Moolenaar assert_equal('yes', That) 12458e1986e3SBram Moolenaar g:did_load_mytpe = 1 12468e1986e3SBram Moolenaar END 12478e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12488e1986e3SBram Moolenaar 1249cfcd011fSBram Moolenaar var save_rtp = &rtp 12508e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 12518e1986e3SBram Moolenaar 12528e1986e3SBram Moolenaar filetype plugin on 12538e1986e3SBram Moolenaar copen 12548e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12558e1986e3SBram Moolenaar 12568e1986e3SBram Moolenaar quit! 1257730b2483SBram Moolenaar delete('Xexport_ft.vim') 12588e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12598e1986e3SBram Moolenaar &rtp = save_rtp 12608e1986e3SBram Moolenaarenddef 12618e1986e3SBram Moolenaar 1262efa94447SBram Moolenaardef Test_use_import_in_mapping() 1263cfcd011fSBram Moolenaar var lines =<< trim END 1264efa94447SBram Moolenaar vim9script 1265efa94447SBram Moolenaar export def Funcx() 1266efa94447SBram Moolenaar g:result = 42 1267efa94447SBram Moolenaar enddef 1268efa94447SBram Moolenaar END 1269efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1270efa94447SBram Moolenaar lines =<< trim END 1271efa94447SBram Moolenaar vim9script 1272efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1273b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1274efa94447SBram Moolenaar END 1275efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1276efa94447SBram Moolenaar 1277efa94447SBram Moolenaar source Xmapscript.vim 1278b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1279efa94447SBram Moolenaar assert_equal(42, g:result) 1280efa94447SBram Moolenaar 1281efa94447SBram Moolenaar unlet g:result 1282efa94447SBram Moolenaar delete('XsomeExport.vim') 1283efa94447SBram Moolenaar delete('Xmapscript.vim') 1284b3ca9824SBram Moolenaar nunmap <F3> 1285efa94447SBram Moolenaarenddef 1286efa94447SBram Moolenaar 1287d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1288d3f8a9eeSBram Moolenaar var lines =<< trim END 1289d3f8a9eeSBram Moolenaar if has(g:feature) 1290d3f8a9eeSBram Moolenaar " legacy script 1291d3f8a9eeSBram Moolenaar let g:legacy = 1 1292d3f8a9eeSBram Moolenaar finish 1293d3f8a9eeSBram Moolenaar endif 1294d3f8a9eeSBram Moolenaar vim9script 1295d3f8a9eeSBram Moolenaar g:legacy = 0 1296d3f8a9eeSBram Moolenaar END 1297d3f8a9eeSBram Moolenaar g:feature = 'eval' 1298d3f8a9eeSBram Moolenaar g:legacy = -1 1299d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1300d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1301d3f8a9eeSBram Moolenaar 1302d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1303d3f8a9eeSBram Moolenaar g:legacy = -1 1304d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1305d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1306d3f8a9eeSBram Moolenaarenddef 1307d3f8a9eeSBram Moolenaar 1308750802b5SBram Moolenaardef Test_vim9script_fails() 13098a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13108a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1311cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 13129721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1313cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1314750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1315750802b5SBram Moolenaar 1316cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1317c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1318c785b9a7SBram Moolenaar 1319e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1320e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 13218a7d6542SBram Moolenaarenddef 13228a7d6542SBram Moolenaar 1323f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1324101f4810SBram Moolenaar CheckRunVimInTerminal 1325101f4810SBram Moolenaar 13269bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1327c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13289bb3eb3eSBram Moolenaarendfunc 13299bb3eb3eSBram Moolenaar 1330c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1331cfcd011fSBram Moolenaar var export =<< trim END 1332101f4810SBram Moolenaar vim9script 1333101f4810SBram Moolenaar export def Foo(): number 1334101f4810SBram Moolenaar return 0 1335101f4810SBram Moolenaar enddef 1336101f4810SBram Moolenaar END 1337730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1338101f4810SBram Moolenaar 1339e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 13409bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13412949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1342101f4810SBram Moolenaar 1343730b2483SBram Moolenaar delete('XexportCmd.vim') 13449bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13459bb3eb3eSBram Moolenaarenddef 1346101f4810SBram Moolenaar 13472b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13482b32700dSBram Moolenaar var lines =<< trim END 1349a6294955SBram Moolenaar vim9script 1350a6294955SBram Moolenaar export var exported = 'thexport' 1351a6294955SBram Moolenaar END 1352a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1353a6294955SBram Moolenaar lines =<< trim END 13542b32700dSBram Moolenaar vim9script noclear 13552b32700dSBram Moolenaar g:loadCount += 1 13562b32700dSBram Moolenaar var s:reloaded = 'init' 1357a6294955SBram Moolenaar import exported from './XExportReload' 13582b32700dSBram Moolenaar 13592b32700dSBram Moolenaar def Again(): string 13602b32700dSBram Moolenaar return 'again' 13612b32700dSBram Moolenaar enddef 13622b32700dSBram Moolenaar 13632b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 13642b32700dSBram Moolenaar var s:loaded = true 13652b32700dSBram Moolenaar 13662b32700dSBram Moolenaar var s:notReloaded = 'yes' 13672b32700dSBram Moolenaar s:reloaded = 'first' 13682b32700dSBram Moolenaar def g:Values(): list<string> 1369a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 13702b32700dSBram Moolenaar enddef 13712b32700dSBram Moolenaar 13722b32700dSBram Moolenaar def Once(): string 13732b32700dSBram Moolenaar return 'once' 13742b32700dSBram Moolenaar enddef 13752b32700dSBram Moolenaar END 13762b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13772b32700dSBram Moolenaar g:loadCount = 0 13782b32700dSBram Moolenaar source XReloaded 13792b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1380a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13812b32700dSBram Moolenaar source XReloaded 13822b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1383a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13842b32700dSBram Moolenaar source XReloaded 13852b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1386a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13872b32700dSBram Moolenaar 138848e11c10SBram Moolenaar delete('XReloaded') 1389a6294955SBram Moolenaar delete('XExportReload') 13902b32700dSBram Moolenaar delfunc g:Values 13912b32700dSBram Moolenaar unlet g:loadCount 13922b32700dSBram Moolenaarenddef 13932b32700dSBram Moolenaar 13944c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1395cfcd011fSBram Moolenaar var lines =<< trim END 13968a7d6542SBram Moolenaar vim9script 13978a7d6542SBram Moolenaar const var = '' 1398cfcd011fSBram Moolenaar var valone = 1234 13998a7d6542SBram Moolenaar def MyFunc(arg: string) 14008a7d6542SBram Moolenaar valone = 5678 14018a7d6542SBram Moolenaar enddef 14028a7d6542SBram Moolenaar END 1403cfcd011fSBram Moolenaar var morelines =<< trim END 1404cfcd011fSBram Moolenaar var valtwo = 222 14058a7d6542SBram Moolenaar export def GetValtwo(): number 14068a7d6542SBram Moolenaar return valtwo 14078a7d6542SBram Moolenaar enddef 14088a7d6542SBram Moolenaar END 140903afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14108a7d6542SBram Moolenaar source Xreload.vim 14118a7d6542SBram Moolenaar source Xreload.vim 14128a7d6542SBram Moolenaar source Xreload.vim 14138a7d6542SBram Moolenaar 1414cfcd011fSBram Moolenaar var testlines =<< trim END 14158a7d6542SBram Moolenaar vim9script 14168a7d6542SBram Moolenaar def TheFunc() 14178a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14188a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14198a7d6542SBram Moolenaar enddef 14208a7d6542SBram Moolenaar TheFunc() 14218a7d6542SBram Moolenaar END 14228a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14238a7d6542SBram Moolenaar source Ximport.vim 14248a7d6542SBram Moolenaar 1425f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1426f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14278a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14288a7d6542SBram Moolenaar source Ximport.vim 14298a7d6542SBram Moolenaar 1430f5be8cdbSBram Moolenaar # cannot declare a var twice 14318a7d6542SBram Moolenaar lines =<< trim END 14328a7d6542SBram Moolenaar vim9script 1433cfcd011fSBram Moolenaar var valone = 1234 1434cfcd011fSBram Moolenaar var valone = 5678 14358a7d6542SBram Moolenaar END 14368a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 143744d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 14388a7d6542SBram Moolenaar 14398a7d6542SBram Moolenaar delete('Xreload.vim') 14408a7d6542SBram Moolenaar delete('Ximport.vim') 14418a7d6542SBram Moolenaarenddef 14428a7d6542SBram Moolenaar 144307a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 144407a65d26SBram Moolenaar" compiled function using that variable must fail. 144507a65d26SBram Moolenaardef Test_script_reload_change_type() 144607a65d26SBram Moolenaar var lines =<< trim END 144707a65d26SBram Moolenaar vim9script noclear 144807a65d26SBram Moolenaar var str = 'string' 144907a65d26SBram Moolenaar def g:GetStr(): string 145007a65d26SBram Moolenaar return str .. 'xxx' 145107a65d26SBram Moolenaar enddef 145207a65d26SBram Moolenaar END 145307a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 145407a65d26SBram Moolenaar source Xreload.vim 145507a65d26SBram Moolenaar echo g:GetStr() 145607a65d26SBram Moolenaar 145707a65d26SBram Moolenaar lines =<< trim END 145807a65d26SBram Moolenaar vim9script noclear 145907a65d26SBram Moolenaar var str = 1234 146007a65d26SBram Moolenaar END 146107a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 146207a65d26SBram Moolenaar source Xreload.vim 146307a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 146407a65d26SBram Moolenaar 146507a65d26SBram Moolenaar delfunc g:GetStr 146607a65d26SBram Moolenaar delete('Xreload.vim') 146707a65d26SBram Moolenaarenddef 146807a65d26SBram Moolenaar 146995006e3dSBram Moolenaardef s:RetSome(): string 147095006e3dSBram Moolenaar return 'some' 147195006e3dSBram Moolenaarenddef 147295006e3dSBram Moolenaar 1473fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1474fe465a01SBram Moolenaar" script-local name. 1475fe465a01SBram Moolenaardef Test_vim9script_funcref() 1476cfcd011fSBram Moolenaar var sortlines =<< trim END 1477fe465a01SBram Moolenaar vim9script 1478fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1479bed36b93SBram Moolenaar return i2 - i1 1480fe465a01SBram Moolenaar enddef 1481fe465a01SBram Moolenaar 1482fe465a01SBram Moolenaar export def FastSort(): list<number> 1483fe465a01SBram Moolenaar return range(5)->sort(Compare) 1484fe465a01SBram Moolenaar enddef 1485fe465a01SBram Moolenaar END 1486fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1487fe465a01SBram Moolenaar 1488cfcd011fSBram Moolenaar var lines =<< trim END 1489fe465a01SBram Moolenaar vim9script 1490fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1491fe465a01SBram Moolenaar def Test() 1492fe465a01SBram Moolenaar g:result = FastSort() 1493fe465a01SBram Moolenaar enddef 1494fe465a01SBram Moolenaar Test() 1495fe465a01SBram Moolenaar END 1496fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1497fe465a01SBram Moolenaar 1498fe465a01SBram Moolenaar source Xscript.vim 1499fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1500fe465a01SBram Moolenaar 1501fe465a01SBram Moolenaar unlet g:result 1502fe465a01SBram Moolenaar delete('Xsort.vim') 1503fe465a01SBram Moolenaar delete('Xscript.vim') 150495006e3dSBram Moolenaar 1505cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 150695006e3dSBram Moolenaar assert_equal('some', Funcref()) 1507fe465a01SBram Moolenaarenddef 1508fe465a01SBram Moolenaar 1509601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1510601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1511601e76acSBram Moolenaar" function reference. 1512c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1513cfcd011fSBram Moolenaar var filterLines =<< trim END 1514c620c055SBram Moolenaar vim9script 1515c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1516c620c055SBram Moolenaar return idx % 2 == 1 1517c620c055SBram Moolenaar enddef 1518c620c055SBram Moolenaar export def FastFilter(): list<number> 1519c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1520c620c055SBram Moolenaar enddef 1521601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1522601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1523601e76acSBram Moolenaar enddef 1524c620c055SBram Moolenaar END 1525c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1526c620c055SBram Moolenaar 1527cfcd011fSBram Moolenaar var lines =<< trim END 1528c620c055SBram Moolenaar vim9script 1529601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1530c620c055SBram Moolenaar def Test() 1531cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1532c620c055SBram Moolenaar enddef 1533c620c055SBram Moolenaar Test() 1534601e76acSBram Moolenaar def TestDirect() 1535cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1536601e76acSBram Moolenaar enddef 1537601e76acSBram Moolenaar TestDirect() 1538c620c055SBram Moolenaar END 1539601e76acSBram Moolenaar CheckScriptSuccess(lines) 1540c620c055SBram Moolenaar delete('Xfilter.vim') 1541c620c055SBram Moolenaarenddef 1542c620c055SBram Moolenaar 15434c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1544cfcd011fSBram Moolenaar var first_lines =<< trim END 15454c17ad94SBram Moolenaar vim9script 15464c17ad94SBram Moolenaar def FuncYes(): string 15474c17ad94SBram Moolenaar return 'yes' 15484c17ad94SBram Moolenaar enddef 15494c17ad94SBram Moolenaar END 1550cfcd011fSBram Moolenaar var withno_lines =<< trim END 15514c17ad94SBram Moolenaar def FuncNo(): string 15524c17ad94SBram Moolenaar return 'no' 15534c17ad94SBram Moolenaar enddef 15544c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15554c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15564c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 155703afdcf1SBram Moolenaar enddef 155803afdcf1SBram Moolenaar END 1559cfcd011fSBram Moolenaar var nono_lines =<< trim END 156003afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 156103afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 156244d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 15634c17ad94SBram Moolenaar enddef 15644c17ad94SBram Moolenaar END 15654c17ad94SBram Moolenaar 15664c17ad94SBram Moolenaar # FuncNo() is defined 156703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15684c17ad94SBram Moolenaar source Xreloaded.vim 15694c17ad94SBram Moolenaar g:DoCheck(true) 15704c17ad94SBram Moolenaar 15714c17ad94SBram Moolenaar # FuncNo() is not redefined 157203afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15734c17ad94SBram Moolenaar source Xreloaded.vim 15745082471fSBram Moolenaar g:DoCheck(false) 15754c17ad94SBram Moolenaar 15764c17ad94SBram Moolenaar # FuncNo() is back 157703afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15784c17ad94SBram Moolenaar source Xreloaded.vim 15795082471fSBram Moolenaar g:DoCheck(false) 15804c17ad94SBram Moolenaar 15814c17ad94SBram Moolenaar delete('Xreloaded.vim') 15824c17ad94SBram Moolenaarenddef 15834c17ad94SBram Moolenaar 158489483d40SBram Moolenaardef Test_vim9script_reload_delvar() 158589483d40SBram Moolenaar # write the script with a script-local variable 1586cfcd011fSBram Moolenaar var lines =<< trim END 158789483d40SBram Moolenaar vim9script 1588cfcd011fSBram Moolenaar var name = 'string' 158989483d40SBram Moolenaar END 159089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 159189483d40SBram Moolenaar source XreloadVar.vim 159289483d40SBram Moolenaar 159389483d40SBram Moolenaar # now write the script using the same variable locally - works 159489483d40SBram Moolenaar lines =<< trim END 159589483d40SBram Moolenaar vim9script 159689483d40SBram Moolenaar def Func() 1597cfcd011fSBram Moolenaar var name = 'string' 159889483d40SBram Moolenaar enddef 159989483d40SBram Moolenaar END 160089483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 160189483d40SBram Moolenaar source XreloadVar.vim 160289483d40SBram Moolenaar 160389483d40SBram Moolenaar delete('XreloadVar.vim') 160489483d40SBram Moolenaarenddef 160589483d40SBram Moolenaar 16068a7d6542SBram Moolenaardef Test_import_absolute() 1607cfcd011fSBram Moolenaar var import_lines = [ 1608e6085c53SBram Moolenaar 'vim9script', 1609e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1610e6085c53SBram Moolenaar 'def UseExported()', 1611e6085c53SBram Moolenaar ' g:imported_abs = exported', 1612e6085c53SBram Moolenaar ' exported = 8888', 1613e6085c53SBram Moolenaar ' g:imported_after = exported', 1614e6085c53SBram Moolenaar 'enddef', 1615e6085c53SBram Moolenaar 'UseExported()', 1616e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1617e6085c53SBram Moolenaar ] 16188a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16198a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16208a7d6542SBram Moolenaar 16218a7d6542SBram Moolenaar source Ximport_abs.vim 16228a7d6542SBram Moolenaar 16238a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16244e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1625fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1626fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1627fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1628fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1629fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1630fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1631fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1632fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1633fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1634fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1635e6085c53SBram Moolenaar g:import_disassembled) 1636b3ca9824SBram Moolenaar 1637b3ca9824SBram Moolenaar Undo_export_script_lines() 16388a7d6542SBram Moolenaar unlet g:imported_abs 16394e12a5dfSBram Moolenaar unlet g:import_disassembled 16408a7d6542SBram Moolenaar 16418a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16428a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16438a7d6542SBram Moolenaarenddef 16448a7d6542SBram Moolenaar 16458a7d6542SBram Moolenaardef Test_import_rtp() 1646cfcd011fSBram Moolenaar var import_lines = [ 1647e6085c53SBram Moolenaar 'vim9script', 1648e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1649e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1650e6085c53SBram Moolenaar ] 16518a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16528a7d6542SBram Moolenaar mkdir('import') 16538a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16548a7d6542SBram Moolenaar 1655cfcd011fSBram Moolenaar var save_rtp = &rtp 16568a7d6542SBram Moolenaar &rtp = getcwd() 16578a7d6542SBram Moolenaar source Ximport_rtp.vim 16588a7d6542SBram Moolenaar &rtp = save_rtp 16598a7d6542SBram Moolenaar 16608a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16618a7d6542SBram Moolenaar 1662b3ca9824SBram Moolenaar Undo_export_script_lines() 1663b3ca9824SBram Moolenaar unlet g:imported_rtp 16648a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 166589483d40SBram Moolenaar delete('import', 'rf') 16668a7d6542SBram Moolenaarenddef 16678a7d6542SBram Moolenaar 166825e0f586SBram Moolenaardef Test_import_compile_error() 1669cfcd011fSBram Moolenaar var export_lines = [ 167025e0f586SBram Moolenaar 'vim9script', 167125e0f586SBram Moolenaar 'export def ExpFunc(): string', 167225e0f586SBram Moolenaar ' return notDefined', 167325e0f586SBram Moolenaar 'enddef', 167425e0f586SBram Moolenaar ] 167525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 167625e0f586SBram Moolenaar 1677cfcd011fSBram Moolenaar var import_lines = [ 167825e0f586SBram Moolenaar 'vim9script', 167925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 168025e0f586SBram Moolenaar 'def ImpFunc()', 168125e0f586SBram Moolenaar ' echo ExpFunc()', 168225e0f586SBram Moolenaar 'enddef', 168325e0f586SBram Moolenaar 'defcompile', 168425e0f586SBram Moolenaar ] 168525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 168625e0f586SBram Moolenaar 168725e0f586SBram Moolenaar try 168825e0f586SBram Moolenaar source Ximport.vim 168925e0f586SBram Moolenaar catch /E1001/ 1690f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16917707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 169225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 169325e0f586SBram Moolenaar endtry 169425e0f586SBram Moolenaar 169525e0f586SBram Moolenaar delete('Xexported.vim') 169625e0f586SBram Moolenaar delete('Ximport.vim') 169725e0f586SBram Moolenaarenddef 169825e0f586SBram Moolenaar 1699c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1700cfcd011fSBram Moolenaar var lines = [ 1701c4ce36d4SBram Moolenaar 'vim9script', 1702c4ce36d4SBram Moolenaar 'def Func()', 1703c4ce36d4SBram Moolenaar ' eval [][0]', 1704c4ce36d4SBram Moolenaar 'enddef', 1705c4ce36d4SBram Moolenaar 'Func()', 1706c4ce36d4SBram Moolenaar ] 1707c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1708c4ce36d4SBram Moolenaar 1709c4ce36d4SBram Moolenaar for count in range(3) 1710c4ce36d4SBram Moolenaar try 1711c4ce36d4SBram Moolenaar source Xtestscript.vim 1712c4ce36d4SBram Moolenaar catch /E684/ 1713c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1714c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1715c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1716c4ce36d4SBram Moolenaar endtry 1717c4ce36d4SBram Moolenaar endfor 1718c4ce36d4SBram Moolenaar 1719c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1720c4ce36d4SBram Moolenaarenddef 1721c4ce36d4SBram Moolenaar 1722eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1723cfcd011fSBram Moolenaar var export_lines =<< trim END 1724eef2102eSBram Moolenaar vim9script 1725eef2102eSBram Moolenaar export def Func() 1726eef2102eSBram Moolenaar echo 'imported' 1727eef2102eSBram Moolenaar enddef 1728eef2102eSBram Moolenaar END 1729eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1730eef2102eSBram Moolenaar 1731cfcd011fSBram Moolenaar var lines =<< trim END 1732eef2102eSBram Moolenaar vim9script 1733eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1734eef2102eSBram Moolenaar def Func() 1735eef2102eSBram Moolenaar echo 'local to function' 1736eef2102eSBram Moolenaar enddef 1737eef2102eSBram Moolenaar END 1738eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1739eef2102eSBram Moolenaar 1740eef2102eSBram Moolenaar lines =<< trim END 1741eef2102eSBram Moolenaar vim9script 1742eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1743eef2102eSBram Moolenaar def Outer() 1744eef2102eSBram Moolenaar def Func() 1745eef2102eSBram Moolenaar echo 'local to function' 1746eef2102eSBram Moolenaar enddef 1747eef2102eSBram Moolenaar enddef 1748eef2102eSBram Moolenaar defcompile 1749eef2102eSBram Moolenaar END 1750eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1751eef2102eSBram Moolenaar 1752eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1753eef2102eSBram Moolenaarenddef 1754eef2102eSBram Moolenaar 1755b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1756cfcd011fSBram Moolenaar var lines =<< trim END 1757b9a2cac3SBram Moolenaar vim9script 1758b9a2cac3SBram Moolenaar def Func() 1759b9a2cac3SBram Moolenaar echo 'one' 1760b9a2cac3SBram Moolenaar enddef 1761b9a2cac3SBram Moolenaar def Func() 1762b9a2cac3SBram Moolenaar echo 'two' 1763b9a2cac3SBram Moolenaar enddef 1764b9a2cac3SBram Moolenaar END 1765b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1766fa211f3cSBram Moolenaar 1767fa211f3cSBram Moolenaar lines =<< trim END 1768fa211f3cSBram Moolenaar vim9script 1769fa211f3cSBram Moolenaar def Foo(): string 1770fa211f3cSBram Moolenaar return 'foo' 1771fa211f3cSBram Moolenaar enddef 1772fa211f3cSBram Moolenaar def Func() 1773cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1774fa211f3cSBram Moolenaar enddef 1775fa211f3cSBram Moolenaar defcompile 1776fa211f3cSBram Moolenaar END 1777fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1778b9a2cac3SBram Moolenaarenddef 1779b9a2cac3SBram Moolenaar 17808a7d6542SBram Moolenaardef Test_fixed_size_list() 1781f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1782cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 17838a7d6542SBram Moolenaar l->remove(0) 17848a7d6542SBram Moolenaar l->add(5) 17858a7d6542SBram Moolenaar l->insert(99, 1) 17860f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17878a7d6542SBram Moolenaarenddef 17888a7d6542SBram Moolenaar 1789ae616494SBram Moolenaardef Test_no_insert_xit() 1790d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1791d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1792d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1793d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1794d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1795ae616494SBram Moolenaar 1796ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1797ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1798ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1799ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1800f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1801f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1802f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1803f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1804f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1805ae616494SBram Moolenaarenddef 1806ae616494SBram Moolenaar 1807158906cfSBram Moolenaardef IfElse(what: number): string 1808cfcd011fSBram Moolenaar var res = '' 1809158906cfSBram Moolenaar if what == 1 1810158906cfSBram Moolenaar res = "one" 1811158906cfSBram Moolenaar elseif what == 2 1812158906cfSBram Moolenaar res = "two" 1813a259d8d3SBram Moolenaar else 1814158906cfSBram Moolenaar res = "three" 1815a259d8d3SBram Moolenaar endif 1816158906cfSBram Moolenaar return res 1817a259d8d3SBram Moolenaarenddef 1818a259d8d3SBram Moolenaar 1819158906cfSBram Moolenaardef Test_if_elseif_else() 1820158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1821158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1822158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18230f18b6d1SBram Moolenaarenddef 18240f18b6d1SBram Moolenaar 1825e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1826d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1827d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1828d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1829ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1830d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 18316628b7ebSBram Moolenaar 18326628b7ebSBram Moolenaar var lines =<< trim END 18336628b7ebSBram Moolenaar var s = '' 18346628b7ebSBram Moolenaar if s = '' 18356628b7ebSBram Moolenaar endif 18366628b7ebSBram Moolenaar END 18376628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 18386628b7ebSBram Moolenaar 18396628b7ebSBram Moolenaar lines =<< trim END 18406628b7ebSBram Moolenaar var s = '' 18416628b7ebSBram Moolenaar if s == '' 18426628b7ebSBram Moolenaar elseif s = '' 18436628b7ebSBram Moolenaar endif 18446628b7ebSBram Moolenaar END 18456628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1846e8c4abbbSBram Moolenaarenddef 1847e8c4abbbSBram Moolenaar 18486d69bf60SBram Moolenaarlet g:bool_true = v:true 18496d69bf60SBram Moolenaarlet g:bool_false = v:false 18506d69bf60SBram Moolenaar 18516d69bf60SBram Moolenaardef Test_if_const_expr() 1852cfcd011fSBram Moolenaar var res = false 18536d69bf60SBram Moolenaar if true ? true : false 18546d69bf60SBram Moolenaar res = true 18556d69bf60SBram Moolenaar endif 18566d69bf60SBram Moolenaar assert_equal(true, res) 18576d69bf60SBram Moolenaar 1858585fea7bSBram Moolenaar g:glob = 2 1859585fea7bSBram Moolenaar if false 18606797966dSBram Moolenaar execute('g:glob = 3') 1861585fea7bSBram Moolenaar endif 1862585fea7bSBram Moolenaar assert_equal(2, g:glob) 1863585fea7bSBram Moolenaar if true 18646797966dSBram Moolenaar execute('g:glob = 3') 1865585fea7bSBram Moolenaar endif 1866585fea7bSBram Moolenaar assert_equal(3, g:glob) 1867585fea7bSBram Moolenaar 18686d69bf60SBram Moolenaar res = false 18696d69bf60SBram Moolenaar if g:bool_true ? true : false 18706d69bf60SBram Moolenaar res = true 18716d69bf60SBram Moolenaar endif 18726d69bf60SBram Moolenaar assert_equal(true, res) 18736d69bf60SBram Moolenaar 18746d69bf60SBram Moolenaar res = false 18756d69bf60SBram Moolenaar if true ? g:bool_true : false 18766d69bf60SBram Moolenaar res = true 18776d69bf60SBram Moolenaar endif 18786d69bf60SBram Moolenaar assert_equal(true, res) 18796d69bf60SBram Moolenaar 18806d69bf60SBram Moolenaar res = false 18816d69bf60SBram Moolenaar if true ? true : g:bool_false 18826d69bf60SBram Moolenaar res = true 18836d69bf60SBram Moolenaar endif 18846d69bf60SBram Moolenaar assert_equal(true, res) 18856d69bf60SBram Moolenaar 18866d69bf60SBram Moolenaar res = false 18876d69bf60SBram Moolenaar if true ? false : true 18886d69bf60SBram Moolenaar res = true 18896d69bf60SBram Moolenaar endif 18906d69bf60SBram Moolenaar assert_equal(false, res) 18916d69bf60SBram Moolenaar 18926d69bf60SBram Moolenaar res = false 18936d69bf60SBram Moolenaar if false ? false : true 18946d69bf60SBram Moolenaar res = true 18956d69bf60SBram Moolenaar endif 18966d69bf60SBram Moolenaar assert_equal(true, res) 18976d69bf60SBram Moolenaar 18986d69bf60SBram Moolenaar res = false 18996d69bf60SBram Moolenaar if false ? true : false 19006d69bf60SBram Moolenaar res = true 19016d69bf60SBram Moolenaar endif 19026d69bf60SBram Moolenaar assert_equal(false, res) 19036d69bf60SBram Moolenaar 19046d69bf60SBram Moolenaar res = false 1905e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1906e8c4abbbSBram Moolenaar res = true 1907e8c4abbbSBram Moolenaar endif 1908e8c4abbbSBram Moolenaar assert_equal(false, res) 1909e8c4abbbSBram Moolenaar 1910e8c4abbbSBram Moolenaar res = false 19116d69bf60SBram Moolenaar if true && true 19126d69bf60SBram Moolenaar res = true 19136d69bf60SBram Moolenaar endif 19146d69bf60SBram Moolenaar assert_equal(true, res) 19156d69bf60SBram Moolenaar 19166d69bf60SBram Moolenaar res = false 19176d69bf60SBram Moolenaar if true && false 19186d69bf60SBram Moolenaar res = true 19196d69bf60SBram Moolenaar endif 19206d69bf60SBram Moolenaar assert_equal(false, res) 19216d69bf60SBram Moolenaar 19226d69bf60SBram Moolenaar res = false 19236d69bf60SBram Moolenaar if g:bool_true && false 19246d69bf60SBram Moolenaar res = true 19256d69bf60SBram Moolenaar endif 19266d69bf60SBram Moolenaar assert_equal(false, res) 19276d69bf60SBram Moolenaar 19286d69bf60SBram Moolenaar res = false 19296d69bf60SBram Moolenaar if true && g:bool_false 19306d69bf60SBram Moolenaar res = true 19316d69bf60SBram Moolenaar endif 19326d69bf60SBram Moolenaar assert_equal(false, res) 19336d69bf60SBram Moolenaar 19346d69bf60SBram Moolenaar res = false 19356d69bf60SBram Moolenaar if false && false 19366d69bf60SBram Moolenaar res = true 19376d69bf60SBram Moolenaar endif 19386d69bf60SBram Moolenaar assert_equal(false, res) 19396d69bf60SBram Moolenaar 19406d69bf60SBram Moolenaar res = false 19416d69bf60SBram Moolenaar if true || false 19426d69bf60SBram Moolenaar res = true 19436d69bf60SBram Moolenaar endif 19446d69bf60SBram Moolenaar assert_equal(true, res) 19456d69bf60SBram Moolenaar 19466d69bf60SBram Moolenaar res = false 19476d69bf60SBram Moolenaar if g:bool_true || false 19486d69bf60SBram Moolenaar res = true 19496d69bf60SBram Moolenaar endif 19506d69bf60SBram Moolenaar assert_equal(true, res) 19516d69bf60SBram Moolenaar 19526d69bf60SBram Moolenaar res = false 19536d69bf60SBram Moolenaar if true || g:bool_false 19546d69bf60SBram Moolenaar res = true 19556d69bf60SBram Moolenaar endif 19566d69bf60SBram Moolenaar assert_equal(true, res) 19576d69bf60SBram Moolenaar 19586d69bf60SBram Moolenaar res = false 19596d69bf60SBram Moolenaar if false || false 19606d69bf60SBram Moolenaar res = true 19616d69bf60SBram Moolenaar endif 19626d69bf60SBram Moolenaar assert_equal(false, res) 19633988f64fSBram Moolenaar 19643988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 19653988f64fSBram Moolenaar if false | eval 0 | endif 19663988f64fSBram Moolenaar if false | eval burp + 234 | endif 19673988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 19683988f64fSBram Moolenaar if false 19693988f64fSBram Moolenaar burp 19703988f64fSBram Moolenaar endif 197180c34ca3SBram Moolenaarenddef 19726d69bf60SBram Moolenaar 197380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1974d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1975d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1976d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1977d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19786d69bf60SBram Moolenaarenddef 19796d69bf60SBram Moolenaar 198072abcf42SBram Moolenaardef RunNested(i: number): number 1981cfcd011fSBram Moolenaar var x: number = 0 198272abcf42SBram Moolenaar if i % 2 198372abcf42SBram Moolenaar if 1 1984f5be8cdbSBram Moolenaar # comment 198572abcf42SBram Moolenaar else 1986f5be8cdbSBram Moolenaar # comment 198772abcf42SBram Moolenaar endif 198872abcf42SBram Moolenaar x += 1 198972abcf42SBram Moolenaar else 199072abcf42SBram Moolenaar x += 1000 199172abcf42SBram Moolenaar endif 199272abcf42SBram Moolenaar return x 199372abcf42SBram Moolenaarenddef 199472abcf42SBram Moolenaar 199572abcf42SBram Moolenaardef Test_nested_if() 199672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 199772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 199872abcf42SBram Moolenaarenddef 199972abcf42SBram Moolenaar 2000ad39c094SBram Moolenaardef Test_execute_cmd() 2001e4984290SBram Moolenaar # missing argument is ignored 2002e4984290SBram Moolenaar execute 2003e4984290SBram Moolenaar execute # comment 2004e4984290SBram Moolenaar 2005ad39c094SBram Moolenaar new 2006ad39c094SBram Moolenaar setline(1, 'default') 2007d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2008ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2009a72cfb80SBram Moolenaar 2010d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2011a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2012a72cfb80SBram Moolenaar 2013cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2014cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2015a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2016ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2017a72cfb80SBram Moolenaar 2018d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2019ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2020a72cfb80SBram Moolenaar 2021cfcd011fSBram Moolenaar var cmd_first = 'call ' 2022cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2023ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2024ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2025ad39c094SBram Moolenaar bwipe! 2026585fea7bSBram Moolenaar 2027cfcd011fSBram Moolenaar var n = true 20282d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20292d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20302d6b20d6SBram Moolenaar 2031e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2032e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2033e5abf7afSBram Moolenaar 2034d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2035d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2036d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2037ad39c094SBram Moolenaarenddef 2038ad39c094SBram Moolenaar 203947e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2040f5be8cdbSBram Moolenaar # only checks line continuation 2041cfcd011fSBram Moolenaar var lines =<< trim END 204247e880d6SBram Moolenaar vim9script 204347e880d6SBram Moolenaar execute 'g:someVar' 204447e880d6SBram Moolenaar .. ' = ' .. 204547e880d6SBram Moolenaar '28' 204647e880d6SBram Moolenaar assert_equal(28, g:someVar) 204747e880d6SBram Moolenaar unlet g:someVar 204847e880d6SBram Moolenaar END 204947e880d6SBram Moolenaar CheckScriptSuccess(lines) 205047e880d6SBram Moolenaarenddef 205147e880d6SBram Moolenaar 2052ad39c094SBram Moolenaardef Test_echo_cmd() 2053a72cfb80SBram Moolenaar echo 'some' # comment 2054585fea7bSBram Moolenaar echon 'thing' 2055ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2056ad39c094SBram Moolenaar 2057a72cfb80SBram Moolenaar echo "some" # comment 2058a72cfb80SBram Moolenaar echon "thing" 2059a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2060a72cfb80SBram Moolenaar 2061cfcd011fSBram Moolenaar var str1 = 'some' 2062cfcd011fSBram Moolenaar var str2 = 'more' 2063ad39c094SBram Moolenaar echo str1 str2 2064ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2065a72cfb80SBram Moolenaar 2066d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2067ad39c094SBram Moolenaarenddef 2068ad39c094SBram Moolenaar 2069f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2070f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2071f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2072f93c7feaSBram Moolenaar echo 'clear' 2073df069eecSBram Moolenaar :1messages 2074f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2075f93c7feaSBram Moolenaar 2076d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2077f93c7feaSBram Moolenaarenddef 2078f93c7feaSBram Moolenaar 207947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2080f5be8cdbSBram Moolenaar # only checks line continuation 2081cfcd011fSBram Moolenaar var lines =<< trim END 208247e880d6SBram Moolenaar vim9script 208347e880d6SBram Moolenaar echomsg 'here' 208447e880d6SBram Moolenaar .. ' is ' .. 208547e880d6SBram Moolenaar 'a message' 208647e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 208747e880d6SBram Moolenaar END 208847e880d6SBram Moolenaar CheckScriptSuccess(lines) 208947e880d6SBram Moolenaarenddef 209047e880d6SBram Moolenaar 2091f93c7feaSBram Moolenaardef Test_echoerr_cmd() 209240ee466cSBram Moolenaar try 209340ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 209440ee466cSBram Moolenaar catch 209540ee466cSBram Moolenaar assert_match('something wrong', v:exception) 209640ee466cSBram Moolenaar endtry 2097f93c7feaSBram Moolenaarenddef 2098f93c7feaSBram Moolenaar 209947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2100f5be8cdbSBram Moolenaar # only checks line continuation 2101cfcd011fSBram Moolenaar var lines =<< trim END 210247e880d6SBram Moolenaar vim9script 210347e880d6SBram Moolenaar try 210447e880d6SBram Moolenaar echoerr 'this' 210547e880d6SBram Moolenaar .. ' is ' .. 210647e880d6SBram Moolenaar 'wrong' 210747e880d6SBram Moolenaar catch 210847e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 210947e880d6SBram Moolenaar endtry 211047e880d6SBram Moolenaar END 211147e880d6SBram Moolenaar CheckScriptSuccess(lines) 211247e880d6SBram Moolenaarenddef 211347e880d6SBram Moolenaar 211441fe0617SBram Moolenaardef Test_for_outside_of_function() 2115cfcd011fSBram Moolenaar var lines =<< trim END 211641fe0617SBram Moolenaar vim9script 211741fe0617SBram Moolenaar new 211841fe0617SBram Moolenaar for var in range(0, 3) 211941fe0617SBram Moolenaar append(line('$'), var) 212041fe0617SBram Moolenaar endfor 212141fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 212241fe0617SBram Moolenaar bwipe! 212341fe0617SBram Moolenaar END 212441fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 212541fe0617SBram Moolenaar source Xvim9for.vim 212641fe0617SBram Moolenaar delete('Xvim9for.vim') 212741fe0617SBram Moolenaarenddef 21288a7d6542SBram Moolenaar 2129e8c4abbbSBram Moolenaardef Test_for_loop() 2130cfcd011fSBram Moolenaar var result = '' 2131e8c4abbbSBram Moolenaar for cnt in range(7) 2132e8c4abbbSBram Moolenaar if cnt == 4 2133e8c4abbbSBram Moolenaar break 2134e8c4abbbSBram Moolenaar endif 2135e8c4abbbSBram Moolenaar if cnt == 2 2136e8c4abbbSBram Moolenaar continue 2137e8c4abbbSBram Moolenaar endif 2138e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2139e8c4abbbSBram Moolenaar endfor 2140e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21410ad3e894SBram Moolenaar 2142cfcd011fSBram Moolenaar var concat = '' 21430ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21440ad3e894SBram Moolenaar concat ..= str 21450ad3e894SBram Moolenaar endfor 21460ad3e894SBram Moolenaar assert_equal('onetwo', concat) 214738bd8de5SBram Moolenaar 214838bd8de5SBram Moolenaar var total = 0 214938bd8de5SBram Moolenaar for nr in 215038bd8de5SBram Moolenaar [1, 2, 3] 215138bd8de5SBram Moolenaar total += nr 215238bd8de5SBram Moolenaar endfor 215338bd8de5SBram Moolenaar assert_equal(6, total) 215438bd8de5SBram Moolenaar 215538bd8de5SBram Moolenaar total = 0 215638bd8de5SBram Moolenaar for nr 215738bd8de5SBram Moolenaar in [1, 2, 3] 215838bd8de5SBram Moolenaar total += nr 215938bd8de5SBram Moolenaar endfor 216038bd8de5SBram Moolenaar assert_equal(6, total) 216138bd8de5SBram Moolenaar 216238bd8de5SBram Moolenaar total = 0 216338bd8de5SBram Moolenaar for nr 216438bd8de5SBram Moolenaar in 216538bd8de5SBram Moolenaar [1, 2, 3] 216638bd8de5SBram Moolenaar total += nr 216738bd8de5SBram Moolenaar endfor 216838bd8de5SBram Moolenaar assert_equal(6, total) 2169036d0714SBram Moolenaar 2170036d0714SBram Moolenaar var res = "" 2171036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2172036d0714SBram Moolenaar res ..= n .. s 2173036d0714SBram Moolenaar endfor 2174036d0714SBram Moolenaar assert_equal('1a2b', res) 2175e8c4abbbSBram Moolenaarenddef 2176e8c4abbbSBram Moolenaar 2177e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2178025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2179025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2180025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2181675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2182675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2183cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2184822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21852d870f8dSBram Moolenaar delfunc! g:Func 2186451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2187675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2188675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2189675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2190e8c4abbbSBram Moolenaarenddef 2191e8c4abbbSBram Moolenaar 2192ea87069dSBram Moolenaardef Test_for_loop_script_var() 2193ea87069dSBram Moolenaar # cannot use s:var in a :def function 2194ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2195ea87069dSBram Moolenaar 2196ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2197ea87069dSBram Moolenaar var lines =<< trim END 2198ea87069dSBram Moolenaar vim9script 2199ea87069dSBram Moolenaar var total = 0 2200ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2201ea87069dSBram Moolenaar total += s:var 2202ea87069dSBram Moolenaar endfor 2203ea87069dSBram Moolenaar assert_equal(6, total) 2204ea87069dSBram Moolenaar 2205ea87069dSBram Moolenaar total = 0 2206ea87069dSBram Moolenaar for var in [1, 2, 3] 2207ea87069dSBram Moolenaar total += var 2208ea87069dSBram Moolenaar endfor 2209ea87069dSBram Moolenaar assert_equal(6, total) 2210ea87069dSBram Moolenaar END 2211ea87069dSBram Moolenaarenddef 2212ea87069dSBram Moolenaar 2213792f786aSBram Moolenaardef Test_for_loop_unpack() 22144b8a0651SBram Moolenaar var lines =<< trim END 2215792f786aSBram Moolenaar var result = [] 2216792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2217792f786aSBram Moolenaar result->add(v1) 2218792f786aSBram Moolenaar result->add(v2) 2219792f786aSBram Moolenaar endfor 2220792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2221792f786aSBram Moolenaar 2222792f786aSBram Moolenaar result = [] 2223792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2224792f786aSBram Moolenaar result->add(v1) 2225792f786aSBram Moolenaar result->add(v2) 2226792f786aSBram Moolenaar result->add(v3) 2227792f786aSBram Moolenaar endfor 2228792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2229792f786aSBram Moolenaar 22304b8a0651SBram Moolenaar result = [] 22314b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 22324b8a0651SBram Moolenaar result->add(&ts) 22334b8a0651SBram Moolenaar result->add(&sw) 22344b8a0651SBram Moolenaar endfor 22354b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 22364b8a0651SBram Moolenaar 22374b8a0651SBram Moolenaar var slist: list<string> 22384b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 22394b8a0651SBram Moolenaar slist->add($LOOPVAR) 22404b8a0651SBram Moolenaar slist->add(@r) 22414b8a0651SBram Moolenaar slist->add(v:errmsg) 22424b8a0651SBram Moolenaar endfor 22434b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22444b8a0651SBram Moolenaar 22454b8a0651SBram Moolenaar slist = [] 22464b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22474b8a0651SBram Moolenaar slist->add(g:globalvar) 22484b8a0651SBram Moolenaar slist->add(b:bufvar) 22494b8a0651SBram Moolenaar slist->add(w:winvar) 22504b8a0651SBram Moolenaar slist->add(t:tabvar) 22514b8a0651SBram Moolenaar endfor 22524b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2253f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 22544b8a0651SBram Moolenaar END 22554b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 22564b8a0651SBram Moolenaar 22574b8a0651SBram Moolenaar lines =<< trim END 2258792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2259792f786aSBram Moolenaar echo v1 v2 2260792f786aSBram Moolenaar endfor 2261792f786aSBram Moolenaar END 2262792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2263792f786aSBram Moolenaar 2264792f786aSBram Moolenaar lines =<< trim END 2265792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2266792f786aSBram Moolenaar echo v1 v2 2267792f786aSBram Moolenaar endfor 2268792f786aSBram Moolenaar END 2269792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2270792f786aSBram Moolenaar 2271792f786aSBram Moolenaar lines =<< trim END 2272792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2273792f786aSBram Moolenaar echo v1 2274792f786aSBram Moolenaar endfor 2275792f786aSBram Moolenaar END 2276792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2277792f786aSBram Moolenaarenddef 2278792f786aSBram Moolenaar 2279c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2280c150c09eSBram Moolenaar var looped = 0 2281c150c09eSBram Moolenaar var cleanup = 0 2282c150c09eSBram Moolenaar for i in range(3) 2283c150c09eSBram Moolenaar looped += 1 2284c150c09eSBram Moolenaar try 2285c150c09eSBram Moolenaar eval [][0] 2286c150c09eSBram Moolenaar catch 2287c150c09eSBram Moolenaar continue 2288c150c09eSBram Moolenaar finally 2289c150c09eSBram Moolenaar cleanup += 1 2290c150c09eSBram Moolenaar endtry 2291c150c09eSBram Moolenaar endfor 2292c150c09eSBram Moolenaar assert_equal(3, looped) 2293c150c09eSBram Moolenaar assert_equal(3, cleanup) 2294c150c09eSBram Moolenaarenddef 2295c150c09eSBram Moolenaar 2296d0df1aacSBram Moolenaardef Test_while_loop() 2297cfcd011fSBram Moolenaar var result = '' 2298cfcd011fSBram Moolenaar var cnt = 0 2299d0df1aacSBram Moolenaar while cnt < 555 2300d0df1aacSBram Moolenaar if cnt == 3 2301d0df1aacSBram Moolenaar break 2302d0df1aacSBram Moolenaar endif 2303d0df1aacSBram Moolenaar cnt += 1 2304d0df1aacSBram Moolenaar if cnt == 2 2305d0df1aacSBram Moolenaar continue 2306d0df1aacSBram Moolenaar endif 2307d0df1aacSBram Moolenaar result ..= cnt .. '_' 2308d0df1aacSBram Moolenaar endwhile 2309d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2310dee37dc7SBram Moolenaar 2311dee37dc7SBram Moolenaar var s = '' 23120123cc1eSBram Moolenaar while s == 'x' #{comment} 2313dee37dc7SBram Moolenaar endwhile 2314d0df1aacSBram Moolenaarenddef 2315d0df1aacSBram Moolenaar 2316e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2317675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2318675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2319675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2320675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2321675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2322675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2323675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 23246628b7ebSBram Moolenaar 23256628b7ebSBram Moolenaar var lines =<< trim END 23266628b7ebSBram Moolenaar var s = '' 23276628b7ebSBram Moolenaar while s = '' 23286628b7ebSBram Moolenaar endwhile 23296628b7ebSBram Moolenaar END 23306628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2331bd5da371SBram Moolenaarenddef 2332bd5da371SBram Moolenaar 23339645e2d9SBram Moolenaardef Test_interrupt_loop() 2334cfcd011fSBram Moolenaar var caught = false 2335cfcd011fSBram Moolenaar var x = 0 233697acfc78SBram Moolenaar try 23379645e2d9SBram Moolenaar while 1 23389645e2d9SBram Moolenaar x += 1 23399645e2d9SBram Moolenaar if x == 100 23409645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23419645e2d9SBram Moolenaar endif 23429645e2d9SBram Moolenaar endwhile 234397acfc78SBram Moolenaar catch 234497acfc78SBram Moolenaar caught = true 234597acfc78SBram Moolenaar assert_equal(100, x) 234697acfc78SBram Moolenaar endtry 234797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 234825859dd7SBram Moolenaar # consume the CTRL-C 234925859dd7SBram Moolenaar getchar(0) 23509645e2d9SBram Moolenaarenddef 235120431c9dSBram Moolenaar 23524fdae999SBram Moolenaardef Test_automatic_line_continuation() 2353cfcd011fSBram Moolenaar var mylist = [ 23544fdae999SBram Moolenaar 'one', 23554fdae999SBram Moolenaar 'two', 23564fdae999SBram Moolenaar 'three', 2357f5be8cdbSBram Moolenaar ] # comment 23584fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23594fdae999SBram Moolenaar 2360cfcd011fSBram Moolenaar var mydict = { 2361e0de171eSBram Moolenaar ['one']: 1, 2362e0de171eSBram Moolenaar ['two']: 2, 2363e0de171eSBram Moolenaar ['three']: 23644fdae999SBram Moolenaar 3, 2365f5be8cdbSBram Moolenaar } # comment 2366e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2367e0de171eSBram Moolenaar mydict = { 23682c330432SBram Moolenaar one: 1, # comment 23692c330432SBram Moolenaar two: # comment 23702c330432SBram Moolenaar 2, # comment 23712c330432SBram Moolenaar three: 3 # comment 23722c330432SBram Moolenaar } 2373e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2374e0de171eSBram Moolenaar mydict = { 23752c330432SBram Moolenaar one: 1, 23764fdae999SBram Moolenaar two: 23774fdae999SBram Moolenaar 2, 23782c330432SBram Moolenaar three: 3 23794fdae999SBram Moolenaar } 2380e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2381e6085c53SBram Moolenaar 2382e6085c53SBram Moolenaar assert_equal( 2383e6085c53SBram Moolenaar ['one', 'two', 'three'], 2384e6085c53SBram Moolenaar split('one two three') 2385e6085c53SBram Moolenaar ) 23864fdae999SBram Moolenaarenddef 23874fdae999SBram Moolenaar 23887a092245SBram Moolenaardef Test_vim9_comment() 23897a092245SBram Moolenaar CheckScriptSuccess([ 23907a092245SBram Moolenaar 'vim9script', 23917a092245SBram Moolenaar '# something', 239293f82cbeSBram Moolenaar '#something', 239393f82cbeSBram Moolenaar '#{something', 23947a092245SBram Moolenaar ]) 239593f82cbeSBram Moolenaar 239693f82cbeSBram Moolenaar split Xfile 239793f82cbeSBram Moolenaar CheckScriptSuccess([ 239893f82cbeSBram Moolenaar 'vim9script', 239993f82cbeSBram Moolenaar 'edit #something', 240093f82cbeSBram Moolenaar ]) 240193f82cbeSBram Moolenaar CheckScriptSuccess([ 240293f82cbeSBram Moolenaar 'vim9script', 240393f82cbeSBram Moolenaar 'edit #{something', 240493f82cbeSBram Moolenaar ]) 240593f82cbeSBram Moolenaar close 240693f82cbeSBram Moolenaar 24077a092245SBram Moolenaar CheckScriptFailure([ 24087a092245SBram Moolenaar 'vim9script', 24097a092245SBram Moolenaar ':# something', 24107a092245SBram Moolenaar ], 'E488:') 24117a092245SBram Moolenaar CheckScriptFailure([ 24127a092245SBram Moolenaar '# something', 24137a092245SBram Moolenaar ], 'E488:') 24147a092245SBram Moolenaar CheckScriptFailure([ 24157a092245SBram Moolenaar ':# something', 24167a092245SBram Moolenaar ], 'E488:') 24177a092245SBram Moolenaar 24184a8d9f2eSBram Moolenaar { # block start 24194a8d9f2eSBram Moolenaar } # block end 24204a8d9f2eSBram Moolenaar CheckDefFailure([ 24214a8d9f2eSBram Moolenaar '{# comment', 24224a8d9f2eSBram Moolenaar ], 'E488:') 24234a8d9f2eSBram Moolenaar CheckDefFailure([ 24244a8d9f2eSBram Moolenaar '{', 24254a8d9f2eSBram Moolenaar '}# comment', 24264a8d9f2eSBram Moolenaar ], 'E488:') 24274a8d9f2eSBram Moolenaar 24284a8d9f2eSBram Moolenaar echo "yes" # comment 24294a8d9f2eSBram Moolenaar CheckDefFailure([ 24304a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24314a8d9f2eSBram Moolenaar ], 'E488:') 24327a092245SBram Moolenaar CheckScriptSuccess([ 24337a092245SBram Moolenaar 'vim9script', 24347a092245SBram Moolenaar 'echo "yes" # something', 24357a092245SBram Moolenaar ]) 24367a092245SBram Moolenaar CheckScriptFailure([ 24377a092245SBram Moolenaar 'vim9script', 24387a092245SBram Moolenaar 'echo "yes"# something', 24397a092245SBram Moolenaar ], 'E121:') 24407a092245SBram Moolenaar CheckScriptFailure([ 24417a092245SBram Moolenaar 'vim9script', 24427a092245SBram Moolenaar 'echo# something', 2443f8103f27SBram Moolenaar ], 'E1144:') 24447a092245SBram Moolenaar CheckScriptFailure([ 24457a092245SBram Moolenaar 'echo "yes" # something', 24467a092245SBram Moolenaar ], 'E121:') 24477a092245SBram Moolenaar 24484a8d9f2eSBram Moolenaar exe "echo" # comment 24494a8d9f2eSBram Moolenaar CheckDefFailure([ 24504a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24514a8d9f2eSBram Moolenaar ], 'E488:') 24524a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24534a8d9f2eSBram Moolenaar 'vim9script', 24544a8d9f2eSBram Moolenaar 'exe "echo" # something', 24554a8d9f2eSBram Moolenaar ]) 24564a8d9f2eSBram Moolenaar CheckScriptFailure([ 24574a8d9f2eSBram Moolenaar 'vim9script', 24584a8d9f2eSBram Moolenaar 'exe "echo"# something', 24594a8d9f2eSBram Moolenaar ], 'E121:') 24604a8d9f2eSBram Moolenaar CheckScriptFailure([ 24614a8d9f2eSBram Moolenaar 'vim9script', 24624a8d9f2eSBram Moolenaar 'exe# something', 2463f8103f27SBram Moolenaar ], 'E1144:') 24644a8d9f2eSBram Moolenaar CheckScriptFailure([ 24654a8d9f2eSBram Moolenaar 'exe "echo" # something', 24664a8d9f2eSBram Moolenaar ], 'E121:') 24674a8d9f2eSBram Moolenaar 24687a092245SBram Moolenaar CheckDefFailure([ 24697a092245SBram Moolenaar 'try# comment', 24707a092245SBram Moolenaar ' echo "yes"', 24717a092245SBram Moolenaar 'catch', 24727a092245SBram Moolenaar 'endtry', 2473f8103f27SBram Moolenaar ], 'E1144:') 24742c5ed4e3SBram Moolenaar CheckScriptFailure([ 24752c5ed4e3SBram Moolenaar 'vim9script', 24762c5ed4e3SBram Moolenaar 'try# comment', 24772c5ed4e3SBram Moolenaar 'echo "yes"', 2478f8103f27SBram Moolenaar ], 'E1144:') 24797a092245SBram Moolenaar CheckDefFailure([ 24807a092245SBram Moolenaar 'try', 2481a72cfb80SBram Moolenaar ' throw#comment', 2482a72cfb80SBram Moolenaar 'catch', 2483a72cfb80SBram Moolenaar 'endtry', 2484f8103f27SBram Moolenaar ], 'E1144:') 2485a72cfb80SBram Moolenaar CheckDefFailure([ 2486a72cfb80SBram Moolenaar 'try', 2487a72cfb80SBram Moolenaar ' throw "yes"#comment', 2488a72cfb80SBram Moolenaar 'catch', 2489a72cfb80SBram Moolenaar 'endtry', 2490a72cfb80SBram Moolenaar ], 'E488:') 2491a72cfb80SBram Moolenaar CheckDefFailure([ 2492a72cfb80SBram Moolenaar 'try', 24937a092245SBram Moolenaar ' echo "yes"', 24947a092245SBram Moolenaar 'catch# comment', 24957a092245SBram Moolenaar 'endtry', 2496f8103f27SBram Moolenaar ], 'E1144:') 24972c5ed4e3SBram Moolenaar CheckScriptFailure([ 24982c5ed4e3SBram Moolenaar 'vim9script', 24992c5ed4e3SBram Moolenaar 'try', 25002c5ed4e3SBram Moolenaar ' echo "yes"', 25012c5ed4e3SBram Moolenaar 'catch# comment', 25022c5ed4e3SBram Moolenaar 'endtry', 2503f8103f27SBram Moolenaar ], 'E1144:') 25042c5ed4e3SBram Moolenaar CheckDefFailure([ 25052c5ed4e3SBram Moolenaar 'try', 25062c5ed4e3SBram Moolenaar ' echo "yes"', 25072c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25082c5ed4e3SBram Moolenaar 'endtry', 25092c5ed4e3SBram Moolenaar ], 'E488:') 25107a092245SBram Moolenaar CheckDefFailure([ 25117a092245SBram Moolenaar 'try', 25127a092245SBram Moolenaar 'echo "yes"', 25137a092245SBram Moolenaar 'catch', 25147a092245SBram Moolenaar 'endtry# comment', 2515f8103f27SBram Moolenaar ], 'E1144:') 25162c5ed4e3SBram Moolenaar CheckScriptFailure([ 25172c5ed4e3SBram Moolenaar 'vim9script', 25182c5ed4e3SBram Moolenaar 'try', 25192c5ed4e3SBram Moolenaar ' echo "yes"', 25202c5ed4e3SBram Moolenaar 'catch', 25212c5ed4e3SBram Moolenaar 'endtry# comment', 2522f8103f27SBram Moolenaar ], 'E1144:') 25232c5ed4e3SBram Moolenaar 25242c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25252c5ed4e3SBram Moolenaar 'vim9script', 25262c5ed4e3SBram Moolenaar 'hi # comment', 25272c5ed4e3SBram Moolenaar ]) 25282c5ed4e3SBram Moolenaar CheckScriptFailure([ 25292c5ed4e3SBram Moolenaar 'vim9script', 25302c5ed4e3SBram Moolenaar 'hi# comment', 2531f8103f27SBram Moolenaar ], 'E1144:') 25321966c248SBram Moolenaar CheckScriptSuccess([ 25331966c248SBram Moolenaar 'vim9script', 25341966c248SBram Moolenaar 'hi Search # comment', 25351966c248SBram Moolenaar ]) 25361966c248SBram Moolenaar CheckScriptFailure([ 25371966c248SBram Moolenaar 'vim9script', 25381966c248SBram Moolenaar 'hi Search# comment', 25391966c248SBram Moolenaar ], 'E416:') 25401966c248SBram Moolenaar CheckScriptSuccess([ 25411966c248SBram Moolenaar 'vim9script', 25421966c248SBram Moolenaar 'hi link This Search # comment', 25431966c248SBram Moolenaar ]) 25441966c248SBram Moolenaar CheckScriptFailure([ 25451966c248SBram Moolenaar 'vim9script', 25461966c248SBram Moolenaar 'hi link This That# comment', 25471966c248SBram Moolenaar ], 'E413:') 25481966c248SBram Moolenaar CheckScriptSuccess([ 25491966c248SBram Moolenaar 'vim9script', 25501966c248SBram Moolenaar 'hi clear This # comment', 25511966c248SBram Moolenaar 'hi clear # comment', 25521966c248SBram Moolenaar ]) 2553f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2554f5be8cdbSBram Moolenaar # hi clear This# comment', 25551966c248SBram Moolenaar CheckScriptFailure([ 25561966c248SBram Moolenaar 'vim9script', 25571966c248SBram Moolenaar 'hi clear# comment', 25581966c248SBram Moolenaar ], 'E416:') 25591966c248SBram Moolenaar 25601966c248SBram Moolenaar CheckScriptSuccess([ 25611966c248SBram Moolenaar 'vim9script', 25621966c248SBram Moolenaar 'hi Group term=bold', 25631966c248SBram Moolenaar 'match Group /todo/ # comment', 25641966c248SBram Moolenaar ]) 25651966c248SBram Moolenaar CheckScriptFailure([ 25661966c248SBram Moolenaar 'vim9script', 25671966c248SBram Moolenaar 'hi Group term=bold', 25681966c248SBram Moolenaar 'match Group /todo/# comment', 25691966c248SBram Moolenaar ], 'E488:') 25701966c248SBram Moolenaar CheckScriptSuccess([ 25711966c248SBram Moolenaar 'vim9script', 25721966c248SBram Moolenaar 'match # comment', 25731966c248SBram Moolenaar ]) 25741966c248SBram Moolenaar CheckScriptFailure([ 25751966c248SBram Moolenaar 'vim9script', 25761966c248SBram Moolenaar 'match# comment', 2577f8103f27SBram Moolenaar ], 'E1144:') 25781966c248SBram Moolenaar CheckScriptSuccess([ 25791966c248SBram Moolenaar 'vim9script', 25801966c248SBram Moolenaar 'match none # comment', 25811966c248SBram Moolenaar ]) 25821966c248SBram Moolenaar CheckScriptFailure([ 25831966c248SBram Moolenaar 'vim9script', 25841966c248SBram Moolenaar 'match none# comment', 25851966c248SBram Moolenaar ], 'E475:') 25861966c248SBram Moolenaar 25871966c248SBram Moolenaar CheckScriptSuccess([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'menutrans clear # comment', 25901966c248SBram Moolenaar ]) 25911966c248SBram Moolenaar CheckScriptFailure([ 25921966c248SBram Moolenaar 'vim9script', 25931966c248SBram Moolenaar 'menutrans clear# comment text', 25941966c248SBram Moolenaar ], 'E474:') 25951966c248SBram Moolenaar 25961966c248SBram Moolenaar CheckScriptSuccess([ 25971966c248SBram Moolenaar 'vim9script', 25981966c248SBram Moolenaar 'syntax clear # comment', 25991966c248SBram Moolenaar ]) 26001966c248SBram Moolenaar CheckScriptFailure([ 26011966c248SBram Moolenaar 'vim9script', 26021966c248SBram Moolenaar 'syntax clear# comment text', 26031966c248SBram Moolenaar ], 'E28:') 26041966c248SBram Moolenaar CheckScriptSuccess([ 26051966c248SBram Moolenaar 'vim9script', 26061966c248SBram Moolenaar 'syntax keyword Word some', 26071966c248SBram Moolenaar 'syntax clear Word # comment', 26081966c248SBram Moolenaar ]) 26091966c248SBram Moolenaar CheckScriptFailure([ 26101966c248SBram Moolenaar 'vim9script', 26111966c248SBram Moolenaar 'syntax keyword Word some', 26121966c248SBram Moolenaar 'syntax clear Word# comment text', 26131966c248SBram Moolenaar ], 'E28:') 26141966c248SBram Moolenaar 26151966c248SBram Moolenaar CheckScriptSuccess([ 26161966c248SBram Moolenaar 'vim9script', 26171966c248SBram Moolenaar 'syntax list # comment', 26181966c248SBram Moolenaar ]) 26191966c248SBram Moolenaar CheckScriptFailure([ 26201966c248SBram Moolenaar 'vim9script', 26211966c248SBram Moolenaar 'syntax list# comment text', 26221966c248SBram Moolenaar ], 'E28:') 26231966c248SBram Moolenaar 26241966c248SBram Moolenaar CheckScriptSuccess([ 26251966c248SBram Moolenaar 'vim9script', 26261966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26271966c248SBram Moolenaar ]) 26281966c248SBram Moolenaar CheckScriptFailure([ 26291966c248SBram Moolenaar 'vim9script', 26301966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26311966c248SBram Moolenaar ], 'E475:') 26321966c248SBram Moolenaar 26331966c248SBram Moolenaar CheckScriptSuccess([ 26341966c248SBram Moolenaar 'vim9script', 26351966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26361966c248SBram Moolenaar ]) 26371966c248SBram Moolenaar CheckScriptFailure([ 26381966c248SBram Moolenaar 'vim9script', 26391966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26401966c248SBram Moolenaar ], 'E789:') 26411966c248SBram Moolenaar 26421966c248SBram Moolenaar CheckScriptSuccess([ 26431966c248SBram Moolenaar 'vim9script', 26441966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26451966c248SBram Moolenaar ]) 26461966c248SBram Moolenaar CheckScriptFailure([ 26471966c248SBram Moolenaar 'vim9script', 26481966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26491966c248SBram Moolenaar ], 'E402:') 26501966c248SBram Moolenaar 26511966c248SBram Moolenaar CheckScriptSuccess([ 26521966c248SBram Moolenaar 'vim9script', 26531966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26541966c248SBram Moolenaar ]) 26551966c248SBram Moolenaar CheckScriptFailure([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26581966c248SBram Moolenaar ], 'E475:') 26591966c248SBram Moolenaar CheckScriptFailure([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26621966c248SBram Moolenaar ], 'E406:') 26631966c248SBram Moolenaar CheckScriptFailure([ 26641966c248SBram Moolenaar 'vim9script', 26651966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26661966c248SBram Moolenaar ], 'E475:') 26671966c248SBram Moolenaar 26681966c248SBram Moolenaar CheckScriptSuccess([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26711966c248SBram Moolenaar ]) 26721966c248SBram Moolenaar CheckScriptFailure([ 26731966c248SBram Moolenaar 'vim9script', 26741966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2675d032f34aSBram Moolenaar ], 'E402:') 26761966c248SBram Moolenaar 26771966c248SBram Moolenaar CheckScriptSuccess([ 26781966c248SBram Moolenaar 'vim9script', 26791966c248SBram Moolenaar 'syntax sync # comment', 26801966c248SBram Moolenaar ]) 26811966c248SBram Moolenaar CheckScriptFailure([ 26821966c248SBram Moolenaar 'vim9script', 26831966c248SBram Moolenaar 'syntax sync# comment', 26841966c248SBram Moolenaar ], 'E404:') 26851966c248SBram Moolenaar CheckScriptSuccess([ 26861966c248SBram Moolenaar 'vim9script', 26871966c248SBram Moolenaar 'syntax sync ccomment # comment', 26881966c248SBram Moolenaar ]) 26891966c248SBram Moolenaar CheckScriptFailure([ 26901966c248SBram Moolenaar 'vim9script', 26911966c248SBram Moolenaar 'syntax sync ccomment# comment', 26921966c248SBram Moolenaar ], 'E404:') 26931966c248SBram Moolenaar 26941966c248SBram Moolenaar CheckScriptSuccess([ 26951966c248SBram Moolenaar 'vim9script', 26961966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26971966c248SBram Moolenaar ]) 26981966c248SBram Moolenaar CheckScriptFailure([ 26991966c248SBram Moolenaar 'vim9script', 27001966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27011966c248SBram Moolenaar ], 'E475:') 2702a72cfb80SBram Moolenaar 2703a72cfb80SBram Moolenaar CheckScriptSuccess([ 2704a72cfb80SBram Moolenaar 'vim9script', 2705a72cfb80SBram Moolenaar 'command Echo echo # comment', 2706a72cfb80SBram Moolenaar 'command Echo # comment', 27072d870f8dSBram Moolenaar 'delcommand Echo', 2708a72cfb80SBram Moolenaar ]) 2709a72cfb80SBram Moolenaar CheckScriptFailure([ 2710a72cfb80SBram Moolenaar 'vim9script', 2711a72cfb80SBram Moolenaar 'command Echo echo# comment', 2712a72cfb80SBram Moolenaar 'Echo', 2713f8103f27SBram Moolenaar ], 'E1144:') 27142d870f8dSBram Moolenaar delcommand Echo 271570249ee8SBram Moolenaar 271670249ee8SBram Moolenaar var curdir = getcwd() 271770249ee8SBram Moolenaar CheckScriptSuccess([ 271870249ee8SBram Moolenaar 'command Echo cd " comment', 271970249ee8SBram Moolenaar 'Echo', 272070249ee8SBram Moolenaar 'delcommand Echo', 272170249ee8SBram Moolenaar ]) 272270249ee8SBram Moolenaar CheckScriptSuccess([ 2723090728adSBram Moolenaar 'vim9script', 272470249ee8SBram Moolenaar 'command Echo cd # comment', 272570249ee8SBram Moolenaar 'Echo', 272670249ee8SBram Moolenaar 'delcommand Echo', 272770249ee8SBram Moolenaar ]) 272870249ee8SBram Moolenaar CheckScriptFailure([ 272970249ee8SBram Moolenaar 'vim9script', 273070249ee8SBram Moolenaar 'command Echo cd " comment', 273170249ee8SBram Moolenaar 'Echo', 273270249ee8SBram Moolenaar ], 'E344:') 273370249ee8SBram Moolenaar delcommand Echo 273470249ee8SBram Moolenaar chdir(curdir) 273570249ee8SBram Moolenaar 2736a72cfb80SBram Moolenaar CheckScriptFailure([ 2737a72cfb80SBram Moolenaar 'vim9script', 2738a72cfb80SBram Moolenaar 'command Echo# comment', 2739a72cfb80SBram Moolenaar ], 'E182:') 2740a72cfb80SBram Moolenaar CheckScriptFailure([ 2741a72cfb80SBram Moolenaar 'vim9script', 2742a72cfb80SBram Moolenaar 'command Echo echo', 2743a72cfb80SBram Moolenaar 'command Echo# comment', 2744a72cfb80SBram Moolenaar ], 'E182:') 27452d870f8dSBram Moolenaar delcommand Echo 2746a72cfb80SBram Moolenaar 2747a72cfb80SBram Moolenaar CheckScriptSuccess([ 2748a72cfb80SBram Moolenaar 'vim9script', 2749a72cfb80SBram Moolenaar 'function # comment', 2750a72cfb80SBram Moolenaar ]) 2751a72cfb80SBram Moolenaar CheckScriptFailure([ 2752a72cfb80SBram Moolenaar 'vim9script', 27539898107fSBram Moolenaar 'function " comment', 27549898107fSBram Moolenaar ], 'E129:') 27559898107fSBram Moolenaar CheckScriptFailure([ 27569898107fSBram Moolenaar 'vim9script', 2757a72cfb80SBram Moolenaar 'function# comment', 2758f8103f27SBram Moolenaar ], 'E1144:') 2759a72cfb80SBram Moolenaar CheckScriptSuccess([ 2760a72cfb80SBram Moolenaar 'vim9script', 2761a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2762a72cfb80SBram Moolenaar ]) 2763a72cfb80SBram Moolenaar CheckScriptFailure([ 2764a72cfb80SBram Moolenaar 'vim9script', 2765a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2766a72cfb80SBram Moolenaar ], 'E488:') 2767a72cfb80SBram Moolenaar 2768a72cfb80SBram Moolenaar CheckScriptSuccess([ 2769a72cfb80SBram Moolenaar 'vim9script', 27704c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2771a72cfb80SBram Moolenaar 'endfunc', 27724c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2773a72cfb80SBram Moolenaar ]) 2774a72cfb80SBram Moolenaar CheckScriptFailure([ 2775a72cfb80SBram Moolenaar 'vim9script', 27764c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2777a72cfb80SBram Moolenaar 'endfunc', 27784c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2779a72cfb80SBram Moolenaar ], 'E488:') 2780a72cfb80SBram Moolenaar 2781a72cfb80SBram Moolenaar CheckScriptSuccess([ 2782a72cfb80SBram Moolenaar 'vim9script', 2783a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2784a72cfb80SBram Moolenaar ]) 2785a72cfb80SBram Moolenaar CheckScriptFailure([ 2786a72cfb80SBram Moolenaar 'vim9script', 2787a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2788a72cfb80SBram Moolenaar ], 'E488:') 2789e7e4838fSBram Moolenaar 2790e7e4838fSBram Moolenaar CheckScriptFailure([ 2791e7e4838fSBram Moolenaar 'def Test() " comment', 2792e7e4838fSBram Moolenaar 'enddef', 2793e7e4838fSBram Moolenaar ], 'E488:') 2794e7e4838fSBram Moolenaar CheckScriptFailure([ 2795e7e4838fSBram Moolenaar 'vim9script', 2796e7e4838fSBram Moolenaar 'def Test() " comment', 2797e7e4838fSBram Moolenaar 'enddef', 2798e7e4838fSBram Moolenaar ], 'E488:') 2799e7e4838fSBram Moolenaar 2800e7e4838fSBram Moolenaar CheckScriptSuccess([ 2801e7e4838fSBram Moolenaar 'func Test() " comment', 2802e7e4838fSBram Moolenaar 'endfunc', 28032d870f8dSBram Moolenaar 'delfunc Test', 2804e7e4838fSBram Moolenaar ]) 28059898107fSBram Moolenaar CheckScriptSuccess([ 2806e7e4838fSBram Moolenaar 'vim9script', 2807e7e4838fSBram Moolenaar 'func Test() " comment', 2808e7e4838fSBram Moolenaar 'endfunc', 28099898107fSBram Moolenaar ]) 2810e7e4838fSBram Moolenaar 2811e7e4838fSBram Moolenaar CheckScriptSuccess([ 2812e7e4838fSBram Moolenaar 'def Test() # comment', 2813e7e4838fSBram Moolenaar 'enddef', 2814e7e4838fSBram Moolenaar ]) 2815e7e4838fSBram Moolenaar CheckScriptFailure([ 2816e7e4838fSBram Moolenaar 'func Test() # comment', 2817e7e4838fSBram Moolenaar 'endfunc', 2818e7e4838fSBram Moolenaar ], 'E488:') 28192c5ed4e3SBram Moolenaarenddef 28202c5ed4e3SBram Moolenaar 28212c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28222c5ed4e3SBram Moolenaar CheckCanRunGui 28232c5ed4e3SBram Moolenaar 28242c5ed4e3SBram Moolenaar CheckScriptFailure([ 28252c5ed4e3SBram Moolenaar 'vim9script', 28262c5ed4e3SBram Moolenaar 'gui#comment' 2827f8103f27SBram Moolenaar ], 'E1144:') 28282c5ed4e3SBram Moolenaar CheckScriptFailure([ 28292c5ed4e3SBram Moolenaar 'vim9script', 28302c5ed4e3SBram Moolenaar 'gui -f#comment' 28312c5ed4e3SBram Moolenaar ], 'E499:') 28327a092245SBram Moolenaarenddef 28337a092245SBram Moolenaar 2834a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28356797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28366797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2837a26b9700SBram Moolenaar 2838a26b9700SBram Moolenaar edit test.vim 2839a26b9700SBram Moolenaar doautocmd TabEnter #comment 2840a26b9700SBram Moolenaar assert_equal(1, g:entered) 2841a26b9700SBram Moolenaar 2842a26b9700SBram Moolenaar doautocmd TabEnter f.x 2843a26b9700SBram Moolenaar assert_equal(2, g:entered) 2844a26b9700SBram Moolenaar 2845a26b9700SBram Moolenaar g:entered = 0 2846a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2847a26b9700SBram Moolenaar assert_equal(2, g:entered) 2848a26b9700SBram Moolenaar 2849a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2850a26b9700SBram Moolenaar 2851a26b9700SBram Moolenaar au! TabEnter 2852a26b9700SBram Moolenaar unlet g:entered 2853d72c1bf0SBram Moolenaar 2854d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2855d72c1bf0SBram Moolenaar 'vim9script', 28566797966dSBram Moolenaar 'g:var = 123', 2857e55b1c09SBram Moolenaar 'b:var = 456', 2858e55b1c09SBram Moolenaar 'w:var = 777', 2859e55b1c09SBram Moolenaar 't:var = 888', 2860d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2861d72c1bf0SBram Moolenaar ]) 2862d72c1bf0SBram Moolenaar 2863d72c1bf0SBram Moolenaar CheckScriptFailure([ 2864d72c1bf0SBram Moolenaar 'vim9script', 2865cfcd011fSBram Moolenaar 'let var = 123', 2866cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2867cfcd011fSBram Moolenaar 2868cfcd011fSBram Moolenaar CheckScriptFailure([ 2869cfcd011fSBram Moolenaar 'vim9script', 2870cfcd011fSBram Moolenaar 'var g:var = 123', 2871e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2872e55b1c09SBram Moolenaar 2873e55b1c09SBram Moolenaar CheckScriptFailure([ 2874e55b1c09SBram Moolenaar 'vim9script', 2875cfcd011fSBram Moolenaar 'var b:var = 123', 2876e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2877e55b1c09SBram Moolenaar 2878e55b1c09SBram Moolenaar CheckScriptFailure([ 2879e55b1c09SBram Moolenaar 'vim9script', 2880cfcd011fSBram Moolenaar 'var w:var = 123', 2881e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2882e55b1c09SBram Moolenaar 2883e55b1c09SBram Moolenaar CheckScriptFailure([ 2884e55b1c09SBram Moolenaar 'vim9script', 2885cfcd011fSBram Moolenaar 'var t:var = 123', 2886e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2887e55b1c09SBram Moolenaar 2888e55b1c09SBram Moolenaar CheckScriptFailure([ 2889e55b1c09SBram Moolenaar 'vim9script', 2890cfcd011fSBram Moolenaar 'var v:version = 123', 2891e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2892e55b1c09SBram Moolenaar 2893e55b1c09SBram Moolenaar CheckScriptFailure([ 2894e55b1c09SBram Moolenaar 'vim9script', 2895cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2896e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28976797966dSBram Moolenaar 28986797966dSBram Moolenaar CheckScriptFailure([ 28996797966dSBram Moolenaar 'vim9script', 29006797966dSBram Moolenaar 'g:var = 123', 290132e35117SBram Moolenaar 'unlet g:var# comment1', 2902d72c1bf0SBram Moolenaar ], 'E108:') 2903d72c1bf0SBram Moolenaar 2904d72c1bf0SBram Moolenaar CheckScriptFailure([ 2905d72c1bf0SBram Moolenaar 'let g:var = 123', 2906d72c1bf0SBram Moolenaar 'unlet g:var # something', 2907d72c1bf0SBram Moolenaar ], 'E488:') 2908faac4104SBram Moolenaar 2909faac4104SBram Moolenaar CheckScriptSuccess([ 2910faac4104SBram Moolenaar 'vim9script', 291132e35117SBram Moolenaar 'if 1 # comment2', 2912faac4104SBram Moolenaar ' echo "yes"', 2913faac4104SBram Moolenaar 'elseif 2 #comment', 2914faac4104SBram Moolenaar ' echo "no"', 2915faac4104SBram Moolenaar 'endif', 2916faac4104SBram Moolenaar ]) 2917faac4104SBram Moolenaar 2918faac4104SBram Moolenaar CheckScriptFailure([ 2919faac4104SBram Moolenaar 'vim9script', 292032e35117SBram Moolenaar 'if 1# comment3', 2921faac4104SBram Moolenaar ' echo "yes"', 2922faac4104SBram Moolenaar 'endif', 2923faac4104SBram Moolenaar ], 'E15:') 2924faac4104SBram Moolenaar 2925faac4104SBram Moolenaar CheckScriptFailure([ 2926faac4104SBram Moolenaar 'vim9script', 292732e35117SBram Moolenaar 'if 0 # comment4', 2928faac4104SBram Moolenaar ' echo "yes"', 2929faac4104SBram Moolenaar 'elseif 2#comment', 2930faac4104SBram Moolenaar ' echo "no"', 2931faac4104SBram Moolenaar 'endif', 2932faac4104SBram Moolenaar ], 'E15:') 2933faac4104SBram Moolenaar 2934faac4104SBram Moolenaar CheckScriptSuccess([ 2935faac4104SBram Moolenaar 'vim9script', 2936cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2937faac4104SBram Moolenaar ]) 2938faac4104SBram Moolenaar 2939faac4104SBram Moolenaar CheckScriptFailure([ 2940faac4104SBram Moolenaar 'vim9script', 2941cfcd011fSBram Moolenaar 'var v = 1# comment6', 294232e35117SBram Moolenaar ], 'E15:') 2943faac4104SBram Moolenaar 2944faac4104SBram Moolenaar CheckScriptSuccess([ 2945faac4104SBram Moolenaar 'vim9script', 2946faac4104SBram Moolenaar 'new' 2947d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2948df069eecSBram Moolenaar ':$', 2949faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2950faac4104SBram Moolenaar 'bwipe!', 2951faac4104SBram Moolenaar ]) 2952faac4104SBram Moolenaar 2953f5be8cdbSBram Moolenaar CheckScriptFailure([ 2954f5be8cdbSBram Moolenaar 'vim9script', 2955f5be8cdbSBram Moolenaar 'new' 2956d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2957f5be8cdbSBram Moolenaar ':$', 2958f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2959f5be8cdbSBram Moolenaar 'bwipe!', 2960f5be8cdbSBram Moolenaar ], 'E488:') 2961f5be8cdbSBram Moolenaar 2962f5be8cdbSBram Moolenaar CheckScriptFailure([ 2963f5be8cdbSBram Moolenaar 'vim9script', 2964f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2965f5be8cdbSBram Moolenaar ], 'E477:') 2966a26b9700SBram Moolenaarenddef 2967a26b9700SBram Moolenaar 29687e5bd91dSBram Moolenaardef Test_finish() 2969cfcd011fSBram Moolenaar var lines =<< trim END 29707e5bd91dSBram Moolenaar vim9script 29716797966dSBram Moolenaar g:res = 'one' 29727e5bd91dSBram Moolenaar if v:false | finish | endif 29736797966dSBram Moolenaar g:res = 'two' 29747e5bd91dSBram Moolenaar finish 29756797966dSBram Moolenaar g:res = 'three' 29767e5bd91dSBram Moolenaar END 29777e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29787e5bd91dSBram Moolenaar source Xfinished 29797e5bd91dSBram Moolenaar assert_equal('two', g:res) 29807e5bd91dSBram Moolenaar 29817e5bd91dSBram Moolenaar unlet g:res 29827e5bd91dSBram Moolenaar delete('Xfinished') 29837e5bd91dSBram Moolenaarenddef 29847e5bd91dSBram Moolenaar 2985a5d0077eSBram Moolenaardef Test_forward_declaration() 2986cfcd011fSBram Moolenaar var lines =<< trim END 2987a5d0077eSBram Moolenaar vim9script 2988a5d0077eSBram Moolenaar def GetValue(): string 2989a5d0077eSBram Moolenaar return theVal 2990a5d0077eSBram Moolenaar enddef 2991cfcd011fSBram Moolenaar var theVal = 'something' 2992822ba247SBram Moolenaar g:initVal = GetValue() 2993a5d0077eSBram Moolenaar theVal = 'else' 2994a5d0077eSBram Moolenaar g:laterVal = GetValue() 2995a5d0077eSBram Moolenaar END 2996a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2997a5d0077eSBram Moolenaar source Xforward 2998a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2999a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3000a5d0077eSBram Moolenaar 3001a5d0077eSBram Moolenaar unlet g:initVal 3002a5d0077eSBram Moolenaar unlet g:laterVal 3003a5d0077eSBram Moolenaar delete('Xforward') 3004a5d0077eSBram Moolenaarenddef 3005a5d0077eSBram Moolenaar 30069721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3007a6294955SBram Moolenaar var vim9_lines =<< trim END 3008a6294955SBram Moolenaar vim9script 3009a6294955SBram Moolenaar var local = 'local' 3010a6294955SBram Moolenaar g:global = 'global' 3011a6294955SBram Moolenaar export var exported = 'exported' 3012a6294955SBram Moolenaar export def GetText(): string 3013a6294955SBram Moolenaar return 'text' 3014a6294955SBram Moolenaar enddef 3015a6294955SBram Moolenaar END 3016a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3017a6294955SBram Moolenaar 3018cfcd011fSBram Moolenaar var legacy_lines =<< trim END 30199721fb4eSBram Moolenaar source Xvim9_script.vim 30209721fb4eSBram Moolenaar 30219721fb4eSBram Moolenaar call assert_false(exists('local')) 30229721fb4eSBram Moolenaar call assert_false(exists('exported')) 30239721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30249721fb4eSBram Moolenaar call assert_equal('global', global) 30259721fb4eSBram Moolenaar call assert_equal('global', g:global) 30269721fb4eSBram Moolenaar 30279721fb4eSBram Moolenaar " imported variable becomes script-local 30289721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30299721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30309721fb4eSBram Moolenaar call assert_false(exists('exported')) 30319721fb4eSBram Moolenaar 30329721fb4eSBram Moolenaar " imported function becomes script-local 30339721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30349721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30359721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30369721fb4eSBram Moolenaar END 30379721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30389721fb4eSBram Moolenaar 30399721fb4eSBram Moolenaar source Xlegacy_script.vim 30409721fb4eSBram Moolenaar assert_equal('global', g:global) 3041f5be8cdbSBram Moolenaar unlet g:global 30429721fb4eSBram Moolenaar 30439721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30449721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30459721fb4eSBram Moolenaarenddef 3046a5d0077eSBram Moolenaar 30477d699701SBram Moolenaarfunc Test_vim9script_not_global() 30487d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30497d699701SBram Moolenaar let vim9lines =<< trim END 30507d699701SBram Moolenaar vim9script 3051cfcd011fSBram Moolenaar var name = 'local' 30527d699701SBram Moolenaar func TheFunc() 30537d699701SBram Moolenaar echo 'local' 30547d699701SBram Moolenaar endfunc 30557d699701SBram Moolenaar def DefFunc() 30567d699701SBram Moolenaar echo 'local' 30577d699701SBram Moolenaar enddef 30587d699701SBram Moolenaar END 30597d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30607d699701SBram Moolenaar source Xvim9script.vim 30617d699701SBram Moolenaar try 30627d699701SBram Moolenaar echo g:var 30637d699701SBram Moolenaar assert_report('did not fail') 30647d699701SBram Moolenaar catch /E121:/ 30657d699701SBram Moolenaar " caught 30667d699701SBram Moolenaar endtry 30677d699701SBram Moolenaar try 30687d699701SBram Moolenaar call TheFunc() 30697d699701SBram Moolenaar assert_report('did not fail') 30707d699701SBram Moolenaar catch /E117:/ 30717d699701SBram Moolenaar " caught 30727d699701SBram Moolenaar endtry 30737d699701SBram Moolenaar try 30747d699701SBram Moolenaar call DefFunc() 30757d699701SBram Moolenaar assert_report('did not fail') 30767d699701SBram Moolenaar catch /E117:/ 30777d699701SBram Moolenaar " caught 30787d699701SBram Moolenaar endtry 30797d699701SBram Moolenaar 308025859dd7SBram Moolenaar call delete('Xvim9script.vim') 30817d699701SBram Moolenaarendfunc 30827d699701SBram Moolenaar 3083eeb27bfeSBram Moolenaardef Test_vim9_copen() 3084eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3085eeb27bfeSBram Moolenaar copen 3086eeb27bfeSBram Moolenaar quit 3087eeb27bfeSBram Moolenaarenddef 3088eeb27bfeSBram Moolenaar 308903290b84SBram Moolenaar" test using an auto-loaded function and variable 30902d6b20d6SBram Moolenaardef Test_vim9_autoload() 3091cfcd011fSBram Moolenaar var lines =<< trim END 30922d6b20d6SBram Moolenaar vim9script 309303290b84SBram Moolenaar def some#gettest(): string 309403290b84SBram Moolenaar return 'test' 309503290b84SBram Moolenaar enddef 309603290b84SBram Moolenaar g:some#name = 'name' 309703290b84SBram Moolenaar END 309803290b84SBram Moolenaar 309903290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 310003290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 310103290b84SBram Moolenaar var save_rtp = &rtp 310203290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 310303290b84SBram Moolenaar 310403290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 310503290b84SBram Moolenaar assert_equal('name', g:some#name) 310603290b84SBram Moolenaar g:some#other = 'other' 310703290b84SBram Moolenaar assert_equal('other', g:some#other) 310803290b84SBram Moolenaar 310917f700acSBram Moolenaar # upper case script name works 311017f700acSBram Moolenaar lines =<< trim END 311117f700acSBram Moolenaar vim9script 311217f700acSBram Moolenaar def Other#getOther(): string 311317f700acSBram Moolenaar return 'other' 311417f700acSBram Moolenaar enddef 311517f700acSBram Moolenaar END 311617f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 311717f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 311817f700acSBram Moolenaar 311903290b84SBram Moolenaar delete('Xdir', 'rf') 312003290b84SBram Moolenaar &rtp = save_rtp 312103290b84SBram Moolenaarenddef 312203290b84SBram Moolenaar 312303290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 312403290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 312503290b84SBram Moolenaar var lines =<< trim END 312603290b84SBram Moolenaar vim9script 31272d6b20d6SBram Moolenaar def foo#test() 31282d6b20d6SBram Moolenaar echomsg getreg('"') 31292d6b20d6SBram Moolenaar enddef 31302d6b20d6SBram Moolenaar END 31312d6b20d6SBram Moolenaar 31322d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31332d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3134cfcd011fSBram Moolenaar var save_rtp = &rtp 31352d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31362d6b20d6SBram Moolenaar augroup test 31372d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31382d6b20d6SBram Moolenaar augroup END 31392d6b20d6SBram Moolenaar 31402d6b20d6SBram Moolenaar normal Y 31412d6b20d6SBram Moolenaar 31422d6b20d6SBram Moolenaar augroup test 31432d6b20d6SBram Moolenaar autocmd! 31442d6b20d6SBram Moolenaar augroup END 31452d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31462d6b20d6SBram Moolenaar &rtp = save_rtp 31472d6b20d6SBram Moolenaarenddef 31482d6b20d6SBram Moolenaar 314977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 315077e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3151cfcd011fSBram Moolenaar var lines =<< trim END 315277e5dcc3SBram Moolenaar vim9script 315377e5dcc3SBram Moolenaar def crash#func() 315477e5dcc3SBram Moolenaar try 315577e5dcc3SBram Moolenaar for x in List() 315677e5dcc3SBram Moolenaar endfor 315777e5dcc3SBram Moolenaar catch 315877e5dcc3SBram Moolenaar endtry 315977e5dcc3SBram Moolenaar g:ok = true 316077e5dcc3SBram Moolenaar enddef 316177e5dcc3SBram Moolenaar fu List() 316277e5dcc3SBram Moolenaar invalid 316377e5dcc3SBram Moolenaar endfu 316477e5dcc3SBram Moolenaar try 316548e11c10SBram Moolenaar alsoinvalid 316677e5dcc3SBram Moolenaar catch /wontmatch/ 316777e5dcc3SBram Moolenaar endtry 316877e5dcc3SBram Moolenaar END 316977e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 317077e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 317177e5dcc3SBram Moolenaar 317277e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 317377e5dcc3SBram Moolenaar lines =<< trim END 317477e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 317577e5dcc3SBram Moolenaar call crash#func() 317677e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31779c4f5520SBram Moolenaar qall! 317877e5dcc3SBram Moolenaar END 317977e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 318077e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 318177e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 318277e5dcc3SBram Moolenaar 318377e5dcc3SBram Moolenaar delete('Xdidit') 318477e5dcc3SBram Moolenaar delete('Xscript') 318577e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 318603290b84SBram Moolenaar 318703290b84SBram Moolenaar lines =<< trim END 318803290b84SBram Moolenaar vim9script 318903290b84SBram Moolenaar var foo#bar = 'asdf' 319003290b84SBram Moolenaar END 319103290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 319277e5dcc3SBram Moolenaarenddef 319377e5dcc3SBram Moolenaar 319481e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 319581e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 319681e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3197cfcd011fSBram Moolenaar var lines =<< trim END 319881e17fbeSBram Moolenaar let s:counter = 1 319981e17fbeSBram Moolenaar def s:Func() 320081e17fbeSBram Moolenaar au! CursorHold 320181e17fbeSBram Moolenaar au CursorHold * s:counter += 1 320281e17fbeSBram Moolenaar enddef 320381e17fbeSBram Moolenaar call s:Func() 320481e17fbeSBram Moolenaar doau CursorHold 320581e17fbeSBram Moolenaar call assert_equal(2, s:counter) 320681e17fbeSBram Moolenaar au! CursorHold 320781e17fbeSBram Moolenaar END 320881e17fbeSBram Moolenaar CheckScriptSuccess(lines) 320981e17fbeSBram Moolenaarenddef 321081e17fbeSBram Moolenaar 32113896a105SBram Moolenaardef Test_cmdline_win() 32123896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32133896a105SBram Moolenaar # the command line window. 32143896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3215cfcd011fSBram Moolenaar var export_lines =<< trim END 32163896a105SBram Moolenaar vim9script 3217cfcd011fSBram Moolenaar export var That = 'yes' 32183896a105SBram Moolenaar END 32193896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3220cfcd011fSBram Moolenaar var import_lines =<< trim END 32213896a105SBram Moolenaar vim9script 32223896a105SBram Moolenaar import That from './Xexport.vim' 32233896a105SBram Moolenaar END 32243896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3225cfcd011fSBram Moolenaar var save_rtp = &rtp 32263896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32273896a105SBram Moolenaar syntax on 32283896a105SBram Moolenaar augroup CmdWin 32293896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32303896a105SBram Moolenaar augroup END 32313896a105SBram Moolenaar # this will open and also close the cmdline window 32323896a105SBram Moolenaar feedkeys('q:', 'xt') 32333896a105SBram Moolenaar assert_equal('yes', g:got_there) 32343896a105SBram Moolenaar 32353896a105SBram Moolenaar augroup CmdWin 32363896a105SBram Moolenaar au! 32373896a105SBram Moolenaar augroup END 32383896a105SBram Moolenaar &rtp = save_rtp 32393896a105SBram Moolenaar delete('rtp', 'rf') 32403896a105SBram Moolenaarenddef 32413896a105SBram Moolenaar 3242e3d4685fSBram Moolenaardef Test_invalid_sid() 3243e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 324425859dd7SBram Moolenaar 32459c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3246d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3247e3d4685fSBram Moolenaar endif 3248e3d4685fSBram Moolenaar delete('Xdidit') 3249e3d4685fSBram Moolenaarenddef 3250e3d4685fSBram Moolenaar 32519ec7026fSBram Moolenaardef Test_restoring_cpo() 32529ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 32539ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 32549ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 32559ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 32569ec7026fSBram Moolenaar endif 32579ec7026fSBram Moolenaar delete('Xsourced') 32589ec7026fSBram Moolenaar delete('Xclose') 3259090728adSBram Moolenaar delete('Xdone') 32600123cc1eSBram Moolenaar 32610123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 32620123cc1eSBram Moolenaar set cpo=aABceFsMny> 32630123cc1eSBram Moolenaar edit XanotherScript 32640123cc1eSBram Moolenaar so % 32650123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32660123cc1eSBram Moolenaar :1del 32670123cc1eSBram Moolenaar w 32680123cc1eSBram Moolenaar so % 32690123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32700123cc1eSBram Moolenaar 32710123cc1eSBram Moolenaar delete('XanotherScript') 32720123cc1eSBram Moolenaar set cpo&vim 32739ec7026fSBram Moolenaarenddef 32749ec7026fSBram Moolenaar 32759ec7026fSBram Moolenaar 3276f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3277cfcd011fSBram Moolenaar var lines =<< trim END 3278cfcd011fSBram Moolenaar var name: any 3279cfcd011fSBram Moolenaar assert_equal(0, name) 3280f0afd9e1SBram Moolenaar END 3281f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3282f0afd9e1SBram Moolenaarenddef 3283f0afd9e1SBram Moolenaar 32847e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 328558dbef33SBram Moolenaar CheckRunVimInTerminal 328658dbef33SBram Moolenaar 32877e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 32887e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 32897e9210eaSBram Moolenaarendfunc 32907e9210eaSBram Moolenaar 32917e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 32929c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3293cfcd011fSBram Moolenaar var lines =<< trim END 32949c4f5520SBram Moolenaar func CheckAndQuit() 32959c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 32969c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 32979c4f5520SBram Moolenaar endfunc 32989c4f5520SBram Moolenaar END 32999c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 33009c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3301e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 33029c4f5520SBram Moolenaar # define Afunc() on the command line 33039c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 33049c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 33052949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 33069c4f5520SBram Moolenaar 33079c4f5520SBram Moolenaar call StopVimInTerminal(buf) 33089c4f5520SBram Moolenaar delete('XcallFunc') 33099c4f5520SBram Moolenaar delete('Xdidcmd') 33109c4f5520SBram Moolenaarenddef 33119c4f5520SBram Moolenaar 3312fcdc5d83SBram Moolenaardef Test_script_var_scope() 3313fcdc5d83SBram Moolenaar var lines =<< trim END 3314fcdc5d83SBram Moolenaar vim9script 3315fcdc5d83SBram Moolenaar if true 3316fcdc5d83SBram Moolenaar if true 3317fcdc5d83SBram Moolenaar var one = 'one' 3318fcdc5d83SBram Moolenaar echo one 3319fcdc5d83SBram Moolenaar endif 3320fcdc5d83SBram Moolenaar echo one 3321fcdc5d83SBram Moolenaar endif 3322fcdc5d83SBram Moolenaar END 3323fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3324fcdc5d83SBram Moolenaar 3325fcdc5d83SBram Moolenaar lines =<< trim END 3326fcdc5d83SBram Moolenaar vim9script 3327fcdc5d83SBram Moolenaar if true 3328fcdc5d83SBram Moolenaar if false 3329fcdc5d83SBram Moolenaar var one = 'one' 3330fcdc5d83SBram Moolenaar echo one 3331fcdc5d83SBram Moolenaar else 3332fcdc5d83SBram Moolenaar var one = 'one' 3333fcdc5d83SBram Moolenaar echo one 3334fcdc5d83SBram Moolenaar endif 3335fcdc5d83SBram Moolenaar echo one 3336fcdc5d83SBram Moolenaar endif 3337fcdc5d83SBram Moolenaar END 3338fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3339fcdc5d83SBram Moolenaar 3340fcdc5d83SBram Moolenaar lines =<< trim END 3341fcdc5d83SBram Moolenaar vim9script 3342fcdc5d83SBram Moolenaar while true 3343fcdc5d83SBram Moolenaar var one = 'one' 3344fcdc5d83SBram Moolenaar echo one 3345fcdc5d83SBram Moolenaar break 3346fcdc5d83SBram Moolenaar endwhile 3347fcdc5d83SBram Moolenaar echo one 3348fcdc5d83SBram Moolenaar END 3349fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3350fcdc5d83SBram Moolenaar 3351fcdc5d83SBram Moolenaar lines =<< trim END 3352fcdc5d83SBram Moolenaar vim9script 3353fcdc5d83SBram Moolenaar for i in range(1) 3354fcdc5d83SBram Moolenaar var one = 'one' 3355fcdc5d83SBram Moolenaar echo one 3356fcdc5d83SBram Moolenaar endfor 3357fcdc5d83SBram Moolenaar echo one 3358fcdc5d83SBram Moolenaar END 3359fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 33609becdf2bSBram Moolenaar 33619becdf2bSBram Moolenaar lines =<< trim END 33629becdf2bSBram Moolenaar vim9script 33639becdf2bSBram Moolenaar { 33649becdf2bSBram Moolenaar var one = 'one' 33659becdf2bSBram Moolenaar assert_equal('one', one) 33669becdf2bSBram Moolenaar } 33679becdf2bSBram Moolenaar assert_false(exists('one')) 33689becdf2bSBram Moolenaar assert_false(exists('s:one')) 33699becdf2bSBram Moolenaar END 33709becdf2bSBram Moolenaar CheckScriptSuccess(lines) 33719becdf2bSBram Moolenaar 33729becdf2bSBram Moolenaar lines =<< trim END 33739becdf2bSBram Moolenaar vim9script 33749becdf2bSBram Moolenaar { 33759becdf2bSBram Moolenaar var one = 'one' 33769becdf2bSBram Moolenaar echo one 33779becdf2bSBram Moolenaar } 33789becdf2bSBram Moolenaar echo one 33799becdf2bSBram Moolenaar END 33809becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3381fcdc5d83SBram Moolenaarenddef 3382fcdc5d83SBram Moolenaar 3383352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3384352134bbSBram Moolenaar var lines =<< trim END 3385352134bbSBram Moolenaar vim9script 3386352134bbSBram Moolenaar def Callback(...l: any) 3387352134bbSBram Moolenaar try 3388352134bbSBram Moolenaar var x: string 3389352134bbSBram Moolenaar var y: string 3390352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3391352134bbSBram Moolenaar [x, y] = [''] 3392352134bbSBram Moolenaar catch 3393352134bbSBram Moolenaar g:caught = 'yes' 3394352134bbSBram Moolenaar endtry 3395352134bbSBram Moolenaar enddef 3396e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3397352134bbSBram Moolenaar feedkeys("\r", 'xt') 3398352134bbSBram Moolenaar END 3399352134bbSBram Moolenaar CheckScriptSuccess(lines) 3400352134bbSBram Moolenaar 3401352134bbSBram Moolenaar unlet g:caught 3402352134bbSBram Moolenaarenddef 3403352134bbSBram Moolenaar 3404631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3405631e8f93SBram Moolenaar if !has('unix') || !has('job') 3406631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3407631e8f93SBram Moolenaar endif 3408631e8f93SBram Moolenaar var lines =<< trim END 3409631e8f93SBram Moolenaar vim9script 3410631e8f93SBram Moolenaar var source: list<number> 3411631e8f93SBram Moolenaar def Out_cb(...l: any) 3412631e8f93SBram Moolenaar eval [][0] 3413631e8f93SBram Moolenaar enddef 3414631e8f93SBram Moolenaar def Exit_cb(...l: any) 3415631e8f93SBram Moolenaar sleep 1m 3416631e8f93SBram Moolenaar source += l 3417631e8f93SBram Moolenaar enddef 3418e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 34196f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 34206f17a3f0SBram Moolenaar sleep 10m 34216f17a3f0SBram Moolenaar endwhile 3422206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3423206c2a6eSBram Moolenaar sleep 100m 3424631e8f93SBram Moolenaar END 3425631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3426631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3427631e8f93SBram Moolenaar delete('Xdef') 3428631e8f93SBram Moolenaarenddef 3429631e8f93SBram Moolenaar 34304324d87aSBram Moolenaardef InvokeNormal() 34314324d87aSBram Moolenaar exe "norm! :m+1\r" 34324324d87aSBram Moolenaarenddef 34334324d87aSBram Moolenaar 34344324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 34354324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 34364324d87aSBram Moolenaar new 34374324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 34384324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 34394324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 34404324d87aSBram Moolenaar xunmap <F3> 3441b5b9480eSBram Moolenaarenddef 3442b5b9480eSBram Moolenaar 3443b5b9480eSBram Moolenaardef Test_white_space_after_command() 3444b5b9480eSBram Moolenaar var lines =<< trim END 3445b5b9480eSBram Moolenaar exit_cb: Func}) 3446b5b9480eSBram Moolenaar END 3447b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3448f8103f27SBram Moolenaar 3449f8103f27SBram Moolenaar lines =<< trim END 3450f8103f27SBram Moolenaar e# 3451f8103f27SBram Moolenaar END 3452f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 34534324d87aSBram Moolenaarenddef 34544324d87aSBram Moolenaar 34554aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 34564aab88d9SBram Moolenaar var lines =<< trim END 34574aab88d9SBram Moolenaar vim9script 34584aab88d9SBram Moolenaar if exists('g:guard') 34594aab88d9SBram Moolenaar finish 34604aab88d9SBram Moolenaar endif 34614aab88d9SBram Moolenaar g:guard = 1 34624aab88d9SBram Moolenaar var name = 'thename' 34634aab88d9SBram Moolenaar def g:GetName(): string 34644aab88d9SBram Moolenaar return name 34654aab88d9SBram Moolenaar enddef 34664aab88d9SBram Moolenaar def g:SetName(arg: string) 34674aab88d9SBram Moolenaar name = arg 34684aab88d9SBram Moolenaar enddef 34694aab88d9SBram Moolenaar END 34704aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 34714aab88d9SBram Moolenaar so XscriptTwice.vim 34724aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 34734aab88d9SBram Moolenaar g:SetName('newname') 34744aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34754aab88d9SBram Moolenaar so XscriptTwice.vim 34764aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34774aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34784aab88d9SBram Moolenaar 34794aab88d9SBram Moolenaar delfunc g:GetName 34804aab88d9SBram Moolenaar delfunc g:SetName 34814aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34824aab88d9SBram Moolenaar unlet g:guard 34834aab88d9SBram Moolenaarenddef 34844aab88d9SBram Moolenaar 34854aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 34864aab88d9SBram Moolenaar var exportlines =<< trim END 34874aab88d9SBram Moolenaar vim9script 34884aab88d9SBram Moolenaar if exists('g:guard') 34894aab88d9SBram Moolenaar finish 34904aab88d9SBram Moolenaar endif 34914aab88d9SBram Moolenaar g:guard = 1 34924aab88d9SBram Moolenaar export var name = 'someName' 34934aab88d9SBram Moolenaar END 34944aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 34954aab88d9SBram Moolenaar 34964aab88d9SBram Moolenaar var lines =<< trim END 34974aab88d9SBram Moolenaar vim9script 34984aab88d9SBram Moolenaar import name from './XexportScript.vim' 34994aab88d9SBram Moolenaar def g:GetName(): string 35004aab88d9SBram Moolenaar return name 35014aab88d9SBram Moolenaar enddef 35024aab88d9SBram Moolenaar END 35034aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 35044aab88d9SBram Moolenaar so XscriptImport.vim 35054aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 35064aab88d9SBram Moolenaar 35074aab88d9SBram Moolenaar so XexportScript.vim 35084aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 35094aab88d9SBram Moolenaar 35104aab88d9SBram Moolenaar delfunc g:GetName 35114aab88d9SBram Moolenaar delete('XexportScript.vim') 35124aab88d9SBram Moolenaar delete('XscriptImport.vim') 35134aab88d9SBram Moolenaar unlet g:guard 35144aab88d9SBram Moolenaarenddef 35154aab88d9SBram Moolenaar 351610b9421fSBram Moolenaardef Test_unsupported_commands() 351710b9421fSBram Moolenaar var lines =<< trim END 351810b9421fSBram Moolenaar ka 351910b9421fSBram Moolenaar END 352010b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 352110b9421fSBram Moolenaar 352210b9421fSBram Moolenaar lines =<< trim END 3523ada1d870SBram Moolenaar :1ka 3524ada1d870SBram Moolenaar END 3525ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3526ada1d870SBram Moolenaar 3527ada1d870SBram Moolenaar lines =<< trim END 352810b9421fSBram Moolenaar t 352910b9421fSBram Moolenaar END 353010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 353110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 353210b9421fSBram Moolenaar 353310b9421fSBram Moolenaar lines =<< trim END 353410b9421fSBram Moolenaar x 353510b9421fSBram Moolenaar END 353610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 353710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 353810b9421fSBram Moolenaar 353910b9421fSBram Moolenaar lines =<< trim END 354010b9421fSBram Moolenaar xit 354110b9421fSBram Moolenaar END 354210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 354310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 354410b9421fSBram Moolenaarenddef 354510b9421fSBram Moolenaar 3546585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3547585fea7bSBram Moolenaardef Test_substitute_cmd() 3548585fea7bSBram Moolenaar new 3549585fea7bSBram Moolenaar setline(1, 'something') 3550585fea7bSBram Moolenaar :substitute(some(other( 3551585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3552585fea7bSBram Moolenaar bwipe! 3553585fea7bSBram Moolenaar 3554f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3555cfcd011fSBram Moolenaar var lines =<< trim END 3556585fea7bSBram Moolenaar vim9script 3557585fea7bSBram Moolenaar new 3558585fea7bSBram Moolenaar setline(1, 'something') 3559585fea7bSBram Moolenaar :substitute(some(other( 3560585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3561585fea7bSBram Moolenaar bwipe! 3562585fea7bSBram Moolenaar END 3563585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3564585fea7bSBram Moolenaar source Xvim9lines 3565585fea7bSBram Moolenaar 3566585fea7bSBram Moolenaar delete('Xvim9lines') 3567585fea7bSBram Moolenaarenddef 3568585fea7bSBram Moolenaar 35698a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3570