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 837294bd6SBram Moolenaarsource screendump.vim 98a7d6542SBram Moolenaar 105d72ce69SBram Moolenaardef Test_range_only() 115d72ce69SBram Moolenaar new 125d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 135d72ce69SBram Moolenaar :/Blah/ 145d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 15c2af0affSBram Moolenaar bwipe! 16c2af0affSBram Moolenaar 17c2af0affSBram Moolenaar # without range commands use current line 18c2af0affSBram Moolenaar new 19c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 20c2af0affSBram Moolenaar :2 21c2af0affSBram Moolenaar print 22c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 23c2af0affSBram Moolenaar :3 24c2af0affSBram Moolenaar list 25c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 26b8554304SBram Moolenaar 27b8554304SBram Moolenaar # missing command does not print the line 28b8554304SBram Moolenaar var lines =<< trim END 29b8554304SBram Moolenaar vim9script 30b8554304SBram Moolenaar :1| 31b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 32b8554304SBram Moolenaar :| 33b8554304SBram Moolenaar assert_equal('three$', Screenline(&lines)) 34b8554304SBram Moolenaar END 35b8554304SBram Moolenaar CheckScriptSuccess(lines) 36b8554304SBram Moolenaar 37c2af0affSBram Moolenaar bwipe! 38025cb1caSBram Moolenaar 39025cb1caSBram Moolenaar # won't generate anything 40025cb1caSBram Moolenaar if false 41025cb1caSBram Moolenaar :123 42025cb1caSBram Moolenaar endif 435d72ce69SBram Moolenaarenddef 445d72ce69SBram Moolenaar 45a6e67e4fSBram Moolenaarlet g:alist = [7] 46a6e67e4fSBram Moolenaarlet g:astring = 'text' 47f0b9f43cSBram Moolenaarlet g:anumber = 123 486e587dcbSBram Moolenaar 494c17ad94SBram Moolenaardef Test_delfunction() 50f5be8cdbSBram Moolenaar # Check function is defined in script namespace 514c17ad94SBram Moolenaar CheckScriptSuccess([ 524c17ad94SBram Moolenaar 'vim9script', 534c17ad94SBram Moolenaar 'func CheckMe()', 544c17ad94SBram Moolenaar ' return 123', 554c17ad94SBram Moolenaar 'endfunc', 564c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 574c17ad94SBram Moolenaar ]) 584c17ad94SBram Moolenaar 59f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 604c17ad94SBram Moolenaar CheckScriptFailure([ 614c17ad94SBram Moolenaar 'vim9script', 624c17ad94SBram Moolenaar 'func DeleteMe1()', 634c17ad94SBram Moolenaar 'endfunc', 644c17ad94SBram Moolenaar 'delfunction DeleteMe1', 654c17ad94SBram Moolenaar ], 'E1084:') 664c17ad94SBram Moolenaar CheckScriptFailure([ 674c17ad94SBram Moolenaar 'vim9script', 684c17ad94SBram Moolenaar 'func DeleteMe2()', 694c17ad94SBram Moolenaar 'endfunc', 704c17ad94SBram Moolenaar 'def DoThat()', 714c17ad94SBram Moolenaar ' delfunction DeleteMe2', 724c17ad94SBram Moolenaar 'enddef', 734c17ad94SBram Moolenaar 'DoThat()', 744c17ad94SBram Moolenaar ], 'E1084:') 754c17ad94SBram Moolenaar CheckScriptFailure([ 764c17ad94SBram Moolenaar 'vim9script', 774c17ad94SBram Moolenaar 'def DeleteMe3()', 784c17ad94SBram Moolenaar 'enddef', 794c17ad94SBram Moolenaar 'delfunction DeleteMe3', 804c17ad94SBram Moolenaar ], 'E1084:') 814c17ad94SBram Moolenaar CheckScriptFailure([ 824c17ad94SBram Moolenaar 'vim9script', 834c17ad94SBram Moolenaar 'def DeleteMe4()', 844c17ad94SBram Moolenaar 'enddef', 854c17ad94SBram Moolenaar 'def DoThat()', 864c17ad94SBram Moolenaar ' delfunction DeleteMe4', 874c17ad94SBram Moolenaar 'enddef', 884c17ad94SBram Moolenaar 'DoThat()', 894c17ad94SBram Moolenaar ], 'E1084:') 90925e9fd6SBram Moolenaar 91925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 92cfcd011fSBram Moolenaar var lines =<< trim END 93925e9fd6SBram Moolenaar vim9script 94925e9fd6SBram Moolenaar def g:Global(): string 95925e9fd6SBram Moolenaar return "yes" 96925e9fd6SBram Moolenaar enddef 97925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 98925e9fd6SBram Moolenaar def! g:Global(): string 99925e9fd6SBram Moolenaar return "no" 100925e9fd6SBram Moolenaar enddef 101925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 102925e9fd6SBram Moolenaar delfunc g:Global 103925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 104925e9fd6SBram Moolenaar END 105925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 106925e9fd6SBram Moolenaar 107925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 108925e9fd6SBram Moolenaar lines =<< trim END 109925e9fd6SBram Moolenaar vim9script 110925e9fd6SBram Moolenaar func g:Global() 111925e9fd6SBram Moolenaar return "yes" 112925e9fd6SBram Moolenaar endfunc 113925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 114925e9fd6SBram Moolenaar def! g:Global(): string 115925e9fd6SBram Moolenaar return "no" 116925e9fd6SBram Moolenaar enddef 117925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 118925e9fd6SBram Moolenaar delfunc g:Global 119925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 120925e9fd6SBram Moolenaar END 121925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 122925e9fd6SBram Moolenaar 123925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 124925e9fd6SBram Moolenaar lines =<< trim END 125925e9fd6SBram Moolenaar vim9script 126925e9fd6SBram Moolenaar def g:Global(): string 127925e9fd6SBram Moolenaar return "yes" 128925e9fd6SBram Moolenaar enddef 129925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 130925e9fd6SBram Moolenaar func! g:Global() 131925e9fd6SBram Moolenaar return "no" 132925e9fd6SBram Moolenaar endfunc 133925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 134925e9fd6SBram Moolenaar delfunc g:Global 135925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 136925e9fd6SBram Moolenaar END 137925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1384c17ad94SBram Moolenaarenddef 1394c17ad94SBram Moolenaar 14008052228SBram Moolenaardef Test_wrong_type() 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 143cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 144cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 145599c89c8SBram Moolenaar 146cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 147cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 14842a480bfSBram Moolenaar 149cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 150cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 151cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 152cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 153cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 154cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 155cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 156cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 157cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 158cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 159cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 160a0a9f43aSBram Moolenaar 161cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 162cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 16308052228SBram Moolenaarenddef 1648a7d6542SBram Moolenaar 16510c65860SBram Moolenaardef Test_script_wrong_type() 16610c65860SBram Moolenaar var lines =<< trim END 16710c65860SBram Moolenaar vim9script 16810c65860SBram Moolenaar var s:dict: dict<string> 16910c65860SBram Moolenaar s:dict['a'] = ['x'] 17010c65860SBram Moolenaar END 17110c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 17210c65860SBram Moolenaarenddef 17310c65860SBram Moolenaar 17408052228SBram Moolenaardef Test_const() 175cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 176cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 177cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 17830fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 17930fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 180dbeecb2bSBram Moolenaar 181cfcd011fSBram Moolenaar var lines =<< trim END 18230fd8204SBram Moolenaar final list = [1, 2, 3] 183dbeecb2bSBram Moolenaar list[0] = 4 1840b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 18530fd8204SBram Moolenaar const other = [5, 6, 7] 1860b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 18771abe482SBram Moolenaar 188cfcd011fSBram Moolenaar var varlist = [7, 8] 18930fd8204SBram Moolenaar const constlist = [1, varlist, 3] 19071abe482SBram Moolenaar varlist[0] = 77 191*23e2e115SBram 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 199*23e2e115SBram Moolenaar constdict['two']['six'] = 66 200cfcd011fSBram Moolenaar var cd = constdict['two'] 20171abe482SBram Moolenaar cd['six'] = 66 202e0de171eSBram Moolenaar constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3}) 203dbeecb2bSBram Moolenaar END 204dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 20508052228SBram Moolenaarenddef 2068a7d6542SBram Moolenaar 2070b4c66c6SBram Moolenaardef Test_const_bang() 208cfcd011fSBram Moolenaar var lines =<< trim END 20930fd8204SBram Moolenaar const var = 234 2100b4c66c6SBram Moolenaar var = 99 2110b4c66c6SBram Moolenaar END 2120b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2130b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2140b4c66c6SBram Moolenaar 2150b4c66c6SBram Moolenaar lines =<< trim END 21630fd8204SBram Moolenaar const ll = [2, 3, 4] 2170b4c66c6SBram Moolenaar ll[0] = 99 2180b4c66c6SBram Moolenaar END 2190b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2200b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2210b4c66c6SBram Moolenaar 2220b4c66c6SBram Moolenaar lines =<< trim END 22330fd8204SBram Moolenaar const ll = [2, 3, 4] 2240b4c66c6SBram Moolenaar ll[3] = 99 2250b4c66c6SBram Moolenaar END 2260b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2270b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2280b4c66c6SBram Moolenaar 2290b4c66c6SBram Moolenaar lines =<< trim END 230e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2310b4c66c6SBram Moolenaar dd["one"] = 99 2320b4c66c6SBram Moolenaar END 2330b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2340b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2350b4c66c6SBram Moolenaar 2360b4c66c6SBram Moolenaar lines =<< trim END 237e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2380b4c66c6SBram Moolenaar dd["three"] = 99 2390b4c66c6SBram Moolenaar END 2400b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2410b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2420b4c66c6SBram Moolenaarenddef 2430b4c66c6SBram Moolenaar 244df069eecSBram Moolenaardef Test_range_no_colon() 245d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 246d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 247d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 248d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 249df069eecSBram Moolenaarenddef 250df069eecSBram Moolenaar 251df069eecSBram Moolenaar 2528a7d6542SBram Moolenaardef Test_block() 253cfcd011fSBram Moolenaar var outer = 1 2548a7d6542SBram Moolenaar { 255cfcd011fSBram Moolenaar var inner = 2 2568a7d6542SBram Moolenaar assert_equal(1, outer) 2578a7d6542SBram Moolenaar assert_equal(2, inner) 2588a7d6542SBram Moolenaar } 2598a7d6542SBram Moolenaar assert_equal(1, outer) 2603f1e9f00SBram Moolenaar 2613f1e9f00SBram Moolenaar {|echo 'yes'|} 2628a7d6542SBram Moolenaarenddef 2638a7d6542SBram Moolenaar 26408052228SBram Moolenaardef Test_block_failure() 265cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 26608052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 26708052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 26808052228SBram Moolenaarenddef 2698a7d6542SBram Moolenaar 270fbbcd003SBram Moolenaardef Test_block_local_vars() 271fbbcd003SBram Moolenaar var lines =<< trim END 272fbbcd003SBram Moolenaar vim9script 273ed234f24SBram Moolenaar v:testing = 1 274fbbcd003SBram Moolenaar if true 275ed234f24SBram Moolenaar var text = ['hello'] 276ed234f24SBram Moolenaar def SayHello(): list<string> 277fbbcd003SBram Moolenaar return text 278fbbcd003SBram Moolenaar enddef 279fbbcd003SBram Moolenaar def SetText(v: string) 280ed234f24SBram Moolenaar text = [v] 281fbbcd003SBram Moolenaar enddef 282fbbcd003SBram Moolenaar endif 283fbbcd003SBram Moolenaar 284fbbcd003SBram Moolenaar if true 285ed234f24SBram Moolenaar var text = ['again'] 286ed234f24SBram Moolenaar def SayAgain(): list<string> 287fbbcd003SBram Moolenaar return text 288fbbcd003SBram Moolenaar enddef 289fbbcd003SBram Moolenaar endif 290ed234f24SBram Moolenaar 291ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 292ed234f24SBram Moolenaar test_garbagecollect_now() 293ed234f24SBram Moolenaar 294fbbcd003SBram Moolenaar defcompile 295fbbcd003SBram Moolenaar 296ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 297ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 298fbbcd003SBram Moolenaar 299fbbcd003SBram Moolenaar SetText('foobar') 300ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 301ed234f24SBram Moolenaar 302ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 303ed234f24SBram Moolenaar qall! 304fbbcd003SBram Moolenaar END 305ed234f24SBram Moolenaar 306ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 307ed234f24SBram Moolenaar # context gets garbage collected. 308ed234f24SBram Moolenaar writefile(lines, 'Xscript') 309ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 310ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 311ed234f24SBram Moolenaar 312ed234f24SBram Moolenaar delete('Xscript') 313ed234f24SBram Moolenaar delete('Xdidit') 314fbbcd003SBram Moolenaarenddef 315fbbcd003SBram Moolenaar 31639ca4127SBram Moolenaardef Test_block_local_vars_with_func() 31739ca4127SBram Moolenaar var lines =<< trim END 31839ca4127SBram Moolenaar vim9script 31939ca4127SBram Moolenaar if true 32039ca4127SBram Moolenaar var foo = 'foo' 32139ca4127SBram Moolenaar if true 32239ca4127SBram Moolenaar var bar = 'bar' 32339ca4127SBram Moolenaar def Func(): list<string> 32439ca4127SBram Moolenaar return [foo, bar] 32539ca4127SBram Moolenaar enddef 32639ca4127SBram Moolenaar endif 32739ca4127SBram Moolenaar endif 32839ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 32939ca4127SBram Moolenaar # "foo" and "bar" 33039ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 33139ca4127SBram Moolenaar END 33239ca4127SBram Moolenaar CheckScriptSuccess(lines) 33339ca4127SBram Moolenaarenddef 33439ca4127SBram Moolenaar 335e4db17fbSBram Moolenaar" legacy func for command that's defined later 336e4db17fbSBram Moolenaarfunc InvokeSomeCommand() 337e4db17fbSBram Moolenaar SomeCommand 338e4db17fbSBram Moolenaarendfunc 339e4db17fbSBram Moolenaar 340e4db17fbSBram Moolenaardef Test_autocommand_block() 341e4db17fbSBram Moolenaar com SomeCommand { 342e4db17fbSBram Moolenaar g:someVar = 'some' 343e4db17fbSBram Moolenaar } 344e4db17fbSBram Moolenaar InvokeSomeCommand() 345e4db17fbSBram Moolenaar assert_equal('some', g:someVar) 346e4db17fbSBram Moolenaar 347e4db17fbSBram Moolenaar delcommand SomeCommand 348e4db17fbSBram Moolenaar unlet g:someVar 349e4db17fbSBram Moolenaarenddef 350e4db17fbSBram Moolenaar 351e4db17fbSBram Moolenaardef Test_command_block() 352e4db17fbSBram Moolenaar au BufNew *.xml { 353e4db17fbSBram Moolenaar g:otherVar = 'other' 354e4db17fbSBram Moolenaar } 355e4db17fbSBram Moolenaar split other.xml 356e4db17fbSBram Moolenaar assert_equal('other', g:otherVar) 357e4db17fbSBram Moolenaar 358e4db17fbSBram Moolenaar bwipe! 359e4db17fbSBram Moolenaar au! BufNew *.xml 360e4db17fbSBram Moolenaar unlet g:otherVar 361e4db17fbSBram Moolenaarenddef 362e4db17fbSBram Moolenaar 363d032f34aSBram Moolenaarfunc g:NoSuchFunc() 364d032f34aSBram Moolenaar echo 'none' 365d032f34aSBram Moolenaarendfunc 366d032f34aSBram Moolenaar 3679e1d9e34SBram Moolenaardef Test_try_catch_throw() 368cfcd011fSBram Moolenaar var l = [] 3697a092245SBram Moolenaar try # comment 3708a7d6542SBram Moolenaar add(l, '1') 3718a7d6542SBram Moolenaar throw 'wrong' 3728a7d6542SBram Moolenaar add(l, '2') 3737a092245SBram Moolenaar catch # comment 3748a7d6542SBram Moolenaar add(l, v:exception) 3757a092245SBram Moolenaar finally # comment 3768a7d6542SBram Moolenaar add(l, '3') 3777a092245SBram Moolenaar endtry # comment 3788a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 37968d130c6SBram Moolenaar 380e859312eSBram Moolenaar l = [] 381e859312eSBram Moolenaar try 382e859312eSBram Moolenaar try 383e859312eSBram Moolenaar add(l, '1') 384e859312eSBram Moolenaar throw 'wrong' 385e859312eSBram Moolenaar add(l, '2') 386e859312eSBram Moolenaar catch /right/ 387e859312eSBram Moolenaar add(l, v:exception) 388e859312eSBram Moolenaar endtry 389e859312eSBram Moolenaar catch /wrong/ 390e859312eSBram Moolenaar add(l, 'caught') 391373863edSBram Moolenaar fina 392e859312eSBram Moolenaar add(l, 'finally') 393e859312eSBram Moolenaar endtry 394e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 395e859312eSBram Moolenaar 396cfcd011fSBram Moolenaar var n: number 39768d130c6SBram Moolenaar try 39868d130c6SBram Moolenaar n = l[3] 39968d130c6SBram Moolenaar catch /E684:/ 40068d130c6SBram Moolenaar n = 99 40168d130c6SBram Moolenaar endtry 40268d130c6SBram Moolenaar assert_equal(99, n) 40368d130c6SBram Moolenaar 40469f7050cSBram Moolenaar var done = 'no' 40569f7050cSBram Moolenaar if 0 40669f7050cSBram Moolenaar try | catch | endtry 40769f7050cSBram Moolenaar else 40869f7050cSBram Moolenaar done = 'yes' 40969f7050cSBram Moolenaar endif 41069f7050cSBram Moolenaar assert_equal('yes', done) 41169f7050cSBram Moolenaar 41269f7050cSBram Moolenaar done = 'no' 41369f7050cSBram Moolenaar if 1 41469f7050cSBram Moolenaar done = 'yes' 41569f7050cSBram Moolenaar else 41669f7050cSBram Moolenaar try | catch | endtry 41769f7050cSBram Moolenaar done = 'never' 41869f7050cSBram Moolenaar endif 41969f7050cSBram Moolenaar assert_equal('yes', done) 42069f7050cSBram Moolenaar 42169f7050cSBram Moolenaar if 1 42269f7050cSBram Moolenaar else 42369f7050cSBram Moolenaar try | catch /pat/ | endtry 42469f7050cSBram Moolenaar try | catch /pat/ 42569f7050cSBram Moolenaar endtry 42669f7050cSBram Moolenaar try 42769f7050cSBram Moolenaar catch /pat/ | endtry 42869f7050cSBram Moolenaar try 42969f7050cSBram Moolenaar catch /pat/ 43069f7050cSBram Moolenaar endtry 43169f7050cSBram Moolenaar endif 43269f7050cSBram Moolenaar 43368d130c6SBram Moolenaar try 434cc673e74SBram Moolenaar # string slice returns a string, not a number 43568d130c6SBram Moolenaar n = g:astring[3] 4365e654230SBram Moolenaar catch /E1012:/ 43768d130c6SBram Moolenaar n = 77 43868d130c6SBram Moolenaar endtry 43968d130c6SBram Moolenaar assert_equal(77, n) 44068d130c6SBram Moolenaar 44168d130c6SBram Moolenaar try 44268d130c6SBram Moolenaar n = l[g:astring] 4435e654230SBram Moolenaar catch /E1012:/ 44456acb094SBram Moolenaar n = 88 44568d130c6SBram Moolenaar endtry 44656acb094SBram Moolenaar assert_equal(88, n) 44768d130c6SBram Moolenaar 44868d130c6SBram Moolenaar try 44968d130c6SBram Moolenaar n = s:does_not_exist 45068d130c6SBram Moolenaar catch /E121:/ 451f0b9f43cSBram Moolenaar n = 111 452f0b9f43cSBram Moolenaar endtry 453f0b9f43cSBram Moolenaar assert_equal(111, n) 454f0b9f43cSBram Moolenaar 455f0b9f43cSBram Moolenaar try 456f0b9f43cSBram Moolenaar n = g:does_not_exist 457f0b9f43cSBram Moolenaar catch /E121:/ 45868d130c6SBram Moolenaar n = 121 45968d130c6SBram Moolenaar endtry 46068d130c6SBram Moolenaar assert_equal(121, n) 46168d130c6SBram Moolenaar 462e0de171eSBram Moolenaar var d = {one: 1} 46368d130c6SBram Moolenaar try 46468d130c6SBram Moolenaar n = d[g:astring] 46568d130c6SBram Moolenaar catch /E716:/ 46668d130c6SBram Moolenaar n = 222 46768d130c6SBram Moolenaar endtry 46868d130c6SBram Moolenaar assert_equal(222, n) 469f0b9f43cSBram Moolenaar 470f0b9f43cSBram Moolenaar try 471f0b9f43cSBram Moolenaar n = -g:astring 472f0b9f43cSBram Moolenaar catch /E39:/ 473f0b9f43cSBram Moolenaar n = 233 474f0b9f43cSBram Moolenaar endtry 475f0b9f43cSBram Moolenaar assert_equal(233, n) 476f0b9f43cSBram Moolenaar 477f0b9f43cSBram Moolenaar try 478f0b9f43cSBram Moolenaar n = +g:astring 479f0b9f43cSBram Moolenaar catch /E1030:/ 480f0b9f43cSBram Moolenaar n = 244 481f0b9f43cSBram Moolenaar endtry 482f0b9f43cSBram Moolenaar assert_equal(244, n) 483f0b9f43cSBram Moolenaar 484f0b9f43cSBram Moolenaar try 485f0b9f43cSBram Moolenaar n = +g:alist 486f0b9f43cSBram Moolenaar catch /E745:/ 487f0b9f43cSBram Moolenaar n = 255 488f0b9f43cSBram Moolenaar endtry 489f0b9f43cSBram Moolenaar assert_equal(255, n) 490f0b9f43cSBram Moolenaar 491cfcd011fSBram Moolenaar var nd: dict<any> 492f0b9f43cSBram Moolenaar try 4932e5910bfSBram Moolenaar nd = {[g:alist]: 1} 4942e5910bfSBram Moolenaar catch /E1105:/ 495f0b9f43cSBram Moolenaar n = 266 496f0b9f43cSBram Moolenaar endtry 497f0b9f43cSBram Moolenaar assert_equal(266, n) 498f0b9f43cSBram Moolenaar 499f0b9f43cSBram Moolenaar try 500f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 501f0b9f43cSBram Moolenaar catch /E1093:/ 502f0b9f43cSBram Moolenaar n = 277 503f0b9f43cSBram Moolenaar endtry 504f0b9f43cSBram Moolenaar assert_equal(277, n) 505f0b9f43cSBram Moolenaar 506e859312eSBram Moolenaar try 507e859312eSBram Moolenaar &ts = g:astring 5085e654230SBram Moolenaar catch /E1012:/ 509e859312eSBram Moolenaar n = 288 510e859312eSBram Moolenaar endtry 511e859312eSBram Moolenaar assert_equal(288, n) 512e859312eSBram Moolenaar 513e859312eSBram Moolenaar try 514e859312eSBram Moolenaar &backspace = 'asdf' 515e859312eSBram Moolenaar catch /E474:/ 516e859312eSBram Moolenaar n = 299 517e859312eSBram Moolenaar endtry 518e859312eSBram Moolenaar assert_equal(299, n) 519e859312eSBram Moolenaar 520e859312eSBram Moolenaar l = [1] 521e859312eSBram Moolenaar try 522e859312eSBram Moolenaar l[3] = 3 523e859312eSBram Moolenaar catch /E684:/ 524e859312eSBram Moolenaar n = 300 525e859312eSBram Moolenaar endtry 526e859312eSBram Moolenaar assert_equal(300, n) 527e859312eSBram Moolenaar 528e859312eSBram Moolenaar try 529e859312eSBram Moolenaar unlet g:does_not_exist 530e859312eSBram Moolenaar catch /E108:/ 531e859312eSBram Moolenaar n = 322 532e859312eSBram Moolenaar endtry 533e859312eSBram Moolenaar assert_equal(322, n) 534e859312eSBram Moolenaar 535e859312eSBram Moolenaar try 5362bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 537e859312eSBram Moolenaar catch /E721:/ 538e859312eSBram Moolenaar n = 333 539e859312eSBram Moolenaar endtry 540e859312eSBram Moolenaar assert_equal(333, n) 541e859312eSBram Moolenaar 542e859312eSBram Moolenaar try 543e859312eSBram Moolenaar l = DeletedFunc() 544e859312eSBram Moolenaar catch /E933:/ 545e859312eSBram Moolenaar n = 344 546e859312eSBram Moolenaar endtry 547e859312eSBram Moolenaar assert_equal(344, n) 548d032f34aSBram Moolenaar 549d032f34aSBram Moolenaar try 550a764e73dSYegappan Lakshmanan echo range(1, 2, 0) 551a764e73dSYegappan Lakshmanan catch /E726:/ 552d032f34aSBram Moolenaar n = 355 553d032f34aSBram Moolenaar endtry 554d032f34aSBram Moolenaar assert_equal(355, n) 555d032f34aSBram Moolenaar 556cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 557d032f34aSBram Moolenaar delfunc g:NoSuchFunc 558d032f34aSBram Moolenaar try 559d032f34aSBram Moolenaar echo P() 560d032f34aSBram Moolenaar catch /E117:/ 561d032f34aSBram Moolenaar n = 366 562d032f34aSBram Moolenaar endtry 563d032f34aSBram Moolenaar assert_equal(366, n) 564d032f34aSBram Moolenaar 565d032f34aSBram Moolenaar try 566d032f34aSBram Moolenaar echo g:NoSuchFunc() 567d032f34aSBram Moolenaar catch /E117:/ 568d032f34aSBram Moolenaar n = 377 569d032f34aSBram Moolenaar endtry 570d032f34aSBram Moolenaar assert_equal(377, n) 571d032f34aSBram Moolenaar 572d032f34aSBram Moolenaar try 573d032f34aSBram Moolenaar echo g:alist + 4 574d032f34aSBram Moolenaar catch /E745:/ 575d032f34aSBram Moolenaar n = 388 576d032f34aSBram Moolenaar endtry 577d032f34aSBram Moolenaar assert_equal(388, n) 578d032f34aSBram Moolenaar 579d032f34aSBram Moolenaar try 580d032f34aSBram Moolenaar echo 4 + g:alist 581d032f34aSBram Moolenaar catch /E745:/ 582d032f34aSBram Moolenaar n = 399 583d032f34aSBram Moolenaar endtry 584d032f34aSBram Moolenaar assert_equal(399, n) 585d032f34aSBram Moolenaar 586d032f34aSBram Moolenaar try 587d032f34aSBram Moolenaar echo g:alist.member 588d032f34aSBram Moolenaar catch /E715:/ 589d032f34aSBram Moolenaar n = 400 590d032f34aSBram Moolenaar endtry 591d032f34aSBram Moolenaar assert_equal(400, n) 592d032f34aSBram Moolenaar 593d032f34aSBram Moolenaar try 594d032f34aSBram Moolenaar echo d.member 595d032f34aSBram Moolenaar catch /E716:/ 596d032f34aSBram Moolenaar n = 411 597d032f34aSBram Moolenaar endtry 598d032f34aSBram Moolenaar assert_equal(411, n) 599d9d7789bSBram Moolenaar 600d9d7789bSBram Moolenaar var counter = 0 601d9d7789bSBram Moolenaar for i in range(4) 602d9d7789bSBram Moolenaar try 603d9d7789bSBram Moolenaar eval [][0] 604d9d7789bSBram Moolenaar catch 605d9d7789bSBram Moolenaar endtry 606d9d7789bSBram Moolenaar counter += 1 607d9d7789bSBram Moolenaar endfor 608d9d7789bSBram Moolenaar assert_equal(4, counter) 6097e82c5f3SBram Moolenaar 6109fa5dabeSBram Moolenaar # no requirement for spaces before | 6119fa5dabeSBram Moolenaar try|echo 0|catch|endtry 6129fa5dabeSBram Moolenaar 6137e82c5f3SBram Moolenaar # return in finally after empty catch 6147e82c5f3SBram Moolenaar def ReturnInFinally(): number 6157e82c5f3SBram Moolenaar try 6167e82c5f3SBram Moolenaar finally 6177e82c5f3SBram Moolenaar return 4 6187e82c5f3SBram Moolenaar endtry 6197e82c5f3SBram Moolenaar return 2 6207e82c5f3SBram Moolenaar enddef 6217e82c5f3SBram Moolenaar assert_equal(4, ReturnInFinally()) 6228ac681a2SBram Moolenaar 6238ac681a2SBram Moolenaar var lines =<< trim END 6248ac681a2SBram Moolenaar vim9script 6258ac681a2SBram Moolenaar try 6268ac681a2SBram Moolenaar acos('0.5') 6278ac681a2SBram Moolenaar ->setline(1) 6288ac681a2SBram Moolenaar catch 6298ac681a2SBram Moolenaar g:caught = v:exception 6308ac681a2SBram Moolenaar endtry 6318ac681a2SBram Moolenaar END 6328ac681a2SBram Moolenaar CheckScriptSuccess(lines) 6334490ec4eSYegappan Lakshmanan assert_match('E1219: Float or Number required for argument 1', g:caught) 6348ac681a2SBram Moolenaar unlet g:caught 6354197828dSBram Moolenaar 6364197828dSBram Moolenaar # missing catch and/or finally 6374197828dSBram Moolenaar lines =<< trim END 6384197828dSBram Moolenaar vim9script 6394197828dSBram Moolenaar try 6404197828dSBram Moolenaar echo 'something' 6414197828dSBram Moolenaar endtry 6424197828dSBram Moolenaar END 6434197828dSBram Moolenaar CheckScriptFailure(lines, 'E1032:') 6448a7d6542SBram Moolenaarenddef 6458a7d6542SBram Moolenaar 6463f987b59SBram Moolenaardef Test_try_in_catch() 6473f987b59SBram Moolenaar var lines =<< trim END 6483f987b59SBram Moolenaar vim9script 6493f987b59SBram Moolenaar var seq = [] 6503f987b59SBram Moolenaar def DoIt() 6513f987b59SBram Moolenaar try 6523f987b59SBram Moolenaar seq->add('throw 1') 6533f987b59SBram Moolenaar eval [][0] 6543f987b59SBram Moolenaar seq->add('notreached') 6553f987b59SBram Moolenaar catch 6563f987b59SBram Moolenaar seq->add('catch') 6573f987b59SBram Moolenaar try 6583f987b59SBram Moolenaar seq->add('throw 2') 6593f987b59SBram Moolenaar eval [][0] 6603f987b59SBram Moolenaar seq->add('notreached') 6613f987b59SBram Moolenaar catch /nothing/ 6623f987b59SBram Moolenaar seq->add('notreached') 6633f987b59SBram Moolenaar endtry 6643f987b59SBram Moolenaar seq->add('done') 6653f987b59SBram Moolenaar endtry 6663f987b59SBram Moolenaar enddef 6673f987b59SBram Moolenaar DoIt() 6683f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6693f987b59SBram Moolenaar END 6703f987b59SBram Moolenaarenddef 6713f987b59SBram Moolenaar 672d3d8feebSBram Moolenaardef Test_error_in_catch() 673d3d8feebSBram Moolenaar var lines =<< trim END 674d3d8feebSBram Moolenaar try 675d3d8feebSBram Moolenaar eval [][0] 676d3d8feebSBram Moolenaar catch /E684:/ 677d3d8feebSBram Moolenaar eval [][0] 678d3d8feebSBram Moolenaar endtry 679d3d8feebSBram Moolenaar END 680d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 681d3d8feebSBram Moolenaarenddef 682d3d8feebSBram Moolenaar 6832e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6842e34c34bSBram Moolenaardef TryContinueFunc() 6852e34c34bSBram Moolenaar while g:Count < 2 6862e34c34bSBram Moolenaar g:sequence ..= 't' 6872e34c34bSBram Moolenaar try 6882e34c34bSBram Moolenaar echoerr 'Test' 6892e34c34bSBram Moolenaar catch 6902e34c34bSBram Moolenaar g:Count += 1 6912e34c34bSBram Moolenaar g:sequence ..= 'c' 6922e34c34bSBram Moolenaar continue 6932e34c34bSBram Moolenaar endtry 6942e34c34bSBram Moolenaar g:sequence ..= 'e' 6952e34c34bSBram Moolenaar g:Count += 1 6962e34c34bSBram Moolenaar endwhile 6972e34c34bSBram Moolenaarenddef 6982e34c34bSBram Moolenaar 6992e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 7002e34c34bSBram Moolenaar g:Count = 0 7012e34c34bSBram Moolenaar g:sequence = '' 7022e34c34bSBram Moolenaar TryContinueFunc() 7032e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 7042e34c34bSBram Moolenaar unlet g:Count 7052e34c34bSBram Moolenaar unlet g:sequence 7062e34c34bSBram Moolenaarenddef 7072e34c34bSBram Moolenaar 7089cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 7099cb577a6SBram Moolenaar # return in try block returns normally 7109cb577a6SBram Moolenaar def ReturnInTry(): string 7119cb577a6SBram Moolenaar try 7129cb577a6SBram Moolenaar return '"some message"' 7139cb577a6SBram Moolenaar catch 7149cb577a6SBram Moolenaar endtry 7159cb577a6SBram Moolenaar return 'not reached' 7169cb577a6SBram Moolenaar enddef 7179cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 7189cb577a6SBram Moolenaarenddef 7199cb577a6SBram Moolenaar 7201430ceebSBram Moolenaardef Test_cnext_works_in_catch() 7211430ceebSBram Moolenaar var lines =<< trim END 7221430ceebSBram Moolenaar vim9script 723c323527dSBram Moolenaar au BufEnter * eval 1 + 2 7241430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 7251430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 7261430ceebSBram Moolenaar var items = [ 7271430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 7281430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7291430ceebSBram Moolenaar ] 7301430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7311430ceebSBram Moolenaar cwindow 7321430ceebSBram Moolenaar 7331430ceebSBram Moolenaar def CnextOrCfirst() 7341430ceebSBram Moolenaar # if cnext fails, cfirst is used 7351430ceebSBram Moolenaar try 7361430ceebSBram Moolenaar cnext 7371430ceebSBram Moolenaar catch 7381430ceebSBram Moolenaar cfirst 7391430ceebSBram Moolenaar endtry 7401430ceebSBram Moolenaar enddef 7411430ceebSBram Moolenaar 7421430ceebSBram Moolenaar CnextOrCfirst() 7431430ceebSBram Moolenaar CnextOrCfirst() 7441430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7451430ceebSBram Moolenaar qall 7461430ceebSBram Moolenaar END 7471430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7481430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7491430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7501430ceebSBram Moolenaar 7511430ceebSBram Moolenaar delete('Xfile1') 7521430ceebSBram Moolenaar delete('Xfile2') 7531430ceebSBram Moolenaar delete('XCatchCnext') 7541430ceebSBram Moolenaar delete('Xresult') 7551430ceebSBram Moolenaarenddef 7561430ceebSBram Moolenaar 7579e1d9e34SBram Moolenaardef Test_throw_skipped() 7589e1d9e34SBram Moolenaar if 0 7599e1d9e34SBram Moolenaar throw dontgethere 7609e1d9e34SBram Moolenaar endif 7619e1d9e34SBram Moolenaarenddef 7629e1d9e34SBram Moolenaar 7638f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7648f81b22eSBram Moolenaar var lines =<< trim END 7658f81b22eSBram Moolenaar vim9script 7668f81b22eSBram Moolenaar def Func() 7678f81b22eSBram Moolenaar throw 'error' 7688f81b22eSBram Moolenaar enddef 7698f81b22eSBram Moolenaar silent! Func() 7708f81b22eSBram Moolenaar END 7718f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7728f81b22eSBram Moolenaar source XthrowSilenced 7738f81b22eSBram Moolenaar delete('XthrowSilenced') 7748f81b22eSBram Moolenaarenddef 7758f81b22eSBram Moolenaar 776e859312eSBram Moolenaardef DeletedFunc(): list<any> 777e859312eSBram Moolenaar return ['delete me'] 778e859312eSBram Moolenaarenddef 779e859312eSBram Moolenaardefcompile 780e859312eSBram Moolenaardelfunc DeletedFunc 781e859312eSBram Moolenaar 782257cc5eeSBram Moolenaardef ThrowFromDef() 783a72cfb80SBram Moolenaar throw "getout" # comment 784257cc5eeSBram Moolenaarenddef 785257cc5eeSBram Moolenaar 786257cc5eeSBram Moolenaarfunc CatchInFunc() 787257cc5eeSBram Moolenaar try 788257cc5eeSBram Moolenaar call ThrowFromDef() 789257cc5eeSBram Moolenaar catch 790257cc5eeSBram Moolenaar let g:thrown_func = v:exception 791257cc5eeSBram Moolenaar endtry 792257cc5eeSBram Moolenaarendfunc 793257cc5eeSBram Moolenaar 794257cc5eeSBram Moolenaardef CatchInDef() 795257cc5eeSBram Moolenaar try 796257cc5eeSBram Moolenaar ThrowFromDef() 797257cc5eeSBram Moolenaar catch 798257cc5eeSBram Moolenaar g:thrown_def = v:exception 799257cc5eeSBram Moolenaar endtry 800257cc5eeSBram Moolenaarenddef 801257cc5eeSBram Moolenaar 802f575adffSBram Moolenaardef ReturnFinally(): string 803f575adffSBram Moolenaar try 804f575adffSBram Moolenaar return 'intry' 805373863edSBram Moolenaar finall 806f575adffSBram Moolenaar g:in_finally = 'finally' 807f575adffSBram Moolenaar endtry 808f575adffSBram Moolenaar return 'end' 809f575adffSBram Moolenaarenddef 810f575adffSBram Moolenaar 811257cc5eeSBram Moolenaardef Test_try_catch_nested() 812257cc5eeSBram Moolenaar CatchInFunc() 813257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 814257cc5eeSBram Moolenaar 815257cc5eeSBram Moolenaar CatchInDef() 816257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 817f575adffSBram Moolenaar 818f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 819f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 820d3d8feebSBram Moolenaar 821d3d8feebSBram Moolenaar var l = [] 822d3d8feebSBram Moolenaar try 823d3d8feebSBram Moolenaar l->add('1') 824d3d8feebSBram Moolenaar throw 'bad' 825d3d8feebSBram Moolenaar l->add('x') 826d3d8feebSBram Moolenaar catch /bad/ 827d3d8feebSBram Moolenaar l->add('2') 828d3d8feebSBram Moolenaar try 829d3d8feebSBram Moolenaar l->add('3') 830d3d8feebSBram Moolenaar throw 'one' 831d3d8feebSBram Moolenaar l->add('x') 832d3d8feebSBram Moolenaar catch /one/ 833d3d8feebSBram Moolenaar l->add('4') 834d3d8feebSBram Moolenaar try 835d3d8feebSBram Moolenaar l->add('5') 836d3d8feebSBram Moolenaar throw 'more' 837d3d8feebSBram Moolenaar l->add('x') 838d3d8feebSBram Moolenaar catch /more/ 839d3d8feebSBram Moolenaar l->add('6') 840d3d8feebSBram Moolenaar endtry 841d3d8feebSBram Moolenaar endtry 842d3d8feebSBram Moolenaar endtry 843d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 844834193afSBram Moolenaar 845834193afSBram Moolenaar l = [] 846834193afSBram Moolenaar try 847834193afSBram Moolenaar try 848834193afSBram Moolenaar l->add('1') 849834193afSBram Moolenaar throw 'foo' 850834193afSBram Moolenaar l->add('x') 851834193afSBram Moolenaar catch 852834193afSBram Moolenaar l->add('2') 853834193afSBram Moolenaar throw 'bar' 854834193afSBram Moolenaar l->add('x') 855834193afSBram Moolenaar finally 856834193afSBram Moolenaar l->add('3') 857834193afSBram Moolenaar endtry 858834193afSBram Moolenaar l->add('x') 859834193afSBram Moolenaar catch /bar/ 860834193afSBram Moolenaar l->add('4') 861834193afSBram Moolenaar endtry 862834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 863f575adffSBram Moolenaarenddef 864f575adffSBram Moolenaar 8659939f57bSBram Moolenaardef TryOne(): number 8669939f57bSBram Moolenaar try 8679939f57bSBram Moolenaar return 0 8689939f57bSBram Moolenaar catch 8699939f57bSBram Moolenaar endtry 8709939f57bSBram Moolenaar return 0 8719939f57bSBram Moolenaarenddef 8729939f57bSBram Moolenaar 8739939f57bSBram Moolenaardef TryTwo(n: number): string 8749939f57bSBram Moolenaar try 875cfcd011fSBram Moolenaar var x = {} 8769939f57bSBram Moolenaar catch 8779939f57bSBram Moolenaar endtry 8789939f57bSBram Moolenaar return 'text' 8799939f57bSBram Moolenaarenddef 8809939f57bSBram Moolenaar 8819939f57bSBram Moolenaardef Test_try_catch_twice() 8829939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8839939f57bSBram Moolenaarenddef 8849939f57bSBram Moolenaar 885f575adffSBram Moolenaardef Test_try_catch_match() 886cfcd011fSBram Moolenaar var seq = 'a' 887f575adffSBram Moolenaar try 888f575adffSBram Moolenaar throw 'something' 889f575adffSBram Moolenaar catch /nothing/ 890f575adffSBram Moolenaar seq ..= 'x' 891f575adffSBram Moolenaar catch /some/ 892f575adffSBram Moolenaar seq ..= 'b' 893f575adffSBram Moolenaar catch /asdf/ 894f575adffSBram Moolenaar seq ..= 'x' 895e8c4abbbSBram Moolenaar catch ?a\?sdf? 896e8c4abbbSBram Moolenaar seq ..= 'y' 897f575adffSBram Moolenaar finally 898f575adffSBram Moolenaar seq ..= 'c' 899f575adffSBram Moolenaar endtry 900f575adffSBram Moolenaar assert_equal('abc', seq) 901257cc5eeSBram Moolenaarenddef 902257cc5eeSBram Moolenaar 903e8c4abbbSBram Moolenaardef Test_try_catch_fails() 904d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 905d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 906d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 907d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 908d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 909d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 910d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 911d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 91213106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 913d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 914585fea7bSBram Moolenaar 915e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 916d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 917e8c4abbbSBram Moolenaarenddef 918e8c4abbbSBram Moolenaar 9197c5b3c03SBram Moolenaardef Try_catch_skipped() 9207c5b3c03SBram Moolenaar var l = [] 9217c5b3c03SBram Moolenaar try 9227c5b3c03SBram Moolenaar finally 9237c5b3c03SBram Moolenaar endtry 9247c5b3c03SBram Moolenaar 9257c5b3c03SBram Moolenaar if 1 9267c5b3c03SBram Moolenaar else 9277c5b3c03SBram Moolenaar try 9287c5b3c03SBram Moolenaar endtry 9297c5b3c03SBram Moolenaar endif 9307c5b3c03SBram Moolenaarenddef 9317c5b3c03SBram Moolenaar 9327c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9337c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9347c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9357c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9367c5b3c03SBram Moolenaarenddef 9377c5b3c03SBram Moolenaar 9387c5b3c03SBram Moolenaar 9397c5b3c03SBram Moolenaar 940006ad48bSBram Moolenaardef Test_throw_vimscript() 941f5be8cdbSBram Moolenaar # only checks line continuation 942cfcd011fSBram Moolenaar var lines =<< trim END 943006ad48bSBram Moolenaar vim9script 944006ad48bSBram Moolenaar try 945006ad48bSBram Moolenaar throw 'one' 946006ad48bSBram Moolenaar .. 'two' 947006ad48bSBram Moolenaar catch 948006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 949006ad48bSBram Moolenaar endtry 950006ad48bSBram Moolenaar END 951006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9521e021e63SBram Moolenaar 9531e021e63SBram Moolenaar lines =<< trim END 9541e021e63SBram Moolenaar vim9script 955352134bbSBram Moolenaar @r = '' 9561e021e63SBram Moolenaar def Func() 9571e021e63SBram Moolenaar throw @r 9581e021e63SBram Moolenaar enddef 9591e021e63SBram Moolenaar var result = '' 9601e021e63SBram Moolenaar try 9611e021e63SBram Moolenaar Func() 9621e021e63SBram Moolenaar catch /E1129:/ 9631e021e63SBram Moolenaar result = 'caught' 9641e021e63SBram Moolenaar endtry 9651e021e63SBram Moolenaar assert_equal('caught', result) 9661e021e63SBram Moolenaar END 9671e021e63SBram Moolenaar CheckScriptSuccess(lines) 968006ad48bSBram Moolenaarenddef 969006ad48bSBram Moolenaar 970ed677f55SBram Moolenaardef Test_error_in_nested_function() 97103dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 972cfcd011fSBram Moolenaar var lines =<< trim END 973ed677f55SBram Moolenaar vim9script 974ed677f55SBram Moolenaar def Func() 975ed677f55SBram Moolenaar Error() 976ed677f55SBram Moolenaar g:test_var = 1 977ed677f55SBram Moolenaar enddef 978ed677f55SBram Moolenaar func Error() abort 979ed677f55SBram Moolenaar eval [][0] 980ed677f55SBram Moolenaar endfunc 981ed677f55SBram Moolenaar Func() 982ed677f55SBram Moolenaar END 983ed677f55SBram Moolenaar g:test_var = 0 984ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 985ed677f55SBram Moolenaar assert_equal(0, g:test_var) 986ed677f55SBram Moolenaarenddef 987ed677f55SBram Moolenaar 988227c58a4SBram Moolenaardef Test_abort_after_error() 989227c58a4SBram Moolenaar var lines =<< trim END 990227c58a4SBram Moolenaar vim9script 991227c58a4SBram Moolenaar while true 992227c58a4SBram Moolenaar echo notfound 993227c58a4SBram Moolenaar endwhile 994227c58a4SBram Moolenaar g:gotthere = true 995227c58a4SBram Moolenaar END 996227c58a4SBram Moolenaar g:gotthere = false 997227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 998227c58a4SBram Moolenaar assert_false(g:gotthere) 999227c58a4SBram Moolenaar unlet g:gotthere 1000227c58a4SBram Moolenaarenddef 1001227c58a4SBram Moolenaar 100237c83711SBram Moolenaardef Test_cexpr_vimscript() 1003f5be8cdbSBram Moolenaar # only checks line continuation 100437c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 1005cfcd011fSBram Moolenaar var lines =<< trim END 100637c83711SBram Moolenaar vim9script 100737c83711SBram Moolenaar cexpr 'File' 100837c83711SBram Moolenaar .. ' someFile' .. 100937c83711SBram Moolenaar ' line 19' 101037c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 101137c83711SBram Moolenaar END 101237c83711SBram Moolenaar CheckScriptSuccess(lines) 101337c83711SBram Moolenaar set errorformat& 101437c83711SBram Moolenaarenddef 101537c83711SBram Moolenaar 1016c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1017c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1018cfcd011fSBram Moolenaar var lines =<< trim END 1019c9edd6b5SBram Moolenaar vim9script 1020c9edd6b5SBram Moolenaar func g:Status() 1021c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1022c9edd6b5SBram Moolenaar endfunc 1023c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1024c9edd6b5SBram Moolenaar redrawstatus 1025c9edd6b5SBram Moolenaar set laststatus statusline= 1026c9edd6b5SBram Moolenaar END 1027c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1028c9edd6b5SBram Moolenaarenddef 1029c9edd6b5SBram Moolenaar 1030b209750bSBram Moolenaardef Test_list_vimscript() 1031b209750bSBram Moolenaar # checks line continuation and comments 1032cfcd011fSBram Moolenaar var lines =<< trim END 1033b209750bSBram Moolenaar vim9script 1034cfcd011fSBram Moolenaar var mylist = [ 1035b209750bSBram Moolenaar 'one', 1036b209750bSBram Moolenaar # comment 1037b209750bSBram Moolenaar 'two', # empty line follows 1038b209750bSBram Moolenaar 1039b209750bSBram Moolenaar 'three', 1040b209750bSBram Moolenaar ] 1041b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1042b209750bSBram Moolenaar END 1043b209750bSBram Moolenaar CheckScriptSuccess(lines) 104466250c93SBram Moolenaar 104566250c93SBram Moolenaar # check all lines from heredoc are kept 104666250c93SBram Moolenaar lines =<< trim END 104766250c93SBram Moolenaar # comment 1 104866250c93SBram Moolenaar two 104966250c93SBram Moolenaar # comment 3 105066250c93SBram Moolenaar 105166250c93SBram Moolenaar five 105266250c93SBram Moolenaar # comment 6 105366250c93SBram Moolenaar END 105466250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10554bce26bbSBram Moolenaar 10564bce26bbSBram Moolenaar lines =<< trim END 10574bce26bbSBram Moolenaar [{ 10584bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10594bce26bbSBram Moolenaar END 10604bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1061b209750bSBram Moolenaarenddef 1062b209750bSBram Moolenaar 10632a1381c3SBram Moolenaarif has('channel') 106440ee466cSBram Moolenaar let someJob = test_null_job() 106540ee466cSBram Moolenaar 106640ee466cSBram Moolenaar def FuncWithError() 106740ee466cSBram Moolenaar echomsg g:someJob 106840ee466cSBram Moolenaar enddef 106940ee466cSBram Moolenaar 107040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 107140ee466cSBram Moolenaar try 107240ee466cSBram Moolenaar call FuncWithError() 107340ee466cSBram Moolenaar catch 107440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 107540ee466cSBram Moolenaar endtry 107640ee466cSBram Moolenaar endfunc 10772a1381c3SBram Moolenaarendif 107840ee466cSBram Moolenaar 10798a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10808a7d6542SBram Moolenaar vim9script 1081cfcd011fSBram Moolenaar var name: string = 'bob' 10828a7d6542SBram Moolenaar def Concat(arg: string): string 10838a7d6542SBram Moolenaar return name .. arg 10848a7d6542SBram Moolenaar enddef 1085227a69deSBram Moolenaar g:result = Concat('bie') 1086227a69deSBram Moolenaar g:localname = name 10878a7d6542SBram Moolenaar 10888a7d6542SBram Moolenaar export const CONST = 1234 1089cfcd011fSBram Moolenaar export var exported = 9876 1090cfcd011fSBram Moolenaar export var exp_name = 'John' 10918a7d6542SBram Moolenaar export def Exported(): string 10928a7d6542SBram Moolenaar return 'Exported' 10938a7d6542SBram Moolenaar enddef 109424e93165SBram Moolenaar export def ExportedValue(): number 109524e93165SBram Moolenaar return exported 109624e93165SBram Moolenaar enddef 109724e93165SBram Moolenaar export def ExportedInc() 109824e93165SBram Moolenaar exported += 5 109924e93165SBram Moolenaar enddef 11000f2a5cc6SBram Moolenaar export final theList = [1] 11018a7d6542SBram MoolenaarEND 11028a7d6542SBram Moolenaar 1103b3ca9824SBram Moolenaardef Undo_export_script_lines() 1104b3ca9824SBram Moolenaar unlet g:result 1105b3ca9824SBram Moolenaar unlet g:localname 1106b3ca9824SBram Moolenaarenddef 1107b3ca9824SBram Moolenaar 11085269bd2aSBram Moolenaardef Test_vim9_import_export() 1109cfcd011fSBram Moolenaar var import_script_lines =<< trim END 11108a7d6542SBram Moolenaar vim9script 111124e93165SBram Moolenaar import {exported, Exported, ExportedValue} from './Xexport.vim' 111224e93165SBram Moolenaar g:exported1 = exported 11136e587dcbSBram Moolenaar exported += 3 111424e93165SBram Moolenaar g:exported2 = exported 111524e93165SBram Moolenaar g:exported3 = ExportedValue() 111624e93165SBram Moolenaar 111724e93165SBram Moolenaar import ExportedInc from './Xexport.vim' 111824e93165SBram Moolenaar ExportedInc() 111924e93165SBram Moolenaar g:exported_i1 = exported 112024e93165SBram Moolenaar g:exported_i2 = ExportedValue() 112124e93165SBram Moolenaar 112224e93165SBram Moolenaar exported = 11 112324e93165SBram Moolenaar g:exported_s1 = exported 112424e93165SBram Moolenaar g:exported_s2 = ExportedValue() 112524e93165SBram Moolenaar 11268a7d6542SBram Moolenaar g:imported_func = Exported() 11276e587dcbSBram Moolenaar 112840f4f7a4SBram Moolenaar def GetExported(): string 1129e0de171eSBram Moolenaar var local_dict = {ref: Exported} 113040f4f7a4SBram Moolenaar return local_dict.ref() 113140f4f7a4SBram Moolenaar enddef 113240f4f7a4SBram Moolenaar g:funcref_result = GetExported() 113340f4f7a4SBram Moolenaar 11344db572eeSBram Moolenaar var dir = './' 11354db572eeSBram Moolenaar var ext = ".vim" 11364db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 11376e587dcbSBram Moolenaar g:imported_name = exp_name 11386e587dcbSBram Moolenaar exp_name ..= ' Doe' 11396e587dcbSBram Moolenaar g:imported_name_appended = exp_name 114024e93165SBram Moolenaar g:exported_later = exported 11410f2a5cc6SBram Moolenaar 11420f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11430f2a5cc6SBram Moolenaar theList->add(2) 11440f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 11458a7d6542SBram Moolenaar END 11468a7d6542SBram Moolenaar 11478a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11488a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11498a7d6542SBram Moolenaar 11508a7d6542SBram Moolenaar source Ximport.vim 11518a7d6542SBram Moolenaar 11528a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11538a7d6542SBram Moolenaar assert_equal('bob', g:localname) 115424e93165SBram Moolenaar assert_equal(9876, g:exported1) 115524e93165SBram Moolenaar assert_equal(9879, g:exported2) 115624e93165SBram Moolenaar assert_equal(9879, g:exported3) 115724e93165SBram Moolenaar 115824e93165SBram Moolenaar assert_equal(9884, g:exported_i1) 115924e93165SBram Moolenaar assert_equal(9884, g:exported_i2) 116024e93165SBram Moolenaar 116124e93165SBram Moolenaar assert_equal(11, g:exported_s1) 116224e93165SBram Moolenaar assert_equal(11, g:exported_s2) 116324e93165SBram Moolenaar assert_equal(11, g:exported_later) 116424e93165SBram Moolenaar 11658a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 116640f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11676e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11686e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11698a7d6542SBram Moolenaar assert_false(exists('g:name')) 11708a7d6542SBram Moolenaar 1171b3ca9824SBram Moolenaar Undo_export_script_lines() 117224e93165SBram Moolenaar unlet g:exported1 117324e93165SBram Moolenaar unlet g:exported2 117424e93165SBram Moolenaar unlet g:exported3 117524e93165SBram Moolenaar unlet g:exported_i1 117624e93165SBram Moolenaar unlet g:exported_i2 117724e93165SBram Moolenaar unlet g:exported_later 11788a7d6542SBram Moolenaar unlet g:imported_func 11796e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11808a7d6542SBram Moolenaar delete('Ximport.vim') 1181f2d5c240SBram Moolenaar 11821c991144SBram Moolenaar # similar, with line breaks 1183cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11841c991144SBram Moolenaar vim9script 11851c991144SBram Moolenaar import { 11861c991144SBram Moolenaar exported, 11871c991144SBram Moolenaar Exported, 11881c991144SBram Moolenaar } 11891c991144SBram Moolenaar from 11901c991144SBram Moolenaar './Xexport.vim' 119124e93165SBram Moolenaar g:exported = exported 119224e93165SBram Moolenaar exported += 7 119324e93165SBram Moolenaar g:exported_added = exported 11941c991144SBram Moolenaar g:imported_func = Exported() 11951c991144SBram Moolenaar END 11961c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11971c991144SBram Moolenaar source Ximport_lbr.vim 11981c991144SBram Moolenaar 119924e93165SBram Moolenaar assert_equal(11, g:exported) 120024e93165SBram Moolenaar assert_equal(18, g:exported_added) 12011c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 12021c991144SBram Moolenaar 12031c991144SBram Moolenaar # exported script not sourced again 12041c991144SBram Moolenaar assert_false(exists('g:result')) 120524e93165SBram Moolenaar unlet g:exported 120624e93165SBram Moolenaar unlet g:exported_added 12071c991144SBram Moolenaar unlet g:imported_func 12081c991144SBram Moolenaar delete('Ximport_lbr.vim') 12091c991144SBram Moolenaar 1210cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1211f2d5c240SBram Moolenaar vim9script 1212f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1213f2d5c240SBram Moolenaar def UseExport() 121424e93165SBram Moolenaar g:exported_def = Export.exported 1215f2d5c240SBram Moolenaar enddef 121624e93165SBram Moolenaar g:exported_script = Export.exported 1217cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1218cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1219f2d5c240SBram Moolenaar UseExport() 1220f2d5c240SBram Moolenaar END 1221f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1222f2d5c240SBram Moolenaar source Ximport.vim 122324e93165SBram Moolenaar 122424e93165SBram Moolenaar assert_equal(18, g:exported_def) 122524e93165SBram Moolenaar assert_equal(18, g:exported_script) 122624e93165SBram Moolenaar unlet g:exported_def 122724e93165SBram Moolenaar unlet g:exported_script 1228f2d5c240SBram Moolenaar 1229cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1230599c89c8SBram Moolenaar vim9script 1231599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1232599c89c8SBram Moolenaar def Func() 1233cfcd011fSBram Moolenaar var dummy = 1 1234cfcd011fSBram Moolenaar var imported = Export + dummy 1235599c89c8SBram Moolenaar enddef 1236822ba247SBram Moolenaar defcompile 1237599c89c8SBram Moolenaar END 1238599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 123944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1240599c89c8SBram Moolenaar 1241cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1242599c89c8SBram Moolenaar vim9script 1243599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1244599c89c8SBram Moolenaar def Func() 1245cfcd011fSBram Moolenaar var imported = Export . exported 1246599c89c8SBram Moolenaar enddef 1247822ba247SBram Moolenaar defcompile 1248599c89c8SBram Moolenaar END 1249599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 125044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1251599c89c8SBram Moolenaar 1252921ba529SBram Moolenaar var import_func_duplicated =<< trim END 1253921ba529SBram Moolenaar vim9script 1254921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1255921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1256921ba529SBram Moolenaar 1257921ba529SBram Moolenaar ExportedInc() 1258921ba529SBram Moolenaar END 1259921ba529SBram Moolenaar writefile(import_func_duplicated, 'Ximport.vim') 1260921ba529SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 1261921ba529SBram Moolenaar 1262a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1263a6294955SBram Moolenaar vim9script 1264a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1265a6294955SBram Moolenaar var some = 'other' 1266a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1267a6294955SBram Moolenaar defcompile 1268a6294955SBram Moolenaar END 1269a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1270a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1271a6294955SBram Moolenaar 1272cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1273cb4e80faSBram Moolenaar vim9script 1274cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1275cb4e80faSBram Moolenaar g:imported_script = Export exported 1276cb4e80faSBram Moolenaar END 1277cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1278cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1279cb4e80faSBram Moolenaar 1280cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1281cb4e80faSBram Moolenaar vim9script 1282cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1283cb4e80faSBram Moolenaar g:imported_script = Export. exported 1284cb4e80faSBram Moolenaar END 1285cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1286cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1287cb4e80faSBram Moolenaar 1288cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1289599c89c8SBram Moolenaar vim9script 1290599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1291599c89c8SBram Moolenaar def Func() 1292cfcd011fSBram Moolenaar var imported = Export. 1293599c89c8SBram Moolenaar enddef 1294822ba247SBram Moolenaar defcompile 1295599c89c8SBram Moolenaar END 1296599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 129744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1298599c89c8SBram Moolenaar 1299cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 13001c991144SBram Moolenaar vim9script 13011c991144SBram Moolenaar import * 13021c991144SBram Moolenaar as Export 13031c991144SBram Moolenaar from 13041c991144SBram Moolenaar './Xexport.vim' 13051c991144SBram Moolenaar def UseExport() 130624e93165SBram Moolenaar g:exported = Export.exported 13071c991144SBram Moolenaar enddef 13081c991144SBram Moolenaar UseExport() 13091c991144SBram Moolenaar END 13101c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13111c991144SBram Moolenaar source Ximport.vim 131224e93165SBram Moolenaar assert_equal(18, g:exported) 131324e93165SBram Moolenaar unlet g:exported 13141c991144SBram Moolenaar 1315cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1316f2d5c240SBram Moolenaar vim9script 1317f2d5c240SBram Moolenaar import * from './Xexport.vim' 1318f2d5c240SBram Moolenaar END 1319f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 132044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1321f2d5c240SBram Moolenaar 1322f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1323cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1324fa29c8abSBram Moolenaar vim9script 1325fa29c8abSBram Moolenaar import name from './Xexport.vim' 1326fa29c8abSBram Moolenaar END 1327fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 132844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1329fa29c8abSBram Moolenaar 1330f5be8cdbSBram Moolenaar # try to import something that is already defined 1331cfcd011fSBram Moolenaar var import_already_defined =<< trim END 13325269bd2aSBram Moolenaar vim9script 1333cfcd011fSBram Moolenaar var exported = 'something' 13345269bd2aSBram Moolenaar import exported from './Xexport.vim' 13355269bd2aSBram Moolenaar END 13365269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1337057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13385269bd2aSBram Moolenaar 1339f5be8cdbSBram Moolenaar # try to import something that is already defined 13405269bd2aSBram Moolenaar import_already_defined =<< trim END 13415269bd2aSBram Moolenaar vim9script 1342cfcd011fSBram Moolenaar var exported = 'something' 13435269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13445269bd2aSBram Moolenaar END 13455269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1346057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13475269bd2aSBram Moolenaar 1348f5be8cdbSBram Moolenaar # try to import something that is already defined 13495269bd2aSBram Moolenaar import_already_defined =<< trim END 13505269bd2aSBram Moolenaar vim9script 1351cfcd011fSBram Moolenaar var exported = 'something' 13525269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13535269bd2aSBram Moolenaar END 13545269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1355057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13565269bd2aSBram Moolenaar 1357918a4249SBram Moolenaar # try changing an imported const 1358918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1359918a4249SBram Moolenaar vim9script 1360918a4249SBram Moolenaar import CONST from './Xexport.vim' 1361918a4249SBram Moolenaar def Assign() 1362918a4249SBram Moolenaar CONST = 987 1363918a4249SBram Moolenaar enddef 1364918a4249SBram Moolenaar defcompile 1365918a4249SBram Moolenaar END 1366918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1367918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1368918a4249SBram Moolenaar 13690f2a5cc6SBram Moolenaar # try changing an imported final 13700f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13710f2a5cc6SBram Moolenaar vim9script 13720f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13730f2a5cc6SBram Moolenaar def Assign() 13740f2a5cc6SBram Moolenaar theList = [2] 13750f2a5cc6SBram Moolenaar enddef 13760f2a5cc6SBram Moolenaar defcompile 13770f2a5cc6SBram Moolenaar END 13780f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13790f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13800f2a5cc6SBram Moolenaar 1381f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1382cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1383fa29c8abSBram Moolenaar vim9script 1384fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1385fa29c8abSBram Moolenaar END 1386fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 138744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1388fa29c8abSBram Moolenaar 1389cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1390fa29c8abSBram Moolenaar vim9script 1391fa29c8abSBram Moolenaar import name './Xexport.vim' 1392fa29c8abSBram Moolenaar END 1393fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 139444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1395fa29c8abSBram Moolenaar 1396cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1397fa29c8abSBram Moolenaar vim9script 1398fa29c8abSBram Moolenaar import name from Xexport.vim 1399fa29c8abSBram Moolenaar END 1400fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 14014db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1402fa29c8abSBram Moolenaar 1403cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1404fa29c8abSBram Moolenaar vim9script 1405fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1406fa29c8abSBram Moolenaar END 1407fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 140844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1409fa29c8abSBram Moolenaar 1410cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1411fa29c8abSBram Moolenaar vim9script 1412fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1413fa29c8abSBram Moolenaar END 14145269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 141544d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1416fa29c8abSBram Moolenaar 141760579350SBram Moolenaar var import_redefining_lines =<< trim END 141860579350SBram Moolenaar vim9script 141960579350SBram Moolenaar import exported from './Xexport.vim' 142060579350SBram Moolenaar var exported = 5 142160579350SBram Moolenaar END 142260579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 142360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 142460579350SBram Moolenaar 142560579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 142660579350SBram Moolenaar vim9script 142760579350SBram Moolenaar import exported from './Xexport.vim' 142860579350SBram Moolenaar exported = 'xxx' 142960579350SBram Moolenaar END 143060579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 143160579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 143260579350SBram Moolenaar 143360579350SBram Moolenaar var import_assign_const_lines =<< trim END 143460579350SBram Moolenaar vim9script 143560579350SBram Moolenaar import CONST from './Xexport.vim' 143660579350SBram Moolenaar CONST = 4321 143760579350SBram Moolenaar END 143860579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 143960579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 144060579350SBram Moolenaar 1441f2d5c240SBram Moolenaar delete('Ximport.vim') 14425269bd2aSBram Moolenaar delete('Ximport3.vim') 14438a7d6542SBram Moolenaar delete('Xexport.vim') 14448a7d6542SBram Moolenaar 1445f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14463e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14473e191694SBram Moolenaar set cpo=abcd 1448cfcd011fSBram Moolenaar var lines =<< trim END 1449750802b5SBram Moolenaar vim9script 1450750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14513e191694SBram Moolenaar set cpo+=f 14523e191694SBram Moolenaar set cpo-=c 14533e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1454750802b5SBram Moolenaar END 1455750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1456750802b5SBram Moolenaar source Xvim9_script 14573e191694SBram Moolenaar assert_equal('fabd', &cpo) 1458750802b5SBram Moolenaar set cpo&vim 1459750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14603e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14613e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14623e191694SBram Moolenaar 1463750802b5SBram Moolenaar delete('Xvim9_script') 1464750802b5SBram Moolenaarenddef 1465750802b5SBram Moolenaar 14660a84284eSBram Moolenaardef Test_import_as() 14670a84284eSBram Moolenaar var export_lines =<< trim END 14680a84284eSBram Moolenaar vim9script 14690a84284eSBram Moolenaar export var one = 1 14700a84284eSBram Moolenaar export var yes = 'yes' 1471c967d57aSBram Moolenaar export var slist: list<string> 14720a84284eSBram Moolenaar END 14730a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14740a84284eSBram Moolenaar 14750a84284eSBram Moolenaar var import_lines =<< trim END 14760a84284eSBram Moolenaar vim9script 14776c7cc347SBram Moolenaar var one = 'notused' 14786c7cc347SBram Moolenaar var yes = 777 14790a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14800a84284eSBram Moolenaar assert_equal(1, thatOne) 14810a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14820a84284eSBram Moolenaar assert_equal('yes', yesYes) 14830a84284eSBram Moolenaar END 14840a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14850a84284eSBram Moolenaar 14860a84284eSBram Moolenaar import_lines =<< trim END 14870a84284eSBram Moolenaar vim9script 14880a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 14890a84284eSBram Moolenaar assert_equal(1, thatOne) 14900a84284eSBram Moolenaar assert_equal('yes', yesYes) 14910a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 14920a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 14930a84284eSBram Moolenaar END 14940a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14950a84284eSBram Moolenaar 1496c967d57aSBram Moolenaar import_lines =<< trim END 1497c967d57aSBram Moolenaar vim9script 1498c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1499c967d57aSBram Moolenaar impSlist->add(123) 1500c967d57aSBram Moolenaar END 1501c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1502c967d57aSBram Moolenaar 15030a84284eSBram Moolenaar delete('XexportAs') 15040a84284eSBram Moolenaarenddef 15050a84284eSBram Moolenaar 1506803af686SBram Moolenaarfunc g:Trigger() 1507803af686SBram Moolenaar source Ximport.vim 1508803af686SBram Moolenaar return "echo 'yes'\<CR>" 1509803af686SBram Moolenaarendfunc 1510803af686SBram Moolenaar 1511803af686SBram Moolenaardef Test_import_export_expr_map() 1512803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1513cfcd011fSBram Moolenaar var export_lines =<< trim END 1514803af686SBram Moolenaar vim9script 1515803af686SBram Moolenaar export def That(): string 1516803af686SBram Moolenaar return 'yes' 1517803af686SBram Moolenaar enddef 1518803af686SBram Moolenaar END 1519803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1520803af686SBram Moolenaar 1521cfcd011fSBram Moolenaar var import_lines =<< trim END 1522803af686SBram Moolenaar vim9script 1523803af686SBram Moolenaar import That from './Xexport_that.vim' 1524803af686SBram Moolenaar assert_equal('yes', That()) 1525803af686SBram Moolenaar END 1526803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1527803af686SBram Moolenaar 1528803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1529803af686SBram Moolenaar feedkeys('trigger', "xt") 1530803af686SBram Moolenaar 1531730b2483SBram Moolenaar delete('Xexport_that.vim') 1532803af686SBram Moolenaar delete('Ximport.vim') 1533803af686SBram Moolenaar nunmap trigger 1534803af686SBram Moolenaarenddef 1535803af686SBram Moolenaar 15368e1986e3SBram Moolenaardef Test_import_in_filetype() 15378e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15388e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1539cfcd011fSBram Moolenaar var export_lines =<< trim END 15408e1986e3SBram Moolenaar vim9script 1541cfcd011fSBram Moolenaar export var That = 'yes' 15428e1986e3SBram Moolenaar END 1543730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15448e1986e3SBram Moolenaar 1545cfcd011fSBram Moolenaar var import_lines =<< trim END 15468e1986e3SBram Moolenaar vim9script 1547730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15488e1986e3SBram Moolenaar assert_equal('yes', That) 15498e1986e3SBram Moolenaar g:did_load_mytpe = 1 15508e1986e3SBram Moolenaar END 15518e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15528e1986e3SBram Moolenaar 1553cfcd011fSBram Moolenaar var save_rtp = &rtp 15548e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15558e1986e3SBram Moolenaar 15568e1986e3SBram Moolenaar filetype plugin on 15578e1986e3SBram Moolenaar copen 15588e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15598e1986e3SBram Moolenaar 15608e1986e3SBram Moolenaar quit! 1561730b2483SBram Moolenaar delete('Xexport_ft.vim') 15628e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15638e1986e3SBram Moolenaar &rtp = save_rtp 15648e1986e3SBram Moolenaarenddef 15658e1986e3SBram Moolenaar 1566efa94447SBram Moolenaardef Test_use_import_in_mapping() 1567cfcd011fSBram Moolenaar var lines =<< trim END 1568efa94447SBram Moolenaar vim9script 1569efa94447SBram Moolenaar export def Funcx() 1570efa94447SBram Moolenaar g:result = 42 1571efa94447SBram Moolenaar enddef 1572efa94447SBram Moolenaar END 1573efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1574efa94447SBram Moolenaar lines =<< trim END 1575efa94447SBram Moolenaar vim9script 1576efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1577b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1578efa94447SBram Moolenaar END 1579efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1580efa94447SBram Moolenaar 1581efa94447SBram Moolenaar source Xmapscript.vim 1582b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1583efa94447SBram Moolenaar assert_equal(42, g:result) 1584efa94447SBram Moolenaar 1585efa94447SBram Moolenaar unlet g:result 1586efa94447SBram Moolenaar delete('XsomeExport.vim') 1587efa94447SBram Moolenaar delete('Xmapscript.vim') 1588b3ca9824SBram Moolenaar nunmap <F3> 1589efa94447SBram Moolenaarenddef 1590efa94447SBram Moolenaar 1591d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1592d3f8a9eeSBram Moolenaar var lines =<< trim END 1593d3f8a9eeSBram Moolenaar if has(g:feature) 1594d3f8a9eeSBram Moolenaar " legacy script 1595d3f8a9eeSBram Moolenaar let g:legacy = 1 1596d3f8a9eeSBram Moolenaar finish 1597d3f8a9eeSBram Moolenaar endif 1598d3f8a9eeSBram Moolenaar vim9script 1599d3f8a9eeSBram Moolenaar g:legacy = 0 1600d3f8a9eeSBram Moolenaar END 1601d3f8a9eeSBram Moolenaar g:feature = 'eval' 1602d3f8a9eeSBram Moolenaar g:legacy = -1 1603d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1604d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1605d3f8a9eeSBram Moolenaar 1606d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1607d3f8a9eeSBram Moolenaar g:legacy = -1 1608d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1609d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1610d3f8a9eeSBram Moolenaarenddef 1611d3f8a9eeSBram Moolenaar 1612750802b5SBram Moolenaardef Test_vim9script_fails() 16138a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16148a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1615cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16169721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1617cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1618750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1619750802b5SBram Moolenaar 1620cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1621c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1622c785b9a7SBram Moolenaar 1623e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1624e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16258a7d6542SBram Moolenaarenddef 16268a7d6542SBram Moolenaar 1627f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1628101f4810SBram Moolenaar CheckRunVimInTerminal 1629101f4810SBram Moolenaar 16309bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1631c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16329bb3eb3eSBram Moolenaarendfunc 16339bb3eb3eSBram Moolenaar 1634c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1635cfcd011fSBram Moolenaar var export =<< trim END 1636101f4810SBram Moolenaar vim9script 1637101f4810SBram Moolenaar export def Foo(): number 1638101f4810SBram Moolenaar return 0 1639101f4810SBram Moolenaar enddef 1640101f4810SBram Moolenaar END 1641730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1642101f4810SBram Moolenaar 1643e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16449bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16452949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1646101f4810SBram Moolenaar 1647730b2483SBram Moolenaar delete('XexportCmd.vim') 16489bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16499bb3eb3eSBram Moolenaarenddef 1650101f4810SBram Moolenaar 16512b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16522b32700dSBram Moolenaar var lines =<< trim END 1653a6294955SBram Moolenaar vim9script 1654a6294955SBram Moolenaar export var exported = 'thexport' 165560dc8274SBram Moolenaar 165660dc8274SBram Moolenaar export def TheFunc(x = 0) 165760dc8274SBram Moolenaar enddef 1658a6294955SBram Moolenaar END 1659a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1660a6294955SBram Moolenaar lines =<< trim END 16612b32700dSBram Moolenaar vim9script noclear 16622b32700dSBram Moolenaar g:loadCount += 1 16632b32700dSBram Moolenaar var s:reloaded = 'init' 1664a6294955SBram Moolenaar import exported from './XExportReload' 16652b32700dSBram Moolenaar 16662b32700dSBram Moolenaar def Again(): string 16672b32700dSBram Moolenaar return 'again' 16682b32700dSBram Moolenaar enddef 16692b32700dSBram Moolenaar 167060dc8274SBram Moolenaar import TheFunc from './XExportReload' 167160dc8274SBram Moolenaar TheFunc() 167260dc8274SBram Moolenaar 16732b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16742b32700dSBram Moolenaar var s:loaded = true 16752b32700dSBram Moolenaar 16762b32700dSBram Moolenaar var s:notReloaded = 'yes' 16772b32700dSBram Moolenaar s:reloaded = 'first' 16782b32700dSBram Moolenaar def g:Values(): list<string> 1679a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16802b32700dSBram Moolenaar enddef 16812b32700dSBram Moolenaar 16822b32700dSBram Moolenaar def Once(): string 16832b32700dSBram Moolenaar return 'once' 16842b32700dSBram Moolenaar enddef 16852b32700dSBram Moolenaar END 16862b32700dSBram Moolenaar writefile(lines, 'XReloaded') 16872b32700dSBram Moolenaar g:loadCount = 0 16882b32700dSBram Moolenaar source XReloaded 16892b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1690a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 16912b32700dSBram Moolenaar source XReloaded 16922b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1693a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16942b32700dSBram Moolenaar source XReloaded 16952b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1696a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 16972b32700dSBram Moolenaar 169848e11c10SBram Moolenaar delete('XReloaded') 1699a6294955SBram Moolenaar delete('XExportReload') 17002b32700dSBram Moolenaar delfunc g:Values 17012b32700dSBram Moolenaar unlet g:loadCount 1702577dc93dSBram Moolenaar 1703577dc93dSBram Moolenaar lines =<< trim END 1704577dc93dSBram Moolenaar vim9script 1705577dc93dSBram Moolenaar def Inner() 1706577dc93dSBram Moolenaar enddef 1707577dc93dSBram Moolenaar END 1708577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1709577dc93dSBram Moolenaar source XreloadScript.vim 1710577dc93dSBram Moolenaar 1711577dc93dSBram Moolenaar lines =<< trim END 1712577dc93dSBram Moolenaar vim9script 1713577dc93dSBram Moolenaar def Outer() 1714577dc93dSBram Moolenaar def Inner() 1715577dc93dSBram Moolenaar enddef 1716577dc93dSBram Moolenaar enddef 1717577dc93dSBram Moolenaar defcompile 1718577dc93dSBram Moolenaar END 1719577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1720577dc93dSBram Moolenaar source XreloadScript.vim 1721577dc93dSBram Moolenaar 1722577dc93dSBram Moolenaar delete('XreloadScript.vim') 17232b32700dSBram Moolenaarenddef 17242b32700dSBram Moolenaar 17254c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1726cfcd011fSBram Moolenaar var lines =<< trim END 17278a7d6542SBram Moolenaar vim9script 17288a7d6542SBram Moolenaar const var = '' 1729cfcd011fSBram Moolenaar var valone = 1234 17308a7d6542SBram Moolenaar def MyFunc(arg: string) 17318a7d6542SBram Moolenaar valone = 5678 17328a7d6542SBram Moolenaar enddef 17338a7d6542SBram Moolenaar END 1734cfcd011fSBram Moolenaar var morelines =<< trim END 1735cfcd011fSBram Moolenaar var valtwo = 222 17368a7d6542SBram Moolenaar export def GetValtwo(): number 17378a7d6542SBram Moolenaar return valtwo 17388a7d6542SBram Moolenaar enddef 17398a7d6542SBram Moolenaar END 174003afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17418a7d6542SBram Moolenaar source Xreload.vim 17428a7d6542SBram Moolenaar source Xreload.vim 17438a7d6542SBram Moolenaar source Xreload.vim 17448a7d6542SBram Moolenaar 1745f5be8cdbSBram Moolenaar # cannot declare a var twice 17468a7d6542SBram Moolenaar lines =<< trim END 17478a7d6542SBram Moolenaar vim9script 1748cfcd011fSBram Moolenaar var valone = 1234 1749cfcd011fSBram Moolenaar var valone = 5678 17508a7d6542SBram Moolenaar END 17518a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 175244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17538a7d6542SBram Moolenaar 17548a7d6542SBram Moolenaar delete('Xreload.vim') 17558a7d6542SBram Moolenaar delete('Ximport.vim') 17568a7d6542SBram Moolenaarenddef 17578a7d6542SBram Moolenaar 175807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 175907a65d26SBram Moolenaar" compiled function using that variable must fail. 176007a65d26SBram Moolenaardef Test_script_reload_change_type() 176107a65d26SBram Moolenaar var lines =<< trim END 176207a65d26SBram Moolenaar vim9script noclear 176307a65d26SBram Moolenaar var str = 'string' 176407a65d26SBram Moolenaar def g:GetStr(): string 176507a65d26SBram Moolenaar return str .. 'xxx' 176607a65d26SBram Moolenaar enddef 176707a65d26SBram Moolenaar END 176807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 176907a65d26SBram Moolenaar source Xreload.vim 177007a65d26SBram Moolenaar echo g:GetStr() 177107a65d26SBram Moolenaar 177207a65d26SBram Moolenaar lines =<< trim END 177307a65d26SBram Moolenaar vim9script noclear 177407a65d26SBram Moolenaar var str = 1234 177507a65d26SBram Moolenaar END 177607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 177707a65d26SBram Moolenaar source Xreload.vim 177807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 177907a65d26SBram Moolenaar 178007a65d26SBram Moolenaar delfunc g:GetStr 178107a65d26SBram Moolenaar delete('Xreload.vim') 178207a65d26SBram Moolenaarenddef 178307a65d26SBram Moolenaar 1784c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1785c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1786c970e422SBram Moolenaar 1787c970e422SBram Moolenaardef Test_script_reload_from_function() 1788c970e422SBram Moolenaar var lines =<< trim END 1789c970e422SBram Moolenaar vim9script 1790c970e422SBram Moolenaar 1791c970e422SBram Moolenaar if exists('g:loaded') 1792c970e422SBram Moolenaar finish 1793c970e422SBram Moolenaar endif 1794c970e422SBram Moolenaar g:loaded = 1 1795c970e422SBram Moolenaar delcommand CallFunc 1796c970e422SBram Moolenaar command CallFunc Func() 1797c970e422SBram Moolenaar def Func() 1798a4c81beaSBram Moolenaar so XreloadFunc.vim 1799c970e422SBram Moolenaar g:didTheFunc = 1 1800c970e422SBram Moolenaar enddef 1801c970e422SBram Moolenaar END 1802c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1803c970e422SBram Moolenaar source XreloadFunc.vim 1804c970e422SBram Moolenaar CallFunc 1805c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1806c970e422SBram Moolenaar 1807c970e422SBram Moolenaar delete('XreloadFunc.vim') 1808c970e422SBram Moolenaar delcommand CallFunc 1809c970e422SBram Moolenaar unlet g:loaded 1810c970e422SBram Moolenaar unlet g:didTheFunc 1811c970e422SBram Moolenaarenddef 1812c970e422SBram Moolenaar 18136c3843caSBram Moolenaardef Test_script_var_shadows_function() 18146c3843caSBram Moolenaar var lines =<< trim END 18156c3843caSBram Moolenaar vim9script 18166c3843caSBram Moolenaar def Func(): number 18176c3843caSBram Moolenaar return 123 18186c3843caSBram Moolenaar enddef 18196c3843caSBram Moolenaar var Func = 1 18206c3843caSBram Moolenaar END 18216c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18226c3843caSBram Moolenaarenddef 18236c3843caSBram Moolenaar 1824c323527dSBram Moolenaardef Test_script_var_shadows_command() 1825c323527dSBram Moolenaar var lines =<< trim END 1826c323527dSBram Moolenaar var undo = 1 1827c323527dSBram Moolenaar undo = 2 1828c323527dSBram Moolenaar assert_equal(2, undo) 1829c323527dSBram Moolenaar END 1830c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1831c323527dSBram Moolenaar 1832c323527dSBram Moolenaar lines =<< trim END 1833c323527dSBram Moolenaar var undo = 1 1834c323527dSBram Moolenaar undo 1835c323527dSBram Moolenaar END 1836c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1837c323527dSBram Moolenaarenddef 1838c323527dSBram Moolenaar 183995006e3dSBram Moolenaardef s:RetSome(): string 184095006e3dSBram Moolenaar return 'some' 184195006e3dSBram Moolenaarenddef 184295006e3dSBram Moolenaar 1843fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1844fe465a01SBram Moolenaar" script-local name. 1845fe465a01SBram Moolenaardef Test_vim9script_funcref() 1846cfcd011fSBram Moolenaar var sortlines =<< trim END 1847fe465a01SBram Moolenaar vim9script 1848fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1849bed36b93SBram Moolenaar return i2 - i1 1850fe465a01SBram Moolenaar enddef 1851fe465a01SBram Moolenaar 1852fe465a01SBram Moolenaar export def FastSort(): list<number> 1853fe465a01SBram Moolenaar return range(5)->sort(Compare) 1854fe465a01SBram Moolenaar enddef 1855529fb5a5SBram Moolenaar 1856529fb5a5SBram Moolenaar export def GetString(arg: string): string 1857529fb5a5SBram Moolenaar return arg 1858529fb5a5SBram Moolenaar enddef 1859fe465a01SBram Moolenaar END 1860fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1861fe465a01SBram Moolenaar 1862cfcd011fSBram Moolenaar var lines =<< trim END 1863fe465a01SBram Moolenaar vim9script 1864fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1865fe465a01SBram Moolenaar def Test() 1866fe465a01SBram Moolenaar g:result = FastSort() 1867fe465a01SBram Moolenaar enddef 1868fe465a01SBram Moolenaar Test() 1869529fb5a5SBram Moolenaar 1870529fb5a5SBram Moolenaar # using a function imported with "as" 1871529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1872529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1873529fb5a5SBram Moolenaar 1874529fb5a5SBram Moolenaar # using the function from a compiled function 1875529fb5a5SBram Moolenaar def TestMore(): string 1876ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1877ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1878529fb5a5SBram Moolenaar enddef 1879ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1880529fb5a5SBram Moolenaar 1881529fb5a5SBram Moolenaar # error when using a function that isn't exported 1882529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1883fe465a01SBram Moolenaar END 1884fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1885fe465a01SBram Moolenaar 1886fe465a01SBram Moolenaar source Xscript.vim 1887fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1888fe465a01SBram Moolenaar 1889fe465a01SBram Moolenaar unlet g:result 1890fe465a01SBram Moolenaar delete('Xsort.vim') 1891fe465a01SBram Moolenaar delete('Xscript.vim') 189295006e3dSBram Moolenaar 1893cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 189495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1895fe465a01SBram Moolenaarenddef 1896fe465a01SBram Moolenaar 1897601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1898601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1899601e76acSBram Moolenaar" function reference. 1900c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1901cfcd011fSBram Moolenaar var filterLines =<< trim END 1902c620c055SBram Moolenaar vim9script 1903c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1904c620c055SBram Moolenaar return idx % 2 == 1 1905c620c055SBram Moolenaar enddef 1906c620c055SBram Moolenaar export def FastFilter(): list<number> 1907c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1908c620c055SBram Moolenaar enddef 1909601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1910601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1911601e76acSBram Moolenaar enddef 1912c620c055SBram Moolenaar END 1913c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1914c620c055SBram Moolenaar 1915cfcd011fSBram Moolenaar var lines =<< trim END 1916c620c055SBram Moolenaar vim9script 1917601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1918c620c055SBram Moolenaar def Test() 1919cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1920c620c055SBram Moolenaar enddef 1921c620c055SBram Moolenaar Test() 1922601e76acSBram Moolenaar def TestDirect() 1923cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1924601e76acSBram Moolenaar enddef 1925601e76acSBram Moolenaar TestDirect() 1926c620c055SBram Moolenaar END 1927601e76acSBram Moolenaar CheckScriptSuccess(lines) 1928c620c055SBram Moolenaar delete('Xfilter.vim') 1929c620c055SBram Moolenaarenddef 1930c620c055SBram Moolenaar 19314c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1932cfcd011fSBram Moolenaar var first_lines =<< trim END 19334c17ad94SBram Moolenaar vim9script 19344c17ad94SBram Moolenaar def FuncYes(): string 19354c17ad94SBram Moolenaar return 'yes' 19364c17ad94SBram Moolenaar enddef 19374c17ad94SBram Moolenaar END 1938cfcd011fSBram Moolenaar var withno_lines =<< trim END 19394c17ad94SBram Moolenaar def FuncNo(): string 19404c17ad94SBram Moolenaar return 'no' 19414c17ad94SBram Moolenaar enddef 19424c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19434c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19444c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 194503afdcf1SBram Moolenaar enddef 194603afdcf1SBram Moolenaar END 1947cfcd011fSBram Moolenaar var nono_lines =<< trim END 194803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 194903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 195044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19514c17ad94SBram Moolenaar enddef 19524c17ad94SBram Moolenaar END 19534c17ad94SBram Moolenaar 19544c17ad94SBram Moolenaar # FuncNo() is defined 195503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19564c17ad94SBram Moolenaar source Xreloaded.vim 19574c17ad94SBram Moolenaar g:DoCheck(true) 19584c17ad94SBram Moolenaar 19594c17ad94SBram Moolenaar # FuncNo() is not redefined 196003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19614c17ad94SBram Moolenaar source Xreloaded.vim 19625082471fSBram Moolenaar g:DoCheck(false) 19634c17ad94SBram Moolenaar 19644c17ad94SBram Moolenaar # FuncNo() is back 196503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19664c17ad94SBram Moolenaar source Xreloaded.vim 19675082471fSBram Moolenaar g:DoCheck(false) 19684c17ad94SBram Moolenaar 19694c17ad94SBram Moolenaar delete('Xreloaded.vim') 19704c17ad94SBram Moolenaarenddef 19714c17ad94SBram Moolenaar 197289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 197389483d40SBram Moolenaar # write the script with a script-local variable 1974cfcd011fSBram Moolenaar var lines =<< trim END 197589483d40SBram Moolenaar vim9script 1976cfcd011fSBram Moolenaar var name = 'string' 197789483d40SBram Moolenaar END 197889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 197989483d40SBram Moolenaar source XreloadVar.vim 198089483d40SBram Moolenaar 198189483d40SBram Moolenaar # now write the script using the same variable locally - works 198289483d40SBram Moolenaar lines =<< trim END 198389483d40SBram Moolenaar vim9script 198489483d40SBram Moolenaar def Func() 1985cfcd011fSBram Moolenaar var name = 'string' 198689483d40SBram Moolenaar enddef 198789483d40SBram Moolenaar END 198889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 198989483d40SBram Moolenaar source XreloadVar.vim 199089483d40SBram Moolenaar 199189483d40SBram Moolenaar delete('XreloadVar.vim') 199289483d40SBram Moolenaarenddef 199389483d40SBram Moolenaar 19948a7d6542SBram Moolenaardef Test_import_absolute() 1995cfcd011fSBram Moolenaar var import_lines = [ 1996e6085c53SBram Moolenaar 'vim9script', 1997e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1998e6085c53SBram Moolenaar 'def UseExported()', 1999e6085c53SBram Moolenaar ' g:imported_abs = exported', 2000e6085c53SBram Moolenaar ' exported = 8888', 2001e6085c53SBram Moolenaar ' g:imported_after = exported', 2002e6085c53SBram Moolenaar 'enddef', 2003e6085c53SBram Moolenaar 'UseExported()', 2004e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2005e6085c53SBram Moolenaar ] 20068a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20078a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20088a7d6542SBram Moolenaar 20098a7d6542SBram Moolenaar source Ximport_abs.vim 20108a7d6542SBram Moolenaar 20118a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20124e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2013fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2014fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2015fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2016fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2017fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2018fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2019fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2020fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2021fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2022fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2023e6085c53SBram Moolenaar g:import_disassembled) 2024b3ca9824SBram Moolenaar 2025b3ca9824SBram Moolenaar Undo_export_script_lines() 20268a7d6542SBram Moolenaar unlet g:imported_abs 20274e12a5dfSBram Moolenaar unlet g:import_disassembled 20288a7d6542SBram Moolenaar 20298a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20308a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20318a7d6542SBram Moolenaarenddef 20328a7d6542SBram Moolenaar 20338a7d6542SBram Moolenaardef Test_import_rtp() 2034cfcd011fSBram Moolenaar var import_lines = [ 2035e6085c53SBram Moolenaar 'vim9script', 2036e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2037e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2038e6085c53SBram Moolenaar ] 20398a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2040b885a7c7SBram Moolenaar mkdir('import', 'p') 2041b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20428a7d6542SBram Moolenaar 2043cfcd011fSBram Moolenaar var save_rtp = &rtp 20448a7d6542SBram Moolenaar &rtp = getcwd() 20458a7d6542SBram Moolenaar source Ximport_rtp.vim 20468a7d6542SBram Moolenaar &rtp = save_rtp 20478a7d6542SBram Moolenaar 20488a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20498a7d6542SBram Moolenaar 2050b3ca9824SBram Moolenaar Undo_export_script_lines() 2051b3ca9824SBram Moolenaar unlet g:imported_rtp 20528a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2053b885a7c7SBram Moolenaar delete('import', 'rf') 20548a7d6542SBram Moolenaarenddef 20558a7d6542SBram Moolenaar 205625e0f586SBram Moolenaardef Test_import_compile_error() 2057cfcd011fSBram Moolenaar var export_lines = [ 205825e0f586SBram Moolenaar 'vim9script', 205925e0f586SBram Moolenaar 'export def ExpFunc(): string', 206025e0f586SBram Moolenaar ' return notDefined', 206125e0f586SBram Moolenaar 'enddef', 206225e0f586SBram Moolenaar ] 206325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 206425e0f586SBram Moolenaar 2065cfcd011fSBram Moolenaar var import_lines = [ 206625e0f586SBram Moolenaar 'vim9script', 206725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 206825e0f586SBram Moolenaar 'def ImpFunc()', 206925e0f586SBram Moolenaar ' echo ExpFunc()', 207025e0f586SBram Moolenaar 'enddef', 207125e0f586SBram Moolenaar 'defcompile', 207225e0f586SBram Moolenaar ] 207325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 207425e0f586SBram Moolenaar 207525e0f586SBram Moolenaar try 207625e0f586SBram Moolenaar source Ximport.vim 207725e0f586SBram Moolenaar catch /E1001/ 2078f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20797707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 208025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 208125e0f586SBram Moolenaar endtry 208225e0f586SBram Moolenaar 208325e0f586SBram Moolenaar delete('Xexported.vim') 208425e0f586SBram Moolenaar delete('Ximport.vim') 208525e0f586SBram Moolenaarenddef 208625e0f586SBram Moolenaar 2087c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2088cfcd011fSBram Moolenaar var lines = [ 2089c4ce36d4SBram Moolenaar 'vim9script', 2090c4ce36d4SBram Moolenaar 'def Func()', 2091c4ce36d4SBram Moolenaar ' eval [][0]', 2092c4ce36d4SBram Moolenaar 'enddef', 2093c4ce36d4SBram Moolenaar 'Func()', 2094c4ce36d4SBram Moolenaar ] 2095c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2096c4ce36d4SBram Moolenaar 2097c4ce36d4SBram Moolenaar for count in range(3) 2098c4ce36d4SBram Moolenaar try 2099c4ce36d4SBram Moolenaar source Xtestscript.vim 2100c4ce36d4SBram Moolenaar catch /E684/ 2101c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2102c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2103c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2104c4ce36d4SBram Moolenaar endtry 2105c4ce36d4SBram Moolenaar endfor 2106c4ce36d4SBram Moolenaar 2107c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2108c4ce36d4SBram Moolenaarenddef 2109c4ce36d4SBram Moolenaar 2110eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2111cfcd011fSBram Moolenaar var export_lines =<< trim END 2112eef2102eSBram Moolenaar vim9script 2113eef2102eSBram Moolenaar export def Func() 2114eef2102eSBram Moolenaar echo 'imported' 2115eef2102eSBram Moolenaar enddef 2116eef2102eSBram Moolenaar END 2117eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2118eef2102eSBram Moolenaar 2119cfcd011fSBram Moolenaar var lines =<< trim END 2120eef2102eSBram Moolenaar vim9script 2121eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2122eef2102eSBram Moolenaar def Func() 2123eef2102eSBram Moolenaar echo 'local to function' 2124eef2102eSBram Moolenaar enddef 2125eef2102eSBram Moolenaar END 2126eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2127eef2102eSBram Moolenaar 2128eef2102eSBram Moolenaar lines =<< trim END 2129eef2102eSBram Moolenaar vim9script 2130eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2131eef2102eSBram Moolenaar def Outer() 2132eef2102eSBram Moolenaar def Func() 2133eef2102eSBram Moolenaar echo 'local to function' 2134eef2102eSBram Moolenaar enddef 2135eef2102eSBram Moolenaar enddef 2136eef2102eSBram Moolenaar defcompile 2137eef2102eSBram Moolenaar END 2138eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2139eef2102eSBram Moolenaar 2140eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2141eef2102eSBram Moolenaarenddef 2142eef2102eSBram Moolenaar 2143b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2144cfcd011fSBram Moolenaar var lines =<< trim END 2145b9a2cac3SBram Moolenaar vim9script 2146b9a2cac3SBram Moolenaar def Func() 2147b9a2cac3SBram Moolenaar echo 'one' 2148b9a2cac3SBram Moolenaar enddef 2149b9a2cac3SBram Moolenaar def Func() 2150b9a2cac3SBram Moolenaar echo 'two' 2151b9a2cac3SBram Moolenaar enddef 2152b9a2cac3SBram Moolenaar END 2153b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2154fa211f3cSBram Moolenaar 2155fa211f3cSBram Moolenaar lines =<< trim END 2156fa211f3cSBram Moolenaar vim9script 2157fa211f3cSBram Moolenaar def Foo(): string 2158fa211f3cSBram Moolenaar return 'foo' 2159fa211f3cSBram Moolenaar enddef 2160fa211f3cSBram Moolenaar def Func() 2161cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2162fa211f3cSBram Moolenaar enddef 2163fa211f3cSBram Moolenaar defcompile 2164fa211f3cSBram Moolenaar END 2165fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2166b9a2cac3SBram Moolenaarenddef 2167b9a2cac3SBram Moolenaar 21688a7d6542SBram Moolenaardef Test_fixed_size_list() 2169f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2170cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21718a7d6542SBram Moolenaar l->remove(0) 21728a7d6542SBram Moolenaar l->add(5) 21738a7d6542SBram Moolenaar l->insert(99, 1) 21740f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21758a7d6542SBram Moolenaarenddef 21768a7d6542SBram Moolenaar 2177ae616494SBram Moolenaardef Test_no_insert_xit() 2178d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2179d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2180d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2181d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2182d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2183ae616494SBram Moolenaar 2184ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2185ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2186ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2187ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2188f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2189f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 21906508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 21916508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2192f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2193f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2194f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2195ae616494SBram Moolenaarenddef 2196ae616494SBram Moolenaar 2197158906cfSBram Moolenaardef IfElse(what: number): string 2198cfcd011fSBram Moolenaar var res = '' 2199158906cfSBram Moolenaar if what == 1 2200158906cfSBram Moolenaar res = "one" 2201158906cfSBram Moolenaar elseif what == 2 2202158906cfSBram Moolenaar res = "two" 2203a259d8d3SBram Moolenaar else 2204158906cfSBram Moolenaar res = "three" 2205a259d8d3SBram Moolenaar endif 2206158906cfSBram Moolenaar return res 2207a259d8d3SBram Moolenaarenddef 2208a259d8d3SBram Moolenaar 2209158906cfSBram Moolenaardef Test_if_elseif_else() 2210158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2211158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2212158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22130f18b6d1SBram Moolenaarenddef 22140f18b6d1SBram Moolenaar 2215e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2216d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2217d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2218d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2219ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2220d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22216628b7ebSBram Moolenaar 22226628b7ebSBram Moolenaar var lines =<< trim END 22236628b7ebSBram Moolenaar var s = '' 22246628b7ebSBram Moolenaar if s = '' 22256628b7ebSBram Moolenaar endif 22266628b7ebSBram Moolenaar END 22276628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22286628b7ebSBram Moolenaar 22296628b7ebSBram Moolenaar lines =<< trim END 22306628b7ebSBram Moolenaar var s = '' 22316628b7ebSBram Moolenaar if s == '' 22326628b7ebSBram Moolenaar elseif s = '' 22336628b7ebSBram Moolenaar endif 22346628b7ebSBram Moolenaar END 22356628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2236e8c4abbbSBram Moolenaarenddef 2237e8c4abbbSBram Moolenaar 22386d69bf60SBram Moolenaarlet g:bool_true = v:true 22396d69bf60SBram Moolenaarlet g:bool_false = v:false 22406d69bf60SBram Moolenaar 22416d69bf60SBram Moolenaardef Test_if_const_expr() 2242cfcd011fSBram Moolenaar var res = false 22436d69bf60SBram Moolenaar if true ? true : false 22446d69bf60SBram Moolenaar res = true 22456d69bf60SBram Moolenaar endif 22466d69bf60SBram Moolenaar assert_equal(true, res) 22476d69bf60SBram Moolenaar 2248585fea7bSBram Moolenaar g:glob = 2 2249585fea7bSBram Moolenaar if false 22506797966dSBram Moolenaar execute('g:glob = 3') 2251585fea7bSBram Moolenaar endif 2252585fea7bSBram Moolenaar assert_equal(2, g:glob) 2253585fea7bSBram Moolenaar if true 22546797966dSBram Moolenaar execute('g:glob = 3') 2255585fea7bSBram Moolenaar endif 2256585fea7bSBram Moolenaar assert_equal(3, g:glob) 2257585fea7bSBram Moolenaar 22586d69bf60SBram Moolenaar res = false 22596d69bf60SBram Moolenaar if g:bool_true ? true : false 22606d69bf60SBram Moolenaar res = true 22616d69bf60SBram Moolenaar endif 22626d69bf60SBram Moolenaar assert_equal(true, res) 22636d69bf60SBram Moolenaar 22646d69bf60SBram Moolenaar res = false 22656d69bf60SBram Moolenaar if true ? g:bool_true : false 22666d69bf60SBram Moolenaar res = true 22676d69bf60SBram Moolenaar endif 22686d69bf60SBram Moolenaar assert_equal(true, res) 22696d69bf60SBram Moolenaar 22706d69bf60SBram Moolenaar res = false 22716d69bf60SBram Moolenaar if true ? true : g:bool_false 22726d69bf60SBram Moolenaar res = true 22736d69bf60SBram Moolenaar endif 22746d69bf60SBram Moolenaar assert_equal(true, res) 22756d69bf60SBram Moolenaar 22766d69bf60SBram Moolenaar res = false 22776d69bf60SBram Moolenaar if true ? false : true 22786d69bf60SBram Moolenaar res = true 22796d69bf60SBram Moolenaar endif 22806d69bf60SBram Moolenaar assert_equal(false, res) 22816d69bf60SBram Moolenaar 22826d69bf60SBram Moolenaar res = false 22836d69bf60SBram Moolenaar if false ? false : true 22846d69bf60SBram Moolenaar res = true 22856d69bf60SBram Moolenaar endif 22866d69bf60SBram Moolenaar assert_equal(true, res) 22876d69bf60SBram Moolenaar 22886d69bf60SBram Moolenaar res = false 22896d69bf60SBram Moolenaar if false ? true : false 22906d69bf60SBram Moolenaar res = true 22916d69bf60SBram Moolenaar endif 22926d69bf60SBram Moolenaar assert_equal(false, res) 22936d69bf60SBram Moolenaar 22946d69bf60SBram Moolenaar res = false 2295e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2296e8c4abbbSBram Moolenaar res = true 2297e8c4abbbSBram Moolenaar endif 2298e8c4abbbSBram Moolenaar assert_equal(false, res) 2299e8c4abbbSBram Moolenaar 2300e8c4abbbSBram Moolenaar res = false 23016d69bf60SBram Moolenaar if true && true 23026d69bf60SBram Moolenaar res = true 23036d69bf60SBram Moolenaar endif 23046d69bf60SBram Moolenaar assert_equal(true, res) 23056d69bf60SBram Moolenaar 23066d69bf60SBram Moolenaar res = false 23076d69bf60SBram Moolenaar if true && false 23086d69bf60SBram Moolenaar res = true 23096d69bf60SBram Moolenaar endif 23106d69bf60SBram Moolenaar assert_equal(false, res) 23116d69bf60SBram Moolenaar 23126d69bf60SBram Moolenaar res = false 23136d69bf60SBram Moolenaar if g:bool_true && false 23146d69bf60SBram Moolenaar res = true 23156d69bf60SBram Moolenaar endif 23166d69bf60SBram Moolenaar assert_equal(false, res) 23176d69bf60SBram Moolenaar 23186d69bf60SBram Moolenaar res = false 23196d69bf60SBram Moolenaar if true && g:bool_false 23206d69bf60SBram Moolenaar res = true 23216d69bf60SBram Moolenaar endif 23226d69bf60SBram Moolenaar assert_equal(false, res) 23236d69bf60SBram Moolenaar 23246d69bf60SBram Moolenaar res = false 23256d69bf60SBram Moolenaar if false && false 23266d69bf60SBram Moolenaar res = true 23276d69bf60SBram Moolenaar endif 23286d69bf60SBram Moolenaar assert_equal(false, res) 23296d69bf60SBram Moolenaar 23306d69bf60SBram Moolenaar res = false 23316d69bf60SBram Moolenaar if true || false 23326d69bf60SBram Moolenaar res = true 23336d69bf60SBram Moolenaar endif 23346d69bf60SBram Moolenaar assert_equal(true, res) 23356d69bf60SBram Moolenaar 23366d69bf60SBram Moolenaar res = false 23376d69bf60SBram Moolenaar if g:bool_true || false 23386d69bf60SBram Moolenaar res = true 23396d69bf60SBram Moolenaar endif 23406d69bf60SBram Moolenaar assert_equal(true, res) 23416d69bf60SBram Moolenaar 23426d69bf60SBram Moolenaar res = false 23436d69bf60SBram Moolenaar if true || g:bool_false 23446d69bf60SBram Moolenaar res = true 23456d69bf60SBram Moolenaar endif 23466d69bf60SBram Moolenaar assert_equal(true, res) 23476d69bf60SBram Moolenaar 23486d69bf60SBram Moolenaar res = false 23496d69bf60SBram Moolenaar if false || false 23506d69bf60SBram Moolenaar res = true 23516d69bf60SBram Moolenaar endif 23526d69bf60SBram Moolenaar assert_equal(false, res) 23533988f64fSBram Moolenaar 23543988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2355c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23563988f64fSBram Moolenaar if false | eval burp + 234 | endif 23573988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23583988f64fSBram Moolenaar if false 23593988f64fSBram Moolenaar burp 23603988f64fSBram Moolenaar endif 236180c34ca3SBram Moolenaarenddef 23626d69bf60SBram Moolenaar 236380c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2364d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2365d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2366d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2367d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23686d69bf60SBram Moolenaarenddef 23696d69bf60SBram Moolenaar 237072abcf42SBram Moolenaardef RunNested(i: number): number 2371cfcd011fSBram Moolenaar var x: number = 0 237272abcf42SBram Moolenaar if i % 2 237372abcf42SBram Moolenaar if 1 2374f5be8cdbSBram Moolenaar # comment 237572abcf42SBram Moolenaar else 2376f5be8cdbSBram Moolenaar # comment 237772abcf42SBram Moolenaar endif 237872abcf42SBram Moolenaar x += 1 237972abcf42SBram Moolenaar else 238072abcf42SBram Moolenaar x += 1000 238172abcf42SBram Moolenaar endif 238272abcf42SBram Moolenaar return x 238372abcf42SBram Moolenaarenddef 238472abcf42SBram Moolenaar 238572abcf42SBram Moolenaardef Test_nested_if() 238672abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 238772abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 238872abcf42SBram Moolenaarenddef 238972abcf42SBram Moolenaar 2390ad39c094SBram Moolenaardef Test_execute_cmd() 2391e4984290SBram Moolenaar # missing argument is ignored 2392e4984290SBram Moolenaar execute 2393e4984290SBram Moolenaar execute # comment 2394e4984290SBram Moolenaar 2395ad39c094SBram Moolenaar new 2396ad39c094SBram Moolenaar setline(1, 'default') 2397d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2398ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2399a72cfb80SBram Moolenaar 2400d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2401a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2402a72cfb80SBram Moolenaar 2403cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2404cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2405a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2406ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2407a72cfb80SBram Moolenaar 2408d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2409ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2410a72cfb80SBram Moolenaar 2411cfcd011fSBram Moolenaar var cmd_first = 'call ' 2412cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2413ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2414ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2415ad39c094SBram Moolenaar bwipe! 2416585fea7bSBram Moolenaar 2417cfcd011fSBram Moolenaar var n = true 24182d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 24192d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 24202d6b20d6SBram Moolenaar 2421e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2422e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2423e5abf7afSBram Moolenaar 2424d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2425d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2426d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2427ad39c094SBram Moolenaarenddef 2428ad39c094SBram Moolenaar 242947e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2430f5be8cdbSBram Moolenaar # only checks line continuation 2431cfcd011fSBram Moolenaar var lines =<< trim END 243247e880d6SBram Moolenaar vim9script 243347e880d6SBram Moolenaar execute 'g:someVar' 243447e880d6SBram Moolenaar .. ' = ' .. 243547e880d6SBram Moolenaar '28' 243647e880d6SBram Moolenaar assert_equal(28, g:someVar) 243747e880d6SBram Moolenaar unlet g:someVar 243847e880d6SBram Moolenaar END 243947e880d6SBram Moolenaar CheckScriptSuccess(lines) 244047e880d6SBram Moolenaarenddef 244147e880d6SBram Moolenaar 2442ad39c094SBram Moolenaardef Test_echo_cmd() 2443a72cfb80SBram Moolenaar echo 'some' # comment 2444585fea7bSBram Moolenaar echon 'thing' 2445ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2446ad39c094SBram Moolenaar 2447a72cfb80SBram Moolenaar echo "some" # comment 2448a72cfb80SBram Moolenaar echon "thing" 2449a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2450a72cfb80SBram Moolenaar 2451cfcd011fSBram Moolenaar var str1 = 'some' 2452cfcd011fSBram Moolenaar var str2 = 'more' 2453ad39c094SBram Moolenaar echo str1 str2 2454ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2455a72cfb80SBram Moolenaar 2456d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2457ad39c094SBram Moolenaarenddef 2458ad39c094SBram Moolenaar 2459f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2460f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2461f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2462f93c7feaSBram Moolenaar echo 'clear' 2463df069eecSBram Moolenaar :1messages 2464f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2465f93c7feaSBram Moolenaar 2466d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2467f93c7feaSBram Moolenaarenddef 2468f93c7feaSBram Moolenaar 246947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2470f5be8cdbSBram Moolenaar # only checks line continuation 2471cfcd011fSBram Moolenaar var lines =<< trim END 247247e880d6SBram Moolenaar vim9script 247347e880d6SBram Moolenaar echomsg 'here' 247447e880d6SBram Moolenaar .. ' is ' .. 247547e880d6SBram Moolenaar 'a message' 247647e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 247747e880d6SBram Moolenaar END 247847e880d6SBram Moolenaar CheckScriptSuccess(lines) 247947e880d6SBram Moolenaarenddef 248047e880d6SBram Moolenaar 2481f93c7feaSBram Moolenaardef Test_echoerr_cmd() 248240ee466cSBram Moolenaar try 248340ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 248440ee466cSBram Moolenaar catch 248540ee466cSBram Moolenaar assert_match('something wrong', v:exception) 248640ee466cSBram Moolenaar endtry 2487f93c7feaSBram Moolenaarenddef 2488f93c7feaSBram Moolenaar 248947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2490f5be8cdbSBram Moolenaar # only checks line continuation 2491cfcd011fSBram Moolenaar var lines =<< trim END 249247e880d6SBram Moolenaar vim9script 249347e880d6SBram Moolenaar try 249447e880d6SBram Moolenaar echoerr 'this' 249547e880d6SBram Moolenaar .. ' is ' .. 249647e880d6SBram Moolenaar 'wrong' 249747e880d6SBram Moolenaar catch 249847e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 249947e880d6SBram Moolenaar endtry 250047e880d6SBram Moolenaar END 250147e880d6SBram Moolenaar CheckScriptSuccess(lines) 250247e880d6SBram Moolenaarenddef 250347e880d6SBram Moolenaar 250441fe0617SBram Moolenaardef Test_for_outside_of_function() 2505cfcd011fSBram Moolenaar var lines =<< trim END 250641fe0617SBram Moolenaar vim9script 250741fe0617SBram Moolenaar new 250841fe0617SBram Moolenaar for var in range(0, 3) 250941fe0617SBram Moolenaar append(line('$'), var) 251041fe0617SBram Moolenaar endfor 251141fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 251241fe0617SBram Moolenaar bwipe! 2513522eefd9SBram Moolenaar 2514522eefd9SBram Moolenaar var result = '' 2515522eefd9SBram Moolenaar for i in [1, 2, 3] 2516522eefd9SBram Moolenaar var loop = ' loop ' .. i 2517522eefd9SBram Moolenaar result ..= loop 2518522eefd9SBram Moolenaar endfor 2519522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 252041fe0617SBram Moolenaar END 252141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 252241fe0617SBram Moolenaar source Xvim9for.vim 252341fe0617SBram Moolenaar delete('Xvim9for.vim') 252441fe0617SBram Moolenaarenddef 25258a7d6542SBram Moolenaar 2526e8c4abbbSBram Moolenaardef Test_for_loop() 2527f2253963SBram Moolenaar var lines =<< trim END 2528cfcd011fSBram Moolenaar var result = '' 2529e8c4abbbSBram Moolenaar for cnt in range(7) 2530e8c4abbbSBram Moolenaar if cnt == 4 2531e8c4abbbSBram Moolenaar break 2532e8c4abbbSBram Moolenaar endif 2533e8c4abbbSBram Moolenaar if cnt == 2 2534e8c4abbbSBram Moolenaar continue 2535e8c4abbbSBram Moolenaar endif 2536e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2537e8c4abbbSBram Moolenaar endfor 2538e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 25390ad3e894SBram Moolenaar 2540cfcd011fSBram Moolenaar var concat = '' 25410ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25420ad3e894SBram Moolenaar concat ..= str 25430ad3e894SBram Moolenaar endfor 25440ad3e894SBram Moolenaar assert_equal('onetwo', concat) 254538bd8de5SBram Moolenaar 254638bd8de5SBram Moolenaar var total = 0 254738bd8de5SBram Moolenaar for nr in 254838bd8de5SBram Moolenaar [1, 2, 3] 254938bd8de5SBram Moolenaar total += nr 255038bd8de5SBram Moolenaar endfor 255138bd8de5SBram Moolenaar assert_equal(6, total) 255238bd8de5SBram Moolenaar 255338bd8de5SBram Moolenaar total = 0 255438bd8de5SBram Moolenaar for nr 255538bd8de5SBram Moolenaar in [1, 2, 3] 255638bd8de5SBram Moolenaar total += nr 255738bd8de5SBram Moolenaar endfor 255838bd8de5SBram Moolenaar assert_equal(6, total) 255938bd8de5SBram Moolenaar 256038bd8de5SBram Moolenaar total = 0 256138bd8de5SBram Moolenaar for nr 256238bd8de5SBram Moolenaar in 256338bd8de5SBram Moolenaar [1, 2, 3] 256438bd8de5SBram Moolenaar total += nr 256538bd8de5SBram Moolenaar endfor 256638bd8de5SBram Moolenaar assert_equal(6, total) 2567036d0714SBram Moolenaar 2568a3589a0dSBram Moolenaar # with type 2569a3589a0dSBram Moolenaar total = 0 2570a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2571a3589a0dSBram Moolenaar total += n 2572a3589a0dSBram Moolenaar endfor 2573a3589a0dSBram Moolenaar assert_equal(6, total) 2574a3589a0dSBram Moolenaar 2575fe090eb5SBram Moolenaar var chars = '' 2576fe090eb5SBram Moolenaar for s: string in 'foobar' 2577fe090eb5SBram Moolenaar chars ..= s 2578fe090eb5SBram Moolenaar endfor 2579fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2580fe090eb5SBram Moolenaar 25815ede5b23SBram Moolenaar chars = '' 25825ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 25835ede5b23SBram Moolenaar chars ..= x 25845ede5b23SBram Moolenaar endfor 25855ede5b23SBram Moolenaar assert_equal('ab', chars) 25865ede5b23SBram Moolenaar 2587a3589a0dSBram Moolenaar # unpack with type 2588f2253963SBram Moolenaar var res = '' 2589a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2590a3589a0dSBram Moolenaar res ..= n .. s 2591a3589a0dSBram Moolenaar endfor 2592a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2593a3589a0dSBram Moolenaar 2594444d8783SBram Moolenaar # unpack with one var 2595444d8783SBram Moolenaar var reslist = [] 2596444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2597444d8783SBram Moolenaar reslist->add(x) 2598444d8783SBram Moolenaar endfor 2599444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2600444d8783SBram Moolenaar 2601a3589a0dSBram Moolenaar # loop over string 2602a3589a0dSBram Moolenaar res = '' 260374e54fcbSBram Moolenaar for c in 'aéc̀d' 260474e54fcbSBram Moolenaar res ..= c .. '-' 260574e54fcbSBram Moolenaar endfor 260674e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 260774e54fcbSBram Moolenaar 260874e54fcbSBram Moolenaar res = '' 260974e54fcbSBram Moolenaar for c in '' 261074e54fcbSBram Moolenaar res ..= c .. '-' 261174e54fcbSBram Moolenaar endfor 261274e54fcbSBram Moolenaar assert_equal('', res) 261374e54fcbSBram Moolenaar 261474e54fcbSBram Moolenaar res = '' 261574e54fcbSBram Moolenaar for c in test_null_string() 261674e54fcbSBram Moolenaar res ..= c .. '-' 261774e54fcbSBram Moolenaar endfor 261874e54fcbSBram Moolenaar assert_equal('', res) 2619f2253963SBram Moolenaar 2620f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2621f2253963SBram Moolenaar {a: 'Cat'} 2622f2253963SBram Moolenaar ] 2623f2253963SBram Moolenaar for dd in foo 2624f2253963SBram Moolenaar dd.counter = 12 2625f2253963SBram Moolenaar endfor 2626f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2627ad2d4969SBram Moolenaar 2628ad2d4969SBram Moolenaar reslist = [] 2629ad2d4969SBram Moolenaar for _ in range(3) 2630ad2d4969SBram Moolenaar reslist->add('x') 2631ad2d4969SBram Moolenaar endfor 2632ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2633f2253963SBram Moolenaar END 2634f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2635e8c4abbbSBram Moolenaarenddef 2636e8c4abbbSBram Moolenaar 26372eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 26382eb6fc3bSBram Moolenaar var lines =<< trim END 26392eb6fc3bSBram Moolenaar var flist: list<func> 26402eb6fc3bSBram Moolenaar for i in range(5) 26412eb6fc3bSBram Moolenaar var inloop = i 26422eb6fc3bSBram Moolenaar flist[i] = () => inloop 26432eb6fc3bSBram Moolenaar endfor 26442eb6fc3bSBram Moolenaar for i in range(5) 26452eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26462eb6fc3bSBram Moolenaar endfor 26472eb6fc3bSBram Moolenaar END 26482eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26492eb6fc3bSBram Moolenaar 26502eb6fc3bSBram Moolenaar lines =<< trim END 26512eb6fc3bSBram Moolenaar var flist: list<func> 26522eb6fc3bSBram Moolenaar for i in range(5) 26532eb6fc3bSBram Moolenaar var inloop = i 26542eb6fc3bSBram Moolenaar flist[i] = () => { 26552eb6fc3bSBram Moolenaar return inloop 26562eb6fc3bSBram Moolenaar } 26572eb6fc3bSBram Moolenaar endfor 26582eb6fc3bSBram Moolenaar for i in range(5) 26592eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26602eb6fc3bSBram Moolenaar endfor 26612eb6fc3bSBram Moolenaar END 26622eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26632eb6fc3bSBram Moolenaarenddef 26642eb6fc3bSBram Moolenaar 2665e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2666442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2667442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2668442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2669442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2670442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2671442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2672d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2673822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 26742d870f8dSBram Moolenaar delfunc! g:Func 2675675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2676675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2677675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 267874e54fcbSBram Moolenaar 267974e54fcbSBram Moolenaar # wrong type detected at compile time 268074e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 268174e54fcbSBram Moolenaar 268274e54fcbSBram Moolenaar # wrong type detected at runtime 268374e54fcbSBram Moolenaar g:adict = {a: 1} 268474e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 268574e54fcbSBram Moolenaar unlet g:adict 2686f6a8d420SBram Moolenaar 2687f6a8d420SBram Moolenaar var lines =<< trim END 2688f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2689f6a8d420SBram Moolenaar for e in d 2690f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2691f6a8d420SBram Moolenaar endfor 2692f6a8d420SBram Moolenaar END 2693f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2694fe090eb5SBram Moolenaar 2695fe090eb5SBram Moolenaar lines =<< trim END 2696fe090eb5SBram Moolenaar for nr: number in ['foo'] 2697fe090eb5SBram Moolenaar endfor 2698fe090eb5SBram Moolenaar END 2699fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2700404557e6SBram Moolenaar 2701404557e6SBram Moolenaar lines =<< trim END 2702404557e6SBram Moolenaar for n : number in [1, 2] 2703404557e6SBram Moolenaar echo n 2704404557e6SBram Moolenaar endfor 2705404557e6SBram Moolenaar END 2706404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2707efc5db52SBram Moolenaar 2708efc5db52SBram Moolenaar lines =<< trim END 2709efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2710efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2711efc5db52SBram Moolenaar echo k v 2712efc5db52SBram Moolenaar endfor 2713efc5db52SBram Moolenaar END 2714efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2715e8c4abbbSBram Moolenaarenddef 2716e8c4abbbSBram Moolenaar 2717ea87069dSBram Moolenaardef Test_for_loop_script_var() 2718ea87069dSBram Moolenaar # cannot use s:var in a :def function 2719ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2720ea87069dSBram Moolenaar 2721ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2722ea87069dSBram Moolenaar var lines =<< trim END 2723ea87069dSBram Moolenaar vim9script 2724ea87069dSBram Moolenaar var total = 0 2725ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2726ea87069dSBram Moolenaar total += s:var 2727ea87069dSBram Moolenaar endfor 2728ea87069dSBram Moolenaar assert_equal(6, total) 2729ea87069dSBram Moolenaar 2730ea87069dSBram Moolenaar total = 0 2731ea87069dSBram Moolenaar for var in [1, 2, 3] 2732ea87069dSBram Moolenaar total += var 2733ea87069dSBram Moolenaar endfor 2734ea87069dSBram Moolenaar assert_equal(6, total) 2735ea87069dSBram Moolenaar END 2736ea87069dSBram Moolenaarenddef 2737ea87069dSBram Moolenaar 2738792f786aSBram Moolenaardef Test_for_loop_unpack() 27394b8a0651SBram Moolenaar var lines =<< trim END 2740792f786aSBram Moolenaar var result = [] 2741792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2742792f786aSBram Moolenaar result->add(v1) 2743792f786aSBram Moolenaar result->add(v2) 2744792f786aSBram Moolenaar endfor 2745792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2746792f786aSBram Moolenaar 2747792f786aSBram Moolenaar result = [] 2748792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2749792f786aSBram Moolenaar result->add(v1) 2750792f786aSBram Moolenaar result->add(v2) 2751792f786aSBram Moolenaar result->add(v3) 2752792f786aSBram Moolenaar endfor 2753792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2754792f786aSBram Moolenaar 27554b8a0651SBram Moolenaar result = [] 27564b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 27574b8a0651SBram Moolenaar result->add(&ts) 27584b8a0651SBram Moolenaar result->add(&sw) 27594b8a0651SBram Moolenaar endfor 27604b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 27614b8a0651SBram Moolenaar 27624b8a0651SBram Moolenaar var slist: list<string> 27634b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 27644b8a0651SBram Moolenaar slist->add($LOOPVAR) 27654b8a0651SBram Moolenaar slist->add(@r) 27664b8a0651SBram Moolenaar slist->add(v:errmsg) 27674b8a0651SBram Moolenaar endfor 27684b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 27694b8a0651SBram Moolenaar 27704b8a0651SBram Moolenaar slist = [] 27714b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 27724b8a0651SBram Moolenaar slist->add(g:globalvar) 27734b8a0651SBram Moolenaar slist->add(b:bufvar) 27744b8a0651SBram Moolenaar slist->add(w:winvar) 27754b8a0651SBram Moolenaar slist->add(t:tabvar) 27764b8a0651SBram Moolenaar endfor 27774b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2778f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2779b777da9bSBram Moolenaar 2780b777da9bSBram Moolenaar var res = [] 2781b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2782b777da9bSBram Moolenaar res->add(n) 2783b777da9bSBram Moolenaar endfor 2784b777da9bSBram Moolenaar assert_equal([2, 5], res) 27854b8a0651SBram Moolenaar END 27864b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 27874b8a0651SBram Moolenaar 27884b8a0651SBram Moolenaar lines =<< trim END 2789792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2790792f786aSBram Moolenaar echo v1 v2 2791792f786aSBram Moolenaar endfor 2792792f786aSBram Moolenaar END 2793792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2794792f786aSBram Moolenaar 2795792f786aSBram Moolenaar lines =<< trim END 2796792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2797792f786aSBram Moolenaar echo v1 v2 2798792f786aSBram Moolenaar endfor 2799792f786aSBram Moolenaar END 2800792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2801792f786aSBram Moolenaar 2802792f786aSBram Moolenaar lines =<< trim END 2803792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2804792f786aSBram Moolenaar echo v1 2805792f786aSBram Moolenaar endfor 2806792f786aSBram Moolenaar END 2807792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2808792f786aSBram Moolenaarenddef 2809792f786aSBram Moolenaar 2810c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2811f2253963SBram Moolenaar var lines =<< trim END 2812c150c09eSBram Moolenaar var looped = 0 2813c150c09eSBram Moolenaar var cleanup = 0 2814c150c09eSBram Moolenaar for i in range(3) 2815c150c09eSBram Moolenaar looped += 1 2816c150c09eSBram Moolenaar try 2817c150c09eSBram Moolenaar eval [][0] 2818c150c09eSBram Moolenaar catch 2819c150c09eSBram Moolenaar continue 2820c150c09eSBram Moolenaar finally 2821c150c09eSBram Moolenaar cleanup += 1 2822c150c09eSBram Moolenaar endtry 2823c150c09eSBram Moolenaar endfor 2824c150c09eSBram Moolenaar assert_equal(3, looped) 2825c150c09eSBram Moolenaar assert_equal(3, cleanup) 2826f2253963SBram Moolenaar END 2827f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2828c150c09eSBram Moolenaarenddef 2829c150c09eSBram Moolenaar 2830d0df1aacSBram Moolenaardef Test_while_loop() 2831cfcd011fSBram Moolenaar var result = '' 2832cfcd011fSBram Moolenaar var cnt = 0 2833d0df1aacSBram Moolenaar while cnt < 555 2834d0df1aacSBram Moolenaar if cnt == 3 2835d0df1aacSBram Moolenaar break 2836d0df1aacSBram Moolenaar endif 2837d0df1aacSBram Moolenaar cnt += 1 2838d0df1aacSBram Moolenaar if cnt == 2 2839d0df1aacSBram Moolenaar continue 2840d0df1aacSBram Moolenaar endif 2841d0df1aacSBram Moolenaar result ..= cnt .. '_' 2842d0df1aacSBram Moolenaar endwhile 2843d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2844dee37dc7SBram Moolenaar 2845dee37dc7SBram Moolenaar var s = '' 28460123cc1eSBram Moolenaar while s == 'x' # {comment} 2847dee37dc7SBram Moolenaar endwhile 2848d0df1aacSBram Moolenaarenddef 2849d0df1aacSBram Moolenaar 2850e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2851675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2852675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2853675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2854675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2855675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2856675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2857675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 28586628b7ebSBram Moolenaar 28596628b7ebSBram Moolenaar var lines =<< trim END 28606628b7ebSBram Moolenaar var s = '' 28616628b7ebSBram Moolenaar while s = '' 28626628b7ebSBram Moolenaar endwhile 28636628b7ebSBram Moolenaar END 28646628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2865bd5da371SBram Moolenaarenddef 2866bd5da371SBram Moolenaar 28679645e2d9SBram Moolenaardef Test_interrupt_loop() 2868cfcd011fSBram Moolenaar var caught = false 2869cfcd011fSBram Moolenaar var x = 0 287097acfc78SBram Moolenaar try 28719645e2d9SBram Moolenaar while 1 28729645e2d9SBram Moolenaar x += 1 28739645e2d9SBram Moolenaar if x == 100 28749645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 28759645e2d9SBram Moolenaar endif 28769645e2d9SBram Moolenaar endwhile 287797acfc78SBram Moolenaar catch 287897acfc78SBram Moolenaar caught = true 287997acfc78SBram Moolenaar assert_equal(100, x) 288097acfc78SBram Moolenaar endtry 288197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 288225859dd7SBram Moolenaar # consume the CTRL-C 288325859dd7SBram Moolenaar getchar(0) 28849645e2d9SBram Moolenaarenddef 288520431c9dSBram Moolenaar 28864fdae999SBram Moolenaardef Test_automatic_line_continuation() 2887cfcd011fSBram Moolenaar var mylist = [ 28884fdae999SBram Moolenaar 'one', 28894fdae999SBram Moolenaar 'two', 28904fdae999SBram Moolenaar 'three', 2891f5be8cdbSBram Moolenaar ] # comment 28924fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 28934fdae999SBram Moolenaar 2894cfcd011fSBram Moolenaar var mydict = { 2895e0de171eSBram Moolenaar ['one']: 1, 2896e0de171eSBram Moolenaar ['two']: 2, 2897e0de171eSBram Moolenaar ['three']: 28984fdae999SBram Moolenaar 3, 2899f5be8cdbSBram Moolenaar } # comment 2900e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2901e0de171eSBram Moolenaar mydict = { 29022c330432SBram Moolenaar one: 1, # comment 29032c330432SBram Moolenaar two: # comment 29042c330432SBram Moolenaar 2, # comment 29052c330432SBram Moolenaar three: 3 # comment 29062c330432SBram Moolenaar } 2907e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2908e0de171eSBram Moolenaar mydict = { 29092c330432SBram Moolenaar one: 1, 29104fdae999SBram Moolenaar two: 29114fdae999SBram Moolenaar 2, 29122c330432SBram Moolenaar three: 3 29134fdae999SBram Moolenaar } 2914e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2915e6085c53SBram Moolenaar 2916e6085c53SBram Moolenaar assert_equal( 2917e6085c53SBram Moolenaar ['one', 'two', 'three'], 2918e6085c53SBram Moolenaar split('one two three') 2919e6085c53SBram Moolenaar ) 29204fdae999SBram Moolenaarenddef 29214fdae999SBram Moolenaar 29227a092245SBram Moolenaardef Test_vim9_comment() 29237a092245SBram Moolenaar CheckScriptSuccess([ 29247a092245SBram Moolenaar 'vim9script', 29257a092245SBram Moolenaar '# something', 292693f82cbeSBram Moolenaar '#something', 292793f82cbeSBram Moolenaar '#{something', 29287a092245SBram Moolenaar ]) 292993f82cbeSBram Moolenaar 293093f82cbeSBram Moolenaar split Xfile 293193f82cbeSBram Moolenaar CheckScriptSuccess([ 293293f82cbeSBram Moolenaar 'vim9script', 293393f82cbeSBram Moolenaar 'edit #something', 293493f82cbeSBram Moolenaar ]) 293593f82cbeSBram Moolenaar CheckScriptSuccess([ 293693f82cbeSBram Moolenaar 'vim9script', 293793f82cbeSBram Moolenaar 'edit #{something', 293893f82cbeSBram Moolenaar ]) 293993f82cbeSBram Moolenaar close 294093f82cbeSBram Moolenaar 29417a092245SBram Moolenaar CheckScriptFailure([ 29427a092245SBram Moolenaar 'vim9script', 29437a092245SBram Moolenaar ':# something', 29447a092245SBram Moolenaar ], 'E488:') 29457a092245SBram Moolenaar CheckScriptFailure([ 29467a092245SBram Moolenaar '# something', 29477a092245SBram Moolenaar ], 'E488:') 29487a092245SBram Moolenaar CheckScriptFailure([ 29497a092245SBram Moolenaar ':# something', 29507a092245SBram Moolenaar ], 'E488:') 29517a092245SBram Moolenaar 29524a8d9f2eSBram Moolenaar { # block start 29534a8d9f2eSBram Moolenaar } # block end 29544a8d9f2eSBram Moolenaar CheckDefFailure([ 29554a8d9f2eSBram Moolenaar '{# comment', 29564a8d9f2eSBram Moolenaar ], 'E488:') 29574a8d9f2eSBram Moolenaar CheckDefFailure([ 29584a8d9f2eSBram Moolenaar '{', 29594a8d9f2eSBram Moolenaar '}# comment', 29604a8d9f2eSBram Moolenaar ], 'E488:') 29614a8d9f2eSBram Moolenaar 29624a8d9f2eSBram Moolenaar echo "yes" # comment 29634a8d9f2eSBram Moolenaar CheckDefFailure([ 29644a8d9f2eSBram Moolenaar 'echo "yes"# comment', 29654a8d9f2eSBram Moolenaar ], 'E488:') 29667a092245SBram Moolenaar CheckScriptSuccess([ 29677a092245SBram Moolenaar 'vim9script', 29687a092245SBram Moolenaar 'echo "yes" # something', 29697a092245SBram Moolenaar ]) 29707a092245SBram Moolenaar CheckScriptFailure([ 29717a092245SBram Moolenaar 'vim9script', 29727a092245SBram Moolenaar 'echo "yes"# something', 29737a092245SBram Moolenaar ], 'E121:') 29747a092245SBram Moolenaar CheckScriptFailure([ 29757a092245SBram Moolenaar 'vim9script', 29767a092245SBram Moolenaar 'echo# something', 2977f8103f27SBram Moolenaar ], 'E1144:') 29787a092245SBram Moolenaar CheckScriptFailure([ 29797a092245SBram Moolenaar 'echo "yes" # something', 29807a092245SBram Moolenaar ], 'E121:') 29817a092245SBram Moolenaar 29824a8d9f2eSBram Moolenaar exe "echo" # comment 29834a8d9f2eSBram Moolenaar CheckDefFailure([ 29844a8d9f2eSBram Moolenaar 'exe "echo"# comment', 29854a8d9f2eSBram Moolenaar ], 'E488:') 29864a8d9f2eSBram Moolenaar CheckScriptSuccess([ 29874a8d9f2eSBram Moolenaar 'vim9script', 29884a8d9f2eSBram Moolenaar 'exe "echo" # something', 29894a8d9f2eSBram Moolenaar ]) 29904a8d9f2eSBram Moolenaar CheckScriptFailure([ 29914a8d9f2eSBram Moolenaar 'vim9script', 29924a8d9f2eSBram Moolenaar 'exe "echo"# something', 29934a8d9f2eSBram Moolenaar ], 'E121:') 29944a8d9f2eSBram Moolenaar CheckScriptFailure([ 29954a8d9f2eSBram Moolenaar 'vim9script', 29964a8d9f2eSBram Moolenaar 'exe# something', 2997f8103f27SBram Moolenaar ], 'E1144:') 29984a8d9f2eSBram Moolenaar CheckScriptFailure([ 29994a8d9f2eSBram Moolenaar 'exe "echo" # something', 30004a8d9f2eSBram Moolenaar ], 'E121:') 30014a8d9f2eSBram Moolenaar 30027a092245SBram Moolenaar CheckDefFailure([ 30037a092245SBram Moolenaar 'try# comment', 30047a092245SBram Moolenaar ' echo "yes"', 30057a092245SBram Moolenaar 'catch', 30067a092245SBram Moolenaar 'endtry', 3007f8103f27SBram Moolenaar ], 'E1144:') 30082c5ed4e3SBram Moolenaar CheckScriptFailure([ 30092c5ed4e3SBram Moolenaar 'vim9script', 30102c5ed4e3SBram Moolenaar 'try# comment', 30112c5ed4e3SBram Moolenaar 'echo "yes"', 3012f8103f27SBram Moolenaar ], 'E1144:') 30137a092245SBram Moolenaar CheckDefFailure([ 30147a092245SBram Moolenaar 'try', 3015a72cfb80SBram Moolenaar ' throw#comment', 3016a72cfb80SBram Moolenaar 'catch', 3017a72cfb80SBram Moolenaar 'endtry', 3018f8103f27SBram Moolenaar ], 'E1144:') 3019a72cfb80SBram Moolenaar CheckDefFailure([ 3020a72cfb80SBram Moolenaar 'try', 3021a72cfb80SBram Moolenaar ' throw "yes"#comment', 3022a72cfb80SBram Moolenaar 'catch', 3023a72cfb80SBram Moolenaar 'endtry', 3024a72cfb80SBram Moolenaar ], 'E488:') 3025a72cfb80SBram Moolenaar CheckDefFailure([ 3026a72cfb80SBram Moolenaar 'try', 30277a092245SBram Moolenaar ' echo "yes"', 30287a092245SBram Moolenaar 'catch# comment', 30297a092245SBram Moolenaar 'endtry', 3030f8103f27SBram Moolenaar ], 'E1144:') 30312c5ed4e3SBram Moolenaar CheckScriptFailure([ 30322c5ed4e3SBram Moolenaar 'vim9script', 30332c5ed4e3SBram Moolenaar 'try', 30342c5ed4e3SBram Moolenaar ' echo "yes"', 30352c5ed4e3SBram Moolenaar 'catch# comment', 30362c5ed4e3SBram Moolenaar 'endtry', 3037f8103f27SBram Moolenaar ], 'E1144:') 30382c5ed4e3SBram Moolenaar CheckDefFailure([ 30392c5ed4e3SBram Moolenaar 'try', 30402c5ed4e3SBram Moolenaar ' echo "yes"', 30412c5ed4e3SBram Moolenaar 'catch /pat/# comment', 30422c5ed4e3SBram Moolenaar 'endtry', 30432c5ed4e3SBram Moolenaar ], 'E488:') 30447a092245SBram Moolenaar CheckDefFailure([ 30457a092245SBram Moolenaar 'try', 30467a092245SBram Moolenaar 'echo "yes"', 30477a092245SBram Moolenaar 'catch', 30487a092245SBram Moolenaar 'endtry# comment', 3049f8103f27SBram Moolenaar ], 'E1144:') 30502c5ed4e3SBram Moolenaar CheckScriptFailure([ 30512c5ed4e3SBram Moolenaar 'vim9script', 30522c5ed4e3SBram Moolenaar 'try', 30532c5ed4e3SBram Moolenaar ' echo "yes"', 30542c5ed4e3SBram Moolenaar 'catch', 30552c5ed4e3SBram Moolenaar 'endtry# comment', 3056f8103f27SBram Moolenaar ], 'E1144:') 30572c5ed4e3SBram Moolenaar 30582c5ed4e3SBram Moolenaar CheckScriptSuccess([ 30592c5ed4e3SBram Moolenaar 'vim9script', 30602c5ed4e3SBram Moolenaar 'hi # comment', 30612c5ed4e3SBram Moolenaar ]) 30622c5ed4e3SBram Moolenaar CheckScriptFailure([ 30632c5ed4e3SBram Moolenaar 'vim9script', 30642c5ed4e3SBram Moolenaar 'hi# comment', 3065f8103f27SBram Moolenaar ], 'E1144:') 30661966c248SBram Moolenaar CheckScriptSuccess([ 30671966c248SBram Moolenaar 'vim9script', 30681966c248SBram Moolenaar 'hi Search # comment', 30691966c248SBram Moolenaar ]) 30701966c248SBram Moolenaar CheckScriptFailure([ 30711966c248SBram Moolenaar 'vim9script', 30721966c248SBram Moolenaar 'hi Search# comment', 30731966c248SBram Moolenaar ], 'E416:') 30741966c248SBram Moolenaar CheckScriptSuccess([ 30751966c248SBram Moolenaar 'vim9script', 30761966c248SBram Moolenaar 'hi link This Search # comment', 30771966c248SBram Moolenaar ]) 30781966c248SBram Moolenaar CheckScriptFailure([ 30791966c248SBram Moolenaar 'vim9script', 30801966c248SBram Moolenaar 'hi link This That# comment', 30811966c248SBram Moolenaar ], 'E413:') 30821966c248SBram Moolenaar CheckScriptSuccess([ 30831966c248SBram Moolenaar 'vim9script', 30841966c248SBram Moolenaar 'hi clear This # comment', 30851966c248SBram Moolenaar 'hi clear # comment', 30861966c248SBram Moolenaar ]) 3087f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3088f5be8cdbSBram Moolenaar # hi clear This# comment', 30891966c248SBram Moolenaar CheckScriptFailure([ 30901966c248SBram Moolenaar 'vim9script', 30911966c248SBram Moolenaar 'hi clear# comment', 30921966c248SBram Moolenaar ], 'E416:') 30931966c248SBram Moolenaar 30941966c248SBram Moolenaar CheckScriptSuccess([ 30951966c248SBram Moolenaar 'vim9script', 30961966c248SBram Moolenaar 'hi Group term=bold', 30971966c248SBram Moolenaar 'match Group /todo/ # comment', 30981966c248SBram Moolenaar ]) 30991966c248SBram Moolenaar CheckScriptFailure([ 31001966c248SBram Moolenaar 'vim9script', 31011966c248SBram Moolenaar 'hi Group term=bold', 31021966c248SBram Moolenaar 'match Group /todo/# comment', 31031966c248SBram Moolenaar ], 'E488:') 31041966c248SBram Moolenaar CheckScriptSuccess([ 31051966c248SBram Moolenaar 'vim9script', 31061966c248SBram Moolenaar 'match # comment', 31071966c248SBram Moolenaar ]) 31081966c248SBram Moolenaar CheckScriptFailure([ 31091966c248SBram Moolenaar 'vim9script', 31101966c248SBram Moolenaar 'match# comment', 3111f8103f27SBram Moolenaar ], 'E1144:') 31121966c248SBram Moolenaar CheckScriptSuccess([ 31131966c248SBram Moolenaar 'vim9script', 31141966c248SBram Moolenaar 'match none # comment', 31151966c248SBram Moolenaar ]) 31161966c248SBram Moolenaar CheckScriptFailure([ 31171966c248SBram Moolenaar 'vim9script', 31181966c248SBram Moolenaar 'match none# comment', 31191966c248SBram Moolenaar ], 'E475:') 31201966c248SBram Moolenaar 31211966c248SBram Moolenaar CheckScriptSuccess([ 31221966c248SBram Moolenaar 'vim9script', 31231966c248SBram Moolenaar 'menutrans clear # comment', 31241966c248SBram Moolenaar ]) 31251966c248SBram Moolenaar CheckScriptFailure([ 31261966c248SBram Moolenaar 'vim9script', 31271966c248SBram Moolenaar 'menutrans clear# comment text', 31281966c248SBram Moolenaar ], 'E474:') 31291966c248SBram Moolenaar 31301966c248SBram Moolenaar CheckScriptSuccess([ 31311966c248SBram Moolenaar 'vim9script', 31321966c248SBram Moolenaar 'syntax clear # comment', 31331966c248SBram Moolenaar ]) 31341966c248SBram Moolenaar CheckScriptFailure([ 31351966c248SBram Moolenaar 'vim9script', 31361966c248SBram Moolenaar 'syntax clear# comment text', 31371966c248SBram Moolenaar ], 'E28:') 31381966c248SBram Moolenaar CheckScriptSuccess([ 31391966c248SBram Moolenaar 'vim9script', 31401966c248SBram Moolenaar 'syntax keyword Word some', 31411966c248SBram Moolenaar 'syntax clear Word # comment', 31421966c248SBram Moolenaar ]) 31431966c248SBram Moolenaar CheckScriptFailure([ 31441966c248SBram Moolenaar 'vim9script', 31451966c248SBram Moolenaar 'syntax keyword Word some', 31461966c248SBram Moolenaar 'syntax clear Word# comment text', 31471966c248SBram Moolenaar ], 'E28:') 31481966c248SBram Moolenaar 31491966c248SBram Moolenaar CheckScriptSuccess([ 31501966c248SBram Moolenaar 'vim9script', 31511966c248SBram Moolenaar 'syntax list # comment', 31521966c248SBram Moolenaar ]) 31531966c248SBram Moolenaar CheckScriptFailure([ 31541966c248SBram Moolenaar 'vim9script', 31551966c248SBram Moolenaar 'syntax list# comment text', 31561966c248SBram Moolenaar ], 'E28:') 31571966c248SBram Moolenaar 31581966c248SBram Moolenaar CheckScriptSuccess([ 31591966c248SBram Moolenaar 'vim9script', 31601966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 31611966c248SBram Moolenaar ]) 31621966c248SBram Moolenaar CheckScriptFailure([ 31631966c248SBram Moolenaar 'vim9script', 31641966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 31651966c248SBram Moolenaar ], 'E475:') 31661966c248SBram Moolenaar 31671966c248SBram Moolenaar CheckScriptSuccess([ 31681966c248SBram Moolenaar 'vim9script', 31691966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 31701966c248SBram Moolenaar ]) 31711966c248SBram Moolenaar CheckScriptFailure([ 31721966c248SBram Moolenaar 'vim9script', 31731966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 31741966c248SBram Moolenaar ], 'E789:') 31751966c248SBram Moolenaar 31761966c248SBram Moolenaar CheckScriptSuccess([ 31771966c248SBram Moolenaar 'vim9script', 31781966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 31791966c248SBram Moolenaar ]) 31801966c248SBram Moolenaar CheckScriptFailure([ 31811966c248SBram Moolenaar 'vim9script', 31821966c248SBram Moolenaar 'syntax match Word /pat/# comment', 31831966c248SBram Moolenaar ], 'E402:') 31841966c248SBram Moolenaar 31851966c248SBram Moolenaar CheckScriptSuccess([ 31861966c248SBram Moolenaar 'vim9script', 31871966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 31881966c248SBram Moolenaar ]) 31891966c248SBram Moolenaar CheckScriptFailure([ 31901966c248SBram Moolenaar 'vim9script', 31911966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 31921966c248SBram Moolenaar ], 'E475:') 31931966c248SBram Moolenaar CheckScriptFailure([ 31941966c248SBram Moolenaar 'vim9script', 31951966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 31961966c248SBram Moolenaar ], 'E406:') 31971966c248SBram Moolenaar CheckScriptFailure([ 31981966c248SBram Moolenaar 'vim9script', 31991966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 32001966c248SBram Moolenaar ], 'E475:') 32011966c248SBram Moolenaar 32021966c248SBram Moolenaar CheckScriptSuccess([ 32031966c248SBram Moolenaar 'vim9script', 32041966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 32051966c248SBram Moolenaar ]) 32061966c248SBram Moolenaar CheckScriptFailure([ 32071966c248SBram Moolenaar 'vim9script', 32081966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3209d032f34aSBram Moolenaar ], 'E402:') 32101966c248SBram Moolenaar 32111966c248SBram Moolenaar CheckScriptSuccess([ 32121966c248SBram Moolenaar 'vim9script', 32131966c248SBram Moolenaar 'syntax sync # comment', 32141966c248SBram Moolenaar ]) 32151966c248SBram Moolenaar CheckScriptFailure([ 32161966c248SBram Moolenaar 'vim9script', 32171966c248SBram Moolenaar 'syntax sync# comment', 32181966c248SBram Moolenaar ], 'E404:') 32191966c248SBram Moolenaar CheckScriptSuccess([ 32201966c248SBram Moolenaar 'vim9script', 32211966c248SBram Moolenaar 'syntax sync ccomment # comment', 32221966c248SBram Moolenaar ]) 32231966c248SBram Moolenaar CheckScriptFailure([ 32241966c248SBram Moolenaar 'vim9script', 32251966c248SBram Moolenaar 'syntax sync ccomment# comment', 32261966c248SBram Moolenaar ], 'E404:') 32271966c248SBram Moolenaar 32281966c248SBram Moolenaar CheckScriptSuccess([ 32291966c248SBram Moolenaar 'vim9script', 32301966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 32311966c248SBram Moolenaar ]) 32321966c248SBram Moolenaar CheckScriptFailure([ 32331966c248SBram Moolenaar 'vim9script', 32341966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 32351966c248SBram Moolenaar ], 'E475:') 3236a72cfb80SBram Moolenaar 3237a72cfb80SBram Moolenaar CheckScriptSuccess([ 3238a72cfb80SBram Moolenaar 'vim9script', 3239a72cfb80SBram Moolenaar 'command Echo echo # comment', 3240a72cfb80SBram Moolenaar 'command Echo # comment', 32412d870f8dSBram Moolenaar 'delcommand Echo', 3242a72cfb80SBram Moolenaar ]) 3243a72cfb80SBram Moolenaar CheckScriptFailure([ 3244a72cfb80SBram Moolenaar 'vim9script', 3245a72cfb80SBram Moolenaar 'command Echo echo# comment', 3246a72cfb80SBram Moolenaar 'Echo', 3247f8103f27SBram Moolenaar ], 'E1144:') 32482d870f8dSBram Moolenaar delcommand Echo 324970249ee8SBram Moolenaar 325070249ee8SBram Moolenaar var curdir = getcwd() 325170249ee8SBram Moolenaar CheckScriptSuccess([ 325270249ee8SBram Moolenaar 'command Echo cd " comment', 325370249ee8SBram Moolenaar 'Echo', 325470249ee8SBram Moolenaar 'delcommand Echo', 325570249ee8SBram Moolenaar ]) 325670249ee8SBram Moolenaar CheckScriptSuccess([ 3257090728adSBram Moolenaar 'vim9script', 325870249ee8SBram Moolenaar 'command Echo cd # comment', 325970249ee8SBram Moolenaar 'Echo', 326070249ee8SBram Moolenaar 'delcommand Echo', 326170249ee8SBram Moolenaar ]) 326270249ee8SBram Moolenaar CheckScriptFailure([ 326370249ee8SBram Moolenaar 'vim9script', 326470249ee8SBram Moolenaar 'command Echo cd " comment', 326570249ee8SBram Moolenaar 'Echo', 326670249ee8SBram Moolenaar ], 'E344:') 326770249ee8SBram Moolenaar delcommand Echo 326870249ee8SBram Moolenaar chdir(curdir) 326970249ee8SBram Moolenaar 3270a72cfb80SBram Moolenaar CheckScriptFailure([ 3271a72cfb80SBram Moolenaar 'vim9script', 3272a72cfb80SBram Moolenaar 'command Echo# comment', 3273a72cfb80SBram Moolenaar ], 'E182:') 3274a72cfb80SBram Moolenaar CheckScriptFailure([ 3275a72cfb80SBram Moolenaar 'vim9script', 3276a72cfb80SBram Moolenaar 'command Echo echo', 3277a72cfb80SBram Moolenaar 'command Echo# comment', 3278a72cfb80SBram Moolenaar ], 'E182:') 32792d870f8dSBram Moolenaar delcommand Echo 3280a72cfb80SBram Moolenaar 3281a72cfb80SBram Moolenaar CheckScriptSuccess([ 3282a72cfb80SBram Moolenaar 'vim9script', 3283a72cfb80SBram Moolenaar 'function # comment', 3284a72cfb80SBram Moolenaar ]) 3285a72cfb80SBram Moolenaar CheckScriptFailure([ 3286a72cfb80SBram Moolenaar 'vim9script', 32879898107fSBram Moolenaar 'function " comment', 32889898107fSBram Moolenaar ], 'E129:') 32899898107fSBram Moolenaar CheckScriptFailure([ 32909898107fSBram Moolenaar 'vim9script', 3291a72cfb80SBram Moolenaar 'function# comment', 3292f8103f27SBram Moolenaar ], 'E1144:') 3293a72cfb80SBram Moolenaar CheckScriptSuccess([ 3294a72cfb80SBram Moolenaar 'vim9script', 3295a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3296a72cfb80SBram Moolenaar ]) 3297a72cfb80SBram Moolenaar CheckScriptFailure([ 3298a72cfb80SBram Moolenaar 'vim9script', 3299a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3300a72cfb80SBram Moolenaar ], 'E488:') 3301a72cfb80SBram Moolenaar 3302a72cfb80SBram Moolenaar CheckScriptSuccess([ 3303a72cfb80SBram Moolenaar 'vim9script', 33044c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3305a72cfb80SBram Moolenaar 'endfunc', 33064c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3307a72cfb80SBram Moolenaar ]) 3308a72cfb80SBram Moolenaar CheckScriptFailure([ 3309a72cfb80SBram Moolenaar 'vim9script', 33104c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3311a72cfb80SBram Moolenaar 'endfunc', 33124c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3313a72cfb80SBram Moolenaar ], 'E488:') 3314a72cfb80SBram Moolenaar 3315a72cfb80SBram Moolenaar CheckScriptSuccess([ 3316a72cfb80SBram Moolenaar 'vim9script', 3317a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3318a72cfb80SBram Moolenaar ]) 3319a72cfb80SBram Moolenaar CheckScriptFailure([ 3320a72cfb80SBram Moolenaar 'vim9script', 3321a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3322a72cfb80SBram Moolenaar ], 'E488:') 3323e7e4838fSBram Moolenaar 3324e7e4838fSBram Moolenaar CheckScriptFailure([ 3325e7e4838fSBram Moolenaar 'def Test() " comment', 3326e7e4838fSBram Moolenaar 'enddef', 3327e7e4838fSBram Moolenaar ], 'E488:') 3328e7e4838fSBram Moolenaar CheckScriptFailure([ 3329e7e4838fSBram Moolenaar 'vim9script', 3330e7e4838fSBram Moolenaar 'def Test() " comment', 3331e7e4838fSBram Moolenaar 'enddef', 3332e7e4838fSBram Moolenaar ], 'E488:') 3333e7e4838fSBram Moolenaar 3334e7e4838fSBram Moolenaar CheckScriptSuccess([ 3335e7e4838fSBram Moolenaar 'func Test() " comment', 3336e7e4838fSBram Moolenaar 'endfunc', 33372d870f8dSBram Moolenaar 'delfunc Test', 3338e7e4838fSBram Moolenaar ]) 33399898107fSBram Moolenaar CheckScriptSuccess([ 3340e7e4838fSBram Moolenaar 'vim9script', 3341e7e4838fSBram Moolenaar 'func Test() " comment', 3342e7e4838fSBram Moolenaar 'endfunc', 33439898107fSBram Moolenaar ]) 3344e7e4838fSBram Moolenaar 3345e7e4838fSBram Moolenaar CheckScriptSuccess([ 3346e7e4838fSBram Moolenaar 'def Test() # comment', 3347e7e4838fSBram Moolenaar 'enddef', 3348e7e4838fSBram Moolenaar ]) 3349e7e4838fSBram Moolenaar CheckScriptFailure([ 3350e7e4838fSBram Moolenaar 'func Test() # comment', 3351e7e4838fSBram Moolenaar 'endfunc', 3352e7e4838fSBram Moolenaar ], 'E488:') 33530f37e356SBram Moolenaar 33540f37e356SBram Moolenaar var lines =<< trim END 33550f37e356SBram Moolenaar vim9script 33560f37e356SBram Moolenaar syn region Text 33570f37e356SBram Moolenaar \ start='foo' 33580f37e356SBram Moolenaar #\ comment 33590f37e356SBram Moolenaar \ end='bar' 33605072b47aSBram Moolenaar syn region Text start='foo' 33615072b47aSBram Moolenaar #\ comment 33625072b47aSBram Moolenaar \ end='bar' 33630f37e356SBram Moolenaar END 33640f37e356SBram Moolenaar CheckScriptSuccess(lines) 33650f37e356SBram Moolenaar 33660f37e356SBram Moolenaar lines =<< trim END 33670f37e356SBram Moolenaar vim9script 33680f37e356SBram Moolenaar syn region Text 33690f37e356SBram Moolenaar \ start='foo' 33700f37e356SBram Moolenaar "\ comment 33710f37e356SBram Moolenaar \ end='bar' 33720f37e356SBram Moolenaar END 33730f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 33742c5ed4e3SBram Moolenaarenddef 33752c5ed4e3SBram Moolenaar 33762c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 33772c5ed4e3SBram Moolenaar CheckCanRunGui 33782c5ed4e3SBram Moolenaar 33792c5ed4e3SBram Moolenaar CheckScriptFailure([ 33802c5ed4e3SBram Moolenaar 'vim9script', 33812c5ed4e3SBram Moolenaar 'gui#comment' 3382f8103f27SBram Moolenaar ], 'E1144:') 33832c5ed4e3SBram Moolenaar CheckScriptFailure([ 33842c5ed4e3SBram Moolenaar 'vim9script', 33852c5ed4e3SBram Moolenaar 'gui -f#comment' 33862c5ed4e3SBram Moolenaar ], 'E499:') 33877a092245SBram Moolenaarenddef 33887a092245SBram Moolenaar 3389a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 33906797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 33916797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3392a26b9700SBram Moolenaar 3393a26b9700SBram Moolenaar edit test.vim 3394a26b9700SBram Moolenaar doautocmd TabEnter #comment 3395a26b9700SBram Moolenaar assert_equal(1, g:entered) 3396a26b9700SBram Moolenaar 3397a26b9700SBram Moolenaar doautocmd TabEnter f.x 3398a26b9700SBram Moolenaar assert_equal(2, g:entered) 3399a26b9700SBram Moolenaar 3400a26b9700SBram Moolenaar g:entered = 0 3401a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3402a26b9700SBram Moolenaar assert_equal(2, g:entered) 3403a26b9700SBram Moolenaar 3404a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3405a26b9700SBram Moolenaar 3406a26b9700SBram Moolenaar au! TabEnter 3407a26b9700SBram Moolenaar unlet g:entered 3408d72c1bf0SBram Moolenaar 3409d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3410d72c1bf0SBram Moolenaar 'vim9script', 34116797966dSBram Moolenaar 'g:var = 123', 3412e55b1c09SBram Moolenaar 'b:var = 456', 3413e55b1c09SBram Moolenaar 'w:var = 777', 3414e55b1c09SBram Moolenaar 't:var = 888', 3415d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3416d72c1bf0SBram Moolenaar ]) 3417d72c1bf0SBram Moolenaar 3418d72c1bf0SBram Moolenaar CheckScriptFailure([ 3419d72c1bf0SBram Moolenaar 'vim9script', 3420cfcd011fSBram Moolenaar 'let var = 123', 3421cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3422cfcd011fSBram Moolenaar 3423cfcd011fSBram Moolenaar CheckScriptFailure([ 3424cfcd011fSBram Moolenaar 'vim9script', 3425cfcd011fSBram Moolenaar 'var g:var = 123', 3426e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3427e55b1c09SBram Moolenaar 3428e55b1c09SBram Moolenaar CheckScriptFailure([ 3429e55b1c09SBram Moolenaar 'vim9script', 3430cfcd011fSBram Moolenaar 'var b:var = 123', 3431e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3432e55b1c09SBram Moolenaar 3433e55b1c09SBram Moolenaar CheckScriptFailure([ 3434e55b1c09SBram Moolenaar 'vim9script', 3435cfcd011fSBram Moolenaar 'var w:var = 123', 3436e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3437e55b1c09SBram Moolenaar 3438e55b1c09SBram Moolenaar CheckScriptFailure([ 3439e55b1c09SBram Moolenaar 'vim9script', 3440cfcd011fSBram Moolenaar 'var t:var = 123', 3441e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3442e55b1c09SBram Moolenaar 3443e55b1c09SBram Moolenaar CheckScriptFailure([ 3444e55b1c09SBram Moolenaar 'vim9script', 3445cfcd011fSBram Moolenaar 'var v:version = 123', 3446e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3447e55b1c09SBram Moolenaar 3448e55b1c09SBram Moolenaar CheckScriptFailure([ 3449e55b1c09SBram Moolenaar 'vim9script', 3450cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3451e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 34526797966dSBram Moolenaar 34536797966dSBram Moolenaar CheckScriptFailure([ 34546797966dSBram Moolenaar 'vim9script', 34556797966dSBram Moolenaar 'g:var = 123', 345632e35117SBram Moolenaar 'unlet g:var# comment1', 3457d72c1bf0SBram Moolenaar ], 'E108:') 3458d72c1bf0SBram Moolenaar 3459d72c1bf0SBram Moolenaar CheckScriptFailure([ 3460d72c1bf0SBram Moolenaar 'let g:var = 123', 3461d72c1bf0SBram Moolenaar 'unlet g:var # something', 3462d72c1bf0SBram Moolenaar ], 'E488:') 3463faac4104SBram Moolenaar 3464faac4104SBram Moolenaar CheckScriptSuccess([ 3465faac4104SBram Moolenaar 'vim9script', 346632e35117SBram Moolenaar 'if 1 # comment2', 3467faac4104SBram Moolenaar ' echo "yes"', 3468faac4104SBram Moolenaar 'elseif 2 #comment', 3469faac4104SBram Moolenaar ' echo "no"', 3470faac4104SBram Moolenaar 'endif', 3471faac4104SBram Moolenaar ]) 3472faac4104SBram Moolenaar 3473faac4104SBram Moolenaar CheckScriptFailure([ 3474faac4104SBram Moolenaar 'vim9script', 347532e35117SBram Moolenaar 'if 1# comment3', 3476faac4104SBram Moolenaar ' echo "yes"', 3477faac4104SBram Moolenaar 'endif', 3478fae55a9cSBram Moolenaar ], 'E488:') 3479faac4104SBram Moolenaar 3480faac4104SBram Moolenaar CheckScriptFailure([ 3481faac4104SBram Moolenaar 'vim9script', 348232e35117SBram Moolenaar 'if 0 # comment4', 3483faac4104SBram Moolenaar ' echo "yes"', 3484faac4104SBram Moolenaar 'elseif 2#comment', 3485faac4104SBram Moolenaar ' echo "no"', 3486faac4104SBram Moolenaar 'endif', 3487fae55a9cSBram Moolenaar ], 'E488:') 3488faac4104SBram Moolenaar 3489faac4104SBram Moolenaar CheckScriptSuccess([ 3490faac4104SBram Moolenaar 'vim9script', 3491cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3492faac4104SBram Moolenaar ]) 3493faac4104SBram Moolenaar 3494faac4104SBram Moolenaar CheckScriptFailure([ 3495faac4104SBram Moolenaar 'vim9script', 3496cfcd011fSBram Moolenaar 'var v = 1# comment6', 3497fae55a9cSBram Moolenaar ], 'E488:') 3498faac4104SBram Moolenaar 3499faac4104SBram Moolenaar CheckScriptSuccess([ 3500faac4104SBram Moolenaar 'vim9script', 3501faac4104SBram Moolenaar 'new' 3502d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3503df069eecSBram Moolenaar ':$', 3504faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3505faac4104SBram Moolenaar 'bwipe!', 3506faac4104SBram Moolenaar ]) 3507faac4104SBram Moolenaar 3508f5be8cdbSBram Moolenaar CheckScriptFailure([ 3509f5be8cdbSBram Moolenaar 'vim9script', 3510f5be8cdbSBram Moolenaar 'new' 3511d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3512f5be8cdbSBram Moolenaar ':$', 3513f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3514f5be8cdbSBram Moolenaar 'bwipe!', 3515f5be8cdbSBram Moolenaar ], 'E488:') 3516f5be8cdbSBram Moolenaar 3517f5be8cdbSBram Moolenaar CheckScriptFailure([ 3518f5be8cdbSBram Moolenaar 'vim9script', 3519f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3520f5be8cdbSBram Moolenaar ], 'E477:') 3521a26b9700SBram Moolenaarenddef 3522a26b9700SBram Moolenaar 35237e5bd91dSBram Moolenaardef Test_finish() 3524cfcd011fSBram Moolenaar var lines =<< trim END 35257e5bd91dSBram Moolenaar vim9script 35266797966dSBram Moolenaar g:res = 'one' 35277e5bd91dSBram Moolenaar if v:false | finish | endif 35286797966dSBram Moolenaar g:res = 'two' 35297e5bd91dSBram Moolenaar finish 35306797966dSBram Moolenaar g:res = 'three' 35317e5bd91dSBram Moolenaar END 35327e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 35337e5bd91dSBram Moolenaar source Xfinished 35347e5bd91dSBram Moolenaar assert_equal('two', g:res) 35357e5bd91dSBram Moolenaar 35367e5bd91dSBram Moolenaar unlet g:res 35377e5bd91dSBram Moolenaar delete('Xfinished') 35387e5bd91dSBram Moolenaarenddef 35397e5bd91dSBram Moolenaar 3540a5d0077eSBram Moolenaardef Test_forward_declaration() 3541cfcd011fSBram Moolenaar var lines =<< trim END 3542a5d0077eSBram Moolenaar vim9script 3543a5d0077eSBram Moolenaar def GetValue(): string 3544a5d0077eSBram Moolenaar return theVal 3545a5d0077eSBram Moolenaar enddef 3546cfcd011fSBram Moolenaar var theVal = 'something' 3547822ba247SBram Moolenaar g:initVal = GetValue() 3548a5d0077eSBram Moolenaar theVal = 'else' 3549a5d0077eSBram Moolenaar g:laterVal = GetValue() 3550a5d0077eSBram Moolenaar END 3551a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3552a5d0077eSBram Moolenaar source Xforward 3553a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3554a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3555a5d0077eSBram Moolenaar 3556a5d0077eSBram Moolenaar unlet g:initVal 3557a5d0077eSBram Moolenaar unlet g:laterVal 3558a5d0077eSBram Moolenaar delete('Xforward') 3559a5d0077eSBram Moolenaarenddef 3560a5d0077eSBram Moolenaar 35619721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3562a6294955SBram Moolenaar var vim9_lines =<< trim END 3563a6294955SBram Moolenaar vim9script 3564a6294955SBram Moolenaar var local = 'local' 3565a6294955SBram Moolenaar g:global = 'global' 3566a6294955SBram Moolenaar export var exported = 'exported' 3567a6294955SBram Moolenaar export def GetText(): string 3568a6294955SBram Moolenaar return 'text' 3569a6294955SBram Moolenaar enddef 3570a6294955SBram Moolenaar END 3571a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3572a6294955SBram Moolenaar 3573cfcd011fSBram Moolenaar var legacy_lines =<< trim END 35749721fb4eSBram Moolenaar source Xvim9_script.vim 35759721fb4eSBram Moolenaar 35769721fb4eSBram Moolenaar call assert_false(exists('local')) 35779721fb4eSBram Moolenaar call assert_false(exists('exported')) 35789721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 35799721fb4eSBram Moolenaar call assert_equal('global', global) 35809721fb4eSBram Moolenaar call assert_equal('global', g:global) 35819721fb4eSBram Moolenaar 35829721fb4eSBram Moolenaar " imported variable becomes script-local 35839721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 35849721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 35859721fb4eSBram Moolenaar call assert_false(exists('exported')) 35869721fb4eSBram Moolenaar 35879721fb4eSBram Moolenaar " imported function becomes script-local 35889721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 35899721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 35909721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 35919721fb4eSBram Moolenaar END 35929721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 35939721fb4eSBram Moolenaar 35949721fb4eSBram Moolenaar source Xlegacy_script.vim 35959721fb4eSBram Moolenaar assert_equal('global', g:global) 3596f5be8cdbSBram Moolenaar unlet g:global 35979721fb4eSBram Moolenaar 35989721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 35999721fb4eSBram Moolenaar delete('Xvim9_script.vim') 36009721fb4eSBram Moolenaarenddef 3601a5d0077eSBram Moolenaar 3602e535db86SBram Moolenaardef Test_declare_script_in_func() 3603e535db86SBram Moolenaar var lines =<< trim END 3604e535db86SBram Moolenaar vim9script 3605e535db86SBram Moolenaar func Declare() 3606e535db86SBram Moolenaar let s:local = 123 3607e535db86SBram Moolenaar endfunc 3608e535db86SBram Moolenaar Declare() 3609e535db86SBram Moolenaar assert_equal(123, local) 3610e535db86SBram Moolenaar 3611e535db86SBram Moolenaar var error: string 3612e535db86SBram Moolenaar try 3613e535db86SBram Moolenaar local = 'asdf' 3614e535db86SBram Moolenaar catch 3615e535db86SBram Moolenaar error = v:exception 3616e535db86SBram Moolenaar endtry 3617e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3618e535db86SBram Moolenaar 3619e535db86SBram Moolenaar lockvar local 3620e535db86SBram Moolenaar try 3621e535db86SBram Moolenaar local = 999 3622e535db86SBram Moolenaar catch 3623e535db86SBram Moolenaar error = v:exception 3624e535db86SBram Moolenaar endtry 3625e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3626e535db86SBram Moolenaar END 3627e535db86SBram Moolenaar CheckScriptSuccess(lines) 3628e535db86SBram Moolenaarenddef 3629e535db86SBram Moolenaar 3630e535db86SBram Moolenaar 36317d699701SBram Moolenaarfunc Test_vim9script_not_global() 36327d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 36337d699701SBram Moolenaar let vim9lines =<< trim END 36347d699701SBram Moolenaar vim9script 3635cfcd011fSBram Moolenaar var name = 'local' 36367d699701SBram Moolenaar func TheFunc() 36377d699701SBram Moolenaar echo 'local' 36387d699701SBram Moolenaar endfunc 36397d699701SBram Moolenaar def DefFunc() 36407d699701SBram Moolenaar echo 'local' 36417d699701SBram Moolenaar enddef 36427d699701SBram Moolenaar END 36437d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 36447d699701SBram Moolenaar source Xvim9script.vim 36457d699701SBram Moolenaar try 36467d699701SBram Moolenaar echo g:var 36477d699701SBram Moolenaar assert_report('did not fail') 36487d699701SBram Moolenaar catch /E121:/ 36497d699701SBram Moolenaar " caught 36507d699701SBram Moolenaar endtry 36517d699701SBram Moolenaar try 36527d699701SBram Moolenaar call TheFunc() 36537d699701SBram Moolenaar assert_report('did not fail') 36547d699701SBram Moolenaar catch /E117:/ 36557d699701SBram Moolenaar " caught 36567d699701SBram Moolenaar endtry 36577d699701SBram Moolenaar try 36587d699701SBram Moolenaar call DefFunc() 36597d699701SBram Moolenaar assert_report('did not fail') 36607d699701SBram Moolenaar catch /E117:/ 36617d699701SBram Moolenaar " caught 36627d699701SBram Moolenaar endtry 36637d699701SBram Moolenaar 366425859dd7SBram Moolenaar call delete('Xvim9script.vim') 36657d699701SBram Moolenaarendfunc 36667d699701SBram Moolenaar 3667eeb27bfeSBram Moolenaardef Test_vim9_copen() 3668eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3669eeb27bfeSBram Moolenaar copen 3670eeb27bfeSBram Moolenaar quit 3671eeb27bfeSBram Moolenaarenddef 3672eeb27bfeSBram Moolenaar 367303290b84SBram Moolenaar" test using an auto-loaded function and variable 36742d6b20d6SBram Moolenaardef Test_vim9_autoload() 3675cfcd011fSBram Moolenaar var lines =<< trim END 36762d6b20d6SBram Moolenaar vim9script 367703290b84SBram Moolenaar def some#gettest(): string 367803290b84SBram Moolenaar return 'test' 367903290b84SBram Moolenaar enddef 368003290b84SBram Moolenaar g:some#name = 'name' 3681227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3682e3ffcd99SBram Moolenaar 3683e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3684e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3685e3ffcd99SBram Moolenaar enddef 368603290b84SBram Moolenaar END 368703290b84SBram Moolenaar 368803290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 368903290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 369003290b84SBram Moolenaar var save_rtp = &rtp 369103290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 369203290b84SBram Moolenaar 369303290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 369403290b84SBram Moolenaar assert_equal('name', g:some#name) 3695227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 369603290b84SBram Moolenaar g:some#other = 'other' 369703290b84SBram Moolenaar assert_equal('other', g:some#other) 369803290b84SBram Moolenaar 3699e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3700e3ffcd99SBram Moolenaar 370117f700acSBram Moolenaar # upper case script name works 370217f700acSBram Moolenaar lines =<< trim END 370317f700acSBram Moolenaar vim9script 370417f700acSBram Moolenaar def Other#getOther(): string 370517f700acSBram Moolenaar return 'other' 370617f700acSBram Moolenaar enddef 370717f700acSBram Moolenaar END 370817f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 370917f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 371017f700acSBram Moolenaar 371103290b84SBram Moolenaar delete('Xdir', 'rf') 371203290b84SBram Moolenaar &rtp = save_rtp 371303290b84SBram Moolenaarenddef 371403290b84SBram Moolenaar 371503290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 371603290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 371703290b84SBram Moolenaar var lines =<< trim END 371803290b84SBram Moolenaar vim9script 37192d6b20d6SBram Moolenaar def foo#test() 37202d6b20d6SBram Moolenaar echomsg getreg('"') 37212d6b20d6SBram Moolenaar enddef 37222d6b20d6SBram Moolenaar END 37232d6b20d6SBram Moolenaar 37242d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 37252d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3726cfcd011fSBram Moolenaar var save_rtp = &rtp 37272d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 37282d6b20d6SBram Moolenaar augroup test 37292d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 37302d6b20d6SBram Moolenaar augroup END 37312d6b20d6SBram Moolenaar 37322d6b20d6SBram Moolenaar normal Y 37332d6b20d6SBram Moolenaar 37342d6b20d6SBram Moolenaar augroup test 37352d6b20d6SBram Moolenaar autocmd! 37362d6b20d6SBram Moolenaar augroup END 37372d6b20d6SBram Moolenaar delete('Xdir', 'rf') 37382d6b20d6SBram Moolenaar &rtp = save_rtp 37392d6b20d6SBram Moolenaarenddef 37402d6b20d6SBram Moolenaar 374177e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 374277e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3743cfcd011fSBram Moolenaar var lines =<< trim END 374477e5dcc3SBram Moolenaar vim9script 374577e5dcc3SBram Moolenaar def crash#func() 374677e5dcc3SBram Moolenaar try 374777e5dcc3SBram Moolenaar for x in List() 374877e5dcc3SBram Moolenaar endfor 374977e5dcc3SBram Moolenaar catch 375077e5dcc3SBram Moolenaar endtry 375177e5dcc3SBram Moolenaar g:ok = true 375277e5dcc3SBram Moolenaar enddef 375377e5dcc3SBram Moolenaar fu List() 375477e5dcc3SBram Moolenaar invalid 375577e5dcc3SBram Moolenaar endfu 375677e5dcc3SBram Moolenaar try 375748e11c10SBram Moolenaar alsoinvalid 375877e5dcc3SBram Moolenaar catch /wontmatch/ 375977e5dcc3SBram Moolenaar endtry 376077e5dcc3SBram Moolenaar END 376177e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 376277e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 376377e5dcc3SBram Moolenaar 376477e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 376577e5dcc3SBram Moolenaar lines =<< trim END 376677e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 376777e5dcc3SBram Moolenaar call crash#func() 376877e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 37699c4f5520SBram Moolenaar qall! 377077e5dcc3SBram Moolenaar END 377177e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 377277e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 377377e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 377477e5dcc3SBram Moolenaar 377577e5dcc3SBram Moolenaar delete('Xdidit') 377677e5dcc3SBram Moolenaar delete('Xscript') 377777e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 377803290b84SBram Moolenaar 377903290b84SBram Moolenaar lines =<< trim END 378003290b84SBram Moolenaar vim9script 378103290b84SBram Moolenaar var foo#bar = 'asdf' 378203290b84SBram Moolenaar END 378303290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 378477e5dcc3SBram Moolenaarenddef 378577e5dcc3SBram Moolenaar 378681e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 378781e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 378881e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3789cfcd011fSBram Moolenaar var lines =<< trim END 379081e17fbeSBram Moolenaar let s:counter = 1 379181e17fbeSBram Moolenaar def s:Func() 379281e17fbeSBram Moolenaar au! CursorHold 379381e17fbeSBram Moolenaar au CursorHold * s:counter += 1 379481e17fbeSBram Moolenaar enddef 379581e17fbeSBram Moolenaar call s:Func() 379681e17fbeSBram Moolenaar doau CursorHold 379781e17fbeSBram Moolenaar call assert_equal(2, s:counter) 379881e17fbeSBram Moolenaar au! CursorHold 379981e17fbeSBram Moolenaar END 380081e17fbeSBram Moolenaar CheckScriptSuccess(lines) 380181e17fbeSBram Moolenaarenddef 380281e17fbeSBram Moolenaar 3803b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3804b5841b99SBram Moolenaar var save_rtp = &rtp 3805b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3806b5841b99SBram Moolenaar &rtp = dir 3807b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3808b5841b99SBram Moolenaar 3809b5841b99SBram Moolenaar var lines =<< trim END 3810b5841b99SBram Moolenaar vim9script noclear 3811b5841b99SBram Moolenaar def script#autoloaded() 3812b5841b99SBram Moolenaar enddef 3813b5841b99SBram Moolenaar def Broken() 3814b5841b99SBram Moolenaar var x: any = '' 3815b5841b99SBram Moolenaar eval x != 0 3816b5841b99SBram Moolenaar enddef 3817b5841b99SBram Moolenaar Broken() 3818b5841b99SBram Moolenaar END 3819b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3820b5841b99SBram Moolenaar 3821b5841b99SBram Moolenaar lines =<< trim END 3822b5841b99SBram Moolenaar vim9script 3823b5841b99SBram Moolenaar def CallAutoloaded() 3824b5841b99SBram Moolenaar script#autoloaded() 3825b5841b99SBram Moolenaar enddef 3826b5841b99SBram Moolenaar 3827b5841b99SBram Moolenaar function Legacy() 3828b5841b99SBram Moolenaar try 3829b5841b99SBram Moolenaar call s:CallAutoloaded() 3830b5841b99SBram Moolenaar catch 3831b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3832b5841b99SBram Moolenaar endtry 3833b5841b99SBram Moolenaar endfunction 3834b5841b99SBram Moolenaar 3835b5841b99SBram Moolenaar Legacy() 3836b5841b99SBram Moolenaar END 3837b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3838b5841b99SBram Moolenaar 3839b5841b99SBram Moolenaar &rtp = save_rtp 3840b5841b99SBram Moolenaar delete(dir, 'rf') 3841b5841b99SBram Moolenaarenddef 3842b5841b99SBram Moolenaar 38433896a105SBram Moolenaardef Test_cmdline_win() 38443896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 38453896a105SBram Moolenaar # the command line window. 38463896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3847cfcd011fSBram Moolenaar var export_lines =<< trim END 38483896a105SBram Moolenaar vim9script 3849cfcd011fSBram Moolenaar export var That = 'yes' 38503896a105SBram Moolenaar END 38513896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3852cfcd011fSBram Moolenaar var import_lines =<< trim END 38533896a105SBram Moolenaar vim9script 38543896a105SBram Moolenaar import That from './Xexport.vim' 38553896a105SBram Moolenaar END 38563896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3857cfcd011fSBram Moolenaar var save_rtp = &rtp 38583896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 38593896a105SBram Moolenaar syntax on 38603896a105SBram Moolenaar augroup CmdWin 38613896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 38623896a105SBram Moolenaar augroup END 38633896a105SBram Moolenaar # this will open and also close the cmdline window 38643896a105SBram Moolenaar feedkeys('q:', 'xt') 38653896a105SBram Moolenaar assert_equal('yes', g:got_there) 38663896a105SBram Moolenaar 38673896a105SBram Moolenaar augroup CmdWin 38683896a105SBram Moolenaar au! 38693896a105SBram Moolenaar augroup END 38703896a105SBram Moolenaar &rtp = save_rtp 38713896a105SBram Moolenaar delete('rtp', 'rf') 38723896a105SBram Moolenaarenddef 38733896a105SBram Moolenaar 3874e3d4685fSBram Moolenaardef Test_invalid_sid() 3875e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 387625859dd7SBram Moolenaar 38779c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3878d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3879e3d4685fSBram Moolenaar endif 3880e3d4685fSBram Moolenaar delete('Xdidit') 3881e3d4685fSBram Moolenaarenddef 3882e3d4685fSBram Moolenaar 38839ec7026fSBram Moolenaardef Test_restoring_cpo() 38849ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 38859ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 38869ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 38879ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 38889ec7026fSBram Moolenaar endif 38899ec7026fSBram Moolenaar delete('Xsourced') 38909ec7026fSBram Moolenaar delete('Xclose') 3891090728adSBram Moolenaar delete('Xdone') 38920123cc1eSBram Moolenaar 38930123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 38940123cc1eSBram Moolenaar set cpo=aABceFsMny> 38950123cc1eSBram Moolenaar edit XanotherScript 38960123cc1eSBram Moolenaar so % 38970123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 38980123cc1eSBram Moolenaar :1del 38990123cc1eSBram Moolenaar w 39000123cc1eSBram Moolenaar so % 39010123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 39020123cc1eSBram Moolenaar 39030123cc1eSBram Moolenaar delete('XanotherScript') 39040123cc1eSBram Moolenaar set cpo&vim 39059ec7026fSBram Moolenaarenddef 39069ec7026fSBram Moolenaar 3907ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 3908ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 390937294bd6SBram Moolenaar CheckScreendump 3910ffb7dcdbSBram Moolenaar CheckFeature timers 391137294bd6SBram Moolenaar 3912ffb7dcdbSBram Moolenaar let lines =<< trim END 391337294bd6SBram Moolenaar vim9script 391437294bd6SBram Moolenaar def script#func() 391537294bd6SBram Moolenaar enddef 391637294bd6SBram Moolenaar END 3917ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 3918ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 391937294bd6SBram Moolenaar 3920ffb7dcdbSBram Moolenaar let lines =<< trim END 392137294bd6SBram Moolenaar vim9script 392237294bd6SBram Moolenaar set cpo+=M 392337294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 3924767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 392537294bd6SBram Moolenaar setline(1, 'some text') 392637294bd6SBram Moolenaar END 3927ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 3928ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 3929ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 3930ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 393137294bd6SBram Moolenaar 3932ffb7dcdbSBram Moolenaar " clean up 3933ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 3934ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 3935ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 3936ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 3937ffb7dcdbSBram Moolenaarendfunc 393837294bd6SBram Moolenaar 39399ec7026fSBram Moolenaar 3940f0afd9e1SBram Moolenaardef Test_unset_any_variable() 3941cfcd011fSBram Moolenaar var lines =<< trim END 3942cfcd011fSBram Moolenaar var name: any 3943cfcd011fSBram Moolenaar assert_equal(0, name) 3944f0afd9e1SBram Moolenaar END 3945f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 3946f0afd9e1SBram Moolenaarenddef 3947f0afd9e1SBram Moolenaar 39487e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 394958dbef33SBram Moolenaar CheckRunVimInTerminal 395058dbef33SBram Moolenaar 39517e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 39527e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 39537e9210eaSBram Moolenaarendfunc 39547e9210eaSBram Moolenaar 39557e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 39569c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 3957cfcd011fSBram Moolenaar var lines =<< trim END 39589c4f5520SBram Moolenaar func CheckAndQuit() 39599c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 39609c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 39619c4f5520SBram Moolenaar endfunc 39629c4f5520SBram Moolenaar END 39639c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 39649c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 3965e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 39669c4f5520SBram Moolenaar # define Afunc() on the command line 39679c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 39689c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 39692949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 39709c4f5520SBram Moolenaar 39719c4f5520SBram Moolenaar call StopVimInTerminal(buf) 39729c4f5520SBram Moolenaar delete('XcallFunc') 39739c4f5520SBram Moolenaar delete('Xdidcmd') 39749c4f5520SBram Moolenaarenddef 39759c4f5520SBram Moolenaar 3976fcdc5d83SBram Moolenaardef Test_script_var_scope() 3977fcdc5d83SBram Moolenaar var lines =<< trim END 3978fcdc5d83SBram Moolenaar vim9script 3979fcdc5d83SBram Moolenaar if true 3980fcdc5d83SBram Moolenaar if true 3981fcdc5d83SBram Moolenaar var one = 'one' 3982fcdc5d83SBram Moolenaar echo one 3983fcdc5d83SBram Moolenaar endif 3984fcdc5d83SBram Moolenaar echo one 3985fcdc5d83SBram Moolenaar endif 3986fcdc5d83SBram Moolenaar END 3987fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 3988fcdc5d83SBram Moolenaar 3989fcdc5d83SBram Moolenaar lines =<< trim END 3990fcdc5d83SBram Moolenaar vim9script 3991fcdc5d83SBram Moolenaar if true 3992fcdc5d83SBram Moolenaar if false 3993fcdc5d83SBram Moolenaar var one = 'one' 3994fcdc5d83SBram Moolenaar echo one 3995fcdc5d83SBram Moolenaar else 3996fcdc5d83SBram Moolenaar var one = 'one' 3997fcdc5d83SBram Moolenaar echo one 3998fcdc5d83SBram Moolenaar endif 3999fcdc5d83SBram Moolenaar echo one 4000fcdc5d83SBram Moolenaar endif 4001fcdc5d83SBram Moolenaar END 4002fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4003fcdc5d83SBram Moolenaar 4004fcdc5d83SBram Moolenaar lines =<< trim END 4005fcdc5d83SBram Moolenaar vim9script 4006fcdc5d83SBram Moolenaar while true 4007fcdc5d83SBram Moolenaar var one = 'one' 4008fcdc5d83SBram Moolenaar echo one 4009fcdc5d83SBram Moolenaar break 4010fcdc5d83SBram Moolenaar endwhile 4011fcdc5d83SBram Moolenaar echo one 4012fcdc5d83SBram Moolenaar END 4013fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4014fcdc5d83SBram Moolenaar 4015fcdc5d83SBram Moolenaar lines =<< trim END 4016fcdc5d83SBram Moolenaar vim9script 4017fcdc5d83SBram Moolenaar for i in range(1) 4018fcdc5d83SBram Moolenaar var one = 'one' 4019fcdc5d83SBram Moolenaar echo one 4020fcdc5d83SBram Moolenaar endfor 4021fcdc5d83SBram Moolenaar echo one 4022fcdc5d83SBram Moolenaar END 4023fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 40249becdf2bSBram Moolenaar 40259becdf2bSBram Moolenaar lines =<< trim END 40269becdf2bSBram Moolenaar vim9script 40279becdf2bSBram Moolenaar { 40289becdf2bSBram Moolenaar var one = 'one' 40299becdf2bSBram Moolenaar assert_equal('one', one) 40309becdf2bSBram Moolenaar } 40319becdf2bSBram Moolenaar assert_false(exists('one')) 40329becdf2bSBram Moolenaar assert_false(exists('s:one')) 40339becdf2bSBram Moolenaar END 40349becdf2bSBram Moolenaar CheckScriptSuccess(lines) 40359becdf2bSBram Moolenaar 40369becdf2bSBram Moolenaar lines =<< trim END 40379becdf2bSBram Moolenaar vim9script 40389becdf2bSBram Moolenaar { 40399becdf2bSBram Moolenaar var one = 'one' 40409becdf2bSBram Moolenaar echo one 40419becdf2bSBram Moolenaar } 40429becdf2bSBram Moolenaar echo one 40439becdf2bSBram Moolenaar END 40449becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4045fcdc5d83SBram Moolenaarenddef 4046fcdc5d83SBram Moolenaar 4047352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4048352134bbSBram Moolenaar var lines =<< trim END 4049352134bbSBram Moolenaar vim9script 40502a38908bSBram Moolenaar def Callback(...l: list<any>) 4051352134bbSBram Moolenaar try 4052352134bbSBram Moolenaar var x: string 4053352134bbSBram Moolenaar var y: string 4054352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4055352134bbSBram Moolenaar [x, y] = [''] 4056352134bbSBram Moolenaar catch 4057352134bbSBram Moolenaar g:caught = 'yes' 4058352134bbSBram Moolenaar endtry 4059352134bbSBram Moolenaar enddef 4060e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4061352134bbSBram Moolenaar feedkeys("\r", 'xt') 4062352134bbSBram Moolenaar END 4063352134bbSBram Moolenaar CheckScriptSuccess(lines) 4064352134bbSBram Moolenaar 4065352134bbSBram Moolenaar unlet g:caught 4066352134bbSBram Moolenaarenddef 4067352134bbSBram Moolenaar 4068631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4069631e8f93SBram Moolenaar if !has('unix') || !has('job') 4070631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4071631e8f93SBram Moolenaar endif 4072631e8f93SBram Moolenaar var lines =<< trim END 4073631e8f93SBram Moolenaar vim9script 4074631e8f93SBram Moolenaar var source: list<number> 40752a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4076631e8f93SBram Moolenaar eval [][0] 4077631e8f93SBram Moolenaar enddef 40782a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4079631e8f93SBram Moolenaar sleep 1m 4080631e8f93SBram Moolenaar source += l 4081631e8f93SBram Moolenaar enddef 4082e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 40836f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 40846f17a3f0SBram Moolenaar sleep 10m 40856f17a3f0SBram Moolenaar endwhile 4086206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4087fe95b94fSBram Moolenaar sleep 200m 4088631e8f93SBram Moolenaar END 4089631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4090631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4091631e8f93SBram Moolenaar delete('Xdef') 4092631e8f93SBram Moolenaarenddef 4093631e8f93SBram Moolenaar 40944324d87aSBram Moolenaardef InvokeNormal() 40954324d87aSBram Moolenaar exe "norm! :m+1\r" 40964324d87aSBram Moolenaarenddef 40974324d87aSBram Moolenaar 40984324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 40994324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 41004324d87aSBram Moolenaar new 41014324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 41024324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 41034324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 41044324d87aSBram Moolenaar xunmap <F3> 4105b5b9480eSBram Moolenaarenddef 4106b5b9480eSBram Moolenaar 4107b5b9480eSBram Moolenaardef Test_white_space_after_command() 4108b5b9480eSBram Moolenaar var lines =<< trim END 4109b5b9480eSBram Moolenaar exit_cb: Func}) 4110b5b9480eSBram Moolenaar END 4111b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4112f8103f27SBram Moolenaar 4113f8103f27SBram Moolenaar lines =<< trim END 4114f8103f27SBram Moolenaar e# 4115f8103f27SBram Moolenaar END 4116f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 41174324d87aSBram Moolenaarenddef 41184324d87aSBram Moolenaar 41194aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 41204aab88d9SBram Moolenaar var lines =<< trim END 41214aab88d9SBram Moolenaar vim9script 41224aab88d9SBram Moolenaar if exists('g:guard') 41234aab88d9SBram Moolenaar finish 41244aab88d9SBram Moolenaar endif 41254aab88d9SBram Moolenaar g:guard = 1 41264aab88d9SBram Moolenaar var name = 'thename' 41274aab88d9SBram Moolenaar def g:GetName(): string 41284aab88d9SBram Moolenaar return name 41294aab88d9SBram Moolenaar enddef 41304aab88d9SBram Moolenaar def g:SetName(arg: string) 41314aab88d9SBram Moolenaar name = arg 41324aab88d9SBram Moolenaar enddef 41334aab88d9SBram Moolenaar END 41344aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 41354aab88d9SBram Moolenaar so XscriptTwice.vim 41364aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 41374aab88d9SBram Moolenaar g:SetName('newname') 41384aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 41394aab88d9SBram Moolenaar so XscriptTwice.vim 41404aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41414aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 41424aab88d9SBram Moolenaar 41434aab88d9SBram Moolenaar delfunc g:GetName 41444aab88d9SBram Moolenaar delfunc g:SetName 41454aab88d9SBram Moolenaar delete('XscriptTwice.vim') 41464aab88d9SBram Moolenaar unlet g:guard 41474aab88d9SBram Moolenaarenddef 41484aab88d9SBram Moolenaar 41494aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 41504aab88d9SBram Moolenaar var exportlines =<< trim END 41514aab88d9SBram Moolenaar vim9script 41524aab88d9SBram Moolenaar if exists('g:guard') 41534aab88d9SBram Moolenaar finish 41544aab88d9SBram Moolenaar endif 41554aab88d9SBram Moolenaar g:guard = 1 41564aab88d9SBram Moolenaar export var name = 'someName' 41574aab88d9SBram Moolenaar END 41584aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 41594aab88d9SBram Moolenaar 41604aab88d9SBram Moolenaar var lines =<< trim END 41614aab88d9SBram Moolenaar vim9script 41624aab88d9SBram Moolenaar import name from './XexportScript.vim' 41634aab88d9SBram Moolenaar def g:GetName(): string 41644aab88d9SBram Moolenaar return name 41654aab88d9SBram Moolenaar enddef 41664aab88d9SBram Moolenaar END 41674aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 41684aab88d9SBram Moolenaar so XscriptImport.vim 41694aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 41704aab88d9SBram Moolenaar 41714aab88d9SBram Moolenaar so XexportScript.vim 41724aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 41734aab88d9SBram Moolenaar 41744aab88d9SBram Moolenaar delfunc g:GetName 41754aab88d9SBram Moolenaar delete('XexportScript.vim') 41764aab88d9SBram Moolenaar delete('XscriptImport.vim') 41774aab88d9SBram Moolenaar unlet g:guard 41784aab88d9SBram Moolenaarenddef 41794aab88d9SBram Moolenaar 418010b9421fSBram Moolenaardef Test_unsupported_commands() 418110b9421fSBram Moolenaar var lines =<< trim END 418210b9421fSBram Moolenaar ka 418310b9421fSBram Moolenaar END 41847d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41857d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 418610b9421fSBram Moolenaar 418710b9421fSBram Moolenaar lines =<< trim END 4188ada1d870SBram Moolenaar :1ka 4189ada1d870SBram Moolenaar END 41907d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 41917d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4192ada1d870SBram Moolenaar 4193ada1d870SBram Moolenaar lines =<< trim END 419410b9421fSBram Moolenaar t 419510b9421fSBram Moolenaar END 419610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 419710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 419810b9421fSBram Moolenaar 419910b9421fSBram Moolenaar lines =<< trim END 420010b9421fSBram Moolenaar x 420110b9421fSBram Moolenaar END 420210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 420310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 420410b9421fSBram Moolenaar 420510b9421fSBram Moolenaar lines =<< trim END 420610b9421fSBram Moolenaar xit 420710b9421fSBram Moolenaar END 420810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 420910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 421010b9421fSBram Moolenaarenddef 421110b9421fSBram Moolenaar 4212c70fe460SBram Moolenaardef Test_mapping_line_number() 4213c70fe460SBram Moolenaar var lines =<< trim END 4214c70fe460SBram Moolenaar vim9script 4215c70fe460SBram Moolenaar def g:FuncA() 4216c70fe460SBram Moolenaar # Some comment 4217c70fe460SBram Moolenaar FuncB(0) 4218c70fe460SBram Moolenaar enddef 4219c70fe460SBram Moolenaar # Some comment 4220c70fe460SBram Moolenaar def FuncB( 4221c70fe460SBram Moolenaar # Some comment 4222c70fe460SBram Moolenaar n: number 4223c70fe460SBram Moolenaar ) 4224c70fe460SBram Moolenaar exe 'nno ' 4225c70fe460SBram Moolenaar # Some comment 4226c70fe460SBram Moolenaar .. '<F3> a' 4227c70fe460SBram Moolenaar .. 'b' 4228c70fe460SBram Moolenaar .. 'c' 4229c70fe460SBram Moolenaar enddef 4230c70fe460SBram Moolenaar END 4231c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4232c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4233c70fe460SBram Moolenaar assert_match('No mapping found', res) 4234c70fe460SBram Moolenaar 4235c70fe460SBram Moolenaar g:FuncA() 4236c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4237c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4238c70fe460SBram Moolenaar 4239c70fe460SBram Moolenaar nunmap <F3> 4240c70fe460SBram Moolenaar delfunc g:FuncA 4241c70fe460SBram Moolenaarenddef 4242c70fe460SBram Moolenaar 4243deb108baSBram Moolenaardef Test_option_set() 4244deb108baSBram Moolenaar # legacy script allows for white space 4245deb108baSBram Moolenaar var lines =<< trim END 4246deb108baSBram Moolenaar set foldlevel =11 4247deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4248deb108baSBram Moolenaar END 4249deb108baSBram Moolenaar CheckScriptSuccess(lines) 4250deb108baSBram Moolenaar 4251deb108baSBram Moolenaar set foldlevel 4252deb108baSBram Moolenaar set foldlevel=12 4253deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4254deb108baSBram Moolenaar set foldlevel+=2 4255deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4256deb108baSBram Moolenaar set foldlevel-=3 4257deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4258deb108baSBram Moolenaar 4259deb108baSBram Moolenaar lines =<< trim END 4260deb108baSBram Moolenaar set foldlevel =1 4261deb108baSBram Moolenaar END 4262deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4263deb108baSBram Moolenaar 4264deb108baSBram Moolenaar lines =<< trim END 4265deb108baSBram Moolenaar set foldlevel +=1 4266deb108baSBram Moolenaar END 4267deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4268deb108baSBram Moolenaar 4269deb108baSBram Moolenaar lines =<< trim END 4270deb108baSBram Moolenaar set foldlevel ^=1 4271deb108baSBram Moolenaar END 4272deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4273deb108baSBram Moolenaar 4274deb108baSBram Moolenaar lines =<< trim END 4275deb108baSBram Moolenaar set foldlevel -=1 4276deb108baSBram Moolenaar END 4277deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4278deb108baSBram Moolenaar 4279deb108baSBram Moolenaar set foldlevel& 4280deb108baSBram Moolenaarenddef 4281deb108baSBram Moolenaar 4282208f0b48SBram Moolenaardef Test_option_modifier() 42831594f313SBram Moolenaar # legacy script allows for white space 4284208f0b48SBram Moolenaar var lines =<< trim END 4285208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4286208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4287208f0b48SBram Moolenaar END 4288208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4289208f0b48SBram Moolenaar 42901594f313SBram Moolenaar set hlsearch 42911594f313SBram Moolenaar set hlsearch! 42921594f313SBram Moolenaar assert_equal(false, &hlsearch) 42931594f313SBram Moolenaar 42941594f313SBram Moolenaar set hlsearch 4295208f0b48SBram Moolenaar set hlsearch& 42961594f313SBram Moolenaar assert_equal(false, &hlsearch) 4297208f0b48SBram Moolenaar 4298208f0b48SBram Moolenaar lines =<< trim END 42991594f313SBram Moolenaar set hlsearch & 4300208f0b48SBram Moolenaar END 43011594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 43021594f313SBram Moolenaar 43031594f313SBram Moolenaar lines =<< trim END 43041594f313SBram Moolenaar set hlsearch ! 43051594f313SBram Moolenaar END 43061594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 43071594f313SBram Moolenaar 43081594f313SBram Moolenaar set hlsearch& 4309208f0b48SBram Moolenaarenddef 4310208f0b48SBram Moolenaar 4311c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4312c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4313c03fe66aSBram Moolenaar var lines =<< trim END 4314c03fe66aSBram Moolenaar echoerr 'some' 4315c03fe66aSBram Moolenaar .. ' error' 4316c03fe66aSBram Moolenaar .. ' continued' 4317c03fe66aSBram Moolenaar END 4318c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4319c03fe66aSBram Moolenaarenddef 4320c03fe66aSBram Moolenaar 4321648594eaSBram Moolenaardef ProfiledWithLambda() 4322d9162550SBram Moolenaar var n = 3 4323d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4324d9162550SBram Moolenaarenddef 4325d9162550SBram Moolenaar 4326648594eaSBram Moolenaardef ProfiledNested() 4327648594eaSBram Moolenaar var x = 0 4328648594eaSBram Moolenaar def Nested(): any 4329648594eaSBram Moolenaar return x 4330648594eaSBram Moolenaar enddef 4331648594eaSBram Moolenaar Nested() 4332648594eaSBram Moolenaarenddef 4333648594eaSBram Moolenaar 4334ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4335ffcfddc7SBram Moolenaar var x = 0 4336ffcfddc7SBram Moolenaar def Nested(): any 4337ffcfddc7SBram Moolenaar return x 4338ffcfddc7SBram Moolenaar enddef 4339ffcfddc7SBram Moolenaar Nested() 4340ffcfddc7SBram Moolenaarenddef 4341ffcfddc7SBram Moolenaar 4342d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4343d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4344d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 43454ece152aSBram Moolenaar CheckFeature profile 43464ece152aSBram Moolenaar 4347d9162550SBram Moolenaar profile start Xprofile.log 4348648594eaSBram Moolenaar profile func ProfiledWithLambda 4349648594eaSBram Moolenaar ProfiledWithLambda() 4350ffcfddc7SBram Moolenaar 4351648594eaSBram Moolenaar profile func ProfiledNested 4352648594eaSBram Moolenaar ProfiledNested() 4353ffcfddc7SBram Moolenaar 4354ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4355ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4356ffcfddc7SBram Moolenaar profile func * 4357ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4358ffcfddc7SBram Moolenaar 4359ffcfddc7SBram Moolenaar profdel func * 4360ffcfddc7SBram Moolenaar profile pause 4361d9162550SBram Moolenaarenddef 4362d9162550SBram Moolenaar 4363585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4364585fea7bSBram Moolenaardef Test_substitute_cmd() 4365585fea7bSBram Moolenaar new 4366585fea7bSBram Moolenaar setline(1, 'something') 4367585fea7bSBram Moolenaar :substitute(some(other( 4368585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4369585fea7bSBram Moolenaar bwipe! 4370585fea7bSBram Moolenaar 4371f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4372cfcd011fSBram Moolenaar var lines =<< trim END 4373585fea7bSBram Moolenaar vim9script 4374585fea7bSBram Moolenaar new 4375585fea7bSBram Moolenaar setline(1, 'something') 4376585fea7bSBram Moolenaar :substitute(some(other( 4377585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4378585fea7bSBram Moolenaar bwipe! 4379585fea7bSBram Moolenaar END 4380585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4381585fea7bSBram Moolenaar source Xvim9lines 4382585fea7bSBram Moolenaar 4383585fea7bSBram Moolenaar delete('Xvim9lines') 4384585fea7bSBram Moolenaarenddef 4385585fea7bSBram Moolenaar 43868a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4387