18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25b8554304SBram Moolenaar 26b8554304SBram Moolenaar # missing command does not print the line 27b8554304SBram Moolenaar var lines =<< trim END 28b8554304SBram Moolenaar vim9script 29b8554304SBram Moolenaar :1| 30b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 31b8554304SBram Moolenaar :| 32b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 33b8554304SBram Moolenaar END 34b8554304SBram Moolenaar CheckScriptSuccess(lines) 35b8554304SBram Moolenaar 36c2af0affSBram Moolenaar bwipe! 37025cb1caSBram Moolenaar 38025cb1caSBram Moolenaar # won't generate anything 39025cb1caSBram Moolenaar if false 40025cb1caSBram Moolenaar :123 41025cb1caSBram Moolenaar endif 425d72ce69SBram Moolenaarenddef 435d72ce69SBram Moolenaar 44a6e67e4fSBram Moolenaarlet g:alist = [7] 45a6e67e4fSBram Moolenaarlet g:astring = 'text' 46f0b9f43cSBram Moolenaarlet g:anumber = 123 476e587dcbSBram Moolenaar 484c17ad94SBram Moolenaardef Test_delfunction() 49f5be8cdbSBram Moolenaar # Check function is defined in script namespace 504c17ad94SBram Moolenaar CheckScriptSuccess([ 514c17ad94SBram Moolenaar 'vim9script', 524c17ad94SBram Moolenaar 'func CheckMe()', 534c17ad94SBram Moolenaar ' return 123', 544c17ad94SBram Moolenaar 'endfunc', 554c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 564c17ad94SBram Moolenaar ]) 574c17ad94SBram Moolenaar 58f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 594c17ad94SBram Moolenaar CheckScriptFailure([ 604c17ad94SBram Moolenaar 'vim9script', 614c17ad94SBram Moolenaar 'func DeleteMe1()', 624c17ad94SBram Moolenaar 'endfunc', 634c17ad94SBram Moolenaar 'delfunction DeleteMe1', 644c17ad94SBram Moolenaar ], 'E1084:') 654c17ad94SBram Moolenaar CheckScriptFailure([ 664c17ad94SBram Moolenaar 'vim9script', 674c17ad94SBram Moolenaar 'func DeleteMe2()', 684c17ad94SBram Moolenaar 'endfunc', 694c17ad94SBram Moolenaar 'def DoThat()', 704c17ad94SBram Moolenaar ' delfunction DeleteMe2', 714c17ad94SBram Moolenaar 'enddef', 724c17ad94SBram Moolenaar 'DoThat()', 734c17ad94SBram Moolenaar ], 'E1084:') 744c17ad94SBram Moolenaar CheckScriptFailure([ 754c17ad94SBram Moolenaar 'vim9script', 764c17ad94SBram Moolenaar 'def DeleteMe3()', 774c17ad94SBram Moolenaar 'enddef', 784c17ad94SBram Moolenaar 'delfunction DeleteMe3', 794c17ad94SBram Moolenaar ], 'E1084:') 804c17ad94SBram Moolenaar CheckScriptFailure([ 814c17ad94SBram Moolenaar 'vim9script', 824c17ad94SBram Moolenaar 'def DeleteMe4()', 834c17ad94SBram Moolenaar 'enddef', 844c17ad94SBram Moolenaar 'def DoThat()', 854c17ad94SBram Moolenaar ' delfunction DeleteMe4', 864c17ad94SBram Moolenaar 'enddef', 874c17ad94SBram Moolenaar 'DoThat()', 884c17ad94SBram Moolenaar ], 'E1084:') 89925e9fd6SBram Moolenaar 90925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 91cfcd011fSBram Moolenaar var lines =<< trim END 92925e9fd6SBram Moolenaar vim9script 93925e9fd6SBram Moolenaar def g:Global(): string 94925e9fd6SBram Moolenaar return "yes" 95925e9fd6SBram Moolenaar enddef 96925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 97925e9fd6SBram Moolenaar def! g:Global(): string 98925e9fd6SBram Moolenaar return "no" 99925e9fd6SBram Moolenaar enddef 100925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 101925e9fd6SBram Moolenaar delfunc g:Global 102925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 103925e9fd6SBram Moolenaar END 104925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 105925e9fd6SBram Moolenaar 106925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 107925e9fd6SBram Moolenaar lines =<< trim END 108925e9fd6SBram Moolenaar vim9script 109925e9fd6SBram Moolenaar func g:Global() 110925e9fd6SBram Moolenaar return "yes" 111925e9fd6SBram Moolenaar endfunc 112925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 113925e9fd6SBram Moolenaar def! g:Global(): string 114925e9fd6SBram Moolenaar return "no" 115925e9fd6SBram Moolenaar enddef 116925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 117925e9fd6SBram Moolenaar delfunc g:Global 118925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 119925e9fd6SBram Moolenaar END 120925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 121925e9fd6SBram Moolenaar 122925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 123925e9fd6SBram Moolenaar lines =<< trim END 124925e9fd6SBram Moolenaar vim9script 125925e9fd6SBram Moolenaar def g:Global(): string 126925e9fd6SBram Moolenaar return "yes" 127925e9fd6SBram Moolenaar enddef 128925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 129925e9fd6SBram Moolenaar func! g:Global() 130925e9fd6SBram Moolenaar return "no" 131925e9fd6SBram Moolenaar endfunc 132925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 133925e9fd6SBram Moolenaar delfunc g:Global 134925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 135925e9fd6SBram Moolenaar END 136925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1374c17ad94SBram Moolenaarenddef 1384c17ad94SBram Moolenaar 13908052228SBram Moolenaardef Test_wrong_type() 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 144599c89c8SBram Moolenaar 145cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14742a480bfSBram Moolenaar 148cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 159a0a9f43aSBram Moolenaar 160cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16208052228SBram Moolenaarenddef 1638a7d6542SBram Moolenaar 16410c65860SBram Moolenaardef Test_script_wrong_type() 16510c65860SBram Moolenaar var lines =<< trim END 16610c65860SBram Moolenaar vim9script 16710c65860SBram Moolenaar var s:dict: dict<string> 16810c65860SBram Moolenaar s:dict['a'] = ['x'] 16910c65860SBram Moolenaar END 17010c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17110c65860SBram Moolenaarenddef 17210c65860SBram Moolenaar 17308052228SBram Moolenaardef Test_const() 174cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 175cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17730fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17830fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 179dbeecb2bSBram Moolenaar 180cfcd011fSBram Moolenaar var lines =<< trim END 18130fd8204SBram Moolenaar final list = [1, 2, 3] 182dbeecb2bSBram Moolenaar list[0] = 4 1830b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18430fd8204SBram Moolenaar const other = [5, 6, 7] 1850b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18671abe482SBram Moolenaar 187cfcd011fSBram Moolenaar var varlist = [7, 8] 18830fd8204SBram Moolenaar const constlist = [1, varlist, 3] 18971abe482SBram Moolenaar varlist[0] = 77 19071abe482SBram Moolenaar # TODO: does not work yet 19171abe482SBram Moolenaar # constlist[1][1] = 88 192cfcd011fSBram Moolenaar var cl = constlist[1] 19371abe482SBram Moolenaar cl[1] = 88 19471abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 19571abe482SBram Moolenaar 196e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 197e0de171eSBram Moolenaar const constdict = {one: 1, two: vardict, three: 3} 19871abe482SBram Moolenaar vardict['five'] = 55 19971abe482SBram Moolenaar # TODO: does not work yet 20071abe482SBram Moolenaar # constdict['two']['six'] = 66 201cfcd011fSBram Moolenaar var cd = constdict['two'] 20271abe482SBram Moolenaar cd['six'] = 66 203e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 204dbeecb2bSBram Moolenaar END 205dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20608052228SBram Moolenaarenddef 2078a7d6542SBram Moolenaar 2080b4c66c6SBram Moolenaardef Test_const_bang() 209cfcd011fSBram Moolenaar var lines =<< trim END 21030fd8204SBram Moolenaar const var = 234 2110b4c66c6SBram Moolenaar var = 99 2120b4c66c6SBram Moolenaar END 2130b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2140b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2150b4c66c6SBram Moolenaar 2160b4c66c6SBram Moolenaar lines =<< trim END 21730fd8204SBram Moolenaar const ll = [2, 3, 4] 2180b4c66c6SBram Moolenaar ll[0] = 99 2190b4c66c6SBram Moolenaar END 2200b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2210b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2220b4c66c6SBram Moolenaar 2230b4c66c6SBram Moolenaar lines =<< trim END 22430fd8204SBram Moolenaar const ll = [2, 3, 4] 2250b4c66c6SBram Moolenaar ll[3] = 99 2260b4c66c6SBram Moolenaar END 2270b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2280b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2290b4c66c6SBram Moolenaar 2300b4c66c6SBram Moolenaar lines =<< trim END 231e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2320b4c66c6SBram Moolenaar dd["one"] = 99 2330b4c66c6SBram Moolenaar END 2340b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2350b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2360b4c66c6SBram Moolenaar 2370b4c66c6SBram Moolenaar lines =<< trim END 238e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2390b4c66c6SBram Moolenaar dd["three"] = 99 2400b4c66c6SBram Moolenaar END 2410b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2420b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2430b4c66c6SBram Moolenaarenddef 2440b4c66c6SBram Moolenaar 245df069eecSBram Moolenaardef Test_range_no_colon() 246d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 247d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 249d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 250df069eecSBram Moolenaarenddef 251df069eecSBram Moolenaar 252df069eecSBram Moolenaar 2538a7d6542SBram Moolenaardef Test_block() 254cfcd011fSBram Moolenaar var outer = 1 2558a7d6542SBram Moolenaar { 256cfcd011fSBram Moolenaar var inner = 2 2578a7d6542SBram Moolenaar assert_equal(1, outer) 2588a7d6542SBram Moolenaar assert_equal(2, inner) 2598a7d6542SBram Moolenaar } 2608a7d6542SBram Moolenaar assert_equal(1, outer) 2618a7d6542SBram Moolenaarenddef 2628a7d6542SBram Moolenaar 26308052228SBram Moolenaardef Test_block_failure() 264cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26508052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26608052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 26708052228SBram Moolenaarenddef 2688a7d6542SBram Moolenaar 269fbbcd003SBram Moolenaardef Test_block_local_vars() 270fbbcd003SBram Moolenaar var lines =<< trim END 271fbbcd003SBram Moolenaar vim9script 272ed234f24SBram Moolenaar v:testing = 1 273fbbcd003SBram Moolenaar if true 274ed234f24SBram Moolenaar var text = ['hello'] 275ed234f24SBram Moolenaar def SayHello(): list<string> 276fbbcd003SBram Moolenaar return text 277fbbcd003SBram Moolenaar enddef 278fbbcd003SBram Moolenaar def SetText(v: string) 279ed234f24SBram Moolenaar text = [v] 280fbbcd003SBram Moolenaar enddef 281fbbcd003SBram Moolenaar endif 282fbbcd003SBram Moolenaar 283fbbcd003SBram Moolenaar if true 284ed234f24SBram Moolenaar var text = ['again'] 285ed234f24SBram Moolenaar def SayAgain(): list<string> 286fbbcd003SBram Moolenaar return text 287fbbcd003SBram Moolenaar enddef 288fbbcd003SBram Moolenaar endif 289ed234f24SBram Moolenaar 290ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 291ed234f24SBram Moolenaar test_garbagecollect_now() 292ed234f24SBram Moolenaar 293fbbcd003SBram Moolenaar defcompile 294fbbcd003SBram Moolenaar 295ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 296ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 297fbbcd003SBram Moolenaar 298fbbcd003SBram Moolenaar SetText('foobar') 299ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 300ed234f24SBram Moolenaar 301ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 302ed234f24SBram Moolenaar qall! 303fbbcd003SBram Moolenaar END 304ed234f24SBram Moolenaar 305ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 306ed234f24SBram Moolenaar # context gets garbage collected. 307ed234f24SBram Moolenaar writefile(lines, 'Xscript') 308ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 309ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 310ed234f24SBram Moolenaar 311ed234f24SBram Moolenaar delete('Xscript') 312ed234f24SBram Moolenaar delete('Xdidit') 313fbbcd003SBram Moolenaarenddef 314fbbcd003SBram Moolenaar 31539ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31639ca4127SBram Moolenaar var lines =<< trim END 31739ca4127SBram Moolenaar vim9script 31839ca4127SBram Moolenaar if true 31939ca4127SBram Moolenaar var foo = 'foo' 32039ca4127SBram Moolenaar if true 32139ca4127SBram Moolenaar var bar = 'bar' 32239ca4127SBram Moolenaar def Func(): list<string> 32339ca4127SBram Moolenaar return [foo, bar] 32439ca4127SBram Moolenaar enddef 32539ca4127SBram Moolenaar endif 32639ca4127SBram Moolenaar endif 32739ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 32839ca4127SBram Moolenaar # "foo" and "bar" 32939ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33039ca4127SBram Moolenaar END 33139ca4127SBram Moolenaar CheckScriptSuccess(lines) 33239ca4127SBram Moolenaarenddef 33339ca4127SBram Moolenaar 334d032f34aSBram Moolenaarfunc g:NoSuchFunc() 335d032f34aSBram Moolenaar echo 'none' 336d032f34aSBram Moolenaarendfunc 337d032f34aSBram Moolenaar 3389e1d9e34SBram Moolenaardef Test_try_catch_throw() 339cfcd011fSBram Moolenaar var l = [] 3407a092245SBram Moolenaar try # comment 3418a7d6542SBram Moolenaar add(l, '1') 3428a7d6542SBram Moolenaar throw 'wrong' 3438a7d6542SBram Moolenaar add(l, '2') 3447a092245SBram Moolenaar catch # comment 3458a7d6542SBram Moolenaar add(l, v:exception) 3467a092245SBram Moolenaar finally # comment 3478a7d6542SBram Moolenaar add(l, '3') 3487a092245SBram Moolenaar endtry # comment 3498a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35068d130c6SBram Moolenaar 351e859312eSBram Moolenaar l = [] 352e859312eSBram Moolenaar try 353e859312eSBram Moolenaar try 354e859312eSBram Moolenaar add(l, '1') 355e859312eSBram Moolenaar throw 'wrong' 356e859312eSBram Moolenaar add(l, '2') 357e859312eSBram Moolenaar catch /right/ 358e859312eSBram Moolenaar add(l, v:exception) 359e859312eSBram Moolenaar endtry 360e859312eSBram Moolenaar catch /wrong/ 361e859312eSBram Moolenaar add(l, 'caught') 362373863edSBram Moolenaar fina 363e859312eSBram Moolenaar add(l, 'finally') 364e859312eSBram Moolenaar endtry 365e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 366e859312eSBram Moolenaar 367cfcd011fSBram Moolenaar var n: number 36868d130c6SBram Moolenaar try 36968d130c6SBram Moolenaar n = l[3] 37068d130c6SBram Moolenaar catch /E684:/ 37168d130c6SBram Moolenaar n = 99 37268d130c6SBram Moolenaar endtry 37368d130c6SBram Moolenaar assert_equal(99, n) 37468d130c6SBram Moolenaar 37569f7050cSBram Moolenaar var done = 'no' 37669f7050cSBram Moolenaar if 0 37769f7050cSBram Moolenaar try | catch | endtry 37869f7050cSBram Moolenaar else 37969f7050cSBram Moolenaar done = 'yes' 38069f7050cSBram Moolenaar endif 38169f7050cSBram Moolenaar assert_equal('yes', done) 38269f7050cSBram Moolenaar 38369f7050cSBram Moolenaar done = 'no' 38469f7050cSBram Moolenaar if 1 38569f7050cSBram Moolenaar done = 'yes' 38669f7050cSBram Moolenaar else 38769f7050cSBram Moolenaar try | catch | endtry 38869f7050cSBram Moolenaar done = 'never' 38969f7050cSBram Moolenaar endif 39069f7050cSBram Moolenaar assert_equal('yes', done) 39169f7050cSBram Moolenaar 39269f7050cSBram Moolenaar if 1 39369f7050cSBram Moolenaar else 39469f7050cSBram Moolenaar try | catch /pat/ | endtry 39569f7050cSBram Moolenaar try | catch /pat/ 39669f7050cSBram Moolenaar endtry 39769f7050cSBram Moolenaar try 39869f7050cSBram Moolenaar catch /pat/ | endtry 39969f7050cSBram Moolenaar try 40069f7050cSBram Moolenaar catch /pat/ 40169f7050cSBram Moolenaar endtry 40269f7050cSBram Moolenaar endif 40369f7050cSBram Moolenaar 40468d130c6SBram Moolenaar try 405cc673e74SBram Moolenaar # string slice returns a string, not a number 40668d130c6SBram Moolenaar n = g:astring[3] 4075e654230SBram Moolenaar catch /E1012:/ 40868d130c6SBram Moolenaar n = 77 40968d130c6SBram Moolenaar endtry 41068d130c6SBram Moolenaar assert_equal(77, n) 41168d130c6SBram Moolenaar 41268d130c6SBram Moolenaar try 41368d130c6SBram Moolenaar n = l[g:astring] 4145e654230SBram Moolenaar catch /E1012:/ 41556acb094SBram Moolenaar n = 88 41668d130c6SBram Moolenaar endtry 41756acb094SBram Moolenaar assert_equal(88, n) 41868d130c6SBram Moolenaar 41968d130c6SBram Moolenaar try 42068d130c6SBram Moolenaar n = s:does_not_exist 42168d130c6SBram Moolenaar catch /E121:/ 422f0b9f43cSBram Moolenaar n = 111 423f0b9f43cSBram Moolenaar endtry 424f0b9f43cSBram Moolenaar assert_equal(111, n) 425f0b9f43cSBram Moolenaar 426f0b9f43cSBram Moolenaar try 427f0b9f43cSBram Moolenaar n = g:does_not_exist 428f0b9f43cSBram Moolenaar catch /E121:/ 42968d130c6SBram Moolenaar n = 121 43068d130c6SBram Moolenaar endtry 43168d130c6SBram Moolenaar assert_equal(121, n) 43268d130c6SBram Moolenaar 433e0de171eSBram Moolenaar var d = {one: 1} 43468d130c6SBram Moolenaar try 43568d130c6SBram Moolenaar n = d[g:astring] 43668d130c6SBram Moolenaar catch /E716:/ 43768d130c6SBram Moolenaar n = 222 43868d130c6SBram Moolenaar endtry 43968d130c6SBram Moolenaar assert_equal(222, n) 440f0b9f43cSBram Moolenaar 441f0b9f43cSBram Moolenaar try 442f0b9f43cSBram Moolenaar n = -g:astring 443f0b9f43cSBram Moolenaar catch /E39:/ 444f0b9f43cSBram Moolenaar n = 233 445f0b9f43cSBram Moolenaar endtry 446f0b9f43cSBram Moolenaar assert_equal(233, n) 447f0b9f43cSBram Moolenaar 448f0b9f43cSBram Moolenaar try 449f0b9f43cSBram Moolenaar n = +g:astring 450f0b9f43cSBram Moolenaar catch /E1030:/ 451f0b9f43cSBram Moolenaar n = 244 452f0b9f43cSBram Moolenaar endtry 453f0b9f43cSBram Moolenaar assert_equal(244, n) 454f0b9f43cSBram Moolenaar 455f0b9f43cSBram Moolenaar try 456f0b9f43cSBram Moolenaar n = +g:alist 457f0b9f43cSBram Moolenaar catch /E745:/ 458f0b9f43cSBram Moolenaar n = 255 459f0b9f43cSBram Moolenaar endtry 460f0b9f43cSBram Moolenaar assert_equal(255, n) 461f0b9f43cSBram Moolenaar 462cfcd011fSBram Moolenaar var nd: dict<any> 463f0b9f43cSBram Moolenaar try 4642e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4652e5910bfSBram Moolenaar catch /E1105:/ 466f0b9f43cSBram Moolenaar n = 266 467f0b9f43cSBram Moolenaar endtry 468f0b9f43cSBram Moolenaar assert_equal(266, n) 469f0b9f43cSBram Moolenaar 470f0b9f43cSBram Moolenaar try 471f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 472f0b9f43cSBram Moolenaar catch /E1093:/ 473f0b9f43cSBram Moolenaar n = 277 474f0b9f43cSBram Moolenaar endtry 475f0b9f43cSBram Moolenaar assert_equal(277, n) 476f0b9f43cSBram Moolenaar 477e859312eSBram Moolenaar try 478e859312eSBram Moolenaar &ts = g:astring 4795e654230SBram Moolenaar catch /E1012:/ 480e859312eSBram Moolenaar n = 288 481e859312eSBram Moolenaar endtry 482e859312eSBram Moolenaar assert_equal(288, n) 483e859312eSBram Moolenaar 484e859312eSBram Moolenaar try 485e859312eSBram Moolenaar &backspace = 'asdf' 486e859312eSBram Moolenaar catch /E474:/ 487e859312eSBram Moolenaar n = 299 488e859312eSBram Moolenaar endtry 489e859312eSBram Moolenaar assert_equal(299, n) 490e859312eSBram Moolenaar 491e859312eSBram Moolenaar l = [1] 492e859312eSBram Moolenaar try 493e859312eSBram Moolenaar l[3] = 3 494e859312eSBram Moolenaar catch /E684:/ 495e859312eSBram Moolenaar n = 300 496e859312eSBram Moolenaar endtry 497e859312eSBram Moolenaar assert_equal(300, n) 498e859312eSBram Moolenaar 499e859312eSBram Moolenaar try 500e859312eSBram Moolenaar unlet g:does_not_exist 501e859312eSBram Moolenaar catch /E108:/ 502e859312eSBram Moolenaar n = 322 503e859312eSBram Moolenaar endtry 504e859312eSBram Moolenaar assert_equal(322, n) 505e859312eSBram Moolenaar 506e859312eSBram Moolenaar try 5072bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 508e859312eSBram Moolenaar catch /E721:/ 509e859312eSBram Moolenaar n = 333 510e859312eSBram Moolenaar endtry 511e859312eSBram Moolenaar assert_equal(333, n) 512e859312eSBram Moolenaar 513e859312eSBram Moolenaar try 514e859312eSBram Moolenaar l = DeletedFunc() 515e859312eSBram Moolenaar catch /E933:/ 516e859312eSBram Moolenaar n = 344 517e859312eSBram Moolenaar endtry 518e859312eSBram Moolenaar assert_equal(344, n) 519d032f34aSBram Moolenaar 520d032f34aSBram Moolenaar try 521d032f34aSBram Moolenaar echo len(v:true) 522d032f34aSBram Moolenaar catch /E701:/ 523d032f34aSBram Moolenaar n = 355 524d032f34aSBram Moolenaar endtry 525d032f34aSBram Moolenaar assert_equal(355, n) 526d032f34aSBram Moolenaar 527cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 528d032f34aSBram Moolenaar delfunc g:NoSuchFunc 529d032f34aSBram Moolenaar try 530d032f34aSBram Moolenaar echo P() 531d032f34aSBram Moolenaar catch /E117:/ 532d032f34aSBram Moolenaar n = 366 533d032f34aSBram Moolenaar endtry 534d032f34aSBram Moolenaar assert_equal(366, n) 535d032f34aSBram Moolenaar 536d032f34aSBram Moolenaar try 537d032f34aSBram Moolenaar echo g:NoSuchFunc() 538d032f34aSBram Moolenaar catch /E117:/ 539d032f34aSBram Moolenaar n = 377 540d032f34aSBram Moolenaar endtry 541d032f34aSBram Moolenaar assert_equal(377, n) 542d032f34aSBram Moolenaar 543d032f34aSBram Moolenaar try 544d032f34aSBram Moolenaar echo g:alist + 4 545d032f34aSBram Moolenaar catch /E745:/ 546d032f34aSBram Moolenaar n = 388 547d032f34aSBram Moolenaar endtry 548d032f34aSBram Moolenaar assert_equal(388, n) 549d032f34aSBram Moolenaar 550d032f34aSBram Moolenaar try 551d032f34aSBram Moolenaar echo 4 + g:alist 552d032f34aSBram Moolenaar catch /E745:/ 553d032f34aSBram Moolenaar n = 399 554d032f34aSBram Moolenaar endtry 555d032f34aSBram Moolenaar assert_equal(399, n) 556d032f34aSBram Moolenaar 557d032f34aSBram Moolenaar try 558d032f34aSBram Moolenaar echo g:alist.member 559d032f34aSBram Moolenaar catch /E715:/ 560d032f34aSBram Moolenaar n = 400 561d032f34aSBram Moolenaar endtry 562d032f34aSBram Moolenaar assert_equal(400, n) 563d032f34aSBram Moolenaar 564d032f34aSBram Moolenaar try 565d032f34aSBram Moolenaar echo d.member 566d032f34aSBram Moolenaar catch /E716:/ 567d032f34aSBram Moolenaar n = 411 568d032f34aSBram Moolenaar endtry 569d032f34aSBram Moolenaar assert_equal(411, n) 570d9d7789bSBram Moolenaar 571d9d7789bSBram Moolenaar var counter = 0 572d9d7789bSBram Moolenaar for i in range(4) 573d9d7789bSBram Moolenaar try 574d9d7789bSBram Moolenaar eval [][0] 575d9d7789bSBram Moolenaar catch 576d9d7789bSBram Moolenaar endtry 577d9d7789bSBram Moolenaar counter += 1 578d9d7789bSBram Moolenaar endfor 579d9d7789bSBram Moolenaar assert_equal(4, counter) 5807e82c5f3SBram Moolenaar 5817e82c5f3SBram Moolenaar # return in finally after empty catch 5827e82c5f3SBram Moolenaar def ReturnInFinally(): number 5837e82c5f3SBram Moolenaar try 5847e82c5f3SBram Moolenaar finally 5857e82c5f3SBram Moolenaar return 4 5867e82c5f3SBram Moolenaar endtry 5877e82c5f3SBram Moolenaar return 2 5887e82c5f3SBram Moolenaar enddef 5897e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5908a7d6542SBram Moolenaarenddef 5918a7d6542SBram Moolenaar 5929cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 5939cb577a6SBram Moolenaar # return in try block returns normally 5949cb577a6SBram Moolenaar def ReturnInTry(): string 5959cb577a6SBram Moolenaar try 5969cb577a6SBram Moolenaar return '"some message"' 5979cb577a6SBram Moolenaar catch 5989cb577a6SBram Moolenaar endtry 5999cb577a6SBram Moolenaar return 'not reached' 6009cb577a6SBram Moolenaar enddef 6019cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6029cb577a6SBram Moolenaarenddef 6039cb577a6SBram Moolenaar 6041430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6051430ceebSBram Moolenaar var lines =<< trim END 6061430ceebSBram Moolenaar vim9script 6071430ceebSBram Moolenaar au BufEnter * eval 0 6081430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6091430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6101430ceebSBram Moolenaar var items = [ 6111430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6121430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6131430ceebSBram Moolenaar ] 6141430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6151430ceebSBram Moolenaar cwindow 6161430ceebSBram Moolenaar 6171430ceebSBram Moolenaar def CnextOrCfirst() 6181430ceebSBram Moolenaar # if cnext fails, cfirst is used 6191430ceebSBram Moolenaar try 6201430ceebSBram Moolenaar cnext 6211430ceebSBram Moolenaar catch 6221430ceebSBram Moolenaar cfirst 6231430ceebSBram Moolenaar endtry 6241430ceebSBram Moolenaar enddef 6251430ceebSBram Moolenaar 6261430ceebSBram Moolenaar CnextOrCfirst() 6271430ceebSBram Moolenaar CnextOrCfirst() 6281430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6291430ceebSBram Moolenaar qall 6301430ceebSBram Moolenaar END 6311430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6321430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6331430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6341430ceebSBram Moolenaar 6351430ceebSBram Moolenaar delete('Xfile1') 6361430ceebSBram Moolenaar delete('Xfile2') 6371430ceebSBram Moolenaar delete('XCatchCnext') 6381430ceebSBram Moolenaar delete('Xresult') 6391430ceebSBram Moolenaarenddef 6401430ceebSBram Moolenaar 6419e1d9e34SBram Moolenaardef Test_throw_skipped() 6429e1d9e34SBram Moolenaar if 0 6439e1d9e34SBram Moolenaar throw dontgethere 6449e1d9e34SBram Moolenaar endif 6459e1d9e34SBram Moolenaarenddef 6469e1d9e34SBram Moolenaar 6478f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6488f81b22eSBram Moolenaar var lines =<< trim END 6498f81b22eSBram Moolenaar vim9script 6508f81b22eSBram Moolenaar def Func() 6518f81b22eSBram Moolenaar throw 'error' 6528f81b22eSBram Moolenaar enddef 6538f81b22eSBram Moolenaar silent! Func() 6548f81b22eSBram Moolenaar END 6558f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6568f81b22eSBram Moolenaar source XthrowSilenced 6578f81b22eSBram Moolenaar delete('XthrowSilenced') 6588f81b22eSBram Moolenaarenddef 6598f81b22eSBram Moolenaar 660e859312eSBram Moolenaardef DeletedFunc(): list<any> 661e859312eSBram Moolenaar return ['delete me'] 662e859312eSBram Moolenaarenddef 663e859312eSBram Moolenaardefcompile 664e859312eSBram Moolenaardelfunc DeletedFunc 665e859312eSBram Moolenaar 666257cc5eeSBram Moolenaardef ThrowFromDef() 667a72cfb80SBram Moolenaar throw "getout" # comment 668257cc5eeSBram Moolenaarenddef 669257cc5eeSBram Moolenaar 670257cc5eeSBram Moolenaarfunc CatchInFunc() 671257cc5eeSBram Moolenaar try 672257cc5eeSBram Moolenaar call ThrowFromDef() 673257cc5eeSBram Moolenaar catch 674257cc5eeSBram Moolenaar let g:thrown_func = v:exception 675257cc5eeSBram Moolenaar endtry 676257cc5eeSBram Moolenaarendfunc 677257cc5eeSBram Moolenaar 678257cc5eeSBram Moolenaardef CatchInDef() 679257cc5eeSBram Moolenaar try 680257cc5eeSBram Moolenaar ThrowFromDef() 681257cc5eeSBram Moolenaar catch 682257cc5eeSBram Moolenaar g:thrown_def = v:exception 683257cc5eeSBram Moolenaar endtry 684257cc5eeSBram Moolenaarenddef 685257cc5eeSBram Moolenaar 686f575adffSBram Moolenaardef ReturnFinally(): string 687f575adffSBram Moolenaar try 688f575adffSBram Moolenaar return 'intry' 689373863edSBram Moolenaar finall 690f575adffSBram Moolenaar g:in_finally = 'finally' 691f575adffSBram Moolenaar endtry 692f575adffSBram Moolenaar return 'end' 693f575adffSBram Moolenaarenddef 694f575adffSBram Moolenaar 695257cc5eeSBram Moolenaardef Test_try_catch_nested() 696257cc5eeSBram Moolenaar CatchInFunc() 697257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 698257cc5eeSBram Moolenaar 699257cc5eeSBram Moolenaar CatchInDef() 700257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 701f575adffSBram Moolenaar 702f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 703f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 704f575adffSBram Moolenaarenddef 705f575adffSBram Moolenaar 7069939f57bSBram Moolenaardef TryOne(): number 7079939f57bSBram Moolenaar try 7089939f57bSBram Moolenaar return 0 7099939f57bSBram Moolenaar catch 7109939f57bSBram Moolenaar endtry 7119939f57bSBram Moolenaar return 0 7129939f57bSBram Moolenaarenddef 7139939f57bSBram Moolenaar 7149939f57bSBram Moolenaardef TryTwo(n: number): string 7159939f57bSBram Moolenaar try 716cfcd011fSBram Moolenaar var x = {} 7179939f57bSBram Moolenaar catch 7189939f57bSBram Moolenaar endtry 7199939f57bSBram Moolenaar return 'text' 7209939f57bSBram Moolenaarenddef 7219939f57bSBram Moolenaar 7229939f57bSBram Moolenaardef Test_try_catch_twice() 7239939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7249939f57bSBram Moolenaarenddef 7259939f57bSBram Moolenaar 726f575adffSBram Moolenaardef Test_try_catch_match() 727cfcd011fSBram Moolenaar var seq = 'a' 728f575adffSBram Moolenaar try 729f575adffSBram Moolenaar throw 'something' 730f575adffSBram Moolenaar catch /nothing/ 731f575adffSBram Moolenaar seq ..= 'x' 732f575adffSBram Moolenaar catch /some/ 733f575adffSBram Moolenaar seq ..= 'b' 734f575adffSBram Moolenaar catch /asdf/ 735f575adffSBram Moolenaar seq ..= 'x' 736e8c4abbbSBram Moolenaar catch ?a\?sdf? 737e8c4abbbSBram Moolenaar seq ..= 'y' 738f575adffSBram Moolenaar finally 739f575adffSBram Moolenaar seq ..= 'c' 740f575adffSBram Moolenaar endtry 741f575adffSBram Moolenaar assert_equal('abc', seq) 742257cc5eeSBram Moolenaarenddef 743257cc5eeSBram Moolenaar 744e8c4abbbSBram Moolenaardef Test_try_catch_fails() 745d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 746d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 747d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 748d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 749d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 750d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 751d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 752d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 75313106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 754d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 755585fea7bSBram Moolenaar 756e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 757d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 758e8c4abbbSBram Moolenaarenddef 759e8c4abbbSBram Moolenaar 7607c5b3c03SBram Moolenaardef Try_catch_skipped() 7617c5b3c03SBram Moolenaar var l = [] 7627c5b3c03SBram Moolenaar try 7637c5b3c03SBram Moolenaar finally 7647c5b3c03SBram Moolenaar endtry 7657c5b3c03SBram Moolenaar 7667c5b3c03SBram Moolenaar if 1 7677c5b3c03SBram Moolenaar else 7687c5b3c03SBram Moolenaar try 7697c5b3c03SBram Moolenaar endtry 7707c5b3c03SBram Moolenaar endif 7717c5b3c03SBram Moolenaarenddef 7727c5b3c03SBram Moolenaar 7737c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7747c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7757c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7767c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7777c5b3c03SBram Moolenaarenddef 7787c5b3c03SBram Moolenaar 7797c5b3c03SBram Moolenaar 7807c5b3c03SBram Moolenaar 781006ad48bSBram Moolenaardef Test_throw_vimscript() 782f5be8cdbSBram Moolenaar # only checks line continuation 783cfcd011fSBram Moolenaar var lines =<< trim END 784006ad48bSBram Moolenaar vim9script 785006ad48bSBram Moolenaar try 786006ad48bSBram Moolenaar throw 'one' 787006ad48bSBram Moolenaar .. 'two' 788006ad48bSBram Moolenaar catch 789006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 790006ad48bSBram Moolenaar endtry 791006ad48bSBram Moolenaar END 792006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7931e021e63SBram Moolenaar 7941e021e63SBram Moolenaar lines =<< trim END 7951e021e63SBram Moolenaar vim9script 796352134bbSBram Moolenaar @r = '' 7971e021e63SBram Moolenaar def Func() 7981e021e63SBram Moolenaar throw @r 7991e021e63SBram Moolenaar enddef 8001e021e63SBram Moolenaar var result = '' 8011e021e63SBram Moolenaar try 8021e021e63SBram Moolenaar Func() 8031e021e63SBram Moolenaar catch /E1129:/ 8041e021e63SBram Moolenaar result = 'caught' 8051e021e63SBram Moolenaar endtry 8061e021e63SBram Moolenaar assert_equal('caught', result) 8071e021e63SBram Moolenaar END 8081e021e63SBram Moolenaar CheckScriptSuccess(lines) 809006ad48bSBram Moolenaarenddef 810006ad48bSBram Moolenaar 811ed677f55SBram Moolenaardef Test_error_in_nested_function() 81203dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 813cfcd011fSBram Moolenaar var lines =<< trim END 814ed677f55SBram Moolenaar vim9script 815ed677f55SBram Moolenaar def Func() 816ed677f55SBram Moolenaar Error() 817ed677f55SBram Moolenaar g:test_var = 1 818ed677f55SBram Moolenaar enddef 819ed677f55SBram Moolenaar func Error() abort 820ed677f55SBram Moolenaar eval [][0] 821ed677f55SBram Moolenaar endfunc 822ed677f55SBram Moolenaar Func() 823ed677f55SBram Moolenaar END 824ed677f55SBram Moolenaar g:test_var = 0 825ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 826ed677f55SBram Moolenaar assert_equal(0, g:test_var) 827ed677f55SBram Moolenaarenddef 828ed677f55SBram Moolenaar 82937c83711SBram Moolenaardef Test_cexpr_vimscript() 830f5be8cdbSBram Moolenaar # only checks line continuation 83137c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 832cfcd011fSBram Moolenaar var lines =<< trim END 83337c83711SBram Moolenaar vim9script 83437c83711SBram Moolenaar cexpr 'File' 83537c83711SBram Moolenaar .. ' someFile' .. 83637c83711SBram Moolenaar ' line 19' 83737c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 83837c83711SBram Moolenaar END 83937c83711SBram Moolenaar CheckScriptSuccess(lines) 84037c83711SBram Moolenaar set errorformat& 84137c83711SBram Moolenaarenddef 84237c83711SBram Moolenaar 843c9edd6b5SBram Moolenaardef Test_statusline_syntax() 844c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 845cfcd011fSBram Moolenaar var lines =<< trim END 846c9edd6b5SBram Moolenaar vim9script 847c9edd6b5SBram Moolenaar func g:Status() 848c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 849c9edd6b5SBram Moolenaar endfunc 850c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 851c9edd6b5SBram Moolenaar redrawstatus 852c9edd6b5SBram Moolenaar set laststatus statusline= 853c9edd6b5SBram Moolenaar END 854c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 855c9edd6b5SBram Moolenaarenddef 856c9edd6b5SBram Moolenaar 857b209750bSBram Moolenaardef Test_list_vimscript() 858b209750bSBram Moolenaar # checks line continuation and comments 859cfcd011fSBram Moolenaar var lines =<< trim END 860b209750bSBram Moolenaar vim9script 861cfcd011fSBram Moolenaar var mylist = [ 862b209750bSBram Moolenaar 'one', 863b209750bSBram Moolenaar # comment 864b209750bSBram Moolenaar 'two', # empty line follows 865b209750bSBram Moolenaar 866b209750bSBram Moolenaar 'three', 867b209750bSBram Moolenaar ] 868b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 869b209750bSBram Moolenaar END 870b209750bSBram Moolenaar CheckScriptSuccess(lines) 87166250c93SBram Moolenaar 87266250c93SBram Moolenaar # check all lines from heredoc are kept 87366250c93SBram Moolenaar lines =<< trim END 87466250c93SBram Moolenaar # comment 1 87566250c93SBram Moolenaar two 87666250c93SBram Moolenaar # comment 3 87766250c93SBram Moolenaar 87866250c93SBram Moolenaar five 87966250c93SBram Moolenaar # comment 6 88066250c93SBram Moolenaar END 88166250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8824bce26bbSBram Moolenaar 8834bce26bbSBram Moolenaar lines =<< trim END 8844bce26bbSBram Moolenaar [{ 8854bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8864bce26bbSBram Moolenaar END 8874bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 888b209750bSBram Moolenaarenddef 889b209750bSBram Moolenaar 8902a1381c3SBram Moolenaarif has('channel') 89140ee466cSBram Moolenaar let someJob = test_null_job() 89240ee466cSBram Moolenaar 89340ee466cSBram Moolenaar def FuncWithError() 89440ee466cSBram Moolenaar echomsg g:someJob 89540ee466cSBram Moolenaar enddef 89640ee466cSBram Moolenaar 89740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 89840ee466cSBram Moolenaar try 89940ee466cSBram Moolenaar call FuncWithError() 90040ee466cSBram Moolenaar catch 90140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 90240ee466cSBram Moolenaar endtry 90340ee466cSBram Moolenaar endfunc 9042a1381c3SBram Moolenaarendif 90540ee466cSBram Moolenaar 9068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9078a7d6542SBram Moolenaar vim9script 908cfcd011fSBram Moolenaar var name: string = 'bob' 9098a7d6542SBram Moolenaar def Concat(arg: string): string 9108a7d6542SBram Moolenaar return name .. arg 9118a7d6542SBram Moolenaar enddef 912227a69deSBram Moolenaar g:result = Concat('bie') 913227a69deSBram Moolenaar g:localname = name 9148a7d6542SBram Moolenaar 9158a7d6542SBram Moolenaar export const CONST = 1234 916cfcd011fSBram Moolenaar export var exported = 9876 917cfcd011fSBram Moolenaar export var exp_name = 'John' 9188a7d6542SBram Moolenaar export def Exported(): string 9198a7d6542SBram Moolenaar return 'Exported' 9208a7d6542SBram Moolenaar enddef 921*0f2a5cc6SBram Moolenaar export final theList = [1] 9228a7d6542SBram MoolenaarEND 9238a7d6542SBram Moolenaar 924b3ca9824SBram Moolenaardef Undo_export_script_lines() 925b3ca9824SBram Moolenaar unlet g:result 926b3ca9824SBram Moolenaar unlet g:localname 927b3ca9824SBram Moolenaarenddef 928b3ca9824SBram Moolenaar 9295269bd2aSBram Moolenaardef Test_vim9_import_export() 930cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9318a7d6542SBram Moolenaar vim9script 9328a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9338a7d6542SBram Moolenaar g:imported = exported 9346e587dcbSBram Moolenaar exported += 3 9356e587dcbSBram Moolenaar g:imported_added = exported 9368a7d6542SBram Moolenaar g:imported_func = Exported() 9376e587dcbSBram Moolenaar 93840f4f7a4SBram Moolenaar def GetExported(): string 939e0de171eSBram Moolenaar var local_dict = {ref: Exported} 94040f4f7a4SBram Moolenaar return local_dict.ref() 94140f4f7a4SBram Moolenaar enddef 94240f4f7a4SBram Moolenaar g:funcref_result = GetExported() 94340f4f7a4SBram Moolenaar 9446e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9456e587dcbSBram Moolenaar g:imported_name = exp_name 9466e587dcbSBram Moolenaar exp_name ..= ' Doe' 9476e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9485381c7a1SBram Moolenaar g:imported_later = exported 949*0f2a5cc6SBram Moolenaar 950*0f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 951*0f2a5cc6SBram Moolenaar theList->add(2) 952*0f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 9538a7d6542SBram Moolenaar END 9548a7d6542SBram Moolenaar 9558a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9568a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9578a7d6542SBram Moolenaar 9588a7d6542SBram Moolenaar source Ximport.vim 9598a7d6542SBram Moolenaar 9608a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9618a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9628a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9636e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9645381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9658a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 96640f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9676e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9686e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9698a7d6542SBram Moolenaar assert_false(exists('g:name')) 9708a7d6542SBram Moolenaar 971b3ca9824SBram Moolenaar Undo_export_script_lines() 9728a7d6542SBram Moolenaar unlet g:imported 9736e587dcbSBram Moolenaar unlet g:imported_added 9745381c7a1SBram Moolenaar unlet g:imported_later 9758a7d6542SBram Moolenaar unlet g:imported_func 9766e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9778a7d6542SBram Moolenaar delete('Ximport.vim') 978f2d5c240SBram Moolenaar 9791c991144SBram Moolenaar # similar, with line breaks 980cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9811c991144SBram Moolenaar vim9script 9821c991144SBram Moolenaar import { 9831c991144SBram Moolenaar exported, 9841c991144SBram Moolenaar Exported, 9851c991144SBram Moolenaar } 9861c991144SBram Moolenaar from 9871c991144SBram Moolenaar './Xexport.vim' 9881c991144SBram Moolenaar g:imported = exported 9891c991144SBram Moolenaar exported += 5 9901c991144SBram Moolenaar g:imported_added = exported 9911c991144SBram Moolenaar g:imported_func = Exported() 9921c991144SBram Moolenaar END 9931c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9941c991144SBram Moolenaar source Ximport_lbr.vim 9951c991144SBram Moolenaar 9961c991144SBram Moolenaar assert_equal(9876, g:imported) 9971c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9981c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9991c991144SBram Moolenaar 10001c991144SBram Moolenaar # exported script not sourced again 10011c991144SBram Moolenaar assert_false(exists('g:result')) 10021c991144SBram Moolenaar unlet g:imported 10031c991144SBram Moolenaar unlet g:imported_added 10041c991144SBram Moolenaar unlet g:imported_func 10051c991144SBram Moolenaar delete('Ximport_lbr.vim') 10061c991144SBram Moolenaar 10071c991144SBram Moolenaar # import inside :def function 1008cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10095381c7a1SBram Moolenaar vim9script 10105381c7a1SBram Moolenaar def ImportInDef() 10115381c7a1SBram Moolenaar import exported from './Xexport.vim' 10125381c7a1SBram Moolenaar g:imported = exported 10135381c7a1SBram Moolenaar exported += 7 10145381c7a1SBram Moolenaar g:imported_added = exported 10155381c7a1SBram Moolenaar enddef 10165381c7a1SBram Moolenaar ImportInDef() 10175381c7a1SBram Moolenaar END 10185381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10195381c7a1SBram Moolenaar source Ximport2.vim 1020f5be8cdbSBram Moolenaar # TODO: this should be 9879 10215381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10225381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10235381c7a1SBram Moolenaar unlet g:imported 10245381c7a1SBram Moolenaar unlet g:imported_added 10255381c7a1SBram Moolenaar delete('Ximport2.vim') 10265381c7a1SBram Moolenaar 1027cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1028f2d5c240SBram Moolenaar vim9script 1029f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1030f2d5c240SBram Moolenaar def UseExport() 1031f2d5c240SBram Moolenaar g:imported = Export.exported 1032f2d5c240SBram Moolenaar enddef 1033f2d5c240SBram Moolenaar UseExport() 1034f2d5c240SBram Moolenaar END 1035f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1036f2d5c240SBram Moolenaar source Ximport.vim 10375381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1038f2d5c240SBram Moolenaar 1039cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1040599c89c8SBram Moolenaar vim9script 1041599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1042599c89c8SBram Moolenaar def Func() 1043cfcd011fSBram Moolenaar var dummy = 1 1044cfcd011fSBram Moolenaar var imported = Export + dummy 1045599c89c8SBram Moolenaar enddef 1046822ba247SBram Moolenaar defcompile 1047599c89c8SBram Moolenaar END 1048599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 104944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1050599c89c8SBram Moolenaar 1051cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1052599c89c8SBram Moolenaar vim9script 1053599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1054599c89c8SBram Moolenaar def Func() 1055cfcd011fSBram Moolenaar var imported = Export . exported 1056599c89c8SBram Moolenaar enddef 1057822ba247SBram Moolenaar defcompile 1058599c89c8SBram Moolenaar END 1059599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 106044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1061599c89c8SBram Moolenaar 1062a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1063a6294955SBram Moolenaar vim9script 1064a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1065a6294955SBram Moolenaar var some = 'other' 1066a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1067a6294955SBram Moolenaar defcompile 1068a6294955SBram Moolenaar END 1069a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1070a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1071a6294955SBram Moolenaar 1072cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1073599c89c8SBram Moolenaar vim9script 1074599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1075599c89c8SBram Moolenaar def Func() 1076cfcd011fSBram Moolenaar var imported = Export. 1077599c89c8SBram Moolenaar enddef 1078822ba247SBram Moolenaar defcompile 1079599c89c8SBram Moolenaar END 1080599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 108144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1082599c89c8SBram Moolenaar 1083cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10841c991144SBram Moolenaar vim9script 10851c991144SBram Moolenaar import * 10861c991144SBram Moolenaar as Export 10871c991144SBram Moolenaar from 10881c991144SBram Moolenaar './Xexport.vim' 10891c991144SBram Moolenaar def UseExport() 10901c991144SBram Moolenaar g:imported = Export.exported 10911c991144SBram Moolenaar enddef 10921c991144SBram Moolenaar UseExport() 10931c991144SBram Moolenaar END 10941c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10951c991144SBram Moolenaar source Ximport.vim 10961c991144SBram Moolenaar assert_equal(9883, g:imported) 10971c991144SBram Moolenaar 1098cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1099f2d5c240SBram Moolenaar vim9script 1100f2d5c240SBram Moolenaar import * from './Xexport.vim' 1101f2d5c240SBram Moolenaar END 1102f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 110344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1104f2d5c240SBram Moolenaar 1105f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1106cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1107fa29c8abSBram Moolenaar vim9script 1108fa29c8abSBram Moolenaar import name from './Xexport.vim' 1109fa29c8abSBram Moolenaar END 1110fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 111144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1112fa29c8abSBram Moolenaar 1113f5be8cdbSBram Moolenaar # try to import something that is already defined 1114cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11155269bd2aSBram Moolenaar vim9script 1116cfcd011fSBram Moolenaar var exported = 'something' 11175269bd2aSBram Moolenaar import exported from './Xexport.vim' 11185269bd2aSBram Moolenaar END 11195269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 112044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11215269bd2aSBram Moolenaar 1122f5be8cdbSBram Moolenaar # try to import something that is already defined 11235269bd2aSBram Moolenaar import_already_defined =<< trim END 11245269bd2aSBram Moolenaar vim9script 1125cfcd011fSBram Moolenaar var exported = 'something' 11265269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11275269bd2aSBram Moolenaar END 11285269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 112944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11305269bd2aSBram Moolenaar 1131f5be8cdbSBram Moolenaar # try to import something that is already defined 11325269bd2aSBram Moolenaar import_already_defined =<< trim END 11335269bd2aSBram Moolenaar vim9script 1134cfcd011fSBram Moolenaar var exported = 'something' 11355269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11365269bd2aSBram Moolenaar END 11375269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 113844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11395269bd2aSBram Moolenaar 1140918a4249SBram Moolenaar # try changing an imported const 1141918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1142918a4249SBram Moolenaar vim9script 1143918a4249SBram Moolenaar import CONST from './Xexport.vim' 1144918a4249SBram Moolenaar def Assign() 1145918a4249SBram Moolenaar CONST = 987 1146918a4249SBram Moolenaar enddef 1147918a4249SBram Moolenaar defcompile 1148918a4249SBram Moolenaar END 1149918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1150918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1151918a4249SBram Moolenaar 1152*0f2a5cc6SBram Moolenaar # try changing an imported final 1153*0f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 1154*0f2a5cc6SBram Moolenaar vim9script 1155*0f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 1156*0f2a5cc6SBram Moolenaar def Assign() 1157*0f2a5cc6SBram Moolenaar theList = [2] 1158*0f2a5cc6SBram Moolenaar enddef 1159*0f2a5cc6SBram Moolenaar defcompile 1160*0f2a5cc6SBram Moolenaar END 1161*0f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 1162*0f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1163*0f2a5cc6SBram Moolenaar 1164f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1165cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1166fa29c8abSBram Moolenaar vim9script 1167fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1168fa29c8abSBram Moolenaar END 1169fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 117044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1171fa29c8abSBram Moolenaar 1172cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1173fa29c8abSBram Moolenaar vim9script 1174fa29c8abSBram Moolenaar import name './Xexport.vim' 1175fa29c8abSBram Moolenaar END 1176fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 117744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1178fa29c8abSBram Moolenaar 1179cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1180fa29c8abSBram Moolenaar vim9script 1181fa29c8abSBram Moolenaar import name from Xexport.vim 1182fa29c8abSBram Moolenaar END 1183fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 118444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1185fa29c8abSBram Moolenaar 1186cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1187fa29c8abSBram Moolenaar vim9script 1188fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1189fa29c8abSBram Moolenaar END 1190fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 119144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1192fa29c8abSBram Moolenaar 1193cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1194fa29c8abSBram Moolenaar vim9script 1195fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1196fa29c8abSBram Moolenaar END 11975269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 119844d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1199fa29c8abSBram Moolenaar 1200f2d5c240SBram Moolenaar delete('Ximport.vim') 12015269bd2aSBram Moolenaar delete('Ximport3.vim') 12028a7d6542SBram Moolenaar delete('Xexport.vim') 12038a7d6542SBram Moolenaar 1204f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1205750802b5SBram Moolenaar set cpo&vi 1206cfcd011fSBram Moolenaar var cpo_before = &cpo 1207cfcd011fSBram Moolenaar var lines =<< trim END 1208750802b5SBram Moolenaar vim9script 1209750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1210750802b5SBram Moolenaar END 1211750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1212750802b5SBram Moolenaar source Xvim9_script 1213750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1214750802b5SBram Moolenaar set cpo&vim 1215750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1216750802b5SBram Moolenaar delete('Xvim9_script') 1217750802b5SBram Moolenaarenddef 1218750802b5SBram Moolenaar 1219803af686SBram Moolenaarfunc g:Trigger() 1220803af686SBram Moolenaar source Ximport.vim 1221803af686SBram Moolenaar return "echo 'yes'\<CR>" 1222803af686SBram Moolenaarendfunc 1223803af686SBram Moolenaar 1224803af686SBram Moolenaardef Test_import_export_expr_map() 1225803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1226cfcd011fSBram Moolenaar var export_lines =<< trim END 1227803af686SBram Moolenaar vim9script 1228803af686SBram Moolenaar export def That(): string 1229803af686SBram Moolenaar return 'yes' 1230803af686SBram Moolenaar enddef 1231803af686SBram Moolenaar END 1232803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1233803af686SBram Moolenaar 1234cfcd011fSBram Moolenaar var import_lines =<< trim END 1235803af686SBram Moolenaar vim9script 1236803af686SBram Moolenaar import That from './Xexport_that.vim' 1237803af686SBram Moolenaar assert_equal('yes', That()) 1238803af686SBram Moolenaar END 1239803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1240803af686SBram Moolenaar 1241803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1242803af686SBram Moolenaar feedkeys('trigger', "xt") 1243803af686SBram Moolenaar 1244730b2483SBram Moolenaar delete('Xexport_that.vim') 1245803af686SBram Moolenaar delete('Ximport.vim') 1246803af686SBram Moolenaar nunmap trigger 1247803af686SBram Moolenaarenddef 1248803af686SBram Moolenaar 12498e1986e3SBram Moolenaardef Test_import_in_filetype() 12508e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12518e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1252cfcd011fSBram Moolenaar var export_lines =<< trim END 12538e1986e3SBram Moolenaar vim9script 1254cfcd011fSBram Moolenaar export var That = 'yes' 12558e1986e3SBram Moolenaar END 1256730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12578e1986e3SBram Moolenaar 1258cfcd011fSBram Moolenaar var import_lines =<< trim END 12598e1986e3SBram Moolenaar vim9script 1260730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12618e1986e3SBram Moolenaar assert_equal('yes', That) 12628e1986e3SBram Moolenaar g:did_load_mytpe = 1 12638e1986e3SBram Moolenaar END 12648e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12658e1986e3SBram Moolenaar 1266cfcd011fSBram Moolenaar var save_rtp = &rtp 12678e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 12688e1986e3SBram Moolenaar 12698e1986e3SBram Moolenaar filetype plugin on 12708e1986e3SBram Moolenaar copen 12718e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12728e1986e3SBram Moolenaar 12738e1986e3SBram Moolenaar quit! 1274730b2483SBram Moolenaar delete('Xexport_ft.vim') 12758e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12768e1986e3SBram Moolenaar &rtp = save_rtp 12778e1986e3SBram Moolenaarenddef 12788e1986e3SBram Moolenaar 1279efa94447SBram Moolenaardef Test_use_import_in_mapping() 1280cfcd011fSBram Moolenaar var lines =<< trim END 1281efa94447SBram Moolenaar vim9script 1282efa94447SBram Moolenaar export def Funcx() 1283efa94447SBram Moolenaar g:result = 42 1284efa94447SBram Moolenaar enddef 1285efa94447SBram Moolenaar END 1286efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1287efa94447SBram Moolenaar lines =<< trim END 1288efa94447SBram Moolenaar vim9script 1289efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1290b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1291efa94447SBram Moolenaar END 1292efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1293efa94447SBram Moolenaar 1294efa94447SBram Moolenaar source Xmapscript.vim 1295b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1296efa94447SBram Moolenaar assert_equal(42, g:result) 1297efa94447SBram Moolenaar 1298efa94447SBram Moolenaar unlet g:result 1299efa94447SBram Moolenaar delete('XsomeExport.vim') 1300efa94447SBram Moolenaar delete('Xmapscript.vim') 1301b3ca9824SBram Moolenaar nunmap <F3> 1302efa94447SBram Moolenaarenddef 1303efa94447SBram Moolenaar 1304d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1305d3f8a9eeSBram Moolenaar var lines =<< trim END 1306d3f8a9eeSBram Moolenaar if has(g:feature) 1307d3f8a9eeSBram Moolenaar " legacy script 1308d3f8a9eeSBram Moolenaar let g:legacy = 1 1309d3f8a9eeSBram Moolenaar finish 1310d3f8a9eeSBram Moolenaar endif 1311d3f8a9eeSBram Moolenaar vim9script 1312d3f8a9eeSBram Moolenaar g:legacy = 0 1313d3f8a9eeSBram Moolenaar END 1314d3f8a9eeSBram Moolenaar g:feature = 'eval' 1315d3f8a9eeSBram Moolenaar g:legacy = -1 1316d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1317d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1318d3f8a9eeSBram Moolenaar 1319d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1320d3f8a9eeSBram Moolenaar g:legacy = -1 1321d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1322d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1323d3f8a9eeSBram Moolenaarenddef 1324d3f8a9eeSBram Moolenaar 1325750802b5SBram Moolenaardef Test_vim9script_fails() 13268a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13278a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1328cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 13299721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1330cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1331750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1332750802b5SBram Moolenaar 1333cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1334c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1335c785b9a7SBram Moolenaar 1336e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1337e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 13388a7d6542SBram Moolenaarenddef 13398a7d6542SBram Moolenaar 1340f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1341101f4810SBram Moolenaar CheckRunVimInTerminal 1342101f4810SBram Moolenaar 13439bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1344c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13459bb3eb3eSBram Moolenaarendfunc 13469bb3eb3eSBram Moolenaar 1347c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1348cfcd011fSBram Moolenaar var export =<< trim END 1349101f4810SBram Moolenaar vim9script 1350101f4810SBram Moolenaar export def Foo(): number 1351101f4810SBram Moolenaar return 0 1352101f4810SBram Moolenaar enddef 1353101f4810SBram Moolenaar END 1354730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1355101f4810SBram Moolenaar 1356e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 13579bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13582949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1359101f4810SBram Moolenaar 1360730b2483SBram Moolenaar delete('XexportCmd.vim') 13619bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13629bb3eb3eSBram Moolenaarenddef 1363101f4810SBram Moolenaar 13642b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13652b32700dSBram Moolenaar var lines =<< trim END 1366a6294955SBram Moolenaar vim9script 1367a6294955SBram Moolenaar export var exported = 'thexport' 1368a6294955SBram Moolenaar END 1369a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1370a6294955SBram Moolenaar lines =<< trim END 13712b32700dSBram Moolenaar vim9script noclear 13722b32700dSBram Moolenaar g:loadCount += 1 13732b32700dSBram Moolenaar var s:reloaded = 'init' 1374a6294955SBram Moolenaar import exported from './XExportReload' 13752b32700dSBram Moolenaar 13762b32700dSBram Moolenaar def Again(): string 13772b32700dSBram Moolenaar return 'again' 13782b32700dSBram Moolenaar enddef 13792b32700dSBram Moolenaar 13802b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 13812b32700dSBram Moolenaar var s:loaded = true 13822b32700dSBram Moolenaar 13832b32700dSBram Moolenaar var s:notReloaded = 'yes' 13842b32700dSBram Moolenaar s:reloaded = 'first' 13852b32700dSBram Moolenaar def g:Values(): list<string> 1386a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 13872b32700dSBram Moolenaar enddef 13882b32700dSBram Moolenaar 13892b32700dSBram Moolenaar def Once(): string 13902b32700dSBram Moolenaar return 'once' 13912b32700dSBram Moolenaar enddef 13922b32700dSBram Moolenaar END 13932b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13942b32700dSBram Moolenaar g:loadCount = 0 13952b32700dSBram Moolenaar source XReloaded 13962b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1397a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13982b32700dSBram Moolenaar source XReloaded 13992b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1400a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14012b32700dSBram Moolenaar source XReloaded 14022b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1403a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14042b32700dSBram Moolenaar 140548e11c10SBram Moolenaar delete('XReloaded') 1406a6294955SBram Moolenaar delete('XExportReload') 14072b32700dSBram Moolenaar delfunc g:Values 14082b32700dSBram Moolenaar unlet g:loadCount 14092b32700dSBram Moolenaarenddef 14102b32700dSBram Moolenaar 14114c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1412cfcd011fSBram Moolenaar var lines =<< trim END 14138a7d6542SBram Moolenaar vim9script 14148a7d6542SBram Moolenaar const var = '' 1415cfcd011fSBram Moolenaar var valone = 1234 14168a7d6542SBram Moolenaar def MyFunc(arg: string) 14178a7d6542SBram Moolenaar valone = 5678 14188a7d6542SBram Moolenaar enddef 14198a7d6542SBram Moolenaar END 1420cfcd011fSBram Moolenaar var morelines =<< trim END 1421cfcd011fSBram Moolenaar var valtwo = 222 14228a7d6542SBram Moolenaar export def GetValtwo(): number 14238a7d6542SBram Moolenaar return valtwo 14248a7d6542SBram Moolenaar enddef 14258a7d6542SBram Moolenaar END 142603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14278a7d6542SBram Moolenaar source Xreload.vim 14288a7d6542SBram Moolenaar source Xreload.vim 14298a7d6542SBram Moolenaar source Xreload.vim 14308a7d6542SBram Moolenaar 1431cfcd011fSBram Moolenaar var testlines =<< trim END 14328a7d6542SBram Moolenaar vim9script 14338a7d6542SBram Moolenaar def TheFunc() 14348a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14358a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14368a7d6542SBram Moolenaar enddef 14378a7d6542SBram Moolenaar TheFunc() 14388a7d6542SBram Moolenaar END 14398a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14408a7d6542SBram Moolenaar source Ximport.vim 14418a7d6542SBram Moolenaar 1442f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1443f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14448a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14458a7d6542SBram Moolenaar source Ximport.vim 14468a7d6542SBram Moolenaar 1447f5be8cdbSBram Moolenaar # cannot declare a var twice 14488a7d6542SBram Moolenaar lines =<< trim END 14498a7d6542SBram Moolenaar vim9script 1450cfcd011fSBram Moolenaar var valone = 1234 1451cfcd011fSBram Moolenaar var valone = 5678 14528a7d6542SBram Moolenaar END 14538a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 145444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 14558a7d6542SBram Moolenaar 14568a7d6542SBram Moolenaar delete('Xreload.vim') 14578a7d6542SBram Moolenaar delete('Ximport.vim') 14588a7d6542SBram Moolenaarenddef 14598a7d6542SBram Moolenaar 146007a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 146107a65d26SBram Moolenaar" compiled function using that variable must fail. 146207a65d26SBram Moolenaardef Test_script_reload_change_type() 146307a65d26SBram Moolenaar var lines =<< trim END 146407a65d26SBram Moolenaar vim9script noclear 146507a65d26SBram Moolenaar var str = 'string' 146607a65d26SBram Moolenaar def g:GetStr(): string 146707a65d26SBram Moolenaar return str .. 'xxx' 146807a65d26SBram Moolenaar enddef 146907a65d26SBram Moolenaar END 147007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 147107a65d26SBram Moolenaar source Xreload.vim 147207a65d26SBram Moolenaar echo g:GetStr() 147307a65d26SBram Moolenaar 147407a65d26SBram Moolenaar lines =<< trim END 147507a65d26SBram Moolenaar vim9script noclear 147607a65d26SBram Moolenaar var str = 1234 147707a65d26SBram Moolenaar END 147807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 147907a65d26SBram Moolenaar source Xreload.vim 148007a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 148107a65d26SBram Moolenaar 148207a65d26SBram Moolenaar delfunc g:GetStr 148307a65d26SBram Moolenaar delete('Xreload.vim') 148407a65d26SBram Moolenaarenddef 148507a65d26SBram Moolenaar 148695006e3dSBram Moolenaardef s:RetSome(): string 148795006e3dSBram Moolenaar return 'some' 148895006e3dSBram Moolenaarenddef 148995006e3dSBram Moolenaar 1490fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1491fe465a01SBram Moolenaar" script-local name. 1492fe465a01SBram Moolenaardef Test_vim9script_funcref() 1493cfcd011fSBram Moolenaar var sortlines =<< trim END 1494fe465a01SBram Moolenaar vim9script 1495fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1496bed36b93SBram Moolenaar return i2 - i1 1497fe465a01SBram Moolenaar enddef 1498fe465a01SBram Moolenaar 1499fe465a01SBram Moolenaar export def FastSort(): list<number> 1500fe465a01SBram Moolenaar return range(5)->sort(Compare) 1501fe465a01SBram Moolenaar enddef 1502fe465a01SBram Moolenaar END 1503fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1504fe465a01SBram Moolenaar 1505cfcd011fSBram Moolenaar var lines =<< trim END 1506fe465a01SBram Moolenaar vim9script 1507fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1508fe465a01SBram Moolenaar def Test() 1509fe465a01SBram Moolenaar g:result = FastSort() 1510fe465a01SBram Moolenaar enddef 1511fe465a01SBram Moolenaar Test() 1512fe465a01SBram Moolenaar END 1513fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1514fe465a01SBram Moolenaar 1515fe465a01SBram Moolenaar source Xscript.vim 1516fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1517fe465a01SBram Moolenaar 1518fe465a01SBram Moolenaar unlet g:result 1519fe465a01SBram Moolenaar delete('Xsort.vim') 1520fe465a01SBram Moolenaar delete('Xscript.vim') 152195006e3dSBram Moolenaar 1522cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 152395006e3dSBram Moolenaar assert_equal('some', Funcref()) 1524fe465a01SBram Moolenaarenddef 1525fe465a01SBram Moolenaar 1526601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1527601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1528601e76acSBram Moolenaar" function reference. 1529c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1530cfcd011fSBram Moolenaar var filterLines =<< trim END 1531c620c055SBram Moolenaar vim9script 1532c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1533c620c055SBram Moolenaar return idx % 2 == 1 1534c620c055SBram Moolenaar enddef 1535c620c055SBram Moolenaar export def FastFilter(): list<number> 1536c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1537c620c055SBram Moolenaar enddef 1538601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1539601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1540601e76acSBram Moolenaar enddef 1541c620c055SBram Moolenaar END 1542c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1543c620c055SBram Moolenaar 1544cfcd011fSBram Moolenaar var lines =<< trim END 1545c620c055SBram Moolenaar vim9script 1546601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1547c620c055SBram Moolenaar def Test() 1548cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1549c620c055SBram Moolenaar enddef 1550c620c055SBram Moolenaar Test() 1551601e76acSBram Moolenaar def TestDirect() 1552cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1553601e76acSBram Moolenaar enddef 1554601e76acSBram Moolenaar TestDirect() 1555c620c055SBram Moolenaar END 1556601e76acSBram Moolenaar CheckScriptSuccess(lines) 1557c620c055SBram Moolenaar delete('Xfilter.vim') 1558c620c055SBram Moolenaarenddef 1559c620c055SBram Moolenaar 15604c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1561cfcd011fSBram Moolenaar var first_lines =<< trim END 15624c17ad94SBram Moolenaar vim9script 15634c17ad94SBram Moolenaar def FuncYes(): string 15644c17ad94SBram Moolenaar return 'yes' 15654c17ad94SBram Moolenaar enddef 15664c17ad94SBram Moolenaar END 1567cfcd011fSBram Moolenaar var withno_lines =<< trim END 15684c17ad94SBram Moolenaar def FuncNo(): string 15694c17ad94SBram Moolenaar return 'no' 15704c17ad94SBram Moolenaar enddef 15714c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15724c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15734c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 157403afdcf1SBram Moolenaar enddef 157503afdcf1SBram Moolenaar END 1576cfcd011fSBram Moolenaar var nono_lines =<< trim END 157703afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 157803afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 157944d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 15804c17ad94SBram Moolenaar enddef 15814c17ad94SBram Moolenaar END 15824c17ad94SBram Moolenaar 15834c17ad94SBram Moolenaar # FuncNo() is defined 158403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15854c17ad94SBram Moolenaar source Xreloaded.vim 15864c17ad94SBram Moolenaar g:DoCheck(true) 15874c17ad94SBram Moolenaar 15884c17ad94SBram Moolenaar # FuncNo() is not redefined 158903afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15904c17ad94SBram Moolenaar source Xreloaded.vim 15915082471fSBram Moolenaar g:DoCheck(false) 15924c17ad94SBram Moolenaar 15934c17ad94SBram Moolenaar # FuncNo() is back 159403afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15954c17ad94SBram Moolenaar source Xreloaded.vim 15965082471fSBram Moolenaar g:DoCheck(false) 15974c17ad94SBram Moolenaar 15984c17ad94SBram Moolenaar delete('Xreloaded.vim') 15994c17ad94SBram Moolenaarenddef 16004c17ad94SBram Moolenaar 160189483d40SBram Moolenaardef Test_vim9script_reload_delvar() 160289483d40SBram Moolenaar # write the script with a script-local variable 1603cfcd011fSBram Moolenaar var lines =<< trim END 160489483d40SBram Moolenaar vim9script 1605cfcd011fSBram Moolenaar var name = 'string' 160689483d40SBram Moolenaar END 160789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 160889483d40SBram Moolenaar source XreloadVar.vim 160989483d40SBram Moolenaar 161089483d40SBram Moolenaar # now write the script using the same variable locally - works 161189483d40SBram Moolenaar lines =<< trim END 161289483d40SBram Moolenaar vim9script 161389483d40SBram Moolenaar def Func() 1614cfcd011fSBram Moolenaar var name = 'string' 161589483d40SBram Moolenaar enddef 161689483d40SBram Moolenaar END 161789483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 161889483d40SBram Moolenaar source XreloadVar.vim 161989483d40SBram Moolenaar 162089483d40SBram Moolenaar delete('XreloadVar.vim') 162189483d40SBram Moolenaarenddef 162289483d40SBram Moolenaar 16238a7d6542SBram Moolenaardef Test_import_absolute() 1624cfcd011fSBram Moolenaar var import_lines = [ 1625e6085c53SBram Moolenaar 'vim9script', 1626e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1627e6085c53SBram Moolenaar 'def UseExported()', 1628e6085c53SBram Moolenaar ' g:imported_abs = exported', 1629e6085c53SBram Moolenaar ' exported = 8888', 1630e6085c53SBram Moolenaar ' g:imported_after = exported', 1631e6085c53SBram Moolenaar 'enddef', 1632e6085c53SBram Moolenaar 'UseExported()', 1633e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1634e6085c53SBram Moolenaar ] 16358a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16368a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16378a7d6542SBram Moolenaar 16388a7d6542SBram Moolenaar source Ximport_abs.vim 16398a7d6542SBram Moolenaar 16408a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16414e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1642fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1643fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1644fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1645fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1646fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1647fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1648fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1649fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1650fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1651fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1652e6085c53SBram Moolenaar g:import_disassembled) 1653b3ca9824SBram Moolenaar 1654b3ca9824SBram Moolenaar Undo_export_script_lines() 16558a7d6542SBram Moolenaar unlet g:imported_abs 16564e12a5dfSBram Moolenaar unlet g:import_disassembled 16578a7d6542SBram Moolenaar 16588a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16598a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16608a7d6542SBram Moolenaarenddef 16618a7d6542SBram Moolenaar 16628a7d6542SBram Moolenaardef Test_import_rtp() 1663cfcd011fSBram Moolenaar var import_lines = [ 1664e6085c53SBram Moolenaar 'vim9script', 1665e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1666e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1667e6085c53SBram Moolenaar ] 16688a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16698a7d6542SBram Moolenaar mkdir('import') 16708a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16718a7d6542SBram Moolenaar 1672cfcd011fSBram Moolenaar var save_rtp = &rtp 16738a7d6542SBram Moolenaar &rtp = getcwd() 16748a7d6542SBram Moolenaar source Ximport_rtp.vim 16758a7d6542SBram Moolenaar &rtp = save_rtp 16768a7d6542SBram Moolenaar 16778a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16788a7d6542SBram Moolenaar 1679b3ca9824SBram Moolenaar Undo_export_script_lines() 1680b3ca9824SBram Moolenaar unlet g:imported_rtp 16818a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 168289483d40SBram Moolenaar delete('import', 'rf') 16838a7d6542SBram Moolenaarenddef 16848a7d6542SBram Moolenaar 168525e0f586SBram Moolenaardef Test_import_compile_error() 1686cfcd011fSBram Moolenaar var export_lines = [ 168725e0f586SBram Moolenaar 'vim9script', 168825e0f586SBram Moolenaar 'export def ExpFunc(): string', 168925e0f586SBram Moolenaar ' return notDefined', 169025e0f586SBram Moolenaar 'enddef', 169125e0f586SBram Moolenaar ] 169225e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 169325e0f586SBram Moolenaar 1694cfcd011fSBram Moolenaar var import_lines = [ 169525e0f586SBram Moolenaar 'vim9script', 169625e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 169725e0f586SBram Moolenaar 'def ImpFunc()', 169825e0f586SBram Moolenaar ' echo ExpFunc()', 169925e0f586SBram Moolenaar 'enddef', 170025e0f586SBram Moolenaar 'defcompile', 170125e0f586SBram Moolenaar ] 170225e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 170325e0f586SBram Moolenaar 170425e0f586SBram Moolenaar try 170525e0f586SBram Moolenaar source Ximport.vim 170625e0f586SBram Moolenaar catch /E1001/ 1707f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 17087707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 170925e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 171025e0f586SBram Moolenaar endtry 171125e0f586SBram Moolenaar 171225e0f586SBram Moolenaar delete('Xexported.vim') 171325e0f586SBram Moolenaar delete('Ximport.vim') 171425e0f586SBram Moolenaarenddef 171525e0f586SBram Moolenaar 1716c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1717cfcd011fSBram Moolenaar var lines = [ 1718c4ce36d4SBram Moolenaar 'vim9script', 1719c4ce36d4SBram Moolenaar 'def Func()', 1720c4ce36d4SBram Moolenaar ' eval [][0]', 1721c4ce36d4SBram Moolenaar 'enddef', 1722c4ce36d4SBram Moolenaar 'Func()', 1723c4ce36d4SBram Moolenaar ] 1724c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1725c4ce36d4SBram Moolenaar 1726c4ce36d4SBram Moolenaar for count in range(3) 1727c4ce36d4SBram Moolenaar try 1728c4ce36d4SBram Moolenaar source Xtestscript.vim 1729c4ce36d4SBram Moolenaar catch /E684/ 1730c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1731c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1732c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1733c4ce36d4SBram Moolenaar endtry 1734c4ce36d4SBram Moolenaar endfor 1735c4ce36d4SBram Moolenaar 1736c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1737c4ce36d4SBram Moolenaarenddef 1738c4ce36d4SBram Moolenaar 1739eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1740cfcd011fSBram Moolenaar var export_lines =<< trim END 1741eef2102eSBram Moolenaar vim9script 1742eef2102eSBram Moolenaar export def Func() 1743eef2102eSBram Moolenaar echo 'imported' 1744eef2102eSBram Moolenaar enddef 1745eef2102eSBram Moolenaar END 1746eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1747eef2102eSBram Moolenaar 1748cfcd011fSBram Moolenaar var lines =<< trim END 1749eef2102eSBram Moolenaar vim9script 1750eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1751eef2102eSBram Moolenaar def Func() 1752eef2102eSBram Moolenaar echo 'local to function' 1753eef2102eSBram Moolenaar enddef 1754eef2102eSBram Moolenaar END 1755eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1756eef2102eSBram Moolenaar 1757eef2102eSBram Moolenaar lines =<< trim END 1758eef2102eSBram Moolenaar vim9script 1759eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1760eef2102eSBram Moolenaar def Outer() 1761eef2102eSBram Moolenaar def Func() 1762eef2102eSBram Moolenaar echo 'local to function' 1763eef2102eSBram Moolenaar enddef 1764eef2102eSBram Moolenaar enddef 1765eef2102eSBram Moolenaar defcompile 1766eef2102eSBram Moolenaar END 1767eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1768eef2102eSBram Moolenaar 1769eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1770eef2102eSBram Moolenaarenddef 1771eef2102eSBram Moolenaar 1772b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1773cfcd011fSBram Moolenaar var lines =<< trim END 1774b9a2cac3SBram Moolenaar vim9script 1775b9a2cac3SBram Moolenaar def Func() 1776b9a2cac3SBram Moolenaar echo 'one' 1777b9a2cac3SBram Moolenaar enddef 1778b9a2cac3SBram Moolenaar def Func() 1779b9a2cac3SBram Moolenaar echo 'two' 1780b9a2cac3SBram Moolenaar enddef 1781b9a2cac3SBram Moolenaar END 1782b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1783fa211f3cSBram Moolenaar 1784fa211f3cSBram Moolenaar lines =<< trim END 1785fa211f3cSBram Moolenaar vim9script 1786fa211f3cSBram Moolenaar def Foo(): string 1787fa211f3cSBram Moolenaar return 'foo' 1788fa211f3cSBram Moolenaar enddef 1789fa211f3cSBram Moolenaar def Func() 1790cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1791fa211f3cSBram Moolenaar enddef 1792fa211f3cSBram Moolenaar defcompile 1793fa211f3cSBram Moolenaar END 1794fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1795b9a2cac3SBram Moolenaarenddef 1796b9a2cac3SBram Moolenaar 17978a7d6542SBram Moolenaardef Test_fixed_size_list() 1798f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1799cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 18008a7d6542SBram Moolenaar l->remove(0) 18018a7d6542SBram Moolenaar l->add(5) 18028a7d6542SBram Moolenaar l->insert(99, 1) 18030f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18048a7d6542SBram Moolenaarenddef 18058a7d6542SBram Moolenaar 1806ae616494SBram Moolenaardef Test_no_insert_xit() 1807d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1808d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1809d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1810d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1811d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1812ae616494SBram Moolenaar 1813ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1814ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1815ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1816ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1817f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1818f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1819f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1820f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1821f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1822ae616494SBram Moolenaarenddef 1823ae616494SBram Moolenaar 1824158906cfSBram Moolenaardef IfElse(what: number): string 1825cfcd011fSBram Moolenaar var res = '' 1826158906cfSBram Moolenaar if what == 1 1827158906cfSBram Moolenaar res = "one" 1828158906cfSBram Moolenaar elseif what == 2 1829158906cfSBram Moolenaar res = "two" 1830a259d8d3SBram Moolenaar else 1831158906cfSBram Moolenaar res = "three" 1832a259d8d3SBram Moolenaar endif 1833158906cfSBram Moolenaar return res 1834a259d8d3SBram Moolenaarenddef 1835a259d8d3SBram Moolenaar 1836158906cfSBram Moolenaardef Test_if_elseif_else() 1837158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1838158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1839158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18400f18b6d1SBram Moolenaarenddef 18410f18b6d1SBram Moolenaar 1842e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1843d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1844d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1845d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1846ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1847d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 18486628b7ebSBram Moolenaar 18496628b7ebSBram Moolenaar var lines =<< trim END 18506628b7ebSBram Moolenaar var s = '' 18516628b7ebSBram Moolenaar if s = '' 18526628b7ebSBram Moolenaar endif 18536628b7ebSBram Moolenaar END 18546628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 18556628b7ebSBram Moolenaar 18566628b7ebSBram Moolenaar lines =<< trim END 18576628b7ebSBram Moolenaar var s = '' 18586628b7ebSBram Moolenaar if s == '' 18596628b7ebSBram Moolenaar elseif s = '' 18606628b7ebSBram Moolenaar endif 18616628b7ebSBram Moolenaar END 18626628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1863e8c4abbbSBram Moolenaarenddef 1864e8c4abbbSBram Moolenaar 18656d69bf60SBram Moolenaarlet g:bool_true = v:true 18666d69bf60SBram Moolenaarlet g:bool_false = v:false 18676d69bf60SBram Moolenaar 18686d69bf60SBram Moolenaardef Test_if_const_expr() 1869cfcd011fSBram Moolenaar var res = false 18706d69bf60SBram Moolenaar if true ? true : false 18716d69bf60SBram Moolenaar res = true 18726d69bf60SBram Moolenaar endif 18736d69bf60SBram Moolenaar assert_equal(true, res) 18746d69bf60SBram Moolenaar 1875585fea7bSBram Moolenaar g:glob = 2 1876585fea7bSBram Moolenaar if false 18776797966dSBram Moolenaar execute('g:glob = 3') 1878585fea7bSBram Moolenaar endif 1879585fea7bSBram Moolenaar assert_equal(2, g:glob) 1880585fea7bSBram Moolenaar if true 18816797966dSBram Moolenaar execute('g:glob = 3') 1882585fea7bSBram Moolenaar endif 1883585fea7bSBram Moolenaar assert_equal(3, g:glob) 1884585fea7bSBram Moolenaar 18856d69bf60SBram Moolenaar res = false 18866d69bf60SBram Moolenaar if g:bool_true ? true : false 18876d69bf60SBram Moolenaar res = true 18886d69bf60SBram Moolenaar endif 18896d69bf60SBram Moolenaar assert_equal(true, res) 18906d69bf60SBram Moolenaar 18916d69bf60SBram Moolenaar res = false 18926d69bf60SBram Moolenaar if true ? g:bool_true : false 18936d69bf60SBram Moolenaar res = true 18946d69bf60SBram Moolenaar endif 18956d69bf60SBram Moolenaar assert_equal(true, res) 18966d69bf60SBram Moolenaar 18976d69bf60SBram Moolenaar res = false 18986d69bf60SBram Moolenaar if true ? true : g:bool_false 18996d69bf60SBram Moolenaar res = true 19006d69bf60SBram Moolenaar endif 19016d69bf60SBram Moolenaar assert_equal(true, res) 19026d69bf60SBram Moolenaar 19036d69bf60SBram Moolenaar res = false 19046d69bf60SBram Moolenaar if true ? false : true 19056d69bf60SBram Moolenaar res = true 19066d69bf60SBram Moolenaar endif 19076d69bf60SBram Moolenaar assert_equal(false, res) 19086d69bf60SBram Moolenaar 19096d69bf60SBram Moolenaar res = false 19106d69bf60SBram Moolenaar if false ? false : true 19116d69bf60SBram Moolenaar res = true 19126d69bf60SBram Moolenaar endif 19136d69bf60SBram Moolenaar assert_equal(true, res) 19146d69bf60SBram Moolenaar 19156d69bf60SBram Moolenaar res = false 19166d69bf60SBram Moolenaar if false ? true : false 19176d69bf60SBram Moolenaar res = true 19186d69bf60SBram Moolenaar endif 19196d69bf60SBram Moolenaar assert_equal(false, res) 19206d69bf60SBram Moolenaar 19216d69bf60SBram Moolenaar res = false 1922e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1923e8c4abbbSBram Moolenaar res = true 1924e8c4abbbSBram Moolenaar endif 1925e8c4abbbSBram Moolenaar assert_equal(false, res) 1926e8c4abbbSBram Moolenaar 1927e8c4abbbSBram Moolenaar res = false 19286d69bf60SBram Moolenaar if true && true 19296d69bf60SBram Moolenaar res = true 19306d69bf60SBram Moolenaar endif 19316d69bf60SBram Moolenaar assert_equal(true, res) 19326d69bf60SBram Moolenaar 19336d69bf60SBram Moolenaar res = false 19346d69bf60SBram Moolenaar if true && false 19356d69bf60SBram Moolenaar res = true 19366d69bf60SBram Moolenaar endif 19376d69bf60SBram Moolenaar assert_equal(false, res) 19386d69bf60SBram Moolenaar 19396d69bf60SBram Moolenaar res = false 19406d69bf60SBram Moolenaar if g:bool_true && false 19416d69bf60SBram Moolenaar res = true 19426d69bf60SBram Moolenaar endif 19436d69bf60SBram Moolenaar assert_equal(false, res) 19446d69bf60SBram Moolenaar 19456d69bf60SBram Moolenaar res = false 19466d69bf60SBram Moolenaar if true && g:bool_false 19476d69bf60SBram Moolenaar res = true 19486d69bf60SBram Moolenaar endif 19496d69bf60SBram Moolenaar assert_equal(false, res) 19506d69bf60SBram Moolenaar 19516d69bf60SBram Moolenaar res = false 19526d69bf60SBram Moolenaar if false && false 19536d69bf60SBram Moolenaar res = true 19546d69bf60SBram Moolenaar endif 19556d69bf60SBram Moolenaar assert_equal(false, res) 19566d69bf60SBram Moolenaar 19576d69bf60SBram Moolenaar res = false 19586d69bf60SBram Moolenaar if true || false 19596d69bf60SBram Moolenaar res = true 19606d69bf60SBram Moolenaar endif 19616d69bf60SBram Moolenaar assert_equal(true, res) 19626d69bf60SBram Moolenaar 19636d69bf60SBram Moolenaar res = false 19646d69bf60SBram Moolenaar if g:bool_true || false 19656d69bf60SBram Moolenaar res = true 19666d69bf60SBram Moolenaar endif 19676d69bf60SBram Moolenaar assert_equal(true, res) 19686d69bf60SBram Moolenaar 19696d69bf60SBram Moolenaar res = false 19706d69bf60SBram Moolenaar if true || g:bool_false 19716d69bf60SBram Moolenaar res = true 19726d69bf60SBram Moolenaar endif 19736d69bf60SBram Moolenaar assert_equal(true, res) 19746d69bf60SBram Moolenaar 19756d69bf60SBram Moolenaar res = false 19766d69bf60SBram Moolenaar if false || false 19776d69bf60SBram Moolenaar res = true 19786d69bf60SBram Moolenaar endif 19796d69bf60SBram Moolenaar assert_equal(false, res) 19803988f64fSBram Moolenaar 19813988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 19823988f64fSBram Moolenaar if false | eval 0 | endif 19833988f64fSBram Moolenaar if false | eval burp + 234 | endif 19843988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 19853988f64fSBram Moolenaar if false 19863988f64fSBram Moolenaar burp 19873988f64fSBram Moolenaar endif 198880c34ca3SBram Moolenaarenddef 19896d69bf60SBram Moolenaar 199080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1991d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1992d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1993d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1994d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19956d69bf60SBram Moolenaarenddef 19966d69bf60SBram Moolenaar 199772abcf42SBram Moolenaardef RunNested(i: number): number 1998cfcd011fSBram Moolenaar var x: number = 0 199972abcf42SBram Moolenaar if i % 2 200072abcf42SBram Moolenaar if 1 2001f5be8cdbSBram Moolenaar # comment 200272abcf42SBram Moolenaar else 2003f5be8cdbSBram Moolenaar # comment 200472abcf42SBram Moolenaar endif 200572abcf42SBram Moolenaar x += 1 200672abcf42SBram Moolenaar else 200772abcf42SBram Moolenaar x += 1000 200872abcf42SBram Moolenaar endif 200972abcf42SBram Moolenaar return x 201072abcf42SBram Moolenaarenddef 201172abcf42SBram Moolenaar 201272abcf42SBram Moolenaardef Test_nested_if() 201372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 201472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 201572abcf42SBram Moolenaarenddef 201672abcf42SBram Moolenaar 2017ad39c094SBram Moolenaardef Test_execute_cmd() 2018e4984290SBram Moolenaar # missing argument is ignored 2019e4984290SBram Moolenaar execute 2020e4984290SBram Moolenaar execute # comment 2021e4984290SBram Moolenaar 2022ad39c094SBram Moolenaar new 2023ad39c094SBram Moolenaar setline(1, 'default') 2024d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2025ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2026a72cfb80SBram Moolenaar 2027d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2028a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2029a72cfb80SBram Moolenaar 2030cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2031cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2032a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2033ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2034a72cfb80SBram Moolenaar 2035d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2036ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2037a72cfb80SBram Moolenaar 2038cfcd011fSBram Moolenaar var cmd_first = 'call ' 2039cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2040ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2041ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2042ad39c094SBram Moolenaar bwipe! 2043585fea7bSBram Moolenaar 2044cfcd011fSBram Moolenaar var n = true 20452d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20462d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20472d6b20d6SBram Moolenaar 2048e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2049e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2050e5abf7afSBram Moolenaar 2051d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2052d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2053d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2054ad39c094SBram Moolenaarenddef 2055ad39c094SBram Moolenaar 205647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2057f5be8cdbSBram Moolenaar # only checks line continuation 2058cfcd011fSBram Moolenaar var lines =<< trim END 205947e880d6SBram Moolenaar vim9script 206047e880d6SBram Moolenaar execute 'g:someVar' 206147e880d6SBram Moolenaar .. ' = ' .. 206247e880d6SBram Moolenaar '28' 206347e880d6SBram Moolenaar assert_equal(28, g:someVar) 206447e880d6SBram Moolenaar unlet g:someVar 206547e880d6SBram Moolenaar END 206647e880d6SBram Moolenaar CheckScriptSuccess(lines) 206747e880d6SBram Moolenaarenddef 206847e880d6SBram Moolenaar 2069ad39c094SBram Moolenaardef Test_echo_cmd() 2070a72cfb80SBram Moolenaar echo 'some' # comment 2071585fea7bSBram Moolenaar echon 'thing' 2072ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2073ad39c094SBram Moolenaar 2074a72cfb80SBram Moolenaar echo "some" # comment 2075a72cfb80SBram Moolenaar echon "thing" 2076a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2077a72cfb80SBram Moolenaar 2078cfcd011fSBram Moolenaar var str1 = 'some' 2079cfcd011fSBram Moolenaar var str2 = 'more' 2080ad39c094SBram Moolenaar echo str1 str2 2081ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2082a72cfb80SBram Moolenaar 2083d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2084ad39c094SBram Moolenaarenddef 2085ad39c094SBram Moolenaar 2086f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2087f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2088f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2089f93c7feaSBram Moolenaar echo 'clear' 2090df069eecSBram Moolenaar :1messages 2091f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2092f93c7feaSBram Moolenaar 2093d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2094f93c7feaSBram Moolenaarenddef 2095f93c7feaSBram Moolenaar 209647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2097f5be8cdbSBram Moolenaar # only checks line continuation 2098cfcd011fSBram Moolenaar var lines =<< trim END 209947e880d6SBram Moolenaar vim9script 210047e880d6SBram Moolenaar echomsg 'here' 210147e880d6SBram Moolenaar .. ' is ' .. 210247e880d6SBram Moolenaar 'a message' 210347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 210447e880d6SBram Moolenaar END 210547e880d6SBram Moolenaar CheckScriptSuccess(lines) 210647e880d6SBram Moolenaarenddef 210747e880d6SBram Moolenaar 2108f93c7feaSBram Moolenaardef Test_echoerr_cmd() 210940ee466cSBram Moolenaar try 211040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 211140ee466cSBram Moolenaar catch 211240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 211340ee466cSBram Moolenaar endtry 2114f93c7feaSBram Moolenaarenddef 2115f93c7feaSBram Moolenaar 211647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2117f5be8cdbSBram Moolenaar # only checks line continuation 2118cfcd011fSBram Moolenaar var lines =<< trim END 211947e880d6SBram Moolenaar vim9script 212047e880d6SBram Moolenaar try 212147e880d6SBram Moolenaar echoerr 'this' 212247e880d6SBram Moolenaar .. ' is ' .. 212347e880d6SBram Moolenaar 'wrong' 212447e880d6SBram Moolenaar catch 212547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 212647e880d6SBram Moolenaar endtry 212747e880d6SBram Moolenaar END 212847e880d6SBram Moolenaar CheckScriptSuccess(lines) 212947e880d6SBram Moolenaarenddef 213047e880d6SBram Moolenaar 213141fe0617SBram Moolenaardef Test_for_outside_of_function() 2132cfcd011fSBram Moolenaar var lines =<< trim END 213341fe0617SBram Moolenaar vim9script 213441fe0617SBram Moolenaar new 213541fe0617SBram Moolenaar for var in range(0, 3) 213641fe0617SBram Moolenaar append(line('$'), var) 213741fe0617SBram Moolenaar endfor 213841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 213941fe0617SBram Moolenaar bwipe! 214041fe0617SBram Moolenaar END 214141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 214241fe0617SBram Moolenaar source Xvim9for.vim 214341fe0617SBram Moolenaar delete('Xvim9for.vim') 214441fe0617SBram Moolenaarenddef 21458a7d6542SBram Moolenaar 2146e8c4abbbSBram Moolenaardef Test_for_loop() 2147cfcd011fSBram Moolenaar var result = '' 2148e8c4abbbSBram Moolenaar for cnt in range(7) 2149e8c4abbbSBram Moolenaar if cnt == 4 2150e8c4abbbSBram Moolenaar break 2151e8c4abbbSBram Moolenaar endif 2152e8c4abbbSBram Moolenaar if cnt == 2 2153e8c4abbbSBram Moolenaar continue 2154e8c4abbbSBram Moolenaar endif 2155e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2156e8c4abbbSBram Moolenaar endfor 2157e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21580ad3e894SBram Moolenaar 2159cfcd011fSBram Moolenaar var concat = '' 21600ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21610ad3e894SBram Moolenaar concat ..= str 21620ad3e894SBram Moolenaar endfor 21630ad3e894SBram Moolenaar assert_equal('onetwo', concat) 216438bd8de5SBram Moolenaar 216538bd8de5SBram Moolenaar var total = 0 216638bd8de5SBram Moolenaar for nr in 216738bd8de5SBram Moolenaar [1, 2, 3] 216838bd8de5SBram Moolenaar total += nr 216938bd8de5SBram Moolenaar endfor 217038bd8de5SBram Moolenaar assert_equal(6, total) 217138bd8de5SBram Moolenaar 217238bd8de5SBram Moolenaar total = 0 217338bd8de5SBram Moolenaar for nr 217438bd8de5SBram Moolenaar in [1, 2, 3] 217538bd8de5SBram Moolenaar total += nr 217638bd8de5SBram Moolenaar endfor 217738bd8de5SBram Moolenaar assert_equal(6, total) 217838bd8de5SBram Moolenaar 217938bd8de5SBram Moolenaar total = 0 218038bd8de5SBram Moolenaar for nr 218138bd8de5SBram Moolenaar in 218238bd8de5SBram Moolenaar [1, 2, 3] 218338bd8de5SBram Moolenaar total += nr 218438bd8de5SBram Moolenaar endfor 218538bd8de5SBram Moolenaar assert_equal(6, total) 2186036d0714SBram Moolenaar 2187036d0714SBram Moolenaar var res = "" 2188036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2189036d0714SBram Moolenaar res ..= n .. s 2190036d0714SBram Moolenaar endfor 2191036d0714SBram Moolenaar assert_equal('1a2b', res) 2192e8c4abbbSBram Moolenaarenddef 2193e8c4abbbSBram Moolenaar 2194e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2195025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2196025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2197025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2198675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2199675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2200cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2201822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 22022d870f8dSBram Moolenaar delfunc! g:Func 2203451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2204675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2205675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2206675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2207e8c4abbbSBram Moolenaarenddef 2208e8c4abbbSBram Moolenaar 2209ea87069dSBram Moolenaardef Test_for_loop_script_var() 2210ea87069dSBram Moolenaar # cannot use s:var in a :def function 2211ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2212ea87069dSBram Moolenaar 2213ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2214ea87069dSBram Moolenaar var lines =<< trim END 2215ea87069dSBram Moolenaar vim9script 2216ea87069dSBram Moolenaar var total = 0 2217ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2218ea87069dSBram Moolenaar total += s:var 2219ea87069dSBram Moolenaar endfor 2220ea87069dSBram Moolenaar assert_equal(6, total) 2221ea87069dSBram Moolenaar 2222ea87069dSBram Moolenaar total = 0 2223ea87069dSBram Moolenaar for var in [1, 2, 3] 2224ea87069dSBram Moolenaar total += var 2225ea87069dSBram Moolenaar endfor 2226ea87069dSBram Moolenaar assert_equal(6, total) 2227ea87069dSBram Moolenaar END 2228ea87069dSBram Moolenaarenddef 2229ea87069dSBram Moolenaar 2230792f786aSBram Moolenaardef Test_for_loop_unpack() 22314b8a0651SBram Moolenaar var lines =<< trim END 2232792f786aSBram Moolenaar var result = [] 2233792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2234792f786aSBram Moolenaar result->add(v1) 2235792f786aSBram Moolenaar result->add(v2) 2236792f786aSBram Moolenaar endfor 2237792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2238792f786aSBram Moolenaar 2239792f786aSBram Moolenaar result = [] 2240792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2241792f786aSBram Moolenaar result->add(v1) 2242792f786aSBram Moolenaar result->add(v2) 2243792f786aSBram Moolenaar result->add(v3) 2244792f786aSBram Moolenaar endfor 2245792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2246792f786aSBram Moolenaar 22474b8a0651SBram Moolenaar result = [] 22484b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 22494b8a0651SBram Moolenaar result->add(&ts) 22504b8a0651SBram Moolenaar result->add(&sw) 22514b8a0651SBram Moolenaar endfor 22524b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 22534b8a0651SBram Moolenaar 22544b8a0651SBram Moolenaar var slist: list<string> 22554b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 22564b8a0651SBram Moolenaar slist->add($LOOPVAR) 22574b8a0651SBram Moolenaar slist->add(@r) 22584b8a0651SBram Moolenaar slist->add(v:errmsg) 22594b8a0651SBram Moolenaar endfor 22604b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22614b8a0651SBram Moolenaar 22624b8a0651SBram Moolenaar slist = [] 22634b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22644b8a0651SBram Moolenaar slist->add(g:globalvar) 22654b8a0651SBram Moolenaar slist->add(b:bufvar) 22664b8a0651SBram Moolenaar slist->add(w:winvar) 22674b8a0651SBram Moolenaar slist->add(t:tabvar) 22684b8a0651SBram Moolenaar endfor 22694b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2270f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 22714b8a0651SBram Moolenaar END 22724b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 22734b8a0651SBram Moolenaar 22744b8a0651SBram Moolenaar lines =<< trim END 2275792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2276792f786aSBram Moolenaar echo v1 v2 2277792f786aSBram Moolenaar endfor 2278792f786aSBram Moolenaar END 2279792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2280792f786aSBram Moolenaar 2281792f786aSBram Moolenaar lines =<< trim END 2282792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2283792f786aSBram Moolenaar echo v1 v2 2284792f786aSBram Moolenaar endfor 2285792f786aSBram Moolenaar END 2286792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2287792f786aSBram Moolenaar 2288792f786aSBram Moolenaar lines =<< trim END 2289792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2290792f786aSBram Moolenaar echo v1 2291792f786aSBram Moolenaar endfor 2292792f786aSBram Moolenaar END 2293792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2294792f786aSBram Moolenaarenddef 2295792f786aSBram Moolenaar 2296c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2297c150c09eSBram Moolenaar var looped = 0 2298c150c09eSBram Moolenaar var cleanup = 0 2299c150c09eSBram Moolenaar for i in range(3) 2300c150c09eSBram Moolenaar looped += 1 2301c150c09eSBram Moolenaar try 2302c150c09eSBram Moolenaar eval [][0] 2303c150c09eSBram Moolenaar catch 2304c150c09eSBram Moolenaar continue 2305c150c09eSBram Moolenaar finally 2306c150c09eSBram Moolenaar cleanup += 1 2307c150c09eSBram Moolenaar endtry 2308c150c09eSBram Moolenaar endfor 2309c150c09eSBram Moolenaar assert_equal(3, looped) 2310c150c09eSBram Moolenaar assert_equal(3, cleanup) 2311c150c09eSBram Moolenaarenddef 2312c150c09eSBram Moolenaar 2313d0df1aacSBram Moolenaardef Test_while_loop() 2314cfcd011fSBram Moolenaar var result = '' 2315cfcd011fSBram Moolenaar var cnt = 0 2316d0df1aacSBram Moolenaar while cnt < 555 2317d0df1aacSBram Moolenaar if cnt == 3 2318d0df1aacSBram Moolenaar break 2319d0df1aacSBram Moolenaar endif 2320d0df1aacSBram Moolenaar cnt += 1 2321d0df1aacSBram Moolenaar if cnt == 2 2322d0df1aacSBram Moolenaar continue 2323d0df1aacSBram Moolenaar endif 2324d0df1aacSBram Moolenaar result ..= cnt .. '_' 2325d0df1aacSBram Moolenaar endwhile 2326d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2327dee37dc7SBram Moolenaar 2328dee37dc7SBram Moolenaar var s = '' 23290123cc1eSBram Moolenaar while s == 'x' #{comment} 2330dee37dc7SBram Moolenaar endwhile 2331d0df1aacSBram Moolenaarenddef 2332d0df1aacSBram Moolenaar 2333e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2334675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2335675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2336675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2337675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2338675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2339675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2340675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 23416628b7ebSBram Moolenaar 23426628b7ebSBram Moolenaar var lines =<< trim END 23436628b7ebSBram Moolenaar var s = '' 23446628b7ebSBram Moolenaar while s = '' 23456628b7ebSBram Moolenaar endwhile 23466628b7ebSBram Moolenaar END 23476628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2348bd5da371SBram Moolenaarenddef 2349bd5da371SBram Moolenaar 23509645e2d9SBram Moolenaardef Test_interrupt_loop() 2351cfcd011fSBram Moolenaar var caught = false 2352cfcd011fSBram Moolenaar var x = 0 235397acfc78SBram Moolenaar try 23549645e2d9SBram Moolenaar while 1 23559645e2d9SBram Moolenaar x += 1 23569645e2d9SBram Moolenaar if x == 100 23579645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23589645e2d9SBram Moolenaar endif 23599645e2d9SBram Moolenaar endwhile 236097acfc78SBram Moolenaar catch 236197acfc78SBram Moolenaar caught = true 236297acfc78SBram Moolenaar assert_equal(100, x) 236397acfc78SBram Moolenaar endtry 236497acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 236525859dd7SBram Moolenaar # consume the CTRL-C 236625859dd7SBram Moolenaar getchar(0) 23679645e2d9SBram Moolenaarenddef 236820431c9dSBram Moolenaar 23694fdae999SBram Moolenaardef Test_automatic_line_continuation() 2370cfcd011fSBram Moolenaar var mylist = [ 23714fdae999SBram Moolenaar 'one', 23724fdae999SBram Moolenaar 'two', 23734fdae999SBram Moolenaar 'three', 2374f5be8cdbSBram Moolenaar ] # comment 23754fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23764fdae999SBram Moolenaar 2377cfcd011fSBram Moolenaar var mydict = { 2378e0de171eSBram Moolenaar ['one']: 1, 2379e0de171eSBram Moolenaar ['two']: 2, 2380e0de171eSBram Moolenaar ['three']: 23814fdae999SBram Moolenaar 3, 2382f5be8cdbSBram Moolenaar } # comment 2383e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2384e0de171eSBram Moolenaar mydict = { 23852c330432SBram Moolenaar one: 1, # comment 23862c330432SBram Moolenaar two: # comment 23872c330432SBram Moolenaar 2, # comment 23882c330432SBram Moolenaar three: 3 # comment 23892c330432SBram Moolenaar } 2390e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2391e0de171eSBram Moolenaar mydict = { 23922c330432SBram Moolenaar one: 1, 23934fdae999SBram Moolenaar two: 23944fdae999SBram Moolenaar 2, 23952c330432SBram Moolenaar three: 3 23964fdae999SBram Moolenaar } 2397e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2398e6085c53SBram Moolenaar 2399e6085c53SBram Moolenaar assert_equal( 2400e6085c53SBram Moolenaar ['one', 'two', 'three'], 2401e6085c53SBram Moolenaar split('one two three') 2402e6085c53SBram Moolenaar ) 24034fdae999SBram Moolenaarenddef 24044fdae999SBram Moolenaar 24057a092245SBram Moolenaardef Test_vim9_comment() 24067a092245SBram Moolenaar CheckScriptSuccess([ 24077a092245SBram Moolenaar 'vim9script', 24087a092245SBram Moolenaar '# something', 240993f82cbeSBram Moolenaar '#something', 241093f82cbeSBram Moolenaar '#{something', 24117a092245SBram Moolenaar ]) 241293f82cbeSBram Moolenaar 241393f82cbeSBram Moolenaar split Xfile 241493f82cbeSBram Moolenaar CheckScriptSuccess([ 241593f82cbeSBram Moolenaar 'vim9script', 241693f82cbeSBram Moolenaar 'edit #something', 241793f82cbeSBram Moolenaar ]) 241893f82cbeSBram Moolenaar CheckScriptSuccess([ 241993f82cbeSBram Moolenaar 'vim9script', 242093f82cbeSBram Moolenaar 'edit #{something', 242193f82cbeSBram Moolenaar ]) 242293f82cbeSBram Moolenaar close 242393f82cbeSBram Moolenaar 24247a092245SBram Moolenaar CheckScriptFailure([ 24257a092245SBram Moolenaar 'vim9script', 24267a092245SBram Moolenaar ':# something', 24277a092245SBram Moolenaar ], 'E488:') 24287a092245SBram Moolenaar CheckScriptFailure([ 24297a092245SBram Moolenaar '# something', 24307a092245SBram Moolenaar ], 'E488:') 24317a092245SBram Moolenaar CheckScriptFailure([ 24327a092245SBram Moolenaar ':# something', 24337a092245SBram Moolenaar ], 'E488:') 24347a092245SBram Moolenaar 24354a8d9f2eSBram Moolenaar { # block start 24364a8d9f2eSBram Moolenaar } # block end 24374a8d9f2eSBram Moolenaar CheckDefFailure([ 24384a8d9f2eSBram Moolenaar '{# comment', 24394a8d9f2eSBram Moolenaar ], 'E488:') 24404a8d9f2eSBram Moolenaar CheckDefFailure([ 24414a8d9f2eSBram Moolenaar '{', 24424a8d9f2eSBram Moolenaar '}# comment', 24434a8d9f2eSBram Moolenaar ], 'E488:') 24444a8d9f2eSBram Moolenaar 24454a8d9f2eSBram Moolenaar echo "yes" # comment 24464a8d9f2eSBram Moolenaar CheckDefFailure([ 24474a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24484a8d9f2eSBram Moolenaar ], 'E488:') 24497a092245SBram Moolenaar CheckScriptSuccess([ 24507a092245SBram Moolenaar 'vim9script', 24517a092245SBram Moolenaar 'echo "yes" # something', 24527a092245SBram Moolenaar ]) 24537a092245SBram Moolenaar CheckScriptFailure([ 24547a092245SBram Moolenaar 'vim9script', 24557a092245SBram Moolenaar 'echo "yes"# something', 24567a092245SBram Moolenaar ], 'E121:') 24577a092245SBram Moolenaar CheckScriptFailure([ 24587a092245SBram Moolenaar 'vim9script', 24597a092245SBram Moolenaar 'echo# something', 2460f8103f27SBram Moolenaar ], 'E1144:') 24617a092245SBram Moolenaar CheckScriptFailure([ 24627a092245SBram Moolenaar 'echo "yes" # something', 24637a092245SBram Moolenaar ], 'E121:') 24647a092245SBram Moolenaar 24654a8d9f2eSBram Moolenaar exe "echo" # comment 24664a8d9f2eSBram Moolenaar CheckDefFailure([ 24674a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24684a8d9f2eSBram Moolenaar ], 'E488:') 24694a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24704a8d9f2eSBram Moolenaar 'vim9script', 24714a8d9f2eSBram Moolenaar 'exe "echo" # something', 24724a8d9f2eSBram Moolenaar ]) 24734a8d9f2eSBram Moolenaar CheckScriptFailure([ 24744a8d9f2eSBram Moolenaar 'vim9script', 24754a8d9f2eSBram Moolenaar 'exe "echo"# something', 24764a8d9f2eSBram Moolenaar ], 'E121:') 24774a8d9f2eSBram Moolenaar CheckScriptFailure([ 24784a8d9f2eSBram Moolenaar 'vim9script', 24794a8d9f2eSBram Moolenaar 'exe# something', 2480f8103f27SBram Moolenaar ], 'E1144:') 24814a8d9f2eSBram Moolenaar CheckScriptFailure([ 24824a8d9f2eSBram Moolenaar 'exe "echo" # something', 24834a8d9f2eSBram Moolenaar ], 'E121:') 24844a8d9f2eSBram Moolenaar 24857a092245SBram Moolenaar CheckDefFailure([ 24867a092245SBram Moolenaar 'try# comment', 24877a092245SBram Moolenaar ' echo "yes"', 24887a092245SBram Moolenaar 'catch', 24897a092245SBram Moolenaar 'endtry', 2490f8103f27SBram Moolenaar ], 'E1144:') 24912c5ed4e3SBram Moolenaar CheckScriptFailure([ 24922c5ed4e3SBram Moolenaar 'vim9script', 24932c5ed4e3SBram Moolenaar 'try# comment', 24942c5ed4e3SBram Moolenaar 'echo "yes"', 2495f8103f27SBram Moolenaar ], 'E1144:') 24967a092245SBram Moolenaar CheckDefFailure([ 24977a092245SBram Moolenaar 'try', 2498a72cfb80SBram Moolenaar ' throw#comment', 2499a72cfb80SBram Moolenaar 'catch', 2500a72cfb80SBram Moolenaar 'endtry', 2501f8103f27SBram Moolenaar ], 'E1144:') 2502a72cfb80SBram Moolenaar CheckDefFailure([ 2503a72cfb80SBram Moolenaar 'try', 2504a72cfb80SBram Moolenaar ' throw "yes"#comment', 2505a72cfb80SBram Moolenaar 'catch', 2506a72cfb80SBram Moolenaar 'endtry', 2507a72cfb80SBram Moolenaar ], 'E488:') 2508a72cfb80SBram Moolenaar CheckDefFailure([ 2509a72cfb80SBram Moolenaar 'try', 25107a092245SBram Moolenaar ' echo "yes"', 25117a092245SBram Moolenaar 'catch# comment', 25127a092245SBram Moolenaar 'endtry', 2513f8103f27SBram Moolenaar ], 'E1144:') 25142c5ed4e3SBram Moolenaar CheckScriptFailure([ 25152c5ed4e3SBram Moolenaar 'vim9script', 25162c5ed4e3SBram Moolenaar 'try', 25172c5ed4e3SBram Moolenaar ' echo "yes"', 25182c5ed4e3SBram Moolenaar 'catch# comment', 25192c5ed4e3SBram Moolenaar 'endtry', 2520f8103f27SBram Moolenaar ], 'E1144:') 25212c5ed4e3SBram Moolenaar CheckDefFailure([ 25222c5ed4e3SBram Moolenaar 'try', 25232c5ed4e3SBram Moolenaar ' echo "yes"', 25242c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25252c5ed4e3SBram Moolenaar 'endtry', 25262c5ed4e3SBram Moolenaar ], 'E488:') 25277a092245SBram Moolenaar CheckDefFailure([ 25287a092245SBram Moolenaar 'try', 25297a092245SBram Moolenaar 'echo "yes"', 25307a092245SBram Moolenaar 'catch', 25317a092245SBram Moolenaar 'endtry# comment', 2532f8103f27SBram Moolenaar ], 'E1144:') 25332c5ed4e3SBram Moolenaar CheckScriptFailure([ 25342c5ed4e3SBram Moolenaar 'vim9script', 25352c5ed4e3SBram Moolenaar 'try', 25362c5ed4e3SBram Moolenaar ' echo "yes"', 25372c5ed4e3SBram Moolenaar 'catch', 25382c5ed4e3SBram Moolenaar 'endtry# comment', 2539f8103f27SBram Moolenaar ], 'E1144:') 25402c5ed4e3SBram Moolenaar 25412c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25422c5ed4e3SBram Moolenaar 'vim9script', 25432c5ed4e3SBram Moolenaar 'hi # comment', 25442c5ed4e3SBram Moolenaar ]) 25452c5ed4e3SBram Moolenaar CheckScriptFailure([ 25462c5ed4e3SBram Moolenaar 'vim9script', 25472c5ed4e3SBram Moolenaar 'hi# comment', 2548f8103f27SBram Moolenaar ], 'E1144:') 25491966c248SBram Moolenaar CheckScriptSuccess([ 25501966c248SBram Moolenaar 'vim9script', 25511966c248SBram Moolenaar 'hi Search # comment', 25521966c248SBram Moolenaar ]) 25531966c248SBram Moolenaar CheckScriptFailure([ 25541966c248SBram Moolenaar 'vim9script', 25551966c248SBram Moolenaar 'hi Search# comment', 25561966c248SBram Moolenaar ], 'E416:') 25571966c248SBram Moolenaar CheckScriptSuccess([ 25581966c248SBram Moolenaar 'vim9script', 25591966c248SBram Moolenaar 'hi link This Search # comment', 25601966c248SBram Moolenaar ]) 25611966c248SBram Moolenaar CheckScriptFailure([ 25621966c248SBram Moolenaar 'vim9script', 25631966c248SBram Moolenaar 'hi link This That# comment', 25641966c248SBram Moolenaar ], 'E413:') 25651966c248SBram Moolenaar CheckScriptSuccess([ 25661966c248SBram Moolenaar 'vim9script', 25671966c248SBram Moolenaar 'hi clear This # comment', 25681966c248SBram Moolenaar 'hi clear # comment', 25691966c248SBram Moolenaar ]) 2570f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2571f5be8cdbSBram Moolenaar # hi clear This# comment', 25721966c248SBram Moolenaar CheckScriptFailure([ 25731966c248SBram Moolenaar 'vim9script', 25741966c248SBram Moolenaar 'hi clear# comment', 25751966c248SBram Moolenaar ], 'E416:') 25761966c248SBram Moolenaar 25771966c248SBram Moolenaar CheckScriptSuccess([ 25781966c248SBram Moolenaar 'vim9script', 25791966c248SBram Moolenaar 'hi Group term=bold', 25801966c248SBram Moolenaar 'match Group /todo/ # comment', 25811966c248SBram Moolenaar ]) 25821966c248SBram Moolenaar CheckScriptFailure([ 25831966c248SBram Moolenaar 'vim9script', 25841966c248SBram Moolenaar 'hi Group term=bold', 25851966c248SBram Moolenaar 'match Group /todo/# comment', 25861966c248SBram Moolenaar ], 'E488:') 25871966c248SBram Moolenaar CheckScriptSuccess([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'match # comment', 25901966c248SBram Moolenaar ]) 25911966c248SBram Moolenaar CheckScriptFailure([ 25921966c248SBram Moolenaar 'vim9script', 25931966c248SBram Moolenaar 'match# comment', 2594f8103f27SBram Moolenaar ], 'E1144:') 25951966c248SBram Moolenaar CheckScriptSuccess([ 25961966c248SBram Moolenaar 'vim9script', 25971966c248SBram Moolenaar 'match none # comment', 25981966c248SBram Moolenaar ]) 25991966c248SBram Moolenaar CheckScriptFailure([ 26001966c248SBram Moolenaar 'vim9script', 26011966c248SBram Moolenaar 'match none# comment', 26021966c248SBram Moolenaar ], 'E475:') 26031966c248SBram Moolenaar 26041966c248SBram Moolenaar CheckScriptSuccess([ 26051966c248SBram Moolenaar 'vim9script', 26061966c248SBram Moolenaar 'menutrans clear # comment', 26071966c248SBram Moolenaar ]) 26081966c248SBram Moolenaar CheckScriptFailure([ 26091966c248SBram Moolenaar 'vim9script', 26101966c248SBram Moolenaar 'menutrans clear# comment text', 26111966c248SBram Moolenaar ], 'E474:') 26121966c248SBram Moolenaar 26131966c248SBram Moolenaar CheckScriptSuccess([ 26141966c248SBram Moolenaar 'vim9script', 26151966c248SBram Moolenaar 'syntax clear # comment', 26161966c248SBram Moolenaar ]) 26171966c248SBram Moolenaar CheckScriptFailure([ 26181966c248SBram Moolenaar 'vim9script', 26191966c248SBram Moolenaar 'syntax clear# comment text', 26201966c248SBram Moolenaar ], 'E28:') 26211966c248SBram Moolenaar CheckScriptSuccess([ 26221966c248SBram Moolenaar 'vim9script', 26231966c248SBram Moolenaar 'syntax keyword Word some', 26241966c248SBram Moolenaar 'syntax clear Word # comment', 26251966c248SBram Moolenaar ]) 26261966c248SBram Moolenaar CheckScriptFailure([ 26271966c248SBram Moolenaar 'vim9script', 26281966c248SBram Moolenaar 'syntax keyword Word some', 26291966c248SBram Moolenaar 'syntax clear Word# comment text', 26301966c248SBram Moolenaar ], 'E28:') 26311966c248SBram Moolenaar 26321966c248SBram Moolenaar CheckScriptSuccess([ 26331966c248SBram Moolenaar 'vim9script', 26341966c248SBram Moolenaar 'syntax list # comment', 26351966c248SBram Moolenaar ]) 26361966c248SBram Moolenaar CheckScriptFailure([ 26371966c248SBram Moolenaar 'vim9script', 26381966c248SBram Moolenaar 'syntax list# comment text', 26391966c248SBram Moolenaar ], 'E28:') 26401966c248SBram Moolenaar 26411966c248SBram Moolenaar CheckScriptSuccess([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26441966c248SBram Moolenaar ]) 26451966c248SBram Moolenaar CheckScriptFailure([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26481966c248SBram Moolenaar ], 'E475:') 26491966c248SBram Moolenaar 26501966c248SBram Moolenaar CheckScriptSuccess([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26531966c248SBram Moolenaar ]) 26541966c248SBram Moolenaar CheckScriptFailure([ 26551966c248SBram Moolenaar 'vim9script', 26561966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26571966c248SBram Moolenaar ], 'E789:') 26581966c248SBram Moolenaar 26591966c248SBram Moolenaar CheckScriptSuccess([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26621966c248SBram Moolenaar ]) 26631966c248SBram Moolenaar CheckScriptFailure([ 26641966c248SBram Moolenaar 'vim9script', 26651966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26661966c248SBram Moolenaar ], 'E402:') 26671966c248SBram Moolenaar 26681966c248SBram Moolenaar CheckScriptSuccess([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26711966c248SBram Moolenaar ]) 26721966c248SBram Moolenaar CheckScriptFailure([ 26731966c248SBram Moolenaar 'vim9script', 26741966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26751966c248SBram Moolenaar ], 'E475:') 26761966c248SBram Moolenaar CheckScriptFailure([ 26771966c248SBram Moolenaar 'vim9script', 26781966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26791966c248SBram Moolenaar ], 'E406:') 26801966c248SBram Moolenaar CheckScriptFailure([ 26811966c248SBram Moolenaar 'vim9script', 26821966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26831966c248SBram Moolenaar ], 'E475:') 26841966c248SBram Moolenaar 26851966c248SBram Moolenaar CheckScriptSuccess([ 26861966c248SBram Moolenaar 'vim9script', 26871966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26881966c248SBram Moolenaar ]) 26891966c248SBram Moolenaar CheckScriptFailure([ 26901966c248SBram Moolenaar 'vim9script', 26911966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2692d032f34aSBram Moolenaar ], 'E402:') 26931966c248SBram Moolenaar 26941966c248SBram Moolenaar CheckScriptSuccess([ 26951966c248SBram Moolenaar 'vim9script', 26961966c248SBram Moolenaar 'syntax sync # comment', 26971966c248SBram Moolenaar ]) 26981966c248SBram Moolenaar CheckScriptFailure([ 26991966c248SBram Moolenaar 'vim9script', 27001966c248SBram Moolenaar 'syntax sync# comment', 27011966c248SBram Moolenaar ], 'E404:') 27021966c248SBram Moolenaar CheckScriptSuccess([ 27031966c248SBram Moolenaar 'vim9script', 27041966c248SBram Moolenaar 'syntax sync ccomment # comment', 27051966c248SBram Moolenaar ]) 27061966c248SBram Moolenaar CheckScriptFailure([ 27071966c248SBram Moolenaar 'vim9script', 27081966c248SBram Moolenaar 'syntax sync ccomment# comment', 27091966c248SBram Moolenaar ], 'E404:') 27101966c248SBram Moolenaar 27111966c248SBram Moolenaar CheckScriptSuccess([ 27121966c248SBram Moolenaar 'vim9script', 27131966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27141966c248SBram Moolenaar ]) 27151966c248SBram Moolenaar CheckScriptFailure([ 27161966c248SBram Moolenaar 'vim9script', 27171966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27181966c248SBram Moolenaar ], 'E475:') 2719a72cfb80SBram Moolenaar 2720a72cfb80SBram Moolenaar CheckScriptSuccess([ 2721a72cfb80SBram Moolenaar 'vim9script', 2722a72cfb80SBram Moolenaar 'command Echo echo # comment', 2723a72cfb80SBram Moolenaar 'command Echo # comment', 27242d870f8dSBram Moolenaar 'delcommand Echo', 2725a72cfb80SBram Moolenaar ]) 2726a72cfb80SBram Moolenaar CheckScriptFailure([ 2727a72cfb80SBram Moolenaar 'vim9script', 2728a72cfb80SBram Moolenaar 'command Echo echo# comment', 2729a72cfb80SBram Moolenaar 'Echo', 2730f8103f27SBram Moolenaar ], 'E1144:') 27312d870f8dSBram Moolenaar delcommand Echo 273270249ee8SBram Moolenaar 273370249ee8SBram Moolenaar var curdir = getcwd() 273470249ee8SBram Moolenaar CheckScriptSuccess([ 273570249ee8SBram Moolenaar 'command Echo cd " comment', 273670249ee8SBram Moolenaar 'Echo', 273770249ee8SBram Moolenaar 'delcommand Echo', 273870249ee8SBram Moolenaar ]) 273970249ee8SBram Moolenaar CheckScriptSuccess([ 2740090728adSBram Moolenaar 'vim9script', 274170249ee8SBram Moolenaar 'command Echo cd # comment', 274270249ee8SBram Moolenaar 'Echo', 274370249ee8SBram Moolenaar 'delcommand Echo', 274470249ee8SBram Moolenaar ]) 274570249ee8SBram Moolenaar CheckScriptFailure([ 274670249ee8SBram Moolenaar 'vim9script', 274770249ee8SBram Moolenaar 'command Echo cd " comment', 274870249ee8SBram Moolenaar 'Echo', 274970249ee8SBram Moolenaar ], 'E344:') 275070249ee8SBram Moolenaar delcommand Echo 275170249ee8SBram Moolenaar chdir(curdir) 275270249ee8SBram Moolenaar 2753a72cfb80SBram Moolenaar CheckScriptFailure([ 2754a72cfb80SBram Moolenaar 'vim9script', 2755a72cfb80SBram Moolenaar 'command Echo# comment', 2756a72cfb80SBram Moolenaar ], 'E182:') 2757a72cfb80SBram Moolenaar CheckScriptFailure([ 2758a72cfb80SBram Moolenaar 'vim9script', 2759a72cfb80SBram Moolenaar 'command Echo echo', 2760a72cfb80SBram Moolenaar 'command Echo# comment', 2761a72cfb80SBram Moolenaar ], 'E182:') 27622d870f8dSBram Moolenaar delcommand Echo 2763a72cfb80SBram Moolenaar 2764a72cfb80SBram Moolenaar CheckScriptSuccess([ 2765a72cfb80SBram Moolenaar 'vim9script', 2766a72cfb80SBram Moolenaar 'function # comment', 2767a72cfb80SBram Moolenaar ]) 2768a72cfb80SBram Moolenaar CheckScriptFailure([ 2769a72cfb80SBram Moolenaar 'vim9script', 27709898107fSBram Moolenaar 'function " comment', 27719898107fSBram Moolenaar ], 'E129:') 27729898107fSBram Moolenaar CheckScriptFailure([ 27739898107fSBram Moolenaar 'vim9script', 2774a72cfb80SBram Moolenaar 'function# comment', 2775f8103f27SBram Moolenaar ], 'E1144:') 2776a72cfb80SBram Moolenaar CheckScriptSuccess([ 2777a72cfb80SBram Moolenaar 'vim9script', 2778a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2779a72cfb80SBram Moolenaar ]) 2780a72cfb80SBram Moolenaar CheckScriptFailure([ 2781a72cfb80SBram Moolenaar 'vim9script', 2782a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2783a72cfb80SBram Moolenaar ], 'E488:') 2784a72cfb80SBram Moolenaar 2785a72cfb80SBram Moolenaar CheckScriptSuccess([ 2786a72cfb80SBram Moolenaar 'vim9script', 27874c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2788a72cfb80SBram Moolenaar 'endfunc', 27894c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2790a72cfb80SBram Moolenaar ]) 2791a72cfb80SBram Moolenaar CheckScriptFailure([ 2792a72cfb80SBram Moolenaar 'vim9script', 27934c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2794a72cfb80SBram Moolenaar 'endfunc', 27954c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2796a72cfb80SBram Moolenaar ], 'E488:') 2797a72cfb80SBram Moolenaar 2798a72cfb80SBram Moolenaar CheckScriptSuccess([ 2799a72cfb80SBram Moolenaar 'vim9script', 2800a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2801a72cfb80SBram Moolenaar ]) 2802a72cfb80SBram Moolenaar CheckScriptFailure([ 2803a72cfb80SBram Moolenaar 'vim9script', 2804a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2805a72cfb80SBram Moolenaar ], 'E488:') 2806e7e4838fSBram Moolenaar 2807e7e4838fSBram Moolenaar CheckScriptFailure([ 2808e7e4838fSBram Moolenaar 'def Test() " comment', 2809e7e4838fSBram Moolenaar 'enddef', 2810e7e4838fSBram Moolenaar ], 'E488:') 2811e7e4838fSBram Moolenaar CheckScriptFailure([ 2812e7e4838fSBram Moolenaar 'vim9script', 2813e7e4838fSBram Moolenaar 'def Test() " comment', 2814e7e4838fSBram Moolenaar 'enddef', 2815e7e4838fSBram Moolenaar ], 'E488:') 2816e7e4838fSBram Moolenaar 2817e7e4838fSBram Moolenaar CheckScriptSuccess([ 2818e7e4838fSBram Moolenaar 'func Test() " comment', 2819e7e4838fSBram Moolenaar 'endfunc', 28202d870f8dSBram Moolenaar 'delfunc Test', 2821e7e4838fSBram Moolenaar ]) 28229898107fSBram Moolenaar CheckScriptSuccess([ 2823e7e4838fSBram Moolenaar 'vim9script', 2824e7e4838fSBram Moolenaar 'func Test() " comment', 2825e7e4838fSBram Moolenaar 'endfunc', 28269898107fSBram Moolenaar ]) 2827e7e4838fSBram Moolenaar 2828e7e4838fSBram Moolenaar CheckScriptSuccess([ 2829e7e4838fSBram Moolenaar 'def Test() # comment', 2830e7e4838fSBram Moolenaar 'enddef', 2831e7e4838fSBram Moolenaar ]) 2832e7e4838fSBram Moolenaar CheckScriptFailure([ 2833e7e4838fSBram Moolenaar 'func Test() # comment', 2834e7e4838fSBram Moolenaar 'endfunc', 2835e7e4838fSBram Moolenaar ], 'E488:') 28362c5ed4e3SBram Moolenaarenddef 28372c5ed4e3SBram Moolenaar 28382c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28392c5ed4e3SBram Moolenaar CheckCanRunGui 28402c5ed4e3SBram Moolenaar 28412c5ed4e3SBram Moolenaar CheckScriptFailure([ 28422c5ed4e3SBram Moolenaar 'vim9script', 28432c5ed4e3SBram Moolenaar 'gui#comment' 2844f8103f27SBram Moolenaar ], 'E1144:') 28452c5ed4e3SBram Moolenaar CheckScriptFailure([ 28462c5ed4e3SBram Moolenaar 'vim9script', 28472c5ed4e3SBram Moolenaar 'gui -f#comment' 28482c5ed4e3SBram Moolenaar ], 'E499:') 28497a092245SBram Moolenaarenddef 28507a092245SBram Moolenaar 2851a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28526797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28536797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2854a26b9700SBram Moolenaar 2855a26b9700SBram Moolenaar edit test.vim 2856a26b9700SBram Moolenaar doautocmd TabEnter #comment 2857a26b9700SBram Moolenaar assert_equal(1, g:entered) 2858a26b9700SBram Moolenaar 2859a26b9700SBram Moolenaar doautocmd TabEnter f.x 2860a26b9700SBram Moolenaar assert_equal(2, g:entered) 2861a26b9700SBram Moolenaar 2862a26b9700SBram Moolenaar g:entered = 0 2863a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2864a26b9700SBram Moolenaar assert_equal(2, g:entered) 2865a26b9700SBram Moolenaar 2866a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2867a26b9700SBram Moolenaar 2868a26b9700SBram Moolenaar au! TabEnter 2869a26b9700SBram Moolenaar unlet g:entered 2870d72c1bf0SBram Moolenaar 2871d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2872d72c1bf0SBram Moolenaar 'vim9script', 28736797966dSBram Moolenaar 'g:var = 123', 2874e55b1c09SBram Moolenaar 'b:var = 456', 2875e55b1c09SBram Moolenaar 'w:var = 777', 2876e55b1c09SBram Moolenaar 't:var = 888', 2877d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2878d72c1bf0SBram Moolenaar ]) 2879d72c1bf0SBram Moolenaar 2880d72c1bf0SBram Moolenaar CheckScriptFailure([ 2881d72c1bf0SBram Moolenaar 'vim9script', 2882cfcd011fSBram Moolenaar 'let var = 123', 2883cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2884cfcd011fSBram Moolenaar 2885cfcd011fSBram Moolenaar CheckScriptFailure([ 2886cfcd011fSBram Moolenaar 'vim9script', 2887cfcd011fSBram Moolenaar 'var g:var = 123', 2888e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2889e55b1c09SBram Moolenaar 2890e55b1c09SBram Moolenaar CheckScriptFailure([ 2891e55b1c09SBram Moolenaar 'vim9script', 2892cfcd011fSBram Moolenaar 'var b:var = 123', 2893e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2894e55b1c09SBram Moolenaar 2895e55b1c09SBram Moolenaar CheckScriptFailure([ 2896e55b1c09SBram Moolenaar 'vim9script', 2897cfcd011fSBram Moolenaar 'var w:var = 123', 2898e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2899e55b1c09SBram Moolenaar 2900e55b1c09SBram Moolenaar CheckScriptFailure([ 2901e55b1c09SBram Moolenaar 'vim9script', 2902cfcd011fSBram Moolenaar 'var t:var = 123', 2903e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2904e55b1c09SBram Moolenaar 2905e55b1c09SBram Moolenaar CheckScriptFailure([ 2906e55b1c09SBram Moolenaar 'vim9script', 2907cfcd011fSBram Moolenaar 'var v:version = 123', 2908e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2909e55b1c09SBram Moolenaar 2910e55b1c09SBram Moolenaar CheckScriptFailure([ 2911e55b1c09SBram Moolenaar 'vim9script', 2912cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2913e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29146797966dSBram Moolenaar 29156797966dSBram Moolenaar CheckScriptFailure([ 29166797966dSBram Moolenaar 'vim9script', 29176797966dSBram Moolenaar 'g:var = 123', 291832e35117SBram Moolenaar 'unlet g:var# comment1', 2919d72c1bf0SBram Moolenaar ], 'E108:') 2920d72c1bf0SBram Moolenaar 2921d72c1bf0SBram Moolenaar CheckScriptFailure([ 2922d72c1bf0SBram Moolenaar 'let g:var = 123', 2923d72c1bf0SBram Moolenaar 'unlet g:var # something', 2924d72c1bf0SBram Moolenaar ], 'E488:') 2925faac4104SBram Moolenaar 2926faac4104SBram Moolenaar CheckScriptSuccess([ 2927faac4104SBram Moolenaar 'vim9script', 292832e35117SBram Moolenaar 'if 1 # comment2', 2929faac4104SBram Moolenaar ' echo "yes"', 2930faac4104SBram Moolenaar 'elseif 2 #comment', 2931faac4104SBram Moolenaar ' echo "no"', 2932faac4104SBram Moolenaar 'endif', 2933faac4104SBram Moolenaar ]) 2934faac4104SBram Moolenaar 2935faac4104SBram Moolenaar CheckScriptFailure([ 2936faac4104SBram Moolenaar 'vim9script', 293732e35117SBram Moolenaar 'if 1# comment3', 2938faac4104SBram Moolenaar ' echo "yes"', 2939faac4104SBram Moolenaar 'endif', 2940faac4104SBram Moolenaar ], 'E15:') 2941faac4104SBram Moolenaar 2942faac4104SBram Moolenaar CheckScriptFailure([ 2943faac4104SBram Moolenaar 'vim9script', 294432e35117SBram Moolenaar 'if 0 # comment4', 2945faac4104SBram Moolenaar ' echo "yes"', 2946faac4104SBram Moolenaar 'elseif 2#comment', 2947faac4104SBram Moolenaar ' echo "no"', 2948faac4104SBram Moolenaar 'endif', 2949faac4104SBram Moolenaar ], 'E15:') 2950faac4104SBram Moolenaar 2951faac4104SBram Moolenaar CheckScriptSuccess([ 2952faac4104SBram Moolenaar 'vim9script', 2953cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2954faac4104SBram Moolenaar ]) 2955faac4104SBram Moolenaar 2956faac4104SBram Moolenaar CheckScriptFailure([ 2957faac4104SBram Moolenaar 'vim9script', 2958cfcd011fSBram Moolenaar 'var v = 1# comment6', 295932e35117SBram Moolenaar ], 'E15:') 2960faac4104SBram Moolenaar 2961faac4104SBram Moolenaar CheckScriptSuccess([ 2962faac4104SBram Moolenaar 'vim9script', 2963faac4104SBram Moolenaar 'new' 2964d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2965df069eecSBram Moolenaar ':$', 2966faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2967faac4104SBram Moolenaar 'bwipe!', 2968faac4104SBram Moolenaar ]) 2969faac4104SBram Moolenaar 2970f5be8cdbSBram Moolenaar CheckScriptFailure([ 2971f5be8cdbSBram Moolenaar 'vim9script', 2972f5be8cdbSBram Moolenaar 'new' 2973d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2974f5be8cdbSBram Moolenaar ':$', 2975f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2976f5be8cdbSBram Moolenaar 'bwipe!', 2977f5be8cdbSBram Moolenaar ], 'E488:') 2978f5be8cdbSBram Moolenaar 2979f5be8cdbSBram Moolenaar CheckScriptFailure([ 2980f5be8cdbSBram Moolenaar 'vim9script', 2981f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2982f5be8cdbSBram Moolenaar ], 'E477:') 2983a26b9700SBram Moolenaarenddef 2984a26b9700SBram Moolenaar 29857e5bd91dSBram Moolenaardef Test_finish() 2986cfcd011fSBram Moolenaar var lines =<< trim END 29877e5bd91dSBram Moolenaar vim9script 29886797966dSBram Moolenaar g:res = 'one' 29897e5bd91dSBram Moolenaar if v:false | finish | endif 29906797966dSBram Moolenaar g:res = 'two' 29917e5bd91dSBram Moolenaar finish 29926797966dSBram Moolenaar g:res = 'three' 29937e5bd91dSBram Moolenaar END 29947e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29957e5bd91dSBram Moolenaar source Xfinished 29967e5bd91dSBram Moolenaar assert_equal('two', g:res) 29977e5bd91dSBram Moolenaar 29987e5bd91dSBram Moolenaar unlet g:res 29997e5bd91dSBram Moolenaar delete('Xfinished') 30007e5bd91dSBram Moolenaarenddef 30017e5bd91dSBram Moolenaar 3002a5d0077eSBram Moolenaardef Test_forward_declaration() 3003cfcd011fSBram Moolenaar var lines =<< trim END 3004a5d0077eSBram Moolenaar vim9script 3005a5d0077eSBram Moolenaar def GetValue(): string 3006a5d0077eSBram Moolenaar return theVal 3007a5d0077eSBram Moolenaar enddef 3008cfcd011fSBram Moolenaar var theVal = 'something' 3009822ba247SBram Moolenaar g:initVal = GetValue() 3010a5d0077eSBram Moolenaar theVal = 'else' 3011a5d0077eSBram Moolenaar g:laterVal = GetValue() 3012a5d0077eSBram Moolenaar END 3013a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3014a5d0077eSBram Moolenaar source Xforward 3015a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3016a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3017a5d0077eSBram Moolenaar 3018a5d0077eSBram Moolenaar unlet g:initVal 3019a5d0077eSBram Moolenaar unlet g:laterVal 3020a5d0077eSBram Moolenaar delete('Xforward') 3021a5d0077eSBram Moolenaarenddef 3022a5d0077eSBram Moolenaar 30239721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3024a6294955SBram Moolenaar var vim9_lines =<< trim END 3025a6294955SBram Moolenaar vim9script 3026a6294955SBram Moolenaar var local = 'local' 3027a6294955SBram Moolenaar g:global = 'global' 3028a6294955SBram Moolenaar export var exported = 'exported' 3029a6294955SBram Moolenaar export def GetText(): string 3030a6294955SBram Moolenaar return 'text' 3031a6294955SBram Moolenaar enddef 3032a6294955SBram Moolenaar END 3033a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3034a6294955SBram Moolenaar 3035cfcd011fSBram Moolenaar var legacy_lines =<< trim END 30369721fb4eSBram Moolenaar source Xvim9_script.vim 30379721fb4eSBram Moolenaar 30389721fb4eSBram Moolenaar call assert_false(exists('local')) 30399721fb4eSBram Moolenaar call assert_false(exists('exported')) 30409721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30419721fb4eSBram Moolenaar call assert_equal('global', global) 30429721fb4eSBram Moolenaar call assert_equal('global', g:global) 30439721fb4eSBram Moolenaar 30449721fb4eSBram Moolenaar " imported variable becomes script-local 30459721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30469721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30479721fb4eSBram Moolenaar call assert_false(exists('exported')) 30489721fb4eSBram Moolenaar 30499721fb4eSBram Moolenaar " imported function becomes script-local 30509721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30519721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30529721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30539721fb4eSBram Moolenaar END 30549721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30559721fb4eSBram Moolenaar 30569721fb4eSBram Moolenaar source Xlegacy_script.vim 30579721fb4eSBram Moolenaar assert_equal('global', g:global) 3058f5be8cdbSBram Moolenaar unlet g:global 30599721fb4eSBram Moolenaar 30609721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30619721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30629721fb4eSBram Moolenaarenddef 3063a5d0077eSBram Moolenaar 30647d699701SBram Moolenaarfunc Test_vim9script_not_global() 30657d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30667d699701SBram Moolenaar let vim9lines =<< trim END 30677d699701SBram Moolenaar vim9script 3068cfcd011fSBram Moolenaar var name = 'local' 30697d699701SBram Moolenaar func TheFunc() 30707d699701SBram Moolenaar echo 'local' 30717d699701SBram Moolenaar endfunc 30727d699701SBram Moolenaar def DefFunc() 30737d699701SBram Moolenaar echo 'local' 30747d699701SBram Moolenaar enddef 30757d699701SBram Moolenaar END 30767d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30777d699701SBram Moolenaar source Xvim9script.vim 30787d699701SBram Moolenaar try 30797d699701SBram Moolenaar echo g:var 30807d699701SBram Moolenaar assert_report('did not fail') 30817d699701SBram Moolenaar catch /E121:/ 30827d699701SBram Moolenaar " caught 30837d699701SBram Moolenaar endtry 30847d699701SBram Moolenaar try 30857d699701SBram Moolenaar call TheFunc() 30867d699701SBram Moolenaar assert_report('did not fail') 30877d699701SBram Moolenaar catch /E117:/ 30887d699701SBram Moolenaar " caught 30897d699701SBram Moolenaar endtry 30907d699701SBram Moolenaar try 30917d699701SBram Moolenaar call DefFunc() 30927d699701SBram Moolenaar assert_report('did not fail') 30937d699701SBram Moolenaar catch /E117:/ 30947d699701SBram Moolenaar " caught 30957d699701SBram Moolenaar endtry 30967d699701SBram Moolenaar 309725859dd7SBram Moolenaar call delete('Xvim9script.vim') 30987d699701SBram Moolenaarendfunc 30997d699701SBram Moolenaar 3100eeb27bfeSBram Moolenaardef Test_vim9_copen() 3101eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3102eeb27bfeSBram Moolenaar copen 3103eeb27bfeSBram Moolenaar quit 3104eeb27bfeSBram Moolenaarenddef 3105eeb27bfeSBram Moolenaar 310603290b84SBram Moolenaar" test using an auto-loaded function and variable 31072d6b20d6SBram Moolenaardef Test_vim9_autoload() 3108cfcd011fSBram Moolenaar var lines =<< trim END 31092d6b20d6SBram Moolenaar vim9script 311003290b84SBram Moolenaar def some#gettest(): string 311103290b84SBram Moolenaar return 'test' 311203290b84SBram Moolenaar enddef 311303290b84SBram Moolenaar g:some#name = 'name' 311403290b84SBram Moolenaar END 311503290b84SBram Moolenaar 311603290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 311703290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 311803290b84SBram Moolenaar var save_rtp = &rtp 311903290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 312003290b84SBram Moolenaar 312103290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 312203290b84SBram Moolenaar assert_equal('name', g:some#name) 312303290b84SBram Moolenaar g:some#other = 'other' 312403290b84SBram Moolenaar assert_equal('other', g:some#other) 312503290b84SBram Moolenaar 312617f700acSBram Moolenaar # upper case script name works 312717f700acSBram Moolenaar lines =<< trim END 312817f700acSBram Moolenaar vim9script 312917f700acSBram Moolenaar def Other#getOther(): string 313017f700acSBram Moolenaar return 'other' 313117f700acSBram Moolenaar enddef 313217f700acSBram Moolenaar END 313317f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 313417f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 313517f700acSBram Moolenaar 313603290b84SBram Moolenaar delete('Xdir', 'rf') 313703290b84SBram Moolenaar &rtp = save_rtp 313803290b84SBram Moolenaarenddef 313903290b84SBram Moolenaar 314003290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 314103290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 314203290b84SBram Moolenaar var lines =<< trim END 314303290b84SBram Moolenaar vim9script 31442d6b20d6SBram Moolenaar def foo#test() 31452d6b20d6SBram Moolenaar echomsg getreg('"') 31462d6b20d6SBram Moolenaar enddef 31472d6b20d6SBram Moolenaar END 31482d6b20d6SBram Moolenaar 31492d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31502d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3151cfcd011fSBram Moolenaar var save_rtp = &rtp 31522d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31532d6b20d6SBram Moolenaar augroup test 31542d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31552d6b20d6SBram Moolenaar augroup END 31562d6b20d6SBram Moolenaar 31572d6b20d6SBram Moolenaar normal Y 31582d6b20d6SBram Moolenaar 31592d6b20d6SBram Moolenaar augroup test 31602d6b20d6SBram Moolenaar autocmd! 31612d6b20d6SBram Moolenaar augroup END 31622d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31632d6b20d6SBram Moolenaar &rtp = save_rtp 31642d6b20d6SBram Moolenaarenddef 31652d6b20d6SBram Moolenaar 316677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 316777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3168cfcd011fSBram Moolenaar var lines =<< trim END 316977e5dcc3SBram Moolenaar vim9script 317077e5dcc3SBram Moolenaar def crash#func() 317177e5dcc3SBram Moolenaar try 317277e5dcc3SBram Moolenaar for x in List() 317377e5dcc3SBram Moolenaar endfor 317477e5dcc3SBram Moolenaar catch 317577e5dcc3SBram Moolenaar endtry 317677e5dcc3SBram Moolenaar g:ok = true 317777e5dcc3SBram Moolenaar enddef 317877e5dcc3SBram Moolenaar fu List() 317977e5dcc3SBram Moolenaar invalid 318077e5dcc3SBram Moolenaar endfu 318177e5dcc3SBram Moolenaar try 318248e11c10SBram Moolenaar alsoinvalid 318377e5dcc3SBram Moolenaar catch /wontmatch/ 318477e5dcc3SBram Moolenaar endtry 318577e5dcc3SBram Moolenaar END 318677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 318777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 318877e5dcc3SBram Moolenaar 318977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 319077e5dcc3SBram Moolenaar lines =<< trim END 319177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 319277e5dcc3SBram Moolenaar call crash#func() 319377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31949c4f5520SBram Moolenaar qall! 319577e5dcc3SBram Moolenaar END 319677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 319777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 319877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 319977e5dcc3SBram Moolenaar 320077e5dcc3SBram Moolenaar delete('Xdidit') 320177e5dcc3SBram Moolenaar delete('Xscript') 320277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 320303290b84SBram Moolenaar 320403290b84SBram Moolenaar lines =<< trim END 320503290b84SBram Moolenaar vim9script 320603290b84SBram Moolenaar var foo#bar = 'asdf' 320703290b84SBram Moolenaar END 320803290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 320977e5dcc3SBram Moolenaarenddef 321077e5dcc3SBram Moolenaar 321181e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 321281e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 321381e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3214cfcd011fSBram Moolenaar var lines =<< trim END 321581e17fbeSBram Moolenaar let s:counter = 1 321681e17fbeSBram Moolenaar def s:Func() 321781e17fbeSBram Moolenaar au! CursorHold 321881e17fbeSBram Moolenaar au CursorHold * s:counter += 1 321981e17fbeSBram Moolenaar enddef 322081e17fbeSBram Moolenaar call s:Func() 322181e17fbeSBram Moolenaar doau CursorHold 322281e17fbeSBram Moolenaar call assert_equal(2, s:counter) 322381e17fbeSBram Moolenaar au! CursorHold 322481e17fbeSBram Moolenaar END 322581e17fbeSBram Moolenaar CheckScriptSuccess(lines) 322681e17fbeSBram Moolenaarenddef 322781e17fbeSBram Moolenaar 32283896a105SBram Moolenaardef Test_cmdline_win() 32293896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32303896a105SBram Moolenaar # the command line window. 32313896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3232cfcd011fSBram Moolenaar var export_lines =<< trim END 32333896a105SBram Moolenaar vim9script 3234cfcd011fSBram Moolenaar export var That = 'yes' 32353896a105SBram Moolenaar END 32363896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3237cfcd011fSBram Moolenaar var import_lines =<< trim END 32383896a105SBram Moolenaar vim9script 32393896a105SBram Moolenaar import That from './Xexport.vim' 32403896a105SBram Moolenaar END 32413896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3242cfcd011fSBram Moolenaar var save_rtp = &rtp 32433896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32443896a105SBram Moolenaar syntax on 32453896a105SBram Moolenaar augroup CmdWin 32463896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32473896a105SBram Moolenaar augroup END 32483896a105SBram Moolenaar # this will open and also close the cmdline window 32493896a105SBram Moolenaar feedkeys('q:', 'xt') 32503896a105SBram Moolenaar assert_equal('yes', g:got_there) 32513896a105SBram Moolenaar 32523896a105SBram Moolenaar augroup CmdWin 32533896a105SBram Moolenaar au! 32543896a105SBram Moolenaar augroup END 32553896a105SBram Moolenaar &rtp = save_rtp 32563896a105SBram Moolenaar delete('rtp', 'rf') 32573896a105SBram Moolenaarenddef 32583896a105SBram Moolenaar 3259e3d4685fSBram Moolenaardef Test_invalid_sid() 3260e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 326125859dd7SBram Moolenaar 32629c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3263d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3264e3d4685fSBram Moolenaar endif 3265e3d4685fSBram Moolenaar delete('Xdidit') 3266e3d4685fSBram Moolenaarenddef 3267e3d4685fSBram Moolenaar 32689ec7026fSBram Moolenaardef Test_restoring_cpo() 32699ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 32709ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 32719ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 32729ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 32739ec7026fSBram Moolenaar endif 32749ec7026fSBram Moolenaar delete('Xsourced') 32759ec7026fSBram Moolenaar delete('Xclose') 3276090728adSBram Moolenaar delete('Xdone') 32770123cc1eSBram Moolenaar 32780123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 32790123cc1eSBram Moolenaar set cpo=aABceFsMny> 32800123cc1eSBram Moolenaar edit XanotherScript 32810123cc1eSBram Moolenaar so % 32820123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32830123cc1eSBram Moolenaar :1del 32840123cc1eSBram Moolenaar w 32850123cc1eSBram Moolenaar so % 32860123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32870123cc1eSBram Moolenaar 32880123cc1eSBram Moolenaar delete('XanotherScript') 32890123cc1eSBram Moolenaar set cpo&vim 32909ec7026fSBram Moolenaarenddef 32919ec7026fSBram Moolenaar 32929ec7026fSBram Moolenaar 3293f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3294cfcd011fSBram Moolenaar var lines =<< trim END 3295cfcd011fSBram Moolenaar var name: any 3296cfcd011fSBram Moolenaar assert_equal(0, name) 3297f0afd9e1SBram Moolenaar END 3298f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3299f0afd9e1SBram Moolenaarenddef 3300f0afd9e1SBram Moolenaar 33017e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 330258dbef33SBram Moolenaar CheckRunVimInTerminal 330358dbef33SBram Moolenaar 33047e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 33057e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 33067e9210eaSBram Moolenaarendfunc 33077e9210eaSBram Moolenaar 33087e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 33099c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3310cfcd011fSBram Moolenaar var lines =<< trim END 33119c4f5520SBram Moolenaar func CheckAndQuit() 33129c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 33139c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 33149c4f5520SBram Moolenaar endfunc 33159c4f5520SBram Moolenaar END 33169c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 33179c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3318e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 33199c4f5520SBram Moolenaar # define Afunc() on the command line 33209c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 33219c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 33222949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 33239c4f5520SBram Moolenaar 33249c4f5520SBram Moolenaar call StopVimInTerminal(buf) 33259c4f5520SBram Moolenaar delete('XcallFunc') 33269c4f5520SBram Moolenaar delete('Xdidcmd') 33279c4f5520SBram Moolenaarenddef 33289c4f5520SBram Moolenaar 3329fcdc5d83SBram Moolenaardef Test_script_var_scope() 3330fcdc5d83SBram Moolenaar var lines =<< trim END 3331fcdc5d83SBram Moolenaar vim9script 3332fcdc5d83SBram Moolenaar if true 3333fcdc5d83SBram Moolenaar if true 3334fcdc5d83SBram Moolenaar var one = 'one' 3335fcdc5d83SBram Moolenaar echo one 3336fcdc5d83SBram Moolenaar endif 3337fcdc5d83SBram Moolenaar echo one 3338fcdc5d83SBram Moolenaar endif 3339fcdc5d83SBram Moolenaar END 3340fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3341fcdc5d83SBram Moolenaar 3342fcdc5d83SBram Moolenaar lines =<< trim END 3343fcdc5d83SBram Moolenaar vim9script 3344fcdc5d83SBram Moolenaar if true 3345fcdc5d83SBram Moolenaar if false 3346fcdc5d83SBram Moolenaar var one = 'one' 3347fcdc5d83SBram Moolenaar echo one 3348fcdc5d83SBram Moolenaar else 3349fcdc5d83SBram Moolenaar var one = 'one' 3350fcdc5d83SBram Moolenaar echo one 3351fcdc5d83SBram Moolenaar endif 3352fcdc5d83SBram Moolenaar echo one 3353fcdc5d83SBram Moolenaar endif 3354fcdc5d83SBram Moolenaar END 3355fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3356fcdc5d83SBram Moolenaar 3357fcdc5d83SBram Moolenaar lines =<< trim END 3358fcdc5d83SBram Moolenaar vim9script 3359fcdc5d83SBram Moolenaar while true 3360fcdc5d83SBram Moolenaar var one = 'one' 3361fcdc5d83SBram Moolenaar echo one 3362fcdc5d83SBram Moolenaar break 3363fcdc5d83SBram Moolenaar endwhile 3364fcdc5d83SBram Moolenaar echo one 3365fcdc5d83SBram Moolenaar END 3366fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3367fcdc5d83SBram Moolenaar 3368fcdc5d83SBram Moolenaar lines =<< trim END 3369fcdc5d83SBram Moolenaar vim9script 3370fcdc5d83SBram Moolenaar for i in range(1) 3371fcdc5d83SBram Moolenaar var one = 'one' 3372fcdc5d83SBram Moolenaar echo one 3373fcdc5d83SBram Moolenaar endfor 3374fcdc5d83SBram Moolenaar echo one 3375fcdc5d83SBram Moolenaar END 3376fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 33779becdf2bSBram Moolenaar 33789becdf2bSBram Moolenaar lines =<< trim END 33799becdf2bSBram Moolenaar vim9script 33809becdf2bSBram Moolenaar { 33819becdf2bSBram Moolenaar var one = 'one' 33829becdf2bSBram Moolenaar assert_equal('one', one) 33839becdf2bSBram Moolenaar } 33849becdf2bSBram Moolenaar assert_false(exists('one')) 33859becdf2bSBram Moolenaar assert_false(exists('s:one')) 33869becdf2bSBram Moolenaar END 33879becdf2bSBram Moolenaar CheckScriptSuccess(lines) 33889becdf2bSBram Moolenaar 33899becdf2bSBram Moolenaar lines =<< trim END 33909becdf2bSBram Moolenaar vim9script 33919becdf2bSBram Moolenaar { 33929becdf2bSBram Moolenaar var one = 'one' 33939becdf2bSBram Moolenaar echo one 33949becdf2bSBram Moolenaar } 33959becdf2bSBram Moolenaar echo one 33969becdf2bSBram Moolenaar END 33979becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3398fcdc5d83SBram Moolenaarenddef 3399fcdc5d83SBram Moolenaar 3400352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3401352134bbSBram Moolenaar var lines =<< trim END 3402352134bbSBram Moolenaar vim9script 3403352134bbSBram Moolenaar def Callback(...l: any) 3404352134bbSBram Moolenaar try 3405352134bbSBram Moolenaar var x: string 3406352134bbSBram Moolenaar var y: string 3407352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3408352134bbSBram Moolenaar [x, y] = [''] 3409352134bbSBram Moolenaar catch 3410352134bbSBram Moolenaar g:caught = 'yes' 3411352134bbSBram Moolenaar endtry 3412352134bbSBram Moolenaar enddef 3413e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3414352134bbSBram Moolenaar feedkeys("\r", 'xt') 3415352134bbSBram Moolenaar END 3416352134bbSBram Moolenaar CheckScriptSuccess(lines) 3417352134bbSBram Moolenaar 3418352134bbSBram Moolenaar unlet g:caught 3419352134bbSBram Moolenaarenddef 3420352134bbSBram Moolenaar 3421631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3422631e8f93SBram Moolenaar if !has('unix') || !has('job') 3423631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3424631e8f93SBram Moolenaar endif 3425631e8f93SBram Moolenaar var lines =<< trim END 3426631e8f93SBram Moolenaar vim9script 3427631e8f93SBram Moolenaar var source: list<number> 3428631e8f93SBram Moolenaar def Out_cb(...l: any) 3429631e8f93SBram Moolenaar eval [][0] 3430631e8f93SBram Moolenaar enddef 3431631e8f93SBram Moolenaar def Exit_cb(...l: any) 3432631e8f93SBram Moolenaar sleep 1m 3433631e8f93SBram Moolenaar source += l 3434631e8f93SBram Moolenaar enddef 3435e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 34366f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 34376f17a3f0SBram Moolenaar sleep 10m 34386f17a3f0SBram Moolenaar endwhile 3439206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3440206c2a6eSBram Moolenaar sleep 100m 3441631e8f93SBram Moolenaar END 3442631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3443631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3444631e8f93SBram Moolenaar delete('Xdef') 3445631e8f93SBram Moolenaarenddef 3446631e8f93SBram Moolenaar 34474324d87aSBram Moolenaardef InvokeNormal() 34484324d87aSBram Moolenaar exe "norm! :m+1\r" 34494324d87aSBram Moolenaarenddef 34504324d87aSBram Moolenaar 34514324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 34524324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 34534324d87aSBram Moolenaar new 34544324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 34554324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 34564324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 34574324d87aSBram Moolenaar xunmap <F3> 3458b5b9480eSBram Moolenaarenddef 3459b5b9480eSBram Moolenaar 3460b5b9480eSBram Moolenaardef Test_white_space_after_command() 3461b5b9480eSBram Moolenaar var lines =<< trim END 3462b5b9480eSBram Moolenaar exit_cb: Func}) 3463b5b9480eSBram Moolenaar END 3464b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3465f8103f27SBram Moolenaar 3466f8103f27SBram Moolenaar lines =<< trim END 3467f8103f27SBram Moolenaar e# 3468f8103f27SBram Moolenaar END 3469f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 34704324d87aSBram Moolenaarenddef 34714324d87aSBram Moolenaar 34724aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 34734aab88d9SBram Moolenaar var lines =<< trim END 34744aab88d9SBram Moolenaar vim9script 34754aab88d9SBram Moolenaar if exists('g:guard') 34764aab88d9SBram Moolenaar finish 34774aab88d9SBram Moolenaar endif 34784aab88d9SBram Moolenaar g:guard = 1 34794aab88d9SBram Moolenaar var name = 'thename' 34804aab88d9SBram Moolenaar def g:GetName(): string 34814aab88d9SBram Moolenaar return name 34824aab88d9SBram Moolenaar enddef 34834aab88d9SBram Moolenaar def g:SetName(arg: string) 34844aab88d9SBram Moolenaar name = arg 34854aab88d9SBram Moolenaar enddef 34864aab88d9SBram Moolenaar END 34874aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 34884aab88d9SBram Moolenaar so XscriptTwice.vim 34894aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 34904aab88d9SBram Moolenaar g:SetName('newname') 34914aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34924aab88d9SBram Moolenaar so XscriptTwice.vim 34934aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34944aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34954aab88d9SBram Moolenaar 34964aab88d9SBram Moolenaar delfunc g:GetName 34974aab88d9SBram Moolenaar delfunc g:SetName 34984aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34994aab88d9SBram Moolenaar unlet g:guard 35004aab88d9SBram Moolenaarenddef 35014aab88d9SBram Moolenaar 35024aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 35034aab88d9SBram Moolenaar var exportlines =<< trim END 35044aab88d9SBram Moolenaar vim9script 35054aab88d9SBram Moolenaar if exists('g:guard') 35064aab88d9SBram Moolenaar finish 35074aab88d9SBram Moolenaar endif 35084aab88d9SBram Moolenaar g:guard = 1 35094aab88d9SBram Moolenaar export var name = 'someName' 35104aab88d9SBram Moolenaar END 35114aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 35124aab88d9SBram Moolenaar 35134aab88d9SBram Moolenaar var lines =<< trim END 35144aab88d9SBram Moolenaar vim9script 35154aab88d9SBram Moolenaar import name from './XexportScript.vim' 35164aab88d9SBram Moolenaar def g:GetName(): string 35174aab88d9SBram Moolenaar return name 35184aab88d9SBram Moolenaar enddef 35194aab88d9SBram Moolenaar END 35204aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 35214aab88d9SBram Moolenaar so XscriptImport.vim 35224aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 35234aab88d9SBram Moolenaar 35244aab88d9SBram Moolenaar so XexportScript.vim 35254aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 35264aab88d9SBram Moolenaar 35274aab88d9SBram Moolenaar delfunc g:GetName 35284aab88d9SBram Moolenaar delete('XexportScript.vim') 35294aab88d9SBram Moolenaar delete('XscriptImport.vim') 35304aab88d9SBram Moolenaar unlet g:guard 35314aab88d9SBram Moolenaarenddef 35324aab88d9SBram Moolenaar 353310b9421fSBram Moolenaardef Test_unsupported_commands() 353410b9421fSBram Moolenaar var lines =<< trim END 353510b9421fSBram Moolenaar ka 353610b9421fSBram Moolenaar END 353710b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 353810b9421fSBram Moolenaar 353910b9421fSBram Moolenaar lines =<< trim END 3540ada1d870SBram Moolenaar :1ka 3541ada1d870SBram Moolenaar END 3542ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3543ada1d870SBram Moolenaar 3544ada1d870SBram Moolenaar lines =<< trim END 354510b9421fSBram Moolenaar t 354610b9421fSBram Moolenaar END 354710b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 354810b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 354910b9421fSBram Moolenaar 355010b9421fSBram Moolenaar lines =<< trim END 355110b9421fSBram Moolenaar x 355210b9421fSBram Moolenaar END 355310b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 355410b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 355510b9421fSBram Moolenaar 355610b9421fSBram Moolenaar lines =<< trim END 355710b9421fSBram Moolenaar xit 355810b9421fSBram Moolenaar END 355910b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 356010b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 356110b9421fSBram Moolenaarenddef 356210b9421fSBram Moolenaar 3563585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3564585fea7bSBram Moolenaardef Test_substitute_cmd() 3565585fea7bSBram Moolenaar new 3566585fea7bSBram Moolenaar setline(1, 'something') 3567585fea7bSBram Moolenaar :substitute(some(other( 3568585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3569585fea7bSBram Moolenaar bwipe! 3570585fea7bSBram Moolenaar 3571f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3572cfcd011fSBram Moolenaar var lines =<< trim END 3573585fea7bSBram Moolenaar vim9script 3574585fea7bSBram Moolenaar new 3575585fea7bSBram Moolenaar setline(1, 'something') 3576585fea7bSBram Moolenaar :substitute(some(other( 3577585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3578585fea7bSBram Moolenaar bwipe! 3579585fea7bSBram Moolenaar END 3580585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3581585fea7bSBram Moolenaar source Xvim9lines 3582585fea7bSBram Moolenaar 3583585fea7bSBram Moolenaar delete('Xvim9lines') 3584585fea7bSBram Moolenaarenddef 3585585fea7bSBram Moolenaar 35868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3587