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) 5808a7d6542SBram Moolenaarenddef 5818a7d6542SBram Moolenaar 5821430ceebSBram Moolenaardef Test_cnext_works_in_catch() 5831430ceebSBram Moolenaar var lines =<< trim END 5841430ceebSBram Moolenaar vim9script 5851430ceebSBram Moolenaar au BufEnter * eval 0 5861430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 5871430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 5881430ceebSBram Moolenaar var items = [ 5891430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 5901430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 5911430ceebSBram Moolenaar ] 5921430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 5931430ceebSBram Moolenaar cwindow 5941430ceebSBram Moolenaar 5951430ceebSBram Moolenaar def CnextOrCfirst() 5961430ceebSBram Moolenaar # if cnext fails, cfirst is used 5971430ceebSBram Moolenaar try 5981430ceebSBram Moolenaar cnext 5991430ceebSBram Moolenaar catch 6001430ceebSBram Moolenaar cfirst 6011430ceebSBram Moolenaar endtry 6021430ceebSBram Moolenaar enddef 6031430ceebSBram Moolenaar 6041430ceebSBram Moolenaar CnextOrCfirst() 6051430ceebSBram Moolenaar CnextOrCfirst() 6061430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6071430ceebSBram Moolenaar qall 6081430ceebSBram Moolenaar END 6091430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6101430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6111430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6121430ceebSBram Moolenaar 6131430ceebSBram Moolenaar delete('Xfile1') 6141430ceebSBram Moolenaar delete('Xfile2') 6151430ceebSBram Moolenaar delete('XCatchCnext') 6161430ceebSBram Moolenaar delete('Xresult') 6171430ceebSBram Moolenaarenddef 6181430ceebSBram Moolenaar 6199e1d9e34SBram Moolenaardef Test_throw_skipped() 6209e1d9e34SBram Moolenaar if 0 6219e1d9e34SBram Moolenaar throw dontgethere 6229e1d9e34SBram Moolenaar endif 6239e1d9e34SBram Moolenaarenddef 6249e1d9e34SBram Moolenaar 6258f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6268f81b22eSBram Moolenaar var lines =<< trim END 6278f81b22eSBram Moolenaar vim9script 6288f81b22eSBram Moolenaar def Func() 6298f81b22eSBram Moolenaar throw 'error' 6308f81b22eSBram Moolenaar enddef 6318f81b22eSBram Moolenaar silent! Func() 6328f81b22eSBram Moolenaar END 6338f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6348f81b22eSBram Moolenaar source XthrowSilenced 6358f81b22eSBram Moolenaar delete('XthrowSilenced') 6368f81b22eSBram Moolenaarenddef 6378f81b22eSBram Moolenaar 638e859312eSBram Moolenaardef DeletedFunc(): list<any> 639e859312eSBram Moolenaar return ['delete me'] 640e859312eSBram Moolenaarenddef 641e859312eSBram Moolenaardefcompile 642e859312eSBram Moolenaardelfunc DeletedFunc 643e859312eSBram Moolenaar 644257cc5eeSBram Moolenaardef ThrowFromDef() 645a72cfb80SBram Moolenaar throw "getout" # comment 646257cc5eeSBram Moolenaarenddef 647257cc5eeSBram Moolenaar 648257cc5eeSBram Moolenaarfunc CatchInFunc() 649257cc5eeSBram Moolenaar try 650257cc5eeSBram Moolenaar call ThrowFromDef() 651257cc5eeSBram Moolenaar catch 652257cc5eeSBram Moolenaar let g:thrown_func = v:exception 653257cc5eeSBram Moolenaar endtry 654257cc5eeSBram Moolenaarendfunc 655257cc5eeSBram Moolenaar 656257cc5eeSBram Moolenaardef CatchInDef() 657257cc5eeSBram Moolenaar try 658257cc5eeSBram Moolenaar ThrowFromDef() 659257cc5eeSBram Moolenaar catch 660257cc5eeSBram Moolenaar g:thrown_def = v:exception 661257cc5eeSBram Moolenaar endtry 662257cc5eeSBram Moolenaarenddef 663257cc5eeSBram Moolenaar 664f575adffSBram Moolenaardef ReturnFinally(): string 665f575adffSBram Moolenaar try 666f575adffSBram Moolenaar return 'intry' 667373863edSBram Moolenaar finall 668f575adffSBram Moolenaar g:in_finally = 'finally' 669f575adffSBram Moolenaar endtry 670f575adffSBram Moolenaar return 'end' 671f575adffSBram Moolenaarenddef 672f575adffSBram Moolenaar 673257cc5eeSBram Moolenaardef Test_try_catch_nested() 674257cc5eeSBram Moolenaar CatchInFunc() 675257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 676257cc5eeSBram Moolenaar 677257cc5eeSBram Moolenaar CatchInDef() 678257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 679f575adffSBram Moolenaar 680f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 681f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 682f575adffSBram Moolenaarenddef 683f575adffSBram Moolenaar 6849939f57bSBram Moolenaardef TryOne(): number 6859939f57bSBram Moolenaar try 6869939f57bSBram Moolenaar return 0 6879939f57bSBram Moolenaar catch 6889939f57bSBram Moolenaar endtry 6899939f57bSBram Moolenaar return 0 6909939f57bSBram Moolenaarenddef 6919939f57bSBram Moolenaar 6929939f57bSBram Moolenaardef TryTwo(n: number): string 6939939f57bSBram Moolenaar try 694cfcd011fSBram Moolenaar var x = {} 6959939f57bSBram Moolenaar catch 6969939f57bSBram Moolenaar endtry 6979939f57bSBram Moolenaar return 'text' 6989939f57bSBram Moolenaarenddef 6999939f57bSBram Moolenaar 7009939f57bSBram Moolenaardef Test_try_catch_twice() 7019939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7029939f57bSBram Moolenaarenddef 7039939f57bSBram Moolenaar 704f575adffSBram Moolenaardef Test_try_catch_match() 705cfcd011fSBram Moolenaar var seq = 'a' 706f575adffSBram Moolenaar try 707f575adffSBram Moolenaar throw 'something' 708f575adffSBram Moolenaar catch /nothing/ 709f575adffSBram Moolenaar seq ..= 'x' 710f575adffSBram Moolenaar catch /some/ 711f575adffSBram Moolenaar seq ..= 'b' 712f575adffSBram Moolenaar catch /asdf/ 713f575adffSBram Moolenaar seq ..= 'x' 714e8c4abbbSBram Moolenaar catch ?a\?sdf? 715e8c4abbbSBram Moolenaar seq ..= 'y' 716f575adffSBram Moolenaar finally 717f575adffSBram Moolenaar seq ..= 'c' 718f575adffSBram Moolenaar endtry 719f575adffSBram Moolenaar assert_equal('abc', seq) 720257cc5eeSBram Moolenaarenddef 721257cc5eeSBram Moolenaar 722e8c4abbbSBram Moolenaardef Test_try_catch_fails() 723d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 724d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 725d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 726d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 727d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 728d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 729d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 730d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 73113106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 732d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 733585fea7bSBram Moolenaar 734e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 735d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 736e8c4abbbSBram Moolenaarenddef 737e8c4abbbSBram Moolenaar 7387c5b3c03SBram Moolenaardef Try_catch_skipped() 7397c5b3c03SBram Moolenaar var l = [] 7407c5b3c03SBram Moolenaar try 7417c5b3c03SBram Moolenaar finally 7427c5b3c03SBram Moolenaar endtry 7437c5b3c03SBram Moolenaar 7447c5b3c03SBram Moolenaar if 1 7457c5b3c03SBram Moolenaar else 7467c5b3c03SBram Moolenaar try 7477c5b3c03SBram Moolenaar endtry 7487c5b3c03SBram Moolenaar endif 7497c5b3c03SBram Moolenaarenddef 7507c5b3c03SBram Moolenaar 7517c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7527c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7537c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7547c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7557c5b3c03SBram Moolenaarenddef 7567c5b3c03SBram Moolenaar 7577c5b3c03SBram Moolenaar 7587c5b3c03SBram Moolenaar 759006ad48bSBram Moolenaardef Test_throw_vimscript() 760f5be8cdbSBram Moolenaar # only checks line continuation 761cfcd011fSBram Moolenaar var lines =<< trim END 762006ad48bSBram Moolenaar vim9script 763006ad48bSBram Moolenaar try 764006ad48bSBram Moolenaar throw 'one' 765006ad48bSBram Moolenaar .. 'two' 766006ad48bSBram Moolenaar catch 767006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 768006ad48bSBram Moolenaar endtry 769006ad48bSBram Moolenaar END 770006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7711e021e63SBram Moolenaar 7721e021e63SBram Moolenaar lines =<< trim END 7731e021e63SBram Moolenaar vim9script 774352134bbSBram Moolenaar @r = '' 7751e021e63SBram Moolenaar def Func() 7761e021e63SBram Moolenaar throw @r 7771e021e63SBram Moolenaar enddef 7781e021e63SBram Moolenaar var result = '' 7791e021e63SBram Moolenaar try 7801e021e63SBram Moolenaar Func() 7811e021e63SBram Moolenaar catch /E1129:/ 7821e021e63SBram Moolenaar result = 'caught' 7831e021e63SBram Moolenaar endtry 7841e021e63SBram Moolenaar assert_equal('caught', result) 7851e021e63SBram Moolenaar END 7861e021e63SBram Moolenaar CheckScriptSuccess(lines) 787006ad48bSBram Moolenaarenddef 788006ad48bSBram Moolenaar 789ed677f55SBram Moolenaardef Test_error_in_nested_function() 79003dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 791cfcd011fSBram Moolenaar var lines =<< trim END 792ed677f55SBram Moolenaar vim9script 793ed677f55SBram Moolenaar def Func() 794ed677f55SBram Moolenaar Error() 795ed677f55SBram Moolenaar g:test_var = 1 796ed677f55SBram Moolenaar enddef 797ed677f55SBram Moolenaar func Error() abort 798ed677f55SBram Moolenaar eval [][0] 799ed677f55SBram Moolenaar endfunc 800ed677f55SBram Moolenaar Func() 801ed677f55SBram Moolenaar END 802ed677f55SBram Moolenaar g:test_var = 0 803ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 804ed677f55SBram Moolenaar assert_equal(0, g:test_var) 805ed677f55SBram Moolenaarenddef 806ed677f55SBram Moolenaar 80737c83711SBram Moolenaardef Test_cexpr_vimscript() 808f5be8cdbSBram Moolenaar # only checks line continuation 80937c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 810cfcd011fSBram Moolenaar var lines =<< trim END 81137c83711SBram Moolenaar vim9script 81237c83711SBram Moolenaar cexpr 'File' 81337c83711SBram Moolenaar .. ' someFile' .. 81437c83711SBram Moolenaar ' line 19' 81537c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 81637c83711SBram Moolenaar END 81737c83711SBram Moolenaar CheckScriptSuccess(lines) 81837c83711SBram Moolenaar set errorformat& 81937c83711SBram Moolenaarenddef 82037c83711SBram Moolenaar 821c9edd6b5SBram Moolenaardef Test_statusline_syntax() 822c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 823cfcd011fSBram Moolenaar var lines =<< trim END 824c9edd6b5SBram Moolenaar vim9script 825c9edd6b5SBram Moolenaar func g:Status() 826c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 827c9edd6b5SBram Moolenaar endfunc 828c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 829c9edd6b5SBram Moolenaar redrawstatus 830c9edd6b5SBram Moolenaar set laststatus statusline= 831c9edd6b5SBram Moolenaar END 832c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 833c9edd6b5SBram Moolenaarenddef 834c9edd6b5SBram Moolenaar 835b209750bSBram Moolenaardef Test_list_vimscript() 836b209750bSBram Moolenaar # checks line continuation and comments 837cfcd011fSBram Moolenaar var lines =<< trim END 838b209750bSBram Moolenaar vim9script 839cfcd011fSBram Moolenaar var mylist = [ 840b209750bSBram Moolenaar 'one', 841b209750bSBram Moolenaar # comment 842b209750bSBram Moolenaar 'two', # empty line follows 843b209750bSBram Moolenaar 844b209750bSBram Moolenaar 'three', 845b209750bSBram Moolenaar ] 846b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 847b209750bSBram Moolenaar END 848b209750bSBram Moolenaar CheckScriptSuccess(lines) 84966250c93SBram Moolenaar 85066250c93SBram Moolenaar # check all lines from heredoc are kept 85166250c93SBram Moolenaar lines =<< trim END 85266250c93SBram Moolenaar # comment 1 85366250c93SBram Moolenaar two 85466250c93SBram Moolenaar # comment 3 85566250c93SBram Moolenaar 85666250c93SBram Moolenaar five 85766250c93SBram Moolenaar # comment 6 85866250c93SBram Moolenaar END 85966250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8604bce26bbSBram Moolenaar 8614bce26bbSBram Moolenaar lines =<< trim END 8624bce26bbSBram Moolenaar [{ 8634bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8644bce26bbSBram Moolenaar END 8654bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 866b209750bSBram Moolenaarenddef 867b209750bSBram Moolenaar 8682a1381c3SBram Moolenaarif has('channel') 86940ee466cSBram Moolenaar let someJob = test_null_job() 87040ee466cSBram Moolenaar 87140ee466cSBram Moolenaar def FuncWithError() 87240ee466cSBram Moolenaar echomsg g:someJob 87340ee466cSBram Moolenaar enddef 87440ee466cSBram Moolenaar 87540ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 87640ee466cSBram Moolenaar try 87740ee466cSBram Moolenaar call FuncWithError() 87840ee466cSBram Moolenaar catch 87940ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 88040ee466cSBram Moolenaar endtry 88140ee466cSBram Moolenaar endfunc 8822a1381c3SBram Moolenaarendif 88340ee466cSBram Moolenaar 8848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 8858a7d6542SBram Moolenaar vim9script 886cfcd011fSBram Moolenaar var name: string = 'bob' 8878a7d6542SBram Moolenaar def Concat(arg: string): string 8888a7d6542SBram Moolenaar return name .. arg 8898a7d6542SBram Moolenaar enddef 890227a69deSBram Moolenaar g:result = Concat('bie') 891227a69deSBram Moolenaar g:localname = name 8928a7d6542SBram Moolenaar 8938a7d6542SBram Moolenaar export const CONST = 1234 894cfcd011fSBram Moolenaar export var exported = 9876 895cfcd011fSBram Moolenaar export var exp_name = 'John' 8968a7d6542SBram Moolenaar export def Exported(): string 8978a7d6542SBram Moolenaar return 'Exported' 8988a7d6542SBram Moolenaar enddef 8998a7d6542SBram MoolenaarEND 9008a7d6542SBram Moolenaar 901b3ca9824SBram Moolenaardef Undo_export_script_lines() 902b3ca9824SBram Moolenaar unlet g:result 903b3ca9824SBram Moolenaar unlet g:localname 904b3ca9824SBram Moolenaarenddef 905b3ca9824SBram Moolenaar 9065269bd2aSBram Moolenaardef Test_vim9_import_export() 907cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9088a7d6542SBram Moolenaar vim9script 9098a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9108a7d6542SBram Moolenaar g:imported = exported 9116e587dcbSBram Moolenaar exported += 3 9126e587dcbSBram Moolenaar g:imported_added = exported 9138a7d6542SBram Moolenaar g:imported_func = Exported() 9146e587dcbSBram Moolenaar 91540f4f7a4SBram Moolenaar def GetExported(): string 916e0de171eSBram Moolenaar var local_dict = {ref: Exported} 91740f4f7a4SBram Moolenaar return local_dict.ref() 91840f4f7a4SBram Moolenaar enddef 91940f4f7a4SBram Moolenaar g:funcref_result = GetExported() 92040f4f7a4SBram Moolenaar 9216e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9226e587dcbSBram Moolenaar g:imported_name = exp_name 9236e587dcbSBram Moolenaar exp_name ..= ' Doe' 9246e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9255381c7a1SBram Moolenaar g:imported_later = exported 9268a7d6542SBram Moolenaar END 9278a7d6542SBram Moolenaar 9288a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9298a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9308a7d6542SBram Moolenaar 9318a7d6542SBram Moolenaar source Ximport.vim 9328a7d6542SBram Moolenaar 9338a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9348a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9358a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9366e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9375381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9388a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 93940f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9406e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9416e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9428a7d6542SBram Moolenaar assert_false(exists('g:name')) 9438a7d6542SBram Moolenaar 944b3ca9824SBram Moolenaar Undo_export_script_lines() 9458a7d6542SBram Moolenaar unlet g:imported 9466e587dcbSBram Moolenaar unlet g:imported_added 9475381c7a1SBram Moolenaar unlet g:imported_later 9488a7d6542SBram Moolenaar unlet g:imported_func 9496e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9508a7d6542SBram Moolenaar delete('Ximport.vim') 951f2d5c240SBram Moolenaar 9521c991144SBram Moolenaar # similar, with line breaks 953cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9541c991144SBram Moolenaar vim9script 9551c991144SBram Moolenaar import { 9561c991144SBram Moolenaar exported, 9571c991144SBram Moolenaar Exported, 9581c991144SBram Moolenaar } 9591c991144SBram Moolenaar from 9601c991144SBram Moolenaar './Xexport.vim' 9611c991144SBram Moolenaar g:imported = exported 9621c991144SBram Moolenaar exported += 5 9631c991144SBram Moolenaar g:imported_added = exported 9641c991144SBram Moolenaar g:imported_func = Exported() 9651c991144SBram Moolenaar END 9661c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9671c991144SBram Moolenaar source Ximport_lbr.vim 9681c991144SBram Moolenaar 9691c991144SBram Moolenaar assert_equal(9876, g:imported) 9701c991144SBram Moolenaar assert_equal(9881, g:imported_added) 9711c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 9721c991144SBram Moolenaar 9731c991144SBram Moolenaar # exported script not sourced again 9741c991144SBram Moolenaar assert_false(exists('g:result')) 9751c991144SBram Moolenaar unlet g:imported 9761c991144SBram Moolenaar unlet g:imported_added 9771c991144SBram Moolenaar unlet g:imported_func 9781c991144SBram Moolenaar delete('Ximport_lbr.vim') 9791c991144SBram Moolenaar 9801c991144SBram Moolenaar # import inside :def function 981cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 9825381c7a1SBram Moolenaar vim9script 9835381c7a1SBram Moolenaar def ImportInDef() 9845381c7a1SBram Moolenaar import exported from './Xexport.vim' 9855381c7a1SBram Moolenaar g:imported = exported 9865381c7a1SBram Moolenaar exported += 7 9875381c7a1SBram Moolenaar g:imported_added = exported 9885381c7a1SBram Moolenaar enddef 9895381c7a1SBram Moolenaar ImportInDef() 9905381c7a1SBram Moolenaar END 9915381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 9925381c7a1SBram Moolenaar source Ximport2.vim 993f5be8cdbSBram Moolenaar # TODO: this should be 9879 9945381c7a1SBram Moolenaar assert_equal(9876, g:imported) 9955381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 9965381c7a1SBram Moolenaar unlet g:imported 9975381c7a1SBram Moolenaar unlet g:imported_added 9985381c7a1SBram Moolenaar delete('Ximport2.vim') 9995381c7a1SBram Moolenaar 1000cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1001f2d5c240SBram Moolenaar vim9script 1002f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1003f2d5c240SBram Moolenaar def UseExport() 1004f2d5c240SBram Moolenaar g:imported = Export.exported 1005f2d5c240SBram Moolenaar enddef 1006f2d5c240SBram Moolenaar UseExport() 1007f2d5c240SBram Moolenaar END 1008f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1009f2d5c240SBram Moolenaar source Ximport.vim 10105381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1011f2d5c240SBram Moolenaar 1012cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1013599c89c8SBram Moolenaar vim9script 1014599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1015599c89c8SBram Moolenaar def Func() 1016cfcd011fSBram Moolenaar var dummy = 1 1017cfcd011fSBram Moolenaar var imported = Export + dummy 1018599c89c8SBram Moolenaar enddef 1019822ba247SBram Moolenaar defcompile 1020599c89c8SBram Moolenaar END 1021599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 102244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1023599c89c8SBram Moolenaar 1024cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1025599c89c8SBram Moolenaar vim9script 1026599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1027599c89c8SBram Moolenaar def Func() 1028cfcd011fSBram Moolenaar var imported = Export . exported 1029599c89c8SBram Moolenaar enddef 1030822ba247SBram Moolenaar defcompile 1031599c89c8SBram Moolenaar END 1032599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 103344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1034599c89c8SBram Moolenaar 1035a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1036a6294955SBram Moolenaar vim9script 1037a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1038a6294955SBram Moolenaar var some = 'other' 1039a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1040a6294955SBram Moolenaar defcompile 1041a6294955SBram Moolenaar END 1042a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1043a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1044a6294955SBram Moolenaar 1045cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1046599c89c8SBram Moolenaar vim9script 1047599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1048599c89c8SBram Moolenaar def Func() 1049cfcd011fSBram Moolenaar var imported = Export. 1050599c89c8SBram Moolenaar enddef 1051822ba247SBram Moolenaar defcompile 1052599c89c8SBram Moolenaar END 1053599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 105444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1055599c89c8SBram Moolenaar 1056cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10571c991144SBram Moolenaar vim9script 10581c991144SBram Moolenaar import * 10591c991144SBram Moolenaar as Export 10601c991144SBram Moolenaar from 10611c991144SBram Moolenaar './Xexport.vim' 10621c991144SBram Moolenaar def UseExport() 10631c991144SBram Moolenaar g:imported = Export.exported 10641c991144SBram Moolenaar enddef 10651c991144SBram Moolenaar UseExport() 10661c991144SBram Moolenaar END 10671c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10681c991144SBram Moolenaar source Ximport.vim 10691c991144SBram Moolenaar assert_equal(9883, g:imported) 10701c991144SBram Moolenaar 1071cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1072f2d5c240SBram Moolenaar vim9script 1073f2d5c240SBram Moolenaar import * from './Xexport.vim' 1074f2d5c240SBram Moolenaar END 1075f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 107644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1077f2d5c240SBram Moolenaar 1078f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1079cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1080fa29c8abSBram Moolenaar vim9script 1081fa29c8abSBram Moolenaar import name from './Xexport.vim' 1082fa29c8abSBram Moolenaar END 1083fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 108444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1085fa29c8abSBram Moolenaar 1086f5be8cdbSBram Moolenaar # try to import something that is already defined 1087cfcd011fSBram Moolenaar var import_already_defined =<< trim END 10885269bd2aSBram Moolenaar vim9script 1089cfcd011fSBram Moolenaar var exported = 'something' 10905269bd2aSBram Moolenaar import exported from './Xexport.vim' 10915269bd2aSBram Moolenaar END 10925269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 109344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 10945269bd2aSBram Moolenaar 1095f5be8cdbSBram Moolenaar # try to import something that is already defined 10965269bd2aSBram Moolenaar import_already_defined =<< trim END 10975269bd2aSBram Moolenaar vim9script 1098cfcd011fSBram Moolenaar var exported = 'something' 10995269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11005269bd2aSBram Moolenaar END 11015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 110244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11035269bd2aSBram Moolenaar 1104f5be8cdbSBram Moolenaar # try to import something that is already defined 11055269bd2aSBram Moolenaar import_already_defined =<< trim END 11065269bd2aSBram Moolenaar vim9script 1107cfcd011fSBram Moolenaar var exported = 'something' 11085269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11095269bd2aSBram Moolenaar END 11105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 111144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 11125269bd2aSBram Moolenaar 1113918a4249SBram Moolenaar # try changing an imported const 1114918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1115918a4249SBram Moolenaar vim9script 1116918a4249SBram Moolenaar import CONST from './Xexport.vim' 1117918a4249SBram Moolenaar def Assign() 1118918a4249SBram Moolenaar CONST = 987 1119918a4249SBram Moolenaar enddef 1120918a4249SBram Moolenaar defcompile 1121918a4249SBram Moolenaar END 1122918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1123918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1124918a4249SBram Moolenaar 1125f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1126cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1127fa29c8abSBram Moolenaar vim9script 1128fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1129fa29c8abSBram Moolenaar END 1130fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 113144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1132fa29c8abSBram Moolenaar 1133cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1134fa29c8abSBram Moolenaar vim9script 1135fa29c8abSBram Moolenaar import name './Xexport.vim' 1136fa29c8abSBram Moolenaar END 1137fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 113844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1139fa29c8abSBram Moolenaar 1140cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1141fa29c8abSBram Moolenaar vim9script 1142fa29c8abSBram Moolenaar import name from Xexport.vim 1143fa29c8abSBram Moolenaar END 1144fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 114544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1146fa29c8abSBram Moolenaar 1147cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1148fa29c8abSBram Moolenaar vim9script 1149fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1150fa29c8abSBram Moolenaar END 1151fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 115244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1153fa29c8abSBram Moolenaar 1154cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1155fa29c8abSBram Moolenaar vim9script 1156fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1157fa29c8abSBram Moolenaar END 11585269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 115944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1160fa29c8abSBram Moolenaar 1161f2d5c240SBram Moolenaar delete('Ximport.vim') 11625269bd2aSBram Moolenaar delete('Ximport3.vim') 11638a7d6542SBram Moolenaar delete('Xexport.vim') 11648a7d6542SBram Moolenaar 1165f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1166750802b5SBram Moolenaar set cpo&vi 1167cfcd011fSBram Moolenaar var cpo_before = &cpo 1168cfcd011fSBram Moolenaar var lines =<< trim END 1169750802b5SBram Moolenaar vim9script 1170750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1171750802b5SBram Moolenaar END 1172750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1173750802b5SBram Moolenaar source Xvim9_script 1174750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1175750802b5SBram Moolenaar set cpo&vim 1176750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1177750802b5SBram Moolenaar delete('Xvim9_script') 1178750802b5SBram Moolenaarenddef 1179750802b5SBram Moolenaar 1180803af686SBram Moolenaarfunc g:Trigger() 1181803af686SBram Moolenaar source Ximport.vim 1182803af686SBram Moolenaar return "echo 'yes'\<CR>" 1183803af686SBram Moolenaarendfunc 1184803af686SBram Moolenaar 1185803af686SBram Moolenaardef Test_import_export_expr_map() 1186803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1187cfcd011fSBram Moolenaar var export_lines =<< trim END 1188803af686SBram Moolenaar vim9script 1189803af686SBram Moolenaar export def That(): string 1190803af686SBram Moolenaar return 'yes' 1191803af686SBram Moolenaar enddef 1192803af686SBram Moolenaar END 1193803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1194803af686SBram Moolenaar 1195cfcd011fSBram Moolenaar var import_lines =<< trim END 1196803af686SBram Moolenaar vim9script 1197803af686SBram Moolenaar import That from './Xexport_that.vim' 1198803af686SBram Moolenaar assert_equal('yes', That()) 1199803af686SBram Moolenaar END 1200803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1201803af686SBram Moolenaar 1202803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1203803af686SBram Moolenaar feedkeys('trigger', "xt") 1204803af686SBram Moolenaar 1205730b2483SBram Moolenaar delete('Xexport_that.vim') 1206803af686SBram Moolenaar delete('Ximport.vim') 1207803af686SBram Moolenaar nunmap trigger 1208803af686SBram Moolenaarenddef 1209803af686SBram Moolenaar 12108e1986e3SBram Moolenaardef Test_import_in_filetype() 12118e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12128e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1213cfcd011fSBram Moolenaar var export_lines =<< trim END 12148e1986e3SBram Moolenaar vim9script 1215cfcd011fSBram Moolenaar export var That = 'yes' 12168e1986e3SBram Moolenaar END 1217730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12188e1986e3SBram Moolenaar 1219cfcd011fSBram Moolenaar var import_lines =<< trim END 12208e1986e3SBram Moolenaar vim9script 1221730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12228e1986e3SBram Moolenaar assert_equal('yes', That) 12238e1986e3SBram Moolenaar g:did_load_mytpe = 1 12248e1986e3SBram Moolenaar END 12258e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12268e1986e3SBram Moolenaar 1227cfcd011fSBram Moolenaar var save_rtp = &rtp 12288e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 12298e1986e3SBram Moolenaar 12308e1986e3SBram Moolenaar filetype plugin on 12318e1986e3SBram Moolenaar copen 12328e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 12338e1986e3SBram Moolenaar 12348e1986e3SBram Moolenaar quit! 1235730b2483SBram Moolenaar delete('Xexport_ft.vim') 12368e1986e3SBram Moolenaar delete('ftplugin', 'rf') 12378e1986e3SBram Moolenaar &rtp = save_rtp 12388e1986e3SBram Moolenaarenddef 12398e1986e3SBram Moolenaar 1240efa94447SBram Moolenaardef Test_use_import_in_mapping() 1241cfcd011fSBram Moolenaar var lines =<< trim END 1242efa94447SBram Moolenaar vim9script 1243efa94447SBram Moolenaar export def Funcx() 1244efa94447SBram Moolenaar g:result = 42 1245efa94447SBram Moolenaar enddef 1246efa94447SBram Moolenaar END 1247efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1248efa94447SBram Moolenaar lines =<< trim END 1249efa94447SBram Moolenaar vim9script 1250efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1251b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1252efa94447SBram Moolenaar END 1253efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1254efa94447SBram Moolenaar 1255efa94447SBram Moolenaar source Xmapscript.vim 1256b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1257efa94447SBram Moolenaar assert_equal(42, g:result) 1258efa94447SBram Moolenaar 1259efa94447SBram Moolenaar unlet g:result 1260efa94447SBram Moolenaar delete('XsomeExport.vim') 1261efa94447SBram Moolenaar delete('Xmapscript.vim') 1262b3ca9824SBram Moolenaar nunmap <F3> 1263efa94447SBram Moolenaarenddef 1264efa94447SBram Moolenaar 1265*d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1266*d3f8a9eeSBram Moolenaar var lines =<< trim END 1267*d3f8a9eeSBram Moolenaar if has(g:feature) 1268*d3f8a9eeSBram Moolenaar " legacy script 1269*d3f8a9eeSBram Moolenaar let g:legacy = 1 1270*d3f8a9eeSBram Moolenaar finish 1271*d3f8a9eeSBram Moolenaar endif 1272*d3f8a9eeSBram Moolenaar vim9script 1273*d3f8a9eeSBram Moolenaar g:legacy = 0 1274*d3f8a9eeSBram Moolenaar END 1275*d3f8a9eeSBram Moolenaar g:feature = 'eval' 1276*d3f8a9eeSBram Moolenaar g:legacy = -1 1277*d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1278*d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1279*d3f8a9eeSBram Moolenaar 1280*d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1281*d3f8a9eeSBram Moolenaar g:legacy = -1 1282*d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1283*d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1284*d3f8a9eeSBram Moolenaarenddef 1285*d3f8a9eeSBram Moolenaar 1286750802b5SBram Moolenaardef Test_vim9script_fails() 12878a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 12888a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1289cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 12909721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1291cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1292750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1293750802b5SBram Moolenaar 1294cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1295c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1296c785b9a7SBram Moolenaar 1297e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1298e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 12998a7d6542SBram Moolenaarenddef 13008a7d6542SBram Moolenaar 1301f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1302101f4810SBram Moolenaar CheckRunVimInTerminal 1303101f4810SBram Moolenaar 13049bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1305c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13069bb3eb3eSBram Moolenaarendfunc 13079bb3eb3eSBram Moolenaar 1308c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1309cfcd011fSBram Moolenaar var export =<< trim END 1310101f4810SBram Moolenaar vim9script 1311101f4810SBram Moolenaar export def Foo(): number 1312101f4810SBram Moolenaar return 0 1313101f4810SBram Moolenaar enddef 1314101f4810SBram Moolenaar END 1315730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1316101f4810SBram Moolenaar 1317e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 13189bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13192949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1320101f4810SBram Moolenaar 1321730b2483SBram Moolenaar delete('XexportCmd.vim') 13229bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13239bb3eb3eSBram Moolenaarenddef 1324101f4810SBram Moolenaar 13252b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13262b32700dSBram Moolenaar var lines =<< trim END 1327a6294955SBram Moolenaar vim9script 1328a6294955SBram Moolenaar export var exported = 'thexport' 1329a6294955SBram Moolenaar END 1330a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1331a6294955SBram Moolenaar lines =<< trim END 13322b32700dSBram Moolenaar vim9script noclear 13332b32700dSBram Moolenaar g:loadCount += 1 13342b32700dSBram Moolenaar var s:reloaded = 'init' 1335a6294955SBram Moolenaar import exported from './XExportReload' 13362b32700dSBram Moolenaar 13372b32700dSBram Moolenaar def Again(): string 13382b32700dSBram Moolenaar return 'again' 13392b32700dSBram Moolenaar enddef 13402b32700dSBram Moolenaar 13412b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 13422b32700dSBram Moolenaar var s:loaded = true 13432b32700dSBram Moolenaar 13442b32700dSBram Moolenaar var s:notReloaded = 'yes' 13452b32700dSBram Moolenaar s:reloaded = 'first' 13462b32700dSBram Moolenaar def g:Values(): list<string> 1347a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 13482b32700dSBram Moolenaar enddef 13492b32700dSBram Moolenaar 13502b32700dSBram Moolenaar def Once(): string 13512b32700dSBram Moolenaar return 'once' 13522b32700dSBram Moolenaar enddef 13532b32700dSBram Moolenaar END 13542b32700dSBram Moolenaar writefile(lines, 'XReloaded') 13552b32700dSBram Moolenaar g:loadCount = 0 13562b32700dSBram Moolenaar source XReloaded 13572b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1358a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 13592b32700dSBram Moolenaar source XReloaded 13602b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1361a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13622b32700dSBram Moolenaar source XReloaded 13632b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1364a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 13652b32700dSBram Moolenaar 136648e11c10SBram Moolenaar delete('XReloaded') 1367a6294955SBram Moolenaar delete('XExportReload') 13682b32700dSBram Moolenaar delfunc g:Values 13692b32700dSBram Moolenaar unlet g:loadCount 13702b32700dSBram Moolenaarenddef 13712b32700dSBram Moolenaar 13724c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1373cfcd011fSBram Moolenaar var lines =<< trim END 13748a7d6542SBram Moolenaar vim9script 13758a7d6542SBram Moolenaar const var = '' 1376cfcd011fSBram Moolenaar var valone = 1234 13778a7d6542SBram Moolenaar def MyFunc(arg: string) 13788a7d6542SBram Moolenaar valone = 5678 13798a7d6542SBram Moolenaar enddef 13808a7d6542SBram Moolenaar END 1381cfcd011fSBram Moolenaar var morelines =<< trim END 1382cfcd011fSBram Moolenaar var valtwo = 222 13838a7d6542SBram Moolenaar export def GetValtwo(): number 13848a7d6542SBram Moolenaar return valtwo 13858a7d6542SBram Moolenaar enddef 13868a7d6542SBram Moolenaar END 138703afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13888a7d6542SBram Moolenaar source Xreload.vim 13898a7d6542SBram Moolenaar source Xreload.vim 13908a7d6542SBram Moolenaar source Xreload.vim 13918a7d6542SBram Moolenaar 1392cfcd011fSBram Moolenaar var testlines =<< trim END 13938a7d6542SBram Moolenaar vim9script 13948a7d6542SBram Moolenaar def TheFunc() 13958a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13968a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13978a7d6542SBram Moolenaar enddef 13988a7d6542SBram Moolenaar TheFunc() 13998a7d6542SBram Moolenaar END 14008a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14018a7d6542SBram Moolenaar source Ximport.vim 14028a7d6542SBram Moolenaar 1403f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1404f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14058a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14068a7d6542SBram Moolenaar source Ximport.vim 14078a7d6542SBram Moolenaar 1408f5be8cdbSBram Moolenaar # cannot declare a var twice 14098a7d6542SBram Moolenaar lines =<< trim END 14108a7d6542SBram Moolenaar vim9script 1411cfcd011fSBram Moolenaar var valone = 1234 1412cfcd011fSBram Moolenaar var valone = 5678 14138a7d6542SBram Moolenaar END 14148a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 141544d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 14168a7d6542SBram Moolenaar 14178a7d6542SBram Moolenaar delete('Xreload.vim') 14188a7d6542SBram Moolenaar delete('Ximport.vim') 14198a7d6542SBram Moolenaarenddef 14208a7d6542SBram Moolenaar 142107a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 142207a65d26SBram Moolenaar" compiled function using that variable must fail. 142307a65d26SBram Moolenaardef Test_script_reload_change_type() 142407a65d26SBram Moolenaar var lines =<< trim END 142507a65d26SBram Moolenaar vim9script noclear 142607a65d26SBram Moolenaar var str = 'string' 142707a65d26SBram Moolenaar def g:GetStr(): string 142807a65d26SBram Moolenaar return str .. 'xxx' 142907a65d26SBram Moolenaar enddef 143007a65d26SBram Moolenaar END 143107a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 143207a65d26SBram Moolenaar source Xreload.vim 143307a65d26SBram Moolenaar echo g:GetStr() 143407a65d26SBram Moolenaar 143507a65d26SBram Moolenaar lines =<< trim END 143607a65d26SBram Moolenaar vim9script noclear 143707a65d26SBram Moolenaar var str = 1234 143807a65d26SBram Moolenaar END 143907a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 144007a65d26SBram Moolenaar source Xreload.vim 144107a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 144207a65d26SBram Moolenaar 144307a65d26SBram Moolenaar delfunc g:GetStr 144407a65d26SBram Moolenaar delete('Xreload.vim') 144507a65d26SBram Moolenaarenddef 144607a65d26SBram Moolenaar 144795006e3dSBram Moolenaardef s:RetSome(): string 144895006e3dSBram Moolenaar return 'some' 144995006e3dSBram Moolenaarenddef 145095006e3dSBram Moolenaar 1451fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1452fe465a01SBram Moolenaar" script-local name. 1453fe465a01SBram Moolenaardef Test_vim9script_funcref() 1454cfcd011fSBram Moolenaar var sortlines =<< trim END 1455fe465a01SBram Moolenaar vim9script 1456fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1457bed36b93SBram Moolenaar return i2 - i1 1458fe465a01SBram Moolenaar enddef 1459fe465a01SBram Moolenaar 1460fe465a01SBram Moolenaar export def FastSort(): list<number> 1461fe465a01SBram Moolenaar return range(5)->sort(Compare) 1462fe465a01SBram Moolenaar enddef 1463fe465a01SBram Moolenaar END 1464fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1465fe465a01SBram Moolenaar 1466cfcd011fSBram Moolenaar var lines =<< trim END 1467fe465a01SBram Moolenaar vim9script 1468fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1469fe465a01SBram Moolenaar def Test() 1470fe465a01SBram Moolenaar g:result = FastSort() 1471fe465a01SBram Moolenaar enddef 1472fe465a01SBram Moolenaar Test() 1473fe465a01SBram Moolenaar END 1474fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1475fe465a01SBram Moolenaar 1476fe465a01SBram Moolenaar source Xscript.vim 1477fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1478fe465a01SBram Moolenaar 1479fe465a01SBram Moolenaar unlet g:result 1480fe465a01SBram Moolenaar delete('Xsort.vim') 1481fe465a01SBram Moolenaar delete('Xscript.vim') 148295006e3dSBram Moolenaar 1483cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 148495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1485fe465a01SBram Moolenaarenddef 1486fe465a01SBram Moolenaar 1487601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1488601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1489601e76acSBram Moolenaar" function reference. 1490c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1491cfcd011fSBram Moolenaar var filterLines =<< trim END 1492c620c055SBram Moolenaar vim9script 1493c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1494c620c055SBram Moolenaar return idx % 2 == 1 1495c620c055SBram Moolenaar enddef 1496c620c055SBram Moolenaar export def FastFilter(): list<number> 1497c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1498c620c055SBram Moolenaar enddef 1499601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1500601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1501601e76acSBram Moolenaar enddef 1502c620c055SBram Moolenaar END 1503c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1504c620c055SBram Moolenaar 1505cfcd011fSBram Moolenaar var lines =<< trim END 1506c620c055SBram Moolenaar vim9script 1507601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1508c620c055SBram Moolenaar def Test() 1509cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1510c620c055SBram Moolenaar enddef 1511c620c055SBram Moolenaar Test() 1512601e76acSBram Moolenaar def TestDirect() 1513cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1514601e76acSBram Moolenaar enddef 1515601e76acSBram Moolenaar TestDirect() 1516c620c055SBram Moolenaar END 1517601e76acSBram Moolenaar CheckScriptSuccess(lines) 1518c620c055SBram Moolenaar delete('Xfilter.vim') 1519c620c055SBram Moolenaarenddef 1520c620c055SBram Moolenaar 15214c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1522cfcd011fSBram Moolenaar var first_lines =<< trim END 15234c17ad94SBram Moolenaar vim9script 15244c17ad94SBram Moolenaar def FuncYes(): string 15254c17ad94SBram Moolenaar return 'yes' 15264c17ad94SBram Moolenaar enddef 15274c17ad94SBram Moolenaar END 1528cfcd011fSBram Moolenaar var withno_lines =<< trim END 15294c17ad94SBram Moolenaar def FuncNo(): string 15304c17ad94SBram Moolenaar return 'no' 15314c17ad94SBram Moolenaar enddef 15324c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 15334c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 15344c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 153503afdcf1SBram Moolenaar enddef 153603afdcf1SBram Moolenaar END 1537cfcd011fSBram Moolenaar var nono_lines =<< trim END 153803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 153903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 154044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 15414c17ad94SBram Moolenaar enddef 15424c17ad94SBram Moolenaar END 15434c17ad94SBram Moolenaar 15444c17ad94SBram Moolenaar # FuncNo() is defined 154503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15464c17ad94SBram Moolenaar source Xreloaded.vim 15474c17ad94SBram Moolenaar g:DoCheck(true) 15484c17ad94SBram Moolenaar 15494c17ad94SBram Moolenaar # FuncNo() is not redefined 155003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15514c17ad94SBram Moolenaar source Xreloaded.vim 15525082471fSBram Moolenaar g:DoCheck(false) 15534c17ad94SBram Moolenaar 15544c17ad94SBram Moolenaar # FuncNo() is back 155503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15564c17ad94SBram Moolenaar source Xreloaded.vim 15575082471fSBram Moolenaar g:DoCheck(false) 15584c17ad94SBram Moolenaar 15594c17ad94SBram Moolenaar delete('Xreloaded.vim') 15604c17ad94SBram Moolenaarenddef 15614c17ad94SBram Moolenaar 156289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 156389483d40SBram Moolenaar # write the script with a script-local variable 1564cfcd011fSBram Moolenaar var lines =<< trim END 156589483d40SBram Moolenaar vim9script 1566cfcd011fSBram Moolenaar var name = 'string' 156789483d40SBram Moolenaar END 156889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 156989483d40SBram Moolenaar source XreloadVar.vim 157089483d40SBram Moolenaar 157189483d40SBram Moolenaar # now write the script using the same variable locally - works 157289483d40SBram Moolenaar lines =<< trim END 157389483d40SBram Moolenaar vim9script 157489483d40SBram Moolenaar def Func() 1575cfcd011fSBram Moolenaar var name = 'string' 157689483d40SBram Moolenaar enddef 157789483d40SBram Moolenaar END 157889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 157989483d40SBram Moolenaar source XreloadVar.vim 158089483d40SBram Moolenaar 158189483d40SBram Moolenaar delete('XreloadVar.vim') 158289483d40SBram Moolenaarenddef 158389483d40SBram Moolenaar 15848a7d6542SBram Moolenaardef Test_import_absolute() 1585cfcd011fSBram Moolenaar var import_lines = [ 1586e6085c53SBram Moolenaar 'vim9script', 1587e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1588e6085c53SBram Moolenaar 'def UseExported()', 1589e6085c53SBram Moolenaar ' g:imported_abs = exported', 1590e6085c53SBram Moolenaar ' exported = 8888', 1591e6085c53SBram Moolenaar ' g:imported_after = exported', 1592e6085c53SBram Moolenaar 'enddef', 1593e6085c53SBram Moolenaar 'UseExported()', 1594e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1595e6085c53SBram Moolenaar ] 15968a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15978a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15988a7d6542SBram Moolenaar 15998a7d6542SBram Moolenaar source Ximport_abs.vim 16008a7d6542SBram Moolenaar 16018a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16024e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1603fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1604fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1605fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1606fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1607fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1608fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1609fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1610fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1611fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1612fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1613e6085c53SBram Moolenaar g:import_disassembled) 1614b3ca9824SBram Moolenaar 1615b3ca9824SBram Moolenaar Undo_export_script_lines() 16168a7d6542SBram Moolenaar unlet g:imported_abs 16174e12a5dfSBram Moolenaar unlet g:import_disassembled 16188a7d6542SBram Moolenaar 16198a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16208a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16218a7d6542SBram Moolenaarenddef 16228a7d6542SBram Moolenaar 16238a7d6542SBram Moolenaardef Test_import_rtp() 1624cfcd011fSBram Moolenaar var import_lines = [ 1625e6085c53SBram Moolenaar 'vim9script', 1626e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1627e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1628e6085c53SBram Moolenaar ] 16298a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 16308a7d6542SBram Moolenaar mkdir('import') 16318a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 16328a7d6542SBram Moolenaar 1633cfcd011fSBram Moolenaar var save_rtp = &rtp 16348a7d6542SBram Moolenaar &rtp = getcwd() 16358a7d6542SBram Moolenaar source Ximport_rtp.vim 16368a7d6542SBram Moolenaar &rtp = save_rtp 16378a7d6542SBram Moolenaar 16388a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 16398a7d6542SBram Moolenaar 1640b3ca9824SBram Moolenaar Undo_export_script_lines() 1641b3ca9824SBram Moolenaar unlet g:imported_rtp 16428a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 164389483d40SBram Moolenaar delete('import', 'rf') 16448a7d6542SBram Moolenaarenddef 16458a7d6542SBram Moolenaar 164625e0f586SBram Moolenaardef Test_import_compile_error() 1647cfcd011fSBram Moolenaar var export_lines = [ 164825e0f586SBram Moolenaar 'vim9script', 164925e0f586SBram Moolenaar 'export def ExpFunc(): string', 165025e0f586SBram Moolenaar ' return notDefined', 165125e0f586SBram Moolenaar 'enddef', 165225e0f586SBram Moolenaar ] 165325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 165425e0f586SBram Moolenaar 1655cfcd011fSBram Moolenaar var import_lines = [ 165625e0f586SBram Moolenaar 'vim9script', 165725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 165825e0f586SBram Moolenaar 'def ImpFunc()', 165925e0f586SBram Moolenaar ' echo ExpFunc()', 166025e0f586SBram Moolenaar 'enddef', 166125e0f586SBram Moolenaar 'defcompile', 166225e0f586SBram Moolenaar ] 166325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 166425e0f586SBram Moolenaar 166525e0f586SBram Moolenaar try 166625e0f586SBram Moolenaar source Ximport.vim 166725e0f586SBram Moolenaar catch /E1001/ 1668f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 16697707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 167025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 167125e0f586SBram Moolenaar endtry 167225e0f586SBram Moolenaar 167325e0f586SBram Moolenaar delete('Xexported.vim') 167425e0f586SBram Moolenaar delete('Ximport.vim') 167525e0f586SBram Moolenaarenddef 167625e0f586SBram Moolenaar 1677c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1678cfcd011fSBram Moolenaar var lines = [ 1679c4ce36d4SBram Moolenaar 'vim9script', 1680c4ce36d4SBram Moolenaar 'def Func()', 1681c4ce36d4SBram Moolenaar ' eval [][0]', 1682c4ce36d4SBram Moolenaar 'enddef', 1683c4ce36d4SBram Moolenaar 'Func()', 1684c4ce36d4SBram Moolenaar ] 1685c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1686c4ce36d4SBram Moolenaar 1687c4ce36d4SBram Moolenaar for count in range(3) 1688c4ce36d4SBram Moolenaar try 1689c4ce36d4SBram Moolenaar source Xtestscript.vim 1690c4ce36d4SBram Moolenaar catch /E684/ 1691c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1692c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1693c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1694c4ce36d4SBram Moolenaar endtry 1695c4ce36d4SBram Moolenaar endfor 1696c4ce36d4SBram Moolenaar 1697c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1698c4ce36d4SBram Moolenaarenddef 1699c4ce36d4SBram Moolenaar 1700eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1701cfcd011fSBram Moolenaar var export_lines =<< trim END 1702eef2102eSBram Moolenaar vim9script 1703eef2102eSBram Moolenaar export def Func() 1704eef2102eSBram Moolenaar echo 'imported' 1705eef2102eSBram Moolenaar enddef 1706eef2102eSBram Moolenaar END 1707eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1708eef2102eSBram Moolenaar 1709cfcd011fSBram Moolenaar var lines =<< trim END 1710eef2102eSBram Moolenaar vim9script 1711eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1712eef2102eSBram Moolenaar def Func() 1713eef2102eSBram Moolenaar echo 'local to function' 1714eef2102eSBram Moolenaar enddef 1715eef2102eSBram Moolenaar END 1716eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1717eef2102eSBram Moolenaar 1718eef2102eSBram Moolenaar lines =<< trim END 1719eef2102eSBram Moolenaar vim9script 1720eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1721eef2102eSBram Moolenaar def Outer() 1722eef2102eSBram Moolenaar def Func() 1723eef2102eSBram Moolenaar echo 'local to function' 1724eef2102eSBram Moolenaar enddef 1725eef2102eSBram Moolenaar enddef 1726eef2102eSBram Moolenaar defcompile 1727eef2102eSBram Moolenaar END 1728eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1729eef2102eSBram Moolenaar 1730eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1731eef2102eSBram Moolenaarenddef 1732eef2102eSBram Moolenaar 1733b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1734cfcd011fSBram Moolenaar var lines =<< trim END 1735b9a2cac3SBram Moolenaar vim9script 1736b9a2cac3SBram Moolenaar def Func() 1737b9a2cac3SBram Moolenaar echo 'one' 1738b9a2cac3SBram Moolenaar enddef 1739b9a2cac3SBram Moolenaar def Func() 1740b9a2cac3SBram Moolenaar echo 'two' 1741b9a2cac3SBram Moolenaar enddef 1742b9a2cac3SBram Moolenaar END 1743b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1744fa211f3cSBram Moolenaar 1745fa211f3cSBram Moolenaar lines =<< trim END 1746fa211f3cSBram Moolenaar vim9script 1747fa211f3cSBram Moolenaar def Foo(): string 1748fa211f3cSBram Moolenaar return 'foo' 1749fa211f3cSBram Moolenaar enddef 1750fa211f3cSBram Moolenaar def Func() 1751cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1752fa211f3cSBram Moolenaar enddef 1753fa211f3cSBram Moolenaar defcompile 1754fa211f3cSBram Moolenaar END 1755fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1756b9a2cac3SBram Moolenaarenddef 1757b9a2cac3SBram Moolenaar 17588a7d6542SBram Moolenaardef Test_fixed_size_list() 1759f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1760cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 17618a7d6542SBram Moolenaar l->remove(0) 17628a7d6542SBram Moolenaar l->add(5) 17638a7d6542SBram Moolenaar l->insert(99, 1) 17640f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 17658a7d6542SBram Moolenaarenddef 17668a7d6542SBram Moolenaar 1767ae616494SBram Moolenaardef Test_no_insert_xit() 1768d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1769d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1770d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1771d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1772d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1773ae616494SBram Moolenaar 1774ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1775ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1776ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1777ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1778f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1779f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1780f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1781f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1782f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1783ae616494SBram Moolenaarenddef 1784ae616494SBram Moolenaar 1785158906cfSBram Moolenaardef IfElse(what: number): string 1786cfcd011fSBram Moolenaar var res = '' 1787158906cfSBram Moolenaar if what == 1 1788158906cfSBram Moolenaar res = "one" 1789158906cfSBram Moolenaar elseif what == 2 1790158906cfSBram Moolenaar res = "two" 1791a259d8d3SBram Moolenaar else 1792158906cfSBram Moolenaar res = "three" 1793a259d8d3SBram Moolenaar endif 1794158906cfSBram Moolenaar return res 1795a259d8d3SBram Moolenaarenddef 1796a259d8d3SBram Moolenaar 1797158906cfSBram Moolenaardef Test_if_elseif_else() 1798158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1799158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1800158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18010f18b6d1SBram Moolenaarenddef 18020f18b6d1SBram Moolenaar 1803e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1804d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1805d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1806d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1807ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1808d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 18096628b7ebSBram Moolenaar 18106628b7ebSBram Moolenaar var lines =<< trim END 18116628b7ebSBram Moolenaar var s = '' 18126628b7ebSBram Moolenaar if s = '' 18136628b7ebSBram Moolenaar endif 18146628b7ebSBram Moolenaar END 18156628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 18166628b7ebSBram Moolenaar 18176628b7ebSBram Moolenaar lines =<< trim END 18186628b7ebSBram Moolenaar var s = '' 18196628b7ebSBram Moolenaar if s == '' 18206628b7ebSBram Moolenaar elseif s = '' 18216628b7ebSBram Moolenaar endif 18226628b7ebSBram Moolenaar END 18236628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1824e8c4abbbSBram Moolenaarenddef 1825e8c4abbbSBram Moolenaar 18266d69bf60SBram Moolenaarlet g:bool_true = v:true 18276d69bf60SBram Moolenaarlet g:bool_false = v:false 18286d69bf60SBram Moolenaar 18296d69bf60SBram Moolenaardef Test_if_const_expr() 1830cfcd011fSBram Moolenaar var res = false 18316d69bf60SBram Moolenaar if true ? true : false 18326d69bf60SBram Moolenaar res = true 18336d69bf60SBram Moolenaar endif 18346d69bf60SBram Moolenaar assert_equal(true, res) 18356d69bf60SBram Moolenaar 1836585fea7bSBram Moolenaar g:glob = 2 1837585fea7bSBram Moolenaar if false 18386797966dSBram Moolenaar execute('g:glob = 3') 1839585fea7bSBram Moolenaar endif 1840585fea7bSBram Moolenaar assert_equal(2, g:glob) 1841585fea7bSBram Moolenaar if true 18426797966dSBram Moolenaar execute('g:glob = 3') 1843585fea7bSBram Moolenaar endif 1844585fea7bSBram Moolenaar assert_equal(3, g:glob) 1845585fea7bSBram Moolenaar 18466d69bf60SBram Moolenaar res = false 18476d69bf60SBram Moolenaar if g:bool_true ? true : false 18486d69bf60SBram Moolenaar res = true 18496d69bf60SBram Moolenaar endif 18506d69bf60SBram Moolenaar assert_equal(true, res) 18516d69bf60SBram Moolenaar 18526d69bf60SBram Moolenaar res = false 18536d69bf60SBram Moolenaar if true ? g:bool_true : false 18546d69bf60SBram Moolenaar res = true 18556d69bf60SBram Moolenaar endif 18566d69bf60SBram Moolenaar assert_equal(true, res) 18576d69bf60SBram Moolenaar 18586d69bf60SBram Moolenaar res = false 18596d69bf60SBram Moolenaar if true ? true : g:bool_false 18606d69bf60SBram Moolenaar res = true 18616d69bf60SBram Moolenaar endif 18626d69bf60SBram Moolenaar assert_equal(true, res) 18636d69bf60SBram Moolenaar 18646d69bf60SBram Moolenaar res = false 18656d69bf60SBram Moolenaar if true ? false : true 18666d69bf60SBram Moolenaar res = true 18676d69bf60SBram Moolenaar endif 18686d69bf60SBram Moolenaar assert_equal(false, res) 18696d69bf60SBram Moolenaar 18706d69bf60SBram Moolenaar res = false 18716d69bf60SBram Moolenaar if false ? false : true 18726d69bf60SBram Moolenaar res = true 18736d69bf60SBram Moolenaar endif 18746d69bf60SBram Moolenaar assert_equal(true, res) 18756d69bf60SBram Moolenaar 18766d69bf60SBram Moolenaar res = false 18776d69bf60SBram Moolenaar if false ? true : false 18786d69bf60SBram Moolenaar res = true 18796d69bf60SBram Moolenaar endif 18806d69bf60SBram Moolenaar assert_equal(false, res) 18816d69bf60SBram Moolenaar 18826d69bf60SBram Moolenaar res = false 1883e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1884e8c4abbbSBram Moolenaar res = true 1885e8c4abbbSBram Moolenaar endif 1886e8c4abbbSBram Moolenaar assert_equal(false, res) 1887e8c4abbbSBram Moolenaar 1888e8c4abbbSBram Moolenaar res = false 18896d69bf60SBram Moolenaar if true && true 18906d69bf60SBram Moolenaar res = true 18916d69bf60SBram Moolenaar endif 18926d69bf60SBram Moolenaar assert_equal(true, res) 18936d69bf60SBram Moolenaar 18946d69bf60SBram Moolenaar res = false 18956d69bf60SBram Moolenaar if true && false 18966d69bf60SBram Moolenaar res = true 18976d69bf60SBram Moolenaar endif 18986d69bf60SBram Moolenaar assert_equal(false, res) 18996d69bf60SBram Moolenaar 19006d69bf60SBram Moolenaar res = false 19016d69bf60SBram Moolenaar if g:bool_true && false 19026d69bf60SBram Moolenaar res = true 19036d69bf60SBram Moolenaar endif 19046d69bf60SBram Moolenaar assert_equal(false, res) 19056d69bf60SBram Moolenaar 19066d69bf60SBram Moolenaar res = false 19076d69bf60SBram Moolenaar if true && g:bool_false 19086d69bf60SBram Moolenaar res = true 19096d69bf60SBram Moolenaar endif 19106d69bf60SBram Moolenaar assert_equal(false, res) 19116d69bf60SBram Moolenaar 19126d69bf60SBram Moolenaar res = false 19136d69bf60SBram Moolenaar if false && false 19146d69bf60SBram Moolenaar res = true 19156d69bf60SBram Moolenaar endif 19166d69bf60SBram Moolenaar assert_equal(false, res) 19176d69bf60SBram Moolenaar 19186d69bf60SBram Moolenaar res = false 19196d69bf60SBram Moolenaar if true || false 19206d69bf60SBram Moolenaar res = true 19216d69bf60SBram Moolenaar endif 19226d69bf60SBram Moolenaar assert_equal(true, res) 19236d69bf60SBram Moolenaar 19246d69bf60SBram Moolenaar res = false 19256d69bf60SBram Moolenaar if g:bool_true || false 19266d69bf60SBram Moolenaar res = true 19276d69bf60SBram Moolenaar endif 19286d69bf60SBram Moolenaar assert_equal(true, res) 19296d69bf60SBram Moolenaar 19306d69bf60SBram Moolenaar res = false 19316d69bf60SBram Moolenaar if true || g:bool_false 19326d69bf60SBram Moolenaar res = true 19336d69bf60SBram Moolenaar endif 19346d69bf60SBram Moolenaar assert_equal(true, res) 19356d69bf60SBram Moolenaar 19366d69bf60SBram Moolenaar res = false 19376d69bf60SBram Moolenaar if false || false 19386d69bf60SBram Moolenaar res = true 19396d69bf60SBram Moolenaar endif 19406d69bf60SBram Moolenaar assert_equal(false, res) 19413988f64fSBram Moolenaar 19423988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 19433988f64fSBram Moolenaar if false | eval 0 | endif 19443988f64fSBram Moolenaar if false | eval burp + 234 | endif 19453988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 19463988f64fSBram Moolenaar if false 19473988f64fSBram Moolenaar burp 19483988f64fSBram Moolenaar endif 194980c34ca3SBram Moolenaarenddef 19506d69bf60SBram Moolenaar 195180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1952d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1953d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1954d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1955d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 19566d69bf60SBram Moolenaarenddef 19576d69bf60SBram Moolenaar 195872abcf42SBram Moolenaardef RunNested(i: number): number 1959cfcd011fSBram Moolenaar var x: number = 0 196072abcf42SBram Moolenaar if i % 2 196172abcf42SBram Moolenaar if 1 1962f5be8cdbSBram Moolenaar # comment 196372abcf42SBram Moolenaar else 1964f5be8cdbSBram Moolenaar # comment 196572abcf42SBram Moolenaar endif 196672abcf42SBram Moolenaar x += 1 196772abcf42SBram Moolenaar else 196872abcf42SBram Moolenaar x += 1000 196972abcf42SBram Moolenaar endif 197072abcf42SBram Moolenaar return x 197172abcf42SBram Moolenaarenddef 197272abcf42SBram Moolenaar 197372abcf42SBram Moolenaardef Test_nested_if() 197472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 197572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 197672abcf42SBram Moolenaarenddef 197772abcf42SBram Moolenaar 1978ad39c094SBram Moolenaardef Test_execute_cmd() 1979e4984290SBram Moolenaar # missing argument is ignored 1980e4984290SBram Moolenaar execute 1981e4984290SBram Moolenaar execute # comment 1982e4984290SBram Moolenaar 1983ad39c094SBram Moolenaar new 1984ad39c094SBram Moolenaar setline(1, 'default') 1985d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1986ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1987a72cfb80SBram Moolenaar 1988d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1989a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1990a72cfb80SBram Moolenaar 1991cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1992cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1993a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1994ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1995a72cfb80SBram Moolenaar 1996d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1997ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1998a72cfb80SBram Moolenaar 1999cfcd011fSBram Moolenaar var cmd_first = 'call ' 2000cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2001ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2002ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2003ad39c094SBram Moolenaar bwipe! 2004585fea7bSBram Moolenaar 2005cfcd011fSBram Moolenaar var n = true 20062d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20072d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20082d6b20d6SBram Moolenaar 2009e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2010e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2011e5abf7afSBram Moolenaar 2012d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2013d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2014d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2015ad39c094SBram Moolenaarenddef 2016ad39c094SBram Moolenaar 201747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2018f5be8cdbSBram Moolenaar # only checks line continuation 2019cfcd011fSBram Moolenaar var lines =<< trim END 202047e880d6SBram Moolenaar vim9script 202147e880d6SBram Moolenaar execute 'g:someVar' 202247e880d6SBram Moolenaar .. ' = ' .. 202347e880d6SBram Moolenaar '28' 202447e880d6SBram Moolenaar assert_equal(28, g:someVar) 202547e880d6SBram Moolenaar unlet g:someVar 202647e880d6SBram Moolenaar END 202747e880d6SBram Moolenaar CheckScriptSuccess(lines) 202847e880d6SBram Moolenaarenddef 202947e880d6SBram Moolenaar 2030ad39c094SBram Moolenaardef Test_echo_cmd() 2031a72cfb80SBram Moolenaar echo 'some' # comment 2032585fea7bSBram Moolenaar echon 'thing' 2033ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2034ad39c094SBram Moolenaar 2035a72cfb80SBram Moolenaar echo "some" # comment 2036a72cfb80SBram Moolenaar echon "thing" 2037a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2038a72cfb80SBram Moolenaar 2039cfcd011fSBram Moolenaar var str1 = 'some' 2040cfcd011fSBram Moolenaar var str2 = 'more' 2041ad39c094SBram Moolenaar echo str1 str2 2042ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2043a72cfb80SBram Moolenaar 2044d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2045ad39c094SBram Moolenaarenddef 2046ad39c094SBram Moolenaar 2047f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2048f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2049f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2050f93c7feaSBram Moolenaar echo 'clear' 2051df069eecSBram Moolenaar :1messages 2052f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2053f93c7feaSBram Moolenaar 2054d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2055f93c7feaSBram Moolenaarenddef 2056f93c7feaSBram Moolenaar 205747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2058f5be8cdbSBram Moolenaar # only checks line continuation 2059cfcd011fSBram Moolenaar var lines =<< trim END 206047e880d6SBram Moolenaar vim9script 206147e880d6SBram Moolenaar echomsg 'here' 206247e880d6SBram Moolenaar .. ' is ' .. 206347e880d6SBram Moolenaar 'a message' 206447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 206547e880d6SBram Moolenaar END 206647e880d6SBram Moolenaar CheckScriptSuccess(lines) 206747e880d6SBram Moolenaarenddef 206847e880d6SBram Moolenaar 2069f93c7feaSBram Moolenaardef Test_echoerr_cmd() 207040ee466cSBram Moolenaar try 207140ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 207240ee466cSBram Moolenaar catch 207340ee466cSBram Moolenaar assert_match('something wrong', v:exception) 207440ee466cSBram Moolenaar endtry 2075f93c7feaSBram Moolenaarenddef 2076f93c7feaSBram Moolenaar 207747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2078f5be8cdbSBram Moolenaar # only checks line continuation 2079cfcd011fSBram Moolenaar var lines =<< trim END 208047e880d6SBram Moolenaar vim9script 208147e880d6SBram Moolenaar try 208247e880d6SBram Moolenaar echoerr 'this' 208347e880d6SBram Moolenaar .. ' is ' .. 208447e880d6SBram Moolenaar 'wrong' 208547e880d6SBram Moolenaar catch 208647e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 208747e880d6SBram Moolenaar endtry 208847e880d6SBram Moolenaar END 208947e880d6SBram Moolenaar CheckScriptSuccess(lines) 209047e880d6SBram Moolenaarenddef 209147e880d6SBram Moolenaar 209241fe0617SBram Moolenaardef Test_for_outside_of_function() 2093cfcd011fSBram Moolenaar var lines =<< trim END 209441fe0617SBram Moolenaar vim9script 209541fe0617SBram Moolenaar new 209641fe0617SBram Moolenaar for var in range(0, 3) 209741fe0617SBram Moolenaar append(line('$'), var) 209841fe0617SBram Moolenaar endfor 209941fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 210041fe0617SBram Moolenaar bwipe! 210141fe0617SBram Moolenaar END 210241fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 210341fe0617SBram Moolenaar source Xvim9for.vim 210441fe0617SBram Moolenaar delete('Xvim9for.vim') 210541fe0617SBram Moolenaarenddef 21068a7d6542SBram Moolenaar 2107e8c4abbbSBram Moolenaardef Test_for_loop() 2108cfcd011fSBram Moolenaar var result = '' 2109e8c4abbbSBram Moolenaar for cnt in range(7) 2110e8c4abbbSBram Moolenaar if cnt == 4 2111e8c4abbbSBram Moolenaar break 2112e8c4abbbSBram Moolenaar endif 2113e8c4abbbSBram Moolenaar if cnt == 2 2114e8c4abbbSBram Moolenaar continue 2115e8c4abbbSBram Moolenaar endif 2116e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2117e8c4abbbSBram Moolenaar endfor 2118e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21190ad3e894SBram Moolenaar 2120cfcd011fSBram Moolenaar var concat = '' 21210ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21220ad3e894SBram Moolenaar concat ..= str 21230ad3e894SBram Moolenaar endfor 21240ad3e894SBram Moolenaar assert_equal('onetwo', concat) 212538bd8de5SBram Moolenaar 212638bd8de5SBram Moolenaar var total = 0 212738bd8de5SBram Moolenaar for nr in 212838bd8de5SBram Moolenaar [1, 2, 3] 212938bd8de5SBram Moolenaar total += nr 213038bd8de5SBram Moolenaar endfor 213138bd8de5SBram Moolenaar assert_equal(6, total) 213238bd8de5SBram Moolenaar 213338bd8de5SBram Moolenaar total = 0 213438bd8de5SBram Moolenaar for nr 213538bd8de5SBram Moolenaar in [1, 2, 3] 213638bd8de5SBram Moolenaar total += nr 213738bd8de5SBram Moolenaar endfor 213838bd8de5SBram Moolenaar assert_equal(6, total) 213938bd8de5SBram Moolenaar 214038bd8de5SBram Moolenaar total = 0 214138bd8de5SBram Moolenaar for nr 214238bd8de5SBram Moolenaar in 214338bd8de5SBram Moolenaar [1, 2, 3] 214438bd8de5SBram Moolenaar total += nr 214538bd8de5SBram Moolenaar endfor 214638bd8de5SBram Moolenaar assert_equal(6, total) 2147036d0714SBram Moolenaar 2148036d0714SBram Moolenaar var res = "" 2149036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2150036d0714SBram Moolenaar res ..= n .. s 2151036d0714SBram Moolenaar endfor 2152036d0714SBram Moolenaar assert_equal('1a2b', res) 2153e8c4abbbSBram Moolenaarenddef 2154e8c4abbbSBram Moolenaar 2155e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2156025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2157025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2158025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2159675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2160675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2161cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2162822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 21632d870f8dSBram Moolenaar delfunc! g:Func 2164451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2165675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2166675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2167675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2168e8c4abbbSBram Moolenaarenddef 2169e8c4abbbSBram Moolenaar 2170ea87069dSBram Moolenaardef Test_for_loop_script_var() 2171ea87069dSBram Moolenaar # cannot use s:var in a :def function 2172ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2173ea87069dSBram Moolenaar 2174ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2175ea87069dSBram Moolenaar var lines =<< trim END 2176ea87069dSBram Moolenaar vim9script 2177ea87069dSBram Moolenaar var total = 0 2178ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2179ea87069dSBram Moolenaar total += s:var 2180ea87069dSBram Moolenaar endfor 2181ea87069dSBram Moolenaar assert_equal(6, total) 2182ea87069dSBram Moolenaar 2183ea87069dSBram Moolenaar total = 0 2184ea87069dSBram Moolenaar for var in [1, 2, 3] 2185ea87069dSBram Moolenaar total += var 2186ea87069dSBram Moolenaar endfor 2187ea87069dSBram Moolenaar assert_equal(6, total) 2188ea87069dSBram Moolenaar END 2189ea87069dSBram Moolenaarenddef 2190ea87069dSBram Moolenaar 2191792f786aSBram Moolenaardef Test_for_loop_unpack() 21924b8a0651SBram Moolenaar var lines =<< trim END 2193792f786aSBram Moolenaar var result = [] 2194792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2195792f786aSBram Moolenaar result->add(v1) 2196792f786aSBram Moolenaar result->add(v2) 2197792f786aSBram Moolenaar endfor 2198792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2199792f786aSBram Moolenaar 2200792f786aSBram Moolenaar result = [] 2201792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2202792f786aSBram Moolenaar result->add(v1) 2203792f786aSBram Moolenaar result->add(v2) 2204792f786aSBram Moolenaar result->add(v3) 2205792f786aSBram Moolenaar endfor 2206792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2207792f786aSBram Moolenaar 22084b8a0651SBram Moolenaar result = [] 22094b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 22104b8a0651SBram Moolenaar result->add(&ts) 22114b8a0651SBram Moolenaar result->add(&sw) 22124b8a0651SBram Moolenaar endfor 22134b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 22144b8a0651SBram Moolenaar 22154b8a0651SBram Moolenaar var slist: list<string> 22164b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 22174b8a0651SBram Moolenaar slist->add($LOOPVAR) 22184b8a0651SBram Moolenaar slist->add(@r) 22194b8a0651SBram Moolenaar slist->add(v:errmsg) 22204b8a0651SBram Moolenaar endfor 22214b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22224b8a0651SBram Moolenaar 22234b8a0651SBram Moolenaar slist = [] 22244b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22254b8a0651SBram Moolenaar slist->add(g:globalvar) 22264b8a0651SBram Moolenaar slist->add(b:bufvar) 22274b8a0651SBram Moolenaar slist->add(w:winvar) 22284b8a0651SBram Moolenaar slist->add(t:tabvar) 22294b8a0651SBram Moolenaar endfor 22304b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2231f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 22324b8a0651SBram Moolenaar END 22334b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 22344b8a0651SBram Moolenaar 22354b8a0651SBram Moolenaar lines =<< trim END 2236792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2237792f786aSBram Moolenaar echo v1 v2 2238792f786aSBram Moolenaar endfor 2239792f786aSBram Moolenaar END 2240792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2241792f786aSBram Moolenaar 2242792f786aSBram Moolenaar lines =<< trim END 2243792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2244792f786aSBram Moolenaar echo v1 v2 2245792f786aSBram Moolenaar endfor 2246792f786aSBram Moolenaar END 2247792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2248792f786aSBram Moolenaar 2249792f786aSBram Moolenaar lines =<< trim END 2250792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2251792f786aSBram Moolenaar echo v1 2252792f786aSBram Moolenaar endfor 2253792f786aSBram Moolenaar END 2254792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2255792f786aSBram Moolenaarenddef 2256792f786aSBram Moolenaar 2257c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2258c150c09eSBram Moolenaar var looped = 0 2259c150c09eSBram Moolenaar var cleanup = 0 2260c150c09eSBram Moolenaar for i in range(3) 2261c150c09eSBram Moolenaar looped += 1 2262c150c09eSBram Moolenaar try 2263c150c09eSBram Moolenaar eval [][0] 2264c150c09eSBram Moolenaar catch 2265c150c09eSBram Moolenaar continue 2266c150c09eSBram Moolenaar finally 2267c150c09eSBram Moolenaar cleanup += 1 2268c150c09eSBram Moolenaar endtry 2269c150c09eSBram Moolenaar endfor 2270c150c09eSBram Moolenaar assert_equal(3, looped) 2271c150c09eSBram Moolenaar assert_equal(3, cleanup) 2272c150c09eSBram Moolenaarenddef 2273c150c09eSBram Moolenaar 2274d0df1aacSBram Moolenaardef Test_while_loop() 2275cfcd011fSBram Moolenaar var result = '' 2276cfcd011fSBram Moolenaar var cnt = 0 2277d0df1aacSBram Moolenaar while cnt < 555 2278d0df1aacSBram Moolenaar if cnt == 3 2279d0df1aacSBram Moolenaar break 2280d0df1aacSBram Moolenaar endif 2281d0df1aacSBram Moolenaar cnt += 1 2282d0df1aacSBram Moolenaar if cnt == 2 2283d0df1aacSBram Moolenaar continue 2284d0df1aacSBram Moolenaar endif 2285d0df1aacSBram Moolenaar result ..= cnt .. '_' 2286d0df1aacSBram Moolenaar endwhile 2287d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2288dee37dc7SBram Moolenaar 2289dee37dc7SBram Moolenaar var s = '' 22900123cc1eSBram Moolenaar while s == 'x' #{comment} 2291dee37dc7SBram Moolenaar endwhile 2292d0df1aacSBram Moolenaarenddef 2293d0df1aacSBram Moolenaar 2294e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2295675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2296675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2297675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2298675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2299675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2300675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2301675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 23026628b7ebSBram Moolenaar 23036628b7ebSBram Moolenaar var lines =<< trim END 23046628b7ebSBram Moolenaar var s = '' 23056628b7ebSBram Moolenaar while s = '' 23066628b7ebSBram Moolenaar endwhile 23076628b7ebSBram Moolenaar END 23086628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2309bd5da371SBram Moolenaarenddef 2310bd5da371SBram Moolenaar 23119645e2d9SBram Moolenaardef Test_interrupt_loop() 2312cfcd011fSBram Moolenaar var caught = false 2313cfcd011fSBram Moolenaar var x = 0 231497acfc78SBram Moolenaar try 23159645e2d9SBram Moolenaar while 1 23169645e2d9SBram Moolenaar x += 1 23179645e2d9SBram Moolenaar if x == 100 23189645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23199645e2d9SBram Moolenaar endif 23209645e2d9SBram Moolenaar endwhile 232197acfc78SBram Moolenaar catch 232297acfc78SBram Moolenaar caught = true 232397acfc78SBram Moolenaar assert_equal(100, x) 232497acfc78SBram Moolenaar endtry 232597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 232625859dd7SBram Moolenaar # consume the CTRL-C 232725859dd7SBram Moolenaar getchar(0) 23289645e2d9SBram Moolenaarenddef 232920431c9dSBram Moolenaar 23304fdae999SBram Moolenaardef Test_automatic_line_continuation() 2331cfcd011fSBram Moolenaar var mylist = [ 23324fdae999SBram Moolenaar 'one', 23334fdae999SBram Moolenaar 'two', 23344fdae999SBram Moolenaar 'three', 2335f5be8cdbSBram Moolenaar ] # comment 23364fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 23374fdae999SBram Moolenaar 2338cfcd011fSBram Moolenaar var mydict = { 2339e0de171eSBram Moolenaar ['one']: 1, 2340e0de171eSBram Moolenaar ['two']: 2, 2341e0de171eSBram Moolenaar ['three']: 23424fdae999SBram Moolenaar 3, 2343f5be8cdbSBram Moolenaar } # comment 2344e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2345e0de171eSBram Moolenaar mydict = { 23462c330432SBram Moolenaar one: 1, # comment 23472c330432SBram Moolenaar two: # comment 23482c330432SBram Moolenaar 2, # comment 23492c330432SBram Moolenaar three: 3 # comment 23502c330432SBram Moolenaar } 2351e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2352e0de171eSBram Moolenaar mydict = { 23532c330432SBram Moolenaar one: 1, 23544fdae999SBram Moolenaar two: 23554fdae999SBram Moolenaar 2, 23562c330432SBram Moolenaar three: 3 23574fdae999SBram Moolenaar } 2358e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2359e6085c53SBram Moolenaar 2360e6085c53SBram Moolenaar assert_equal( 2361e6085c53SBram Moolenaar ['one', 'two', 'three'], 2362e6085c53SBram Moolenaar split('one two three') 2363e6085c53SBram Moolenaar ) 23644fdae999SBram Moolenaarenddef 23654fdae999SBram Moolenaar 23667a092245SBram Moolenaardef Test_vim9_comment() 23677a092245SBram Moolenaar CheckScriptSuccess([ 23687a092245SBram Moolenaar 'vim9script', 23697a092245SBram Moolenaar '# something', 237093f82cbeSBram Moolenaar '#something', 237193f82cbeSBram Moolenaar '#{something', 23727a092245SBram Moolenaar ]) 237393f82cbeSBram Moolenaar 237493f82cbeSBram Moolenaar split Xfile 237593f82cbeSBram Moolenaar CheckScriptSuccess([ 237693f82cbeSBram Moolenaar 'vim9script', 237793f82cbeSBram Moolenaar 'edit #something', 237893f82cbeSBram Moolenaar ]) 237993f82cbeSBram Moolenaar CheckScriptSuccess([ 238093f82cbeSBram Moolenaar 'vim9script', 238193f82cbeSBram Moolenaar 'edit #{something', 238293f82cbeSBram Moolenaar ]) 238393f82cbeSBram Moolenaar close 238493f82cbeSBram Moolenaar 23857a092245SBram Moolenaar CheckScriptFailure([ 23867a092245SBram Moolenaar 'vim9script', 23877a092245SBram Moolenaar ':# something', 23887a092245SBram Moolenaar ], 'E488:') 23897a092245SBram Moolenaar CheckScriptFailure([ 23907a092245SBram Moolenaar '# something', 23917a092245SBram Moolenaar ], 'E488:') 23927a092245SBram Moolenaar CheckScriptFailure([ 23937a092245SBram Moolenaar ':# something', 23947a092245SBram Moolenaar ], 'E488:') 23957a092245SBram Moolenaar 23964a8d9f2eSBram Moolenaar { # block start 23974a8d9f2eSBram Moolenaar } # block end 23984a8d9f2eSBram Moolenaar CheckDefFailure([ 23994a8d9f2eSBram Moolenaar '{# comment', 24004a8d9f2eSBram Moolenaar ], 'E488:') 24014a8d9f2eSBram Moolenaar CheckDefFailure([ 24024a8d9f2eSBram Moolenaar '{', 24034a8d9f2eSBram Moolenaar '}# comment', 24044a8d9f2eSBram Moolenaar ], 'E488:') 24054a8d9f2eSBram Moolenaar 24064a8d9f2eSBram Moolenaar echo "yes" # comment 24074a8d9f2eSBram Moolenaar CheckDefFailure([ 24084a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24094a8d9f2eSBram Moolenaar ], 'E488:') 24107a092245SBram Moolenaar CheckScriptSuccess([ 24117a092245SBram Moolenaar 'vim9script', 24127a092245SBram Moolenaar 'echo "yes" # something', 24137a092245SBram Moolenaar ]) 24147a092245SBram Moolenaar CheckScriptFailure([ 24157a092245SBram Moolenaar 'vim9script', 24167a092245SBram Moolenaar 'echo "yes"# something', 24177a092245SBram Moolenaar ], 'E121:') 24187a092245SBram Moolenaar CheckScriptFailure([ 24197a092245SBram Moolenaar 'vim9script', 24207a092245SBram Moolenaar 'echo# something', 2421f8103f27SBram Moolenaar ], 'E1144:') 24227a092245SBram Moolenaar CheckScriptFailure([ 24237a092245SBram Moolenaar 'echo "yes" # something', 24247a092245SBram Moolenaar ], 'E121:') 24257a092245SBram Moolenaar 24264a8d9f2eSBram Moolenaar exe "echo" # comment 24274a8d9f2eSBram Moolenaar CheckDefFailure([ 24284a8d9f2eSBram Moolenaar 'exe "echo"# comment', 24294a8d9f2eSBram Moolenaar ], 'E488:') 24304a8d9f2eSBram Moolenaar CheckScriptSuccess([ 24314a8d9f2eSBram Moolenaar 'vim9script', 24324a8d9f2eSBram Moolenaar 'exe "echo" # something', 24334a8d9f2eSBram Moolenaar ]) 24344a8d9f2eSBram Moolenaar CheckScriptFailure([ 24354a8d9f2eSBram Moolenaar 'vim9script', 24364a8d9f2eSBram Moolenaar 'exe "echo"# something', 24374a8d9f2eSBram Moolenaar ], 'E121:') 24384a8d9f2eSBram Moolenaar CheckScriptFailure([ 24394a8d9f2eSBram Moolenaar 'vim9script', 24404a8d9f2eSBram Moolenaar 'exe# something', 2441f8103f27SBram Moolenaar ], 'E1144:') 24424a8d9f2eSBram Moolenaar CheckScriptFailure([ 24434a8d9f2eSBram Moolenaar 'exe "echo" # something', 24444a8d9f2eSBram Moolenaar ], 'E121:') 24454a8d9f2eSBram Moolenaar 24467a092245SBram Moolenaar CheckDefFailure([ 24477a092245SBram Moolenaar 'try# comment', 24487a092245SBram Moolenaar ' echo "yes"', 24497a092245SBram Moolenaar 'catch', 24507a092245SBram Moolenaar 'endtry', 2451f8103f27SBram Moolenaar ], 'E1144:') 24522c5ed4e3SBram Moolenaar CheckScriptFailure([ 24532c5ed4e3SBram Moolenaar 'vim9script', 24542c5ed4e3SBram Moolenaar 'try# comment', 24552c5ed4e3SBram Moolenaar 'echo "yes"', 2456f8103f27SBram Moolenaar ], 'E1144:') 24577a092245SBram Moolenaar CheckDefFailure([ 24587a092245SBram Moolenaar 'try', 2459a72cfb80SBram Moolenaar ' throw#comment', 2460a72cfb80SBram Moolenaar 'catch', 2461a72cfb80SBram Moolenaar 'endtry', 2462f8103f27SBram Moolenaar ], 'E1144:') 2463a72cfb80SBram Moolenaar CheckDefFailure([ 2464a72cfb80SBram Moolenaar 'try', 2465a72cfb80SBram Moolenaar ' throw "yes"#comment', 2466a72cfb80SBram Moolenaar 'catch', 2467a72cfb80SBram Moolenaar 'endtry', 2468a72cfb80SBram Moolenaar ], 'E488:') 2469a72cfb80SBram Moolenaar CheckDefFailure([ 2470a72cfb80SBram Moolenaar 'try', 24717a092245SBram Moolenaar ' echo "yes"', 24727a092245SBram Moolenaar 'catch# comment', 24737a092245SBram Moolenaar 'endtry', 2474f8103f27SBram Moolenaar ], 'E1144:') 24752c5ed4e3SBram Moolenaar CheckScriptFailure([ 24762c5ed4e3SBram Moolenaar 'vim9script', 24772c5ed4e3SBram Moolenaar 'try', 24782c5ed4e3SBram Moolenaar ' echo "yes"', 24792c5ed4e3SBram Moolenaar 'catch# comment', 24802c5ed4e3SBram Moolenaar 'endtry', 2481f8103f27SBram Moolenaar ], 'E1144:') 24822c5ed4e3SBram Moolenaar CheckDefFailure([ 24832c5ed4e3SBram Moolenaar 'try', 24842c5ed4e3SBram Moolenaar ' echo "yes"', 24852c5ed4e3SBram Moolenaar 'catch /pat/# comment', 24862c5ed4e3SBram Moolenaar 'endtry', 24872c5ed4e3SBram Moolenaar ], 'E488:') 24887a092245SBram Moolenaar CheckDefFailure([ 24897a092245SBram Moolenaar 'try', 24907a092245SBram Moolenaar 'echo "yes"', 24917a092245SBram Moolenaar 'catch', 24927a092245SBram Moolenaar 'endtry# comment', 2493f8103f27SBram Moolenaar ], 'E1144:') 24942c5ed4e3SBram Moolenaar CheckScriptFailure([ 24952c5ed4e3SBram Moolenaar 'vim9script', 24962c5ed4e3SBram Moolenaar 'try', 24972c5ed4e3SBram Moolenaar ' echo "yes"', 24982c5ed4e3SBram Moolenaar 'catch', 24992c5ed4e3SBram Moolenaar 'endtry# comment', 2500f8103f27SBram Moolenaar ], 'E1144:') 25012c5ed4e3SBram Moolenaar 25022c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25032c5ed4e3SBram Moolenaar 'vim9script', 25042c5ed4e3SBram Moolenaar 'hi # comment', 25052c5ed4e3SBram Moolenaar ]) 25062c5ed4e3SBram Moolenaar CheckScriptFailure([ 25072c5ed4e3SBram Moolenaar 'vim9script', 25082c5ed4e3SBram Moolenaar 'hi# comment', 2509f8103f27SBram Moolenaar ], 'E1144:') 25101966c248SBram Moolenaar CheckScriptSuccess([ 25111966c248SBram Moolenaar 'vim9script', 25121966c248SBram Moolenaar 'hi Search # comment', 25131966c248SBram Moolenaar ]) 25141966c248SBram Moolenaar CheckScriptFailure([ 25151966c248SBram Moolenaar 'vim9script', 25161966c248SBram Moolenaar 'hi Search# comment', 25171966c248SBram Moolenaar ], 'E416:') 25181966c248SBram Moolenaar CheckScriptSuccess([ 25191966c248SBram Moolenaar 'vim9script', 25201966c248SBram Moolenaar 'hi link This Search # comment', 25211966c248SBram Moolenaar ]) 25221966c248SBram Moolenaar CheckScriptFailure([ 25231966c248SBram Moolenaar 'vim9script', 25241966c248SBram Moolenaar 'hi link This That# comment', 25251966c248SBram Moolenaar ], 'E413:') 25261966c248SBram Moolenaar CheckScriptSuccess([ 25271966c248SBram Moolenaar 'vim9script', 25281966c248SBram Moolenaar 'hi clear This # comment', 25291966c248SBram Moolenaar 'hi clear # comment', 25301966c248SBram Moolenaar ]) 2531f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2532f5be8cdbSBram Moolenaar # hi clear This# comment', 25331966c248SBram Moolenaar CheckScriptFailure([ 25341966c248SBram Moolenaar 'vim9script', 25351966c248SBram Moolenaar 'hi clear# comment', 25361966c248SBram Moolenaar ], 'E416:') 25371966c248SBram Moolenaar 25381966c248SBram Moolenaar CheckScriptSuccess([ 25391966c248SBram Moolenaar 'vim9script', 25401966c248SBram Moolenaar 'hi Group term=bold', 25411966c248SBram Moolenaar 'match Group /todo/ # comment', 25421966c248SBram Moolenaar ]) 25431966c248SBram Moolenaar CheckScriptFailure([ 25441966c248SBram Moolenaar 'vim9script', 25451966c248SBram Moolenaar 'hi Group term=bold', 25461966c248SBram Moolenaar 'match Group /todo/# comment', 25471966c248SBram Moolenaar ], 'E488:') 25481966c248SBram Moolenaar CheckScriptSuccess([ 25491966c248SBram Moolenaar 'vim9script', 25501966c248SBram Moolenaar 'match # comment', 25511966c248SBram Moolenaar ]) 25521966c248SBram Moolenaar CheckScriptFailure([ 25531966c248SBram Moolenaar 'vim9script', 25541966c248SBram Moolenaar 'match# comment', 2555f8103f27SBram Moolenaar ], 'E1144:') 25561966c248SBram Moolenaar CheckScriptSuccess([ 25571966c248SBram Moolenaar 'vim9script', 25581966c248SBram Moolenaar 'match none # comment', 25591966c248SBram Moolenaar ]) 25601966c248SBram Moolenaar CheckScriptFailure([ 25611966c248SBram Moolenaar 'vim9script', 25621966c248SBram Moolenaar 'match none# comment', 25631966c248SBram Moolenaar ], 'E475:') 25641966c248SBram Moolenaar 25651966c248SBram Moolenaar CheckScriptSuccess([ 25661966c248SBram Moolenaar 'vim9script', 25671966c248SBram Moolenaar 'menutrans clear # comment', 25681966c248SBram Moolenaar ]) 25691966c248SBram Moolenaar CheckScriptFailure([ 25701966c248SBram Moolenaar 'vim9script', 25711966c248SBram Moolenaar 'menutrans clear# comment text', 25721966c248SBram Moolenaar ], 'E474:') 25731966c248SBram Moolenaar 25741966c248SBram Moolenaar CheckScriptSuccess([ 25751966c248SBram Moolenaar 'vim9script', 25761966c248SBram Moolenaar 'syntax clear # comment', 25771966c248SBram Moolenaar ]) 25781966c248SBram Moolenaar CheckScriptFailure([ 25791966c248SBram Moolenaar 'vim9script', 25801966c248SBram Moolenaar 'syntax clear# comment text', 25811966c248SBram Moolenaar ], 'E28:') 25821966c248SBram Moolenaar CheckScriptSuccess([ 25831966c248SBram Moolenaar 'vim9script', 25841966c248SBram Moolenaar 'syntax keyword Word some', 25851966c248SBram Moolenaar 'syntax clear Word # comment', 25861966c248SBram Moolenaar ]) 25871966c248SBram Moolenaar CheckScriptFailure([ 25881966c248SBram Moolenaar 'vim9script', 25891966c248SBram Moolenaar 'syntax keyword Word some', 25901966c248SBram Moolenaar 'syntax clear Word# comment text', 25911966c248SBram Moolenaar ], 'E28:') 25921966c248SBram Moolenaar 25931966c248SBram Moolenaar CheckScriptSuccess([ 25941966c248SBram Moolenaar 'vim9script', 25951966c248SBram Moolenaar 'syntax list # comment', 25961966c248SBram Moolenaar ]) 25971966c248SBram Moolenaar CheckScriptFailure([ 25981966c248SBram Moolenaar 'vim9script', 25991966c248SBram Moolenaar 'syntax list# comment text', 26001966c248SBram Moolenaar ], 'E28:') 26011966c248SBram Moolenaar 26021966c248SBram Moolenaar CheckScriptSuccess([ 26031966c248SBram Moolenaar 'vim9script', 26041966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26051966c248SBram Moolenaar ]) 26061966c248SBram Moolenaar CheckScriptFailure([ 26071966c248SBram Moolenaar 'vim9script', 26081966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26091966c248SBram Moolenaar ], 'E475:') 26101966c248SBram Moolenaar 26111966c248SBram Moolenaar CheckScriptSuccess([ 26121966c248SBram Moolenaar 'vim9script', 26131966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26141966c248SBram Moolenaar ]) 26151966c248SBram Moolenaar CheckScriptFailure([ 26161966c248SBram Moolenaar 'vim9script', 26171966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26181966c248SBram Moolenaar ], 'E789:') 26191966c248SBram Moolenaar 26201966c248SBram Moolenaar CheckScriptSuccess([ 26211966c248SBram Moolenaar 'vim9script', 26221966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26231966c248SBram Moolenaar ]) 26241966c248SBram Moolenaar CheckScriptFailure([ 26251966c248SBram Moolenaar 'vim9script', 26261966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26271966c248SBram Moolenaar ], 'E402:') 26281966c248SBram Moolenaar 26291966c248SBram Moolenaar CheckScriptSuccess([ 26301966c248SBram Moolenaar 'vim9script', 26311966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 26321966c248SBram Moolenaar ]) 26331966c248SBram Moolenaar CheckScriptFailure([ 26341966c248SBram Moolenaar 'vim9script', 26351966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 26361966c248SBram Moolenaar ], 'E475:') 26371966c248SBram Moolenaar CheckScriptFailure([ 26381966c248SBram Moolenaar 'vim9script', 26391966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 26401966c248SBram Moolenaar ], 'E406:') 26411966c248SBram Moolenaar CheckScriptFailure([ 26421966c248SBram Moolenaar 'vim9script', 26431966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 26441966c248SBram Moolenaar ], 'E475:') 26451966c248SBram Moolenaar 26461966c248SBram Moolenaar CheckScriptSuccess([ 26471966c248SBram Moolenaar 'vim9script', 26481966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 26491966c248SBram Moolenaar ]) 26501966c248SBram Moolenaar CheckScriptFailure([ 26511966c248SBram Moolenaar 'vim9script', 26521966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2653d032f34aSBram Moolenaar ], 'E402:') 26541966c248SBram Moolenaar 26551966c248SBram Moolenaar CheckScriptSuccess([ 26561966c248SBram Moolenaar 'vim9script', 26571966c248SBram Moolenaar 'syntax sync # comment', 26581966c248SBram Moolenaar ]) 26591966c248SBram Moolenaar CheckScriptFailure([ 26601966c248SBram Moolenaar 'vim9script', 26611966c248SBram Moolenaar 'syntax sync# comment', 26621966c248SBram Moolenaar ], 'E404:') 26631966c248SBram Moolenaar CheckScriptSuccess([ 26641966c248SBram Moolenaar 'vim9script', 26651966c248SBram Moolenaar 'syntax sync ccomment # comment', 26661966c248SBram Moolenaar ]) 26671966c248SBram Moolenaar CheckScriptFailure([ 26681966c248SBram Moolenaar 'vim9script', 26691966c248SBram Moolenaar 'syntax sync ccomment# comment', 26701966c248SBram Moolenaar ], 'E404:') 26711966c248SBram Moolenaar 26721966c248SBram Moolenaar CheckScriptSuccess([ 26731966c248SBram Moolenaar 'vim9script', 26741966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 26751966c248SBram Moolenaar ]) 26761966c248SBram Moolenaar CheckScriptFailure([ 26771966c248SBram Moolenaar 'vim9script', 26781966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 26791966c248SBram Moolenaar ], 'E475:') 2680a72cfb80SBram Moolenaar 2681a72cfb80SBram Moolenaar CheckScriptSuccess([ 2682a72cfb80SBram Moolenaar 'vim9script', 2683a72cfb80SBram Moolenaar 'command Echo echo # comment', 2684a72cfb80SBram Moolenaar 'command Echo # comment', 26852d870f8dSBram Moolenaar 'delcommand Echo', 2686a72cfb80SBram Moolenaar ]) 2687a72cfb80SBram Moolenaar CheckScriptFailure([ 2688a72cfb80SBram Moolenaar 'vim9script', 2689a72cfb80SBram Moolenaar 'command Echo echo# comment', 2690a72cfb80SBram Moolenaar 'Echo', 2691f8103f27SBram Moolenaar ], 'E1144:') 26922d870f8dSBram Moolenaar delcommand Echo 269370249ee8SBram Moolenaar 269470249ee8SBram Moolenaar var curdir = getcwd() 269570249ee8SBram Moolenaar CheckScriptSuccess([ 269670249ee8SBram Moolenaar 'command Echo cd " comment', 269770249ee8SBram Moolenaar 'Echo', 269870249ee8SBram Moolenaar 'delcommand Echo', 269970249ee8SBram Moolenaar ]) 270070249ee8SBram Moolenaar CheckScriptSuccess([ 2701090728adSBram Moolenaar 'vim9script', 270270249ee8SBram Moolenaar 'command Echo cd # comment', 270370249ee8SBram Moolenaar 'Echo', 270470249ee8SBram Moolenaar 'delcommand Echo', 270570249ee8SBram Moolenaar ]) 270670249ee8SBram Moolenaar CheckScriptFailure([ 270770249ee8SBram Moolenaar 'vim9script', 270870249ee8SBram Moolenaar 'command Echo cd " comment', 270970249ee8SBram Moolenaar 'Echo', 271070249ee8SBram Moolenaar ], 'E344:') 271170249ee8SBram Moolenaar delcommand Echo 271270249ee8SBram Moolenaar chdir(curdir) 271370249ee8SBram Moolenaar 2714a72cfb80SBram Moolenaar CheckScriptFailure([ 2715a72cfb80SBram Moolenaar 'vim9script', 2716a72cfb80SBram Moolenaar 'command Echo# comment', 2717a72cfb80SBram Moolenaar ], 'E182:') 2718a72cfb80SBram Moolenaar CheckScriptFailure([ 2719a72cfb80SBram Moolenaar 'vim9script', 2720a72cfb80SBram Moolenaar 'command Echo echo', 2721a72cfb80SBram Moolenaar 'command Echo# comment', 2722a72cfb80SBram Moolenaar ], 'E182:') 27232d870f8dSBram Moolenaar delcommand Echo 2724a72cfb80SBram Moolenaar 2725a72cfb80SBram Moolenaar CheckScriptSuccess([ 2726a72cfb80SBram Moolenaar 'vim9script', 2727a72cfb80SBram Moolenaar 'function # comment', 2728a72cfb80SBram Moolenaar ]) 2729a72cfb80SBram Moolenaar CheckScriptFailure([ 2730a72cfb80SBram Moolenaar 'vim9script', 27319898107fSBram Moolenaar 'function " comment', 27329898107fSBram Moolenaar ], 'E129:') 27339898107fSBram Moolenaar CheckScriptFailure([ 27349898107fSBram Moolenaar 'vim9script', 2735a72cfb80SBram Moolenaar 'function# comment', 2736f8103f27SBram Moolenaar ], 'E1144:') 2737a72cfb80SBram Moolenaar CheckScriptSuccess([ 2738a72cfb80SBram Moolenaar 'vim9script', 2739a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2740a72cfb80SBram Moolenaar ]) 2741a72cfb80SBram Moolenaar CheckScriptFailure([ 2742a72cfb80SBram Moolenaar 'vim9script', 2743a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2744a72cfb80SBram Moolenaar ], 'E488:') 2745a72cfb80SBram Moolenaar 2746a72cfb80SBram Moolenaar CheckScriptSuccess([ 2747a72cfb80SBram Moolenaar 'vim9script', 27484c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2749a72cfb80SBram Moolenaar 'endfunc', 27504c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2751a72cfb80SBram Moolenaar ]) 2752a72cfb80SBram Moolenaar CheckScriptFailure([ 2753a72cfb80SBram Moolenaar 'vim9script', 27544c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2755a72cfb80SBram Moolenaar 'endfunc', 27564c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2757a72cfb80SBram Moolenaar ], 'E488:') 2758a72cfb80SBram Moolenaar 2759a72cfb80SBram Moolenaar CheckScriptSuccess([ 2760a72cfb80SBram Moolenaar 'vim9script', 2761a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2762a72cfb80SBram Moolenaar ]) 2763a72cfb80SBram Moolenaar CheckScriptFailure([ 2764a72cfb80SBram Moolenaar 'vim9script', 2765a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2766a72cfb80SBram Moolenaar ], 'E488:') 2767e7e4838fSBram Moolenaar 2768e7e4838fSBram Moolenaar CheckScriptFailure([ 2769e7e4838fSBram Moolenaar 'def Test() " comment', 2770e7e4838fSBram Moolenaar 'enddef', 2771e7e4838fSBram Moolenaar ], 'E488:') 2772e7e4838fSBram Moolenaar CheckScriptFailure([ 2773e7e4838fSBram Moolenaar 'vim9script', 2774e7e4838fSBram Moolenaar 'def Test() " comment', 2775e7e4838fSBram Moolenaar 'enddef', 2776e7e4838fSBram Moolenaar ], 'E488:') 2777e7e4838fSBram Moolenaar 2778e7e4838fSBram Moolenaar CheckScriptSuccess([ 2779e7e4838fSBram Moolenaar 'func Test() " comment', 2780e7e4838fSBram Moolenaar 'endfunc', 27812d870f8dSBram Moolenaar 'delfunc Test', 2782e7e4838fSBram Moolenaar ]) 27839898107fSBram Moolenaar CheckScriptSuccess([ 2784e7e4838fSBram Moolenaar 'vim9script', 2785e7e4838fSBram Moolenaar 'func Test() " comment', 2786e7e4838fSBram Moolenaar 'endfunc', 27879898107fSBram Moolenaar ]) 2788e7e4838fSBram Moolenaar 2789e7e4838fSBram Moolenaar CheckScriptSuccess([ 2790e7e4838fSBram Moolenaar 'def Test() # comment', 2791e7e4838fSBram Moolenaar 'enddef', 2792e7e4838fSBram Moolenaar ]) 2793e7e4838fSBram Moolenaar CheckScriptFailure([ 2794e7e4838fSBram Moolenaar 'func Test() # comment', 2795e7e4838fSBram Moolenaar 'endfunc', 2796e7e4838fSBram Moolenaar ], 'E488:') 27972c5ed4e3SBram Moolenaarenddef 27982c5ed4e3SBram Moolenaar 27992c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28002c5ed4e3SBram Moolenaar CheckCanRunGui 28012c5ed4e3SBram Moolenaar 28022c5ed4e3SBram Moolenaar CheckScriptFailure([ 28032c5ed4e3SBram Moolenaar 'vim9script', 28042c5ed4e3SBram Moolenaar 'gui#comment' 2805f8103f27SBram Moolenaar ], 'E1144:') 28062c5ed4e3SBram Moolenaar CheckScriptFailure([ 28072c5ed4e3SBram Moolenaar 'vim9script', 28082c5ed4e3SBram Moolenaar 'gui -f#comment' 28092c5ed4e3SBram Moolenaar ], 'E499:') 28107a092245SBram Moolenaarenddef 28117a092245SBram Moolenaar 2812a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28136797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28146797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2815a26b9700SBram Moolenaar 2816a26b9700SBram Moolenaar edit test.vim 2817a26b9700SBram Moolenaar doautocmd TabEnter #comment 2818a26b9700SBram Moolenaar assert_equal(1, g:entered) 2819a26b9700SBram Moolenaar 2820a26b9700SBram Moolenaar doautocmd TabEnter f.x 2821a26b9700SBram Moolenaar assert_equal(2, g:entered) 2822a26b9700SBram Moolenaar 2823a26b9700SBram Moolenaar g:entered = 0 2824a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2825a26b9700SBram Moolenaar assert_equal(2, g:entered) 2826a26b9700SBram Moolenaar 2827a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2828a26b9700SBram Moolenaar 2829a26b9700SBram Moolenaar au! TabEnter 2830a26b9700SBram Moolenaar unlet g:entered 2831d72c1bf0SBram Moolenaar 2832d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2833d72c1bf0SBram Moolenaar 'vim9script', 28346797966dSBram Moolenaar 'g:var = 123', 2835e55b1c09SBram Moolenaar 'b:var = 456', 2836e55b1c09SBram Moolenaar 'w:var = 777', 2837e55b1c09SBram Moolenaar 't:var = 888', 2838d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2839d72c1bf0SBram Moolenaar ]) 2840d72c1bf0SBram Moolenaar 2841d72c1bf0SBram Moolenaar CheckScriptFailure([ 2842d72c1bf0SBram Moolenaar 'vim9script', 2843cfcd011fSBram Moolenaar 'let var = 123', 2844cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2845cfcd011fSBram Moolenaar 2846cfcd011fSBram Moolenaar CheckScriptFailure([ 2847cfcd011fSBram Moolenaar 'vim9script', 2848cfcd011fSBram Moolenaar 'var g:var = 123', 2849e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2850e55b1c09SBram Moolenaar 2851e55b1c09SBram Moolenaar CheckScriptFailure([ 2852e55b1c09SBram Moolenaar 'vim9script', 2853cfcd011fSBram Moolenaar 'var b:var = 123', 2854e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2855e55b1c09SBram Moolenaar 2856e55b1c09SBram Moolenaar CheckScriptFailure([ 2857e55b1c09SBram Moolenaar 'vim9script', 2858cfcd011fSBram Moolenaar 'var w:var = 123', 2859e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2860e55b1c09SBram Moolenaar 2861e55b1c09SBram Moolenaar CheckScriptFailure([ 2862e55b1c09SBram Moolenaar 'vim9script', 2863cfcd011fSBram Moolenaar 'var t:var = 123', 2864e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2865e55b1c09SBram Moolenaar 2866e55b1c09SBram Moolenaar CheckScriptFailure([ 2867e55b1c09SBram Moolenaar 'vim9script', 2868cfcd011fSBram Moolenaar 'var v:version = 123', 2869e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2870e55b1c09SBram Moolenaar 2871e55b1c09SBram Moolenaar CheckScriptFailure([ 2872e55b1c09SBram Moolenaar 'vim9script', 2873cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2874e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 28756797966dSBram Moolenaar 28766797966dSBram Moolenaar CheckScriptFailure([ 28776797966dSBram Moolenaar 'vim9script', 28786797966dSBram Moolenaar 'g:var = 123', 287932e35117SBram Moolenaar 'unlet g:var# comment1', 2880d72c1bf0SBram Moolenaar ], 'E108:') 2881d72c1bf0SBram Moolenaar 2882d72c1bf0SBram Moolenaar CheckScriptFailure([ 2883d72c1bf0SBram Moolenaar 'let g:var = 123', 2884d72c1bf0SBram Moolenaar 'unlet g:var # something', 2885d72c1bf0SBram Moolenaar ], 'E488:') 2886faac4104SBram Moolenaar 2887faac4104SBram Moolenaar CheckScriptSuccess([ 2888faac4104SBram Moolenaar 'vim9script', 288932e35117SBram Moolenaar 'if 1 # comment2', 2890faac4104SBram Moolenaar ' echo "yes"', 2891faac4104SBram Moolenaar 'elseif 2 #comment', 2892faac4104SBram Moolenaar ' echo "no"', 2893faac4104SBram Moolenaar 'endif', 2894faac4104SBram Moolenaar ]) 2895faac4104SBram Moolenaar 2896faac4104SBram Moolenaar CheckScriptFailure([ 2897faac4104SBram Moolenaar 'vim9script', 289832e35117SBram Moolenaar 'if 1# comment3', 2899faac4104SBram Moolenaar ' echo "yes"', 2900faac4104SBram Moolenaar 'endif', 2901faac4104SBram Moolenaar ], 'E15:') 2902faac4104SBram Moolenaar 2903faac4104SBram Moolenaar CheckScriptFailure([ 2904faac4104SBram Moolenaar 'vim9script', 290532e35117SBram Moolenaar 'if 0 # comment4', 2906faac4104SBram Moolenaar ' echo "yes"', 2907faac4104SBram Moolenaar 'elseif 2#comment', 2908faac4104SBram Moolenaar ' echo "no"', 2909faac4104SBram Moolenaar 'endif', 2910faac4104SBram Moolenaar ], 'E15:') 2911faac4104SBram Moolenaar 2912faac4104SBram Moolenaar CheckScriptSuccess([ 2913faac4104SBram Moolenaar 'vim9script', 2914cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2915faac4104SBram Moolenaar ]) 2916faac4104SBram Moolenaar 2917faac4104SBram Moolenaar CheckScriptFailure([ 2918faac4104SBram Moolenaar 'vim9script', 2919cfcd011fSBram Moolenaar 'var v = 1# comment6', 292032e35117SBram Moolenaar ], 'E15:') 2921faac4104SBram Moolenaar 2922faac4104SBram Moolenaar CheckScriptSuccess([ 2923faac4104SBram Moolenaar 'vim9script', 2924faac4104SBram Moolenaar 'new' 2925d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2926df069eecSBram Moolenaar ':$', 2927faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2928faac4104SBram Moolenaar 'bwipe!', 2929faac4104SBram Moolenaar ]) 2930faac4104SBram Moolenaar 2931f5be8cdbSBram Moolenaar CheckScriptFailure([ 2932f5be8cdbSBram Moolenaar 'vim9script', 2933f5be8cdbSBram Moolenaar 'new' 2934d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2935f5be8cdbSBram Moolenaar ':$', 2936f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2937f5be8cdbSBram Moolenaar 'bwipe!', 2938f5be8cdbSBram Moolenaar ], 'E488:') 2939f5be8cdbSBram Moolenaar 2940f5be8cdbSBram Moolenaar CheckScriptFailure([ 2941f5be8cdbSBram Moolenaar 'vim9script', 2942f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2943f5be8cdbSBram Moolenaar ], 'E477:') 2944a26b9700SBram Moolenaarenddef 2945a26b9700SBram Moolenaar 29467e5bd91dSBram Moolenaardef Test_finish() 2947cfcd011fSBram Moolenaar var lines =<< trim END 29487e5bd91dSBram Moolenaar vim9script 29496797966dSBram Moolenaar g:res = 'one' 29507e5bd91dSBram Moolenaar if v:false | finish | endif 29516797966dSBram Moolenaar g:res = 'two' 29527e5bd91dSBram Moolenaar finish 29536797966dSBram Moolenaar g:res = 'three' 29547e5bd91dSBram Moolenaar END 29557e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 29567e5bd91dSBram Moolenaar source Xfinished 29577e5bd91dSBram Moolenaar assert_equal('two', g:res) 29587e5bd91dSBram Moolenaar 29597e5bd91dSBram Moolenaar unlet g:res 29607e5bd91dSBram Moolenaar delete('Xfinished') 29617e5bd91dSBram Moolenaarenddef 29627e5bd91dSBram Moolenaar 2963a5d0077eSBram Moolenaardef Test_forward_declaration() 2964cfcd011fSBram Moolenaar var lines =<< trim END 2965a5d0077eSBram Moolenaar vim9script 2966a5d0077eSBram Moolenaar def GetValue(): string 2967a5d0077eSBram Moolenaar return theVal 2968a5d0077eSBram Moolenaar enddef 2969cfcd011fSBram Moolenaar var theVal = 'something' 2970822ba247SBram Moolenaar g:initVal = GetValue() 2971a5d0077eSBram Moolenaar theVal = 'else' 2972a5d0077eSBram Moolenaar g:laterVal = GetValue() 2973a5d0077eSBram Moolenaar END 2974a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2975a5d0077eSBram Moolenaar source Xforward 2976a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2977a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2978a5d0077eSBram Moolenaar 2979a5d0077eSBram Moolenaar unlet g:initVal 2980a5d0077eSBram Moolenaar unlet g:laterVal 2981a5d0077eSBram Moolenaar delete('Xforward') 2982a5d0077eSBram Moolenaarenddef 2983a5d0077eSBram Moolenaar 29849721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2985a6294955SBram Moolenaar var vim9_lines =<< trim END 2986a6294955SBram Moolenaar vim9script 2987a6294955SBram Moolenaar var local = 'local' 2988a6294955SBram Moolenaar g:global = 'global' 2989a6294955SBram Moolenaar export var exported = 'exported' 2990a6294955SBram Moolenaar export def GetText(): string 2991a6294955SBram Moolenaar return 'text' 2992a6294955SBram Moolenaar enddef 2993a6294955SBram Moolenaar END 2994a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 2995a6294955SBram Moolenaar 2996cfcd011fSBram Moolenaar var legacy_lines =<< trim END 29979721fb4eSBram Moolenaar source Xvim9_script.vim 29989721fb4eSBram Moolenaar 29999721fb4eSBram Moolenaar call assert_false(exists('local')) 30009721fb4eSBram Moolenaar call assert_false(exists('exported')) 30019721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30029721fb4eSBram Moolenaar call assert_equal('global', global) 30039721fb4eSBram Moolenaar call assert_equal('global', g:global) 30049721fb4eSBram Moolenaar 30059721fb4eSBram Moolenaar " imported variable becomes script-local 30069721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30079721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30089721fb4eSBram Moolenaar call assert_false(exists('exported')) 30099721fb4eSBram Moolenaar 30109721fb4eSBram Moolenaar " imported function becomes script-local 30119721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30129721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30139721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30149721fb4eSBram Moolenaar END 30159721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30169721fb4eSBram Moolenaar 30179721fb4eSBram Moolenaar source Xlegacy_script.vim 30189721fb4eSBram Moolenaar assert_equal('global', g:global) 3019f5be8cdbSBram Moolenaar unlet g:global 30209721fb4eSBram Moolenaar 30219721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30229721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30239721fb4eSBram Moolenaarenddef 3024a5d0077eSBram Moolenaar 30257d699701SBram Moolenaarfunc Test_vim9script_not_global() 30267d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30277d699701SBram Moolenaar let vim9lines =<< trim END 30287d699701SBram Moolenaar vim9script 3029cfcd011fSBram Moolenaar var name = 'local' 30307d699701SBram Moolenaar func TheFunc() 30317d699701SBram Moolenaar echo 'local' 30327d699701SBram Moolenaar endfunc 30337d699701SBram Moolenaar def DefFunc() 30347d699701SBram Moolenaar echo 'local' 30357d699701SBram Moolenaar enddef 30367d699701SBram Moolenaar END 30377d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 30387d699701SBram Moolenaar source Xvim9script.vim 30397d699701SBram Moolenaar try 30407d699701SBram Moolenaar echo g:var 30417d699701SBram Moolenaar assert_report('did not fail') 30427d699701SBram Moolenaar catch /E121:/ 30437d699701SBram Moolenaar " caught 30447d699701SBram Moolenaar endtry 30457d699701SBram Moolenaar try 30467d699701SBram Moolenaar call TheFunc() 30477d699701SBram Moolenaar assert_report('did not fail') 30487d699701SBram Moolenaar catch /E117:/ 30497d699701SBram Moolenaar " caught 30507d699701SBram Moolenaar endtry 30517d699701SBram Moolenaar try 30527d699701SBram Moolenaar call DefFunc() 30537d699701SBram Moolenaar assert_report('did not fail') 30547d699701SBram Moolenaar catch /E117:/ 30557d699701SBram Moolenaar " caught 30567d699701SBram Moolenaar endtry 30577d699701SBram Moolenaar 305825859dd7SBram Moolenaar call delete('Xvim9script.vim') 30597d699701SBram Moolenaarendfunc 30607d699701SBram Moolenaar 3061eeb27bfeSBram Moolenaardef Test_vim9_copen() 3062eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3063eeb27bfeSBram Moolenaar copen 3064eeb27bfeSBram Moolenaar quit 3065eeb27bfeSBram Moolenaarenddef 3066eeb27bfeSBram Moolenaar 306703290b84SBram Moolenaar" test using an auto-loaded function and variable 30682d6b20d6SBram Moolenaardef Test_vim9_autoload() 3069cfcd011fSBram Moolenaar var lines =<< trim END 30702d6b20d6SBram Moolenaar vim9script 307103290b84SBram Moolenaar def some#gettest(): string 307203290b84SBram Moolenaar return 'test' 307303290b84SBram Moolenaar enddef 307403290b84SBram Moolenaar g:some#name = 'name' 307503290b84SBram Moolenaar END 307603290b84SBram Moolenaar 307703290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 307803290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 307903290b84SBram Moolenaar var save_rtp = &rtp 308003290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 308103290b84SBram Moolenaar 308203290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 308303290b84SBram Moolenaar assert_equal('name', g:some#name) 308403290b84SBram Moolenaar g:some#other = 'other' 308503290b84SBram Moolenaar assert_equal('other', g:some#other) 308603290b84SBram Moolenaar 308717f700acSBram Moolenaar # upper case script name works 308817f700acSBram Moolenaar lines =<< trim END 308917f700acSBram Moolenaar vim9script 309017f700acSBram Moolenaar def Other#getOther(): string 309117f700acSBram Moolenaar return 'other' 309217f700acSBram Moolenaar enddef 309317f700acSBram Moolenaar END 309417f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 309517f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 309617f700acSBram Moolenaar 309703290b84SBram Moolenaar delete('Xdir', 'rf') 309803290b84SBram Moolenaar &rtp = save_rtp 309903290b84SBram Moolenaarenddef 310003290b84SBram Moolenaar 310103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 310203290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 310303290b84SBram Moolenaar var lines =<< trim END 310403290b84SBram Moolenaar vim9script 31052d6b20d6SBram Moolenaar def foo#test() 31062d6b20d6SBram Moolenaar echomsg getreg('"') 31072d6b20d6SBram Moolenaar enddef 31082d6b20d6SBram Moolenaar END 31092d6b20d6SBram Moolenaar 31102d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31112d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3112cfcd011fSBram Moolenaar var save_rtp = &rtp 31132d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31142d6b20d6SBram Moolenaar augroup test 31152d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31162d6b20d6SBram Moolenaar augroup END 31172d6b20d6SBram Moolenaar 31182d6b20d6SBram Moolenaar normal Y 31192d6b20d6SBram Moolenaar 31202d6b20d6SBram Moolenaar augroup test 31212d6b20d6SBram Moolenaar autocmd! 31222d6b20d6SBram Moolenaar augroup END 31232d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31242d6b20d6SBram Moolenaar &rtp = save_rtp 31252d6b20d6SBram Moolenaarenddef 31262d6b20d6SBram Moolenaar 312777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 312877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3129cfcd011fSBram Moolenaar var lines =<< trim END 313077e5dcc3SBram Moolenaar vim9script 313177e5dcc3SBram Moolenaar def crash#func() 313277e5dcc3SBram Moolenaar try 313377e5dcc3SBram Moolenaar for x in List() 313477e5dcc3SBram Moolenaar endfor 313577e5dcc3SBram Moolenaar catch 313677e5dcc3SBram Moolenaar endtry 313777e5dcc3SBram Moolenaar g:ok = true 313877e5dcc3SBram Moolenaar enddef 313977e5dcc3SBram Moolenaar fu List() 314077e5dcc3SBram Moolenaar invalid 314177e5dcc3SBram Moolenaar endfu 314277e5dcc3SBram Moolenaar try 314348e11c10SBram Moolenaar alsoinvalid 314477e5dcc3SBram Moolenaar catch /wontmatch/ 314577e5dcc3SBram Moolenaar endtry 314677e5dcc3SBram Moolenaar END 314777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 314877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 314977e5dcc3SBram Moolenaar 315077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 315177e5dcc3SBram Moolenaar lines =<< trim END 315277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 315377e5dcc3SBram Moolenaar call crash#func() 315477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 31559c4f5520SBram Moolenaar qall! 315677e5dcc3SBram Moolenaar END 315777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 315877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 315977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 316077e5dcc3SBram Moolenaar 316177e5dcc3SBram Moolenaar delete('Xdidit') 316277e5dcc3SBram Moolenaar delete('Xscript') 316377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 316403290b84SBram Moolenaar 316503290b84SBram Moolenaar lines =<< trim END 316603290b84SBram Moolenaar vim9script 316703290b84SBram Moolenaar var foo#bar = 'asdf' 316803290b84SBram Moolenaar END 316903290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 317077e5dcc3SBram Moolenaarenddef 317177e5dcc3SBram Moolenaar 317281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 317381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 317481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3175cfcd011fSBram Moolenaar var lines =<< trim END 317681e17fbeSBram Moolenaar let s:counter = 1 317781e17fbeSBram Moolenaar def s:Func() 317881e17fbeSBram Moolenaar au! CursorHold 317981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 318081e17fbeSBram Moolenaar enddef 318181e17fbeSBram Moolenaar call s:Func() 318281e17fbeSBram Moolenaar doau CursorHold 318381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 318481e17fbeSBram Moolenaar au! CursorHold 318581e17fbeSBram Moolenaar END 318681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 318781e17fbeSBram Moolenaarenddef 318881e17fbeSBram Moolenaar 31893896a105SBram Moolenaardef Test_cmdline_win() 31903896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 31913896a105SBram Moolenaar # the command line window. 31923896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3193cfcd011fSBram Moolenaar var export_lines =<< trim END 31943896a105SBram Moolenaar vim9script 3195cfcd011fSBram Moolenaar export var That = 'yes' 31963896a105SBram Moolenaar END 31973896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3198cfcd011fSBram Moolenaar var import_lines =<< trim END 31993896a105SBram Moolenaar vim9script 32003896a105SBram Moolenaar import That from './Xexport.vim' 32013896a105SBram Moolenaar END 32023896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3203cfcd011fSBram Moolenaar var save_rtp = &rtp 32043896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32053896a105SBram Moolenaar syntax on 32063896a105SBram Moolenaar augroup CmdWin 32073896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32083896a105SBram Moolenaar augroup END 32093896a105SBram Moolenaar # this will open and also close the cmdline window 32103896a105SBram Moolenaar feedkeys('q:', 'xt') 32113896a105SBram Moolenaar assert_equal('yes', g:got_there) 32123896a105SBram Moolenaar 32133896a105SBram Moolenaar augroup CmdWin 32143896a105SBram Moolenaar au! 32153896a105SBram Moolenaar augroup END 32163896a105SBram Moolenaar &rtp = save_rtp 32173896a105SBram Moolenaar delete('rtp', 'rf') 32183896a105SBram Moolenaarenddef 32193896a105SBram Moolenaar 3220e3d4685fSBram Moolenaardef Test_invalid_sid() 3221e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 322225859dd7SBram Moolenaar 32239c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3224d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3225e3d4685fSBram Moolenaar endif 3226e3d4685fSBram Moolenaar delete('Xdidit') 3227e3d4685fSBram Moolenaarenddef 3228e3d4685fSBram Moolenaar 32299ec7026fSBram Moolenaardef Test_restoring_cpo() 32309ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 32319ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 32329ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 32339ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 32349ec7026fSBram Moolenaar endif 32359ec7026fSBram Moolenaar delete('Xsourced') 32369ec7026fSBram Moolenaar delete('Xclose') 3237090728adSBram Moolenaar delete('Xdone') 32380123cc1eSBram Moolenaar 32390123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 32400123cc1eSBram Moolenaar set cpo=aABceFsMny> 32410123cc1eSBram Moolenaar edit XanotherScript 32420123cc1eSBram Moolenaar so % 32430123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32440123cc1eSBram Moolenaar :1del 32450123cc1eSBram Moolenaar w 32460123cc1eSBram Moolenaar so % 32470123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 32480123cc1eSBram Moolenaar 32490123cc1eSBram Moolenaar delete('XanotherScript') 32500123cc1eSBram Moolenaar set cpo&vim 32519ec7026fSBram Moolenaarenddef 32529ec7026fSBram Moolenaar 32539ec7026fSBram Moolenaar 3254f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3255cfcd011fSBram Moolenaar var lines =<< trim END 3256cfcd011fSBram Moolenaar var name: any 3257cfcd011fSBram Moolenaar assert_equal(0, name) 3258f0afd9e1SBram Moolenaar END 3259f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3260f0afd9e1SBram Moolenaarenddef 3261f0afd9e1SBram Moolenaar 32627e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 326358dbef33SBram Moolenaar CheckRunVimInTerminal 326458dbef33SBram Moolenaar 32657e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 32667e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 32677e9210eaSBram Moolenaarendfunc 32687e9210eaSBram Moolenaar 32697e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 32709c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3271cfcd011fSBram Moolenaar var lines =<< trim END 32729c4f5520SBram Moolenaar func CheckAndQuit() 32739c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 32749c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 32759c4f5520SBram Moolenaar endfunc 32769c4f5520SBram Moolenaar END 32779c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 32789c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3279e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 32809c4f5520SBram Moolenaar # define Afunc() on the command line 32819c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 32829c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 32832949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 32849c4f5520SBram Moolenaar 32859c4f5520SBram Moolenaar call StopVimInTerminal(buf) 32869c4f5520SBram Moolenaar delete('XcallFunc') 32879c4f5520SBram Moolenaar delete('Xdidcmd') 32889c4f5520SBram Moolenaarenddef 32899c4f5520SBram Moolenaar 3290fcdc5d83SBram Moolenaardef Test_script_var_scope() 3291fcdc5d83SBram Moolenaar var lines =<< trim END 3292fcdc5d83SBram Moolenaar vim9script 3293fcdc5d83SBram Moolenaar if true 3294fcdc5d83SBram Moolenaar if true 3295fcdc5d83SBram Moolenaar var one = 'one' 3296fcdc5d83SBram Moolenaar echo one 3297fcdc5d83SBram Moolenaar endif 3298fcdc5d83SBram Moolenaar echo one 3299fcdc5d83SBram Moolenaar endif 3300fcdc5d83SBram Moolenaar END 3301fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3302fcdc5d83SBram Moolenaar 3303fcdc5d83SBram Moolenaar lines =<< trim END 3304fcdc5d83SBram Moolenaar vim9script 3305fcdc5d83SBram Moolenaar if true 3306fcdc5d83SBram Moolenaar if false 3307fcdc5d83SBram Moolenaar var one = 'one' 3308fcdc5d83SBram Moolenaar echo one 3309fcdc5d83SBram Moolenaar else 3310fcdc5d83SBram Moolenaar var one = 'one' 3311fcdc5d83SBram Moolenaar echo one 3312fcdc5d83SBram Moolenaar endif 3313fcdc5d83SBram Moolenaar echo one 3314fcdc5d83SBram Moolenaar endif 3315fcdc5d83SBram Moolenaar END 3316fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3317fcdc5d83SBram Moolenaar 3318fcdc5d83SBram Moolenaar lines =<< trim END 3319fcdc5d83SBram Moolenaar vim9script 3320fcdc5d83SBram Moolenaar while true 3321fcdc5d83SBram Moolenaar var one = 'one' 3322fcdc5d83SBram Moolenaar echo one 3323fcdc5d83SBram Moolenaar break 3324fcdc5d83SBram Moolenaar endwhile 3325fcdc5d83SBram Moolenaar echo one 3326fcdc5d83SBram Moolenaar END 3327fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3328fcdc5d83SBram Moolenaar 3329fcdc5d83SBram Moolenaar lines =<< trim END 3330fcdc5d83SBram Moolenaar vim9script 3331fcdc5d83SBram Moolenaar for i in range(1) 3332fcdc5d83SBram Moolenaar var one = 'one' 3333fcdc5d83SBram Moolenaar echo one 3334fcdc5d83SBram Moolenaar endfor 3335fcdc5d83SBram Moolenaar echo one 3336fcdc5d83SBram Moolenaar END 3337fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 33389becdf2bSBram Moolenaar 33399becdf2bSBram Moolenaar lines =<< trim END 33409becdf2bSBram Moolenaar vim9script 33419becdf2bSBram Moolenaar { 33429becdf2bSBram Moolenaar var one = 'one' 33439becdf2bSBram Moolenaar assert_equal('one', one) 33449becdf2bSBram Moolenaar } 33459becdf2bSBram Moolenaar assert_false(exists('one')) 33469becdf2bSBram Moolenaar assert_false(exists('s:one')) 33479becdf2bSBram Moolenaar END 33489becdf2bSBram Moolenaar CheckScriptSuccess(lines) 33499becdf2bSBram Moolenaar 33509becdf2bSBram Moolenaar lines =<< trim END 33519becdf2bSBram Moolenaar vim9script 33529becdf2bSBram Moolenaar { 33539becdf2bSBram Moolenaar var one = 'one' 33549becdf2bSBram Moolenaar echo one 33559becdf2bSBram Moolenaar } 33569becdf2bSBram Moolenaar echo one 33579becdf2bSBram Moolenaar END 33589becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3359fcdc5d83SBram Moolenaarenddef 3360fcdc5d83SBram Moolenaar 3361352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3362352134bbSBram Moolenaar var lines =<< trim END 3363352134bbSBram Moolenaar vim9script 3364352134bbSBram Moolenaar def Callback(...l: any) 3365352134bbSBram Moolenaar try 3366352134bbSBram Moolenaar var x: string 3367352134bbSBram Moolenaar var y: string 3368352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3369352134bbSBram Moolenaar [x, y] = [''] 3370352134bbSBram Moolenaar catch 3371352134bbSBram Moolenaar g:caught = 'yes' 3372352134bbSBram Moolenaar endtry 3373352134bbSBram Moolenaar enddef 3374e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3375352134bbSBram Moolenaar feedkeys("\r", 'xt') 3376352134bbSBram Moolenaar END 3377352134bbSBram Moolenaar CheckScriptSuccess(lines) 3378352134bbSBram Moolenaar 3379352134bbSBram Moolenaar unlet g:caught 3380352134bbSBram Moolenaarenddef 3381352134bbSBram Moolenaar 3382631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3383631e8f93SBram Moolenaar if !has('unix') || !has('job') 3384631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3385631e8f93SBram Moolenaar endif 3386631e8f93SBram Moolenaar var lines =<< trim END 3387631e8f93SBram Moolenaar vim9script 3388631e8f93SBram Moolenaar var source: list<number> 3389631e8f93SBram Moolenaar def Out_cb(...l: any) 3390631e8f93SBram Moolenaar eval [][0] 3391631e8f93SBram Moolenaar enddef 3392631e8f93SBram Moolenaar def Exit_cb(...l: any) 3393631e8f93SBram Moolenaar sleep 1m 3394631e8f93SBram Moolenaar source += l 3395631e8f93SBram Moolenaar enddef 3396e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 33976f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 33986f17a3f0SBram Moolenaar sleep 10m 33996f17a3f0SBram Moolenaar endwhile 3400206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3401206c2a6eSBram Moolenaar sleep 100m 3402631e8f93SBram Moolenaar END 3403631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3404631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3405631e8f93SBram Moolenaar delete('Xdef') 3406631e8f93SBram Moolenaarenddef 3407631e8f93SBram Moolenaar 34084324d87aSBram Moolenaardef InvokeNormal() 34094324d87aSBram Moolenaar exe "norm! :m+1\r" 34104324d87aSBram Moolenaarenddef 34114324d87aSBram Moolenaar 34124324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 34134324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 34144324d87aSBram Moolenaar new 34154324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 34164324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 34174324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 34184324d87aSBram Moolenaar xunmap <F3> 3419b5b9480eSBram Moolenaarenddef 3420b5b9480eSBram Moolenaar 3421b5b9480eSBram Moolenaardef Test_white_space_after_command() 3422b5b9480eSBram Moolenaar var lines =<< trim END 3423b5b9480eSBram Moolenaar exit_cb: Func}) 3424b5b9480eSBram Moolenaar END 3425b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3426f8103f27SBram Moolenaar 3427f8103f27SBram Moolenaar lines =<< trim END 3428f8103f27SBram Moolenaar e# 3429f8103f27SBram Moolenaar END 3430f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 34314324d87aSBram Moolenaarenddef 34324324d87aSBram Moolenaar 34334aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 34344aab88d9SBram Moolenaar var lines =<< trim END 34354aab88d9SBram Moolenaar vim9script 34364aab88d9SBram Moolenaar if exists('g:guard') 34374aab88d9SBram Moolenaar finish 34384aab88d9SBram Moolenaar endif 34394aab88d9SBram Moolenaar g:guard = 1 34404aab88d9SBram Moolenaar var name = 'thename' 34414aab88d9SBram Moolenaar def g:GetName(): string 34424aab88d9SBram Moolenaar return name 34434aab88d9SBram Moolenaar enddef 34444aab88d9SBram Moolenaar def g:SetName(arg: string) 34454aab88d9SBram Moolenaar name = arg 34464aab88d9SBram Moolenaar enddef 34474aab88d9SBram Moolenaar END 34484aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 34494aab88d9SBram Moolenaar so XscriptTwice.vim 34504aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 34514aab88d9SBram Moolenaar g:SetName('newname') 34524aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 34534aab88d9SBram Moolenaar so XscriptTwice.vim 34544aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34554aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 34564aab88d9SBram Moolenaar 34574aab88d9SBram Moolenaar delfunc g:GetName 34584aab88d9SBram Moolenaar delfunc g:SetName 34594aab88d9SBram Moolenaar delete('XscriptTwice.vim') 34604aab88d9SBram Moolenaar unlet g:guard 34614aab88d9SBram Moolenaarenddef 34624aab88d9SBram Moolenaar 34634aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 34644aab88d9SBram Moolenaar var exportlines =<< trim END 34654aab88d9SBram Moolenaar vim9script 34664aab88d9SBram Moolenaar if exists('g:guard') 34674aab88d9SBram Moolenaar finish 34684aab88d9SBram Moolenaar endif 34694aab88d9SBram Moolenaar g:guard = 1 34704aab88d9SBram Moolenaar export var name = 'someName' 34714aab88d9SBram Moolenaar END 34724aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 34734aab88d9SBram Moolenaar 34744aab88d9SBram Moolenaar var lines =<< trim END 34754aab88d9SBram Moolenaar vim9script 34764aab88d9SBram Moolenaar import name from './XexportScript.vim' 34774aab88d9SBram Moolenaar def g:GetName(): string 34784aab88d9SBram Moolenaar return name 34794aab88d9SBram Moolenaar enddef 34804aab88d9SBram Moolenaar END 34814aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 34824aab88d9SBram Moolenaar so XscriptImport.vim 34834aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 34844aab88d9SBram Moolenaar 34854aab88d9SBram Moolenaar so XexportScript.vim 34864aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 34874aab88d9SBram Moolenaar 34884aab88d9SBram Moolenaar delfunc g:GetName 34894aab88d9SBram Moolenaar delete('XexportScript.vim') 34904aab88d9SBram Moolenaar delete('XscriptImport.vim') 34914aab88d9SBram Moolenaar unlet g:guard 34924aab88d9SBram Moolenaarenddef 34934aab88d9SBram Moolenaar 3494585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3495585fea7bSBram Moolenaardef Test_substitute_cmd() 3496585fea7bSBram Moolenaar new 3497585fea7bSBram Moolenaar setline(1, 'something') 3498585fea7bSBram Moolenaar :substitute(some(other( 3499585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3500585fea7bSBram Moolenaar bwipe! 3501585fea7bSBram Moolenaar 3502f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3503cfcd011fSBram Moolenaar var lines =<< trim END 3504585fea7bSBram Moolenaar vim9script 3505585fea7bSBram Moolenaar new 3506585fea7bSBram Moolenaar setline(1, 'something') 3507585fea7bSBram Moolenaar :substitute(some(other( 3508585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3509585fea7bSBram Moolenaar bwipe! 3510585fea7bSBram Moolenaar END 3511585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3512585fea7bSBram Moolenaar source Xvim9lines 3513585fea7bSBram Moolenaar 3514585fea7bSBram Moolenaar delete('Xvim9lines') 3515585fea7bSBram Moolenaarenddef 3516585fea7bSBram Moolenaar 35178a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3518