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) 580*7e82c5f3SBram Moolenaar 581*7e82c5f3SBram Moolenaar # return in finally after empty catch 582*7e82c5f3SBram Moolenaar def ReturnInFinally(): number 583*7e82c5f3SBram Moolenaar try 584*7e82c5f3SBram Moolenaar finally 585*7e82c5f3SBram Moolenaar return 4 586*7e82c5f3SBram Moolenaar endtry 587*7e82c5f3SBram Moolenaar return 2 588*7e82c5f3SBram Moolenaar enddef 589*7e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5908a7d6542SBram Moolenaarenddef 5918a7d6542SBram Moolenaar 5921430ceebSBram Moolenaardef Test_cnext_works_in_catch() 5931430ceebSBram Moolenaar var lines =<< trim END 5941430ceebSBram Moolenaar vim9script 5951430ceebSBram Moolenaar au BufEnter * eval 0 5961430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 5971430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 5981430ceebSBram Moolenaar var items = [ 5991430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6001430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6011430ceebSBram Moolenaar ] 6021430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6031430ceebSBram Moolenaar cwindow 6041430ceebSBram Moolenaar 6051430ceebSBram Moolenaar def CnextOrCfirst() 6061430ceebSBram Moolenaar # if cnext fails, cfirst is used 6071430ceebSBram Moolenaar try 6081430ceebSBram Moolenaar cnext 6091430ceebSBram Moolenaar catch 6101430ceebSBram Moolenaar cfirst 6111430ceebSBram Moolenaar endtry 6121430ceebSBram Moolenaar enddef 6131430ceebSBram Moolenaar 6141430ceebSBram Moolenaar CnextOrCfirst() 6151430ceebSBram Moolenaar CnextOrCfirst() 6161430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6171430ceebSBram Moolenaar qall 6181430ceebSBram Moolenaar END 6191430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6201430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6211430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6221430ceebSBram Moolenaar 6231430ceebSBram Moolenaar delete('Xfile1') 6241430ceebSBram Moolenaar delete('Xfile2') 6251430ceebSBram Moolenaar delete('XCatchCnext') 6261430ceebSBram Moolenaar delete('Xresult') 6271430ceebSBram Moolenaarenddef 6281430ceebSBram Moolenaar 6299e1d9e34SBram Moolenaardef Test_throw_skipped() 6309e1d9e34SBram Moolenaar if 0 6319e1d9e34SBram Moolenaar throw dontgethere 6329e1d9e34SBram Moolenaar endif 6339e1d9e34SBram Moolenaarenddef 6349e1d9e34SBram Moolenaar 6358f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6368f81b22eSBram Moolenaar var lines =<< trim END 6378f81b22eSBram Moolenaar vim9script 6388f81b22eSBram Moolenaar def Func() 6398f81b22eSBram Moolenaar throw 'error' 6408f81b22eSBram Moolenaar enddef 6418f81b22eSBram Moolenaar silent! Func() 6428f81b22eSBram Moolenaar END 6438f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6448f81b22eSBram Moolenaar source XthrowSilenced 6458f81b22eSBram Moolenaar delete('XthrowSilenced') 6468f81b22eSBram Moolenaarenddef 6478f81b22eSBram Moolenaar 648e859312eSBram Moolenaardef DeletedFunc(): list<any> 649e859312eSBram Moolenaar return ['delete me'] 650e859312eSBram Moolenaarenddef 651e859312eSBram Moolenaardefcompile 652e859312eSBram Moolenaardelfunc DeletedFunc 653e859312eSBram Moolenaar 654257cc5eeSBram Moolenaardef ThrowFromDef() 655a72cfb80SBram Moolenaar throw "getout" # comment 656257cc5eeSBram Moolenaarenddef 657257cc5eeSBram Moolenaar 658257cc5eeSBram Moolenaarfunc CatchInFunc() 659257cc5eeSBram Moolenaar try 660257cc5eeSBram Moolenaar call ThrowFromDef() 661257cc5eeSBram Moolenaar catch 662257cc5eeSBram Moolenaar let g:thrown_func = v:exception 663257cc5eeSBram Moolenaar endtry 664257cc5eeSBram Moolenaarendfunc 665257cc5eeSBram Moolenaar 666257cc5eeSBram Moolenaardef CatchInDef() 667257cc5eeSBram Moolenaar try 668257cc5eeSBram Moolenaar ThrowFromDef() 669257cc5eeSBram Moolenaar catch 670257cc5eeSBram Moolenaar g:thrown_def = v:exception 671257cc5eeSBram Moolenaar endtry 672257cc5eeSBram Moolenaarenddef 673257cc5eeSBram Moolenaar 674f575adffSBram Moolenaardef ReturnFinally(): string 675f575adffSBram Moolenaar try 676f575adffSBram Moolenaar return 'intry' 677373863edSBram Moolenaar finall 678f575adffSBram Moolenaar g:in_finally = 'finally' 679f575adffSBram Moolenaar endtry 680f575adffSBram Moolenaar return 'end' 681f575adffSBram Moolenaarenddef 682f575adffSBram Moolenaar 683257cc5eeSBram Moolenaardef Test_try_catch_nested() 684257cc5eeSBram Moolenaar CatchInFunc() 685257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 686257cc5eeSBram Moolenaar 687257cc5eeSBram Moolenaar CatchInDef() 688257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 689f575adffSBram Moolenaar 690f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 691f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 692f575adffSBram Moolenaarenddef 693f575adffSBram Moolenaar 6949939f57bSBram Moolenaardef TryOne(): number 6959939f57bSBram Moolenaar try 6969939f57bSBram Moolenaar return 0 6979939f57bSBram Moolenaar catch 6989939f57bSBram Moolenaar endtry 6999939f57bSBram Moolenaar return 0 7009939f57bSBram Moolenaarenddef 7019939f57bSBram Moolenaar 7029939f57bSBram Moolenaardef TryTwo(n: number): string 7039939f57bSBram Moolenaar try 704cfcd011fSBram Moolenaar var x = {} 7059939f57bSBram Moolenaar catch 7069939f57bSBram Moolenaar endtry 7079939f57bSBram Moolenaar return 'text' 7089939f57bSBram Moolenaarenddef 7099939f57bSBram Moolenaar 7109939f57bSBram Moolenaardef Test_try_catch_twice() 7119939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7129939f57bSBram Moolenaarenddef 7139939f57bSBram Moolenaar 714f575adffSBram Moolenaardef Test_try_catch_match() 715cfcd011fSBram Moolenaar var seq = 'a' 716f575adffSBram Moolenaar try 717f575adffSBram Moolenaar throw 'something' 718f575adffSBram Moolenaar catch /nothing/ 719f575adffSBram Moolenaar seq ..= 'x' 720f575adffSBram Moolenaar catch /some/ 721f575adffSBram Moolenaar seq ..= 'b' 722f575adffSBram Moolenaar catch /asdf/ 723f575adffSBram Moolenaar seq ..= 'x' 724e8c4abbbSBram Moolenaar catch ?a\?sdf? 725e8c4abbbSBram Moolenaar seq ..= 'y' 726f575adffSBram Moolenaar finally 727f575adffSBram Moolenaar seq ..= 'c' 728f575adffSBram Moolenaar endtry 729f575adffSBram Moolenaar assert_equal('abc', seq) 730257cc5eeSBram Moolenaarenddef 731257cc5eeSBram Moolenaar 732e8c4abbbSBram Moolenaardef Test_try_catch_fails() 733d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 734d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 735d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 736d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 737d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 738d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 739d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 740d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 74113106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 742d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 743585fea7bSBram Moolenaar 744e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 745d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 746e8c4abbbSBram Moolenaarenddef 747e8c4abbbSBram Moolenaar 7487c5b3c03SBram Moolenaardef Try_catch_skipped() 7497c5b3c03SBram Moolenaar var l = [] 7507c5b3c03SBram Moolenaar try 7517c5b3c03SBram Moolenaar finally 7527c5b3c03SBram Moolenaar endtry 7537c5b3c03SBram Moolenaar 7547c5b3c03SBram Moolenaar if 1 7557c5b3c03SBram Moolenaar else 7567c5b3c03SBram Moolenaar try 7577c5b3c03SBram Moolenaar endtry 7587c5b3c03SBram Moolenaar endif 7597c5b3c03SBram Moolenaarenddef 7607c5b3c03SBram Moolenaar 7617c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7627c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7637c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7647c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7657c5b3c03SBram Moolenaarenddef 7667c5b3c03SBram Moolenaar 7677c5b3c03SBram Moolenaar 7687c5b3c03SBram Moolenaar 769006ad48bSBram Moolenaardef Test_throw_vimscript() 770f5be8cdbSBram Moolenaar # only checks line continuation 771cfcd011fSBram Moolenaar var lines =<< trim END 772006ad48bSBram Moolenaar vim9script 773006ad48bSBram Moolenaar try 774006ad48bSBram Moolenaar throw 'one' 775006ad48bSBram Moolenaar .. 'two' 776006ad48bSBram Moolenaar catch 777006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 778006ad48bSBram Moolenaar endtry 779006ad48bSBram Moolenaar END 780006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7811e021e63SBram Moolenaar 7821e021e63SBram Moolenaar lines =<< trim END 7831e021e63SBram Moolenaar vim9script 784352134bbSBram Moolenaar @r = '' 7851e021e63SBram Moolenaar def Func() 7861e021e63SBram Moolenaar throw @r 7871e021e63SBram Moolenaar enddef 7881e021e63SBram Moolenaar var result = '' 7891e021e63SBram Moolenaar try 7901e021e63SBram Moolenaar Func() 7911e021e63SBram Moolenaar catch /E1129:/ 7921e021e63SBram Moolenaar result = 'caught' 7931e021e63SBram Moolenaar endtry 7941e021e63SBram Moolenaar assert_equal('caught', result) 7951e021e63SBram Moolenaar END 7961e021e63SBram Moolenaar CheckScriptSuccess(lines) 797006ad48bSBram Moolenaarenddef 798006ad48bSBram Moolenaar 799ed677f55SBram Moolenaardef Test_error_in_nested_function() 80003dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 801cfcd011fSBram Moolenaar var lines =<< trim END 802ed677f55SBram Moolenaar vim9script 803ed677f55SBram Moolenaar def Func() 804ed677f55SBram Moolenaar Error() 805ed677f55SBram Moolenaar g:test_var = 1 806ed677f55SBram Moolenaar enddef 807ed677f55SBram Moolenaar func Error() abort 808ed677f55SBram Moolenaar eval [][0] 809ed677f55SBram Moolenaar endfunc 810ed677f55SBram Moolenaar Func() 811ed677f55SBram Moolenaar END 812ed677f55SBram Moolenaar g:test_var = 0 813ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 814ed677f55SBram Moolenaar assert_equal(0, g:test_var) 815ed677f55SBram Moolenaarenddef 816ed677f55SBram Moolenaar 81737c83711SBram Moolenaardef Test_cexpr_vimscript() 818f5be8cdbSBram Moolenaar # only checks line continuation 81937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 820cfcd011fSBram Moolenaar var lines =<< trim END 82137c83711SBram Moolenaar vim9script 82237c83711SBram Moolenaar cexpr 'File' 82337c83711SBram Moolenaar .. ' someFile' .. 82437c83711SBram Moolenaar ' line 19' 82537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 82637c83711SBram Moolenaar END 82737c83711SBram Moolenaar CheckScriptSuccess(lines) 82837c83711SBram Moolenaar set errorformat& 82937c83711SBram Moolenaarenddef 83037c83711SBram Moolenaar 831c9edd6b5SBram Moolenaardef Test_statusline_syntax() 832c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 833cfcd011fSBram Moolenaar var lines =<< trim END 834c9edd6b5SBram Moolenaar vim9script 835c9edd6b5SBram Moolenaar func g:Status() 836c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 837c9edd6b5SBram Moolenaar endfunc 838c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 839c9edd6b5SBram Moolenaar redrawstatus 840c9edd6b5SBram Moolenaar set laststatus statusline= 841c9edd6b5SBram Moolenaar END 842c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 843c9edd6b5SBram Moolenaarenddef 844c9edd6b5SBram Moolenaar 845b209750bSBram Moolenaardef Test_list_vimscript() 846b209750bSBram Moolenaar # checks line continuation and comments 847cfcd011fSBram Moolenaar var lines =<< trim END 848b209750bSBram Moolenaar vim9script 849cfcd011fSBram Moolenaar var mylist = [ 850b209750bSBram Moolenaar 'one', 851b209750bSBram Moolenaar # comment 852b209750bSBram Moolenaar 'two', # empty line follows 853b209750bSBram Moolenaar 854b209750bSBram Moolenaar 'three', 855b209750bSBram Moolenaar ] 856b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 857b209750bSBram Moolenaar END 858b209750bSBram Moolenaar CheckScriptSuccess(lines) 85966250c93SBram Moolenaar 86066250c93SBram Moolenaar # check all lines from heredoc are kept 86166250c93SBram Moolenaar lines =<< trim END 86266250c93SBram Moolenaar # comment 1 86366250c93SBram Moolenaar two 86466250c93SBram Moolenaar # comment 3 86566250c93SBram Moolenaar 86666250c93SBram Moolenaar five 86766250c93SBram Moolenaar # comment 6 86866250c93SBram Moolenaar END 86966250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8704bce26bbSBram Moolenaar 8714bce26bbSBram Moolenaar lines =<< trim END 8724bce26bbSBram Moolenaar [{ 8734bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8744bce26bbSBram Moolenaar END 8754bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 876b209750bSBram Moolenaarenddef 877b209750bSBram Moolenaar 8782a1381c3SBram Moolenaarif has('channel') 87940ee466cSBram Moolenaar let someJob = test_null_job() 88040ee466cSBram Moolenaar 88140ee466cSBram Moolenaar def FuncWithError() 88240ee466cSBram Moolenaar echomsg g:someJob 88340ee466cSBram Moolenaar enddef 88440ee466cSBram Moolenaar 88540ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 88640ee466cSBram Moolenaar try 88740ee466cSBram Moolenaar call FuncWithError() 88840ee466cSBram Moolenaar catch 88940ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 89040ee466cSBram Moolenaar endtry 89140ee466cSBram Moolenaar endfunc 8922a1381c3SBram Moolenaarendif 89340ee466cSBram Moolenaar 8948a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8958a7d6542SBram Moolenaar vim9script 896cfcd011fSBram Moolenaar var name: string = 'bob' 8978a7d6542SBram Moolenaar def Concat(arg: string): string 8988a7d6542SBram Moolenaar return name .. arg 8998a7d6542SBram Moolenaar enddef 900227a69deSBram Moolenaar g:result = Concat('bie') 901227a69deSBram Moolenaar g:localname = name 9028a7d6542SBram Moolenaar 9038a7d6542SBram Moolenaar export const CONST = 1234 904cfcd011fSBram Moolenaar export var exported = 9876 905cfcd011fSBram Moolenaar export var exp_name = 'John' 9068a7d6542SBram Moolenaar export def Exported(): string 9078a7d6542SBram Moolenaar return 'Exported' 9088a7d6542SBram Moolenaar enddef 9098a7d6542SBram MoolenaarEND 9108a7d6542SBram Moolenaar 911b3ca9824SBram Moolenaardef Undo_export_script_lines() 912b3ca9824SBram Moolenaar unlet g:result 913b3ca9824SBram Moolenaar unlet g:localname 914b3ca9824SBram Moolenaarenddef 915b3ca9824SBram Moolenaar 9165269bd2aSBram Moolenaardef Test_vim9_import_export() 917cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9188a7d6542SBram Moolenaar vim9script 9198a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9208a7d6542SBram Moolenaar g:imported = exported 9216e587dcbSBram Moolenaar exported += 3 9226e587dcbSBram Moolenaar g:imported_added = exported 9238a7d6542SBram Moolenaar g:imported_func = Exported() 9246e587dcbSBram Moolenaar 92540f4f7a4SBram Moolenaar def GetExported(): string 926e0de171eSBram Moolenaar var local_dict = {ref: Exported} 92740f4f7a4SBram Moolenaar return local_dict.ref() 92840f4f7a4SBram Moolenaar enddef 92940f4f7a4SBram Moolenaar g:funcref_result = GetExported() 93040f4f7a4SBram Moolenaar 9316e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9326e587dcbSBram Moolenaar g:imported_name = exp_name 9336e587dcbSBram Moolenaar exp_name ..= ' Doe' 9346e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9355381c7a1SBram Moolenaar g:imported_later = exported 9368a7d6542SBram Moolenaar END 9378a7d6542SBram Moolenaar 9388a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9398a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9408a7d6542SBram Moolenaar 9418a7d6542SBram Moolenaar source Ximport.vim 9428a7d6542SBram Moolenaar 9438a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9448a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9458a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9466e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9475381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9488a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 94940f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9506e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9516e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9528a7d6542SBram Moolenaar assert_false(exists('g:name')) 9538a7d6542SBram Moolenaar 954b3ca9824SBram Moolenaar Undo_export_script_lines() 9558a7d6542SBram Moolenaar unlet g:imported 9566e587dcbSBram Moolenaar unlet g:imported_added 9575381c7a1SBram Moolenaar unlet g:imported_later 9588a7d6542SBram Moolenaar unlet g:imported_func 9596e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9608a7d6542SBram Moolenaar delete('Ximport.vim') 961f2d5c240SBram Moolenaar 9621c991144SBram Moolenaar # similar, with line breaks 963cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9641c991144SBram Moolenaar vim9script 9651c991144SBram Moolenaar import { 9661c991144SBram Moolenaar exported, 9671c991144SBram Moolenaar Exported, 9681c991144SBram Moolenaar } 9691c991144SBram Moolenaar from 9701c991144SBram Moolenaar './Xexport.vim' 9711c991144SBram Moolenaar g:imported = exported 9721c991144SBram Moolenaar exported += 5 9731c991144SBram Moolenaar g:imported_added = exported 9741c991144SBram Moolenaar g:imported_func = Exported() 9751c991144SBram Moolenaar END 9761c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9771c991144SBram Moolenaar source Ximport_lbr.vim 9781c991144SBram Moolenaar 9791c991144SBram Moolenaar assert_equal(9876, g:imported) 9801c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9811c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9821c991144SBram Moolenaar 9831c991144SBram Moolenaar # exported script not sourced again 9841c991144SBram Moolenaar assert_false(exists('g:result')) 9851c991144SBram Moolenaar unlet g:imported 9861c991144SBram Moolenaar unlet g:imported_added 9871c991144SBram Moolenaar unlet g:imported_func 9881c991144SBram Moolenaar delete('Ximport_lbr.vim') 9891c991144SBram Moolenaar 9901c991144SBram Moolenaar # import inside :def function 991cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9925381c7a1SBram Moolenaar vim9script 9935381c7a1SBram Moolenaar def ImportInDef() 9945381c7a1SBram Moolenaar import exported from './Xexport.vim' 9955381c7a1SBram Moolenaar g:imported = exported 9965381c7a1SBram Moolenaar exported += 7 9975381c7a1SBram Moolenaar g:imported_added = exported 9985381c7a1SBram Moolenaar enddef 9995381c7a1SBram Moolenaar ImportInDef() 10005381c7a1SBram Moolenaar END 10015381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10025381c7a1SBram Moolenaar source Ximport2.vim 1003f5be8cdbSBram Moolenaar # TODO: this should be 9879 10045381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10055381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10065381c7a1SBram Moolenaar unlet g:imported 10075381c7a1SBram Moolenaar unlet g:imported_added 10085381c7a1SBram Moolenaar delete('Ximport2.vim') 10095381c7a1SBram Moolenaar 1010cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1011f2d5c240SBram Moolenaar vim9script 1012f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1013f2d5c240SBram Moolenaar def UseExport() 1014f2d5c240SBram Moolenaar g:imported = Export.exported 1015f2d5c240SBram Moolenaar enddef 1016f2d5c240SBram Moolenaar UseExport() 1017f2d5c240SBram Moolenaar END 1018f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1019f2d5c240SBram Moolenaar source Ximport.vim 10205381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1021f2d5c240SBram Moolenaar 1022cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1023599c89c8SBram Moolenaar vim9script 1024599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1025599c89c8SBram Moolenaar def Func() 1026cfcd011fSBram Moolenaar var dummy = 1 1027cfcd011fSBram Moolenaar var imported = Export + dummy 1028599c89c8SBram Moolenaar enddef 1029822ba247SBram Moolenaar defcompile 1030599c89c8SBram Moolenaar END 1031599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 103244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1033599c89c8SBram Moolenaar 1034cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1035599c89c8SBram Moolenaar vim9script 1036599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1037599c89c8SBram Moolenaar def Func() 1038cfcd011fSBram Moolenaar var imported = Export . exported 1039599c89c8SBram Moolenaar enddef 1040822ba247SBram Moolenaar defcompile 1041599c89c8SBram Moolenaar END 1042599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 104344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1044599c89c8SBram Moolenaar 1045a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1046a6294955SBram Moolenaar vim9script 1047a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1048a6294955SBram Moolenaar var some = 'other' 1049a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1050a6294955SBram Moolenaar defcompile 1051a6294955SBram Moolenaar END 1052a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1053a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1054a6294955SBram Moolenaar 1055cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1056599c89c8SBram Moolenaar vim9script 1057599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1058599c89c8SBram Moolenaar def Func() 1059cfcd011fSBram Moolenaar var imported = Export. 1060599c89c8SBram Moolenaar enddef 1061822ba247SBram Moolenaar defcompile 1062599c89c8SBram Moolenaar END 1063599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 106444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1065599c89c8SBram Moolenaar 1066cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10671c991144SBram Moolenaar vim9script 10681c991144SBram Moolenaar import * 10691c991144SBram Moolenaar as Export 10701c991144SBram Moolenaar from 10711c991144SBram Moolenaar './Xexport.vim' 10721c991144SBram Moolenaar def UseExport() 10731c991144SBram Moolenaar g:imported = Export.exported 10741c991144SBram Moolenaar enddef 10751c991144SBram Moolenaar UseExport() 10761c991144SBram Moolenaar END 10771c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10781c991144SBram Moolenaar source Ximport.vim 10791c991144SBram Moolenaar assert_equal(9883, g:imported) 10801c991144SBram Moolenaar 1081cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1082f2d5c240SBram Moolenaar vim9script 1083f2d5c240SBram Moolenaar import * from './Xexport.vim' 1084f2d5c240SBram Moolenaar END 1085f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 108644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1087f2d5c240SBram Moolenaar 1088f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1089cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1090fa29c8abSBram Moolenaar vim9script 1091fa29c8abSBram Moolenaar import name from './Xexport.vim' 1092fa29c8abSBram Moolenaar END 1093fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 109444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1095fa29c8abSBram Moolenaar 1096f5be8cdbSBram Moolenaar # try to import something that is already defined 1097cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10985269bd2aSBram Moolenaar vim9script 1099cfcd011fSBram Moolenaar var exported = 'something' 11005269bd2aSBram Moolenaar import exported from './Xexport.vim' 11015269bd2aSBram Moolenaar END 11025269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 110344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11045269bd2aSBram Moolenaar 1105f5be8cdbSBram Moolenaar # try to import something that is already defined 11065269bd2aSBram Moolenaar import_already_defined =<< trim END 11075269bd2aSBram Moolenaar vim9script 1108cfcd011fSBram Moolenaar var exported = 'something' 11095269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11105269bd2aSBram Moolenaar END 11115269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 111244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11135269bd2aSBram Moolenaar 1114f5be8cdbSBram Moolenaar # try to import something that is already defined 11155269bd2aSBram Moolenaar import_already_defined =<< trim END 11165269bd2aSBram Moolenaar vim9script 1117cfcd011fSBram Moolenaar var exported = 'something' 11185269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11195269bd2aSBram Moolenaar END 11205269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 112144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11225269bd2aSBram Moolenaar 1123918a4249SBram Moolenaar # try changing an imported const 1124918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1125918a4249SBram Moolenaar vim9script 1126918a4249SBram Moolenaar import CONST from './Xexport.vim' 1127918a4249SBram Moolenaar def Assign() 1128918a4249SBram Moolenaar CONST = 987 1129918a4249SBram Moolenaar enddef 1130918a4249SBram Moolenaar defcompile 1131918a4249SBram Moolenaar END 1132918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1133918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1134918a4249SBram Moolenaar 1135f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1136cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1137fa29c8abSBram Moolenaar vim9script 1138fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1139fa29c8abSBram Moolenaar END 1140fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 114144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1142fa29c8abSBram Moolenaar 1143cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1144fa29c8abSBram Moolenaar vim9script 1145fa29c8abSBram Moolenaar import name './Xexport.vim' 1146fa29c8abSBram Moolenaar END 1147fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 114844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1149fa29c8abSBram Moolenaar 1150cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1151fa29c8abSBram Moolenaar vim9script 1152fa29c8abSBram Moolenaar import name from Xexport.vim 1153fa29c8abSBram Moolenaar END 1154fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 115544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1156fa29c8abSBram Moolenaar 1157cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1158fa29c8abSBram Moolenaar vim9script 1159fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1160fa29c8abSBram Moolenaar END 1161fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 116244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1163fa29c8abSBram Moolenaar 1164cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1165fa29c8abSBram Moolenaar vim9script 1166fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1167fa29c8abSBram Moolenaar END 11685269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 116944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1170fa29c8abSBram Moolenaar 1171f2d5c240SBram Moolenaar delete('Ximport.vim') 11725269bd2aSBram Moolenaar delete('Ximport3.vim') 11738a7d6542SBram Moolenaar delete('Xexport.vim') 11748a7d6542SBram Moolenaar 1175f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1176750802b5SBram Moolenaar set cpo&vi 1177cfcd011fSBram Moolenaar var cpo_before = &cpo 1178cfcd011fSBram Moolenaar var lines =<< trim END 1179750802b5SBram Moolenaar vim9script 1180750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1181750802b5SBram Moolenaar END 1182750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1183750802b5SBram Moolenaar source Xvim9_script 1184750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1185750802b5SBram Moolenaar set cpo&vim 1186750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1187750802b5SBram Moolenaar delete('Xvim9_script') 1188750802b5SBram Moolenaarenddef 1189750802b5SBram Moolenaar 1190803af686SBram Moolenaarfunc g:Trigger() 1191803af686SBram Moolenaar source Ximport.vim 1192803af686SBram Moolenaar return "echo 'yes'\<CR>" 1193803af686SBram Moolenaarendfunc 1194803af686SBram Moolenaar 1195803af686SBram Moolenaardef Test_import_export_expr_map() 1196803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1197cfcd011fSBram Moolenaar var export_lines =<< trim END 1198803af686SBram Moolenaar vim9script 1199803af686SBram Moolenaar export def That(): string 1200803af686SBram Moolenaar return 'yes' 1201803af686SBram Moolenaar enddef 1202803af686SBram Moolenaar END 1203803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1204803af686SBram Moolenaar 1205cfcd011fSBram Moolenaar var import_lines =<< trim END 1206803af686SBram Moolenaar vim9script 1207803af686SBram Moolenaar import That from './Xexport_that.vim' 1208803af686SBram Moolenaar assert_equal('yes', That()) 1209803af686SBram Moolenaar END 1210803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1211803af686SBram Moolenaar 1212803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1213803af686SBram Moolenaar feedkeys('trigger', "xt") 1214803af686SBram Moolenaar 1215730b2483SBram Moolenaar delete('Xexport_that.vim') 1216803af686SBram Moolenaar delete('Ximport.vim') 1217803af686SBram Moolenaar nunmap trigger 1218803af686SBram Moolenaarenddef 1219803af686SBram Moolenaar 12208e1986e3SBram Moolenaardef Test_import_in_filetype() 12218e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12228e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1223cfcd011fSBram Moolenaar var export_lines =<< trim END 12248e1986e3SBram Moolenaar vim9script 1225cfcd011fSBram Moolenaar export var That = 'yes' 12268e1986e3SBram Moolenaar END 1227730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12288e1986e3SBram Moolenaar 1229cfcd011fSBram Moolenaar var import_lines =<< trim END 12308e1986e3SBram Moolenaar vim9script 1231730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12328e1986e3SBram Moolenaar assert_equal('yes', That) 12338e1986e3SBram Moolenaar g:did_load_mytpe = 1 12348e1986e3SBram Moolenaar END 12358e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12368e1986e3SBram Moolenaar 1237cfcd011fSBram Moolenaar var save_rtp = &rtp 12388e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 12398e1986e3SBram Moolenaar 12408e1986e3SBram Moolenaar filetype plugin on 12418e1986e3SBram Moolenaar copen 12428e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12438e1986e3SBram Moolenaar 12448e1986e3SBram Moolenaar quit! 1245730b2483SBram Moolenaar delete('Xexport_ft.vim') 12468e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12478e1986e3SBram Moolenaar &rtp = save_rtp 12488e1986e3SBram Moolenaarenddef 12498e1986e3SBram Moolenaar 1250efa94447SBram Moolenaardef Test_use_import_in_mapping() 1251cfcd011fSBram Moolenaar var lines =<< trim END 1252efa94447SBram Moolenaar vim9script 1253efa94447SBram Moolenaar export def Funcx() 1254efa94447SBram Moolenaar g:result = 42 1255efa94447SBram Moolenaar enddef 1256efa94447SBram Moolenaar END 1257efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1258efa94447SBram Moolenaar lines =<< trim END 1259efa94447SBram Moolenaar vim9script 1260efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1261b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1262efa94447SBram Moolenaar END 1263efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1264efa94447SBram Moolenaar 1265efa94447SBram Moolenaar source Xmapscript.vim 1266b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1267efa94447SBram Moolenaar assert_equal(42, g:result) 1268efa94447SBram Moolenaar 1269efa94447SBram Moolenaar unlet g:result 1270efa94447SBram Moolenaar delete('XsomeExport.vim') 1271efa94447SBram Moolenaar delete('Xmapscript.vim') 1272b3ca9824SBram Moolenaar nunmap <F3> 1273efa94447SBram Moolenaarenddef 1274efa94447SBram Moolenaar 1275d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1276d3f8a9eeSBram Moolenaar var lines =<< trim END 1277d3f8a9eeSBram Moolenaar if has(g:feature) 1278d3f8a9eeSBram Moolenaar " legacy script 1279d3f8a9eeSBram Moolenaar let g:legacy = 1 1280d3f8a9eeSBram Moolenaar finish 1281d3f8a9eeSBram Moolenaar endif 1282d3f8a9eeSBram Moolenaar vim9script 1283d3f8a9eeSBram Moolenaar g:legacy = 0 1284d3f8a9eeSBram Moolenaar END 1285d3f8a9eeSBram Moolenaar g:feature = 'eval' 1286d3f8a9eeSBram Moolenaar g:legacy = -1 1287d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1288d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1289d3f8a9eeSBram Moolenaar 1290d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1291d3f8a9eeSBram Moolenaar g:legacy = -1 1292d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1293d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1294d3f8a9eeSBram Moolenaarenddef 1295d3f8a9eeSBram Moolenaar 1296750802b5SBram Moolenaardef Test_vim9script_fails() 12978a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12988a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1299cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 13009721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1301cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1302750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1303750802b5SBram Moolenaar 1304cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1305c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1306c785b9a7SBram Moolenaar 1307e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1308e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 13098a7d6542SBram Moolenaarenddef 13108a7d6542SBram Moolenaar 1311f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1312101f4810SBram Moolenaar CheckRunVimInTerminal 1313101f4810SBram Moolenaar 13149bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1315c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13169bb3eb3eSBram Moolenaarendfunc 13179bb3eb3eSBram Moolenaar 1318c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1319cfcd011fSBram Moolenaar var export =<< trim END 1320101f4810SBram Moolenaar vim9script 1321101f4810SBram Moolenaar export def Foo(): number 1322101f4810SBram Moolenaar return 0 1323101f4810SBram Moolenaar enddef 1324101f4810SBram Moolenaar END 1325730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1326101f4810SBram Moolenaar 1327e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 13289bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13292949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1330101f4810SBram Moolenaar 1331730b2483SBram Moolenaar delete('XexportCmd.vim') 13329bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13339bb3eb3eSBram Moolenaarenddef 1334101f4810SBram Moolenaar 13352b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13362b32700dSBram Moolenaar var lines =<< trim END 1337a6294955SBram Moolenaar vim9script 1338a6294955SBram Moolenaar export var exported = 'thexport' 1339a6294955SBram Moolenaar END 1340a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1341a6294955SBram Moolenaar lines =<< trim END 13422b32700dSBram Moolenaar vim9script noclear 13432b32700dSBram Moolenaar g:loadCount += 1 13442b32700dSBram Moolenaar var s:reloaded = 'init' 1345a6294955SBram Moolenaar import exported from './XExportReload' 13462b32700dSBram Moolenaar 13472b32700dSBram Moolenaar def Again(): string 13482b32700dSBram Moolenaar return 'again' 13492b32700dSBram Moolenaar enddef 13502b32700dSBram Moolenaar 13512b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 13522b32700dSBram Moolenaar var s:loaded = true 13532b32700dSBram Moolenaar 13542b32700dSBram Moolenaar var s:notReloaded = 'yes' 13552b32700dSBram Moolenaar s:reloaded = 'first' 13562b32700dSBram Moolenaar def g:Values(): list<string> 1357a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 13582b32700dSBram Moolenaar enddef 13592b32700dSBram Moolenaar 13602b32700dSBram Moolenaar def Once(): string 13612b32700dSBram Moolenaar return 'once' 13622b32700dSBram Moolenaar enddef 13632b32700dSBram Moolenaar END 13642b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13652b32700dSBram Moolenaar g:loadCount = 0 13662b32700dSBram Moolenaar source XReloaded 13672b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1368a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13692b32700dSBram Moolenaar source XReloaded 13702b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1371a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13722b32700dSBram Moolenaar source XReloaded 13732b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1374a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13752b32700dSBram Moolenaar 137648e11c10SBram Moolenaar delete('XReloaded') 1377a6294955SBram Moolenaar delete('XExportReload') 13782b32700dSBram Moolenaar delfunc g:Values 13792b32700dSBram Moolenaar unlet g:loadCount 13802b32700dSBram Moolenaarenddef 13812b32700dSBram Moolenaar 13824c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1383cfcd011fSBram Moolenaar var lines =<< trim END 13848a7d6542SBram Moolenaar vim9script 13858a7d6542SBram Moolenaar const var = '' 1386cfcd011fSBram Moolenaar var valone = 1234 13878a7d6542SBram Moolenaar def MyFunc(arg: string) 13888a7d6542SBram Moolenaar valone = 5678 13898a7d6542SBram Moolenaar enddef 13908a7d6542SBram Moolenaar END 1391cfcd011fSBram Moolenaar var morelines =<< trim END 1392cfcd011fSBram Moolenaar var valtwo = 222 13938a7d6542SBram Moolenaar export def GetValtwo(): number 13948a7d6542SBram Moolenaar return valtwo 13958a7d6542SBram Moolenaar enddef 13968a7d6542SBram Moolenaar END 139703afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13988a7d6542SBram Moolenaar source Xreload.vim 13998a7d6542SBram Moolenaar source Xreload.vim 14008a7d6542SBram Moolenaar source Xreload.vim 14018a7d6542SBram Moolenaar 1402cfcd011fSBram Moolenaar var testlines =<< trim END 14038a7d6542SBram Moolenaar vim9script 14048a7d6542SBram Moolenaar def TheFunc() 14058a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14068a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14078a7d6542SBram Moolenaar enddef 14088a7d6542SBram Moolenaar TheFunc() 14098a7d6542SBram Moolenaar END 14108a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14118a7d6542SBram Moolenaar source Ximport.vim 14128a7d6542SBram Moolenaar 1413f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1414f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14158a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14168a7d6542SBram Moolenaar source Ximport.vim 14178a7d6542SBram Moolenaar 1418f5be8cdbSBram Moolenaar # cannot declare a var twice 14198a7d6542SBram Moolenaar lines =<< trim END 14208a7d6542SBram Moolenaar vim9script 1421cfcd011fSBram Moolenaar var valone = 1234 1422cfcd011fSBram Moolenaar var valone = 5678 14238a7d6542SBram Moolenaar END 14248a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 142544d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 14268a7d6542SBram Moolenaar 14278a7d6542SBram Moolenaar delete('Xreload.vim') 14288a7d6542SBram Moolenaar delete('Ximport.vim') 14298a7d6542SBram Moolenaarenddef 14308a7d6542SBram Moolenaar 143107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 143207a65d26SBram Moolenaar" compiled function using that variable must fail. 143307a65d26SBram Moolenaardef Test_script_reload_change_type() 143407a65d26SBram Moolenaar var lines =<< trim END 143507a65d26SBram Moolenaar vim9script noclear 143607a65d26SBram Moolenaar var str = 'string' 143707a65d26SBram Moolenaar def g:GetStr(): string 143807a65d26SBram Moolenaar return str .. 'xxx' 143907a65d26SBram Moolenaar enddef 144007a65d26SBram Moolenaar END 144107a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 144207a65d26SBram Moolenaar source Xreload.vim 144307a65d26SBram Moolenaar echo g:GetStr() 144407a65d26SBram Moolenaar 144507a65d26SBram Moolenaar lines =<< trim END 144607a65d26SBram Moolenaar vim9script noclear 144707a65d26SBram Moolenaar var str = 1234 144807a65d26SBram Moolenaar END 144907a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 145007a65d26SBram Moolenaar source Xreload.vim 145107a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 145207a65d26SBram Moolenaar 145307a65d26SBram Moolenaar delfunc g:GetStr 145407a65d26SBram Moolenaar delete('Xreload.vim') 145507a65d26SBram Moolenaarenddef 145607a65d26SBram Moolenaar 145795006e3dSBram Moolenaardef s:RetSome(): string 145895006e3dSBram Moolenaar return 'some' 145995006e3dSBram Moolenaarenddef 146095006e3dSBram Moolenaar 1461fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1462fe465a01SBram Moolenaar" script-local name. 1463fe465a01SBram Moolenaardef Test_vim9script_funcref() 1464cfcd011fSBram Moolenaar var sortlines =<< trim END 1465fe465a01SBram Moolenaar vim9script 1466fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1467bed36b93SBram Moolenaar return i2 - i1 1468fe465a01SBram Moolenaar enddef 1469fe465a01SBram Moolenaar 1470fe465a01SBram Moolenaar export def FastSort(): list<number> 1471fe465a01SBram Moolenaar return range(5)->sort(Compare) 1472fe465a01SBram Moolenaar enddef 1473fe465a01SBram Moolenaar END 1474fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1475fe465a01SBram Moolenaar 1476cfcd011fSBram Moolenaar var lines =<< trim END 1477fe465a01SBram Moolenaar vim9script 1478fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1479fe465a01SBram Moolenaar def Test() 1480fe465a01SBram Moolenaar g:result = FastSort() 1481fe465a01SBram Moolenaar enddef 1482fe465a01SBram Moolenaar Test() 1483fe465a01SBram Moolenaar END 1484fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1485fe465a01SBram Moolenaar 1486fe465a01SBram Moolenaar source Xscript.vim 1487fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1488fe465a01SBram Moolenaar 1489fe465a01SBram Moolenaar unlet g:result 1490fe465a01SBram Moolenaar delete('Xsort.vim') 1491fe465a01SBram Moolenaar delete('Xscript.vim') 149295006e3dSBram Moolenaar 1493cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 149495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1495fe465a01SBram Moolenaarenddef 1496fe465a01SBram Moolenaar 1497601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1498601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1499601e76acSBram Moolenaar" function reference. 1500c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1501cfcd011fSBram Moolenaar var filterLines =<< trim END 1502c620c055SBram Moolenaar vim9script 1503c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1504c620c055SBram Moolenaar return idx % 2 == 1 1505c620c055SBram Moolenaar enddef 1506c620c055SBram Moolenaar export def FastFilter(): list<number> 1507c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1508c620c055SBram Moolenaar enddef 1509601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1510601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1511601e76acSBram Moolenaar enddef 1512c620c055SBram Moolenaar END 1513c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1514c620c055SBram Moolenaar 1515cfcd011fSBram Moolenaar var lines =<< trim END 1516c620c055SBram Moolenaar vim9script 1517601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1518c620c055SBram Moolenaar def Test() 1519cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1520c620c055SBram Moolenaar enddef 1521c620c055SBram Moolenaar Test() 1522601e76acSBram Moolenaar def TestDirect() 1523cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1524601e76acSBram Moolenaar enddef 1525601e76acSBram Moolenaar TestDirect() 1526c620c055SBram Moolenaar END 1527601e76acSBram Moolenaar CheckScriptSuccess(lines) 1528c620c055SBram Moolenaar delete('Xfilter.vim') 1529c620c055SBram Moolenaarenddef 1530c620c055SBram Moolenaar 15314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1532cfcd011fSBram Moolenaar var first_lines =<< trim END 15334c17ad94SBram Moolenaar vim9script 15344c17ad94SBram Moolenaar def FuncYes(): string 15354c17ad94SBram Moolenaar return 'yes' 15364c17ad94SBram Moolenaar enddef 15374c17ad94SBram Moolenaar END 1538cfcd011fSBram Moolenaar var withno_lines =<< trim END 15394c17ad94SBram Moolenaar def FuncNo(): string 15404c17ad94SBram Moolenaar return 'no' 15414c17ad94SBram Moolenaar enddef 15424c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15434c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15444c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 154503afdcf1SBram Moolenaar enddef 154603afdcf1SBram Moolenaar END 1547cfcd011fSBram Moolenaar var nono_lines =<< trim END 154803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 154903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 155044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 15514c17ad94SBram Moolenaar enddef 15524c17ad94SBram Moolenaar END 15534c17ad94SBram Moolenaar 15544c17ad94SBram Moolenaar # FuncNo() is defined 155503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15564c17ad94SBram Moolenaar source Xreloaded.vim 15574c17ad94SBram Moolenaar g:DoCheck(true) 15584c17ad94SBram Moolenaar 15594c17ad94SBram Moolenaar # FuncNo() is not redefined 156003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15614c17ad94SBram Moolenaar source Xreloaded.vim 15625082471fSBram Moolenaar g:DoCheck(false) 15634c17ad94SBram Moolenaar 15644c17ad94SBram Moolenaar # FuncNo() is back 156503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15664c17ad94SBram Moolenaar source Xreloaded.vim 15675082471fSBram Moolenaar g:DoCheck(false) 15684c17ad94SBram Moolenaar 15694c17ad94SBram Moolenaar delete('Xreloaded.vim') 15704c17ad94SBram Moolenaarenddef 15714c17ad94SBram Moolenaar 157289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 157389483d40SBram Moolenaar # write the script with a script-local variable 1574cfcd011fSBram Moolenaar var lines =<< trim END 157589483d40SBram Moolenaar vim9script 1576cfcd011fSBram Moolenaar var name = 'string' 157789483d40SBram Moolenaar END 157889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 157989483d40SBram Moolenaar source XreloadVar.vim 158089483d40SBram Moolenaar 158189483d40SBram Moolenaar # now write the script using the same variable locally - works 158289483d40SBram Moolenaar lines =<< trim END 158389483d40SBram Moolenaar vim9script 158489483d40SBram Moolenaar def Func() 1585cfcd011fSBram Moolenaar var name = 'string' 158689483d40SBram Moolenaar enddef 158789483d40SBram Moolenaar END 158889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 158989483d40SBram Moolenaar source XreloadVar.vim 159089483d40SBram Moolenaar 159189483d40SBram Moolenaar delete('XreloadVar.vim') 159289483d40SBram Moolenaarenddef 159389483d40SBram Moolenaar 15948a7d6542SBram Moolenaardef Test_import_absolute() 1595cfcd011fSBram Moolenaar var import_lines = [ 1596e6085c53SBram Moolenaar 'vim9script', 1597e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1598e6085c53SBram Moolenaar 'def UseExported()', 1599e6085c53SBram Moolenaar ' g:imported_abs = exported', 1600e6085c53SBram Moolenaar ' exported = 8888', 1601e6085c53SBram Moolenaar ' g:imported_after = exported', 1602e6085c53SBram Moolenaar 'enddef', 1603e6085c53SBram Moolenaar 'UseExported()', 1604e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1605e6085c53SBram Moolenaar ] 16068a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16078a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16088a7d6542SBram Moolenaar 16098a7d6542SBram Moolenaar source Ximport_abs.vim 16108a7d6542SBram Moolenaar 16118a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16124e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1613fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1614fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1615fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1616fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1617fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1618fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1619fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1620fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1621fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1622fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1623e6085c53SBram Moolenaar g:import_disassembled) 1624b3ca9824SBram Moolenaar 1625b3ca9824SBram Moolenaar Undo_export_script_lines() 16268a7d6542SBram Moolenaar unlet g:imported_abs 16274e12a5dfSBram Moolenaar unlet g:import_disassembled 16288a7d6542SBram Moolenaar 16298a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16308a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16318a7d6542SBram Moolenaarenddef 16328a7d6542SBram Moolenaar 16338a7d6542SBram Moolenaardef Test_import_rtp() 1634cfcd011fSBram Moolenaar var import_lines = [ 1635e6085c53SBram Moolenaar 'vim9script', 1636e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1637e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1638e6085c53SBram Moolenaar ] 16398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16408a7d6542SBram Moolenaar mkdir('import') 16418a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16428a7d6542SBram Moolenaar 1643cfcd011fSBram Moolenaar var save_rtp = &rtp 16448a7d6542SBram Moolenaar &rtp = getcwd() 16458a7d6542SBram Moolenaar source Ximport_rtp.vim 16468a7d6542SBram Moolenaar &rtp = save_rtp 16478a7d6542SBram Moolenaar 16488a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16498a7d6542SBram Moolenaar 1650b3ca9824SBram Moolenaar Undo_export_script_lines() 1651b3ca9824SBram Moolenaar unlet g:imported_rtp 16528a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 165389483d40SBram Moolenaar delete('import', 'rf') 16548a7d6542SBram Moolenaarenddef 16558a7d6542SBram Moolenaar 165625e0f586SBram Moolenaardef Test_import_compile_error() 1657cfcd011fSBram Moolenaar var export_lines = [ 165825e0f586SBram Moolenaar 'vim9script', 165925e0f586SBram Moolenaar 'export def ExpFunc(): string', 166025e0f586SBram Moolenaar ' return notDefined', 166125e0f586SBram Moolenaar 'enddef', 166225e0f586SBram Moolenaar ] 166325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 166425e0f586SBram Moolenaar 1665cfcd011fSBram Moolenaar var import_lines = [ 166625e0f586SBram Moolenaar 'vim9script', 166725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 166825e0f586SBram Moolenaar 'def ImpFunc()', 166925e0f586SBram Moolenaar ' echo ExpFunc()', 167025e0f586SBram Moolenaar 'enddef', 167125e0f586SBram Moolenaar 'defcompile', 167225e0f586SBram Moolenaar ] 167325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 167425e0f586SBram Moolenaar 167525e0f586SBram Moolenaar try 167625e0f586SBram Moolenaar source Ximport.vim 167725e0f586SBram Moolenaar catch /E1001/ 1678f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16797707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 168025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 168125e0f586SBram Moolenaar endtry 168225e0f586SBram Moolenaar 168325e0f586SBram Moolenaar delete('Xexported.vim') 168425e0f586SBram Moolenaar delete('Ximport.vim') 168525e0f586SBram Moolenaarenddef 168625e0f586SBram Moolenaar 1687c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1688cfcd011fSBram Moolenaar var lines = [ 1689c4ce36d4SBram Moolenaar 'vim9script', 1690c4ce36d4SBram Moolenaar 'def Func()', 1691c4ce36d4SBram Moolenaar ' eval [][0]', 1692c4ce36d4SBram Moolenaar 'enddef', 1693c4ce36d4SBram Moolenaar 'Func()', 1694c4ce36d4SBram Moolenaar ] 1695c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1696c4ce36d4SBram Moolenaar 1697c4ce36d4SBram Moolenaar for count in range(3) 1698c4ce36d4SBram Moolenaar try 1699c4ce36d4SBram Moolenaar source Xtestscript.vim 1700c4ce36d4SBram Moolenaar catch /E684/ 1701c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1702c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1703c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1704c4ce36d4SBram Moolenaar endtry 1705c4ce36d4SBram Moolenaar endfor 1706c4ce36d4SBram Moolenaar 1707c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1708c4ce36d4SBram Moolenaarenddef 1709c4ce36d4SBram Moolenaar 1710eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1711cfcd011fSBram Moolenaar var export_lines =<< trim END 1712eef2102eSBram Moolenaar vim9script 1713eef2102eSBram Moolenaar export def Func() 1714eef2102eSBram Moolenaar echo 'imported' 1715eef2102eSBram Moolenaar enddef 1716eef2102eSBram Moolenaar END 1717eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1718eef2102eSBram Moolenaar 1719cfcd011fSBram Moolenaar var lines =<< trim END 1720eef2102eSBram Moolenaar vim9script 1721eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1722eef2102eSBram Moolenaar def Func() 1723eef2102eSBram Moolenaar echo 'local to function' 1724eef2102eSBram Moolenaar enddef 1725eef2102eSBram Moolenaar END 1726eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1727eef2102eSBram Moolenaar 1728eef2102eSBram Moolenaar lines =<< trim END 1729eef2102eSBram Moolenaar vim9script 1730eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1731eef2102eSBram Moolenaar def Outer() 1732eef2102eSBram Moolenaar def Func() 1733eef2102eSBram Moolenaar echo 'local to function' 1734eef2102eSBram Moolenaar enddef 1735eef2102eSBram Moolenaar enddef 1736eef2102eSBram Moolenaar defcompile 1737eef2102eSBram Moolenaar END 1738eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1739eef2102eSBram Moolenaar 1740eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1741eef2102eSBram Moolenaarenddef 1742eef2102eSBram Moolenaar 1743b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1744cfcd011fSBram Moolenaar var lines =<< trim END 1745b9a2cac3SBram Moolenaar vim9script 1746b9a2cac3SBram Moolenaar def Func() 1747b9a2cac3SBram Moolenaar echo 'one' 1748b9a2cac3SBram Moolenaar enddef 1749b9a2cac3SBram Moolenaar def Func() 1750b9a2cac3SBram Moolenaar echo 'two' 1751b9a2cac3SBram Moolenaar enddef 1752b9a2cac3SBram Moolenaar END 1753b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1754fa211f3cSBram Moolenaar 1755fa211f3cSBram Moolenaar lines =<< trim END 1756fa211f3cSBram Moolenaar vim9script 1757fa211f3cSBram Moolenaar def Foo(): string 1758fa211f3cSBram Moolenaar return 'foo' 1759fa211f3cSBram Moolenaar enddef 1760fa211f3cSBram Moolenaar def Func() 1761cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1762fa211f3cSBram Moolenaar enddef 1763fa211f3cSBram Moolenaar defcompile 1764fa211f3cSBram Moolenaar END 1765fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1766b9a2cac3SBram Moolenaarenddef 1767b9a2cac3SBram Moolenaar 17688a7d6542SBram Moolenaardef Test_fixed_size_list() 1769f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1770cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 17718a7d6542SBram Moolenaar l->remove(0) 17728a7d6542SBram Moolenaar l->add(5) 17738a7d6542SBram Moolenaar l->insert(99, 1) 17740f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17758a7d6542SBram Moolenaarenddef 17768a7d6542SBram Moolenaar 1777ae616494SBram Moolenaardef Test_no_insert_xit() 1778d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1779d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1780d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1781d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1782d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1783ae616494SBram Moolenaar 1784ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1785ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1786ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1787ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1788f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1789f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1790f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1791f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1792f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1793ae616494SBram Moolenaarenddef 1794ae616494SBram Moolenaar 1795158906cfSBram Moolenaardef IfElse(what: number): string 1796cfcd011fSBram Moolenaar var res = '' 1797158906cfSBram Moolenaar if what == 1 1798158906cfSBram Moolenaar res = "one" 1799158906cfSBram Moolenaar elseif what == 2 1800158906cfSBram Moolenaar res = "two" 1801a259d8d3SBram Moolenaar else 1802158906cfSBram Moolenaar res = "three" 1803a259d8d3SBram Moolenaar endif 1804158906cfSBram Moolenaar return res 1805a259d8d3SBram Moolenaarenddef 1806a259d8d3SBram Moolenaar 1807158906cfSBram Moolenaardef Test_if_elseif_else() 1808158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1809158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1810158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18110f18b6d1SBram Moolenaarenddef 18120f18b6d1SBram Moolenaar 1813e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1814d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1815d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1816d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1817ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1818d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 18196628b7ebSBram Moolenaar 18206628b7ebSBram Moolenaar var lines =<< trim END 18216628b7ebSBram Moolenaar var s = '' 18226628b7ebSBram Moolenaar if s = '' 18236628b7ebSBram Moolenaar endif 18246628b7ebSBram Moolenaar END 18256628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 18266628b7ebSBram Moolenaar 18276628b7ebSBram Moolenaar lines =<< trim END 18286628b7ebSBram Moolenaar var s = '' 18296628b7ebSBram Moolenaar if s == '' 18306628b7ebSBram Moolenaar elseif s = '' 18316628b7ebSBram Moolenaar endif 18326628b7ebSBram Moolenaar END 18336628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1834e8c4abbbSBram Moolenaarenddef 1835e8c4abbbSBram Moolenaar 18366d69bf60SBram Moolenaarlet g:bool_true = v:true 18376d69bf60SBram Moolenaarlet g:bool_false = v:false 18386d69bf60SBram Moolenaar 18396d69bf60SBram Moolenaardef Test_if_const_expr() 1840cfcd011fSBram Moolenaar var res = false 18416d69bf60SBram Moolenaar if true ? true : false 18426d69bf60SBram Moolenaar res = true 18436d69bf60SBram Moolenaar endif 18446d69bf60SBram Moolenaar assert_equal(true, res) 18456d69bf60SBram Moolenaar 1846585fea7bSBram Moolenaar g:glob = 2 1847585fea7bSBram Moolenaar if false 18486797966dSBram Moolenaar execute('g:glob = 3') 1849585fea7bSBram Moolenaar endif 1850585fea7bSBram Moolenaar assert_equal(2, g:glob) 1851585fea7bSBram Moolenaar if true 18526797966dSBram Moolenaar execute('g:glob = 3') 1853585fea7bSBram Moolenaar endif 1854585fea7bSBram Moolenaar assert_equal(3, g:glob) 1855585fea7bSBram Moolenaar 18566d69bf60SBram Moolenaar res = false 18576d69bf60SBram Moolenaar if g:bool_true ? true : false 18586d69bf60SBram Moolenaar res = true 18596d69bf60SBram Moolenaar endif 18606d69bf60SBram Moolenaar assert_equal(true, res) 18616d69bf60SBram Moolenaar 18626d69bf60SBram Moolenaar res = false 18636d69bf60SBram Moolenaar if true ? g:bool_true : false 18646d69bf60SBram Moolenaar res = true 18656d69bf60SBram Moolenaar endif 18666d69bf60SBram Moolenaar assert_equal(true, res) 18676d69bf60SBram Moolenaar 18686d69bf60SBram Moolenaar res = false 18696d69bf60SBram Moolenaar if true ? true : g:bool_false 18706d69bf60SBram Moolenaar res = true 18716d69bf60SBram Moolenaar endif 18726d69bf60SBram Moolenaar assert_equal(true, res) 18736d69bf60SBram Moolenaar 18746d69bf60SBram Moolenaar res = false 18756d69bf60SBram Moolenaar if true ? false : true 18766d69bf60SBram Moolenaar res = true 18776d69bf60SBram Moolenaar endif 18786d69bf60SBram Moolenaar assert_equal(false, res) 18796d69bf60SBram Moolenaar 18806d69bf60SBram Moolenaar res = false 18816d69bf60SBram Moolenaar if false ? false : true 18826d69bf60SBram Moolenaar res = true 18836d69bf60SBram Moolenaar endif 18846d69bf60SBram Moolenaar assert_equal(true, res) 18856d69bf60SBram Moolenaar 18866d69bf60SBram Moolenaar res = false 18876d69bf60SBram Moolenaar if false ? true : false 18886d69bf60SBram Moolenaar res = true 18896d69bf60SBram Moolenaar endif 18906d69bf60SBram Moolenaar assert_equal(false, res) 18916d69bf60SBram Moolenaar 18926d69bf60SBram Moolenaar res = false 1893e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1894e8c4abbbSBram Moolenaar res = true 1895e8c4abbbSBram Moolenaar endif 1896e8c4abbbSBram Moolenaar assert_equal(false, res) 1897e8c4abbbSBram Moolenaar 1898e8c4abbbSBram Moolenaar res = false 18996d69bf60SBram Moolenaar if true && true 19006d69bf60SBram Moolenaar res = true 19016d69bf60SBram Moolenaar endif 19026d69bf60SBram Moolenaar assert_equal(true, res) 19036d69bf60SBram Moolenaar 19046d69bf60SBram Moolenaar res = false 19056d69bf60SBram Moolenaar if true && false 19066d69bf60SBram Moolenaar res = true 19076d69bf60SBram Moolenaar endif 19086d69bf60SBram Moolenaar assert_equal(false, res) 19096d69bf60SBram Moolenaar 19106d69bf60SBram Moolenaar res = false 19116d69bf60SBram Moolenaar if g:bool_true && false 19126d69bf60SBram Moolenaar res = true 19136d69bf60SBram Moolenaar endif 19146d69bf60SBram Moolenaar assert_equal(false, res) 19156d69bf60SBram Moolenaar 19166d69bf60SBram Moolenaar res = false 19176d69bf60SBram Moolenaar if true && g:bool_false 19186d69bf60SBram Moolenaar res = true 19196d69bf60SBram Moolenaar endif 19206d69bf60SBram Moolenaar assert_equal(false, res) 19216d69bf60SBram Moolenaar 19226d69bf60SBram Moolenaar res = false 19236d69bf60SBram Moolenaar if false && false 19246d69bf60SBram Moolenaar res = true 19256d69bf60SBram Moolenaar endif 19266d69bf60SBram Moolenaar assert_equal(false, res) 19276d69bf60SBram Moolenaar 19286d69bf60SBram Moolenaar res = false 19296d69bf60SBram Moolenaar if true || false 19306d69bf60SBram Moolenaar res = true 19316d69bf60SBram Moolenaar endif 19326d69bf60SBram Moolenaar assert_equal(true, res) 19336d69bf60SBram Moolenaar 19346d69bf60SBram Moolenaar res = false 19356d69bf60SBram Moolenaar if g:bool_true || false 19366d69bf60SBram Moolenaar res = true 19376d69bf60SBram Moolenaar endif 19386d69bf60SBram Moolenaar assert_equal(true, res) 19396d69bf60SBram Moolenaar 19406d69bf60SBram Moolenaar res = false 19416d69bf60SBram Moolenaar if true || g:bool_false 19426d69bf60SBram Moolenaar res = true 19436d69bf60SBram Moolenaar endif 19446d69bf60SBram Moolenaar assert_equal(true, res) 19456d69bf60SBram Moolenaar 19466d69bf60SBram Moolenaar res = false 19476d69bf60SBram Moolenaar if false || false 19486d69bf60SBram Moolenaar res = true 19496d69bf60SBram Moolenaar endif 19506d69bf60SBram Moolenaar assert_equal(false, res) 19513988f64fSBram Moolenaar 19523988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 19533988f64fSBram Moolenaar if false | eval 0 | endif 19543988f64fSBram Moolenaar if false | eval burp + 234 | endif 19553988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 19563988f64fSBram Moolenaar if false 19573988f64fSBram Moolenaar burp 19583988f64fSBram Moolenaar endif 195980c34ca3SBram Moolenaarenddef 19606d69bf60SBram Moolenaar 196180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1962d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1963d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1964d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1965d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19666d69bf60SBram Moolenaarenddef 19676d69bf60SBram Moolenaar 196872abcf42SBram Moolenaardef RunNested(i: number): number 1969cfcd011fSBram Moolenaar var x: number = 0 197072abcf42SBram Moolenaar if i % 2 197172abcf42SBram Moolenaar if 1 1972f5be8cdbSBram Moolenaar # comment 197372abcf42SBram Moolenaar else 1974f5be8cdbSBram Moolenaar # comment 197572abcf42SBram Moolenaar endif 197672abcf42SBram Moolenaar x += 1 197772abcf42SBram Moolenaar else 197872abcf42SBram Moolenaar x += 1000 197972abcf42SBram Moolenaar endif 198072abcf42SBram Moolenaar return x 198172abcf42SBram Moolenaarenddef 198272abcf42SBram Moolenaar 198372abcf42SBram Moolenaardef Test_nested_if() 198472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 198572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 198672abcf42SBram Moolenaarenddef 198772abcf42SBram Moolenaar 1988ad39c094SBram Moolenaardef Test_execute_cmd() 1989e4984290SBram Moolenaar # missing argument is ignored 1990e4984290SBram Moolenaar execute 1991e4984290SBram Moolenaar execute # comment 1992e4984290SBram Moolenaar 1993ad39c094SBram Moolenaar new 1994ad39c094SBram Moolenaar setline(1, 'default') 1995d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1996ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1997a72cfb80SBram Moolenaar 1998d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1999a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2000a72cfb80SBram Moolenaar 2001cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2002cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2003a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2004ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2005a72cfb80SBram Moolenaar 2006d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2007ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2008a72cfb80SBram Moolenaar 2009cfcd011fSBram Moolenaar var cmd_first = 'call ' 2010cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2011ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2012ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2013ad39c094SBram Moolenaar bwipe! 2014585fea7bSBram Moolenaar 2015cfcd011fSBram Moolenaar var n = true 20162d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20172d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20182d6b20d6SBram Moolenaar 2019e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2020e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2021e5abf7afSBram Moolenaar 2022d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2023d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2024d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2025ad39c094SBram Moolenaarenddef 2026ad39c094SBram Moolenaar 202747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2028f5be8cdbSBram Moolenaar # only checks line continuation 2029cfcd011fSBram Moolenaar var lines =<< trim END 203047e880d6SBram Moolenaar vim9script 203147e880d6SBram Moolenaar execute 'g:someVar' 203247e880d6SBram Moolenaar .. ' = ' .. 203347e880d6SBram Moolenaar '28' 203447e880d6SBram Moolenaar assert_equal(28, g:someVar) 203547e880d6SBram Moolenaar unlet g:someVar 203647e880d6SBram Moolenaar END 203747e880d6SBram Moolenaar CheckScriptSuccess(lines) 203847e880d6SBram Moolenaarenddef 203947e880d6SBram Moolenaar 2040ad39c094SBram Moolenaardef Test_echo_cmd() 2041a72cfb80SBram Moolenaar echo 'some' # comment 2042585fea7bSBram Moolenaar echon 'thing' 2043ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2044ad39c094SBram Moolenaar 2045a72cfb80SBram Moolenaar echo "some" # comment 2046a72cfb80SBram Moolenaar echon "thing" 2047a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2048a72cfb80SBram Moolenaar 2049cfcd011fSBram Moolenaar var str1 = 'some' 2050cfcd011fSBram Moolenaar var str2 = 'more' 2051ad39c094SBram Moolenaar echo str1 str2 2052ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2053a72cfb80SBram Moolenaar 2054d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2055ad39c094SBram Moolenaarenddef 2056ad39c094SBram Moolenaar 2057f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2058f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2059f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2060f93c7feaSBram Moolenaar echo 'clear' 2061df069eecSBram Moolenaar :1messages 2062f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2063f93c7feaSBram Moolenaar 2064d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2065f93c7feaSBram Moolenaarenddef 2066f93c7feaSBram Moolenaar 206747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2068f5be8cdbSBram Moolenaar # only checks line continuation 2069cfcd011fSBram Moolenaar var lines =<< trim END 207047e880d6SBram Moolenaar vim9script 207147e880d6SBram Moolenaar echomsg 'here' 207247e880d6SBram Moolenaar .. ' is ' .. 207347e880d6SBram Moolenaar 'a message' 207447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 207547e880d6SBram Moolenaar END 207647e880d6SBram Moolenaar CheckScriptSuccess(lines) 207747e880d6SBram Moolenaarenddef 207847e880d6SBram Moolenaar 2079f93c7feaSBram Moolenaardef Test_echoerr_cmd() 208040ee466cSBram Moolenaar try 208140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 208240ee466cSBram Moolenaar catch 208340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 208440ee466cSBram Moolenaar endtry 2085f93c7feaSBram Moolenaarenddef 2086f93c7feaSBram Moolenaar 208747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2088f5be8cdbSBram Moolenaar # only checks line continuation 2089cfcd011fSBram Moolenaar var lines =<< trim END 209047e880d6SBram Moolenaar vim9script 209147e880d6SBram Moolenaar try 209247e880d6SBram Moolenaar echoerr 'this' 209347e880d6SBram Moolenaar .. ' is ' .. 209447e880d6SBram Moolenaar 'wrong' 209547e880d6SBram Moolenaar catch 209647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 209747e880d6SBram Moolenaar endtry 209847e880d6SBram Moolenaar END 209947e880d6SBram Moolenaar CheckScriptSuccess(lines) 210047e880d6SBram Moolenaarenddef 210147e880d6SBram Moolenaar 210241fe0617SBram Moolenaardef Test_for_outside_of_function() 2103cfcd011fSBram Moolenaar var lines =<< trim END 210441fe0617SBram Moolenaar vim9script 210541fe0617SBram Moolenaar new 210641fe0617SBram Moolenaar for var in range(0, 3) 210741fe0617SBram Moolenaar append(line('$'), var) 210841fe0617SBram Moolenaar endfor 210941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 211041fe0617SBram Moolenaar bwipe! 211141fe0617SBram Moolenaar END 211241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 211341fe0617SBram Moolenaar source Xvim9for.vim 211441fe0617SBram Moolenaar delete('Xvim9for.vim') 211541fe0617SBram Moolenaarenddef 21168a7d6542SBram Moolenaar 2117e8c4abbbSBram Moolenaardef Test_for_loop() 2118cfcd011fSBram Moolenaar var result = '' 2119e8c4abbbSBram Moolenaar for cnt in range(7) 2120e8c4abbbSBram Moolenaar if cnt == 4 2121e8c4abbbSBram Moolenaar break 2122e8c4abbbSBram Moolenaar endif 2123e8c4abbbSBram Moolenaar if cnt == 2 2124e8c4abbbSBram Moolenaar continue 2125e8c4abbbSBram Moolenaar endif 2126e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2127e8c4abbbSBram Moolenaar endfor 2128e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21290ad3e894SBram Moolenaar 2130cfcd011fSBram Moolenaar var concat = '' 21310ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21320ad3e894SBram Moolenaar concat ..= str 21330ad3e894SBram Moolenaar endfor 21340ad3e894SBram Moolenaar assert_equal('onetwo', concat) 213538bd8de5SBram Moolenaar 213638bd8de5SBram Moolenaar var total = 0 213738bd8de5SBram Moolenaar for nr in 213838bd8de5SBram Moolenaar [1, 2, 3] 213938bd8de5SBram Moolenaar total += nr 214038bd8de5SBram Moolenaar endfor 214138bd8de5SBram Moolenaar assert_equal(6, total) 214238bd8de5SBram Moolenaar 214338bd8de5SBram Moolenaar total = 0 214438bd8de5SBram Moolenaar for nr 214538bd8de5SBram Moolenaar in [1, 2, 3] 214638bd8de5SBram Moolenaar total += nr 214738bd8de5SBram Moolenaar endfor 214838bd8de5SBram Moolenaar assert_equal(6, total) 214938bd8de5SBram Moolenaar 215038bd8de5SBram Moolenaar total = 0 215138bd8de5SBram Moolenaar for nr 215238bd8de5SBram Moolenaar in 215338bd8de5SBram Moolenaar [1, 2, 3] 215438bd8de5SBram Moolenaar total += nr 215538bd8de5SBram Moolenaar endfor 215638bd8de5SBram Moolenaar assert_equal(6, total) 2157036d0714SBram Moolenaar 2158036d0714SBram Moolenaar var res = "" 2159036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2160036d0714SBram Moolenaar res ..= n .. s 2161036d0714SBram Moolenaar endfor 2162036d0714SBram Moolenaar assert_equal('1a2b', res) 2163e8c4abbbSBram Moolenaarenddef 2164e8c4abbbSBram Moolenaar 2165e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2166025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2167025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2168025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2169675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2170675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2171cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2172822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21732d870f8dSBram Moolenaar delfunc! g:Func 2174451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2175675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2176675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2177675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2178e8c4abbbSBram Moolenaarenddef 2179e8c4abbbSBram Moolenaar 2180ea87069dSBram Moolenaardef Test_for_loop_script_var() 2181ea87069dSBram Moolenaar # cannot use s:var in a :def function 2182ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2183ea87069dSBram Moolenaar 2184ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2185ea87069dSBram Moolenaar var lines =<< trim END 2186ea87069dSBram Moolenaar vim9script 2187ea87069dSBram Moolenaar var total = 0 2188ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2189ea87069dSBram Moolenaar total += s:var 2190ea87069dSBram Moolenaar endfor 2191ea87069dSBram Moolenaar assert_equal(6, total) 2192ea87069dSBram Moolenaar 2193ea87069dSBram Moolenaar total = 0 2194ea87069dSBram Moolenaar for var in [1, 2, 3] 2195ea87069dSBram Moolenaar total += var 2196ea87069dSBram Moolenaar endfor 2197ea87069dSBram Moolenaar assert_equal(6, total) 2198ea87069dSBram Moolenaar END 2199ea87069dSBram Moolenaarenddef 2200ea87069dSBram Moolenaar 2201792f786aSBram Moolenaardef Test_for_loop_unpack() 22024b8a0651SBram Moolenaar var lines =<< trim END 2203792f786aSBram Moolenaar var result = [] 2204792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2205792f786aSBram Moolenaar result->add(v1) 2206792f786aSBram Moolenaar result->add(v2) 2207792f786aSBram Moolenaar endfor 2208792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2209792f786aSBram Moolenaar 2210792f786aSBram Moolenaar result = [] 2211792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2212792f786aSBram Moolenaar result->add(v1) 2213792f786aSBram Moolenaar result->add(v2) 2214792f786aSBram Moolenaar result->add(v3) 2215792f786aSBram Moolenaar endfor 2216792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2217792f786aSBram Moolenaar 22184b8a0651SBram Moolenaar result = [] 22194b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 22204b8a0651SBram Moolenaar result->add(&ts) 22214b8a0651SBram Moolenaar result->add(&sw) 22224b8a0651SBram Moolenaar endfor 22234b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 22244b8a0651SBram Moolenaar 22254b8a0651SBram Moolenaar var slist: list<string> 22264b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 22274b8a0651SBram Moolenaar slist->add($LOOPVAR) 22284b8a0651SBram Moolenaar slist->add(@r) 22294b8a0651SBram Moolenaar slist->add(v:errmsg) 22304b8a0651SBram Moolenaar endfor 22314b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22324b8a0651SBram Moolenaar 22334b8a0651SBram Moolenaar slist = [] 22344b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22354b8a0651SBram Moolenaar slist->add(g:globalvar) 22364b8a0651SBram Moolenaar slist->add(b:bufvar) 22374b8a0651SBram Moolenaar slist->add(w:winvar) 22384b8a0651SBram Moolenaar slist->add(t:tabvar) 22394b8a0651SBram Moolenaar endfor 22404b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2241f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 22424b8a0651SBram Moolenaar END 22434b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 22444b8a0651SBram Moolenaar 22454b8a0651SBram Moolenaar lines =<< trim END 2246792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2247792f786aSBram Moolenaar echo v1 v2 2248792f786aSBram Moolenaar endfor 2249792f786aSBram Moolenaar END 2250792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2251792f786aSBram Moolenaar 2252792f786aSBram Moolenaar lines =<< trim END 2253792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2254792f786aSBram Moolenaar echo v1 v2 2255792f786aSBram Moolenaar endfor 2256792f786aSBram Moolenaar END 2257792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2258792f786aSBram Moolenaar 2259792f786aSBram Moolenaar lines =<< trim END 2260792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2261792f786aSBram Moolenaar echo v1 2262792f786aSBram Moolenaar endfor 2263792f786aSBram Moolenaar END 2264792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2265792f786aSBram Moolenaarenddef 2266792f786aSBram Moolenaar 2267c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2268c150c09eSBram Moolenaar var looped = 0 2269c150c09eSBram Moolenaar var cleanup = 0 2270c150c09eSBram Moolenaar for i in range(3) 2271c150c09eSBram Moolenaar looped += 1 2272c150c09eSBram Moolenaar try 2273c150c09eSBram Moolenaar eval [][0] 2274c150c09eSBram Moolenaar catch 2275c150c09eSBram Moolenaar continue 2276c150c09eSBram Moolenaar finally 2277c150c09eSBram Moolenaar cleanup += 1 2278c150c09eSBram Moolenaar endtry 2279c150c09eSBram Moolenaar endfor 2280c150c09eSBram Moolenaar assert_equal(3, looped) 2281c150c09eSBram Moolenaar assert_equal(3, cleanup) 2282c150c09eSBram Moolenaarenddef 2283c150c09eSBram Moolenaar 2284d0df1aacSBram Moolenaardef Test_while_loop() 2285cfcd011fSBram Moolenaar var result = '' 2286cfcd011fSBram Moolenaar var cnt = 0 2287d0df1aacSBram Moolenaar while cnt < 555 2288d0df1aacSBram Moolenaar if cnt == 3 2289d0df1aacSBram Moolenaar break 2290d0df1aacSBram Moolenaar endif 2291d0df1aacSBram Moolenaar cnt += 1 2292d0df1aacSBram Moolenaar if cnt == 2 2293d0df1aacSBram Moolenaar continue 2294d0df1aacSBram Moolenaar endif 2295d0df1aacSBram Moolenaar result ..= cnt .. '_' 2296d0df1aacSBram Moolenaar endwhile 2297d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2298dee37dc7SBram Moolenaar 2299dee37dc7SBram Moolenaar var s = '' 23000123cc1eSBram Moolenaar while s == 'x' #{comment} 2301dee37dc7SBram Moolenaar endwhile 2302d0df1aacSBram Moolenaarenddef 2303d0df1aacSBram Moolenaar 2304e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2305675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2306675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2307675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2308675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2309675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2310675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2311675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 23126628b7ebSBram Moolenaar 23136628b7ebSBram Moolenaar var lines =<< trim END 23146628b7ebSBram Moolenaar var s = '' 23156628b7ebSBram Moolenaar while s = '' 23166628b7ebSBram Moolenaar endwhile 23176628b7ebSBram Moolenaar END 23186628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2319bd5da371SBram Moolenaarenddef 2320bd5da371SBram Moolenaar 23219645e2d9SBram Moolenaardef Test_interrupt_loop() 2322cfcd011fSBram Moolenaar var caught = false 2323cfcd011fSBram Moolenaar var x = 0 232497acfc78SBram Moolenaar try 23259645e2d9SBram Moolenaar while 1 23269645e2d9SBram Moolenaar x += 1 23279645e2d9SBram Moolenaar if x == 100 23289645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23299645e2d9SBram Moolenaar endif 23309645e2d9SBram Moolenaar endwhile 233197acfc78SBram Moolenaar catch 233297acfc78SBram Moolenaar caught = true 233397acfc78SBram Moolenaar assert_equal(100, x) 233497acfc78SBram Moolenaar endtry 233597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 233625859dd7SBram Moolenaar # consume the CTRL-C 233725859dd7SBram Moolenaar getchar(0) 23389645e2d9SBram Moolenaarenddef 233920431c9dSBram Moolenaar 23404fdae999SBram Moolenaardef Test_automatic_line_continuation() 2341cfcd011fSBram Moolenaar var mylist = [ 23424fdae999SBram Moolenaar 'one', 23434fdae999SBram Moolenaar 'two', 23444fdae999SBram Moolenaar 'three', 2345f5be8cdbSBram Moolenaar ] # comment 23464fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23474fdae999SBram Moolenaar 2348cfcd011fSBram Moolenaar var mydict = { 2349e0de171eSBram Moolenaar ['one']: 1, 2350e0de171eSBram Moolenaar ['two']: 2, 2351e0de171eSBram Moolenaar ['three']: 23524fdae999SBram Moolenaar 3, 2353f5be8cdbSBram Moolenaar } # comment 2354e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2355e0de171eSBram Moolenaar mydict = { 23562c330432SBram Moolenaar one: 1, # comment 23572c330432SBram Moolenaar two: # comment 23582c330432SBram Moolenaar 2, # comment 23592c330432SBram Moolenaar three: 3 # comment 23602c330432SBram Moolenaar } 2361e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2362e0de171eSBram Moolenaar mydict = { 23632c330432SBram Moolenaar one: 1, 23644fdae999SBram Moolenaar two: 23654fdae999SBram Moolenaar 2, 23662c330432SBram Moolenaar three: 3 23674fdae999SBram Moolenaar } 2368e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2369e6085c53SBram Moolenaar 2370e6085c53SBram Moolenaar assert_equal( 2371e6085c53SBram Moolenaar ['one', 'two', 'three'], 2372e6085c53SBram Moolenaar split('one two three') 2373e6085c53SBram Moolenaar ) 23744fdae999SBram Moolenaarenddef 23754fdae999SBram Moolenaar 23767a092245SBram Moolenaardef Test_vim9_comment() 23777a092245SBram Moolenaar CheckScriptSuccess([ 23787a092245SBram Moolenaar 'vim9script', 23797a092245SBram Moolenaar '# something', 238093f82cbeSBram Moolenaar '#something', 238193f82cbeSBram Moolenaar '#{something', 23827a092245SBram Moolenaar ]) 238393f82cbeSBram Moolenaar 238493f82cbeSBram Moolenaar split Xfile 238593f82cbeSBram Moolenaar CheckScriptSuccess([ 238693f82cbeSBram Moolenaar 'vim9script', 238793f82cbeSBram Moolenaar 'edit #something', 238893f82cbeSBram Moolenaar ]) 238993f82cbeSBram Moolenaar CheckScriptSuccess([ 239093f82cbeSBram Moolenaar 'vim9script', 239193f82cbeSBram Moolenaar 'edit #{something', 239293f82cbeSBram Moolenaar ]) 239393f82cbeSBram Moolenaar close 239493f82cbeSBram Moolenaar 23957a092245SBram Moolenaar CheckScriptFailure([ 23967a092245SBram Moolenaar 'vim9script', 23977a092245SBram Moolenaar ':# something', 23987a092245SBram Moolenaar ], 'E488:') 23997a092245SBram Moolenaar CheckScriptFailure([ 24007a092245SBram Moolenaar '# something', 24017a092245SBram Moolenaar ], 'E488:') 24027a092245SBram Moolenaar CheckScriptFailure([ 24037a092245SBram Moolenaar ':# something', 24047a092245SBram Moolenaar ], 'E488:') 24057a092245SBram Moolenaar 24064a8d9f2eSBram Moolenaar { # block start 24074a8d9f2eSBram Moolenaar } # block end 24084a8d9f2eSBram Moolenaar CheckDefFailure([ 24094a8d9f2eSBram Moolenaar '{# comment', 24104a8d9f2eSBram Moolenaar ], 'E488:') 24114a8d9f2eSBram Moolenaar CheckDefFailure([ 24124a8d9f2eSBram Moolenaar '{', 24134a8d9f2eSBram Moolenaar '}# comment', 24144a8d9f2eSBram Moolenaar ], 'E488:') 24154a8d9f2eSBram Moolenaar 24164a8d9f2eSBram Moolenaar echo "yes" # comment 24174a8d9f2eSBram Moolenaar CheckDefFailure([ 24184a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24194a8d9f2eSBram Moolenaar ], 'E488:') 24207a092245SBram Moolenaar CheckScriptSuccess([ 24217a092245SBram Moolenaar 'vim9script', 24227a092245SBram Moolenaar 'echo "yes" # something', 24237a092245SBram Moolenaar ]) 24247a092245SBram Moolenaar CheckScriptFailure([ 24257a092245SBram Moolenaar 'vim9script', 24267a092245SBram Moolenaar 'echo "yes"# something', 24277a092245SBram Moolenaar ], 'E121:') 24287a092245SBram Moolenaar CheckScriptFailure([ 24297a092245SBram Moolenaar 'vim9script', 24307a092245SBram Moolenaar 'echo# something', 2431f8103f27SBram Moolenaar ], 'E1144:') 24327a092245SBram Moolenaar CheckScriptFailure([ 24337a092245SBram Moolenaar 'echo "yes" # something', 24347a092245SBram Moolenaar ], 'E121:') 24357a092245SBram Moolenaar 24364a8d9f2eSBram Moolenaar exe "echo" # comment 24374a8d9f2eSBram Moolenaar CheckDefFailure([ 24384a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24394a8d9f2eSBram Moolenaar ], 'E488:') 24404a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24414a8d9f2eSBram Moolenaar 'vim9script', 24424a8d9f2eSBram Moolenaar 'exe "echo" # something', 24434a8d9f2eSBram Moolenaar ]) 24444a8d9f2eSBram Moolenaar CheckScriptFailure([ 24454a8d9f2eSBram Moolenaar 'vim9script', 24464a8d9f2eSBram Moolenaar 'exe "echo"# something', 24474a8d9f2eSBram Moolenaar ], 'E121:') 24484a8d9f2eSBram Moolenaar CheckScriptFailure([ 24494a8d9f2eSBram Moolenaar 'vim9script', 24504a8d9f2eSBram Moolenaar 'exe# something', 2451f8103f27SBram Moolenaar ], 'E1144:') 24524a8d9f2eSBram Moolenaar CheckScriptFailure([ 24534a8d9f2eSBram Moolenaar 'exe "echo" # something', 24544a8d9f2eSBram Moolenaar ], 'E121:') 24554a8d9f2eSBram Moolenaar 24567a092245SBram Moolenaar CheckDefFailure([ 24577a092245SBram Moolenaar 'try# comment', 24587a092245SBram Moolenaar ' echo "yes"', 24597a092245SBram Moolenaar 'catch', 24607a092245SBram Moolenaar 'endtry', 2461f8103f27SBram Moolenaar ], 'E1144:') 24622c5ed4e3SBram Moolenaar CheckScriptFailure([ 24632c5ed4e3SBram Moolenaar 'vim9script', 24642c5ed4e3SBram Moolenaar 'try# comment', 24652c5ed4e3SBram Moolenaar 'echo "yes"', 2466f8103f27SBram Moolenaar ], 'E1144:') 24677a092245SBram Moolenaar CheckDefFailure([ 24687a092245SBram Moolenaar 'try', 2469a72cfb80SBram Moolenaar ' throw#comment', 2470a72cfb80SBram Moolenaar 'catch', 2471a72cfb80SBram Moolenaar 'endtry', 2472f8103f27SBram Moolenaar ], 'E1144:') 2473a72cfb80SBram Moolenaar CheckDefFailure([ 2474a72cfb80SBram Moolenaar 'try', 2475a72cfb80SBram Moolenaar ' throw "yes"#comment', 2476a72cfb80SBram Moolenaar 'catch', 2477a72cfb80SBram Moolenaar 'endtry', 2478a72cfb80SBram Moolenaar ], 'E488:') 2479a72cfb80SBram Moolenaar CheckDefFailure([ 2480a72cfb80SBram Moolenaar 'try', 24817a092245SBram Moolenaar ' echo "yes"', 24827a092245SBram Moolenaar 'catch# comment', 24837a092245SBram Moolenaar 'endtry', 2484f8103f27SBram Moolenaar ], 'E1144:') 24852c5ed4e3SBram Moolenaar CheckScriptFailure([ 24862c5ed4e3SBram Moolenaar 'vim9script', 24872c5ed4e3SBram Moolenaar 'try', 24882c5ed4e3SBram Moolenaar ' echo "yes"', 24892c5ed4e3SBram Moolenaar 'catch# comment', 24902c5ed4e3SBram Moolenaar 'endtry', 2491f8103f27SBram Moolenaar ], 'E1144:') 24922c5ed4e3SBram Moolenaar CheckDefFailure([ 24932c5ed4e3SBram Moolenaar 'try', 24942c5ed4e3SBram Moolenaar ' echo "yes"', 24952c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24962c5ed4e3SBram Moolenaar 'endtry', 24972c5ed4e3SBram Moolenaar ], 'E488:') 24987a092245SBram Moolenaar CheckDefFailure([ 24997a092245SBram Moolenaar 'try', 25007a092245SBram Moolenaar 'echo "yes"', 25017a092245SBram Moolenaar 'catch', 25027a092245SBram Moolenaar 'endtry# comment', 2503f8103f27SBram Moolenaar ], 'E1144:') 25042c5ed4e3SBram Moolenaar CheckScriptFailure([ 25052c5ed4e3SBram Moolenaar 'vim9script', 25062c5ed4e3SBram Moolenaar 'try', 25072c5ed4e3SBram Moolenaar ' echo "yes"', 25082c5ed4e3SBram Moolenaar 'catch', 25092c5ed4e3SBram Moolenaar 'endtry# comment', 2510f8103f27SBram Moolenaar ], 'E1144:') 25112c5ed4e3SBram Moolenaar 25122c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25132c5ed4e3SBram Moolenaar 'vim9script', 25142c5ed4e3SBram Moolenaar 'hi # comment', 25152c5ed4e3SBram Moolenaar ]) 25162c5ed4e3SBram Moolenaar CheckScriptFailure([ 25172c5ed4e3SBram Moolenaar 'vim9script', 25182c5ed4e3SBram Moolenaar 'hi# comment', 2519f8103f27SBram Moolenaar ], 'E1144:') 25201966c248SBram Moolenaar CheckScriptSuccess([ 25211966c248SBram Moolenaar 'vim9script', 25221966c248SBram Moolenaar 'hi Search # comment', 25231966c248SBram Moolenaar ]) 25241966c248SBram Moolenaar CheckScriptFailure([ 25251966c248SBram Moolenaar 'vim9script', 25261966c248SBram Moolenaar 'hi Search# comment', 25271966c248SBram Moolenaar ], 'E416:') 25281966c248SBram Moolenaar CheckScriptSuccess([ 25291966c248SBram Moolenaar 'vim9script', 25301966c248SBram Moolenaar 'hi link This Search # comment', 25311966c248SBram Moolenaar ]) 25321966c248SBram Moolenaar CheckScriptFailure([ 25331966c248SBram Moolenaar 'vim9script', 25341966c248SBram Moolenaar 'hi link This That# comment', 25351966c248SBram Moolenaar ], 'E413:') 25361966c248SBram Moolenaar CheckScriptSuccess([ 25371966c248SBram Moolenaar 'vim9script', 25381966c248SBram Moolenaar 'hi clear This # comment', 25391966c248SBram Moolenaar 'hi clear # comment', 25401966c248SBram Moolenaar ]) 2541f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2542f5be8cdbSBram Moolenaar # hi clear This# comment', 25431966c248SBram Moolenaar CheckScriptFailure([ 25441966c248SBram Moolenaar 'vim9script', 25451966c248SBram Moolenaar 'hi clear# comment', 25461966c248SBram Moolenaar ], 'E416:') 25471966c248SBram Moolenaar 25481966c248SBram Moolenaar CheckScriptSuccess([ 25491966c248SBram Moolenaar 'vim9script', 25501966c248SBram Moolenaar 'hi Group term=bold', 25511966c248SBram Moolenaar 'match Group /todo/ # comment', 25521966c248SBram Moolenaar ]) 25531966c248SBram Moolenaar CheckScriptFailure([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'hi Group term=bold', 25561966c248SBram Moolenaar 'match Group /todo/# comment', 25571966c248SBram Moolenaar ], 'E488:') 25581966c248SBram Moolenaar CheckScriptSuccess([ 25591966c248SBram Moolenaar 'vim9script', 25601966c248SBram Moolenaar 'match # comment', 25611966c248SBram Moolenaar ]) 25621966c248SBram Moolenaar CheckScriptFailure([ 25631966c248SBram Moolenaar 'vim9script', 25641966c248SBram Moolenaar 'match# comment', 2565f8103f27SBram Moolenaar ], 'E1144:') 25661966c248SBram Moolenaar CheckScriptSuccess([ 25671966c248SBram Moolenaar 'vim9script', 25681966c248SBram Moolenaar 'match none # comment', 25691966c248SBram Moolenaar ]) 25701966c248SBram Moolenaar CheckScriptFailure([ 25711966c248SBram Moolenaar 'vim9script', 25721966c248SBram Moolenaar 'match none# comment', 25731966c248SBram Moolenaar ], 'E475:') 25741966c248SBram Moolenaar 25751966c248SBram Moolenaar CheckScriptSuccess([ 25761966c248SBram Moolenaar 'vim9script', 25771966c248SBram Moolenaar 'menutrans clear # comment', 25781966c248SBram Moolenaar ]) 25791966c248SBram Moolenaar CheckScriptFailure([ 25801966c248SBram Moolenaar 'vim9script', 25811966c248SBram Moolenaar 'menutrans clear# comment text', 25821966c248SBram Moolenaar ], 'E474:') 25831966c248SBram Moolenaar 25841966c248SBram Moolenaar CheckScriptSuccess([ 25851966c248SBram Moolenaar 'vim9script', 25861966c248SBram Moolenaar 'syntax clear # comment', 25871966c248SBram Moolenaar ]) 25881966c248SBram Moolenaar CheckScriptFailure([ 25891966c248SBram Moolenaar 'vim9script', 25901966c248SBram Moolenaar 'syntax clear# comment text', 25911966c248SBram Moolenaar ], 'E28:') 25921966c248SBram Moolenaar CheckScriptSuccess([ 25931966c248SBram Moolenaar 'vim9script', 25941966c248SBram Moolenaar 'syntax keyword Word some', 25951966c248SBram Moolenaar 'syntax clear Word # comment', 25961966c248SBram Moolenaar ]) 25971966c248SBram Moolenaar CheckScriptFailure([ 25981966c248SBram Moolenaar 'vim9script', 25991966c248SBram Moolenaar 'syntax keyword Word some', 26001966c248SBram Moolenaar 'syntax clear Word# comment text', 26011966c248SBram Moolenaar ], 'E28:') 26021966c248SBram Moolenaar 26031966c248SBram Moolenaar CheckScriptSuccess([ 26041966c248SBram Moolenaar 'vim9script', 26051966c248SBram Moolenaar 'syntax list # comment', 26061966c248SBram Moolenaar ]) 26071966c248SBram Moolenaar CheckScriptFailure([ 26081966c248SBram Moolenaar 'vim9script', 26091966c248SBram Moolenaar 'syntax list# comment text', 26101966c248SBram Moolenaar ], 'E28:') 26111966c248SBram Moolenaar 26121966c248SBram Moolenaar CheckScriptSuccess([ 26131966c248SBram Moolenaar 'vim9script', 26141966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26151966c248SBram Moolenaar ]) 26161966c248SBram Moolenaar CheckScriptFailure([ 26171966c248SBram Moolenaar 'vim9script', 26181966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26191966c248SBram Moolenaar ], 'E475:') 26201966c248SBram Moolenaar 26211966c248SBram Moolenaar CheckScriptSuccess([ 26221966c248SBram Moolenaar 'vim9script', 26231966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26241966c248SBram Moolenaar ]) 26251966c248SBram Moolenaar CheckScriptFailure([ 26261966c248SBram Moolenaar 'vim9script', 26271966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26281966c248SBram Moolenaar ], 'E789:') 26291966c248SBram Moolenaar 26301966c248SBram Moolenaar CheckScriptSuccess([ 26311966c248SBram Moolenaar 'vim9script', 26321966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26331966c248SBram Moolenaar ]) 26341966c248SBram Moolenaar CheckScriptFailure([ 26351966c248SBram Moolenaar 'vim9script', 26361966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26371966c248SBram Moolenaar ], 'E402:') 26381966c248SBram Moolenaar 26391966c248SBram Moolenaar CheckScriptSuccess([ 26401966c248SBram Moolenaar 'vim9script', 26411966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26421966c248SBram Moolenaar ]) 26431966c248SBram Moolenaar CheckScriptFailure([ 26441966c248SBram Moolenaar 'vim9script', 26451966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26461966c248SBram Moolenaar ], 'E475:') 26471966c248SBram Moolenaar CheckScriptFailure([ 26481966c248SBram Moolenaar 'vim9script', 26491966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26501966c248SBram Moolenaar ], 'E406:') 26511966c248SBram Moolenaar CheckScriptFailure([ 26521966c248SBram Moolenaar 'vim9script', 26531966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26541966c248SBram Moolenaar ], 'E475:') 26551966c248SBram Moolenaar 26561966c248SBram Moolenaar CheckScriptSuccess([ 26571966c248SBram Moolenaar 'vim9script', 26581966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26591966c248SBram Moolenaar ]) 26601966c248SBram Moolenaar CheckScriptFailure([ 26611966c248SBram Moolenaar 'vim9script', 26621966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2663d032f34aSBram Moolenaar ], 'E402:') 26641966c248SBram Moolenaar 26651966c248SBram Moolenaar CheckScriptSuccess([ 26661966c248SBram Moolenaar 'vim9script', 26671966c248SBram Moolenaar 'syntax sync # comment', 26681966c248SBram Moolenaar ]) 26691966c248SBram Moolenaar CheckScriptFailure([ 26701966c248SBram Moolenaar 'vim9script', 26711966c248SBram Moolenaar 'syntax sync# comment', 26721966c248SBram Moolenaar ], 'E404:') 26731966c248SBram Moolenaar CheckScriptSuccess([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'syntax sync ccomment # comment', 26761966c248SBram Moolenaar ]) 26771966c248SBram Moolenaar CheckScriptFailure([ 26781966c248SBram Moolenaar 'vim9script', 26791966c248SBram Moolenaar 'syntax sync ccomment# comment', 26801966c248SBram Moolenaar ], 'E404:') 26811966c248SBram Moolenaar 26821966c248SBram Moolenaar CheckScriptSuccess([ 26831966c248SBram Moolenaar 'vim9script', 26841966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26851966c248SBram Moolenaar ]) 26861966c248SBram Moolenaar CheckScriptFailure([ 26871966c248SBram Moolenaar 'vim9script', 26881966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 26891966c248SBram Moolenaar ], 'E475:') 2690a72cfb80SBram Moolenaar 2691a72cfb80SBram Moolenaar CheckScriptSuccess([ 2692a72cfb80SBram Moolenaar 'vim9script', 2693a72cfb80SBram Moolenaar 'command Echo echo # comment', 2694a72cfb80SBram Moolenaar 'command Echo # comment', 26952d870f8dSBram Moolenaar 'delcommand Echo', 2696a72cfb80SBram Moolenaar ]) 2697a72cfb80SBram Moolenaar CheckScriptFailure([ 2698a72cfb80SBram Moolenaar 'vim9script', 2699a72cfb80SBram Moolenaar 'command Echo echo# comment', 2700a72cfb80SBram Moolenaar 'Echo', 2701f8103f27SBram Moolenaar ], 'E1144:') 27022d870f8dSBram Moolenaar delcommand Echo 270370249ee8SBram Moolenaar 270470249ee8SBram Moolenaar var curdir = getcwd() 270570249ee8SBram Moolenaar CheckScriptSuccess([ 270670249ee8SBram Moolenaar 'command Echo cd " comment', 270770249ee8SBram Moolenaar 'Echo', 270870249ee8SBram Moolenaar 'delcommand Echo', 270970249ee8SBram Moolenaar ]) 271070249ee8SBram Moolenaar CheckScriptSuccess([ 2711090728adSBram Moolenaar 'vim9script', 271270249ee8SBram Moolenaar 'command Echo cd # comment', 271370249ee8SBram Moolenaar 'Echo', 271470249ee8SBram Moolenaar 'delcommand Echo', 271570249ee8SBram Moolenaar ]) 271670249ee8SBram Moolenaar CheckScriptFailure([ 271770249ee8SBram Moolenaar 'vim9script', 271870249ee8SBram Moolenaar 'command Echo cd " comment', 271970249ee8SBram Moolenaar 'Echo', 272070249ee8SBram Moolenaar ], 'E344:') 272170249ee8SBram Moolenaar delcommand Echo 272270249ee8SBram Moolenaar chdir(curdir) 272370249ee8SBram Moolenaar 2724a72cfb80SBram Moolenaar CheckScriptFailure([ 2725a72cfb80SBram Moolenaar 'vim9script', 2726a72cfb80SBram Moolenaar 'command Echo# comment', 2727a72cfb80SBram Moolenaar ], 'E182:') 2728a72cfb80SBram Moolenaar CheckScriptFailure([ 2729a72cfb80SBram Moolenaar 'vim9script', 2730a72cfb80SBram Moolenaar 'command Echo echo', 2731a72cfb80SBram Moolenaar 'command Echo# comment', 2732a72cfb80SBram Moolenaar ], 'E182:') 27332d870f8dSBram Moolenaar delcommand Echo 2734a72cfb80SBram Moolenaar 2735a72cfb80SBram Moolenaar CheckScriptSuccess([ 2736a72cfb80SBram Moolenaar 'vim9script', 2737a72cfb80SBram Moolenaar 'function # comment', 2738a72cfb80SBram Moolenaar ]) 2739a72cfb80SBram Moolenaar CheckScriptFailure([ 2740a72cfb80SBram Moolenaar 'vim9script', 27419898107fSBram Moolenaar 'function " comment', 27429898107fSBram Moolenaar ], 'E129:') 27439898107fSBram Moolenaar CheckScriptFailure([ 27449898107fSBram Moolenaar 'vim9script', 2745a72cfb80SBram Moolenaar 'function# comment', 2746f8103f27SBram Moolenaar ], 'E1144:') 2747a72cfb80SBram Moolenaar CheckScriptSuccess([ 2748a72cfb80SBram Moolenaar 'vim9script', 2749a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2750a72cfb80SBram Moolenaar ]) 2751a72cfb80SBram Moolenaar CheckScriptFailure([ 2752a72cfb80SBram Moolenaar 'vim9script', 2753a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2754a72cfb80SBram Moolenaar ], 'E488:') 2755a72cfb80SBram Moolenaar 2756a72cfb80SBram Moolenaar CheckScriptSuccess([ 2757a72cfb80SBram Moolenaar 'vim9script', 27584c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2759a72cfb80SBram Moolenaar 'endfunc', 27604c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2761a72cfb80SBram Moolenaar ]) 2762a72cfb80SBram Moolenaar CheckScriptFailure([ 2763a72cfb80SBram Moolenaar 'vim9script', 27644c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2765a72cfb80SBram Moolenaar 'endfunc', 27664c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2767a72cfb80SBram Moolenaar ], 'E488:') 2768a72cfb80SBram Moolenaar 2769a72cfb80SBram Moolenaar CheckScriptSuccess([ 2770a72cfb80SBram Moolenaar 'vim9script', 2771a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2772a72cfb80SBram Moolenaar ]) 2773a72cfb80SBram Moolenaar CheckScriptFailure([ 2774a72cfb80SBram Moolenaar 'vim9script', 2775a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2776a72cfb80SBram Moolenaar ], 'E488:') 2777e7e4838fSBram Moolenaar 2778e7e4838fSBram Moolenaar CheckScriptFailure([ 2779e7e4838fSBram Moolenaar 'def Test() " comment', 2780e7e4838fSBram Moolenaar 'enddef', 2781e7e4838fSBram Moolenaar ], 'E488:') 2782e7e4838fSBram Moolenaar CheckScriptFailure([ 2783e7e4838fSBram Moolenaar 'vim9script', 2784e7e4838fSBram Moolenaar 'def Test() " comment', 2785e7e4838fSBram Moolenaar 'enddef', 2786e7e4838fSBram Moolenaar ], 'E488:') 2787e7e4838fSBram Moolenaar 2788e7e4838fSBram Moolenaar CheckScriptSuccess([ 2789e7e4838fSBram Moolenaar 'func Test() " comment', 2790e7e4838fSBram Moolenaar 'endfunc', 27912d870f8dSBram Moolenaar 'delfunc Test', 2792e7e4838fSBram Moolenaar ]) 27939898107fSBram Moolenaar CheckScriptSuccess([ 2794e7e4838fSBram Moolenaar 'vim9script', 2795e7e4838fSBram Moolenaar 'func Test() " comment', 2796e7e4838fSBram Moolenaar 'endfunc', 27979898107fSBram Moolenaar ]) 2798e7e4838fSBram Moolenaar 2799e7e4838fSBram Moolenaar CheckScriptSuccess([ 2800e7e4838fSBram Moolenaar 'def Test() # comment', 2801e7e4838fSBram Moolenaar 'enddef', 2802e7e4838fSBram Moolenaar ]) 2803e7e4838fSBram Moolenaar CheckScriptFailure([ 2804e7e4838fSBram Moolenaar 'func Test() # comment', 2805e7e4838fSBram Moolenaar 'endfunc', 2806e7e4838fSBram Moolenaar ], 'E488:') 28072c5ed4e3SBram Moolenaarenddef 28082c5ed4e3SBram Moolenaar 28092c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28102c5ed4e3SBram Moolenaar CheckCanRunGui 28112c5ed4e3SBram Moolenaar 28122c5ed4e3SBram Moolenaar CheckScriptFailure([ 28132c5ed4e3SBram Moolenaar 'vim9script', 28142c5ed4e3SBram Moolenaar 'gui#comment' 2815f8103f27SBram Moolenaar ], 'E1144:') 28162c5ed4e3SBram Moolenaar CheckScriptFailure([ 28172c5ed4e3SBram Moolenaar 'vim9script', 28182c5ed4e3SBram Moolenaar 'gui -f#comment' 28192c5ed4e3SBram Moolenaar ], 'E499:') 28207a092245SBram Moolenaarenddef 28217a092245SBram Moolenaar 2822a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28236797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28246797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2825a26b9700SBram Moolenaar 2826a26b9700SBram Moolenaar edit test.vim 2827a26b9700SBram Moolenaar doautocmd TabEnter #comment 2828a26b9700SBram Moolenaar assert_equal(1, g:entered) 2829a26b9700SBram Moolenaar 2830a26b9700SBram Moolenaar doautocmd TabEnter f.x 2831a26b9700SBram Moolenaar assert_equal(2, g:entered) 2832a26b9700SBram Moolenaar 2833a26b9700SBram Moolenaar g:entered = 0 2834a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2835a26b9700SBram Moolenaar assert_equal(2, g:entered) 2836a26b9700SBram Moolenaar 2837a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2838a26b9700SBram Moolenaar 2839a26b9700SBram Moolenaar au! TabEnter 2840a26b9700SBram Moolenaar unlet g:entered 2841d72c1bf0SBram Moolenaar 2842d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2843d72c1bf0SBram Moolenaar 'vim9script', 28446797966dSBram Moolenaar 'g:var = 123', 2845e55b1c09SBram Moolenaar 'b:var = 456', 2846e55b1c09SBram Moolenaar 'w:var = 777', 2847e55b1c09SBram Moolenaar 't:var = 888', 2848d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2849d72c1bf0SBram Moolenaar ]) 2850d72c1bf0SBram Moolenaar 2851d72c1bf0SBram Moolenaar CheckScriptFailure([ 2852d72c1bf0SBram Moolenaar 'vim9script', 2853cfcd011fSBram Moolenaar 'let var = 123', 2854cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2855cfcd011fSBram Moolenaar 2856cfcd011fSBram Moolenaar CheckScriptFailure([ 2857cfcd011fSBram Moolenaar 'vim9script', 2858cfcd011fSBram Moolenaar 'var g:var = 123', 2859e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2860e55b1c09SBram Moolenaar 2861e55b1c09SBram Moolenaar CheckScriptFailure([ 2862e55b1c09SBram Moolenaar 'vim9script', 2863cfcd011fSBram Moolenaar 'var b:var = 123', 2864e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2865e55b1c09SBram Moolenaar 2866e55b1c09SBram Moolenaar CheckScriptFailure([ 2867e55b1c09SBram Moolenaar 'vim9script', 2868cfcd011fSBram Moolenaar 'var w:var = 123', 2869e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2870e55b1c09SBram Moolenaar 2871e55b1c09SBram Moolenaar CheckScriptFailure([ 2872e55b1c09SBram Moolenaar 'vim9script', 2873cfcd011fSBram Moolenaar 'var t:var = 123', 2874e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2875e55b1c09SBram Moolenaar 2876e55b1c09SBram Moolenaar CheckScriptFailure([ 2877e55b1c09SBram Moolenaar 'vim9script', 2878cfcd011fSBram Moolenaar 'var v:version = 123', 2879e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2880e55b1c09SBram Moolenaar 2881e55b1c09SBram Moolenaar CheckScriptFailure([ 2882e55b1c09SBram Moolenaar 'vim9script', 2883cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2884e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28856797966dSBram Moolenaar 28866797966dSBram Moolenaar CheckScriptFailure([ 28876797966dSBram Moolenaar 'vim9script', 28886797966dSBram Moolenaar 'g:var = 123', 288932e35117SBram Moolenaar 'unlet g:var# comment1', 2890d72c1bf0SBram Moolenaar ], 'E108:') 2891d72c1bf0SBram Moolenaar 2892d72c1bf0SBram Moolenaar CheckScriptFailure([ 2893d72c1bf0SBram Moolenaar 'let g:var = 123', 2894d72c1bf0SBram Moolenaar 'unlet g:var # something', 2895d72c1bf0SBram Moolenaar ], 'E488:') 2896faac4104SBram Moolenaar 2897faac4104SBram Moolenaar CheckScriptSuccess([ 2898faac4104SBram Moolenaar 'vim9script', 289932e35117SBram Moolenaar 'if 1 # comment2', 2900faac4104SBram Moolenaar ' echo "yes"', 2901faac4104SBram Moolenaar 'elseif 2 #comment', 2902faac4104SBram Moolenaar ' echo "no"', 2903faac4104SBram Moolenaar 'endif', 2904faac4104SBram Moolenaar ]) 2905faac4104SBram Moolenaar 2906faac4104SBram Moolenaar CheckScriptFailure([ 2907faac4104SBram Moolenaar 'vim9script', 290832e35117SBram Moolenaar 'if 1# comment3', 2909faac4104SBram Moolenaar ' echo "yes"', 2910faac4104SBram Moolenaar 'endif', 2911faac4104SBram Moolenaar ], 'E15:') 2912faac4104SBram Moolenaar 2913faac4104SBram Moolenaar CheckScriptFailure([ 2914faac4104SBram Moolenaar 'vim9script', 291532e35117SBram Moolenaar 'if 0 # comment4', 2916faac4104SBram Moolenaar ' echo "yes"', 2917faac4104SBram Moolenaar 'elseif 2#comment', 2918faac4104SBram Moolenaar ' echo "no"', 2919faac4104SBram Moolenaar 'endif', 2920faac4104SBram Moolenaar ], 'E15:') 2921faac4104SBram Moolenaar 2922faac4104SBram Moolenaar CheckScriptSuccess([ 2923faac4104SBram Moolenaar 'vim9script', 2924cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2925faac4104SBram Moolenaar ]) 2926faac4104SBram Moolenaar 2927faac4104SBram Moolenaar CheckScriptFailure([ 2928faac4104SBram Moolenaar 'vim9script', 2929cfcd011fSBram Moolenaar 'var v = 1# comment6', 293032e35117SBram Moolenaar ], 'E15:') 2931faac4104SBram Moolenaar 2932faac4104SBram Moolenaar CheckScriptSuccess([ 2933faac4104SBram Moolenaar 'vim9script', 2934faac4104SBram Moolenaar 'new' 2935d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2936df069eecSBram Moolenaar ':$', 2937faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2938faac4104SBram Moolenaar 'bwipe!', 2939faac4104SBram Moolenaar ]) 2940faac4104SBram Moolenaar 2941f5be8cdbSBram Moolenaar CheckScriptFailure([ 2942f5be8cdbSBram Moolenaar 'vim9script', 2943f5be8cdbSBram Moolenaar 'new' 2944d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2945f5be8cdbSBram Moolenaar ':$', 2946f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2947f5be8cdbSBram Moolenaar 'bwipe!', 2948f5be8cdbSBram Moolenaar ], 'E488:') 2949f5be8cdbSBram Moolenaar 2950f5be8cdbSBram Moolenaar CheckScriptFailure([ 2951f5be8cdbSBram Moolenaar 'vim9script', 2952f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2953f5be8cdbSBram Moolenaar ], 'E477:') 2954a26b9700SBram Moolenaarenddef 2955a26b9700SBram Moolenaar 29567e5bd91dSBram Moolenaardef Test_finish() 2957cfcd011fSBram Moolenaar var lines =<< trim END 29587e5bd91dSBram Moolenaar vim9script 29596797966dSBram Moolenaar g:res = 'one' 29607e5bd91dSBram Moolenaar if v:false | finish | endif 29616797966dSBram Moolenaar g:res = 'two' 29627e5bd91dSBram Moolenaar finish 29636797966dSBram Moolenaar g:res = 'three' 29647e5bd91dSBram Moolenaar END 29657e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29667e5bd91dSBram Moolenaar source Xfinished 29677e5bd91dSBram Moolenaar assert_equal('two', g:res) 29687e5bd91dSBram Moolenaar 29697e5bd91dSBram Moolenaar unlet g:res 29707e5bd91dSBram Moolenaar delete('Xfinished') 29717e5bd91dSBram Moolenaarenddef 29727e5bd91dSBram Moolenaar 2973a5d0077eSBram Moolenaardef Test_forward_declaration() 2974cfcd011fSBram Moolenaar var lines =<< trim END 2975a5d0077eSBram Moolenaar vim9script 2976a5d0077eSBram Moolenaar def GetValue(): string 2977a5d0077eSBram Moolenaar return theVal 2978a5d0077eSBram Moolenaar enddef 2979cfcd011fSBram Moolenaar var theVal = 'something' 2980822ba247SBram Moolenaar g:initVal = GetValue() 2981a5d0077eSBram Moolenaar theVal = 'else' 2982a5d0077eSBram Moolenaar g:laterVal = GetValue() 2983a5d0077eSBram Moolenaar END 2984a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2985a5d0077eSBram Moolenaar source Xforward 2986a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2987a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2988a5d0077eSBram Moolenaar 2989a5d0077eSBram Moolenaar unlet g:initVal 2990a5d0077eSBram Moolenaar unlet g:laterVal 2991a5d0077eSBram Moolenaar delete('Xforward') 2992a5d0077eSBram Moolenaarenddef 2993a5d0077eSBram Moolenaar 29949721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2995a6294955SBram Moolenaar var vim9_lines =<< trim END 2996a6294955SBram Moolenaar vim9script 2997a6294955SBram Moolenaar var local = 'local' 2998a6294955SBram Moolenaar g:global = 'global' 2999a6294955SBram Moolenaar export var exported = 'exported' 3000a6294955SBram Moolenaar export def GetText(): string 3001a6294955SBram Moolenaar return 'text' 3002a6294955SBram Moolenaar enddef 3003a6294955SBram Moolenaar END 3004a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3005a6294955SBram Moolenaar 3006cfcd011fSBram Moolenaar var legacy_lines =<< trim END 30079721fb4eSBram Moolenaar source Xvim9_script.vim 30089721fb4eSBram Moolenaar 30099721fb4eSBram Moolenaar call assert_false(exists('local')) 30109721fb4eSBram Moolenaar call assert_false(exists('exported')) 30119721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30129721fb4eSBram Moolenaar call assert_equal('global', global) 30139721fb4eSBram Moolenaar call assert_equal('global', g:global) 30149721fb4eSBram Moolenaar 30159721fb4eSBram Moolenaar " imported variable becomes script-local 30169721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30179721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30189721fb4eSBram Moolenaar call assert_false(exists('exported')) 30199721fb4eSBram Moolenaar 30209721fb4eSBram Moolenaar " imported function becomes script-local 30219721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30229721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30239721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30249721fb4eSBram Moolenaar END 30259721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30269721fb4eSBram Moolenaar 30279721fb4eSBram Moolenaar source Xlegacy_script.vim 30289721fb4eSBram Moolenaar assert_equal('global', g:global) 3029f5be8cdbSBram Moolenaar unlet g:global 30309721fb4eSBram Moolenaar 30319721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30329721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30339721fb4eSBram Moolenaarenddef 3034a5d0077eSBram Moolenaar 30357d699701SBram Moolenaarfunc Test_vim9script_not_global() 30367d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30377d699701SBram Moolenaar let vim9lines =<< trim END 30387d699701SBram Moolenaar vim9script 3039cfcd011fSBram Moolenaar var name = 'local' 30407d699701SBram Moolenaar func TheFunc() 30417d699701SBram Moolenaar echo 'local' 30427d699701SBram Moolenaar endfunc 30437d699701SBram Moolenaar def DefFunc() 30447d699701SBram Moolenaar echo 'local' 30457d699701SBram Moolenaar enddef 30467d699701SBram Moolenaar END 30477d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30487d699701SBram Moolenaar source Xvim9script.vim 30497d699701SBram Moolenaar try 30507d699701SBram Moolenaar echo g:var 30517d699701SBram Moolenaar assert_report('did not fail') 30527d699701SBram Moolenaar catch /E121:/ 30537d699701SBram Moolenaar " caught 30547d699701SBram Moolenaar endtry 30557d699701SBram Moolenaar try 30567d699701SBram Moolenaar call TheFunc() 30577d699701SBram Moolenaar assert_report('did not fail') 30587d699701SBram Moolenaar catch /E117:/ 30597d699701SBram Moolenaar " caught 30607d699701SBram Moolenaar endtry 30617d699701SBram Moolenaar try 30627d699701SBram Moolenaar call DefFunc() 30637d699701SBram Moolenaar assert_report('did not fail') 30647d699701SBram Moolenaar catch /E117:/ 30657d699701SBram Moolenaar " caught 30667d699701SBram Moolenaar endtry 30677d699701SBram Moolenaar 306825859dd7SBram Moolenaar call delete('Xvim9script.vim') 30697d699701SBram Moolenaarendfunc 30707d699701SBram Moolenaar 3071eeb27bfeSBram Moolenaardef Test_vim9_copen() 3072eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3073eeb27bfeSBram Moolenaar copen 3074eeb27bfeSBram Moolenaar quit 3075eeb27bfeSBram Moolenaarenddef 3076eeb27bfeSBram Moolenaar 307703290b84SBram Moolenaar" test using an auto-loaded function and variable 30782d6b20d6SBram Moolenaardef Test_vim9_autoload() 3079cfcd011fSBram Moolenaar var lines =<< trim END 30802d6b20d6SBram Moolenaar vim9script 308103290b84SBram Moolenaar def some#gettest(): string 308203290b84SBram Moolenaar return 'test' 308303290b84SBram Moolenaar enddef 308403290b84SBram Moolenaar g:some#name = 'name' 308503290b84SBram Moolenaar END 308603290b84SBram Moolenaar 308703290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 308803290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 308903290b84SBram Moolenaar var save_rtp = &rtp 309003290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 309103290b84SBram Moolenaar 309203290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 309303290b84SBram Moolenaar assert_equal('name', g:some#name) 309403290b84SBram Moolenaar g:some#other = 'other' 309503290b84SBram Moolenaar assert_equal('other', g:some#other) 309603290b84SBram Moolenaar 309717f700acSBram Moolenaar # upper case script name works 309817f700acSBram Moolenaar lines =<< trim END 309917f700acSBram Moolenaar vim9script 310017f700acSBram Moolenaar def Other#getOther(): string 310117f700acSBram Moolenaar return 'other' 310217f700acSBram Moolenaar enddef 310317f700acSBram Moolenaar END 310417f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 310517f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 310617f700acSBram Moolenaar 310703290b84SBram Moolenaar delete('Xdir', 'rf') 310803290b84SBram Moolenaar &rtp = save_rtp 310903290b84SBram Moolenaarenddef 311003290b84SBram Moolenaar 311103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 311203290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 311303290b84SBram Moolenaar var lines =<< trim END 311403290b84SBram Moolenaar vim9script 31152d6b20d6SBram Moolenaar def foo#test() 31162d6b20d6SBram Moolenaar echomsg getreg('"') 31172d6b20d6SBram Moolenaar enddef 31182d6b20d6SBram Moolenaar END 31192d6b20d6SBram Moolenaar 31202d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31212d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3122cfcd011fSBram Moolenaar var save_rtp = &rtp 31232d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31242d6b20d6SBram Moolenaar augroup test 31252d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31262d6b20d6SBram Moolenaar augroup END 31272d6b20d6SBram Moolenaar 31282d6b20d6SBram Moolenaar normal Y 31292d6b20d6SBram Moolenaar 31302d6b20d6SBram Moolenaar augroup test 31312d6b20d6SBram Moolenaar autocmd! 31322d6b20d6SBram Moolenaar augroup END 31332d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31342d6b20d6SBram Moolenaar &rtp = save_rtp 31352d6b20d6SBram Moolenaarenddef 31362d6b20d6SBram Moolenaar 313777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 313877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3139cfcd011fSBram Moolenaar var lines =<< trim END 314077e5dcc3SBram Moolenaar vim9script 314177e5dcc3SBram Moolenaar def crash#func() 314277e5dcc3SBram Moolenaar try 314377e5dcc3SBram Moolenaar for x in List() 314477e5dcc3SBram Moolenaar endfor 314577e5dcc3SBram Moolenaar catch 314677e5dcc3SBram Moolenaar endtry 314777e5dcc3SBram Moolenaar g:ok = true 314877e5dcc3SBram Moolenaar enddef 314977e5dcc3SBram Moolenaar fu List() 315077e5dcc3SBram Moolenaar invalid 315177e5dcc3SBram Moolenaar endfu 315277e5dcc3SBram Moolenaar try 315348e11c10SBram Moolenaar alsoinvalid 315477e5dcc3SBram Moolenaar catch /wontmatch/ 315577e5dcc3SBram Moolenaar endtry 315677e5dcc3SBram Moolenaar END 315777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 315877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 315977e5dcc3SBram Moolenaar 316077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 316177e5dcc3SBram Moolenaar lines =<< trim END 316277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 316377e5dcc3SBram Moolenaar call crash#func() 316477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31659c4f5520SBram Moolenaar qall! 316677e5dcc3SBram Moolenaar END 316777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 316877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 316977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 317077e5dcc3SBram Moolenaar 317177e5dcc3SBram Moolenaar delete('Xdidit') 317277e5dcc3SBram Moolenaar delete('Xscript') 317377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 317403290b84SBram Moolenaar 317503290b84SBram Moolenaar lines =<< trim END 317603290b84SBram Moolenaar vim9script 317703290b84SBram Moolenaar var foo#bar = 'asdf' 317803290b84SBram Moolenaar END 317903290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 318077e5dcc3SBram Moolenaarenddef 318177e5dcc3SBram Moolenaar 318281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 318381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 318481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3185cfcd011fSBram Moolenaar var lines =<< trim END 318681e17fbeSBram Moolenaar let s:counter = 1 318781e17fbeSBram Moolenaar def s:Func() 318881e17fbeSBram Moolenaar au! CursorHold 318981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 319081e17fbeSBram Moolenaar enddef 319181e17fbeSBram Moolenaar call s:Func() 319281e17fbeSBram Moolenaar doau CursorHold 319381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 319481e17fbeSBram Moolenaar au! CursorHold 319581e17fbeSBram Moolenaar END 319681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 319781e17fbeSBram Moolenaarenddef 319881e17fbeSBram Moolenaar 31993896a105SBram Moolenaardef Test_cmdline_win() 32003896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32013896a105SBram Moolenaar # the command line window. 32023896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3203cfcd011fSBram Moolenaar var export_lines =<< trim END 32043896a105SBram Moolenaar vim9script 3205cfcd011fSBram Moolenaar export var That = 'yes' 32063896a105SBram Moolenaar END 32073896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3208cfcd011fSBram Moolenaar var import_lines =<< trim END 32093896a105SBram Moolenaar vim9script 32103896a105SBram Moolenaar import That from './Xexport.vim' 32113896a105SBram Moolenaar END 32123896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3213cfcd011fSBram Moolenaar var save_rtp = &rtp 32143896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32153896a105SBram Moolenaar syntax on 32163896a105SBram Moolenaar augroup CmdWin 32173896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32183896a105SBram Moolenaar augroup END 32193896a105SBram Moolenaar # this will open and also close the cmdline window 32203896a105SBram Moolenaar feedkeys('q:', 'xt') 32213896a105SBram Moolenaar assert_equal('yes', g:got_there) 32223896a105SBram Moolenaar 32233896a105SBram Moolenaar augroup CmdWin 32243896a105SBram Moolenaar au! 32253896a105SBram Moolenaar augroup END 32263896a105SBram Moolenaar &rtp = save_rtp 32273896a105SBram Moolenaar delete('rtp', 'rf') 32283896a105SBram Moolenaarenddef 32293896a105SBram Moolenaar 3230e3d4685fSBram Moolenaardef Test_invalid_sid() 3231e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 323225859dd7SBram Moolenaar 32339c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3234d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3235e3d4685fSBram Moolenaar endif 3236e3d4685fSBram Moolenaar delete('Xdidit') 3237e3d4685fSBram Moolenaarenddef 3238e3d4685fSBram Moolenaar 32399ec7026fSBram Moolenaardef Test_restoring_cpo() 32409ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 32419ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 32429ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 32439ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 32449ec7026fSBram Moolenaar endif 32459ec7026fSBram Moolenaar delete('Xsourced') 32469ec7026fSBram Moolenaar delete('Xclose') 3247090728adSBram Moolenaar delete('Xdone') 32480123cc1eSBram Moolenaar 32490123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 32500123cc1eSBram Moolenaar set cpo=aABceFsMny> 32510123cc1eSBram Moolenaar edit XanotherScript 32520123cc1eSBram Moolenaar so % 32530123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32540123cc1eSBram Moolenaar :1del 32550123cc1eSBram Moolenaar w 32560123cc1eSBram Moolenaar so % 32570123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32580123cc1eSBram Moolenaar 32590123cc1eSBram Moolenaar delete('XanotherScript') 32600123cc1eSBram Moolenaar set cpo&vim 32619ec7026fSBram Moolenaarenddef 32629ec7026fSBram Moolenaar 32639ec7026fSBram Moolenaar 3264f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3265cfcd011fSBram Moolenaar var lines =<< trim END 3266cfcd011fSBram Moolenaar var name: any 3267cfcd011fSBram Moolenaar assert_equal(0, name) 3268f0afd9e1SBram Moolenaar END 3269f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3270f0afd9e1SBram Moolenaarenddef 3271f0afd9e1SBram Moolenaar 32727e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 327358dbef33SBram Moolenaar CheckRunVimInTerminal 327458dbef33SBram Moolenaar 32757e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 32767e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 32777e9210eaSBram Moolenaarendfunc 32787e9210eaSBram Moolenaar 32797e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 32809c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3281cfcd011fSBram Moolenaar var lines =<< trim END 32829c4f5520SBram Moolenaar func CheckAndQuit() 32839c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 32849c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 32859c4f5520SBram Moolenaar endfunc 32869c4f5520SBram Moolenaar END 32879c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 32889c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3289e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 32909c4f5520SBram Moolenaar # define Afunc() on the command line 32919c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 32929c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 32932949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 32949c4f5520SBram Moolenaar 32959c4f5520SBram Moolenaar call StopVimInTerminal(buf) 32969c4f5520SBram Moolenaar delete('XcallFunc') 32979c4f5520SBram Moolenaar delete('Xdidcmd') 32989c4f5520SBram Moolenaarenddef 32999c4f5520SBram Moolenaar 3300fcdc5d83SBram Moolenaardef Test_script_var_scope() 3301fcdc5d83SBram Moolenaar var lines =<< trim END 3302fcdc5d83SBram Moolenaar vim9script 3303fcdc5d83SBram Moolenaar if true 3304fcdc5d83SBram Moolenaar if true 3305fcdc5d83SBram Moolenaar var one = 'one' 3306fcdc5d83SBram Moolenaar echo one 3307fcdc5d83SBram Moolenaar endif 3308fcdc5d83SBram Moolenaar echo one 3309fcdc5d83SBram Moolenaar endif 3310fcdc5d83SBram Moolenaar END 3311fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3312fcdc5d83SBram Moolenaar 3313fcdc5d83SBram Moolenaar lines =<< trim END 3314fcdc5d83SBram Moolenaar vim9script 3315fcdc5d83SBram Moolenaar if true 3316fcdc5d83SBram Moolenaar if false 3317fcdc5d83SBram Moolenaar var one = 'one' 3318fcdc5d83SBram Moolenaar echo one 3319fcdc5d83SBram Moolenaar else 3320fcdc5d83SBram Moolenaar var one = 'one' 3321fcdc5d83SBram Moolenaar echo one 3322fcdc5d83SBram Moolenaar endif 3323fcdc5d83SBram Moolenaar echo one 3324fcdc5d83SBram Moolenaar endif 3325fcdc5d83SBram Moolenaar END 3326fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3327fcdc5d83SBram Moolenaar 3328fcdc5d83SBram Moolenaar lines =<< trim END 3329fcdc5d83SBram Moolenaar vim9script 3330fcdc5d83SBram Moolenaar while true 3331fcdc5d83SBram Moolenaar var one = 'one' 3332fcdc5d83SBram Moolenaar echo one 3333fcdc5d83SBram Moolenaar break 3334fcdc5d83SBram Moolenaar endwhile 3335fcdc5d83SBram Moolenaar echo one 3336fcdc5d83SBram Moolenaar END 3337fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3338fcdc5d83SBram Moolenaar 3339fcdc5d83SBram Moolenaar lines =<< trim END 3340fcdc5d83SBram Moolenaar vim9script 3341fcdc5d83SBram Moolenaar for i in range(1) 3342fcdc5d83SBram Moolenaar var one = 'one' 3343fcdc5d83SBram Moolenaar echo one 3344fcdc5d83SBram Moolenaar endfor 3345fcdc5d83SBram Moolenaar echo one 3346fcdc5d83SBram Moolenaar END 3347fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 33489becdf2bSBram Moolenaar 33499becdf2bSBram Moolenaar lines =<< trim END 33509becdf2bSBram Moolenaar vim9script 33519becdf2bSBram Moolenaar { 33529becdf2bSBram Moolenaar var one = 'one' 33539becdf2bSBram Moolenaar assert_equal('one', one) 33549becdf2bSBram Moolenaar } 33559becdf2bSBram Moolenaar assert_false(exists('one')) 33569becdf2bSBram Moolenaar assert_false(exists('s:one')) 33579becdf2bSBram Moolenaar END 33589becdf2bSBram Moolenaar CheckScriptSuccess(lines) 33599becdf2bSBram Moolenaar 33609becdf2bSBram Moolenaar lines =<< trim END 33619becdf2bSBram Moolenaar vim9script 33629becdf2bSBram Moolenaar { 33639becdf2bSBram Moolenaar var one = 'one' 33649becdf2bSBram Moolenaar echo one 33659becdf2bSBram Moolenaar } 33669becdf2bSBram Moolenaar echo one 33679becdf2bSBram Moolenaar END 33689becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3369fcdc5d83SBram Moolenaarenddef 3370fcdc5d83SBram Moolenaar 3371352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3372352134bbSBram Moolenaar var lines =<< trim END 3373352134bbSBram Moolenaar vim9script 3374352134bbSBram Moolenaar def Callback(...l: any) 3375352134bbSBram Moolenaar try 3376352134bbSBram Moolenaar var x: string 3377352134bbSBram Moolenaar var y: string 3378352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3379352134bbSBram Moolenaar [x, y] = [''] 3380352134bbSBram Moolenaar catch 3381352134bbSBram Moolenaar g:caught = 'yes' 3382352134bbSBram Moolenaar endtry 3383352134bbSBram Moolenaar enddef 3384e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3385352134bbSBram Moolenaar feedkeys("\r", 'xt') 3386352134bbSBram Moolenaar END 3387352134bbSBram Moolenaar CheckScriptSuccess(lines) 3388352134bbSBram Moolenaar 3389352134bbSBram Moolenaar unlet g:caught 3390352134bbSBram Moolenaarenddef 3391352134bbSBram Moolenaar 3392631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3393631e8f93SBram Moolenaar if !has('unix') || !has('job') 3394631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3395631e8f93SBram Moolenaar endif 3396631e8f93SBram Moolenaar var lines =<< trim END 3397631e8f93SBram Moolenaar vim9script 3398631e8f93SBram Moolenaar var source: list<number> 3399631e8f93SBram Moolenaar def Out_cb(...l: any) 3400631e8f93SBram Moolenaar eval [][0] 3401631e8f93SBram Moolenaar enddef 3402631e8f93SBram Moolenaar def Exit_cb(...l: any) 3403631e8f93SBram Moolenaar sleep 1m 3404631e8f93SBram Moolenaar source += l 3405631e8f93SBram Moolenaar enddef 3406e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 34076f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 34086f17a3f0SBram Moolenaar sleep 10m 34096f17a3f0SBram Moolenaar endwhile 3410206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3411206c2a6eSBram Moolenaar sleep 100m 3412631e8f93SBram Moolenaar END 3413631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3414631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3415631e8f93SBram Moolenaar delete('Xdef') 3416631e8f93SBram Moolenaarenddef 3417631e8f93SBram Moolenaar 34184324d87aSBram Moolenaardef InvokeNormal() 34194324d87aSBram Moolenaar exe "norm! :m+1\r" 34204324d87aSBram Moolenaarenddef 34214324d87aSBram Moolenaar 34224324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 34234324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 34244324d87aSBram Moolenaar new 34254324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 34264324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 34274324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 34284324d87aSBram Moolenaar xunmap <F3> 3429b5b9480eSBram Moolenaarenddef 3430b5b9480eSBram Moolenaar 3431b5b9480eSBram Moolenaardef Test_white_space_after_command() 3432b5b9480eSBram Moolenaar var lines =<< trim END 3433b5b9480eSBram Moolenaar exit_cb: Func}) 3434b5b9480eSBram Moolenaar END 3435b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3436f8103f27SBram Moolenaar 3437f8103f27SBram Moolenaar lines =<< trim END 3438f8103f27SBram Moolenaar e# 3439f8103f27SBram Moolenaar END 3440f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 34414324d87aSBram Moolenaarenddef 34424324d87aSBram Moolenaar 34434aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 34444aab88d9SBram Moolenaar var lines =<< trim END 34454aab88d9SBram Moolenaar vim9script 34464aab88d9SBram Moolenaar if exists('g:guard') 34474aab88d9SBram Moolenaar finish 34484aab88d9SBram Moolenaar endif 34494aab88d9SBram Moolenaar g:guard = 1 34504aab88d9SBram Moolenaar var name = 'thename' 34514aab88d9SBram Moolenaar def g:GetName(): string 34524aab88d9SBram Moolenaar return name 34534aab88d9SBram Moolenaar enddef 34544aab88d9SBram Moolenaar def g:SetName(arg: string) 34554aab88d9SBram Moolenaar name = arg 34564aab88d9SBram Moolenaar enddef 34574aab88d9SBram Moolenaar END 34584aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 34594aab88d9SBram Moolenaar so XscriptTwice.vim 34604aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 34614aab88d9SBram Moolenaar g:SetName('newname') 34624aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34634aab88d9SBram Moolenaar so XscriptTwice.vim 34644aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34654aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34664aab88d9SBram Moolenaar 34674aab88d9SBram Moolenaar delfunc g:GetName 34684aab88d9SBram Moolenaar delfunc g:SetName 34694aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34704aab88d9SBram Moolenaar unlet g:guard 34714aab88d9SBram Moolenaarenddef 34724aab88d9SBram Moolenaar 34734aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 34744aab88d9SBram Moolenaar var exportlines =<< trim END 34754aab88d9SBram Moolenaar vim9script 34764aab88d9SBram Moolenaar if exists('g:guard') 34774aab88d9SBram Moolenaar finish 34784aab88d9SBram Moolenaar endif 34794aab88d9SBram Moolenaar g:guard = 1 34804aab88d9SBram Moolenaar export var name = 'someName' 34814aab88d9SBram Moolenaar END 34824aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 34834aab88d9SBram Moolenaar 34844aab88d9SBram Moolenaar var lines =<< trim END 34854aab88d9SBram Moolenaar vim9script 34864aab88d9SBram Moolenaar import name from './XexportScript.vim' 34874aab88d9SBram Moolenaar def g:GetName(): string 34884aab88d9SBram Moolenaar return name 34894aab88d9SBram Moolenaar enddef 34904aab88d9SBram Moolenaar END 34914aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 34924aab88d9SBram Moolenaar so XscriptImport.vim 34934aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 34944aab88d9SBram Moolenaar 34954aab88d9SBram Moolenaar so XexportScript.vim 34964aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34974aab88d9SBram Moolenaar 34984aab88d9SBram Moolenaar delfunc g:GetName 34994aab88d9SBram Moolenaar delete('XexportScript.vim') 35004aab88d9SBram Moolenaar delete('XscriptImport.vim') 35014aab88d9SBram Moolenaar unlet g:guard 35024aab88d9SBram Moolenaarenddef 35034aab88d9SBram Moolenaar 350410b9421fSBram Moolenaardef Test_unsupported_commands() 350510b9421fSBram Moolenaar var lines =<< trim END 350610b9421fSBram Moolenaar ka 350710b9421fSBram Moolenaar END 350810b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 350910b9421fSBram Moolenaar 351010b9421fSBram Moolenaar lines =<< trim END 3511ada1d870SBram Moolenaar :1ka 3512ada1d870SBram Moolenaar END 3513ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3514ada1d870SBram Moolenaar 3515ada1d870SBram Moolenaar lines =<< trim END 351610b9421fSBram Moolenaar t 351710b9421fSBram Moolenaar END 351810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 351910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 352010b9421fSBram Moolenaar 352110b9421fSBram Moolenaar lines =<< trim END 352210b9421fSBram Moolenaar x 352310b9421fSBram Moolenaar END 352410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 352510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 352610b9421fSBram Moolenaar 352710b9421fSBram Moolenaar lines =<< trim END 352810b9421fSBram Moolenaar xit 352910b9421fSBram Moolenaar END 353010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 353110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 353210b9421fSBram Moolenaarenddef 353310b9421fSBram Moolenaar 3534585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3535585fea7bSBram Moolenaardef Test_substitute_cmd() 3536585fea7bSBram Moolenaar new 3537585fea7bSBram Moolenaar setline(1, 'something') 3538585fea7bSBram Moolenaar :substitute(some(other( 3539585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3540585fea7bSBram Moolenaar bwipe! 3541585fea7bSBram Moolenaar 3542f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3543cfcd011fSBram Moolenaar var lines =<< trim END 3544585fea7bSBram Moolenaar vim9script 3545585fea7bSBram Moolenaar new 3546585fea7bSBram Moolenaar setline(1, 'something') 3547585fea7bSBram Moolenaar :substitute(some(other( 3548585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3549585fea7bSBram Moolenaar bwipe! 3550585fea7bSBram Moolenaar END 3551585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3552585fea7bSBram Moolenaar source Xvim9lines 3553585fea7bSBram Moolenaar 3554585fea7bSBram Moolenaar delete('Xvim9lines') 3555585fea7bSBram Moolenaarenddef 3556585fea7bSBram Moolenaar 35578a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3558