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) 2613f1e9f00SBram Moolenaar 2623f1e9f00SBram Moolenaar {|echo 'yes'|} 2638a7d6542SBram Moolenaarenddef 2648a7d6542SBram Moolenaar 26508052228SBram Moolenaardef Test_block_failure() 266cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26708052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26808052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 26908052228SBram Moolenaarenddef 2708a7d6542SBram Moolenaar 271fbbcd003SBram Moolenaardef Test_block_local_vars() 272fbbcd003SBram Moolenaar var lines =<< trim END 273fbbcd003SBram Moolenaar vim9script 274ed234f24SBram Moolenaar v:testing = 1 275fbbcd003SBram Moolenaar if true 276ed234f24SBram Moolenaar var text = ['hello'] 277ed234f24SBram Moolenaar def SayHello(): list<string> 278fbbcd003SBram Moolenaar return text 279fbbcd003SBram Moolenaar enddef 280fbbcd003SBram Moolenaar def SetText(v: string) 281ed234f24SBram Moolenaar text = [v] 282fbbcd003SBram Moolenaar enddef 283fbbcd003SBram Moolenaar endif 284fbbcd003SBram Moolenaar 285fbbcd003SBram Moolenaar if true 286ed234f24SBram Moolenaar var text = ['again'] 287ed234f24SBram Moolenaar def SayAgain(): list<string> 288fbbcd003SBram Moolenaar return text 289fbbcd003SBram Moolenaar enddef 290fbbcd003SBram Moolenaar endif 291ed234f24SBram Moolenaar 292ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 293ed234f24SBram Moolenaar test_garbagecollect_now() 294ed234f24SBram Moolenaar 295fbbcd003SBram Moolenaar defcompile 296fbbcd003SBram Moolenaar 297ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 298ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 299fbbcd003SBram Moolenaar 300fbbcd003SBram Moolenaar SetText('foobar') 301ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 302ed234f24SBram Moolenaar 303ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 304ed234f24SBram Moolenaar qall! 305fbbcd003SBram Moolenaar END 306ed234f24SBram Moolenaar 307ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 308ed234f24SBram Moolenaar # context gets garbage collected. 309ed234f24SBram Moolenaar writefile(lines, 'Xscript') 310ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 311ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 312ed234f24SBram Moolenaar 313ed234f24SBram Moolenaar delete('Xscript') 314ed234f24SBram Moolenaar delete('Xdidit') 315fbbcd003SBram Moolenaarenddef 316fbbcd003SBram Moolenaar 31739ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31839ca4127SBram Moolenaar var lines =<< trim END 31939ca4127SBram Moolenaar vim9script 32039ca4127SBram Moolenaar if true 32139ca4127SBram Moolenaar var foo = 'foo' 32239ca4127SBram Moolenaar if true 32339ca4127SBram Moolenaar var bar = 'bar' 32439ca4127SBram Moolenaar def Func(): list<string> 32539ca4127SBram Moolenaar return [foo, bar] 32639ca4127SBram Moolenaar enddef 32739ca4127SBram Moolenaar endif 32839ca4127SBram Moolenaar endif 32939ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 33039ca4127SBram Moolenaar # "foo" and "bar" 33139ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33239ca4127SBram Moolenaar END 33339ca4127SBram Moolenaar CheckScriptSuccess(lines) 33439ca4127SBram Moolenaarenddef 33539ca4127SBram Moolenaar 336d032f34aSBram Moolenaarfunc g:NoSuchFunc() 337d032f34aSBram Moolenaar echo 'none' 338d032f34aSBram Moolenaarendfunc 339d032f34aSBram Moolenaar 3409e1d9e34SBram Moolenaardef Test_try_catch_throw() 341cfcd011fSBram Moolenaar var l = [] 3427a092245SBram Moolenaar try # comment 3438a7d6542SBram Moolenaar add(l, '1') 3448a7d6542SBram Moolenaar throw 'wrong' 3458a7d6542SBram Moolenaar add(l, '2') 3467a092245SBram Moolenaar catch # comment 3478a7d6542SBram Moolenaar add(l, v:exception) 3487a092245SBram Moolenaar finally # comment 3498a7d6542SBram Moolenaar add(l, '3') 3507a092245SBram Moolenaar endtry # comment 3518a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 35268d130c6SBram Moolenaar 353e859312eSBram Moolenaar l = [] 354e859312eSBram Moolenaar try 355e859312eSBram Moolenaar try 356e859312eSBram Moolenaar add(l, '1') 357e859312eSBram Moolenaar throw 'wrong' 358e859312eSBram Moolenaar add(l, '2') 359e859312eSBram Moolenaar catch /right/ 360e859312eSBram Moolenaar add(l, v:exception) 361e859312eSBram Moolenaar endtry 362e859312eSBram Moolenaar catch /wrong/ 363e859312eSBram Moolenaar add(l, 'caught') 364373863edSBram Moolenaar fina 365e859312eSBram Moolenaar add(l, 'finally') 366e859312eSBram Moolenaar endtry 367e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 368e859312eSBram Moolenaar 369cfcd011fSBram Moolenaar var n: number 37068d130c6SBram Moolenaar try 37168d130c6SBram Moolenaar n = l[3] 37268d130c6SBram Moolenaar catch /E684:/ 37368d130c6SBram Moolenaar n = 99 37468d130c6SBram Moolenaar endtry 37568d130c6SBram Moolenaar assert_equal(99, n) 37668d130c6SBram Moolenaar 37769f7050cSBram Moolenaar var done = 'no' 37869f7050cSBram Moolenaar if 0 37969f7050cSBram Moolenaar try | catch | endtry 38069f7050cSBram Moolenaar else 38169f7050cSBram Moolenaar done = 'yes' 38269f7050cSBram Moolenaar endif 38369f7050cSBram Moolenaar assert_equal('yes', done) 38469f7050cSBram Moolenaar 38569f7050cSBram Moolenaar done = 'no' 38669f7050cSBram Moolenaar if 1 38769f7050cSBram Moolenaar done = 'yes' 38869f7050cSBram Moolenaar else 38969f7050cSBram Moolenaar try | catch | endtry 39069f7050cSBram Moolenaar done = 'never' 39169f7050cSBram Moolenaar endif 39269f7050cSBram Moolenaar assert_equal('yes', done) 39369f7050cSBram Moolenaar 39469f7050cSBram Moolenaar if 1 39569f7050cSBram Moolenaar else 39669f7050cSBram Moolenaar try | catch /pat/ | endtry 39769f7050cSBram Moolenaar try | catch /pat/ 39869f7050cSBram Moolenaar endtry 39969f7050cSBram Moolenaar try 40069f7050cSBram Moolenaar catch /pat/ | endtry 40169f7050cSBram Moolenaar try 40269f7050cSBram Moolenaar catch /pat/ 40369f7050cSBram Moolenaar endtry 40469f7050cSBram Moolenaar endif 40569f7050cSBram Moolenaar 40668d130c6SBram Moolenaar try 407cc673e74SBram Moolenaar # string slice returns a string, not a number 40868d130c6SBram Moolenaar n = g:astring[3] 4095e654230SBram Moolenaar catch /E1012:/ 41068d130c6SBram Moolenaar n = 77 41168d130c6SBram Moolenaar endtry 41268d130c6SBram Moolenaar assert_equal(77, n) 41368d130c6SBram Moolenaar 41468d130c6SBram Moolenaar try 41568d130c6SBram Moolenaar n = l[g:astring] 4165e654230SBram Moolenaar catch /E1012:/ 41756acb094SBram Moolenaar n = 88 41868d130c6SBram Moolenaar endtry 41956acb094SBram Moolenaar assert_equal(88, n) 42068d130c6SBram Moolenaar 42168d130c6SBram Moolenaar try 42268d130c6SBram Moolenaar n = s:does_not_exist 42368d130c6SBram Moolenaar catch /E121:/ 424f0b9f43cSBram Moolenaar n = 111 425f0b9f43cSBram Moolenaar endtry 426f0b9f43cSBram Moolenaar assert_equal(111, n) 427f0b9f43cSBram Moolenaar 428f0b9f43cSBram Moolenaar try 429f0b9f43cSBram Moolenaar n = g:does_not_exist 430f0b9f43cSBram Moolenaar catch /E121:/ 43168d130c6SBram Moolenaar n = 121 43268d130c6SBram Moolenaar endtry 43368d130c6SBram Moolenaar assert_equal(121, n) 43468d130c6SBram Moolenaar 435e0de171eSBram Moolenaar var d = {one: 1} 43668d130c6SBram Moolenaar try 43768d130c6SBram Moolenaar n = d[g:astring] 43868d130c6SBram Moolenaar catch /E716:/ 43968d130c6SBram Moolenaar n = 222 44068d130c6SBram Moolenaar endtry 44168d130c6SBram Moolenaar assert_equal(222, n) 442f0b9f43cSBram Moolenaar 443f0b9f43cSBram Moolenaar try 444f0b9f43cSBram Moolenaar n = -g:astring 445f0b9f43cSBram Moolenaar catch /E39:/ 446f0b9f43cSBram Moolenaar n = 233 447f0b9f43cSBram Moolenaar endtry 448f0b9f43cSBram Moolenaar assert_equal(233, n) 449f0b9f43cSBram Moolenaar 450f0b9f43cSBram Moolenaar try 451f0b9f43cSBram Moolenaar n = +g:astring 452f0b9f43cSBram Moolenaar catch /E1030:/ 453f0b9f43cSBram Moolenaar n = 244 454f0b9f43cSBram Moolenaar endtry 455f0b9f43cSBram Moolenaar assert_equal(244, n) 456f0b9f43cSBram Moolenaar 457f0b9f43cSBram Moolenaar try 458f0b9f43cSBram Moolenaar n = +g:alist 459f0b9f43cSBram Moolenaar catch /E745:/ 460f0b9f43cSBram Moolenaar n = 255 461f0b9f43cSBram Moolenaar endtry 462f0b9f43cSBram Moolenaar assert_equal(255, n) 463f0b9f43cSBram Moolenaar 464cfcd011fSBram Moolenaar var nd: dict<any> 465f0b9f43cSBram Moolenaar try 4662e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4672e5910bfSBram Moolenaar catch /E1105:/ 468f0b9f43cSBram Moolenaar n = 266 469f0b9f43cSBram Moolenaar endtry 470f0b9f43cSBram Moolenaar assert_equal(266, n) 471f0b9f43cSBram Moolenaar 472f0b9f43cSBram Moolenaar try 473f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 474f0b9f43cSBram Moolenaar catch /E1093:/ 475f0b9f43cSBram Moolenaar n = 277 476f0b9f43cSBram Moolenaar endtry 477f0b9f43cSBram Moolenaar assert_equal(277, n) 478f0b9f43cSBram Moolenaar 479e859312eSBram Moolenaar try 480e859312eSBram Moolenaar &ts = g:astring 4815e654230SBram Moolenaar catch /E1012:/ 482e859312eSBram Moolenaar n = 288 483e859312eSBram Moolenaar endtry 484e859312eSBram Moolenaar assert_equal(288, n) 485e859312eSBram Moolenaar 486e859312eSBram Moolenaar try 487e859312eSBram Moolenaar &backspace = 'asdf' 488e859312eSBram Moolenaar catch /E474:/ 489e859312eSBram Moolenaar n = 299 490e859312eSBram Moolenaar endtry 491e859312eSBram Moolenaar assert_equal(299, n) 492e859312eSBram Moolenaar 493e859312eSBram Moolenaar l = [1] 494e859312eSBram Moolenaar try 495e859312eSBram Moolenaar l[3] = 3 496e859312eSBram Moolenaar catch /E684:/ 497e859312eSBram Moolenaar n = 300 498e859312eSBram Moolenaar endtry 499e859312eSBram Moolenaar assert_equal(300, n) 500e859312eSBram Moolenaar 501e859312eSBram Moolenaar try 502e859312eSBram Moolenaar unlet g:does_not_exist 503e859312eSBram Moolenaar catch /E108:/ 504e859312eSBram Moolenaar n = 322 505e859312eSBram Moolenaar endtry 506e859312eSBram Moolenaar assert_equal(322, n) 507e859312eSBram Moolenaar 508e859312eSBram Moolenaar try 5092bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 510e859312eSBram Moolenaar catch /E721:/ 511e859312eSBram Moolenaar n = 333 512e859312eSBram Moolenaar endtry 513e859312eSBram Moolenaar assert_equal(333, n) 514e859312eSBram Moolenaar 515e859312eSBram Moolenaar try 516e859312eSBram Moolenaar l = DeletedFunc() 517e859312eSBram Moolenaar catch /E933:/ 518e859312eSBram Moolenaar n = 344 519e859312eSBram Moolenaar endtry 520e859312eSBram Moolenaar assert_equal(344, n) 521d032f34aSBram Moolenaar 522d032f34aSBram Moolenaar try 523d032f34aSBram Moolenaar echo len(v:true) 524d032f34aSBram Moolenaar catch /E701:/ 525d032f34aSBram Moolenaar n = 355 526d032f34aSBram Moolenaar endtry 527d032f34aSBram Moolenaar assert_equal(355, n) 528d032f34aSBram Moolenaar 529cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 530d032f34aSBram Moolenaar delfunc g:NoSuchFunc 531d032f34aSBram Moolenaar try 532d032f34aSBram Moolenaar echo P() 533d032f34aSBram Moolenaar catch /E117:/ 534d032f34aSBram Moolenaar n = 366 535d032f34aSBram Moolenaar endtry 536d032f34aSBram Moolenaar assert_equal(366, n) 537d032f34aSBram Moolenaar 538d032f34aSBram Moolenaar try 539d032f34aSBram Moolenaar echo g:NoSuchFunc() 540d032f34aSBram Moolenaar catch /E117:/ 541d032f34aSBram Moolenaar n = 377 542d032f34aSBram Moolenaar endtry 543d032f34aSBram Moolenaar assert_equal(377, n) 544d032f34aSBram Moolenaar 545d032f34aSBram Moolenaar try 546d032f34aSBram Moolenaar echo g:alist + 4 547d032f34aSBram Moolenaar catch /E745:/ 548d032f34aSBram Moolenaar n = 388 549d032f34aSBram Moolenaar endtry 550d032f34aSBram Moolenaar assert_equal(388, n) 551d032f34aSBram Moolenaar 552d032f34aSBram Moolenaar try 553d032f34aSBram Moolenaar echo 4 + g:alist 554d032f34aSBram Moolenaar catch /E745:/ 555d032f34aSBram Moolenaar n = 399 556d032f34aSBram Moolenaar endtry 557d032f34aSBram Moolenaar assert_equal(399, n) 558d032f34aSBram Moolenaar 559d032f34aSBram Moolenaar try 560d032f34aSBram Moolenaar echo g:alist.member 561d032f34aSBram Moolenaar catch /E715:/ 562d032f34aSBram Moolenaar n = 400 563d032f34aSBram Moolenaar endtry 564d032f34aSBram Moolenaar assert_equal(400, n) 565d032f34aSBram Moolenaar 566d032f34aSBram Moolenaar try 567d032f34aSBram Moolenaar echo d.member 568d032f34aSBram Moolenaar catch /E716:/ 569d032f34aSBram Moolenaar n = 411 570d032f34aSBram Moolenaar endtry 571d032f34aSBram Moolenaar assert_equal(411, n) 572d9d7789bSBram Moolenaar 573d9d7789bSBram Moolenaar var counter = 0 574d9d7789bSBram Moolenaar for i in range(4) 575d9d7789bSBram Moolenaar try 576d9d7789bSBram Moolenaar eval [][0] 577d9d7789bSBram Moolenaar catch 578d9d7789bSBram Moolenaar endtry 579d9d7789bSBram Moolenaar counter += 1 580d9d7789bSBram Moolenaar endfor 581d9d7789bSBram Moolenaar assert_equal(4, counter) 5827e82c5f3SBram Moolenaar 5837e82c5f3SBram Moolenaar # return in finally after empty catch 5847e82c5f3SBram Moolenaar def ReturnInFinally(): number 5857e82c5f3SBram Moolenaar try 5867e82c5f3SBram Moolenaar finally 5877e82c5f3SBram Moolenaar return 4 5887e82c5f3SBram Moolenaar endtry 5897e82c5f3SBram Moolenaar return 2 5907e82c5f3SBram Moolenaar enddef 5917e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 5928a7d6542SBram Moolenaarenddef 5938a7d6542SBram Moolenaar 5949cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 5959cb577a6SBram Moolenaar # return in try block returns normally 5969cb577a6SBram Moolenaar def ReturnInTry(): string 5979cb577a6SBram Moolenaar try 5989cb577a6SBram Moolenaar return '"some message"' 5999cb577a6SBram Moolenaar catch 6009cb577a6SBram Moolenaar endtry 6019cb577a6SBram Moolenaar return 'not reached' 6029cb577a6SBram Moolenaar enddef 6039cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 6049cb577a6SBram Moolenaarenddef 6059cb577a6SBram Moolenaar 6061430ceebSBram Moolenaardef Test_cnext_works_in_catch() 6071430ceebSBram Moolenaar var lines =<< trim END 6081430ceebSBram Moolenaar vim9script 6091430ceebSBram Moolenaar au BufEnter * eval 0 6101430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 6111430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 6121430ceebSBram Moolenaar var items = [ 6131430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 6141430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 6151430ceebSBram Moolenaar ] 6161430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 6171430ceebSBram Moolenaar cwindow 6181430ceebSBram Moolenaar 6191430ceebSBram Moolenaar def CnextOrCfirst() 6201430ceebSBram Moolenaar # if cnext fails, cfirst is used 6211430ceebSBram Moolenaar try 6221430ceebSBram Moolenaar cnext 6231430ceebSBram Moolenaar catch 6241430ceebSBram Moolenaar cfirst 6251430ceebSBram Moolenaar endtry 6261430ceebSBram Moolenaar enddef 6271430ceebSBram Moolenaar 6281430ceebSBram Moolenaar CnextOrCfirst() 6291430ceebSBram Moolenaar CnextOrCfirst() 6301430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 6311430ceebSBram Moolenaar qall 6321430ceebSBram Moolenaar END 6331430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 6341430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 6351430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 6361430ceebSBram Moolenaar 6371430ceebSBram Moolenaar delete('Xfile1') 6381430ceebSBram Moolenaar delete('Xfile2') 6391430ceebSBram Moolenaar delete('XCatchCnext') 6401430ceebSBram Moolenaar delete('Xresult') 6411430ceebSBram Moolenaarenddef 6421430ceebSBram Moolenaar 6439e1d9e34SBram Moolenaardef Test_throw_skipped() 6449e1d9e34SBram Moolenaar if 0 6459e1d9e34SBram Moolenaar throw dontgethere 6469e1d9e34SBram Moolenaar endif 6479e1d9e34SBram Moolenaarenddef 6489e1d9e34SBram Moolenaar 6498f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 6508f81b22eSBram Moolenaar var lines =<< trim END 6518f81b22eSBram Moolenaar vim9script 6528f81b22eSBram Moolenaar def Func() 6538f81b22eSBram Moolenaar throw 'error' 6548f81b22eSBram Moolenaar enddef 6558f81b22eSBram Moolenaar silent! Func() 6568f81b22eSBram Moolenaar END 6578f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 6588f81b22eSBram Moolenaar source XthrowSilenced 6598f81b22eSBram Moolenaar delete('XthrowSilenced') 6608f81b22eSBram Moolenaarenddef 6618f81b22eSBram Moolenaar 662e859312eSBram Moolenaardef DeletedFunc(): list<any> 663e859312eSBram Moolenaar return ['delete me'] 664e859312eSBram Moolenaarenddef 665e859312eSBram Moolenaardefcompile 666e859312eSBram Moolenaardelfunc DeletedFunc 667e859312eSBram Moolenaar 668257cc5eeSBram Moolenaardef ThrowFromDef() 669a72cfb80SBram Moolenaar throw "getout" # comment 670257cc5eeSBram Moolenaarenddef 671257cc5eeSBram Moolenaar 672257cc5eeSBram Moolenaarfunc CatchInFunc() 673257cc5eeSBram Moolenaar try 674257cc5eeSBram Moolenaar call ThrowFromDef() 675257cc5eeSBram Moolenaar catch 676257cc5eeSBram Moolenaar let g:thrown_func = v:exception 677257cc5eeSBram Moolenaar endtry 678257cc5eeSBram Moolenaarendfunc 679257cc5eeSBram Moolenaar 680257cc5eeSBram Moolenaardef CatchInDef() 681257cc5eeSBram Moolenaar try 682257cc5eeSBram Moolenaar ThrowFromDef() 683257cc5eeSBram Moolenaar catch 684257cc5eeSBram Moolenaar g:thrown_def = v:exception 685257cc5eeSBram Moolenaar endtry 686257cc5eeSBram Moolenaarenddef 687257cc5eeSBram Moolenaar 688f575adffSBram Moolenaardef ReturnFinally(): string 689f575adffSBram Moolenaar try 690f575adffSBram Moolenaar return 'intry' 691373863edSBram Moolenaar finall 692f575adffSBram Moolenaar g:in_finally = 'finally' 693f575adffSBram Moolenaar endtry 694f575adffSBram Moolenaar return 'end' 695f575adffSBram Moolenaarenddef 696f575adffSBram Moolenaar 697257cc5eeSBram Moolenaardef Test_try_catch_nested() 698257cc5eeSBram Moolenaar CatchInFunc() 699257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 700257cc5eeSBram Moolenaar 701257cc5eeSBram Moolenaar CatchInDef() 702257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 703f575adffSBram Moolenaar 704f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 705f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 706f575adffSBram Moolenaarenddef 707f575adffSBram Moolenaar 7089939f57bSBram Moolenaardef TryOne(): number 7099939f57bSBram Moolenaar try 7109939f57bSBram Moolenaar return 0 7119939f57bSBram Moolenaar catch 7129939f57bSBram Moolenaar endtry 7139939f57bSBram Moolenaar return 0 7149939f57bSBram Moolenaarenddef 7159939f57bSBram Moolenaar 7169939f57bSBram Moolenaardef TryTwo(n: number): string 7179939f57bSBram Moolenaar try 718cfcd011fSBram Moolenaar var x = {} 7199939f57bSBram Moolenaar catch 7209939f57bSBram Moolenaar endtry 7219939f57bSBram Moolenaar return 'text' 7229939f57bSBram Moolenaarenddef 7239939f57bSBram Moolenaar 7249939f57bSBram Moolenaardef Test_try_catch_twice() 7259939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 7269939f57bSBram Moolenaarenddef 7279939f57bSBram Moolenaar 728f575adffSBram Moolenaardef Test_try_catch_match() 729cfcd011fSBram Moolenaar var seq = 'a' 730f575adffSBram Moolenaar try 731f575adffSBram Moolenaar throw 'something' 732f575adffSBram Moolenaar catch /nothing/ 733f575adffSBram Moolenaar seq ..= 'x' 734f575adffSBram Moolenaar catch /some/ 735f575adffSBram Moolenaar seq ..= 'b' 736f575adffSBram Moolenaar catch /asdf/ 737f575adffSBram Moolenaar seq ..= 'x' 738e8c4abbbSBram Moolenaar catch ?a\?sdf? 739e8c4abbbSBram Moolenaar seq ..= 'y' 740f575adffSBram Moolenaar finally 741f575adffSBram Moolenaar seq ..= 'c' 742f575adffSBram Moolenaar endtry 743f575adffSBram Moolenaar assert_equal('abc', seq) 744257cc5eeSBram Moolenaarenddef 745257cc5eeSBram Moolenaar 746e8c4abbbSBram Moolenaardef Test_try_catch_fails() 747d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 748d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 749d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 750d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 751d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 752d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 753d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 754d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 75513106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 756d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 757585fea7bSBram Moolenaar 758e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 759d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 760e8c4abbbSBram Moolenaarenddef 761e8c4abbbSBram Moolenaar 7627c5b3c03SBram Moolenaardef Try_catch_skipped() 7637c5b3c03SBram Moolenaar var l = [] 7647c5b3c03SBram Moolenaar try 7657c5b3c03SBram Moolenaar finally 7667c5b3c03SBram Moolenaar endtry 7677c5b3c03SBram Moolenaar 7687c5b3c03SBram Moolenaar if 1 7697c5b3c03SBram Moolenaar else 7707c5b3c03SBram Moolenaar try 7717c5b3c03SBram Moolenaar endtry 7727c5b3c03SBram Moolenaar endif 7737c5b3c03SBram Moolenaarenddef 7747c5b3c03SBram Moolenaar 7757c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 7767c5b3c03SBram Moolenaardef Test_try_catch_skipped() 7777c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 7787c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 7797c5b3c03SBram Moolenaarenddef 7807c5b3c03SBram Moolenaar 7817c5b3c03SBram Moolenaar 7827c5b3c03SBram Moolenaar 783006ad48bSBram Moolenaardef Test_throw_vimscript() 784f5be8cdbSBram Moolenaar # only checks line continuation 785cfcd011fSBram Moolenaar var lines =<< trim END 786006ad48bSBram Moolenaar vim9script 787006ad48bSBram Moolenaar try 788006ad48bSBram Moolenaar throw 'one' 789006ad48bSBram Moolenaar .. 'two' 790006ad48bSBram Moolenaar catch 791006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 792006ad48bSBram Moolenaar endtry 793006ad48bSBram Moolenaar END 794006ad48bSBram Moolenaar CheckScriptSuccess(lines) 7951e021e63SBram Moolenaar 7961e021e63SBram Moolenaar lines =<< trim END 7971e021e63SBram Moolenaar vim9script 798352134bbSBram Moolenaar @r = '' 7991e021e63SBram Moolenaar def Func() 8001e021e63SBram Moolenaar throw @r 8011e021e63SBram Moolenaar enddef 8021e021e63SBram Moolenaar var result = '' 8031e021e63SBram Moolenaar try 8041e021e63SBram Moolenaar Func() 8051e021e63SBram Moolenaar catch /E1129:/ 8061e021e63SBram Moolenaar result = 'caught' 8071e021e63SBram Moolenaar endtry 8081e021e63SBram Moolenaar assert_equal('caught', result) 8091e021e63SBram Moolenaar END 8101e021e63SBram Moolenaar CheckScriptSuccess(lines) 811006ad48bSBram Moolenaarenddef 812006ad48bSBram Moolenaar 813ed677f55SBram Moolenaardef Test_error_in_nested_function() 81403dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 815cfcd011fSBram Moolenaar var lines =<< trim END 816ed677f55SBram Moolenaar vim9script 817ed677f55SBram Moolenaar def Func() 818ed677f55SBram Moolenaar Error() 819ed677f55SBram Moolenaar g:test_var = 1 820ed677f55SBram Moolenaar enddef 821ed677f55SBram Moolenaar func Error() abort 822ed677f55SBram Moolenaar eval [][0] 823ed677f55SBram Moolenaar endfunc 824ed677f55SBram Moolenaar Func() 825ed677f55SBram Moolenaar END 826ed677f55SBram Moolenaar g:test_var = 0 827ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 828ed677f55SBram Moolenaar assert_equal(0, g:test_var) 829ed677f55SBram Moolenaarenddef 830ed677f55SBram Moolenaar 83137c83711SBram Moolenaardef Test_cexpr_vimscript() 832f5be8cdbSBram Moolenaar # only checks line continuation 83337c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 834cfcd011fSBram Moolenaar var lines =<< trim END 83537c83711SBram Moolenaar vim9script 83637c83711SBram Moolenaar cexpr 'File' 83737c83711SBram Moolenaar .. ' someFile' .. 83837c83711SBram Moolenaar ' line 19' 83937c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 84037c83711SBram Moolenaar END 84137c83711SBram Moolenaar CheckScriptSuccess(lines) 84237c83711SBram Moolenaar set errorformat& 84337c83711SBram Moolenaarenddef 84437c83711SBram Moolenaar 845c9edd6b5SBram Moolenaardef Test_statusline_syntax() 846c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 847cfcd011fSBram Moolenaar var lines =<< trim END 848c9edd6b5SBram Moolenaar vim9script 849c9edd6b5SBram Moolenaar func g:Status() 850c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 851c9edd6b5SBram Moolenaar endfunc 852c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 853c9edd6b5SBram Moolenaar redrawstatus 854c9edd6b5SBram Moolenaar set laststatus statusline= 855c9edd6b5SBram Moolenaar END 856c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 857c9edd6b5SBram Moolenaarenddef 858c9edd6b5SBram Moolenaar 859b209750bSBram Moolenaardef Test_list_vimscript() 860b209750bSBram Moolenaar # checks line continuation and comments 861cfcd011fSBram Moolenaar var lines =<< trim END 862b209750bSBram Moolenaar vim9script 863cfcd011fSBram Moolenaar var mylist = [ 864b209750bSBram Moolenaar 'one', 865b209750bSBram Moolenaar # comment 866b209750bSBram Moolenaar 'two', # empty line follows 867b209750bSBram Moolenaar 868b209750bSBram Moolenaar 'three', 869b209750bSBram Moolenaar ] 870b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 871b209750bSBram Moolenaar END 872b209750bSBram Moolenaar CheckScriptSuccess(lines) 87366250c93SBram Moolenaar 87466250c93SBram Moolenaar # check all lines from heredoc are kept 87566250c93SBram Moolenaar lines =<< trim END 87666250c93SBram Moolenaar # comment 1 87766250c93SBram Moolenaar two 87866250c93SBram Moolenaar # comment 3 87966250c93SBram Moolenaar 88066250c93SBram Moolenaar five 88166250c93SBram Moolenaar # comment 6 88266250c93SBram Moolenaar END 88366250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 8844bce26bbSBram Moolenaar 8854bce26bbSBram Moolenaar lines =<< trim END 8864bce26bbSBram Moolenaar [{ 8874bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 8884bce26bbSBram Moolenaar END 8894bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 890b209750bSBram Moolenaarenddef 891b209750bSBram Moolenaar 8922a1381c3SBram Moolenaarif has('channel') 89340ee466cSBram Moolenaar let someJob = test_null_job() 89440ee466cSBram Moolenaar 89540ee466cSBram Moolenaar def FuncWithError() 89640ee466cSBram Moolenaar echomsg g:someJob 89740ee466cSBram Moolenaar enddef 89840ee466cSBram Moolenaar 89940ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 90040ee466cSBram Moolenaar try 90140ee466cSBram Moolenaar call FuncWithError() 90240ee466cSBram Moolenaar catch 90340ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 90440ee466cSBram Moolenaar endtry 90540ee466cSBram Moolenaar endfunc 9062a1381c3SBram Moolenaarendif 90740ee466cSBram Moolenaar 9088a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 9098a7d6542SBram Moolenaar vim9script 910cfcd011fSBram Moolenaar var name: string = 'bob' 9118a7d6542SBram Moolenaar def Concat(arg: string): string 9128a7d6542SBram Moolenaar return name .. arg 9138a7d6542SBram Moolenaar enddef 914227a69deSBram Moolenaar g:result = Concat('bie') 915227a69deSBram Moolenaar g:localname = name 9168a7d6542SBram Moolenaar 9178a7d6542SBram Moolenaar export const CONST = 1234 918cfcd011fSBram Moolenaar export var exported = 9876 919cfcd011fSBram Moolenaar export var exp_name = 'John' 9208a7d6542SBram Moolenaar export def Exported(): string 9218a7d6542SBram Moolenaar return 'Exported' 9228a7d6542SBram Moolenaar enddef 9230f2a5cc6SBram Moolenaar export final theList = [1] 9248a7d6542SBram MoolenaarEND 9258a7d6542SBram Moolenaar 926b3ca9824SBram Moolenaardef Undo_export_script_lines() 927b3ca9824SBram Moolenaar unlet g:result 928b3ca9824SBram Moolenaar unlet g:localname 929b3ca9824SBram Moolenaarenddef 930b3ca9824SBram Moolenaar 9315269bd2aSBram Moolenaardef Test_vim9_import_export() 932cfcd011fSBram Moolenaar var import_script_lines =<< trim END 9338a7d6542SBram Moolenaar vim9script 9348a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 9358a7d6542SBram Moolenaar g:imported = exported 9366e587dcbSBram Moolenaar exported += 3 9376e587dcbSBram Moolenaar g:imported_added = exported 9388a7d6542SBram Moolenaar g:imported_func = Exported() 9396e587dcbSBram Moolenaar 94040f4f7a4SBram Moolenaar def GetExported(): string 941e0de171eSBram Moolenaar var local_dict = {ref: Exported} 94240f4f7a4SBram Moolenaar return local_dict.ref() 94340f4f7a4SBram Moolenaar enddef 94440f4f7a4SBram Moolenaar g:funcref_result = GetExported() 94540f4f7a4SBram Moolenaar 9466e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 9476e587dcbSBram Moolenaar g:imported_name = exp_name 9486e587dcbSBram Moolenaar exp_name ..= ' Doe' 9496e587dcbSBram Moolenaar g:imported_name_appended = exp_name 9505381c7a1SBram Moolenaar g:imported_later = exported 9510f2a5cc6SBram Moolenaar 9520f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 9530f2a5cc6SBram Moolenaar theList->add(2) 9540f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 9558a7d6542SBram Moolenaar END 9568a7d6542SBram Moolenaar 9578a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 9588a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 9598a7d6542SBram Moolenaar 9608a7d6542SBram Moolenaar source Ximport.vim 9618a7d6542SBram Moolenaar 9628a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 9638a7d6542SBram Moolenaar assert_equal('bob', g:localname) 9648a7d6542SBram Moolenaar assert_equal(9876, g:imported) 9656e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 9665381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 9678a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 96840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 9696e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 9706e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 9718a7d6542SBram Moolenaar assert_false(exists('g:name')) 9728a7d6542SBram Moolenaar 973b3ca9824SBram Moolenaar Undo_export_script_lines() 9748a7d6542SBram Moolenaar unlet g:imported 9756e587dcbSBram Moolenaar unlet g:imported_added 9765381c7a1SBram Moolenaar unlet g:imported_later 9778a7d6542SBram Moolenaar unlet g:imported_func 9786e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 9798a7d6542SBram Moolenaar delete('Ximport.vim') 980f2d5c240SBram Moolenaar 9811c991144SBram Moolenaar # similar, with line breaks 982cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 9831c991144SBram Moolenaar vim9script 9841c991144SBram Moolenaar import { 9851c991144SBram Moolenaar exported, 9861c991144SBram Moolenaar Exported, 9871c991144SBram Moolenaar } 9881c991144SBram Moolenaar from 9891c991144SBram Moolenaar './Xexport.vim' 9901c991144SBram Moolenaar g:imported = exported 9911c991144SBram Moolenaar exported += 5 9921c991144SBram Moolenaar g:imported_added = exported 9931c991144SBram Moolenaar g:imported_func = Exported() 9941c991144SBram Moolenaar END 9951c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 9961c991144SBram Moolenaar source Ximport_lbr.vim 9971c991144SBram Moolenaar 9981c991144SBram Moolenaar assert_equal(9876, g:imported) 9991c991144SBram Moolenaar assert_equal(9881, g:imported_added) 10001c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 10011c991144SBram Moolenaar 10021c991144SBram Moolenaar # exported script not sourced again 10031c991144SBram Moolenaar assert_false(exists('g:result')) 10041c991144SBram Moolenaar unlet g:imported 10051c991144SBram Moolenaar unlet g:imported_added 10061c991144SBram Moolenaar unlet g:imported_func 10071c991144SBram Moolenaar delete('Ximport_lbr.vim') 10081c991144SBram Moolenaar 10091c991144SBram Moolenaar # import inside :def function 1010cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 10115381c7a1SBram Moolenaar vim9script 10125381c7a1SBram Moolenaar def ImportInDef() 10135381c7a1SBram Moolenaar import exported from './Xexport.vim' 10145381c7a1SBram Moolenaar g:imported = exported 10155381c7a1SBram Moolenaar exported += 7 10165381c7a1SBram Moolenaar g:imported_added = exported 10175381c7a1SBram Moolenaar enddef 10185381c7a1SBram Moolenaar ImportInDef() 10195381c7a1SBram Moolenaar END 10205381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 10215381c7a1SBram Moolenaar source Ximport2.vim 1022f5be8cdbSBram Moolenaar # TODO: this should be 9879 10235381c7a1SBram Moolenaar assert_equal(9876, g:imported) 10245381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 10255381c7a1SBram Moolenaar unlet g:imported 10265381c7a1SBram Moolenaar unlet g:imported_added 10275381c7a1SBram Moolenaar delete('Ximport2.vim') 10285381c7a1SBram Moolenaar 1029cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1030f2d5c240SBram Moolenaar vim9script 1031f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1032f2d5c240SBram Moolenaar def UseExport() 1033f2d5c240SBram Moolenaar g:imported = Export.exported 1034f2d5c240SBram Moolenaar enddef 1035f2d5c240SBram Moolenaar UseExport() 1036f2d5c240SBram Moolenaar END 1037f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1038f2d5c240SBram Moolenaar source Ximport.vim 10395381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1040f2d5c240SBram Moolenaar 1041cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1042599c89c8SBram Moolenaar vim9script 1043599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1044599c89c8SBram Moolenaar def Func() 1045cfcd011fSBram Moolenaar var dummy = 1 1046cfcd011fSBram Moolenaar var imported = Export + dummy 1047599c89c8SBram Moolenaar enddef 1048822ba247SBram Moolenaar defcompile 1049599c89c8SBram Moolenaar END 1050599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 105144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1052599c89c8SBram Moolenaar 1053cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1054599c89c8SBram Moolenaar vim9script 1055599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1056599c89c8SBram Moolenaar def Func() 1057cfcd011fSBram Moolenaar var imported = Export . exported 1058599c89c8SBram Moolenaar enddef 1059822ba247SBram Moolenaar defcompile 1060599c89c8SBram Moolenaar END 1061599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 106244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1063599c89c8SBram Moolenaar 1064a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1065a6294955SBram Moolenaar vim9script 1066a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1067a6294955SBram Moolenaar var some = 'other' 1068a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1069a6294955SBram Moolenaar defcompile 1070a6294955SBram Moolenaar END 1071a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1072a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1073a6294955SBram Moolenaar 1074cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1075599c89c8SBram Moolenaar vim9script 1076599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1077599c89c8SBram Moolenaar def Func() 1078cfcd011fSBram Moolenaar var imported = Export. 1079599c89c8SBram Moolenaar enddef 1080822ba247SBram Moolenaar defcompile 1081599c89c8SBram Moolenaar END 1082599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 108344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1084599c89c8SBram Moolenaar 1085cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 10861c991144SBram Moolenaar vim9script 10871c991144SBram Moolenaar import * 10881c991144SBram Moolenaar as Export 10891c991144SBram Moolenaar from 10901c991144SBram Moolenaar './Xexport.vim' 10911c991144SBram Moolenaar def UseExport() 10921c991144SBram Moolenaar g:imported = Export.exported 10931c991144SBram Moolenaar enddef 10941c991144SBram Moolenaar UseExport() 10951c991144SBram Moolenaar END 10961c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 10971c991144SBram Moolenaar source Ximport.vim 10981c991144SBram Moolenaar assert_equal(9883, g:imported) 10991c991144SBram Moolenaar 1100cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1101f2d5c240SBram Moolenaar vim9script 1102f2d5c240SBram Moolenaar import * from './Xexport.vim' 1103f2d5c240SBram Moolenaar END 1104f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 110544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1106f2d5c240SBram Moolenaar 1107f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1108cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1109fa29c8abSBram Moolenaar vim9script 1110fa29c8abSBram Moolenaar import name from './Xexport.vim' 1111fa29c8abSBram Moolenaar END 1112fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 111344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1114fa29c8abSBram Moolenaar 1115f5be8cdbSBram Moolenaar # try to import something that is already defined 1116cfcd011fSBram Moolenaar var import_already_defined =<< trim END 11175269bd2aSBram Moolenaar vim9script 1118cfcd011fSBram Moolenaar var exported = 'something' 11195269bd2aSBram Moolenaar import exported from './Xexport.vim' 11205269bd2aSBram Moolenaar END 11215269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1122*057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11235269bd2aSBram Moolenaar 1124f5be8cdbSBram Moolenaar # try to import something that is already defined 11255269bd2aSBram Moolenaar import_already_defined =<< trim END 11265269bd2aSBram Moolenaar vim9script 1127cfcd011fSBram Moolenaar var exported = 'something' 11285269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 11295269bd2aSBram Moolenaar END 11305269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1131*057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11325269bd2aSBram Moolenaar 1133f5be8cdbSBram Moolenaar # try to import something that is already defined 11345269bd2aSBram Moolenaar import_already_defined =<< trim END 11355269bd2aSBram Moolenaar vim9script 1136cfcd011fSBram Moolenaar var exported = 'something' 11375269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 11385269bd2aSBram Moolenaar END 11395269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1140*057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 11415269bd2aSBram Moolenaar 1142918a4249SBram Moolenaar # try changing an imported const 1143918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1144918a4249SBram Moolenaar vim9script 1145918a4249SBram Moolenaar import CONST from './Xexport.vim' 1146918a4249SBram Moolenaar def Assign() 1147918a4249SBram Moolenaar CONST = 987 1148918a4249SBram Moolenaar enddef 1149918a4249SBram Moolenaar defcompile 1150918a4249SBram Moolenaar END 1151918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1152918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1153918a4249SBram Moolenaar 11540f2a5cc6SBram Moolenaar # try changing an imported final 11550f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 11560f2a5cc6SBram Moolenaar vim9script 11570f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11580f2a5cc6SBram Moolenaar def Assign() 11590f2a5cc6SBram Moolenaar theList = [2] 11600f2a5cc6SBram Moolenaar enddef 11610f2a5cc6SBram Moolenaar defcompile 11620f2a5cc6SBram Moolenaar END 11630f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 11640f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 11650f2a5cc6SBram Moolenaar 1166f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1167cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1168fa29c8abSBram Moolenaar vim9script 1169fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1170fa29c8abSBram Moolenaar END 1171fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 117244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1173fa29c8abSBram Moolenaar 1174cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1175fa29c8abSBram Moolenaar vim9script 1176fa29c8abSBram Moolenaar import name './Xexport.vim' 1177fa29c8abSBram Moolenaar END 1178fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 117944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1180fa29c8abSBram Moolenaar 1181cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1182fa29c8abSBram Moolenaar vim9script 1183fa29c8abSBram Moolenaar import name from Xexport.vim 1184fa29c8abSBram Moolenaar END 1185fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 118644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 1187fa29c8abSBram Moolenaar 1188cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1189fa29c8abSBram Moolenaar vim9script 1190fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1191fa29c8abSBram Moolenaar END 1192fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 119344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1194fa29c8abSBram Moolenaar 1195cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1196fa29c8abSBram Moolenaar vim9script 1197fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1198fa29c8abSBram Moolenaar END 11995269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 120044d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1201fa29c8abSBram Moolenaar 1202f2d5c240SBram Moolenaar delete('Ximport.vim') 12035269bd2aSBram Moolenaar delete('Ximport3.vim') 12048a7d6542SBram Moolenaar delete('Xexport.vim') 12058a7d6542SBram Moolenaar 1206f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1207750802b5SBram Moolenaar set cpo&vi 1208cfcd011fSBram Moolenaar var cpo_before = &cpo 1209cfcd011fSBram Moolenaar var lines =<< trim END 1210750802b5SBram Moolenaar vim9script 1211750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1212750802b5SBram Moolenaar END 1213750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1214750802b5SBram Moolenaar source Xvim9_script 1215750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1216750802b5SBram Moolenaar set cpo&vim 1217750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1218750802b5SBram Moolenaar delete('Xvim9_script') 1219750802b5SBram Moolenaarenddef 1220750802b5SBram Moolenaar 12210a84284eSBram Moolenaardef Test_import_as() 12220a84284eSBram Moolenaar var export_lines =<< trim END 12230a84284eSBram Moolenaar vim9script 12240a84284eSBram Moolenaar export var one = 1 12250a84284eSBram Moolenaar export var yes = 'yes' 12260a84284eSBram Moolenaar END 12270a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 12280a84284eSBram Moolenaar 12290a84284eSBram Moolenaar var import_lines =<< trim END 12300a84284eSBram Moolenaar vim9script 12310a84284eSBram Moolenaar import one as thatOne from './XexportAs' 12320a84284eSBram Moolenaar assert_equal(1, thatOne) 12330a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 12340a84284eSBram Moolenaar assert_equal('yes', yesYes) 12350a84284eSBram Moolenaar END 12360a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 12370a84284eSBram Moolenaar 12380a84284eSBram Moolenaar import_lines =<< trim END 12390a84284eSBram Moolenaar vim9script 12400a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 12410a84284eSBram Moolenaar assert_equal(1, thatOne) 12420a84284eSBram Moolenaar assert_equal('yes', yesYes) 12430a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 12440a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 12450a84284eSBram Moolenaar END 12460a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 12470a84284eSBram Moolenaar 12480a84284eSBram Moolenaar delete('XexportAs') 12490a84284eSBram Moolenaarenddef 12500a84284eSBram Moolenaar 1251803af686SBram Moolenaarfunc g:Trigger() 1252803af686SBram Moolenaar source Ximport.vim 1253803af686SBram Moolenaar return "echo 'yes'\<CR>" 1254803af686SBram Moolenaarendfunc 1255803af686SBram Moolenaar 1256803af686SBram Moolenaardef Test_import_export_expr_map() 1257803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1258cfcd011fSBram Moolenaar var export_lines =<< trim END 1259803af686SBram Moolenaar vim9script 1260803af686SBram Moolenaar export def That(): string 1261803af686SBram Moolenaar return 'yes' 1262803af686SBram Moolenaar enddef 1263803af686SBram Moolenaar END 1264803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1265803af686SBram Moolenaar 1266cfcd011fSBram Moolenaar var import_lines =<< trim END 1267803af686SBram Moolenaar vim9script 1268803af686SBram Moolenaar import That from './Xexport_that.vim' 1269803af686SBram Moolenaar assert_equal('yes', That()) 1270803af686SBram Moolenaar END 1271803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1272803af686SBram Moolenaar 1273803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1274803af686SBram Moolenaar feedkeys('trigger', "xt") 1275803af686SBram Moolenaar 1276730b2483SBram Moolenaar delete('Xexport_that.vim') 1277803af686SBram Moolenaar delete('Ximport.vim') 1278803af686SBram Moolenaar nunmap trigger 1279803af686SBram Moolenaarenddef 1280803af686SBram Moolenaar 12818e1986e3SBram Moolenaardef Test_import_in_filetype() 12828e1986e3SBram Moolenaar # check that :import works when the buffer is locked 12838e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1284cfcd011fSBram Moolenaar var export_lines =<< trim END 12858e1986e3SBram Moolenaar vim9script 1286cfcd011fSBram Moolenaar export var That = 'yes' 12878e1986e3SBram Moolenaar END 1288730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 12898e1986e3SBram Moolenaar 1290cfcd011fSBram Moolenaar var import_lines =<< trim END 12918e1986e3SBram Moolenaar vim9script 1292730b2483SBram Moolenaar import That from './Xexport_ft.vim' 12938e1986e3SBram Moolenaar assert_equal('yes', That) 12948e1986e3SBram Moolenaar g:did_load_mytpe = 1 12958e1986e3SBram Moolenaar END 12968e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 12978e1986e3SBram Moolenaar 1298cfcd011fSBram Moolenaar var save_rtp = &rtp 12998e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 13008e1986e3SBram Moolenaar 13018e1986e3SBram Moolenaar filetype plugin on 13028e1986e3SBram Moolenaar copen 13038e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 13048e1986e3SBram Moolenaar 13058e1986e3SBram Moolenaar quit! 1306730b2483SBram Moolenaar delete('Xexport_ft.vim') 13078e1986e3SBram Moolenaar delete('ftplugin', 'rf') 13088e1986e3SBram Moolenaar &rtp = save_rtp 13098e1986e3SBram Moolenaarenddef 13108e1986e3SBram Moolenaar 1311efa94447SBram Moolenaardef Test_use_import_in_mapping() 1312cfcd011fSBram Moolenaar var lines =<< trim END 1313efa94447SBram Moolenaar vim9script 1314efa94447SBram Moolenaar export def Funcx() 1315efa94447SBram Moolenaar g:result = 42 1316efa94447SBram Moolenaar enddef 1317efa94447SBram Moolenaar END 1318efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1319efa94447SBram Moolenaar lines =<< trim END 1320efa94447SBram Moolenaar vim9script 1321efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1322b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1323efa94447SBram Moolenaar END 1324efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1325efa94447SBram Moolenaar 1326efa94447SBram Moolenaar source Xmapscript.vim 1327b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1328efa94447SBram Moolenaar assert_equal(42, g:result) 1329efa94447SBram Moolenaar 1330efa94447SBram Moolenaar unlet g:result 1331efa94447SBram Moolenaar delete('XsomeExport.vim') 1332efa94447SBram Moolenaar delete('Xmapscript.vim') 1333b3ca9824SBram Moolenaar nunmap <F3> 1334efa94447SBram Moolenaarenddef 1335efa94447SBram Moolenaar 1336d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1337d3f8a9eeSBram Moolenaar var lines =<< trim END 1338d3f8a9eeSBram Moolenaar if has(g:feature) 1339d3f8a9eeSBram Moolenaar " legacy script 1340d3f8a9eeSBram Moolenaar let g:legacy = 1 1341d3f8a9eeSBram Moolenaar finish 1342d3f8a9eeSBram Moolenaar endif 1343d3f8a9eeSBram Moolenaar vim9script 1344d3f8a9eeSBram Moolenaar g:legacy = 0 1345d3f8a9eeSBram Moolenaar END 1346d3f8a9eeSBram Moolenaar g:feature = 'eval' 1347d3f8a9eeSBram Moolenaar g:legacy = -1 1348d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1349d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1350d3f8a9eeSBram Moolenaar 1351d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1352d3f8a9eeSBram Moolenaar g:legacy = -1 1353d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1354d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1355d3f8a9eeSBram Moolenaarenddef 1356d3f8a9eeSBram Moolenaar 1357750802b5SBram Moolenaardef Test_vim9script_fails() 13588a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13598a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1360cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 13619721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1362cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1363750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1364750802b5SBram Moolenaar 1365cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1366c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1367c785b9a7SBram Moolenaar 1368e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1369e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 13708a7d6542SBram Moolenaarenddef 13718a7d6542SBram Moolenaar 1372f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1373101f4810SBram Moolenaar CheckRunVimInTerminal 1374101f4810SBram Moolenaar 13759bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1376c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13779bb3eb3eSBram Moolenaarendfunc 13789bb3eb3eSBram Moolenaar 1379c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1380cfcd011fSBram Moolenaar var export =<< trim END 1381101f4810SBram Moolenaar vim9script 1382101f4810SBram Moolenaar export def Foo(): number 1383101f4810SBram Moolenaar return 0 1384101f4810SBram Moolenaar enddef 1385101f4810SBram Moolenaar END 1386730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1387101f4810SBram Moolenaar 1388e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 13899bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13902949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1391101f4810SBram Moolenaar 1392730b2483SBram Moolenaar delete('XexportCmd.vim') 13939bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13949bb3eb3eSBram Moolenaarenddef 1395101f4810SBram Moolenaar 13962b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 13972b32700dSBram Moolenaar var lines =<< trim END 1398a6294955SBram Moolenaar vim9script 1399a6294955SBram Moolenaar export var exported = 'thexport' 1400a6294955SBram Moolenaar END 1401a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1402a6294955SBram Moolenaar lines =<< trim END 14032b32700dSBram Moolenaar vim9script noclear 14042b32700dSBram Moolenaar g:loadCount += 1 14052b32700dSBram Moolenaar var s:reloaded = 'init' 1406a6294955SBram Moolenaar import exported from './XExportReload' 14072b32700dSBram Moolenaar 14082b32700dSBram Moolenaar def Again(): string 14092b32700dSBram Moolenaar return 'again' 14102b32700dSBram Moolenaar enddef 14112b32700dSBram Moolenaar 14122b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 14132b32700dSBram Moolenaar var s:loaded = true 14142b32700dSBram Moolenaar 14152b32700dSBram Moolenaar var s:notReloaded = 'yes' 14162b32700dSBram Moolenaar s:reloaded = 'first' 14172b32700dSBram Moolenaar def g:Values(): list<string> 1418a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 14192b32700dSBram Moolenaar enddef 14202b32700dSBram Moolenaar 14212b32700dSBram Moolenaar def Once(): string 14222b32700dSBram Moolenaar return 'once' 14232b32700dSBram Moolenaar enddef 14242b32700dSBram Moolenaar END 14252b32700dSBram Moolenaar writefile(lines, 'XReloaded') 14262b32700dSBram Moolenaar g:loadCount = 0 14272b32700dSBram Moolenaar source XReloaded 14282b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1429a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 14302b32700dSBram Moolenaar source XReloaded 14312b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1432a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14332b32700dSBram Moolenaar source XReloaded 14342b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1435a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 14362b32700dSBram Moolenaar 143748e11c10SBram Moolenaar delete('XReloaded') 1438a6294955SBram Moolenaar delete('XExportReload') 14392b32700dSBram Moolenaar delfunc g:Values 14402b32700dSBram Moolenaar unlet g:loadCount 14412b32700dSBram Moolenaarenddef 14422b32700dSBram Moolenaar 14434c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1444cfcd011fSBram Moolenaar var lines =<< trim END 14458a7d6542SBram Moolenaar vim9script 14468a7d6542SBram Moolenaar const var = '' 1447cfcd011fSBram Moolenaar var valone = 1234 14488a7d6542SBram Moolenaar def MyFunc(arg: string) 14498a7d6542SBram Moolenaar valone = 5678 14508a7d6542SBram Moolenaar enddef 14518a7d6542SBram Moolenaar END 1452cfcd011fSBram Moolenaar var morelines =<< trim END 1453cfcd011fSBram Moolenaar var valtwo = 222 14548a7d6542SBram Moolenaar export def GetValtwo(): number 14558a7d6542SBram Moolenaar return valtwo 14568a7d6542SBram Moolenaar enddef 14578a7d6542SBram Moolenaar END 145803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 14598a7d6542SBram Moolenaar source Xreload.vim 14608a7d6542SBram Moolenaar source Xreload.vim 14618a7d6542SBram Moolenaar source Xreload.vim 14628a7d6542SBram Moolenaar 1463cfcd011fSBram Moolenaar var testlines =<< trim END 14648a7d6542SBram Moolenaar vim9script 14658a7d6542SBram Moolenaar def TheFunc() 14668a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 14678a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 14688a7d6542SBram Moolenaar enddef 14698a7d6542SBram Moolenaar TheFunc() 14708a7d6542SBram Moolenaar END 14718a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 14728a7d6542SBram Moolenaar source Ximport.vim 14738a7d6542SBram Moolenaar 1474f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1475f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14768a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14778a7d6542SBram Moolenaar source Ximport.vim 14788a7d6542SBram Moolenaar 1479f5be8cdbSBram Moolenaar # cannot declare a var twice 14808a7d6542SBram Moolenaar lines =<< trim END 14818a7d6542SBram Moolenaar vim9script 1482cfcd011fSBram Moolenaar var valone = 1234 1483cfcd011fSBram Moolenaar var valone = 5678 14848a7d6542SBram Moolenaar END 14858a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 148644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 14878a7d6542SBram Moolenaar 14888a7d6542SBram Moolenaar delete('Xreload.vim') 14898a7d6542SBram Moolenaar delete('Ximport.vim') 14908a7d6542SBram Moolenaarenddef 14918a7d6542SBram Moolenaar 149207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 149307a65d26SBram Moolenaar" compiled function using that variable must fail. 149407a65d26SBram Moolenaardef Test_script_reload_change_type() 149507a65d26SBram Moolenaar var lines =<< trim END 149607a65d26SBram Moolenaar vim9script noclear 149707a65d26SBram Moolenaar var str = 'string' 149807a65d26SBram Moolenaar def g:GetStr(): string 149907a65d26SBram Moolenaar return str .. 'xxx' 150007a65d26SBram Moolenaar enddef 150107a65d26SBram Moolenaar END 150207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 150307a65d26SBram Moolenaar source Xreload.vim 150407a65d26SBram Moolenaar echo g:GetStr() 150507a65d26SBram Moolenaar 150607a65d26SBram Moolenaar lines =<< trim END 150707a65d26SBram Moolenaar vim9script noclear 150807a65d26SBram Moolenaar var str = 1234 150907a65d26SBram Moolenaar END 151007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 151107a65d26SBram Moolenaar source Xreload.vim 151207a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 151307a65d26SBram Moolenaar 151407a65d26SBram Moolenaar delfunc g:GetStr 151507a65d26SBram Moolenaar delete('Xreload.vim') 151607a65d26SBram Moolenaarenddef 151707a65d26SBram Moolenaar 151895006e3dSBram Moolenaardef s:RetSome(): string 151995006e3dSBram Moolenaar return 'some' 152095006e3dSBram Moolenaarenddef 152195006e3dSBram Moolenaar 1522fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1523fe465a01SBram Moolenaar" script-local name. 1524fe465a01SBram Moolenaardef Test_vim9script_funcref() 1525cfcd011fSBram Moolenaar var sortlines =<< trim END 1526fe465a01SBram Moolenaar vim9script 1527fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1528bed36b93SBram Moolenaar return i2 - i1 1529fe465a01SBram Moolenaar enddef 1530fe465a01SBram Moolenaar 1531fe465a01SBram Moolenaar export def FastSort(): list<number> 1532fe465a01SBram Moolenaar return range(5)->sort(Compare) 1533fe465a01SBram Moolenaar enddef 1534fe465a01SBram Moolenaar END 1535fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1536fe465a01SBram Moolenaar 1537cfcd011fSBram Moolenaar var lines =<< trim END 1538fe465a01SBram Moolenaar vim9script 1539fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1540fe465a01SBram Moolenaar def Test() 1541fe465a01SBram Moolenaar g:result = FastSort() 1542fe465a01SBram Moolenaar enddef 1543fe465a01SBram Moolenaar Test() 1544fe465a01SBram Moolenaar END 1545fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1546fe465a01SBram Moolenaar 1547fe465a01SBram Moolenaar source Xscript.vim 1548fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1549fe465a01SBram Moolenaar 1550fe465a01SBram Moolenaar unlet g:result 1551fe465a01SBram Moolenaar delete('Xsort.vim') 1552fe465a01SBram Moolenaar delete('Xscript.vim') 155395006e3dSBram Moolenaar 1554cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 155595006e3dSBram Moolenaar assert_equal('some', Funcref()) 1556fe465a01SBram Moolenaarenddef 1557fe465a01SBram Moolenaar 1558601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1559601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1560601e76acSBram Moolenaar" function reference. 1561c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1562cfcd011fSBram Moolenaar var filterLines =<< trim END 1563c620c055SBram Moolenaar vim9script 1564c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1565c620c055SBram Moolenaar return idx % 2 == 1 1566c620c055SBram Moolenaar enddef 1567c620c055SBram Moolenaar export def FastFilter(): list<number> 1568c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1569c620c055SBram Moolenaar enddef 1570601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1571601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1572601e76acSBram Moolenaar enddef 1573c620c055SBram Moolenaar END 1574c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1575c620c055SBram Moolenaar 1576cfcd011fSBram Moolenaar var lines =<< trim END 1577c620c055SBram Moolenaar vim9script 1578601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1579c620c055SBram Moolenaar def Test() 1580cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1581c620c055SBram Moolenaar enddef 1582c620c055SBram Moolenaar Test() 1583601e76acSBram Moolenaar def TestDirect() 1584cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1585601e76acSBram Moolenaar enddef 1586601e76acSBram Moolenaar TestDirect() 1587c620c055SBram Moolenaar END 1588601e76acSBram Moolenaar CheckScriptSuccess(lines) 1589c620c055SBram Moolenaar delete('Xfilter.vim') 1590c620c055SBram Moolenaarenddef 1591c620c055SBram Moolenaar 15924c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1593cfcd011fSBram Moolenaar var first_lines =<< trim END 15944c17ad94SBram Moolenaar vim9script 15954c17ad94SBram Moolenaar def FuncYes(): string 15964c17ad94SBram Moolenaar return 'yes' 15974c17ad94SBram Moolenaar enddef 15984c17ad94SBram Moolenaar END 1599cfcd011fSBram Moolenaar var withno_lines =<< trim END 16004c17ad94SBram Moolenaar def FuncNo(): string 16014c17ad94SBram Moolenaar return 'no' 16024c17ad94SBram Moolenaar enddef 16034c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 16044c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 16054c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 160603afdcf1SBram Moolenaar enddef 160703afdcf1SBram Moolenaar END 1608cfcd011fSBram Moolenaar var nono_lines =<< trim END 160903afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 161003afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 161144d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 16124c17ad94SBram Moolenaar enddef 16134c17ad94SBram Moolenaar END 16144c17ad94SBram Moolenaar 16154c17ad94SBram Moolenaar # FuncNo() is defined 161603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16174c17ad94SBram Moolenaar source Xreloaded.vim 16184c17ad94SBram Moolenaar g:DoCheck(true) 16194c17ad94SBram Moolenaar 16204c17ad94SBram Moolenaar # FuncNo() is not redefined 162103afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 16224c17ad94SBram Moolenaar source Xreloaded.vim 16235082471fSBram Moolenaar g:DoCheck(false) 16244c17ad94SBram Moolenaar 16254c17ad94SBram Moolenaar # FuncNo() is back 162603afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 16274c17ad94SBram Moolenaar source Xreloaded.vim 16285082471fSBram Moolenaar g:DoCheck(false) 16294c17ad94SBram Moolenaar 16304c17ad94SBram Moolenaar delete('Xreloaded.vim') 16314c17ad94SBram Moolenaarenddef 16324c17ad94SBram Moolenaar 163389483d40SBram Moolenaardef Test_vim9script_reload_delvar() 163489483d40SBram Moolenaar # write the script with a script-local variable 1635cfcd011fSBram Moolenaar var lines =<< trim END 163689483d40SBram Moolenaar vim9script 1637cfcd011fSBram Moolenaar var name = 'string' 163889483d40SBram Moolenaar END 163989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 164089483d40SBram Moolenaar source XreloadVar.vim 164189483d40SBram Moolenaar 164289483d40SBram Moolenaar # now write the script using the same variable locally - works 164389483d40SBram Moolenaar lines =<< trim END 164489483d40SBram Moolenaar vim9script 164589483d40SBram Moolenaar def Func() 1646cfcd011fSBram Moolenaar var name = 'string' 164789483d40SBram Moolenaar enddef 164889483d40SBram Moolenaar END 164989483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 165089483d40SBram Moolenaar source XreloadVar.vim 165189483d40SBram Moolenaar 165289483d40SBram Moolenaar delete('XreloadVar.vim') 165389483d40SBram Moolenaarenddef 165489483d40SBram Moolenaar 16558a7d6542SBram Moolenaardef Test_import_absolute() 1656cfcd011fSBram Moolenaar var import_lines = [ 1657e6085c53SBram Moolenaar 'vim9script', 1658e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1659e6085c53SBram Moolenaar 'def UseExported()', 1660e6085c53SBram Moolenaar ' g:imported_abs = exported', 1661e6085c53SBram Moolenaar ' exported = 8888', 1662e6085c53SBram Moolenaar ' g:imported_after = exported', 1663e6085c53SBram Moolenaar 'enddef', 1664e6085c53SBram Moolenaar 'UseExported()', 1665e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1666e6085c53SBram Moolenaar ] 16678a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 16688a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 16698a7d6542SBram Moolenaar 16708a7d6542SBram Moolenaar source Ximport_abs.vim 16718a7d6542SBram Moolenaar 16728a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 16734e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1674fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1675fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1676fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1677fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1678fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1679fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1680fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1681fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1682fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1683fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1684e6085c53SBram Moolenaar g:import_disassembled) 1685b3ca9824SBram Moolenaar 1686b3ca9824SBram Moolenaar Undo_export_script_lines() 16878a7d6542SBram Moolenaar unlet g:imported_abs 16884e12a5dfSBram Moolenaar unlet g:import_disassembled 16898a7d6542SBram Moolenaar 16908a7d6542SBram Moolenaar delete('Ximport_abs.vim') 16918a7d6542SBram Moolenaar delete('Xexport_abs.vim') 16928a7d6542SBram Moolenaarenddef 16938a7d6542SBram Moolenaar 16948a7d6542SBram Moolenaardef Test_import_rtp() 1695cfcd011fSBram Moolenaar var import_lines = [ 1696e6085c53SBram Moolenaar 'vim9script', 1697e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1698e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1699e6085c53SBram Moolenaar ] 17008a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 17018a7d6542SBram Moolenaar mkdir('import') 17028a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 17038a7d6542SBram Moolenaar 1704cfcd011fSBram Moolenaar var save_rtp = &rtp 17058a7d6542SBram Moolenaar &rtp = getcwd() 17068a7d6542SBram Moolenaar source Ximport_rtp.vim 17078a7d6542SBram Moolenaar &rtp = save_rtp 17088a7d6542SBram Moolenaar 17098a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 17108a7d6542SBram Moolenaar 1711b3ca9824SBram Moolenaar Undo_export_script_lines() 1712b3ca9824SBram Moolenaar unlet g:imported_rtp 17138a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 171489483d40SBram Moolenaar delete('import', 'rf') 17158a7d6542SBram Moolenaarenddef 17168a7d6542SBram Moolenaar 171725e0f586SBram Moolenaardef Test_import_compile_error() 1718cfcd011fSBram Moolenaar var export_lines = [ 171925e0f586SBram Moolenaar 'vim9script', 172025e0f586SBram Moolenaar 'export def ExpFunc(): string', 172125e0f586SBram Moolenaar ' return notDefined', 172225e0f586SBram Moolenaar 'enddef', 172325e0f586SBram Moolenaar ] 172425e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 172525e0f586SBram Moolenaar 1726cfcd011fSBram Moolenaar var import_lines = [ 172725e0f586SBram Moolenaar 'vim9script', 172825e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 172925e0f586SBram Moolenaar 'def ImpFunc()', 173025e0f586SBram Moolenaar ' echo ExpFunc()', 173125e0f586SBram Moolenaar 'enddef', 173225e0f586SBram Moolenaar 'defcompile', 173325e0f586SBram Moolenaar ] 173425e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 173525e0f586SBram Moolenaar 173625e0f586SBram Moolenaar try 173725e0f586SBram Moolenaar source Ximport.vim 173825e0f586SBram Moolenaar catch /E1001/ 1739f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 17407707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 174125e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 174225e0f586SBram Moolenaar endtry 174325e0f586SBram Moolenaar 174425e0f586SBram Moolenaar delete('Xexported.vim') 174525e0f586SBram Moolenaar delete('Ximport.vim') 174625e0f586SBram Moolenaarenddef 174725e0f586SBram Moolenaar 1748c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1749cfcd011fSBram Moolenaar var lines = [ 1750c4ce36d4SBram Moolenaar 'vim9script', 1751c4ce36d4SBram Moolenaar 'def Func()', 1752c4ce36d4SBram Moolenaar ' eval [][0]', 1753c4ce36d4SBram Moolenaar 'enddef', 1754c4ce36d4SBram Moolenaar 'Func()', 1755c4ce36d4SBram Moolenaar ] 1756c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1757c4ce36d4SBram Moolenaar 1758c4ce36d4SBram Moolenaar for count in range(3) 1759c4ce36d4SBram Moolenaar try 1760c4ce36d4SBram Moolenaar source Xtestscript.vim 1761c4ce36d4SBram Moolenaar catch /E684/ 1762c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1763c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1764c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1765c4ce36d4SBram Moolenaar endtry 1766c4ce36d4SBram Moolenaar endfor 1767c4ce36d4SBram Moolenaar 1768c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1769c4ce36d4SBram Moolenaarenddef 1770c4ce36d4SBram Moolenaar 1771eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1772cfcd011fSBram Moolenaar var export_lines =<< trim END 1773eef2102eSBram Moolenaar vim9script 1774eef2102eSBram Moolenaar export def Func() 1775eef2102eSBram Moolenaar echo 'imported' 1776eef2102eSBram Moolenaar enddef 1777eef2102eSBram Moolenaar END 1778eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1779eef2102eSBram Moolenaar 1780cfcd011fSBram Moolenaar var lines =<< trim END 1781eef2102eSBram Moolenaar vim9script 1782eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1783eef2102eSBram Moolenaar def Func() 1784eef2102eSBram Moolenaar echo 'local to function' 1785eef2102eSBram Moolenaar enddef 1786eef2102eSBram Moolenaar END 1787eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1788eef2102eSBram Moolenaar 1789eef2102eSBram Moolenaar lines =<< trim END 1790eef2102eSBram Moolenaar vim9script 1791eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1792eef2102eSBram Moolenaar def Outer() 1793eef2102eSBram Moolenaar def Func() 1794eef2102eSBram Moolenaar echo 'local to function' 1795eef2102eSBram Moolenaar enddef 1796eef2102eSBram Moolenaar enddef 1797eef2102eSBram Moolenaar defcompile 1798eef2102eSBram Moolenaar END 1799eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1800eef2102eSBram Moolenaar 1801eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1802eef2102eSBram Moolenaarenddef 1803eef2102eSBram Moolenaar 1804b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1805cfcd011fSBram Moolenaar var lines =<< trim END 1806b9a2cac3SBram Moolenaar vim9script 1807b9a2cac3SBram Moolenaar def Func() 1808b9a2cac3SBram Moolenaar echo 'one' 1809b9a2cac3SBram Moolenaar enddef 1810b9a2cac3SBram Moolenaar def Func() 1811b9a2cac3SBram Moolenaar echo 'two' 1812b9a2cac3SBram Moolenaar enddef 1813b9a2cac3SBram Moolenaar END 1814b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1815fa211f3cSBram Moolenaar 1816fa211f3cSBram Moolenaar lines =<< trim END 1817fa211f3cSBram Moolenaar vim9script 1818fa211f3cSBram Moolenaar def Foo(): string 1819fa211f3cSBram Moolenaar return 'foo' 1820fa211f3cSBram Moolenaar enddef 1821fa211f3cSBram Moolenaar def Func() 1822cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1823fa211f3cSBram Moolenaar enddef 1824fa211f3cSBram Moolenaar defcompile 1825fa211f3cSBram Moolenaar END 1826fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1827b9a2cac3SBram Moolenaarenddef 1828b9a2cac3SBram Moolenaar 18298a7d6542SBram Moolenaardef Test_fixed_size_list() 1830f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1831cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 18328a7d6542SBram Moolenaar l->remove(0) 18338a7d6542SBram Moolenaar l->add(5) 18348a7d6542SBram Moolenaar l->insert(99, 1) 18350f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 18368a7d6542SBram Moolenaarenddef 18378a7d6542SBram Moolenaar 1838ae616494SBram Moolenaardef Test_no_insert_xit() 1839d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1840d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1841d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1842d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1843d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1844ae616494SBram Moolenaar 1845ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1846ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1847ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1848ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1849f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1850f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1851f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1852f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1853f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1854ae616494SBram Moolenaarenddef 1855ae616494SBram Moolenaar 1856158906cfSBram Moolenaardef IfElse(what: number): string 1857cfcd011fSBram Moolenaar var res = '' 1858158906cfSBram Moolenaar if what == 1 1859158906cfSBram Moolenaar res = "one" 1860158906cfSBram Moolenaar elseif what == 2 1861158906cfSBram Moolenaar res = "two" 1862a259d8d3SBram Moolenaar else 1863158906cfSBram Moolenaar res = "three" 1864a259d8d3SBram Moolenaar endif 1865158906cfSBram Moolenaar return res 1866a259d8d3SBram Moolenaarenddef 1867a259d8d3SBram Moolenaar 1868158906cfSBram Moolenaardef Test_if_elseif_else() 1869158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1870158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1871158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 18720f18b6d1SBram Moolenaarenddef 18730f18b6d1SBram Moolenaar 1874e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1875d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1876d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1877d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1878ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 1879d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 18806628b7ebSBram Moolenaar 18816628b7ebSBram Moolenaar var lines =<< trim END 18826628b7ebSBram Moolenaar var s = '' 18836628b7ebSBram Moolenaar if s = '' 18846628b7ebSBram Moolenaar endif 18856628b7ebSBram Moolenaar END 18866628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 18876628b7ebSBram Moolenaar 18886628b7ebSBram Moolenaar lines =<< trim END 18896628b7ebSBram Moolenaar var s = '' 18906628b7ebSBram Moolenaar if s == '' 18916628b7ebSBram Moolenaar elseif s = '' 18926628b7ebSBram Moolenaar endif 18936628b7ebSBram Moolenaar END 18946628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 1895e8c4abbbSBram Moolenaarenddef 1896e8c4abbbSBram Moolenaar 18976d69bf60SBram Moolenaarlet g:bool_true = v:true 18986d69bf60SBram Moolenaarlet g:bool_false = v:false 18996d69bf60SBram Moolenaar 19006d69bf60SBram Moolenaardef Test_if_const_expr() 1901cfcd011fSBram Moolenaar var res = false 19026d69bf60SBram Moolenaar if true ? true : false 19036d69bf60SBram Moolenaar res = true 19046d69bf60SBram Moolenaar endif 19056d69bf60SBram Moolenaar assert_equal(true, res) 19066d69bf60SBram Moolenaar 1907585fea7bSBram Moolenaar g:glob = 2 1908585fea7bSBram Moolenaar if false 19096797966dSBram Moolenaar execute('g:glob = 3') 1910585fea7bSBram Moolenaar endif 1911585fea7bSBram Moolenaar assert_equal(2, g:glob) 1912585fea7bSBram Moolenaar if true 19136797966dSBram Moolenaar execute('g:glob = 3') 1914585fea7bSBram Moolenaar endif 1915585fea7bSBram Moolenaar assert_equal(3, g:glob) 1916585fea7bSBram Moolenaar 19176d69bf60SBram Moolenaar res = false 19186d69bf60SBram Moolenaar if g:bool_true ? true : false 19196d69bf60SBram Moolenaar res = true 19206d69bf60SBram Moolenaar endif 19216d69bf60SBram Moolenaar assert_equal(true, res) 19226d69bf60SBram Moolenaar 19236d69bf60SBram Moolenaar res = false 19246d69bf60SBram Moolenaar if true ? g:bool_true : false 19256d69bf60SBram Moolenaar res = true 19266d69bf60SBram Moolenaar endif 19276d69bf60SBram Moolenaar assert_equal(true, res) 19286d69bf60SBram Moolenaar 19296d69bf60SBram Moolenaar res = false 19306d69bf60SBram Moolenaar if true ? true : g:bool_false 19316d69bf60SBram Moolenaar res = true 19326d69bf60SBram Moolenaar endif 19336d69bf60SBram Moolenaar assert_equal(true, res) 19346d69bf60SBram Moolenaar 19356d69bf60SBram Moolenaar res = false 19366d69bf60SBram Moolenaar if true ? false : true 19376d69bf60SBram Moolenaar res = true 19386d69bf60SBram Moolenaar endif 19396d69bf60SBram Moolenaar assert_equal(false, res) 19406d69bf60SBram Moolenaar 19416d69bf60SBram Moolenaar res = false 19426d69bf60SBram Moolenaar if false ? false : true 19436d69bf60SBram Moolenaar res = true 19446d69bf60SBram Moolenaar endif 19456d69bf60SBram Moolenaar assert_equal(true, res) 19466d69bf60SBram Moolenaar 19476d69bf60SBram Moolenaar res = false 19486d69bf60SBram Moolenaar if false ? true : false 19496d69bf60SBram Moolenaar res = true 19506d69bf60SBram Moolenaar endif 19516d69bf60SBram Moolenaar assert_equal(false, res) 19526d69bf60SBram Moolenaar 19536d69bf60SBram Moolenaar res = false 1954e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1955e8c4abbbSBram Moolenaar res = true 1956e8c4abbbSBram Moolenaar endif 1957e8c4abbbSBram Moolenaar assert_equal(false, res) 1958e8c4abbbSBram Moolenaar 1959e8c4abbbSBram Moolenaar res = false 19606d69bf60SBram Moolenaar if true && true 19616d69bf60SBram Moolenaar res = true 19626d69bf60SBram Moolenaar endif 19636d69bf60SBram Moolenaar assert_equal(true, res) 19646d69bf60SBram Moolenaar 19656d69bf60SBram Moolenaar res = false 19666d69bf60SBram Moolenaar if true && false 19676d69bf60SBram Moolenaar res = true 19686d69bf60SBram Moolenaar endif 19696d69bf60SBram Moolenaar assert_equal(false, res) 19706d69bf60SBram Moolenaar 19716d69bf60SBram Moolenaar res = false 19726d69bf60SBram Moolenaar if g:bool_true && false 19736d69bf60SBram Moolenaar res = true 19746d69bf60SBram Moolenaar endif 19756d69bf60SBram Moolenaar assert_equal(false, res) 19766d69bf60SBram Moolenaar 19776d69bf60SBram Moolenaar res = false 19786d69bf60SBram Moolenaar if true && g:bool_false 19796d69bf60SBram Moolenaar res = true 19806d69bf60SBram Moolenaar endif 19816d69bf60SBram Moolenaar assert_equal(false, res) 19826d69bf60SBram Moolenaar 19836d69bf60SBram Moolenaar res = false 19846d69bf60SBram Moolenaar if false && false 19856d69bf60SBram Moolenaar res = true 19866d69bf60SBram Moolenaar endif 19876d69bf60SBram Moolenaar assert_equal(false, res) 19886d69bf60SBram Moolenaar 19896d69bf60SBram Moolenaar res = false 19906d69bf60SBram Moolenaar if true || false 19916d69bf60SBram Moolenaar res = true 19926d69bf60SBram Moolenaar endif 19936d69bf60SBram Moolenaar assert_equal(true, res) 19946d69bf60SBram Moolenaar 19956d69bf60SBram Moolenaar res = false 19966d69bf60SBram Moolenaar if g:bool_true || false 19976d69bf60SBram Moolenaar res = true 19986d69bf60SBram Moolenaar endif 19996d69bf60SBram Moolenaar assert_equal(true, res) 20006d69bf60SBram Moolenaar 20016d69bf60SBram Moolenaar res = false 20026d69bf60SBram Moolenaar if true || g:bool_false 20036d69bf60SBram Moolenaar res = true 20046d69bf60SBram Moolenaar endif 20056d69bf60SBram Moolenaar assert_equal(true, res) 20066d69bf60SBram Moolenaar 20076d69bf60SBram Moolenaar res = false 20086d69bf60SBram Moolenaar if false || false 20096d69bf60SBram Moolenaar res = true 20106d69bf60SBram Moolenaar endif 20116d69bf60SBram Moolenaar assert_equal(false, res) 20123988f64fSBram Moolenaar 20133988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 20143988f64fSBram Moolenaar if false | eval 0 | endif 20153988f64fSBram Moolenaar if false | eval burp + 234 | endif 20163988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 20173988f64fSBram Moolenaar if false 20183988f64fSBram Moolenaar burp 20193988f64fSBram Moolenaar endif 202080c34ca3SBram Moolenaarenddef 20216d69bf60SBram Moolenaar 202280c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2023d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2024d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2025d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2026d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 20276d69bf60SBram Moolenaarenddef 20286d69bf60SBram Moolenaar 202972abcf42SBram Moolenaardef RunNested(i: number): number 2030cfcd011fSBram Moolenaar var x: number = 0 203172abcf42SBram Moolenaar if i % 2 203272abcf42SBram Moolenaar if 1 2033f5be8cdbSBram Moolenaar # comment 203472abcf42SBram Moolenaar else 2035f5be8cdbSBram Moolenaar # comment 203672abcf42SBram Moolenaar endif 203772abcf42SBram Moolenaar x += 1 203872abcf42SBram Moolenaar else 203972abcf42SBram Moolenaar x += 1000 204072abcf42SBram Moolenaar endif 204172abcf42SBram Moolenaar return x 204272abcf42SBram Moolenaarenddef 204372abcf42SBram Moolenaar 204472abcf42SBram Moolenaardef Test_nested_if() 204572abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 204672abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 204772abcf42SBram Moolenaarenddef 204872abcf42SBram Moolenaar 2049ad39c094SBram Moolenaardef Test_execute_cmd() 2050e4984290SBram Moolenaar # missing argument is ignored 2051e4984290SBram Moolenaar execute 2052e4984290SBram Moolenaar execute # comment 2053e4984290SBram Moolenaar 2054ad39c094SBram Moolenaar new 2055ad39c094SBram Moolenaar setline(1, 'default') 2056d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2057ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2058a72cfb80SBram Moolenaar 2059d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2060a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2061a72cfb80SBram Moolenaar 2062cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2063cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2064a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2065ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2066a72cfb80SBram Moolenaar 2067d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2068ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2069a72cfb80SBram Moolenaar 2070cfcd011fSBram Moolenaar var cmd_first = 'call ' 2071cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2072ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2073ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2074ad39c094SBram Moolenaar bwipe! 2075585fea7bSBram Moolenaar 2076cfcd011fSBram Moolenaar var n = true 20772d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 20782d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 20792d6b20d6SBram Moolenaar 2080e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2081e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2082e5abf7afSBram Moolenaar 2083d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2084d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2085d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2086ad39c094SBram Moolenaarenddef 2087ad39c094SBram Moolenaar 208847e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2089f5be8cdbSBram Moolenaar # only checks line continuation 2090cfcd011fSBram Moolenaar var lines =<< trim END 209147e880d6SBram Moolenaar vim9script 209247e880d6SBram Moolenaar execute 'g:someVar' 209347e880d6SBram Moolenaar .. ' = ' .. 209447e880d6SBram Moolenaar '28' 209547e880d6SBram Moolenaar assert_equal(28, g:someVar) 209647e880d6SBram Moolenaar unlet g:someVar 209747e880d6SBram Moolenaar END 209847e880d6SBram Moolenaar CheckScriptSuccess(lines) 209947e880d6SBram Moolenaarenddef 210047e880d6SBram Moolenaar 2101ad39c094SBram Moolenaardef Test_echo_cmd() 2102a72cfb80SBram Moolenaar echo 'some' # comment 2103585fea7bSBram Moolenaar echon 'thing' 2104ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2105ad39c094SBram Moolenaar 2106a72cfb80SBram Moolenaar echo "some" # comment 2107a72cfb80SBram Moolenaar echon "thing" 2108a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2109a72cfb80SBram Moolenaar 2110cfcd011fSBram Moolenaar var str1 = 'some' 2111cfcd011fSBram Moolenaar var str2 = 'more' 2112ad39c094SBram Moolenaar echo str1 str2 2113ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2114a72cfb80SBram Moolenaar 2115d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2116ad39c094SBram Moolenaarenddef 2117ad39c094SBram Moolenaar 2118f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2119f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2120f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2121f93c7feaSBram Moolenaar echo 'clear' 2122df069eecSBram Moolenaar :1messages 2123f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2124f93c7feaSBram Moolenaar 2125d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2126f93c7feaSBram Moolenaarenddef 2127f93c7feaSBram Moolenaar 212847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2129f5be8cdbSBram Moolenaar # only checks line continuation 2130cfcd011fSBram Moolenaar var lines =<< trim END 213147e880d6SBram Moolenaar vim9script 213247e880d6SBram Moolenaar echomsg 'here' 213347e880d6SBram Moolenaar .. ' is ' .. 213447e880d6SBram Moolenaar 'a message' 213547e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 213647e880d6SBram Moolenaar END 213747e880d6SBram Moolenaar CheckScriptSuccess(lines) 213847e880d6SBram Moolenaarenddef 213947e880d6SBram Moolenaar 2140f93c7feaSBram Moolenaardef Test_echoerr_cmd() 214140ee466cSBram Moolenaar try 214240ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 214340ee466cSBram Moolenaar catch 214440ee466cSBram Moolenaar assert_match('something wrong', v:exception) 214540ee466cSBram Moolenaar endtry 2146f93c7feaSBram Moolenaarenddef 2147f93c7feaSBram Moolenaar 214847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2149f5be8cdbSBram Moolenaar # only checks line continuation 2150cfcd011fSBram Moolenaar var lines =<< trim END 215147e880d6SBram Moolenaar vim9script 215247e880d6SBram Moolenaar try 215347e880d6SBram Moolenaar echoerr 'this' 215447e880d6SBram Moolenaar .. ' is ' .. 215547e880d6SBram Moolenaar 'wrong' 215647e880d6SBram Moolenaar catch 215747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 215847e880d6SBram Moolenaar endtry 215947e880d6SBram Moolenaar END 216047e880d6SBram Moolenaar CheckScriptSuccess(lines) 216147e880d6SBram Moolenaarenddef 216247e880d6SBram Moolenaar 216341fe0617SBram Moolenaardef Test_for_outside_of_function() 2164cfcd011fSBram Moolenaar var lines =<< trim END 216541fe0617SBram Moolenaar vim9script 216641fe0617SBram Moolenaar new 216741fe0617SBram Moolenaar for var in range(0, 3) 216841fe0617SBram Moolenaar append(line('$'), var) 216941fe0617SBram Moolenaar endfor 217041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 217141fe0617SBram Moolenaar bwipe! 217241fe0617SBram Moolenaar END 217341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 217441fe0617SBram Moolenaar source Xvim9for.vim 217541fe0617SBram Moolenaar delete('Xvim9for.vim') 217641fe0617SBram Moolenaarenddef 21778a7d6542SBram Moolenaar 2178e8c4abbbSBram Moolenaardef Test_for_loop() 2179cfcd011fSBram Moolenaar var result = '' 2180e8c4abbbSBram Moolenaar for cnt in range(7) 2181e8c4abbbSBram Moolenaar if cnt == 4 2182e8c4abbbSBram Moolenaar break 2183e8c4abbbSBram Moolenaar endif 2184e8c4abbbSBram Moolenaar if cnt == 2 2185e8c4abbbSBram Moolenaar continue 2186e8c4abbbSBram Moolenaar endif 2187e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2188e8c4abbbSBram Moolenaar endfor 2189e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 21900ad3e894SBram Moolenaar 2191cfcd011fSBram Moolenaar var concat = '' 21920ad3e894SBram Moolenaar for str in eval('["one", "two"]') 21930ad3e894SBram Moolenaar concat ..= str 21940ad3e894SBram Moolenaar endfor 21950ad3e894SBram Moolenaar assert_equal('onetwo', concat) 219638bd8de5SBram Moolenaar 219738bd8de5SBram Moolenaar var total = 0 219838bd8de5SBram Moolenaar for nr in 219938bd8de5SBram Moolenaar [1, 2, 3] 220038bd8de5SBram Moolenaar total += nr 220138bd8de5SBram Moolenaar endfor 220238bd8de5SBram Moolenaar assert_equal(6, total) 220338bd8de5SBram Moolenaar 220438bd8de5SBram Moolenaar total = 0 220538bd8de5SBram Moolenaar for nr 220638bd8de5SBram Moolenaar in [1, 2, 3] 220738bd8de5SBram Moolenaar total += nr 220838bd8de5SBram Moolenaar endfor 220938bd8de5SBram Moolenaar assert_equal(6, total) 221038bd8de5SBram Moolenaar 221138bd8de5SBram Moolenaar total = 0 221238bd8de5SBram Moolenaar for nr 221338bd8de5SBram Moolenaar in 221438bd8de5SBram Moolenaar [1, 2, 3] 221538bd8de5SBram Moolenaar total += nr 221638bd8de5SBram Moolenaar endfor 221738bd8de5SBram Moolenaar assert_equal(6, total) 2218036d0714SBram Moolenaar 2219036d0714SBram Moolenaar var res = "" 2220036d0714SBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2221036d0714SBram Moolenaar res ..= n .. s 2222036d0714SBram Moolenaar endfor 2223036d0714SBram Moolenaar assert_equal('1a2b', res) 2224e8c4abbbSBram Moolenaarenddef 2225e8c4abbbSBram Moolenaar 2226e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2227025cb1caSBram Moolenaar CheckDefFailure(['for '], 'E1097:') 2228025cb1caSBram Moolenaar CheckDefFailure(['for x'], 'E1097:') 2229025cb1caSBram Moolenaar CheckDefFailure(['for x in'], 'E1097:') 2230675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2231675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2232cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 2233822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 22342d870f8dSBram Moolenaar delfunc! g:Func 2235451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 2236675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2237675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2238675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2239e8c4abbbSBram Moolenaarenddef 2240e8c4abbbSBram Moolenaar 2241ea87069dSBram Moolenaardef Test_for_loop_script_var() 2242ea87069dSBram Moolenaar # cannot use s:var in a :def function 2243ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2244ea87069dSBram Moolenaar 2245ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2246ea87069dSBram Moolenaar var lines =<< trim END 2247ea87069dSBram Moolenaar vim9script 2248ea87069dSBram Moolenaar var total = 0 2249ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2250ea87069dSBram Moolenaar total += s:var 2251ea87069dSBram Moolenaar endfor 2252ea87069dSBram Moolenaar assert_equal(6, total) 2253ea87069dSBram Moolenaar 2254ea87069dSBram Moolenaar total = 0 2255ea87069dSBram Moolenaar for var in [1, 2, 3] 2256ea87069dSBram Moolenaar total += var 2257ea87069dSBram Moolenaar endfor 2258ea87069dSBram Moolenaar assert_equal(6, total) 2259ea87069dSBram Moolenaar END 2260ea87069dSBram Moolenaarenddef 2261ea87069dSBram Moolenaar 2262792f786aSBram Moolenaardef Test_for_loop_unpack() 22634b8a0651SBram Moolenaar var lines =<< trim END 2264792f786aSBram Moolenaar var result = [] 2265792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2266792f786aSBram Moolenaar result->add(v1) 2267792f786aSBram Moolenaar result->add(v2) 2268792f786aSBram Moolenaar endfor 2269792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2270792f786aSBram Moolenaar 2271792f786aSBram Moolenaar result = [] 2272792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2273792f786aSBram Moolenaar result->add(v1) 2274792f786aSBram Moolenaar result->add(v2) 2275792f786aSBram Moolenaar result->add(v3) 2276792f786aSBram Moolenaar endfor 2277792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2278792f786aSBram Moolenaar 22794b8a0651SBram Moolenaar result = [] 22804b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 22814b8a0651SBram Moolenaar result->add(&ts) 22824b8a0651SBram Moolenaar result->add(&sw) 22834b8a0651SBram Moolenaar endfor 22844b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 22854b8a0651SBram Moolenaar 22864b8a0651SBram Moolenaar var slist: list<string> 22874b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 22884b8a0651SBram Moolenaar slist->add($LOOPVAR) 22894b8a0651SBram Moolenaar slist->add(@r) 22904b8a0651SBram Moolenaar slist->add(v:errmsg) 22914b8a0651SBram Moolenaar endfor 22924b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 22934b8a0651SBram Moolenaar 22944b8a0651SBram Moolenaar slist = [] 22954b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 22964b8a0651SBram Moolenaar slist->add(g:globalvar) 22974b8a0651SBram Moolenaar slist->add(b:bufvar) 22984b8a0651SBram Moolenaar slist->add(w:winvar) 22994b8a0651SBram Moolenaar slist->add(t:tabvar) 23004b8a0651SBram Moolenaar endfor 23014b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2302f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 23034b8a0651SBram Moolenaar END 23044b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 23054b8a0651SBram Moolenaar 23064b8a0651SBram Moolenaar lines =<< trim END 2307792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2308792f786aSBram Moolenaar echo v1 v2 2309792f786aSBram Moolenaar endfor 2310792f786aSBram Moolenaar END 2311792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2312792f786aSBram Moolenaar 2313792f786aSBram Moolenaar lines =<< trim END 2314792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2315792f786aSBram Moolenaar echo v1 v2 2316792f786aSBram Moolenaar endfor 2317792f786aSBram Moolenaar END 2318792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2319792f786aSBram Moolenaar 2320792f786aSBram Moolenaar lines =<< trim END 2321792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2322792f786aSBram Moolenaar echo v1 2323792f786aSBram Moolenaar endfor 2324792f786aSBram Moolenaar END 2325792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2326792f786aSBram Moolenaarenddef 2327792f786aSBram Moolenaar 2328c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2329c150c09eSBram Moolenaar var looped = 0 2330c150c09eSBram Moolenaar var cleanup = 0 2331c150c09eSBram Moolenaar for i in range(3) 2332c150c09eSBram Moolenaar looped += 1 2333c150c09eSBram Moolenaar try 2334c150c09eSBram Moolenaar eval [][0] 2335c150c09eSBram Moolenaar catch 2336c150c09eSBram Moolenaar continue 2337c150c09eSBram Moolenaar finally 2338c150c09eSBram Moolenaar cleanup += 1 2339c150c09eSBram Moolenaar endtry 2340c150c09eSBram Moolenaar endfor 2341c150c09eSBram Moolenaar assert_equal(3, looped) 2342c150c09eSBram Moolenaar assert_equal(3, cleanup) 2343c150c09eSBram Moolenaarenddef 2344c150c09eSBram Moolenaar 2345d0df1aacSBram Moolenaardef Test_while_loop() 2346cfcd011fSBram Moolenaar var result = '' 2347cfcd011fSBram Moolenaar var cnt = 0 2348d0df1aacSBram Moolenaar while cnt < 555 2349d0df1aacSBram Moolenaar if cnt == 3 2350d0df1aacSBram Moolenaar break 2351d0df1aacSBram Moolenaar endif 2352d0df1aacSBram Moolenaar cnt += 1 2353d0df1aacSBram Moolenaar if cnt == 2 2354d0df1aacSBram Moolenaar continue 2355d0df1aacSBram Moolenaar endif 2356d0df1aacSBram Moolenaar result ..= cnt .. '_' 2357d0df1aacSBram Moolenaar endwhile 2358d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2359dee37dc7SBram Moolenaar 2360dee37dc7SBram Moolenaar var s = '' 23610123cc1eSBram Moolenaar while s == 'x' #{comment} 2362dee37dc7SBram Moolenaar endwhile 2363d0df1aacSBram Moolenaarenddef 2364d0df1aacSBram Moolenaar 2365e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2366675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2367675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2368675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2369675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2370675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2371675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2372675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 23736628b7ebSBram Moolenaar 23746628b7ebSBram Moolenaar var lines =<< trim END 23756628b7ebSBram Moolenaar var s = '' 23766628b7ebSBram Moolenaar while s = '' 23776628b7ebSBram Moolenaar endwhile 23786628b7ebSBram Moolenaar END 23796628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2380bd5da371SBram Moolenaarenddef 2381bd5da371SBram Moolenaar 23829645e2d9SBram Moolenaardef Test_interrupt_loop() 2383cfcd011fSBram Moolenaar var caught = false 2384cfcd011fSBram Moolenaar var x = 0 238597acfc78SBram Moolenaar try 23869645e2d9SBram Moolenaar while 1 23879645e2d9SBram Moolenaar x += 1 23889645e2d9SBram Moolenaar if x == 100 23899645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 23909645e2d9SBram Moolenaar endif 23919645e2d9SBram Moolenaar endwhile 239297acfc78SBram Moolenaar catch 239397acfc78SBram Moolenaar caught = true 239497acfc78SBram Moolenaar assert_equal(100, x) 239597acfc78SBram Moolenaar endtry 239697acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 239725859dd7SBram Moolenaar # consume the CTRL-C 239825859dd7SBram Moolenaar getchar(0) 23999645e2d9SBram Moolenaarenddef 240020431c9dSBram Moolenaar 24014fdae999SBram Moolenaardef Test_automatic_line_continuation() 2402cfcd011fSBram Moolenaar var mylist = [ 24034fdae999SBram Moolenaar 'one', 24044fdae999SBram Moolenaar 'two', 24054fdae999SBram Moolenaar 'three', 2406f5be8cdbSBram Moolenaar ] # comment 24074fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 24084fdae999SBram Moolenaar 2409cfcd011fSBram Moolenaar var mydict = { 2410e0de171eSBram Moolenaar ['one']: 1, 2411e0de171eSBram Moolenaar ['two']: 2, 2412e0de171eSBram Moolenaar ['three']: 24134fdae999SBram Moolenaar 3, 2414f5be8cdbSBram Moolenaar } # comment 2415e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2416e0de171eSBram Moolenaar mydict = { 24172c330432SBram Moolenaar one: 1, # comment 24182c330432SBram Moolenaar two: # comment 24192c330432SBram Moolenaar 2, # comment 24202c330432SBram Moolenaar three: 3 # comment 24212c330432SBram Moolenaar } 2422e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2423e0de171eSBram Moolenaar mydict = { 24242c330432SBram Moolenaar one: 1, 24254fdae999SBram Moolenaar two: 24264fdae999SBram Moolenaar 2, 24272c330432SBram Moolenaar three: 3 24284fdae999SBram Moolenaar } 2429e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2430e6085c53SBram Moolenaar 2431e6085c53SBram Moolenaar assert_equal( 2432e6085c53SBram Moolenaar ['one', 'two', 'three'], 2433e6085c53SBram Moolenaar split('one two three') 2434e6085c53SBram Moolenaar ) 24354fdae999SBram Moolenaarenddef 24364fdae999SBram Moolenaar 24377a092245SBram Moolenaardef Test_vim9_comment() 24387a092245SBram Moolenaar CheckScriptSuccess([ 24397a092245SBram Moolenaar 'vim9script', 24407a092245SBram Moolenaar '# something', 244193f82cbeSBram Moolenaar '#something', 244293f82cbeSBram Moolenaar '#{something', 24437a092245SBram Moolenaar ]) 244493f82cbeSBram Moolenaar 244593f82cbeSBram Moolenaar split Xfile 244693f82cbeSBram Moolenaar CheckScriptSuccess([ 244793f82cbeSBram Moolenaar 'vim9script', 244893f82cbeSBram Moolenaar 'edit #something', 244993f82cbeSBram Moolenaar ]) 245093f82cbeSBram Moolenaar CheckScriptSuccess([ 245193f82cbeSBram Moolenaar 'vim9script', 245293f82cbeSBram Moolenaar 'edit #{something', 245393f82cbeSBram Moolenaar ]) 245493f82cbeSBram Moolenaar close 245593f82cbeSBram Moolenaar 24567a092245SBram Moolenaar CheckScriptFailure([ 24577a092245SBram Moolenaar 'vim9script', 24587a092245SBram Moolenaar ':# something', 24597a092245SBram Moolenaar ], 'E488:') 24607a092245SBram Moolenaar CheckScriptFailure([ 24617a092245SBram Moolenaar '# something', 24627a092245SBram Moolenaar ], 'E488:') 24637a092245SBram Moolenaar CheckScriptFailure([ 24647a092245SBram Moolenaar ':# something', 24657a092245SBram Moolenaar ], 'E488:') 24667a092245SBram Moolenaar 24674a8d9f2eSBram Moolenaar { # block start 24684a8d9f2eSBram Moolenaar } # block end 24694a8d9f2eSBram Moolenaar CheckDefFailure([ 24704a8d9f2eSBram Moolenaar '{# comment', 24714a8d9f2eSBram Moolenaar ], 'E488:') 24724a8d9f2eSBram Moolenaar CheckDefFailure([ 24734a8d9f2eSBram Moolenaar '{', 24744a8d9f2eSBram Moolenaar '}# comment', 24754a8d9f2eSBram Moolenaar ], 'E488:') 24764a8d9f2eSBram Moolenaar 24774a8d9f2eSBram Moolenaar echo "yes" # comment 24784a8d9f2eSBram Moolenaar CheckDefFailure([ 24794a8d9f2eSBram Moolenaar 'echo "yes"# comment', 24804a8d9f2eSBram Moolenaar ], 'E488:') 24817a092245SBram Moolenaar CheckScriptSuccess([ 24827a092245SBram Moolenaar 'vim9script', 24837a092245SBram Moolenaar 'echo "yes" # something', 24847a092245SBram Moolenaar ]) 24857a092245SBram Moolenaar CheckScriptFailure([ 24867a092245SBram Moolenaar 'vim9script', 24877a092245SBram Moolenaar 'echo "yes"# something', 24887a092245SBram Moolenaar ], 'E121:') 24897a092245SBram Moolenaar CheckScriptFailure([ 24907a092245SBram Moolenaar 'vim9script', 24917a092245SBram Moolenaar 'echo# something', 2492f8103f27SBram Moolenaar ], 'E1144:') 24937a092245SBram Moolenaar CheckScriptFailure([ 24947a092245SBram Moolenaar 'echo "yes" # something', 24957a092245SBram Moolenaar ], 'E121:') 24967a092245SBram Moolenaar 24974a8d9f2eSBram Moolenaar exe "echo" # comment 24984a8d9f2eSBram Moolenaar CheckDefFailure([ 24994a8d9f2eSBram Moolenaar 'exe "echo"# comment', 25004a8d9f2eSBram Moolenaar ], 'E488:') 25014a8d9f2eSBram Moolenaar CheckScriptSuccess([ 25024a8d9f2eSBram Moolenaar 'vim9script', 25034a8d9f2eSBram Moolenaar 'exe "echo" # something', 25044a8d9f2eSBram Moolenaar ]) 25054a8d9f2eSBram Moolenaar CheckScriptFailure([ 25064a8d9f2eSBram Moolenaar 'vim9script', 25074a8d9f2eSBram Moolenaar 'exe "echo"# something', 25084a8d9f2eSBram Moolenaar ], 'E121:') 25094a8d9f2eSBram Moolenaar CheckScriptFailure([ 25104a8d9f2eSBram Moolenaar 'vim9script', 25114a8d9f2eSBram Moolenaar 'exe# something', 2512f8103f27SBram Moolenaar ], 'E1144:') 25134a8d9f2eSBram Moolenaar CheckScriptFailure([ 25144a8d9f2eSBram Moolenaar 'exe "echo" # something', 25154a8d9f2eSBram Moolenaar ], 'E121:') 25164a8d9f2eSBram Moolenaar 25177a092245SBram Moolenaar CheckDefFailure([ 25187a092245SBram Moolenaar 'try# comment', 25197a092245SBram Moolenaar ' echo "yes"', 25207a092245SBram Moolenaar 'catch', 25217a092245SBram Moolenaar 'endtry', 2522f8103f27SBram Moolenaar ], 'E1144:') 25232c5ed4e3SBram Moolenaar CheckScriptFailure([ 25242c5ed4e3SBram Moolenaar 'vim9script', 25252c5ed4e3SBram Moolenaar 'try# comment', 25262c5ed4e3SBram Moolenaar 'echo "yes"', 2527f8103f27SBram Moolenaar ], 'E1144:') 25287a092245SBram Moolenaar CheckDefFailure([ 25297a092245SBram Moolenaar 'try', 2530a72cfb80SBram Moolenaar ' throw#comment', 2531a72cfb80SBram Moolenaar 'catch', 2532a72cfb80SBram Moolenaar 'endtry', 2533f8103f27SBram Moolenaar ], 'E1144:') 2534a72cfb80SBram Moolenaar CheckDefFailure([ 2535a72cfb80SBram Moolenaar 'try', 2536a72cfb80SBram Moolenaar ' throw "yes"#comment', 2537a72cfb80SBram Moolenaar 'catch', 2538a72cfb80SBram Moolenaar 'endtry', 2539a72cfb80SBram Moolenaar ], 'E488:') 2540a72cfb80SBram Moolenaar CheckDefFailure([ 2541a72cfb80SBram Moolenaar 'try', 25427a092245SBram Moolenaar ' echo "yes"', 25437a092245SBram Moolenaar 'catch# comment', 25447a092245SBram Moolenaar 'endtry', 2545f8103f27SBram Moolenaar ], 'E1144:') 25462c5ed4e3SBram Moolenaar CheckScriptFailure([ 25472c5ed4e3SBram Moolenaar 'vim9script', 25482c5ed4e3SBram Moolenaar 'try', 25492c5ed4e3SBram Moolenaar ' echo "yes"', 25502c5ed4e3SBram Moolenaar 'catch# comment', 25512c5ed4e3SBram Moolenaar 'endtry', 2552f8103f27SBram Moolenaar ], 'E1144:') 25532c5ed4e3SBram Moolenaar CheckDefFailure([ 25542c5ed4e3SBram Moolenaar 'try', 25552c5ed4e3SBram Moolenaar ' echo "yes"', 25562c5ed4e3SBram Moolenaar 'catch /pat/# comment', 25572c5ed4e3SBram Moolenaar 'endtry', 25582c5ed4e3SBram Moolenaar ], 'E488:') 25597a092245SBram Moolenaar CheckDefFailure([ 25607a092245SBram Moolenaar 'try', 25617a092245SBram Moolenaar 'echo "yes"', 25627a092245SBram Moolenaar 'catch', 25637a092245SBram Moolenaar 'endtry# comment', 2564f8103f27SBram Moolenaar ], 'E1144:') 25652c5ed4e3SBram Moolenaar CheckScriptFailure([ 25662c5ed4e3SBram Moolenaar 'vim9script', 25672c5ed4e3SBram Moolenaar 'try', 25682c5ed4e3SBram Moolenaar ' echo "yes"', 25692c5ed4e3SBram Moolenaar 'catch', 25702c5ed4e3SBram Moolenaar 'endtry# comment', 2571f8103f27SBram Moolenaar ], 'E1144:') 25722c5ed4e3SBram Moolenaar 25732c5ed4e3SBram Moolenaar CheckScriptSuccess([ 25742c5ed4e3SBram Moolenaar 'vim9script', 25752c5ed4e3SBram Moolenaar 'hi # comment', 25762c5ed4e3SBram Moolenaar ]) 25772c5ed4e3SBram Moolenaar CheckScriptFailure([ 25782c5ed4e3SBram Moolenaar 'vim9script', 25792c5ed4e3SBram Moolenaar 'hi# comment', 2580f8103f27SBram Moolenaar ], 'E1144:') 25811966c248SBram Moolenaar CheckScriptSuccess([ 25821966c248SBram Moolenaar 'vim9script', 25831966c248SBram Moolenaar 'hi Search # comment', 25841966c248SBram Moolenaar ]) 25851966c248SBram Moolenaar CheckScriptFailure([ 25861966c248SBram Moolenaar 'vim9script', 25871966c248SBram Moolenaar 'hi Search# comment', 25881966c248SBram Moolenaar ], 'E416:') 25891966c248SBram Moolenaar CheckScriptSuccess([ 25901966c248SBram Moolenaar 'vim9script', 25911966c248SBram Moolenaar 'hi link This Search # comment', 25921966c248SBram Moolenaar ]) 25931966c248SBram Moolenaar CheckScriptFailure([ 25941966c248SBram Moolenaar 'vim9script', 25951966c248SBram Moolenaar 'hi link This That# comment', 25961966c248SBram Moolenaar ], 'E413:') 25971966c248SBram Moolenaar CheckScriptSuccess([ 25981966c248SBram Moolenaar 'vim9script', 25991966c248SBram Moolenaar 'hi clear This # comment', 26001966c248SBram Moolenaar 'hi clear # comment', 26011966c248SBram Moolenaar ]) 2602f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2603f5be8cdbSBram Moolenaar # hi clear This# comment', 26041966c248SBram Moolenaar CheckScriptFailure([ 26051966c248SBram Moolenaar 'vim9script', 26061966c248SBram Moolenaar 'hi clear# comment', 26071966c248SBram Moolenaar ], 'E416:') 26081966c248SBram Moolenaar 26091966c248SBram Moolenaar CheckScriptSuccess([ 26101966c248SBram Moolenaar 'vim9script', 26111966c248SBram Moolenaar 'hi Group term=bold', 26121966c248SBram Moolenaar 'match Group /todo/ # comment', 26131966c248SBram Moolenaar ]) 26141966c248SBram Moolenaar CheckScriptFailure([ 26151966c248SBram Moolenaar 'vim9script', 26161966c248SBram Moolenaar 'hi Group term=bold', 26171966c248SBram Moolenaar 'match Group /todo/# comment', 26181966c248SBram Moolenaar ], 'E488:') 26191966c248SBram Moolenaar CheckScriptSuccess([ 26201966c248SBram Moolenaar 'vim9script', 26211966c248SBram Moolenaar 'match # comment', 26221966c248SBram Moolenaar ]) 26231966c248SBram Moolenaar CheckScriptFailure([ 26241966c248SBram Moolenaar 'vim9script', 26251966c248SBram Moolenaar 'match# comment', 2626f8103f27SBram Moolenaar ], 'E1144:') 26271966c248SBram Moolenaar CheckScriptSuccess([ 26281966c248SBram Moolenaar 'vim9script', 26291966c248SBram Moolenaar 'match none # comment', 26301966c248SBram Moolenaar ]) 26311966c248SBram Moolenaar CheckScriptFailure([ 26321966c248SBram Moolenaar 'vim9script', 26331966c248SBram Moolenaar 'match none# comment', 26341966c248SBram Moolenaar ], 'E475:') 26351966c248SBram Moolenaar 26361966c248SBram Moolenaar CheckScriptSuccess([ 26371966c248SBram Moolenaar 'vim9script', 26381966c248SBram Moolenaar 'menutrans clear # comment', 26391966c248SBram Moolenaar ]) 26401966c248SBram Moolenaar CheckScriptFailure([ 26411966c248SBram Moolenaar 'vim9script', 26421966c248SBram Moolenaar 'menutrans clear# comment text', 26431966c248SBram Moolenaar ], 'E474:') 26441966c248SBram Moolenaar 26451966c248SBram Moolenaar CheckScriptSuccess([ 26461966c248SBram Moolenaar 'vim9script', 26471966c248SBram Moolenaar 'syntax clear # comment', 26481966c248SBram Moolenaar ]) 26491966c248SBram Moolenaar CheckScriptFailure([ 26501966c248SBram Moolenaar 'vim9script', 26511966c248SBram Moolenaar 'syntax clear# comment text', 26521966c248SBram Moolenaar ], 'E28:') 26531966c248SBram Moolenaar CheckScriptSuccess([ 26541966c248SBram Moolenaar 'vim9script', 26551966c248SBram Moolenaar 'syntax keyword Word some', 26561966c248SBram Moolenaar 'syntax clear Word # comment', 26571966c248SBram Moolenaar ]) 26581966c248SBram Moolenaar CheckScriptFailure([ 26591966c248SBram Moolenaar 'vim9script', 26601966c248SBram Moolenaar 'syntax keyword Word some', 26611966c248SBram Moolenaar 'syntax clear Word# comment text', 26621966c248SBram Moolenaar ], 'E28:') 26631966c248SBram Moolenaar 26641966c248SBram Moolenaar CheckScriptSuccess([ 26651966c248SBram Moolenaar 'vim9script', 26661966c248SBram Moolenaar 'syntax list # comment', 26671966c248SBram Moolenaar ]) 26681966c248SBram Moolenaar CheckScriptFailure([ 26691966c248SBram Moolenaar 'vim9script', 26701966c248SBram Moolenaar 'syntax list# comment text', 26711966c248SBram Moolenaar ], 'E28:') 26721966c248SBram Moolenaar 26731966c248SBram Moolenaar CheckScriptSuccess([ 26741966c248SBram Moolenaar 'vim9script', 26751966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 26761966c248SBram Moolenaar ]) 26771966c248SBram Moolenaar CheckScriptFailure([ 26781966c248SBram Moolenaar 'vim9script', 26791966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 26801966c248SBram Moolenaar ], 'E475:') 26811966c248SBram Moolenaar 26821966c248SBram Moolenaar CheckScriptSuccess([ 26831966c248SBram Moolenaar 'vim9script', 26841966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 26851966c248SBram Moolenaar ]) 26861966c248SBram Moolenaar CheckScriptFailure([ 26871966c248SBram Moolenaar 'vim9script', 26881966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 26891966c248SBram Moolenaar ], 'E789:') 26901966c248SBram Moolenaar 26911966c248SBram Moolenaar CheckScriptSuccess([ 26921966c248SBram Moolenaar 'vim9script', 26931966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 26941966c248SBram Moolenaar ]) 26951966c248SBram Moolenaar CheckScriptFailure([ 26961966c248SBram Moolenaar 'vim9script', 26971966c248SBram Moolenaar 'syntax match Word /pat/# comment', 26981966c248SBram Moolenaar ], 'E402:') 26991966c248SBram Moolenaar 27001966c248SBram Moolenaar CheckScriptSuccess([ 27011966c248SBram Moolenaar 'vim9script', 27021966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 27031966c248SBram Moolenaar ]) 27041966c248SBram Moolenaar CheckScriptFailure([ 27051966c248SBram Moolenaar 'vim9script', 27061966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 27071966c248SBram Moolenaar ], 'E475:') 27081966c248SBram Moolenaar CheckScriptFailure([ 27091966c248SBram Moolenaar 'vim9script', 27101966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 27111966c248SBram Moolenaar ], 'E406:') 27121966c248SBram Moolenaar CheckScriptFailure([ 27131966c248SBram Moolenaar 'vim9script', 27141966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 27151966c248SBram Moolenaar ], 'E475:') 27161966c248SBram Moolenaar 27171966c248SBram Moolenaar CheckScriptSuccess([ 27181966c248SBram Moolenaar 'vim9script', 27191966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 27201966c248SBram Moolenaar ]) 27211966c248SBram Moolenaar CheckScriptFailure([ 27221966c248SBram Moolenaar 'vim9script', 27231966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2724d032f34aSBram Moolenaar ], 'E402:') 27251966c248SBram Moolenaar 27261966c248SBram Moolenaar CheckScriptSuccess([ 27271966c248SBram Moolenaar 'vim9script', 27281966c248SBram Moolenaar 'syntax sync # comment', 27291966c248SBram Moolenaar ]) 27301966c248SBram Moolenaar CheckScriptFailure([ 27311966c248SBram Moolenaar 'vim9script', 27321966c248SBram Moolenaar 'syntax sync# comment', 27331966c248SBram Moolenaar ], 'E404:') 27341966c248SBram Moolenaar CheckScriptSuccess([ 27351966c248SBram Moolenaar 'vim9script', 27361966c248SBram Moolenaar 'syntax sync ccomment # comment', 27371966c248SBram Moolenaar ]) 27381966c248SBram Moolenaar CheckScriptFailure([ 27391966c248SBram Moolenaar 'vim9script', 27401966c248SBram Moolenaar 'syntax sync ccomment# comment', 27411966c248SBram Moolenaar ], 'E404:') 27421966c248SBram Moolenaar 27431966c248SBram Moolenaar CheckScriptSuccess([ 27441966c248SBram Moolenaar 'vim9script', 27451966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 27461966c248SBram Moolenaar ]) 27471966c248SBram Moolenaar CheckScriptFailure([ 27481966c248SBram Moolenaar 'vim9script', 27491966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 27501966c248SBram Moolenaar ], 'E475:') 2751a72cfb80SBram Moolenaar 2752a72cfb80SBram Moolenaar CheckScriptSuccess([ 2753a72cfb80SBram Moolenaar 'vim9script', 2754a72cfb80SBram Moolenaar 'command Echo echo # comment', 2755a72cfb80SBram Moolenaar 'command Echo # comment', 27562d870f8dSBram Moolenaar 'delcommand Echo', 2757a72cfb80SBram Moolenaar ]) 2758a72cfb80SBram Moolenaar CheckScriptFailure([ 2759a72cfb80SBram Moolenaar 'vim9script', 2760a72cfb80SBram Moolenaar 'command Echo echo# comment', 2761a72cfb80SBram Moolenaar 'Echo', 2762f8103f27SBram Moolenaar ], 'E1144:') 27632d870f8dSBram Moolenaar delcommand Echo 276470249ee8SBram Moolenaar 276570249ee8SBram Moolenaar var curdir = getcwd() 276670249ee8SBram Moolenaar CheckScriptSuccess([ 276770249ee8SBram Moolenaar 'command Echo cd " comment', 276870249ee8SBram Moolenaar 'Echo', 276970249ee8SBram Moolenaar 'delcommand Echo', 277070249ee8SBram Moolenaar ]) 277170249ee8SBram Moolenaar CheckScriptSuccess([ 2772090728adSBram Moolenaar 'vim9script', 277370249ee8SBram Moolenaar 'command Echo cd # comment', 277470249ee8SBram Moolenaar 'Echo', 277570249ee8SBram Moolenaar 'delcommand Echo', 277670249ee8SBram Moolenaar ]) 277770249ee8SBram Moolenaar CheckScriptFailure([ 277870249ee8SBram Moolenaar 'vim9script', 277970249ee8SBram Moolenaar 'command Echo cd " comment', 278070249ee8SBram Moolenaar 'Echo', 278170249ee8SBram Moolenaar ], 'E344:') 278270249ee8SBram Moolenaar delcommand Echo 278370249ee8SBram Moolenaar chdir(curdir) 278470249ee8SBram Moolenaar 2785a72cfb80SBram Moolenaar CheckScriptFailure([ 2786a72cfb80SBram Moolenaar 'vim9script', 2787a72cfb80SBram Moolenaar 'command Echo# comment', 2788a72cfb80SBram Moolenaar ], 'E182:') 2789a72cfb80SBram Moolenaar CheckScriptFailure([ 2790a72cfb80SBram Moolenaar 'vim9script', 2791a72cfb80SBram Moolenaar 'command Echo echo', 2792a72cfb80SBram Moolenaar 'command Echo# comment', 2793a72cfb80SBram Moolenaar ], 'E182:') 27942d870f8dSBram Moolenaar delcommand Echo 2795a72cfb80SBram Moolenaar 2796a72cfb80SBram Moolenaar CheckScriptSuccess([ 2797a72cfb80SBram Moolenaar 'vim9script', 2798a72cfb80SBram Moolenaar 'function # comment', 2799a72cfb80SBram Moolenaar ]) 2800a72cfb80SBram Moolenaar CheckScriptFailure([ 2801a72cfb80SBram Moolenaar 'vim9script', 28029898107fSBram Moolenaar 'function " comment', 28039898107fSBram Moolenaar ], 'E129:') 28049898107fSBram Moolenaar CheckScriptFailure([ 28059898107fSBram Moolenaar 'vim9script', 2806a72cfb80SBram Moolenaar 'function# comment', 2807f8103f27SBram Moolenaar ], 'E1144:') 2808a72cfb80SBram Moolenaar CheckScriptSuccess([ 2809a72cfb80SBram Moolenaar 'vim9script', 2810a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2811a72cfb80SBram Moolenaar ]) 2812a72cfb80SBram Moolenaar CheckScriptFailure([ 2813a72cfb80SBram Moolenaar 'vim9script', 2814a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2815a72cfb80SBram Moolenaar ], 'E488:') 2816a72cfb80SBram Moolenaar 2817a72cfb80SBram Moolenaar CheckScriptSuccess([ 2818a72cfb80SBram Moolenaar 'vim9script', 28194c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2820a72cfb80SBram Moolenaar 'endfunc', 28214c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2822a72cfb80SBram Moolenaar ]) 2823a72cfb80SBram Moolenaar CheckScriptFailure([ 2824a72cfb80SBram Moolenaar 'vim9script', 28254c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2826a72cfb80SBram Moolenaar 'endfunc', 28274c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2828a72cfb80SBram Moolenaar ], 'E488:') 2829a72cfb80SBram Moolenaar 2830a72cfb80SBram Moolenaar CheckScriptSuccess([ 2831a72cfb80SBram Moolenaar 'vim9script', 2832a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2833a72cfb80SBram Moolenaar ]) 2834a72cfb80SBram Moolenaar CheckScriptFailure([ 2835a72cfb80SBram Moolenaar 'vim9script', 2836a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2837a72cfb80SBram Moolenaar ], 'E488:') 2838e7e4838fSBram Moolenaar 2839e7e4838fSBram Moolenaar CheckScriptFailure([ 2840e7e4838fSBram Moolenaar 'def Test() " comment', 2841e7e4838fSBram Moolenaar 'enddef', 2842e7e4838fSBram Moolenaar ], 'E488:') 2843e7e4838fSBram Moolenaar CheckScriptFailure([ 2844e7e4838fSBram Moolenaar 'vim9script', 2845e7e4838fSBram Moolenaar 'def Test() " comment', 2846e7e4838fSBram Moolenaar 'enddef', 2847e7e4838fSBram Moolenaar ], 'E488:') 2848e7e4838fSBram Moolenaar 2849e7e4838fSBram Moolenaar CheckScriptSuccess([ 2850e7e4838fSBram Moolenaar 'func Test() " comment', 2851e7e4838fSBram Moolenaar 'endfunc', 28522d870f8dSBram Moolenaar 'delfunc Test', 2853e7e4838fSBram Moolenaar ]) 28549898107fSBram Moolenaar CheckScriptSuccess([ 2855e7e4838fSBram Moolenaar 'vim9script', 2856e7e4838fSBram Moolenaar 'func Test() " comment', 2857e7e4838fSBram Moolenaar 'endfunc', 28589898107fSBram Moolenaar ]) 2859e7e4838fSBram Moolenaar 2860e7e4838fSBram Moolenaar CheckScriptSuccess([ 2861e7e4838fSBram Moolenaar 'def Test() # comment', 2862e7e4838fSBram Moolenaar 'enddef', 2863e7e4838fSBram Moolenaar ]) 2864e7e4838fSBram Moolenaar CheckScriptFailure([ 2865e7e4838fSBram Moolenaar 'func Test() # comment', 2866e7e4838fSBram Moolenaar 'endfunc', 2867e7e4838fSBram Moolenaar ], 'E488:') 28682c5ed4e3SBram Moolenaarenddef 28692c5ed4e3SBram Moolenaar 28702c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 28712c5ed4e3SBram Moolenaar CheckCanRunGui 28722c5ed4e3SBram Moolenaar 28732c5ed4e3SBram Moolenaar CheckScriptFailure([ 28742c5ed4e3SBram Moolenaar 'vim9script', 28752c5ed4e3SBram Moolenaar 'gui#comment' 2876f8103f27SBram Moolenaar ], 'E1144:') 28772c5ed4e3SBram Moolenaar CheckScriptFailure([ 28782c5ed4e3SBram Moolenaar 'vim9script', 28792c5ed4e3SBram Moolenaar 'gui -f#comment' 28802c5ed4e3SBram Moolenaar ], 'E499:') 28817a092245SBram Moolenaarenddef 28827a092245SBram Moolenaar 2883a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 28846797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 28856797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2886a26b9700SBram Moolenaar 2887a26b9700SBram Moolenaar edit test.vim 2888a26b9700SBram Moolenaar doautocmd TabEnter #comment 2889a26b9700SBram Moolenaar assert_equal(1, g:entered) 2890a26b9700SBram Moolenaar 2891a26b9700SBram Moolenaar doautocmd TabEnter f.x 2892a26b9700SBram Moolenaar assert_equal(2, g:entered) 2893a26b9700SBram Moolenaar 2894a26b9700SBram Moolenaar g:entered = 0 2895a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2896a26b9700SBram Moolenaar assert_equal(2, g:entered) 2897a26b9700SBram Moolenaar 2898a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2899a26b9700SBram Moolenaar 2900a26b9700SBram Moolenaar au! TabEnter 2901a26b9700SBram Moolenaar unlet g:entered 2902d72c1bf0SBram Moolenaar 2903d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2904d72c1bf0SBram Moolenaar 'vim9script', 29056797966dSBram Moolenaar 'g:var = 123', 2906e55b1c09SBram Moolenaar 'b:var = 456', 2907e55b1c09SBram Moolenaar 'w:var = 777', 2908e55b1c09SBram Moolenaar 't:var = 888', 2909d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2910d72c1bf0SBram Moolenaar ]) 2911d72c1bf0SBram Moolenaar 2912d72c1bf0SBram Moolenaar CheckScriptFailure([ 2913d72c1bf0SBram Moolenaar 'vim9script', 2914cfcd011fSBram Moolenaar 'let var = 123', 2915cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2916cfcd011fSBram Moolenaar 2917cfcd011fSBram Moolenaar CheckScriptFailure([ 2918cfcd011fSBram Moolenaar 'vim9script', 2919cfcd011fSBram Moolenaar 'var g:var = 123', 2920e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2921e55b1c09SBram Moolenaar 2922e55b1c09SBram Moolenaar CheckScriptFailure([ 2923e55b1c09SBram Moolenaar 'vim9script', 2924cfcd011fSBram Moolenaar 'var b:var = 123', 2925e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2926e55b1c09SBram Moolenaar 2927e55b1c09SBram Moolenaar CheckScriptFailure([ 2928e55b1c09SBram Moolenaar 'vim9script', 2929cfcd011fSBram Moolenaar 'var w:var = 123', 2930e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2931e55b1c09SBram Moolenaar 2932e55b1c09SBram Moolenaar CheckScriptFailure([ 2933e55b1c09SBram Moolenaar 'vim9script', 2934cfcd011fSBram Moolenaar 'var t:var = 123', 2935e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2936e55b1c09SBram Moolenaar 2937e55b1c09SBram Moolenaar CheckScriptFailure([ 2938e55b1c09SBram Moolenaar 'vim9script', 2939cfcd011fSBram Moolenaar 'var v:version = 123', 2940e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2941e55b1c09SBram Moolenaar 2942e55b1c09SBram Moolenaar CheckScriptFailure([ 2943e55b1c09SBram Moolenaar 'vim9script', 2944cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2945e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 29466797966dSBram Moolenaar 29476797966dSBram Moolenaar CheckScriptFailure([ 29486797966dSBram Moolenaar 'vim9script', 29496797966dSBram Moolenaar 'g:var = 123', 295032e35117SBram Moolenaar 'unlet g:var# comment1', 2951d72c1bf0SBram Moolenaar ], 'E108:') 2952d72c1bf0SBram Moolenaar 2953d72c1bf0SBram Moolenaar CheckScriptFailure([ 2954d72c1bf0SBram Moolenaar 'let g:var = 123', 2955d72c1bf0SBram Moolenaar 'unlet g:var # something', 2956d72c1bf0SBram Moolenaar ], 'E488:') 2957faac4104SBram Moolenaar 2958faac4104SBram Moolenaar CheckScriptSuccess([ 2959faac4104SBram Moolenaar 'vim9script', 296032e35117SBram Moolenaar 'if 1 # comment2', 2961faac4104SBram Moolenaar ' echo "yes"', 2962faac4104SBram Moolenaar 'elseif 2 #comment', 2963faac4104SBram Moolenaar ' echo "no"', 2964faac4104SBram Moolenaar 'endif', 2965faac4104SBram Moolenaar ]) 2966faac4104SBram Moolenaar 2967faac4104SBram Moolenaar CheckScriptFailure([ 2968faac4104SBram Moolenaar 'vim9script', 296932e35117SBram Moolenaar 'if 1# comment3', 2970faac4104SBram Moolenaar ' echo "yes"', 2971faac4104SBram Moolenaar 'endif', 2972faac4104SBram Moolenaar ], 'E15:') 2973faac4104SBram Moolenaar 2974faac4104SBram Moolenaar CheckScriptFailure([ 2975faac4104SBram Moolenaar 'vim9script', 297632e35117SBram Moolenaar 'if 0 # comment4', 2977faac4104SBram Moolenaar ' echo "yes"', 2978faac4104SBram Moolenaar 'elseif 2#comment', 2979faac4104SBram Moolenaar ' echo "no"', 2980faac4104SBram Moolenaar 'endif', 2981faac4104SBram Moolenaar ], 'E15:') 2982faac4104SBram Moolenaar 2983faac4104SBram Moolenaar CheckScriptSuccess([ 2984faac4104SBram Moolenaar 'vim9script', 2985cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2986faac4104SBram Moolenaar ]) 2987faac4104SBram Moolenaar 2988faac4104SBram Moolenaar CheckScriptFailure([ 2989faac4104SBram Moolenaar 'vim9script', 2990cfcd011fSBram Moolenaar 'var v = 1# comment6', 299132e35117SBram Moolenaar ], 'E15:') 2992faac4104SBram Moolenaar 2993faac4104SBram Moolenaar CheckScriptSuccess([ 2994faac4104SBram Moolenaar 'vim9script', 2995faac4104SBram Moolenaar 'new' 2996d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2997df069eecSBram Moolenaar ':$', 2998faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2999faac4104SBram Moolenaar 'bwipe!', 3000faac4104SBram Moolenaar ]) 3001faac4104SBram Moolenaar 3002f5be8cdbSBram Moolenaar CheckScriptFailure([ 3003f5be8cdbSBram Moolenaar 'vim9script', 3004f5be8cdbSBram Moolenaar 'new' 3005d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3006f5be8cdbSBram Moolenaar ':$', 3007f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3008f5be8cdbSBram Moolenaar 'bwipe!', 3009f5be8cdbSBram Moolenaar ], 'E488:') 3010f5be8cdbSBram Moolenaar 3011f5be8cdbSBram Moolenaar CheckScriptFailure([ 3012f5be8cdbSBram Moolenaar 'vim9script', 3013f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3014f5be8cdbSBram Moolenaar ], 'E477:') 3015a26b9700SBram Moolenaarenddef 3016a26b9700SBram Moolenaar 30177e5bd91dSBram Moolenaardef Test_finish() 3018cfcd011fSBram Moolenaar var lines =<< trim END 30197e5bd91dSBram Moolenaar vim9script 30206797966dSBram Moolenaar g:res = 'one' 30217e5bd91dSBram Moolenaar if v:false | finish | endif 30226797966dSBram Moolenaar g:res = 'two' 30237e5bd91dSBram Moolenaar finish 30246797966dSBram Moolenaar g:res = 'three' 30257e5bd91dSBram Moolenaar END 30267e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 30277e5bd91dSBram Moolenaar source Xfinished 30287e5bd91dSBram Moolenaar assert_equal('two', g:res) 30297e5bd91dSBram Moolenaar 30307e5bd91dSBram Moolenaar unlet g:res 30317e5bd91dSBram Moolenaar delete('Xfinished') 30327e5bd91dSBram Moolenaarenddef 30337e5bd91dSBram Moolenaar 3034a5d0077eSBram Moolenaardef Test_forward_declaration() 3035cfcd011fSBram Moolenaar var lines =<< trim END 3036a5d0077eSBram Moolenaar vim9script 3037a5d0077eSBram Moolenaar def GetValue(): string 3038a5d0077eSBram Moolenaar return theVal 3039a5d0077eSBram Moolenaar enddef 3040cfcd011fSBram Moolenaar var theVal = 'something' 3041822ba247SBram Moolenaar g:initVal = GetValue() 3042a5d0077eSBram Moolenaar theVal = 'else' 3043a5d0077eSBram Moolenaar g:laterVal = GetValue() 3044a5d0077eSBram Moolenaar END 3045a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3046a5d0077eSBram Moolenaar source Xforward 3047a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3048a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3049a5d0077eSBram Moolenaar 3050a5d0077eSBram Moolenaar unlet g:initVal 3051a5d0077eSBram Moolenaar unlet g:laterVal 3052a5d0077eSBram Moolenaar delete('Xforward') 3053a5d0077eSBram Moolenaarenddef 3054a5d0077eSBram Moolenaar 30559721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3056a6294955SBram Moolenaar var vim9_lines =<< trim END 3057a6294955SBram Moolenaar vim9script 3058a6294955SBram Moolenaar var local = 'local' 3059a6294955SBram Moolenaar g:global = 'global' 3060a6294955SBram Moolenaar export var exported = 'exported' 3061a6294955SBram Moolenaar export def GetText(): string 3062a6294955SBram Moolenaar return 'text' 3063a6294955SBram Moolenaar enddef 3064a6294955SBram Moolenaar END 3065a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3066a6294955SBram Moolenaar 3067cfcd011fSBram Moolenaar var legacy_lines =<< trim END 30689721fb4eSBram Moolenaar source Xvim9_script.vim 30699721fb4eSBram Moolenaar 30709721fb4eSBram Moolenaar call assert_false(exists('local')) 30719721fb4eSBram Moolenaar call assert_false(exists('exported')) 30729721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 30739721fb4eSBram Moolenaar call assert_equal('global', global) 30749721fb4eSBram Moolenaar call assert_equal('global', g:global) 30759721fb4eSBram Moolenaar 30769721fb4eSBram Moolenaar " imported variable becomes script-local 30779721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 30789721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 30799721fb4eSBram Moolenaar call assert_false(exists('exported')) 30809721fb4eSBram Moolenaar 30819721fb4eSBram Moolenaar " imported function becomes script-local 30829721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 30839721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 30849721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 30859721fb4eSBram Moolenaar END 30869721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 30879721fb4eSBram Moolenaar 30889721fb4eSBram Moolenaar source Xlegacy_script.vim 30899721fb4eSBram Moolenaar assert_equal('global', g:global) 3090f5be8cdbSBram Moolenaar unlet g:global 30919721fb4eSBram Moolenaar 30929721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 30939721fb4eSBram Moolenaar delete('Xvim9_script.vim') 30949721fb4eSBram Moolenaarenddef 3095a5d0077eSBram Moolenaar 30967d699701SBram Moolenaarfunc Test_vim9script_not_global() 30977d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 30987d699701SBram Moolenaar let vim9lines =<< trim END 30997d699701SBram Moolenaar vim9script 3100cfcd011fSBram Moolenaar var name = 'local' 31017d699701SBram Moolenaar func TheFunc() 31027d699701SBram Moolenaar echo 'local' 31037d699701SBram Moolenaar endfunc 31047d699701SBram Moolenaar def DefFunc() 31057d699701SBram Moolenaar echo 'local' 31067d699701SBram Moolenaar enddef 31077d699701SBram Moolenaar END 31087d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 31097d699701SBram Moolenaar source Xvim9script.vim 31107d699701SBram Moolenaar try 31117d699701SBram Moolenaar echo g:var 31127d699701SBram Moolenaar assert_report('did not fail') 31137d699701SBram Moolenaar catch /E121:/ 31147d699701SBram Moolenaar " caught 31157d699701SBram Moolenaar endtry 31167d699701SBram Moolenaar try 31177d699701SBram Moolenaar call TheFunc() 31187d699701SBram Moolenaar assert_report('did not fail') 31197d699701SBram Moolenaar catch /E117:/ 31207d699701SBram Moolenaar " caught 31217d699701SBram Moolenaar endtry 31227d699701SBram Moolenaar try 31237d699701SBram Moolenaar call DefFunc() 31247d699701SBram Moolenaar assert_report('did not fail') 31257d699701SBram Moolenaar catch /E117:/ 31267d699701SBram Moolenaar " caught 31277d699701SBram Moolenaar endtry 31287d699701SBram Moolenaar 312925859dd7SBram Moolenaar call delete('Xvim9script.vim') 31307d699701SBram Moolenaarendfunc 31317d699701SBram Moolenaar 3132eeb27bfeSBram Moolenaardef Test_vim9_copen() 3133eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3134eeb27bfeSBram Moolenaar copen 3135eeb27bfeSBram Moolenaar quit 3136eeb27bfeSBram Moolenaarenddef 3137eeb27bfeSBram Moolenaar 313803290b84SBram Moolenaar" test using an auto-loaded function and variable 31392d6b20d6SBram Moolenaardef Test_vim9_autoload() 3140cfcd011fSBram Moolenaar var lines =<< trim END 31412d6b20d6SBram Moolenaar vim9script 314203290b84SBram Moolenaar def some#gettest(): string 314303290b84SBram Moolenaar return 'test' 314403290b84SBram Moolenaar enddef 314503290b84SBram Moolenaar g:some#name = 'name' 314603290b84SBram Moolenaar END 314703290b84SBram Moolenaar 314803290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 314903290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 315003290b84SBram Moolenaar var save_rtp = &rtp 315103290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 315203290b84SBram Moolenaar 315303290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 315403290b84SBram Moolenaar assert_equal('name', g:some#name) 315503290b84SBram Moolenaar g:some#other = 'other' 315603290b84SBram Moolenaar assert_equal('other', g:some#other) 315703290b84SBram Moolenaar 315817f700acSBram Moolenaar # upper case script name works 315917f700acSBram Moolenaar lines =<< trim END 316017f700acSBram Moolenaar vim9script 316117f700acSBram Moolenaar def Other#getOther(): string 316217f700acSBram Moolenaar return 'other' 316317f700acSBram Moolenaar enddef 316417f700acSBram Moolenaar END 316517f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 316617f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 316717f700acSBram Moolenaar 316803290b84SBram Moolenaar delete('Xdir', 'rf') 316903290b84SBram Moolenaar &rtp = save_rtp 317003290b84SBram Moolenaarenddef 317103290b84SBram Moolenaar 317203290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 317303290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 317403290b84SBram Moolenaar var lines =<< trim END 317503290b84SBram Moolenaar vim9script 31762d6b20d6SBram Moolenaar def foo#test() 31772d6b20d6SBram Moolenaar echomsg getreg('"') 31782d6b20d6SBram Moolenaar enddef 31792d6b20d6SBram Moolenaar END 31802d6b20d6SBram Moolenaar 31812d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 31822d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3183cfcd011fSBram Moolenaar var save_rtp = &rtp 31842d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 31852d6b20d6SBram Moolenaar augroup test 31862d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 31872d6b20d6SBram Moolenaar augroup END 31882d6b20d6SBram Moolenaar 31892d6b20d6SBram Moolenaar normal Y 31902d6b20d6SBram Moolenaar 31912d6b20d6SBram Moolenaar augroup test 31922d6b20d6SBram Moolenaar autocmd! 31932d6b20d6SBram Moolenaar augroup END 31942d6b20d6SBram Moolenaar delete('Xdir', 'rf') 31952d6b20d6SBram Moolenaar &rtp = save_rtp 31962d6b20d6SBram Moolenaarenddef 31972d6b20d6SBram Moolenaar 319877e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 319977e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3200cfcd011fSBram Moolenaar var lines =<< trim END 320177e5dcc3SBram Moolenaar vim9script 320277e5dcc3SBram Moolenaar def crash#func() 320377e5dcc3SBram Moolenaar try 320477e5dcc3SBram Moolenaar for x in List() 320577e5dcc3SBram Moolenaar endfor 320677e5dcc3SBram Moolenaar catch 320777e5dcc3SBram Moolenaar endtry 320877e5dcc3SBram Moolenaar g:ok = true 320977e5dcc3SBram Moolenaar enddef 321077e5dcc3SBram Moolenaar fu List() 321177e5dcc3SBram Moolenaar invalid 321277e5dcc3SBram Moolenaar endfu 321377e5dcc3SBram Moolenaar try 321448e11c10SBram Moolenaar alsoinvalid 321577e5dcc3SBram Moolenaar catch /wontmatch/ 321677e5dcc3SBram Moolenaar endtry 321777e5dcc3SBram Moolenaar END 321877e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 321977e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 322077e5dcc3SBram Moolenaar 322177e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 322277e5dcc3SBram Moolenaar lines =<< trim END 322377e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 322477e5dcc3SBram Moolenaar call crash#func() 322577e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 32269c4f5520SBram Moolenaar qall! 322777e5dcc3SBram Moolenaar END 322877e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 322977e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 323077e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 323177e5dcc3SBram Moolenaar 323277e5dcc3SBram Moolenaar delete('Xdidit') 323377e5dcc3SBram Moolenaar delete('Xscript') 323477e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 323503290b84SBram Moolenaar 323603290b84SBram Moolenaar lines =<< trim END 323703290b84SBram Moolenaar vim9script 323803290b84SBram Moolenaar var foo#bar = 'asdf' 323903290b84SBram Moolenaar END 324003290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 324177e5dcc3SBram Moolenaarenddef 324277e5dcc3SBram Moolenaar 324381e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 324481e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 324581e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3246cfcd011fSBram Moolenaar var lines =<< trim END 324781e17fbeSBram Moolenaar let s:counter = 1 324881e17fbeSBram Moolenaar def s:Func() 324981e17fbeSBram Moolenaar au! CursorHold 325081e17fbeSBram Moolenaar au CursorHold * s:counter += 1 325181e17fbeSBram Moolenaar enddef 325281e17fbeSBram Moolenaar call s:Func() 325381e17fbeSBram Moolenaar doau CursorHold 325481e17fbeSBram Moolenaar call assert_equal(2, s:counter) 325581e17fbeSBram Moolenaar au! CursorHold 325681e17fbeSBram Moolenaar END 325781e17fbeSBram Moolenaar CheckScriptSuccess(lines) 325881e17fbeSBram Moolenaarenddef 325981e17fbeSBram Moolenaar 32603896a105SBram Moolenaardef Test_cmdline_win() 32613896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 32623896a105SBram Moolenaar # the command line window. 32633896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3264cfcd011fSBram Moolenaar var export_lines =<< trim END 32653896a105SBram Moolenaar vim9script 3266cfcd011fSBram Moolenaar export var That = 'yes' 32673896a105SBram Moolenaar END 32683896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3269cfcd011fSBram Moolenaar var import_lines =<< trim END 32703896a105SBram Moolenaar vim9script 32713896a105SBram Moolenaar import That from './Xexport.vim' 32723896a105SBram Moolenaar END 32733896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3274cfcd011fSBram Moolenaar var save_rtp = &rtp 32753896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 32763896a105SBram Moolenaar syntax on 32773896a105SBram Moolenaar augroup CmdWin 32783896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 32793896a105SBram Moolenaar augroup END 32803896a105SBram Moolenaar # this will open and also close the cmdline window 32813896a105SBram Moolenaar feedkeys('q:', 'xt') 32823896a105SBram Moolenaar assert_equal('yes', g:got_there) 32833896a105SBram Moolenaar 32843896a105SBram Moolenaar augroup CmdWin 32853896a105SBram Moolenaar au! 32863896a105SBram Moolenaar augroup END 32873896a105SBram Moolenaar &rtp = save_rtp 32883896a105SBram Moolenaar delete('rtp', 'rf') 32893896a105SBram Moolenaarenddef 32903896a105SBram Moolenaar 3291e3d4685fSBram Moolenaardef Test_invalid_sid() 3292e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 329325859dd7SBram Moolenaar 32949c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3295d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3296e3d4685fSBram Moolenaar endif 3297e3d4685fSBram Moolenaar delete('Xdidit') 3298e3d4685fSBram Moolenaarenddef 3299e3d4685fSBram Moolenaar 33009ec7026fSBram Moolenaardef Test_restoring_cpo() 33019ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 33029ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 33039ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 33049ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 33059ec7026fSBram Moolenaar endif 33069ec7026fSBram Moolenaar delete('Xsourced') 33079ec7026fSBram Moolenaar delete('Xclose') 3308090728adSBram Moolenaar delete('Xdone') 33090123cc1eSBram Moolenaar 33100123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 33110123cc1eSBram Moolenaar set cpo=aABceFsMny> 33120123cc1eSBram Moolenaar edit XanotherScript 33130123cc1eSBram Moolenaar so % 33140123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 33150123cc1eSBram Moolenaar :1del 33160123cc1eSBram Moolenaar w 33170123cc1eSBram Moolenaar so % 33180123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 33190123cc1eSBram Moolenaar 33200123cc1eSBram Moolenaar delete('XanotherScript') 33210123cc1eSBram Moolenaar set cpo&vim 33229ec7026fSBram Moolenaarenddef 33239ec7026fSBram Moolenaar 33249ec7026fSBram Moolenaar 3325f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3326cfcd011fSBram Moolenaar var lines =<< trim END 3327cfcd011fSBram Moolenaar var name: any 3328cfcd011fSBram Moolenaar assert_equal(0, name) 3329f0afd9e1SBram Moolenaar END 3330f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3331f0afd9e1SBram Moolenaarenddef 3332f0afd9e1SBram Moolenaar 33337e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 333458dbef33SBram Moolenaar CheckRunVimInTerminal 333558dbef33SBram Moolenaar 33367e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 33377e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 33387e9210eaSBram Moolenaarendfunc 33397e9210eaSBram Moolenaar 33407e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 33419c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3342cfcd011fSBram Moolenaar var lines =<< trim END 33439c4f5520SBram Moolenaar func CheckAndQuit() 33449c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 33459c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 33469c4f5520SBram Moolenaar endfunc 33479c4f5520SBram Moolenaar END 33489c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 33499c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3350e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 33519c4f5520SBram Moolenaar # define Afunc() on the command line 33529c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 33539c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 33542949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 33559c4f5520SBram Moolenaar 33569c4f5520SBram Moolenaar call StopVimInTerminal(buf) 33579c4f5520SBram Moolenaar delete('XcallFunc') 33589c4f5520SBram Moolenaar delete('Xdidcmd') 33599c4f5520SBram Moolenaarenddef 33609c4f5520SBram Moolenaar 3361fcdc5d83SBram Moolenaardef Test_script_var_scope() 3362fcdc5d83SBram Moolenaar var lines =<< trim END 3363fcdc5d83SBram Moolenaar vim9script 3364fcdc5d83SBram Moolenaar if true 3365fcdc5d83SBram Moolenaar if true 3366fcdc5d83SBram Moolenaar var one = 'one' 3367fcdc5d83SBram Moolenaar echo one 3368fcdc5d83SBram Moolenaar endif 3369fcdc5d83SBram Moolenaar echo one 3370fcdc5d83SBram Moolenaar endif 3371fcdc5d83SBram Moolenaar END 3372fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3373fcdc5d83SBram Moolenaar 3374fcdc5d83SBram Moolenaar lines =<< trim END 3375fcdc5d83SBram Moolenaar vim9script 3376fcdc5d83SBram Moolenaar if true 3377fcdc5d83SBram Moolenaar if false 3378fcdc5d83SBram Moolenaar var one = 'one' 3379fcdc5d83SBram Moolenaar echo one 3380fcdc5d83SBram Moolenaar else 3381fcdc5d83SBram Moolenaar var one = 'one' 3382fcdc5d83SBram Moolenaar echo one 3383fcdc5d83SBram Moolenaar endif 3384fcdc5d83SBram Moolenaar echo one 3385fcdc5d83SBram Moolenaar endif 3386fcdc5d83SBram Moolenaar END 3387fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 3388fcdc5d83SBram Moolenaar 3389fcdc5d83SBram Moolenaar lines =<< trim END 3390fcdc5d83SBram Moolenaar vim9script 3391fcdc5d83SBram Moolenaar while true 3392fcdc5d83SBram Moolenaar var one = 'one' 3393fcdc5d83SBram Moolenaar echo one 3394fcdc5d83SBram Moolenaar break 3395fcdc5d83SBram Moolenaar endwhile 3396fcdc5d83SBram Moolenaar echo one 3397fcdc5d83SBram Moolenaar END 3398fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3399fcdc5d83SBram Moolenaar 3400fcdc5d83SBram Moolenaar lines =<< trim END 3401fcdc5d83SBram Moolenaar vim9script 3402fcdc5d83SBram Moolenaar for i in range(1) 3403fcdc5d83SBram Moolenaar var one = 'one' 3404fcdc5d83SBram Moolenaar echo one 3405fcdc5d83SBram Moolenaar endfor 3406fcdc5d83SBram Moolenaar echo one 3407fcdc5d83SBram Moolenaar END 3408fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 34099becdf2bSBram Moolenaar 34109becdf2bSBram Moolenaar lines =<< trim END 34119becdf2bSBram Moolenaar vim9script 34129becdf2bSBram Moolenaar { 34139becdf2bSBram Moolenaar var one = 'one' 34149becdf2bSBram Moolenaar assert_equal('one', one) 34159becdf2bSBram Moolenaar } 34169becdf2bSBram Moolenaar assert_false(exists('one')) 34179becdf2bSBram Moolenaar assert_false(exists('s:one')) 34189becdf2bSBram Moolenaar END 34199becdf2bSBram Moolenaar CheckScriptSuccess(lines) 34209becdf2bSBram Moolenaar 34219becdf2bSBram Moolenaar lines =<< trim END 34229becdf2bSBram Moolenaar vim9script 34239becdf2bSBram Moolenaar { 34249becdf2bSBram Moolenaar var one = 'one' 34259becdf2bSBram Moolenaar echo one 34269becdf2bSBram Moolenaar } 34279becdf2bSBram Moolenaar echo one 34289becdf2bSBram Moolenaar END 34299becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3430fcdc5d83SBram Moolenaarenddef 3431fcdc5d83SBram Moolenaar 3432352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3433352134bbSBram Moolenaar var lines =<< trim END 3434352134bbSBram Moolenaar vim9script 3435352134bbSBram Moolenaar def Callback(...l: any) 3436352134bbSBram Moolenaar try 3437352134bbSBram Moolenaar var x: string 3438352134bbSBram Moolenaar var y: string 3439352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3440352134bbSBram Moolenaar [x, y] = [''] 3441352134bbSBram Moolenaar catch 3442352134bbSBram Moolenaar g:caught = 'yes' 3443352134bbSBram Moolenaar endtry 3444352134bbSBram Moolenaar enddef 3445e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3446352134bbSBram Moolenaar feedkeys("\r", 'xt') 3447352134bbSBram Moolenaar END 3448352134bbSBram Moolenaar CheckScriptSuccess(lines) 3449352134bbSBram Moolenaar 3450352134bbSBram Moolenaar unlet g:caught 3451352134bbSBram Moolenaarenddef 3452352134bbSBram Moolenaar 3453631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3454631e8f93SBram Moolenaar if !has('unix') || !has('job') 3455631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3456631e8f93SBram Moolenaar endif 3457631e8f93SBram Moolenaar var lines =<< trim END 3458631e8f93SBram Moolenaar vim9script 3459631e8f93SBram Moolenaar var source: list<number> 3460631e8f93SBram Moolenaar def Out_cb(...l: any) 3461631e8f93SBram Moolenaar eval [][0] 3462631e8f93SBram Moolenaar enddef 3463631e8f93SBram Moolenaar def Exit_cb(...l: any) 3464631e8f93SBram Moolenaar sleep 1m 3465631e8f93SBram Moolenaar source += l 3466631e8f93SBram Moolenaar enddef 3467e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 34686f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 34696f17a3f0SBram Moolenaar sleep 10m 34706f17a3f0SBram Moolenaar endwhile 3471206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 3472206c2a6eSBram Moolenaar sleep 100m 3473631e8f93SBram Moolenaar END 3474631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3475631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3476631e8f93SBram Moolenaar delete('Xdef') 3477631e8f93SBram Moolenaarenddef 3478631e8f93SBram Moolenaar 34794324d87aSBram Moolenaardef InvokeNormal() 34804324d87aSBram Moolenaar exe "norm! :m+1\r" 34814324d87aSBram Moolenaarenddef 34824324d87aSBram Moolenaar 34834324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 34844324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 34854324d87aSBram Moolenaar new 34864324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 34874324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 34884324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 34894324d87aSBram Moolenaar xunmap <F3> 3490b5b9480eSBram Moolenaarenddef 3491b5b9480eSBram Moolenaar 3492b5b9480eSBram Moolenaardef Test_white_space_after_command() 3493b5b9480eSBram Moolenaar var lines =<< trim END 3494b5b9480eSBram Moolenaar exit_cb: Func}) 3495b5b9480eSBram Moolenaar END 3496b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 3497f8103f27SBram Moolenaar 3498f8103f27SBram Moolenaar lines =<< trim END 3499f8103f27SBram Moolenaar e# 3500f8103f27SBram Moolenaar END 3501f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 35024324d87aSBram Moolenaarenddef 35034324d87aSBram Moolenaar 35044aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 35054aab88d9SBram Moolenaar var lines =<< trim END 35064aab88d9SBram Moolenaar vim9script 35074aab88d9SBram Moolenaar if exists('g:guard') 35084aab88d9SBram Moolenaar finish 35094aab88d9SBram Moolenaar endif 35104aab88d9SBram Moolenaar g:guard = 1 35114aab88d9SBram Moolenaar var name = 'thename' 35124aab88d9SBram Moolenaar def g:GetName(): string 35134aab88d9SBram Moolenaar return name 35144aab88d9SBram Moolenaar enddef 35154aab88d9SBram Moolenaar def g:SetName(arg: string) 35164aab88d9SBram Moolenaar name = arg 35174aab88d9SBram Moolenaar enddef 35184aab88d9SBram Moolenaar END 35194aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 35204aab88d9SBram Moolenaar so XscriptTwice.vim 35214aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 35224aab88d9SBram Moolenaar g:SetName('newname') 35234aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 35244aab88d9SBram Moolenaar so XscriptTwice.vim 35254aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 35264aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 35274aab88d9SBram Moolenaar 35284aab88d9SBram Moolenaar delfunc g:GetName 35294aab88d9SBram Moolenaar delfunc g:SetName 35304aab88d9SBram Moolenaar delete('XscriptTwice.vim') 35314aab88d9SBram Moolenaar unlet g:guard 35324aab88d9SBram Moolenaarenddef 35334aab88d9SBram Moolenaar 35344aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 35354aab88d9SBram Moolenaar var exportlines =<< trim END 35364aab88d9SBram Moolenaar vim9script 35374aab88d9SBram Moolenaar if exists('g:guard') 35384aab88d9SBram Moolenaar finish 35394aab88d9SBram Moolenaar endif 35404aab88d9SBram Moolenaar g:guard = 1 35414aab88d9SBram Moolenaar export var name = 'someName' 35424aab88d9SBram Moolenaar END 35434aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 35444aab88d9SBram Moolenaar 35454aab88d9SBram Moolenaar var lines =<< trim END 35464aab88d9SBram Moolenaar vim9script 35474aab88d9SBram Moolenaar import name from './XexportScript.vim' 35484aab88d9SBram Moolenaar def g:GetName(): string 35494aab88d9SBram Moolenaar return name 35504aab88d9SBram Moolenaar enddef 35514aab88d9SBram Moolenaar END 35524aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 35534aab88d9SBram Moolenaar so XscriptImport.vim 35544aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 35554aab88d9SBram Moolenaar 35564aab88d9SBram Moolenaar so XexportScript.vim 35574aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 35584aab88d9SBram Moolenaar 35594aab88d9SBram Moolenaar delfunc g:GetName 35604aab88d9SBram Moolenaar delete('XexportScript.vim') 35614aab88d9SBram Moolenaar delete('XscriptImport.vim') 35624aab88d9SBram Moolenaar unlet g:guard 35634aab88d9SBram Moolenaarenddef 35644aab88d9SBram Moolenaar 356510b9421fSBram Moolenaardef Test_unsupported_commands() 356610b9421fSBram Moolenaar var lines =<< trim END 356710b9421fSBram Moolenaar ka 356810b9421fSBram Moolenaar END 356910b9421fSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1100:') 357010b9421fSBram Moolenaar 357110b9421fSBram Moolenaar lines =<< trim END 3572ada1d870SBram Moolenaar :1ka 3573ada1d870SBram Moolenaar END 3574ada1d870SBram Moolenaar CheckDefAndScriptFailure(lines, 'E481:') 3575ada1d870SBram Moolenaar 3576ada1d870SBram Moolenaar lines =<< trim END 357710b9421fSBram Moolenaar t 357810b9421fSBram Moolenaar END 357910b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 358010b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 358110b9421fSBram Moolenaar 358210b9421fSBram Moolenaar lines =<< trim END 358310b9421fSBram Moolenaar x 358410b9421fSBram Moolenaar END 358510b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 358610b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 358710b9421fSBram Moolenaar 358810b9421fSBram Moolenaar lines =<< trim END 358910b9421fSBram Moolenaar xit 359010b9421fSBram Moolenaar END 359110b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 359210b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 359310b9421fSBram Moolenaarenddef 359410b9421fSBram Moolenaar 3595585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3596585fea7bSBram Moolenaardef Test_substitute_cmd() 3597585fea7bSBram Moolenaar new 3598585fea7bSBram Moolenaar setline(1, 'something') 3599585fea7bSBram Moolenaar :substitute(some(other( 3600585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3601585fea7bSBram Moolenaar bwipe! 3602585fea7bSBram Moolenaar 3603f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3604cfcd011fSBram Moolenaar var lines =<< trim END 3605585fea7bSBram Moolenaar vim9script 3606585fea7bSBram Moolenaar new 3607585fea7bSBram Moolenaar setline(1, 'something') 3608585fea7bSBram Moolenaar :substitute(some(other( 3609585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3610585fea7bSBram Moolenaar bwipe! 3611585fea7bSBram Moolenaar END 3612585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3613585fea7bSBram Moolenaar source Xvim9lines 3614585fea7bSBram Moolenaar 3615585fea7bSBram Moolenaar delete('Xvim9lines') 3616585fea7bSBram Moolenaarenddef 3617585fea7bSBram Moolenaar 36188a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3619